SyntaxEditor v4.0 Beta Released

SyntaxEditor for Windows Forms Forum

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
We're very happy to release the SyntaxEditor 4.0 public beta. While this is a beta product, it should be pretty stable. We have had numerous private beta testers using it for a while. We still plan on adding some other things before the final release such as a VB.NET sample project, more QuickStarts, more features that didn't make the beta cut, and some tweaking of features that are in the beta.

SyntaxEditor v4.0 should be able to be installed side-by-side with the latest v3.1.0212 build of SyntaxEditor since they use the same Shared/WinUICore library versions. So if you do use SyntaxEditor v3.1, download the latest maintenance release from Customer Relations before installing the v4.0 beta.

General Language Improvement Feature Summary

We made a page a month or two ago that summarizes some of the language enhancement features of v4.0. It also has some screenshots of the .NET Languages Add-on in action. We will probably take down the page once the final v4.0 is released but you can take a peek for now.

Feedback Wanted

We encourage you to try it out and post here or email us if you see any problems or have any suggestions for improvement. Since this is still a beta, we are very open to implementing your suggestions before final release. When posting in the forums, please make sure you indicate that your post relates to the 4.0 beta.

We have created a new forum for the .NET Languages Add-on that will be available with the release of v4.0. If you have any questions, suggestions, or bug reports for that, please post them in the new .NET Languages Add-on forum instead of in this forum.

Major New v4.0 Features
  • A complete parser generator framework for defining semantic parsers.
  • A semantic parser service which can perform semantic parsing in a separate worker thread.
  • An AST node class framework for building abstract syntax trees for code documents.
  • Reworked the design of syntax languages so that they are much more abstracted and can totally encapsulate all the code for handling IntelliPrompt, smart indent, code formatting, etc.
  • Virtual space past the end of lines.
  • Virtual space past the end of the document (virtual lines).
  • Block selection and related features such as controlling the types of selections that are able to be made.
  • Read-only regions of text within an editable document.
  • Text statistics that scan text and give statistics such as word, sentence, character counts, readability scores and can display the results in a Form. Languages implementations can create custom statistics such as comment coverage.
  • IntelliPrompt smart tag features.
  • Improved parameter info features to aid in selected parameter tracking and context switching.
  • Ability to suspend lexical parsing when a batch of document modifications are made.
  • Ability to disable lexical and/or semantic parsing completely, which is useful for working with extremely large files.
  • A Document.PreTextChanging event that lets you cancel a document modification before it occurs.
  • Various whitespace-trimming methods and options to trim trailing whitespace on paste or text replacement.
  • Designer features for the Document.Language property, allowing a language to be chosen if there is one available in the component tray or a dynamic language to be loaded from a file.
  • Support for non-editable code snippet declarations and methods so that functions can be used to update fields (enables dynamically building case statements for a switch on an enumeration, etc.).
  • Changed code snippets to only load snippet header information by default for saving on memory. The full snippet data is loaded on demand when the code snippet is activated.
  • Automated line modification marking and enhanced how it tracks modified text ranges.
  • An improved object model for span indicators that uses layers.
  • Detailed hit-testing for anywhere in the editor.
  • Custom EditorView buttons that can be placed on any side of a scrollbar.
  • A new renderer interface that lets you override how SyntaxEditor is painted, alter the colors used for the default drawing scheme, or perform custom draw.
  • Multiple font families/sizes in the same document.
  • Highlighting style enhancements for semi-transparent backgrounds, borders, strike-outs, underlines, and more.
  • Ability to modify the caret style and width for both insert and overwrite modes.
  • Over 40 new built-in commands.
  • An enormous amount of object model enhancements.
  • Dramatically reduced memory usage.
  • Sample project enhanced with a Grammar Designer and many QuickStarts.
  • More than double the number of core documentation topics.
  • Full source for a sample language add-on in the C# sample project.
  • An advanced C# language add-on that has automated IntelliPrompt, smart indent, XML comment auto-complete, and much more. (Sold separately)
Minor New v4.0 Features
  • Ability for bracket highlighting brackets to be bold.
  • Code snippet field modified event.
  • Option for current line highlighting to extend to all margins.
  • Option to cut/copy text with HTML formatting.
  • Built-in Find/Replace and Go to Line dialogs.
  • Unified all mouse click and hover events into two more robust events.
  • Drop-shadows option for all IntelliPrompt popups.
  • IntelliPrompt popup ability to show images and handle link clicks.
  • Carriage return-only line terminated text is supported.
  • Custom document line border colors.
  • Ability to create IntelliPromptMemberListItem subclasses and measure/draw the items yourself. This allows for you to draw things like muliple columns, multiple images, etc.
  • Total page count calculated for Print dialog.
  • Regular expression engine support for zero-width look-ahead and look-behind.
  • Regular expression find support for zero-width matches such as $.
  • Regular expression replace substitution $0 works like $&.
  • When clicking on the cross-section of a four-way view split, the splits may be resized in both directions.
  • Many other minor features.
VB.NET Implementation for .NET Languages Add-on

We will begin work on a VB.NET language implementation for the .NET Languages Add-on soon so that the add-on will contain implementations for C# and VB.NET with full IntelliPrompt.

Downloading the Beta

The beta can be downloaded from this link:
Download SyntaxEditor v4.0 Beta

Breaking Changes

There were some breaking changes from v3.1 to v4.0. However we have detailed them all out in the Readme's Release History. Also there is a help topic in the documentation describing the breaking change areas and how to convert from v3.1 to v4.0.

Purchasing v4.0 Beta

Please note that we do not have the 4.0 beta or the .NET Languages Add-on up for sale yet.

We have not yet established the pricing for v4.0 or for the .NET Languages Add-on. However we do know that the add-on will be sold in two options, with or without source code. Both will be priced very low and will be Enterprise licenses with subscriptions.

Again, please post all comments about the v4.0 beta in this forum and any .NET Languages Add-on related comments in the new forum specifically for that add-on.

[Modified at 08/24/2006 12:09 PM]

Actipro Software Support

Comments (25)

Posted 18 years ago by László Mohácsi
You did it!!!Hoooah!
Ohh boy, can't wait.
Posted 18 years ago by Matthew Smith - Developer, One Plus One Solutions Pty Limited
Whoa... had a look on the way into work - fantastic!!

Really looking forward to using it! congrats

Regards, Matt

Posted 18 years ago by Wielage Dirk
Wow that sound realy realy realy fantastic!

Will there be a licence for version 4 available which include

source code for the product?

This is last missing point?

Posted 18 years ago by Russell Mason

Well done on getting the beta out; its obvious even with a casual look that alot of work has gone into it.

I'm just going through the documentation now and have a few minor corrections:

1) The ImportedNamespaces Tag page has a child element of ImportedNamespaces, I think this should be ImportedNamespace (singular)

2) The Token Tag page says no child attributes but the 'Simple' example has a IsSignificant attribute on it.

3) The AdditionalCondition Tag, TokenCondition Tag, and ExpressionCondition Tag pages all have the same content so it is difficult to see what each one does

Very minor I know, but thought I would let you know as I was going through it.

Russell Mason
Posted 18 years ago by Wielage Dirk
Hi Russel,

thanks for your respond. But I think my question wasn't clear enough!

My question was, will a Source Code Licence (I think you call i Blue print Licence) be available for all these features an d the Syntax Editor itself?

So that i can get all the Source code of the Syntax Editor itself with version 4?

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA

Thanks for the correction notes... we'll get those fixed. Russell (or anyone else), if you see anyting else in the documentation that you think needs more clarification, please let us know.


Yes we will be offering source code for the core SyntaxEditor control via a Blueprint license with the 4.0 release.

And one of the two options for the .NET Languages Add-on will be a binary with full source. That way you can choose to just get a regular license for SyntaxEditor but get the full source of the advanced C# (and eventually VB.NET) language implementations, which undoubtedly will be useful if you want to further customize them or make a language that is similar.

[Modified at 08/25/2006 06:58 AM]

Actipro Software Support

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
One other thing I forgot to answer Russell. The IsSignificant attribute currently does nothing on the Token tag. It's something we're still looking into for future usage.

Actipro Software Support

Posted 18 years ago by Matthew Smith - Developer, One Plus One Solutions Pty Limited

Any plans on making the grammer designer output VB.Net code in the future?

Regards, Matt

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
Possibly in the future but probably not in the short term.

Actipro Software Support

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
The beta has been updated. We were able to crank out the VB.NET sample project faster than expected. You can get the new beta build at the same location as before. Nothing else has really changed.

Actipro Software Support

Posted 18 years ago by Wielage Dirk
Only one word .... Perfect!!!!

Posted 18 years ago by Bryan Files
The new version looks great! The thing I can't find is a way to make the Intelliprompt member lists filter based on substring matches. In other words, not just match the beginning of the items. Visual Assist is one application that shows the desired behavior.

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
Hi Bryan,

Thanks for the praise.

If you use the Show method overload that takes an offet and a length or if you use CompleteWord, both of those will try to match an item in the list based on the offset range you pass.

For an example, check out the SimpleSyntaxLanguage.ShowIntelliPromptMemberList method implementation in the C# sample project. It shows how to initialize a member list.

Actipro Software Support

Posted 18 years ago by Bryan Files
Maybe I'm not following or maybe I'm not being clear. I want the IntellipromptMemberList to work like Visual Assist's Enhanced Listboxes. For example, if I type "somevar.", the list pops up with all of the members. Then I start typing "color" and the list reduces down to members that have "color" in the name like "backColor". They call this shorthand. Their listboxes also support acronyms.

Are you saying that I'd have to implement the filtering and provide the reduced list to SyntaxEditor?

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
Hi Bryan,

Sorry, I see what you are saying now. You'd have to filter the list yourself as of now. But we're open to implementing filtering, especially if you have any ideas on the best way to do it in terms of modifying our object model. We'd love to hear your ideas.

Actipro Software Support

Posted 18 years ago by Bryan Files
If the filter behavior API is not as simple as setting a property on the control, I'll have to find time to play with what is there. For sure there would need to be an event to reevaluate the list (maybe there already is a key press or something). Another critical piece is for the list to know that a match is found so that it will do the completion. I haven't looked to see if I could make the current implementation do that.

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
No there currently isn't anything built in that lets you filter down the list. It sounds like a neat feature though, and one that has been on our TODO list for a while.

For implementation I would think that we'd need some sort of Comparer type object that would examine every item in the original list that you passed. So the original member list items would need to be cached. Then the comparer would examine each item and determine whether it is visible or not. So we'd need some sort of Visible setting on each item. After that runs, the list would have to update based on the changes you made and reselect the appropriate item. Does that sound correct?

One issue we always struggled with was do we close the list if there is nothing left?

Actipro Software Support

Posted 18 years ago by Bryan Files
Yeah, that sounds good. To me, "Comparer" implies making a call for each item. That may not be efficient enough for large lists. I would lean toward a text changed event to update the visible settings for the whole list. In that case, it should also have events for list modifications.

When there is no match left, it seems like you would want to stay in the mode but maybe just hide the list.

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
I think you would probably have to compare each item to be able to filter a list. Because text may have been inserted or deleted in the source code range that is controlling the filter.

So basically the filter would examine each item one at a time when a text change was made to determine if it should be visible or not. Then it would flag the item as visible or invisible ("filtered out").

Do you have a better algorithm in mind? You have to consider that typing in the editor may not simply be a single character or a delete of a single character. End users can move the caret back highlight a couple characters, type a character to overwrite the selection, etc.

Actipro Software Support

Posted 18 years ago by Bryan Files
I understand what you are saying about edits, but one could make a few checks to see if there was a quick operation that applied and fallback to scanning the entire list otherwise. So the most common scenario would benefit greatly.

I'm concerned about performance since my application may have thousands of items in the initial list.
Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
A new beta is available in the same download location as before. This beta has some big updates:
  • Added the ability for the parser generator to output VB.NET code. The Grammar tag now has an OutputLanguage attribute that indicates whether the parser generator should output C# or VB.NET code.
  • Updated the VB.NET sample project to have a complete source code implementation of the Simple language.
  • Updated the advanced XML language in the Web Languages Add-on to perform tag auto-complete when you type a > character.
  • Added comments to the grammar production code syntax that output comments directly into the generated code.
  • Updated the Document Outline to show the Simple language by default.
  • Added a new FontDropDownList control that displays all non-Symbol fonts and shows fixed-width fonts in bold type.
  • Updated the StyleEditorForm to use the new FontDropDownList control.
  • Updated the MultipleFonts QuickStart to use the new FontDropDownList control.
  • Added the BorderTopColor and BorderBottomColor properties to the DocumentLine class to allow for separate border colors, or a border on only one side of a line.
  • Updated the LineHighlights QuickStart to demo the new separated document line border colors.
  • Added a TypeMemberDropDownList.SyntaxEditor property that when set, attaches to the SyntaxEditor and processes all event handling automatically. Updated samples to remove code that is now automated.
  • Updated the DotNetReflection QuickStart to demo the TypeMemberDropDownList control.
  • Added the SyntaxEditor.DocumentAutomaticOutliningComplete and Document.AutomaticOutliningComplete events, and the SyntaxLanguage.OnDocumentAutomaticOutliningComplete method, all of which can be used for collapsing regions on initial load if the event argument's IsProgrammaticTextReplacement property is set.
  • Added the CurrentStatementSpanIndicator class.
  • Added the CurrentStatementDisplayPriority and CurrentStatementKey constants to the SpanIndicatorLayer class.
  • Added the DocumentModificationEventArgs.IsProgrammaticTextReplacement property.
  • Added the ISemanticParserServiceProcessor.Key property.
  • Updated the dynamic VB.NET language definition to support XML documentation comments and member lists for the documentation comments.
  • Updated the dynamic VB.NET language definition's example text.
  • Moved several trigger handler samples that display member lists to the dynamic C# and HTML syntax language code.
  • Fixed a bug where IntelliPrompt wasn't properly pulling in base class members in a certain scenario.
  • Fixed a bug where the collapsing of dynamic C# language XML comments pulled in a newline at the end.
  • Updated the .NET Languages Add-on's C# language to support partial types.
  • Added the DomBindingFlags.OnlyIndexers item and updated the .NET Languages Add-on's C# language to support parameter info for indexers.
  • Added the DomBindingFlags.OnlyConstructors and DeclaringTypeOnly items and updated the .NET Languages Add-on's C# language to support parameter info for constructors.
  • Fixed a bug in the .NET Languages Add-on's C# language that showed a member list when typing a . within a comment or after a number.
  • Fixed a bug in the .NET Languages Add-on's C# language where "see" XML tags in a certain format weren't being processed correctly in quick info tips.
  • Fixed a bug in the .NET Languages Add-on's caching mechanism that didn't handle writing cache information for some types with null namespaces.
  • Added the DomBindingFlags.ExcludeIndexers item and updated the .NET Languages Add-on's C# language to not show indexers in member lists.
  • Fixed a bug where line modification marks from a change made on a blank line didn't always display properly.
  • Fixed a bug in the parser generator where additional expression conditions didn't filter up through the match methods properly.
  • Added the SemanticParseFlags enumeration.
  • Added the SemanticParserServiceRequest.Flags property.
  • BREAK: Added a SemanticParseFlags parameter to the SemanticParserServiceRequest constructors.
  • BREAK: Added a SemanticParseFlags parameter to SyntaxLanguage.PerformSemanticParse.
  • BREAK: Removed the DocumentModificationFlags.ProgrammaticTextParse item.
  • BREAK: Fixed a bug where the SpanIndicator.DrawMarks method passed the bounds of the display line. Added a displayLineIndex parameter to the method.
  • Updated documenation in several places and added several new topics.

Actipro Software Support

Posted 18 years ago by Szabolcs Varga
A ReadOnly flag to prevent the control being modified possibility would be really great.

(If it's not possible because of the current roadmap, then please put a marker on this and try to implement it in 5.0)

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
Hi there... actually that feature has been on SyntaxEditor for a long time. You can do this to make the entire document read-only:
editor.Document.ReadOnly = true;
v4.0 adds a new feature on top of that where you can choose to have read-only ranges instead of the entire document if you'd like.

Actipro Software Support

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
A new beta 4.0.0231 has been released with some more major updates... please read this change list carefully if you are updating from an older beta since some functionality that needed to be in your code for the add-on is now automated making it much easier for implementation.

The new beta is available at the same URL. We're getting very close to final release!
  • Automated the addition of error indicators to add-on languages via the new SyntaxLanguage.ErrorDisplayEnabled property.
  • Added automated tooltip display when hovering over syntax errors in the text if SyntaxLanguage.ErrorDisplayEnabled is set.
  • Automated the update of the DotNetProjectResolver.SourceProjectContent when changes are made to a C# document as long as the Document.Filename property is set and the new CSharpSyntaxLanguage.SourceProjectContentUpdateEnabled property is set, which it is by default.
  • Added the SyntaxLanguage.OnDocumentSemanticParseDataChanged method that is called whenever the Document.SemanticParseData property is changed for a document using the language.
  • Added the SyntaxEditor.UserInterfaceUpdate event that occurs after a delay (specified by the new SyntaxLanguage.UserInterfaceUpdateDelay property) following the DocumentTextChange and DocumentSemanticParseDataChanged events, allowing for updating of user interface controls external to SyntaxEditor.
  • Added the SyntaxLanguage.Language.OnSyntaxEditorUserInterfaceUpdate method, which is similar to SyntaxEditor.UserInterfaceUpdate but implemented on the SyntaxLanguage class.
  • Removed all error indicator display and source project content update code from the sample project since it is now automated.
  • Removed the UIUpdateTimer from the MainForm sample since the SyntaxEditor.UserInterfaceUpdate is now used instead.
  • Consolidated all Timers used by SyntaxEditor into a single Timer. This uses less resources.
  • BREAK: Changed the Caret class so that it inherits Object instead of DisposableObject.
  • Added the OnDocumentFilenameChanging and OnDocumentFilenameChanged methods to the SyntaxLanguage class.
  • Updated the dynamic XML and HTML languages to perform end tag auto-complete, just like in Visual Studio.
  • Updated the dynamic HTML language's tag member list to work with the new auto-complete feature.
  • Added the DocumentLine.IndentAmount property, which returns the number of columns that the first non-whitespace character is indented on the line.
  • BREAK: Changed the Document.SmartIndent event so that the IndentAmount property specifies characters and not tabs, allowing for smart indent to any character column. To achieve old functionality, multiply the desired tabstop level by the SyntaxEditor.Document.TabSize value.
  • Added a DotNetProjectResolver.AddExternalReference overload that accepts a custom full name for an assembly.
  • Added an AssemblyCodeRepository.Add overload that accepts a custom full name for an assembly.
  • Tweaked how the AssemblyCodeRepository works when loading reflection data for already-loaded assemblies.
  • Added the IntelliPromptCodeSnippets.CheckForCodeSnippetShortcut method to wrap the code needed to check the word preceeding the caret for a code snippet shortcut. If a valid shortcut is found, the code snippet is activated.
  • Set the PageSetupDialog.EnableMetric property to true within the SyntaxEditor.ShowPageSetupForm code in the .NET 2.0 SyntaxEditor assembly.
  • Added code to set focus to SyntaxEditor if a scrollbar is clicked.
  • Added a new SpanIndicatorLayer.Add overload that specifies whether to throw an exception when the indicator being added overlaps with another indicator that is already in the layer.
  • Added the IAstNodeList.ParentNode property.
  • Changed Document.LoadFile so that the Filename property is set before the file's text is loaded, instead of after.
  • Tweaked how the mouse selection code works.
  • Added code to the .NET Languages Add-on to display quick info for decimal integers that include hexadecimal and decimal display.
  • Added code to the .NET Languages Add-on to support member lists on string literals.
  • Fixed a bug in the ParseIdentifier methods of the lexical parsers for the .NET Languages Add-on C# language and Simple language.
  • BREAK: Changed the .NET Languages Add-on so that the CompilationUnit and NamespaceDeclaration classes do not get UsingDirectives or ExternAliasDirectives set unless there actually is one.
  • Fixed a bug in the .NET Languages Add-on C# language where empty methods didn't display IntelliPrompt correctly when queried between method braces.
  • Fixed a bug in the .NET Languages Add-on C# language where typing a dot after a void method call would list basic Object members.
  • Fixed a bug in the .NET Languages Add-on C# language where defining a class with a base class of itself would cause an infinite loop.
  • Fixed a bug in the .NET Languages Add-on C# language where indenting of { characters was off in a scenario near the start of the document.
  • Fixed a bug where printing runs of text in a fixed width font didn't line up vertically properly.
  • Fixed a bug where collapsing an XML comment node in the VB.NET language expanded a collapsed declaration below it.
  • Fixed a bug in IntelliPrompt.EscapeMarkupText that inappropriately escaped the = character.
  • Fixed a bug where deleting text would sometimes cause outlining to parse incorrectly.
  • Fixed a bug where search in selection reset the selection range after the first result was found.
  • Fixed a bug where in a certain scenario the minimum lexical parse range of dynamic languages wasn't calculated properly.
  • Fixed a bug in MoveDownCommand where selecting up from the document end with virtual space disabled and then pressing down wouldn't move the caret.
  • BREAK: Fixed a bug where the MergableToken.LexicalState property didn't always return the proper lexical state in a certain situation. This applies to dynamic languages as well.
  • Fixed a bug where accessing a protected member by using the base keyword didn't always populate the member list correctly.
  • BREAK: Renamed the DomBindingFlags.ContextIsTarget item to ContextIsTargetFamily.
  • Changes how the multi-threaded synchronization code works.
  • Added new help topics explaining error wave lines and dynamic language free samples.
  • Improved other help topics.

Actipro Software Support

Posted 18 years ago by Actipro Software Support - Cleveland, OH, USA
The 4.0 final is now available. We'll make a new post containing the change log from the first beta to the final.

Actipro Software Support

The latest build of this product (v24.1.0) was released 4 months ago, which was after the last post in this thread.

Add Comment

Please log in to a validated account to post comments.