[mapguide-commits] r6706 - in trunk/Tools/Maestro: Install Maestro Maestro.Editors Maestro.Editors/Generic Thirdparty/SharpDevelop Thirdparty/SharpDevelop/ICSharpCode.TextEditor Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Docume nt/MarkerStrategy Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Tue May 29 05:27:03 PDT 2012
Author: jng
Date: 2012-05-29 05:27:02 -0700 (Tue, 29 May 2012)
New Revision: 6706
Added:
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration/AssemblyInfo.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ASPX.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/BAT-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Boo.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CPP-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CSharp-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Coco-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/HTML-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ICSharpCode.TextEditor.snk
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Java-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/JavaScript-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Mode.xsd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/PHP-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Patch-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/RightArrow.cur
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/SyntaxModes.xml
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Tex-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/TextEditorControl.bmp
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/VBNET-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/XML-Mode.xshd
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/BookmarkActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/CaretActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/ClipBoardActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FoldActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FormatActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/HomeEndActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/IEditAction.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/MiscActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/SelectionActions.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/AbstractSegment.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/Bookmark.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkEventHandler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManager.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManagerMemento.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultDocument.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultTextEditorProperties.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentEventArgs.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentFactory.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldMarker.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldingManager.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IFoldingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IndentFoldingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/DefaultFormattingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/IFormattingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/FontContainer.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightBackground.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightColor.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightInfo.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightRuleSet.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingColorNotFoundException.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionInvalidException.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionParser.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingManager.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingStrategyFactory.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/IHighlightingStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/NextMarker.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/PrevMarker.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/Span.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SpanStack.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/FileSyntaxModeProvider.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ISyntaxModeFileProvider.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ResourceSyntaxModeProvider.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/SyntaxMode.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/TextWord.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/IDocument.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ISegment.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ITextEditorProperties.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/DeferredEventList.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManager.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManagerEventArgs.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegment.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegmentTree.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/MarkerStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/TextMarker.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ColumnRange.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/DefaultSelection.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ISelection.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/SelectionManager.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextAnchor.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/GapTextBufferStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/ITextBufferStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/StringTextBufferStrategy.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextLocation.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextUtilities.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/AbstractMargin.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BracketHighlighter.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BrushRegistry.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Caret.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionListView.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/DeclarationViewWindow.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionData.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/DrawableLine.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/FoldMargin.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/GutterMargin.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/HRuler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/IconBarMargin.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Ime.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/IInsightDataProvider.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/InsightWindow.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextArea.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaClipboardHandler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaControl.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaDragDropHandler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaMouseHandler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaUpdate.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControl.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControlBase.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextView.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/ToolTipRequestEventArgs.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/IUndoableOperation.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoQueue.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoStack.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableDelete.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableInsert.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableReplace.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/AugmentableRedBlackTree.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/CheckedList.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/FileReader.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LoggingService.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LookupTable.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/MouseWheelHandler.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RedBlackTreeIterator.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RtfWriter.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TextUtility.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainter.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainterTools.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSection.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSpacer.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSplitter.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipText.cs
trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/WeakCollection.cs
Modified:
trunk/Tools/Maestro/Install/Maestro.nsi
trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs
trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs
trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.resx
trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
trunk/Tools/Maestro/Maestro/Maestro_All.sln
trunk/Tools/Maestro/Maestro/changelog.txt
Log:
Incorporate ICSharpCode.TextEditor. This replaces the vanilla XML editor with something more industrial strength and proven, with features like:
* Syntax highlighting
* Line Numbers
* Tab/whitespace markers
* Much more!
Some existing XML editor functionality is slightly broken due to this integration. The Maestro.Editors assembly now has a dependency on ICSharpCode.TextEditor
Modified: trunk/Tools/Maestro/Install/Maestro.nsi
===================================================================
--- trunk/Tools/Maestro/Install/Maestro.nsi 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Install/Maestro.nsi 2012-05-29 12:27:02 UTC (rev 6706)
@@ -204,6 +204,7 @@
File "${INST_OUTPUT_MAESTRO}\ICSharpCode.Core.dll"
File "${INST_OUTPUT_MAESTRO}\ICSharpCode.Core.WinForms.dll"
File "${INST_OUTPUT_MAESTRO}\ICSharpCode.SharpZipLib.dll"
+ File "${INST_OUTPUT_MAESTRO}\ICSharpCode.TextEditor.dll"
File "${INST_OUTPUT_MAESTRO}\IronPython.dll"
File "${INST_OUTPUT_MAESTRO}\IronPython.Modules.dll"
File "${INST_OUTPUT_MAESTRO}\Maestro.Base.dll"
Modified: trunk/Tools/Maestro/Maestro/Maestro_All.sln
===================================================================
--- trunk/Tools/Maestro/Maestro/Maestro_All.sln 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro/Maestro_All.sln 2012-05-29 12:27:02 UTC (rev 6706)
@@ -136,6 +136,8 @@
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsUI", "..\Thirdparty\WinFormsUI\WinFormsUI.csproj", "{C75532C4-765B-418E-B09B-46D36B2ABDB1}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ICSharpCode.TextEditor", "..\Thirdparty\SharpDevelop\ICSharpCode.TextEditor\ICSharpCode.TextEditor.csproj", "{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -314,6 +316,10 @@
{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C75532C4-765B-418E-B09B-46D36B2ABDB1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Modified: trunk/Tools/Maestro/Maestro/changelog.txt
===================================================================
--- trunk/Tools/Maestro/Maestro/changelog.txt 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro/changelog.txt 2012-05-29 12:27:02 UTC (rev 6706)
@@ -1,5 +1,7 @@
5.0 Beta 2
----------
+ - Upgrade SharpDevelop Core to 4.2
+ - Revamped XML editor with ICSharpCode.TextEditor control
- MgCooker tiling classes now part of the MaestroAPI
- Fix: Potentially long running tasks are now done on background threads with busy dialogs
- Fix: Non-working expression buttons for some color pickers
Modified: trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.Designer.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -47,31 +47,32 @@
this.txtReplace = new System.Windows.Forms.ToolStripTextBox();
this.btnReplaceAll = new System.Windows.Forms.ToolStripButton();
this.lblCursorPos = new System.Windows.Forms.ToolStripLabel();
- this.txtXmlContent = new System.Windows.Forms.TextBox();
this.resDataCtrl = new Maestro.Editors.Generic.ResourceDataPanel();
+ this.nodeNumericUpDown1 = new Aga.Controls.Tree.NodeControls.NodeNumericUpDown();
+ this.txtXmlContent = new ICSharpCode.TextEditor.TextEditorControl();
this.toolStrip1.SuspendLayout();
this.SuspendLayout();
//
// toolStrip1
//
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.btnUndo,
- this.toolStripSeparator1,
- this.btnCopy,
- this.btnCut,
- this.btnPaste,
- this.toolStripSeparator2,
- this.btnFormat,
- this.btnValidate,
- this.toolStripSeparator3,
- this.toolStripLabel1,
- this.txtFind,
- this.btnFindNext,
- this.toolStripSeparator4,
- this.toolStripLabel3,
- this.txtReplace,
- this.btnReplaceAll,
- this.lblCursorPos});
+ this.btnUndo,
+ this.toolStripSeparator1,
+ this.btnCopy,
+ this.btnCut,
+ this.btnPaste,
+ this.toolStripSeparator2,
+ this.btnFormat,
+ this.btnValidate,
+ this.toolStripSeparator3,
+ this.toolStripLabel1,
+ this.txtFind,
+ this.btnFindNext,
+ this.toolStripSeparator4,
+ this.toolStripLabel3,
+ this.txtReplace,
+ this.btnReplaceAll,
+ this.lblCursorPos});
resources.ApplyResources(this.toolStrip1, "toolStrip1");
this.toolStrip1.Name = "toolStrip1";
//
@@ -181,26 +182,42 @@
this.lblCursorPos.Name = "lblCursorPos";
resources.ApplyResources(this.lblCursorPos, "lblCursorPos");
//
- // txtXmlContent
- //
- this.txtXmlContent.AcceptsReturn = true;
- this.txtXmlContent.AcceptsTab = true;
- resources.ApplyResources(this.txtXmlContent, "txtXmlContent");
- this.txtXmlContent.Name = "txtXmlContent";
- this.txtXmlContent.TextChanged += new System.EventHandler(this.txtXmlContent_TextChanged);
- this.txtXmlContent.KeyUp += new System.Windows.Forms.KeyEventHandler(this.txtXmlContent_KeyUp);
- this.txtXmlContent.MouseClick += new System.Windows.Forms.MouseEventHandler(this.txtXmlContent_MouseClick);
- //
// resDataCtrl
//
this.resDataCtrl.ContentBackgroundColor = System.Drawing.SystemColors.Control;
resources.ApplyResources(this.resDataCtrl, "resDataCtrl");
this.resDataCtrl.HeaderBackgroundColor = System.Drawing.Color.LightSteelBlue;
this.resDataCtrl.HeaderFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.resDataCtrl.HeaderText = "Resource Data Files";
this.resDataCtrl.Name = "resDataCtrl";
this.resDataCtrl.DataListChanged += new System.EventHandler(this.resDataCtrl_DataListChanged);
//
+ // nodeNumericUpDown1
+ //
+ this.nodeNumericUpDown1.Increment = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nodeNumericUpDown1.IncrementalSearchEnabled = true;
+ this.nodeNumericUpDown1.LeftMargin = 3;
+ this.nodeNumericUpDown1.Maximum = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.nodeNumericUpDown1.Minimum = new decimal(new int[] {
+ 0,
+ 0,
+ 0,
+ 0});
+ this.nodeNumericUpDown1.ParentColumn = null;
+ //
+ // txtXmlContent
+ //
+ resources.ApplyResources(this.txtXmlContent, "txtXmlContent");
+ this.txtXmlContent.IsReadOnly = false;
+ this.txtXmlContent.Name = "txtXmlContent";
+ //
// XmlEditorCtrl
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
@@ -213,14 +230,14 @@
this.toolStrip1.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
-
}
+ private Aga.Controls.Tree.NodeControls.NodeNumericUpDown nodeNumericUpDown1;
#endregion
private System.Windows.Forms.ToolStrip toolStrip1;
private ResourceDataPanel resDataCtrl;
- private System.Windows.Forms.TextBox txtXmlContent;
+ private ICSharpCode.TextEditor.TextEditorControl txtXmlContent;
private System.Windows.Forms.ToolStripButton btnCopy;
private System.Windows.Forms.ToolStripButton btnCut;
private System.Windows.Forms.ToolStripButton btnPaste;
Modified: trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -20,17 +20,19 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Data;
using System.Drawing;
-using System.Data;
+using System.IO;
using System.Text;
using System.Windows.Forms;
+using System.Xml;
using System.Xml.Schema;
-using System.Xml;
-using System.IO;
+
+using ICSharpCode.TextEditor.Document;
+using OSGeo.MapGuide.MaestroAPI;
+using OSGeo.MapGuide.MaestroAPI.Exceptions;
+using OSGeo.MapGuide.MaestroAPI.Resource;
using OSGeo.MapGuide.ObjectModels;
-using OSGeo.MapGuide.MaestroAPI.Resource;
-using OSGeo.MapGuide.MaestroAPI.Exceptions;
-using OSGeo.MapGuide.MaestroAPI;
namespace Maestro.Editors.Generic
{
@@ -39,6 +41,9 @@
/// </summary>
public delegate void XmlValidationCallback(out string[] errors, out string[] warnings);
+ //TODO: Incorporate all the bells and whistles that ICSharpCode.TextEditor has to offer.
+ //Right now this is an obvious shim-job
+
/// <summary>
/// A generic XML content editor
/// </summary>
@@ -52,8 +57,24 @@
public XmlEditorCtrl()
{
InitializeComponent();
- txtXmlContent.MaxLength = int.MaxValue;
+ //txtXmlContent.MaxLength = int.MaxValue;
+ txtXmlContent.SetHighlighting("XML");
+ txtXmlContent.ShowInvalidLines = true;
+ txtXmlContent.ShowSpaces = true;
+ txtXmlContent.ShowTabs = true;
+ txtXmlContent.TextChanged += new EventHandler(OnTextContentChanged);
}
+
+ private string _origText;
+
+ private void OnTextContentChanged(object sender, EventArgs e)
+ {
+ if (!string.IsNullOrEmpty(_origText) && !txtXmlContent.Text.Equals(_origText))
+ OnResourceChanged();
+
+ if (string.IsNullOrEmpty(_origText))
+ _origText = txtXmlContent.Text;
+ }
/// <summary>
/// Gets or sets the validator.
@@ -110,9 +131,9 @@
private void EvaluateCommands()
{
- btnUndo.Enabled = txtXmlContent.CanUndo;
- btnCut.Enabled = txtXmlContent.SelectionLength > 0;
- btnCopy.Enabled = txtXmlContent.SelectionLength > 0;
+ btnUndo.Enabled = txtXmlContent.EnableUndo;
+ btnCut.Enabled = txtXmlContent.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCut;
+ btnCopy.Enabled = txtXmlContent.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCopy;
btnPaste.Enabled = Clipboard.ContainsText();
btnValidate.Enabled = (this.Validator != null);
}
@@ -124,7 +145,11 @@
public string XmlContent
{
get { return txtXmlContent.Text; }
- set { txtXmlContent.Text = value; FormatText(); }
+ set
+ {
+ _origText = null;
+ txtXmlContent.Text = value; FormatText();
+ }
}
private void btnUndo_Click(object sender, EventArgs e)
@@ -160,10 +185,11 @@
public void FindAndReplace(string szFind, string szReplace)
{
var textEditor = txtXmlContent;
-
+
+ var selections = textEditor.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection;
// find start
- int iStartSearching = textEditor.SelectionStart;
- if (textEditor.SelectionLength > 0)
+ int iStartSearching = -1;
+ if (selections.Count > 0)
iStartSearching++;
System.Text.RegularExpressions.Regex regexThis = new System.Text.RegularExpressions.Regex(szFind, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
@@ -201,56 +227,33 @@
int iFound = textEditor.Text.IndexOf(szHighlight, iStartSearching);
if (iFound > -1)
{
- textEditor.Focus();
- textEditor.Select(iFound, szHighlight.Length);
+ /*
+ //textEditor.Select(iFound, szHighlight.Length);
+ var doc = GetDocument();
+
+ textEditor.ActiveTextAreaControl.SelectionManager.SelectedText
UpdateTextPosition();
- textEditor.ScrollToCaret();
+ //textEditor.ScrollToCaret();
+ */
- if (!String.IsNullOrEmpty(szReplace) && _ready)
- OnResourceChanged();
+ //if (!String.IsNullOrEmpty(szReplace) && _ready)
+ // OnResourceChanged();
}
}
+
+ private IDocument GetDocument()
+ {
+ return txtXmlContent.ActiveTextAreaControl.Document;
+ }
private void UpdateTextPosition()
{
var textEditor = txtXmlContent;
- int line = textEditor.GetLineFromCharIndex(textEditor.SelectionStart + textEditor.SelectionLength);
- int col = (textEditor.SelectionStart + textEditor.SelectionLength) - textEditor.GetFirstCharIndexFromLine(line);
-
+ int line = textEditor.ActiveTextAreaControl.Caret.Line;
+ int col = textEditor.ActiveTextAreaControl.Caret.Column;
lblCursorPos.Text = String.Format(Properties.Resources.XmlEditorCursorTemplate, line + 1, col + 1);
}
- private void txtXmlContent_KeyUp(object sender, KeyEventArgs e)
- {
- if (e.KeyData == (Keys.Control | Keys.A))
- {
- txtXmlContent.SelectAll();
- e.SuppressKeyPress = true;
- e.Handled = true;
- }/*
- else if (e.KeyData == (Keys.Control | Keys.C))
- {
- txtXmlContent.Copy();
- e.SuppressKeyPress = true;
- e.Handled = true;
- }
- else if (e.KeyData == (Keys.Control | Keys.V))
- {
- txtXmlContent.Paste();
- e.SuppressKeyPress = true;
- e.Handled = true;
- }
- else if (e.KeyData == (Keys.Control | Keys.X))
- {
- txtXmlContent.Cut();
- e.SuppressKeyPress = true;
- e.Handled = true;
- }
- */
- UpdateTextPosition();
- EvaluateCommands();
- }
-
private void txtXmlContent_TextChanged(object sender, EventArgs e)
{
UpdateTextPosition();
@@ -260,12 +263,6 @@
OnResourceChanged();
}
- private void txtXmlContent_MouseClick(object sender, MouseEventArgs e)
- {
- UpdateTextPosition();
- EvaluateCommands();
- }
-
private void btnValidate_Click(object sender, EventArgs e)
{
PerformValidation(false, false);
@@ -389,17 +386,81 @@
private void btnCut_Click(object sender, EventArgs e)
{
- txtXmlContent.Cut();
+ txtXmlContent.ActiveTextAreaControl.TextArea.ClipboardHandler.Cut(this, EventArgs.Empty);
}
private void btnCopy_Click(object sender, EventArgs e)
{
- txtXmlContent.Copy();
+ txtXmlContent.ActiveTextAreaControl.TextArea.ClipboardHandler.Copy(this, EventArgs.Empty);
}
private void btnPaste_Click(object sender, EventArgs e)
{
- txtXmlContent.Paste();
+ txtXmlContent.ActiveTextAreaControl.TextArea.ClipboardHandler.Paste(this, EventArgs.Empty);
}
}
+
+ /// <summary>
+ /// Holds information about the start of a fold in an xml string.
+ /// </summary>
+ internal class XmlFoldStart
+ {
+ int line = 0;
+ int col = 0;
+ string prefix = String.Empty;
+ string name = String.Empty;
+ string foldText = String.Empty;
+
+ public XmlFoldStart(string prefix, string name, int line, int col)
+ {
+ this.line = line;
+ this.col = col;
+ this.prefix = prefix;
+ this.name = name;
+ }
+
+ /// <summary>
+ /// The line where the fold should start. Lines start from 0.
+ /// </summary>
+ public int Line {
+ get {
+ return line;
+ }
+ }
+
+ /// <summary>
+ /// The column where the fold should start. Columns start from 0.
+ /// </summary>
+ public int Column {
+ get {
+ return col;
+ }
+ }
+
+ /// <summary>
+ /// The name of the xml item with its prefix if it has one.
+ /// </summary>
+ public string Name {
+ get {
+ if (prefix.Length > 0) {
+ return String.Concat(prefix, ":", name);
+ } else {
+ return name;
+ }
+ }
+ }
+
+ /// <summary>
+ /// The text to be displayed when the item is folded.
+ /// </summary>
+ public string FoldText {
+ get {
+ return foldText;
+ }
+
+ set {
+ foldText = value;
+ }
+ }
+ }
}
Modified: trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.resx
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.resx 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro.Editors/Generic/XmlEditorCtrl.resx 2012-05-29 12:27:02 UTC (rev 6706)
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
@@ -112,15 +112,15 @@
<value>2.0</value>
</resheader>
<resheader name="reader">
- <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
- <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
- <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>0, 0</value>
</metadata>
- <assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="btnUndo.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
<value>Magenta</value>
</data>
@@ -258,7 +258,7 @@
<data name="toolStrip1.Size" type="System.Drawing.Size, System.Drawing">
<value>629, 25</value>
</data>
- <assembly alias="mscorlib" name="mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="toolStrip1.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
@@ -269,7 +269,7 @@
<value>toolStrip1</value>
</data>
<data name=">>toolStrip1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStrip1.Parent" xml:space="preserve">
<value>$this</value>
@@ -277,46 +277,13 @@
<data name=">>toolStrip1.ZOrder" xml:space="preserve">
<value>2</value>
</data>
- <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
- <data name="txtXmlContent.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
- <value>Fill</value>
- </data>
- <data name="txtXmlContent.Font" type="System.Drawing.Font, System.Drawing">
- <value>Courier New, 12pt</value>
- </data>
- <data name="txtXmlContent.Location" type="System.Drawing.Point, System.Drawing">
- <value>0, 25</value>
- </data>
- <data name="txtXmlContent.Multiline" type="System.Boolean, mscorlib">
- <value>True</value>
- </data>
- <data name="txtXmlContent.ScrollBars" type="System.Windows.Forms.ScrollBars, System.Windows.Forms">
- <value>Both</value>
- </data>
- <data name="txtXmlContent.Size" type="System.Drawing.Size, System.Drawing">
- <value>629, 301</value>
- </data>
- <data name="txtXmlContent.TabIndex" type="System.Int32, mscorlib">
- <value>2</value>
- </data>
- <data name="txtXmlContent.WordWrap" type="System.Boolean, mscorlib">
- <value>False</value>
- </data>
- <data name=">>txtXmlContent.Name" xml:space="preserve">
- <value>txtXmlContent</value>
- </data>
- <data name=">>txtXmlContent.Type" xml:space="preserve">
- <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
- </data>
- <data name=">>txtXmlContent.Parent" xml:space="preserve">
- <value>$this</value>
- </data>
- <data name=">>txtXmlContent.ZOrder" xml:space="preserve">
- <value>0</value>
- </data>
+ <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="resDataCtrl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Bottom</value>
</data>
+ <data name="resDataCtrl.HeaderText" xml:space="preserve">
+ <value>Resource Data Files</value>
+ </data>
<data name="resDataCtrl.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 326</value>
</data>
@@ -330,7 +297,7 @@
<value>resDataCtrl</value>
</data>
<data name=">>resDataCtrl.Type" xml:space="preserve">
- <value>Maestro.Editors.Generic.ResourceDataPanel, Maestro.Editors, Version=3.0.0.5708, Culture=neutral, PublicKeyToken=null</value>
+ <value>Maestro.Editors.Generic.ResourceDataPanel, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
</data>
<data name=">>resDataCtrl.Parent" xml:space="preserve">
<value>$this</value>
@@ -338,7 +305,31 @@
<data name=">>resDataCtrl.ZOrder" xml:space="preserve">
<value>1</value>
</data>
- <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <data name="txtXmlContent.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
+ <value>Fill</value>
+ </data>
+ <data name="txtXmlContent.Location" type="System.Drawing.Point, System.Drawing">
+ <value>0, 25</value>
+ </data>
+ <data name="txtXmlContent.Size" type="System.Drawing.Size, System.Drawing">
+ <value>629, 301</value>
+ </data>
+ <data name="txtXmlContent.TabIndex" type="System.Int32, mscorlib">
+ <value>2</value>
+ </data>
+ <data name=">>txtXmlContent.Name" xml:space="preserve">
+ <value>txtXmlContent</value>
+ </data>
+ <data name=">>txtXmlContent.Type" xml:space="preserve">
+ <value>ICSharpCode.TextEditor.TextEditorControl, ICSharpCode.TextEditor, Version=4.2.0.8783, Culture=neutral, PublicKeyToken=4d61825e8dd49f1a</value>
+ </data>
+ <data name=">>txtXmlContent.Parent" xml:space="preserve">
+ <value>$this</value>
+ </data>
+ <data name=">>txtXmlContent.ZOrder" xml:space="preserve">
+ <value>0</value>
+ </data>
+ <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
@@ -348,108 +339,114 @@
<value>btnUndo</value>
</data>
<data name=">>btnUndo.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripSeparator1.Name" xml:space="preserve">
<value>toolStripSeparator1</value>
</data>
<data name=">>toolStripSeparator1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnCopy.Name" xml:space="preserve">
<value>btnCopy</value>
</data>
<data name=">>btnCopy.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnCut.Name" xml:space="preserve">
<value>btnCut</value>
</data>
<data name=">>btnCut.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnPaste.Name" xml:space="preserve">
<value>btnPaste</value>
</data>
<data name=">>btnPaste.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripSeparator2.Name" xml:space="preserve">
<value>toolStripSeparator2</value>
</data>
<data name=">>toolStripSeparator2.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnFormat.Name" xml:space="preserve">
<value>btnFormat</value>
</data>
<data name=">>btnFormat.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnValidate.Name" xml:space="preserve">
<value>btnValidate</value>
</data>
<data name=">>btnValidate.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripSeparator3.Name" xml:space="preserve">
<value>toolStripSeparator3</value>
</data>
<data name=">>toolStripSeparator3.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripLabel1.Name" xml:space="preserve">
<value>toolStripLabel1</value>
</data>
<data name=">>toolStripLabel1.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>txtFind.Name" xml:space="preserve">
<value>txtFind</value>
</data>
<data name=">>txtFind.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnFindNext.Name" xml:space="preserve">
<value>btnFindNext</value>
</data>
<data name=">>btnFindNext.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripSeparator4.Name" xml:space="preserve">
<value>toolStripSeparator4</value>
</data>
<data name=">>toolStripSeparator4.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripSeparator, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>toolStripLabel3.Name" xml:space="preserve">
<value>toolStripLabel3</value>
</data>
<data name=">>toolStripLabel3.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>txtReplace.Name" xml:space="preserve">
<value>txtReplace</value>
</data>
<data name=">>txtReplace.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripTextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>btnReplaceAll.Name" xml:space="preserve">
<value>btnReplaceAll</value>
</data>
<data name=">>btnReplaceAll.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name=">>lblCursorPos.Name" xml:space="preserve">
<value>lblCursorPos</value>
</data>
<data name=">>lblCursorPos.Type" xml:space="preserve">
- <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ <value>System.Windows.Forms.ToolStripLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
+ <data name=">>nodeNumericUpDown1.Name" xml:space="preserve">
+ <value>nodeNumericUpDown1</value>
+ </data>
+ <data name=">>nodeNumericUpDown1.Type" xml:space="preserve">
+ <value>Aga.Controls.Tree.NodeControls.NodeNumericUpDown, Aga.Controls, Version=1.7.0.0, Culture=neutral, PublicKeyToken=fcc90fbf924463a3</value>
+ </data>
<data name=">>$this.Name" xml:space="preserve">
<value>XmlEditorCtrl</value>
</data>
<data name=">>$this.Type" xml:space="preserve">
- <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=3.0.0.5708, Culture=neutral, PublicKeyToken=null</value>
+ <value>Maestro.Editors.EditorBase, Maestro.Editors, Version=5.0.0.6640, Culture=neutral, PublicKeyToken=f526c48929fda856</value>
</data>
</root>
\ No newline at end of file
Modified: trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj
===================================================================
--- trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj 2012-05-29 11:37:40 UTC (rev 6705)
+++ trunk/Tools/Maestro/Maestro.Editors/Maestro.Editors.csproj 2012-05-29 12:27:02 UTC (rev 6706)
@@ -1794,6 +1794,10 @@
<Project>{80FA3158-8B5F-48D1-A393-0378AFE48A7E}</Project>
<Name>OSGeo.MapGuide.MaestroAPI</Name>
</ProjectReference>
+ <ProjectReference Include="..\Thirdparty\SharpDevelop\ICSharpCode.TextEditor\ICSharpCode.TextEditor.csproj">
+ <Project>{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}</Project>
+ <Name>ICSharpCode.TextEditor</Name>
+ </ProjectReference>
<ProjectReference Include="..\Thirdparty\TreeViewAdv\Aga.Controls\Aga.Controls.csproj">
<Project>{E73BB233-D88B-44A7-A98F-D71EE158381D}</Project>
<Name>Aga.Controls</Name>
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor
___________________________________________________________________
Added: svn:ignore
+ bin
obj
Added: bugtraq:number
+ true
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration/AssemblyInfo.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration/AssemblyInfo.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Configuration/AssemblyInfo.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,19 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+[assembly: CLSCompliant(true)]
+[assembly: StringFreezing()]
+
+[assembly: AssemblyTitle("ICSharpCode.TextEditor")]
+[assembly: AssemblyDescription("A .NET text editor control")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/ICSharpCode.TextEditor.csproj 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,232 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>8.0.50727</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{2D18BE89-D210-49EB-A9DD-2246FBB3DF6D}</ProjectGuid>
+ <AssemblyName>ICSharpCode.TextEditor</AssemblyName>
+ <OutputTarget>Library</OutputTarget>
+ <WarningLevel>4</WarningLevel>
+ <NoStdLib>False</NoStdLib>
+ <NoConfig>False</NoConfig>
+ <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>
+ <OutputType>Library</OutputType>
+ <SignAssembly>true</SignAssembly>
+ <AssemblyOriginatorKeyFile>Resources\ICSharpCode.TextEditor.snk</AssemblyOriginatorKeyFile>
+ <RootNamespace>ICSharpCode.TextEditor</RootNamespace>
+ <RegisterForComInterop>False</RegisterForComInterop>
+ <GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
+ <BaseAddress>98041856</BaseAddress>
+ <PlatformTarget>AnyCPU</PlatformTarget>
+ <FileAlignment>4096</FileAlignment>
+ <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
+ <DelaySign>False</DelaySign>
+ <AssemblyOriginatorKeyMode>File</AssemblyOriginatorKeyMode>
+ <TargetFrameworkProfile>Client</TargetFrameworkProfile>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <Optimize>False</Optimize>
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+ <CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
+ <OutputPath>bin\Debug</OutputPath>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ <CodeAnalysisRules>-Microsoft.Design#CA1012;-Microsoft.Design#CA2210;-Microsoft.Design#CA1040;-Microsoft.Design#CA1005;-Microsoft.Design#CA1020;-Microsoft.Design#CA1021;-Microsoft.Design#CA1010;-Microsoft.Design#CA1011;-Microsoft.Design#CA1009;-Microsoft.Design#CA1050;-Microsoft.Design#CA1026;-Microsoft.Design#CA1019;-Microsoft.Design#CA1031;-Microsoft.Design#CA1047;-Microsoft.Design#CA1000;-Microsoft.Design#CA1048;-Microsoft.Design#CA1051;-Microsoft.Design#CA1002;-Microsoft.Design#CA1061;-Microsoft.Design#CA1006;-Microsoft.Design#CA1046;-Microsoft.Design#CA1045;-Microsoft.Design#CA1038;-Microsoft.Design#CA1008;-Microsoft.Design#CA1028;-Microsoft.Design#CA1004;-Microsoft.Design#CA1035;-Microsoft.Design#CA1063;-Microsoft.Design#CA1032;-Microsoft.Design#CA1023;-Microsoft.Design#CA1033;-Microsoft.Design#CA1039;-Microsoft.Design#CA1016;-Microsoft.Design#CA1014;-Microsoft.Design#CA1017;-Microsoft.Design#CA1018;-Microsoft.Design#CA1027;-Microsoft.Design#CA1059;-Microsoft.Desig
n#CA1060;-Microsoft.Design#CA1034;-Microsoft.Design#CA1013;-Microsoft.Design#CA1036;-Microsoft.Design#CA1044;-Microsoft.Design#CA1041;-Microsoft.Design#CA1025;-Microsoft.Design#CA1052;-Microsoft.Design#CA1053;-Microsoft.Design#CA1057;-Microsoft.Design#CA1058;-Microsoft.Design#CA1001;-Microsoft.Design#CA1049;-Microsoft.Design#CA1054;-Microsoft.Design#CA1056;-Microsoft.Design#CA1055;-Microsoft.Design#CA1030;-Microsoft.Design#CA1003;-Microsoft.Design#CA1007;-Microsoft.Design#CA1043;-Microsoft.Design#CA1024;-Microsoft.Design#CA1062;-Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302;-Microsoft.Globalization#CA1303;-Microsoft.Globalization#CA1306;-Microsoft.Globalization#CA1304;-Microsoft.Globalization#CA1305;-Microsoft.Globalization#CA1300;-Microsoft.Mobility#CA1600;-Microsoft.Mobility#CA1601;-Microsoft.Naming#CA1718;-Microsoft.Naming#CA1720;-Microsoft.Naming#CA1700;-Microsoft.Naming#CA1712;-Microsoft.Naming#CA1713;-Microsoft.Naming#CA1709;-Microsoft.Naming#CA1708;-M
icrosoft.Naming#CA1715;-Microsoft.Naming#CA1710;-Microsoft.Naming#CA1707;-Microsoft.Naming#CA1722;-Microsoft.Naming#CA1711;-Microsoft.Naming#CA1716;-Microsoft.Naming#CA1705;-Microsoft.Naming#CA1725;-Microsoft.Naming#CA1719;-Microsoft.Naming#CA1721;-Microsoft.Naming#CA1706;-Microsoft.Naming#CA1724;-Microsoft.Naming#CA1726;-Microsoft.Performance#CA1809;-Microsoft.Performance#CA1811;-Microsoft.Performance#CA1812;-Microsoft.Performance#CA1807;-Microsoft.Performance#CA1813;-Microsoft.Performance#CA1823;-Microsoft.Performance#CA1816;-Microsoft.Performance#CA1817;-Microsoft.Performance#CA1800;-Microsoft.Performance#CA1818;-Microsoft.Performance#CA1805;-Microsoft.Performance#CA1810;-Microsoft.Performance#CA1822;-Microsoft.Performance#CA1815;-Microsoft.Performance#CA1814;-Microsoft.Performance#CA1819;-Microsoft.Performance#CA1804;-Microsoft.Performance#CA1820;-Microsoft.Performance#CA1802;-Microsoft.Security#CA2116;-Microsoft.Security#CA2117;-Microsoft.Security#CA2105;-Microsoft.Secu
rity#CA2115;-Microsoft.Security#CA2104;-Microsoft.Security#CA2122;-Microsoft.Security#CA2114;-Microsoft.Security#CA2123;-Microsoft.Security#CA2111;-Microsoft.Security#CA2108;-Microsoft.Security#CA2107;-Microsoft.Security#CA2103;-Microsoft.Security#CA2100;-Microsoft.Security#CA2118;-Microsoft.Security#CA2109;-Microsoft.Security#CA2119;-Microsoft.Security#CA2106;-Microsoft.Security#CA2112;-Microsoft.Security#CA2110;-Microsoft.Security#CA2120;-Microsoft.Security#CA2101;-Microsoft.Security#CA2121;-Microsoft.Security#CA2126;-Microsoft.Security#CA2124;-Microsoft.Usage#CA2209;-Microsoft.Usage#CA2236;-Microsoft.Usage#CA2227;-Microsoft.Usage#CA2213;-Microsoft.Usage#CA2216;-Microsoft.Usage#CA2215;-Microsoft.Usage#CA2214;-Microsoft.Usage#CA2222;-Microsoft.Usage#CA2202;-Microsoft.Usage#CA1806;-Microsoft.Usage#CA2217;-Microsoft.Usage#CA2212;-Microsoft.Usage#CA2219;-Microsoft.Usage#CA2201;-Microsoft.Usage#CA2228;-Microsoft.Usage#CA2221;-Microsoft.Usage#CA2220;-Microsoft.Usage#CA2240;-Micr
osoft.Usage#CA2229;-Microsoft.Usage#CA2238;-Microsoft.Usage#CA2207;-Microsoft.Usage#CA2208;-Microsoft.Usage#CA2235;-Microsoft.Usage#CA2237;-Microsoft.Usage#CA2232;-Microsoft.Usage#CA2223;-Microsoft.Usage#CA2211;-Microsoft.Usage#CA2233;-Microsoft.Usage#CA2225;-Microsoft.Usage#CA2226;-Microsoft.Usage#CA2231;-Microsoft.Usage#CA2224;-Microsoft.Usage#CA2218;-Microsoft.Usage#CA2234;-Microsoft.Usage#CA2241;-Microsoft.Usage#CA2239;-Microsoft.Usage#CA2200;-Microsoft.Usage#CA1801;-Microsoft.Usage#CA2205;-Microsoft.Usage#CA2230</CodeAnalysisRules>
+ <DefineConstants>DEBUG;DATACONSISTENCYTEST</DefineConstants>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <Optimize>True</Optimize>
+ <AllowUnsafeBlocks>False</AllowUnsafeBlocks>
+ <CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
+ <OutputPath>bin\Release</OutputPath>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+ <DebugType>Full</DebugType>
+ <DebugSymbols>true</DebugSymbols>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+ <DebugType>None</DebugType>
+ <DebugSymbols>false</DebugSymbols>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="System.Core">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ <Reference Include="System.Drawing" />
+ <Reference Include="System.Windows.Forms" />
+ <Reference Include="System.Xml" />
+ <Reference Include="System.Xml.Linq">
+ <RequiredTargetFramework>3.5</RequiredTargetFramework>
+ </Reference>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="Src\Document\DefaultDocument.cs" />
+ <Compile Include="Src\Document\DocumentEventArgs.cs" />
+ <Compile Include="Src\Document\DocumentFactory.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightingDefinitionInvalidException.cs" />
+ <Compile Include="Src\Document\IDocument.cs" />
+ <Compile Include="Src\Document\ISegment.cs" />
+ <Compile Include="Src\Document\LineManager\DeferredEventList.cs" />
+ <Compile Include="Src\Document\LineManager\LineSegmentTree.cs" />
+ <Compile Include="Src\Document\TextAnchor.cs" />
+ <Compile Include="Src\Document\TextLocation.cs" />
+ <Compile Include="Src\Document\TextUtilities.cs" />
+ <Compile Include="Src\Document\BookmarkManager\BookmarkManager.cs" />
+ <Compile Include="Src\Document\BookmarkManager\BookmarkManagerMemento.cs" />
+ <Compile Include="Src\Document\FormattingStrategy\DefaultFormattingStrategy.cs" />
+ <Compile Include="Src\Document\FormattingStrategy\IFormattingStrategy.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\DefaultHighlightingStrategy.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\FontContainer.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightBackground.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightColor.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightInfo.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightingColorNotFoundException.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightingDefinitionParser.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightingManager.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightingStrategyFactory.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\HighlightRuleSet.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\IHighlightingStrategy.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\NextMarker.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\PrevMarker.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\Span.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\TextWord.cs" />
+ <Compile Include="Src\Document\LineManager\LineManager.cs" />
+ <Compile Include="Src\Document\LineManager\LineSegment.cs" />
+ <Compile Include="Src\Document\LineManager\LineManagerEventArgs.cs" />
+ <Compile Include="Src\Document\TextBufferStrategy\GapTextBufferStrategy.cs" />
+ <Compile Include="Src\Document\TextBufferStrategy\ITextBufferStrategy.cs" />
+ <Compile Include="Src\Document\TextBufferStrategy\StringTextBufferStrategy.cs" />
+ <Compile Include="Src\Util\AugmentableRedBlackTree.cs" />
+ <Compile Include="Src\Util\CheckedList.cs" />
+ <Compile Include="Src\Util\LoggingService.cs" />
+ <Compile Include="Src\Util\LookupTable.cs" />
+ <Compile Include="Src\Util\MouseWheelHandler.cs" />
+ <Compile Include="Src\Util\RedBlackTreeIterator.cs" />
+ <Compile Include="Src\Util\TextUtility.cs" />
+ <Compile Include="Src\Undo\UndoableDelete.cs" />
+ <Compile Include="Src\Undo\UndoableInsert.cs" />
+ <Compile Include="Src\Undo\UndoableReplace.cs" />
+ <Compile Include="Src\Actions\ClipBoardActions.cs" />
+ <Compile Include="Src\Actions\CaretActions.cs" />
+ <Compile Include="Src\Actions\HomeEndActions.cs" />
+ <Compile Include="Src\Actions\IEditAction.cs" />
+ <Compile Include="Src\Actions\MiscActions.cs" />
+ <Compile Include="Src\Actions\SelectionActions.cs" />
+ <Compile Include="Src\Document\Selection\ISelection.cs" />
+ <Compile Include="Src\Document\Selection\DefaultSelection.cs" />
+ <Compile Include="Src\Document\FoldingStrategy\IFoldingStrategy.cs" />
+ <Compile Include="Src\Document\FoldingStrategy\IndentFoldingStrategy.cs" />
+ <Compile Include="Src\Gui\Ime.cs" />
+ <Compile Include="Src\Gui\TextAreaUpdate.cs" />
+ <Compile Include="Src\Document\Selection\SelectionManager.cs" />
+ <Compile Include="Src\Gui\CompletionWindow\ICompletionData.cs" />
+ <Compile Include="Src\Gui\CompletionWindow\ICompletionDataProvider.cs" />
+ <Compile Include="Src\Gui\CompletionWindow\CodeCompletionWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\CompletionWindow\DeclarationViewWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\InsightWindow\IInsightDataProvider.cs" />
+ <Compile Include="Src\Gui\InsightWindow\InsightWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Src\Util\RtfWriter.cs" />
+ <Compile Include="Src\Document\FoldingStrategy\FoldingManager.cs" />
+ <Compile Include="Src\Document\AbstractSegment.cs" />
+ <Compile Include="Src\Document\FoldingStrategy\FoldMarker.cs" />
+ <Compile Include="Src\Util\TipPainter.cs" />
+ <Compile Include="Src\Util\TipSection.cs" />
+ <Compile Include="Src\Util\TipText.cs" />
+ <Compile Include="Src\Util\TipSplitter.cs" />
+ <Compile Include="Src\Util\TipSpacer.cs" />
+ <Compile Include="Src\Util\TipPainterTools.cs" />
+ <Compile Include="Src\Document\ITextEditorProperties.cs" />
+ <Compile Include="Src\Gui\Caret.cs" />
+ <Compile Include="Src\Gui\TextArea.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\TextEditorControl.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\TextEditorControlBase.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\TextAreaClipboardHandler.cs" />
+ <Compile Include="Src\Gui\TextView.cs" />
+ <Compile Include="Src\Gui\GutterMargin.cs" />
+ <Compile Include="Src\Gui\AbstractMargin.cs" />
+ <Compile Include="Src\Undo\IUndoableOperation.cs" />
+ <Compile Include="Src\Undo\UndoQueue.cs" />
+ <Compile Include="Src\Undo\UndoStack.cs" />
+ <Compile Include="Src\Gui\TextAreaControl.cs">
+ <SubType>Component</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\TextAreaMouseHandler.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\SyntaxModes\ISyntaxModeFileProvider.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\SyntaxModes\SyntaxMode.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\SyntaxModes\ResourceSyntaxModeProvider.cs" />
+ <Compile Include="Src\Gui\IconBarMargin.cs" />
+ <Compile Include="Src\Gui\FoldMargin.cs" />
+ <Compile Include="Src\Document\HighlightingStrategy\SyntaxModes\FileSyntaxModeProvider.cs" />
+ <Compile Include="Src\Document\Selection\ColumnRange.cs" />
+ <Compile Include="Src\Gui\TextAreaDragDropHandler.cs" />
+ <Compile Include="Src\Gui\BracketHighlighter.cs" />
+ <Compile Include="Src\Actions\BookmarkActions.cs" />
+ <Compile Include="Src\Actions\FoldActions.cs" />
+ <Compile Include="Src\Actions\FormatActions.cs" />
+ <Compile Include="Src\Document\DefaultTextEditorProperties.cs" />
+ <Compile Include="Src\Document\MarkerStrategy\MarkerStrategy.cs" />
+ <Compile Include="Src\Document\MarkerStrategy\TextMarker.cs" />
+ <Compile Include="Src\Gui\CompletionWindow\AbstractCompletionWindow.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\CompletionWindow\CodeCompletionListView.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Src\Gui\BrushRegistry.cs" />
+ <Compile Include="Src\Gui\HRuler.cs">
+ <SubType>UserControl</SubType>
+ </Compile>
+ <Compile Include="Src\Document\BookmarkManager\Bookmark.cs" />
+ <Compile Include="Src\Document\BookmarkManager\BookmarkEventHandler.cs" />
+ <Compile Include="Configuration\AssemblyInfo.cs" />
+ <EmbeddedResource Include="Resources\ASPX.xshd" />
+ <EmbeddedResource Include="Resources\BAT-Mode.xshd" />
+ <EmbeddedResource Include="Resources\CPP-Mode.xshd" />
+ <EmbeddedResource Include="Resources\Coco-Mode.xshd" />
+ <EmbeddedResource Include="Resources\CSharp-Mode.xshd" />
+ <EmbeddedResource Include="Resources\HTML-Mode.xshd" />
+ <None Include="Resources\ICSharpCode.TextEditor.snk" />
+ <EmbeddedResource Include="Resources\TextEditorControl.bmp" />
+ <EmbeddedResource Include="Resources\Java-Mode.xshd" />
+ <EmbeddedResource Include="Resources\JavaScript-Mode.xshd" />
+ <EmbeddedResource Include="Resources\Mode.xsd" />
+ <EmbeddedResource Include="Resources\PHP-Mode.xshd" />
+ <EmbeddedResource Include="Resources\RightArrow.cur" />
+ <EmbeddedResource Include="Resources\SyntaxModes.xml" />
+ <EmbeddedResource Include="Resources\Tex-Mode.xshd" />
+ <EmbeddedResource Include="Resources\VBNET-Mode.xshd" />
+ <EmbeddedResource Include="Resources\XML-Mode.xshd" />
+ <Compile Include="Src\Util\FileReader.cs" />
+ <EmbeddedResource Include="Resources\Boo.xshd" />
+ <Compile Include="Src\Gui\DrawableLine.cs" />
+ <Compile Include="Src\Gui\ToolTipRequestEventArgs.cs" />
+ <Compile Include="..\GlobalAssemblyInfo.cs">
+ <Link>Configuration\GlobalAssemblyInfo.cs</Link>
+ </Compile>
+ <Compile Include="Src\Document\HighlightingStrategy\SpanStack.cs" />
+ <Compile Include="Src\Util\WeakCollection.cs" />
+ <EmbeddedResource Include="Resources\Patch-Mode.xshd" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="..\..\TreeViewAdv\Aga.Controls\Aga.Controls.csproj">
+ <Project>{E73BB233-D88B-44A7-A98F-D71EE158381D}</Project>
+ <Name>Aga.Controls</Name>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ASPX.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ASPX.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ASPX.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<SyntaxDefinition name = "ASP/XHTML" extensions = ".asp;.aspx;.asax;.asmx" extends = "HTML">
+ <RuleSets>
+ <RuleSet ignorecase = "true">
+ <Span name = "ASPCode" rule = "ASP" bold = "false" italic = "false" color = "Black" bgcolor = "#F7F2E3" stopateol = "false">
+ <Begin color="Black" bgcolor="Yellow"><%</Begin>
+ <End color="Black" bgcolor="Yellow">%></End>
+ </Span>
+ </RuleSet>
+
+ <RuleSet name="ASP" ignorecase = "false">
+ <Span name = "COMMENT" bold = "false" italic = "false" color = "Green" bgcolor = "#F7F2E3" stopateol = "true">
+ <Begin>//</Begin>
+ </Span>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/BAT-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/BAT-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/BAT-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+
+<!-- syntaxdefinition for BAT 2000 by Mike Krueger -->
+<SyntaxDefinition name = "BAT" extensions = ".bat">
+
+ <Environment>
+ <Default color = "Yellow" bgcolor = "Black"/>
+ <Selection color = "White" bgcolor = "Purple"/>
+ <VRuler color = "Green"/>
+ <InvalidLines color = "Red"/>
+ <CaretMarker color = "Yellow"/>
+
+ <LineNumbers color = "Gray" bgcolor = "Black"/>
+
+ <FoldLine color = "Cyan" bgcolor = "Black"/>
+ <FoldMarker color = "Cyan" bgcolor = "White"/>
+ <SelectedFoldLine color = "Green" bgcolor="Black"/>
+
+ <EOLMarkers color = "#E0E0E5"/>
+ <SpaceMarkers color = "#E0E0E5"/>
+ <TabMarkers color = "#E0E0E5"/>
+ </Environment>
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "Yellow"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters> </Delimiters>
+ </RuleSet>
+ </RuleSets>
+
+</SyntaxDefinition>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Boo.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Boo.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Boo.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,303 @@
+<?xml version="1.0"?>
+
+<SyntaxDefinition name="Boo" extensions=".boo">
+
+ <Environment>
+ <Custom name="LocalVariableCreation" bold="false" italic="false" color="#04ABAB" />
+ </Environment>
+
+ <Properties>
+ <Property name="LineComment" value="#"/>
+ </Properties>
+
+ <Digits name="Digits" bold="false" italic="false" color="DarkBlue" />
+
+ <RuleSets>
+ <RuleSet ignorecase="false" >
+ <Delimiters>&<>~!@$%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name="DocLineComment" stopateol="false" bold="false" italic="false" color="Green">
+ <Begin >"""</Begin>
+ <End >"""</End>
+ </Span>
+
+ <Span name="LineComment" stopateol="true" bold="false" italic="false" color="Gray" >
+ <Begin >#</Begin>
+ </Span>
+
+ <Span name="LineComment2" stopateol="true" bold="false" italic="false" color="#999999" >
+ <Begin >//</Begin>
+ </Span>
+
+ <Span name="BlockComment" rule="comments set" stopateol="false" bold="false" italic="false" color="Green" >
+ <Begin >/*</Begin>
+ <End >*/</End>
+ </Span>
+
+ <Span name="String" rule="str formatting" stopateol="true" bold="false" italic="false" color="Blue" escapecharacter="\">
+ <Begin >"</Begin>
+ <End >"</End>
+ </Span>
+
+ <Span name="MultiLineString" rule="str formatting" stopateol="false" bold="false" italic="false" color="Blue" >
+ <Begin >"""</Begin>
+ <End >"""</End>
+ </Span>
+
+ <Span name="Char" stopateol="true" bold="false" italic="false" color="Blue" escapecharacter="\">
+ <Begin >'</Begin>
+ <End >'</End>
+ </Span>
+
+ <Span name="MultiLineRegEx" stopateol="false" bold="false" italic="false" color="#FF6600">
+ <Begin>@@/</Begin>
+ <End>/</End>
+ </Span>
+
+ <Span name="RegEx" stopateol="true" bold="false" italic="false" color="#FF6600">
+ <Begin>/@! @@!/@</Begin>
+ <End>/</End>
+ </Span>
+
+ <MarkPrevious bold="false" italic="false" color="MidnightBlue" >(</MarkPrevious>
+
+ <KeyWords name="Punctuation" bold="false" italic="false" color="DarkGreen" >
+ <Key word="?"/>
+ <Key word=","/>
+ <Key word="."/>
+ <Key word=";"/>
+ <Key word="("/>
+ <Key word=")"/>
+ <Key word="["/>
+ <Key word="]"/>
+ <Key word="{"/>
+ <Key word="}"/>
+ <Key word="+"/>
+ <Key word="-"/>
+ <Key word="/"/>
+ <Key word="%"/>
+ <Key word="*"/>
+ <Key word="<"/>
+ <Key word=">"/>
+ <Key word="^"/>
+ <Key word="="/>
+ <Key word="~"/>
+ <Key word="!"/>
+ <Key word="|"/>
+ <Key word="&"/>
+ </KeyWords>
+
+ <KeyWords name="AccessKeywords" bold="true" italic="false" color="Black" >
+ <Key word="self"/>
+ <Key word="super"/>
+ </KeyWords>
+
+ <KeyWords name="OperatorKeywords" bold="true" italic="false" color="DarkCyan" >
+ <Key word="is"/>
+ <Key word="isa"/>
+ <Key word="and"/>
+ <Key word="or"/>
+ <Key word="not"/>
+ </KeyWords>
+
+ <KeyWords name="SelectionStatements" bold="true" italic="false" color="Blue" >
+ <Key word="else"/>
+ <Key word="elif"/>
+ <Key word="if"/>
+ <Key word="match"/>
+ <Key word="case"/>
+ <Key word="unless"/>
+ <Key word="otherwise"/>
+ </KeyWords>
+
+ <KeyWords name="IterationStatements" bold="true" italic="false" color="Blue" >
+ <Key word="for"/>
+ <Key word="in"/>
+ <Key word="while"/>
+ </KeyWords>
+
+ <KeyWords name="JumpStatements" bold="false" italic="false" color="Navy" >
+ <Key word="break"/>
+ <Key word="continue"/>
+ <Key word="return"/>
+ <Key word="yield"/>
+ <Key word="goto" />
+ </KeyWords>
+
+ <KeyWords name="ExceptionHandlingStatements" bold="true" italic="false" color="Teal" >
+ <Key word="try"/>
+ <Key word="raise"/>
+ <Key word="ensure"/>
+ <Key word="except"/>
+ <Key word="retry"/>
+ <Key word="success"/>
+ </KeyWords>
+
+ <KeyWords name="CheckedUncheckedStatements" bold="true" italic="false" color="DarkGray" >
+ <Key word="checked"/>
+ <Key word="unchecked"/>
+ </KeyWords>
+
+ <KeyWords name="UnsafeFixedStatements" bold="false" italic="false" color="Olive" >
+ <Key word="fixed"/>
+ <Key word="unsafe"/>
+ </KeyWords>
+
+ <KeyWords name="ValueTypes" bold="true" italic="false" color="Purple" >
+ <Key word="bool"/>
+ <Key word="double"/>
+ <Key word="single"/>
+ <Key word="byte"/>
+ <Key word="sbyte"/>
+ <Key word="short"/>
+ <Key word="ushort"/>
+ <Key word="int"/>
+ <Key word="uint"/>
+ <Key word="long"/>
+ <Key word="ulong"/>
+ <Key word="date"/>
+ <Key word="timespan" />
+ <Key word="decimal" />
+ <Key word="char" />
+ </KeyWords>
+
+ <KeyWords name="ReferenceTypes" bold="true" italic="false" color="Purple" >
+ <Key word="object"/>
+ <Key word="duck"/>
+ <Key word="string"/>
+ <Key word="regex"/>
+ </KeyWords>
+
+ <KeyWords name="Void" bold="false" italic="false" color="Red" >
+ <Key word="void"/>
+ </KeyWords>
+
+ <KeyWords name="ConversionKeyWords" bold="true" italic="false" color="Blue" >
+ <Key word="cast"/>
+ <Key word="as"/>
+ </KeyWords>
+
+ <KeyWords name="Modifiers" bold="false" italic="false" color="Brown" >
+ <Key word="override"/>
+ <Key word="static"/>
+ <Key word="virtual"/>
+ <Key word="abstract"/>
+ <Key word="final"/>
+ <Key word="transient"/>
+ <Key word="partial"/>
+ </KeyWords>
+
+ <KeyWords name="AccessModifiers" bold="true" italic="false" color="Blue" >
+ <Key word="public"/>
+ <Key word="protected"/>
+ <Key word="private"/>
+ <Key word="internal"/>
+ </KeyWords>
+
+ <KeyWords name="NameSpaces" bold="true" italic="false" color="Green" >
+ <Key word="namespace"/>
+ <Key word="import"/>
+ <Key word="from"/>
+ </KeyWords>
+
+ <KeyWords name="GetSet" bold="false" italic="false" color="SaddleBrown" >
+ <Key word="get"/>
+ <Key word="set"/>
+ </KeyWords>
+
+ <KeyWords name="Literals" bold="true" italic="false" color="Black" >
+ <Key word="null"/>
+ <Key word="value"/>
+ <Key word="true"/>
+ <Key word="false"/>
+ <Key word="ast" />
+ </KeyWords>
+
+ <KeyWords name="DefaultMacros" bold="false" italic="false" color="Maroon" >
+ <Key word="using"/>
+ <Key word="unchecked"/>
+ <Key word="checked"/>
+ <Key word="lock"/>
+ <Key word="getter"/>
+ <Key word="required"/>
+ <Key word="rawArrayIndexing"/>
+ <Key word="normalArrayIndexing"/>
+ <Key word="yieldAll" />
+ </KeyWords>
+
+ <KeyWords name="Builtins" bold="false" italic="false" color="Purple" >
+ <Key word="assert"/>
+ <Key word="array"/>
+ <Key word="matrix" />
+ <Key word="print"/>
+ <Key word="gets"/>
+ <Key word="prompt"/>
+ <Key word="enumerate"/>
+ <Key word="zip"/>
+ <Key word="filter"/>
+ <Key word="map"/>
+ <Key word="cat"/>
+ <Key word="__eval__" />
+ <Key word="__switch__" />
+ </KeyWords>
+
+ <KeyWords name="Methods" bold="true" italic="false" color="Blue" >
+ <Key word="constructor"/>
+ <Key word="destructor"/>
+ <Key word="def"/>
+ <Key word="include"/>
+ <Key word="event" />
+ <Key word="ref"/>
+ </KeyWords>
+
+ <KeyWords name="Pass" bold="false" italic="false" color="Gray" >
+ <Key word="pass"/>
+ </KeyWords>
+
+ <KeyWords name="TypesDef" bold="true" italic="false" color="Blue" >
+ <Key word="enum"/>
+ <Key word="class"/>
+ <Key word="struct" />
+ <Key word="interface"/>
+ <Key word="mixin"/>
+ <Key word="callable"/>
+ <Key word="do" />
+ <Key word="of" />
+ </KeyWords>
+
+ </RuleSet>
+
+ <RuleSet ignorecase="false" name="comments set" >
+ <Delimiters>&<>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name="BlockComment" rule="comment set 2" stopateol="false" bold="false" italic="false" color="#339966" >
+ <Begin >/*</Begin>
+ <End >*/</End>
+ </Span>
+
+ </RuleSet>
+
+ <RuleSet ignorecase="false" name="comment set 2" >
+ <Delimiters>&<>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name="BlockComment" rule="comments set" stopateol="false" bold="false" italic="false" color="Teal" >
+ <Begin >/*</Begin>
+ <End >*/</End>
+ </Span>
+
+ </RuleSet>
+
+ <RuleSet ignorecase="false" name="str formatting" >
+ <Delimiters>&<>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name="Formatting" stopateol="false" bold="false" italic="false" color="#993366" >
+ <Begin >${</Begin>
+ <End >}</End>
+ </Span>
+
+ </RuleSet>
+
+ </RuleSets>
+
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CPP-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CPP-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CPP-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,206 @@
+<?xml version="1.0"?>
+<!-- syntaxdefinition for C/C++ 2001 by Andrea Paatz and Mike Krueger -->
+
+<SyntaxDefinition name = "C++.NET" extensions = ".c;.h;.cc;.C;.cpp;.hpp">
+
+ <Properties>
+ <Property name="LineComment" value="//"/>
+ </Properties>
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>~!%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name = "PreprocessorDirectives" bold="false" italic="false" color="Green" stopateol = "true">
+ <Begin>#</Begin>
+ </Span>
+
+ <Span name = "LineComment" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>//</Begin>
+ </Span>
+
+ <Span name = "BlockComment" bold = "false" italic = "false" color = "Green" stopateol = "false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+ <Span name = "String" bold = "false" italic = "false" color = "Magenta" stopateol = "true" escapecharacter="\">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "Char" bold = "false" italic = "false" color = "Magenta" stopateol = "true" escapecharacter="\">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <MarkPrevious bold = "true" italic = "false" color = "MidnightBlue">(</MarkPrevious>
+
+ <KeyWords name = "Punctuation" bold = "false" italic = "false" color = "DarkGreen">
+ <Key word = "?" />
+ <Key word = "," />
+ <Key word = "." />
+ <Key word = ";" />
+ <Key word = "(" />
+ <Key word = ")" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "%" />
+ <Key word = "*" />
+ <Key word = "<" />
+ <Key word = ">" />
+ <Key word = "^" />
+ <Key word = "=" />
+ <Key word = "~" />
+ <Key word = "!" />
+ <Key word = "|" />
+ <Key word = "&" />
+ </KeyWords>
+
+ <KeyWords name = "ManagedKeyWords" bold="true" italic="false" color="Black">
+ <Key word = "__abstract" />
+ <Key word = "__box" />
+ <Key word = "__delegate" />
+ <Key word = "__gc" />
+ <Key word = "__identifier" />
+ <Key word = "__nogc" />
+ <Key word = "__pin" />
+ <Key word = "__property" />
+ <Key word = "__sealed" />
+ <Key word = "__try_cast" />
+ <Key word = "__typeof" />
+ <Key word = "__value" />
+
+
+ <Key word = "__event" />
+ <Key word = "__hook" />
+ <Key word = "__raise" />
+ <Key word = "__unhook" />
+
+ <Key word = "__interface" />
+ </KeyWords>
+
+ <KeyWords name = "AccessKeywords" bold="true" italic="false" color="Black">
+ <Key word = "this" />
+ </KeyWords>
+
+ <KeyWords name = "OperatorKeywords" bold="true" italic="false" color="DarkCyan">
+ <Key word = "and" />
+ <Key word = "and_eq" />
+
+ <Key word = "bitand" />
+ <Key word = "bitor" />
+
+ <Key word = "new" />
+ <Key word = "not" />
+ <Key word = "not_eq" />
+ <Key word = "or" />
+ <Key word = "or_eq" />
+ <Key word = "xor" />
+ <Key word = "xor_eq" />
+ </KeyWords>
+
+ <KeyWords name = "NameSpaces" bold="true" italic="false" color="Green">
+ <Key word = "using" />
+ <Key word = "namespace" />
+ </KeyWords>
+
+ <KeyWords name = "Friends" bold="false" italic="false" color="Brown">
+ <Key word = "friend" />
+ </KeyWords>
+
+ <KeyWords name = "AccessModifiers" bold="true" italic="false" color="Blue">
+ <Key word = "private" />
+ <Key word = "protected" />
+ <Key word = "public" />
+
+ <Key word = "const" />
+ <Key word = "volatile" />
+
+ <Key word = "static" />
+ </KeyWords>
+
+ <KeyWords name = "Types" bold="false" italic="false" color="Red">
+ <Key word = "bool" />
+ <Key word = "char" />
+ <Key word = "unsigned" />
+ <Key word = "union" />
+ <Key word = "virtual" />
+ <Key word = "double" />
+ <Key word = "float" />
+ <Key word = "short" />
+ <Key word = "signed" />
+ <Key word = "void" />
+ <Key word = "class" />
+
+ <Key word = "enum" />
+ <Key word = "struct" />
+ </KeyWords>
+
+ <KeyWords name = "Literals" bold="true" italic="false" color="Black">
+ <Key word = "false" />
+ <Key word = "true" />
+ </KeyWords>
+
+ <KeyWords name = "IterationStatements" bold="true" italic="false" color="Blue">
+ <Key word = "do" />
+ <Key word = "for" />
+ <Key word = "while" />
+ </KeyWords>
+
+ <KeyWords name = "JumpStatements" bold="false" italic="false" color="Navy">
+ <Key word = "break" />
+ <Key word = "continue" />
+ <Key word = "goto" />
+ <Key word = "return" />
+ </KeyWords>
+
+ <KeyWords name = "ExceptionHandlingStatements" bold="true" italic="false" color="Teal">
+ <Key word = "catch" />
+ <Key word = "throw" />
+ <Key word = "try" />
+ </KeyWords>
+
+ <KeyWords name = "SelectionStatements" bold="true" italic="false" color="Blue">
+ <Key word = "case" />
+ <Key word = "else" />
+ <Key word = "if" />
+ <Key word = "switch" />
+ <Key word = "default" />
+ </KeyWords>
+
+ <KeyWords name = "KEYWORD1" bold="true" italic="false" color="Blue">
+ <Key word = "asm" />
+ <Key word = "auto" />
+ <Key word = "compl" />
+ <Key word = "mutable" />
+ <Key word = "const_cast" />
+ <Key word = "delete" />
+ <Key word = "dynamic_cast" />
+ <Key word = "explicit" />
+ <Key word = "export" />
+ <Key word = "extern" />
+ <Key word = "inline" />
+ <Key word = "int" />
+ <Key word = "long" />
+ <Key word = "operator" />
+ <Key word = "register" />
+ <Key word = "reinterpret_cast" />
+ <Key word = "sizeof" />
+ <Key word = "static_cast" />
+ <Key word = "template" />
+ <Key word = "typedef" />
+ <Key word = "typeid" />
+ <Key word = "typename" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CSharp-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CSharp-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/CSharp-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,339 @@
+<?xml version="1.0"?>
+<!-- syntaxdefinition for C# 2000 by Mike Krueger -->
+
+<SyntaxDefinition name = "C#" extensions = ".cs">
+
+ <Environment>
+ <Custom name="TypeReference" bold="false" italic="false" color="#04ABAB" />
+ <Custom name="UnknownEntity" bold="false" italic="false" color="#AB0404" />
+ </Environment>
+
+ <Properties>
+ <Property name="LineComment" value="//"/>
+ </Properties>
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase="false">
+ <Delimiters>&<>~!%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name = "PreprocessorDirectives" rule = "PreprocessorSet" bold="false" italic="false" color="Green" stopateol = "true">
+ <Begin>#</Begin>
+ </Span>
+
+ <Span name = "DocLineComment" rule = "DocCommentSet" bold = "false" italic = "false" color = "Green" stopateol = "true" noescapesequences="true">
+ <Begin bold = "false" italic = "false" color = "Gray">///@!/@</Begin>
+ </Span>
+
+ <Span name = "LineComment" rule = "CommentMarkerSet" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>//@!/@</Begin>
+ </Span>
+ <Span name = "LineComment2" rule = "CommentMarkerSet" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>////</Begin>
+ </Span>
+
+ <Span name = "BlockComment" rule = "CommentMarkerSet" bold = "false" italic = "false" color = "Green" stopateol = "false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+ <Span name = "String" bold = "false" italic = "false" color = "Blue" stopateol = "true" escapecharacter="\">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "MultiLineString" bold = "false" italic = "false" color = "Blue" stopateol = "false" escapecharacter='"'>
+ <Begin>@@"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "Char" bold = "false" italic = "false" color = "Magenta" stopateol = "true" escapecharacter="\">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <MarkPrevious bold = "true" italic = "false" color = "MidnightBlue">(</MarkPrevious>
+
+ <KeyWords name = "Punctuation" bold = "false" italic = "false" color = "DarkGreen">
+ <Key word = "?" />
+ <Key word = "," />
+ <Key word = "." />
+ <Key word = ";" />
+ <Key word = "(" />
+ <Key word = ")" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "%" />
+ <Key word = "*" />
+ <Key word = "<" />
+ <Key word = ">" />
+ <Key word = "^" />
+ <Key word = "=" />
+ <Key word = "~" />
+ <Key word = "!" />
+ <Key word = "|" />
+ <Key word = "&" />
+ </KeyWords>
+
+ <KeyWords name = "AccessKeywords" bold="true" italic="false" color="Black">
+ <Key word = "this" />
+ <Key word = "base" />
+ </KeyWords>
+
+ <KeyWords name = "OperatorKeywords" bold="true" italic="false" color="DarkCyan">
+ <Key word = "as" />
+ <Key word = "is" />
+ <Key word = "new" />
+ <Key word = "sizeof" />
+ <Key word = "typeof" />
+ <Key word = "true" />
+ <Key word = "false" />
+ <Key word = "stackalloc" />
+ </KeyWords>
+
+
+ <KeyWords name = "SelectionStatements" bold="true" italic="false" color="Blue">
+ <Key word = "else" />
+ <Key word = "if" />
+ <Key word = "switch" />
+ <Key word = "case" />
+ <Key word = "default" />
+ </KeyWords>
+
+ <KeyWords name = "IterationStatements" bold="true" italic="false" color="Blue">
+ <Key word = "do" />
+ <Key word = "for" />
+ <Key word = "foreach" />
+ <Key word = "in" />
+ <Key word = "while" />
+ </KeyWords>
+
+ <KeyWords name = "JumpStatements" bold="false" italic="false" color="Navy">
+ <Key word = "break" />
+ <Key word = "continue" />
+ <Key word = "goto" />
+ <Key word = "return" />
+ </KeyWords>
+
+ <KeyWords name = "ContextKeywords" bold="false" italic="false" color="Navy">
+ <Key word = "yield" />
+ <Key word = "partial" />
+ <Key word = "global" />
+ <Key word = "where" />
+ <Key word = "select" />
+ <Key word = "group" />
+ <Key word = "by" />
+ <Key word = "into" />
+ <Key word = "from" />
+ <Key word = "ascending" />
+ <Key word = "descending" />
+ <Key word = "orderby" />
+ <Key word = "let" />
+ <Key word = "join" />
+ <Key word = "on" />
+ <Key word = "equals" />
+ <Key word = "var" />
+ </KeyWords>
+
+ <KeyWords name = "ExceptionHandlingStatements" bold="true" italic="false" color="Teal">
+ <Key word = "try" />
+ <Key word = "throw" />
+ <Key word = "catch" />
+ <Key word = "finally" />
+ </KeyWords>
+
+ <KeyWords name = "CheckedUncheckedStatements" bold="true" italic="false" color="DarkGray">
+ <Key word = "checked" />
+ <Key word = "unchecked" />
+ </KeyWords>
+
+ <KeyWords name = "UnsafeFixedStatements" bold="false" italic="false" color="Olive">
+ <Key word = "fixed" />
+ <Key word = "unsafe" />
+ </KeyWords>
+
+ <KeyWords name = "ValueTypes" bold="true" italic="false" color="Red">
+ <Key word = "bool" />
+ <Key word = "byte" />
+ <Key word = "char" />
+ <Key word = "decimal" />
+ <Key word = "double" />
+ <Key word = "enum" />
+ <Key word = "float" />
+ <Key word = "int" />
+ <Key word = "long" />
+ <Key word = "sbyte" />
+ <Key word = "short" />
+ <Key word = "struct" />
+ <Key word = "uint" />
+ <Key word = "ushort" />
+ <Key word = "ulong" />
+ </KeyWords>
+
+ <KeyWords name = "ReferenceTypes" bold="false" italic="false" color="Red">
+ <Key word = "class" />
+ <Key word = "interface" />
+ <Key word = "delegate" />
+ <Key word = "object" />
+ <Key word = "string" />
+ </KeyWords>
+
+ <KeyWords name = "Void" bold="false" italic="false" color="Red">
+ <Key word = "void" />
+ </KeyWords>
+
+ <KeyWords name = "ConversionKeyWords" bold="true" italic="false" color="Pink">
+ <Key word = "explicit" />
+ <Key word = "implicit" />
+ <Key word = "operator" />
+ </KeyWords>
+
+ <KeyWords name = "MethodParameters" bold="true" italic="false" color="DeepPink">
+ <Key word = "params" />
+ <Key word = "ref" />
+ <Key word = "out" />
+ </KeyWords>
+
+ <KeyWords name = "Modifiers" bold="false" italic="false" color="Brown">
+ <Key word = "abstract" />
+ <Key word = "const" />
+ <Key word = "event" />
+ <Key word = "extern" />
+ <Key word = "override" />
+ <Key word = "readonly" />
+ <Key word = "sealed" />
+ <Key word = "static" />
+ <Key word = "virtual" />
+ <Key word = "volatile" />
+ </KeyWords>
+
+ <KeyWords name = "AccessModifiers" bold="true" italic="false" color="Blue">
+ <Key word = "public" />
+ <Key word = "protected" />
+ <Key word = "private" />
+ <Key word = "internal" />
+ </KeyWords>
+
+ <KeyWords name = "NameSpaces" bold="true" italic="false" color="Green">
+ <Key word = "namespace" />
+ <Key word = "using" />
+ </KeyWords>
+
+ <KeyWords name = "LockKeyWord" bold="false" italic="false" color="DarkViolet">
+ <Key word = "lock" />
+ </KeyWords>
+
+ <KeyWords name = "GetSet" bold="false" italic="false" color="SaddleBrown">
+ <Key word = "get" />
+ <Key word = "set" />
+ <Key word = "add" />
+ <Key word = "remove" />
+ </KeyWords>
+
+ <KeyWords name = "Literals" bold="true" italic="false" color="Black">
+ <Key word = "null" />
+ <Key word = "value" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "CommentMarkerSet" ignorecase = "false">
+ <Delimiters><>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+ <KeyWords name = "ErrorWords" bold="true" italic="false" color="Red">
+ <Key word = "TODO" />
+ <Key word = "FIXME" />
+ </KeyWords>
+ <KeyWords name = "WarningWords" bold="true" italic="false" color="#EEE0E000">
+ <Key word = "HACK" />
+ <Key word = "UNDONE" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "DocCommentSet" ignorecase = "false">
+ <Delimiters><>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name = "XmlTag" rule = "XmlDocSet" bold = "false" italic = "false" color = "Gray" stopateol = "true">
+ <Begin><</Begin>
+ <End>></End>
+ </Span>
+
+ <KeyWords name = "ErrorWords" bold="true" italic="false" color="Red">
+ <Key word = "TODO" />
+ <Key word = "FIXME" />
+ </KeyWords>
+
+ <KeyWords name = "WarningWords" bold="true" italic="false" color="#EEE0E000">
+ <Key word = "HACK" />
+ <Key word = "UNDONE" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "PreprocessorSet" ignorecase="false">
+ <Delimiters>&<>~!%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <KeyWords name = "PreprocessorDirectives" bold="true" italic="false" color="Green">
+ <Key word = "if" />
+ <Key word = "else" />
+ <Key word = "elif" />
+ <Key word = "endif" />
+ <Key word = "define" />
+ <Key word = "undef" />
+ <Key word = "warning" />
+ <Key word = "error" />
+ <Key word = "line" />
+ <Key word = "region" />
+ <Key word = "endregion" />
+ <Key word = "pragma" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "XmlDocSet" ignorecase = "false">
+ <Delimiters><>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name = "String" bold = "true" italic = "false" color = "Silver" stopateol = "true">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+
+ <KeyWords name = "Punctuation" bold = "true" italic = "false" color = "Gray">
+ <Key word = "/" />
+ <Key word = "|" />
+ <Key word = "=" />
+ </KeyWords>
+
+ <KeyWords name = "SpecialComment" bold="true" italic="false" color="Gray">
+ <Key word = "c" />
+ <Key word = "code" />
+ <Key word = "example" />
+ <Key word = "exception" />
+ <Key word = "list" />
+ <Key word = "para" />
+ <Key word = "param" />
+ <Key word = "paramref" />
+ <Key word = "permission" />
+ <Key word = "remarks" />
+ <Key word = "returns" />
+ <Key word = "see" />
+ <Key word = "seealso" />
+ <Key word = "summary" />
+ <Key word = "value" />
+ <Key word = "inheritdoc" />
+
+ <Key word = "type" />
+ <Key word = "name" />
+ <Key word = "cref" />
+ <Key word = "item" />
+ <Key word = "term" />
+ <Key word = "description" />
+ <Key word = "listheader" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Coco-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Coco-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Coco-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,97 @@
+<?xml version="1.0" ?>
+<!-- syntaxdefinition for Coco/R 2003 by Mike Krueger -->
+<SyntaxDefinition name="Coco" extensions=".atg">
+
+ <Digits name="Digits" bold="false" italic="false" color="DarkBlue" />
+
+ <RuleSets>
+ <RuleSet ignorecase="false">
+ <Delimiters>&<>~!@%^*()-+=|\#/{}[]:;"' , .?</Delimiters>
+
+ <Span name = "LINECOMMENT" bold = "false" italic = "true" color = "Gray" stopateol = "true">
+ <Begin>//</Begin>
+ </Span>
+
+ <Span name = "BLOCKCOMMENT" bold = "false" italic = "true" color = "Gray" stopateol = "false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+
+ <Span name="CSharpCode2" rule="CSharp" bold="false" italic="false" color="Black" stopateol="false">
+ <Begin bold = "true" color = "Blue">COMPILER</Begin>
+ <End bold = "true" color = "Blue">TOKENNAMES</End>
+ </Span>
+
+ <Span name = "STRING" bold = "false" italic = "false" color = "DarkGreen" stopateol = "true">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "CHAR" bold = "false" italic = "false" color = "DarkGreen" stopateol = "true">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <Span name = "paramlist" rule="ParamList" bold = "false" italic = "false" color = "Black" stopateol = "true">
+ <Begin bold="true" color = "Black" ><</Begin>
+ <End bold="true" color = "Black" >></End>
+ </Span>
+
+ <Span name="CSharpCode" rule="CSharp" bold="false" italic="false" color="DarkSlateGray" stopateol="false">
+ <Begin bold = "true" italic="true" color = "Green">(.</Begin>
+ <End bold = "true" italic="true" color = "Green">.)</End>
+ </Span>
+
+
+ <KeyWords name = "Punctuation" bold = "true" italic = "false" color = "Black">
+ <Key word = "{"/>
+ <Key word = "}"/>
+ <Key word = "("/>
+ <Key word = ")"/>
+ <Key word = "["/>
+ <Key word = "]"/>
+ <Key word = "|"/>
+ <Key word = "+"/>
+ <Key word = "-"/>
+ <Key word = "="/>
+ <Key word = "."/>
+ </KeyWords>
+
+ <KeyWords name = "KeyWords" bold = "true" italic = "false" color = "Blue">
+ <Key word = "ANY"/>
+ <Key word = "CHARACTERS"/>
+ <Key word = "COMMENTS"/>
+ <Key word = "COMPILER"/>
+ <Key word = "CONTEXT"/>
+ <Key word = "END"/>
+ <Key word = "FROM"/>
+ <Key word = "IF"/>
+ <Key word = "IGNORE"/>
+ <Key word = "NAMESPACE"/>
+ <Key word = "NESTED"/>
+ <Key word = "PRAGMAS"/>
+ <Key word = "PRODUCTIONS"/>
+ <Key word = "SYNC"/>
+ <Key word = "TO"/>
+ <Key word = "TOKENS"/>
+ <Key word = "TOKENNAMES"/>
+ <Key word = "WEAK"/>
+ <Key word = "using"/>
+ </KeyWords>
+
+ </RuleSet>
+
+ <RuleSet name="CSharp" reference = "C#" ignorecase="false">
+ </RuleSet>
+
+ <RuleSet name="ParamList" reference = "C#" ignorecase="false">
+ </RuleSet>
+
+ <RuleSet name="RuleDefinition" ignorecase="false">
+
+ </RuleSet>
+
+ </RuleSets>
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/HTML-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/HTML-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/HTML-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,385 @@
+<?xml version="1.0"?>
+
+<!-- syntaxdefinition for HTML 2000 by Mike Krueger -->
+
+<SyntaxDefinition name = "HTML" extensions = ".htm;.html">
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "true">
+ <!-- It is not necessary to define span-delimiting characters as delimiters -->
+ <Delimiters></Delimiters>
+
+ <Span name="Comment" bold="false" italic="false" color="DarkSlateGray" stopateol="false">
+ <Begin><!--</Begin>
+ <End>--></End>
+ </Span>
+ <Span name="ScriptTag" rule="JavaScriptSet" bold="false" italic="false" color="SpringGreen" stopateol="false">
+ <Begin><script></Begin>
+ <End></script></End>
+ </Span>
+ <Span name="JavaScriptTag" rule="JavaScriptSet" bold="false" italic="false" color="SpringGreen" stopateol="false">
+ <Begin><script lang="JavaScript"></Begin>
+ <End></script></End>
+ </Span>
+ <Span name="JScriptTag" bold="false" italic="false" color="SpringGreen" stopateol="false">
+ <Begin><script lang="JScript"></Begin>
+ <End></script></End>
+ </Span>
+ <Span name="VBScriptTag" bold="false" italic="false" color="SpringGreen" stopateol="false">
+ <Begin><script lang="VBScript"></Begin>
+ <End></script></End>
+ </Span>
+ <Span name="UnknownScriptTag" bold="false" italic="false" color="SpringGreen" stopateol="false">
+ <Begin><script at C</Begin>
+ <End></script></End>
+ </Span>
+ <Span name="HtmlTag" rule="HtmlTagSet" bold="false" italic="false" color="DarkMagenta" stopateol="false">
+ <Begin><</Begin>
+ <End>></End>
+ </Span>
+
+ <Span name="EntityReference" rule="EntityReferenceSet" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>&</Begin>
+ <End>;</End>
+ </Span>
+
+ </RuleSet>
+
+ <RuleSet name="JavaScriptSet" reference="JavaScript" />
+
+ <RuleSet name="EntityReferenceSet" ignorecase="false">
+ <KeyWords name = "Entities" bold="false" italic="false" color="Green">
+ <Key word = "aacute" />
+ <Key word = "agrave" />
+ <Key word = "acirc" />
+ <Key word = "amp" />
+ <Key word = "atilde" />
+ <Key word = "aring" />
+ <Key word = "auml" />
+ <Key word = "aelig" />
+ <Key word = "ccedil" />
+ <Key word = "copy" />
+ <Key word = "eacute" />
+ <Key word = "egrave" />
+ <Key word = "ecirc" />
+ <Key word = "euml" />
+ <Key word = "iacute" />
+ <Key word = "igrave" />
+ <Key word = "icirc" />
+ <Key word = "iuml" />
+ <Key word = "eth" />
+ <Key word = "gt" />
+ <Key word = "lt" />
+ <Key word = "nbsp" />
+ <Key word = "ntilde" />
+ <Key word = "oacute" />
+ <Key word = "ograve" />
+ <Key word = "ocirc" />
+ <Key word = "otilde" />
+ <Key word = "ouml" />
+ <Key word = "oslash" />
+ <Key word = "quot" />
+ <Key word = "reg" />
+ <Key word = "szlig" />
+ <Key word = "uacute" />
+ <Key word = "ugrave" />
+ <Key word = "ucirc" />
+ <Key word = "uuml" />
+ <Key word = "yacute" />
+ <Key word = "thorn" />
+ <Key word = "trade" />
+ <Key word = "yuml" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name="HtmlTagSet" ignorecase="false">
+ <Delimiters>/=</Delimiters>
+
+ <Span name="String" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name="Char" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <MarkPrevious bold="false" italic="false" color="Red">=</MarkPrevious>
+
+ <KeyWords name="Slash" bold="false" italic="false" color="DarkMagenta">
+ <Key word="/" />
+ </KeyWords>
+
+ <KeyWords name="Assignment" bold="false" italic="false" color="Blue">
+ <Key word="=" />
+ </KeyWords>
+
+ <KeyWords name = "Tags" bold="false" italic="false" color="DarkMagenta">
+ <Key word = "!DOCTYPE" />
+ <Key word = "A" />
+ <Key word = "ABBR" />
+ <Key word = "ACRONYM" />
+ <Key word = "ADDRESS" />
+ <Key word = "APPLET" />
+ <Key word = "AREA" />
+ <Key word = "B" />
+ <Key word = "BASE" />
+ <Key word = "BASEFONT" />
+ <Key word = "BGSOUND" />
+ <Key word = "BDO" />
+ <Key word = "BIG" />
+ <Key word = "BLINK" />
+ <Key word = "BLOCKQUOTE" />
+ <Key word = "BODY" />
+ <Key word = "BR" />
+ <Key word = "BUTTON" />
+ <Key word = "CAPTION" />
+ <Key word = "CENTER" />
+ <Key word = "CITE" />
+ <Key word = "CODE" />
+ <Key word = "COL" />
+ <Key word = "COLGROUP" />
+ <Key word = "COMMENT" />
+ <Key word = "DD" />
+ <Key word = "DEL" />
+ <Key word = "DFN" />
+ <Key word = "DIR" />
+ <Key word = "DIV" />
+ <Key word = "DL" />
+ <Key word = "DT" />
+ <Key word = "EM" />
+ <Key word = "EMBED" />
+ <Key word = "FIELDSET" />
+ <Key word = "FONT" />
+ <Key word = "FORM" />
+ <Key word = "FRAME" />
+ <Key word = "FRAMESET" />
+ <Key word = "H" />
+ <Key word = "H1" />
+ <Key word = "H2" />
+ <Key word = "H3" />
+ <Key word = "H4" />
+ <Key word = "H5" />
+ <Key word = "H6" />
+ <Key word = "HEAD" />
+ <Key word = "HR" />
+ <Key word = "HTA:APPLICATION" />
+ <Key word = "HTML" />
+ <Key word = "I" />
+ <Key word = "IFRAME" />
+ <Key word = "IMG" />
+ <Key word = "INPUT" />
+ <Key word = "INS" />
+ <Key word = "ISINDEX" />
+ <Key word = "KBD" />
+ <Key word = "LABEL" />
+ <Key word = "LEGEnd" />
+ <Key word = "LI" />
+ <Key word = "LINK" />
+ <Key word = "LISTING" />
+ <Key word = "MAP" />
+ <Key word = "MARQUEE" />
+ <Key word = "MENU" />
+ <Key word = "META" />
+ <Key word = "MULTICOL" />
+ <Key word = "NEXTID" />
+ <Key word = "NOBR" />
+ <Key word = "NOFRAMES" />
+ <Key word = "NOSCRIPT" />
+ <Key word = "OBJECT" />
+ <Key word = "OL" />
+ <Key word = "OPTGROUP" />
+ <Key word = "OPTION" />
+ <Key word = "P" />
+ <Key word = "PARAM" />
+ <Key word = "PLAINTEXT" />
+ <Key word = "PRE" />
+ <Key word = "Q" />
+ <Key word = "S" />
+ <Key word = "SAMP" />
+ <Key word = "SCRIPT" />
+ <Key word = "SELECT" />
+ <Key word = "SERVER" />
+ <Key word = "SMALL" />
+ <Key word = "SOUND" />
+ <Key word = "SPACER" />
+ <Key word = "Span" />
+ <Key word = "STRONG" />
+ <Key word = "STYLE" />
+ <Key word = "SUB" />
+ <Key word = "SUP" />
+ <Key word = "TABLE" />
+ <Key word = "TBODY" />
+ <Key word = "TD" />
+ <Key word = "TEXTAREA" />
+ <Key word = "TEXTFLOW" />
+ <Key word = "TFOOT" />
+ <Key word = "TH" />
+ <Key word = "THEAD" />
+ <Key word = "TITLE" />
+ <Key word = "TR" />
+ <Key word = "TT" />
+ <Key word = "U" />
+ <Key word = "VAR" />
+ <Key word = "WBR" />
+ <Key word = "XMP" />
+ </KeyWords>
+
+ <KeyWords name = "Attributes" bold="false" italic="false" color="Red">
+ <Key word = "abbr" />
+ <Key word = "accept-charset" />
+ <Key word = "accept" />
+ <Key word = "accesskey" />
+ <Key word = "action" />
+ <Key word = "align" />
+ <Key word = "alink" />
+ <Key word = "alt" />
+ <Key word = "applicationname" />
+ <Key word = "archive" />
+ <Key word = "axis" />
+ <Key word = "background" />
+ <Key word = "behavior" />
+ <Key word = "bgcolor" />
+ <Key word = "bgproperties" />
+ <Key word = "border" />
+ <Key word = "bordercolor" />
+ <Key word = "bordercolordark" />
+ <Key word = "bordercolorligh" />
+ <Key word = "borderstyle" />
+ <Key word = "caption" />
+ <Key word = "cellpadding" />
+ <Key word = "cellspacing" />
+ <Key word = "char" />
+ <Key word = "charoff" />
+ <Key word = "charset" />
+ <Key word = "checked" />
+ <Key word = "cite" />
+ <Key word = "class" />
+ <Key word = "classid" />
+ <Key word = "clear" />
+ <Key word = "code" />
+ <Key word = "codetype" />
+ <Key word = "color" />
+ <Key word = "cols" />
+ <Key word = "colspan" />
+ <Key word = "compact" />
+ <Key word = "content" />
+ <Key word = "coords" />
+ <Key word = "data" />
+ <Key word = "datetime" />
+ <Key word = "declare" />
+ <Key word = "defer" />
+ <Key word = "dir" />
+ <Key word = "direction" />
+ <Key word = "disabled" />
+ <Key word = "dynsrc" />
+ <Key word = "enctype" />
+ <Key word = "face" />
+ <Key word = "for" />
+ <Key word = "frame" />
+ <Key word = "frameborder" />
+ <Key word = "framespacing" />
+ <Key word = "gutter" />
+ <Key word = "headers" />
+ <Key word = "height" />
+ <Key word = "href" />
+ <Key word = "hreflang" />
+ <Key word = "hspace" />
+ <Key word = "http-equiv" />
+ <Key word = "icon" />
+ <Key word = "id" />
+ <Key word = "ismap" />
+ <Key word = "label" />
+ <Key word = "language" />
+ <Key word = "leftmargin" />
+ <Key word = "link" />
+ <Key word = "longdesc" />
+ <Key word = "loop" />
+ <Key word = "lowsrc" />
+ <Key word = "marginheight" />
+ <Key word = "marginwidth" />
+ <Key word = "maximizebutton" />
+ <Key word = "maxlength" />
+ <Key word = "media" />
+ <Key word = "method" />
+ <Key word = "methods" />
+ <Key word = "minimizebutton" />
+ <Key word = "multiple" />
+ <Key word = "name" />
+ <Key word = "nohref" />
+ <Key word = "noresize" />
+ <Key word = "noshade" />
+ <Key word = "nowrap" />
+ <Key word = "object" />
+ <Key word = "onabort" />
+ <Key word = "onblur" />
+ <Key word = "onchange" />
+ <Key word = "onclick" />
+ <Key word = "ondblclick" />
+ <Key word = "onerror" />
+ <Key word = "onfocus" />
+ <Key word = "onkeydown" />
+ <Key word = "onkeypress" />
+ <Key word = "onkeyup" />
+ <Key word = "onload" />
+ <Key word = "onmousedown" />
+ <Key word = "onmousemove" />
+ <Key word = "onmouseout" />
+ <Key word = "onmouseover" />
+ <Key word = "onmouseup" />
+ <Key word = "onreset" />
+ <Key word = "onselect" />
+ <Key word = "onsubmit" />
+ <Key word = "onunload" />
+ <Key word = "profile" />
+ <Key word = "prompt" />
+ <Key word = "readonly" />
+ <Key word = "rel" />
+ <Key word = "rev" />
+ <Key word = "rows" />
+ <Key word = "rowspan" />
+ <Key word = "rules" />
+ <Key word = "runat" />
+ <Key word = "scheme" />
+ <Key word = "scope" />
+ <Key word = "scrollamount" />
+ <Key word = "scrolldelay" />
+ <Key word = "scrolling" />
+ <Key word = "selected" />
+ <Key word = "shape" />
+ <Key word = "showintaskbar" />
+ <Key word = "singleinstance" />
+ <Key word = "size" />
+ <Key word = "span" />
+ <Key word = "src" />
+ <Key word = "standby" />
+ <Key word = "start" />
+ <Key word = "style" />
+ <Key word = "summary" />
+ <Key word = "sysmenu" />
+ <Key word = "tabindex" />
+ <Key word = "target" />
+ <Key word = "text" />
+ <Key word = "title" />
+ <Key word = "topmargin" />
+ <Key word = "type" />
+ <Key word = "urn" />
+ <Key word = "usemap" />
+ <Key word = "valign" />
+ <Key word = "value" />
+ <Key word = "valuetype" />
+ <Key word = "version" />
+ <Key word = "vlink" />
+ <Key word = "vrml" />
+ <Key word = "vspace" />
+ <Key word = "width" />
+ <Key word = "windowstate" />
+ <Key word = "wrap" />
+ </KeyWords>
+ </RuleSet>
+
+ </RuleSets>
+</SyntaxDefinition>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ICSharpCode.TextEditor.snk
===================================================================
(Binary files differ)
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/ICSharpCode.TextEditor.snk
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Java-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Java-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Java-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,180 @@
+<?xml version="1.0"?>
+
+<!-- syntaxdefinition for Java 2001 by Jonathan Pierce & Mike Krueger -->
+
+<SyntaxDefinition name = "Java" extensions = ".java">
+
+ <Properties>
+ <Property name="LineComment" value="//"/>
+ </Properties>
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>~!%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name = "LINECOMMENT" rule = "TestSet" bold = "false" italic = "true" color = "SlateGray" stopateol = "true">
+ <Begin>//</Begin>
+ </Span>
+
+ <Span name = "BLOCKCOMMENT" rule = "TestSet" bold = "false" italic = "true" color = "SlateGray" stopateol = "false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+ <Span name = "STRING" bold = "false" italic = "false" color = "Magenta" stopateol = "true" escapecharacter="\">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "CHAR" bold = "false" italic = "false" color = "Magenta" stopateol = "true" escapecharacter="\">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <MarkPrevious bold = "true" italic = "false" color = "MidnightBlue">(</MarkPrevious>
+
+ <KeyWords name = "Punctuation" bold = "false" italic = "false" color = "DarkGreen">
+ <Key word = "?" />
+ <Key word = "," />
+ <Key word = "." />
+ <Key word = "(" />
+ <Key word = ")" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "%" />
+ <Key word = "*" />
+ <Key word = "<" />
+ <Key word = ">" />
+ <Key word = "^" />
+ <Key word = "!" />
+ <Key word = "|" />
+ </KeyWords>
+
+
+
+ <KeyWords name = "AccessKeywords" bold="true" italic="false" color="Black">
+ <Key word = "this" />
+ <Key word = "super" />
+ </KeyWords>
+
+ <KeyWords name = "OperatorKeywords" bold="true" italic="false" color="DarkCyan">
+ <Key word = "new" />
+ <Key word = "instanceof" />
+ <Key word = "true" />
+ <Key word = "false" />
+ </KeyWords>
+
+ <KeyWords name = "SelectionStatements" bold="true" italic="false" color="Blue">
+ <Key word = "else" />
+ <Key word = "if" />
+ <Key word = "switch" />
+ <Key word = "case" />
+ </KeyWords>
+
+ <KeyWords name = "IterationStatements" bold="true" italic="false" color="Blue">
+ <Key word = "do" />
+ <Key word = "for" />
+ <Key word = "while" />
+ </KeyWords>
+
+ <KeyWords name = "JumpStatements" bold="false" italic="false" color="Navy">
+ <Key word = "break" />
+ <Key word = "continue" />
+ <Key word = "default" />
+ <Key word = "goto" />
+ <Key word = "return" />
+ </KeyWords>
+
+ <KeyWords name = "ExceptionHandlingStatements" bold="true" italic="false" color="Teal">
+ <Key word = "try" />
+ <Key word = "throw" />
+ <Key word = "catch" />
+ <Key word = "finally" />
+ </KeyWords>
+
+
+ <KeyWords name = "ValueTypes" bold="true" italic="false" color="Red">
+ <Key word = "boolean" />
+ <Key word = "double" />
+ <Key word = "int" />
+ <Key word = "short" />
+ <Key word = "long" />
+ <Key word = "float" />
+ <Key word = "byte" />
+ <Key word = "char" />
+ </KeyWords>
+
+ <KeyWords name = "ReferenceTypes" bold="false" italic="false" color="Red">
+ <Key word = "class" />
+ <Key word = "interface" />
+ <Key word = "object" />
+ </KeyWords>
+
+ <KeyWords name = "Void" bold="false" italic="false" color="Red">
+ <Key word = "void" />
+ </KeyWords>
+
+
+ <KeyWords name = "Modifiers" bold="false" italic="false" color="Brown">
+ <Key word = "abstract" />
+ <Key word = "const" />
+ <Key word = "static" />
+ <Key word = "final" />
+ <Key word = "native" />
+ <Key word = "extends" />
+ <Key word = "implements" />
+ <Key word = "volatile" />
+ <Key word = "transient" />
+ <Key word = "throws" />
+ <Key word = "strictfp" />
+ <Key word = "synchronized" />
+ </KeyWords>
+
+ <KeyWords name = "AccessModifiers" bold="true" italic="false" color="Blue">
+ <Key word = "public" />
+ <Key word = "protected" />
+ <Key word = "private" />
+ </KeyWords>
+
+ <KeyWords name = "NameSpaces" bold="true" italic="false" color="Green">
+ <Key word = "package" />
+ <Key word = "import" />
+ </KeyWords>
+
+ <KeyWords name = "Literals" bold="true" italic="false" color="Black">
+ <Key word = "null" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "TestSet" ignorecase = "true">
+ <Delimiters>~!%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+ <KeyWords name = "Todoword" bold="true" italic="true" color="Red">
+ <Key word = "TODO" />
+ </KeyWords>
+
+ <KeyWords name = "JAVADOC comments" bold="true" italic="true" color="DarkGray">
+ <Key word = "@author" />
+ <Key word = "@version" />
+ <Key word = "@param" />
+ <Key word = "@return" />
+ <Key word = "@exception" />
+ <Key word = "@throws" />
+ <Key word = "@see" />
+ <Key word = "@since" />
+ <Key word = "@serial" />
+ <Key word = "@serialField" />
+ <Key word = "@serialData" />
+ <Key word = "@deprecated" />
+ </KeyWords>
+
+ </RuleSet>
+ </RuleSets>
+
+</SyntaxDefinition>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/JavaScript-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/JavaScript-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/JavaScript-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,136 @@
+<?xml version="1.0"?>
+<!-- syntaxdefinition for JavaScript 2.0 by Svante Lidman -->
+
+<SyntaxDefinition name ="JavaScript" extensions = ".js">
+
+ <Properties>
+ <Property name="LineComment" value="//"/>
+ </Properties>
+
+ <Digits name ="Digits" bold ="false" italic ="false" color ="DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>=!><+-/*%&|^~.}{,;][?:</Delimiters>
+
+ <Span name ="LineComment" bold ="false" italic ="false" color ="DarkSlateGray" stopateol ="true">
+ <Begin>//</Begin>
+ </Span>
+
+ <Span name ="BlockComment" bold ="false" italic ="false" color ="DarkSlateGray" stopateol ="false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+ <Span name ="String" bold ="false" italic ="false" color ="Sienna" stopateol ="false" escapecharacter="\">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name = "Character" bold = "false" italic = "false" color = "Sienna" stopateol = "true" escapecharacter="\">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <KeyWords name ="JavaScriptKeyWords" bold="false" italic = "false" color = "Blue">
+ <Key word = "break" />
+ <Key word = "continue" />
+ <Key word = "delete" />
+ <Key word = "else" />
+ <Key word = "for" />
+ <Key word = "function" />
+ <Key word = "if" />
+ <Key word = "in" />
+ <Key word = "new" />
+ <Key word = "return" />
+ <Key word = "this" />
+ <Key word = "typeof" />
+ <Key word = "var" />
+ <Key word = "void" />
+ <Key word = "while" />
+ <Key word = "with" />
+ <!--ECMAScript keywords-->
+ <!-- Reserved for future use
+ (some are already used in some Javascript Engines)
+ -->
+ <Key word = "abstract" />
+ <Key word = "boolean" />
+ <Key word = "byte" />
+ <Key word = "case" />
+ <Key word = "catch" />
+ <Key word = "char" />
+ <Key word = "class" />
+ <Key word = "const" />
+ <Key word = "debugger" />
+ <Key word = "default" />
+ <Key word = "do" />
+ <Key word = "double" />
+ <Key word = "enum" />
+ <Key word = "export" />
+ <Key word = "extends" />
+ <Key word = "final" />
+ <Key word = "finally" />
+ <Key word = "float" />
+ <Key word = "goto" />
+ <Key word = "implements" />
+ <Key word = "import" />
+ <Key word = "instanceof" />
+ <Key word = "int" />
+ <Key word = "interface" />
+ <Key word = "long" />
+ <Key word = "native" />
+ <Key word = "package" />
+ <Key word = "private" />
+ <Key word = "protected" />
+ <Key word = "public" />
+ <Key word = "short" />
+ <Key word = "static" />
+ <Key word = "super" />
+ <Key word = "switch" />
+ <Key word = "synchronized" />
+ <Key word = "throw" />
+ <Key word = "throws" />
+ <Key word = "transient" />
+ <Key word = "try" />
+ <Key word = "volatile" />
+ </KeyWords>
+
+ <KeyWords name ="JavaScriptIntrinsics" bold="false" italic = "false" color = "Blue">
+ <Key word = "Array" />
+ <Key word = "Boolean" />
+ <Key word = "Date" />
+ <Key word = "Function" />
+ <Key word = "Global" />
+ <Key word = "Math" />
+ <Key word = "Number" />
+ <Key word = "Object" />
+ <Key word = "RegExp" />
+ <Key word = "String" />
+ </KeyWords>
+
+ <KeyWords name ="JavaScriptLiterals" bold="false" italic = "false" color = "Blue">
+ <Key word = "false" />
+ <Key word = "null" />
+ <Key word = "true" />
+ <Key word = "NaN" />
+ <Key word = "Infinity" />
+ </KeyWords>
+
+ <KeyWords name ="JavaScriptLiterals" bold="false" italic = "false" color = "Blue">
+ <Key word = "" />
+ </KeyWords>
+
+ <KeyWords name ="JavaScriptGlobalFunctions" bold="false" italic = "false" color = "Blue">
+ <Key word = "eval" />
+ <Key word = "parseInt" />
+ <Key word = "parseFloat" />
+ <Key word = "escape" />
+ <Key word = "unescape" />
+ <Key word = "isNaN" />
+ <Key word = "isFinite" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Mode.xsd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Mode.xsd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Mode.xsd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,296 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
+ <xsd:annotation>
+ <xsd:documentation>
+ This schema defines the syntax for mode definitions in SharpDevelop.
+ The schema can be simplified quite a bit but it does the job as is.
+
+
+ If you are using this file as a reference it is probably easiest to scroll to
+ the botton to find the definition of the root element called SyntaxDefinition and
+ then unwind the different type definitions and refernces.
+
+ Note on coloring:
+ Many tags define how some symbol should be colored. If a specific symbol
+ can not be matched onto either a Span definition, Keyword, or a Digit/Number it
+ will be rendered in the current default color. Which is the default color of the
+ current span or the default color of the mode as a whole if no span has been entered.
+ </xsd:documentation>
+ </xsd:annotation>
+
+ <!-- Defines the default rendering of the mode -->
+ <xsd:complexType name="EnvironmentEntry">
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="CustomEnvironmentEntry">
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:complexType>
+
+ <!-- The environment tag defines the coloring of various attributes in SharpDevelop -->
+ <xsd:complexType name="Environment">
+
+ <xsd:choice minOccurs="0" maxOccurs="unbounded">
+ <xsd:element name="Default" type="EnvironmentEntry" minOccurs="0" maxOccurs="1" />
+ <xsd:element name="Selection" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="VRuler" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="InvalidLines" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="CaretMarker" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="CaretLine" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+
+ <xsd:element name="LineNumbers" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+
+ <xsd:element name="FoldLine" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="FoldMarker" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="SelectedFoldLine" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+
+ <xsd:element name="EOLMarkers" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="SpaceMarkers" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+ <xsd:element name="TabMarkers" type="EnvironmentEntry" minOccurs="0" maxOccurs="1"/>
+
+ <xsd:element name="Custom" type="CustomEnvironmentEntry" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ </xsd:complexType>
+
+ <xsd:complexType name="Properties">
+ <xsd:sequence>
+ <xsd:element name="Property" type="Property" minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <xsd:complexType name="Property">
+ <!-- The actual KeyWord, typically reserved words or symbols in a programming language -->
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="value" type="xsd:string" />
+ </xsd:complexType>
+
+ <!-- The Digits tag defines the color for rendering Digits-->
+ <xsd:complexType name="Digits">
+ <xsd:attribute name="name" type="xsd:string" />
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:complexType>
+
+ <!-- Defines the delimiting characters of the syntax, e.g., the characters that, "break up" a line
+ into separate symbols, typically key words. It is not necessary, or desirable to include the
+ characters that denot the start or end of a span. Space and Tab are implicitly defined as delimeters
+ and they don't need to be includeded explicitly (this will probably be changed at some future time).-->
+ <xsd:complexType name="Delimiters">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <!-- The beginning symbol of a Span -->
+ <xsd:complexType name="Begin">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="singleword" type="xsd:boolean" />
+ <xsd:attribute name="startofline" type="xsd:boolean" />
+ <!-- The default rendering style for the Begin symbol. If not specified
+ the defaul rendering style for the span will be used. -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <!-- The end symbol of a Span -->
+ <xsd:complexType name="End">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <xsd:attribute name="singleword" type="xsd:boolean" />
+ <!-- The default rendering style for the End symbol. If not specified
+ the defaul rendering style for the span will be used. -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="Span">
+ <xsd:sequence>
+ <!-- Defines the symbol that indicates the beginning of the span. -->
+ <xsd:element name="Begin" type="Begin" />
+ <!-- Defines the symbol that indicates the end of the span. May be omitted for
+ one-line spans. -->
+ <xsd:element name="End" minOccurs="0" type="End" />
+ </xsd:sequence>
+ <!-- The name of the span definition -->
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ <!-- Defines the rule set that is applicable in the Span. May be omitted. -->
+ <xsd:attribute name="rule" type="xsd:string" />
+ <!-- Defines wether the Span should terminate automatically at the end of line. Typical examples
+ include one-line comments such as // in C++ or REM in Windows .Bat files. -->
+ <xsd:attribute name="stopateol" type="xsd:boolean" />
+
+ <!-- OBSOLUTE: Defines whether C-style escape sequences using \ are applicable or not in the span. -->
+ <xsd:attribute name="noescapesequences" type="xsd:boolean" />
+
+ <!-- defines the escape character -->
+ <xsd:attribute name="escapecharacter" type="xsd:string" />
+
+ <!-- The default rendering style for the span -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="MarkPrevious">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <!-- Svante Lidman, looking in the code it is a bit unclear what the intent is here... -->
+ <xsd:attribute name="markmarker" type="xsd:boolean" />
+ <!-- The rendering style to be used -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <!-- Allows you to define the coloring of the symbol that follows a specified symbol -->
+ <xsd:complexType name="MarkFollowing">
+ <xsd:simpleContent>
+ <xsd:extension base="xsd:string">
+ <!-- Svante Lidman, looking in the code it is a bit unclear what the intent is here... -->
+ <xsd:attribute name="markmarker" type="xsd:boolean" />
+ <!-- The rendering style to be used -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:extension>
+ </xsd:simpleContent>
+ </xsd:complexType>
+
+ <xsd:complexType name="Key">
+ <!-- The actual KeyWord, typically reserved words or symbols in a programming language -->
+ <xsd:attribute name="word" type="xsd:string" />
+ </xsd:complexType>
+
+
+ <!-- A grouping of keywords that sholuld be colored the same way -->
+ <xsd:complexType name="KeyWords">
+ <xsd:sequence>
+ <!-- allow groups with 0 keywords: this simplifies the syntax highlighting editor -->
+ <!-- A KeyWord -->
+ <xsd:element name="Key" type="Key" minOccurs="0" maxOccurs="unbounded">
+ </xsd:element>
+ </xsd:sequence>
+ <!-- The name of the KeyWord group -->
+ <xsd:attribute name="name" type="xsd:string" />
+ <!-- The rendering style of the KeyWord group -->
+ <xsd:attribute name="bold" type="xsd:boolean" />
+ <xsd:attribute name="italic" type="xsd:boolean" />
+ <xsd:attribute name="color" type="xsd:string" />
+ <xsd:attribute name="bgcolor" type="xsd:string" />
+ </xsd:complexType>
+
+ <xsd:complexType name="RuleSet">
+ <xsd:sequence>
+ <!-- Defines the delimiting characters of the syntax, e.g., the characters that, "break up" a line
+ into separate symbols, typically key words. It is not necessary, or desirable to include the
+ characters that denot the start or end of a span. Space and Tab are implicitly defined as delimeters
+ and they don't need to be includeded explicitly (this will probably be changed at some future time).-->
+ <xsd:element name="Delimiters" type="Delimiters" minOccurs="0" maxOccurs="1">
+ </xsd:element>
+ <!-- A Span tag defines a scope, or what can be seen as a separate parsing context where a different set of
+ highlighting rules are applicable compared to the text where the span is found.
+ Examples of spans include:
+ - A string in a language as C
+ - A <script> tag in Html
+ - The internals of a tag in XML (between < and >).
+ A span can have a rule set associated with it that defines the highlighting rules that are applicable
+ in the span. -->
+ <xsd:element name="Span" type="Span" minOccurs="0" maxOccurs="unbounded">
+ </xsd:element>
+ <!-- The MarkPrevious tag allows you to define the coloring of the item that preceeds a specific
+ symbol. An example of where this comes in handy is when coloring the contents of an XML-tag,
+ in particular the attributes and attribute names. The following definition:
+ <MarkPrevious bold="false" italic="false" color="Red">=</MarkPrevious>
+ will make teh highlighter color words that are followed by an = to be colored in Red.
+ You can see this in this file if you view it with the default XML-mode in SharpDevelop. -->
+ <xsd:element name="MarkPrevious" type="MarkPrevious" minOccurs="0" maxOccurs="unbounded">
+ </xsd:element>
+ <!-- The MarkFollowing tag works similarly as the MarkPrevious tag but relates to the coloring
+ of the symbol that follows the specified symbol. -->
+ <xsd:element name="MarkFollowing" type="MarkFollowing" minOccurs="0" maxOccurs="unbounded">
+ </xsd:element>
+ <!-- Defines a group of keywords that should be colored the same way -->
+ <xsd:element name="KeyWords" type="KeyWords" minOccurs="0" maxOccurs="unbounded">
+ </xsd:element>
+ </xsd:sequence>
+ <!-- The name of the RuleSet. Used when you refer to the RuleSet in the rule attribute of a Span tag.
+ Each mode file should have a rule definition without a defined name. This denotes the default rule
+ set for the mode. -->
+ <xsd:attribute name="name" type="xsd:string" />
+ <!-- Allows you to use another mode, defined in another file as a RuleSet. For an example see the
+ use of the JavaScript mode from the HTML-mode. -->
+ <xsd:attribute name="reference" type="xsd:string" />
+ <!-- Defines whether case is significant for matching keywords in the mode. -->
+ <xsd:attribute name="ignorecase" type="xsd:boolean" />
+ <!-- OBSOLETE: noescapesequences -->
+ <xsd:attribute name="noescapesequences" type="xsd:boolean" />
+ <!-- defines the escape character -->
+ <xsd:attribute name="escapecharacter" type="xsd:string" />
+ </xsd:complexType>
+
+ <!-- The RuleSets tag is just a grouping of the set of RuleSets for a mode. -->
+ <xsd:complexType name="RuleSets">
+ <xsd:sequence minOccurs="0" maxOccurs="unbounded">
+ <!-- Any number of RuleSet tag can be defined in a mode -->
+ <xsd:element name="RuleSet" type="RuleSet" minOccurs="1" maxOccurs="unbounded">
+ </xsd:element>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- SyntaxDefinition is the root-element in a mode definition file -->
+ <xsd:element name="SyntaxDefinition">
+ <xsd:complexType>
+ <xsd:sequence>
+ <!-- The Environment tag defines colors, for various standard elements in the SharpDevelop GUI, if
+ not given the default values are used. -->
+ <xsd:element name="Environment" type="Environment" minOccurs="0" maxOccurs="1"/>
+
+ <!-- The Properties section defines properties which are bound to the highlighting -->
+ <xsd:element name="Properties" type="Properties" minOccurs="0" maxOccurs="1" />
+
+ <!-- The Digits tag defines the color for rendering Digits-->
+ <xsd:element name="Digits" type="Digits" minOccurs="0" maxOccurs="1"/>
+
+ <!-- The RuleSets tag defines the rule sets that are used in the mode. Note that all modes are defined in
+ a flat structture even if they are used recursively. For an example of a mode that uses
+ multiple rule sets see the XML-mode. There is a top level rule-set and and another rule-set
+ that handles highligting within a tag, i.e., between < and >. -->
+ <xsd:element name="RuleSets" type="RuleSets" />
+ </xsd:sequence>
+ <!-- The name of the mode. This is used when you, in the defintion of a RuleSet refers to another
+ mode. I.e., one that is defined in an external file. For an example of this see the HTML-Mode that
+ uses the JavaScript-mode this way. -->
+ <xsd:attribute name="name" type="xsd:string" />
+ <!-- The file extensions that the mode is applicable for. Extensions must be written with lower case and
+ should include the ., as in .txt. If several extensions are applicable they should be separeated with | -->
+ <xsd:attribute name="extensions" type="xsd:string" />
+ <!-- Name of a syntax mode where rulesets, spans, keywords and other settings are imported from -->
+ <xsd:attribute name="extends" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+
+</xsd:schema>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/PHP-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/PHP-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/PHP-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,198 @@
+<?xml version="1.0"?>
+<!-- syntaxdefinition for PHP 2001 by Chad Smith & Mike Krueger -->
+
+<SyntaxDefinition name ="PHP" extensions = ".php">
+
+ <Digits name ="Digits" bold ="false" italic ="false" color ="DarkBlue"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>~!%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name ="PreprocessorDirectives" bold="false" italic = "false" color = "Green" stopateol ="true">
+ <Begin>#</Begin>
+ </Span>
+
+ <Span name ="LINECOMMENT" rule = "DocumentSet" bold ="false" italic ="true" color ="SlateGray" stopateol ="true">
+ <Begin>///</Begin>
+ </Span>
+
+ <Span name ="LINECOMMENT" rule = "TestSet" bold ="false" italic ="true" color ="SlateGray" stopateol ="true">
+ <Begin>//@!/@</Begin>
+ </Span>
+
+ <Span name ="BLOCKCOMMENT" rule = "TestSet" bold ="false" italic ="true" color ="SlateGray" stopateol ="false">
+ <Begin>/*</Begin>
+ <End>*/</End>
+ </Span>
+
+ <Span name ="STRING" bold ="false" italic ="false" color ="Magenta" stopateol ="true" escapecharacter="\">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name ="MORELINEDSTRING" bold ="false" italic ="false" color ="Magenta" stopateol ="false" escapecharacter="\">
+ <Begin>@@"</Begin>
+ <End>"</End>
+ </Span>
+
+ <Span name ="CHAR" bold ="false" italic ="false" color ="Magenta" stopateol ="true" escapecharacter="\">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+
+ <MarkPrevious bold ="true" italic ="false" color ="MidnightBlue">(</MarkPrevious>
+
+ <KeyWords name ="Punctuation" bold ="false" italic ="false" color ="DarkGreen">
+ <Key word = "?" />
+ <Key word = "," />
+ <Key word = "." />
+ <Key word = "(" />
+ <Key word = ")" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "%" />
+ <Key word = "*" />
+ <Key word = "<" />
+ <Key word = ">" />
+ <Key word = "^" />
+ <Key word = "!" />
+ <Key word = "|" />
+ </KeyWords>
+
+ <KeyWords name ="AccessKeywords" bold="true" italic = "false" color = "Black">
+ <Key word = "global" />
+ <Key word = "my" />
+ </KeyWords>
+
+ <KeyWords name ="OperatorKeywords" bold="true" italic = "false" color = "DarkCyan">
+ <Key word = "and" />
+ <Key word = "or" />
+ <Key word = "new" />
+ <Key word = "xor" />
+ <Key word = "true" />
+ <Key word = "false" />
+ </KeyWords>
+
+
+ <KeyWords name ="SelectionStatements" bold="true" italic = "false" color = "Blue">
+ <Key word = "else" />
+ <Key word = "if" />
+ <Key word = "switch" />
+ <Key word = "case" />
+ <Key word = "endif" />
+ <Key word = "elseif" />
+ </KeyWords>
+
+ <KeyWords name ="IterationStatements" bold="true" italic = "false" color = "Blue">
+ <Key word = "do" />
+ <Key word = "for" />
+ <Key word = "foreach" />
+ <Key word = "while" />
+ <Key word = "endwhile" />
+ <Key word = "exit" />
+ </KeyWords>
+
+ <KeyWords name ="JumpStatements" bold="false" italic = "false" color = "Navy">
+ <Key word = "break" />
+ <Key word = "continue" />
+ <Key word = "default" />
+ <Key word = "goto" />
+ <Key word = "return" />
+ </KeyWords>
+
+ <KeyWords name ="ExceptionHandlingStatements" bold="true" italic = "false" color = "Teal">
+ <Key word = "require" />
+ <Key word = "include" />
+ <Key word = "function" />
+ <Key word = "return" />
+ <Key word = "old_function" />
+ </KeyWords>
+
+ <KeyWords name ="ValueTypes" bold="true" italic = "false" color = "Red">
+ <Key word = "int" />
+ <Key word = "integer" />
+ <Key word = "real" />
+ <Key word = "double" />
+ <Key word = "float" />
+ <Key word = "string" />
+ <Key word = "array" />
+ <Key word = "object" />
+ </KeyWords>
+
+ <KeyWords name ="ReferenceTypes" bold="false" italic = "false" color = "Red">
+ <Key word = "class" />
+ <Key word = "new" />
+ </KeyWords>
+
+ <KeyWords name ="Void" bold="false" italic = "false" color = "Red">
+ <Key word = "void" />
+ </KeyWords>
+
+ <KeyWords name ="AccessModifiers" bold="true" italic = "false" color = "Blue">
+ <Key word = "public" />
+ <Key word = "private" />
+ </KeyWords>
+
+ <KeyWords name ="GetSet" bold="false" italic = "false" color = "SaddleBrown">
+ <Key word = "get" />
+ <Key word = "set" />
+ </KeyWords>
+
+ <KeyWords name ="Literals" bold="true" italic = "false" color = "Black">
+ <Key word = "null" />
+ <Key word = "value" />
+ </KeyWords>
+
+ <KeyWords name ="Statements" bold="true" italic = "false" color = "DarkBlue">
+ <Key word = "var" />
+ <Key word = "extends" />
+ <Key word = "list" />
+ <Key word = "each" />
+ <Key word = "PHP_SELF" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name ="TestSet" ignorecase = "true">
+ <Delimiters>~!@%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+ <KeyWords name ="Testword" bold="true" italic = "true" color = "Red">
+ <Key word = "TODO" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name ="DocumentSet" ignorecase = "false">
+ <Delimiters>~!@%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name ="XMLTAG" rule = "XMLDocuSet" bold ="false" italic ="true" color ="Gray" stopateol ="true">
+ <Begin><</Begin>
+ <End>></End>
+ </Span>
+
+ <KeyWords name ="Testword" bold="true" italic = "true" color = "Red">
+ <Key word = "TODO" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name ="XMLDocuSet" ignorecase = "false">
+ <Delimiters>~!@%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name ="STRING" bold ="true" italic ="true" color ="Silver" stopateol ="true">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+
+
+ <KeyWords name ="Punctuation" bold ="true" italic ="true" color ="Gray">
+ <Key word = "/" />
+ <Key word = "|" />
+ <Key word = "=" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Patch-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Patch-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Patch-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+
+<SyntaxDefinition name = "Patch" extensions = ".patch;.diff">
+ <!--<Digits name = "Digits" bold = "false" italic = "false" color = "DarkBlue"/>-->
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>~!%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name = "IndexLine" bold="true" italic="false" color="Green" stopateol = "true">
+ <Begin>Index: </Begin>
+ </Span>
+ <Span name = "IndexUnderline" bold="false" italic="false" color="DarkRed" stopateol = "true">
+ <Begin>==</Begin>
+ </Span>
+ <Span name = "IndexOldFile" bold="false" italic="false" color="DarkRed" stopateol = "true">
+ <Begin>---</Begin>
+ </Span>
+ <Span name = "IndexNewFile" bold="false" italic="false" color="DarkRed" stopateol = "true">
+ <Begin>+++</Begin>
+ </Span>
+ <Span name = "LocationMarker" bold="false" italic="false" color="Purple" stopateol = "true">
+ <Begin>@@</Begin>
+ </Span>
+ <Span name = "RemovedLine" bold="false" italic="false" color="#339966" stopateol = "true">
+ <Begin>-</Begin>
+ </Span>
+ <Span name = "AddedLine" bold="false" italic="false" color="Navy" stopateol = "true" >
+ <Begin>+</Begin>
+ </Span>
+ <Span name = "NormalLine" bold="false" italic="false" color="SystemColors.WindowText" stopateol = "true" >
+ <Begin> </Begin>
+ </Span>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/RightArrow.cur
===================================================================
(Binary files differ)
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/RightArrow.cur
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/SyntaxModes.xml
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/SyntaxModes.xml (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/SyntaxModes.xml 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,57 @@
+<SyntaxModes version="1.0">
+ <Mode file = "ASPX.xshd"
+ name = "ASP/XHTML"
+ extensions = ".asp;.aspx;.asax;.asmx"/>
+
+ <Mode file = "BAT-Mode.xshd"
+ name = "BAT"
+ extensions = ".bat"/>
+
+ <Mode file = "Boo.xshd"
+ name = "Boo"
+ extensions = ".boo"/>
+
+ <Mode file = "Coco-Mode.xshd"
+ name = "Coco"
+ extensions = ".atg"/>
+
+ <Mode file = "CPP-Mode.xshd"
+ name = "C++.NET"
+ extensions = ".c;.h;.cc;.C;.cpp;.hpp"/>
+
+ <Mode file = "CSharp-Mode.xshd"
+ name = "C#"
+ extensions = ".cs"/>
+
+ <Mode file = "HTML-Mode.xshd"
+ name = "HTML"
+ extensions = ".htm;.html"/>
+
+ <Mode file = "Java-Mode.xshd"
+ name = "Java"
+ extensions = ".java"/>
+
+ <Mode file = "JavaScript-Mode.xshd"
+ name = "JavaScript"
+ extensions = ".js"/>
+
+ <Mode file = "Patch-Mode.xshd"
+ name = "Patch"
+ extensions = ".patch;.diff"/>
+
+ <Mode file = "PHP-Mode.xshd"
+ name = "PHP"
+ extensions = ".php"/>
+
+ <Mode file = "Tex-Mode.xshd"
+ name = "TeX"
+ extensions = ".tex"/>
+
+ <Mode file = "VBNET-Mode.xshd"
+ name = "VBNET"
+ extensions = ".vb"/>
+
+ <Mode file = "XML-Mode.xshd"
+ name = "XML"
+ extensions = ".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.booproj;.build;.xfrm;.targets;.xaml;.xpt;.xft;.map;.wsdl;.disco"/>
+</SyntaxModes>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Tex-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Tex-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/Tex-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,108 @@
+<?xml version="1.0"?>
+<!-- syntaxdefinition for TeX document 2001 by Mike Krueger (gleaned from Jedit) -->
+
+<SyntaxDefinition name = "TeX" extensions = ".tex">
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "Black"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "false">
+ <Delimiters>&~!@%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+ <Span name = "LineComment" bold = "false" italic = "true" color = "SlateGray" stopateol = "true">
+ <Begin>%</Begin>
+ </Span>
+
+ <Span name = "MathMode" rule = "MathMode" bold = "false" italic = "false" color = "Black" stopateol = "false">
+ <Begin>$$</Begin>
+ <End>$$</End>
+ </Span>
+ <Span name = "LatexMathMode" rule = "MathMode" bold = "false" italic = "false" color = "Black" stopateol = "false">
+ <Begin>\[</Begin>
+ <End>\]</End>
+ </Span>
+
+ <!-- \... commands -->
+ <MarkFollowing markmarker ="true" bold = "true" italic = "false" color = "MidnightBlue">\</MarkFollowing>
+
+ <!-- some commands must be handled specially -->
+ <KeyWords name = "Keyword1" bold = "false" italic = "false" color = "Blue">
+ <Key word = "\$" />
+ <Key word = "\\" />
+ <Key word = "\%" />
+ </KeyWords>
+
+ <KeyWords name = "KeyWords2" bold="true" italic="false" color="Green">
+ <Key word = ")" />
+ <Key word = ")" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "=" />
+ <Key word = "!" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "*" />
+ <Key word = ">" />
+ <Key word = "<" />
+ <Key word = "&" />
+ <Key word = "|" />
+ <Key word = "^" />
+ <Key word = "~" />
+ <Key word = "." />
+ <Key word = "," />
+ <Key word = ";" />
+ <Key word = "?" />
+ <Key word = ":" />
+ <Key word = "'" />
+ <!-- <Key word = """ />-->
+ <Key word = "`" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "MathMode" ignorecase = "false">
+ <Delimiters>&~!@%^*()-+=|\#/{}[]:;"'<> , .?</Delimiters>
+
+
+ <Span name = "LineComment" bold = "false" italic = "true" color = "SlateGray" stopateol = "true">
+ <Begin>%</Begin>
+ </Span>
+
+ <!-- \... commands -->
+ <MarkFollowing markmarker ="true" bold = "true" italic = "false" color = "MidnightBlue">\</MarkFollowing>
+
+ <KeyWords name = "KeyWords2" bold="true" italic="false" color="Green">
+ <Key word = ")" />
+ <Key word = ")" />
+ <Key word = "{" />
+ <Key word = "}" />
+ <Key word = "[" />
+ <Key word = "]" />
+ <Key word = "=" />
+ <Key word = "!" />
+ <Key word = "+" />
+ <Key word = "-" />
+ <Key word = "/" />
+ <Key word = "*" />
+ <Key word = ">" />
+ <Key word = "<" />
+ <Key word = "&" />
+ <Key word = "|" />
+ <Key word = "^" />
+ <Key word = "~" />
+ <Key word = "." />
+ <Key word = "," />
+ <Key word = ";" />
+ <Key word = "?" />
+ <Key word = ":" />
+ <Key word = "'" />
+ <!-- <Key word = """ />-->
+ <Key word = "`" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+
+</SyntaxDefinition>
+
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/TextEditorControl.bmp
===================================================================
(Binary files differ)
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/TextEditorControl.bmp
___________________________________________________________________
Added: svn:mime-type
+ application/octet-stream
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/VBNET-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/VBNET-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/VBNET-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,265 @@
+<?xml version="1.0"?>
+
+<!-- Syntaxdefinition for VB.NET, v0.1 Rev 1 by Christian Holm -->
+<!-- Updated 2005 by Daniel Grunwald for VB.NET 2.0 -->
+
+<SyntaxDefinition name = "VBNET" extensions = ".vb">
+
+ <Properties>
+ <Property name="LineComment" value="'"/>
+ </Properties>
+
+ <Digits name = "Digits" bold = "false" italic = "false" color = "Black"/>
+
+ <RuleSets>
+ <RuleSet ignorecase = "true">
+
+ <Delimiters>~!@%^*()-+=|\#/{}[]:;"'<>,.?</Delimiters>
+
+ <Span name = "STRING" bold = "false" italic = "false" color = "Black" stopateol = "true" escapecharacter='"'>
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+<!--
+ <Span name = "LINECOMMENT" rule = "DocumentSet" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>'</Begin>
+ </Span>
+
+ <Span name = "LINECOMMENT" rule = "DocumentSet" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>REM</Begin>
+ </Span>
+-->
+ <Span name = "PREPROCESSORDIRECTIVE" rule = "PreprocessorSet" bold = "false" italic = "false" color = "Maroon" stopateol = "true">
+ <Begin startofline="true">#</Begin>
+ </Span>
+
+ <Span name = "DATELITERAL" bold = "false" italic = "false" color = "Blue" stopateol = "true">
+ <Begin startofline="false">#</Begin>
+ <End>#</End>
+ </Span>
+
+ <Span name = "LINECOMMENT" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin>'</Begin>
+ </Span>
+
+ <Span name = "LINECOMMENT" bold = "false" italic = "false" color = "Green" stopateol = "true">
+ <Begin singleword="true">REM at C</Begin>
+ </Span>
+
+ <KeyWords name = "DataTypes" bold="false" italic="false" color="#6F002F">
+ <Key word = "Boolean" />
+ <Key word = "Byte" />
+ <Key word = "Char" />
+ <Key word = "Date" />
+ <Key word = "Decimal" />
+ <Key word = "Double" />
+ <Key word = "Integer" />
+ <Key word = "Long" />
+ <Key word = "Object" />
+ <Key word = "SByte" />
+ <Key word = "Short" />
+ <Key word = "Single" />
+ <Key word = "String" />
+ <Key word = "UInteger" />
+ <Key word = "ULong" />
+ <Key word = "UShort" />
+ <Key word = "Variant" />
+ </KeyWords>
+
+ <KeyWords name = "Operators" bold="false" italic="false" color="#8515EA">
+ <Key word = "AddressOf" />
+ <Key word = "And" />
+ <Key word = "AndAlso" />
+ <Key word = "Is" />
+ <Key word = "IsNot" />
+ <Key word = "Like" />
+ <Key word = "Mod" />
+ <Key word = "New" />
+ <Key word = "Not" />
+ <Key word = "Or" />
+ <Key word = "OrElse" />
+ <Key word = "Xor" />
+ </KeyWords>
+
+ <KeyWords name = "Constants" bold="false" italic="false" color="Blue">
+ <Key word = "False" />
+ <Key word = "Me" />
+ <Key word = "MyBase" />
+ <Key word = "MyClass" />
+ <Key word = "Nothing" />
+ <Key word = "True" />
+ </KeyWords>
+
+ <KeyWords name = "CommonKeywords" bold="false" italic="false" color="Blue">
+ <Key word = "As" />
+ <Key word = "Of" />
+ <Key word = "New" />
+ <Key word = "End" />
+ </KeyWords>
+
+ <KeyWords name = "FunctionKeywords" bold="false" italic="false" color="Blue">
+ <Key word = "CBool" />
+ <Key word = "CByte" />
+ <Key word = "CChar" />
+ <Key word = "CDate" />
+ <Key word = "CDec" />
+ <Key word = "CDbl" />
+ <Key word = "CInt" />
+ <Key word = "CLng" />
+ <Key word = "CObj" />
+ <Key word = "CSByte" />
+ <Key word = "CShort" />
+ <Key word = "CSng" />
+ <Key word = "CStr" />
+ <Key word = "CType" />
+ <Key word = "CUInt" />
+ <Key word = "CULng" />
+ <Key word = "CUShort" />
+ <Key word = "DirectCast" />
+ <Key word = "GetType" />
+ <Key word = "TryCast" />
+ <Key word = "TypeOf" />
+ </KeyWords>
+
+ <KeyWords name = "ParamModifiers" bold="false" italic="false" color="Blue">
+ <Key word = "ByRef" />
+ <Key word = "ByVal" />
+ <Key word = "Optional" />
+ <Key word = "ParamArray" />
+ </KeyWords>
+
+ <KeyWords name = "AccessModifiers" bold="false" italic="false" color="Blue">
+ <Key word = "Friend" />
+ <Key word = "Private" />
+ <Key word = "Protected" />
+ <Key word = "Public" />
+ </KeyWords>
+
+ <KeyWords name = "OtherModifiers" bold="false" italic="false" color="Blue">
+ <Key word = "Const" />
+ <Key word = "Custom" />
+ <Key word = "Default" />
+ <Key word = "Global" />
+ <Key word = "MustInherit" />
+ <Key word = "MustOverride" />
+ <Key word = "Narrowing" />
+ <Key word = "NotInheritable" />
+ <Key word = "NotOverridable" />
+ <Key word = "Overloads" />
+ <Key word = "Overridable" />
+ <Key word = "Overrides" />
+ <Key word = "Partial" />
+ <Key word = "ReadOnly" />
+ <Key word = "Shadows" />
+ <Key word = "Shared" />
+ <Key word = "Static" />
+ <Key word = "Widening" />
+ <Key word = "WithEvents" />
+ <Key word = "WriteOnly" />
+ </KeyWords>
+
+ <KeyWords name = "Statements" bold="false" italic="false" color="Blue">
+ <Key word = "Throw" />
+ <Key word = "Stop" />
+ <Key word = "Return" />
+ <Key word = "Resume" />
+ <Key word = "AddHandler" />
+ <Key word = "RemoveHandler" />
+ <Key word = "RaiseEvent" />
+ <Key word = "Option" />
+ <Key word = "Let" />
+ <Key word = "GoTo" />
+ <Key word = "GoSub" />
+ <Key word = "Call" />
+ <Key word = "Continue" />
+ <Key word = "Dim" />
+ <Key word = "ReDim" />
+ <Key word = "Erase" />
+ <Key word = "On" />
+ <Key word = "Error" />
+ <Key word = "Exit" />
+ </KeyWords>
+
+ <KeyWords name = "GlobalConstructs" bold="false" italic="false" color="Blue">
+ <Key word = "Namespace" />
+ <Key word = "Class" />
+ <Key word = "Imports" />
+ <Key word = "Implements" />
+ <Key word = "Inherits" />
+ <Key word = "Interface" />
+ <Key word = "Delegate" />
+ <Key word = "Module" />
+ <Key word = "Structure" />
+ <Key word = "Enum" />
+ </KeyWords>
+
+ <KeyWords name = "TypeLevelConstructs" bold="false" italic="false" color="Blue">
+ <Key word = "Sub" />
+ <Key word = "Function" />
+ <Key word = "Handles" />
+ <Key word = "Declare" />
+ <Key word = "Lib" />
+ <Key word = "Alias" />
+ <Key word = "Get" />
+ <Key word = "Set" />
+ <Key word = "Property" />
+ <Key word = "Operator" />
+ <Key word = "Event" />
+ </KeyWords>
+
+ <KeyWords name = "Constructs" bold="false" italic="false" color="Blue">
+ <Key word = "SyncLock" />
+ <Key word = "Using" />
+ <Key word = "With" />
+ <Key word = "Do" />
+ <Key word = "While" />
+ <Key word = "Loop" />
+ <Key word = "Wend" />
+
+ <Key word = "Try" />
+ <Key word = "Catch" />
+ <Key word = "When" />
+ <Key word = "Finally" />
+
+ <Key word = "If" />
+ <Key word = "Then" />
+ <Key word = "Else" />
+ <Key word = "ElseIf" />
+ <Key word = "EndIf" />
+
+ <Key word = "For" />
+ <Key word = "To" />
+ <Key word = "Step" />
+ <Key word = "Each" />
+ <Key word = "In" />
+ <Key word = "Next" />
+
+ <Key word = "Select" />
+ <Key word = "Case" />
+ </KeyWords>
+
+ <KeyWords name = "ContextKeywords" bold="false" italic="false" color="Blue">
+ <Key word = "Ansi" />
+ <Key word = "Auto" />
+ <Key word = "Unicode" />
+ <Key word = "Preserve" />
+ <Key word = "Until" />
+ </KeyWords>
+ </RuleSet>
+
+ <RuleSet name = "PreprocessorSet" ignorecase = "true">
+ <Delimiters>~!@%^*()-+=|\#/{}[]:;"'<>,.?</Delimiters>
+
+ <KeyWords name = "PreProcessor" bold="true" italic="false" color="Maroon">
+ <Key word = "Const" />
+ <Key word = "If" />
+ <Key word = "ElseIf" />
+ <Key word = "Else" />
+ <Key word = "End" />
+ <Key word = "ExternalSource" />
+ <Key word = "Region" />
+ <Key word = "ExternalChecksum" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/XML-Mode.xshd
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/XML-Mode.xshd (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Resources/XML-Mode.xshd 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,60 @@
+<?xml version="1.0" ?>
+<!-- syntaxdefinition for XML 2000 by Mike Krueger -->
+<SyntaxDefinition name="XML" extensions=".xml;.xsl;.xslt;.xsd;.manifest;.config;.addin;.xshd;.wxs;.wxi;.wxl;.proj;.csproj;.vbproj;.ilproj;.booproj;.build;.xfrm;.targets;.xaml;.xpt;.xft;.map;.wsdl;.disco">
+
+ <Properties>
+ <Property name="BlockCommentBegin" value="<!--"/>
+ <Property name="BlockCommentEnd" value="-->"/>
+ </Properties>
+ <Digits name="Digits" bold="false" italic="false" color="DarkBlue" />
+ <RuleSets>
+ <RuleSet ignorecase="false">
+ <!-- It is not necessary to define span-delimiting characters as delimiters -->
+ <Delimiters></Delimiters>
+
+ <Span name="Comment" bold="false" italic="false" color="Green" stopateol="false">
+ <Begin><!--</Begin>
+ <End>--></End>
+ </Span>
+ <Span name="CDataSection" bold="false" italic="false" color="Blue" stopateol="false">
+ <Begin><![CDATA[</Begin>
+ <End>]]></End>
+ </Span>
+ <Span name="DocTypeSection" bold="false" italic="false" color="Blue" stopateol="false">
+ <Begin><!DOCTYPE</Begin>
+ <End>></End>
+ </Span>
+ <Span name="XmlDecl" bold="false" italic="false" color="Blue" stopateol="false">
+ <Begin><?</Begin>
+ <End>?></End>
+ </Span>
+ <Span name="XmlTag" rule="XmlTagSet" bold="false" italic="false" color="DarkMagenta" stopateol="false">
+ <Begin><</Begin>
+ <End>></End>
+ </Span>
+ <Span name="EntityReference" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>&</Begin>
+ <End>;</End>
+ </Span>
+ </RuleSet>
+
+ <RuleSet name="XmlTagSet" ignorecase="false">
+ <Delimiters>/=</Delimiters>
+ <Span name="String" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>"</Begin>
+ <End>"</End>
+ </Span>
+ <Span name="Char" bold="false" italic="false" color="Blue" stopateol="true">
+ <Begin>'</Begin>
+ <End>'</End>
+ </Span>
+ <MarkPrevious bold="false" italic="false" color="Red">=</MarkPrevious>
+ <KeyWords name="Slash" bold="false" italic="false" color="DarkMagenta">
+ <Key word="/" />
+ </KeyWords>
+ <KeyWords name="Assignment" bold="false" italic="false" color="Blue">
+ <Key word="=" />
+ </KeyWords>
+ </RuleSet>
+ </RuleSets>
+</SyntaxDefinition>
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src
___________________________________________________________________
Added: bugtraq:number
+ true
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/BookmarkActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/BookmarkActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/BookmarkActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,80 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class ToggleBookmark : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.Document.BookmarkManager.ToggleMarkAt(textArea.Caret.Position);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, textArea.Caret.Line));
+ textArea.Document.CommitUpdate();
+
+ }
+ }
+
+ public class GotoPrevBookmark : AbstractEditAction
+ {
+ Predicate<Bookmark> predicate = null;
+
+ public GotoPrevBookmark(Predicate<Bookmark> predicate)
+ {
+ this.predicate = predicate;
+ }
+
+ public override void Execute(TextArea textArea)
+ {
+ Bookmark mark = textArea.Document.BookmarkManager.GetPrevMark(textArea.Caret.Line, predicate);
+ if (mark != null) {
+ textArea.Caret.Position = mark.Location;
+ textArea.SelectionManager.ClearSelection();
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+
+ public class GotoNextBookmark : AbstractEditAction
+ {
+ Predicate<Bookmark> predicate = null;
+
+ public GotoNextBookmark(Predicate<Bookmark> predicate)
+ {
+ this.predicate = predicate;
+ }
+
+ public override void Execute(TextArea textArea)
+ {
+ Bookmark mark = textArea.Document.BookmarkManager.GetNextMark(textArea.Caret.Line, predicate);
+ if (mark != null) {
+ textArea.Caret.Position = mark.Location;
+ textArea.SelectionManager.ClearSelection();
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+
+ public class ClearAllBookmarks : AbstractEditAction
+ {
+ Predicate<Bookmark> predicate = null;
+
+ public ClearAllBookmarks(Predicate<Bookmark> predicate)
+ {
+ this.predicate = predicate;
+ }
+
+ public override void Execute(TextArea textArea)
+ {
+ textArea.Document.BookmarkManager.RemoveMarks(predicate);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ textArea.Document.CommitUpdate();
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/CaretActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/CaretActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/CaretActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,203 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class CaretLeft : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation position = textArea.Caret.Position;
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldedFoldingsWithEnd(position.Y);
+ FoldMarker justBeforeCaret = null;
+ foreach (FoldMarker fm in foldings) {
+ if (fm.EndColumn == position.X) {
+ justBeforeCaret = fm;
+ break; // the first folding found is the folding with the smallest Startposition
+ }
+ }
+
+ if (justBeforeCaret != null) {
+ position.Y = justBeforeCaret.StartLine;
+ position.X = justBeforeCaret.StartColumn;
+ } else {
+ if (position.X > 0) {
+ --position.X;
+ } else if (position.Y > 0) {
+ LineSegment lineAbove = textArea.Document.GetLineSegment(position.Y - 1);
+ position = new TextLocation(lineAbove.Length, position.Y - 1);
+ }
+ }
+
+ textArea.Caret.Position = position;
+ textArea.SetDesiredColumn();
+ }
+ }
+
+ public class CaretRight : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ LineSegment curLine = textArea.Document.GetLineSegment(textArea.Caret.Line);
+ TextLocation position = textArea.Caret.Position;
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldedFoldingsWithStart(position.Y);
+ FoldMarker justBehindCaret = null;
+ foreach (FoldMarker fm in foldings) {
+ if (fm.StartColumn == position.X) {
+ justBehindCaret = fm;
+ break;
+ }
+ }
+ if (justBehindCaret != null) {
+ position.Y = justBehindCaret.EndLine;
+ position.X = justBehindCaret.EndColumn;
+ } else { // no folding is interesting
+ if (position.X < curLine.Length || textArea.TextEditorProperties.AllowCaretBeyondEOL) {
+ ++position.X;
+ } else if (position.Y + 1 < textArea.Document.TotalNumberOfLines) {
+ ++position.Y;
+ position.X = 0;
+ }
+ }
+ textArea.Caret.Position = position;
+ textArea.SetDesiredColumn();
+ }
+ }
+
+ public class CaretUp : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation position = textArea.Caret.Position;
+ int lineNr = position.Y;
+ int visualLine = textArea.Document.GetVisibleLine(lineNr);
+ if (visualLine > 0) {
+ Point pos = new Point(textArea.TextView.GetDrawingXPos(lineNr, position.X),
+ textArea.TextView.DrawingPosition.Y + (visualLine - 1) * textArea.TextView.FontHeight - textArea.TextView.TextArea.VirtualTop.Y);
+ textArea.Caret.Position = textArea.TextView.GetLogicalPosition(pos);
+ textArea.SetCaretToDesiredColumn();
+ }
+// if (textArea.Caret.Line > 0) {
+// textArea.SetCaretToDesiredColumn(textArea.Caret.Line - 1);
+// }
+ }
+ }
+
+ public class CaretDown : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation position = textArea.Caret.Position;
+ int lineNr = position.Y;
+ int visualLine = textArea.Document.GetVisibleLine(lineNr);
+ if (visualLine < textArea.Document.GetVisibleLine(textArea.Document.TotalNumberOfLines)) {
+ Point pos = new Point(textArea.TextView.GetDrawingXPos(lineNr, position.X),
+ textArea.TextView.DrawingPosition.Y
+ + (visualLine + 1) * textArea.TextView.FontHeight
+ - textArea.TextView.TextArea.VirtualTop.Y);
+ textArea.Caret.Position = textArea.TextView.GetLogicalPosition(pos);
+ textArea.SetCaretToDesiredColumn();
+ }
+// if (textArea.Caret.Line + 1 < textArea.Document.TotalNumberOfLines) {
+// textArea.SetCaretToDesiredColumn(textArea.Caret.Line + 1);
+// }
+ }
+ }
+
+ public class WordRight : CaretRight
+ {
+ public override void Execute(TextArea textArea)
+ {
+ LineSegment line = textArea.Document.GetLineSegment(textArea.Caret.Position.Y);
+ TextLocation oldPos = textArea.Caret.Position;
+ TextLocation newPos;
+ if (textArea.Caret.Column >= line.Length) {
+ newPos = new TextLocation(0, textArea.Caret.Line + 1);
+ } else {
+ int nextWordStart = TextUtilities.FindNextWordStart(textArea.Document, textArea.Caret.Offset);
+ newPos = textArea.Document.OffsetToPosition(nextWordStart);
+ }
+
+ // handle fold markers
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(newPos.Y, newPos.X);
+ foreach (FoldMarker marker in foldings) {
+ if (marker.IsFolded) {
+ if (oldPos.X == marker.StartColumn && oldPos.Y == marker.StartLine) {
+ newPos = new TextLocation(marker.EndColumn, marker.EndLine);
+ } else {
+ newPos = new TextLocation(marker.StartColumn, marker.StartLine);
+ }
+ break;
+ }
+ }
+
+ textArea.Caret.Position = newPos;
+ textArea.SetDesiredColumn();
+ }
+ }
+
+ public class WordLeft : CaretLeft
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldPos = textArea.Caret.Position;
+ if (textArea.Caret.Column == 0) {
+ base.Execute(textArea);
+ } else {
+ LineSegment line = textArea.Document.GetLineSegment(textArea.Caret.Position.Y);
+
+ int prevWordStart = TextUtilities.FindPrevWordStart(textArea.Document, textArea.Caret.Offset);
+
+ TextLocation newPos = textArea.Document.OffsetToPosition(prevWordStart);
+
+ // handle fold markers
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(newPos.Y, newPos.X);
+ foreach (FoldMarker marker in foldings) {
+ if (marker.IsFolded) {
+ if (oldPos.X == marker.EndColumn && oldPos.Y == marker.EndLine) {
+ newPos = new TextLocation(marker.StartColumn, marker.StartLine);
+ } else {
+ newPos = new TextLocation(marker.EndColumn, marker.EndLine);
+ }
+ break;
+ }
+ }
+ textArea.Caret.Position = newPos;
+ textArea.SetDesiredColumn();
+ }
+
+
+ }
+ }
+
+ public class ScrollLineUp : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.AutoClearSelection = false;
+
+ textArea.MotherTextAreaControl.VScrollBar.Value = Math.Max(textArea.MotherTextAreaControl.VScrollBar.Minimum,
+ textArea.VirtualTop.Y - textArea.TextView.FontHeight);
+ }
+ }
+
+ public class ScrollLineDown : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.AutoClearSelection = false;
+ textArea.MotherTextAreaControl.VScrollBar.Value = Math.Min(textArea.MotherTextAreaControl.VScrollBar.Maximum,
+ textArea.VirtualTop.Y + textArea.TextView.FontHeight);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/ClipBoardActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/ClipBoardActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/ClipBoardActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,42 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class Cut : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+ textArea.ClipboardHandler.Cut(null, null);
+ }
+ }
+
+ public class Copy : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.AutoClearSelection = false;
+ textArea.ClipboardHandler.Copy(null, null);
+ }
+ }
+
+ public class Paste : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+ textArea.ClipboardHandler.Paste(null, null);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FoldActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FoldActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FoldActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,68 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class ToggleFolding : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ List<FoldMarker> foldMarkers = textArea.Document.FoldingManager.GetFoldingsWithStart(textArea.Caret.Line);
+ if (foldMarkers.Count != 0) {
+ foreach (FoldMarker fm in foldMarkers)
+ fm.IsFolded = !fm.IsFolded;
+ } else {
+ foldMarkers = textArea.Document.FoldingManager.GetFoldingsContainsLineNumber(textArea.Caret.Line);
+ if (foldMarkers.Count != 0) {
+ FoldMarker innerMost = foldMarkers[0];
+ for (int i = 1; i < foldMarkers.Count; i++) {
+ if (new TextLocation(foldMarkers[i].StartColumn, foldMarkers[i].StartLine) >
+ new TextLocation(innerMost.StartColumn, innerMost.StartLine))
+ {
+ innerMost = foldMarkers[i];
+ }
+ }
+ innerMost.IsFolded = !innerMost.IsFolded;
+ }
+ }
+ textArea.Document.FoldingManager.NotifyFoldingsChanged(EventArgs.Empty);
+ }
+ }
+
+ public class ToggleAllFoldings : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ bool doFold = true;
+ foreach (FoldMarker fm in textArea.Document.FoldingManager.FoldMarker) {
+ if (fm.IsFolded) {
+ doFold = false;
+ break;
+ }
+ }
+ foreach (FoldMarker fm in textArea.Document.FoldingManager.FoldMarker) {
+ fm.IsFolded = doFold;
+ }
+ textArea.Document.FoldingManager.NotifyFoldingsChanged(EventArgs.Empty);
+ }
+ }
+
+ public class ShowDefinitionsOnly : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ foreach (FoldMarker fm in textArea.Document.FoldingManager.FoldMarker) {
+ fm.IsFolded = fm.FoldType == FoldType.MemberBody || fm.FoldType == FoldType.Region;
+ }
+ textArea.Document.FoldingManager.NotifyFoldingsChanged(EventArgs.Empty);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FormatActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FormatActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/FormatActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,219 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Text;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public abstract class AbstractLineFormatAction : AbstractEditAction
+ {
+ protected TextArea textArea;
+ abstract protected void Convert(IDocument document, int startLine, int endLine);
+
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.SelectionIsReadonly) {
+ return;
+ }
+ this.textArea = textArea;
+ textArea.BeginUpdate();
+ textArea.Document.UndoStack.StartUndoGroup();
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ Convert(textArea.Document, selection.StartPosition.Y, selection.EndPosition.Y);
+ }
+ } else {
+ Convert(textArea.Document, 0, textArea.Document.TotalNumberOfLines - 1);
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+ textArea.Caret.ValidateCaretPos();
+ textArea.EndUpdate();
+ textArea.Refresh();
+ }
+ }
+
+ public abstract class AbstractSelectionFormatAction : AbstractEditAction
+ {
+ protected TextArea textArea;
+ abstract protected void Convert(IDocument document, int offset, int length);
+
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.SelectionIsReadonly) {
+ return;
+ }
+ this.textArea = textArea;
+ textArea.BeginUpdate();
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ Convert(textArea.Document, selection.Offset, selection.Length);
+ }
+ } else {
+ Convert(textArea.Document, 0, textArea.Document.TextLength);
+ }
+ textArea.Caret.ValidateCaretPos();
+ textArea.EndUpdate();
+ textArea.Refresh();
+ }
+ }
+
+ public class RemoveLeadingWS : AbstractLineFormatAction
+ {
+ protected override void Convert(IDocument document, int y1, int y2)
+ {
+ for (int i = y1; i < y2; ++i) {
+ LineSegment line = document.GetLineSegment(i);
+ int removeNumber = 0;
+ for (int x = line.Offset; x < line.Offset + line.Length && Char.IsWhiteSpace(document.GetCharAt(x)); ++x) {
+ ++removeNumber;
+ }
+ if (removeNumber > 0) {
+ document.Remove(line.Offset, removeNumber);
+ }
+ }
+ }
+ }
+
+ public class RemoveTrailingWS : AbstractLineFormatAction
+ {
+ protected override void Convert(IDocument document, int y1, int y2)
+ {
+ for (int i = y2 - 1; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ int removeNumber = 0;
+ for (int x = line.Offset + line.Length - 1; x >= line.Offset && Char.IsWhiteSpace(document.GetCharAt(x)); --x) {
+ ++removeNumber;
+ }
+ if (removeNumber > 0) {
+ document.Remove(line.Offset + line.Length - removeNumber, removeNumber);
+ }
+ }
+ }
+ }
+
+
+ public class ToUpperCase : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ string what = document.GetText(startOffset, length).ToUpper();
+ document.Replace(startOffset, length, what);
+ }
+ }
+
+ public class ToLowerCase : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ string what = document.GetText(startOffset, length).ToLower();
+ document.Replace(startOffset, length, what);
+ }
+ }
+
+ public class InvertCaseAction : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ StringBuilder what = new StringBuilder(document.GetText(startOffset, length));
+
+ for (int i = 0; i < what.Length; ++i) {
+ what[i] = Char.IsUpper(what[i]) ? Char.ToLower(what[i]) : Char.ToUpper(what[i]);
+ }
+
+ document.Replace(startOffset, length, what.ToString());
+ }
+ }
+
+ public class CapitalizeAction : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ StringBuilder what = new StringBuilder(document.GetText(startOffset, length));
+
+ for (int i = 0; i < what.Length; ++i) {
+ if (!Char.IsLetter(what[i]) && i < what.Length - 1) {
+ what[i + 1] = Char.ToUpper(what[i + 1]);
+ }
+ }
+ document.Replace(startOffset, length, what.ToString());
+ }
+
+ }
+
+ public class ConvertTabsToSpaces : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ string what = document.GetText(startOffset, length);
+ string spaces = new string(' ', document.TextEditorProperties.TabIndent);
+ document.Replace(startOffset, length, what.Replace("\t", spaces));
+ }
+ }
+
+ public class ConvertSpacesToTabs : AbstractSelectionFormatAction
+ {
+ protected override void Convert(IDocument document, int startOffset, int length)
+ {
+ string what = document.GetText(startOffset, length);
+ string spaces = new string(' ', document.TextEditorProperties.TabIndent);
+ document.Replace(startOffset, length, what.Replace(spaces, "\t"));
+ }
+ }
+
+ public class ConvertLeadingTabsToSpaces : AbstractLineFormatAction
+ {
+ protected override void Convert(IDocument document, int y1, int y2)
+ {
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+
+ if(line.Length > 0) {
+ // count how many whitespace characters there are at the start
+ int whiteSpace = 0;
+ for(whiteSpace = 0; whiteSpace < line.Length && Char.IsWhiteSpace(document.GetCharAt(line.Offset + whiteSpace)); whiteSpace++) {
+ // deliberately empty
+ }
+ if(whiteSpace > 0) {
+ string newLine = document.GetText(line.Offset,whiteSpace);
+ string newPrefix = newLine.Replace("\t",new string(' ', document.TextEditorProperties.TabIndent));
+ document.Replace(line.Offset,whiteSpace,newPrefix);
+ }
+ }
+ }
+ }
+ }
+
+ public class ConvertLeadingSpacesToTabs : AbstractLineFormatAction
+ {
+ protected override void Convert(IDocument document, int y1, int y2)
+ {
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if(line.Length > 0) {
+ // note: some users may prefer a more radical ConvertLeadingSpacesToTabs that
+ // means there can be no spaces before the first character even if the spaces
+ // didn't add up to a whole number of tabs
+ string newLine = TextUtilities.LeadingWhiteSpaceToTabs(document.GetText(line.Offset,line.Length), document.TextEditorProperties.TabIndent);
+ document.Replace(line.Offset,line.Length,newLine);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// This is a sample editaction plugin, it indents the selected area.
+ /// </summary>
+ public class IndentSelection : AbstractLineFormatAction
+ {
+ protected override void Convert(IDocument document, int startLine, int endLine)
+ {
+ document.FormattingStrategy.IndentLines(textArea, startLine, endLine);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/HomeEndActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/HomeEndActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/HomeEndActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,114 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class Home : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ LineSegment curLine;
+ TextLocation newPos = textArea.Caret.Position;
+ bool jumpedIntoFolding = false;
+ do {
+ curLine = textArea.Document.GetLineSegment(newPos.Y);
+
+ if (TextUtilities.IsEmptyLine(textArea.Document, newPos.Y)) {
+ if (newPos.X != 0) {
+ newPos.X = 0;
+ } else {
+ newPos.X = curLine.Length;
+ }
+ } else {
+ int firstCharOffset = TextUtilities.GetFirstNonWSChar(textArea.Document, curLine.Offset);
+ int firstCharColumn = firstCharOffset - curLine.Offset;
+
+ if (newPos.X == firstCharColumn) {
+ newPos.X = 0;
+ } else {
+ newPos.X = firstCharColumn;
+ }
+ }
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(newPos.Y, newPos.X);
+ jumpedIntoFolding = false;
+ foreach (FoldMarker foldMarker in foldings) {
+ if (foldMarker.IsFolded) {
+ newPos = new TextLocation(foldMarker.StartColumn, foldMarker.StartLine);
+ jumpedIntoFolding = true;
+ break;
+ }
+ }
+
+ } while (jumpedIntoFolding);
+
+ if (newPos != textArea.Caret.Position) {
+ textArea.Caret.Position = newPos;
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+
+ public class End : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ LineSegment curLine;
+ TextLocation newPos = textArea.Caret.Position;
+ bool jumpedIntoFolding = false;
+ do {
+ curLine = textArea.Document.GetLineSegment(newPos.Y);
+ newPos.X = curLine.Length;
+
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(newPos.Y, newPos.X);
+ jumpedIntoFolding = false;
+ foreach (FoldMarker foldMarker in foldings) {
+ if (foldMarker.IsFolded) {
+ newPos = new TextLocation(foldMarker.EndColumn, foldMarker.EndLine);
+ jumpedIntoFolding = true;
+ break;
+ }
+ }
+ } while (jumpedIntoFolding);
+
+ if (newPos != textArea.Caret.Position) {
+ textArea.Caret.Position = newPos;
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+
+
+ public class MoveToStart : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Caret.Line != 0 || textArea.Caret.Column != 0) {
+ textArea.Caret.Position = new TextLocation(0, 0);
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+
+
+ public class MoveToEnd : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation endPos = textArea.Document.OffsetToPosition(textArea.Document.TextLength);
+ if (textArea.Caret.Position != endPos) {
+ textArea.Caret.Position = endPos;
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/IEditAction.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/IEditAction.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/IEditAction.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,58 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ /// <summary>
+ /// To define a new key for the textarea, you must write a class which
+ /// implements this interface.
+ /// </summary>
+ public interface IEditAction
+ {
+ /// <value>
+ /// An array of keys on which this edit action occurs.
+ /// </value>
+ Keys[] Keys {
+ get;
+ set;
+ }
+
+ /// <remarks>
+ /// When the key which is defined per XML is pressed, this method will be launched.
+ /// </remarks>
+ void Execute(TextArea textArea);
+ }
+
+ /// <summary>
+ /// To define a new key for the textarea, you must write a class which
+ /// implements this interface.
+ /// </summary>
+ public abstract class AbstractEditAction : IEditAction
+ {
+ Keys[] keys = null;
+
+ /// <value>
+ /// An array of keys on which this edit action occurs.
+ /// </value>
+ public Keys[] Keys {
+ get {
+ return keys;
+ }
+ set {
+ keys = value;
+ }
+ }
+
+ /// <remarks>
+ /// When the key which is defined per XML is pressed, this method will be launched.
+ /// </remarks>
+ public abstract void Execute(TextArea textArea);
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/MiscActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/MiscActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/MiscActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,902 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.Text;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class Tab : AbstractEditAction
+ {
+ public static string GetIndentationString(IDocument document)
+ {
+ return GetIndentationString(document, null);
+ }
+
+ public static string GetIndentationString(IDocument document, TextArea textArea)
+ {
+ StringBuilder indent = new StringBuilder();
+
+ if (document.TextEditorProperties.ConvertTabsToSpaces) {
+ int tabIndent = document.TextEditorProperties.IndentationSize;
+ if (textArea != null) {
+ int column = textArea.TextView.GetVisualColumn(textArea.Caret.Line, textArea.Caret.Column);
+ indent.Append(new String(' ', tabIndent - column % tabIndent));
+ } else {
+ indent.Append(new String(' ', tabIndent));
+ }
+ } else {
+ indent.Append('\t');
+ }
+ return indent.ToString();
+ }
+
+ void InsertTabs(IDocument document, ISelection selection, int y1, int y2)
+ {
+ string indentationString = GetIndentationString(document);
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if (i == y2 && i == selection.EndPosition.Y && selection.EndPosition.X == 0) {
+ continue;
+ }
+
+ // this bit is optional - but useful if you are using block tabbing to sort out
+ // a source file with a mixture of tabs and spaces
+// string newLine = document.GetText(line.Offset,line.Length);
+// document.Replace(line.Offset,line.Length,newLine);
+
+ document.Insert(line.Offset, indentationString);
+ }
+ }
+
+ void InsertTabAtCaretPosition(TextArea textArea)
+ {
+ switch (textArea.Caret.CaretMode) {
+ case CaretMode.InsertMode:
+ textArea.InsertString(GetIndentationString(textArea.Document, textArea));
+ break;
+ case CaretMode.OverwriteMode:
+ string indentStr = GetIndentationString(textArea.Document, textArea);
+ textArea.ReplaceChar(indentStr[0]);
+ if (indentStr.Length > 1) {
+ textArea.InsertString(indentStr.Substring(1));
+ }
+ break;
+ }
+ textArea.SetDesiredColumn();
+ }
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.SelectionIsReadonly) {
+ return;
+ }
+ textArea.Document.UndoStack.StartUndoGroup();
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ int startLine = selection.StartPosition.Y;
+ int endLine = selection.EndPosition.Y;
+ if (startLine != endLine) {
+ textArea.BeginUpdate();
+ InsertTabs(textArea.Document, selection, startLine, endLine);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, startLine, endLine));
+ textArea.EndUpdate();
+ } else {
+ InsertTabAtCaretPosition(textArea);
+ break;
+ }
+ }
+ textArea.Document.CommitUpdate();
+ textArea.AutoClearSelection = false;
+ } else {
+ InsertTabAtCaretPosition(textArea);
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+ }
+ }
+
+ public class ShiftTab : AbstractEditAction
+ {
+ void RemoveTabs(IDocument document, ISelection selection, int y1, int y2)
+ {
+ document.UndoStack.StartUndoGroup();
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if (i == y2 && line.Offset == selection.EndOffset) {
+ continue;
+ }
+ if (line.Length > 0) {
+ /**** TextPad Strategy:
+ /// first convert leading whitespace to tabs (controversial! - not all editors work like this)
+ string newLine = TextUtilities.LeadingWhiteSpaceToTabs(document.GetText(line.Offset,line.Length),document.Properties.Get("TabIndent", 4));
+ if(newLine.Length > 0 && newLine[0] == '\t') {
+ document.Replace(line.Offset,line.Length,newLine.Substring(1));
+ ++redocounter;
+ }
+ else if(newLine.Length > 0 && newLine[0] == ' ') {
+ /// there were just some leading spaces but less than TabIndent of them
+ int leadingSpaces = 1;
+ for(leadingSpaces = 1; leadingSpaces < newLine.Length && newLine[leadingSpaces] == ' '; leadingSpaces++) {
+ /// deliberately empty
+ }
+ document.Replace(line.Offset,line.Length,newLine.Substring(leadingSpaces));
+ ++redocounter;
+ }
+ /// else
+ /// there were no leading tabs or spaces on this line so do nothing
+ /// MS Visual Studio 6 strategy:
+ ****/
+// string temp = document.GetText(line.Offset,line.Length);
+ if (line.Length > 0) {
+ int charactersToRemove = 0;
+ if(document.GetCharAt(line.Offset) == '\t') { // first character is a tab - just remove it
+ charactersToRemove = 1;
+ } else if(document.GetCharAt(line.Offset) == ' ') {
+ int leadingSpaces = 1;
+ int tabIndent = document.TextEditorProperties.IndentationSize;
+ for (leadingSpaces = 1; leadingSpaces < line.Length && document.GetCharAt(line.Offset + leadingSpaces) == ' '; leadingSpaces++) {
+ // deliberately empty
+ }
+ if(leadingSpaces >= tabIndent) {
+ // just remove tabIndent
+ charactersToRemove = tabIndent;
+ }
+ else if(line.Length > leadingSpaces && document.GetCharAt(line.Offset + leadingSpaces) == '\t') {
+ // remove the leading spaces and the following tab as they add up
+ // to just one tab stop
+ charactersToRemove = leadingSpaces+1;
+ }
+ else {
+ // just remove the leading spaces
+ charactersToRemove = leadingSpaces;
+ }
+ }
+ if (charactersToRemove > 0) {
+ document.Remove(line.Offset,charactersToRemove);
+ }
+ }
+ }
+ }
+ document.UndoStack.EndUndoGroup();
+ }
+
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ int startLine = selection.StartPosition.Y;
+ int endLine = selection.EndPosition.Y;
+ textArea.BeginUpdate();
+ RemoveTabs(textArea.Document, selection, startLine, endLine);
+ textArea.Document.UpdateQueue.Clear();
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, startLine, endLine));
+ textArea.EndUpdate();
+
+ }
+ textArea.AutoClearSelection = false;
+ } else {
+ // Pressing Shift-Tab with nothing selected the cursor will move back to the
+ // previous tab stop. It will stop at the beginning of the line. Also, the desired
+ // column is updated to that column.
+ LineSegment line = textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
+ string startOfLine = textArea.Document.GetText(line.Offset,textArea.Caret.Offset - line.Offset);
+ int tabIndent = textArea.Document.TextEditorProperties.IndentationSize;
+ int currentColumn = textArea.Caret.Column;
+ int remainder = currentColumn % tabIndent;
+ if (remainder == 0) {
+ textArea.Caret.DesiredColumn = Math.Max(0, currentColumn - tabIndent);
+ } else {
+ textArea.Caret.DesiredColumn = Math.Max(0, currentColumn - remainder);
+ }
+ textArea.SetCaretToDesiredColumn();
+ }
+ }
+ }
+
+ public class ToggleComment : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+
+ if (textArea.Document.HighlightingStrategy.Properties.ContainsKey("LineComment")) {
+ new ToggleLineComment().Execute(textArea);
+ } else if (textArea.Document.HighlightingStrategy.Properties.ContainsKey("BlockCommentBegin") &&
+ textArea.Document.HighlightingStrategy.Properties.ContainsKey("BlockCommentBegin")) {
+ new ToggleBlockComment().Execute(textArea);
+ }
+ }
+ }
+
+ public class ToggleLineComment : AbstractEditAction
+ {
+ int firstLine;
+ int lastLine;
+
+ void RemoveCommentAt(IDocument document, string comment, ISelection selection, int y1, int y2)
+ {
+ firstLine = y1;
+ lastLine = y2;
+
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if (selection != null && i == y2 && line.Offset == selection.Offset + selection.Length) {
+ --lastLine;
+ continue;
+ }
+
+ string lineText = document.GetText(line.Offset, line.Length);
+ if (lineText.Trim().StartsWith(comment)) {
+ document.Remove(line.Offset + lineText.IndexOf(comment), comment.Length);
+ }
+ }
+ }
+
+ void SetCommentAt(IDocument document, string comment, ISelection selection, int y1, int y2)
+ {
+ firstLine = y1;
+ lastLine = y2;
+
+ for (int i = y2; i >= y1; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if (selection != null && i == y2 && line.Offset == selection.Offset + selection.Length) {
+ --lastLine;
+ continue;
+ }
+
+ string lineText = document.GetText(line.Offset, line.Length);
+ document.Insert(line.Offset, comment);
+ }
+ }
+
+ bool ShouldComment(IDocument document, string comment, ISelection selection, int startLine, int endLine)
+ {
+ for (int i = endLine; i >= startLine; --i) {
+ LineSegment line = document.GetLineSegment(i);
+ if (selection != null && i == endLine && line.Offset == selection.Offset + selection.Length) {
+ --lastLine;
+ continue;
+ }
+ string lineText = document.GetText(line.Offset, line.Length);
+ if (!lineText.Trim().StartsWith(comment)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+
+ string comment = null;
+ if (textArea.Document.HighlightingStrategy.Properties.ContainsKey("LineComment")) {
+ comment = textArea.Document.HighlightingStrategy.Properties["LineComment"].ToString();
+ }
+
+ if (comment == null || comment.Length == 0) {
+ return;
+ }
+
+ textArea.Document.UndoStack.StartUndoGroup();
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ bool shouldComment = true;
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ if (!ShouldComment(textArea.Document, comment, selection, selection.StartPosition.Y, selection.EndPosition.Y)) {
+ shouldComment = false;
+ break;
+ }
+ }
+
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ textArea.BeginUpdate();
+ if (shouldComment) {
+ SetCommentAt(textArea.Document, comment, selection, selection.StartPosition.Y, selection.EndPosition.Y);
+ } else {
+ RemoveCommentAt(textArea.Document, comment, selection, selection.StartPosition.Y, selection.EndPosition.Y);
+ }
+ textArea.Document.UpdateQueue.Clear();
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, firstLine, lastLine));
+ textArea.EndUpdate();
+ }
+ textArea.Document.CommitUpdate();
+ textArea.AutoClearSelection = false;
+ } else {
+ textArea.BeginUpdate();
+ int caretLine = textArea.Caret.Line;
+ if (ShouldComment(textArea.Document, comment, null, caretLine, caretLine)) {
+ SetCommentAt(textArea.Document, comment, null, caretLine, caretLine);
+ } else {
+ RemoveCommentAt(textArea.Document, comment, null, caretLine, caretLine);
+ }
+ textArea.Document.UpdateQueue.Clear();
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, caretLine));
+ textArea.EndUpdate();
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+ }
+ }
+
+ public class ToggleBlockComment : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+
+ string commentStart = null;
+ if (textArea.Document.HighlightingStrategy.Properties.ContainsKey("BlockCommentBegin")) {
+ commentStart = textArea.Document.HighlightingStrategy.Properties["BlockCommentBegin"].ToString();
+ }
+
+ string commentEnd = null;
+ if (textArea.Document.HighlightingStrategy.Properties.ContainsKey("BlockCommentEnd")) {
+ commentEnd = textArea.Document.HighlightingStrategy.Properties["BlockCommentEnd"].ToString();
+ }
+
+ if (commentStart == null || commentStart.Length == 0 || commentEnd == null || commentEnd.Length == 0) {
+ return;
+ }
+
+ int selectionStartOffset;
+ int selectionEndOffset;
+
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ selectionStartOffset = textArea.SelectionManager.SelectionCollection[0].Offset;
+ selectionEndOffset = textArea.SelectionManager.SelectionCollection[textArea.SelectionManager.SelectionCollection.Count - 1].EndOffset;
+ } else {
+ selectionStartOffset = textArea.Caret.Offset;
+ selectionEndOffset = selectionStartOffset;
+ }
+
+ BlockCommentRegion commentRegion = FindSelectedCommentRegion(textArea.Document, commentStart, commentEnd, selectionStartOffset, selectionEndOffset);
+
+ textArea.Document.UndoStack.StartUndoGroup();
+ if (commentRegion != null) {
+ RemoveComment(textArea.Document, commentRegion);
+ } else if (textArea.SelectionManager.HasSomethingSelected) {
+ SetCommentAt(textArea.Document, selectionStartOffset, selectionEndOffset, commentStart, commentEnd);
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+
+ textArea.Document.CommitUpdate();
+ textArea.AutoClearSelection = false;
+ }
+
+ public static BlockCommentRegion FindSelectedCommentRegion(IDocument document, string commentStart, string commentEnd, int selectionStartOffset, int selectionEndOffset)
+ {
+ if (document.TextLength == 0) {
+ return null;
+ }
+
+ // Find start of comment in selected text.
+
+ int commentEndOffset = -1;
+ string selectedText = document.GetText(selectionStartOffset, selectionEndOffset - selectionStartOffset);
+
+ int commentStartOffset = selectedText.IndexOf(commentStart);
+ if (commentStartOffset >= 0) {
+ commentStartOffset += selectionStartOffset;
+ }
+
+ // Find end of comment in selected text.
+
+ if (commentStartOffset >= 0) {
+ commentEndOffset = selectedText.IndexOf(commentEnd, commentStartOffset + commentStart.Length - selectionStartOffset);
+ } else {
+ commentEndOffset = selectedText.IndexOf(commentEnd);
+ }
+
+ if (commentEndOffset >= 0) {
+ commentEndOffset += selectionStartOffset;
+ }
+
+ // Find start of comment before or partially inside the
+ // selected text.
+
+ int commentEndBeforeStartOffset = -1;
+ if (commentStartOffset == -1) {
+ int offset = selectionEndOffset + commentStart.Length - 1;
+ if (offset > document.TextLength) {
+ offset = document.TextLength;
+ }
+ string text = document.GetText(0, offset);
+ commentStartOffset = text.LastIndexOf(commentStart);
+ if (commentStartOffset >= 0) {
+ // Find end of comment before comment start.
+ commentEndBeforeStartOffset = text.IndexOf(commentEnd, commentStartOffset, selectionStartOffset - commentStartOffset);
+ if (commentEndBeforeStartOffset > commentStartOffset) {
+ commentStartOffset = -1;
+ }
+ }
+ }
+
+ // Find end of comment after or partially after the
+ // selected text.
+
+ if (commentEndOffset == -1) {
+ int offset = selectionStartOffset + 1 - commentEnd.Length;
+ if (offset < 0) {
+ offset = selectionStartOffset;
+ }
+ string text = document.GetText(offset, document.TextLength - offset);
+ commentEndOffset = text.IndexOf(commentEnd);
+ if (commentEndOffset >= 0) {
+ commentEndOffset += offset;
+ }
+ }
+
+ if (commentStartOffset != -1 && commentEndOffset != -1) {
+ return new BlockCommentRegion(commentStart, commentEnd, commentStartOffset, commentEndOffset);
+ }
+
+ return null;
+ }
+
+
+ void SetCommentAt(IDocument document, int offsetStart, int offsetEnd, string commentStart, string commentEnd)
+ {
+ document.Insert(offsetEnd, commentEnd);
+ document.Insert(offsetStart, commentStart);
+ }
+
+ void RemoveComment(IDocument document, BlockCommentRegion commentRegion)
+ {
+ document.Remove(commentRegion.EndOffset, commentRegion.CommentEnd.Length);
+ document.Remove(commentRegion.StartOffset, commentRegion.CommentStart.Length);
+ }
+ }
+
+ public class BlockCommentRegion
+ {
+ string commentStart = String.Empty;
+ string commentEnd = String.Empty;
+ int startOffset = -1;
+ int endOffset = -1;
+
+ /// <summary>
+ /// The end offset is the offset where the comment end string starts from.
+ /// </summary>
+ public BlockCommentRegion(string commentStart, string commentEnd, int startOffset, int endOffset)
+ {
+ this.commentStart = commentStart;
+ this.commentEnd = commentEnd;
+ this.startOffset = startOffset;
+ this.endOffset = endOffset;
+ }
+
+ public string CommentStart {
+ get {
+ return commentStart;
+ }
+ }
+
+ public string CommentEnd {
+ get {
+ return commentEnd;
+ }
+ }
+
+ public int StartOffset {
+ get {
+ return startOffset;
+ }
+ }
+
+ public int EndOffset {
+ get {
+ return endOffset;
+ }
+ }
+
+ public override int GetHashCode()
+ {
+ int hashCode = 0;
+ unchecked {
+ if (commentStart != null) hashCode += 1000000007 * commentStart.GetHashCode();
+ if (commentEnd != null) hashCode += 1000000009 * commentEnd.GetHashCode();
+ hashCode += 1000000021 * startOffset.GetHashCode();
+ hashCode += 1000000033 * endOffset.GetHashCode();
+ }
+ return hashCode;
+ }
+
+ public override bool Equals(object obj)
+ {
+ BlockCommentRegion other = obj as BlockCommentRegion;
+ if (other == null) return false;
+ return this.commentStart == other.commentStart && this.commentEnd == other.commentEnd && this.startOffset == other.startOffset && this.endOffset == other.endOffset;
+ }
+ }
+
+ public class Backspace : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ Delete.DeleteSelection(textArea);
+ } else {
+ if (textArea.Caret.Offset > 0 && !textArea.IsReadOnly(textArea.Caret.Offset - 1)) {
+ textArea.BeginUpdate();
+ int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
+ int curLineOffset = textArea.Document.GetLineSegment(curLineNr).Offset;
+
+ if (curLineOffset == textArea.Caret.Offset) {
+ LineSegment line = textArea.Document.GetLineSegment(curLineNr - 1);
+ bool lastLine = curLineNr == textArea.Document.TotalNumberOfLines;
+ int lineEndOffset = line.Offset + line.Length;
+ int lineLength = line.Length;
+ textArea.Document.Remove(lineEndOffset, curLineOffset - lineEndOffset);
+ textArea.Caret.Position = new TextLocation(lineLength, curLineNr - 1);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, curLineNr - 1)));
+ } else {
+ int caretOffset = textArea.Caret.Offset - 1;
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(caretOffset);
+ textArea.Document.Remove(caretOffset, 1);
+
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToLineEnd, new TextLocation(textArea.Caret.Offset - textArea.Document.GetLineSegment(curLineNr).Offset, curLineNr)));
+ }
+ textArea.EndUpdate();
+ }
+ }
+ }
+ }
+
+ public class Delete : AbstractEditAction
+ {
+ internal static void DeleteSelection(TextArea textArea)
+ {
+ Debug.Assert(textArea.SelectionManager.HasSomethingSelected);
+ if (textArea.SelectionManager.SelectionIsReadonly)
+ return;
+ textArea.BeginUpdate();
+ textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
+ textArea.SelectionManager.RemoveSelectedText();
+ textArea.ScrollToCaret();
+ textArea.EndUpdate();
+ }
+
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ DeleteSelection(textArea);
+ } else {
+ if (textArea.IsReadOnly(textArea.Caret.Offset))
+ return;
+
+ if (textArea.Caret.Offset < textArea.Document.TextLength) {
+ textArea.BeginUpdate();
+ int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
+ LineSegment curLine = textArea.Document.GetLineSegment(curLineNr);
+
+ if (curLine.Offset + curLine.Length == textArea.Caret.Offset) {
+ if (curLineNr + 1 < textArea.Document.TotalNumberOfLines) {
+ LineSegment nextLine = textArea.Document.GetLineSegment(curLineNr + 1);
+
+ textArea.Document.Remove(textArea.Caret.Offset, nextLine.Offset - textArea.Caret.Offset);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, curLineNr)));
+ }
+ } else {
+ textArea.Document.Remove(textArea.Caret.Offset, 1);
+// textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToLineEnd, new TextLocation(textArea.Caret.Offset - textArea.Document.GetLineSegment(curLineNr).Offset, curLineNr)));
+ }
+ textArea.UpdateMatchingBracket();
+ textArea.EndUpdate();
+ }
+ }
+ }
+ }
+
+ public class MovePageDown : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ int curLineNr = textArea.Caret.Line;
+ int requestedLineNumber = Math.Min(textArea.Document.GetNextVisibleLineAbove(curLineNr, textArea.TextView.VisibleLineCount), textArea.Document.TotalNumberOfLines - 1);
+
+ if (curLineNr != requestedLineNumber) {
+ textArea.Caret.Position = new TextLocation(0, requestedLineNumber);
+ textArea.SetCaretToDesiredColumn();
+ }
+ }
+ }
+
+ public class MovePageUp : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ int curLineNr = textArea.Caret.Line;
+ int requestedLineNumber = Math.Max(textArea.Document.GetNextVisibleLineBelow(curLineNr, textArea.TextView.VisibleLineCount), 0);
+
+ if (curLineNr != requestedLineNumber) {
+ textArea.Caret.Position = new TextLocation(0, requestedLineNumber);
+ textArea.SetCaretToDesiredColumn();
+ }
+ }
+ }
+ public class Return : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="TextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+ textArea.BeginUpdate();
+ textArea.Document.UndoStack.StartUndoGroup();
+ try {
+ if (textArea.HandleKeyPress('\n'))
+ return;
+
+ textArea.InsertString(Environment.NewLine);
+
+ int curLineNr = textArea.Caret.Line;
+ textArea.Document.FormattingStrategy.FormatLine(textArea, curLineNr, textArea.Caret.Offset, '\n');
+ textArea.SetDesiredColumn();
+
+ textArea.Document.UpdateQueue.Clear();
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, curLineNr - 1)));
+ } finally {
+ textArea.Document.UndoStack.EndUndoGroup();
+ textArea.EndUpdate();
+ }
+ }
+ }
+
+ public class ToggleEditMode : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.Document.ReadOnly) {
+ return;
+ }
+ switch (textArea.Caret.CaretMode) {
+ case CaretMode.InsertMode:
+ textArea.Caret.CaretMode = CaretMode.OverwriteMode;
+ break;
+ case CaretMode.OverwriteMode:
+ textArea.Caret.CaretMode = CaretMode.InsertMode;
+ break;
+ }
+ }
+ }
+
+ public class Undo : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ textArea.MotherTextEditorControl.Undo();
+ }
+ }
+
+ public class Redo : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ textArea.MotherTextEditorControl.Redo();
+ }
+ }
+
+ /// <summary>
+ /// handles the ctrl-backspace key
+ /// functionality attempts to roughly mimic MS Developer studio
+ /// I will implement this as deleting back to the point that ctrl-leftarrow would
+ /// take you to
+ /// </summary>
+ public class WordBackspace : AbstractEditAction
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ // if anything is selected we will just delete it first
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ Delete.DeleteSelection(textArea);
+ return;
+ }
+ textArea.BeginUpdate();
+ // now delete from the caret to the beginning of the word
+ LineSegment line =
+ textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
+ // if we are not at the beginning of a line
+ if (textArea.Caret.Offset > line.Offset) {
+ int prevWordStart = TextUtilities.FindPrevWordStart(textArea.Document,
+ textArea.Caret.Offset);
+ if (prevWordStart < textArea.Caret.Offset) {
+ if (!textArea.IsReadOnly(prevWordStart, textArea.Caret.Offset - prevWordStart)) {
+ textArea.Document.Remove(prevWordStart,
+ textArea.Caret.Offset - prevWordStart);
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(prevWordStart);
+ }
+ }
+ }
+ // if we are now at the beginning of a line
+ if (textArea.Caret.Offset == line.Offset) {
+ // if we are not on the first line
+ int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
+ if (curLineNr > 0) {
+ // move to the end of the line above
+ LineSegment lineAbove = textArea.Document.GetLineSegment(curLineNr - 1);
+ int endOfLineAbove = lineAbove.Offset + lineAbove.Length;
+ int charsToDelete = textArea.Caret.Offset - endOfLineAbove;
+ if (!textArea.IsReadOnly(endOfLineAbove, charsToDelete)) {
+ textArea.Document.Remove(endOfLineAbove, charsToDelete);
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(endOfLineAbove);
+ }
+ }
+ }
+ textArea.SetDesiredColumn();
+ textArea.EndUpdate();
+ // if there are now less lines, we need this or there are redraw problems
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset))));
+ textArea.Document.CommitUpdate();
+ }
+ }
+
+ /// <summary>
+ /// handles the ctrl-delete key
+ /// functionality attempts to mimic MS Developer studio
+ /// I will implement this as deleting forwardto the point that
+ /// ctrl-leftarrow would take you to
+ /// </summary>
+ public class DeleteWord : Delete
+ {
+ /// <remarks>
+ /// Executes this edit action
+ /// </remarks>
+ /// <param name="textArea">The <see cref="ItextArea"/> which is used for callback purposes</param>
+ public override void Execute(TextArea textArea)
+ {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ DeleteSelection(textArea);
+ return;
+ }
+ // if anything is selected we will just delete it first
+ textArea.BeginUpdate();
+ // now delete from the caret to the beginning of the word
+ LineSegment line = textArea.Document.GetLineSegmentForOffset(textArea.Caret.Offset);
+ if(textArea.Caret.Offset == line.Offset + line.Length) {
+ // if we are at the end of a line
+ base.Execute(textArea);
+ } else {
+ int nextWordStart = TextUtilities.FindNextWordStart(textArea.Document,
+ textArea.Caret.Offset);
+ if(nextWordStart > textArea.Caret.Offset) {
+ if (!textArea.IsReadOnly(textArea.Caret.Offset, nextWordStart - textArea.Caret.Offset)) {
+ textArea.Document.Remove(textArea.Caret.Offset, nextWordStart - textArea.Caret.Offset);
+ // cursor never moves with this command
+ }
+ }
+ }
+ textArea.UpdateMatchingBracket();
+ textArea.EndUpdate();
+ // if there are now less lines, we need this or there are redraw problems
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset))));
+ textArea.Document.CommitUpdate();
+ }
+ }
+
+ public class DeleteLine : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ int lineNr = textArea.Caret.Line;
+ LineSegment line = textArea.Document.GetLineSegment(lineNr);
+ if (textArea.IsReadOnly(line.Offset, line.Length))
+ return;
+ textArea.Document.Remove(line.Offset, line.TotalLength);
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(line.Offset);
+
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, lineNr)));
+ textArea.UpdateMatchingBracket();
+ textArea.Document.CommitUpdate();
+ }
+ }
+
+ public class DeleteToLineEnd : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ int lineNr = textArea.Caret.Line;
+ LineSegment line = textArea.Document.GetLineSegment(lineNr);
+
+ int numRemove = (line.Offset + line.Length) - textArea.Caret.Offset;
+ if (numRemove > 0 && !textArea.IsReadOnly(textArea.Caret.Offset, numRemove)) {
+ textArea.Document.Remove(textArea.Caret.Offset, numRemove);
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, new TextLocation(0, lineNr)));
+ textArea.Document.CommitUpdate();
+ }
+ }
+ }
+
+ public class GotoMatchingBrace : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ Highlight highlight = textArea.FindMatchingBracketHighlight();
+ if (highlight != null) {
+ TextLocation p1 = new TextLocation(highlight.CloseBrace.X + 1, highlight.CloseBrace.Y);
+ TextLocation p2 = new TextLocation(highlight.OpenBrace.X + 1, highlight.OpenBrace.Y);
+ if (p1 == textArea.Caret.Position) {
+ if (textArea.Document.TextEditorProperties.BracketMatchingStyle == BracketMatchingStyle.After) {
+ textArea.Caret.Position = p2;
+ } else {
+ textArea.Caret.Position = new TextLocation(p2.X - 1, p2.Y);
+ }
+ } else {
+ if (textArea.Document.TextEditorProperties.BracketMatchingStyle == BracketMatchingStyle.After) {
+ textArea.Caret.Position = p1;
+ } else {
+ textArea.Caret.Position = new TextLocation(p1.X - 1, p1.Y);
+ }
+ }
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/SelectionActions.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/SelectionActions.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Actions/SelectionActions.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,176 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Actions
+{
+ public class ShiftCaretRight : CaretRight
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftCaretLeft : CaretLeft
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftCaretUp : CaretUp
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftCaretDown : CaretDown
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftWordRight : WordRight
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftWordLeft : WordLeft
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftHome : Home
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftEnd : End
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftMoveToStart : MoveToStart
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftMoveToEnd : MoveToEnd
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftMovePageUp : MovePageUp
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class ShiftMovePageDown : MovePageDown
+ {
+ public override void Execute(TextArea textArea)
+ {
+ TextLocation oldCaretPos = textArea.Caret.Position;
+ base.Execute(textArea);
+ textArea.AutoClearSelection = false;
+ textArea.SelectionManager.ExtendSelection(oldCaretPos, textArea.Caret.Position);
+ }
+ }
+
+ public class SelectWholeDocument : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.AutoClearSelection = false;
+ TextLocation startPoint = new TextLocation(0, 0);
+ TextLocation endPoint = textArea.Document.OffsetToPosition(textArea.Document.TextLength);
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ if (textArea.SelectionManager.SelectionCollection[0].StartPosition == startPoint &&
+ textArea.SelectionManager.SelectionCollection[0].EndPosition == endPoint) {
+ return;
+ }
+ }
+ textArea.Caret.Position = textArea.SelectionManager.NextValidPosition(endPoint.Y);
+ textArea.SelectionManager.ExtendSelection(startPoint, endPoint);
+ // after a SelectWholeDocument selection, the caret is placed correctly,
+ // but it is not positioned internally. The effect is when the cursor
+ // is moved up or down a line, the caret will take on the column that
+ // it was in before the SelectWholeDocument
+ textArea.SetDesiredColumn();
+ }
+ }
+
+ public class ClearAllSelections : AbstractEditAction
+ {
+ public override void Execute(TextArea textArea)
+ {
+ textArea.SelectionManager.ClearSelection();
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/AbstractSegment.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/AbstractSegment.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/AbstractSegment.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,52 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface is used to describe a span inside a text sequence
+ /// </summary>
+ public class AbstractSegment : ISegment
+ {
+ [CLSCompliant(false)]
+ protected int offset = -1;
+ [CLSCompliant(false)]
+ protected int length = -1;
+
+ #region ICSharpCode.TextEditor.Document.ISegment interface implementation
+ public virtual int Offset {
+ get {
+ return offset;
+ }
+ set {
+ offset = value;
+ }
+ }
+
+ public virtual int Length {
+ get {
+ return length;
+ }
+ set {
+ length = value;
+ }
+ }
+
+ #endregion
+
+ public override string ToString()
+ {
+ return String.Format("[AbstractSegment: Offset = {0}, Length = {1}]",
+ Offset,
+ Length);
+ }
+
+
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/Bookmark.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/Bookmark.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/Bookmark.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,164 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using SWF = System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Description of Bookmark.
+ /// </summary>
+ public class Bookmark
+ {
+ IDocument document;
+ TextAnchor anchor;
+ TextLocation location;
+ bool isEnabled = true;
+
+ public IDocument Document {
+ get {
+ return document;
+ }
+ set {
+ if (document != value) {
+ if (anchor != null) {
+ location = anchor.Location;
+ anchor = null;
+ }
+ document = value;
+ CreateAnchor();
+ OnDocumentChanged(EventArgs.Empty);
+ }
+ }
+ }
+
+ void CreateAnchor()
+ {
+ if (document != null) {
+ LineSegment line = document.GetLineSegment(Math.Max(0, Math.Min(location.Line, document.TotalNumberOfLines-1)));
+ anchor = line.CreateAnchor(Math.Max(0, Math.Min(location.Column, line.Length)));
+ // after insertion: keep bookmarks after the initial whitespace (see DefaultFormattingStrategy.SmartReplaceLine)
+ anchor.MovementType = AnchorMovementType.AfterInsertion;
+ anchor.Deleted += AnchorDeleted;
+ }
+ }
+
+ void AnchorDeleted(object sender, EventArgs e)
+ {
+ document.BookmarkManager.RemoveMark(this);
+ }
+
+ /// <summary>
+ /// Gets the TextAnchor used for this bookmark.
+ /// Is null if the bookmark is not connected to a document.
+ /// </summary>
+ public TextAnchor Anchor {
+ get { return anchor; }
+ }
+
+ public TextLocation Location {
+ get {
+ if (anchor != null)
+ return anchor.Location;
+ else
+ return location;
+ }
+ set {
+ location = value;
+ CreateAnchor();
+ }
+ }
+
+ public event EventHandler DocumentChanged;
+
+ protected virtual void OnDocumentChanged(EventArgs e)
+ {
+ if (DocumentChanged != null) {
+ DocumentChanged(this, e);
+ }
+ }
+
+ public bool IsEnabled {
+ get {
+ return isEnabled;
+ }
+ set {
+ if (isEnabled != value) {
+ isEnabled = value;
+ if (document != null) {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, LineNumber));
+ document.CommitUpdate();
+ }
+ OnIsEnabledChanged(EventArgs.Empty);
+ }
+ }
+ }
+
+ public event EventHandler IsEnabledChanged;
+
+ protected virtual void OnIsEnabledChanged(EventArgs e)
+ {
+ if (IsEnabledChanged != null) {
+ IsEnabledChanged(this, e);
+ }
+ }
+
+ public int LineNumber {
+ get {
+ if (anchor != null)
+ return anchor.LineNumber;
+ else
+ return location.Line;
+ }
+ }
+
+ public int ColumnNumber {
+ get {
+ if (anchor != null)
+ return anchor.ColumnNumber;
+ else
+ return location.Column;
+ }
+ }
+
+ /// <summary>
+ /// Gets if the bookmark can be toggled off using the 'set/unset bookmark' command.
+ /// </summary>
+ public virtual bool CanToggle {
+ get {
+ return true;
+ }
+ }
+
+ public Bookmark(IDocument document, TextLocation location) : this(document, location, true)
+ {
+ }
+
+ public Bookmark(IDocument document, TextLocation location, bool isEnabled)
+ {
+ this.document = document;
+ this.isEnabled = isEnabled;
+ this.Location = location;
+ }
+
+ public virtual bool Click(SWF.Control parent, SWF.MouseEventArgs e)
+ {
+ if (e.Button == SWF.MouseButtons.Left && CanToggle) {
+ document.BookmarkManager.RemoveMark(this);
+ return true;
+ }
+ return false;
+ }
+
+ public virtual void Draw(IconBarMargin margin, Graphics g, Point p)
+ {
+ margin.DrawBookmark(g, p.Y, isEnabled);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkEventHandler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkEventHandler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkEventHandler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,32 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public delegate void BookmarkEventHandler(object sender, BookmarkEventArgs e);
+
+ /// <summary>
+ /// Description of BookmarkEventHandler.
+ /// </summary>
+ public class BookmarkEventArgs : EventArgs
+ {
+ Bookmark bookmark;
+
+ public Bookmark Bookmark {
+ get {
+ return bookmark;
+ }
+ }
+
+ public BookmarkEventArgs(Bookmark bookmark)
+ {
+ this.bookmark = bookmark;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManager.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManager.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManager.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,246 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public interface IBookmarkFactory
+ {
+ Bookmark CreateBookmark(IDocument document, TextLocation location);
+ }
+
+ /// <summary>
+ /// This class handles the bookmarks for a buffer
+ /// </summary>
+ public class BookmarkManager
+ {
+ IDocument document;
+ #if DEBUG
+ IList<Bookmark> bookmark = new CheckedList<Bookmark>();
+ #else
+ List<Bookmark> bookmark = new List<Bookmark>();
+ #endif
+
+ /// <value>
+ /// Contains all bookmarks
+ /// </value>
+ public ReadOnlyCollection<Bookmark> Marks {
+ get {
+ return new ReadOnlyCollection<Bookmark>(bookmark);
+ }
+ }
+
+ public IDocument Document {
+ get {
+ return document;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="BookmarkManager"/>
+ /// </summary>
+ internal BookmarkManager(IDocument document, LineManager lineTracker)
+ {
+ this.document = document;
+ }
+
+ /// <summary>
+ /// Gets/Sets the bookmark factory used to create bookmarks for "ToggleMarkAt".
+ /// </summary>
+ public IBookmarkFactory Factory { get; set;}
+
+ /// <summary>
+ /// Sets the mark at the line <code>location.Line</code> if it is not set, if the
+ /// line is already marked the mark is cleared.
+ /// </summary>
+ public void ToggleMarkAt(TextLocation location)
+ {
+ Bookmark newMark;
+ if (Factory != null) {
+ newMark = Factory.CreateBookmark(document, location);
+ } else {
+ newMark = new Bookmark(document, location);
+ }
+
+ Type newMarkType = newMark.GetType();
+
+ for (int i = 0; i < bookmark.Count; ++i) {
+ Bookmark mark = bookmark[i];
+
+ if (mark.LineNumber == location.Line && mark.CanToggle && mark.GetType() == newMarkType) {
+ bookmark.RemoveAt(i);
+ OnRemoved(new BookmarkEventArgs(mark));
+ return;
+ }
+ }
+
+ bookmark.Add(newMark);
+ OnAdded(new BookmarkEventArgs(newMark));
+ }
+
+ public void AddMark(Bookmark mark)
+ {
+ bookmark.Add(mark);
+ OnAdded(new BookmarkEventArgs(mark));
+ }
+
+ public void RemoveMark(Bookmark mark)
+ {
+ bookmark.Remove(mark);
+ OnRemoved(new BookmarkEventArgs(mark));
+ }
+
+ public void RemoveMarks(Predicate<Bookmark> predicate)
+ {
+ for (int i = 0; i < bookmark.Count; ++i) {
+ Bookmark bm = bookmark[i];
+ if (predicate(bm)) {
+ bookmark.RemoveAt(i--);
+ OnRemoved(new BookmarkEventArgs(bm));
+ }
+ }
+ }
+
+ /// <returns>
+ /// true, if a mark at mark exists, otherwise false
+ /// </returns>
+ public bool IsMarked(int lineNr)
+ {
+ for (int i = 0; i < bookmark.Count; ++i) {
+ if (bookmark[i].LineNumber == lineNr) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /// <remarks>
+ /// Clears all bookmark
+ /// </remarks>
+ public void Clear()
+ {
+ foreach (Bookmark mark in bookmark) {
+ OnRemoved(new BookmarkEventArgs(mark));
+ }
+ bookmark.Clear();
+ }
+
+ /// <value>
+ /// The lowest mark, if no marks exists it returns -1
+ /// </value>
+ public Bookmark GetFirstMark(Predicate<Bookmark> predicate)
+ {
+ if (bookmark.Count < 1) {
+ return null;
+ }
+ Bookmark first = null;
+ for (int i = 0; i < bookmark.Count; ++i) {
+ if (predicate(bookmark[i]) && bookmark[i].IsEnabled && (first == null || bookmark[i].LineNumber < first.LineNumber)) {
+ first = bookmark[i];
+ }
+ }
+ return first;
+ }
+
+ /// <value>
+ /// The highest mark, if no marks exists it returns -1
+ /// </value>
+ public Bookmark GetLastMark(Predicate<Bookmark> predicate)
+ {
+ if (bookmark.Count < 1) {
+ return null;
+ }
+ Bookmark last = null;
+ for (int i = 0; i < bookmark.Count; ++i) {
+ if (predicate(bookmark[i]) && bookmark[i].IsEnabled && (last == null || bookmark[i].LineNumber > last.LineNumber)) {
+ last = bookmark[i];
+ }
+ }
+ return last;
+ }
+ bool AcceptAnyMarkPredicate(Bookmark mark)
+ {
+ return true;
+ }
+ public Bookmark GetNextMark(int curLineNr)
+ {
+ return GetNextMark(curLineNr, AcceptAnyMarkPredicate);
+ }
+
+ /// <remarks>
+ /// returns first mark higher than <code>lineNr</code>
+ /// </remarks>
+ /// <returns>
+ /// returns the next mark > cur, if it not exists it returns FirstMark()
+ /// </returns>
+ public Bookmark GetNextMark(int curLineNr, Predicate<Bookmark> predicate)
+ {
+ if (bookmark.Count == 0) {
+ return null;
+ }
+
+ Bookmark next = GetFirstMark(predicate);
+ foreach (Bookmark mark in bookmark) {
+ if (predicate(mark) && mark.IsEnabled && mark.LineNumber > curLineNr) {
+ if (mark.LineNumber < next.LineNumber || next.LineNumber <= curLineNr) {
+ next = mark;
+ }
+ }
+ }
+ return next;
+ }
+
+ public Bookmark GetPrevMark(int curLineNr)
+ {
+ return GetPrevMark(curLineNr, AcceptAnyMarkPredicate);
+ }
+ /// <remarks>
+ /// returns first mark lower than <code>lineNr</code>
+ /// </remarks>
+ /// <returns>
+ /// returns the next mark lower than cur, if it not exists it returns LastMark()
+ /// </returns>
+ public Bookmark GetPrevMark(int curLineNr, Predicate<Bookmark> predicate)
+ {
+ if (bookmark.Count == 0) {
+ return null;
+ }
+
+ Bookmark prev = GetLastMark(predicate);
+
+ foreach (Bookmark mark in bookmark) {
+ if (predicate(mark) && mark.IsEnabled && mark.LineNumber < curLineNr) {
+ if (mark.LineNumber > prev.LineNumber || prev.LineNumber >= curLineNr) {
+ prev = mark;
+ }
+ }
+ }
+ return prev;
+ }
+
+ protected virtual void OnRemoved(BookmarkEventArgs e)
+ {
+ if (Removed != null) {
+ Removed(this, e);
+ }
+ }
+
+ protected virtual void OnAdded(BookmarkEventArgs e)
+ {
+ if (Added != null) {
+ Added(this, e);
+ }
+ }
+
+ public event BookmarkEventHandler Removed;
+ public event BookmarkEventHandler Added;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManagerMemento.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManagerMemento.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/BookmarkManager/BookmarkManagerMemento.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,101 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This class is used for storing the state of a bookmark manager
+ /// </summary>
+ public class BookmarkManagerMemento
+ {
+ List<int> bookmarks = new List<int>();
+
+ /// <value>
+ /// Contains all bookmarks as int values
+ /// </value>
+ public List<int> Bookmarks {
+ get {
+ return bookmarks;
+ }
+ set {
+ bookmarks = value;
+ }
+ }
+
+ /// <summary>
+ /// Validates all bookmarks if they're in range of the document.
+ /// (removing all bookmarks < 0 and bookmarks > max. line number
+ /// </summary>
+ public void CheckMemento(IDocument document)
+ {
+ for (int i = 0; i < bookmarks.Count; ++i) {
+ int mark = (int)bookmarks[i];
+ if (mark < 0 || mark >= document.TotalNumberOfLines) {
+ bookmarks.RemoveAt(i);
+ --i;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="BookmarkManagerMemento"/>
+ /// </summary>
+ public BookmarkManagerMemento()
+ {
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="BookmarkManagerMemento"/>
+ /// </summary>
+ public BookmarkManagerMemento(XmlElement element)
+ {
+ foreach (XmlElement el in element.ChildNodes) {
+ bookmarks.Add(Int32.Parse(el.Attributes["line"].InnerText));
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="BookmarkManagerMemento"/>
+ /// </summary>
+ public BookmarkManagerMemento(List<int> bookmarks)
+ {
+ this.bookmarks = bookmarks;
+ }
+
+ /// <summary>
+ /// Converts a xml element to a <see cref="BookmarkManagerMemento"/> object
+ /// </summary>
+ public object FromXmlElement(XmlElement element)
+ {
+ return new BookmarkManagerMemento(element);
+ }
+
+ /// <summary>
+ /// Converts this <see cref="BookmarkManagerMemento"/> to a xml element
+ /// </summary>
+ public XmlElement ToXmlElement(XmlDocument doc)
+ {
+ XmlElement bookmarknode = doc.CreateElement("Bookmarks");
+
+ foreach (int line in bookmarks) {
+ XmlElement markNode = doc.CreateElement("Mark");
+
+ XmlAttribute lineAttr = doc.CreateAttribute("line");
+ lineAttr.InnerText = line.ToString();
+ markNode.Attributes.Append(lineAttr);
+
+ bookmarknode.AppendChild(markNode);
+ }
+
+ return bookmarknode;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultDocument.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultDocument.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultDocument.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,457 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+
+using ICSharpCode.TextEditor.Undo;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Describes the caret marker
+ /// </summary>
+ public enum LineViewerStyle {
+ /// <summary>
+ /// No line viewer will be displayed
+ /// </summary>
+ None,
+
+ /// <summary>
+ /// The row in which the caret is will be marked
+ /// </summary>
+ FullRow
+ }
+
+ /// <summary>
+ /// Describes the indent style
+ /// </summary>
+ public enum IndentStyle {
+ /// <summary>
+ /// No indentation occurs
+ /// </summary>
+ None,
+
+ /// <summary>
+ /// The indentation from the line above will be
+ /// taken to indent the curent line
+ /// </summary>
+ Auto,
+
+ /// <summary>
+ /// Inteligent, context sensitive indentation will occur
+ /// </summary>
+ Smart
+ }
+
+ /// <summary>
+ /// Describes the bracket highlighting style
+ /// </summary>
+ public enum BracketHighlightingStyle {
+
+ /// <summary>
+ /// Brackets won't be highlighted
+ /// </summary>
+ None,
+
+ /// <summary>
+ /// Brackets will be highlighted if the caret is on the bracket
+ /// </summary>
+ OnBracket,
+
+ /// <summary>
+ /// Brackets will be highlighted if the caret is after the bracket
+ /// </summary>
+ AfterBracket
+ }
+
+ /// <summary>
+ /// Describes the selection mode of the text area
+ /// </summary>
+ public enum DocumentSelectionMode {
+ /// <summary>
+ /// The 'normal' selection mode.
+ /// </summary>
+ Normal,
+
+ /// <summary>
+ /// Selections will be added to the current selection or new
+ /// ones will be created (multi-select mode)
+ /// </summary>
+ Additive
+ }
+
+ /// <summary>
+ /// The default <see cref="IDocument"/> implementation.
+ /// </summary>
+ internal sealed class DefaultDocument : IDocument
+ {
+ bool readOnly = false;
+
+ LineManager lineTrackingStrategy;
+ BookmarkManager bookmarkManager;
+ ITextBufferStrategy textBufferStrategy;
+ IFormattingStrategy formattingStrategy;
+ FoldingManager foldingManager;
+ UndoStack undoStack = new UndoStack();
+ ITextEditorProperties textEditorProperties = new DefaultTextEditorProperties();
+ MarkerStrategy markerStrategy;
+
+ public LineManager LineManager {
+ get { return lineTrackingStrategy; }
+ set { lineTrackingStrategy = value; }
+ }
+
+ public event EventHandler<LineLengthChangeEventArgs> LineLengthChanged {
+ add { lineTrackingStrategy.LineLengthChanged += value; }
+ remove { lineTrackingStrategy.LineLengthChanged -= value; }
+ }
+ public event EventHandler<LineCountChangeEventArgs> LineCountChanged {
+ add { lineTrackingStrategy.LineCountChanged += value; }
+ remove { lineTrackingStrategy.LineCountChanged -= value; }
+ }
+ public event EventHandler<LineEventArgs> LineDeleted {
+ add { lineTrackingStrategy.LineDeleted += value; }
+ remove { lineTrackingStrategy.LineDeleted -= value; }
+ }
+
+ public MarkerStrategy MarkerStrategy {
+ get { return markerStrategy; }
+ set { markerStrategy = value; }
+ }
+
+ public ITextEditorProperties TextEditorProperties {
+ get {
+ return textEditorProperties;
+ }
+ set {
+ textEditorProperties = value;
+ }
+ }
+
+ public UndoStack UndoStack {
+ get {
+ return undoStack;
+ }
+ }
+
+ public IList<LineSegment> LineSegmentCollection {
+ get {
+ return lineTrackingStrategy.LineSegmentCollection;
+ }
+ }
+
+ public bool ReadOnly {
+ get {
+ return readOnly;
+ }
+ set {
+ readOnly = value;
+ }
+ }
+
+ public ITextBufferStrategy TextBufferStrategy {
+ get {
+ return textBufferStrategy;
+ }
+ set {
+ textBufferStrategy = value;
+ }
+ }
+
+ public IFormattingStrategy FormattingStrategy {
+ get {
+ return formattingStrategy;
+ }
+ set {
+ formattingStrategy = value;
+ }
+ }
+
+ public FoldingManager FoldingManager {
+ get {
+ return foldingManager;
+ }
+ set {
+ foldingManager = value;
+ }
+ }
+
+ public IHighlightingStrategy HighlightingStrategy {
+ get {
+ return lineTrackingStrategy.HighlightingStrategy;
+ }
+ set {
+ lineTrackingStrategy.HighlightingStrategy = value;
+ }
+ }
+
+ public int TextLength {
+ get {
+ return textBufferStrategy.Length;
+ }
+ }
+
+ public BookmarkManager BookmarkManager {
+ get {
+ return bookmarkManager;
+ }
+ set {
+ bookmarkManager = value;
+ }
+ }
+
+
+ public string TextContent {
+ get {
+ return GetText(0, textBufferStrategy.Length);
+ }
+ set {
+ Debug.Assert(textBufferStrategy != null);
+ Debug.Assert(lineTrackingStrategy != null);
+ OnDocumentAboutToBeChanged(new DocumentEventArgs(this, 0, 0, value));
+ textBufferStrategy.SetContent(value);
+ lineTrackingStrategy.SetContent(value);
+ undoStack.ClearAll();
+
+ OnDocumentChanged(new DocumentEventArgs(this, 0, 0, value));
+ OnTextContentChanged(EventArgs.Empty);
+ }
+ }
+
+ public void Insert(int offset, string text)
+ {
+ if (readOnly) {
+ return;
+ }
+ OnDocumentAboutToBeChanged(new DocumentEventArgs(this, offset, -1, text));
+
+ textBufferStrategy.Insert(offset, text);
+ lineTrackingStrategy.Insert(offset, text);
+
+ undoStack.Push(new UndoableInsert(this, offset, text));
+
+ OnDocumentChanged(new DocumentEventArgs(this, offset, -1, text));
+ }
+
+ public void Remove(int offset, int length)
+ {
+ if (readOnly) {
+ return;
+ }
+ OnDocumentAboutToBeChanged(new DocumentEventArgs(this, offset, length));
+ undoStack.Push(new UndoableDelete(this, offset, GetText(offset, length)));
+
+ textBufferStrategy.Remove(offset, length);
+ lineTrackingStrategy.Remove(offset, length);
+
+ OnDocumentChanged(new DocumentEventArgs(this, offset, length));
+ }
+
+ public void Replace(int offset, int length, string text)
+ {
+ if (readOnly) {
+ return;
+ }
+ OnDocumentAboutToBeChanged(new DocumentEventArgs(this, offset, length, text));
+ undoStack.Push(new UndoableReplace(this, offset, GetText(offset, length), text));
+
+ textBufferStrategy.Replace(offset, length, text);
+ lineTrackingStrategy.Replace(offset, length, text);
+
+ OnDocumentChanged(new DocumentEventArgs(this, offset, length, text));
+ }
+
+ public char GetCharAt(int offset)
+ {
+ return textBufferStrategy.GetCharAt(offset);
+ }
+
+ public string GetText(int offset, int length)
+ {
+ #if DEBUG
+ if (length < 0) throw new ArgumentOutOfRangeException("length", length, "length < 0");
+ #endif
+ return textBufferStrategy.GetText(offset, length);
+ }
+ public string GetText(ISegment segment)
+ {
+ return GetText(segment.Offset, segment.Length);
+ }
+
+ public int TotalNumberOfLines {
+ get {
+ return lineTrackingStrategy.TotalNumberOfLines;
+ }
+ }
+
+ public int GetLineNumberForOffset(int offset)
+ {
+ return lineTrackingStrategy.GetLineNumberForOffset(offset);
+ }
+
+ public LineSegment GetLineSegmentForOffset(int offset)
+ {
+ return lineTrackingStrategy.GetLineSegmentForOffset(offset);
+ }
+
+ public LineSegment GetLineSegment(int line)
+ {
+ return lineTrackingStrategy.GetLineSegment(line);
+ }
+
+ public int GetFirstLogicalLine(int lineNumber)
+ {
+ return lineTrackingStrategy.GetFirstLogicalLine(lineNumber);
+ }
+
+ public int GetLastLogicalLine(int lineNumber)
+ {
+ return lineTrackingStrategy.GetLastLogicalLine(lineNumber);
+ }
+
+ public int GetVisibleLine(int lineNumber)
+ {
+ return lineTrackingStrategy.GetVisibleLine(lineNumber);
+ }
+
+// public int GetVisibleColumn(int logicalLine, int logicalColumn)
+// {
+// return lineTrackingStrategy.GetVisibleColumn(logicalLine, logicalColumn);
+// }
+//
+ public int GetNextVisibleLineAbove(int lineNumber, int lineCount)
+ {
+ return lineTrackingStrategy.GetNextVisibleLineAbove(lineNumber, lineCount);
+ }
+
+ public int GetNextVisibleLineBelow(int lineNumber, int lineCount)
+ {
+ return lineTrackingStrategy.GetNextVisibleLineBelow(lineNumber, lineCount);
+ }
+
+ public TextLocation OffsetToPosition(int offset)
+ {
+ int lineNr = GetLineNumberForOffset(offset);
+ LineSegment line = GetLineSegment(lineNr);
+ return new TextLocation(offset - line.Offset, lineNr);
+ }
+
+ public int PositionToOffset(TextLocation p)
+ {
+ if (p.Y >= this.TotalNumberOfLines) {
+ return 0;
+ }
+ LineSegment line = GetLineSegment(p.Y);
+ return Math.Min(this.TextLength, line.Offset + Math.Min(line.Length, p.X));
+ }
+
+ public void UpdateSegmentListOnDocumentChange<T>(List<T> list, DocumentEventArgs e) where T : ISegment
+ {
+ int removedCharacters = e.Length > 0 ? e.Length : 0;
+ int insertedCharacters = e.Text != null ? e.Text.Length : 0;
+ for (int i = 0; i < list.Count; ++i) {
+ ISegment s = list[i];
+ int segmentStart = s.Offset;
+ int segmentEnd = s.Offset + s.Length;
+
+ if (e.Offset <= segmentStart) {
+ segmentStart -= removedCharacters;
+ if (segmentStart < e.Offset)
+ segmentStart = e.Offset;
+ }
+ if (e.Offset < segmentEnd) {
+ segmentEnd -= removedCharacters;
+ if (segmentEnd < e.Offset)
+ segmentEnd = e.Offset;
+ }
+
+ Debug.Assert(segmentStart <= segmentEnd);
+
+ if (segmentStart == segmentEnd) {
+ list.RemoveAt(i);
+ --i;
+ continue;
+ }
+
+ if (e.Offset <= segmentStart)
+ segmentStart += insertedCharacters;
+ if (e.Offset < segmentEnd)
+ segmentEnd += insertedCharacters;
+
+ Debug.Assert(segmentStart < segmentEnd);
+
+ s.Offset = segmentStart;
+ s.Length = segmentEnd - segmentStart;
+ }
+ }
+
+ void OnDocumentAboutToBeChanged(DocumentEventArgs e)
+ {
+ if (DocumentAboutToBeChanged != null) {
+ DocumentAboutToBeChanged(this, e);
+ }
+ }
+
+ void OnDocumentChanged(DocumentEventArgs e)
+ {
+ if (DocumentChanged != null) {
+ DocumentChanged(this, e);
+ }
+ }
+
+ public event DocumentEventHandler DocumentAboutToBeChanged;
+ public event DocumentEventHandler DocumentChanged;
+
+ // UPDATE STUFF
+ List<TextAreaUpdate> updateQueue = new List<TextAreaUpdate>();
+
+ public List<TextAreaUpdate> UpdateQueue {
+ get {
+ return updateQueue;
+ }
+ }
+
+ public void RequestUpdate(TextAreaUpdate update)
+ {
+ if (updateQueue.Count == 1 && updateQueue[0].TextAreaUpdateType == TextAreaUpdateType.WholeTextArea) {
+ // if we're going to update the whole text area, we don't need to store detail updates
+ return;
+ }
+ if (update.TextAreaUpdateType == TextAreaUpdateType.WholeTextArea) {
+ // if we're going to update the whole text area, we don't need to store detail updates
+ updateQueue.Clear();
+ }
+ updateQueue.Add(update);
+ }
+
+ public void CommitUpdate()
+ {
+ if (UpdateCommited != null) {
+ UpdateCommited(this, EventArgs.Empty);
+ }
+ }
+
+ void OnTextContentChanged(EventArgs e)
+ {
+ if (TextContentChanged != null) {
+ TextContentChanged(this, e);
+ }
+ }
+
+ public event EventHandler UpdateCommited;
+ public event EventHandler TextContentChanged;
+
+ [Conditional("DEBUG")]
+ internal static void ValidatePosition(IDocument document, TextLocation position)
+ {
+ document.GetLineSegment(position.Line);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultTextEditorProperties.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultTextEditorProperties.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DefaultTextEditorProperties.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,321 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public enum BracketMatchingStyle {
+ Before,
+ After
+ }
+
+ public class DefaultTextEditorProperties : ITextEditorProperties
+ {
+ int tabIndent = 4;
+ int indentationSize = 4;
+ IndentStyle indentStyle = IndentStyle.Smart;
+ DocumentSelectionMode documentSelectionMode = DocumentSelectionMode.Normal;
+ Encoding encoding = System.Text.Encoding.UTF8;
+ BracketMatchingStyle bracketMatchingStyle = BracketMatchingStyle.After;
+ FontContainer fontContainer;
+ static Font DefaultFont;
+
+ public DefaultTextEditorProperties()
+ {
+ if (DefaultFont == null) {
+ DefaultFont = new Font("Courier New", 10);
+ }
+ this.fontContainer = new FontContainer(DefaultFont);
+ }
+
+ bool allowCaretBeyondEOL = false;
+
+ bool caretLine = false;
+
+ bool showMatchingBracket = true;
+ bool showLineNumbers = true;
+
+ bool showSpaces = false;
+ bool showTabs = false;
+ bool showEOLMarker = false;
+
+ bool showInvalidLines = false;
+
+ bool isIconBarVisible = false;
+ bool enableFolding = true;
+ bool showHorizontalRuler = false;
+ bool showVerticalRuler = true;
+ bool convertTabsToSpaces = false;
+ System.Drawing.Text.TextRenderingHint textRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
+ bool mouseWheelScrollDown = true;
+ bool mouseWheelTextZoom = true;
+
+ bool hideMouseCursor = false;
+ bool cutCopyWholeLine = true;
+
+ int verticalRulerRow = 80;
+ LineViewerStyle lineViewerStyle = LineViewerStyle.None;
+ string lineTerminator = "\r\n";
+ bool autoInsertCurlyBracket = true;
+ bool supportReadOnlySegments = false;
+
+ public int TabIndent {
+ get {
+ return tabIndent;
+ }
+ set {
+ tabIndent = value;
+ }
+ }
+
+ public int IndentationSize {
+ get { return indentationSize; }
+ set { indentationSize = value; }
+ }
+
+ public IndentStyle IndentStyle {
+ get {
+ return indentStyle;
+ }
+ set {
+ indentStyle = value;
+ }
+ }
+
+ public bool CaretLine {
+ get
+ {
+ return caretLine;
+ }
+ set
+ {
+ caretLine = value;
+ }
+ }
+
+ public DocumentSelectionMode DocumentSelectionMode {
+ get {
+ return documentSelectionMode;
+ }
+ set {
+ documentSelectionMode = value;
+ }
+ }
+ public bool AllowCaretBeyondEOL {
+ get {
+ return allowCaretBeyondEOL;
+ }
+ set {
+ allowCaretBeyondEOL = value;
+ }
+ }
+ public bool ShowMatchingBracket {
+ get {
+ return showMatchingBracket;
+ }
+ set {
+ showMatchingBracket = value;
+ }
+ }
+ public bool ShowLineNumbers {
+ get {
+ return showLineNumbers;
+ }
+ set {
+ showLineNumbers = value;
+ }
+ }
+ public bool ShowSpaces {
+ get {
+ return showSpaces;
+ }
+ set {
+ showSpaces = value;
+ }
+ }
+ public bool ShowTabs {
+ get {
+ return showTabs;
+ }
+ set {
+ showTabs = value;
+ }
+ }
+ public bool ShowEOLMarker {
+ get {
+ return showEOLMarker;
+ }
+ set {
+ showEOLMarker = value;
+ }
+ }
+ public bool ShowInvalidLines {
+ get {
+ return showInvalidLines;
+ }
+ set {
+ showInvalidLines = value;
+ }
+ }
+ public bool IsIconBarVisible {
+ get {
+ return isIconBarVisible;
+ }
+ set {
+ isIconBarVisible = value;
+ }
+ }
+ public bool EnableFolding {
+ get {
+ return enableFolding;
+ }
+ set {
+ enableFolding = value;
+ }
+ }
+ public bool ShowHorizontalRuler {
+ get {
+ return showHorizontalRuler;
+ }
+ set {
+ showHorizontalRuler = value;
+ }
+ }
+ public bool ShowVerticalRuler {
+ get {
+ return showVerticalRuler;
+ }
+ set {
+ showVerticalRuler = value;
+ }
+ }
+ public bool ConvertTabsToSpaces {
+ get {
+ return convertTabsToSpaces;
+ }
+ set {
+ convertTabsToSpaces = value;
+ }
+ }
+ public System.Drawing.Text.TextRenderingHint TextRenderingHint {
+ get { return textRenderingHint; }
+ set { textRenderingHint = value; }
+ }
+
+ public bool MouseWheelScrollDown {
+ get {
+ return mouseWheelScrollDown;
+ }
+ set {
+ mouseWheelScrollDown = value;
+ }
+ }
+ public bool MouseWheelTextZoom {
+ get {
+ return mouseWheelTextZoom;
+ }
+ set {
+ mouseWheelTextZoom = value;
+ }
+ }
+
+ public bool HideMouseCursor {
+ get {
+ return hideMouseCursor;
+ }
+ set {
+ hideMouseCursor = value;
+ }
+ }
+
+ public bool CutCopyWholeLine {
+ get {
+ return cutCopyWholeLine;
+ }
+ set {
+ cutCopyWholeLine = value;
+ }
+ }
+
+ public Encoding Encoding {
+ get {
+ return encoding;
+ }
+ set {
+ encoding = value;
+ }
+ }
+ public int VerticalRulerRow {
+ get {
+ return verticalRulerRow;
+ }
+ set {
+ verticalRulerRow = value;
+ }
+ }
+ public LineViewerStyle LineViewerStyle {
+ get {
+ return lineViewerStyle;
+ }
+ set {
+ lineViewerStyle = value;
+ }
+ }
+ public string LineTerminator {
+ get {
+ return lineTerminator;
+ }
+ set {
+ lineTerminator = value;
+ }
+ }
+ public bool AutoInsertCurlyBracket {
+ get {
+ return autoInsertCurlyBracket;
+ }
+ set {
+ autoInsertCurlyBracket = value;
+ }
+ }
+
+ public Font Font {
+ get {
+ return fontContainer.DefaultFont;
+ }
+ set {
+ fontContainer.DefaultFont = value;
+ }
+ }
+
+ public FontContainer FontContainer {
+ get {
+ return fontContainer;
+ }
+ }
+
+ public BracketMatchingStyle BracketMatchingStyle {
+ get {
+ return bracketMatchingStyle;
+ }
+ set {
+ bracketMatchingStyle = value;
+ }
+ }
+
+ public bool SupportReadOnlySegments {
+ get {
+ return supportReadOnlySegments;
+ }
+ set {
+ supportReadOnlySegments = value;
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentEventArgs.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentEventArgs.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentEventArgs.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,103 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This delegate is used for document events.
+ /// </summary>
+ public delegate void DocumentEventHandler(object sender, DocumentEventArgs e);
+
+ /// <summary>
+ /// This class contains more information on a document event
+ /// </summary>
+ public class DocumentEventArgs : EventArgs
+ {
+ IDocument document;
+ int offset;
+ int length;
+ string text;
+
+ /// <returns>
+ /// always a valid Document which is related to the Event.
+ /// </returns>
+ public IDocument Document {
+ get {
+ return document;
+ }
+ }
+
+ /// <returns>
+ /// -1 if no offset was specified for this event
+ /// </returns>
+ public int Offset {
+ get {
+ return offset;
+ }
+ }
+
+ /// <returns>
+ /// null if no text was specified for this event
+ /// </returns>
+ public string Text {
+ get {
+ return text;
+ }
+ }
+
+ /// <returns>
+ /// -1 if no length was specified for this event
+ /// </returns>
+ public int Length {
+ get {
+ return length;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance off <see cref="DocumentEventArgs"/>
+ /// </summary>
+ public DocumentEventArgs(IDocument document) : this(document, -1, -1, null)
+ {
+ }
+
+ /// <summary>
+ /// Creates a new instance off <see cref="DocumentEventArgs"/>
+ /// </summary>
+ public DocumentEventArgs(IDocument document, int offset) : this(document, offset, -1, null)
+ {
+ }
+
+ /// <summary>
+ /// Creates a new instance off <see cref="DocumentEventArgs"/>
+ /// </summary>
+ public DocumentEventArgs(IDocument document, int offset, int length) : this(document, offset, length, null)
+ {
+ }
+
+ /// <summary>
+ /// Creates a new instance off <see cref="DocumentEventArgs"/>
+ /// </summary>
+ public DocumentEventArgs(IDocument document, int offset, int length, string text)
+ {
+ this.document = document;
+ this.offset = offset;
+ this.length = length;
+ this.text = text;
+ }
+ public override string ToString()
+ {
+ return String.Format("[DocumentEventArgs: Document = {0}, Offset = {1}, Text = {2}, Length = {3}]",
+ Document,
+ Offset,
+ Text,
+ Length);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentFactory.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentFactory.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/DocumentFactory.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,57 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface represents a container which holds a text sequence and
+ /// all necessary information about it. It is used as the base for a text editor.
+ /// </summary>
+ public class DocumentFactory
+ {
+ /// <remarks>
+ /// Creates a new <see cref="IDocument"/> object. Only create
+ /// <see cref="IDocument"/> with this method.
+ /// </remarks>
+ public IDocument CreateDocument()
+ {
+ DefaultDocument doc = new DefaultDocument();
+ doc.TextBufferStrategy = new GapTextBufferStrategy();
+ doc.FormattingStrategy = new DefaultFormattingStrategy();
+ doc.LineManager = new LineManager(doc, null);
+ doc.FoldingManager = new FoldingManager(doc, doc.LineManager);
+ doc.FoldingManager.FoldingStrategy = null; //new ParserFoldingStrategy();
+ doc.MarkerStrategy = new MarkerStrategy(doc);
+ doc.BookmarkManager = new BookmarkManager(doc, doc.LineManager);
+ return doc;
+ }
+
+ /// <summary>
+ /// Creates a new document and loads the given file
+ /// </summary>
+ public IDocument CreateFromTextBuffer(ITextBufferStrategy textBuffer)
+ {
+ DefaultDocument doc = (DefaultDocument)CreateDocument();
+ doc.TextContent = textBuffer.GetText(0, textBuffer.Length);
+ doc.TextBufferStrategy = textBuffer;
+ return doc;
+ }
+
+ /// <summary>
+ /// Creates a new document and loads the given file
+ /// </summary>
+ public IDocument CreateFromFile(string fileName)
+ {
+ IDocument document = CreateDocument();
+ document.TextContent = Util.FileReader.ReadFileContent(fileName, Encoding.Default);
+ return document;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldMarker.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldMarker.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldMarker.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,174 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public enum FoldType {
+ Unspecified,
+ MemberBody,
+ Region,
+ TypeBody
+ }
+
+ public class FoldMarker : AbstractSegment, IComparable
+ {
+ bool isFolded = false;
+ string foldText = "...";
+ FoldType foldType = FoldType.Unspecified;
+ IDocument document = null;
+ int startLine = -1, startColumn, endLine = -1, endColumn;
+
+ static void GetPointForOffset(IDocument document, int offset, out int line, out int column)
+ {
+ if (offset > document.TextLength) {
+ line = document.TotalNumberOfLines + 1;
+ column = 1;
+ } else if (offset < 0) {
+ line = -1;
+ column = -1;
+ } else {
+ line = document.GetLineNumberForOffset(offset);
+ column = offset - document.GetLineSegment(line).Offset;
+ }
+ }
+
+ public FoldType FoldType {
+ get { return foldType; }
+ set { foldType = value; }
+ }
+
+ public int StartLine {
+ get {
+ if (startLine < 0) {
+ GetPointForOffset(document, offset, out startLine, out startColumn);
+ }
+ return startLine;
+ }
+ }
+
+ public int StartColumn {
+ get {
+ if (startLine < 0) {
+ GetPointForOffset(document, offset, out startLine, out startColumn);
+ }
+ return startColumn;
+ }
+ }
+
+ public int EndLine {
+ get {
+ if (endLine < 0) {
+ GetPointForOffset(document, offset + length, out endLine, out endColumn);
+ }
+ return endLine;
+ }
+ }
+
+ public int EndColumn {
+ get {
+ if (endLine < 0) {
+ GetPointForOffset(document, offset + length, out endLine, out endColumn);
+ }
+ return endColumn;
+ }
+ }
+
+ public override int Offset {
+ get { return base.Offset; }
+ set {
+ base.Offset = value;
+ startLine = -1; endLine = -1;
+ }
+ }
+ public override int Length {
+ get { return base.Length; }
+ set {
+ base.Length = value;
+ endLine = -1;
+ }
+ }
+
+ public bool IsFolded {
+ get {
+ return isFolded;
+ }
+ set {
+ isFolded = value;
+ }
+ }
+
+ public string FoldText {
+ get {
+ return foldText;
+ }
+ }
+
+ public string InnerText {
+ get {
+ return document.GetText(offset, length);
+ }
+ }
+
+ public FoldMarker(IDocument document, int offset, int length, string foldText, bool isFolded)
+ {
+ this.document = document;
+ this.offset = offset;
+ this.length = length;
+ this.foldText = foldText;
+ this.isFolded = isFolded;
+ }
+
+ public FoldMarker(IDocument document, int startLine, int startColumn, int endLine, int endColumn) : this(document, startLine, startColumn, endLine, endColumn, FoldType.Unspecified)
+ {
+ }
+
+ public FoldMarker(IDocument document, int startLine, int startColumn, int endLine, int endColumn, FoldType foldType) : this(document, startLine, startColumn, endLine, endColumn, foldType, "...")
+ {
+ }
+
+ public FoldMarker(IDocument document, int startLine, int startColumn, int endLine, int endColumn, FoldType foldType, string foldText) : this(document, startLine, startColumn, endLine, endColumn, foldType, foldText, false)
+ {
+ }
+
+ public FoldMarker(IDocument document, int startLine, int startColumn, int endLine, int endColumn, FoldType foldType, string foldText, bool isFolded)
+ {
+ this.document = document;
+
+ startLine = Math.Min(document.TotalNumberOfLines - 1, Math.Max(startLine, 0));
+ ISegment startLineSegment = document.GetLineSegment(startLine);
+
+ endLine = Math.Min(document.TotalNumberOfLines - 1, Math.Max(endLine, 0));
+ ISegment endLineSegment = document.GetLineSegment(endLine);
+
+ // Prevent the region from completely disappearing
+ if (string.IsNullOrEmpty(foldText)) {
+ foldText = "...";
+ }
+
+ this.FoldType = foldType;
+ this.foldText = foldText;
+ this.offset = startLineSegment.Offset + Math.Min(startColumn, startLineSegment.Length);
+ this.length = (endLineSegment.Offset + Math.Min(endColumn, endLineSegment.Length)) - this.offset;
+ this.isFolded = isFolded;
+ }
+
+ public int CompareTo(object o)
+ {
+ if (!(o is FoldMarker)) {
+ throw new ArgumentException();
+ }
+ FoldMarker f = (FoldMarker)o;
+ if (offset != f.offset) {
+ return offset.CompareTo(f.offset);
+ }
+
+ return length.CompareTo(f.length);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldingManager.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldingManager.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/FoldingManager.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,333 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class FoldingManager
+ {
+ List<FoldMarker> foldMarker = new List<FoldMarker>();
+ List<FoldMarker> foldMarkerByEnd = new List<FoldMarker>();
+ IFoldingStrategy foldingStrategy = null;
+ IDocument document;
+
+ public IList<FoldMarker> FoldMarker {
+ get {
+ return foldMarker.AsReadOnly();
+ }
+ }
+
+ public IFoldingStrategy FoldingStrategy {
+ get {
+ return foldingStrategy;
+ }
+ set {
+ foldingStrategy = value;
+ }
+ }
+
+ internal FoldingManager(IDocument document, LineManager lineTracker)
+ {
+ this.document = document;
+ document.DocumentChanged += new DocumentEventHandler(DocumentChanged);
+
+// lineTracker.LineCountChanged += new LineManagerEventHandler(LineManagerLineCountChanged);
+// lineTracker.LineLengthChanged += new LineLengthEventHandler(LineManagerLineLengthChanged);
+// foldMarker.Add(new FoldMarker(0, 5, 3, 5));
+//
+// foldMarker.Add(new FoldMarker(5, 5, 10, 3));
+// foldMarker.Add(new FoldMarker(6, 0, 8, 2));
+//
+// FoldMarker fm1 = new FoldMarker(10, 4, 10, 7);
+// FoldMarker fm2 = new FoldMarker(10, 10, 10, 14);
+//
+// fm1.IsFolded = true;
+// fm2.IsFolded = true;
+//
+// foldMarker.Add(fm1);
+// foldMarker.Add(fm2);
+// foldMarker.Sort();
+ }
+
+ void DocumentChanged(object sender, DocumentEventArgs e)
+ {
+ int oldCount = foldMarker.Count;
+ document.UpdateSegmentListOnDocumentChange(foldMarker, e);
+ if (oldCount != foldMarker.Count) {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ }
+ }
+
+ public List<FoldMarker> GetFoldingsFromPosition(int line, int column)
+ {
+ List<FoldMarker> foldings = new List<FoldMarker>();
+ if (foldMarker != null) {
+ for (int i = 0; i < foldMarker.Count; ++i) {
+ FoldMarker fm = foldMarker[i];
+ if ((fm.StartLine == line && column > fm.StartColumn && !(fm.EndLine == line && column >= fm.EndColumn)) ||
+ (fm.EndLine == line && column < fm.EndColumn && !(fm.StartLine == line && column <= fm.StartColumn)) ||
+ (line > fm.StartLine && line < fm.EndLine)) {
+ foldings.Add(fm);
+ }
+ }
+ }
+ return foldings;
+ }
+
+ class StartComparer : IComparer<FoldMarker>
+ {
+ public readonly static StartComparer Instance = new StartComparer();
+
+ public int Compare(FoldMarker x, FoldMarker y)
+ {
+ if (x.StartLine < y.StartLine)
+ return -1;
+ else if (x.StartLine == y.StartLine)
+ return x.StartColumn.CompareTo(y.StartColumn);
+ else
+ return 1;
+ }
+ }
+
+ class EndComparer : IComparer<FoldMarker>
+ {
+ public readonly static EndComparer Instance = new EndComparer();
+
+ public int Compare(FoldMarker x, FoldMarker y)
+ {
+ if (x.EndLine < y.EndLine)
+ return -1;
+ else if (x.EndLine == y.EndLine)
+ return x.EndColumn.CompareTo(y.EndColumn);
+ else
+ return 1;
+ }
+ }
+
+ List<FoldMarker> GetFoldingsByStartAfterColumn(int lineNumber, int column, bool forceFolded)
+ {
+ List<FoldMarker> foldings = new List<FoldMarker>();
+
+ if (foldMarker != null) {
+ int index = foldMarker.BinarySearch(
+ new FoldMarker(document, lineNumber, column, lineNumber, column),
+ StartComparer.Instance);
+ if (index < 0) index = ~index;
+
+ for (; index < foldMarker.Count; index++) {
+ FoldMarker fm = foldMarker[index];
+ if (fm.StartLine > lineNumber)
+ break;
+ if (fm.StartColumn <= column)
+ continue;
+ if (!forceFolded || fm.IsFolded)
+ foldings.Add(fm);
+ }
+ }
+ return foldings;
+ }
+
+ public List<FoldMarker> GetFoldingsWithStart(int lineNumber)
+ {
+ return GetFoldingsByStartAfterColumn(lineNumber, -1, false);
+ }
+
+ public List<FoldMarker> GetFoldedFoldingsWithStart(int lineNumber)
+ {
+ return GetFoldingsByStartAfterColumn(lineNumber, -1, true);
+ }
+
+ public List<FoldMarker> GetFoldedFoldingsWithStartAfterColumn(int lineNumber, int column)
+ {
+ return GetFoldingsByStartAfterColumn(lineNumber, column, true);
+ }
+
+ List<FoldMarker> GetFoldingsByEndAfterColumn(int lineNumber, int column, bool forceFolded)
+ {
+ List<FoldMarker> foldings = new List<FoldMarker>();
+
+ if (foldMarker != null) {
+ int index = foldMarkerByEnd.BinarySearch(
+ new FoldMarker(document, lineNumber, column, lineNumber, column),
+ EndComparer.Instance);
+ if (index < 0) index = ~index;
+
+ for (; index < foldMarkerByEnd.Count; index++) {
+ FoldMarker fm = foldMarkerByEnd[index];
+ if (fm.EndLine > lineNumber)
+ break;
+ if (fm.EndColumn <= column)
+ continue;
+ if (!forceFolded || fm.IsFolded)
+ foldings.Add(fm);
+ }
+ }
+ return foldings;
+ }
+
+ public List<FoldMarker> GetFoldingsWithEnd(int lineNumber)
+ {
+ return GetFoldingsByEndAfterColumn(lineNumber, -1, false);
+ }
+
+ public List<FoldMarker> GetFoldedFoldingsWithEnd(int lineNumber)
+ {
+ return GetFoldingsByEndAfterColumn(lineNumber, -1, true);
+ }
+
+ public bool IsFoldStart(int lineNumber)
+ {
+ return GetFoldingsWithStart(lineNumber).Count > 0;
+ }
+
+ public bool IsFoldEnd(int lineNumber)
+ {
+ return GetFoldingsWithEnd(lineNumber).Count > 0;
+ }
+
+ public List<FoldMarker> GetFoldingsContainsLineNumber(int lineNumber)
+ {
+ List<FoldMarker> foldings = new List<FoldMarker>();
+ if (foldMarker != null) {
+ foreach (FoldMarker fm in foldMarker) {
+ if (fm.StartLine < lineNumber && lineNumber < fm.EndLine) {
+ foldings.Add(fm);
+ }
+ }
+ }
+ return foldings;
+ }
+
+ public bool IsBetweenFolding(int lineNumber)
+ {
+ return GetFoldingsContainsLineNumber(lineNumber).Count > 0;
+ }
+
+ public bool IsLineVisible(int lineNumber)
+ {
+ foreach (FoldMarker fm in GetFoldingsContainsLineNumber(lineNumber)) {
+ if (fm.IsFolded)
+ return false;
+ }
+ return true;
+ }
+
+ public List<FoldMarker> GetTopLevelFoldedFoldings()
+ {
+ List<FoldMarker> foldings = new List<FoldMarker>();
+ if (foldMarker != null) {
+ Point end = new Point(0, 0);
+ foreach (FoldMarker fm in foldMarker) {
+ if (fm.IsFolded && (fm.StartLine > end.Y || fm.StartLine == end.Y && fm.StartColumn >= end.X)) {
+ foldings.Add(fm);
+ end = new Point(fm.EndColumn, fm.EndLine);
+ }
+ }
+ }
+ return foldings;
+ }
+
+ public void UpdateFoldings(string fileName, object parseInfo)
+ {
+ UpdateFoldings(foldingStrategy.GenerateFoldMarkers(document, fileName, parseInfo));
+ }
+
+ public void UpdateFoldings(List<FoldMarker> newFoldings)
+ {
+ int oldFoldingsCount = foldMarker.Count;
+ lock (this) {
+ if (newFoldings != null && newFoldings.Count != 0) {
+ newFoldings.Sort();
+ if (foldMarker.Count == newFoldings.Count) {
+ for (int i = 0; i < foldMarker.Count; ++i) {
+ newFoldings[i].IsFolded = foldMarker[i].IsFolded;
+ }
+ foldMarker = newFoldings;
+ } else {
+ for (int i = 0, j = 0; i < foldMarker.Count && j < newFoldings.Count;) {
+ int n = newFoldings[j].CompareTo(foldMarker[i]);
+ if (n > 0) {
+ ++i;
+ } else {
+ if (n == 0) {
+ newFoldings[j].IsFolded = foldMarker[i].IsFolded;
+ }
+ ++j;
+ }
+ }
+ }
+ }
+ if (newFoldings != null) {
+ foldMarker = newFoldings;
+ foldMarkerByEnd = new List<FoldMarker>(newFoldings);
+ foldMarkerByEnd.Sort(EndComparer.Instance);
+ } else {
+ foldMarker.Clear();
+ foldMarkerByEnd.Clear();
+ }
+ }
+ if (oldFoldingsCount != foldMarker.Count) {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ document.CommitUpdate();
+ }
+ }
+
+ public string SerializeToString()
+ {
+ StringBuilder sb = new StringBuilder();
+ foreach (FoldMarker marker in this.foldMarker) {
+ sb.Append(marker.Offset);sb.Append("\n");
+ sb.Append(marker.Length);sb.Append("\n");
+ sb.Append(marker.FoldText);sb.Append("\n");
+ sb.Append(marker.IsFolded);sb.Append("\n");
+ }
+ return sb.ToString();
+ }
+
+ public void DeserializeFromString(string str)
+ {
+ try {
+ string[] lines = str.Split('\n');
+ for (int i = 0; i < lines.Length && lines[i].Length > 0; i += 4) {
+ int offset = Int32.Parse(lines[i]);
+ int length = Int32.Parse(lines[i + 1]);
+ string text = lines[i + 2];
+ bool isFolded = Boolean.Parse(lines[i + 3]);
+ bool found = false;
+ foreach (FoldMarker marker in foldMarker) {
+ if (marker.Offset == offset && marker.Length == length) {
+ marker.IsFolded = isFolded;
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ foldMarker.Add(new FoldMarker(document, offset, length, text, isFolded));
+ }
+ }
+ if (lines.Length > 0) {
+ NotifyFoldingsChanged(EventArgs.Empty);
+ }
+ } catch (Exception) {
+ }
+ }
+
+ public void NotifyFoldingsChanged(EventArgs e)
+ {
+ if (FoldingsChanged != null) {
+ FoldingsChanged(this, e);
+ }
+ }
+
+
+ public event EventHandler FoldingsChanged;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IFoldingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IFoldingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IFoldingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,24 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface is used for the folding capabilities
+ /// of the textarea.
+ /// </summary>
+ public interface IFoldingStrategy
+ {
+ /// <remarks>
+ /// Calculates the fold level of a specific line.
+ /// </remarks>
+ List<FoldMarker> GenerateFoldMarkers(IDocument document, string fileName, object parseInformation);
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IndentFoldingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IndentFoldingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FoldingStrategy/IndentFoldingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,47 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// A simple folding strategy which calculates the folding level
+ /// using the indent level of the line.
+ /// </summary>
+ public class IndentFoldingStrategy : IFoldingStrategy
+ {
+ public List<FoldMarker> GenerateFoldMarkers(IDocument document, string fileName, object parseInformation)
+ {
+ List<FoldMarker> l = new List<FoldMarker>();
+ Stack<int> offsetStack = new Stack<int>();
+ Stack<string> textStack = new Stack<string>();
+ //int level = 0;
+ //foreach (LineSegment segment in document.LineSegmentCollection) {
+ //
+ //}
+ return l;
+ }
+
+ int GetLevel(IDocument document, int offset)
+ {
+ int level = 0;
+ int spaces = 0;
+ for (int i = offset; i < document.TextLength; ++i) {
+ char c = document.GetCharAt(i);
+ if (c == '\t' || (c == ' ' && ++spaces == 4)) {
+ spaces = 0;
+ ++level;
+ } else {
+ break;
+ }
+ }
+ return level;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/DefaultFormattingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/DefaultFormattingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/DefaultFormattingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,218 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This class handles the auto and smart indenting in the textbuffer while
+ /// you type.
+ /// </summary>
+ public class DefaultFormattingStrategy : IFormattingStrategy
+ {
+ /// <summary>
+ /// Creates a new instance off <see cref="DefaultFormattingStrategy"/>
+ /// </summary>
+ public DefaultFormattingStrategy()
+ {
+ }
+
+ /// <summary>
+ /// returns the whitespaces which are before a non white space character in the line line
+ /// as a string.
+ /// </summary>
+ protected string GetIndentation(TextArea textArea, int lineNumber)
+ {
+ if (lineNumber < 0 || lineNumber > textArea.Document.TotalNumberOfLines) {
+ throw new ArgumentOutOfRangeException("lineNumber");
+ }
+
+ string lineText = TextUtilities.GetLineAsString(textArea.Document, lineNumber);
+ StringBuilder whitespaces = new StringBuilder();
+
+ foreach (char ch in lineText) {
+ if (Char.IsWhiteSpace(ch)) {
+ whitespaces.Append(ch);
+ } else {
+ break;
+ }
+ }
+ return whitespaces.ToString();
+ }
+
+ /// <summary>
+ /// Could be overwritten to define more complex indenting.
+ /// </summary>
+ protected virtual int AutoIndentLine(TextArea textArea, int lineNumber)
+ {
+ string indentation = lineNumber != 0 ? GetIndentation(textArea, lineNumber - 1) : "";
+ if(indentation.Length > 0) {
+ string newLineText = indentation + TextUtilities.GetLineAsString(textArea.Document, lineNumber).Trim();
+ LineSegment oldLine = textArea.Document.GetLineSegment(lineNumber);
+ SmartReplaceLine(textArea.Document, oldLine, newLineText);
+ }
+ return indentation.Length;
+ }
+
+ static readonly char[] whitespaceChars = {' ', '\t'};
+
+ /// <summary>
+ /// Replaces the text in a line.
+ /// If only whitespace at the beginning and end of the line was changed, this method
+ /// only adjusts the whitespace and doesn't replace the other text.
+ /// </summary>
+ public static void SmartReplaceLine(IDocument document, LineSegment line, string newLineText)
+ {
+ if (document == null)
+ throw new ArgumentNullException("document");
+ if (line == null)
+ throw new ArgumentNullException("line");
+ if (newLineText == null)
+ throw new ArgumentNullException("newLineText");
+ string newLineTextTrim = newLineText.Trim(whitespaceChars);
+ string oldLineText = document.GetText(line);
+ if (oldLineText == newLineText)
+ return;
+ int pos = oldLineText.IndexOf(newLineTextTrim);
+ if (newLineTextTrim.Length > 0 && pos >= 0) {
+ document.UndoStack.StartUndoGroup();
+ try {
+ // find whitespace at beginning
+ int startWhitespaceLength = 0;
+ while (startWhitespaceLength < newLineText.Length) {
+ char c = newLineText[startWhitespaceLength];
+ if (c != ' ' && c != '\t')
+ break;
+ startWhitespaceLength++;
+ }
+ // find whitespace at end
+ int endWhitespaceLength = newLineText.Length - newLineTextTrim.Length - startWhitespaceLength;
+
+ // replace whitespace sections
+ int lineOffset = line.Offset;
+ document.Replace(lineOffset + pos + newLineTextTrim.Length, line.Length - pos - newLineTextTrim.Length, newLineText.Substring(newLineText.Length - endWhitespaceLength));
+ document.Replace(lineOffset, pos, newLineText.Substring(0, startWhitespaceLength));
+ } finally {
+ document.UndoStack.EndUndoGroup();
+ }
+ } else {
+ document.Replace(line.Offset, line.Length, newLineText);
+ }
+ }
+
+ /// <summary>
+ /// Could be overwritten to define more complex indenting.
+ /// </summary>
+ protected virtual int SmartIndentLine(TextArea textArea, int line)
+ {
+ return AutoIndentLine(textArea, line); // smart = autoindent in normal texts
+ }
+
+ /// <summary>
+ /// This function formats a specific line after <code>ch</code> is pressed.
+ /// </summary>
+ /// <returns>
+ /// the caret delta position the caret will be moved this number
+ /// of bytes (e.g. the number of bytes inserted before the caret, or
+ /// removed, if this number is negative)
+ /// </returns>
+ public virtual void FormatLine(TextArea textArea, int line, int cursorOffset, char ch)
+ {
+ if (ch == '\n') {
+ textArea.Caret.Column = IndentLine(textArea, line);
+ }
+ }
+
+ /// <summary>
+ /// This function sets the indentation level in a specific line
+ /// </summary>
+ /// <returns>
+ /// the number of inserted characters.
+ /// </returns>
+ public int IndentLine(TextArea textArea, int line)
+ {
+ textArea.Document.UndoStack.StartUndoGroup();
+ int result;
+ switch (textArea.Document.TextEditorProperties.IndentStyle) {
+ case IndentStyle.None:
+ result = 0;
+ break;
+ case IndentStyle.Auto:
+ result = AutoIndentLine(textArea, line);
+ break;
+ case IndentStyle.Smart:
+ result = SmartIndentLine(textArea, line);
+ break;
+ default:
+ throw new NotSupportedException("Unsupported value for IndentStyle: " + textArea.Document.TextEditorProperties.IndentStyle);
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+ return result;
+ }
+
+ /// <summary>
+ /// This function sets the indentlevel in a range of lines.
+ /// </summary>
+ public virtual void IndentLines(TextArea textArea, int begin, int end)
+ {
+ textArea.Document.UndoStack.StartUndoGroup();
+ for (int i = begin; i <= end; ++i) {
+ IndentLine(textArea, i);
+ }
+ textArea.Document.UndoStack.EndUndoGroup();
+ }
+
+ public virtual int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket)
+ {
+ int brackets = -1;
+ // first try "quick find" - find the matching bracket if there is no string/comment in the way
+ for (int i = offset; i >= 0; --i) {
+ char ch = document.GetCharAt(i);
+ if (ch == openBracket) {
+ ++brackets;
+ if (brackets == 0) return i;
+ } else if (ch == closingBracket) {
+ --brackets;
+ } else if (ch == '"') {
+ break;
+ } else if (ch == '\'') {
+ break;
+ } else if (ch == '/' && i > 0) {
+ if (document.GetCharAt(i - 1) == '/') break;
+ if (document.GetCharAt(i - 1) == '*') break;
+ }
+ }
+ return -1;
+ }
+
+ public virtual int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket)
+ {
+ int brackets = 1;
+ // try "quick find" - find the matching bracket if there is no string/comment in the way
+ for (int i = offset; i < document.TextLength; ++i) {
+ char ch = document.GetCharAt(i);
+ if (ch == openBracket) {
+ ++brackets;
+ } else if (ch == closingBracket) {
+ --brackets;
+ if (brackets == 0) return i;
+ } else if (ch == '"') {
+ break;
+ } else if (ch == '\'') {
+ break;
+ } else if (ch == '/' && i > 0) {
+ if (document.GetCharAt(i - 1) == '/') break;
+ } else if (ch == '*' && i > 0) {
+ if (document.GetCharAt(i - 1) == '/') break;
+ }
+ }
+ return -1;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/IFormattingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/IFormattingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/FormattingStrategy/IFormattingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,59 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface handles the auto and smart indenting and formating
+ /// in the document while you type. Language bindings could overwrite this
+ /// interface and define their own indentation/formating.
+ /// </summary>
+ public interface IFormattingStrategy
+ {
+ /// <summary>
+ /// This function formats a specific line after <code>ch</code> is pressed.
+ /// </summary>
+ void FormatLine(TextArea textArea, int line, int caretOffset, char charTyped);
+
+ /// <summary>
+ /// This function sets the indentation level in a specific line
+ /// </summary>
+ /// <returns>
+ /// The target caret position (length of new indentation).
+ /// </returns>
+ int IndentLine(TextArea textArea, int line);
+
+ /// <summary>
+ /// This function sets the indentlevel in a range of lines.
+ /// </summary>
+ void IndentLines(TextArea textArea, int begin, int end);
+
+ /// <summary>
+ /// Finds the offset of the opening bracket in the block defined by offset skipping
+ /// brackets in strings and comments.
+ /// </summary>
+ /// <param name="document">The document to search in.</param>
+ /// <param name="offset">The offset of an position in the block or the offset of the closing bracket.</param>
+ /// <param name="openBracket">The character for the opening bracket.</param>
+ /// <param name="closingBracket">The character for the closing bracket.</param>
+ /// <returns>Returns the offset of the opening bracket or -1 if no matching bracket was found.</returns>
+ int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket);
+
+ /// <summary>
+ /// Finds the offset of the closing bracket in the block defined by offset skipping
+ /// brackets in strings and comments.
+ /// </summary>
+ /// <param name="document">The document to search in.</param>
+ /// <param name="offset">The offset of an position in the block or the offset of the opening bracket.</param>
+ /// <param name="openBracket">The character for the opening bracket.</param>
+ /// <param name="closingBracket">The character for the closing bracket.</param>
+ /// <returns>Returns the offset of the closing bracket or -1 if no matching bracket was found.</returns>
+ int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket);
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/DefaultHighlightingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,908 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class DefaultHighlightingStrategy : IHighlightingStrategyUsingRuleSets
+ {
+ string name;
+ List<HighlightRuleSet> rules = new List<HighlightRuleSet>();
+
+ Dictionary<string, HighlightColor> environmentColors = new Dictionary<string, HighlightColor>();
+ Dictionary<string, string> properties = new Dictionary<string, string>();
+ string[] extensions;
+
+ HighlightColor digitColor;
+ HighlightRuleSet defaultRuleSet = null;
+
+ public HighlightColor DigitColor {
+ get {
+ return digitColor;
+ }
+ set {
+ digitColor = value;
+ }
+ }
+
+ public IEnumerable<KeyValuePair<string, HighlightColor>> EnvironmentColors {
+ get {
+ return environmentColors;
+ }
+ }
+
+ protected void ImportSettingsFrom(DefaultHighlightingStrategy source)
+ {
+ if (source == null)
+ throw new ArgumentNullException("source");
+ properties = source.properties;
+ extensions = source.extensions;
+ digitColor = source.digitColor;
+ defaultRuleSet = source.defaultRuleSet;
+ name = source.name;
+ rules = source.rules;
+ environmentColors = source.environmentColors;
+ defaultTextColor = source.defaultTextColor;
+ }
+
+ public DefaultHighlightingStrategy() : this("Default")
+ {
+ }
+
+ public DefaultHighlightingStrategy(string name)
+ {
+ this.name = name;
+
+ digitColor = new HighlightColor(SystemColors.WindowText, false, false);
+ defaultTextColor = new HighlightColor(SystemColors.WindowText, false, false);
+
+ // set small 'default color environment'
+ environmentColors["Default"] = new HighlightBackground("WindowText", "Window", false, false);
+ environmentColors["Selection"] = new HighlightColor("HighlightText", "Highlight", false, false);
+ environmentColors["VRuler"] = new HighlightColor("ControlLight", "Window", false, false);
+ environmentColors["InvalidLines"] = new HighlightColor(Color.Red, false, false);
+ environmentColors["CaretMarker"] = new HighlightColor(Color.Yellow, false, false);
+ environmentColors["CaretLine"] = new HighlightBackground("ControlLight", "Window", false, false);
+ environmentColors["LineNumbers"] = new HighlightBackground("ControlDark", "Window", false, false);
+
+ environmentColors["FoldLine"] = new HighlightColor("ControlDark", false, false);
+ environmentColors["FoldMarker"] = new HighlightColor("WindowText", "Window", false, false);
+ environmentColors["SelectedFoldLine"] = new HighlightColor("WindowText", false, false);
+ environmentColors["EOLMarkers"] = new HighlightColor("ControlLight", "Window", false, false);
+ environmentColors["SpaceMarkers"] = new HighlightColor("ControlLight", "Window", false, false);
+ environmentColors["TabMarkers"] = new HighlightColor("ControlLight", "Window", false, false);
+
+ }
+
+ public Dictionary<string, string> Properties {
+ get {
+ return properties;
+ }
+ }
+
+ public string Name
+ {
+ get {
+ return name;
+ }
+ }
+
+ public string[] Extensions
+ {
+ set {
+ extensions = value;
+ }
+ get {
+ return extensions;
+ }
+ }
+
+ public List<HighlightRuleSet> Rules {
+ get {
+ return rules;
+ }
+ }
+
+ public HighlightRuleSet FindHighlightRuleSet(string name)
+ {
+ foreach(HighlightRuleSet ruleSet in rules) {
+ if (ruleSet.Name == name) {
+ return ruleSet;
+ }
+ }
+ return null;
+ }
+
+ public void AddRuleSet(HighlightRuleSet aRuleSet)
+ {
+ HighlightRuleSet existing = FindHighlightRuleSet(aRuleSet.Name);
+ if (existing != null) {
+ existing.MergeFrom(aRuleSet);
+ } else {
+ rules.Add(aRuleSet);
+ }
+ }
+
+ public void ResolveReferences()
+ {
+ // Resolve references from Span definitions to RuleSets
+ ResolveRuleSetReferences();
+ // Resolve references from RuleSet defintitions to Highlighters defined in an external mode file
+ ResolveExternalReferences();
+ }
+
+ void ResolveRuleSetReferences()
+ {
+ foreach (HighlightRuleSet ruleSet in Rules) {
+ if (ruleSet.Name == null) {
+ defaultRuleSet = ruleSet;
+ }
+
+ foreach (Span aSpan in ruleSet.Spans) {
+ if (aSpan.Rule != null) {
+ bool found = false;
+ foreach (HighlightRuleSet refSet in Rules) {
+ if (refSet.Name == aSpan.Rule) {
+ found = true;
+ aSpan.RuleSet = refSet;
+ break;
+ }
+ }
+ if (!found) {
+ aSpan.RuleSet = null;
+ throw new HighlightingDefinitionInvalidException("The RuleSet " + aSpan.Rule + " could not be found in mode definition " + this.Name);
+ }
+ } else {
+ aSpan.RuleSet = null;
+ }
+ }
+ }
+
+ if (defaultRuleSet == null) {
+ throw new HighlightingDefinitionInvalidException("No default RuleSet is defined for mode definition " + this.Name);
+ }
+ }
+
+ void ResolveExternalReferences()
+ {
+ foreach (HighlightRuleSet ruleSet in Rules) {
+ ruleSet.Highlighter = this;
+ if (ruleSet.Reference != null) {
+ IHighlightingStrategy highlighter = HighlightingManager.Manager.FindHighlighter (ruleSet.Reference);
+
+ if (highlighter == null)
+ throw new HighlightingDefinitionInvalidException("The mode defintion " + ruleSet.Reference + " which is refered from the " + this.Name + " mode definition could not be found");
+ if (highlighter is IHighlightingStrategyUsingRuleSets)
+ ruleSet.Highlighter = (IHighlightingStrategyUsingRuleSets)highlighter;
+ else
+ throw new HighlightingDefinitionInvalidException("The mode defintion " + ruleSet.Reference + " which is refered from the " + this.Name + " mode definition does not implement IHighlightingStrategyUsingRuleSets");
+ }
+ }
+ }
+
+// internal void SetDefaultColor(HighlightBackground color)
+// {
+// return (HighlightColor)environmentColors[name];
+// defaultColor = color;
+// }
+
+ HighlightColor defaultTextColor;
+
+ public HighlightColor DefaultTextColor {
+ get {
+ return defaultTextColor;
+ }
+ }
+
+ public void SetColorFor(string name, HighlightColor color)
+ {
+ if (name == "Default")
+ defaultTextColor = new HighlightColor(color.Color, color.Bold, color.Italic);
+ environmentColors[name] = color;
+ }
+
+ public HighlightColor GetColorFor(string name)
+ {
+ HighlightColor color;
+ if (environmentColors.TryGetValue(name, out color))
+ return color;
+ else
+ return defaultTextColor;
+ }
+
+ public HighlightColor GetColor(IDocument document, LineSegment currentSegment, int currentOffset, int currentLength)
+ {
+ return GetColor(defaultRuleSet, document, currentSegment, currentOffset, currentLength);
+ }
+
+ protected virtual HighlightColor GetColor(HighlightRuleSet ruleSet, IDocument document, LineSegment currentSegment, int currentOffset, int currentLength)
+ {
+ if (ruleSet != null) {
+ if (ruleSet.Reference != null) {
+ return ruleSet.Highlighter.GetColor(document, currentSegment, currentOffset, currentLength);
+ } else {
+ return (HighlightColor)ruleSet.KeyWords[document, currentSegment, currentOffset, currentLength];
+ }
+ }
+ return null;
+ }
+
+ public HighlightRuleSet GetRuleSet(Span aSpan)
+ {
+ if (aSpan == null) {
+ return this.defaultRuleSet;
+ } else {
+ if (aSpan.RuleSet != null)
+ {
+ if (aSpan.RuleSet.Reference != null) {
+ return aSpan.RuleSet.Highlighter.GetRuleSet(null);
+ } else {
+ return aSpan.RuleSet;
+ }
+ } else {
+ return null;
+ }
+ }
+ }
+
+ // Line state variable
+ protected LineSegment currentLine;
+ protected int currentLineNumber;
+
+ // Span stack state variable
+ protected SpanStack currentSpanStack;
+
+ public virtual void MarkTokens(IDocument document)
+ {
+ if (Rules.Count == 0) {
+ return;
+ }
+
+ int lineNumber = 0;
+
+ while (lineNumber < document.TotalNumberOfLines) {
+ LineSegment previousLine = (lineNumber > 0 ? document.GetLineSegment(lineNumber - 1) : null);
+ if (lineNumber >= document.LineSegmentCollection.Count) { // may be, if the last line ends with a delimiter
+ break; // then the last line is not in the collection :)
+ }
+
+ currentSpanStack = ((previousLine != null && previousLine.HighlightSpanStack != null) ? previousLine.HighlightSpanStack.Clone() : null);
+
+ if (currentSpanStack != null) {
+ while (!currentSpanStack.IsEmpty && currentSpanStack.Peek().StopEOL)
+ {
+ currentSpanStack.Pop();
+ }
+ if (currentSpanStack.IsEmpty) currentSpanStack = null;
+ }
+
+ currentLine = (LineSegment)document.LineSegmentCollection[lineNumber];
+
+ if (currentLine.Length == -1) { // happens when buffer is empty !
+ return;
+ }
+
+ currentLineNumber = lineNumber;
+ List<TextWord> words = ParseLine(document);
+ // Alex: clear old words
+ if (currentLine.Words != null) {
+ currentLine.Words.Clear();
+ }
+ currentLine.Words = words;
+ currentLine.HighlightSpanStack = (currentSpanStack==null || currentSpanStack.IsEmpty) ? null : currentSpanStack;
+
+ ++lineNumber;
+ }
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ document.CommitUpdate();
+ currentLine = null;
+ }
+
+ bool MarkTokensInLine(IDocument document, int lineNumber, ref bool spanChanged)
+ {
+ currentLineNumber = lineNumber;
+ bool processNextLine = false;
+ LineSegment previousLine = (lineNumber > 0 ? document.GetLineSegment(lineNumber - 1) : null);
+
+ currentSpanStack = ((previousLine != null && previousLine.HighlightSpanStack != null) ? previousLine.HighlightSpanStack.Clone() : null);
+ if (currentSpanStack != null) {
+ while (!currentSpanStack.IsEmpty && currentSpanStack.Peek().StopEOL) {
+ currentSpanStack.Pop();
+ }
+ if (currentSpanStack.IsEmpty) {
+ currentSpanStack = null;
+ }
+ }
+
+ currentLine = (LineSegment)document.LineSegmentCollection[lineNumber];
+
+ if (currentLine.Length == -1) { // happens when buffer is empty !
+ return false;
+ }
+
+ List<TextWord> words = ParseLine(document);
+
+ if (currentSpanStack != null && currentSpanStack.IsEmpty) {
+ currentSpanStack = null;
+ }
+
+ // Check if the span state has changed, if so we must re-render the next line
+ // This check may seem utterly complicated but I didn't want to introduce any function calls
+ // or allocations here for perf reasons.
+ if(currentLine.HighlightSpanStack != currentSpanStack) {
+ if (currentLine.HighlightSpanStack == null) {
+ processNextLine = false;
+ foreach (Span sp in currentSpanStack) {
+ if (!sp.StopEOL) {
+ spanChanged = true;
+ processNextLine = true;
+ break;
+ }
+ }
+ } else if (currentSpanStack == null) {
+ processNextLine = false;
+ foreach (Span sp in currentLine.HighlightSpanStack) {
+ if (!sp.StopEOL) {
+ spanChanged = true;
+ processNextLine = true;
+ break;
+ }
+ }
+ } else {
+ SpanStack.Enumerator e1 = currentSpanStack.GetEnumerator();
+ SpanStack.Enumerator e2 = currentLine.HighlightSpanStack.GetEnumerator();
+ bool done = false;
+ while (!done) {
+ bool blockSpanIn1 = false;
+ while (e1.MoveNext()) {
+ if (!((Span)e1.Current).StopEOL) {
+ blockSpanIn1 = true;
+ break;
+ }
+ }
+ bool blockSpanIn2 = false;
+ while (e2.MoveNext()) {
+ if (!((Span)e2.Current).StopEOL) {
+ blockSpanIn2 = true;
+ break;
+ }
+ }
+ if (blockSpanIn1 || blockSpanIn2) {
+ if (blockSpanIn1 && blockSpanIn2) {
+ if (e1.Current != e2.Current) {
+ done = true;
+ processNextLine = true;
+ spanChanged = true;
+ }
+ } else {
+ spanChanged = true;
+ done = true;
+ processNextLine = true;
+ }
+ } else {
+ done = true;
+ processNextLine = false;
+ }
+ }
+ }
+ } else {
+ processNextLine = false;
+ }
+
+ //// Alex: remove old words
+ if (currentLine.Words!=null) currentLine.Words.Clear();
+ currentLine.Words = words;
+ currentLine.HighlightSpanStack = (currentSpanStack != null && !currentSpanStack.IsEmpty) ? currentSpanStack : null;
+
+ return processNextLine;
+ }
+
+ public virtual void MarkTokens(IDocument document, List<LineSegment> inputLines)
+ {
+ if (Rules.Count == 0) {
+ return;
+ }
+
+ Dictionary<LineSegment, bool> processedLines = new Dictionary<LineSegment, bool>();
+
+ bool spanChanged = false;
+ int documentLineSegmentCount = document.LineSegmentCollection.Count;
+
+ foreach (LineSegment lineToProcess in inputLines) {
+ if (!processedLines.ContainsKey(lineToProcess)) {
+ int lineNumber = lineToProcess.LineNumber;
+ bool processNextLine = true;
+
+ if (lineNumber != -1) {
+ while (processNextLine && lineNumber < documentLineSegmentCount) {
+ processNextLine = MarkTokensInLine(document, lineNumber, ref spanChanged);
+ processedLines[currentLine] = true;
+ ++lineNumber;
+ }
+ }
+ }
+ }
+
+ if (spanChanged || inputLines.Count > 20) {
+ // if the span was changed (more than inputLines lines had to be reevaluated)
+ // or if there are many lines in inputLines, it's faster to update the whole
+ // text area instead of many small segments
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ } else {
+// document.Caret.ValidateCaretPos();
+// document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, document.GetLineNumberForOffset(document.Caret.Offset)));
+//
+ foreach (LineSegment lineToProcess in inputLines) {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, lineToProcess.LineNumber));
+ }
+
+ }
+ document.CommitUpdate();
+ currentLine = null;
+ }
+
+ // Span state variables
+ protected bool inSpan;
+ protected Span activeSpan;
+ protected HighlightRuleSet activeRuleSet;
+
+ // Line scanning state variables
+ protected int currentOffset;
+ protected int currentLength;
+
+ void UpdateSpanStateVariables()
+ {
+ inSpan = (currentSpanStack != null && !currentSpanStack.IsEmpty);
+ activeSpan = inSpan ? currentSpanStack.Peek() : null;
+ activeRuleSet = GetRuleSet(activeSpan);
+ }
+
+ List<TextWord> ParseLine(IDocument document)
+ {
+ List<TextWord> words = new List<TextWord>();
+ HighlightColor markNext = null;
+
+ currentOffset = 0;
+ currentLength = 0;
+ UpdateSpanStateVariables();
+
+ int currentLineLength = currentLine.Length;
+ int currentLineOffset = currentLine.Offset;
+
+ for (int i = 0; i < currentLineLength; ++i) {
+ char ch = document.GetCharAt(currentLineOffset + i);
+ switch (ch) {
+ case '\n':
+ case '\r':
+ PushCurWord(document, ref markNext, words);
+ ++currentOffset;
+ break;
+ case ' ':
+ PushCurWord(document, ref markNext, words);
+ if (activeSpan != null && activeSpan.Color.HasBackground) {
+ words.Add(new TextWord.SpaceTextWord(activeSpan.Color));
+ } else {
+ words.Add(TextWord.Space);
+ }
+ ++currentOffset;
+ break;
+ case '\t':
+ PushCurWord(document, ref markNext, words);
+ if (activeSpan != null && activeSpan.Color.HasBackground) {
+ words.Add(new TextWord.TabTextWord(activeSpan.Color));
+ } else {
+ words.Add(TextWord.Tab);
+ }
+ ++currentOffset;
+ break;
+ default:
+ {
+ // handle escape characters
+ char escapeCharacter = '\0';
+ if (activeSpan != null && activeSpan.EscapeCharacter != '\0') {
+ escapeCharacter = activeSpan.EscapeCharacter;
+ } else if (activeRuleSet != null) {
+ escapeCharacter = activeRuleSet.EscapeCharacter;
+ }
+ if (escapeCharacter != '\0' && escapeCharacter == ch) {
+ // we found the escape character
+ if (activeSpan != null && activeSpan.End != null && activeSpan.End.Length == 1
+ && escapeCharacter == activeSpan.End[0])
+ {
+ // the escape character is a end-doubling escape character
+ // it may count as escape only when the next character is the escape, too
+ if (i + 1 < currentLineLength) {
+ if (document.GetCharAt(currentLineOffset + i + 1) == escapeCharacter) {
+ currentLength += 2;
+ PushCurWord(document, ref markNext, words);
+ ++i;
+ continue;
+ }
+ }
+ } else {
+ // this is a normal \-style escape
+ ++currentLength;
+ if (i + 1 < currentLineLength) {
+ ++currentLength;
+ }
+ PushCurWord(document, ref markNext, words);
+ ++i;
+ continue;
+ }
+ }
+
+ // highlight digits
+ if (!inSpan && (Char.IsDigit(ch) || (ch == '.' && i + 1 < currentLineLength && Char.IsDigit(document.GetCharAt(currentLineOffset + i + 1)))) && currentLength == 0) {
+ bool ishex = false;
+ bool isfloatingpoint = false;
+
+ if (ch == '0' && i + 1 < currentLineLength && Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1)) == 'X') { // hex digits
+ const string hex = "0123456789ABCDEF";
+ ++currentLength;
+ ++i; // skip 'x'
+ ++currentLength;
+ ishex = true;
+ while (i + 1 < currentLineLength && hex.IndexOf(Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1))) != -1) {
+ ++i;
+ ++currentLength;
+ }
+ } else {
+ ++currentLength;
+ while (i + 1 < currentLineLength && Char.IsDigit(document.GetCharAt(currentLineOffset + i + 1))) {
+ ++i;
+ ++currentLength;
+ }
+ }
+ if (!ishex && i + 1 < currentLineLength && document.GetCharAt(currentLineOffset + i + 1) == '.') {
+ isfloatingpoint = true;
+ ++i;
+ ++currentLength;
+ while (i + 1 < currentLineLength && Char.IsDigit(document.GetCharAt(currentLineOffset + i + 1))) {
+ ++i;
+ ++currentLength;
+ }
+ }
+
+ if (i + 1 < currentLineLength && Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1)) == 'E') {
+ isfloatingpoint = true;
+ ++i;
+ ++currentLength;
+ if (i + 1 < currentLineLength && (document.GetCharAt(currentLineOffset + i + 1) == '+' || document.GetCharAt(currentLine.Offset + i + 1) == '-')) {
+ ++i;
+ ++currentLength;
+ }
+ while (i + 1 < currentLine.Length && Char.IsDigit(document.GetCharAt(currentLineOffset + i + 1))) {
+ ++i;
+ ++currentLength;
+ }
+ }
+
+ if (i + 1 < currentLine.Length) {
+ char nextch = Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1));
+ if (nextch == 'F' || nextch == 'M' || nextch == 'D') {
+ isfloatingpoint = true;
+ ++i;
+ ++currentLength;
+ }
+ }
+
+ if (!isfloatingpoint) {
+ bool isunsigned = false;
+ if (i + 1 < currentLineLength && Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1)) == 'U') {
+ ++i;
+ ++currentLength;
+ isunsigned = true;
+ }
+ if (i + 1 < currentLineLength && Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1)) == 'L') {
+ ++i;
+ ++currentLength;
+ if (!isunsigned && i + 1 < currentLineLength && Char.ToUpper(document.GetCharAt(currentLineOffset + i + 1)) == 'U') {
+ ++i;
+ ++currentLength;
+ }
+ }
+ }
+
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, DigitColor, false));
+ currentOffset += currentLength;
+ currentLength = 0;
+ continue;
+ }
+
+ // Check for SPAN ENDs
+ if (inSpan) {
+ if (activeSpan.End != null && activeSpan.End.Length > 0) {
+ if (MatchExpr(currentLine, activeSpan.End, i, document, activeSpan.IgnoreCase)) {
+ PushCurWord(document, ref markNext, words);
+ string regex = GetRegString(currentLine, activeSpan.End, i, document);
+ currentLength += regex.Length;
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, activeSpan.EndColor, false));
+ currentOffset += currentLength;
+ currentLength = 0;
+ i += regex.Length - 1;
+ currentSpanStack.Pop();
+ UpdateSpanStateVariables();
+ continue;
+ }
+ }
+ }
+
+ // check for SPAN BEGIN
+ if (activeRuleSet != null) {
+ foreach (Span span in activeRuleSet.Spans) {
+ if ((!span.IsBeginSingleWord || currentLength == 0)
+ && (!span.IsBeginStartOfLine.HasValue || span.IsBeginStartOfLine.Value == (currentLength == 0 && words.TrueForAll(delegate(TextWord textWord) { return textWord.Type != TextWordType.Word; })))
+ && MatchExpr(currentLine, span.Begin, i, document, activeRuleSet.IgnoreCase)) {
+ PushCurWord(document, ref markNext, words);
+ string regex = GetRegString(currentLine, span.Begin, i, document);
+
+ if (!OverrideSpan(regex, document, words, span, ref i)) {
+ currentLength += regex.Length;
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, span.BeginColor, false));
+ currentOffset += currentLength;
+ currentLength = 0;
+
+ i += regex.Length - 1;
+ if (currentSpanStack == null) {
+ currentSpanStack = new SpanStack();
+ }
+ currentSpanStack.Push(span);
+ span.IgnoreCase = activeRuleSet.IgnoreCase;
+
+ UpdateSpanStateVariables();
+ }
+
+ goto skip;
+ }
+ }
+ }
+
+ // check if the char is a delimiter
+ if (activeRuleSet != null && (int)ch < 256 && activeRuleSet.Delimiters[(int)ch]) {
+ PushCurWord(document, ref markNext, words);
+ if (currentOffset + currentLength +1 < currentLine.Length) {
+ ++currentLength;
+ PushCurWord(document, ref markNext, words);
+ goto skip;
+ }
+ }
+
+ ++currentLength;
+ skip: continue;
+ }
+ }
+ }
+
+ PushCurWord(document, ref markNext, words);
+
+ OnParsedLine(document, currentLine, words);
+
+ return words;
+ }
+
+ protected virtual void OnParsedLine(IDocument document, LineSegment currentLine, List<TextWord> words)
+ {
+ }
+
+ protected virtual bool OverrideSpan(string spanBegin, IDocument document, List<TextWord> words, Span span, ref int lineOffset)
+ {
+ return false;
+ }
+
+ /// <summary>
+ /// pushes the curWord string on the word list, with the
+ /// correct color.
+ /// </summary>
+ void PushCurWord(IDocument document, ref HighlightColor markNext, List<TextWord> words)
+ {
+ // Svante Lidman : Need to look through the next prev logic.
+ if (currentLength > 0) {
+ if (words.Count > 0 && activeRuleSet != null) {
+ TextWord prevWord = null;
+ int pInd = words.Count - 1;
+ while (pInd >= 0) {
+ if (!((TextWord)words[pInd]).IsWhiteSpace) {
+ prevWord = (TextWord)words[pInd];
+ if (prevWord.HasDefaultColor) {
+ PrevMarker marker = (PrevMarker)activeRuleSet.PrevMarkers[document, currentLine, currentOffset, currentLength];
+ if (marker != null) {
+ prevWord.SyntaxColor = marker.Color;
+// document.Caret.ValidateCaretPos();
+// document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, document.GetLineNumberForOffset(document.Caret.Offset)));
+ }
+ }
+ break;
+ }
+ pInd--;
+ }
+ }
+
+ if (inSpan) {
+ HighlightColor c = null;
+ bool hasDefaultColor = true;
+ if (activeSpan.Rule == null) {
+ c = activeSpan.Color;
+ } else {
+ c = GetColor(activeRuleSet, document, currentLine, currentOffset, currentLength);
+ hasDefaultColor = false;
+ }
+
+ if (c == null) {
+ c = activeSpan.Color;
+ if (c.Color == Color.Transparent) {
+ c = this.DefaultTextColor;
+ }
+ hasDefaultColor = true;
+ }
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, markNext != null ? markNext : c, hasDefaultColor));
+ } else {
+ HighlightColor c = markNext != null ? markNext : GetColor(activeRuleSet, document, currentLine, currentOffset, currentLength);
+ if (c == null) {
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, this.DefaultTextColor, true));
+ } else {
+ words.Add(new TextWord(document, currentLine, currentOffset, currentLength, c, false));
+ }
+ }
+
+ if (activeRuleSet != null) {
+ NextMarker nextMarker = (NextMarker)activeRuleSet.NextMarkers[document, currentLine, currentOffset, currentLength];
+ if (nextMarker != null) {
+ if (nextMarker.MarkMarker && words.Count > 0) {
+ TextWord prevword = ((TextWord)words[words.Count - 1]);
+ prevword.SyntaxColor = nextMarker.Color;
+ }
+ markNext = nextMarker.Color;
+ } else {
+ markNext = null;
+ }
+ }
+ currentOffset += currentLength;
+ currentLength = 0;
+ }
+ }
+
+ #region Matching
+ /// <summary>
+ /// get the string, which matches the regular expression expr,
+ /// in string s2 at index
+ /// </summary>
+ static string GetRegString(LineSegment lineSegment, char[] expr, int index, IDocument document)
+ {
+ int j = 0;
+ StringBuilder regexpr = new StringBuilder();
+
+ for (int i = 0; i < expr.Length; ++i, ++j) {
+ if (index + j >= lineSegment.Length)
+ break;
+
+ switch (expr[i]) {
+ case '@': // "special" meaning
+ ++i;
+ if (i == expr.Length)
+ throw new HighlightingDefinitionInvalidException("Unexpected end of @ sequence, use @@ to look for a single @.");
+ switch (expr[i]) {
+ case '!': // don't match the following expression
+ StringBuilder whatmatch = new StringBuilder();
+ ++i;
+ while (i < expr.Length && expr[i] != '@') {
+ whatmatch.Append(expr[i++]);
+ }
+ break;
+ case '@': // matches @
+ regexpr.Append(document.GetCharAt(lineSegment.Offset + index + j));
+ break;
+ }
+ break;
+ default:
+ if (expr[i] != document.GetCharAt(lineSegment.Offset + index + j)) {
+ return regexpr.ToString();
+ }
+ regexpr.Append(document.GetCharAt(lineSegment.Offset + index + j));
+ break;
+ }
+ }
+ return regexpr.ToString();
+ }
+
+ /// <summary>
+ /// returns true, if the get the string s2 at index matches the expression expr
+ /// </summary>
+ static bool MatchExpr(LineSegment lineSegment, char[] expr, int index, IDocument document, bool ignoreCase)
+ {
+ for (int i = 0, j = 0; i < expr.Length; ++i, ++j) {
+ switch (expr[i]) {
+ case '@': // "special" meaning
+ ++i;
+ if (i == expr.Length)
+ throw new HighlightingDefinitionInvalidException("Unexpected end of @ sequence, use @@ to look for a single @.");
+ switch (expr[i]) {
+ case 'C': // match whitespace or punctuation
+ if (index + j == lineSegment.Offset || index + j >= lineSegment.Offset + lineSegment.Length) {
+ // nothing (EOL or SOL)
+ } else {
+ char ch = document.GetCharAt(lineSegment.Offset + index + j);
+ if (!Char.IsWhiteSpace(ch) && !Char.IsPunctuation(ch)) {
+ return false;
+ }
+ }
+ break;
+ case '!': // don't match the following expression
+ {
+ StringBuilder whatmatch = new StringBuilder();
+ ++i;
+ while (i < expr.Length && expr[i] != '@') {
+ whatmatch.Append(expr[i++]);
+ }
+ if (lineSegment.Offset + index + j + whatmatch.Length < document.TextLength) {
+ int k = 0;
+ for (; k < whatmatch.Length; ++k) {
+ char docChar = ignoreCase ? Char.ToUpperInvariant(document.GetCharAt(lineSegment.Offset + index + j + k)) : document.GetCharAt(lineSegment.Offset + index + j + k);
+ char spanChar = ignoreCase ? Char.ToUpperInvariant(whatmatch[k]) : whatmatch[k];
+ if (docChar != spanChar) {
+ break;
+ }
+ }
+ if (k >= whatmatch.Length) {
+ return false;
+ }
+ }
+// --j;
+ break;
+ }
+ case '-': // don't match the expression before
+ {
+ StringBuilder whatmatch = new StringBuilder();
+ ++i;
+ while (i < expr.Length && expr[i] != '@') {
+ whatmatch.Append(expr[i++]);
+ }
+ if (index - whatmatch.Length >= 0) {
+ int k = 0;
+ for (; k < whatmatch.Length; ++k) {
+ char docChar = ignoreCase ? Char.ToUpperInvariant(document.GetCharAt(lineSegment.Offset + index - whatmatch.Length + k)) : document.GetCharAt(lineSegment.Offset + index - whatmatch.Length + k);
+ char spanChar = ignoreCase ? Char.ToUpperInvariant(whatmatch[k]) : whatmatch[k];
+ if (docChar != spanChar)
+ break;
+ }
+ if (k >= whatmatch.Length) {
+ return false;
+ }
+ }
+// --j;
+ break;
+ }
+ case '@': // matches @
+ if (index + j >= lineSegment.Length || '@' != document.GetCharAt(lineSegment.Offset + index + j)) {
+ return false;
+ }
+ break;
+ }
+ break;
+ default:
+ {
+ if (index + j >= lineSegment.Length) {
+ return false;
+ }
+ char docChar = ignoreCase ? Char.ToUpperInvariant(document.GetCharAt(lineSegment.Offset + index + j)) : document.GetCharAt(lineSegment.Offset + index + j);
+ char spanChar = ignoreCase ? Char.ToUpperInvariant(expr[i]) : expr[i];
+ if (docChar != spanChar) {
+ return false;
+ }
+ break;
+ }
+ }
+ }
+ return true;
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/FontContainer.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/FontContainer.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/FontContainer.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,103 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This class is used to generate bold, italic and bold/italic fonts out
+ /// of a base font.
+ /// </summary>
+ public class FontContainer
+ {
+ Font defaultFont;
+ Font regularfont, boldfont, italicfont, bolditalicfont;
+
+ /// <value>
+ /// The scaled, regular version of the base font
+ /// </value>
+ public Font RegularFont {
+ get {
+ return regularfont;
+ }
+ }
+
+ /// <value>
+ /// The scaled, bold version of the base font
+ /// </value>
+ public Font BoldFont {
+ get {
+ return boldfont;
+ }
+ }
+
+ /// <value>
+ /// The scaled, italic version of the base font
+ /// </value>
+ public Font ItalicFont {
+ get {
+ return italicfont;
+ }
+ }
+
+ /// <value>
+ /// The scaled, bold/italic version of the base font
+ /// </value>
+ public Font BoldItalicFont {
+ get {
+ return bolditalicfont;
+ }
+ }
+
+ static float twipsPerPixelY;
+
+ public static float TwipsPerPixelY {
+ get {
+ if (twipsPerPixelY == 0) {
+ using (Bitmap bmp = new Bitmap(1,1)) {
+ using (Graphics g = Graphics.FromImage(bmp)) {
+ twipsPerPixelY = 1440 / g.DpiY;
+ }
+ }
+ }
+ return twipsPerPixelY;
+ }
+ }
+
+ /// <value>
+ /// The base font
+ /// </value>
+ public Font DefaultFont {
+ get {
+ return defaultFont;
+ }
+ set {
+ // 1440 twips is one inch
+ float pixelSize = (float)Math.Round(value.SizeInPoints * 20 / TwipsPerPixelY);
+
+ defaultFont = value;
+ regularfont = new Font(value.FontFamily, pixelSize * TwipsPerPixelY / 20f, FontStyle.Regular);
+ boldfont = new Font(regularfont, FontStyle.Bold);
+ italicfont = new Font(regularfont, FontStyle.Italic);
+ bolditalicfont = new Font(regularfont, FontStyle.Bold | FontStyle.Italic);
+ }
+ }
+
+ public static Font ParseFont(string font)
+ {
+ string[] descr = font.Split(new char[]{',', '='});
+ return new Font(descr[1], Single.Parse(descr[3]));
+ }
+
+ public FontContainer(Font defaultFont)
+ {
+ this.DefaultFont = defaultFont;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightBackground.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightBackground.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightBackground.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,51 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Extens the highlighting color with a background image.
+ /// </summary>
+ public class HighlightBackground : HighlightColor
+ {
+ Image backgroundImage;
+
+ /// <value>
+ /// The image used as background
+ /// </value>
+ public Image BackgroundImage {
+ get {
+ return backgroundImage;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightBackground"/>
+ /// </summary>
+ public HighlightBackground(XmlElement el) : base(el)
+ {
+ if (el.Attributes["image"] != null) {
+ backgroundImage = new Bitmap(el.Attributes["image"].InnerText);
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightBackground"/>
+ /// </summary>
+ public HighlightBackground(Color color, Color backgroundcolor, bool bold, bool italic) : base(color, backgroundcolor, bold, italic)
+ {
+ }
+
+ public HighlightBackground(string systemColor, string systemBackgroundColor, bool bold, bool italic) : base(systemColor, systemBackgroundColor, bold, italic)
+ {
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightColor.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightColor.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightColor.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,274 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+using System.Globalization;
+using System.Reflection;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// A color used for highlighting
+ /// </summary>
+ public class HighlightColor
+ {
+ Color color;
+ Color backgroundcolor = System.Drawing.Color.WhiteSmoke;
+
+ bool bold = false;
+ bool italic = false;
+ bool hasForeground = false;
+ bool hasBackground = false;
+
+ public bool HasForeground {
+ get {
+ return hasForeground;
+ }
+ }
+
+ public bool HasBackground {
+ get {
+ return hasBackground;
+ }
+ }
+
+
+ /// <value>
+ /// If true the font will be displayed bold style
+ /// </value>
+ public bool Bold {
+ get {
+ return bold;
+ }
+ }
+
+ /// <value>
+ /// If true the font will be displayed italic style
+ /// </value>
+ public bool Italic {
+ get {
+ return italic;
+ }
+ }
+
+ /// <value>
+ /// The background color used
+ /// </value>
+ public Color BackgroundColor {
+ get {
+ return backgroundcolor;
+ }
+ }
+
+ /// <value>
+ /// The foreground color used
+ /// </value>
+ public Color Color {
+ get {
+ return color;
+ }
+ }
+
+ /// <value>
+ /// The font used
+ /// </value>
+ public Font GetFont(FontContainer fontContainer)
+ {
+ if (Bold) {
+ return Italic ? fontContainer.BoldItalicFont : fontContainer.BoldFont;
+ }
+ return Italic ? fontContainer.ItalicFont : fontContainer.RegularFont;
+ }
+
+ Color ParseColorString(string colorName)
+ {
+ string[] cNames = colorName.Split('*');
+ PropertyInfo myPropInfo = typeof(System.Drawing.SystemColors).GetProperty(cNames[0], BindingFlags.Public |
+ BindingFlags.Instance |
+ BindingFlags.Static);
+ Color c = (Color)myPropInfo.GetValue(null, null);
+
+ if (cNames.Length == 2) {
+ // hack : can't figure out how to parse doubles with '.' (culture info might set the '.' to ',')
+ double factor = Double.Parse(cNames[1]) / 100;
+ c = Color.FromArgb((int)((double)c.R * factor), (int)((double)c.G * factor), (int)((double)c.B * factor));
+ }
+
+ return c;
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(XmlElement el)
+ {
+ Debug.Assert(el != null, "ICSharpCode.TextEditor.Document.SyntaxColor(XmlElement el) : el == null");
+ if (el.Attributes["bold"] != null) {
+ bold = Boolean.Parse(el.Attributes["bold"].InnerText);
+ }
+
+ if (el.Attributes["italic"] != null) {
+ italic = Boolean.Parse(el.Attributes["italic"].InnerText);
+ }
+
+ if (el.Attributes["color"] != null) {
+ string c = el.Attributes["color"].InnerText;
+ if (c[0] == '#') {
+ color = ParseColor(c);
+ } else if (c.StartsWith("SystemColors.")) {
+ color = ParseColorString(c.Substring("SystemColors.".Length));
+ } else {
+ color = (Color)(Color.GetType()).InvokeMember(c, BindingFlags.GetProperty, null, Color, new object[0]);
+ }
+ hasForeground = true;
+ } else {
+ color = Color.Transparent; // to set it to the default value.
+ }
+
+ if (el.Attributes["bgcolor"] != null) {
+ string c = el.Attributes["bgcolor"].InnerText;
+ if (c[0] == '#') {
+ backgroundcolor = ParseColor(c);
+ } else if (c.StartsWith("SystemColors.")) {
+ backgroundcolor = ParseColorString(c.Substring("SystemColors.".Length));
+ } else {
+ backgroundcolor = (Color)(Color.GetType()).InvokeMember(c, BindingFlags.GetProperty, null, Color, new object[0]);
+ }
+ hasBackground = true;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(XmlElement el, HighlightColor defaultColor)
+ {
+ Debug.Assert(el != null, "ICSharpCode.TextEditor.Document.SyntaxColor(XmlElement el) : el == null");
+ if (el.Attributes["bold"] != null) {
+ bold = Boolean.Parse(el.Attributes["bold"].InnerText);
+ } else {
+ bold = defaultColor.Bold;
+ }
+
+ if (el.Attributes["italic"] != null) {
+ italic = Boolean.Parse(el.Attributes["italic"].InnerText);
+ } else {
+ italic = defaultColor.Italic;
+ }
+
+ if (el.Attributes["color"] != null) {
+ string c = el.Attributes["color"].InnerText;
+ if (c[0] == '#') {
+ color = ParseColor(c);
+ } else if (c.StartsWith("SystemColors.")) {
+ color = ParseColorString(c.Substring("SystemColors.".Length));
+ } else {
+ color = (Color)(Color.GetType()).InvokeMember(c, BindingFlags.GetProperty, null, Color, new object[0]);
+ }
+ hasForeground = true;
+ } else {
+ color = defaultColor.color;
+ }
+
+ if (el.Attributes["bgcolor"] != null) {
+ string c = el.Attributes["bgcolor"].InnerText;
+ if (c[0] == '#') {
+ backgroundcolor = ParseColor(c);
+ } else if (c.StartsWith("SystemColors.")) {
+ backgroundcolor = ParseColorString(c.Substring("SystemColors.".Length));
+ } else {
+ backgroundcolor = (Color)(Color.GetType()).InvokeMember(c, BindingFlags.GetProperty, null, Color, new object[0]);
+ }
+ hasBackground = true;
+ } else {
+ backgroundcolor = defaultColor.BackgroundColor;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(Color color, bool bold, bool italic)
+ {
+ hasForeground = true;
+ this.color = color;
+ this.bold = bold;
+ this.italic = italic;
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(Color color, Color backgroundcolor, bool bold, bool italic)
+ {
+ hasForeground = true;
+ hasBackground = true;
+ this.color = color;
+ this.backgroundcolor = backgroundcolor;
+ this.bold = bold;
+ this.italic = italic;
+ }
+
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(string systemColor, string systemBackgroundColor, bool bold, bool italic)
+ {
+ hasForeground = true;
+ hasBackground = true;
+
+ this.color = ParseColorString(systemColor);
+ this.backgroundcolor = ParseColorString(systemBackgroundColor);
+
+ this.bold = bold;
+ this.italic = italic;
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="HighlightColor"/>
+ /// </summary>
+ public HighlightColor(string systemColor, bool bold, bool italic)
+ {
+ hasForeground = true;
+
+ this.color = ParseColorString(systemColor);
+
+ this.bold = bold;
+ this.italic = italic;
+ }
+
+ static Color ParseColor(string c)
+ {
+ int a = 255;
+ int offset = 0;
+ if (c.Length > 7) {
+ offset = 2;
+ a = Int32.Parse(c.Substring(1,2), NumberStyles.HexNumber);
+ }
+
+ int r = Int32.Parse(c.Substring(1 + offset,2), NumberStyles.HexNumber);
+ int g = Int32.Parse(c.Substring(3 + offset,2), NumberStyles.HexNumber);
+ int b = Int32.Parse(c.Substring(5 + offset,2), NumberStyles.HexNumber);
+ return Color.FromArgb(a, r, g, b);
+ }
+
+ /// <summary>
+ /// Converts a <see cref="HighlightColor"/> instance to string (for debug purposes)
+ /// </summary>
+ public override string ToString()
+ {
+ return "[HighlightColor: Bold = " + Bold +
+ ", Italic = " + Italic +
+ ", Color = " + Color +
+ ", BackgroundColor = " + BackgroundColor + "]";
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightInfo.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightInfo.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightInfo.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,25 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class HighlightInfo
+ {
+ public bool BlockSpanOn = false;
+ public bool Span = false;
+ public Span CurSpan = null;
+
+ public HighlightInfo(Span curSpan, bool span, bool blockSpanOn)
+ {
+ this.CurSpan = curSpan;
+ this.Span = span;
+ this.BlockSpanOn = blockSpanOn;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightRuleSet.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightRuleSet.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightRuleSet.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,182 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections;
+using System.Xml;
+
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class HighlightRuleSet
+ {
+ LookupTable keyWords;
+ ArrayList spans = new ArrayList();
+ LookupTable prevMarkers;
+ LookupTable nextMarkers;
+ char escapeCharacter;
+
+ bool ignoreCase = false;
+ string name = null;
+
+ bool[] delimiters = new bool[256];
+
+ string reference = null;
+
+ public ArrayList Spans {
+ get {
+ return spans;
+ }
+ }
+
+ internal IHighlightingStrategyUsingRuleSets Highlighter;
+
+ public LookupTable KeyWords {
+ get {
+ return keyWords;
+ }
+ }
+
+ public LookupTable PrevMarkers {
+ get {
+ return prevMarkers;
+ }
+ }
+
+ public LookupTable NextMarkers {
+ get {
+ return nextMarkers;
+ }
+ }
+
+ public bool[] Delimiters {
+ get {
+ return delimiters;
+ }
+ }
+
+ public char EscapeCharacter {
+ get {
+ return escapeCharacter;
+ }
+ }
+
+ public bool IgnoreCase {
+ get {
+ return ignoreCase;
+ }
+ }
+
+ public string Name {
+ get {
+ return name;
+ }
+ set {
+ name = value;
+ }
+ }
+
+ public string Reference {
+ get {
+ return reference;
+ }
+ }
+
+ public HighlightRuleSet()
+ {
+ keyWords = new LookupTable(false);
+ prevMarkers = new LookupTable(false);
+ nextMarkers = new LookupTable(false);
+ }
+
+ public HighlightRuleSet(XmlElement el)
+ {
+ XmlNodeList nodes;
+
+ if (el.Attributes["name"] != null) {
+ Name = el.Attributes["name"].InnerText;
+ }
+
+ if (el.HasAttribute("escapecharacter")) {
+ escapeCharacter = el.GetAttribute("escapecharacter")[0];
+ }
+
+ if (el.Attributes["reference"] != null) {
+ reference = el.Attributes["reference"].InnerText;
+ }
+
+ if (el.Attributes["ignorecase"] != null) {
+ ignoreCase = Boolean.Parse(el.Attributes["ignorecase"].InnerText);
+ }
+
+ for (int i = 0; i < Delimiters.Length; ++i) {
+ delimiters[i] = false;
+ }
+
+ if (el["Delimiters"] != null) {
+ string delimiterString = el["Delimiters"].InnerText;
+ foreach (char ch in delimiterString) {
+ delimiters[(int)ch] = true;
+ }
+ }
+
+// Spans = new LookupTable(!IgnoreCase);
+
+ keyWords = new LookupTable(!IgnoreCase);
+ prevMarkers = new LookupTable(!IgnoreCase);
+ nextMarkers = new LookupTable(!IgnoreCase);
+
+ nodes = el.GetElementsByTagName("KeyWords");
+ foreach (XmlElement el2 in nodes) {
+ HighlightColor color = new HighlightColor(el2);
+
+ XmlNodeList keys = el2.GetElementsByTagName("Key");
+ foreach (XmlElement node in keys) {
+ keyWords[node.Attributes["word"].InnerText] = color;
+ }
+ }
+
+ nodes = el.GetElementsByTagName("Span");
+ foreach (XmlElement el2 in nodes) {
+ Spans.Add(new Span(el2));
+ /*
+ Span span = new Span(el2);
+ Spans[span.Begin] = span;*/
+ }
+
+ nodes = el.GetElementsByTagName("MarkPrevious");
+ foreach (XmlElement el2 in nodes) {
+ PrevMarker prev = new PrevMarker(el2);
+ prevMarkers[prev.What] = prev;
+ }
+
+ nodes = el.GetElementsByTagName("MarkFollowing");
+ foreach (XmlElement el2 in nodes) {
+ NextMarker next = new NextMarker(el2);
+ nextMarkers[next.What] = next;
+ }
+ }
+
+ /// <summary>
+ /// Merges spans etc. from the other rule set into this rule set.
+ /// </summary>
+ public void MergeFrom(HighlightRuleSet ruleSet)
+ {
+ for (int i = 0; i < delimiters.Length; i++) {
+ delimiters[i] |= ruleSet.delimiters[i];
+ }
+ // insert merged spans in front of old spans
+ ArrayList oldSpans = spans;
+ spans = (ArrayList)ruleSet.spans.Clone();
+ spans.AddRange(oldSpans);
+ //keyWords.MergeFrom(ruleSet.keyWords);
+ //prevMarkers.MergeFrom(ruleSet.prevMarkers);
+ //nextMarkers.MergeFrom(ruleSet.nextMarkers);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingColorNotFoundException.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingColorNotFoundException.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingColorNotFoundException.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,32 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Runtime.Serialization;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ [Serializable()]
+ public class HighlightingColorNotFoundException : Exception
+ {
+ public HighlightingColorNotFoundException() : base()
+ {
+ }
+
+ public HighlightingColorNotFoundException(string message) : base(message)
+ {
+ }
+
+ public HighlightingColorNotFoundException(string message, Exception innerException) : base(message, innerException)
+ {
+ }
+
+ protected HighlightingColorNotFoundException(SerializationInfo info, StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionInvalidException.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionInvalidException.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionInvalidException.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,37 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Runtime.Serialization;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Indicates that the highlighting definition that was tried to load was invalid.
+ /// You get this exception only once per highlighting definition, after that the definition
+ /// is replaced with the default highlighter.
+ /// </summary>
+ [Serializable()]
+ public class HighlightingDefinitionInvalidException : Exception
+ {
+ public HighlightingDefinitionInvalidException() : base()
+ {
+ }
+
+ public HighlightingDefinitionInvalidException(string message) : base(message)
+ {
+ }
+
+ public HighlightingDefinitionInvalidException(string message, Exception innerException) : base(message, innerException)
+ {
+ }
+
+ protected HighlightingDefinitionInvalidException(SerializationInfo info, StreamingContext context) : base(info, context)
+ {
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionParser.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionParser.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingDefinitionParser.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,110 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+using System.Xml;
+using System.Xml.Schema;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public static class HighlightingDefinitionParser
+ {
+ public static DefaultHighlightingStrategy Parse(SyntaxMode syntaxMode, XmlReader xmlReader)
+ {
+ return Parse(null, syntaxMode, xmlReader);
+ }
+
+ public static DefaultHighlightingStrategy Parse(DefaultHighlightingStrategy highlighter, SyntaxMode syntaxMode, XmlReader xmlReader)
+ {
+ if (syntaxMode == null)
+ throw new ArgumentNullException("syntaxMode");
+ if (xmlReader == null)
+ throw new ArgumentNullException("xmlTextReader");
+ try {
+ List<ValidationEventArgs> errors = null;
+ XmlReaderSettings settings = new XmlReaderSettings();
+ Stream shemaStream = typeof(HighlightingDefinitionParser).Assembly.GetManifestResourceStream("ICSharpCode.TextEditor.Resources.Mode.xsd");
+ settings.Schemas.Add("", new XmlTextReader(shemaStream));
+ settings.Schemas.ValidationEventHandler += delegate(object sender, ValidationEventArgs args) {
+ if (errors == null) {
+ errors = new List<ValidationEventArgs>();
+ }
+ errors.Add(args);
+ };
+ settings.ValidationType = ValidationType.Schema;
+ XmlReader validatingReader = XmlReader.Create(xmlReader, settings);
+
+ XmlDocument doc = new XmlDocument();
+ doc.Load(validatingReader);
+
+ if (highlighter == null)
+ highlighter = new DefaultHighlightingStrategy(doc.DocumentElement.Attributes["name"].InnerText);
+
+ if (doc.DocumentElement.HasAttribute("extends")) {
+ KeyValuePair<SyntaxMode, ISyntaxModeFileProvider> entry = HighlightingManager.Manager.FindHighlighterEntry(doc.DocumentElement.GetAttribute("extends"));
+ if (entry.Key == null) {
+ throw new HighlightingDefinitionInvalidException("Cannot find referenced highlighting source " + doc.DocumentElement.GetAttribute("extends"));
+ } else {
+ highlighter = Parse(highlighter, entry.Key, entry.Value.GetSyntaxModeFile(entry.Key));
+ if (highlighter == null) return null;
+ }
+ }
+ if (doc.DocumentElement.HasAttribute("extensions")) {
+ highlighter.Extensions = doc.DocumentElement.GetAttribute("extensions").Split(new char[] { ';', '|' });
+ }
+
+ XmlElement environment = doc.DocumentElement["Environment"];
+ if (environment != null) {
+ foreach (XmlNode node in environment.ChildNodes) {
+ if (node is XmlElement) {
+ XmlElement el = (XmlElement)node;
+ if (el.Name == "Custom") {
+ highlighter.SetColorFor(el.GetAttribute("name"), el.HasAttribute("bgcolor") ? new HighlightBackground(el) : new HighlightColor(el));
+ } else {
+ highlighter.SetColorFor(el.Name, el.HasAttribute("bgcolor") ? new HighlightBackground(el) : new HighlightColor(el));
+ }
+ }
+ }
+ }
+
+ // parse properties
+ if (doc.DocumentElement["Properties"]!= null) {
+ foreach (XmlElement propertyElement in doc.DocumentElement["Properties"].ChildNodes) {
+ highlighter.Properties[propertyElement.Attributes["name"].InnerText] = propertyElement.Attributes["value"].InnerText;
+ }
+ }
+
+ if (doc.DocumentElement["Digits"]!= null) {
+ highlighter.DigitColor = new HighlightColor(doc.DocumentElement["Digits"]);
+ }
+
+ XmlNodeList nodes = doc.DocumentElement.GetElementsByTagName("RuleSet");
+ foreach (XmlElement element in nodes) {
+ highlighter.AddRuleSet(new HighlightRuleSet(element));
+ }
+
+ xmlReader.Close();
+
+ if (errors != null) {
+ StringBuilder msg = new StringBuilder();
+ foreach (ValidationEventArgs args in errors) {
+ msg.AppendLine(args.Message);
+ }
+ throw new HighlightingDefinitionInvalidException(msg.ToString());
+ } else {
+ return highlighter;
+ }
+ } catch (Exception e) {
+ throw new HighlightingDefinitionInvalidException("Could not load mode definition file '" + syntaxMode.FileName + "'.\n", e);
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingManager.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingManager.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingManager.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,166 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Diagnostics;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class HighlightingManager
+ {
+ ArrayList syntaxModeFileProviders = new ArrayList();
+ static HighlightingManager highlightingManager;
+
+ // hash table from extension name to highlighting definition,
+ // OR from extension name to Pair SyntaxMode,ISyntaxModeFileProvider
+ Hashtable highlightingDefs = new Hashtable();
+
+ Hashtable extensionsToName = new Hashtable();
+
+ public Hashtable HighlightingDefinitions {
+ get {
+ return highlightingDefs;
+ }
+ }
+
+ public static HighlightingManager Manager {
+ get {
+ return highlightingManager;
+ }
+ }
+
+ static HighlightingManager()
+ {
+ highlightingManager = new HighlightingManager();
+ highlightingManager.AddSyntaxModeFileProvider(new ResourceSyntaxModeProvider());
+ }
+
+ public HighlightingManager()
+ {
+ CreateDefaultHighlightingStrategy();
+ }
+
+ public void AddSyntaxModeFileProvider(ISyntaxModeFileProvider syntaxModeFileProvider)
+ {
+ foreach (SyntaxMode syntaxMode in syntaxModeFileProvider.SyntaxModes) {
+ highlightingDefs[syntaxMode.Name] = new DictionaryEntry(syntaxMode, syntaxModeFileProvider);
+ foreach (string extension in syntaxMode.Extensions) {
+ extensionsToName[extension.ToUpperInvariant()] = syntaxMode.Name;
+ }
+ }
+ if (!syntaxModeFileProviders.Contains(syntaxModeFileProvider)) {
+ syntaxModeFileProviders.Add(syntaxModeFileProvider);
+ }
+ }
+
+ public void AddHighlightingStrategy(IHighlightingStrategy highlightingStrategy)
+ {
+ highlightingDefs[highlightingStrategy.Name] = highlightingStrategy;
+ foreach (string extension in highlightingStrategy.Extensions)
+ {
+ extensionsToName[extension.ToUpperInvariant()] = highlightingStrategy.Name;
+ }
+ }
+
+ public void ReloadSyntaxModes()
+ {
+ highlightingDefs.Clear();
+ extensionsToName.Clear();
+ CreateDefaultHighlightingStrategy();
+ foreach (ISyntaxModeFileProvider provider in syntaxModeFileProviders) {
+ provider.UpdateSyntaxModeList();
+ AddSyntaxModeFileProvider(provider);
+ }
+ OnReloadSyntaxHighlighting(EventArgs.Empty);
+ }
+
+ void CreateDefaultHighlightingStrategy()
+ {
+ DefaultHighlightingStrategy defaultHighlightingStrategy = new DefaultHighlightingStrategy();
+ defaultHighlightingStrategy.Extensions = new string[] {};
+ defaultHighlightingStrategy.Rules.Add(new HighlightRuleSet());
+ highlightingDefs["Default"] = defaultHighlightingStrategy;
+ }
+
+ IHighlightingStrategy LoadDefinition(DictionaryEntry entry)
+ {
+ SyntaxMode syntaxMode = (SyntaxMode)entry.Key;
+ ISyntaxModeFileProvider syntaxModeFileProvider = (ISyntaxModeFileProvider)entry.Value;
+
+ DefaultHighlightingStrategy highlightingStrategy = null;
+ try {
+ var reader = syntaxModeFileProvider.GetSyntaxModeFile(syntaxMode);
+ if (reader == null)
+ throw new HighlightingDefinitionInvalidException("Could not get syntax mode file for " + syntaxMode.Name);
+ highlightingStrategy = HighlightingDefinitionParser.Parse(syntaxMode, reader);
+ if (highlightingStrategy.Name != syntaxMode.Name) {
+ throw new HighlightingDefinitionInvalidException("The name specified in the .xshd '" + highlightingStrategy.Name + "' must be equal the syntax mode name '" + syntaxMode.Name + "'");
+ }
+ } finally {
+ if (highlightingStrategy == null) {
+ highlightingStrategy = DefaultHighlighting;
+ }
+ highlightingDefs[syntaxMode.Name] = highlightingStrategy;
+ highlightingStrategy.ResolveReferences();
+ }
+ return highlightingStrategy;
+ }
+
+ public DefaultHighlightingStrategy DefaultHighlighting {
+ get {
+ return (DefaultHighlightingStrategy)highlightingDefs["Default"];
+ }
+ }
+
+ internal KeyValuePair<SyntaxMode, ISyntaxModeFileProvider> FindHighlighterEntry(string name)
+ {
+ foreach (ISyntaxModeFileProvider provider in syntaxModeFileProviders) {
+ foreach (SyntaxMode mode in provider.SyntaxModes) {
+ if (mode.Name == name) {
+ return new KeyValuePair<SyntaxMode, ISyntaxModeFileProvider>(mode, provider);
+ }
+ }
+ }
+ return new KeyValuePair<SyntaxMode, ISyntaxModeFileProvider>(null, null);
+ }
+
+ public IHighlightingStrategy FindHighlighter(string name)
+ {
+ object def = highlightingDefs[name];
+ if (def is DictionaryEntry) {
+ return LoadDefinition((DictionaryEntry)def);
+ }
+ return def == null ? DefaultHighlighting : (IHighlightingStrategy)def;
+ }
+
+ public IHighlightingStrategy FindHighlighterForFile(string fileName)
+ {
+ string highlighterName = (string)extensionsToName[Path.GetExtension(fileName).ToUpperInvariant()];
+ if (highlighterName != null) {
+ object def = highlightingDefs[highlighterName];
+ if (def is DictionaryEntry) {
+ return LoadDefinition((DictionaryEntry)def);
+ }
+ return def == null ? DefaultHighlighting : (IHighlightingStrategy)def;
+ } else {
+ return DefaultHighlighting;
+ }
+ }
+
+ protected virtual void OnReloadSyntaxHighlighting(EventArgs e)
+ {
+ if (ReloadSyntaxHighlighting != null) {
+ ReloadSyntaxHighlighting(this, e);
+ }
+ }
+
+ public event EventHandler ReloadSyntaxHighlighting;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingStrategyFactory.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingStrategyFactory.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/HighlightingStrategyFactory.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,38 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class HighlightingStrategyFactory
+ {
+ public static IHighlightingStrategy CreateHighlightingStrategy()
+ {
+ return (IHighlightingStrategy)HighlightingManager.Manager.HighlightingDefinitions["Default"];
+ }
+
+ public static IHighlightingStrategy CreateHighlightingStrategy(string name)
+ {
+ IHighlightingStrategy highlightingStrategy = HighlightingManager.Manager.FindHighlighter(name);
+
+ if (highlightingStrategy == null) {
+ return CreateHighlightingStrategy();
+ }
+ return highlightingStrategy;
+ }
+
+ public static IHighlightingStrategy CreateHighlightingStrategyForFile(string fileName)
+ {
+ IHighlightingStrategy highlightingStrategy = HighlightingManager.Manager.FindHighlighterForFile(fileName);
+ if (highlightingStrategy == null) {
+ return CreateHighlightingStrategy();
+ }
+ return highlightingStrategy;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/IHighlightingStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/IHighlightingStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/IHighlightingStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,67 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// A highlighting strategy for a buffer.
+ /// </summary>
+ public interface IHighlightingStrategy
+ {
+ /// <value>
+ /// The name of the highlighting strategy, must be unique
+ /// </value>
+ string Name {
+ get;
+ }
+
+ /// <value>
+ /// The file extenstions on which this highlighting strategy gets
+ /// used
+ /// </value>
+ string[] Extensions {
+ get;
+ }
+
+ Dictionary<string, string> Properties {
+ get;
+ }
+
+ // returns special color. (BackGround Color, Cursor Color and so on)
+
+ /// <remarks>
+ /// Gets the color of an Environment element.
+ /// </remarks>
+ HighlightColor GetColorFor(string name);
+
+ /// <remarks>
+ /// Used internally, do not call
+ /// </remarks>
+ void MarkTokens(IDocument document, List<LineSegment> lines);
+
+ /// <remarks>
+ /// Used internally, do not call
+ /// </remarks>
+ void MarkTokens(IDocument document);
+ }
+
+ public interface IHighlightingStrategyUsingRuleSets : IHighlightingStrategy
+ {
+ /// <remarks>
+ /// Used internally, do not call
+ /// </remarks>
+ HighlightRuleSet GetRuleSet(Span span);
+
+ /// <remarks>
+ /// Used internally, do not call
+ /// </remarks>
+ HighlightColor GetColor(IDocument document, LineSegment keyWord, int index, int length);
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/NextMarker.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/NextMarker.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/NextMarker.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,63 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Used for mark next token
+ /// </summary>
+ public class NextMarker
+ {
+ string what;
+ HighlightColor color;
+ bool markMarker = false;
+
+ /// <value>
+ /// String value to indicate to mark next token
+ /// </value>
+ public string What {
+ get {
+ return what;
+ }
+ }
+
+ /// <value>
+ /// Color for marking next token
+ /// </value>
+ public HighlightColor Color {
+ get {
+ return color;
+ }
+ }
+
+ /// <value>
+ /// If true the indication text will be marked with the same color
+ /// too
+ /// </value>
+ public bool MarkMarker {
+ get {
+ return markMarker;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="NextMarker"/>
+ /// </summary>
+ public NextMarker(XmlElement mark)
+ {
+ color = new HighlightColor(mark);
+ what = mark.InnerText;
+ if (mark.Attributes["markmarker"] != null) {
+ markMarker = Boolean.Parse(mark.Attributes["markmarker"].InnerText);
+ }
+ }
+ }
+
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/PrevMarker.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/PrevMarker.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/PrevMarker.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,63 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Used for mark previous token
+ /// </summary>
+ public class PrevMarker
+ {
+ string what;
+ HighlightColor color;
+ bool markMarker = false;
+
+ /// <value>
+ /// String value to indicate to mark previous token
+ /// </value>
+ public string What {
+ get {
+ return what;
+ }
+ }
+
+ /// <value>
+ /// Color for marking previous token
+ /// </value>
+ public HighlightColor Color {
+ get {
+ return color;
+ }
+ }
+
+ /// <value>
+ /// If true the indication text will be marked with the same color
+ /// too
+ /// </value>
+ public bool MarkMarker {
+ get {
+ return markMarker;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="PrevMarker"/>
+ /// </summary>
+ public PrevMarker(XmlElement mark)
+ {
+ color = new HighlightColor(mark);
+ what = mark.InnerText;
+ if (mark.Attributes["markmarker"] != null) {
+ markMarker = Boolean.Parse(mark.Attributes["markmarker"].InnerText);
+ }
+ }
+ }
+
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/Span.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/Span.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/Span.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,157 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public sealed class Span
+ {
+ bool stopEOL;
+ HighlightColor color;
+ HighlightColor beginColor;
+ HighlightColor endColor;
+ char[] begin;
+ char[] end;
+ string name;
+ string rule;
+ HighlightRuleSet ruleSet;
+ char escapeCharacter;
+ bool ignoreCase;
+ bool isBeginSingleWord;
+ bool? isBeginStartOfLine;
+ bool isEndSingleWord;
+
+ internal HighlightRuleSet RuleSet {
+ get {
+ return ruleSet;
+ }
+ set {
+ ruleSet = value;
+ }
+ }
+
+ public bool IgnoreCase {
+ get {
+ return ignoreCase;
+ }
+ set {
+ ignoreCase = value;
+ }
+ }
+
+ public bool StopEOL {
+ get {
+ return stopEOL;
+ }
+ }
+
+ public bool? IsBeginStartOfLine {
+ get {
+ return isBeginStartOfLine;
+ }
+ }
+
+ public bool IsBeginSingleWord {
+ get {
+ return isBeginSingleWord;
+ }
+ }
+
+ public bool IsEndSingleWord {
+ get {
+ return isEndSingleWord;
+ }
+ }
+
+ public HighlightColor Color {
+ get {
+ return color;
+ }
+ }
+
+ public HighlightColor BeginColor {
+ get {
+ if(beginColor != null) {
+ return beginColor;
+ } else {
+ return color;
+ }
+ }
+ }
+
+ public HighlightColor EndColor {
+ get {
+ return endColor!=null ? endColor : color;
+ }
+ }
+
+ public char[] Begin {
+ get { return begin; }
+ }
+
+ public char[] End {
+ get { return end; }
+ }
+
+ public string Name {
+ get { return name; }
+ }
+
+ public string Rule {
+ get { return rule; }
+ }
+
+ /// <summary>
+ /// Gets the escape character of the span. The escape character is a character that can be used in front
+ /// of the span end to make it not end the span. The escape character followed by another escape character
+ /// means the escape character was escaped like in @"a "" b" literals in C#.
+ /// The default value '\0' means no escape character is allowed.
+ /// </summary>
+ public char EscapeCharacter {
+ get { return escapeCharacter; }
+ }
+
+ public Span(XmlElement span)
+ {
+ color = new HighlightColor(span);
+
+ if (span.HasAttribute("rule")) {
+ rule = span.GetAttribute("rule");
+ }
+
+ if (span.HasAttribute("escapecharacter")) {
+ escapeCharacter = span.GetAttribute("escapecharacter")[0];
+ }
+
+ name = span.GetAttribute("name");
+ if (span.HasAttribute("stopateol")) {
+ stopEOL = Boolean.Parse(span.GetAttribute("stopateol"));
+ }
+
+ begin = span["Begin"].InnerText.ToCharArray();
+ beginColor = new HighlightColor(span["Begin"], color);
+
+ if (span["Begin"].HasAttribute("singleword")) {
+ this.isBeginSingleWord = Boolean.Parse(span["Begin"].GetAttribute("singleword"));
+ }
+ if (span["Begin"].HasAttribute("startofline")) {
+ this.isBeginStartOfLine = Boolean.Parse(span["Begin"].GetAttribute("startofline"));
+ }
+
+ if (span["End"] != null) {
+ end = span["End"].InnerText.ToCharArray();
+ endColor = new HighlightColor(span["End"], color);
+ if (span["End"].HasAttribute("singleword")) {
+ this.isEndSingleWord = Boolean.Parse(span["End"].GetAttribute("singleword"));
+ }
+
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SpanStack.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SpanStack.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SpanStack.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,118 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// A stack of Span instances. Works like Stack<Span>, but can be cloned quickly
+ /// because it is implemented as linked list.
+ /// </summary>
+ public sealed class SpanStack : ICloneable, IEnumerable<Span>
+ {
+ internal sealed class StackNode
+ {
+ public readonly StackNode Previous;
+ public readonly Span Data;
+
+ public StackNode(StackNode previous, Span data)
+ {
+ this.Previous = previous;
+ this.Data = data;
+ }
+ }
+
+ StackNode top = null;
+
+ public Span Pop()
+ {
+ Span s = top.Data;
+ top = top.Previous;
+ return s;
+ }
+
+ public Span Peek()
+ {
+ return top.Data;
+ }
+
+ public void Push(Span s)
+ {
+ top = new StackNode(top, s);
+ }
+
+ public bool IsEmpty {
+ get {
+ return top == null;
+ }
+ }
+
+ public SpanStack Clone()
+ {
+ SpanStack n = new SpanStack();
+ n.top = this.top;
+ return n;
+ }
+ object ICloneable.Clone()
+ {
+ return this.Clone();
+ }
+
+ public Enumerator GetEnumerator()
+ {
+ return new Enumerator(new StackNode(top, null));
+ }
+ IEnumerator<Span> IEnumerable<Span>.GetEnumerator()
+ {
+ return this.GetEnumerator();
+ }
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return this.GetEnumerator();
+ }
+
+ public struct Enumerator : IEnumerator<Span>
+ {
+ StackNode c;
+
+ internal Enumerator(StackNode node)
+ {
+ c = node;
+ }
+
+ public Span Current {
+ get {
+ return c.Data;
+ }
+ }
+
+ object System.Collections.IEnumerator.Current {
+ get {
+ return c.Data;
+ }
+ }
+
+ public void Dispose()
+ {
+ c = null;
+ }
+
+ public bool MoveNext()
+ {
+ c = c.Previous;
+ return c != null;
+ }
+
+ public void Reset()
+ {
+ throw new NotSupportedException();
+ }
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/FileSyntaxModeProvider.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/FileSyntaxModeProvider.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/FileSyntaxModeProvider.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,84 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows.Forms;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class FileSyntaxModeProvider : ISyntaxModeFileProvider
+ {
+ string directory;
+ List<SyntaxMode> syntaxModes = null;
+
+ public ICollection<SyntaxMode> SyntaxModes {
+ get {
+ return syntaxModes;
+ }
+ }
+
+ public FileSyntaxModeProvider(string directory)
+ {
+ this.directory = directory;
+ UpdateSyntaxModeList();
+ }
+
+ public void UpdateSyntaxModeList()
+ {
+ string syntaxModeFile = Path.Combine(directory, "SyntaxModes.xml");
+ if (File.Exists(syntaxModeFile)) {
+ Stream s = File.OpenRead(syntaxModeFile);
+ syntaxModes = SyntaxMode.GetSyntaxModes(s);
+ s.Close();
+ } else {
+ syntaxModes = ScanDirectory(directory);
+ }
+ }
+
+ public XmlTextReader GetSyntaxModeFile(SyntaxMode syntaxMode)
+ {
+ string syntaxModeFile = Path.Combine(directory, syntaxMode.FileName);
+ if (!File.Exists(syntaxModeFile)) {
+ throw new HighlightingDefinitionInvalidException("Can't load highlighting definition " + syntaxModeFile + " (file not found)!");
+ }
+ return new XmlTextReader(File.OpenRead(syntaxModeFile));
+ }
+
+ List<SyntaxMode> ScanDirectory(string directory)
+ {
+ string[] files = Directory.GetFiles(directory);
+ List<SyntaxMode> modes = new List<SyntaxMode>();
+ foreach (string file in files) {
+ if (Path.GetExtension(file).Equals(".XSHD", StringComparison.OrdinalIgnoreCase)) {
+ XmlTextReader reader = new XmlTextReader(file);
+ while (reader.Read()) {
+ if (reader.NodeType == XmlNodeType.Element) {
+ switch (reader.Name) {
+ case "SyntaxDefinition":
+ string name = reader.GetAttribute("name");
+ string extensions = reader.GetAttribute("extensions");
+ modes.Add(new SyntaxMode(Path.GetFileName(file),
+ name,
+ extensions));
+ goto bailout;
+ default:
+ throw new HighlightingDefinitionInvalidException("Unknown root node in syntax highlighting file :" + reader.Name);
+ }
+ }
+ }
+ bailout:
+ reader.Close();
+
+ }
+ }
+ return modes;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ISyntaxModeFileProvider.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ISyntaxModeFileProvider.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ISyntaxModeFileProvider.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,23 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public interface ISyntaxModeFileProvider
+ {
+ ICollection<SyntaxMode> SyntaxModes {
+ get;
+ }
+
+ XmlTextReader GetSyntaxModeFile(SyntaxMode syntaxMode);
+ void UpdateSyntaxModeList();
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ResourceSyntaxModeProvider.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ResourceSyntaxModeProvider.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/ResourceSyntaxModeProvider.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,48 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class ResourceSyntaxModeProvider : ISyntaxModeFileProvider
+ {
+ List<SyntaxMode> syntaxModes = null;
+
+ public ICollection<SyntaxMode> SyntaxModes {
+ get {
+ return syntaxModes;
+ }
+ }
+
+ public ResourceSyntaxModeProvider()
+ {
+ Assembly assembly = typeof(SyntaxMode).Assembly;
+ Stream syntaxModeStream = assembly.GetManifestResourceStream("ICSharpCode.TextEditor.Resources.SyntaxModes.xml");
+ if (syntaxModeStream != null) {
+ syntaxModes = SyntaxMode.GetSyntaxModes(syntaxModeStream);
+ } else {
+ syntaxModes = new List<SyntaxMode>();
+ }
+ }
+
+ public XmlTextReader GetSyntaxModeFile(SyntaxMode syntaxMode)
+ {
+ Assembly assembly = typeof(SyntaxMode).Assembly;
+ return new XmlTextReader(assembly.GetManifestResourceStream("ICSharpCode.TextEditor.Resources." + syntaxMode.FileName));
+ }
+
+ public void UpdateSyntaxModeList()
+ {
+ // resources don't change during runtime
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/SyntaxMode.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/SyntaxMode.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/SyntaxModes/SyntaxMode.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,96 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Windows.Forms;
+using System.Xml;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class SyntaxMode
+ {
+ string fileName;
+ string name;
+ string[] extensions;
+
+ public string FileName {
+ get {
+ return fileName;
+ }
+ set {
+ fileName = value;
+ }
+ }
+
+ public string Name {
+ get {
+ return name;
+ }
+ set {
+ name = value;
+ }
+ }
+
+ public string[] Extensions {
+ get {
+ return extensions;
+ }
+ set {
+ extensions = value;
+ }
+ }
+
+ public SyntaxMode(string fileName, string name, string extensions)
+ {
+ this.fileName = fileName;
+ this.name = name;
+ this.extensions = extensions.Split(';', '|', ',');
+ }
+
+ public SyntaxMode(string fileName, string name, string[] extensions)
+ {
+ this.fileName = fileName;
+ this.name = name;
+ this.extensions = extensions;
+ }
+
+ public static List<SyntaxMode> GetSyntaxModes(Stream xmlSyntaxModeStream)
+ {
+ XmlTextReader reader = new XmlTextReader(xmlSyntaxModeStream);
+ List<SyntaxMode> syntaxModes = new List<SyntaxMode>();
+ while (reader.Read()) {
+ switch (reader.NodeType) {
+ case XmlNodeType.Element:
+ switch (reader.Name) {
+ case "SyntaxModes":
+ string version = reader.GetAttribute("version");
+ if (version != "1.0") {
+ throw new HighlightingDefinitionInvalidException("Unknown syntax mode file defininition with version " + version);
+ }
+ break;
+ case "Mode":
+ syntaxModes.Add(new SyntaxMode(reader.GetAttribute("file"),
+ reader.GetAttribute("name"),
+ reader.GetAttribute("extensions")));
+ break;
+ default:
+ throw new HighlightingDefinitionInvalidException("Unknown node in syntax mode file :" + reader.Name);
+ }
+ break;
+ }
+ }
+ reader.Close();
+ return syntaxModes;
+ }
+ public override string ToString()
+ {
+ return String.Format("[SyntaxMode: FileName={0}, Name={1}, Extensions=({2})]", fileName, name, String.Join(",", extensions));
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/TextWord.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/TextWord.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/HighlightingStrategy/TextWord.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,236 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public enum TextWordType {
+ Word,
+ Space,
+ Tab
+ }
+
+ /// <summary>
+ /// This class represents single words with color information, two special versions of a word are
+ /// spaces and tabs.
+ /// </summary>
+ public class TextWord
+ {
+ HighlightColor color;
+ LineSegment line;
+ IDocument document;
+
+ int offset;
+ int length;
+
+ public sealed class SpaceTextWord : TextWord
+ {
+ public SpaceTextWord()
+ {
+ length = 1;
+ }
+
+ public SpaceTextWord(HighlightColor color)
+ {
+ length = 1;
+ base.SyntaxColor = color;
+ }
+
+ public override Font GetFont(FontContainer fontContainer)
+ {
+ return null;
+ }
+
+ public override TextWordType Type {
+ get {
+ return TextWordType.Space;
+ }
+ }
+ public override bool IsWhiteSpace {
+ get {
+ return true;
+ }
+ }
+ }
+
+ public sealed class TabTextWord : TextWord
+ {
+ public TabTextWord()
+ {
+ length = 1;
+ }
+ public TabTextWord(HighlightColor color)
+ {
+ length = 1;
+ base.SyntaxColor = color;
+ }
+
+ public override Font GetFont(FontContainer fontContainer)
+ {
+ return null;
+ }
+
+ public override TextWordType Type {
+ get {
+ return TextWordType.Tab;
+ }
+ }
+ public override bool IsWhiteSpace {
+ get {
+ return true;
+ }
+ }
+ }
+
+ static TextWord spaceWord = new SpaceTextWord();
+ static TextWord tabWord = new TabTextWord();
+
+ bool hasDefaultColor;
+
+ public static TextWord Space {
+ get {
+ return spaceWord;
+ }
+ }
+
+ public static TextWord Tab {
+ get {
+ return tabWord;
+ }
+ }
+
+ public int Offset {
+ get {
+ return offset;
+ }
+ }
+
+ public int Length {
+ get {
+ return length;
+ }
+ }
+
+ /// <summary>
+ /// Splits the <paramref name="word"/> into two parts: the part before <paramref name="pos"/> is assigned to
+ /// the reference parameter <paramref name="word"/>, the part after <paramref name="pos"/> is returned.
+ /// </summary>
+ public static TextWord Split(ref TextWord word, int pos)
+ {
+ #if DEBUG
+ if (word.Type != TextWordType.Word)
+ throw new ArgumentException("word.Type must be Word");
+ if (pos <= 0)
+ throw new ArgumentOutOfRangeException("pos", pos, "pos must be > 0");
+ if (pos >= word.Length)
+ throw new ArgumentOutOfRangeException("pos", pos, "pos must be < word.Length");
+ #endif
+ TextWord after = new TextWord(word.document, word.line, word.offset + pos, word.length - pos, word.color, word.hasDefaultColor);
+ word = new TextWord(word.document, word.line, word.offset, pos, word.color, word.hasDefaultColor);
+ return after;
+ }
+
+ public bool HasDefaultColor {
+ get {
+ return hasDefaultColor;
+ }
+ }
+
+ public virtual TextWordType Type {
+ get {
+ return TextWordType.Word;
+ }
+ }
+
+ public string Word {
+ get {
+ if (document == null) {
+ return String.Empty;
+ }
+ return document.GetText(line.Offset + offset, length);
+ }
+ }
+
+ public virtual Font GetFont(FontContainer fontContainer)
+ {
+ return color.GetFont(fontContainer);
+ }
+
+ public Color Color {
+ get {
+ if (color == null)
+ return Color.Black;
+ else
+ return color.Color;
+ }
+ }
+
+ public bool Bold {
+ get {
+ if (color == null)
+ return false;
+ else
+ return color.Bold;
+ }
+ }
+
+ public bool Italic {
+ get {
+ if (color == null)
+ return false;
+ else
+ return color.Italic;
+ }
+ }
+
+ public HighlightColor SyntaxColor {
+ get {
+ return color;
+ }
+ set {
+ Debug.Assert(value != null);
+ color = value;
+ }
+ }
+
+ public virtual bool IsWhiteSpace {
+ get {
+ return false;
+ }
+ }
+
+ protected TextWord()
+ {
+ }
+
+ // TAB
+ public TextWord(IDocument document, LineSegment line, int offset, int length, HighlightColor color, bool hasDefaultColor)
+ {
+ Debug.Assert(document != null);
+ Debug.Assert(line != null);
+ Debug.Assert(color != null);
+
+ this.document = document;
+ this.line = line;
+ this.offset = offset;
+ this.length = length;
+ this.color = color;
+ this.hasDefaultColor = hasDefaultColor;
+ }
+
+ /// <summary>
+ /// Converts a <see cref="TextWord"/> instance to string (for debug purposes)
+ /// </summary>
+ public override string ToString()
+ {
+ return "[TextWord: Word = " + Word + ", Color = " + Color + "]";
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/IDocument.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/IDocument.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/IDocument.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,315 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+using ICSharpCode.TextEditor.Undo;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface represents a container which holds a text sequence and
+ /// all necessary information about it. It is used as the base for a text editor.
+ /// </summary>
+ public interface IDocument
+ {
+ ITextEditorProperties TextEditorProperties {
+ get;
+ set;
+ }
+
+ UndoStack UndoStack {
+ get;
+ }
+ /// <value>
+ /// If true the document can't be altered
+ /// </value>
+ bool ReadOnly {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// The <see cref="IFormattingStrategy"/> attached to the <see cref="IDocument"/> instance
+ /// </summary>
+ IFormattingStrategy FormattingStrategy {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// The <see cref="ITextBufferStrategy"/> attached to the <see cref="IDocument"/> instance
+ /// </summary>
+ ITextBufferStrategy TextBufferStrategy {
+ get;
+ }
+
+ /// <summary>
+ /// The <see cref="FoldingManager"/> attached to the <see cref="IDocument"/> instance
+ /// </summary>
+ FoldingManager FoldingManager {
+ get;
+ }
+
+ /// <summary>
+ /// The <see cref="IHighlightingStrategy"/> attached to the <see cref="IDocument"/> instance
+ /// </summary>
+ IHighlightingStrategy HighlightingStrategy {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// The <see cref="IBookMarkManager"/> attached to the <see cref="IDocument"/> instance
+ /// </summary>
+ BookmarkManager BookmarkManager {
+ get;
+ }
+
+ MarkerStrategy MarkerStrategy {
+ get;
+ }
+
+// /// <summary>
+// /// The <see cref="SelectionManager"/> attached to the <see cref="IDocument"/> instance
+// /// </summary>
+// SelectionManager SelectionManager {
+// get;
+// }
+
+ #region ILineManager interface
+ /// <value>
+ /// A collection of all line segments
+ /// </value>
+ /// <remarks>
+ /// The collection should only be used if you're aware
+ /// of the 'last line ends with a delimiter problem'. Otherwise
+ /// the <see cref="GetLineSegment"/> method should be used.
+ /// </remarks>
+ IList<LineSegment> LineSegmentCollection {
+ get;
+ }
+
+ /// <value>
+ /// The total number of lines in the document.
+ /// </value>
+ int TotalNumberOfLines {
+ get;
+ }
+
+ /// <remarks>
+ /// Returns a valid line number for the given offset.
+ /// </remarks>
+ /// <param name="offset">
+ /// A offset which points to a character in the line which
+ /// line number is returned.
+ /// </param>
+ /// <returns>
+ /// An int which value is the line number.
+ /// </returns>
+ /// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
+ int GetLineNumberForOffset(int offset);
+
+ /// <remarks>
+ /// Returns a <see cref="LineSegment"/> for the given offset.
+ /// </remarks>
+ /// <param name="offset">
+ /// A offset which points to a character in the line which
+ /// is returned.
+ /// </param>
+ /// <returns>
+ /// A <see cref="LineSegment"/> object.
+ /// </returns>
+ /// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
+ LineSegment GetLineSegmentForOffset(int offset);
+
+ /// <remarks>
+ /// Returns a <see cref="LineSegment"/> for the given line number.
+ /// This function should be used to get a line instead of getting the
+ /// line using the <see cref="ArrayList"/>.
+ /// </remarks>
+ /// <param name="lineNumber">
+ /// The line number which is requested.
+ /// </param>
+ /// <returns>
+ /// A <see cref="LineSegment"/> object.
+ /// </returns>
+ /// <exception cref="System.ArgumentException">If offset points not to a valid position</exception>
+ LineSegment GetLineSegment(int lineNumber);
+
+ /// <remarks>
+ /// Get the first logical line for a given visible line.
+ /// example : lineNumber == 100 foldings are in the linetracker
+ /// between 0..1 (2 folded, invisible lines) this method returns 102
+ /// the 'logical' line number
+ /// </remarks>
+ int GetFirstLogicalLine(int lineNumber);
+
+ /// <remarks>
+ /// Get the last logical line for a given visible line.
+ /// example : lineNumber == 100 foldings are in the linetracker
+ /// between 0..1 (2 folded, invisible lines) this method returns 102
+ /// the 'logical' line number
+ /// </remarks>
+ int GetLastLogicalLine(int lineNumber);
+
+ /// <remarks>
+ /// Get the visible line for a given logical line.
+ /// example : lineNumber == 100 foldings are in the linetracker
+ /// between 0..1 (2 folded, invisible lines) this method returns 98
+ /// the 'visible' line number
+ /// </remarks>
+ int GetVisibleLine(int lineNumber);
+
+// /// <remarks>
+// /// Get the visible column for a given logical line and logical column.
+// /// </remarks>
+// int GetVisibleColumn(int logicalLine, int logicalColumn);
+
+ /// <remarks>
+ /// Get the next visible line after lineNumber
+ /// </remarks>
+ int GetNextVisibleLineAbove(int lineNumber, int lineCount);
+
+ /// <remarks>
+ /// Get the next visible line below lineNumber
+ /// </remarks>
+ int GetNextVisibleLineBelow(int lineNumber, int lineCount);
+
+ event EventHandler<LineLengthChangeEventArgs> LineLengthChanged;
+ event EventHandler<LineCountChangeEventArgs> LineCountChanged;
+ event EventHandler<LineEventArgs> LineDeleted;
+ #endregion
+
+ #region ITextBufferStrategy interface
+ /// <value>
+ /// Get the whole text as string.
+ /// When setting the text using the TextContent property, the undo stack is cleared.
+ /// Set TextContent only for actions such as loading a file; if you want to change the current document
+ /// use the Replace method instead.
+ /// </value>
+ string TextContent {
+ get;
+ set;
+ }
+
+ /// <value>
+ /// The current length of the sequence of characters that can be edited.
+ /// </value>
+ int TextLength {
+ get;
+ }
+
+ /// <summary>
+ /// Inserts a string of characters into the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset where to insert the string.
+ /// </param>
+ /// <param name="text">
+ /// text to be inserted.
+ /// </param>
+ void Insert(int offset, string text);
+
+ /// <summary>
+ /// Removes some portion of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset of the remove.
+ /// </param>
+ /// <param name="length">
+ /// number of characters to remove.
+ /// </param>
+ void Remove(int offset, int length);
+
+ /// <summary>
+ /// Replace some portion of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset.
+ /// </param>
+ /// <param name="length">
+ /// number of characters to replace.
+ /// </param>
+ /// <param name="text">
+ /// text to be replaced with.
+ /// </param>
+ void Replace(int offset, int length, string text);
+
+ /// <summary>
+ /// Returns a specific char of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// Offset of the char to get.
+ /// </param>
+ char GetCharAt(int offset);
+
+ /// <summary>
+ /// Fetches a string of characters contained in the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// Offset into the sequence to fetch
+ /// </param>
+ /// <param name="length">
+ /// number of characters to copy.
+ /// </param>
+ string GetText(int offset, int length);
+ #endregion
+ string GetText(ISegment segment);
+
+ #region ITextModel interface
+ /// <summary>
+ /// returns the logical line/column position from an offset
+ /// </summary>
+ TextLocation OffsetToPosition(int offset);
+
+ /// <summary>
+ /// returns the offset from a logical line/column position
+ /// </summary>
+ int PositionToOffset(TextLocation p);
+ #endregion
+ /// <value>
+ /// A container where all TextAreaUpdate objects get stored
+ /// </value>
+ List<TextAreaUpdate> UpdateQueue {
+ get;
+ }
+
+ /// <remarks>
+ /// Requests an update of the textarea
+ /// </remarks>
+ void RequestUpdate(TextAreaUpdate update);
+
+ /// <remarks>
+ /// Commits all updates in the queue to the textarea (the
+ /// textarea will be painted)
+ /// </remarks>
+ void CommitUpdate();
+
+ /// <summary>
+ /// Moves, Resizes, Removes a list of segments on insert/remove/replace events.
+ /// </summary>
+ void UpdateSegmentListOnDocumentChange<T>(List<T> list, DocumentEventArgs e) where T : ISegment;
+
+ /// <summary>
+ /// Is fired when CommitUpdate is called
+ /// </summary>
+ event EventHandler UpdateCommited;
+
+ /// <summary>
+ /// </summary>
+ event DocumentEventHandler DocumentAboutToBeChanged;
+
+ /// <summary>
+ /// </summary>
+ event DocumentEventHandler DocumentChanged;
+
+ event EventHandler TextContentChanged;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ISegment.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ISegment.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ISegment.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,32 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This interface is used to describe a span inside a text sequence
+ /// </summary>
+ public interface ISegment
+ {
+ /// <value>
+ /// The offset where the span begins
+ /// </value>
+ int Offset {
+ get;
+ set;
+ }
+
+ /// <value>
+ /// The length of the span
+ /// </value>
+ int Length {
+ get;
+ set;
+ }
+ }
+
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ITextEditorProperties.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ITextEditorProperties.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/ITextEditorProperties.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,177 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public interface ITextEditorProperties
+ {
+ bool CaretLine
+ {
+ get;
+ set;
+ }
+
+ bool AutoInsertCurlyBracket { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool HideMouseCursor { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool IsIconBarVisible { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool AllowCaretBeyondEOL {
+ get;
+ set;
+ }
+
+ bool ShowMatchingBracket { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool CutCopyWholeLine {
+ get;
+ set;
+ }
+
+ System.Drawing.Text.TextRenderingHint TextRenderingHint { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool MouseWheelScrollDown {
+ get;
+ set;
+ }
+
+ bool MouseWheelTextZoom {
+ get;
+ set;
+ }
+
+ string LineTerminator {
+ get;
+ set;
+ }
+
+ LineViewerStyle LineViewerStyle { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowInvalidLines { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ int VerticalRulerRow { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowSpaces { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowTabs { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowEOLMarker { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ConvertTabsToSpaces { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowHorizontalRuler { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowVerticalRuler { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ Encoding Encoding {
+ get;
+ set;
+ }
+
+ bool EnableFolding { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool ShowLineNumbers { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// The width of a tab.
+ /// </summary>
+ int TabIndent { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// The amount of spaces a tab is converted to if ConvertTabsToSpaces is true.
+ /// </summary>
+ int IndentationSize {
+ get;
+ set;
+ }
+
+ IndentStyle IndentStyle { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ DocumentSelectionMode DocumentSelectionMode {
+ get;
+ set;
+ }
+
+ Font Font { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ FontContainer FontContainer {
+ get;
+ }
+
+ BracketMatchingStyle BracketMatchingStyle { // is wrapped in text editor control
+ get;
+ set;
+ }
+
+ bool SupportReadOnlySegments {
+ get;
+ set;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/DeferredEventList.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/DeferredEventList.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/DeferredEventList.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,44 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald"/>
+// <version>$Revision$</version>
+// </file>
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// A list of events that are fired after the line manager has finished working.
+ /// </summary>
+ struct DeferredEventList
+ {
+ internal List<LineSegment> removedLines;
+ internal List<TextAnchor> textAnchor;
+
+ public void AddRemovedLine(LineSegment line)
+ {
+ if (removedLines == null)
+ removedLines = new List<LineSegment>();
+ removedLines.Add(line);
+ }
+
+ public void AddDeletedAnchor(TextAnchor anchor)
+ {
+ if (textAnchor == null)
+ textAnchor = new List<TextAnchor>();
+ textAnchor.Add(anchor);
+ }
+
+ public void RaiseEvents()
+ {
+ // removedLines is raised by the LineManager
+ if (textAnchor != null) {
+ foreach (TextAnchor a in textAnchor) {
+ a.RaiseDeleted();
+ }
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManager.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManager.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManager.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,369 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ internal sealed class LineManager
+ {
+ LineSegmentTree lineCollection = new LineSegmentTree();
+
+ IDocument document;
+ IHighlightingStrategy highlightingStrategy;
+
+ public IList<LineSegment> LineSegmentCollection {
+ get {
+ return lineCollection;
+ }
+ }
+
+ public int TotalNumberOfLines {
+ get {
+ return lineCollection.Count;
+ }
+ }
+
+ public IHighlightingStrategy HighlightingStrategy {
+ get {
+ return highlightingStrategy;
+ }
+ set {
+ if (highlightingStrategy != value) {
+ highlightingStrategy = value;
+ if (highlightingStrategy != null) {
+ highlightingStrategy.MarkTokens(document);
+ }
+ }
+ }
+ }
+
+ public LineManager(IDocument document, IHighlightingStrategy highlightingStrategy)
+ {
+ this.document = document;
+ this.highlightingStrategy = highlightingStrategy;
+ }
+
+ public int GetLineNumberForOffset(int offset)
+ {
+ return GetLineSegmentForOffset(offset).LineNumber;
+ }
+
+ public LineSegment GetLineSegmentForOffset(int offset)
+ {
+ return lineCollection.GetByOffset(offset);
+ }
+
+ public LineSegment GetLineSegment(int lineNr)
+ {
+ return lineCollection[lineNr];
+ }
+
+ public void Insert(int offset, string text)
+ {
+ Replace(offset, 0, text);
+ }
+
+ public void Remove(int offset, int length)
+ {
+ Replace(offset, length, String.Empty);
+ }
+
+ public void Replace(int offset, int length, string text)
+ {
+ Debug.WriteLine("Replace offset="+offset+" length="+length+" text.Length="+text.Length);
+ int lineStart = GetLineNumberForOffset(offset);
+ int oldNumberOfLines = this.TotalNumberOfLines;
+ DeferredEventList deferredEventList = new DeferredEventList();
+ RemoveInternal(ref deferredEventList, offset, length);
+ int numberOfLinesAfterRemoving = this.TotalNumberOfLines;
+ if (!string.IsNullOrEmpty(text)) {
+ InsertInternal(offset, text);
+ }
+// #if DEBUG
+// Console.WriteLine("New line collection:");
+// Console.WriteLine(lineCollection.GetTreeAsString());
+// Console.WriteLine("New text:");
+// Console.WriteLine("'" + document.TextContent + "'");
+// #endif
+ // Only fire events after RemoveInternal+InsertInternal finished completely:
+ // Otherwise we would expose inconsistent state to the event handlers.
+ RunHighlighter(lineStart, 1 + Math.Max(0, this.TotalNumberOfLines - numberOfLinesAfterRemoving));
+
+ if (deferredEventList.removedLines != null) {
+ foreach (LineSegment ls in deferredEventList.removedLines)
+ OnLineDeleted(new LineEventArgs(document, ls));
+ }
+ deferredEventList.RaiseEvents();
+ if (this.TotalNumberOfLines != oldNumberOfLines) {
+ OnLineCountChanged(new LineCountChangeEventArgs(document, lineStart, this.TotalNumberOfLines - oldNumberOfLines));
+ }
+ }
+
+ void RemoveInternal(ref DeferredEventList deferredEventList, int offset, int length)
+ {
+ Debug.Assert(length >= 0);
+ if (length == 0) return;
+ LineSegmentTree.Enumerator it = lineCollection.GetEnumeratorForOffset(offset);
+ LineSegment startSegment = it.Current;
+ int startSegmentOffset = startSegment.Offset;
+ if (offset + length < startSegmentOffset + startSegment.TotalLength) {
+ // just removing a part of this line segment
+ startSegment.RemovedLinePart(ref deferredEventList, offset - startSegmentOffset, length);
+ SetSegmentLength(startSegment, startSegment.TotalLength - length);
+ return;
+ }
+ // merge startSegment with another line segment because startSegment's delimiter was deleted
+ // possibly remove lines in between if multiple delimiters were deleted
+ int charactersRemovedInStartLine = startSegmentOffset + startSegment.TotalLength - offset;
+ Debug.Assert(charactersRemovedInStartLine > 0);
+ startSegment.RemovedLinePart(ref deferredEventList, offset - startSegmentOffset, charactersRemovedInStartLine);
+
+
+ LineSegment endSegment = lineCollection.GetByOffset(offset + length);
+ if (endSegment == startSegment) {
+ // special case: we are removing a part of the last line up to the
+ // end of the document
+ SetSegmentLength(startSegment, startSegment.TotalLength - length);
+ return;
+ }
+ int endSegmentOffset = endSegment.Offset;
+ int charactersLeftInEndLine = endSegmentOffset + endSegment.TotalLength - (offset + length);
+ endSegment.RemovedLinePart(ref deferredEventList, 0, endSegment.TotalLength - charactersLeftInEndLine);
+ startSegment.MergedWith(endSegment, offset - startSegmentOffset);
+ SetSegmentLength(startSegment, startSegment.TotalLength - charactersRemovedInStartLine + charactersLeftInEndLine);
+ startSegment.DelimiterLength = endSegment.DelimiterLength;
+ // remove all segments between startSegment (excl.) and endSegment (incl.)
+ it.MoveNext();
+ LineSegment segmentToRemove;
+ do {
+ segmentToRemove = it.Current;
+ it.MoveNext();
+ lineCollection.RemoveSegment(segmentToRemove);
+ segmentToRemove.Deleted(ref deferredEventList);
+ } while (segmentToRemove != endSegment);
+ }
+
+ void InsertInternal(int offset, string text)
+ {
+ LineSegment segment = lineCollection.GetByOffset(offset);
+ DelimiterSegment ds = NextDelimiter(text, 0);
+ if (ds == null) {
+ // no newline is being inserted, all text is inserted in a single line
+ segment.InsertedLinePart(offset - segment.Offset, text.Length);
+ SetSegmentLength(segment, segment.TotalLength + text.Length);
+ return;
+ }
+ LineSegment firstLine = segment;
+ firstLine.InsertedLinePart(offset - firstLine.Offset, ds.Offset);
+ int lastDelimiterEnd = 0;
+ while (ds != null) {
+ // split line segment at line delimiter
+ int lineBreakOffset = offset + ds.Offset + ds.Length;
+ int segmentOffset = segment.Offset;
+ int lengthAfterInsertionPos = segmentOffset + segment.TotalLength - (offset + lastDelimiterEnd);
+ lineCollection.SetSegmentLength(segment, lineBreakOffset - segmentOffset);
+ LineSegment newSegment = lineCollection.InsertSegmentAfter(segment, lengthAfterInsertionPos);
+ segment.DelimiterLength = ds.Length;
+
+ segment = newSegment;
+ lastDelimiterEnd = ds.Offset + ds.Length;
+
+ ds = NextDelimiter(text, lastDelimiterEnd);
+ }
+ firstLine.SplitTo(segment);
+ // insert rest after last delimiter
+ if (lastDelimiterEnd != text.Length) {
+ segment.InsertedLinePart(0, text.Length - lastDelimiterEnd);
+ SetSegmentLength(segment, segment.TotalLength + text.Length - lastDelimiterEnd);
+ }
+ }
+
+ void SetSegmentLength(LineSegment segment, int newTotalLength)
+ {
+ int delta = newTotalLength - segment.TotalLength;
+ if (delta != 0) {
+ lineCollection.SetSegmentLength(segment, newTotalLength);
+ OnLineLengthChanged(new LineLengthChangeEventArgs(document, segment, delta));
+ }
+ }
+
+ void RunHighlighter(int firstLine, int lineCount)
+ {
+ if (highlightingStrategy != null) {
+ List<LineSegment> markLines = new List<LineSegment>();
+ LineSegmentTree.Enumerator it = lineCollection.GetEnumeratorForIndex(firstLine);
+ for (int i = 0; i < lineCount && it.IsValid; i++) {
+ markLines.Add(it.Current);
+ it.MoveNext();
+ }
+ highlightingStrategy.MarkTokens(document, markLines);
+ }
+ }
+
+ public void SetContent(string text)
+ {
+ lineCollection.Clear();
+ if (text != null) {
+ Replace(0, 0, text);
+ }
+ }
+
+ public int GetVisibleLine(int logicalLineNumber)
+ {
+ if (!document.TextEditorProperties.EnableFolding) {
+ return logicalLineNumber;
+ }
+
+ int visibleLine = 0;
+ int foldEnd = 0;
+ List<FoldMarker> foldings = document.FoldingManager.GetTopLevelFoldedFoldings();
+ foreach (FoldMarker fm in foldings) {
+ if (fm.StartLine >= logicalLineNumber) {
+ break;
+ }
+ if (fm.StartLine >= foldEnd) {
+ visibleLine += fm.StartLine - foldEnd;
+ if (fm.EndLine > logicalLineNumber) {
+ return visibleLine;
+ }
+ foldEnd = fm.EndLine;
+ }
+ }
+// Debug.Assert(logicalLineNumber >= foldEnd);
+ visibleLine += logicalLineNumber - foldEnd;
+ return visibleLine;
+ }
+
+ public int GetFirstLogicalLine(int visibleLineNumber)
+ {
+ if (!document.TextEditorProperties.EnableFolding) {
+ return visibleLineNumber;
+ }
+ int v = 0;
+ int foldEnd = 0;
+ List<FoldMarker> foldings = document.FoldingManager.GetTopLevelFoldedFoldings();
+ foreach (FoldMarker fm in foldings) {
+ if (fm.StartLine >= foldEnd) {
+ if (v + fm.StartLine - foldEnd >= visibleLineNumber) {
+ break;
+ }
+ v += fm.StartLine - foldEnd;
+ foldEnd = fm.EndLine;
+ }
+ }
+ // help GC
+ foldings.Clear();
+ foldings = null;
+ return foldEnd + visibleLineNumber - v;
+ }
+
+ public int GetLastLogicalLine(int visibleLineNumber)
+ {
+ if (!document.TextEditorProperties.EnableFolding) {
+ return visibleLineNumber;
+ }
+ return GetFirstLogicalLine(visibleLineNumber + 1) - 1;
+ }
+
+ // TODO : speedup the next/prev visible line search
+ // HOW? : save the foldings in a sorted list and lookup the
+ // line numbers in this list
+ public int GetNextVisibleLineAbove(int lineNumber, int lineCount)
+ {
+ int curLineNumber = lineNumber;
+ if (document.TextEditorProperties.EnableFolding) {
+ for (int i = 0; i < lineCount && curLineNumber < TotalNumberOfLines; ++i) {
+ ++curLineNumber;
+ while (curLineNumber < TotalNumberOfLines && (curLineNumber >= lineCollection.Count || !document.FoldingManager.IsLineVisible(curLineNumber))) {
+ ++curLineNumber;
+ }
+ }
+ } else {
+ curLineNumber += lineCount;
+ }
+ return Math.Min(TotalNumberOfLines - 1, curLineNumber);
+ }
+
+ public int GetNextVisibleLineBelow(int lineNumber, int lineCount)
+ {
+ int curLineNumber = lineNumber;
+ if (document.TextEditorProperties.EnableFolding) {
+ for (int i = 0; i < lineCount; ++i) {
+ --curLineNumber;
+ while (curLineNumber >= 0 && !document.FoldingManager.IsLineVisible(curLineNumber)) {
+ --curLineNumber;
+ }
+ }
+ } else {
+ curLineNumber -= lineCount;
+ }
+ return Math.Max(0, curLineNumber);
+ }
+
+ // use always the same DelimiterSegment object for the NextDelimiter
+ DelimiterSegment delimiterSegment = new DelimiterSegment();
+
+ DelimiterSegment NextDelimiter(string text, int offset)
+ {
+ for (int i = offset; i < text.Length; i++) {
+ switch (text[i]) {
+ case '\r':
+ if (i + 1 < text.Length) {
+ if (text[i + 1] == '\n') {
+ delimiterSegment.Offset = i;
+ delimiterSegment.Length = 2;
+ return delimiterSegment;
+ }
+ }
+ #if DATACONSISTENCYTEST
+ Debug.Assert(false, "Found lone \\r, data consistency problems?");
+ #endif
+ goto case '\n';
+ case '\n':
+ delimiterSegment.Offset = i;
+ delimiterSegment.Length = 1;
+ return delimiterSegment;
+ }
+ }
+ return null;
+ }
+
+ void OnLineCountChanged(LineCountChangeEventArgs e)
+ {
+ if (LineCountChanged != null) {
+ LineCountChanged(this, e);
+ }
+ }
+
+ void OnLineLengthChanged(LineLengthChangeEventArgs e)
+ {
+ if (LineLengthChanged != null) {
+ LineLengthChanged(this, e);
+ }
+ }
+
+ void OnLineDeleted(LineEventArgs e)
+ {
+ if (LineDeleted != null) {
+ LineDeleted(this, e);
+ }
+ }
+
+ public event EventHandler<LineLengthChangeEventArgs> LineLengthChanged;
+ public event EventHandler<LineCountChangeEventArgs> LineCountChanged;
+ public event EventHandler<LineEventArgs> LineDeleted;
+
+ sealed class DelimiterSegment
+ {
+ internal int Offset;
+ internal int Length;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManagerEventArgs.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManagerEventArgs.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineManagerEventArgs.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,97 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class LineCountChangeEventArgs : EventArgs
+ {
+ IDocument document;
+ int start;
+ int moved;
+
+ /// <returns>
+ /// always a valid Document which is related to the Event.
+ /// </returns>
+ public IDocument Document {
+ get {
+ return document;
+ }
+ }
+
+ /// <returns>
+ /// -1 if no offset was specified for this event
+ /// </returns>
+ public int LineStart {
+ get {
+ return start;
+ }
+ }
+
+ /// <returns>
+ /// -1 if no length was specified for this event
+ /// </returns>
+ public int LinesMoved {
+ get {
+ return moved;
+ }
+ }
+
+ public LineCountChangeEventArgs(IDocument document, int lineStart, int linesMoved)
+ {
+ this.document = document;
+ this.start = lineStart;
+ this.moved = linesMoved;
+ }
+ }
+
+ public class LineEventArgs : EventArgs
+ {
+ IDocument document;
+ LineSegment lineSegment;
+
+ public IDocument Document {
+ get { return document; }
+ }
+
+ public LineSegment LineSegment {
+ get { return lineSegment; }
+ }
+
+ public LineEventArgs(IDocument document, LineSegment lineSegment)
+ {
+ this.document = document;
+ this.lineSegment = lineSegment;
+ }
+
+ public override string ToString()
+ {
+ return string.Format("[LineEventArgs Document={0} LineSegment={1}]", this.document, this.lineSegment);
+ }
+ }
+
+ public class LineLengthChangeEventArgs : LineEventArgs
+ {
+ int lengthDelta;
+
+ public int LengthDelta {
+ get { return lengthDelta; }
+ }
+
+ public LineLengthChangeEventArgs(IDocument document, LineSegment lineSegment, int moved)
+ : base(document, lineSegment)
+ {
+ this.lengthDelta = moved;
+ }
+
+ public override string ToString()
+ {
+ return string.Format("[LineLengthEventArgs Document={0} LineSegment={1} LengthDelta={2}]", this.Document, this.LineSegment, this.lengthDelta);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegment.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegment.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegment.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,259 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Diagnostics;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public sealed class LineSegment : ISegment
+ {
+ internal LineSegmentTree.Enumerator treeEntry;
+ int totalLength, delimiterLength;
+
+ List<TextWord> words;
+ SpanStack highlightSpanStack;
+
+ public TextWord GetWord(int column)
+ {
+ int curColumn = 0;
+ foreach (TextWord word in words) {
+ if (column < curColumn + word.Length) {
+ return word;
+ }
+ curColumn += word.Length;
+ }
+ return null;
+ }
+
+ public bool IsDeleted {
+ get { return !treeEntry.IsValid; }
+ }
+
+ public int LineNumber {
+ get { return treeEntry.CurrentIndex; }
+ }
+
+ public int Offset {
+ get { return treeEntry.CurrentOffset; }
+ }
+
+ public int Length {
+ get { return totalLength - delimiterLength; }
+ }
+
+ int ISegment.Offset {
+ get { return this.Offset; }
+ set { throw new NotSupportedException(); }
+ }
+ int ISegment.Length {
+ get { return this.Length; }
+ set { throw new NotSupportedException(); }
+ }
+
+ public int TotalLength {
+ get { return totalLength; }
+ internal set { totalLength = value; }
+ }
+
+ public int DelimiterLength {
+ get { return delimiterLength; }
+ internal set { delimiterLength = value; }
+ }
+
+ // highlighting information
+ public List<TextWord> Words {
+ get {
+ return words;
+ }
+ set {
+ words = value;
+ }
+ }
+
+ public HighlightColor GetColorForPosition(int x)
+ {
+ if (Words != null) {
+ int xPos = 0;
+ foreach (TextWord word in Words) {
+ if (x < xPos + word.Length) {
+ return word.SyntaxColor;
+ }
+ xPos += word.Length;
+ }
+ }
+ return new HighlightColor(Color.Black, false, false);
+ }
+
+ public SpanStack HighlightSpanStack {
+ get {
+ return highlightSpanStack;
+ }
+ set {
+ highlightSpanStack = value;
+ }
+ }
+
+ /// <summary>
+ /// Converts a <see cref="LineSegment"/> instance to string (for debug purposes)
+ /// </summary>
+ public override string ToString()
+ {
+ if (IsDeleted)
+ return "[LineSegment: (deleted) Length = " + Length + ", TotalLength = " + TotalLength + ", DelimiterLength = " + delimiterLength + "]";
+ else
+ return "[LineSegment: LineNumber=" + LineNumber + ", Offset = "+ Offset +", Length = " + Length + ", TotalLength = " + TotalLength + ", DelimiterLength = " + delimiterLength + "]";
+ }
+
+ #region Anchor management
+ Util.WeakCollection<TextAnchor> anchors;
+
+ public TextAnchor CreateAnchor(int column)
+ {
+ if (column < 0 || column > Length)
+ throw new ArgumentOutOfRangeException("column");
+ TextAnchor anchor = new TextAnchor(this, column);
+ AddAnchor(anchor);
+ return anchor;
+ }
+
+ void AddAnchor(TextAnchor anchor)
+ {
+ Debug.Assert(anchor.Line == this);
+
+ if (anchors == null)
+ anchors = new Util.WeakCollection<TextAnchor>();
+
+ anchors.Add(anchor);
+ }
+
+ /// <summary>
+ /// Is called when the LineSegment is deleted.
+ /// </summary>
+ internal void Deleted(ref DeferredEventList deferredEventList)
+ {
+ //Console.WriteLine("Deleted");
+ treeEntry = LineSegmentTree.Enumerator.Invalid;
+ if (anchors != null) {
+ foreach (TextAnchor a in anchors) {
+ a.Delete(ref deferredEventList);
+ }
+ anchors = null;
+ }
+ }
+
+ /// <summary>
+ /// Is called when a part of the line is removed.
+ /// </summary>
+ internal void RemovedLinePart(ref DeferredEventList deferredEventList, int startColumn, int length)
+ {
+ if (length == 0)
+ return;
+ Debug.Assert(length > 0);
+
+ //Console.WriteLine("RemovedLinePart " + startColumn + ", " + length);
+ if (anchors != null) {
+ List<TextAnchor> deletedAnchors = null;
+ foreach (TextAnchor a in anchors) {
+ if (a.ColumnNumber > startColumn) {
+ if (a.ColumnNumber >= startColumn + length) {
+ a.ColumnNumber -= length;
+ } else {
+ if (deletedAnchors == null)
+ deletedAnchors = new List<TextAnchor>();
+ a.Delete(ref deferredEventList);
+ deletedAnchors.Add(a);
+ }
+ }
+ }
+ if (deletedAnchors != null) {
+ foreach (TextAnchor a in deletedAnchors) {
+ anchors.Remove(a);
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Is called when a part of the line is inserted.
+ /// </summary>
+ internal void InsertedLinePart(int startColumn, int length)
+ {
+ if (length == 0)
+ return;
+ Debug.Assert(length > 0);
+
+ //Console.WriteLine("InsertedLinePart " + startColumn + ", " + length);
+ if (anchors != null) {
+ foreach (TextAnchor a in anchors) {
+ if (a.MovementType == AnchorMovementType.BeforeInsertion
+ ? a.ColumnNumber > startColumn
+ : a.ColumnNumber >= startColumn)
+ {
+ a.ColumnNumber += length;
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Is called after another line's content is appended to this line because the newline in between
+ /// was deleted.
+ /// The DefaultLineManager will call Deleted() on the deletedLine after the MergedWith call.
+ ///
+ /// firstLineLength: the length of the line before the merge.
+ /// </summary>
+ internal void MergedWith(LineSegment deletedLine, int firstLineLength)
+ {
+ //Console.WriteLine("MergedWith");
+
+ if (deletedLine.anchors != null) {
+ foreach (TextAnchor a in deletedLine.anchors) {
+ a.Line = this;
+ AddAnchor(a);
+ a.ColumnNumber += firstLineLength;
+ }
+ deletedLine.anchors = null;
+ }
+ }
+
+ /// <summary>
+ /// Is called after a newline was inserted into this line, splitting it into this and followingLine.
+ /// </summary>
+ internal void SplitTo(LineSegment followingLine)
+ {
+ //Console.WriteLine("SplitTo");
+
+ if (anchors != null) {
+ List<TextAnchor> movedAnchors = null;
+ foreach (TextAnchor a in anchors) {
+ if (a.MovementType == AnchorMovementType.BeforeInsertion
+ ? a.ColumnNumber > this.Length
+ : a.ColumnNumber >= this.Length)
+ {
+ a.Line = followingLine;
+ followingLine.AddAnchor(a);
+ a.ColumnNumber -= this.Length;
+
+ if (movedAnchors == null)
+ movedAnchors = new List<TextAnchor>();
+ movedAnchors.Add(a);
+ }
+ }
+ if (movedAnchors != null) {
+ foreach (TextAnchor a in movedAnchors) {
+ anchors.Remove(a);
+ }
+ }
+ }
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegmentTree.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegmentTree.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/LineManager/LineSegmentTree.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,477 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Data structure for efficient management of the line segments (most operations are O(lg n)).
+ /// This implements an augmented red-black tree where each node has fields for the number of
+ /// nodes in its subtree (like an order statistics tree) for access by index(=line number).
+ /// Additionally, each node knows the total length of all segments in its subtree.
+ /// This means we can find nodes by offset in O(lg n) time. Since the offset itself is not stored in
+ /// the line segment but computed from the lengths stored in the tree, we adjusting the offsets when
+ /// text is inserted in one line means we just have to increment the totalLength of the affected line and
+ /// its parent nodes - an O(lg n) operation.
+ /// However this means getting the line number or offset from a LineSegment is not a constant time
+ /// operation, but takes O(lg n).
+ ///
+ /// NOTE: The tree is never empty, Clear() causes it to contain an empty segment.
+ /// </summary>
+ sealed class LineSegmentTree : IList<LineSegment>
+ {
+ internal struct RBNode
+ {
+ internal LineSegment lineSegment;
+ internal int count;
+ internal int totalLength;
+
+ public RBNode(LineSegment lineSegment)
+ {
+ this.lineSegment = lineSegment;
+ this.count = 1;
+ this.totalLength = lineSegment.TotalLength;
+ }
+
+ public override string ToString()
+ {
+ return "[RBNode count=" + count + " totalLength="+totalLength
+ + " lineSegment.LineNumber=" + lineSegment.LineNumber
+ + " lineSegment.Offset=" + lineSegment.Offset
+ + " lineSegment.TotalLength=" + lineSegment.TotalLength
+ + " lineSegment.DelimiterLength=" + lineSegment.DelimiterLength + "]";
+ }
+ }
+
+ struct MyHost : IRedBlackTreeHost<RBNode>
+ {
+ public int Compare(RBNode x, RBNode y)
+ {
+ throw new NotImplementedException();
+ }
+
+ public bool Equals(RBNode a, RBNode b)
+ {
+ throw new NotImplementedException();
+ }
+
+ public void UpdateAfterChildrenChange(RedBlackTreeNode<RBNode> node)
+ {
+ int count = 1;
+ int totalLength = node.val.lineSegment.TotalLength;
+ if (node.left != null) {
+ count += node.left.val.count;
+ totalLength += node.left.val.totalLength;
+ }
+ if (node.right != null) {
+ count += node.right.val.count;
+ totalLength += node.right.val.totalLength;
+ }
+ if (count != node.val.count || totalLength != node.val.totalLength) {
+ node.val.count = count;
+ node.val.totalLength = totalLength;
+ if (node.parent != null) UpdateAfterChildrenChange(node.parent);
+ }
+ }
+
+ public void UpdateAfterRotateLeft(RedBlackTreeNode<RBNode> node)
+ {
+ UpdateAfterChildrenChange(node);
+ UpdateAfterChildrenChange(node.parent);
+ }
+
+ public void UpdateAfterRotateRight(RedBlackTreeNode<RBNode> node)
+ {
+ UpdateAfterChildrenChange(node);
+ UpdateAfterChildrenChange(node.parent);
+ }
+ }
+
+ readonly AugmentableRedBlackTree<RBNode, MyHost> tree = new AugmentableRedBlackTree<RBNode, MyHost>(new MyHost());
+
+ RedBlackTreeNode<RBNode> GetNode(int index)
+ {
+ if (index < 0 || index >= tree.Count)
+ throw new ArgumentOutOfRangeException("index", index, "index should be between 0 and " + (tree.Count-1));
+ RedBlackTreeNode<RBNode> node = tree.root;
+ while (true) {
+ if (node.left != null && index < node.left.val.count) {
+ node = node.left;
+ } else {
+ if (node.left != null) {
+ index -= node.left.val.count;
+ }
+ if (index == 0)
+ return node;
+ index--;
+ node = node.right;
+ }
+ }
+ }
+
+ static int GetIndexFromNode(RedBlackTreeNode<RBNode> node)
+ {
+ int index = (node.left != null) ? node.left.val.count : 0;
+ while (node.parent != null) {
+ if (node == node.parent.right) {
+ if (node.parent.left != null)
+ index += node.parent.left.val.count;
+ index++;
+ }
+ node = node.parent;
+ }
+ return index;
+ }
+
+ RedBlackTreeNode<RBNode> GetNodeByOffset(int offset)
+ {
+ if (offset < 0 || offset > this.TotalLength)
+ throw new ArgumentOutOfRangeException("offset", offset, "offset should be between 0 and " + this.TotalLength);
+ if (offset == this.TotalLength) {
+ if (tree.root == null)
+ throw new InvalidOperationException("Cannot call GetNodeByOffset while tree is empty.");
+ return tree.root.RightMost;
+ }
+ RedBlackTreeNode<RBNode> node = tree.root;
+ while (true) {
+ if (node.left != null && offset < node.left.val.totalLength) {
+ node = node.left;
+ } else {
+ if (node.left != null) {
+ offset -= node.left.val.totalLength;
+ }
+ offset -= node.val.lineSegment.TotalLength;
+ if (offset < 0)
+ return node;
+ node = node.right;
+ }
+ }
+ }
+
+ static int GetOffsetFromNode(RedBlackTreeNode<RBNode> node)
+ {
+ int offset = (node.left != null) ? node.left.val.totalLength : 0;
+ while (node.parent != null) {
+ if (node == node.parent.right) {
+ if (node.parent.left != null)
+ offset += node.parent.left.val.totalLength;
+ offset += node.parent.val.lineSegment.TotalLength;
+ }
+ node = node.parent;
+ }
+ return offset;
+ }
+
+ public LineSegment GetByOffset(int offset)
+ {
+ return GetNodeByOffset(offset).val.lineSegment;
+ }
+
+ /// <summary>
+ /// Gets the total length of all line segments. Runs in O(1).
+ /// </summary>
+ public int TotalLength {
+ get {
+ if (tree.root == null)
+ return 0;
+ else
+ return tree.root.val.totalLength;
+ }
+ }
+
+ /// <summary>
+ /// Updates the length of a line segment. Runs in O(lg n).
+ /// </summary>
+ public void SetSegmentLength(LineSegment segment, int newTotalLength)
+ {
+ if (segment == null)
+ throw new ArgumentNullException("segment");
+ RedBlackTreeNode<RBNode> node = segment.treeEntry.it.node;
+ segment.TotalLength = newTotalLength;
+ default(MyHost).UpdateAfterChildrenChange(node);
+ #if DEBUG
+ CheckProperties();
+ #endif
+ }
+
+ public void RemoveSegment(LineSegment segment)
+ {
+ tree.RemoveAt(segment.treeEntry.it);
+ #if DEBUG
+ CheckProperties();
+ #endif
+ }
+
+ public LineSegment InsertSegmentAfter(LineSegment segment, int length)
+ {
+ LineSegment newSegment = new LineSegment();
+ newSegment.TotalLength = length;
+ newSegment.DelimiterLength = segment.DelimiterLength;
+
+ newSegment.treeEntry = InsertAfter(segment.treeEntry.it.node, newSegment);
+ return newSegment;
+ }
+
+ Enumerator InsertAfter(RedBlackTreeNode<RBNode> node, LineSegment newSegment)
+ {
+ RedBlackTreeNode<RBNode> newNode = new RedBlackTreeNode<RBNode>(new RBNode(newSegment));
+ if (node.right == null) {
+ tree.InsertAsRight(node, newNode);
+ } else {
+ tree.InsertAsLeft(node.right.LeftMost, newNode);
+ }
+ #if DEBUG
+ CheckProperties();
+ #endif
+ return new Enumerator(new RedBlackTreeIterator<RBNode>(newNode));
+ }
+
+ /// <summary>
+ /// Gets the number of items in the collections. Runs in O(1).
+ /// </summary>
+ public int Count {
+ get { return tree.Count; }
+ }
+
+ /// <summary>
+ /// Gets or sets an item by index. Runs in O(lg n).
+ /// </summary>
+ public LineSegment this[int index] {
+ get {
+ return GetNode(index).val.lineSegment;
+ }
+ set {
+ throw new NotSupportedException();
+ }
+ }
+
+ bool ICollection<LineSegment>.IsReadOnly {
+ get { return true; }
+ }
+
+ /// <summary>
+ /// Gets the index of an item. Runs in O(lg n).
+ /// </summary>
+ public int IndexOf(LineSegment item)
+ {
+ int index = item.LineNumber;
+ if (index < 0 || index >= this.Count)
+ return -1;
+ if (item != this[index])
+ return -1;
+ return index;
+ }
+
+ void IList<LineSegment>.RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ #if DEBUG
+ [Conditional("DATACONSISTENCYTEST")]
+ void CheckProperties()
+ {
+ if (tree.root == null) {
+ Debug.Assert(this.Count == 0);
+ } else {
+ Debug.Assert(tree.root.val.count == this.Count);
+ CheckProperties(tree.root);
+ }
+ }
+
+ void CheckProperties(RedBlackTreeNode<RBNode> node)
+ {
+ int count = 1;
+ int totalLength = node.val.lineSegment.TotalLength;
+ if (node.left != null) {
+ CheckProperties(node.left);
+ count += node.left.val.count;
+ totalLength += node.left.val.totalLength;
+ }
+ if (node.right != null) {
+ CheckProperties(node.right);
+ count += node.right.val.count;
+ totalLength += node.right.val.totalLength;
+ }
+ Debug.Assert(node.val.count == count);
+ Debug.Assert(node.val.totalLength == totalLength);
+ }
+
+ public string GetTreeAsString()
+ {
+ return tree.GetTreeAsString();
+ }
+ #endif
+
+ public LineSegmentTree()
+ {
+ Clear();
+ }
+
+ /// <summary>
+ /// Clears the list. Runs in O(1).
+ /// </summary>
+ public void Clear()
+ {
+ tree.Clear();
+ LineSegment emptySegment = new LineSegment();
+ emptySegment.TotalLength = 0;
+ emptySegment.DelimiterLength = 0;
+ tree.Add(new RBNode(emptySegment));
+ emptySegment.treeEntry = GetEnumeratorForIndex(0);
+ #if DEBUG
+ CheckProperties();
+ #endif
+ }
+
+ /// <summary>
+ /// Tests whether an item is in the list. Runs in O(n).
+ /// </summary>
+ public bool Contains(LineSegment item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ /// <summary>
+ /// Copies all elements from the list to the array.
+ /// </summary>
+ public void CopyTo(LineSegment[] array, int arrayIndex)
+ {
+ if (array == null) throw new ArgumentNullException("array");
+ foreach (LineSegment val in this)
+ array[arrayIndex++] = val;
+ }
+
+ IEnumerator<LineSegment> IEnumerable<LineSegment>.GetEnumerator()
+ {
+ return this.GetEnumerator();
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return this.GetEnumerator();
+ }
+
+ public Enumerator GetEnumerator()
+ {
+ return new Enumerator(tree.GetEnumerator());
+ }
+
+ public Enumerator GetEnumeratorForIndex(int index)
+ {
+ return new Enumerator(new RedBlackTreeIterator<RBNode>(GetNode(index)));
+ }
+
+ public Enumerator GetEnumeratorForOffset(int offset)
+ {
+ return new Enumerator(new RedBlackTreeIterator<RBNode>(GetNodeByOffset(offset)));
+ }
+
+ public struct Enumerator : IEnumerator<LineSegment>
+ {
+ /// <summary>
+ /// An invalid enumerator value. Calling MoveNext on the invalid enumerator
+ /// will always return false, accessing Current will throw an exception.
+ /// </summary>
+ public static readonly Enumerator Invalid = default(Enumerator);
+
+ internal RedBlackTreeIterator<RBNode> it;
+
+ internal Enumerator(RedBlackTreeIterator<RBNode> it)
+ {
+ this.it = it;
+ }
+
+ /// <summary>
+ /// Gets the current value. Runs in O(1).
+ /// </summary>
+ public LineSegment Current {
+ get {
+ return it.Current.lineSegment;
+ }
+ }
+
+ public bool IsValid {
+ get {
+ return it.IsValid;
+ }
+ }
+
+ /// <summary>
+ /// Gets the index of the current value. Runs in O(lg n).
+ /// </summary>
+ public int CurrentIndex {
+ get {
+ if (it.node == null)
+ throw new InvalidOperationException();
+ return GetIndexFromNode(it.node);
+ }
+ }
+
+ /// <summary>
+ /// Gets the offset of the current value. Runs in O(lg n).
+ /// </summary>
+ public int CurrentOffset {
+ get {
+ if (it.node == null)
+ throw new InvalidOperationException();
+ return GetOffsetFromNode(it.node);
+ }
+ }
+
+ object System.Collections.IEnumerator.Current {
+ get {
+ return it.Current.lineSegment;
+ }
+ }
+
+ public void Dispose()
+ {
+ }
+
+ /// <summary>
+ /// Moves to the next index. Runs in O(lg n), but for k calls, the combined time is only O(k+lg n).
+ /// </summary>
+ public bool MoveNext()
+ {
+ return it.MoveNext();
+ }
+
+ /// <summary>
+ /// Moves to the previous index. Runs in O(lg n), but for k calls, the combined time is only O(k+lg n).
+ /// </summary>
+ public bool MoveBack()
+ {
+ return it.MoveBack();
+ }
+
+ void System.Collections.IEnumerator.Reset()
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ void IList<LineSegment>.Insert(int index, LineSegment item)
+ {
+ throw new NotSupportedException();
+ }
+
+ void ICollection<LineSegment>.Add(LineSegment item)
+ {
+ throw new NotSupportedException();
+ }
+
+ bool ICollection<LineSegment>.Remove(LineSegment item)
+ {
+ throw new NotSupportedException();
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/MarkerStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/MarkerStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/MarkerStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,119 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Manages the list of markers and provides ways to retrieve markers for specific positions.
+ /// </summary>
+ public sealed class MarkerStrategy
+ {
+ List<TextMarker> textMarker = new List<TextMarker>();
+ IDocument document;
+
+ public IDocument Document {
+ get {
+ return document;
+ }
+ }
+
+ public IEnumerable<TextMarker> TextMarker {
+ get {
+ return textMarker.AsReadOnly();
+ }
+ }
+
+ public void AddMarker(TextMarker item)
+ {
+ markersTable.Clear();
+ textMarker.Add(item);
+ }
+
+ public void InsertMarker(int index, TextMarker item)
+ {
+ markersTable.Clear();
+ textMarker.Insert(index, item);
+ }
+
+ public void RemoveMarker(TextMarker item)
+ {
+ markersTable.Clear();
+ textMarker.Remove(item);
+ }
+
+ public void RemoveAll(Predicate<TextMarker> match)
+ {
+ markersTable.Clear();
+ textMarker.RemoveAll(match);
+ }
+
+ public MarkerStrategy(IDocument document)
+ {
+ this.document = document;
+ document.DocumentChanged += new DocumentEventHandler(DocumentChanged);
+ }
+
+ Dictionary<int, List<TextMarker>> markersTable = new Dictionary<int, List<TextMarker>>();
+
+ public List<TextMarker> GetMarkers(int offset)
+ {
+ if (!markersTable.ContainsKey(offset)) {
+ List<TextMarker> markers = new List<TextMarker>();
+ for (int i = 0; i < textMarker.Count; ++i) {
+ TextMarker marker = (TextMarker)textMarker[i];
+ if (marker.Offset <= offset && offset <= marker.EndOffset) {
+ markers.Add(marker);
+ }
+ }
+ markersTable[offset] = markers;
+ }
+ return markersTable[offset];
+ }
+
+ public List<TextMarker> GetMarkers(int offset, int length)
+ {
+ int endOffset = offset + length - 1;
+ List<TextMarker> markers = new List<TextMarker>();
+ for (int i = 0; i < textMarker.Count; ++i) {
+ TextMarker marker = (TextMarker)textMarker[i];
+ if (// start in marker region
+ marker.Offset <= offset && offset <= marker.EndOffset ||
+ // end in marker region
+ marker.Offset <= endOffset && endOffset <= marker.EndOffset ||
+ // marker start in region
+ offset <= marker.Offset && marker.Offset <= endOffset ||
+ // marker end in region
+ offset <= marker.EndOffset && marker.EndOffset <= endOffset
+ )
+ {
+ markers.Add(marker);
+ }
+ }
+ return markers;
+ }
+
+ public List<TextMarker> GetMarkers(TextLocation position)
+ {
+ if (position.Y >= document.TotalNumberOfLines || position.Y < 0) {
+ return new List<TextMarker>();
+ }
+ LineSegment segment = document.GetLineSegment(position.Y);
+ return GetMarkers(segment.Offset + position.X);
+ }
+
+ void DocumentChanged(object sender, DocumentEventArgs e)
+ {
+ // reset markers table
+ markersTable.Clear();
+ document.UpdateSegmentListOnDocumentChange(textMarker, e);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/TextMarker.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/TextMarker.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/MarkerStrategy/TextMarker.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,103 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public enum TextMarkerType
+ {
+ Invisible,
+ SolidBlock,
+ Underlined,
+ WaveLine
+ }
+
+ /// <summary>
+ /// Marks a part of a document.
+ /// </summary>
+ public class TextMarker : AbstractSegment
+ {
+ TextMarkerType textMarkerType;
+ Color color;
+ Color foreColor;
+ string toolTip = null;
+ bool overrideForeColor = false;
+
+ public TextMarkerType TextMarkerType {
+ get {
+ return textMarkerType;
+ }
+ }
+
+ public Color Color {
+ get {
+ return color;
+ }
+ }
+
+ public Color ForeColor {
+ get {
+ return foreColor;
+ }
+ }
+
+ public bool OverrideForeColor {
+ get {
+ return overrideForeColor;
+ }
+ }
+
+ /// <summary>
+ /// Marks the text segment as read-only.
+ /// </summary>
+ public bool IsReadOnly { get; set; }
+
+ public string ToolTip {
+ get {
+ return toolTip;
+ }
+ set {
+ toolTip = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets the last offset that is inside the marker region.
+ /// </summary>
+ public int EndOffset {
+ get {
+ return Offset + Length - 1;
+ }
+ }
+
+ public TextMarker(int offset, int length, TextMarkerType textMarkerType) : this(offset, length, textMarkerType, Color.Red)
+ {
+ }
+
+ public TextMarker(int offset, int length, TextMarkerType textMarkerType, Color color)
+ {
+ if (length < 1) length = 1;
+ this.offset = offset;
+ this.length = length;
+ this.textMarkerType = textMarkerType;
+ this.color = color;
+ }
+
+ public TextMarker(int offset, int length, TextMarkerType textMarkerType, Color color, Color foreColor)
+ {
+ if (length < 1) length = 1;
+ this.offset = offset;
+ this.length = length;
+ this.textMarkerType = textMarkerType;
+ this.color = color;
+ this.foreColor = foreColor;
+ this.overrideForeColor = true;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ColumnRange.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ColumnRange.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ColumnRange.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,66 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class ColumnRange
+ {
+ public static readonly ColumnRange NoColumn = new ColumnRange(-2, -2);
+ public static readonly ColumnRange WholeColumn = new ColumnRange(-1, -1);
+
+ int startColumn;
+ int endColumn;
+
+ public int StartColumn {
+ get {
+ return startColumn;
+ }
+ set {
+ startColumn = value;
+ }
+ }
+
+ public int EndColumn {
+ get {
+ return endColumn;
+ }
+ set {
+ endColumn = value;
+ }
+ }
+
+ public ColumnRange(int startColumn, int endColumn)
+ {
+ this.startColumn = startColumn;
+ this.endColumn = endColumn;
+
+ }
+
+ public override int GetHashCode()
+ {
+ return startColumn + (endColumn << 16);
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (obj is ColumnRange) {
+ return ((ColumnRange)obj).startColumn == startColumn &&
+ ((ColumnRange)obj).endColumn == endColumn;
+
+ }
+ return false;
+ }
+
+ public override string ToString()
+ {
+ return String.Format("[ColumnRange: StartColumn={0}, EndColumn={1}]", startColumn, endColumn);
+ }
+
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/DefaultSelection.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/DefaultSelection.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/DefaultSelection.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,133 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Default implementation of the <see cref="ICSharpCode.TextEditor.Document.ISelection"/> interface.
+ /// </summary>
+ public class DefaultSelection : ISelection
+ {
+ IDocument document;
+ bool isRectangularSelection;
+ TextLocation startPosition;
+ TextLocation endPosition;
+
+ public TextLocation StartPosition {
+ get {
+ return startPosition;
+ }
+ set {
+ DefaultDocument.ValidatePosition(document, value);
+ startPosition = value;
+ }
+ }
+
+ public TextLocation EndPosition {
+ get {
+ return endPosition;
+ }
+ set {
+ DefaultDocument.ValidatePosition(document, value);
+ endPosition = value;
+ }
+ }
+
+ public int Offset {
+ get {
+ return document.PositionToOffset(startPosition);
+ }
+ }
+
+ public int EndOffset {
+ get {
+ return document.PositionToOffset(endPosition);
+ }
+ }
+
+ public int Length {
+ get {
+ return EndOffset - Offset;
+ }
+ }
+
+ /// <value>
+ /// Returns true, if the selection is empty
+ /// </value>
+ public bool IsEmpty {
+ get {
+ return startPosition == endPosition;
+ }
+ }
+
+ /// <value>
+ /// Returns true, if the selection is rectangular
+ /// </value>
+ // TODO : make this unused property used.
+ public bool IsRectangularSelection {
+ get {
+ return isRectangularSelection;
+ }
+ set {
+ isRectangularSelection = value;
+ }
+ }
+
+ /// <value>
+ /// The text which is selected by this selection.
+ /// </value>
+ public string SelectedText {
+ get {
+ if (document != null) {
+ if (Length < 0) {
+ return null;
+ }
+ return document.GetText(Offset, Length);
+ }
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="DefaultSelection"/>
+ /// </summary>
+ public DefaultSelection(IDocument document, TextLocation startPosition, TextLocation endPosition)
+ {
+ DefaultDocument.ValidatePosition(document, startPosition);
+ DefaultDocument.ValidatePosition(document, endPosition);
+ Debug.Assert(startPosition <= endPosition);
+ this.document = document;
+ this.startPosition = startPosition;
+ this.endPosition = endPosition;
+ }
+
+ /// <summary>
+ /// Converts a <see cref="DefaultSelection"/> instance to string (for debug purposes)
+ /// </summary>
+ public override string ToString()
+ {
+ return String.Format("[DefaultSelection : StartPosition={0}, EndPosition={1}]", startPosition, endPosition);
+ }
+ public bool ContainsPosition(TextLocation position)
+ {
+ if (this.IsEmpty)
+ return false;
+ return startPosition.Y < position.Y && position.Y < endPosition.Y ||
+ startPosition.Y == position.Y && startPosition.X <= position.X && (startPosition.Y != endPosition.Y || position.X <= endPosition.X) ||
+ endPosition.Y == position.Y && startPosition.Y != endPosition.Y && position.X <= endPosition.X;
+ }
+
+ public bool ContainsOffset(int offset)
+ {
+ return Offset <= offset && offset <= EndOffset;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ISelection.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ISelection.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/ISelection.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,64 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// An interface representing a portion of the current selection.
+ /// </summary>
+ public interface ISelection
+ {
+ TextLocation StartPosition {
+ get;
+ set;
+ }
+
+ TextLocation EndPosition {
+ get;
+ set;
+ }
+
+ int Offset {
+ get;
+ }
+
+ int EndOffset {
+ get;
+ }
+
+ int Length {
+ get;
+ }
+
+ /// <value>
+ /// Returns true, if the selection is rectangular
+ /// </value>
+ bool IsRectangularSelection {
+ get;
+ }
+
+ /// <value>
+ /// Returns true, if the selection is empty
+ /// </value>
+ bool IsEmpty {
+ get;
+ }
+
+ /// <value>
+ /// The text which is selected by this selection.
+ /// </value>
+ string SelectedText {
+ get;
+ }
+
+ bool ContainsOffset(int offset);
+
+ bool ContainsPosition(TextLocation position);
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/SelectionManager.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/SelectionManager.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/Selection/SelectionManager.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,466 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// This class manages the selections in a document.
+ /// </summary>
+ public class SelectionManager : IDisposable
+ {
+ TextLocation selectionStart;
+
+ internal TextLocation SelectionStart {
+ get { return selectionStart; }
+ set {
+ DefaultDocument.ValidatePosition(document, value);
+ selectionStart = value;
+ }
+ }
+ IDocument document;
+ TextArea textArea;
+ internal SelectFrom selectFrom = new SelectFrom();
+
+ internal List<ISelection> selectionCollection = new List<ISelection>();
+
+ /// <value>
+ /// A collection containing all selections.
+ /// </value>
+ public List<ISelection> SelectionCollection {
+ get {
+ return selectionCollection;
+ }
+ }
+
+ /// <value>
+ /// true if the <see cref="SelectionCollection"/> is not empty, false otherwise.
+ /// </value>
+ public bool HasSomethingSelected {
+ get {
+ return selectionCollection.Count > 0;
+ }
+ }
+
+ public bool SelectionIsReadonly {
+ get {
+ if (document.ReadOnly)
+ return true;
+ foreach (ISelection sel in selectionCollection) {
+ if (SelectionIsReadOnly(document, sel))
+ return true;
+ }
+ return false;
+ }
+ }
+
+ internal static bool SelectionIsReadOnly(IDocument document, ISelection sel)
+ {
+ if (document.TextEditorProperties.SupportReadOnlySegments)
+ return document.MarkerStrategy.GetMarkers(sel.Offset, sel.Length).Exists(m=>m.IsReadOnly);
+ else
+ return false;
+ }
+
+ /// <value>
+ /// The text that is currently selected.
+ /// </value>
+ public string SelectedText {
+ get {
+ StringBuilder builder = new StringBuilder();
+
+// PriorityQueue queue = new PriorityQueue();
+
+ foreach (ISelection s in selectionCollection) {
+ builder.Append(s.SelectedText);
+// queue.Insert(-s.Offset, s);
+ }
+
+// while (queue.Count > 0) {
+// ISelection s = ((ISelection)queue.Remove());
+// builder.Append(s.SelectedText);
+// }
+
+ return builder.ToString();
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="SelectionManager"/>
+ /// </summary>
+ public SelectionManager(IDocument document)
+ {
+ this.document = document;
+ document.DocumentChanged += new DocumentEventHandler(DocumentChanged);
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="SelectionManager"/>
+ /// </summary>
+ public SelectionManager(IDocument document, TextArea textArea)
+ {
+ this.document = document;
+ this.textArea = textArea;
+ document.DocumentChanged += new DocumentEventHandler(DocumentChanged);
+ }
+
+ public void Dispose()
+ {
+ if (this.document != null) {
+ document.DocumentChanged -= new DocumentEventHandler(DocumentChanged);
+ this.document = null;
+ }
+ }
+
+ void DocumentChanged(object sender, DocumentEventArgs e)
+ {
+ if (e.Text == null) {
+ Remove(e.Offset, e.Length);
+ } else {
+ if (e.Length < 0) {
+ Insert(e.Offset, e.Text);
+ } else {
+ Replace(e.Offset, e.Length, e.Text);
+ }
+ }
+ }
+
+ /// <remarks>
+ /// Clears the selection and sets a new selection
+ /// using the given <see cref="ISelection"/> object.
+ /// </remarks>
+ public void SetSelection(ISelection selection)
+ {
+// autoClearSelection = false;
+ if (selection != null) {
+ if (SelectionCollection.Count == 1 &&
+ selection.StartPosition == SelectionCollection[0].StartPosition &&
+ selection.EndPosition == SelectionCollection[0].EndPosition ) {
+ return;
+ }
+ ClearWithoutUpdate();
+ selectionCollection.Add(selection);
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, selection.StartPosition.Y, selection.EndPosition.Y));
+ document.CommitUpdate();
+ OnSelectionChanged(EventArgs.Empty);
+ } else {
+ ClearSelection();
+ }
+ }
+
+ public void SetSelection(TextLocation startPosition, TextLocation endPosition)
+ {
+ SetSelection(new DefaultSelection(document, startPosition, endPosition));
+ }
+
+ public bool GreaterEqPos(TextLocation p1, TextLocation p2)
+ {
+ return p1.Y > p2.Y || p1.Y == p2.Y && p1.X >= p2.X;
+ }
+
+ public void ExtendSelection(TextLocation oldPosition, TextLocation newPosition)
+ {
+ // where oldposition is where the cursor was,
+ // and newposition is where it has ended up from a click (both zero based)
+
+ if (oldPosition == newPosition)
+ {
+ return;
+ }
+
+ TextLocation min;
+ TextLocation max;
+ int oldnewX = newPosition.X;
+ bool oldIsGreater = GreaterEqPos(oldPosition, newPosition);
+ if (oldIsGreater) {
+ min = newPosition;
+ max = oldPosition;
+ } else {
+ min = oldPosition;
+ max = newPosition;
+ }
+
+ if (min == max) {
+ return;
+ }
+
+ if (!HasSomethingSelected)
+ {
+ SetSelection(new DefaultSelection(document, min, max));
+ // initialise selectFrom for a cursor selection
+ if (selectFrom.where == WhereFrom.None)
+ SelectionStart = oldPosition; //textArea.Caret.Position;
+ return;
+ }
+
+ ISelection selection = this.selectionCollection[0];
+
+ if (min == max) {
+ //selection.StartPosition = newPosition;
+ return;
+ } else {
+ // changed selection via gutter
+ if (selectFrom.where == WhereFrom.Gutter)
+ {
+ // selection new position is always at the left edge for gutter selections
+ newPosition.X = 0;
+ }
+
+ if (GreaterEqPos(newPosition, SelectionStart)) // selecting forward
+ {
+ selection.StartPosition = SelectionStart;
+ // this handles last line selection
+ if (selectFrom.where == WhereFrom.Gutter ) //&& newPosition.Y != oldPosition.Y)
+ selection.EndPosition = new TextLocation(textArea.Caret.Column, textArea.Caret.Line);
+ else {
+ newPosition.X = oldnewX;
+ selection.EndPosition = newPosition;
+ }
+ } else { // selecting back
+ if (selectFrom.where == WhereFrom.Gutter && selectFrom.first == WhereFrom.Gutter)
+ { // gutter selection
+ selection.EndPosition = NextValidPosition(SelectionStart.Y);
+ } else { // internal text selection
+ selection.EndPosition = SelectionStart; //selection.StartPosition;
+ }
+ selection.StartPosition = newPosition;
+ }
+ }
+
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, min.Y, max.Y));
+ document.CommitUpdate();
+ OnSelectionChanged(EventArgs.Empty);
+ }
+
+ // retrieve the next available line
+ // - checks that there are more lines available after the current one
+ // - if there are then the next line is returned
+ // - if there are NOT then the last position on the given line is returned
+ public TextLocation NextValidPosition(int line)
+ {
+ if (line < document.TotalNumberOfLines - 1)
+ return new TextLocation(0, line + 1);
+ else
+ return new TextLocation(document.GetLineSegment(document.TotalNumberOfLines - 1).Length + 1, line);
+ }
+
+ void ClearWithoutUpdate()
+ {
+ while (selectionCollection.Count > 0) {
+ ISelection selection = selectionCollection[selectionCollection.Count - 1];
+ selectionCollection.RemoveAt(selectionCollection.Count - 1);
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, selection.StartPosition.Y, selection.EndPosition.Y));
+ OnSelectionChanged(EventArgs.Empty);
+ }
+ }
+ /// <remarks>
+ /// Clears the selection.
+ /// </remarks>
+ public void ClearSelection()
+ {
+ Point mousepos;
+ mousepos = textArea.mousepos;
+ // this is the most logical place to reset selection starting
+ // positions because it is always called before a new selection
+ selectFrom.first = selectFrom.where;
+ TextLocation newSelectionStart = textArea.TextView.GetLogicalPosition(mousepos.X - textArea.TextView.DrawingPosition.X, mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ if (selectFrom.where == WhereFrom.Gutter) {
+ newSelectionStart.X = 0;
+// selectionStart.Y = -1;
+ }
+ if (newSelectionStart.Line >= document.TotalNumberOfLines) {
+ newSelectionStart.Line = document.TotalNumberOfLines-1;
+ newSelectionStart.Column = document.GetLineSegment(document.TotalNumberOfLines-1).Length;
+ }
+ this.SelectionStart = newSelectionStart;
+
+ ClearWithoutUpdate();
+ document.CommitUpdate();
+ }
+
+ /// <remarks>
+ /// Removes the selected text from the buffer and clears
+ /// the selection.
+ /// </remarks>
+ public void RemoveSelectedText()
+ {
+ if (SelectionIsReadonly) {
+ ClearSelection();
+ return;
+ }
+ List<int> lines = new List<int>();
+ int offset = -1;
+ bool oneLine = true;
+// PriorityQueue queue = new PriorityQueue();
+ foreach (ISelection s in selectionCollection) {
+// ISelection s = ((ISelection)queue.Remove());
+ if (oneLine) {
+ int lineBegin = s.StartPosition.Y;
+ if (lineBegin != s.EndPosition.Y) {
+ oneLine = false;
+ } else {
+ lines.Add(lineBegin);
+ }
+ }
+ offset = s.Offset;
+ document.Remove(s.Offset, s.Length);
+
+// queue.Insert(-s.Offset, s);
+ }
+ ClearSelection();
+ if (offset >= 0) {
+ // TODO:
+// document.Caret.Offset = offset;
+ }
+ if (offset != -1) {
+ if (oneLine) {
+ foreach (int i in lines) {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, i));
+ }
+ } else {
+ document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ }
+ document.CommitUpdate();
+ }
+ }
+
+
+ bool SelectionsOverlap(ISelection s1, ISelection s2)
+ {
+ return (s1.Offset <= s2.Offset && s2.Offset <= s1.Offset + s1.Length) ||
+ (s1.Offset <= s2.Offset + s2.Length && s2.Offset + s2.Length <= s1.Offset + s1.Length) ||
+ (s1.Offset >= s2.Offset && s1.Offset + s1.Length <= s2.Offset + s2.Length);
+ }
+
+ /// <remarks>
+ /// Returns true if the given offset points to a section which is
+ /// selected.
+ /// </remarks>
+ public bool IsSelected(int offset)
+ {
+ return GetSelectionAt(offset) != null;
+ }
+
+ /// <remarks>
+ /// Returns a <see cref="ISelection"/> object giving the selection in which
+ /// the offset points to.
+ /// </remarks>
+ /// <returns>
+ /// <code>null</code> if the offset doesn't point to a selection
+ /// </returns>
+ public ISelection GetSelectionAt(int offset)
+ {
+ foreach (ISelection s in selectionCollection) {
+ if (s.ContainsOffset(offset)) {
+ return s;
+ }
+ }
+ return null;
+ }
+
+ /// <remarks>
+ /// Used internally, do not call.
+ /// </remarks>
+ internal void Insert(int offset, string text)
+ {
+// foreach (ISelection selection in SelectionCollection) {
+// if (selection.Offset > offset) {
+// selection.Offset += text.Length;
+// } else if (selection.Offset + selection.Length > offset) {
+// selection.Length += text.Length;
+// }
+// }
+ }
+
+ /// <remarks>
+ /// Used internally, do not call.
+ /// </remarks>
+ internal void Remove(int offset, int length)
+ {
+// foreach (ISelection selection in selectionCollection) {
+// if (selection.Offset > offset) {
+// selection.Offset -= length;
+// } else if (selection.Offset + selection.Length > offset) {
+// selection.Length -= length;
+// }
+// }
+ }
+
+ /// <remarks>
+ /// Used internally, do not call.
+ /// </remarks>
+ internal void Replace(int offset, int length, string text)
+ {
+// foreach (ISelection selection in selectionCollection) {
+// if (selection.Offset > offset) {
+// selection.Offset = selection.Offset - length + text.Length;
+// } else if (selection.Offset + selection.Length > offset) {
+// selection.Length = selection.Length - length + text.Length;
+// }
+// }
+ }
+
+ public ColumnRange GetSelectionAtLine(int lineNumber)
+ {
+ foreach (ISelection selection in selectionCollection) {
+ int startLine = selection.StartPosition.Y;
+ int endLine = selection.EndPosition.Y;
+ if (startLine < lineNumber && lineNumber < endLine) {
+ return ColumnRange.WholeColumn;
+ }
+
+ if (startLine == lineNumber) {
+ LineSegment line = document.GetLineSegment(startLine);
+ int startColumn = selection.StartPosition.X;
+ int endColumn = endLine == lineNumber ? selection.EndPosition.X : line.Length + 1;
+ return new ColumnRange(startColumn, endColumn);
+ }
+
+ if (endLine == lineNumber) {
+ int endColumn = selection.EndPosition.X;
+ return new ColumnRange(0, endColumn);
+ }
+ }
+
+ return ColumnRange.NoColumn;
+ }
+
+ public void FireSelectionChanged()
+ {
+ OnSelectionChanged(EventArgs.Empty);
+ }
+ protected virtual void OnSelectionChanged(EventArgs e)
+ {
+ if (SelectionChanged != null) {
+ SelectionChanged(this, e);
+ }
+ }
+
+ public event EventHandler SelectionChanged;
+ }
+
+ // selection initiated from...
+ internal class SelectFrom {
+ public int where = WhereFrom.None; // last selection initiator
+ public int first = WhereFrom.None; // first selection initiator
+
+ public SelectFrom()
+ {
+ }
+ }
+
+ // selection initiated from type...
+ internal class WhereFrom {
+ public const int None = 0;
+ public const int Gutter = 1;
+ public const int TArea = 2;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextAnchor.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextAnchor.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextAnchor.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,118 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public enum AnchorMovementType
+ {
+ /// <summary>
+ /// Behaves like a start marker - when text is inserted at the anchor position, the anchor will stay
+ /// before the inserted text.
+ /// </summary>
+ BeforeInsertion,
+ /// <summary>
+ /// Behave like an end marker - when text is insered at the anchor position, the anchor will move
+ /// after the inserted text.
+ /// </summary>
+ AfterInsertion
+ }
+
+ /// <summary>
+ /// An anchor that can be put into a document and moves around when the document is changed.
+ /// </summary>
+ public sealed class TextAnchor
+ {
+ static Exception AnchorDeletedError()
+ {
+ return new InvalidOperationException("The text containing the anchor was deleted");
+ }
+
+ LineSegment lineSegment;
+ int columnNumber;
+
+ public LineSegment Line {
+ get {
+ if (lineSegment == null) throw AnchorDeletedError();
+ return lineSegment;
+ }
+ internal set {
+ lineSegment = value;
+ }
+ }
+
+ public bool IsDeleted {
+ get {
+ return lineSegment == null;
+ }
+ }
+
+ public int LineNumber {
+ get {
+ return this.Line.LineNumber;
+ }
+ }
+
+ public int ColumnNumber {
+ get {
+ if (lineSegment == null) throw AnchorDeletedError();
+ return columnNumber;
+ }
+ internal set {
+ columnNumber = value;
+ }
+ }
+
+ public TextLocation Location {
+ get {
+ return new TextLocation(this.ColumnNumber, this.LineNumber);
+ }
+ }
+
+ public int Offset {
+ get {
+ return this.Line.Offset + columnNumber;
+ }
+ }
+
+ /// <summary>
+ /// Controls how the anchor moves.
+ /// </summary>
+ public AnchorMovementType MovementType { get; set; }
+
+ public event EventHandler Deleted;
+
+ internal void Delete(ref DeferredEventList deferredEventList)
+ {
+ // we cannot fire an event here because this method is called while the LineManager adjusts the
+ // lineCollection, so an event handler could see inconsistent state
+ lineSegment = null;
+ deferredEventList.AddDeletedAnchor(this);
+ }
+
+ internal void RaiseDeleted()
+ {
+ if (Deleted != null)
+ Deleted(this, EventArgs.Empty);
+ }
+
+ internal TextAnchor(LineSegment lineSegment, int columnNumber)
+ {
+ this.lineSegment = lineSegment;
+ this.columnNumber = columnNumber;
+ }
+
+ public override string ToString()
+ {
+ if (this.IsDeleted)
+ return "[TextAnchor (deleted)]";
+ else
+ return "[TextAnchor " + this.Location.ToString() + "]";
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/GapTextBufferStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/GapTextBufferStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/GapTextBufferStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,194 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ public class GapTextBufferStrategy : ITextBufferStrategy
+ {
+ #if DEBUG
+ int creatorThread = System.Threading.Thread.CurrentThread.ManagedThreadId;
+
+ void CheckThread()
+ {
+ if (System.Threading.Thread.CurrentThread.ManagedThreadId != creatorThread)
+ throw new InvalidOperationException("GapTextBufferStategy is not thread-safe!");
+ }
+ #endif
+
+ char[] buffer = new char[0];
+ string cachedContent;
+
+ int gapBeginOffset = 0;
+ int gapEndOffset = 0;
+ int gapLength = 0; // gapLength == gapEndOffset - gapBeginOffset
+
+ const int minGapLength = 128;
+ const int maxGapLength = 2048;
+
+ public int Length {
+ get {
+ return buffer.Length - gapLength;
+ }
+ }
+
+ public void SetContent(string text)
+ {
+ if (text == null) {
+ text = String.Empty;
+ }
+ cachedContent = text;
+ buffer = text.ToCharArray();
+ gapBeginOffset = gapEndOffset = gapLength = 0;
+ }
+
+ public char GetCharAt(int offset)
+ {
+ #if DEBUG
+ CheckThread();
+ #endif
+
+ if (offset < 0 || offset >= Length) {
+ throw new ArgumentOutOfRangeException("offset", offset, "0 <= offset < " + Length.ToString());
+ }
+
+ return offset < gapBeginOffset ? buffer[offset] : buffer[offset + gapLength];
+ }
+
+ public string GetText(int offset, int length)
+ {
+ #if DEBUG
+ CheckThread();
+ #endif
+
+ if (offset < 0 || offset > Length) {
+ throw new ArgumentOutOfRangeException("offset", offset, "0 <= offset <= " + Length.ToString());
+ }
+ if (length < 0 || offset + length > Length) {
+ throw new ArgumentOutOfRangeException("length", length, "0 <= length, offset(" + offset + ")+length <= " + Length.ToString());
+ }
+ if (offset == 0 && length == Length) {
+ if (cachedContent != null)
+ return cachedContent;
+ else
+ return cachedContent = GetTextInternal(offset, length);
+ } else {
+ return GetTextInternal(offset, length);
+ }
+ }
+
+ string GetTextInternal(int offset, int length)
+ {
+ int end = offset + length;
+
+ if (end < gapBeginOffset) {
+ return new string(buffer, offset, length);
+ }
+
+ if (offset > gapBeginOffset) {
+ return new string(buffer, offset + gapLength, length);
+ }
+
+ int block1Size = gapBeginOffset - offset;
+ int block2Size = end - gapBeginOffset;
+
+ StringBuilder buf = new StringBuilder(block1Size + block2Size);
+ buf.Append(buffer, offset, block1Size);
+ buf.Append(buffer, gapEndOffset, block2Size);
+ return buf.ToString();
+ }
+
+ public void Insert(int offset, string text)
+ {
+ Replace(offset, 0, text);
+ }
+
+ public void Remove(int offset, int length)
+ {
+ Replace(offset, length, String.Empty);
+ }
+
+ public void Replace(int offset, int length, string text)
+ {
+ if (text == null) {
+ text = String.Empty;
+ }
+
+ #if DEBUG
+ CheckThread();
+ #endif
+
+ if (offset < 0 || offset > Length) {
+ throw new ArgumentOutOfRangeException("offset", offset, "0 <= offset <= " + Length.ToString());
+ }
+ if (length < 0 || offset + length > Length) {
+ throw new ArgumentOutOfRangeException("length", length, "0 <= length, offset+length <= " + Length.ToString());
+ }
+
+ cachedContent = null;
+
+ // Math.Max is used so that if we need to resize the array
+ // the new array has enough space for all old chars
+ PlaceGap(offset, text.Length - length);
+ gapEndOffset += length; // delete removed text
+ text.CopyTo(0, buffer, gapBeginOffset, text.Length);
+ gapBeginOffset += text.Length;
+ gapLength = gapEndOffset - gapBeginOffset;
+ if (gapLength > maxGapLength) {
+ MakeNewBuffer(gapBeginOffset, minGapLength);
+ }
+ }
+
+ void PlaceGap(int newGapOffset, int minRequiredGapLength)
+ {
+ if (gapLength < minRequiredGapLength) {
+ // enlarge gap
+ MakeNewBuffer(newGapOffset, minRequiredGapLength);
+ } else {
+ while (newGapOffset < gapBeginOffset) {
+ buffer[--gapEndOffset] = buffer[--gapBeginOffset];
+ }
+ while (newGapOffset > gapBeginOffset) {
+ buffer[gapBeginOffset++] = buffer[gapEndOffset++];
+ }
+ }
+ }
+
+ void MakeNewBuffer(int newGapOffset, int newGapLength)
+ {
+ if (newGapLength < minGapLength) newGapLength = minGapLength;
+
+ char[] newBuffer = new char[Length + newGapLength];
+ if (newGapOffset < gapBeginOffset) {
+ // gap is moving backwards
+
+ // first part:
+ Array.Copy(buffer, 0, newBuffer, 0, newGapOffset);
+ // moving middle part:
+ Array.Copy(buffer, newGapOffset, newBuffer, newGapOffset + newGapLength, gapBeginOffset - newGapOffset);
+ // last part:
+ Array.Copy(buffer, gapEndOffset, newBuffer, newBuffer.Length - (buffer.Length - gapEndOffset), buffer.Length - gapEndOffset);
+ } else {
+ // gap is moving forwards
+ // first part:
+ Array.Copy(buffer, 0, newBuffer, 0, gapBeginOffset);
+ // moving middle part:
+ Array.Copy(buffer, gapEndOffset, newBuffer, gapBeginOffset, newGapOffset - gapBeginOffset);
+ // last part:
+ int lastPartLength = newBuffer.Length - (newGapOffset + newGapLength);
+ Array.Copy(buffer, buffer.Length - lastPartLength, newBuffer, newGapOffset + newGapLength, lastPartLength);
+ }
+
+ gapBeginOffset = newGapOffset;
+ gapEndOffset = newGapOffset + newGapLength;
+ gapLength = newGapLength;
+ buffer = newBuffer;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/ITextBufferStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/ITextBufferStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/ITextBufferStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,85 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Interface to describe a sequence of characters that can be edited.
+ /// </summary>
+ public interface ITextBufferStrategy
+ {
+ /// <value>
+ /// The current length of the sequence of characters that can be edited.
+ /// </value>
+ int Length {
+ get;
+ }
+
+ /// <summary>
+ /// Inserts a string of characters into the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset where to insert the string.
+ /// </param>
+ /// <param name="text">
+ /// text to be inserted.
+ /// </param>
+ void Insert(int offset, string text);
+
+ /// <summary>
+ /// Removes some portion of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset of the remove.
+ /// </param>
+ /// <param name="length">
+ /// number of characters to remove.
+ /// </param>
+ void Remove(int offset, int length);
+
+ /// <summary>
+ /// Replace some portion of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// offset.
+ /// </param>
+ /// <param name="length">
+ /// number of characters to replace.
+ /// </param>
+ /// <param name="text">
+ /// text to be replaced with.
+ /// </param>
+ void Replace(int offset, int length, string text);
+
+ /// <summary>
+ /// Fetches a string of characters contained in the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// Offset into the sequence to fetch
+ /// </param>
+ /// <param name="length">
+ /// number of characters to copy.
+ /// </param>
+ string GetText(int offset, int length);
+
+ /// <summary>
+ /// Returns a specific char of the sequence.
+ /// </summary>
+ /// <param name="offset">
+ /// Offset of the char to get.
+ /// </param>
+ char GetCharAt(int offset);
+
+ /// <summary>
+ /// This method sets the stored content.
+ /// </summary>
+ /// <param name="text">
+ /// The string that represents the character sequence.
+ /// </param>
+ void SetContent(string text);
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/StringTextBufferStrategy.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/StringTextBufferStrategy.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextBufferStrategy/StringTextBufferStrategy.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,85 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+ /// <summary>
+ /// Simple implementation of the ITextBuffer interface implemented using a
+ /// string.
+ /// Only for fall-back purposes.
+ /// </summary>
+ public class StringTextBufferStrategy : ITextBufferStrategy
+ {
+ string storedText = "";
+
+ public int Length {
+ get {
+ return storedText.Length;
+ }
+ }
+
+ public void Insert(int offset, string text)
+ {
+ if (text != null) {
+ storedText = storedText.Insert(offset, text);
+ }
+ }
+
+ public void Remove(int offset, int length)
+ {
+ storedText = storedText.Remove(offset, length);
+ }
+
+ public void Replace(int offset, int length, string text)
+ {
+ Remove(offset, length);
+ Insert(offset, text);
+ }
+
+ public string GetText(int offset, int length)
+ {
+ if (length == 0) {
+ return "";
+ }
+ if (offset == 0 && length >= storedText.Length) {
+ return storedText;
+ }
+ return storedText.Substring(offset, Math.Min(length, storedText.Length - offset));
+ }
+
+ public char GetCharAt(int offset)
+ {
+ if (offset == Length) {
+ return '\0';
+ }
+ return storedText[offset];
+ }
+
+ public void SetContent(string text)
+ {
+ storedText = text;
+ }
+
+ public StringTextBufferStrategy()
+ {
+ }
+
+ public static ITextBufferStrategy CreateTextBufferFromFile(string fileName)
+ {
+ if (!File.Exists(fileName)) {
+ throw new System.IO.FileNotFoundException(fileName);
+ }
+ StringTextBufferStrategy s = new StringTextBufferStrategy();
+ s.SetContent(Util.FileReader.ReadFileContent(fileName, Encoding.Default));
+ return s;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextLocation.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextLocation.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextLocation.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,128 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision: 2658$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// A line/column position.
+ /// Text editor lines/columns are counting from zero.
+ /// </summary>
+ public struct TextLocation : IComparable<TextLocation>, IEquatable<TextLocation>
+ {
+ /// <summary>
+ /// Represents no text location (-1, -1).
+ /// </summary>
+ public static readonly TextLocation Empty = new TextLocation(-1, -1);
+
+ public TextLocation(int column, int line)
+ {
+ x = column;
+ y = line;
+ }
+
+ int x, y;
+
+ public int X {
+ get { return x; }
+ set { x = value; }
+ }
+
+ public int Y {
+ get { return y; }
+ set { y = value; }
+ }
+
+ public int Line {
+ get { return y; }
+ set { y = value; }
+ }
+
+ public int Column {
+ get { return x; }
+ set { x = value; }
+ }
+
+ public bool IsEmpty {
+ get {
+ return x <= 0 && y <= 0;
+ }
+ }
+
+ public override string ToString()
+ {
+ return string.Format("(Line {1}, Col {0})", this.x, this.y);
+ }
+
+ public override int GetHashCode()
+ {
+ return unchecked (87 * x.GetHashCode() ^ y.GetHashCode());
+ }
+
+ public override bool Equals(object obj)
+ {
+ if (!(obj is TextLocation)) return false;
+ return (TextLocation)obj == this;
+ }
+
+ public bool Equals(TextLocation other)
+ {
+ return this == other;
+ }
+
+ public static bool operator ==(TextLocation a, TextLocation b)
+ {
+ return a.x == b.x && a.y == b.y;
+ }
+
+ public static bool operator !=(TextLocation a, TextLocation b)
+ {
+ return a.x != b.x || a.y != b.y;
+ }
+
+ public static bool operator <(TextLocation a, TextLocation b)
+ {
+ if (a.y < b.y)
+ return true;
+ else if (a.y == b.y)
+ return a.x < b.x;
+ else
+ return false;
+ }
+
+ public static bool operator >(TextLocation a, TextLocation b)
+ {
+ if (a.y > b.y)
+ return true;
+ else if (a.y == b.y)
+ return a.x > b.x;
+ else
+ return false;
+ }
+
+ public static bool operator <=(TextLocation a, TextLocation b)
+ {
+ return !(a > b);
+ }
+
+ public static bool operator >=(TextLocation a, TextLocation b)
+ {
+ return !(a < b);
+ }
+
+ public int CompareTo(TextLocation other)
+ {
+ if (this == other)
+ return 0;
+ if (this < other)
+ return -1;
+ else
+ return 1;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextUtilities.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextUtilities.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Document/TextUtilities.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,313 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Document
+{
+
+ public sealed class TextUtilities
+ {
+ /// <remarks>
+ /// This function takes a string and converts the whitespace in front of
+ /// it to tabs. If the length of the whitespace at the start of the string
+ /// was not a whole number of tabs then there will still be some spaces just
+ /// before the text starts.
+ /// the output string will be of the form:
+ /// 1. zero or more tabs
+ /// 2. zero or more spaces (less than tabIndent)
+ /// 3. the rest of the line
+ /// </remarks>
+ public static string LeadingWhiteSpaceToTabs(string line, int tabIndent) {
+ StringBuilder sb = new StringBuilder(line.Length);
+ int consecutiveSpaces = 0;
+ int i = 0;
+ for(i = 0; i < line.Length; i++) {
+ if(line[i] == ' ') {
+ consecutiveSpaces++;
+ if(consecutiveSpaces == tabIndent) {
+ sb.Append('\t');
+ consecutiveSpaces = 0;
+ }
+ }
+ else if(line[i] == '\t') {
+ sb.Append('\t');
+ // if we had say 3 spaces then a tab and tabIndent was 4 then
+ // we would want to simply replace all of that with 1 tab
+ consecutiveSpaces = 0;
+ }
+ else {
+ break;
+ }
+ }
+
+ if(i < line.Length) {
+ sb.Append(line.Substring(i-consecutiveSpaces));
+ }
+ return sb.ToString();
+ }
+
+ public static bool IsLetterDigitOrUnderscore(char c)
+ {
+ if(!Char.IsLetterOrDigit(c)) {
+ return c == '_';
+ }
+ return true;
+ }
+
+ public enum CharacterType {
+ LetterDigitOrUnderscore,
+ WhiteSpace,
+ Other
+ }
+
+ /// <remarks>
+ /// This method returns the expression before a specified offset.
+ /// That method is used in code completion to determine the expression given
+ /// to the parser for type resolve.
+ /// </remarks>
+ public static string GetExpressionBeforeOffset(TextArea textArea, int initialOffset)
+ {
+ IDocument document = textArea.Document;
+ int offset = initialOffset;
+ while (offset - 1 > 0) {
+ switch (document.GetCharAt(offset - 1)) {
+ case '\n':
+ case '\r':
+ case '}':
+ goto done;
+// offset = SearchBracketBackward(document, offset - 2, '{','}');
+// break;
+ case ']':
+ offset = SearchBracketBackward(document, offset - 2, '[',']');
+ break;
+ case ')':
+ offset = SearchBracketBackward(document, offset - 2, '(',')');
+ break;
+ case '.':
+ --offset;
+ break;
+ case '"':
+ if (offset < initialOffset - 1) {
+ return null;
+ }
+ return "\"\"";
+ case '\'':
+ if (offset < initialOffset - 1) {
+ return null;
+ }
+ return "'a'";
+ case '>':
+ if (document.GetCharAt(offset - 2) == '-') {
+ offset -= 2;
+ break;
+ }
+ goto done;
+ default:
+ if (Char.IsWhiteSpace(document.GetCharAt(offset - 1))) {
+ --offset;
+ break;
+ }
+ int start = offset - 1;
+ if (!IsLetterDigitOrUnderscore(document.GetCharAt(start))) {
+ goto done;
+ }
+
+ while (start > 0 && IsLetterDigitOrUnderscore(document.GetCharAt(start - 1))) {
+ --start;
+ }
+ string word = document.GetText(start, offset - start).Trim();
+ switch (word) {
+ case "ref":
+ case "out":
+ case "in":
+ case "return":
+ case "throw":
+ case "case":
+ goto done;
+ }
+
+ if (word.Length > 0 && !IsLetterDigitOrUnderscore(word[0])) {
+ goto done;
+ }
+ offset = start;
+ break;
+ }
+ }
+ done:
+ //// simple exit fails when : is inside comment line or any other character
+ //// we have to check if we got several ids in resulting line, which usually happens when
+ //// id. is typed on next line after comment one
+ //// Would be better if lexer would parse properly such expressions. However this will cause
+ //// modifications in this area too - to get full comment line and remove it afterwards
+ if (offset < 0)
+ return string.Empty;
+
+ string resText=document.GetText(offset, textArea.Caret.Offset - offset ).Trim();
+ int pos=resText.LastIndexOf('\n');
+ if (pos>=0) {
+ offset+=pos+1;
+ //// whitespaces and tabs, which might be inside, will be skipped by trim below
+ }
+ string expression = document.GetText(offset, textArea.Caret.Offset - offset ).Trim();
+ return expression;
+ }
+
+
+ public static CharacterType GetCharacterType(char c)
+ {
+ if(IsLetterDigitOrUnderscore(c))
+ return CharacterType.LetterDigitOrUnderscore;
+ if(Char.IsWhiteSpace(c))
+ return CharacterType.WhiteSpace;
+ return CharacterType.Other;
+ }
+
+ public static int GetFirstNonWSChar(IDocument document, int offset)
+ {
+ while (offset < document.TextLength && Char.IsWhiteSpace(document.GetCharAt(offset))) {
+ ++offset;
+ }
+ return offset;
+ }
+
+ public static int FindWordEnd(IDocument document, int offset)
+ {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ int endPos = line.Offset + line.Length;
+ while (offset < endPos && IsLetterDigitOrUnderscore(document.GetCharAt(offset))) {
+ ++offset;
+ }
+
+ return offset;
+ }
+
+ public static int FindWordStart(IDocument document, int offset)
+ {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ int lineOffset = line.Offset;
+ while (offset > lineOffset && IsLetterDigitOrUnderscore(document.GetCharAt(offset - 1))) {
+ --offset;
+ }
+
+ return offset;
+ }
+
+ // go forward to the start of the next word
+ // if the cursor is at the start or in the middle of a word we move to the end of the word
+ // and then past any whitespace that follows it
+ // if the cursor is at the start or in the middle of some whitespace we move to the start of the
+ // next word
+ public static int FindNextWordStart(IDocument document, int offset)
+ {
+ int originalOffset = offset;
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ int endPos = line.Offset + line.Length;
+ // lets go to the end of the word, whitespace or operator
+ CharacterType t = GetCharacterType(document.GetCharAt(offset));
+ while (offset < endPos && GetCharacterType(document.GetCharAt(offset)) == t) {
+ ++offset;
+ }
+
+ // now we're at the end of the word, lets find the start of the next one by skipping whitespace
+ while (offset < endPos && GetCharacterType(document.GetCharAt(offset)) == CharacterType.WhiteSpace) {
+ ++offset;
+ }
+
+ return offset;
+ }
+
+ // go back to the start of the word we are on
+ // if we are already at the start of a word or if we are in whitespace, then go back
+ // to the start of the previous word
+ public static int FindPrevWordStart(IDocument document, int offset)
+ {
+ int originalOffset = offset;
+ if (offset > 0) {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ CharacterType t = GetCharacterType(document.GetCharAt(offset - 1));
+ while (offset > line.Offset && GetCharacterType(document.GetCharAt(offset - 1)) == t) {
+ --offset;
+ }
+
+ // if we were in whitespace, and now we're at the end of a word or operator, go back to the beginning of it
+ if(t == CharacterType.WhiteSpace && offset > line.Offset) {
+ t = GetCharacterType(document.GetCharAt(offset - 1));
+ while (offset > line.Offset && GetCharacterType(document.GetCharAt(offset - 1)) == t) {
+ --offset;
+ }
+ }
+ }
+
+ return offset;
+ }
+
+ public static string GetLineAsString(IDocument document, int lineNumber)
+ {
+ LineSegment line = document.GetLineSegment(lineNumber);
+ return document.GetText(line.Offset, line.Length);
+ }
+
+ public static int SearchBracketBackward(IDocument document, int offset, char openBracket, char closingBracket)
+ {
+ return document.FormattingStrategy.SearchBracketBackward(document, offset, openBracket, closingBracket);
+ }
+
+ public static int SearchBracketForward(IDocument document, int offset, char openBracket, char closingBracket)
+ {
+ return document.FormattingStrategy.SearchBracketForward(document, offset, openBracket, closingBracket);
+ }
+
+ /// <remarks>
+ /// Returns true, if the line lineNumber is empty or filled with whitespaces.
+ /// </remarks>
+ public static bool IsEmptyLine(IDocument document, int lineNumber)
+ {
+ return IsEmptyLine(document, document.GetLineSegment(lineNumber));
+ }
+
+ /// <remarks>
+ /// Returns true, if the line lineNumber is empty or filled with whitespaces.
+ /// </remarks>
+ public static bool IsEmptyLine(IDocument document, LineSegment line)
+ {
+ for (int i = line.Offset; i < line.Offset + line.Length; ++i) {
+ char ch = document.GetCharAt(i);
+ if (!Char.IsWhiteSpace(ch)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ static bool IsWordPart(char ch)
+ {
+ return IsLetterDigitOrUnderscore(ch) || ch == '.';
+ }
+
+ public static string GetWordAt(IDocument document, int offset)
+ {
+ if (offset < 0 || offset >= document.TextLength - 1 || !IsWordPart(document.GetCharAt(offset))) {
+ return String.Empty;
+ }
+ int startOffset = offset;
+ int endOffset = offset;
+ while (startOffset > 0 && IsWordPart(document.GetCharAt(startOffset - 1))) {
+ --startOffset;
+ }
+
+ while (endOffset < document.TextLength - 1 && IsWordPart(document.GetCharAt(endOffset + 1))) {
+ ++endOffset;
+ }
+
+ Debug.Assert(endOffset >= startOffset);
+ return document.GetText(startOffset, endOffset - startOffset + 1);
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/AbstractMargin.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/AbstractMargin.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/AbstractMargin.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,115 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ public delegate void MarginMouseEventHandler(AbstractMargin sender, Point mousepos, MouseButtons mouseButtons);
+ public delegate void MarginPaintEventHandler(AbstractMargin sender, Graphics g, Rectangle rect);
+
+ /// <summary>
+ /// This class views the line numbers and folding markers.
+ /// </summary>
+ public abstract class AbstractMargin
+ {
+ Cursor cursor = Cursors.Default;
+
+ [CLSCompliant(false)]
+ protected Rectangle drawingPosition = new Rectangle(0, 0, 0, 0);
+ [CLSCompliant(false)]
+ protected TextArea textArea;
+
+ public Rectangle DrawingPosition {
+ get {
+ return drawingPosition;
+ }
+ set {
+ drawingPosition = value;
+ }
+ }
+
+ public TextArea TextArea {
+ get {
+ return textArea;
+ }
+ }
+
+ public IDocument Document {
+ get {
+ return textArea.Document;
+ }
+ }
+
+ public ITextEditorProperties TextEditorProperties {
+ get {
+ return textArea.Document.TextEditorProperties;
+ }
+ }
+
+ public virtual Cursor Cursor {
+ get {
+ return cursor;
+ }
+ set {
+ cursor = value;
+ }
+ }
+
+ public virtual Size Size {
+ get {
+ return new Size(-1, -1);
+ }
+ }
+
+ public virtual bool IsVisible {
+ get {
+ return true;
+ }
+ }
+
+ protected AbstractMargin(TextArea textArea)
+ {
+ this.textArea = textArea;
+ }
+
+ public virtual void HandleMouseDown(Point mousepos, MouseButtons mouseButtons)
+ {
+ if (MouseDown != null) {
+ MouseDown(this, mousepos, mouseButtons);
+ }
+ }
+ public virtual void HandleMouseMove(Point mousepos, MouseButtons mouseButtons)
+ {
+ if (MouseMove != null) {
+ MouseMove(this, mousepos, mouseButtons);
+ }
+ }
+ public virtual void HandleMouseLeave(EventArgs e)
+ {
+ if (MouseLeave != null) {
+ MouseLeave(this, e);
+ }
+ }
+
+ public virtual void Paint(Graphics g, Rectangle rect)
+ {
+ if (Painted != null) {
+ Painted(this, g, rect);
+ }
+ }
+
+ public event MarginPaintEventHandler Painted;
+ public event MarginMouseEventHandler MouseDown;
+ public event MarginMouseEventHandler MouseMove;
+ public event EventHandler MouseLeave;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BracketHighlighter.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BracketHighlighter.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BracketHighlighter.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,86 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ public class Highlight
+ {
+ public TextLocation OpenBrace { get; set; }
+ public TextLocation CloseBrace { get; set; }
+
+ public Highlight(TextLocation openBrace, TextLocation closeBrace)
+ {
+ this.OpenBrace = openBrace;
+ this.CloseBrace = closeBrace;
+ }
+ }
+
+ public class BracketHighlightingSheme
+ {
+ char opentag;
+ char closingtag;
+
+ public char OpenTag {
+ get {
+ return opentag;
+ }
+ set {
+ opentag = value;
+ }
+ }
+
+ public char ClosingTag {
+ get {
+ return closingtag;
+ }
+ set {
+ closingtag = value;
+ }
+ }
+
+ public BracketHighlightingSheme(char opentag, char closingtag)
+ {
+ this.opentag = opentag;
+ this.closingtag = closingtag;
+ }
+
+ public Highlight GetHighlight(IDocument document, int offset)
+ {
+ int searchOffset;
+ if (document.TextEditorProperties.BracketMatchingStyle == BracketMatchingStyle.After) {
+ searchOffset = offset;
+ } else {
+ searchOffset = offset + 1;
+ }
+ char word = document.GetCharAt(Math.Max(0, Math.Min(document.TextLength - 1, searchOffset)));
+
+ TextLocation endP = document.OffsetToPosition(searchOffset);
+ if (word == opentag) {
+ if (searchOffset < document.TextLength) {
+ int bracketOffset = TextUtilities.SearchBracketForward(document, searchOffset + 1, opentag, closingtag);
+ if (bracketOffset >= 0) {
+ TextLocation p = document.OffsetToPosition(bracketOffset);
+ return new Highlight(p, endP);
+ }
+ }
+ } else if (word == closingtag) {
+ if (searchOffset > 0) {
+ int bracketOffset = TextUtilities.SearchBracketBackward(document, searchOffset - 1, opentag, closingtag);
+ if (bracketOffset >= 0) {
+ TextLocation p = document.OffsetToPosition(bracketOffset);
+ return new Highlight(p, endP);
+ }
+ }
+ }
+ return null;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BrushRegistry.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BrushRegistry.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/BrushRegistry.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,65 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// Contains brushes/pens for the text editor to speed up drawing. Re-Creation of brushes and pens
+ /// seems too costly.
+ /// </summary>
+ public class BrushRegistry
+ {
+ static Dictionary<Color, Brush> brushes = new Dictionary<Color, Brush>();
+ static Dictionary<Color, Pen> pens = new Dictionary<Color, Pen>();
+ static Dictionary<Color, Pen> dotPens = new Dictionary<Color, Pen>();
+
+ public static Brush GetBrush(Color color)
+ {
+ lock (brushes) {
+ Brush brush;
+ if (!brushes.TryGetValue(color, out brush)) {
+ brush = new SolidBrush(color);
+ brushes.Add(color, brush);
+ }
+ return brush;
+ }
+ }
+
+ public static Pen GetPen(Color color)
+ {
+ lock (pens) {
+ Pen pen;
+ if (!pens.TryGetValue(color, out pen)) {
+ pen = new Pen(color);
+ pens.Add(color, pen);
+ }
+ return pen;
+ }
+ }
+
+ static readonly float[] dotPattern = { 1, 1, 1, 1 };
+
+ public static Pen GetDotPen(Color color)
+ {
+ lock (dotPens) {
+ Pen pen;
+ if (!dotPens.TryGetValue(color, out pen)) {
+ pen = new Pen(color);
+ pen.DashPattern = dotPattern;
+ dotPens.Add(color, pen);
+ }
+ return pen;
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Caret.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Caret.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Caret.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,510 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// In this enumeration are all caret modes listed.
+ /// </summary>
+ public enum CaretMode {
+ /// <summary>
+ /// If the caret is in insert mode typed characters will be
+ /// inserted at the caret position
+ /// </summary>
+ InsertMode,
+
+ /// <summary>
+ /// If the caret is in overwirte mode typed characters will
+ /// overwrite the character at the caret position
+ /// </summary>
+ OverwriteMode
+ }
+
+
+ public class Caret : System.IDisposable
+ {
+ int line = 0;
+ int column = 0;
+ int desiredXPos = 0;
+ CaretMode caretMode;
+
+ static bool caretCreated = false;
+ bool hidden = true;
+ TextArea textArea;
+ Point currentPos = new Point(-1, -1);
+ Ime ime = null;
+ CaretImplementation caretImplementation;
+
+ /// <value>
+ /// The 'prefered' xPos in which the caret moves, when it is moved
+ /// up/down. Measured in pixels, not in characters!
+ /// </value>
+ public int DesiredColumn {
+ get {
+ return desiredXPos;
+ }
+ set {
+ desiredXPos = value;
+ }
+ }
+
+ /// <value>
+ /// The current caret mode.
+ /// </value>
+ public CaretMode CaretMode {
+ get {
+ return caretMode;
+ }
+ set {
+ caretMode = value;
+ OnCaretModeChanged(EventArgs.Empty);
+ }
+ }
+
+ public int Line {
+ get {
+ return line;
+ }
+ set {
+ line = value;
+ ValidateCaretPos();
+ UpdateCaretPosition();
+ OnPositionChanged(EventArgs.Empty);
+ }
+ }
+
+ public int Column {
+ get {
+ return column;
+ }
+ set {
+ column = value;
+ ValidateCaretPos();
+ UpdateCaretPosition();
+ OnPositionChanged(EventArgs.Empty);
+ }
+ }
+
+ public TextLocation Position {
+ get {
+ return new TextLocation(column, line);
+ }
+ set {
+ line = value.Y;
+ column = value.X;
+ ValidateCaretPos();
+ UpdateCaretPosition();
+ OnPositionChanged(EventArgs.Empty);
+ }
+ }
+
+ public int Offset {
+ get {
+ return textArea.Document.PositionToOffset(Position);
+ }
+ }
+
+ public Caret(TextArea textArea)
+ {
+ this.textArea = textArea;
+ textArea.GotFocus += new EventHandler(GotFocus);
+ textArea.LostFocus += new EventHandler(LostFocus);
+ if (Environment.OSVersion.Platform == PlatformID.Unix)
+ caretImplementation = new ManagedCaret(this);
+ else
+ caretImplementation = new Win32Caret(this);
+ }
+
+ public void Dispose()
+ {
+ textArea.GotFocus -= new EventHandler(GotFocus);
+ textArea.LostFocus -= new EventHandler(LostFocus);
+ textArea = null;
+ caretImplementation.Dispose();
+ }
+
+ public TextLocation ValidatePosition(TextLocation pos)
+ {
+ int line = Math.Max(0, Math.Min(textArea.Document.TotalNumberOfLines - 1, pos.Y));
+ int column = Math.Max(0, pos.X);
+
+ if (column == int.MaxValue || !textArea.TextEditorProperties.AllowCaretBeyondEOL) {
+ LineSegment lineSegment = textArea.Document.GetLineSegment(line);
+ column = Math.Min(column, lineSegment.Length);
+ }
+ return new TextLocation(column, line);
+ }
+
+ /// <remarks>
+ /// If the caret position is outside the document text bounds
+ /// it is set to the correct position by calling ValidateCaretPos.
+ /// </remarks>
+ public void ValidateCaretPos()
+ {
+ line = Math.Max(0, Math.Min(textArea.Document.TotalNumberOfLines - 1, line));
+ column = Math.Max(0, column);
+
+ if (column == int.MaxValue || !textArea.TextEditorProperties.AllowCaretBeyondEOL) {
+ LineSegment lineSegment = textArea.Document.GetLineSegment(line);
+ column = Math.Min(column, lineSegment.Length);
+ }
+ }
+
+ void CreateCaret()
+ {
+ while (!caretCreated) {
+ switch (caretMode) {
+ case CaretMode.InsertMode:
+ caretCreated = caretImplementation.Create(2, textArea.TextView.FontHeight);
+ break;
+ case CaretMode.OverwriteMode:
+ caretCreated = caretImplementation.Create((int)textArea.TextView.SpaceWidth, textArea.TextView.FontHeight);
+ break;
+ }
+ }
+ if (currentPos.X < 0) {
+ ValidateCaretPos();
+ currentPos = ScreenPosition;
+ }
+ caretImplementation.SetPosition(currentPos.X, currentPos.Y);
+ caretImplementation.Show();
+ }
+
+ public void RecreateCaret()
+ {
+ Log("RecreateCaret");
+ DisposeCaret();
+ if (!hidden) {
+ CreateCaret();
+ }
+ }
+
+ void DisposeCaret()
+ {
+ if (caretCreated) {
+ caretCreated = false;
+ caretImplementation.Hide();
+ caretImplementation.Destroy();
+ }
+ }
+
+ void GotFocus(object sender, EventArgs e)
+ {
+ Log("GotFocus, IsInUpdate=" + textArea.MotherTextEditorControl.IsInUpdate);
+ hidden = false;
+ if (!textArea.MotherTextEditorControl.IsInUpdate) {
+ CreateCaret();
+ UpdateCaretPosition();
+ }
+ }
+
+ void LostFocus(object sender, EventArgs e)
+ {
+ Log("LostFocus");
+ hidden = true;
+ DisposeCaret();
+ }
+
+ public Point ScreenPosition {
+ get {
+ int xpos = textArea.TextView.GetDrawingXPos(this.line, this.column);
+ return new Point(textArea.TextView.DrawingPosition.X + xpos,
+ textArea.TextView.DrawingPosition.Y
+ + (textArea.Document.GetVisibleLine(this.line)) * textArea.TextView.FontHeight
+ - textArea.TextView.TextArea.VirtualTop.Y);
+ }
+ }
+ int oldLine = -1;
+ bool outstandingUpdate;
+
+ internal void OnEndUpdate()
+ {
+ if (outstandingUpdate)
+ UpdateCaretPosition();
+ }
+
+ void PaintCaretLine(Graphics g)
+ {
+ if (!textArea.Document.TextEditorProperties.CaretLine)
+ return;
+
+ HighlightColor caretLineColor = textArea.Document.HighlightingStrategy.GetColorFor("CaretLine");
+
+ g.DrawLine(BrushRegistry.GetDotPen(caretLineColor.Color),
+ currentPos.X,
+ 0,
+ currentPos.X,
+ textArea.DisplayRectangle.Height);
+ }
+
+ public void UpdateCaretPosition()
+ {
+ Log("UpdateCaretPosition");
+
+ if (textArea.TextEditorProperties.CaretLine) {
+ textArea.Invalidate();
+ } else {
+ if (caretImplementation.RequireRedrawOnPositionChange) {
+ textArea.UpdateLine(oldLine);
+ if (line != oldLine)
+ textArea.UpdateLine(line);
+ } else {
+ if (textArea.MotherTextAreaControl.TextEditorProperties.LineViewerStyle == LineViewerStyle.FullRow && oldLine != line) {
+ textArea.UpdateLine(oldLine);
+ textArea.UpdateLine(line);
+ }
+ }
+ }
+ oldLine = line;
+
+
+ if (hidden || textArea.MotherTextEditorControl.IsInUpdate) {
+ outstandingUpdate = true;
+ return;
+ } else {
+ outstandingUpdate = false;
+ }
+ ValidateCaretPos();
+ int lineNr = this.line;
+ int xpos = textArea.TextView.GetDrawingXPos(lineNr, this.column);
+ //LineSegment lineSegment = textArea.Document.GetLineSegment(lineNr);
+ Point pos = ScreenPosition;
+ if (xpos >= 0) {
+ CreateCaret();
+ bool success = caretImplementation.SetPosition(pos.X, pos.Y);
+ if (!success) {
+ caretImplementation.Destroy();
+ caretCreated = false;
+ UpdateCaretPosition();
+ }
+ } else {
+ caretImplementation.Destroy();
+ }
+
+ // set the input method editor location
+ if (ime == null) {
+ ime = new Ime(textArea.Handle, textArea.Document.TextEditorProperties.Font);
+ } else {
+ ime.HWnd = textArea.Handle;
+ ime.Font = textArea.Document.TextEditorProperties.Font;
+ }
+ ime.SetIMEWindowLocation(pos.X, pos.Y);
+
+ currentPos = pos;
+ }
+
+ [Conditional("DEBUG")]
+ static void Log(string text)
+ {
+ //Console.WriteLine(text);
+ }
+
+ #region Caret implementation
+ internal void PaintCaret(Graphics g)
+ {
+ caretImplementation.PaintCaret(g);
+ PaintCaretLine(g);
+ }
+
+ abstract class CaretImplementation : IDisposable
+ {
+ public bool RequireRedrawOnPositionChange;
+
+ public abstract bool Create(int width, int height);
+ public abstract void Hide();
+ public abstract void Show();
+ public abstract bool SetPosition(int x, int y);
+ public abstract void PaintCaret(Graphics g);
+ public abstract void Destroy();
+
+ public virtual void Dispose()
+ {
+ Destroy();
+ }
+ }
+
+ class ManagedCaret : CaretImplementation
+ {
+ System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer { Interval = 300 };
+ bool visible;
+ bool blink = true;
+ int x, y, width, height;
+ TextArea textArea;
+ Caret parentCaret;
+
+ public ManagedCaret(Caret caret)
+ {
+ base.RequireRedrawOnPositionChange = true;
+ this.textArea = caret.textArea;
+ this.parentCaret = caret;
+ timer.Tick += CaretTimerTick;
+ }
+
+ void CaretTimerTick(object sender, EventArgs e)
+ {
+ blink = !blink;
+ if (visible)
+ textArea.UpdateLine(parentCaret.Line);
+ }
+
+ public override bool Create(int width, int height)
+ {
+ this.visible = true;
+ this.width = width - 2;
+ this.height = height;
+ timer.Enabled = true;
+ return true;
+ }
+ public override void Hide()
+ {
+ visible = false;
+ }
+ public override void Show()
+ {
+ visible = true;
+ }
+ public override bool SetPosition(int x, int y)
+ {
+ this.x = x - 1;
+ this.y = y;
+ return true;
+ }
+ public override void PaintCaret(Graphics g)
+ {
+ if (visible && blink)
+ g.DrawRectangle(Pens.Gray, x, y, width, height);
+ }
+ public override void Destroy()
+ {
+ visible = false;
+ timer.Enabled = false;
+ }
+ public override void Dispose()
+ {
+ base.Dispose();
+ timer.Dispose();
+ }
+ }
+
+ class Win32Caret : CaretImplementation
+ {
+ [DllImport("User32.dll")]
+ static extern bool CreateCaret(IntPtr hWnd, int hBitmap, int nWidth, int nHeight);
+
+ [DllImport("User32.dll")]
+ static extern bool SetCaretPos(int x, int y);
+
+ [DllImport("User32.dll")]
+ static extern bool DestroyCaret();
+
+ [DllImport("User32.dll")]
+ static extern bool ShowCaret(IntPtr hWnd);
+
+ [DllImport("User32.dll")]
+ static extern bool HideCaret(IntPtr hWnd);
+
+ TextArea textArea;
+
+ public Win32Caret(Caret caret)
+ {
+ this.textArea = caret.textArea;
+ }
+
+ public override bool Create(int width, int height)
+ {
+ return CreateCaret(textArea.Handle, 0, width, height);
+ }
+ public override void Hide()
+ {
+ HideCaret(textArea.Handle);
+ }
+ public override void Show()
+ {
+ ShowCaret(textArea.Handle);
+ }
+ public override bool SetPosition(int x, int y)
+ {
+ return SetCaretPos(x, y);
+ }
+ public override void PaintCaret(Graphics g)
+ {
+ }
+ public override void Destroy()
+ {
+ DestroyCaret();
+ }
+ }
+ #endregion
+
+ bool firePositionChangedAfterUpdateEnd;
+
+ void FirePositionChangedAfterUpdateEnd(object sender, EventArgs e)
+ {
+ OnPositionChanged(EventArgs.Empty);
+ }
+
+ protected virtual void OnPositionChanged(EventArgs e)
+ {
+ if (this.textArea.MotherTextEditorControl.IsInUpdate) {
+ if (firePositionChangedAfterUpdateEnd == false) {
+ firePositionChangedAfterUpdateEnd = true;
+ this.textArea.Document.UpdateCommited += FirePositionChangedAfterUpdateEnd;
+ }
+ return;
+ } else if (firePositionChangedAfterUpdateEnd) {
+ this.textArea.Document.UpdateCommited -= FirePositionChangedAfterUpdateEnd;
+ firePositionChangedAfterUpdateEnd = false;
+ }
+
+ List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(line, column);
+ bool shouldUpdate = false;
+ foreach (FoldMarker foldMarker in foldings) {
+ shouldUpdate |= foldMarker.IsFolded;
+ foldMarker.IsFolded = false;
+ }
+
+ if (shouldUpdate) {
+ textArea.Document.FoldingManager.NotifyFoldingsChanged(EventArgs.Empty);
+ }
+
+ if (PositionChanged != null) {
+ PositionChanged(this, e);
+ }
+ textArea.ScrollToCaret();
+ }
+
+ protected virtual void OnCaretModeChanged(EventArgs e)
+ {
+ if (CaretModeChanged != null) {
+ CaretModeChanged(this, e);
+ }
+ caretImplementation.Hide();
+ caretImplementation.Destroy();
+ caretCreated = false;
+ CreateCaret();
+ caretImplementation.Show();
+ }
+
+ /// <remarks>
+ /// Is called each time the caret is moved.
+ /// </remarks>
+ public event EventHandler PositionChanged;
+
+ /// <remarks>
+ /// Is called each time the CaretMode has changed.
+ /// </remarks>
+ public event EventHandler CaretModeChanged;
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/AbstractCompletionWindow.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,214 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ /// <summary>
+ /// Description of AbstractCompletionWindow.
+ /// </summary>
+ public abstract class AbstractCompletionWindow : System.Windows.Forms.Form
+ {
+ protected TextEditorControl control;
+ protected Size drawingSize;
+ Rectangle workingScreen;
+ Form parentForm;
+
+ protected AbstractCompletionWindow(Form parentForm, TextEditorControl control)
+ {
+ workingScreen = Screen.GetWorkingArea(parentForm);
+// SetStyle(ControlStyles.Selectable, false);
+ this.parentForm = parentForm;
+ this.control = control;
+
+ SetLocation();
+ StartPosition = FormStartPosition.Manual;
+ FormBorderStyle = FormBorderStyle.None;
+ ShowInTaskbar = false;
+ MinimumSize = new Size(1, 1);
+ Size = new Size(1, 1);
+ }
+
+ protected virtual void SetLocation()
+ {
+ TextArea textArea = control.ActiveTextAreaControl.TextArea;
+ TextLocation caretPos = textArea.Caret.Position;
+
+ int xpos = textArea.TextView.GetDrawingXPos(caretPos.Y, caretPos.X);
+ int rulerHeight = textArea.TextEditorProperties.ShowHorizontalRuler ? textArea.TextView.FontHeight : 0;
+ Point pos = new Point(textArea.TextView.DrawingPosition.X + xpos,
+ textArea.TextView.DrawingPosition.Y + (textArea.Document.GetVisibleLine(caretPos.Y)) * textArea.TextView.FontHeight
+ - textArea.TextView.TextArea.VirtualTop.Y + textArea.TextView.FontHeight + rulerHeight);
+
+ Point location = control.ActiveTextAreaControl.PointToScreen(pos);
+
+ // set bounds
+ Rectangle bounds = new Rectangle(location, drawingSize);
+
+ if (!workingScreen.Contains(bounds)) {
+ if (bounds.Right > workingScreen.Right) {
+ bounds.X = workingScreen.Right - bounds.Width;
+ }
+ if (bounds.Left < workingScreen.Left) {
+ bounds.X = workingScreen.Left;
+ }
+ if (bounds.Top < workingScreen.Top) {
+ bounds.Y = workingScreen.Top;
+ }
+ if (bounds.Bottom > workingScreen.Bottom) {
+ bounds.Y = bounds.Y - bounds.Height - control.ActiveTextAreaControl.TextArea.TextView.FontHeight;
+ if (bounds.Bottom > workingScreen.Bottom) {
+ bounds.Y = workingScreen.Bottom - bounds.Height;
+ }
+ }
+ }
+ Bounds = bounds;
+ }
+
+ protected override CreateParams CreateParams {
+ get {
+ CreateParams p = base.CreateParams;
+ AddShadowToWindow(p);
+ return p;
+ }
+ }
+
+ static int shadowStatus;
+
+ /// <summary>
+ /// Adds a shadow to the create params if it is supported by the operating system.
+ /// </summary>
+ public static void AddShadowToWindow(CreateParams createParams)
+ {
+ if (shadowStatus == 0) {
+ // Test OS version
+ shadowStatus = -1; // shadow not supported
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT) {
+ Version ver = Environment.OSVersion.Version;
+ if (ver.Major > 5 || ver.Major == 5 && ver.Minor >= 1) {
+ shadowStatus = 1;
+ }
+ }
+ }
+ if (shadowStatus == 1) {
+ createParams.ClassStyle |= 0x00020000; // set CS_DROPSHADOW
+ }
+ }
+
+ protected override bool ShowWithoutActivation {
+ get {
+ return true;
+ }
+ }
+
+ protected void ShowCompletionWindow()
+ {
+ Owner = parentForm;
+ Enabled = true;
+ this.Show();
+
+ control.Focus();
+
+ if (parentForm != null) {
+ parentForm.LocationChanged += new EventHandler(this.ParentFormLocationChanged);
+ }
+
+ control.ActiveTextAreaControl.VScrollBar.ValueChanged += new EventHandler(ParentFormLocationChanged);
+ control.ActiveTextAreaControl.HScrollBar.ValueChanged += new EventHandler(ParentFormLocationChanged);
+ control.ActiveTextAreaControl.TextArea.DoProcessDialogKey += new DialogKeyProcessor(ProcessTextAreaKey);
+ control.ActiveTextAreaControl.Caret.PositionChanged += new EventHandler(CaretOffsetChanged);
+ control.ActiveTextAreaControl.TextArea.LostFocus += new EventHandler(this.TextEditorLostFocus);
+ control.Resize += new EventHandler(ParentFormLocationChanged);
+
+ foreach (Control c in Controls) {
+ c.MouseMove += ControlMouseMove;
+ }
+ }
+
+ void ParentFormLocationChanged(object sender, EventArgs e)
+ {
+ SetLocation();
+ }
+
+ public virtual bool ProcessKeyEvent(char ch)
+ {
+ return false;
+ }
+
+ protected virtual bool ProcessTextAreaKey(Keys keyData)
+ {
+ if (!Visible) {
+ return false;
+ }
+ switch (keyData) {
+ case Keys.Escape:
+ Close();
+ return true;
+ }
+ return false;
+ }
+
+ protected virtual void CaretOffsetChanged(object sender, EventArgs e)
+ {
+ }
+
+ protected void TextEditorLostFocus(object sender, EventArgs e)
+ {
+ if (!control.ActiveTextAreaControl.TextArea.Focused && !this.ContainsFocus) {
+ Close();
+ }
+ }
+
+ protected override void OnClosed(EventArgs e)
+ {
+ base.OnClosed(e);
+
+ // take out the inserted methods
+ parentForm.LocationChanged -= new EventHandler(ParentFormLocationChanged);
+
+ foreach (Control c in Controls) {
+ c.MouseMove -= ControlMouseMove;
+ }
+
+ if (control.ActiveTextAreaControl.VScrollBar != null) {
+ control.ActiveTextAreaControl.VScrollBar.ValueChanged -= new EventHandler(ParentFormLocationChanged);
+ }
+ if (control.ActiveTextAreaControl.HScrollBar != null) {
+ control.ActiveTextAreaControl.HScrollBar.ValueChanged -= new EventHandler(ParentFormLocationChanged);
+ }
+
+ control.ActiveTextAreaControl.TextArea.LostFocus -= new EventHandler(this.TextEditorLostFocus);
+ control.ActiveTextAreaControl.Caret.PositionChanged -= new EventHandler(CaretOffsetChanged);
+ control.ActiveTextAreaControl.TextArea.DoProcessDialogKey -= new DialogKeyProcessor(ProcessTextAreaKey);
+ control.Resize -= new EventHandler(ParentFormLocationChanged);
+ Dispose();
+ }
+
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ base.OnMouseMove(e);
+ ControlMouseMove(this, e);
+ }
+
+ /// <summary>
+ /// Invoked when the mouse moves over this form or any child control.
+ /// Shows the mouse cursor on the text area if it has been hidden.
+ /// </summary>
+ /// <remarks>
+ /// Derived classes should attach this handler to the MouseMove event
+ /// of all created controls which are not added to the Controls
+ /// collection.
+ /// </remarks>
+ protected void ControlMouseMove(object sender, MouseEventArgs e)
+ {
+ control.ActiveTextAreaControl.TextArea.ShowHiddenCursor(false);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionListView.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionListView.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionListView.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,293 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ /// <summary>
+ /// Description of CodeCompletionListView.
+ /// </summary>
+ public class CodeCompletionListView : System.Windows.Forms.UserControl
+ {
+ ICompletionData[] completionData;
+ int firstItem = 0;
+ int selectedItem = -1;
+ ImageList imageList;
+
+ public ImageList ImageList {
+ get {
+ return imageList;
+ }
+ set {
+ imageList = value;
+ }
+ }
+
+ public int FirstItem {
+ get {
+ return firstItem;
+ }
+ set {
+ if (firstItem != value) {
+ firstItem = value;
+ OnFirstItemChanged(EventArgs.Empty);
+ }
+ }
+ }
+
+ public ICompletionData SelectedCompletionData {
+ get {
+ if (selectedItem < 0) {
+ return null;
+ }
+ return completionData[selectedItem];
+ }
+ }
+
+ public int ItemHeight {
+ get {
+ return Math.Max(imageList.ImageSize.Height, (int)(Font.Height * 1.25));
+ }
+ }
+
+ public int MaxVisibleItem {
+ get {
+ return Height / ItemHeight;
+ }
+ }
+
+ public CodeCompletionListView(ICompletionData[] completionData)
+ {
+ Array.Sort(completionData, DefaultCompletionData.Compare);
+ this.completionData = completionData;
+
+// this.KeyDown += new System.Windows.Forms.KeyEventHandler(OnKey);
+// SetStyle(ControlStyles.Selectable, false);
+// SetStyle(ControlStyles.UserPaint, true);
+// SetStyle(ControlStyles.DoubleBuffer, false);
+ }
+
+ public void Close()
+ {
+ if (completionData != null) {
+ Array.Clear(completionData, 0, completionData.Length);
+ }
+ base.Dispose();
+ }
+
+ public void SelectIndex(int index)
+ {
+ int oldSelectedItem = selectedItem;
+ int oldFirstItem = firstItem;
+
+ index = Math.Max(0, index);
+ selectedItem = Math.Max(0, Math.Min(completionData.Length - 1, index));
+ if (selectedItem < firstItem) {
+ FirstItem = selectedItem;
+ }
+ if (firstItem + MaxVisibleItem <= selectedItem) {
+ FirstItem = selectedItem - MaxVisibleItem + 1;
+ }
+ if (oldSelectedItem != selectedItem) {
+ if (firstItem != oldFirstItem) {
+ Invalidate();
+ } else {
+ int min = Math.Min(selectedItem, oldSelectedItem) - firstItem;
+ int max = Math.Max(selectedItem, oldSelectedItem) - firstItem;
+ Invalidate(new Rectangle(0, 1 + min * ItemHeight, Width, (max - min + 1) * ItemHeight));
+ }
+ OnSelectedItemChanged(EventArgs.Empty);
+ }
+ }
+
+ public void CenterViewOn(int index)
+ {
+ int oldFirstItem = this.FirstItem;
+ int firstItem = index - MaxVisibleItem / 2;
+ if (firstItem < 0)
+ this.FirstItem = 0;
+ else if (firstItem >= completionData.Length - MaxVisibleItem)
+ this.FirstItem = completionData.Length - MaxVisibleItem;
+ else
+ this.FirstItem = firstItem;
+ if (this.FirstItem != oldFirstItem) {
+ Invalidate();
+ }
+ }
+
+ public void ClearSelection()
+ {
+ if (selectedItem < 0)
+ return;
+ int itemNum = selectedItem - firstItem;
+ selectedItem = -1;
+ Invalidate(new Rectangle(0, itemNum * ItemHeight, Width, (itemNum + 1) * ItemHeight + 1));
+ Update();
+ OnSelectedItemChanged(EventArgs.Empty);
+ }
+
+ public void PageDown()
+ {
+ SelectIndex(selectedItem + MaxVisibleItem);
+ }
+
+ public void PageUp()
+ {
+ SelectIndex(selectedItem - MaxVisibleItem);
+ }
+
+ public void SelectNextItem()
+ {
+ SelectIndex(selectedItem + 1);
+ }
+
+ public void SelectPrevItem()
+ {
+ SelectIndex(selectedItem - 1);
+ }
+
+ public void SelectItemWithStart(string startText)
+ {
+ if (startText == null || startText.Length == 0) return;
+ string originalStartText = startText;
+ startText = startText.ToLower();
+ int bestIndex = -1;
+ int bestQuality = -1;
+ // Qualities: 0 = match start
+ // 1 = match start case sensitive
+ // 2 = full match
+ // 3 = full match case sensitive
+ double bestPriority = 0;
+ for (int i = 0; i < completionData.Length; ++i) {
+ string itemText = completionData[i].Text;
+ string lowerText = itemText.ToLower();
+ if (lowerText.StartsWith(startText)) {
+ double priority = completionData[i].Priority;
+ int quality;
+ if (lowerText == startText) {
+ if (itemText == originalStartText)
+ quality = 3;
+ else
+ quality = 2;
+ } else if (itemText.StartsWith(originalStartText)) {
+ quality = 1;
+ } else {
+ quality = 0;
+ }
+ bool useThisItem;
+ if (bestQuality < quality) {
+ useThisItem = true;
+ } else {
+ if (bestIndex == selectedItem) {
+ useThisItem = false;
+ } else if (i == selectedItem) {
+ useThisItem = bestQuality == quality;
+ } else {
+ useThisItem = bestQuality == quality && bestPriority < priority;
+ }
+ }
+ if (useThisItem) {
+ bestIndex = i;
+ bestPriority = priority;
+ bestQuality = quality;
+ }
+ }
+ }
+ if (bestIndex < 0) {
+ ClearSelection();
+ } else {
+ if (bestIndex < firstItem || firstItem + MaxVisibleItem <= bestIndex) {
+ SelectIndex(bestIndex);
+ CenterViewOn(bestIndex);
+ } else {
+ SelectIndex(bestIndex);
+ }
+ }
+ }
+
+ protected override void OnPaint(PaintEventArgs pe)
+ {
+ float yPos = 1;
+ float itemHeight = ItemHeight;
+ // Maintain aspect ratio
+ int imageWidth = (int)(itemHeight * imageList.ImageSize.Width / imageList.ImageSize.Height);
+
+ int curItem = firstItem;
+ Graphics g = pe.Graphics;
+ while (curItem < completionData.Length && yPos < Height) {
+ RectangleF drawingBackground = new RectangleF(1, yPos, Width - 2, itemHeight);
+ if (drawingBackground.IntersectsWith(pe.ClipRectangle)) {
+ // draw Background
+ if (curItem == selectedItem) {
+ g.FillRectangle(SystemBrushes.Highlight, drawingBackground);
+ } else {
+ g.FillRectangle(SystemBrushes.Window, drawingBackground);
+ }
+
+ // draw Icon
+ int xPos = 0;
+ if (imageList != null && completionData[curItem].ImageIndex < imageList.Images.Count) {
+ g.DrawImage(imageList.Images[completionData[curItem].ImageIndex], new RectangleF(1, yPos, imageWidth, itemHeight));
+ xPos = imageWidth;
+ }
+
+ // draw text
+ if (curItem == selectedItem) {
+ g.DrawString(completionData[curItem].Text, Font, SystemBrushes.HighlightText, xPos, yPos);
+ } else {
+ g.DrawString(completionData[curItem].Text, Font, SystemBrushes.WindowText, xPos, yPos);
+ }
+ }
+
+ yPos += itemHeight;
+ ++curItem;
+ }
+ g.DrawRectangle(SystemPens.Control, new Rectangle(0, 0, Width - 1, Height - 1));
+ }
+
+ protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
+ {
+ float yPos = 1;
+ int curItem = firstItem;
+ float itemHeight = ItemHeight;
+
+ while (curItem < completionData.Length && yPos < Height) {
+ RectangleF drawingBackground = new RectangleF(1, yPos, Width - 2, itemHeight);
+ if (drawingBackground.Contains(e.X, e.Y)) {
+ SelectIndex(curItem);
+ break;
+ }
+ yPos += itemHeight;
+ ++curItem;
+ }
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs pe)
+ {
+ }
+
+ protected virtual void OnSelectedItemChanged(EventArgs e)
+ {
+ if (SelectedItemChanged != null) {
+ SelectedItemChanged(this, e);
+ }
+ }
+
+ protected virtual void OnFirstItemChanged(EventArgs e)
+ {
+ if (FirstItemChanged != null) {
+ FirstItemChanged(this, e);
+ }
+ }
+
+ public event EventHandler SelectedItemChanged;
+ public event EventHandler FirstItemChanged;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionWindow.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/CodeCompletionWindow.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,364 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Diagnostics;
+using System.Windows.Forms;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ public class CodeCompletionWindow : AbstractCompletionWindow
+ {
+ ICompletionData[] completionData;
+ CodeCompletionListView codeCompletionListView;
+ VScrollBar vScrollBar = new VScrollBar();
+ ICompletionDataProvider dataProvider;
+ IDocument document;
+ bool showDeclarationWindow = true;
+ bool fixedListViewWidth = true;
+ const int ScrollbarWidth = 16;
+ const int MaxListLength = 10;
+
+ int startOffset;
+ int endOffset;
+ DeclarationViewWindow declarationViewWindow = null;
+ Rectangle workingScreen;
+
+ public static CodeCompletionWindow ShowCompletionWindow(Form parent, TextEditorControl control, string fileName, ICompletionDataProvider completionDataProvider, char firstChar)
+ {
+ return ShowCompletionWindow(parent, control, fileName, completionDataProvider, firstChar, true, true);
+ }
+
+ public static CodeCompletionWindow ShowCompletionWindow(Form parent, TextEditorControl control, string fileName, ICompletionDataProvider completionDataProvider, char firstChar, bool showDeclarationWindow, bool fixedListViewWidth)
+ {
+ ICompletionData[] completionData = completionDataProvider.GenerateCompletionData(fileName, control.ActiveTextAreaControl.TextArea, firstChar);
+ if (completionData == null || completionData.Length == 0) {
+ return null;
+ }
+ CodeCompletionWindow codeCompletionWindow = new CodeCompletionWindow(completionDataProvider, completionData, parent, control, showDeclarationWindow, fixedListViewWidth);
+ codeCompletionWindow.CloseWhenCaretAtBeginning = firstChar == '\0';
+ codeCompletionWindow.ShowCompletionWindow();
+ return codeCompletionWindow;
+ }
+
+ CodeCompletionWindow(ICompletionDataProvider completionDataProvider, ICompletionData[] completionData, Form parentForm, TextEditorControl control, bool showDeclarationWindow, bool fixedListViewWidth) : base(parentForm, control)
+ {
+ this.dataProvider = completionDataProvider;
+ this.completionData = completionData;
+ this.document = control.Document;
+ this.showDeclarationWindow = showDeclarationWindow;
+ this.fixedListViewWidth = fixedListViewWidth;
+
+ workingScreen = Screen.GetWorkingArea(Location);
+ startOffset = control.ActiveTextAreaControl.Caret.Offset + 1;
+ endOffset = startOffset;
+ if (completionDataProvider.PreSelection != null) {
+ startOffset -= completionDataProvider.PreSelection.Length + 1;
+ endOffset--;
+ }
+
+ codeCompletionListView = new CodeCompletionListView(completionData);
+ codeCompletionListView.ImageList = completionDataProvider.ImageList;
+ codeCompletionListView.Dock = DockStyle.Fill;
+ codeCompletionListView.SelectedItemChanged += new EventHandler(CodeCompletionListViewSelectedItemChanged);
+ codeCompletionListView.DoubleClick += new EventHandler(CodeCompletionListViewDoubleClick);
+ codeCompletionListView.Click += new EventHandler(CodeCompletionListViewClick);
+ Controls.Add(codeCompletionListView);
+
+ if (completionData.Length > MaxListLength) {
+ vScrollBar.Dock = DockStyle.Right;
+ vScrollBar.Minimum = 0;
+ vScrollBar.Maximum = completionData.Length - 1;
+ vScrollBar.SmallChange = 1;
+ vScrollBar.LargeChange = MaxListLength;
+ codeCompletionListView.FirstItemChanged += new EventHandler(CodeCompletionListViewFirstItemChanged);
+ Controls.Add(vScrollBar);
+ }
+
+ this.drawingSize = GetListViewSize();
+ SetLocation();
+
+ if (declarationViewWindow == null) {
+ declarationViewWindow = new DeclarationViewWindow(parentForm);
+ }
+ SetDeclarationViewLocation();
+ declarationViewWindow.ShowDeclarationViewWindow();
+ declarationViewWindow.MouseMove += ControlMouseMove;
+ control.Focus();
+ CodeCompletionListViewSelectedItemChanged(this, EventArgs.Empty);
+
+ if (completionDataProvider.DefaultIndex >= 0) {
+ codeCompletionListView.SelectIndex(completionDataProvider.DefaultIndex);
+ }
+
+ if (completionDataProvider.PreSelection != null) {
+ CaretOffsetChanged(this, EventArgs.Empty);
+ }
+
+ vScrollBar.ValueChanged += VScrollBarValueChanged;
+ document.DocumentAboutToBeChanged += DocumentAboutToBeChanged;
+ }
+
+ bool inScrollUpdate;
+
+ void CodeCompletionListViewFirstItemChanged(object sender, EventArgs e)
+ {
+ if (inScrollUpdate) return;
+ inScrollUpdate = true;
+ vScrollBar.Value = Math.Min(vScrollBar.Maximum, codeCompletionListView.FirstItem);
+ inScrollUpdate = false;
+ }
+
+ void VScrollBarValueChanged(object sender, EventArgs e)
+ {
+ if (inScrollUpdate) return;
+ inScrollUpdate = true;
+ codeCompletionListView.FirstItem = vScrollBar.Value;
+ codeCompletionListView.Refresh();
+ control.ActiveTextAreaControl.TextArea.Focus();
+ inScrollUpdate = false;
+ }
+
+ void SetDeclarationViewLocation()
+ {
+ // This method uses the side with more free space
+ int leftSpace = Bounds.Left - workingScreen.Left;
+ int rightSpace = workingScreen.Right - Bounds.Right;
+ Point pos;
+ // The declaration view window has better line break when used on
+ // the right side, so prefer the right side to the left.
+ if (rightSpace * 2 > leftSpace) {
+ declarationViewWindow.FixedWidth = false;
+ pos = new Point(Bounds.Right, Bounds.Top);
+ if (declarationViewWindow.Location != pos) {
+ declarationViewWindow.Location = pos;
+ }
+ } else {
+ declarationViewWindow.Width = declarationViewWindow.GetRequiredLeftHandSideWidth(new Point(Bounds.Left, Bounds.Top));
+ declarationViewWindow.FixedWidth = true;
+ if (Bounds.Left < declarationViewWindow.Width) {
+ pos = new Point(0, Bounds.Top);
+ } else {
+ pos = new Point(Bounds.Left - declarationViewWindow.Width, Bounds.Top);
+ }
+ if (declarationViewWindow.Location != pos) {
+ declarationViewWindow.Location = pos;
+ }
+ declarationViewWindow.Refresh();
+ }
+ }
+
+ protected override void SetLocation()
+ {
+ base.SetLocation();
+ if (declarationViewWindow != null) {
+ SetDeclarationViewLocation();
+ }
+ }
+
+ Util.MouseWheelHandler mouseWheelHandler = new Util.MouseWheelHandler();
+
+ public void HandleMouseWheel(MouseEventArgs e)
+ {
+ int scrollDistance = mouseWheelHandler.GetScrollAmount(e);
+ if (scrollDistance == 0)
+ return;
+ if (control.TextEditorProperties.MouseWheelScrollDown)
+ scrollDistance = -scrollDistance;
+ int newValue = vScrollBar.Value + vScrollBar.SmallChange * scrollDistance;
+ vScrollBar.Value = Math.Max(vScrollBar.Minimum, Math.Min(vScrollBar.Maximum - vScrollBar.LargeChange + 1, newValue));
+ }
+
+ void CodeCompletionListViewSelectedItemChanged(object sender, EventArgs e)
+ {
+ ICompletionData data = codeCompletionListView.SelectedCompletionData;
+ if (showDeclarationWindow && data != null && data.Description != null && data.Description.Length > 0) {
+ declarationViewWindow.Description = data.Description;
+ SetDeclarationViewLocation();
+ } else {
+ declarationViewWindow.Description = null;
+ }
+ }
+
+ public override bool ProcessKeyEvent(char ch)
+ {
+ switch (dataProvider.ProcessKey(ch)) {
+ case CompletionDataProviderKeyResult.BeforeStartKey:
+ // increment start+end, then process as normal char
+ ++startOffset;
+ ++endOffset;
+ return base.ProcessKeyEvent(ch);
+ case CompletionDataProviderKeyResult.NormalKey:
+ // just process normally
+ return base.ProcessKeyEvent(ch);
+ case CompletionDataProviderKeyResult.InsertionKey:
+ return InsertSelectedItem(ch);
+ default:
+ throw new InvalidOperationException("Invalid return value of dataProvider.ProcessKey");
+ }
+ }
+
+ void DocumentAboutToBeChanged(object sender, DocumentEventArgs e)
+ {
+ // => startOffset test required so that this startOffset/endOffset are not incremented again
+ // for BeforeStartKey characters
+ if (e.Offset >= startOffset && e.Offset <= endOffset) {
+ if (e.Length > 0) { // length of removed region
+ endOffset -= e.Length;
+ }
+ if (!string.IsNullOrEmpty(e.Text)) {
+ endOffset += e.Text.Length;
+ }
+ }
+ }
+
+ /// <summary>
+ /// When this flag is set, code completion closes if the caret moves to the
+ /// beginning of the allowed range. This is useful in Ctrl+Space and "complete when typing",
+ /// but not in dot-completion.
+ /// </summary>
+ public bool CloseWhenCaretAtBeginning { get; set; }
+
+ protected override void CaretOffsetChanged(object sender, EventArgs e)
+ {
+ int offset = control.ActiveTextAreaControl.Caret.Offset;
+ if (offset == startOffset) {
+ if (CloseWhenCaretAtBeginning)
+ Close();
+ return;
+ }
+ if (offset < startOffset || offset > endOffset) {
+ Close();
+ } else {
+ codeCompletionListView.SelectItemWithStart(control.Document.GetText(startOffset, offset - startOffset));
+ }
+ }
+
+ protected override bool ProcessTextAreaKey(Keys keyData)
+ {
+ if (!Visible) {
+ return false;
+ }
+
+ switch (keyData) {
+ case Keys.Home:
+ codeCompletionListView.SelectIndex(0);
+ return true;
+ case Keys.End:
+ codeCompletionListView.SelectIndex(completionData.Length-1);
+ return true;
+ case Keys.PageDown:
+ codeCompletionListView.PageDown();
+ return true;
+ case Keys.PageUp:
+ codeCompletionListView.PageUp();
+ return true;
+ case Keys.Down:
+ codeCompletionListView.SelectNextItem();
+ return true;
+ case Keys.Up:
+ codeCompletionListView.SelectPrevItem();
+ return true;
+ case Keys.Tab:
+ InsertSelectedItem('\t');
+ return true;
+ case Keys.Return:
+ InsertSelectedItem('\n');
+ return true;
+ }
+ return base.ProcessTextAreaKey(keyData);
+ }
+
+ void CodeCompletionListViewDoubleClick(object sender, EventArgs e)
+ {
+ InsertSelectedItem('\0');
+ }
+
+ void CodeCompletionListViewClick(object sender, EventArgs e)
+ {
+ control.ActiveTextAreaControl.TextArea.Focus();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing) {
+ document.DocumentAboutToBeChanged -= DocumentAboutToBeChanged;
+ if (codeCompletionListView != null) {
+ codeCompletionListView.Dispose();
+ codeCompletionListView = null;
+ }
+ if (declarationViewWindow != null) {
+ declarationViewWindow.Dispose();
+ declarationViewWindow = null;
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ bool InsertSelectedItem(char ch)
+ {
+ document.DocumentAboutToBeChanged -= DocumentAboutToBeChanged;
+ ICompletionData data = codeCompletionListView.SelectedCompletionData;
+ bool result = false;
+ if (data != null) {
+ control.BeginUpdate();
+
+ try {
+ if (endOffset - startOffset > 0) {
+ control.Document.Remove(startOffset, endOffset - startOffset);
+ }
+ Debug.Assert(startOffset <= document.TextLength);
+ result = dataProvider.InsertAction(data, control.ActiveTextAreaControl.TextArea, startOffset, ch);
+ } finally {
+ control.EndUpdate();
+ }
+ }
+ Close();
+ return result;
+ }
+
+ Size GetListViewSize()
+ {
+ int height = codeCompletionListView.ItemHeight * Math.Min(MaxListLength, completionData.Length);
+ int width = codeCompletionListView.ItemHeight * 10;
+ if (!fixedListViewWidth) {
+ width = GetListViewWidth(width, height);
+ }
+ return new Size(width, height);
+ }
+
+ /// <summary>
+ /// Gets the list view width large enough to handle the longest completion data
+ /// text string.
+ /// </summary>
+ /// <param name="defaultWidth">The default width of the list view.</param>
+ /// <param name="height">The height of the list view. This is
+ /// used to determine if the scrollbar is visible.</param>
+ /// <returns>The list view width to accommodate the longest completion
+ /// data text string; otherwise the default width.</returns>
+ int GetListViewWidth(int defaultWidth, int height)
+ {
+ float width = defaultWidth;
+ using (Graphics graphics = codeCompletionListView.CreateGraphics()) {
+ for (int i = 0; i < completionData.Length; ++i) {
+ float itemWidth = graphics.MeasureString(completionData[i].Text.ToString(), codeCompletionListView.Font).Width;
+ if(itemWidth > width) {
+ width = itemWidth;
+ }
+ }
+ }
+
+ float totalItemsHeight = codeCompletionListView.ItemHeight * completionData.Length;
+ if (totalItemsHeight > height) {
+ width += ScrollbarWidth; // Compensate for scroll bar.
+ }
+ return (int)width;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/DeclarationViewWindow.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/DeclarationViewWindow.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/DeclarationViewWindow.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,125 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ public interface IDeclarationViewWindow
+ {
+ string Description {
+ get;
+ set;
+ }
+ void ShowDeclarationViewWindow();
+ void CloseDeclarationViewWindow();
+ }
+
+ public class DeclarationViewWindow : Form, IDeclarationViewWindow
+ {
+ string description = String.Empty;
+ bool fixedWidth;
+
+ public string Description {
+ get {
+ return description;
+ }
+ set {
+ description = value;
+ if (value == null && Visible) {
+ Visible = false;
+ } else if (value != null) {
+ if (!Visible) ShowDeclarationViewWindow();
+ Refresh();
+ }
+ }
+ }
+
+ public bool FixedWidth {
+ get {
+ return fixedWidth;
+ }
+ set {
+ fixedWidth = value;
+ }
+ }
+
+ public int GetRequiredLeftHandSideWidth(Point p) {
+ if (description != null && description.Length > 0) {
+ using (Graphics g = CreateGraphics()) {
+ Size s = TipPainterTools.GetLeftHandSideDrawingSizeHelpTipFromCombinedDescription(this, g, Font, null, description, p);
+ return s.Width;
+ }
+ }
+ return 0;
+ }
+
+ public bool HideOnClick;
+
+ public DeclarationViewWindow(Form parent)
+ {
+ SetStyle(ControlStyles.Selectable, false);
+ StartPosition = FormStartPosition.Manual;
+ FormBorderStyle = FormBorderStyle.None;
+ Owner = parent;
+ ShowInTaskbar = false;
+ Size = new Size(0, 0);
+ base.CreateHandle();
+ }
+
+ protected override CreateParams CreateParams {
+ get {
+ CreateParams p = base.CreateParams;
+ AbstractCompletionWindow.AddShadowToWindow(p);
+ return p;
+ }
+ }
+
+ protected override bool ShowWithoutActivation {
+ get {
+ return true;
+ }
+ }
+
+ protected override void OnClick(EventArgs e)
+ {
+ base.OnClick(e);
+ if (HideOnClick) Hide();
+ }
+
+ public void ShowDeclarationViewWindow()
+ {
+ Show();
+ }
+
+ public void CloseDeclarationViewWindow()
+ {
+ Close();
+ Dispose();
+ }
+
+ protected override void OnPaint(PaintEventArgs pe)
+ {
+ if (description != null && description.Length > 0) {
+ if (fixedWidth) {
+ TipPainterTools.DrawFixedWidthHelpTipFromCombinedDescription(this, pe.Graphics, Font, null, description);
+ } else {
+ TipPainterTools.DrawHelpTipFromCombinedDescription(this, pe.Graphics, Font, null, description);
+ }
+ }
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs pe)
+ {
+ pe.Graphics.FillRectangle(SystemBrushes.Info, pe.ClipRectangle);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionData.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionData.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionData.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,114 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ public interface ICompletionData
+ {
+ int ImageIndex {
+ get;
+ }
+
+ string Text {
+ get;
+ set;
+ }
+
+ string Description {
+ get;
+ }
+
+ /// <summary>
+ /// Gets a priority value for the completion data item.
+ /// When selecting items by their start characters, the item with the highest
+ /// priority is selected first.
+ /// </summary>
+ double Priority {
+ get;
+ }
+
+ /// <summary>
+ /// Insert the element represented by the completion data into the text
+ /// editor.
+ /// </summary>
+ /// <param name="textArea">TextArea to insert the completion data in.</param>
+ /// <param name="ch">Character that should be inserted after the completion data.
+ /// \0 when no character should be inserted.</param>
+ /// <returns>Returns true when the insert action has processed the character
+ /// <paramref name="ch"/>; false when the character was not processed.</returns>
+ bool InsertAction(TextArea textArea, char ch);
+ }
+
+ public class DefaultCompletionData : ICompletionData
+ {
+ string text;
+ string description;
+ int imageIndex;
+
+ public int ImageIndex {
+ get {
+ return imageIndex;
+ }
+ }
+
+ public string Text {
+ get {
+ return text;
+ }
+ set {
+ text = value;
+ }
+ }
+
+ public virtual string Description {
+ get {
+ return description;
+ }
+ }
+
+ double priority;
+
+ public double Priority {
+ get {
+ return priority;
+ }
+ set {
+ priority = value;
+ }
+ }
+
+ public virtual bool InsertAction(TextArea textArea, char ch)
+ {
+ textArea.InsertString(text);
+ return false;
+ }
+
+ public DefaultCompletionData(string text, int imageIndex)
+ {
+ this.text = text;
+ this.imageIndex = imageIndex;
+ }
+
+ public DefaultCompletionData(string text, string description, int imageIndex)
+ {
+ this.text = text;
+ this.description = description;
+ this.imageIndex = imageIndex;
+ }
+
+ public static int Compare(ICompletionData a, ICompletionData b)
+ {
+ if (a == null)
+ throw new ArgumentNullException("a");
+ if (b == null)
+ throw new ArgumentNullException("b");
+ return string.Compare(a.Text, b.Text, StringComparison.InvariantCultureIgnoreCase);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionDataProvider.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/CompletionWindow/ICompletionDataProvider.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,62 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Gui.CompletionWindow
+{
+ public interface ICompletionDataProvider
+ {
+ ImageList ImageList {
+ get;
+ }
+ string PreSelection {
+ get;
+ }
+ /// <summary>
+ /// Gets the index of the element in the list that is chosen by default.
+ /// </summary>
+ int DefaultIndex {
+ get;
+ }
+
+ /// <summary>
+ /// Processes a keypress. Returns the action to be run with the key.
+ /// </summary>
+ CompletionDataProviderKeyResult ProcessKey(char key);
+
+ /// <summary>
+ /// Executes the insertion. The provider should set the caret position and then
+ /// call data.InsertAction.
+ /// </summary>
+ bool InsertAction(ICompletionData data, TextArea textArea, int insertionOffset, char key);
+
+ /// <summary>
+ /// Generates the completion data. This method is called by the text editor control.
+ /// </summary>
+ ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped);
+ }
+
+ public enum CompletionDataProviderKeyResult
+ {
+ /// <summary>
+ /// Normal key, used to choose an entry from the completion list
+ /// </summary>
+ NormalKey,
+ /// <summary>
+ /// This key triggers insertion of the completed expression
+ /// </summary>
+ InsertionKey,
+ /// <summary>
+ /// Increment both start and end offset of completion region when inserting this
+ /// key. Can be used to insert whitespace (or other characters) in front of the expression
+ /// while the completion window is open.
+ /// </summary>
+ BeforeStartKey
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/DrawableLine.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/DrawableLine.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/DrawableLine.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,190 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// A class that is able to draw a line on any control (outside the text editor)
+ /// </summary>
+ public class DrawableLine
+ {
+ static StringFormat sf = (StringFormat)System.Drawing.StringFormat.GenericTypographic.Clone();
+
+ List<SimpleTextWord> words = new List<SimpleTextWord>();
+ SizeF spaceSize;
+ Font monospacedFont;
+ Font boldMonospacedFont;
+
+ private class SimpleTextWord {
+ internal TextWordType Type;
+ internal string Word;
+ internal bool Bold;
+ internal Color Color;
+
+ public SimpleTextWord(TextWordType Type, string Word, bool Bold, Color Color)
+ {
+ this.Type = Type;
+ this.Word = Word;
+ this.Bold = Bold;
+ this.Color = Color;
+ }
+
+ internal readonly static SimpleTextWord Space = new SimpleTextWord(TextWordType.Space, " ", false, Color.Black);
+ internal readonly static SimpleTextWord Tab = new SimpleTextWord(TextWordType.Tab, "\t", false, Color.Black);
+ }
+
+ public DrawableLine(IDocument document, LineSegment line, Font monospacedFont, Font boldMonospacedFont)
+ {
+ this.monospacedFont = monospacedFont;
+ this.boldMonospacedFont = boldMonospacedFont;
+ if (line.Words != null) {
+ foreach (TextWord word in line.Words) {
+ if (word.Type == TextWordType.Space) {
+ words.Add(SimpleTextWord.Space);
+ } else if (word.Type == TextWordType.Tab) {
+ words.Add(SimpleTextWord.Tab);
+ } else {
+ words.Add(new SimpleTextWord(TextWordType.Word, word.Word, word.Bold, word.Color));
+ }
+ }
+ } else {
+ words.Add(new SimpleTextWord(TextWordType.Word, document.GetText(line), false, Color.Black));
+ }
+ }
+
+ public int LineLength {
+ get {
+ int length = 0;
+ foreach (SimpleTextWord word in words) {
+ length += word.Word.Length;
+ }
+ return length;
+ }
+ }
+
+ public void SetBold(int startIndex, int endIndex, bool bold)
+ {
+ if (startIndex < 0)
+ throw new ArgumentException("startIndex must be >= 0");
+ if (startIndex > endIndex)
+ throw new ArgumentException("startIndex must be <= endIndex");
+ if (startIndex == endIndex) return;
+ int pos = 0;
+ for (int i = 0; i < words.Count; i++) {
+ SimpleTextWord word = words[i];
+ if (pos >= endIndex)
+ break;
+ int wordEnd = pos + word.Word.Length;
+ // 3 possibilities:
+ if (startIndex <= pos && endIndex >= wordEnd) {
+ // word is fully in region:
+ word.Bold = bold;
+ } else if (startIndex <= pos) {
+ // beginning of word is in region
+ int inRegionLength = endIndex - pos;
+ SimpleTextWord newWord = new SimpleTextWord(word.Type, word.Word.Substring(inRegionLength), word.Bold, word.Color);
+ words.Insert(i + 1, newWord);
+
+ word.Bold = bold;
+ word.Word = word.Word.Substring(0, inRegionLength);
+ } else if (startIndex < wordEnd) {
+ // end of word is in region (or middle of word is in region)
+ int notInRegionLength = startIndex - pos;
+
+ SimpleTextWord newWord = new SimpleTextWord(word.Type, word.Word.Substring(notInRegionLength), word.Bold, word.Color);
+ // newWord.Bold will be set in the next iteration
+ words.Insert(i + 1, newWord);
+
+ word.Word = word.Word.Substring(0, notInRegionLength);
+ }
+ pos = wordEnd;
+ }
+ }
+
+ public static float DrawDocumentWord(Graphics g, string word, PointF position, Font font, Color foreColor)
+ {
+ if (word == null || word.Length == 0) {
+ return 0f;
+ }
+ SizeF wordSize = g.MeasureString(word, font, 32768, sf);
+
+ g.DrawString(word,
+ font,
+ BrushRegistry.GetBrush(foreColor),
+ position,
+ sf);
+ return wordSize.Width;
+ }
+
+ public SizeF GetSpaceSize(Graphics g)
+ {
+ if (spaceSize.IsEmpty) {
+ spaceSize = g.MeasureString("-", boldMonospacedFont, new PointF(0, 0), sf);
+ }
+ return spaceSize;
+ }
+
+ public void DrawLine(Graphics g, ref float xPos, float xOffset, float yPos, Color c)
+ {
+ SizeF spaceSize = GetSpaceSize(g);
+ foreach (SimpleTextWord word in words) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ xPos += spaceSize.Width;
+ break;
+ case TextWordType.Tab:
+ float tabWidth = spaceSize.Width * 4;
+ xPos += tabWidth;
+ xPos = (int)((xPos + 2) / tabWidth) * tabWidth;
+ break;
+ case TextWordType.Word:
+ xPos += DrawDocumentWord(g,
+ word.Word,
+ new PointF(xPos + xOffset, yPos),
+ word.Bold ? boldMonospacedFont : monospacedFont,
+ c == Color.Empty ? word.Color : c
+ );
+ break;
+ }
+ }
+ }
+
+ public void DrawLine(Graphics g, ref float xPos, float xOffset, float yPos)
+ {
+ DrawLine(g, ref xPos, xOffset, yPos, Color.Empty);
+ }
+
+ public float MeasureWidth(Graphics g, float xPos)
+ {
+ SizeF spaceSize = GetSpaceSize(g);
+ foreach (SimpleTextWord word in words) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ xPos += spaceSize.Width;
+ break;
+ case TextWordType.Tab:
+ float tabWidth = spaceSize.Width * 4;
+ xPos += tabWidth;
+ xPos = (int)((xPos + 2) / tabWidth) * tabWidth;
+ break;
+ case TextWordType.Word:
+ if (word.Word != null && word.Word.Length > 0) {
+ xPos += g.MeasureString(word.Word, word.Bold ? boldMonospacedFont : monospacedFont, 32768, sf).Width;
+ }
+ break;
+ }
+ }
+ return xPos;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/FoldMargin.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/FoldMargin.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/FoldMargin.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,276 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class views the line numbers and folding markers.
+ /// </summary>
+ public class FoldMargin : AbstractMargin
+ {
+ int selectedFoldLine = -1;
+
+ public override Size Size {
+ get {
+ return new Size((int)(textArea.TextView.FontHeight),
+ -1);
+ }
+ }
+
+ public override bool IsVisible {
+ get {
+ return textArea.TextEditorProperties.EnableFolding;
+ }
+ }
+
+ public FoldMargin(TextArea textArea) : base(textArea)
+ {
+ }
+
+ public override void Paint(Graphics g, Rectangle rect)
+ {
+ if (rect.Width <= 0 || rect.Height <= 0) {
+ return;
+ }
+ HighlightColor lineNumberPainterColor = textArea.Document.HighlightingStrategy.GetColorFor("LineNumbers");
+
+
+ for (int y = 0; y < (DrawingPosition.Height + textArea.TextView.VisibleLineDrawingRemainder) / textArea.TextView.FontHeight + 1; ++y) {
+ Rectangle markerRectangle = new Rectangle(DrawingPosition.X,
+ DrawingPosition.Top + y * textArea.TextView.FontHeight - textArea.TextView.VisibleLineDrawingRemainder,
+ DrawingPosition.Width,
+ textArea.TextView.FontHeight);
+
+ if (rect.IntersectsWith(markerRectangle)) {
+ // draw dotted separator line
+ if (textArea.Document.TextEditorProperties.ShowLineNumbers) {
+ g.FillRectangle(BrushRegistry.GetBrush(textArea.Enabled ? lineNumberPainterColor.BackgroundColor : SystemColors.InactiveBorder),
+ markerRectangle);
+
+ g.DrawLine(BrushRegistry.GetDotPen(lineNumberPainterColor.Color),
+ base.drawingPosition.X,
+ markerRectangle.Y,
+ base.drawingPosition.X,
+ markerRectangle.Bottom);
+ } else {
+ g.FillRectangle(BrushRegistry.GetBrush(textArea.Enabled ? lineNumberPainterColor.BackgroundColor : SystemColors.InactiveBorder), markerRectangle);
+ }
+
+ int currentLine = textArea.Document.GetFirstLogicalLine(textArea.TextView.FirstPhysicalLine + y);
+ if (currentLine < textArea.Document.TotalNumberOfLines) {
+ PaintFoldMarker(g, currentLine, markerRectangle);
+ }
+ }
+ }
+ }
+
+ bool SelectedFoldingFrom(List<FoldMarker> list)
+ {
+ if (list != null) {
+ for (int i = 0; i < list.Count; ++i) {
+ if (this.selectedFoldLine == list[i].StartLine) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ void PaintFoldMarker(Graphics g, int lineNumber, Rectangle drawingRectangle)
+ {
+ HighlightColor foldLineColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldLine");
+ HighlightColor selectedFoldLine = textArea.Document.HighlightingStrategy.GetColorFor("SelectedFoldLine");
+
+ List<FoldMarker> foldingsWithStart = textArea.Document.FoldingManager.GetFoldingsWithStart(lineNumber);
+ List<FoldMarker> foldingsBetween = textArea.Document.FoldingManager.GetFoldingsContainsLineNumber(lineNumber);
+ List<FoldMarker> foldingsWithEnd = textArea.Document.FoldingManager.GetFoldingsWithEnd(lineNumber);
+
+ bool isFoldStart = foldingsWithStart.Count > 0;
+ bool isBetween = foldingsBetween.Count > 0;
+ bool isFoldEnd = foldingsWithEnd.Count > 0;
+
+ bool isStartSelected = SelectedFoldingFrom(foldingsWithStart);
+ bool isBetweenSelected = SelectedFoldingFrom(foldingsBetween);
+ bool isEndSelected = SelectedFoldingFrom(foldingsWithEnd);
+
+ int foldMarkerSize = (int)Math.Round(textArea.TextView.FontHeight * 0.57f);
+ foldMarkerSize -= (foldMarkerSize) % 2;
+ int foldMarkerYPos = drawingRectangle.Y + (int)((drawingRectangle.Height - foldMarkerSize) / 2);
+ int xPos = drawingRectangle.X + (drawingRectangle.Width - foldMarkerSize) / 2 + foldMarkerSize / 2;
+
+
+ if (isFoldStart) {
+ bool isVisible = true;
+ bool moreLinedOpenFold = false;
+ foreach (FoldMarker foldMarker in foldingsWithStart) {
+ if (foldMarker.IsFolded) {
+ isVisible = false;
+ } else {
+ moreLinedOpenFold = foldMarker.EndLine > foldMarker.StartLine;
+ }
+ }
+
+ bool isFoldEndFromUpperFold = false;
+ foreach (FoldMarker foldMarker in foldingsWithEnd) {
+ if (foldMarker.EndLine > foldMarker.StartLine && !foldMarker.IsFolded) {
+ isFoldEndFromUpperFold = true;
+ }
+ }
+
+ DrawFoldMarker(g, new RectangleF(drawingRectangle.X + (drawingRectangle.Width - foldMarkerSize) / 2,
+ foldMarkerYPos,
+ foldMarkerSize,
+ foldMarkerSize),
+ isVisible,
+ isStartSelected
+ );
+
+ // draw line above fold marker
+ if (isBetween || isFoldEndFromUpperFold) {
+ g.DrawLine(BrushRegistry.GetPen(isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ drawingRectangle.Top,
+ xPos,
+ foldMarkerYPos - 1);
+ }
+
+ // draw line below fold marker
+ if (isBetween || moreLinedOpenFold) {
+ g.DrawLine(BrushRegistry.GetPen(isEndSelected || (isStartSelected && isVisible) || isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ foldMarkerYPos + foldMarkerSize + 1,
+ xPos,
+ drawingRectangle.Bottom);
+ }
+ } else {
+ if (isFoldEnd) {
+ int midy = drawingRectangle.Top + drawingRectangle.Height / 2;
+
+ // draw fold end marker
+ g.DrawLine(BrushRegistry.GetPen(isEndSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ midy,
+ xPos + foldMarkerSize / 2,
+ midy);
+
+ // draw line above fold end marker
+ // must be drawn after fold marker because it might have a different color than the fold marker
+ g.DrawLine(BrushRegistry.GetPen(isBetweenSelected || isEndSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ drawingRectangle.Top,
+ xPos,
+ midy);
+
+ // draw line below fold end marker
+ if (isBetween) {
+ g.DrawLine(BrushRegistry.GetPen(isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ midy + 1,
+ xPos,
+ drawingRectangle.Bottom);
+ }
+ } else if (isBetween) {
+ // just draw the line :)
+ g.DrawLine(BrushRegistry.GetPen(isBetweenSelected ? selectedFoldLine.Color : foldLineColor.Color),
+ xPos,
+ drawingRectangle.Top,
+ xPos,
+ drawingRectangle.Bottom);
+ }
+ }
+ }
+
+ public override void HandleMouseMove(Point mousepos, MouseButtons mouseButtons)
+ {
+ bool showFolding = textArea.Document.TextEditorProperties.EnableFolding;
+ int physicalLine = + (int)((mousepos.Y + textArea.VirtualTop.Y) / textArea.TextView.FontHeight);
+ int realline = textArea.Document.GetFirstLogicalLine(physicalLine);
+
+ if (!showFolding || realline < 0 || realline + 1 >= textArea.Document.TotalNumberOfLines) {
+ return;
+ }
+
+ List<FoldMarker> foldMarkers = textArea.Document.FoldingManager.GetFoldingsWithStart(realline);
+ int oldSelection = selectedFoldLine;
+ if (foldMarkers.Count > 0) {
+ selectedFoldLine = realline;
+ } else {
+ selectedFoldLine = -1;
+ }
+ if (oldSelection != selectedFoldLine) {
+ textArea.Refresh(this);
+ }
+ }
+
+ public override void HandleMouseDown(Point mousepos, MouseButtons mouseButtons)
+ {
+ bool showFolding = textArea.Document.TextEditorProperties.EnableFolding;
+ int physicalLine = + (int)((mousepos.Y + textArea.VirtualTop.Y) / textArea.TextView.FontHeight);
+ int realline = textArea.Document.GetFirstLogicalLine(physicalLine);
+
+ // focus the textarea if the user clicks on the line number view
+ textArea.Focus();
+
+ if (!showFolding || realline < 0 || realline + 1 >= textArea.Document.TotalNumberOfLines) {
+ return;
+ }
+
+ List<FoldMarker> foldMarkers = textArea.Document.FoldingManager.GetFoldingsWithStart(realline);
+ foreach (FoldMarker fm in foldMarkers) {
+ fm.IsFolded = !fm.IsFolded;
+ }
+ textArea.Document.FoldingManager.NotifyFoldingsChanged(EventArgs.Empty);
+ }
+
+ public override void HandleMouseLeave(EventArgs e)
+ {
+ if (selectedFoldLine != -1) {
+ selectedFoldLine = -1;
+ textArea.Refresh(this);
+ }
+ }
+
+ #region Drawing functions
+ void DrawFoldMarker(Graphics g, RectangleF rectangle, bool isOpened, bool isSelected)
+ {
+ HighlightColor foldMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldMarker");
+ HighlightColor foldLineColor = textArea.Document.HighlightingStrategy.GetColorFor("FoldLine");
+ HighlightColor selectedFoldLine = textArea.Document.HighlightingStrategy.GetColorFor("SelectedFoldLine");
+
+ Rectangle intRect = new Rectangle((int)rectangle.X, (int)rectangle.Y, (int)rectangle.Width, (int)rectangle.Height);
+ g.FillRectangle(BrushRegistry.GetBrush(foldMarkerColor.BackgroundColor), intRect);
+ g.DrawRectangle(BrushRegistry.GetPen(isSelected ? selectedFoldLine.Color : foldLineColor.Color), intRect);
+
+ int space = (int)Math.Round(((double)rectangle.Height) / 8d) + 1;
+ int mid = intRect.Height / 2 + intRect.Height % 2;
+
+ // draw minus
+ g.DrawLine(BrushRegistry.GetPen(foldMarkerColor.Color),
+ rectangle.X + space,
+ rectangle.Y + mid,
+ rectangle.X + rectangle.Width - space,
+ rectangle.Y + mid);
+
+ // draw plus
+ if (!isOpened) {
+ g.DrawLine(BrushRegistry.GetPen(foldMarkerColor.Color),
+ rectangle.X + mid,
+ rectangle.Y + space,
+ rectangle.X + mid,
+ rectangle.Y + rectangle.Height - space);
+ }
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/GutterMargin.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/GutterMargin.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/GutterMargin.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,159 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.IO;
+using System.Reflection;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class views the line numbers and folding markers.
+ /// </summary>
+ public class GutterMargin : AbstractMargin, IDisposable
+ {
+ StringFormat numberStringFormat = (StringFormat)StringFormat.GenericTypographic.Clone();
+
+ public static Cursor RightLeftCursor;
+
+ static GutterMargin()
+ {
+ Stream cursorStream = Assembly.GetCallingAssembly().GetManifestResourceStream("ICSharpCode.TextEditor.Resources.RightArrow.cur");
+ if (cursorStream == null) throw new Exception("could not find cursor resource");
+ RightLeftCursor = new Cursor(cursorStream);
+ cursorStream.Close();
+ }
+
+ public void Dispose()
+ {
+ numberStringFormat.Dispose();
+ }
+
+ public override Cursor Cursor {
+ get {
+ return RightLeftCursor;
+ }
+ }
+
+ public override Size Size {
+ get {
+ return new Size((int)(textArea.TextView.WideSpaceWidth
+ * Math.Max(3, (int)Math.Log10(textArea.Document.TotalNumberOfLines) + 1)),
+ -1);
+ }
+ }
+
+ public override bool IsVisible {
+ get {
+ return textArea.TextEditorProperties.ShowLineNumbers;
+ }
+ }
+
+ public GutterMargin(TextArea textArea) : base(textArea)
+ {
+ numberStringFormat.LineAlignment = StringAlignment.Far;
+ numberStringFormat.FormatFlags = StringFormatFlags.MeasureTrailingSpaces | StringFormatFlags.FitBlackBox |
+ StringFormatFlags.NoWrap | StringFormatFlags.NoClip;
+ }
+
+ public override void Paint(Graphics g, Rectangle rect)
+ {
+ if (rect.Width <= 0 || rect.Height <= 0) {
+ return;
+ }
+ HighlightColor lineNumberPainterColor = textArea.Document.HighlightingStrategy.GetColorFor("LineNumbers");
+ int fontHeight = textArea.TextView.FontHeight;
+ Brush fillBrush = textArea.Enabled ? BrushRegistry.GetBrush(lineNumberPainterColor.BackgroundColor) : SystemBrushes.InactiveBorder;
+ Brush drawBrush = BrushRegistry.GetBrush(lineNumberPainterColor.Color);
+ for (int y = 0; y < (DrawingPosition.Height + textArea.TextView.VisibleLineDrawingRemainder) / fontHeight + 1; ++y) {
+ int ypos = drawingPosition.Y + fontHeight * y - textArea.TextView.VisibleLineDrawingRemainder;
+ Rectangle backgroundRectangle = new Rectangle(drawingPosition.X, ypos, drawingPosition.Width, fontHeight);
+ if (rect.IntersectsWith(backgroundRectangle)) {
+ g.FillRectangle(fillBrush, backgroundRectangle);
+ int curLine = textArea.Document.GetFirstLogicalLine(textArea.Document.GetVisibleLine(textArea.TextView.FirstVisibleLine) + y);
+
+ if (curLine < textArea.Document.TotalNumberOfLines) {
+ g.DrawString((curLine + 1).ToString(),
+ lineNumberPainterColor.GetFont(TextEditorProperties.FontContainer),
+ drawBrush,
+ backgroundRectangle,
+ numberStringFormat);
+ }
+ }
+ }
+ }
+
+ public override void HandleMouseDown(Point mousepos, MouseButtons mouseButtons)
+ {
+ TextLocation selectionStartPos;
+
+ textArea.SelectionManager.selectFrom.where = WhereFrom.Gutter;
+ int realline = textArea.TextView.GetLogicalLine(mousepos.Y);
+ if (realline >= 0 && realline < textArea.Document.TotalNumberOfLines) {
+ // shift-select
+ if((Control.ModifierKeys & Keys.Shift) != 0) {
+ if(!textArea.SelectionManager.HasSomethingSelected && realline != textArea.Caret.Position.Y) {
+ if (realline >= textArea.Caret.Position.Y)
+ { // at or below starting selection, place the cursor on the next line
+ // nothing is selected so make a new selection from cursor
+ selectionStartPos = textArea.Caret.Position;
+ // whole line selection - start of line to start of next line
+ if (realline < textArea.Document.TotalNumberOfLines - 1)
+ {
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, selectionStartPos, new TextLocation(0, realline + 1)));
+ textArea.Caret.Position = new TextLocation(0, realline + 1);
+ }
+ else
+ {
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, selectionStartPos, new TextLocation(textArea.Document.GetLineSegment(realline).Length + 1, realline)));
+ textArea.Caret.Position = new TextLocation(textArea.Document.GetLineSegment(realline).Length + 1, realline);
+ }
+ }
+ else
+ { // prior lines to starting selection, place the cursor on the same line as the new selection
+ // nothing is selected so make a new selection from cursor
+ selectionStartPos = textArea.Caret.Position;
+ // whole line selection - start of line to start of next line
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, selectionStartPos, new TextLocation(selectionStartPos.X, selectionStartPos.Y)));
+ textArea.SelectionManager.ExtendSelection(new TextLocation(selectionStartPos.X, selectionStartPos.Y), new TextLocation(0, realline));
+ textArea.Caret.Position = new TextLocation(0, realline);
+ }
+ }
+ else
+ {
+ // let MouseMove handle a shift-click in a gutter
+ MouseEventArgs e = new MouseEventArgs(mouseButtons, 1, mousepos.X, mousepos.Y, 0);
+ textArea.RaiseMouseMove(e);
+ }
+ } else { // this is a new selection with no shift-key
+ // sync the textareamousehandler mouse location
+ // (fixes problem with clicking out into a menu then back to the gutter whilst
+ // there is a selection)
+ textArea.mousepos = mousepos;
+
+ selectionStartPos = new TextLocation(0, realline);
+ textArea.SelectionManager.ClearSelection();
+ // whole line selection - start of line to start of next line
+ if (realline < textArea.Document.TotalNumberOfLines - 1)
+ {
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, selectionStartPos, new TextLocation(selectionStartPos.X, selectionStartPos.Y + 1)));
+ textArea.Caret.Position = new TextLocation(selectionStartPos.X, selectionStartPos.Y + 1);
+ }
+ else
+ {
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document, new TextLocation(0, realline), new TextLocation(textArea.Document.GetLineSegment(realline).Length + 1, selectionStartPos.Y)));
+ textArea.Caret.Position = new TextLocation(textArea.Document.GetLineSegment(realline).Length + 1, selectionStartPos.Y);
+ }
+ }
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/HRuler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/HRuler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/HRuler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,54 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// Horizontal ruler - text column measuring ruler at the top of the text area.
+ /// </summary>
+ public class HRuler : Control
+ {
+ TextArea textArea;
+
+ public HRuler(TextArea textArea)
+ {
+ this.textArea = textArea;
+ }
+
+ protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
+ {
+ Graphics g = e.Graphics;
+ int num = 0;
+ for (float x = textArea.TextView.DrawingPosition.Left; x < textArea.TextView.DrawingPosition.Right; x += textArea.TextView.WideSpaceWidth) {
+ int offset = (Height * 2) / 3;
+ if (num % 5 == 0) {
+ offset = (Height * 4) / 5;
+ }
+
+ if (num % 10 == 0) {
+ offset = 1;
+ }
+ ++num;
+ g.DrawLine(Pens.Black,
+ (int)x, offset, (int)x, Height - offset);
+ }
+ }
+
+ protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
+ {
+ e.Graphics.FillRectangle(Brushes.White,
+ new Rectangle(0,
+ 0,
+ Width,
+ Height));
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/IconBarMargin.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/IconBarMargin.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/IconBarMargin.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,254 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class views the line numbers and folding markers.
+ /// </summary>
+ public class IconBarMargin : AbstractMargin
+ {
+ const int iconBarWidth = 18;
+
+ static readonly Size iconBarSize = new Size(iconBarWidth, -1);
+
+ public override Size Size {
+ get {
+ return iconBarSize;
+ }
+ }
+
+ public override bool IsVisible {
+ get {
+ return textArea.TextEditorProperties.IsIconBarVisible;
+ }
+ }
+
+
+ public IconBarMargin(TextArea textArea) : base(textArea)
+ {
+ }
+
+ public override void Paint(Graphics g, Rectangle rect)
+ {
+ if (rect.Width <= 0 || rect.Height <= 0) {
+ return;
+ }
+ // paint background
+ g.FillRectangle(SystemBrushes.Control, new Rectangle(drawingPosition.X, rect.Top, drawingPosition.Width - 1, rect.Height));
+ g.DrawLine(SystemPens.ControlDark, base.drawingPosition.Right - 1, rect.Top, base.drawingPosition.Right - 1, rect.Bottom);
+
+ // paint icons
+ foreach (Bookmark mark in textArea.Document.BookmarkManager.Marks) {
+ int lineNumber = textArea.Document.GetVisibleLine(mark.LineNumber);
+ int lineHeight = textArea.TextView.FontHeight;
+ int yPos = (int)(lineNumber * lineHeight) - textArea.VirtualTop.Y;
+ if (IsLineInsideRegion(yPos, yPos + lineHeight, rect.Y, rect.Bottom)) {
+ if (lineNumber == textArea.Document.GetVisibleLine(mark.LineNumber - 1)) {
+ // marker is inside folded region, do not draw it
+ continue;
+ }
+ mark.Draw(this, g, new Point(0, yPos));
+ }
+ }
+ base.Paint(g, rect);
+ }
+
+ public override void HandleMouseDown(Point mousePos, MouseButtons mouseButtons)
+ {
+ int clickedVisibleLine = (mousePos.Y + textArea.VirtualTop.Y) / textArea.TextView.FontHeight;
+ int lineNumber = textArea.Document.GetFirstLogicalLine(clickedVisibleLine);
+
+ if ((mouseButtons & MouseButtons.Right) == MouseButtons.Right) {
+ if (textArea.Caret.Line != lineNumber) {
+ textArea.Caret.Line = lineNumber;
+ }
+ }
+
+ IList<Bookmark> marks = textArea.Document.BookmarkManager.Marks;
+ List<Bookmark> marksInLine = new List<Bookmark>();
+ int oldCount = marks.Count;
+ foreach (Bookmark mark in marks) {
+ if (mark.LineNumber == lineNumber) {
+ marksInLine.Add(mark);
+ }
+ }
+ for (int i = marksInLine.Count - 1; i >= 0; i--) {
+ Bookmark mark = marksInLine[i];
+ if (mark.Click(textArea, new MouseEventArgs(mouseButtons, 1, mousePos.X, mousePos.Y, 0))) {
+ if (oldCount != marks.Count) {
+ textArea.UpdateLine(lineNumber);
+ }
+ return;
+ }
+ }
+ base.HandleMouseDown(mousePos, mouseButtons);
+ }
+
+ #region Drawing functions
+ public void DrawBreakpoint(Graphics g, int y, bool isEnabled, bool isHealthy)
+ {
+ int diameter = Math.Min(iconBarWidth - 2, textArea.TextView.FontHeight);
+ Rectangle rect = new Rectangle(1,
+ y + (textArea.TextView.FontHeight - diameter) / 2,
+ diameter,
+ diameter);
+
+
+ using (GraphicsPath path = new GraphicsPath()) {
+ path.AddEllipse(rect);
+ using (PathGradientBrush pthGrBrush = new PathGradientBrush(path)) {
+ pthGrBrush.CenterPoint = new PointF(rect.Left + rect.Width / 3 , rect.Top + rect.Height / 3);
+ pthGrBrush.CenterColor = Color.MistyRose;
+ Color[] colors = {isHealthy ? Color.Firebrick : Color.Olive};
+ pthGrBrush.SurroundColors = colors;
+
+ if (isEnabled) {
+ g.FillEllipse(pthGrBrush, rect);
+ } else {
+ g.FillEllipse(SystemBrushes.Control, rect);
+ using (Pen pen = new Pen(pthGrBrush)) {
+ g.DrawEllipse(pen, new Rectangle(rect.X + 1, rect.Y + 1, rect.Width - 2, rect.Height - 2));
+ }
+ }
+ }
+ }
+ }
+
+ public void DrawBookmark(Graphics g, int y, bool isEnabled)
+ {
+ int delta = textArea.TextView.FontHeight / 8;
+ Rectangle rect = new Rectangle(1, y + delta, base.drawingPosition.Width - 4, textArea.TextView.FontHeight - delta * 2);
+
+ if (isEnabled) {
+ using (Brush brush = new LinearGradientBrush(new Point(rect.Left, rect.Top),
+ new Point(rect.Right, rect.Bottom),
+ Color.SkyBlue,
+ Color.White)) {
+ FillRoundRect(g, brush, rect);
+ }
+ } else {
+ FillRoundRect(g, Brushes.White, rect);
+ }
+ using (Brush brush = new LinearGradientBrush(new Point(rect.Left, rect.Top),
+ new Point(rect.Right, rect.Bottom),
+ Color.SkyBlue,
+ Color.Blue)) {
+ using (Pen pen = new Pen(brush)) {
+ DrawRoundRect(g, pen, rect);
+ }
+ }
+ }
+
+ public void DrawArrow(Graphics g, int y)
+ {
+ int delta = textArea.TextView.FontHeight / 8;
+ Rectangle rect = new Rectangle(1, y + delta, base.drawingPosition.Width - 4, textArea.TextView.FontHeight - delta * 2);
+ using (Brush brush = new LinearGradientBrush(new Point(rect.Left, rect.Top),
+ new Point(rect.Right, rect.Bottom),
+ Color.LightYellow,
+ Color.Yellow)) {
+ FillArrow(g, brush, rect);
+ }
+
+ using (Brush brush = new LinearGradientBrush(new Point(rect.Left, rect.Top),
+ new Point(rect.Right, rect.Bottom),
+ Color.Yellow,
+ Color.Brown)) {
+ using (Pen pen = new Pen(brush)) {
+ DrawArrow(g, pen, rect);
+ }
+ }
+ }
+
+ GraphicsPath CreateArrowGraphicsPath(Rectangle r)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int halfX = r.Width / 2;
+ int halfY = r.Height/ 2;
+ gp.AddLine(r.X, r.Y + halfY/2, r.X + halfX, r.Y + halfY/2);
+ gp.AddLine(r.X + halfX, r.Y + halfY/2, r.X + halfX, r.Y);
+ gp.AddLine(r.X + halfX, r.Y, r.Right, r.Y + halfY);
+ gp.AddLine(r.Right, r.Y + halfY, r.X + halfX, r.Bottom);
+ gp.AddLine(r.X + halfX, r.Bottom, r.X + halfX, r.Bottom - halfY/2);
+ gp.AddLine(r.X + halfX, r.Bottom - halfY/2, r.X, r.Bottom - halfY/2);
+ gp.AddLine(r.X, r.Bottom - halfY/2, r.X, r.Y + halfY/2);
+ gp.CloseFigure();
+ return gp;
+ }
+
+ GraphicsPath CreateRoundRectGraphicsPath(Rectangle r)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int radius = r.Width / 2;
+ gp.AddLine(r.X + radius, r.Y, r.Right - radius, r.Y);
+ gp.AddArc(r.Right - radius, r.Y, radius, radius, 270, 90);
+
+ gp.AddLine(r.Right, r.Y + radius, r.Right, r.Bottom - radius);
+ gp.AddArc(r.Right - radius, r.Bottom - radius, radius, radius, 0, 90);
+
+ gp.AddLine(r.Right - radius, r.Bottom, r.X + radius, r.Bottom);
+ gp.AddArc(r.X, r.Bottom - radius, radius, radius, 90, 90);
+
+ gp.AddLine(r.X, r.Bottom - radius, r.X, r.Y + radius);
+ gp.AddArc(r.X, r.Y, radius, radius, 180, 90);
+
+ gp.CloseFigure();
+ return gp;
+ }
+
+ void DrawRoundRect(Graphics g, Pen p , Rectangle r)
+ {
+ using (GraphicsPath gp = CreateRoundRectGraphicsPath(r)) {
+ g.DrawPath(p, gp);
+ }
+ }
+
+ void FillRoundRect(Graphics g, Brush b , Rectangle r)
+ {
+ using (GraphicsPath gp = CreateRoundRectGraphicsPath(r)) {
+ g.FillPath(b, gp);
+ }
+ }
+
+ void DrawArrow(Graphics g, Pen p , Rectangle r)
+ {
+ using (GraphicsPath gp = CreateArrowGraphicsPath(r)) {
+ g.DrawPath(p, gp);
+ }
+ }
+
+ void FillArrow(Graphics g, Brush b , Rectangle r)
+ {
+ using (GraphicsPath gp = CreateArrowGraphicsPath(r)) {
+ g.FillPath(b, gp);
+ }
+ }
+
+ #endregion
+
+ static bool IsLineInsideRegion(int top, int bottom, int regionTop, int regionBottom)
+ {
+ if (top >= regionTop && top <= regionBottom) {
+ // Region overlaps the line's top edge.
+ return true;
+ } else if(regionTop > top && regionTop < bottom) {
+ // Region's top edge inside line.
+ return true;
+ }
+ return false;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Ime.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Ime.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/Ime.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,179 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Shinsaku Nakagawa" email="shinsaku at users.sourceforge.jp"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// Used internally, not for own use.
+ /// </summary>
+ internal class Ime
+ {
+ public Ime(IntPtr hWnd, Font font)
+ {
+ // For unknown reasons, the IME support is causing crashes when used in a WOW64 process
+ // or when used in .NET 4.0. We'll disable IME support in those cases.
+ string PROCESSOR_ARCHITEW6432 = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432");
+ if (PROCESSOR_ARCHITEW6432 == "IA64" || PROCESSOR_ARCHITEW6432 == "AMD64" || Environment.OSVersion.Platform == PlatformID.Unix || Environment.Version >= new Version(4,0)) {
+ disableIME = true;
+ } else {
+ this.hIMEWnd = ImmGetDefaultIMEWnd(hWnd);
+ }
+ this.hWnd = hWnd;
+ this.font = font;
+ SetIMEWindowFont(font);
+ }
+
+ private Font font = null;
+ public Font Font
+ {
+ get {
+ return font;
+ }
+ set {
+ if (!value.Equals(font)) {
+ font = value;
+ lf = null;
+ SetIMEWindowFont(value);
+ }
+ }
+ }
+
+ public IntPtr HWnd
+ {
+ set {
+ if (this.hWnd != value) {
+ this.hWnd = value;
+ if (!disableIME)
+ this.hIMEWnd = ImmGetDefaultIMEWnd(value);
+ SetIMEWindowFont(font);
+ }
+ }
+ }
+
+ [ DllImport("imm32.dll") ]
+ private static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd);
+
+ [ DllImport("user32.dll") ]
+ private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, COMPOSITIONFORM lParam);
+ [ DllImport("user32.dll") ]
+ private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, [In, MarshalAs(UnmanagedType.LPStruct)] LOGFONT lParam);
+
+ [ StructLayout(LayoutKind.Sequential) ]
+ private class COMPOSITIONFORM
+ {
+ public int dwStyle = 0;
+ public POINT ptCurrentPos = null;
+ public RECT rcArea = null;
+ }
+
+ [ StructLayout(LayoutKind.Sequential) ]
+ private class POINT
+ {
+ public int x = 0;
+ public int y = 0;
+ }
+
+ [ StructLayout(LayoutKind.Sequential) ]
+ private class RECT
+ {
+ public int left = 0;
+ public int top = 0;
+ public int right = 0;
+ public int bottom = 0;
+ }
+
+ private const int WM_IME_CONTROL = 0x0283;
+
+ private const int IMC_SETCOMPOSITIONWINDOW = 0x000c;
+ private IntPtr hIMEWnd;
+ private IntPtr hWnd;
+ private const int CFS_POINT = 0x0002;
+
+ [ StructLayout(LayoutKind.Sequential) ]
+ private class LOGFONT
+ {
+ public int lfHeight = 0;
+ public int lfWidth = 0;
+ public int lfEscapement = 0;
+ public int lfOrientation = 0;
+ public int lfWeight = 0;
+ public byte lfItalic = 0;
+ public byte lfUnderline = 0;
+ public byte lfStrikeOut = 0;
+ public byte lfCharSet = 0;
+ public byte lfOutPrecision = 0;
+ public byte lfClipPrecision = 0;
+ public byte lfQuality = 0;
+ public byte lfPitchAndFamily = 0;
+ [ MarshalAs(UnmanagedType.ByValTStr, SizeConst=32) ] public string lfFaceName = null;
+ }
+ private const int IMC_SETCOMPOSITIONFONT = 0x000a;
+ LOGFONT lf = null;
+ static bool disableIME;
+
+ private void SetIMEWindowFont(Font f)
+ {
+ if (disableIME || hIMEWnd == IntPtr.Zero) return;
+
+ if (lf == null) {
+ lf = new LOGFONT();
+ f.ToLogFont(lf);
+ lf.lfFaceName = f.Name; // This is very important! "Font.ToLogFont" Method sets invalid value to LOGFONT.lfFaceName
+ }
+
+ try {
+ SendMessage(
+ hIMEWnd,
+ WM_IME_CONTROL,
+ new IntPtr(IMC_SETCOMPOSITIONFONT),
+ lf
+ );
+ } catch (AccessViolationException ex) {
+ Handle(ex);
+ }
+ }
+
+ public void SetIMEWindowLocation(int x, int y)
+ {
+ if (disableIME || hIMEWnd == IntPtr.Zero) return;
+
+ POINT p = new POINT();
+ p.x = x;
+ p.y = y;
+
+ COMPOSITIONFORM lParam = new COMPOSITIONFORM();
+ lParam.dwStyle = CFS_POINT;
+ lParam.ptCurrentPos = p;
+ lParam.rcArea = new RECT();
+
+ try {
+ SendMessage(
+ hIMEWnd,
+ WM_IME_CONTROL,
+ new IntPtr(IMC_SETCOMPOSITIONWINDOW),
+ lParam
+ );
+ } catch (AccessViolationException ex) {
+ Handle(ex);
+ }
+ }
+
+ void Handle(Exception ex)
+ {
+ Console.WriteLine(ex);
+ if (!disableIME) {
+ disableIME = true;
+ MessageBox.Show("Error calling IME: " + ex.Message + "\nIME is disabled.", "IME error");
+ }
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/IInsightDataProvider.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/IInsightDataProvider.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/IInsightDataProvider.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,53 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Gui.InsightWindow
+{
+ public interface IInsightDataProvider
+ {
+ /// <summary>
+ /// Tells the insight provider to prepare its data.
+ /// </summary>
+ /// <param name="fileName">The name of the edited file</param>
+ /// <param name="textArea">The text area in which the file is being edited</param>
+ void SetupDataProvider(string fileName, TextArea textArea);
+
+ /// <summary>
+ /// Notifies the insight provider that the caret offset has changed.
+ /// </summary>
+ /// <returns>Return true to close the insight window (e.g. when the
+ /// caret was moved outside the region where insight is displayed for).
+ /// Return false to keep the window open.</returns>
+ bool CaretOffsetChanged();
+
+ /// <summary>
+ /// Gets the text to display in the insight window.
+ /// </summary>
+ /// <param name="number">The number of the active insight entry.
+ /// Multiple insight entries might be multiple overloads of the same method.</param>
+ /// <returns>The text to display, e.g. a multi-line string where
+ /// the first line is the method definition, followed by a description.</returns>
+ string GetInsightData(int number);
+
+ /// <summary>
+ /// Gets the number of available insight entries, e.g. the number of available
+ /// overloads to call.
+ /// </summary>
+ int InsightDataCount {
+ get;
+ }
+
+ /// <summary>
+ /// Gets the index of the entry to initially select.
+ /// </summary>
+ int DefaultIndex {
+ get;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/InsightWindow.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/InsightWindow.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/InsightWindow/InsightWindow.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,199 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor.Gui.InsightWindow
+{
+ public class InsightWindow : AbstractCompletionWindow
+ {
+ public InsightWindow(Form parentForm, TextEditorControl control) : base(parentForm, control)
+ {
+ SetStyle(ControlStyles.UserPaint, true);
+ SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+ }
+
+ public void ShowInsightWindow()
+ {
+ if (!Visible) {
+ if (insightDataProviderStack.Count > 0) {
+ ShowCompletionWindow();
+ }
+ } else {
+ Refresh();
+ }
+ }
+
+ #region Event handling routines
+ protected override bool ProcessTextAreaKey(Keys keyData)
+ {
+ if (!Visible) {
+ return false;
+ }
+ switch (keyData) {
+ case Keys.Down:
+ if (DataProvider != null && DataProvider.InsightDataCount > 0) {
+ CurrentData = (CurrentData + 1) % DataProvider.InsightDataCount;
+ Refresh();
+ }
+ return true;
+ case Keys.Up:
+ if (DataProvider != null && DataProvider.InsightDataCount > 0) {
+ CurrentData = (CurrentData + DataProvider.InsightDataCount - 1) % DataProvider.InsightDataCount;
+ Refresh();
+ }
+ return true;
+ }
+ return base.ProcessTextAreaKey(keyData);
+ }
+
+ protected override void CaretOffsetChanged(object sender, EventArgs e)
+ {
+ // move the window under the caret (don't change the x position)
+ TextLocation caretPos = control.ActiveTextAreaControl.Caret.Position;
+ int y = (int)((1 + caretPos.Y) * control.ActiveTextAreaControl.TextArea.TextView.FontHeight)
+ - control.ActiveTextAreaControl.TextArea.VirtualTop.Y - 1
+ + control.ActiveTextAreaControl.TextArea.TextView.DrawingPosition.Y;
+
+ int xpos = control.ActiveTextAreaControl.TextArea.TextView.GetDrawingXPos(caretPos.Y, caretPos.X);
+ int ypos = (control.ActiveTextAreaControl.Document.GetVisibleLine(caretPos.Y) + 1) * control.ActiveTextAreaControl.TextArea.TextView.FontHeight
+ - control.ActiveTextAreaControl.TextArea.VirtualTop.Y;
+ int rulerHeight = control.TextEditorProperties.ShowHorizontalRuler ? control.ActiveTextAreaControl.TextArea.TextView.FontHeight : 0;
+
+ Point p = control.ActiveTextAreaControl.PointToScreen(new Point(xpos, ypos + rulerHeight));
+ if (p.Y != Location.Y) {
+ Location = p;
+ }
+
+ while (DataProvider != null && DataProvider.CaretOffsetChanged()) {
+ CloseCurrentDataProvider();
+ }
+ }
+
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ base.OnMouseDown(e);
+ control.ActiveTextAreaControl.TextArea.Focus();
+ if (TipPainterTools.DrawingRectangle1.Contains(e.X, e.Y)) {
+ CurrentData = (CurrentData + DataProvider.InsightDataCount - 1) % DataProvider.InsightDataCount;
+ Refresh();
+ }
+ if (TipPainterTools.DrawingRectangle2.Contains(e.X, e.Y)) {
+ CurrentData = (CurrentData + 1) % DataProvider.InsightDataCount;
+ Refresh();
+ }
+ }
+
+ #endregion
+
+ MouseWheelHandler mouseWheelHandler = new MouseWheelHandler();
+
+ public void HandleMouseWheel(MouseEventArgs e)
+ {
+ if (DataProvider != null && DataProvider.InsightDataCount > 0) {
+ int distance = mouseWheelHandler.GetScrollAmount(e);
+ if (control.TextEditorProperties.MouseWheelScrollDown)
+ distance = -distance;
+ if (distance > 0) {
+ CurrentData = (CurrentData + 1) % DataProvider.InsightDataCount;
+ } else if (distance < 0) {
+ CurrentData = (CurrentData + DataProvider.InsightDataCount - 1) % DataProvider.InsightDataCount;
+ }
+ Refresh();
+ }
+ }
+
+ #region Insight Window Drawing routines
+ protected override void OnPaint(PaintEventArgs pe)
+ {
+ string methodCountMessage = null, description;
+ if (DataProvider == null || DataProvider.InsightDataCount < 1) {
+ description = "Unknown Method";
+ } else {
+ if (DataProvider.InsightDataCount > 1) {
+ methodCountMessage = control.GetRangeDescription(CurrentData + 1, DataProvider.InsightDataCount);
+ }
+ description = DataProvider.GetInsightData(CurrentData);
+ }
+
+ drawingSize = TipPainterTools.GetDrawingSizeHelpTipFromCombinedDescription(this,
+ pe.Graphics,
+ Font,
+ methodCountMessage,
+ description);
+ if (drawingSize != Size) {
+ SetLocation();
+ } else {
+ TipPainterTools.DrawHelpTipFromCombinedDescription(this, pe.Graphics, Font, methodCountMessage, description);
+ }
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs pe)
+ {
+ pe.Graphics.FillRectangle(SystemBrushes.Info, pe.ClipRectangle);
+ }
+ #endregion
+
+ #region InsightDataProvider handling
+ Stack<InsightDataProviderStackElement> insightDataProviderStack = new Stack<InsightDataProviderStackElement>();
+
+ int CurrentData {
+ get {
+ return insightDataProviderStack.Peek().currentData;
+ }
+ set {
+ insightDataProviderStack.Peek().currentData = value;
+ }
+ }
+
+ IInsightDataProvider DataProvider {
+ get {
+ if (insightDataProviderStack.Count == 0) {
+ return null;
+ }
+ return insightDataProviderStack.Peek().dataProvider;
+ }
+ }
+
+ public void AddInsightDataProvider(IInsightDataProvider provider, string fileName)
+ {
+ provider.SetupDataProvider(fileName, control.ActiveTextAreaControl.TextArea);
+ if (provider.InsightDataCount > 0) {
+ insightDataProviderStack.Push(new InsightDataProviderStackElement(provider));
+ }
+ }
+
+ void CloseCurrentDataProvider()
+ {
+ insightDataProviderStack.Pop();
+ if (insightDataProviderStack.Count == 0) {
+ Close();
+ } else {
+ Refresh();
+ }
+ }
+
+ class InsightDataProviderStackElement
+ {
+ public int currentData;
+ public IInsightDataProvider dataProvider;
+
+ public InsightDataProviderStackElement(IInsightDataProvider dataProvider)
+ {
+ this.currentData = Math.Max(dataProvider.DefaultIndex, 0);
+ this.dataProvider = dataProvider;
+ }
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextArea.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextArea.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextArea.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,947 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Text;
+using System.Text;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Actions;
+using ICSharpCode.TextEditor.Document;
+using ICSharpCode.TextEditor.Gui.CompletionWindow;
+
+namespace ICSharpCode.TextEditor
+{
+ public delegate bool KeyEventHandler(char ch);
+ public delegate bool DialogKeyProcessor(Keys keyData);
+
+ /// <summary>
+ /// This class paints the textarea.
+ /// </summary>
+ [ToolboxItem(false)]
+ public class TextArea : Control
+ {
+ bool hiddenMouseCursor = false;
+ /// <summary>
+ /// The position where the mouse cursor was when it was hidden. Sometimes the text editor gets MouseMove
+ /// events when typing text even if the mouse is not moved.
+ /// </summary>
+ Point mouseCursorHidePosition;
+
+ Point virtualTop = new Point(0, 0);
+ TextAreaControl motherTextAreaControl;
+ TextEditorControl motherTextEditorControl;
+
+ List<BracketHighlightingSheme> bracketshemes = new List<BracketHighlightingSheme>();
+ TextAreaClipboardHandler textAreaClipboardHandler;
+ bool autoClearSelection = false;
+
+ List<AbstractMargin> leftMargins = new List<AbstractMargin>();
+
+ TextView textView;
+ GutterMargin gutterMargin;
+ FoldMargin foldMargin;
+ IconBarMargin iconBarMargin;
+
+ SelectionManager selectionManager;
+ Caret caret;
+
+ internal Point mousepos = new Point(0, 0);
+ //public Point selectionStartPos = new Point(0,0);
+
+ bool disposed;
+
+ [Browsable(false)]
+ public IList<AbstractMargin> LeftMargins {
+ get {
+ return leftMargins.AsReadOnly();
+ }
+ }
+
+ public void InsertLeftMargin(int index, AbstractMargin margin)
+ {
+ leftMargins.Insert(index, margin);
+ Refresh();
+ }
+
+ public TextEditorControl MotherTextEditorControl {
+ get {
+ return motherTextEditorControl;
+ }
+ }
+
+ public TextAreaControl MotherTextAreaControl {
+ get {
+ return motherTextAreaControl;
+ }
+ }
+
+ public SelectionManager SelectionManager {
+ get {
+ return selectionManager;
+ }
+ }
+
+ public Caret Caret {
+ get {
+ return caret;
+ }
+ }
+
+ public TextView TextView {
+ get {
+ return textView;
+ }
+ }
+
+ public GutterMargin GutterMargin {
+ get {
+ return gutterMargin;
+ }
+ }
+
+ public FoldMargin FoldMargin {
+ get {
+ return foldMargin;
+ }
+ }
+
+ public IconBarMargin IconBarMargin {
+ get {
+ return iconBarMargin;
+ }
+ }
+
+ public Encoding Encoding {
+ get {
+ return motherTextEditorControl.Encoding;
+ }
+ }
+ public int MaxVScrollValue {
+ get {
+ return (Document.GetVisibleLine(Document.TotalNumberOfLines - 1) + 1 + TextView.VisibleLineCount * 2 / 3) * TextView.FontHeight;
+ }
+ }
+
+ public Point VirtualTop {
+ get {
+ return virtualTop;
+ }
+ set {
+ Point newVirtualTop = new Point(value.X, Math.Min(MaxVScrollValue, Math.Max(0, value.Y)));
+ if (virtualTop != newVirtualTop) {
+ virtualTop = newVirtualTop;
+ motherTextAreaControl.VScrollBar.Value = virtualTop.Y;
+ Invalidate();
+ }
+ caret.UpdateCaretPosition();
+ }
+ }
+
+ public bool AutoClearSelection {
+ get {
+ return autoClearSelection;
+ }
+ set {
+ autoClearSelection = value;
+ }
+ }
+
+ [Browsable(false)]
+ public IDocument Document {
+ get {
+ return motherTextEditorControl.Document;
+ }
+ }
+
+ public TextAreaClipboardHandler ClipboardHandler {
+ get {
+ return textAreaClipboardHandler;
+ }
+ }
+
+
+ public ITextEditorProperties TextEditorProperties {
+ get {
+ return motherTextEditorControl.TextEditorProperties;
+ }
+ }
+
+ public TextArea(TextEditorControl motherTextEditorControl, TextAreaControl motherTextAreaControl)
+ {
+ this.motherTextAreaControl = motherTextAreaControl;
+ this.motherTextEditorControl = motherTextEditorControl;
+
+ caret = new Caret(this);
+ selectionManager = new SelectionManager(Document, this);
+
+ this.textAreaClipboardHandler = new TextAreaClipboardHandler(this);
+
+ ResizeRedraw = true;
+
+ SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
+// SetStyle(ControlStyles.AllPaintingInWmPaint, true);
+// SetStyle(ControlStyles.UserPaint, true);
+ SetStyle(ControlStyles.Opaque, false);
+ SetStyle(ControlStyles.ResizeRedraw, true);
+ SetStyle(ControlStyles.Selectable, true);
+
+ textView = new TextView(this);
+
+ gutterMargin = new GutterMargin(this);
+ foldMargin = new FoldMargin(this);
+ iconBarMargin = new IconBarMargin(this);
+ leftMargins.AddRange(new AbstractMargin[] { iconBarMargin, gutterMargin, foldMargin });
+ OptionsChanged();
+
+
+ new TextAreaMouseHandler(this).Attach();
+ new TextAreaDragDropHandler().Attach(this);
+
+ bracketshemes.Add(new BracketHighlightingSheme('{', '}'));
+ bracketshemes.Add(new BracketHighlightingSheme('(', ')'));
+ bracketshemes.Add(new BracketHighlightingSheme('[', ']'));
+
+ caret.PositionChanged += new EventHandler(SearchMatchingBracket);
+ Document.TextContentChanged += new EventHandler(TextContentChanged);
+ Document.FoldingManager.FoldingsChanged += new EventHandler(DocumentFoldingsChanged);
+ }
+
+ public void UpdateMatchingBracket()
+ {
+ SearchMatchingBracket(null, null);
+ }
+
+ void TextContentChanged(object sender, EventArgs e)
+ {
+ Caret.Position = new TextLocation(0, 0);
+ SelectionManager.SelectionCollection.Clear();
+ }
+ void SearchMatchingBracket(object sender, EventArgs e)
+ {
+ if (!TextEditorProperties.ShowMatchingBracket) {
+ textView.Highlight = null;
+ return;
+ }
+ int oldLine1 = -1, oldLine2 = -1;
+ if (textView.Highlight != null && textView.Highlight.OpenBrace.Y >=0 && textView.Highlight.OpenBrace.Y < Document.TotalNumberOfLines) {
+ oldLine1 = textView.Highlight.OpenBrace.Y;
+ }
+ if (textView.Highlight != null && textView.Highlight.CloseBrace.Y >=0 && textView.Highlight.CloseBrace.Y < Document.TotalNumberOfLines) {
+ oldLine2 = textView.Highlight.CloseBrace.Y;
+ }
+ textView.Highlight = FindMatchingBracketHighlight();
+ if (oldLine1 >= 0)
+ UpdateLine(oldLine1);
+ if (oldLine2 >= 0 && oldLine2 != oldLine1)
+ UpdateLine(oldLine2);
+ if (textView.Highlight != null) {
+ int newLine1 = textView.Highlight.OpenBrace.Y;
+ int newLine2 = textView.Highlight.CloseBrace.Y;
+ if (newLine1 != oldLine1 && newLine1 != oldLine2)
+ UpdateLine(newLine1);
+ if (newLine2 != oldLine1 && newLine2 != oldLine2 && newLine2 != newLine1)
+ UpdateLine(newLine2);
+ }
+ }
+
+ public Highlight FindMatchingBracketHighlight()
+ {
+ if (Caret.Offset == 0)
+ return null;
+ foreach (BracketHighlightingSheme bracketsheme in bracketshemes) {
+ Highlight highlight = bracketsheme.GetHighlight(Document, Caret.Offset - 1);
+ if (highlight != null) {
+ return highlight;
+ }
+ }
+ return null;
+ }
+
+ public void SetDesiredColumn()
+ {
+ Caret.DesiredColumn = TextView.GetDrawingXPos(Caret.Line, Caret.Column) + VirtualTop.X;
+ }
+
+ public void SetCaretToDesiredColumn()
+ {
+ FoldMarker dummy;
+ Caret.Position = textView.GetLogicalColumn(Caret.Line, Caret.DesiredColumn + VirtualTop.X, out dummy);
+ }
+
+ public void OptionsChanged()
+ {
+ UpdateMatchingBracket();
+ textView.OptionsChanged();
+ caret.RecreateCaret();
+ caret.UpdateCaretPosition();
+ Refresh();
+ }
+
+ AbstractMargin lastMouseInMargin;
+
+ protected override void OnMouseLeave(System.EventArgs e)
+ {
+ base.OnMouseLeave(e);
+ this.Cursor = Cursors.Default;
+ if (lastMouseInMargin != null) {
+ lastMouseInMargin.HandleMouseLeave(EventArgs.Empty);
+ lastMouseInMargin = null;
+ }
+ CloseToolTip();
+ }
+
+ protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
+ {
+ // this corrects weird problems when text is selected,
+ // then a menu item is selected, then the text is
+ // clicked again - it correctly synchronises the
+ // click position
+ mousepos = new Point(e.X, e.Y);
+
+ base.OnMouseDown(e);
+ CloseToolTip();
+
+ foreach (AbstractMargin margin in leftMargins) {
+ if (margin.DrawingPosition.Contains(e.X, e.Y)) {
+ margin.HandleMouseDown(new Point(e.X, e.Y), e.Button);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Shows the mouse cursor if it has been hidden.
+ /// </summary>
+ /// <param name="forceShow"><c>true</c> to always show the cursor or <c>false</c> to show it only if it has been moved since it was hidden.</param>
+ internal void ShowHiddenCursor(bool forceShow)
+ {
+ if (hiddenMouseCursor) {
+ if (mouseCursorHidePosition != Cursor.Position || forceShow) {
+ Cursor.Show();
+ hiddenMouseCursor = false;
+ }
+ }
+ }
+
+
+ // static because the mouse can only be in one text area and we don't want to have
+ // tooltips of text areas from inactive tabs floating around.
+ static DeclarationViewWindow toolTip;
+ static string oldToolTip;
+
+ void SetToolTip(string text, int lineNumber)
+ {
+ if (toolTip == null || toolTip.IsDisposed)
+ toolTip = new DeclarationViewWindow(this.FindForm());
+ if (oldToolTip == text)
+ return;
+ if (text == null) {
+ toolTip.Hide();
+ } else {
+ Point p = Control.MousePosition;
+ Point cp = PointToClient(p);
+ if (lineNumber >= 0) {
+ lineNumber = this.Document.GetVisibleLine(lineNumber);
+ p.Y = (p.Y - cp.Y) + (lineNumber * this.TextView.FontHeight) - this.virtualTop.Y;
+ }
+ p.Offset(3, 3);
+ toolTip.Owner = this.FindForm();
+ toolTip.Location = p;
+ toolTip.Description = text;
+ toolTip.HideOnClick = true;
+ toolTip.Show();
+ }
+ oldToolTip = text;
+ }
+
+ public event ToolTipRequestEventHandler ToolTipRequest;
+
+ protected virtual void OnToolTipRequest(ToolTipRequestEventArgs e)
+ {
+ if (ToolTipRequest != null) {
+ ToolTipRequest(this, e);
+ }
+ }
+
+ bool toolTipActive;
+ /// <summary>
+ /// Rectangle in text area that caused the current tool tip.
+ /// Prevents tooltip from re-showing when it was closed because of a click or keyboard
+ /// input and the mouse was not used.
+ /// </summary>
+ Rectangle toolTipRectangle;
+
+ void CloseToolTip()
+ {
+ if (toolTipActive) {
+ //Console.WriteLine("Closing tooltip");
+ toolTipActive = false;
+ SetToolTip(null, -1);
+ }
+ ResetMouseEventArgs();
+ }
+
+ protected override void OnMouseHover(EventArgs e)
+ {
+ base.OnMouseHover(e);
+ //Console.WriteLine("Hover raised at " + PointToClient(Control.MousePosition));
+ if (MouseButtons == MouseButtons.None) {
+ RequestToolTip(PointToClient(Control.MousePosition));
+ } else {
+ CloseToolTip();
+ }
+ }
+
+ protected void RequestToolTip(Point mousePos)
+ {
+ if (toolTipRectangle.Contains(mousePos)) {
+ if (!toolTipActive)
+ ResetMouseEventArgs();
+ return;
+ }
+
+ //Console.WriteLine("Request tooltip for " + mousePos);
+
+ toolTipRectangle = new Rectangle(mousePos.X - 4, mousePos.Y - 4, 8, 8);
+
+ TextLocation logicPos = textView.GetLogicalPosition(mousePos.X - textView.DrawingPosition.Left,
+ mousePos.Y - textView.DrawingPosition.Top);
+ bool inDocument = textView.DrawingPosition.Contains(mousePos)
+ && logicPos.Y >= 0 && logicPos.Y < Document.TotalNumberOfLines;
+ ToolTipRequestEventArgs args = new ToolTipRequestEventArgs(mousePos, logicPos, inDocument);
+ OnToolTipRequest(args);
+ if (args.ToolTipShown) {
+ //Console.WriteLine("Set tooltip to " + args.toolTipText);
+ toolTipActive = true;
+ SetToolTip(args.toolTipText, inDocument ? logicPos.Y + 1 : -1);
+ } else {
+ CloseToolTip();
+ }
+ }
+
+ // external interface to the attached event
+ internal void RaiseMouseMove(MouseEventArgs e)
+ {
+ OnMouseMove(e);
+ }
+
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ base.OnMouseMove(e);
+ if (!toolTipRectangle.Contains(e.Location)) {
+ toolTipRectangle = Rectangle.Empty;
+ if (toolTipActive)
+ RequestToolTip(e.Location);
+ }
+ foreach (AbstractMargin margin in leftMargins) {
+ if (margin.DrawingPosition.Contains(e.X, e.Y)) {
+ this.Cursor = margin.Cursor;
+ margin.HandleMouseMove(new Point(e.X, e.Y), e.Button);
+ if (lastMouseInMargin != margin) {
+ if (lastMouseInMargin != null) {
+ lastMouseInMargin.HandleMouseLeave(EventArgs.Empty);
+ }
+ lastMouseInMargin = margin;
+ }
+ return;
+ }
+ }
+ if (lastMouseInMargin != null) {
+ lastMouseInMargin.HandleMouseLeave(EventArgs.Empty);
+ lastMouseInMargin = null;
+ }
+ if (textView.DrawingPosition.Contains(e.X, e.Y)) {
+ TextLocation realmousepos = TextView.GetLogicalPosition(e.X - TextView.DrawingPosition.X, e.Y - TextView.DrawingPosition.Y);
+ if(SelectionManager.IsSelected(Document.PositionToOffset(realmousepos)) && MouseButtons == MouseButtons.None) {
+ // mouse is hovering over a selection, so show default mouse
+ this.Cursor = Cursors.Default;
+ } else {
+ // mouse is hovering over text area, not a selection, so show the textView cursor
+ this.Cursor = textView.Cursor;
+ }
+ return;
+ }
+ this.Cursor = Cursors.Default;
+ }
+ AbstractMargin updateMargin = null;
+
+ public void Refresh(AbstractMargin margin)
+ {
+ updateMargin = margin;
+ Invalidate(updateMargin.DrawingPosition);
+ Update();
+ updateMargin = null;
+ }
+
+ protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent)
+ {
+ }
+
+ protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
+ {
+ int currentXPos = 0;
+ int currentYPos = 0;
+ bool adjustScrollBars = false;
+ Graphics g = e.Graphics;
+ Rectangle clipRectangle = e.ClipRectangle;
+
+ bool isFullRepaint = clipRectangle.X == 0 && clipRectangle.Y == 0
+ && clipRectangle.Width == this.Width && clipRectangle.Height == this.Height;
+
+ g.TextRenderingHint = this.TextEditorProperties.TextRenderingHint;
+
+ if (updateMargin != null) {
+ updateMargin.Paint(g, updateMargin.DrawingPosition);
+// clipRectangle.Intersect(updateMargin.DrawingPosition);
+ }
+
+ if (clipRectangle.Width <= 0 || clipRectangle.Height <= 0) {
+ return;
+ }
+
+ foreach (AbstractMargin margin in leftMargins) {
+ if (margin.IsVisible) {
+ Rectangle marginRectangle = new Rectangle(currentXPos , currentYPos, margin.Size.Width, Height - currentYPos);
+ if (marginRectangle != margin.DrawingPosition) {
+ // margin changed size
+ if (!isFullRepaint && !clipRectangle.Contains(marginRectangle)) {
+ Invalidate(); // do a full repaint
+ }
+ adjustScrollBars = true;
+ margin.DrawingPosition = marginRectangle;
+ }
+ currentXPos += margin.DrawingPosition.Width;
+ if (clipRectangle.IntersectsWith(marginRectangle)) {
+ marginRectangle.Intersect(clipRectangle);
+ if (!marginRectangle.IsEmpty) {
+ margin.Paint(g, marginRectangle);
+ }
+ }
+ }
+ }
+
+ Rectangle textViewArea = new Rectangle(currentXPos, currentYPos, Width - currentXPos, Height - currentYPos);
+ if (textViewArea != textView.DrawingPosition) {
+ adjustScrollBars = true;
+ textView.DrawingPosition = textViewArea;
+ // update caret position (but outside of WM_PAINT!)
+ BeginInvoke((MethodInvoker)caret.UpdateCaretPosition);
+ }
+ if (clipRectangle.IntersectsWith(textViewArea)) {
+ textViewArea.Intersect(clipRectangle);
+ if (!textViewArea.IsEmpty) {
+ textView.Paint(g, textViewArea);
+ }
+ }
+
+ if (adjustScrollBars) {
+ this.motherTextAreaControl.AdjustScrollBars();
+ }
+
+ // we cannot update the caret position here, it's not allowed to call the caret API inside WM_PAINT
+ //Caret.UpdateCaretPosition();
+
+ base.OnPaint(e);
+ }
+ void DocumentFoldingsChanged(object sender, EventArgs e)
+ {
+ Caret.UpdateCaretPosition();
+ Invalidate();
+ this.motherTextAreaControl.AdjustScrollBars();
+ }
+
+ #region keyboard handling methods
+
+ /// <summary>
+ /// This method is called on each Keypress
+ /// </summary>
+ /// <returns>
+ /// True, if the key is handled by this method and should NOT be
+ /// inserted in the textarea.
+ /// </returns>
+ protected internal virtual bool HandleKeyPress(char ch)
+ {
+ if (KeyEventHandler != null) {
+ return KeyEventHandler(ch);
+ }
+ return false;
+ }
+
+ // Fixes SD2-747: Form containing the text editor and a button with a shortcut
+ protected override bool IsInputChar(char charCode)
+ {
+ return true;
+ }
+
+ internal bool IsReadOnly(int offset)
+ {
+ if (Document.ReadOnly) {
+ return true;
+ }
+ if (TextEditorProperties.SupportReadOnlySegments) {
+ return Document.MarkerStrategy.GetMarkers(offset).Exists(m=>m.IsReadOnly);
+ } else {
+ return false;
+ }
+ }
+
+ internal bool IsReadOnly(int offset, int length)
+ {
+ if (Document.ReadOnly) {
+ return true;
+ }
+ if (TextEditorProperties.SupportReadOnlySegments) {
+ return Document.MarkerStrategy.GetMarkers(offset, length).Exists(m=>m.IsReadOnly);
+ } else {
+ return false;
+ }
+ }
+
+ public void SimulateKeyPress(char ch)
+ {
+ if (SelectionManager.HasSomethingSelected) {
+ if (SelectionManager.SelectionIsReadonly)
+ return;
+ } else if (IsReadOnly(Caret.Offset)) {
+ return;
+ }
+
+ if (ch < ' ') {
+ return;
+ }
+
+ if (!hiddenMouseCursor && TextEditorProperties.HideMouseCursor) {
+ if (this.ClientRectangle.Contains(PointToClient(Cursor.Position))) {
+ mouseCursorHidePosition = Cursor.Position;
+ hiddenMouseCursor = true;
+ Cursor.Hide();
+ }
+ }
+ CloseToolTip();
+
+ BeginUpdate();
+ Document.UndoStack.StartUndoGroup();
+ try {
+ // INSERT char
+ if (!HandleKeyPress(ch)) {
+ switch (Caret.CaretMode) {
+ case CaretMode.InsertMode:
+ InsertChar(ch);
+ break;
+ case CaretMode.OverwriteMode:
+ ReplaceChar(ch);
+ break;
+ default:
+ Debug.Assert(false, "Unknown caret mode " + Caret.CaretMode);
+ break;
+ }
+ }
+
+ int currentLineNr = Caret.Line;
+ Document.FormattingStrategy.FormatLine(this, currentLineNr, Document.PositionToOffset(Caret.Position), ch);
+
+ EndUpdate();
+ } finally {
+ Document.UndoStack.EndUndoGroup();
+ }
+ }
+
+ protected override void OnKeyPress(KeyPressEventArgs e)
+ {
+ base.OnKeyPress(e);
+ SimulateKeyPress(e.KeyChar);
+ e.Handled = true;
+ }
+
+ /// <summary>
+ /// This method executes a dialog key
+ /// </summary>
+ public bool ExecuteDialogKey(Keys keyData)
+ {
+ // try, if a dialog key processor was set to use this
+ if (DoProcessDialogKey != null && DoProcessDialogKey(keyData)) {
+ return true;
+ }
+
+ // if not (or the process was 'silent', use the standard edit actions
+ IEditAction action = motherTextEditorControl.GetEditAction(keyData);
+ AutoClearSelection = true;
+ if (action != null) {
+ BeginUpdate();
+ try {
+ lock (Document) {
+ action.Execute(this);
+ if (SelectionManager.HasSomethingSelected && AutoClearSelection /*&& caretchanged*/) {
+ if (Document.TextEditorProperties.DocumentSelectionMode == DocumentSelectionMode.Normal) {
+ SelectionManager.ClearSelection();
+ }
+ }
+ }
+ } finally {
+ EndUpdate();
+ Caret.UpdateCaretPosition();
+ }
+ return true;
+ }
+ return false;
+ }
+
+ protected override bool ProcessDialogKey(Keys keyData)
+ {
+ return ExecuteDialogKey(keyData) || base.ProcessDialogKey(keyData);
+ }
+ #endregion
+
+ public void ScrollToCaret()
+ {
+ motherTextAreaControl.ScrollToCaret();
+ }
+
+ public void ScrollTo(int line)
+ {
+ motherTextAreaControl.ScrollTo(line);
+ }
+
+ public void BeginUpdate()
+ {
+ motherTextEditorControl.BeginUpdate();
+ }
+
+ public void EndUpdate()
+ {
+ motherTextEditorControl.EndUpdate();
+ }
+
+ public bool EnableCutOrPaste {
+ get {
+ if (motherTextAreaControl == null)
+ return false;
+ if (SelectionManager.HasSomethingSelected)
+ return !SelectionManager.SelectionIsReadonly;
+ else
+ return !IsReadOnly(Caret.Offset);
+ }
+ }
+
+ string GenerateWhitespaceString(int length)
+ {
+ return new String(' ', length);
+ }
+ /// <remarks>
+ /// Inserts a single character at the caret position
+ /// </remarks>
+ public void InsertChar(char ch)
+ {
+ bool updating = motherTextEditorControl.IsInUpdate;
+ if (!updating) {
+ BeginUpdate();
+ }
+
+ // filter out forgein whitespace chars and replace them with standard space (ASCII 32)
+ if (Char.IsWhiteSpace(ch) && ch != '\t' && ch != '\n') {
+ ch = ' ';
+ }
+
+ Document.UndoStack.StartUndoGroup();
+ if (Document.TextEditorProperties.DocumentSelectionMode == DocumentSelectionMode.Normal &&
+ SelectionManager.SelectionCollection.Count > 0) {
+ Caret.Position = SelectionManager.SelectionCollection[0].StartPosition;
+ SelectionManager.RemoveSelectedText();
+ }
+ LineSegment caretLine = Document.GetLineSegment(Caret.Line);
+ int offset = Caret.Offset;
+ // use desired column for generated whitespaces
+ int dc = Caret.Column;
+ if (caretLine.Length < dc && ch != '\n') {
+ Document.Insert(offset, GenerateWhitespaceString(dc - caretLine.Length) + ch);
+ } else {
+ Document.Insert(offset, ch.ToString());
+ }
+ Document.UndoStack.EndUndoGroup();
+ ++Caret.Column;
+
+ if (!updating) {
+ EndUpdate();
+ UpdateLineToEnd(Caret.Line, Caret.Column);
+ }
+
+ // I prefer to set NOT the standard column, if you type something
+// ++Caret.DesiredColumn;
+ }
+
+ /// <remarks>
+ /// Inserts a whole string at the caret position
+ /// </remarks>
+ public void InsertString(string str)
+ {
+ bool updating = motherTextEditorControl.IsInUpdate;
+ if (!updating) {
+ BeginUpdate();
+ }
+ try {
+ Document.UndoStack.StartUndoGroup();
+ if (Document.TextEditorProperties.DocumentSelectionMode == DocumentSelectionMode.Normal &&
+ SelectionManager.SelectionCollection.Count > 0) {
+ Caret.Position = SelectionManager.SelectionCollection[0].StartPosition;
+ SelectionManager.RemoveSelectedText();
+ }
+
+ int oldOffset = Document.PositionToOffset(Caret.Position);
+ int oldLine = Caret.Line;
+ LineSegment caretLine = Document.GetLineSegment(Caret.Line);
+ if (caretLine.Length < Caret.Column) {
+ int whiteSpaceLength = Caret.Column - caretLine.Length;
+ Document.Insert(oldOffset, GenerateWhitespaceString(whiteSpaceLength) + str);
+ Caret.Position = Document.OffsetToPosition(oldOffset + str.Length + whiteSpaceLength);
+ } else {
+ Document.Insert(oldOffset, str);
+ Caret.Position = Document.OffsetToPosition(oldOffset + str.Length);
+ }
+ Document.UndoStack.EndUndoGroup();
+ if (oldLine != Caret.Line) {
+ UpdateToEnd(oldLine);
+ } else {
+ UpdateLineToEnd(Caret.Line, Caret.Column);
+ }
+ } finally {
+ if (!updating) {
+ EndUpdate();
+ }
+ }
+ }
+
+ /// <remarks>
+ /// Replaces a char at the caret position
+ /// </remarks>
+ public void ReplaceChar(char ch)
+ {
+ bool updating = motherTextEditorControl.IsInUpdate;
+ if (!updating) {
+ BeginUpdate();
+ }
+ if (Document.TextEditorProperties.DocumentSelectionMode == DocumentSelectionMode.Normal && SelectionManager.SelectionCollection.Count > 0) {
+ Caret.Position = SelectionManager.SelectionCollection[0].StartPosition;
+ SelectionManager.RemoveSelectedText();
+ }
+
+ int lineNr = Caret.Line;
+ LineSegment line = Document.GetLineSegment(lineNr);
+ int offset = Document.PositionToOffset(Caret.Position);
+ if (offset < line.Offset + line.Length) {
+ Document.Replace(offset, 1, ch.ToString());
+ } else {
+ Document.Insert(offset, ch.ToString());
+ }
+ if (!updating) {
+ EndUpdate();
+ UpdateLineToEnd(lineNr, Caret.Column);
+ }
+ ++Caret.Column;
+// ++Caret.DesiredColumn;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+ if (disposing) {
+ if (!disposed) {
+ disposed = true;
+ if (caret != null) {
+ caret.PositionChanged -= new EventHandler(SearchMatchingBracket);
+ caret.Dispose();
+ }
+ if (selectionManager != null) {
+ selectionManager.Dispose();
+ }
+ Document.TextContentChanged -= new EventHandler(TextContentChanged);
+ Document.FoldingManager.FoldingsChanged -= new EventHandler(DocumentFoldingsChanged);
+ motherTextAreaControl = null;
+ motherTextEditorControl = null;
+ foreach (AbstractMargin margin in leftMargins) {
+ if (margin is IDisposable)
+ (margin as IDisposable).Dispose();
+ }
+ textView.Dispose();
+ }
+ }
+ }
+
+ #region UPDATE Commands
+ internal void UpdateLine(int line)
+ {
+ UpdateLines(0, line, line);
+ }
+
+ internal void UpdateLines(int lineBegin, int lineEnd)
+ {
+ UpdateLines(0, lineBegin, lineEnd);
+ }
+
+ internal void UpdateToEnd(int lineBegin)
+ {
+// if (lineBegin > FirstPhysicalLine + textView.VisibleLineCount) {
+// return;
+// }
+
+ lineBegin = Document.GetVisibleLine(lineBegin);
+ int y = Math.Max( 0, (int)(lineBegin * textView.FontHeight));
+ y = Math.Max(0, y - this.virtualTop.Y);
+ Rectangle r = new Rectangle(0,
+ y,
+ Width,
+ Height - y);
+ Invalidate(r);
+ }
+
+ internal void UpdateLineToEnd(int lineNr, int xStart)
+ {
+ UpdateLines(xStart, lineNr, lineNr);
+ }
+
+ internal void UpdateLine(int line, int begin, int end)
+ {
+ UpdateLines(line, line);
+ }
+ int FirstPhysicalLine {
+ get {
+ return VirtualTop.Y / textView.FontHeight;
+ }
+ }
+ internal void UpdateLines(int xPos, int lineBegin, int lineEnd)
+ {
+// if (lineEnd < FirstPhysicalLine || lineBegin > FirstPhysicalLine + textView.VisibleLineCount) {
+// return;
+// }
+
+ InvalidateLines((int)(xPos * this.TextView.WideSpaceWidth), lineBegin, lineEnd);
+ }
+
+ void InvalidateLines(int xPos, int lineBegin, int lineEnd)
+ {
+ lineBegin = Math.Max(Document.GetVisibleLine(lineBegin), FirstPhysicalLine);
+ lineEnd = Math.Min(Document.GetVisibleLine(lineEnd), FirstPhysicalLine + textView.VisibleLineCount);
+ int y = Math.Max( 0, (int)(lineBegin * textView.FontHeight));
+ int height = Math.Min(textView.DrawingPosition.Height, (int)((1 + lineEnd - lineBegin) * (textView.FontHeight + 1)));
+
+ Rectangle r = new Rectangle(0,
+ y - 1 - this.virtualTop.Y,
+ Width,
+ height + 3);
+
+ Invalidate(r);
+ }
+ #endregion
+ public event KeyEventHandler KeyEventHandler;
+ public event DialogKeyProcessor DoProcessDialogKey;
+
+ //internal void
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaClipboardHandler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaClipboardHandler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaClipboardHandler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,268 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+using ICSharpCode.TextEditor.Util;
+
+namespace ICSharpCode.TextEditor
+{
+ public class TextAreaClipboardHandler
+ {
+ TextArea textArea;
+
+ public bool EnableCut {
+ get {
+ return textArea.EnableCutOrPaste; //textArea.SelectionManager.HasSomethingSelected;
+ }
+ }
+
+ public bool EnableCopy {
+ get {
+ return true; //textArea.SelectionManager.HasSomethingSelected;
+ }
+ }
+
+ public delegate bool ClipboardContainsTextDelegate();
+
+ /// <summary>
+ /// Is called when CachedClipboardContainsText should be updated.
+ /// If this property is null (the default value), the text editor uses
+ /// System.Windows.Forms.Clipboard.ContainsText.
+ /// </summary>
+ /// <remarks>
+ /// This property is useful if you want to prevent the default Clipboard.ContainsText
+ /// behaviour that waits for the clipboard to be available - the clipboard might
+ /// never become available if it is owned by a process that is paused by the debugger.
+ /// </remarks>
+ public static ClipboardContainsTextDelegate GetClipboardContainsText;
+
+ public bool EnablePaste {
+ get {
+ if (!textArea.EnableCutOrPaste)
+ return false;
+ ClipboardContainsTextDelegate d = GetClipboardContainsText;
+ if (d != null) {
+ return d();
+ } else {
+ try {
+ return Clipboard.ContainsText();
+ } catch (ExternalException) {
+ return false;
+ }
+ }
+ }
+ }
+
+ public bool EnableDelete {
+ get {
+ return textArea.SelectionManager.HasSomethingSelected && !textArea.SelectionManager.SelectionIsReadonly;
+ }
+ }
+
+ public bool EnableSelectAll {
+ get {
+ return true;
+ }
+ }
+
+ public TextAreaClipboardHandler(TextArea textArea)
+ {
+ this.textArea = textArea;
+ textArea.SelectionManager.SelectionChanged += new EventHandler(DocumentSelectionChanged);
+ }
+
+ void DocumentSelectionChanged(object sender, EventArgs e)
+ {
+// ((DefaultWorkbench)WorkbenchSingleton.Workbench).UpdateToolbars();
+ }
+
+ const string LineSelectedType = "MSDEVLineSelect"; // This is the type VS 2003 and 2005 use for flagging a whole line copy
+
+ bool CopyTextToClipboard(string stringToCopy, bool asLine)
+ {
+ if (stringToCopy.Length > 0) {
+ DataObject dataObject = new DataObject();
+ dataObject.SetData(DataFormats.UnicodeText, true, stringToCopy);
+ if (asLine) {
+ MemoryStream lineSelected = new MemoryStream(1);
+ lineSelected.WriteByte(1);
+ dataObject.SetData(LineSelectedType, false, lineSelected);
+ }
+ // Default has no highlighting, therefore we don't need RTF output
+ if (textArea.Document.HighlightingStrategy.Name != "Default") {
+ dataObject.SetData(DataFormats.Rtf, RtfWriter.GenerateRtf(textArea));
+ }
+ OnCopyText(new CopyTextEventArgs(stringToCopy));
+
+ SafeSetClipboard(dataObject);
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ // Code duplication: TextAreaClipboardHandler.cs also has SafeSetClipboard
+ [ThreadStatic] static int SafeSetClipboardDataVersion;
+
+ static void SafeSetClipboard(object dataObject)
+ {
+ // Work around ExternalException bug. (SD2-426)
+ // Best reproducable inside Virtual PC.
+ int version = unchecked(++SafeSetClipboardDataVersion);
+ try {
+ Clipboard.SetDataObject(dataObject, true);
+ } catch (ExternalException) {
+ Timer timer = new Timer();
+ timer.Interval = 100;
+ timer.Tick += delegate {
+ timer.Stop();
+ timer.Dispose();
+ if (SafeSetClipboardDataVersion == version) {
+ try {
+ Clipboard.SetDataObject(dataObject, true, 10, 50);
+ } catch (ExternalException) { }
+ }
+ };
+ timer.Start();
+ }
+ }
+
+ bool CopyTextToClipboard(string stringToCopy)
+ {
+ return CopyTextToClipboard(stringToCopy, false);
+ }
+
+ public void Cut(object sender, EventArgs e)
+ {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ if (CopyTextToClipboard(textArea.SelectionManager.SelectedText)) {
+ if (textArea.SelectionManager.SelectionIsReadonly)
+ return;
+ // Remove text
+ textArea.BeginUpdate();
+ textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
+ textArea.SelectionManager.RemoveSelectedText();
+ textArea.EndUpdate();
+ }
+ } else if (textArea.Document.TextEditorProperties.CutCopyWholeLine) {
+ // No text was selected, select and cut the entire line
+ int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
+ LineSegment lineWhereCaretIs = textArea.Document.GetLineSegment(curLineNr);
+ string caretLineText = textArea.Document.GetText(lineWhereCaretIs.Offset, lineWhereCaretIs.TotalLength);
+ textArea.SelectionManager.SetSelection(textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset), textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset + lineWhereCaretIs.TotalLength));
+ if (CopyTextToClipboard(caretLineText, true)) {
+ if (textArea.SelectionManager.SelectionIsReadonly)
+ return;
+ // remove line
+ textArea.BeginUpdate();
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(lineWhereCaretIs.Offset);
+ textArea.SelectionManager.RemoveSelectedText();
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.PositionToEnd, new TextLocation(0, curLineNr)));
+ textArea.EndUpdate();
+ }
+ }
+ }
+
+ public void Copy(object sender, EventArgs e)
+ {
+ if (!CopyTextToClipboard(textArea.SelectionManager.SelectedText) && textArea.Document.TextEditorProperties.CutCopyWholeLine) {
+ // No text was selected, select the entire line, copy it, and then deselect
+ int curLineNr = textArea.Document.GetLineNumberForOffset(textArea.Caret.Offset);
+ LineSegment lineWhereCaretIs = textArea.Document.GetLineSegment(curLineNr);
+ string caretLineText = textArea.Document.GetText(lineWhereCaretIs.Offset, lineWhereCaretIs.TotalLength);
+ CopyTextToClipboard(caretLineText, true);
+ }
+ }
+
+ public void Paste(object sender, EventArgs e)
+ {
+ if (!textArea.EnableCutOrPaste) {
+ return;
+ }
+ // Clipboard.GetDataObject may throw an exception...
+ for (int i = 0;; i++) {
+ try {
+ IDataObject data = Clipboard.GetDataObject();
+ if (data == null)
+ return;
+ bool fullLine = data.GetDataPresent(LineSelectedType);
+ if (data.GetDataPresent(DataFormats.UnicodeText)) {
+ string text = (string)data.GetData(DataFormats.UnicodeText);
+ // we got NullReferenceExceptions here, apparently the clipboard can contain null strings
+ if (!string.IsNullOrEmpty(text)) {
+ textArea.Document.UndoStack.StartUndoGroup();
+ try {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ textArea.Caret.Position = textArea.SelectionManager.SelectionCollection[0].StartPosition;
+ textArea.SelectionManager.RemoveSelectedText();
+ }
+ if (fullLine) {
+ int col = textArea.Caret.Column;
+ textArea.Caret.Column = 0;
+ if (!textArea.IsReadOnly(textArea.Caret.Offset))
+ textArea.InsertString(text);
+ textArea.Caret.Column = col;
+ } else {
+ // textArea.EnableCutOrPaste already checked readonly for this case
+ textArea.InsertString(text);
+ }
+ } finally {
+ textArea.Document.UndoStack.EndUndoGroup();
+ }
+ }
+ }
+ return;
+ } catch (ExternalException) {
+ // GetDataObject does not provide RetryTimes parameter
+ if (i > 5) throw;
+ }
+ }
+ }
+
+ public void Delete(object sender, EventArgs e)
+ {
+ new ICSharpCode.TextEditor.Actions.Delete().Execute(textArea);
+ }
+
+ public void SelectAll(object sender, EventArgs e)
+ {
+ new ICSharpCode.TextEditor.Actions.SelectWholeDocument().Execute(textArea);
+ }
+
+ protected virtual void OnCopyText(CopyTextEventArgs e)
+ {
+ if (CopyText != null) {
+ CopyText(this, e);
+ }
+ }
+
+ public event CopyTextEventHandler CopyText;
+ }
+
+ public delegate void CopyTextEventHandler(object sender, CopyTextEventArgs e);
+ public class CopyTextEventArgs : EventArgs
+ {
+ string text;
+
+ public string Text {
+ get {
+ return text;
+ }
+ }
+
+ public CopyTextEventArgs(string text)
+ {
+ this.text = text;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaControl.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaControl.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaControl.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,463 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class paints the textarea.
+ /// </summary>
+ [ToolboxItem(false)]
+ public class TextAreaControl : Panel
+ {
+ TextEditorControl motherTextEditorControl;
+
+ HRuler hRuler = null;
+
+ VScrollBar vScrollBar = new VScrollBar();
+ HScrollBar hScrollBar = new HScrollBar();
+ TextArea textArea;
+ bool doHandleMousewheel = true;
+ bool disposed;
+
+ public TextArea TextArea {
+ get {
+ return textArea;
+ }
+ }
+
+ public SelectionManager SelectionManager {
+ get {
+ return textArea.SelectionManager;
+ }
+ }
+
+ public Caret Caret {
+ get {
+ return textArea.Caret;
+ }
+ }
+
+ [Browsable(false)]
+ public IDocument Document {
+ get {
+ if (motherTextEditorControl != null)
+ return motherTextEditorControl.Document;
+ return null;
+ }
+ }
+
+ public ITextEditorProperties TextEditorProperties {
+ get {
+ if (motherTextEditorControl != null)
+ return motherTextEditorControl.TextEditorProperties;
+ return null;
+ }
+ }
+
+ public VScrollBar VScrollBar {
+ get {
+ return vScrollBar;
+ }
+ }
+
+ public HScrollBar HScrollBar {
+ get {
+ return hScrollBar;
+ }
+ }
+
+ public bool DoHandleMousewheel {
+ get {
+ return doHandleMousewheel;
+ }
+ set {
+ doHandleMousewheel = value;
+ }
+ }
+
+ public TextAreaControl(TextEditorControl motherTextEditorControl)
+ {
+ this.motherTextEditorControl = motherTextEditorControl;
+
+ this.textArea = new TextArea(motherTextEditorControl, this);
+ Controls.Add(textArea);
+
+ vScrollBar.ValueChanged += new EventHandler(VScrollBarValueChanged);
+ Controls.Add(this.vScrollBar);
+
+ hScrollBar.ValueChanged += new EventHandler(HScrollBarValueChanged);
+ Controls.Add(this.hScrollBar);
+ ResizeRedraw = true;
+
+ Document.TextContentChanged += DocumentTextContentChanged;
+ Document.DocumentChanged += AdjustScrollBarsOnDocumentChange;
+ Document.UpdateCommited += DocumentUpdateCommitted;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing) {
+ if (!disposed) {
+ disposed = true;
+ Document.TextContentChanged -= DocumentTextContentChanged;
+ Document.DocumentChanged -= AdjustScrollBarsOnDocumentChange;
+ Document.UpdateCommited -= DocumentUpdateCommitted;
+ motherTextEditorControl = null;
+ if (vScrollBar != null) {
+ vScrollBar.Dispose();
+ vScrollBar = null;
+ }
+ if (hScrollBar != null) {
+ hScrollBar.Dispose();
+ hScrollBar = null;
+ }
+ if (hRuler != null) {
+ hRuler.Dispose();
+ hRuler = null;
+ }
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ void DocumentTextContentChanged(object sender, EventArgs e)
+ {
+ // after the text content is changed abruptly, we need to validate the
+ // caret position - otherwise the caret position is invalid for a short amount
+ // of time, which can break client code that expects that the caret position is always valid
+ Caret.ValidateCaretPos();
+ }
+
+ protected override void OnResize(System.EventArgs e)
+ {
+ base.OnResize(e);
+ ResizeTextArea();
+ }
+
+ public void ResizeTextArea()
+ {
+ int y = 0;
+ int h = 0;
+ if (hRuler != null) {
+ hRuler.Bounds = new Rectangle(0,
+ 0,
+ Width - SystemInformation.HorizontalScrollBarArrowWidth,
+ textArea.TextView.FontHeight);
+
+ y = hRuler.Bounds.Bottom;
+ h = hRuler.Bounds.Height;
+ }
+
+ textArea.Bounds = new Rectangle(0, y,
+ Width - SystemInformation.HorizontalScrollBarArrowWidth,
+ Height - SystemInformation.VerticalScrollBarArrowHeight - h);
+ SetScrollBarBounds();
+ }
+
+ public void SetScrollBarBounds()
+ {
+ vScrollBar.Bounds = new Rectangle(textArea.Bounds.Right, 0, SystemInformation.HorizontalScrollBarArrowWidth, Height - SystemInformation.VerticalScrollBarArrowHeight);
+ hScrollBar.Bounds = new Rectangle(0,
+ textArea.Bounds.Bottom,
+ Width - SystemInformation.HorizontalScrollBarArrowWidth,
+ SystemInformation.VerticalScrollBarArrowHeight);
+ }
+
+ bool adjustScrollBarsOnNextUpdate;
+ Point scrollToPosOnNextUpdate;
+
+ void AdjustScrollBarsOnDocumentChange(object sender, DocumentEventArgs e)
+ {
+ if (motherTextEditorControl.IsInUpdate == false) {
+ AdjustScrollBarsClearCache();
+ AdjustScrollBars();
+ } else {
+ adjustScrollBarsOnNextUpdate = true;
+ }
+ }
+
+ void DocumentUpdateCommitted(object sender, EventArgs e)
+ {
+ if (motherTextEditorControl.IsInUpdate == false) {
+ Caret.ValidateCaretPos();
+
+ // AdjustScrollBarsOnCommittedUpdate
+ if (!scrollToPosOnNextUpdate.IsEmpty) {
+ ScrollTo(scrollToPosOnNextUpdate.Y, scrollToPosOnNextUpdate.X);
+ }
+ if (adjustScrollBarsOnNextUpdate) {
+ AdjustScrollBarsClearCache();
+ AdjustScrollBars();
+ }
+ }
+ }
+
+ int[] lineLengthCache;
+ const int LineLengthCacheAdditionalSize = 100;
+
+ void AdjustScrollBarsClearCache()
+ {
+ if (lineLengthCache != null) {
+ if (lineLengthCache.Length < this.Document.TotalNumberOfLines + 2 * LineLengthCacheAdditionalSize) {
+ lineLengthCache = null;
+ } else {
+ Array.Clear(lineLengthCache, 0, lineLengthCache.Length);
+ }
+ }
+ }
+
+ public void AdjustScrollBars()
+ {
+ adjustScrollBarsOnNextUpdate = false;
+ vScrollBar.Minimum = 0;
+ // number of visible lines in document (folding!)
+ vScrollBar.Maximum = textArea.MaxVScrollValue;
+ int max = 0;
+
+ int firstLine = textArea.TextView.FirstVisibleLine;
+ int lastLine = this.Document.GetFirstLogicalLine(textArea.TextView.FirstPhysicalLine + textArea.TextView.VisibleLineCount);
+ if (lastLine >= this.Document.TotalNumberOfLines)
+ lastLine = this.Document.TotalNumberOfLines - 1;
+
+ if (lineLengthCache == null || lineLengthCache.Length <= lastLine) {
+ lineLengthCache = new int[lastLine + LineLengthCacheAdditionalSize];
+ }
+
+ for (int lineNumber = firstLine; lineNumber <= lastLine; lineNumber++) {
+ LineSegment lineSegment = this.Document.GetLineSegment(lineNumber);
+ if (Document.FoldingManager.IsLineVisible(lineNumber)) {
+ if (lineLengthCache[lineNumber] > 0) {
+ max = Math.Max(max, lineLengthCache[lineNumber]);
+ } else {
+ int visualLength = textArea.TextView.GetVisualColumnFast(lineSegment, lineSegment.Length);
+ lineLengthCache[lineNumber] = Math.Max(1, visualLength);
+ max = Math.Max(max, visualLength);
+ }
+ }
+ }
+ hScrollBar.Minimum = 0;
+ hScrollBar.Maximum = (Math.Max(max + 20, textArea.TextView.VisibleColumnCount - 1));
+
+ vScrollBar.LargeChange = Math.Max(0, textArea.TextView.DrawingPosition.Height);
+ vScrollBar.SmallChange = Math.Max(0, textArea.TextView.FontHeight);
+
+ hScrollBar.LargeChange = Math.Max(0, textArea.TextView.VisibleColumnCount - 1);
+ hScrollBar.SmallChange = Math.Max(0, (int)textArea.TextView.SpaceWidth);
+ }
+
+ public void OptionsChanged()
+ {
+ textArea.OptionsChanged();
+
+ if (textArea.TextEditorProperties.ShowHorizontalRuler) {
+ if (hRuler == null) {
+ hRuler = new HRuler(textArea);
+ Controls.Add(hRuler);
+ ResizeTextArea();
+ } else {
+ hRuler.Invalidate();
+ }
+ } else {
+ if (hRuler != null) {
+ Controls.Remove(hRuler);
+ hRuler.Dispose();
+ hRuler = null;
+ ResizeTextArea();
+ }
+ }
+
+ AdjustScrollBars();
+ }
+
+ void VScrollBarValueChanged(object sender, EventArgs e)
+ {
+ textArea.VirtualTop = new Point(textArea.VirtualTop.X, vScrollBar.Value);
+ textArea.Invalidate();
+ AdjustScrollBars();
+ }
+
+ void HScrollBarValueChanged(object sender, EventArgs e)
+ {
+ textArea.VirtualTop = new Point(hScrollBar.Value * textArea.TextView.WideSpaceWidth, textArea.VirtualTop.Y);
+ textArea.Invalidate();
+ }
+
+ Util.MouseWheelHandler mouseWheelHandler = new Util.MouseWheelHandler();
+
+ public void HandleMouseWheel(MouseEventArgs e)
+ {
+ int scrollDistance = mouseWheelHandler.GetScrollAmount(e);
+ if (scrollDistance == 0)
+ return;
+ if ((Control.ModifierKeys & Keys.Control) != 0 && TextEditorProperties.MouseWheelTextZoom) {
+ if (scrollDistance > 0) {
+ motherTextEditorControl.Font = new Font(motherTextEditorControl.Font.Name,
+ motherTextEditorControl.Font.Size + 1);
+ } else {
+ motherTextEditorControl.Font = new Font(motherTextEditorControl.Font.Name,
+ Math.Max(6, motherTextEditorControl.Font.Size - 1));
+ }
+ } else {
+ if (TextEditorProperties.MouseWheelScrollDown)
+ scrollDistance = -scrollDistance;
+ int newValue = vScrollBar.Value + vScrollBar.SmallChange * scrollDistance;
+ vScrollBar.Value = Math.Max(vScrollBar.Minimum, Math.Min(vScrollBar.Maximum - vScrollBar.LargeChange + 1, newValue));
+ }
+ }
+
+ protected override void OnMouseWheel(MouseEventArgs e)
+ {
+ base.OnMouseWheel(e);
+ if (DoHandleMousewheel) {
+ HandleMouseWheel(e);
+ }
+ }
+
+ public void ScrollToCaret()
+ {
+ ScrollTo(textArea.Caret.Line, textArea.Caret.Column);
+ }
+
+ public void ScrollTo(int line, int column)
+ {
+ if (motherTextEditorControl.IsInUpdate) {
+ scrollToPosOnNextUpdate = new Point(column, line);
+ return;
+ } else {
+ scrollToPosOnNextUpdate = Point.Empty;
+ }
+
+ ScrollTo(line);
+
+ int curCharMin = (int)(this.hScrollBar.Value - this.hScrollBar.Minimum);
+ int curCharMax = curCharMin + textArea.TextView.VisibleColumnCount;
+
+ int pos = textArea.TextView.GetVisualColumn(line, column);
+
+ if (textArea.TextView.VisibleColumnCount < 0) {
+ hScrollBar.Value = 0;
+ } else {
+ if (pos < curCharMin) {
+ hScrollBar.Value = (int)(Math.Max(0, pos - scrollMarginHeight));
+ } else {
+ if (pos > curCharMax) {
+ hScrollBar.Value = (int)Math.Max(0, Math.Min(hScrollBar.Maximum, (pos - textArea.TextView.VisibleColumnCount + scrollMarginHeight)));
+ }
+ }
+ }
+ }
+
+ int scrollMarginHeight = 3;
+
+ /// <summary>
+ /// Ensure that <paramref name="line"/> is visible.
+ /// </summary>
+ public void ScrollTo(int line)
+ {
+ line = Math.Max(0, Math.Min(Document.TotalNumberOfLines - 1, line));
+ line = Document.GetVisibleLine(line);
+ int curLineMin = textArea.TextView.FirstPhysicalLine;
+ if (textArea.TextView.LineHeightRemainder > 0) {
+ curLineMin ++;
+ }
+
+ if (line - scrollMarginHeight + 3 < curLineMin) {
+ this.vScrollBar.Value = Math.Max(0, Math.Min(this.vScrollBar.Maximum, (line - scrollMarginHeight + 3) * textArea.TextView.FontHeight)) ;
+ VScrollBarValueChanged(this, EventArgs.Empty);
+ } else {
+ int curLineMax = curLineMin + this.textArea.TextView.VisibleLineCount;
+ if (line + scrollMarginHeight - 1 > curLineMax) {
+ if (this.textArea.TextView.VisibleLineCount == 1) {
+ this.vScrollBar.Value = Math.Max(0, Math.Min(this.vScrollBar.Maximum, (line - scrollMarginHeight - 1) * textArea.TextView.FontHeight)) ;
+ } else {
+ this.vScrollBar.Value = Math.Min(this.vScrollBar.Maximum,
+ (line - this.textArea.TextView.VisibleLineCount + scrollMarginHeight - 1)* textArea.TextView.FontHeight) ;
+ }
+ VScrollBarValueChanged(this, EventArgs.Empty);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Scroll so that the specified line is centered.
+ /// </summary>
+ /// <param name="line">Line to center view on</param>
+ /// <param name="treshold">If this action would cause scrolling by less than or equal to
+ /// <paramref name="treshold"/> lines in any direction, don't scroll.
+ /// Use -1 to always center the view.</param>
+ public void CenterViewOn(int line, int treshold)
+ {
+ line = Math.Max(0, Math.Min(Document.TotalNumberOfLines - 1, line));
+ // convert line to visible line:
+ line = Document.GetVisibleLine(line);
+ // subtract half the visible line count
+ line -= textArea.TextView.VisibleLineCount / 2;
+
+ int curLineMin = textArea.TextView.FirstPhysicalLine;
+ if (textArea.TextView.LineHeightRemainder > 0) {
+ curLineMin ++;
+ }
+ if (Math.Abs(curLineMin - line) > treshold) {
+ // scroll:
+ this.vScrollBar.Value = Math.Max(0, Math.Min(this.vScrollBar.Maximum, (line - scrollMarginHeight + 3) * textArea.TextView.FontHeight)) ;
+ VScrollBarValueChanged(this, EventArgs.Empty);
+ }
+ }
+
+ public void JumpTo(int line)
+ {
+ line = Math.Max(0, Math.Min(line, Document.TotalNumberOfLines - 1));
+ string text = Document.GetText(Document.GetLineSegment(line));
+ JumpTo(line, text.Length - text.TrimStart().Length);
+ }
+
+ public void JumpTo(int line, int column)
+ {
+ textArea.Focus();
+ textArea.SelectionManager.ClearSelection();
+ textArea.Caret.Position = new TextLocation(column, line);
+ textArea.SetDesiredColumn();
+ ScrollToCaret();
+ }
+
+ public event MouseEventHandler ShowContextMenu;
+
+ protected override void WndProc(ref Message m)
+ {
+ if (m.Msg == 0x007B) { // handle WM_CONTEXTMENU
+ if (ShowContextMenu != null) {
+ long lParam = m.LParam.ToInt64();
+ int x = unchecked((short)(lParam & 0xffff));
+ int y = unchecked((short)((lParam & 0xffff0000) >> 16));
+ if (x == -1 && y == -1) {
+ Point pos = Caret.ScreenPosition;
+ ShowContextMenu(this, new MouseEventArgs(MouseButtons.None, 0, pos.X, pos.Y + textArea.TextView.FontHeight, 0));
+ } else {
+ Point pos = PointToClient(new Point(x, y));
+ ShowContextMenu(this, new MouseEventArgs(MouseButtons.Right, 1, pos.X, pos.Y, 0));
+ }
+ }
+ }
+ base.WndProc(ref m);
+ }
+
+ protected override void OnEnter(EventArgs e)
+ {
+ // SD2-1072 - Make sure the caret line is valid if anyone
+ // has handlers for the Enter event.
+ Caret.ValidateCaretPos();
+ base.OnEnter(e);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaDragDropHandler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaDragDropHandler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaDragDropHandler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,144 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ public class TextAreaDragDropHandler
+ {
+ public static Action<Exception> OnDragDropException = ex => MessageBox.Show(ex.ToString());
+
+ TextArea textArea;
+
+ public void Attach(TextArea textArea)
+ {
+ this.textArea = textArea;
+ textArea.AllowDrop = true;
+
+ textArea.DragEnter += MakeDragEventHandler(OnDragEnter);
+ textArea.DragDrop += MakeDragEventHandler(OnDragDrop);
+ textArea.DragOver += MakeDragEventHandler(OnDragOver);
+ }
+
+ /// <summary>
+ /// Create a drag'n'drop event handler.
+ /// Windows Forms swallows unhandled exceptions during drag'n'drop, so we report them here.
+ /// </summary>
+ static DragEventHandler MakeDragEventHandler(DragEventHandler h)
+ {
+ return (sender, e) => {
+ try {
+ h(sender, e);
+ } catch (Exception ex) {
+ OnDragDropException(ex);
+ }
+ };
+ }
+
+ static DragDropEffects GetDragDropEffect(DragEventArgs e)
+ {
+ if ((e.AllowedEffect & DragDropEffects.Move) > 0 &&
+ (e.AllowedEffect & DragDropEffects.Copy) > 0) {
+ return (e.KeyState & 8) > 0 ? DragDropEffects.Copy : DragDropEffects.Move;
+ } else if ((e.AllowedEffect & DragDropEffects.Move) > 0) {
+ return DragDropEffects.Move;
+ } else if ((e.AllowedEffect & DragDropEffects.Copy) > 0) {
+ return DragDropEffects.Copy;
+ }
+ return DragDropEffects.None;
+ }
+
+ protected void OnDragEnter(object sender, DragEventArgs e)
+ {
+ if (e.Data.GetDataPresent(typeof(string))) {
+ e.Effect = GetDragDropEffect(e);
+ }
+ }
+
+
+ void InsertString(int offset, string str)
+ {
+ textArea.Document.Insert(offset, str);
+
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.Document,
+ textArea.Document.OffsetToPosition(offset),
+ textArea.Document.OffsetToPosition(offset + str.Length)));
+ textArea.Caret.Position = textArea.Document.OffsetToPosition(offset + str.Length);
+ textArea.Refresh();
+ }
+
+ protected void OnDragDrop(object sender, DragEventArgs e)
+ {
+ Point p = textArea.PointToClient(new Point(e.X, e.Y));
+
+ if (e.Data.GetDataPresent(typeof(string))) {
+ textArea.BeginUpdate();
+ textArea.Document.UndoStack.StartUndoGroup();
+ try {
+ int offset = textArea.Caret.Offset;
+ if (textArea.IsReadOnly(offset)) {
+ // prevent dragging text into readonly section
+ return;
+ }
+ if (e.Data.GetDataPresent(typeof(DefaultSelection))) {
+ ISelection sel = (ISelection)e.Data.GetData(typeof(DefaultSelection));
+ if (sel.ContainsPosition(textArea.Caret.Position)) {
+ return;
+ }
+ if (GetDragDropEffect(e) == DragDropEffects.Move) {
+ if (SelectionManager.SelectionIsReadOnly(textArea.Document, sel)) {
+ // prevent dragging text out of readonly section
+ return;
+ }
+ int len = sel.Length;
+ textArea.Document.Remove(sel.Offset, len);
+ if (sel.Offset < offset) {
+ offset -= len;
+ }
+ }
+ }
+ textArea.SelectionManager.ClearSelection();
+ InsertString(offset, (string)e.Data.GetData(typeof(string)));
+ textArea.Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ } finally {
+ textArea.Document.UndoStack.EndUndoGroup();
+ textArea.EndUpdate();
+ }
+ }
+ }
+
+ protected void OnDragOver(object sender, DragEventArgs e)
+ {
+ if (!textArea.Focused) {
+ textArea.Focus();
+ }
+
+ Point p = textArea.PointToClient(new Point(e.X, e.Y));
+
+ if (textArea.TextView.DrawingPosition.Contains(p.X, p.Y)) {
+ TextLocation realmousepos= textArea.TextView.GetLogicalPosition(p.X - textArea.TextView.DrawingPosition.X,
+ p.Y - textArea.TextView.DrawingPosition.Y);
+ int lineNr = Math.Min(textArea.Document.TotalNumberOfLines - 1, Math.Max(0, realmousepos.Y));
+
+ textArea.Caret.Position = new TextLocation(realmousepos.X, lineNr);
+ textArea.SetDesiredColumn();
+ if (e.Data.GetDataPresent(typeof(string)) && !textArea.IsReadOnly(textArea.Caret.Offset)) {
+ e.Effect = GetDragDropEffect(e);
+ } else {
+ e.Effect = DragDropEffects.None;
+ }
+ } else {
+ e.Effect = DragDropEffects.None;
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaMouseHandler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaMouseHandler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaMouseHandler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,492 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class handles all mouse stuff for a textArea.
+ /// </summary>
+ public class TextAreaMouseHandler
+ {
+ TextArea textArea;
+ bool doubleclick = false;
+ bool clickedOnSelectedText = false;
+
+ MouseButtons button;
+
+ static readonly Point nilPoint = new Point(-1, -1);
+ Point mousedownpos = nilPoint;
+ Point lastmousedownpos = nilPoint;
+
+ bool gotmousedown = false;
+ bool dodragdrop = false;
+
+ public TextAreaMouseHandler(TextArea ttextArea)
+ {
+ textArea = ttextArea;
+ }
+
+ public void Attach()
+ {
+ textArea.Click += new EventHandler(TextAreaClick);
+ textArea.MouseMove += new MouseEventHandler(TextAreaMouseMove);
+
+ textArea.MouseDown += new MouseEventHandler(OnMouseDown);
+ textArea.DoubleClick += new EventHandler(OnDoubleClick);
+ textArea.MouseLeave += new EventHandler(OnMouseLeave);
+ textArea.MouseUp += new MouseEventHandler(OnMouseUp);
+ textArea.LostFocus += new EventHandler(TextAreaLostFocus);
+ textArea.ToolTipRequest += new ToolTipRequestEventHandler(OnToolTipRequest);
+ }
+
+ void OnToolTipRequest(object sender, ToolTipRequestEventArgs e)
+ {
+ if (e.ToolTipShown)
+ return;
+ Point mousepos = e.MousePosition;
+ FoldMarker marker = textArea.TextView.GetFoldMarkerFromPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
+ mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ if (marker != null && marker.IsFolded) {
+ StringBuilder sb = new StringBuilder(marker.InnerText);
+
+ // max 10 lines
+ int endLines = 0;
+ for (int i = 0; i < sb.Length; ++i) {
+ if (sb[i] == '\n') {
+ ++endLines;
+ if (endLines >= 10) {
+ sb.Remove(i + 1, sb.Length - i - 1);
+ sb.Append(Environment.NewLine);
+ sb.Append("...");
+ break;
+
+ }
+ }
+ }
+ sb.Replace("\t", " ");
+ e.ShowToolTip(sb.ToString());
+ return;
+ }
+
+ List<TextMarker> markers = textArea.Document.MarkerStrategy.GetMarkers(e.LogicalPosition);
+ foreach (TextMarker tm in markers) {
+ if (tm.ToolTip != null) {
+ e.ShowToolTip(tm.ToolTip.Replace("\t", " "));
+ return;
+ }
+ }
+ }
+
+ void ShowHiddenCursorIfMovedOrLeft()
+ {
+ textArea.ShowHiddenCursor(!textArea.Focused ||
+ !textArea.ClientRectangle.Contains(textArea.PointToClient(Cursor.Position)));
+ }
+
+ void TextAreaLostFocus(object sender, EventArgs e)
+ {
+ // The call to ShowHiddenCursorIfMovedOrLeft is delayed
+ // until pending messages have been processed
+ // so that it can properly detect whether the TextArea
+ // has really lost focus.
+ // For example, the CodeCompletionWindow gets focus when it is shown,
+ // but immediately gives back focus to the TextArea.
+ textArea.BeginInvoke(new MethodInvoker(ShowHiddenCursorIfMovedOrLeft));
+ }
+
+ void OnMouseLeave(object sender, EventArgs e)
+ {
+ ShowHiddenCursorIfMovedOrLeft();
+ gotmousedown = false;
+ mousedownpos = nilPoint;
+ }
+
+ void OnMouseUp(object sender, MouseEventArgs e)
+ {
+ textArea.SelectionManager.selectFrom.where = WhereFrom.None;
+ gotmousedown = false;
+ mousedownpos = nilPoint;
+ }
+
+ void TextAreaClick(object sender, EventArgs e)
+ {
+ Point mousepos;
+ mousepos = textArea.mousepos;
+
+ if (dodragdrop)
+ {
+ return;
+ }
+
+ if (clickedOnSelectedText && textArea.TextView.DrawingPosition.Contains(mousepos.X, mousepos.Y))
+ {
+ textArea.SelectionManager.ClearSelection();
+
+ TextLocation clickPosition = textArea.TextView.GetLogicalPosition(
+ mousepos.X - textArea.TextView.DrawingPosition.X,
+ mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ textArea.Caret.Position = clickPosition;
+ textArea.SetDesiredColumn();
+ }
+ }
+
+
+ void TextAreaMouseMove(object sender, MouseEventArgs e)
+ {
+ textArea.mousepos = e.Location;
+
+ // honour the starting selection strategy
+ switch (textArea.SelectionManager.selectFrom.where)
+ {
+ case WhereFrom.Gutter:
+ ExtendSelectionToMouse();
+ return;
+
+ case WhereFrom.TArea:
+ break;
+
+ }
+ textArea.ShowHiddenCursor(false);
+ if (dodragdrop) {
+ dodragdrop = false;
+ return;
+ }
+
+ doubleclick = false;
+ textArea.mousepos = new Point(e.X, e.Y);
+
+ if (clickedOnSelectedText) {
+ if (Math.Abs(mousedownpos.X - e.X) >= SystemInformation.DragSize.Width / 2 ||
+ Math.Abs(mousedownpos.Y - e.Y) >= SystemInformation.DragSize.Height / 2)
+ {
+ clickedOnSelectedText = false;
+ ISelection selection = textArea.SelectionManager.GetSelectionAt(textArea.Caret.Offset);
+ if (selection != null) {
+ string text = selection.SelectedText;
+ bool isReadOnly = SelectionManager.SelectionIsReadOnly(textArea.Document, selection);
+ if (text != null && text.Length > 0) {
+ DataObject dataObject = new DataObject ();
+ dataObject.SetData(DataFormats.UnicodeText, true, text);
+ dataObject.SetData(selection);
+ dodragdrop = true;
+ textArea.DoDragDrop(dataObject, isReadOnly ? DragDropEffects.All & ~DragDropEffects.Move : DragDropEffects.All);
+ }
+ }
+ }
+
+ return;
+ }
+
+ if (e.Button == MouseButtons.Left) {
+ if (gotmousedown && textArea.SelectionManager.selectFrom.where == WhereFrom.TArea)
+ {
+ ExtendSelectionToMouse();
+ }
+ }
+ }
+
+ void ExtendSelectionToMouse()
+ {
+ Point mousepos;
+ mousepos = textArea.mousepos;
+ TextLocation realmousepos = textArea.TextView.GetLogicalPosition(
+ Math.Max(0, mousepos.X - textArea.TextView.DrawingPosition.X),
+ mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ int y = realmousepos.Y;
+ realmousepos = textArea.Caret.ValidatePosition(realmousepos);
+ TextLocation oldPos = textArea.Caret.Position;
+ if (oldPos == realmousepos && textArea.SelectionManager.selectFrom.where != WhereFrom.Gutter)
+ {
+ return;
+ }
+
+ // the selection is from the gutter
+ if (textArea.SelectionManager.selectFrom.where == WhereFrom.Gutter) {
+ if(realmousepos.Y < textArea.SelectionManager.SelectionStart.Y) {
+ // the selection has moved above the startpoint
+ textArea.Caret.Position = new TextLocation(0, realmousepos.Y);
+ } else {
+ // the selection has moved below the startpoint
+ textArea.Caret.Position = textArea.SelectionManager.NextValidPosition(realmousepos.Y);
+ }
+ } else {
+ textArea.Caret.Position = realmousepos;
+ }
+
+ // moves selection across whole words for double-click initiated selection
+ if (!minSelection.IsEmpty && textArea.SelectionManager.SelectionCollection.Count > 0 && textArea.SelectionManager.selectFrom.where == WhereFrom.TArea) {
+ // Extend selection when selection was started with double-click
+ ISelection selection = textArea.SelectionManager.SelectionCollection[0];
+ TextLocation min = textArea.SelectionManager.GreaterEqPos(minSelection, maxSelection) ? maxSelection : minSelection;
+ TextLocation max = textArea.SelectionManager.GreaterEqPos(minSelection, maxSelection) ? minSelection : maxSelection;
+ if (textArea.SelectionManager.GreaterEqPos(max, realmousepos) && textArea.SelectionManager.GreaterEqPos(realmousepos, min)) {
+ textArea.SelectionManager.SetSelection(min, max);
+ } else if (textArea.SelectionManager.GreaterEqPos(max, realmousepos)) {
+ int moff = textArea.Document.PositionToOffset(realmousepos);
+ min = textArea.Document.OffsetToPosition(FindWordStart(textArea.Document, moff));
+ textArea.SelectionManager.SetSelection(min, max);
+ } else {
+ int moff = textArea.Document.PositionToOffset(realmousepos);
+ max = textArea.Document.OffsetToPosition(FindWordEnd(textArea.Document, moff));
+ textArea.SelectionManager.SetSelection(min, max);
+ }
+ } else {
+ textArea.SelectionManager.ExtendSelection(oldPos, textArea.Caret.Position);
+ }
+ textArea.SetDesiredColumn();
+ }
+
+ void DoubleClickSelectionExtend()
+ {
+ Point mousepos;
+ mousepos = textArea.mousepos;
+
+ textArea.SelectionManager.ClearSelection();
+ if (textArea.TextView.DrawingPosition.Contains(mousepos.X, mousepos.Y))
+ {
+ FoldMarker marker = textArea.TextView.GetFoldMarkerFromPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
+ mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ if (marker != null && marker.IsFolded) {
+ marker.IsFolded = false;
+ textArea.MotherTextAreaControl.AdjustScrollBars();
+ }
+ if (textArea.Caret.Offset < textArea.Document.TextLength) {
+ switch (textArea.Document.GetCharAt(textArea.Caret.Offset)) {
+ case '"':
+ if (textArea.Caret.Offset < textArea.Document.TextLength) {
+ int next = FindNext(textArea.Document, textArea.Caret.Offset + 1, '"');
+ minSelection = textArea.Caret.Position;
+ if (next > textArea.Caret.Offset && next < textArea.Document.TextLength)
+ next += 1;
+ maxSelection = textArea.Document.OffsetToPosition(next);
+ }
+ break;
+ default:
+ minSelection = textArea.Document.OffsetToPosition(FindWordStart(textArea.Document, textArea.Caret.Offset));
+ maxSelection = textArea.Document.OffsetToPosition(FindWordEnd(textArea.Document, textArea.Caret.Offset));
+ break;
+
+ }
+ textArea.Caret.Position = maxSelection;
+ textArea.SelectionManager.ExtendSelection(minSelection, maxSelection);
+ }
+
+ if (textArea.SelectionManager.selectionCollection.Count > 0) {
+ ISelection selection = textArea.SelectionManager.selectionCollection[0];
+
+ selection.StartPosition = minSelection;
+ selection.EndPosition = maxSelection;
+ textArea.SelectionManager.SelectionStart = minSelection;
+ }
+
+ // after a double-click selection, the caret is placed correctly,
+ // but it is not positioned internally. The effect is when the cursor
+ // is moved up or down a line, the caret will take on the column first
+ // clicked on for the double-click
+ textArea.SetDesiredColumn();
+
+ // HACK WARNING !!!
+ // must refresh here, because when a error tooltip is showed and the underlined
+ // code is double clicked the textArea don't update corrctly, updateline doesn't
+ // work ... but the refresh does.
+ // Mike
+ textArea.Refresh();
+ }
+ }
+
+ void OnMouseDown(object sender, MouseEventArgs e)
+ {
+ Point mousepos;
+ textArea.mousepos = e.Location;
+ mousepos = e.Location;
+
+ if (dodragdrop)
+ {
+ return;
+ }
+
+ if (doubleclick) {
+ doubleclick = false;
+ return;
+ }
+
+ if (textArea.TextView.DrawingPosition.Contains(mousepos.X, mousepos.Y)) {
+ gotmousedown = true;
+ textArea.SelectionManager.selectFrom.where = WhereFrom.TArea;
+ button = e.Button;
+
+ // double-click
+ if (button == MouseButtons.Left && e.Clicks == 2) {
+ int deltaX = Math.Abs(lastmousedownpos.X - e.X);
+ int deltaY = Math.Abs(lastmousedownpos.Y - e.Y);
+ if (deltaX <= SystemInformation.DoubleClickSize.Width &&
+ deltaY <= SystemInformation.DoubleClickSize.Height) {
+ DoubleClickSelectionExtend();
+ lastmousedownpos = new Point(e.X, e.Y);
+
+ if (textArea.SelectionManager.selectFrom.where == WhereFrom.Gutter) {
+ if (!minSelection.IsEmpty && !maxSelection.IsEmpty && textArea.SelectionManager.SelectionCollection.Count > 0) {
+ textArea.SelectionManager.SelectionCollection[0].StartPosition = minSelection;
+ textArea.SelectionManager.SelectionCollection[0].EndPosition = maxSelection;
+ textArea.SelectionManager.SelectionStart = minSelection;
+
+ minSelection = TextLocation.Empty;
+ maxSelection = TextLocation.Empty;
+ }
+ }
+ return;
+ }
+ }
+ minSelection = TextLocation.Empty;
+ maxSelection = TextLocation.Empty;
+
+ lastmousedownpos = mousedownpos = new Point(e.X, e.Y);
+
+ if (button == MouseButtons.Left) {
+ FoldMarker marker = textArea.TextView.GetFoldMarkerFromPosition(mousepos.X - textArea.TextView.DrawingPosition.X,
+ mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ if (marker != null && marker.IsFolded) {
+ if (textArea.SelectionManager.HasSomethingSelected) {
+ clickedOnSelectedText = true;
+ }
+
+ TextLocation startLocation = new TextLocation(marker.StartColumn, marker.StartLine);
+ TextLocation endLocation = new TextLocation(marker.EndColumn, marker.EndLine);
+ textArea.SelectionManager.SetSelection(new DefaultSelection(textArea.TextView.Document, startLocation, endLocation));
+ textArea.Caret.Position = startLocation;
+ textArea.SetDesiredColumn();
+ textArea.Focus();
+ return;
+ }
+
+ if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift) {
+ ExtendSelectionToMouse();
+ } else {
+ TextLocation realmousepos = textArea.TextView.GetLogicalPosition(mousepos.X - textArea.TextView.DrawingPosition.X, mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ clickedOnSelectedText = false;
+
+ int offset = textArea.Document.PositionToOffset(realmousepos);
+
+ if (textArea.SelectionManager.HasSomethingSelected &&
+ textArea.SelectionManager.IsSelected(offset)) {
+ clickedOnSelectedText = true;
+ } else {
+ textArea.SelectionManager.ClearSelection();
+ if (mousepos.Y > 0 && mousepos.Y < textArea.TextView.DrawingPosition.Height) {
+ TextLocation pos = new TextLocation();
+ pos.Y = Math.Min(textArea.Document.TotalNumberOfLines - 1, realmousepos.Y);
+ pos.X = realmousepos.X;
+ textArea.Caret.Position = pos;
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+ } else if (button == MouseButtons.Right) {
+ // Rightclick sets the cursor to the click position unless
+ // the previous selection was clicked
+ TextLocation realmousepos = textArea.TextView.GetLogicalPosition(mousepos.X - textArea.TextView.DrawingPosition.X, mousepos.Y - textArea.TextView.DrawingPosition.Y);
+ int offset = textArea.Document.PositionToOffset(realmousepos);
+ if (!textArea.SelectionManager.HasSomethingSelected ||
+ !textArea.SelectionManager.IsSelected(offset))
+ {
+ textArea.SelectionManager.ClearSelection();
+ if (mousepos.Y > 0 && mousepos.Y < textArea.TextView.DrawingPosition.Height) {
+ TextLocation pos = new TextLocation();
+ pos.Y = Math.Min(textArea.Document.TotalNumberOfLines - 1, realmousepos.Y);
+ pos.X = realmousepos.X;
+ textArea.Caret.Position = pos;
+ textArea.SetDesiredColumn();
+ }
+ }
+ }
+ }
+ textArea.Focus();
+ }
+
+ int FindNext(IDocument document, int offset, char ch)
+ {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ int endPos = line.Offset + line.Length;
+
+ while (offset < endPos && document.GetCharAt(offset) != ch) {
+ ++offset;
+ }
+ return offset;
+ }
+
+ bool IsSelectableChar(char ch)
+ {
+ return Char.IsLetterOrDigit(ch) || ch=='_';
+ }
+
+ int FindWordStart(IDocument document, int offset)
+ {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+
+ if (offset > 0 && Char.IsWhiteSpace(document.GetCharAt(offset - 1)) && Char.IsWhiteSpace(document.GetCharAt(offset))) {
+ while (offset > line.Offset && Char.IsWhiteSpace(document.GetCharAt(offset - 1))) {
+ --offset;
+ }
+ } else if (IsSelectableChar(document.GetCharAt(offset)) || (offset > 0 && Char.IsWhiteSpace(document.GetCharAt(offset)) && IsSelectableChar(document.GetCharAt(offset - 1)))) {
+ while (offset > line.Offset && IsSelectableChar(document.GetCharAt(offset - 1))) {
+ --offset;
+ }
+ } else {
+ if (offset > 0 && !Char.IsWhiteSpace(document.GetCharAt(offset - 1)) && !IsSelectableChar(document.GetCharAt(offset - 1)) ) {
+ return Math.Max(0, offset - 1);
+ }
+ }
+ return offset;
+ }
+
+ int FindWordEnd(IDocument document, int offset)
+ {
+ LineSegment line = document.GetLineSegmentForOffset(offset);
+ if (line.Length == 0)
+ return offset;
+ int endPos = line.Offset + line.Length;
+ offset = Math.Min(offset, endPos - 1);
+
+ if (IsSelectableChar(document.GetCharAt(offset))) {
+ while (offset < endPos && IsSelectableChar(document.GetCharAt(offset))) {
+ ++offset;
+ }
+ } else if (Char.IsWhiteSpace(document.GetCharAt(offset))) {
+ if (offset > 0 && Char.IsWhiteSpace(document.GetCharAt(offset - 1))) {
+ while (offset < endPos && Char.IsWhiteSpace(document.GetCharAt(offset))) {
+ ++offset;
+ }
+ }
+ } else {
+ return Math.Max(0, offset + 1);
+ }
+
+ return offset;
+ }
+ TextLocation minSelection = TextLocation.Empty;
+ TextLocation maxSelection = TextLocation.Empty;
+
+ void OnDoubleClick(object sender, System.EventArgs e)
+ {
+ if (dodragdrop) {
+ return;
+ }
+
+ textArea.SelectionManager.selectFrom.where = WhereFrom.TArea;
+ doubleclick = true;
+
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaUpdate.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaUpdate.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextAreaUpdate.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,85 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This enum describes all implemented request types
+ /// </summary>
+ public enum TextAreaUpdateType {
+ WholeTextArea,
+ SingleLine,
+ SinglePosition,
+ PositionToLineEnd,
+ PositionToEnd,
+ LinesBetween
+ }
+
+ /// <summary>
+ /// This class is used to request an update of the textarea
+ /// </summary>
+ public class TextAreaUpdate
+ {
+ TextLocation position;
+ TextAreaUpdateType type;
+
+ public TextAreaUpdateType TextAreaUpdateType {
+ get {
+ return type;
+ }
+ }
+
+ public TextLocation Position {
+ get {
+ return position;
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="TextAreaUpdate"/>
+ /// </summary>
+ public TextAreaUpdate(TextAreaUpdateType type)
+ {
+ this.type = type;
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="TextAreaUpdate"/>
+ /// </summary>
+ public TextAreaUpdate(TextAreaUpdateType type, TextLocation position)
+ {
+ this.type = type;
+ this.position = position;
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="TextAreaUpdate"/>
+ /// </summary>
+ public TextAreaUpdate(TextAreaUpdateType type, int startLine, int endLine)
+ {
+ this.type = type;
+ this.position = new TextLocation(startLine, endLine);
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="TextAreaUpdate"/>
+ /// </summary>
+ public TextAreaUpdate(TextAreaUpdateType type, int singleLine)
+ {
+ this.type = type;
+ this.position = new TextLocation(0, singleLine);
+ }
+
+ public override string ToString()
+ {
+ return String.Format("[TextAreaUpdate: Type={0}, Position={1}]", type, position);
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControl.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControl.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControl.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,396 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Printing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class is used for a basic text area control
+ /// </summary>
+ [ToolboxBitmap("ICSharpCode.TextEditor.Resources.TextEditorControl.bmp")]
+ [ToolboxItem(true)]
+ public class TextEditorControl : TextEditorControlBase
+ {
+ protected Panel textAreaPanel = new Panel();
+ TextAreaControl primaryTextArea;
+ Splitter textAreaSplitter = null;
+ TextAreaControl secondaryTextArea = null;
+
+ PrintDocument printDocument = null;
+
+ [Browsable(false)]
+ public PrintDocument PrintDocument {
+ get {
+ if (printDocument == null) {
+ printDocument = new PrintDocument();
+ printDocument.BeginPrint += new PrintEventHandler(this.BeginPrint);
+ printDocument.PrintPage += new PrintPageEventHandler(this.PrintPage);
+ }
+ return printDocument;
+ }
+ }
+
+ TextAreaControl activeTextAreaControl;
+
+ public override TextAreaControl ActiveTextAreaControl {
+ get {
+ return activeTextAreaControl;
+ }
+ }
+
+ protected void SetActiveTextAreaControl(TextAreaControl value)
+ {
+ if (activeTextAreaControl != value) {
+ activeTextAreaControl = value;
+
+ if (ActiveTextAreaControlChanged != null) {
+ ActiveTextAreaControlChanged(this, EventArgs.Empty);
+ }
+ }
+ }
+
+ public event EventHandler ActiveTextAreaControlChanged;
+
+ public TextEditorControl()
+ {
+ SetStyle(ControlStyles.ContainerControl, true);
+
+ textAreaPanel.Dock = DockStyle.Fill;
+
+ Document = (new DocumentFactory()).CreateDocument();
+ Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategy();
+
+ primaryTextArea = new TextAreaControl(this);
+ activeTextAreaControl = primaryTextArea;
+ primaryTextArea.TextArea.GotFocus += delegate {
+ SetActiveTextAreaControl(primaryTextArea);
+ };
+ primaryTextArea.Dock = DockStyle.Fill;
+ textAreaPanel.Controls.Add(primaryTextArea);
+ InitializeTextAreaControl(primaryTextArea);
+ Controls.Add(textAreaPanel);
+ ResizeRedraw = true;
+ Document.UpdateCommited += new EventHandler(CommitUpdateRequested);
+ OptionsChanged();
+ }
+
+ protected virtual void InitializeTextAreaControl(TextAreaControl newControl)
+ {
+ }
+
+ public override void OptionsChanged()
+ {
+ primaryTextArea.OptionsChanged();
+ if (secondaryTextArea != null) {
+ secondaryTextArea.OptionsChanged();
+ }
+ }
+
+ public void Split()
+ {
+ if (secondaryTextArea == null) {
+ secondaryTextArea = new TextAreaControl(this);
+ secondaryTextArea.Dock = DockStyle.Bottom;
+ secondaryTextArea.Height = Height / 2;
+
+ secondaryTextArea.TextArea.GotFocus += delegate {
+ SetActiveTextAreaControl(secondaryTextArea);
+ };
+
+ textAreaSplitter = new Splitter();
+ textAreaSplitter.BorderStyle = BorderStyle.FixedSingle ;
+ textAreaSplitter.Height = 8;
+ textAreaSplitter.Dock = DockStyle.Bottom;
+ textAreaPanel.Controls.Add(textAreaSplitter);
+ textAreaPanel.Controls.Add(secondaryTextArea);
+ InitializeTextAreaControl(secondaryTextArea);
+ secondaryTextArea.OptionsChanged();
+ } else {
+ SetActiveTextAreaControl(primaryTextArea);
+
+ textAreaPanel.Controls.Remove(secondaryTextArea);
+ textAreaPanel.Controls.Remove(textAreaSplitter);
+
+ secondaryTextArea.Dispose();
+ textAreaSplitter.Dispose();
+ secondaryTextArea = null;
+ textAreaSplitter = null;
+ }
+ }
+
+ [Browsable(false)]
+ public bool EnableUndo {
+ get {
+ return Document.UndoStack.CanUndo;
+ }
+ }
+
+ [Browsable(false)]
+ public bool EnableRedo {
+ get {
+ return Document.UndoStack.CanRedo;
+ }
+ }
+
+ public void Undo()
+ {
+ if (Document.ReadOnly) {
+ return;
+ }
+ if (Document.UndoStack.CanUndo) {
+ BeginUpdate();
+ Document.UndoStack.Undo();
+
+ Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ this.primaryTextArea.TextArea.UpdateMatchingBracket();
+ if (secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateMatchingBracket();
+ }
+ EndUpdate();
+ }
+ }
+
+ public void Redo()
+ {
+ if (Document.ReadOnly) {
+ return;
+ }
+ if (Document.UndoStack.CanRedo) {
+ BeginUpdate();
+ Document.UndoStack.Redo();
+
+ Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.WholeTextArea));
+ this.primaryTextArea.TextArea.UpdateMatchingBracket();
+ if (secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateMatchingBracket();
+ }
+ EndUpdate();
+ }
+ }
+
+ public virtual void SetHighlighting(string name)
+ {
+ Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategy(name);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing) {
+ if (printDocument != null) {
+ printDocument.BeginPrint -= new PrintEventHandler(this.BeginPrint);
+ printDocument.PrintPage -= new PrintPageEventHandler(this.PrintPage);
+ printDocument = null;
+ }
+ Document.UndoStack.ClearAll();
+ Document.UpdateCommited -= new EventHandler(CommitUpdateRequested);
+ if (textAreaPanel != null) {
+ if (secondaryTextArea != null) {
+ secondaryTextArea.Dispose();
+ textAreaSplitter.Dispose();
+ secondaryTextArea = null;
+ textAreaSplitter = null;
+ }
+ if (primaryTextArea != null) {
+ primaryTextArea.Dispose();
+ }
+ textAreaPanel.Dispose();
+ textAreaPanel = null;
+ }
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Update Methods
+ public override void EndUpdate()
+ {
+ base.EndUpdate();
+ Document.CommitUpdate();
+ if (!IsInUpdate) {
+ ActiveTextAreaControl.Caret.OnEndUpdate();
+ }
+ }
+
+ void CommitUpdateRequested(object sender, EventArgs e)
+ {
+ if (IsInUpdate) {
+ return;
+ }
+ foreach (TextAreaUpdate update in Document.UpdateQueue) {
+ switch (update.TextAreaUpdateType) {
+ case TextAreaUpdateType.PositionToEnd:
+ this.primaryTextArea.TextArea.UpdateToEnd(update.Position.Y);
+ if (this.secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateToEnd(update.Position.Y);
+ }
+ break;
+ case TextAreaUpdateType.PositionToLineEnd:
+ case TextAreaUpdateType.SingleLine:
+ this.primaryTextArea.TextArea.UpdateLine(update.Position.Y);
+ if (this.secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateLine(update.Position.Y);
+ }
+ break;
+ case TextAreaUpdateType.SinglePosition:
+ this.primaryTextArea.TextArea.UpdateLine(update.Position.Y, update.Position.X, update.Position.X);
+ if (this.secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateLine(update.Position.Y, update.Position.X, update.Position.X);
+ }
+ break;
+ case TextAreaUpdateType.LinesBetween:
+ this.primaryTextArea.TextArea.UpdateLines(update.Position.X, update.Position.Y);
+ if (this.secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.UpdateLines(update.Position.X, update.Position.Y);
+ }
+ break;
+ case TextAreaUpdateType.WholeTextArea:
+ this.primaryTextArea.TextArea.Invalidate();
+ if (this.secondaryTextArea != null) {
+ this.secondaryTextArea.TextArea.Invalidate();
+ }
+ break;
+ }
+ }
+ Document.UpdateQueue.Clear();
+// this.primaryTextArea.TextArea.Update();
+// if (this.secondaryTextArea != null) {
+// this.secondaryTextArea.TextArea.Update();
+// }
+ }
+ #endregion
+
+ #region Printing routines
+ int curLineNr = 0;
+ float curTabIndent = 0;
+ StringFormat printingStringFormat;
+
+ void BeginPrint(object sender, PrintEventArgs ev)
+ {
+ curLineNr = 0;
+ printingStringFormat = (StringFormat)System.Drawing.StringFormat.GenericTypographic.Clone();
+
+ // 100 should be enough for everyone ...err ?
+ float[] tabStops = new float[100];
+ for (int i = 0; i < tabStops.Length; ++i) {
+ tabStops[i] = TabIndent * primaryTextArea.TextArea.TextView.WideSpaceWidth;
+ }
+
+ printingStringFormat.SetTabStops(0, tabStops);
+ }
+
+ void Advance(ref float x, ref float y, float maxWidth, float size, float fontHeight)
+ {
+ if (x + size < maxWidth) {
+ x += size;
+ } else {
+ x = curTabIndent;
+ y += fontHeight;
+ }
+ }
+
+ // btw. I hate source code duplication ... but this time I don't care !!!!
+ float MeasurePrintingHeight(Graphics g, LineSegment line, float maxWidth)
+ {
+ float xPos = 0;
+ float yPos = 0;
+ float fontHeight = Font.GetHeight(g);
+// bool gotNonWhitespace = false;
+ curTabIndent = 0;
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+ foreach (TextWord word in line.Words) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ Advance(ref xPos, ref yPos, maxWidth, primaryTextArea.TextArea.TextView.SpaceWidth, fontHeight);
+// if (!gotNonWhitespace) {
+// curTabIndent = xPos;
+// }
+ break;
+ case TextWordType.Tab:
+ Advance(ref xPos, ref yPos, maxWidth, TabIndent * primaryTextArea.TextArea.TextView.WideSpaceWidth, fontHeight);
+// if (!gotNonWhitespace) {
+// curTabIndent = xPos;
+// }
+ break;
+ case TextWordType.Word:
+// if (!gotNonWhitespace) {
+// gotNonWhitespace = true;
+// curTabIndent += TabIndent * primaryTextArea.TextArea.TextView.GetWidth(' ');
+// }
+ SizeF drawingSize = g.MeasureString(word.Word, word.GetFont(fontContainer), new SizeF(maxWidth, fontHeight * 100), printingStringFormat);
+ Advance(ref xPos, ref yPos, maxWidth, drawingSize.Width, fontHeight);
+ break;
+ }
+ }
+ return yPos + fontHeight;
+ }
+
+ void DrawLine(Graphics g, LineSegment line, float yPos, RectangleF margin)
+ {
+ float xPos = 0;
+ float fontHeight = Font.GetHeight(g);
+// bool gotNonWhitespace = false;
+ curTabIndent = 0 ;
+
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+ foreach (TextWord word in line.Words) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ Advance(ref xPos, ref yPos, margin.Width, primaryTextArea.TextArea.TextView.SpaceWidth, fontHeight);
+// if (!gotNonWhitespace) {
+// curTabIndent = xPos;
+// }
+ break;
+ case TextWordType.Tab:
+ Advance(ref xPos, ref yPos, margin.Width, TabIndent * primaryTextArea.TextArea.TextView.WideSpaceWidth, fontHeight);
+// if (!gotNonWhitespace) {
+// curTabIndent = xPos;
+// }
+ break;
+ case TextWordType.Word:
+// if (!gotNonWhitespace) {
+// gotNonWhitespace = true;
+// curTabIndent += TabIndent * primaryTextArea.TextArea.TextView.GetWidth(' ');
+// }
+ g.DrawString(word.Word, word.GetFont(fontContainer), BrushRegistry.GetBrush(word.Color), xPos + margin.X, yPos);
+ SizeF drawingSize = g.MeasureString(word.Word, word.GetFont(fontContainer), new SizeF(margin.Width, fontHeight * 100), printingStringFormat);
+ Advance(ref xPos, ref yPos, margin.Width, drawingSize.Width, fontHeight);
+ break;
+ }
+ }
+ }
+
+ void PrintPage(object sender, PrintPageEventArgs ev)
+ {
+ Graphics g = ev.Graphics;
+ float yPos = ev.MarginBounds.Top;
+
+ while (curLineNr < Document.TotalNumberOfLines) {
+ LineSegment curLine = Document.GetLineSegment(curLineNr);
+ if (curLine.Words != null) {
+ float drawingHeight = MeasurePrintingHeight(g, curLine, ev.MarginBounds.Width);
+ if (drawingHeight + yPos > ev.MarginBounds.Bottom) {
+ break;
+ }
+
+ DrawLine(g, curLine, yPos, ev.MarginBounds);
+ yPos += drawingHeight;
+ }
+ ++curLineNr;
+ }
+
+ // If more lines exist, print another page.
+ ev.HasMorePages = curLineNr < Document.TotalNumberOfLines;
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControlBase.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControlBase.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextEditorControlBase.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,758 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Drawing;
+using System.Drawing.Text;
+using System.IO;
+using System.Text;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Actions;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class is used for a basic text area control
+ /// </summary>
+ [ToolboxItem(false)]
+ public abstract class TextEditorControlBase : UserControl
+ {
+ string currentFileName = null;
+ int updateLevel = 0;
+ IDocument document;
+
+ /// <summary>
+ /// This hashtable contains all editor keys, where
+ /// the key is the key combination and the value the
+ /// action.
+ /// </summary>
+ protected Dictionary<Keys, IEditAction> editactions = new Dictionary<Keys, IEditAction>();
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public ITextEditorProperties TextEditorProperties {
+ get {
+ return document.TextEditorProperties;
+ }
+ set {
+ document.TextEditorProperties = value;
+ OptionsChanged();
+ }
+ }
+
+ Encoding encoding;
+
+ /// <value>
+ /// Current file's character encoding
+ /// </value>
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public Encoding Encoding {
+ get {
+ if (encoding == null)
+ return TextEditorProperties.Encoding;
+ return encoding;
+ }
+ set {
+ encoding = value;
+ }
+ }
+
+ /// <value>
+ /// The current file name
+ /// </value>
+ [Browsable(false)]
+ [ReadOnly(true)]
+ public string FileName {
+ get {
+ return currentFileName;
+ }
+ set {
+ if (currentFileName != value) {
+ currentFileName = value;
+ OnFileNameChanged(EventArgs.Empty);
+ }
+ }
+ }
+
+ /// <value>
+ /// The current document
+ /// </value>
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public IDocument Document {
+ get {
+ return document;
+ }
+ set {
+ if (value == null)
+ throw new ArgumentNullException("value");
+ if (document != null) {
+ document.DocumentChanged -= OnDocumentChanged;
+ }
+ document = value;
+ document.UndoStack.TextEditorControl = this;
+ document.DocumentChanged += OnDocumentChanged;
+ }
+ }
+
+ void OnDocumentChanged(object sender, EventArgs e)
+ {
+ OnTextChanged(e);
+ }
+
+ [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+ [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))]
+ public override string Text {
+ get {
+ return Document.TextContent;
+ }
+ set {
+ Document.TextContent = value;
+ }
+ }
+
+ [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
+ public new event EventHandler TextChanged
+ {
+ add { base.TextChanged += value; }
+ remove { base.TextChanged -= value; }
+ }
+
+ static Font ParseFont(string font)
+ {
+ string[] descr = font.Split(new char[]{',', '='});
+ return new Font(descr[1], Single.Parse(descr[3]));
+ }
+
+ /// <value>
+ /// If set to true the contents can't be altered.
+ /// </value>
+ [Browsable(false)]
+ public bool IsReadOnly {
+ get {
+ return Document.ReadOnly;
+ }
+ set {
+ Document.ReadOnly = value;
+ }
+ }
+
+ /// <value>
+ /// true, if the textarea is updating it's status, while
+ /// it updates it status no redraw operation occurs.
+ /// </value>
+ [Browsable(false)]
+ public bool IsInUpdate {
+ get {
+ return updateLevel > 0;
+ }
+ }
+
+ /// <value>
+ /// supposedly this is the way to do it according to .NET docs,
+ /// as opposed to setting the size in the constructor
+ /// </value>
+ protected override Size DefaultSize {
+ get {
+ return new Size(100, 100);
+ }
+ }
+
+ #region Document Properties
+ /// <value>
+ /// If true spaces are shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true spaces are shown in the textarea")]
+ public bool ShowSpaces {
+ get {
+ return document.TextEditorProperties.ShowSpaces;
+ }
+ set {
+ document.TextEditorProperties.ShowSpaces = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// Specifies the quality of text rendering (whether to use hinting and/or anti-aliasing).
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(TextRenderingHint.SystemDefault)]
+ [Description("Specifies the quality of text rendering (whether to use hinting and/or anti-aliasing).")]
+ public TextRenderingHint TextRenderingHint {
+ get {
+ return document.TextEditorProperties.TextRenderingHint;
+ }
+ set {
+ document.TextEditorProperties.TextRenderingHint = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true tabs are shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true tabs are shown in the textarea")]
+ public bool ShowTabs {
+ get {
+ return document.TextEditorProperties.ShowTabs;
+ }
+ set {
+ document.TextEditorProperties.ShowTabs = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true EOL markers are shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true EOL markers are shown in the textarea")]
+ public bool ShowEOLMarkers {
+ get {
+ return document.TextEditorProperties.ShowEOLMarker;
+ }
+ set {
+ document.TextEditorProperties.ShowEOLMarker = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true the horizontal ruler is shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true the horizontal ruler is shown in the textarea")]
+ public bool ShowHRuler {
+ get {
+ return document.TextEditorProperties.ShowHorizontalRuler;
+ }
+ set {
+ document.TextEditorProperties.ShowHorizontalRuler = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true the vertical ruler is shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(true)]
+ [Description("If true the vertical ruler is shown in the textarea")]
+ public bool ShowVRuler {
+ get {
+ return document.TextEditorProperties.ShowVerticalRuler;
+ }
+ set {
+ document.TextEditorProperties.ShowVerticalRuler = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// The row in which the vertical ruler is displayed
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(80)]
+ [Description("The row in which the vertical ruler is displayed")]
+ public int VRulerRow {
+ get {
+ return document.TextEditorProperties.VerticalRulerRow;
+ }
+ set {
+ document.TextEditorProperties.VerticalRulerRow = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true line numbers are shown in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(true)]
+ [Description("If true line numbers are shown in the textarea")]
+ public bool ShowLineNumbers {
+ get {
+ return document.TextEditorProperties.ShowLineNumbers;
+ }
+ set {
+ document.TextEditorProperties.ShowLineNumbers = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true invalid lines are marked in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true invalid lines are marked in the textarea")]
+ public bool ShowInvalidLines {
+ get {
+ return document.TextEditorProperties.ShowInvalidLines;
+ }
+ set {
+ document.TextEditorProperties.ShowInvalidLines = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// If true folding is enabled in the textarea
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(true)]
+ [Description("If true folding is enabled in the textarea")]
+ public bool EnableFolding {
+ get {
+ return document.TextEditorProperties.EnableFolding;
+ }
+ set {
+ document.TextEditorProperties.EnableFolding = value;
+ OptionsChanged();
+ }
+ }
+
+ [Category("Appearance")]
+ [DefaultValue(true)]
+ [Description("If true matching brackets are highlighted")]
+ public bool ShowMatchingBracket {
+ get {
+ return document.TextEditorProperties.ShowMatchingBracket;
+ }
+ set {
+ document.TextEditorProperties.ShowMatchingBracket = value;
+ OptionsChanged();
+ }
+ }
+
+ [Category("Appearance")]
+ [DefaultValue(false)]
+ [Description("If true the icon bar is displayed")]
+ public bool IsIconBarVisible {
+ get {
+ return document.TextEditorProperties.IsIconBarVisible;
+ }
+ set {
+ document.TextEditorProperties.IsIconBarVisible = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// The width in spaces of a tab character
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(4)]
+ [Description("The width in spaces of a tab character")]
+ public int TabIndent {
+ get {
+ return document.TextEditorProperties.TabIndent;
+ }
+ set {
+ document.TextEditorProperties.TabIndent = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// The line viewer style
+ /// </value>
+ [Category("Appearance")]
+ [DefaultValue(LineViewerStyle.None)]
+ [Description("The line viewer style")]
+ public LineViewerStyle LineViewerStyle {
+ get {
+ return document.TextEditorProperties.LineViewerStyle;
+ }
+ set {
+ document.TextEditorProperties.LineViewerStyle = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// The indent style
+ /// </value>
+ [Category("Behavior")]
+ [DefaultValue(IndentStyle.Smart)]
+ [Description("The indent style")]
+ public IndentStyle IndentStyle {
+ get {
+ return document.TextEditorProperties.IndentStyle;
+ }
+ set {
+ document.TextEditorProperties.IndentStyle = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// if true spaces are converted to tabs
+ /// </value>
+ [Category("Behavior")]
+ [DefaultValue(false)]
+ [Description("Converts tabs to spaces while typing")]
+ public bool ConvertTabsToSpaces {
+ get {
+ return document.TextEditorProperties.ConvertTabsToSpaces;
+ }
+ set {
+ document.TextEditorProperties.ConvertTabsToSpaces = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// if true spaces are converted to tabs
+ /// </value>
+ [Category("Behavior")]
+ [DefaultValue(false)]
+ [Description("Hide the mouse cursor while typing")]
+ public bool HideMouseCursor {
+ get {
+ return document.TextEditorProperties.HideMouseCursor;
+ }
+ set {
+ document.TextEditorProperties.HideMouseCursor = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// if true spaces are converted to tabs
+ /// </value>
+ [Category("Behavior")]
+ [DefaultValue(false)]
+ [Description("Allows the caret to be placed beyond the end of line")]
+ public bool AllowCaretBeyondEOL {
+ get {
+ return document.TextEditorProperties.AllowCaretBeyondEOL;
+ }
+ set {
+ document.TextEditorProperties.AllowCaretBeyondEOL = value;
+ OptionsChanged();
+ }
+ }
+ /// <value>
+ /// if true spaces are converted to tabs
+ /// </value>
+ [Category("Behavior")]
+ [DefaultValue(BracketMatchingStyle.After)]
+ [Description("Specifies if the bracket matching should match the bracket before or after the caret.")]
+ public BracketMatchingStyle BracketMatchingStyle {
+ get {
+ return document.TextEditorProperties.BracketMatchingStyle;
+ }
+ set {
+ document.TextEditorProperties.BracketMatchingStyle = value;
+ OptionsChanged();
+ }
+ }
+
+ /// <value>
+ /// The base font of the text area. No bold or italic fonts
+ /// can be used because bold/italic is reserved for highlighting
+ /// purposes.
+ /// </value>
+ [Browsable(true)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+ [Description("The base font of the text area. No bold or italic fonts can be used because bold/italic is reserved for highlighting purposes.")]
+ public override Font Font {
+ get {
+ return document.TextEditorProperties.Font;
+ }
+ set {
+ document.TextEditorProperties.Font = value;
+ OptionsChanged();
+ }
+ }
+
+ #endregion
+ public abstract TextAreaControl ActiveTextAreaControl {
+ get;
+ }
+
+ protected TextEditorControlBase()
+ {
+ GenerateDefaultActions();
+ HighlightingManager.Manager.ReloadSyntaxHighlighting += new EventHandler(OnReloadHighlighting);
+ }
+
+ protected virtual void OnReloadHighlighting(object sender, EventArgs e)
+ {
+ if (Document.HighlightingStrategy != null) {
+ try {
+ Document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategy(Document.HighlightingStrategy.Name);
+ } catch (HighlightingDefinitionInvalidException ex) {
+ MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ OptionsChanged();
+ }
+ }
+
+ public bool IsEditAction(Keys keyData)
+ {
+ return editactions.ContainsKey(keyData);
+ }
+
+ internal IEditAction GetEditAction(Keys keyData)
+ {
+ if (!IsEditAction(keyData)) {
+ return null;
+ }
+ return (IEditAction)editactions[keyData];
+ }
+
+ void GenerateDefaultActions()
+ {
+ editactions[Keys.Left] = new CaretLeft();
+ editactions[Keys.Left | Keys.Shift] = new ShiftCaretLeft();
+ editactions[Keys.Left | Keys.Control] = new WordLeft();
+ editactions[Keys.Left | Keys.Control | Keys.Shift] = new ShiftWordLeft();
+ editactions[Keys.Right] = new CaretRight();
+ editactions[Keys.Right | Keys.Shift] = new ShiftCaretRight();
+ editactions[Keys.Right | Keys.Control] = new WordRight();
+ editactions[Keys.Right | Keys.Control | Keys.Shift] = new ShiftWordRight();
+ editactions[Keys.Up] = new CaretUp();
+ editactions[Keys.Up | Keys.Shift] = new ShiftCaretUp();
+ editactions[Keys.Up | Keys.Control] = new ScrollLineUp();
+ editactions[Keys.Down] = new CaretDown();
+ editactions[Keys.Down | Keys.Shift] = new ShiftCaretDown();
+ editactions[Keys.Down | Keys.Control] = new ScrollLineDown();
+
+ editactions[Keys.Insert] = new ToggleEditMode();
+ editactions[Keys.Insert | Keys.Control] = new Copy();
+ editactions[Keys.Insert | Keys.Shift] = new Paste();
+ editactions[Keys.Delete] = new Delete();
+ editactions[Keys.Delete | Keys.Shift] = new Cut();
+ editactions[Keys.Home] = new Home();
+ editactions[Keys.Home | Keys.Shift] = new ShiftHome();
+ editactions[Keys.Home | Keys.Control] = new MoveToStart();
+ editactions[Keys.Home | Keys.Control | Keys.Shift] = new ShiftMoveToStart();
+ editactions[Keys.End] = new End();
+ editactions[Keys.End | Keys.Shift] = new ShiftEnd();
+ editactions[Keys.End | Keys.Control] = new MoveToEnd();
+ editactions[Keys.End | Keys.Control | Keys.Shift] = new ShiftMoveToEnd();
+ editactions[Keys.PageUp] = new MovePageUp();
+ editactions[Keys.PageUp | Keys.Shift] = new ShiftMovePageUp();
+ editactions[Keys.PageDown] = new MovePageDown();
+ editactions[Keys.PageDown | Keys.Shift] = new ShiftMovePageDown();
+
+ editactions[Keys.Return] = new Return();
+ editactions[Keys.Tab] = new Tab();
+ editactions[Keys.Tab | Keys.Shift] = new ShiftTab();
+ editactions[Keys.Back] = new Backspace();
+ editactions[Keys.Back | Keys.Shift] = new Backspace();
+
+ editactions[Keys.X | Keys.Control] = new Cut();
+ editactions[Keys.C | Keys.Control] = new Copy();
+ editactions[Keys.V | Keys.Control] = new Paste();
+
+ editactions[Keys.A | Keys.Control] = new SelectWholeDocument();
+ editactions[Keys.Escape] = new ClearAllSelections();
+
+ editactions[Keys.Divide | Keys.Control] = new ToggleComment();
+ editactions[Keys.OemQuestion | Keys.Control] = new ToggleComment();
+
+ editactions[Keys.Back | Keys.Alt] = new Actions.Undo();
+ editactions[Keys.Z | Keys.Control] = new Actions.Undo();
+ editactions[Keys.Y | Keys.Control] = new Redo();
+
+ editactions[Keys.Delete | Keys.Control] = new DeleteWord();
+ editactions[Keys.Back | Keys.Control] = new WordBackspace();
+ editactions[Keys.D | Keys.Control] = new DeleteLine();
+ editactions[Keys.D | Keys.Shift | Keys.Control] = new DeleteToLineEnd();
+
+ editactions[Keys.B | Keys.Control] = new GotoMatchingBrace();
+ }
+
+ /// <remarks>
+ /// Call this method before a long update operation this
+ /// 'locks' the text area so that no screen update occurs.
+ /// </remarks>
+ public virtual void BeginUpdate()
+ {
+ ++updateLevel;
+ }
+
+ /// <remarks>
+ /// Call this method to 'unlock' the text area. After this call
+ /// screen update can occur. But no automatical refresh occurs you
+ /// have to commit the updates in the queue.
+ /// </remarks>
+ public virtual void EndUpdate()
+ {
+ Debug.Assert(updateLevel > 0);
+ updateLevel = Math.Max(0, updateLevel - 1);
+ }
+
+ public void LoadFile(string fileName)
+ {
+ LoadFile(fileName, true, true);
+ }
+
+ /// <remarks>
+ /// Loads a file given by fileName
+ /// </remarks>
+ /// <param name="fileName">The name of the file to open</param>
+ /// <param name="autoLoadHighlighting">Automatically load the highlighting for the file</param>
+ /// <param name="autodetectEncoding">Automatically detect file encoding and set Encoding property to the detected encoding.</param>
+ public void LoadFile(string fileName, bool autoLoadHighlighting, bool autodetectEncoding)
+ {
+ using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) {
+ LoadFile(fileName, fs, autoLoadHighlighting, autodetectEncoding);
+ }
+ }
+
+ /// <remarks>
+ /// Loads a file from the specified stream.
+ /// </remarks>
+ /// <param name="fileName">The name of the file to open. Used to find the correct highlighting strategy
+ /// if autoLoadHighlighting is active, and sets the filename property to this value.</param>
+ /// <param name="stream">The stream to actually load the file content from.</param>
+ /// <param name="autoLoadHighlighting">Automatically load the highlighting for the file</param>
+ /// <param name="autodetectEncoding">Automatically detect file encoding and set Encoding property to the detected encoding.</param>
+ public void LoadFile(string fileName, Stream stream, bool autoLoadHighlighting, bool autodetectEncoding)
+ {
+ if (stream == null)
+ throw new ArgumentNullException("stream");
+
+ BeginUpdate();
+ document.TextContent = String.Empty;
+ document.UndoStack.ClearAll();
+ document.BookmarkManager.Clear();
+ if (autoLoadHighlighting) {
+ try {
+ document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(fileName);
+ } catch (HighlightingDefinitionInvalidException ex) {
+ MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ }
+ }
+
+ if (autodetectEncoding) {
+ Encoding encoding = this.Encoding;
+ Document.TextContent = Util.FileReader.ReadFileContent(stream, ref encoding);
+ this.Encoding = encoding;
+ } else {
+ using (StreamReader reader = new StreamReader(fileName, this.Encoding)) {
+ Document.TextContent = reader.ReadToEnd();
+ }
+ }
+
+ this.FileName = fileName;
+ Document.UpdateQueue.Clear();
+ EndUpdate();
+
+ OptionsChanged();
+ Refresh();
+ }
+
+ /// <summary>
+ /// Gets if the document can be saved with the current encoding without losing data.
+ /// </summary>
+ public bool CanSaveWithCurrentEncoding()
+ {
+ if (encoding == null || Util.FileReader.IsUnicode(encoding))
+ return true;
+ // not a unicode codepage
+ string text = document.TextContent;
+ return encoding.GetString(encoding.GetBytes(text)) == text;
+ }
+
+ /// <remarks>
+ /// Saves the text editor content into the file.
+ /// </remarks>
+ public void SaveFile(string fileName)
+ {
+ using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) {
+ SaveFile(fs);
+ }
+ this.FileName = fileName;
+ }
+
+ /// <remarks>
+ /// Saves the text editor content into the specified stream.
+ /// Does not close the stream.
+ /// </remarks>
+ public void SaveFile(Stream stream)
+ {
+ StreamWriter streamWriter = new StreamWriter(stream, this.Encoding ?? Encoding.UTF8);
+
+ // save line per line to apply the LineTerminator to all lines
+ // (otherwise we might save files with mixed-up line endings)
+ foreach (LineSegment line in Document.LineSegmentCollection) {
+ streamWriter.Write(Document.GetText(line.Offset, line.Length));
+ if (line.DelimiterLength > 0) {
+ char charAfterLine = Document.GetCharAt(line.Offset + line.Length);
+ if (charAfterLine != '\n' && charAfterLine != '\r')
+ throw new InvalidOperationException("The document cannot be saved because it is corrupted.");
+ // only save line terminator if the line has one
+ streamWriter.Write(document.TextEditorProperties.LineTerminator);
+ }
+ }
+ streamWriter.Flush();
+ }
+
+ public abstract void OptionsChanged();
+
+ // Localization ISSUES
+
+ // used in insight window
+ public virtual string GetRangeDescription(int selectedItem, int itemCount)
+ {
+ StringBuilder sb=new StringBuilder(selectedItem.ToString());
+ sb.Append(" from ");
+ sb.Append(itemCount.ToString());
+ return sb.ToString();
+ }
+
+ /// <remarks>
+ /// Overwritten refresh method that does nothing if the control is in
+ /// an update cycle.
+ /// </remarks>
+ public override void Refresh()
+ {
+ if (IsInUpdate) {
+ return;
+ }
+ base.Refresh();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing) {
+ HighlightingManager.Manager.ReloadSyntaxHighlighting -= new EventHandler(OnReloadHighlighting);
+ document.HighlightingStrategy = null;
+ document.UndoStack.TextEditorControl = null;
+ }
+ base.Dispose(disposing);
+ }
+
+ protected virtual void OnFileNameChanged(EventArgs e)
+ {
+ if (FileNameChanged != null) {
+ FileNameChanged(this, e);
+ }
+ }
+
+ public event EventHandler FileNameChanged;
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextView.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextView.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/TextView.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,1097 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Drawing;
+using System.Windows.Forms;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor
+{
+ /// <summary>
+ /// This class paints the textarea.
+ /// </summary>
+ public class TextView : AbstractMargin, IDisposable
+ {
+ int fontHeight;
+ //Hashtable charWitdh = new Hashtable();
+ //StringFormat measureStringFormat = (StringFormat)StringFormat.GenericTypographic.Clone();
+ Highlight highlight;
+ int physicalColumn = 0; // used for calculating physical column during paint
+
+ public void Dispose()
+ {
+ measureCache.Clear();
+ //measureStringFormat.Dispose();
+ }
+
+ public Highlight Highlight {
+ get {
+ return highlight;
+ }
+ set {
+ highlight = value;
+ }
+ }
+
+ public int FirstPhysicalLine {
+ get {
+ return textArea.VirtualTop.Y / fontHeight;
+ }
+ }
+ public int LineHeightRemainder {
+ get {
+ return textArea.VirtualTop.Y % fontHeight;
+ }
+ }
+ /// <summary>Gets the first visible <b>logical</b> line.</summary>
+ public int FirstVisibleLine {
+ get {
+ return textArea.Document.GetFirstLogicalLine(textArea.VirtualTop.Y / fontHeight);
+ }
+ set {
+ if (FirstVisibleLine != value) {
+ textArea.VirtualTop = new Point(textArea.VirtualTop.X, textArea.Document.GetVisibleLine(value) * fontHeight);
+
+ }
+ }
+ }
+
+ public int VisibleLineDrawingRemainder {
+ get {
+ return textArea.VirtualTop.Y % fontHeight;
+ }
+ }
+
+ public int FontHeight {
+ get {
+ return fontHeight;
+ }
+ }
+
+ public int VisibleLineCount {
+ get {
+ return 1 + DrawingPosition.Height / fontHeight;
+ }
+ }
+
+ public int VisibleColumnCount {
+ get {
+ return (int)(DrawingPosition.Width / WideSpaceWidth) - 1;
+ }
+ }
+
+ public TextView(TextArea textArea) : base(textArea)
+ {
+ base.Cursor = Cursors.IBeam;
+ OptionsChanged();
+ }
+
+ static int GetFontHeight(Font font)
+ {
+ int height1 = TextRenderer.MeasureText("_", font).Height;
+ int height2 = (int)Math.Ceiling(font.GetHeight());
+ return Math.Max(height1, height2) + 1;
+ }
+
+ int spaceWidth;
+
+ /// <summary>
+ /// Gets the width of a space character.
+ /// This value can be quite small in some fonts - consider using WideSpaceWidth instead.
+ /// </summary>
+ public int SpaceWidth {
+ get {
+ return spaceWidth;
+ }
+ }
+
+ int wideSpaceWidth;
+
+ /// <summary>
+ /// Gets the width of a 'wide space' (=one quarter of a tab, if tab is set to 4 spaces).
+ /// On monospaced fonts, this is the same value as spaceWidth.
+ /// </summary>
+ public int WideSpaceWidth {
+ get {
+ return wideSpaceWidth;
+ }
+ }
+
+ Font lastFont;
+
+ public void OptionsChanged()
+ {
+ this.lastFont = TextEditorProperties.FontContainer.RegularFont;
+ this.fontHeight = GetFontHeight(lastFont);
+ // use minimum width - in some fonts, space has no width but kerning is used instead
+ // -> DivideByZeroException
+ this.spaceWidth = Math.Max(GetWidth(' ', lastFont), 1);
+ // tab should have the width of 4*'x'
+ this.wideSpaceWidth = Math.Max(spaceWidth, GetWidth('x', lastFont));
+ }
+
+ #region Paint functions
+ public override void Paint(Graphics g, Rectangle rect)
+ {
+ if (rect.Width <= 0 || rect.Height <= 0) {
+ return;
+ }
+
+ // Just to ensure that fontHeight and char widths are always correct...
+ if (lastFont != TextEditorProperties.FontContainer.RegularFont) {
+ OptionsChanged();
+ textArea.Invalidate();
+ }
+
+ int horizontalDelta = textArea.VirtualTop.X;
+ if (horizontalDelta > 0) {
+ g.SetClip(this.DrawingPosition);
+ }
+
+ for (int y = 0; y < (DrawingPosition.Height + VisibleLineDrawingRemainder) / fontHeight + 1; ++y) {
+ Rectangle lineRectangle = new Rectangle(DrawingPosition.X - horizontalDelta,
+ DrawingPosition.Top + y * fontHeight - VisibleLineDrawingRemainder,
+ DrawingPosition.Width + horizontalDelta,
+ fontHeight);
+
+ if (rect.IntersectsWith(lineRectangle)) {
+ int fvl = textArea.Document.GetVisibleLine(FirstVisibleLine);
+ int currentLine = textArea.Document.GetFirstLogicalLine(textArea.Document.GetVisibleLine(FirstVisibleLine) + y);
+ PaintDocumentLine(g, currentLine, lineRectangle);
+ }
+ }
+
+ DrawMarkerDraw(g);
+
+ if (horizontalDelta > 0) {
+ g.ResetClip();
+ }
+ textArea.Caret.PaintCaret(g);
+ }
+
+ void PaintDocumentLine(Graphics g, int lineNumber, Rectangle lineRectangle)
+ {
+ Debug.Assert(lineNumber >= 0);
+ Brush bgColorBrush = GetBgColorBrush(lineNumber);
+ Brush backgroundBrush = textArea.Enabled ? bgColorBrush : SystemBrushes.InactiveBorder;
+
+ if (lineNumber >= textArea.Document.TotalNumberOfLines) {
+ g.FillRectangle(backgroundBrush, lineRectangle);
+ if (TextEditorProperties.ShowInvalidLines) {
+ DrawInvalidLineMarker(g, lineRectangle.Left, lineRectangle.Top);
+ }
+ if (TextEditorProperties.ShowVerticalRuler) {
+ DrawVerticalRuler(g, lineRectangle);
+ }
+// bgColorBrush.Dispose();
+ return;
+ }
+
+ int physicalXPos = lineRectangle.X;
+ // there can't be a folding wich starts in an above line and ends here, because the line is a new one,
+ // there must be a return before this line.
+ int column = 0;
+ physicalColumn = 0;
+ if (TextEditorProperties.EnableFolding) {
+ while (true) {
+ List<FoldMarker> starts = textArea.Document.FoldingManager.GetFoldedFoldingsWithStartAfterColumn(lineNumber, column - 1);
+ if (starts == null || starts.Count <= 0) {
+ if (lineNumber < textArea.Document.TotalNumberOfLines) {
+ physicalXPos = PaintLinePart(g, lineNumber, column, textArea.Document.GetLineSegment(lineNumber).Length, lineRectangle, physicalXPos);
+ }
+ break;
+ }
+ // search the first starting folding
+ FoldMarker firstFolding = (FoldMarker)starts[0];
+ foreach (FoldMarker fm in starts) {
+ if (fm.StartColumn < firstFolding.StartColumn) {
+ firstFolding = fm;
+ }
+ }
+ starts.Clear();
+
+ physicalXPos = PaintLinePart(g, lineNumber, column, firstFolding.StartColumn, lineRectangle, physicalXPos);
+ column = firstFolding.EndColumn;
+ lineNumber = firstFolding.EndLine;
+ if (lineNumber >= textArea.Document.TotalNumberOfLines) {
+ Debug.Assert(false, "Folding ends after document end");
+ break;
+ }
+
+ ColumnRange selectionRange2 = textArea.SelectionManager.GetSelectionAtLine(lineNumber);
+ bool drawSelected = ColumnRange.WholeColumn.Equals(selectionRange2) || firstFolding.StartColumn >= selectionRange2.StartColumn && firstFolding.EndColumn <= selectionRange2.EndColumn;
+
+ physicalXPos = PaintFoldingText(g, lineNumber, physicalXPos, lineRectangle, firstFolding.FoldText, drawSelected);
+ }
+ } else {
+ physicalXPos = PaintLinePart(g, lineNumber, 0, textArea.Document.GetLineSegment(lineNumber).Length, lineRectangle, physicalXPos);
+ }
+
+ if (lineNumber < textArea.Document.TotalNumberOfLines) {
+ // Paint things after end of line
+ ColumnRange selectionRange = textArea.SelectionManager.GetSelectionAtLine(lineNumber);
+ LineSegment currentLine = textArea.Document.GetLineSegment(lineNumber);
+ HighlightColor selectionColor = textArea.Document.HighlightingStrategy.GetColorFor("Selection");
+
+ bool selectionBeyondEOL = selectionRange.EndColumn > currentLine.Length || ColumnRange.WholeColumn.Equals(selectionRange);
+
+ if (TextEditorProperties.ShowEOLMarker) {
+ HighlightColor eolMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("EOLMarkers");
+ physicalXPos += DrawEOLMarker(g, eolMarkerColor.Color, selectionBeyondEOL ? bgColorBrush : backgroundBrush, physicalXPos, lineRectangle.Y);
+ } else {
+ if (selectionBeyondEOL) {
+ g.FillRectangle(BrushRegistry.GetBrush(selectionColor.BackgroundColor), new RectangleF(physicalXPos, lineRectangle.Y, WideSpaceWidth, lineRectangle.Height));
+ physicalXPos += WideSpaceWidth;
+ }
+ }
+
+ Brush fillBrush = selectionBeyondEOL && TextEditorProperties.AllowCaretBeyondEOL ? bgColorBrush : backgroundBrush;
+ g.FillRectangle(fillBrush,
+ new RectangleF(physicalXPos, lineRectangle.Y, lineRectangle.Width - physicalXPos + lineRectangle.X, lineRectangle.Height));
+ }
+ if (TextEditorProperties.ShowVerticalRuler) {
+ DrawVerticalRuler(g, lineRectangle);
+ }
+// bgColorBrush.Dispose();
+ }
+
+ bool DrawLineMarkerAtLine(int lineNumber)
+ {
+ return lineNumber == base.textArea.Caret.Line && textArea.MotherTextAreaControl.TextEditorProperties.LineViewerStyle == LineViewerStyle.FullRow;
+ }
+
+ Brush GetBgColorBrush(int lineNumber)
+ {
+ if (DrawLineMarkerAtLine(lineNumber)) {
+ HighlightColor caretLine = textArea.Document.HighlightingStrategy.GetColorFor("CaretMarker");
+ return BrushRegistry.GetBrush(caretLine.Color);
+ }
+ HighlightColor background = textArea.Document.HighlightingStrategy.GetColorFor("Default");
+ Color bgColor = background.BackgroundColor;
+ return BrushRegistry.GetBrush(bgColor);
+ }
+
+ const int additionalFoldTextSize = 1;
+
+ int PaintFoldingText(Graphics g, int lineNumber, int physicalXPos, Rectangle lineRectangle, string text, bool drawSelected)
+ {
+ // TODO: get font and color from the highlighting file
+ HighlightColor selectionColor = textArea.Document.HighlightingStrategy.GetColorFor("Selection");
+ Brush bgColorBrush = drawSelected ? BrushRegistry.GetBrush(selectionColor.BackgroundColor) : GetBgColorBrush(lineNumber);
+ Brush backgroundBrush = textArea.Enabled ? bgColorBrush : SystemBrushes.InactiveBorder;
+
+ Font font = textArea.TextEditorProperties.FontContainer.RegularFont;
+
+ int wordWidth = MeasureStringWidth(g, text, font) + additionalFoldTextSize;
+ Rectangle rect = new Rectangle(physicalXPos, lineRectangle.Y, wordWidth, lineRectangle.Height - 1);
+
+ g.FillRectangle(backgroundBrush, rect);
+
+ physicalColumn += text.Length;
+ DrawString(g,
+ text,
+ font,
+ drawSelected ? selectionColor.Color : Color.Gray,
+ rect.X + 1, rect.Y);
+ g.DrawRectangle(BrushRegistry.GetPen(drawSelected ? Color.DarkGray : Color.Gray), rect.X, rect.Y, rect.Width, rect.Height);
+
+ return physicalXPos + wordWidth + 1;
+ }
+
+ struct MarkerToDraw {
+ internal TextMarker marker;
+ internal RectangleF drawingRect;
+
+ public MarkerToDraw(TextMarker marker, RectangleF drawingRect)
+ {
+ this.marker = marker;
+ this.drawingRect = drawingRect;
+ }
+ }
+
+ List<MarkerToDraw> markersToDraw = new List<MarkerToDraw>();
+
+ void DrawMarker(Graphics g, TextMarker marker, RectangleF drawingRect)
+ {
+ // draw markers later so they can overdraw the following text
+ markersToDraw.Add(new MarkerToDraw(marker, drawingRect));
+ }
+
+ void DrawMarkerDraw(Graphics g)
+ {
+ foreach (MarkerToDraw m in markersToDraw) {
+ TextMarker marker = m.marker;
+ RectangleF drawingRect = m.drawingRect;
+ float drawYPos = drawingRect.Bottom - 1;
+ switch (marker.TextMarkerType) {
+ case TextMarkerType.Underlined:
+ g.DrawLine(BrushRegistry.GetPen(marker.Color), drawingRect.X, drawYPos, drawingRect.Right, drawYPos);
+ break;
+ case TextMarkerType.WaveLine:
+ int reminder = ((int)drawingRect.X) % 6;
+ for (float i = (int)drawingRect.X - reminder; i < drawingRect.Right; i += 6) {
+ g.DrawLine(BrushRegistry.GetPen(marker.Color), i, drawYPos + 3 - 4, i + 3, drawYPos + 1 - 4);
+ if (i + 3 < drawingRect.Right) {
+ g.DrawLine(BrushRegistry.GetPen(marker.Color), i + 3, drawYPos + 1 - 4, i + 6, drawYPos + 3 - 4);
+ }
+ }
+ break;
+ case TextMarkerType.SolidBlock:
+ g.FillRectangle(BrushRegistry.GetBrush(marker.Color), drawingRect);
+ break;
+ }
+ }
+ markersToDraw.Clear();
+ }
+
+ /// <summary>
+ /// Get the marker brush (for solid block markers) at a given position.
+ /// </summary>
+ /// <param name="offset">The offset.</param>
+ /// <param name="length">The length.</param>
+ /// <param name="markers">All markers that have been found.</param>
+ /// <returns>The Brush or null when no marker was found.</returns>
+ Brush GetMarkerBrushAt(int offset, int length, ref Color foreColor, out IList<TextMarker> markers)
+ {
+ markers = Document.MarkerStrategy.GetMarkers(offset, length);
+ foreach (TextMarker marker in markers) {
+ if (marker.TextMarkerType == TextMarkerType.SolidBlock) {
+ if (marker.OverrideForeColor) {
+ foreColor = marker.ForeColor;
+ }
+ return BrushRegistry.GetBrush(marker.Color);
+ }
+ }
+ return null;
+ }
+
+ int PaintLinePart(Graphics g, int lineNumber, int startColumn, int endColumn, Rectangle lineRectangle, int physicalXPos)
+ {
+ bool drawLineMarker = DrawLineMarkerAtLine(lineNumber);
+ Brush backgroundBrush = textArea.Enabled ? GetBgColorBrush(lineNumber) : SystemBrushes.InactiveBorder;
+
+ HighlightColor selectionColor = textArea.Document.HighlightingStrategy.GetColorFor("Selection");
+ ColumnRange selectionRange = textArea.SelectionManager.GetSelectionAtLine(lineNumber);
+ HighlightColor tabMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("TabMarkers");
+ HighlightColor spaceMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("SpaceMarkers");
+
+ LineSegment currentLine = textArea.Document.GetLineSegment(lineNumber);
+
+ Brush selectionBackgroundBrush = BrushRegistry.GetBrush(selectionColor.BackgroundColor);
+
+ if (currentLine.Words == null) {
+ return physicalXPos;
+ }
+
+ int currentWordOffset = 0; // we cannot use currentWord.Offset because it is not set on space words
+
+ TextWord currentWord;
+ TextWord nextCurrentWord = null;
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+ for (int wordIdx = 0; wordIdx < currentLine.Words.Count; wordIdx++) {
+ currentWord = currentLine.Words[wordIdx];
+ if (currentWordOffset < startColumn) {
+ // TODO: maybe we need to split at startColumn when we support fold markers
+ // inside words
+ currentWordOffset += currentWord.Length;
+ continue;
+ }
+ repeatDrawCurrentWord:
+ //physicalXPos += 10; // leave room between drawn words - useful for debugging the drawing code
+ if (currentWordOffset >= endColumn || physicalXPos >= lineRectangle.Right) {
+ break;
+ }
+ int currentWordEndOffset = currentWordOffset + currentWord.Length - 1;
+ TextWordType currentWordType = currentWord.Type;
+
+ IList<TextMarker> markers;
+ Color wordForeColor;
+ if (currentWordType == TextWordType.Space)
+ wordForeColor = spaceMarkerColor.Color;
+ else if (currentWordType == TextWordType.Tab)
+ wordForeColor = tabMarkerColor.Color;
+ else
+ wordForeColor = currentWord.Color;
+ Brush wordBackBrush = GetMarkerBrushAt(currentLine.Offset + currentWordOffset, currentWord.Length, ref wordForeColor, out markers);
+
+ // It is possible that we have to split the current word because a marker/the selection begins/ends inside it
+ if (currentWord.Length > 1) {
+ int splitPos = int.MaxValue;
+ if (highlight != null) {
+ // split both before and after highlight
+ if (highlight.OpenBrace.Y == lineNumber) {
+ if (highlight.OpenBrace.X >= currentWordOffset && highlight.OpenBrace.X <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, highlight.OpenBrace.X - currentWordOffset);
+ }
+ }
+ if (highlight.CloseBrace.Y == lineNumber) {
+ if (highlight.CloseBrace.X >= currentWordOffset && highlight.CloseBrace.X <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, highlight.CloseBrace.X - currentWordOffset);
+ }
+ }
+ if (splitPos == 0) {
+ splitPos = 1; // split after highlight
+ }
+ }
+ if (endColumn < currentWordEndOffset) { // split when endColumn is reached
+ splitPos = Math.Min(splitPos, endColumn - currentWordOffset);
+ }
+ if (selectionRange.StartColumn > currentWordOffset && selectionRange.StartColumn <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, selectionRange.StartColumn - currentWordOffset);
+ } else if (selectionRange.EndColumn > currentWordOffset && selectionRange.EndColumn <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, selectionRange.EndColumn - currentWordOffset);
+ }
+ foreach (TextMarker marker in markers) {
+ int markerColumn = marker.Offset - currentLine.Offset;
+ int markerEndColumn = marker.EndOffset - currentLine.Offset + 1; // make end offset exclusive
+ if (markerColumn > currentWordOffset && markerColumn <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, markerColumn - currentWordOffset);
+ } else if (markerEndColumn > currentWordOffset && markerEndColumn <= currentWordEndOffset) {
+ splitPos = Math.Min(splitPos, markerEndColumn - currentWordOffset);
+ }
+ }
+ if (splitPos != int.MaxValue) {
+ if (nextCurrentWord != null)
+ throw new ApplicationException("split part invalid: first part cannot be splitted further");
+ nextCurrentWord = TextWord.Split(ref currentWord, splitPos);
+ goto repeatDrawCurrentWord; // get markers for first word part
+ }
+ }
+
+ // get colors from selection status:
+ if (ColumnRange.WholeColumn.Equals(selectionRange) || (selectionRange.StartColumn <= currentWordOffset
+ && selectionRange.EndColumn > currentWordEndOffset))
+ {
+ // word is completely selected
+ wordBackBrush = selectionBackgroundBrush;
+ if (selectionColor.HasForeground) {
+ wordForeColor = selectionColor.Color;
+ }
+ } else if (drawLineMarker) {
+ wordBackBrush = backgroundBrush;
+ }
+
+ if (wordBackBrush == null) { // use default background if no other background is set
+ if (currentWord.SyntaxColor != null && currentWord.SyntaxColor.HasBackground)
+ wordBackBrush = BrushRegistry.GetBrush(currentWord.SyntaxColor.BackgroundColor);
+ else
+ wordBackBrush = backgroundBrush;
+ }
+
+ RectangleF wordRectangle;
+
+ if (currentWord.Type == TextWordType.Space) {
+ ++physicalColumn;
+
+ wordRectangle = new RectangleF(physicalXPos, lineRectangle.Y, SpaceWidth, lineRectangle.Height);
+ g.FillRectangle(wordBackBrush, wordRectangle);
+
+ if (TextEditorProperties.ShowSpaces) {
+ DrawSpaceMarker(g, wordForeColor, physicalXPos, lineRectangle.Y);
+ }
+ physicalXPos += SpaceWidth;
+ } else if (currentWord.Type == TextWordType.Tab) {
+
+ physicalColumn += TextEditorProperties.TabIndent;
+ physicalColumn = (physicalColumn / TextEditorProperties.TabIndent) * TextEditorProperties.TabIndent;
+ // go to next tabstop
+ int physicalTabEnd = ((physicalXPos + MinTabWidth - lineRectangle.X)
+ / WideSpaceWidth / TextEditorProperties.TabIndent)
+ * WideSpaceWidth * TextEditorProperties.TabIndent + lineRectangle.X;
+ physicalTabEnd += WideSpaceWidth * TextEditorProperties.TabIndent;
+
+ wordRectangle = new RectangleF(physicalXPos, lineRectangle.Y, physicalTabEnd - physicalXPos, lineRectangle.Height);
+ g.FillRectangle(wordBackBrush, wordRectangle);
+
+ if (TextEditorProperties.ShowTabs) {
+ DrawTabMarker(g, wordForeColor, physicalXPos, lineRectangle.Y);
+ }
+ physicalXPos = physicalTabEnd;
+ } else {
+ int wordWidth = DrawDocumentWord(g,
+ currentWord.Word,
+ new Point(physicalXPos, lineRectangle.Y),
+ currentWord.GetFont(fontContainer),
+ wordForeColor,
+ wordBackBrush);
+ wordRectangle = new RectangleF(physicalXPos, lineRectangle.Y, wordWidth, lineRectangle.Height);
+ physicalXPos += wordWidth;
+ }
+ foreach (TextMarker marker in markers) {
+ if (marker.TextMarkerType != TextMarkerType.SolidBlock) {
+ DrawMarker(g, marker, wordRectangle);
+ }
+ }
+
+ // draw bracket highlight
+ if (highlight != null) {
+ if (highlight.OpenBrace.Y == lineNumber && highlight.OpenBrace.X == currentWordOffset ||
+ highlight.CloseBrace.Y == lineNumber && highlight.CloseBrace.X == currentWordOffset) {
+ DrawBracketHighlight(g, new Rectangle((int)wordRectangle.X, lineRectangle.Y, (int)wordRectangle.Width - 1, lineRectangle.Height - 1));
+ }
+ }
+
+ currentWordOffset += currentWord.Length;
+ if (nextCurrentWord != null) {
+ currentWord = nextCurrentWord;
+ nextCurrentWord = null;
+ goto repeatDrawCurrentWord;
+ }
+ }
+ if (physicalXPos < lineRectangle.Right && endColumn >= currentLine.Length) {
+ // draw markers at line end
+ IList<TextMarker> markers = Document.MarkerStrategy.GetMarkers(currentLine.Offset + currentLine.Length);
+ foreach (TextMarker marker in markers) {
+ if (marker.TextMarkerType != TextMarkerType.SolidBlock) {
+ DrawMarker(g, marker, new RectangleF(physicalXPos, lineRectangle.Y, WideSpaceWidth, lineRectangle.Height));
+ }
+ }
+ }
+ return physicalXPos;
+ }
+
+ int DrawDocumentWord(Graphics g, string word, Point position, Font font, Color foreColor, Brush backBrush)
+ {
+ if (word == null || word.Length == 0) {
+ return 0;
+ }
+
+ if (word.Length > MaximumWordLength) {
+ int width = 0;
+ for (int i = 0; i < word.Length; i += MaximumWordLength) {
+ Point pos = position;
+ pos.X += width;
+ if (i + MaximumWordLength < word.Length)
+ width += DrawDocumentWord(g, word.Substring(i, MaximumWordLength), pos, font, foreColor, backBrush);
+ else
+ width += DrawDocumentWord(g, word.Substring(i, word.Length - i), pos, font, foreColor, backBrush);
+ }
+ return width;
+ }
+
+ int wordWidth = MeasureStringWidth(g, word, font);
+
+ //num = ++num % 3;
+ g.FillRectangle(backBrush, //num == 0 ? Brushes.LightBlue : num == 1 ? Brushes.LightGreen : Brushes.Yellow,
+ new RectangleF(position.X, position.Y, wordWidth + 1, FontHeight));
+
+ DrawString(g,
+ word,
+ font,
+ foreColor,
+ position.X,
+ position.Y);
+ return wordWidth;
+ }
+
+ struct WordFontPair {
+ string word;
+ Font font;
+ public WordFontPair(string word, Font font) {
+ this.word = word;
+ this.font = font;
+ }
+ public override bool Equals(object obj) {
+ WordFontPair myWordFontPair = (WordFontPair)obj;
+ if (!word.Equals(myWordFontPair.word)) return false;
+ return font.Equals(myWordFontPair.font);
+ }
+
+ public override int GetHashCode() {
+ return word.GetHashCode() ^ font.GetHashCode();
+ }
+ }
+
+ Dictionary<WordFontPair, int> measureCache = new Dictionary<WordFontPair, int>();
+
+ // split words after 1000 characters. Fixes GDI+ crash on very longs words, for example
+ // a 100 KB Base64-file without any line breaks.
+ const int MaximumWordLength = 1000;
+ const int MaximumCacheSize = 2000;
+
+ int MeasureStringWidth(Graphics g, string word, Font font)
+ {
+ int width;
+
+ if (word == null || word.Length == 0)
+ return 0;
+ if (word.Length > MaximumWordLength) {
+ width = 0;
+ for (int i = 0; i < word.Length; i += MaximumWordLength) {
+ if (i + MaximumWordLength < word.Length)
+ width += MeasureStringWidth(g, word.Substring(i, MaximumWordLength), font);
+ else
+ width += MeasureStringWidth(g, word.Substring(i, word.Length - i), font);
+ }
+ return width;
+ }
+ if (measureCache.TryGetValue(new WordFontPair(word, font), out width)) {
+ return width;
+ }
+ if (measureCache.Count > MaximumCacheSize) {
+ measureCache.Clear();
+ }
+
+ // This code here provides better results than MeasureString!
+ // Example line that is measured wrong:
+ // txt.GetPositionFromCharIndex(txt.SelectionStart)
+ // (Verdana 10, highlighting makes GetP... bold) -> note the space between 'x' and '('
+ // this also fixes "jumping" characters when selecting in non-monospace fonts
+ // [...]
+ // Replaced GDI+ measurement with GDI measurement: faster and even more exact
+ width = TextRenderer.MeasureText(g, word, font, new Size(short.MaxValue, short.MaxValue), textFormatFlags).Width;
+ measureCache.Add(new WordFontPair(word, font), width);
+ return width;
+ }
+
+ // Important: Some flags combinations work on WinXP, but not on Win2000.
+ // Make sure to test changes here on all operating systems.
+ const TextFormatFlags textFormatFlags =
+ TextFormatFlags.NoPadding | TextFormatFlags.NoPrefix | TextFormatFlags.PreserveGraphicsClipping;
+ #endregion
+
+ #region Conversion Functions
+ Dictionary<Font, Dictionary<char, int>> fontBoundCharWidth = new Dictionary<Font, Dictionary<char, int>>();
+
+ public int GetWidth(char ch, Font font)
+ {
+ if (!fontBoundCharWidth.ContainsKey(font)) {
+ fontBoundCharWidth.Add(font, new Dictionary<char, int>());
+ }
+ if (!fontBoundCharWidth[font].ContainsKey(ch)) {
+ using (Graphics g = textArea.CreateGraphics()) {
+ return GetWidth(g, ch, font);
+ }
+ }
+ return fontBoundCharWidth[font][ch];
+ }
+
+ public int GetWidth(Graphics g, char ch, Font font)
+ {
+ if (!fontBoundCharWidth.ContainsKey(font)) {
+ fontBoundCharWidth.Add(font, new Dictionary<char, int>());
+ }
+ if (!fontBoundCharWidth[font].ContainsKey(ch)) {
+ //Console.WriteLine("Calculate character width: " + ch);
+ fontBoundCharWidth[font].Add(ch, MeasureStringWidth(g, ch.ToString(), font));
+ }
+ return fontBoundCharWidth[font][ch];
+ }
+
+ public int GetVisualColumn(int logicalLine, int logicalColumn)
+ {
+ int column = 0;
+ using (Graphics g = textArea.CreateGraphics()) {
+ CountColumns(ref column, 0, logicalColumn, logicalLine, g);
+ }
+ return column;
+ }
+
+ public int GetVisualColumnFast(LineSegment line, int logicalColumn)
+ {
+ int lineOffset = line.Offset;
+ int tabIndent = Document.TextEditorProperties.TabIndent;
+ int guessedColumn = 0;
+ for (int i = 0; i < logicalColumn; ++i) {
+ char ch;
+ if (i >= line.Length) {
+ ch = ' ';
+ } else {
+ ch = Document.GetCharAt(lineOffset + i);
+ }
+ switch (ch) {
+ case '\t':
+ guessedColumn += tabIndent;
+ guessedColumn = (guessedColumn / tabIndent) * tabIndent;
+ break;
+ default:
+ ++guessedColumn;
+ break;
+ }
+ }
+ return guessedColumn;
+ }
+
+ /// <summary>
+ /// returns line/column for a visual point position
+ /// </summary>
+ public TextLocation GetLogicalPosition(Point mousePosition)
+ {
+ FoldMarker dummy;
+ return GetLogicalColumn(GetLogicalLine(mousePosition.Y), mousePosition.X, out dummy);
+ }
+
+ /// <summary>
+ /// returns line/column for a visual point position
+ /// </summary>
+ public TextLocation GetLogicalPosition(int visualPosX, int visualPosY)
+ {
+ FoldMarker dummy;
+ return GetLogicalColumn(GetLogicalLine(visualPosY), visualPosX, out dummy);
+ }
+
+ /// <summary>
+ /// returns line/column for a visual point position
+ /// </summary>
+ public FoldMarker GetFoldMarkerFromPosition(int visualPosX, int visualPosY)
+ {
+ FoldMarker foldMarker;
+ GetLogicalColumn(GetLogicalLine(visualPosY), visualPosX, out foldMarker);
+ return foldMarker;
+ }
+
+ /// <summary>
+ /// returns logical line number for a visual point
+ /// </summary>
+ public int GetLogicalLine(int visualPosY)
+ {
+ int clickedVisualLine = Math.Max(0, (visualPosY + this.textArea.VirtualTop.Y) / fontHeight);
+ return Document.GetFirstLogicalLine(clickedVisualLine);
+ }
+
+ internal TextLocation GetLogicalColumn(int lineNumber, int visualPosX, out FoldMarker inFoldMarker)
+ {
+ visualPosX += textArea.VirtualTop.X;
+
+ inFoldMarker = null;
+ if (lineNumber >= Document.TotalNumberOfLines) {
+ return new TextLocation((int)(visualPosX / WideSpaceWidth), lineNumber);
+ }
+ if (visualPosX <= 0) {
+ return new TextLocation(0, lineNumber);
+ }
+
+ int start = 0; // column
+ int posX = 0; // visual position
+
+ int result;
+ using (Graphics g = textArea.CreateGraphics()) {
+ // call GetLogicalColumnInternal to skip over text,
+ // then skip over fold markers
+ // and repeat as necessary.
+ // The loop terminates once the correct logical column is reached in
+ // GetLogicalColumnInternal or inside a fold marker.
+ while (true) {
+
+ LineSegment line = Document.GetLineSegment(lineNumber);
+ FoldMarker nextFolding = FindNextFoldedFoldingOnLineAfterColumn(lineNumber, start-1);
+ int end = nextFolding != null ? nextFolding.StartColumn : int.MaxValue;
+ result = GetLogicalColumnInternal(g, line, start, end, ref posX, visualPosX);
+
+ // break when GetLogicalColumnInternal found the result column
+ if (result < end)
+ break;
+
+ // reached fold marker
+ lineNumber = nextFolding.EndLine;
+ start = nextFolding.EndColumn;
+ int newPosX = posX + 1 + MeasureStringWidth(g, nextFolding.FoldText, TextEditorProperties.FontContainer.RegularFont);
+ if (newPosX >= visualPosX) {
+ inFoldMarker = nextFolding;
+ if (IsNearerToAThanB(visualPosX, posX, newPosX))
+ return new TextLocation(nextFolding.StartColumn, nextFolding.StartLine);
+ else
+ return new TextLocation(nextFolding.EndColumn, nextFolding.EndLine);
+ }
+ posX = newPosX;
+ }
+ }
+ return new TextLocation(result, lineNumber);
+ }
+
+ int GetLogicalColumnInternal(Graphics g, LineSegment line, int start, int end, ref int drawingPos, int targetVisualPosX)
+ {
+ if (start == end)
+ return end;
+ Debug.Assert(start < end);
+ Debug.Assert(drawingPos < targetVisualPosX);
+
+ int tabIndent = Document.TextEditorProperties.TabIndent;
+
+ /*float spaceWidth = SpaceWidth;
+ float drawingPos = 0;
+ LineSegment currentLine = Document.GetLineSegment(logicalLine);
+ List<TextWord> words = currentLine.Words;
+ if (words == null) return 0;
+ int wordCount = words.Count;
+ int wordOffset = 0;
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+ */
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+
+ List<TextWord> words = line.Words;
+ if (words == null) return 0;
+ int wordOffset = 0;
+ for (int i = 0; i < words.Count; i++) {
+ TextWord word = words[i];
+ if (wordOffset >= end) {
+ return wordOffset;
+ }
+ if (wordOffset + word.Length >= start) {
+ int newDrawingPos;
+ switch (word.Type) {
+ case TextWordType.Space:
+ newDrawingPos = drawingPos + spaceWidth;
+ if (newDrawingPos >= targetVisualPosX)
+ return IsNearerToAThanB(targetVisualPosX, drawingPos, newDrawingPos) ? wordOffset : wordOffset+1;
+ break;
+ case TextWordType.Tab:
+ // go to next tab position
+ drawingPos = (int)((drawingPos + MinTabWidth) / tabIndent / WideSpaceWidth) * tabIndent * WideSpaceWidth;
+ newDrawingPos = drawingPos + tabIndent * WideSpaceWidth;
+ if (newDrawingPos >= targetVisualPosX)
+ return IsNearerToAThanB(targetVisualPosX, drawingPos, newDrawingPos) ? wordOffset : wordOffset+1;
+ break;
+ case TextWordType.Word:
+ int wordStart = Math.Max(wordOffset, start);
+ int wordLength = Math.Min(wordOffset + word.Length, end) - wordStart;
+ string text = Document.GetText(line.Offset + wordStart, wordLength);
+ Font font = word.GetFont(fontContainer) ?? fontContainer.RegularFont;
+ newDrawingPos = drawingPos + MeasureStringWidth(g, text, font);
+ if (newDrawingPos >= targetVisualPosX) {
+ for (int j = 0; j < text.Length; j++) {
+ newDrawingPos = drawingPos + MeasureStringWidth(g, text[j].ToString(), font);
+ if (newDrawingPos >= targetVisualPosX) {
+ if (IsNearerToAThanB(targetVisualPosX, drawingPos, newDrawingPos))
+ return wordStart + j;
+ else
+ return wordStart + j + 1;
+ }
+ drawingPos = newDrawingPos;
+ }
+ return wordStart + text.Length;
+ }
+ break;
+ default:
+ throw new NotSupportedException();
+ }
+ drawingPos = newDrawingPos;
+ }
+ wordOffset += word.Length;
+ }
+ return wordOffset;
+ }
+
+ static bool IsNearerToAThanB(int num, int a, int b)
+ {
+ return Math.Abs(a - num) < Math.Abs(b - num);
+ }
+
+ FoldMarker FindNextFoldedFoldingOnLineAfterColumn(int lineNumber, int column)
+ {
+ List<FoldMarker> list = Document.FoldingManager.GetFoldedFoldingsWithStartAfterColumn(lineNumber, column);
+ if (list.Count != 0)
+ return list[0];
+ else
+ return null;
+ }
+
+ const int MinTabWidth = 4;
+
+ float CountColumns(ref int column, int start, int end, int logicalLine, Graphics g)
+ {
+ if (start > end) throw new ArgumentException("start > end");
+ if (start == end) return 0;
+ float spaceWidth = SpaceWidth;
+ float drawingPos = 0;
+ int tabIndent = Document.TextEditorProperties.TabIndent;
+ LineSegment currentLine = Document.GetLineSegment(logicalLine);
+ List<TextWord> words = currentLine.Words;
+ if (words == null) return 0;
+ int wordCount = words.Count;
+ int wordOffset = 0;
+ FontContainer fontContainer = TextEditorProperties.FontContainer;
+ for (int i = 0; i < wordCount; i++) {
+ TextWord word = words[i];
+ if (wordOffset >= end)
+ break;
+ if (wordOffset + word.Length >= start) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ drawingPos += spaceWidth;
+ break;
+ case TextWordType.Tab:
+ // go to next tab position
+ drawingPos = (int)((drawingPos + MinTabWidth) / tabIndent / WideSpaceWidth) * tabIndent * WideSpaceWidth;
+ drawingPos += tabIndent * WideSpaceWidth;
+ break;
+ case TextWordType.Word:
+ int wordStart = Math.Max(wordOffset, start);
+ int wordLength = Math.Min(wordOffset + word.Length, end) - wordStart;
+ string text = Document.GetText(currentLine.Offset + wordStart, wordLength);
+ drawingPos += MeasureStringWidth(g, text, word.GetFont(fontContainer) ?? fontContainer.RegularFont);
+ break;
+ }
+ }
+ wordOffset += word.Length;
+ }
+ for (int j = currentLine.Length; j < end; j++) {
+ drawingPos += WideSpaceWidth;
+ }
+ // add one pixel in column calculation to account for floating point calculation errors
+ column += (int)((drawingPos + 1) / WideSpaceWidth);
+
+ /* OLD Code (does not work for fonts like Verdana)
+ for (int j = start; j < end; ++j) {
+ char ch;
+ if (j >= line.Length) {
+ ch = ' ';
+ } else {
+ ch = Document.GetCharAt(line.Offset + j);
+ }
+
+ switch (ch) {
+ case '\t':
+ int oldColumn = column;
+ column += tabIndent;
+ column = (column / tabIndent) * tabIndent;
+ drawingPos += (column - oldColumn) * spaceWidth;
+ break;
+ default:
+ ++column;
+ TextWord word = line.GetWord(j);
+ if (word == null || word.Font == null) {
+ drawingPos += GetWidth(ch, TextEditorProperties.Font);
+ } else {
+ drawingPos += GetWidth(ch, word.Font);
+ }
+ break;
+ }
+ }
+ //*/
+ return drawingPos;
+ }
+
+ public int GetDrawingXPos(int logicalLine, int logicalColumn)
+ {
+ List<FoldMarker> foldings = Document.FoldingManager.GetTopLevelFoldedFoldings();
+ int i;
+ FoldMarker f = null;
+ // search the last folding that's interresting
+ for (i = foldings.Count - 1; i >= 0; --i) {
+ f = foldings[i];
+ if (f.StartLine < logicalLine || f.StartLine == logicalLine && f.StartColumn < logicalColumn) {
+ break;
+ }
+ FoldMarker f2 = foldings[i / 2];
+ if (f2.StartLine > logicalLine || f2.StartLine == logicalLine && f2.StartColumn >= logicalColumn) {
+ i /= 2;
+ }
+ }
+ int lastFolding = 0;
+ int firstFolding = 0;
+ int column = 0;
+ int tabIndent = Document.TextEditorProperties.TabIndent;
+ float drawingPos;
+ Graphics g = textArea.CreateGraphics();
+ // if no folding is interresting
+ if (f == null || !(f.StartLine < logicalLine || f.StartLine == logicalLine && f.StartColumn < logicalColumn)) {
+ drawingPos = CountColumns(ref column, 0, logicalColumn, logicalLine, g);
+ return (int)(drawingPos - textArea.VirtualTop.X);
+ }
+
+ // if logicalLine/logicalColumn is in folding
+ if (f.EndLine > logicalLine || f.EndLine == logicalLine && f.EndColumn > logicalColumn) {
+ logicalColumn = f.StartColumn;
+ logicalLine = f.StartLine;
+ --i;
+ }
+ lastFolding = i;
+
+ // search backwards until a new visible line is reched
+ for (; i >= 0; --i) {
+ f = (FoldMarker)foldings[i];
+ if (f.EndLine < logicalLine) { // reached the begin of a new visible line
+ break;
+ }
+ }
+ firstFolding = i + 1;
+
+ if (lastFolding < firstFolding) {
+ drawingPos = CountColumns(ref column, 0, logicalColumn, logicalLine, g);
+ return (int)(drawingPos - textArea.VirtualTop.X);
+ }
+
+ int foldEnd = 0;
+ drawingPos = 0;
+ for (i = firstFolding; i <= lastFolding; ++i) {
+ f = foldings[i];
+ drawingPos += CountColumns(ref column, foldEnd, f.StartColumn, f.StartLine, g);
+ foldEnd = f.EndColumn;
+ column += f.FoldText.Length;
+ drawingPos += additionalFoldTextSize;
+ drawingPos += MeasureStringWidth(g, f.FoldText, TextEditorProperties.FontContainer.RegularFont);
+ }
+ drawingPos += CountColumns(ref column, foldEnd, logicalColumn, logicalLine, g);
+ g.Dispose();
+ return (int)(drawingPos - textArea.VirtualTop.X);
+ }
+ #endregion
+
+ #region DrawHelper functions
+ void DrawBracketHighlight(Graphics g, Rectangle rect)
+ {
+ g.FillRectangle(BrushRegistry.GetBrush(Color.FromArgb(50, 0, 0, 255)), rect);
+ g.DrawRectangle(Pens.Blue, rect);
+ }
+
+ void DrawString(Graphics g, string text, Font font, Color color, int x, int y)
+ {
+ TextRenderer.DrawText(g, text, font, new Point(x, y), color, textFormatFlags);
+ }
+
+ void DrawInvalidLineMarker(Graphics g, int x, int y)
+ {
+ HighlightColor invalidLinesColor = textArea.Document.HighlightingStrategy.GetColorFor("InvalidLines");
+ DrawString(g, "~", invalidLinesColor.GetFont(TextEditorProperties.FontContainer), invalidLinesColor.Color, x, y);
+ }
+
+ void DrawSpaceMarker(Graphics g, Color color, int x, int y)
+ {
+ HighlightColor spaceMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("SpaceMarkers");
+ DrawString(g, "\u00B7", spaceMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y);
+ }
+
+ void DrawTabMarker(Graphics g, Color color, int x, int y)
+ {
+ HighlightColor tabMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("TabMarkers");
+ DrawString(g, "\u00BB", tabMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y);
+ }
+
+ int DrawEOLMarker(Graphics g, Color color, Brush backBrush, int x, int y)
+ {
+ HighlightColor eolMarkerColor = textArea.Document.HighlightingStrategy.GetColorFor("EOLMarkers");
+
+ int width = GetWidth('\u00B6', eolMarkerColor.GetFont(TextEditorProperties.FontContainer));
+ g.FillRectangle(backBrush,
+ new RectangleF(x, y, width, fontHeight));
+
+ DrawString(g, "\u00B6", eolMarkerColor.GetFont(TextEditorProperties.FontContainer), color, x, y);
+ return width;
+ }
+
+ void DrawVerticalRuler(Graphics g, Rectangle lineRectangle)
+ {
+ int xpos = WideSpaceWidth * TextEditorProperties.VerticalRulerRow - textArea.VirtualTop.X;
+ if (xpos <= 0) {
+ return;
+ }
+ HighlightColor vRulerColor = textArea.Document.HighlightingStrategy.GetColorFor("VRuler");
+
+ g.DrawLine(BrushRegistry.GetPen(vRulerColor.Color),
+ drawingPosition.Left + xpos,
+ lineRectangle.Top,
+ drawingPosition.Left + xpos,
+ lineRectangle.Bottom);
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/ToolTipRequestEventArgs.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/ToolTipRequestEventArgs.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Gui/ToolTipRequestEventArgs.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,62 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor
+{
+ public delegate void ToolTipRequestEventHandler(object sender, ToolTipRequestEventArgs e);
+
+ public class ToolTipRequestEventArgs
+ {
+ Point mousePosition;
+ TextLocation logicalPosition;
+ bool inDocument;
+
+ public Point MousePosition {
+ get {
+ return mousePosition;
+ }
+ }
+
+ public TextLocation LogicalPosition {
+ get {
+ return logicalPosition;
+ }
+ }
+
+ public bool InDocument {
+ get {
+ return inDocument;
+ }
+ }
+
+ /// <summary>
+ /// Gets if some client handling the event has already shown a tool tip.
+ /// </summary>
+ public bool ToolTipShown {
+ get {
+ return toolTipText != null;
+ }
+ }
+
+ internal string toolTipText;
+
+ public void ShowToolTip(string text)
+ {
+ toolTipText = text;
+ }
+
+ public ToolTipRequestEventArgs(Point mousePosition, TextLocation logicalPosition, bool inDocument)
+ {
+ this.mousePosition = mousePosition;
+ this.logicalPosition = logicalPosition;
+ this.inDocument = inDocument;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/IUndoableOperation.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/IUndoableOperation.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/IUndoableOperation.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,26 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This Interface describes a the basic Undo/Redo operation
+ /// all Undo Operations must implement this interface.
+ /// </summary>
+ public interface IUndoableOperation
+ {
+ /// <summary>
+ /// Undo the last operation
+ /// </summary>
+ void Undo();
+
+ /// <summary>
+ /// Redo the last operation
+ /// </summary>
+ void Redo();
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoQueue.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoQueue.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoQueue.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,53 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This class stacks the last x operations from the undostack and makes
+ /// one undo/redo operation from it.
+ /// </summary>
+ internal sealed class UndoQueue : IUndoableOperation
+ {
+ List<IUndoableOperation> undolist = new List<IUndoableOperation>();
+
+ /// <summary>
+ /// </summary>
+ public UndoQueue(Stack<IUndoableOperation> stack, int numops)
+ {
+ if (stack == null) {
+ throw new ArgumentNullException("stack");
+ }
+
+ Debug.Assert(numops > 0 , "ICSharpCode.TextEditor.Undo.UndoQueue : numops should be > 0");
+ if (numops > stack.Count) {
+ numops = stack.Count;
+ }
+
+ for (int i = 0; i < numops; ++i) {
+ undolist.Add(stack.Pop());
+ }
+ }
+ public void Undo()
+ {
+ for (int i = 0; i < undolist.Count; ++i) {
+ undolist[i].Undo();
+ }
+ }
+
+ public void Redo()
+ {
+ for (int i = undolist.Count - 1 ; i >= 0 ; --i) {
+ undolist[i].Redo();
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoStack.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoStack.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoStack.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,242 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This class implements an undo stack
+ /// </summary>
+ public class UndoStack
+ {
+ Stack<IUndoableOperation> undostack = new Stack<IUndoableOperation>();
+ Stack<IUndoableOperation> redostack = new Stack<IUndoableOperation>();
+
+ public TextEditorControlBase TextEditorControl = null;
+
+ /// <summary>
+ /// </summary>
+ public event EventHandler ActionUndone;
+ /// <summary>
+ /// </summary>
+ public event EventHandler ActionRedone;
+
+ public event OperationEventHandler OperationPushed;
+
+ /// <summary>
+ /// Gets/Sets if changes to the document are protocolled by the undo stack.
+ /// Used internally to disable the undo stack temporarily while undoing an action.
+ /// </summary>
+ internal bool AcceptChanges = true;
+
+ /// <summary>
+ /// Gets if there are actions on the undo stack.
+ /// </summary>
+ public bool CanUndo {
+ get {
+ return undostack.Count > 0;
+ }
+ }
+
+ /// <summary>
+ /// Gets if there are actions on the redo stack.
+ /// </summary>
+ public bool CanRedo {
+ get {
+ return redostack.Count > 0;
+ }
+ }
+
+ /// <summary>
+ /// Gets the number of actions on the undo stack.
+ /// </summary>
+ public int UndoItemCount {
+ get {
+ return undostack.Count;
+ }
+ }
+
+ /// <summary>
+ /// Gets the number of actions on the redo stack.
+ /// </summary>
+ public int RedoItemCount {
+ get {
+ return redostack.Count;
+ }
+ }
+
+ int undoGroupDepth;
+ int actionCountInUndoGroup;
+
+ public void StartUndoGroup()
+ {
+ if (undoGroupDepth == 0) {
+ actionCountInUndoGroup = 0;
+ }
+ undoGroupDepth++;
+ //Util.LoggingService.Debug("Open undo group (new depth=" + undoGroupDepth + ")");
+ }
+
+ public void EndUndoGroup()
+ {
+ if (undoGroupDepth == 0)
+ throw new InvalidOperationException("There are no open undo groups");
+ undoGroupDepth--;
+ //Util.LoggingService.Debug("Close undo group (new depth=" + undoGroupDepth + ")");
+ if (undoGroupDepth == 0 && actionCountInUndoGroup > 1) {
+ UndoQueue op = new UndoQueue(undostack, actionCountInUndoGroup);
+ undostack.Push(op);
+ if (OperationPushed != null) {
+ OperationPushed(this, new OperationEventArgs(op));
+ }
+ }
+ }
+
+ public void AssertNoUndoGroupOpen()
+ {
+ if (undoGroupDepth != 0) {
+ undoGroupDepth = 0;
+ throw new InvalidOperationException("No undo group should be open at this point");
+ }
+ }
+
+ /// <summary>
+ /// Call this method to undo the last operation on the stack
+ /// </summary>
+ public void Undo()
+ {
+ AssertNoUndoGroupOpen();
+ if (undostack.Count > 0) {
+ IUndoableOperation uedit = (IUndoableOperation)undostack.Pop();
+ redostack.Push(uedit);
+ uedit.Undo();
+ OnActionUndone();
+ }
+ }
+
+ /// <summary>
+ /// Call this method to redo the last undone operation
+ /// </summary>
+ public void Redo()
+ {
+ AssertNoUndoGroupOpen();
+ if (redostack.Count > 0) {
+ IUndoableOperation uedit = (IUndoableOperation)redostack.Pop();
+ undostack.Push(uedit);
+ uedit.Redo();
+ OnActionRedone();
+ }
+ }
+
+ /// <summary>
+ /// Call this method to push an UndoableOperation on the undostack, the redostack
+ /// will be cleared, if you use this method.
+ /// </summary>
+ public void Push(IUndoableOperation operation)
+ {
+ if (operation == null) {
+ throw new ArgumentNullException("operation");
+ }
+
+ if (AcceptChanges) {
+ StartUndoGroup();
+ undostack.Push(operation);
+ actionCountInUndoGroup++;
+ if (TextEditorControl != null) {
+ undostack.Push(new UndoableSetCaretPosition(this, TextEditorControl.ActiveTextAreaControl.Caret.Position));
+ actionCountInUndoGroup++;
+ }
+ EndUndoGroup();
+ ClearRedoStack();
+ }
+ }
+
+ /// <summary>
+ /// Call this method, if you want to clear the redo stack
+ /// </summary>
+ public void ClearRedoStack()
+ {
+ redostack.Clear();
+ }
+
+ /// <summary>
+ /// Clears both the undo and redo stack.
+ /// </summary>
+ public void ClearAll()
+ {
+ AssertNoUndoGroupOpen();
+ undostack.Clear();
+ redostack.Clear();
+ actionCountInUndoGroup = 0;
+ }
+
+ /// <summary>
+ /// </summary>
+ protected void OnActionUndone()
+ {
+ if (ActionUndone != null) {
+ ActionUndone(null, null);
+ }
+ }
+
+ /// <summary>
+ /// </summary>
+ protected void OnActionRedone()
+ {
+ if (ActionRedone != null) {
+ ActionRedone(null, null);
+ }
+ }
+
+ class UndoableSetCaretPosition : IUndoableOperation
+ {
+ UndoStack stack;
+ TextLocation pos;
+ TextLocation redoPos;
+
+ public UndoableSetCaretPosition(UndoStack stack, TextLocation pos)
+ {
+ this.stack = stack;
+ this.pos = pos;
+ }
+
+ public void Undo()
+ {
+ redoPos = stack.TextEditorControl.ActiveTextAreaControl.Caret.Position;
+ stack.TextEditorControl.ActiveTextAreaControl.Caret.Position = pos;
+ stack.TextEditorControl.ActiveTextAreaControl.SelectionManager.ClearSelection();
+ }
+
+ public void Redo()
+ {
+ stack.TextEditorControl.ActiveTextAreaControl.Caret.Position = redoPos;
+ stack.TextEditorControl.ActiveTextAreaControl.SelectionManager.ClearSelection();
+ }
+ }
+ }
+
+ public class OperationEventArgs : EventArgs
+ {
+ public OperationEventArgs(IUndoableOperation op)
+ {
+ this.op = op;
+ }
+
+ IUndoableOperation op;
+
+ public IUndoableOperation Operation {
+ get {
+ return op;
+ }
+ }
+ }
+
+ public delegate void OperationEventHandler(object sender, OperationEventArgs e);
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableDelete.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableDelete.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableDelete.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,72 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This class is for the undo of Document insert operations
+ /// </summary>
+ public class UndoableDelete : IUndoableOperation
+ {
+ IDocument document;
+// int oldCaretPos;
+ int offset;
+ string text;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="UndoableDelete"/>
+ /// </summary>
+ public UndoableDelete(IDocument document, int offset, string text)
+ {
+ if (document == null) {
+ throw new ArgumentNullException("document");
+ }
+ if (offset < 0 || offset > document.TextLength) {
+ throw new ArgumentOutOfRangeException("offset");
+ }
+
+ Debug.Assert(text != null, "text can't be null");
+// oldCaretPos = document.Caret.Offset;
+ this.document = document;
+ this.offset = offset;
+ this.text = text;
+ }
+
+ /// <remarks>
+ /// Undo last operation
+ /// </remarks>
+ public void Undo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// textArea.SelectionManager.SelectionCollection.Clear();
+ document.UndoStack.AcceptChanges = false;
+ document.Insert(offset, text);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, oldCaretPos));
+ document.UndoStack.AcceptChanges = true;
+ }
+
+ /// <remarks>
+ /// Redo last undone operation
+ /// </remarks>
+ public void Redo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// textArea.SelectionManager.SelectionCollection.Clear();
+
+ document.UndoStack.AcceptChanges = false;
+ document.Remove(offset, text.Length);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, document.Caret.Offset));
+ document.UndoStack.AcceptChanges = true;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableInsert.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableInsert.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableInsert.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,73 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This class is for the undo of Document insert operations
+ /// </summary>
+ public class UndoableInsert : IUndoableOperation
+ {
+ IDocument document;
+// int oldCaretPos;
+ int offset;
+ string text;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="UndoableInsert"/>
+ /// </summary>
+ public UndoableInsert(IDocument document, int offset, string text)
+ {
+ if (document == null) {
+ throw new ArgumentNullException("document");
+ }
+ if (offset < 0 || offset > document.TextLength) {
+ throw new ArgumentOutOfRangeException("offset");
+ }
+
+ Debug.Assert(text != null, "text can't be null");
+// oldCaretPos = document.Caret.Offset;
+ this.document = document;
+ this.offset = offset;
+ this.text = text;
+ }
+
+ /// <remarks>
+ /// Undo last operation
+ /// </remarks>
+ public void Undo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// document.SelectionCollection.Clear();
+
+ document.UndoStack.AcceptChanges = false;
+ document.Remove(offset, text.Length);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, oldCaretPos));
+ document.UndoStack.AcceptChanges = true;
+ }
+
+ /// <remarks>
+ /// Redo last undone operation
+ /// </remarks>
+ public void Redo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// document.SelectionCollection.Clear();
+
+ document.UndoStack.AcceptChanges = false;
+ document.Insert(offset, text);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, document.Caret.Offset));
+ document.UndoStack.AcceptChanges = true;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableReplace.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableReplace.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Undo/UndoableReplace.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,75 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Undo
+{
+ /// <summary>
+ /// This class is for the undo of Document insert operations
+ /// </summary>
+ public class UndoableReplace : IUndoableOperation
+ {
+ IDocument document;
+// int oldCaretPos;
+ int offset;
+ string text;
+ string origText;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="UndoableReplace"/>
+ /// </summary>
+ public UndoableReplace(IDocument document, int offset, string origText, string text)
+ {
+ if (document == null) {
+ throw new ArgumentNullException("document");
+ }
+ if (offset < 0 || offset > document.TextLength) {
+ throw new ArgumentOutOfRangeException("offset");
+ }
+
+ Debug.Assert(text != null, "text can't be null");
+// oldCaretPos = document.Caret.Offset;
+ this.document = document;
+ this.offset = offset;
+ this.text = text;
+ this.origText = origText;
+ }
+
+ /// <remarks>
+ /// Undo last operation
+ /// </remarks>
+ public void Undo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// document.SelectionCollection.Clear();
+
+ document.UndoStack.AcceptChanges = false;
+ document.Replace(offset, text.Length, origText);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, oldCaretPos));
+ document.UndoStack.AcceptChanges = true;
+ }
+
+ /// <remarks>
+ /// Redo last undone operation
+ /// </remarks>
+ public void Redo()
+ {
+ // we clear all selection direct, because the redraw
+ // is done per refresh at the end of the action
+// document.SelectionCollection.Clear();
+
+ document.UndoStack.AcceptChanges = false;
+ document.Replace(offset, origText.Length, text);
+// document.Caret.Offset = Math.Min(document.TextLength, Math.Max(0, document.Caret.Offset));
+ document.UndoStack.AcceptChanges = true;
+ }
+ }
+}
Property changes on: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util
___________________________________________________________________
Added: bugtraq:number
+ true
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/AugmentableRedBlackTree.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/AugmentableRedBlackTree.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/AugmentableRedBlackTree.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,590 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Text;
+using System.Diagnostics;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ internal sealed class RedBlackTreeNode<T>
+ {
+ internal RedBlackTreeNode<T> left, right, parent;
+ internal T val;
+ internal bool color;
+
+ internal RedBlackTreeNode(T val)
+ {
+ this.val = val;
+ }
+
+ internal RedBlackTreeNode<T> LeftMost {
+ get {
+ RedBlackTreeNode<T> node = this;
+ while (node.left != null)
+ node = node.left;
+ return node;
+ }
+ }
+
+ internal RedBlackTreeNode<T> RightMost {
+ get {
+ RedBlackTreeNode<T> node = this;
+ while (node.right != null)
+ node = node.right;
+ return node;
+ }
+ }
+ }
+
+ internal interface IRedBlackTreeHost<T> : IComparer<T>
+ {
+ bool Equals(T a, T b);
+
+ void UpdateAfterChildrenChange(RedBlackTreeNode<T> node);
+ void UpdateAfterRotateLeft(RedBlackTreeNode<T> node);
+ void UpdateAfterRotateRight(RedBlackTreeNode<T> node);
+ }
+
+ /// <summary>
+ /// Description of RedBlackTree.
+ /// </summary>
+ internal sealed class AugmentableRedBlackTree<T, Host> : ICollection<T> where Host : IRedBlackTreeHost<T>
+ {
+ readonly Host host;
+ int count;
+ internal RedBlackTreeNode<T> root;
+
+ public AugmentableRedBlackTree(Host host)
+ {
+ if (host == null) throw new ArgumentNullException("host");
+ this.host = host;
+ }
+
+ public int Count {
+ get { return count; }
+ }
+
+ public void Clear()
+ {
+ root = null;
+ count = 0;
+ }
+
+ #region Debugging code
+ #if DEBUG
+ /// <summary>
+ /// Check tree for consistency and being balanced.
+ /// </summary>
+ [Conditional("DATACONSISTENCYTEST")]
+ void CheckProperties()
+ {
+ int blackCount = -1;
+ CheckNodeProperties(root, null, RED, 0, ref blackCount);
+
+ int nodeCount = 0;
+ foreach (T val in this) {
+ nodeCount++;
+ }
+ Debug.Assert(count == nodeCount);
+ }
+
+ /*
+ 1. A node is either red or black.
+ 2. The root is black.
+ 3. All leaves are black. (The leaves are the NIL children.)
+ 4. Both children of every red node are black. (So every red node must have a black parent.)
+ 5. Every simple path from a node to a descendant leaf contains the same number of black nodes. (Not counting the leaf node.)
+ */
+ void CheckNodeProperties(RedBlackTreeNode<T> node, RedBlackTreeNode<T> parentNode, bool parentColor, int blackCount, ref int expectedBlackCount)
+ {
+ if (node == null) return;
+
+ Debug.Assert(node.parent == parentNode);
+
+ if (parentColor == RED) {
+ Debug.Assert(node.color == BLACK);
+ }
+ if (node.color == BLACK) {
+ blackCount++;
+ }
+ if (node.left == null && node.right == null) {
+ // node is a leaf node:
+ if (expectedBlackCount == -1)
+ expectedBlackCount = blackCount;
+ else
+ Debug.Assert(expectedBlackCount == blackCount);
+ }
+ CheckNodeProperties(node.left, node, node.color, blackCount, ref expectedBlackCount);
+ CheckNodeProperties(node.right, node, node.color, blackCount, ref expectedBlackCount);
+ }
+
+ public string GetTreeAsString()
+ {
+ StringBuilder b = new StringBuilder();
+ AppendTreeToString(root, b, 0);
+ return b.ToString();
+ }
+
+ static void AppendTreeToString(RedBlackTreeNode<T> node, StringBuilder b, int indent)
+ {
+ if (node.color == RED)
+ b.Append("RED ");
+ else
+ b.Append("BLACK ");
+ b.AppendLine(node.val.ToString());
+ indent += 2;
+ if (node.left != null) {
+ b.Append(' ', indent);
+ b.Append("L: ");
+ AppendTreeToString(node.left, b, indent);
+ }
+ if (node.right != null) {
+ b.Append(' ', indent);
+ b.Append("R: ");
+ AppendTreeToString(node.right, b, indent);
+ }
+ }
+ #endif
+ #endregion
+
+ #region Add
+ public void Add(T item)
+ {
+ AddInternal(new RedBlackTreeNode<T>(item));
+ #if DEBUG
+ CheckProperties();
+ #endif
+ }
+
+ void AddInternal(RedBlackTreeNode<T> newNode)
+ {
+ Debug.Assert(newNode.color == BLACK);
+ if (root == null) {
+ count = 1;
+ root = newNode;
+ return;
+ }
+ // Insert into the tree
+ RedBlackTreeNode<T> parentNode = root;
+ while (true) {
+ if (host.Compare(newNode.val, parentNode.val) <= 0) {
+ if (parentNode.left == null) {
+ InsertAsLeft(parentNode, newNode);
+ return;
+ }
+ parentNode = parentNode.left;
+ } else {
+ if (parentNode.right == null) {
+ InsertAsRight(parentNode, newNode);
+ return;
+ }
+ parentNode = parentNode.right;
+ }
+ }
+ }
+
+ internal void InsertAsLeft(RedBlackTreeNode<T> parentNode, RedBlackTreeNode<T> newNode)
+ {
+ Debug.Assert(parentNode.left == null);
+ parentNode.left = newNode;
+ newNode.parent = parentNode;
+ newNode.color = RED;
+ host.UpdateAfterChildrenChange(parentNode);
+ FixTreeOnInsert(newNode);
+ count++;
+ }
+
+ internal void InsertAsRight(RedBlackTreeNode<T> parentNode, RedBlackTreeNode<T> newNode)
+ {
+ Debug.Assert(parentNode.right == null);
+ parentNode.right = newNode;
+ newNode.parent = parentNode;
+ newNode.color = RED;
+ host.UpdateAfterChildrenChange(parentNode);
+ FixTreeOnInsert(newNode);
+ count++;
+ }
+
+ void FixTreeOnInsert(RedBlackTreeNode<T> node)
+ {
+ Debug.Assert(node != null);
+ Debug.Assert(node.color == RED);
+ Debug.Assert(node.left == null || node.left.color == BLACK);
+ Debug.Assert(node.right == null || node.right.color == BLACK);
+
+ RedBlackTreeNode<T> parentNode = node.parent;
+ if (parentNode == null) {
+ // we inserted in the root -> the node must be black
+ // since this is a root node, making the node black increments the number of black nodes
+ // on all paths by one, so it is still the same for all paths.
+ node.color = BLACK;
+ return;
+ }
+ if (parentNode.color == BLACK) {
+ // if the parent node where we inserted was black, our red node is placed correctly.
+ // since we inserted a red node, the number of black nodes on each path is unchanged
+ // -> the tree is still balanced
+ return;
+ }
+ // parentNode is red, so there is a conflict here!
+
+ // because the root is black, parentNode is not the root -> there is a grandparent node
+ RedBlackTreeNode<T> grandparentNode = parentNode.parent;
+ RedBlackTreeNode<T> uncleNode = Sibling(parentNode);
+ if (uncleNode != null && uncleNode.color == RED) {
+ parentNode.color = BLACK;
+ uncleNode.color = BLACK;
+ grandparentNode.color = RED;
+ FixTreeOnInsert(grandparentNode);
+ return;
+ }
+ // now we know: parent is red but uncle is black
+ // First rotation:
+ if (node == parentNode.right && parentNode == grandparentNode.left) {
+ RotateLeft(parentNode);
+ node = node.left;
+ } else if (node == parentNode.left && parentNode == grandparentNode.right) {
+ RotateRight(parentNode);
+ node = node.right;
+ }
+ // because node might have changed, reassign variables:
+ parentNode = node.parent;
+ grandparentNode = parentNode.parent;
+
+ // Now recolor a bit:
+ parentNode.color = BLACK;
+ grandparentNode.color = RED;
+ // Second rotation:
+ if (node == parentNode.left && parentNode == grandparentNode.left) {
+ RotateRight(grandparentNode);
+ } else {
+ // because of the first rotation, this is guaranteed:
+ Debug.Assert(node == parentNode.right && parentNode == grandparentNode.right);
+ RotateLeft(grandparentNode);
+ }
+ }
+
+ void ReplaceNode(RedBlackTreeNode<T> replacedNode, RedBlackTreeNode<T> newNode)
+ {
+ if (replacedNode.parent == null) {
+ Debug.Assert(replacedNode == root);
+ root = newNode;
+ } else {
+ if (replacedNode.parent.left == replacedNode)
+ replacedNode.parent.left = newNode;
+ else
+ replacedNode.parent.right = newNode;
+ }
+ if (newNode != null) {
+ newNode.parent = replacedNode.parent;
+ }
+ replacedNode.parent = null;
+ }
+
+ void RotateLeft(RedBlackTreeNode<T> p)
+ {
+ // let q be p's right child
+ RedBlackTreeNode<T> q = p.right;
+ Debug.Assert(q != null);
+ Debug.Assert(q.parent == p);
+ // set q to be the new root
+ ReplaceNode(p, q);
+
+ // set p's right child to be q's left child
+ p.right = q.left;
+ if (p.right != null) p.right.parent = p;
+ // set q's left child to be p
+ q.left = p;
+ p.parent = q;
+ host.UpdateAfterRotateLeft(p);
+ }
+
+ void RotateRight(RedBlackTreeNode<T> p)
+ {
+ // let q be p's left child
+ RedBlackTreeNode<T> q = p.left;
+ Debug.Assert(q != null);
+ Debug.Assert(q.parent == p);
+ // set q to be the new root
+ ReplaceNode(p, q);
+
+ // set p's left child to be q's right child
+ p.left = q.right;
+ if (p.left != null) p.left.parent = p;
+ // set q's right child to be p
+ q.right = p;
+ p.parent = q;
+ host.UpdateAfterRotateRight(p);
+ }
+
+ RedBlackTreeNode<T> Sibling(RedBlackTreeNode<T> node)
+ {
+ if (node == node.parent.left)
+ return node.parent.right;
+ else
+ return node.parent.left;
+ }
+ #endregion
+
+ #region Remove
+ public void RemoveAt(RedBlackTreeIterator<T> iterator)
+ {
+ RedBlackTreeNode<T> node = iterator.node;
+ if (node == null)
+ throw new ArgumentException("Invalid iterator");
+ while (node.parent != null)
+ node = node.parent;
+ if (node != root)
+ throw new ArgumentException("Iterator does not belong to this tree");
+ RemoveNode(iterator.node);
+ #if DEBUG
+ CheckProperties();
+ #endif
+ }
+
+ internal void RemoveNode(RedBlackTreeNode<T> removedNode)
+ {
+ if (removedNode.left != null && removedNode.right != null) {
+ // replace removedNode with it's in-order successor
+
+ RedBlackTreeNode<T> leftMost = removedNode.right.LeftMost;
+ RemoveNode(leftMost); // remove leftMost from its current location
+
+ // and overwrite the removedNode with it
+ ReplaceNode(removedNode, leftMost);
+ leftMost.left = removedNode.left;
+ if (leftMost.left != null) leftMost.left.parent = leftMost;
+ leftMost.right = removedNode.right;
+ if (leftMost.right != null) leftMost.right.parent = leftMost;
+ leftMost.color = removedNode.color;
+
+ host.UpdateAfterChildrenChange(leftMost);
+ if (leftMost.parent != null) host.UpdateAfterChildrenChange(leftMost.parent);
+ return;
+ }
+
+ count--;
+
+ // now either removedNode.left or removedNode.right is null
+ // get the remaining child
+ RedBlackTreeNode<T> parentNode = removedNode.parent;
+ RedBlackTreeNode<T> childNode = removedNode.left ?? removedNode.right;
+ ReplaceNode(removedNode, childNode);
+ if (parentNode != null) host.UpdateAfterChildrenChange(parentNode);
+ if (removedNode.color == BLACK) {
+ if (childNode != null && childNode.color == RED) {
+ childNode.color = BLACK;
+ } else {
+ FixTreeOnDelete(childNode, parentNode);
+ }
+ }
+ }
+
+ static RedBlackTreeNode<T> Sibling(RedBlackTreeNode<T> node, RedBlackTreeNode<T> parentNode)
+ {
+ Debug.Assert(node == null || node.parent == parentNode);
+ if (node == parentNode.left)
+ return parentNode.right;
+ else
+ return parentNode.left;
+ }
+
+ const bool RED = true;
+ const bool BLACK = false;
+
+ static bool GetColor(RedBlackTreeNode<T> node)
+ {
+ return node != null ? node.color : BLACK;
+ }
+
+ void FixTreeOnDelete(RedBlackTreeNode<T> node, RedBlackTreeNode<T> parentNode)
+ {
+ Debug.Assert(node == null || node.parent == parentNode);
+ if (parentNode == null)
+ return;
+
+ // warning: node may be null
+ RedBlackTreeNode<T> sibling = Sibling(node, parentNode);
+ if (sibling.color == RED) {
+ parentNode.color = RED;
+ sibling.color = BLACK;
+ if (node == parentNode.left) {
+ RotateLeft(parentNode);
+ } else {
+ RotateRight(parentNode);
+ }
+
+ sibling = Sibling(node, parentNode); // update value of sibling after rotation
+ }
+
+ if (parentNode.color == BLACK
+ && sibling.color == BLACK
+ && GetColor(sibling.left) == BLACK
+ && GetColor(sibling.right) == BLACK)
+ {
+ sibling.color = RED;
+ FixTreeOnDelete(parentNode, parentNode.parent);
+ return;
+ }
+
+ if (parentNode.color == RED
+ && sibling.color == BLACK
+ && GetColor(sibling.left) == BLACK
+ && GetColor(sibling.right) == BLACK)
+ {
+ sibling.color = RED;
+ parentNode.color = BLACK;
+ return;
+ }
+
+ if (node == parentNode.left &&
+ sibling.color == BLACK &&
+ GetColor(sibling.left) == RED &&
+ GetColor(sibling.right) == BLACK)
+ {
+ sibling.color = RED;
+ sibling.left.color = BLACK;
+ RotateRight(sibling);
+ }
+ else if (node == parentNode.right &&
+ sibling.color == BLACK &&
+ GetColor(sibling.right) == RED &&
+ GetColor(sibling.left) == BLACK)
+ {
+ sibling.color = RED;
+ sibling.right.color = BLACK;
+ RotateLeft(sibling);
+ }
+ sibling = Sibling(node, parentNode); // update value of sibling after rotation
+
+ sibling.color = parentNode.color;
+ parentNode.color = BLACK;
+ if (node == parentNode.left) {
+ if (sibling.right != null) {
+ Debug.Assert(sibling.right.color == RED);
+ sibling.right.color = BLACK;
+ }
+ RotateLeft(parentNode);
+ } else {
+ if (sibling.left != null) {
+ Debug.Assert(sibling.left.color == RED);
+ sibling.left.color = BLACK;
+ }
+ RotateRight(parentNode);
+ }
+ }
+ #endregion
+
+ #region Find/LowerBound/UpperBound/GetEnumerator
+ /// <summary>
+ /// Returns the iterator pointing to the specified item, or an iterator in End state if the item is not found.
+ /// </summary>
+ public RedBlackTreeIterator<T> Find(T item)
+ {
+ RedBlackTreeIterator<T> it = LowerBound(item);
+ while (it.IsValid && host.Compare(it.Current, item) == 0) {
+ if (host.Equals(it.Current, item))
+ return it;
+ it.MoveNext();
+ }
+ return default(RedBlackTreeIterator<T>);
+ }
+
+ /// <summary>
+ /// Returns the iterator pointing to the first item greater or equal to <paramref name="item"/>.
+ /// </summary>
+ public RedBlackTreeIterator<T> LowerBound(T item)
+ {
+ RedBlackTreeNode<T> node = root;
+ RedBlackTreeNode<T> resultNode = null;
+ while (node != null) {
+ if (host.Compare(node.val, item) < 0) {
+ node = node.right;
+ } else {
+ resultNode = node;
+ node = node.left;
+ }
+ }
+ return new RedBlackTreeIterator<T>(resultNode);
+ }
+
+ /// <summary>
+ /// Returns the iterator pointing to the first item greater than <paramref name="item"/>.
+ /// </summary>
+ public RedBlackTreeIterator<T> UpperBound(T item)
+ {
+ RedBlackTreeIterator<T> it = LowerBound(item);
+ while (it.IsValid && host.Compare(it.Current, item) == 0) {
+ it.MoveNext();
+ }
+ return it;
+ }
+
+ /// <summary>
+ /// Gets a tree iterator that starts on the first node.
+ /// </summary>
+ public RedBlackTreeIterator<T> Begin()
+ {
+ if (root == null) return default(RedBlackTreeIterator<T>);
+ return new RedBlackTreeIterator<T>(root.LeftMost);
+ }
+
+ /// <summary>
+ /// Gets a tree iterator that starts one node before the first node.
+ /// </summary>
+ public RedBlackTreeIterator<T> GetEnumerator()
+ {
+ if (root == null) return default(RedBlackTreeIterator<T>);
+ RedBlackTreeNode<T> dummyNode = new RedBlackTreeNode<T>(default(T));
+ dummyNode.right = root;
+ return new RedBlackTreeIterator<T>(dummyNode);
+ }
+ #endregion
+
+ #region ICollection members
+ public bool Contains(T item)
+ {
+ return Find(item).IsValid;
+ }
+
+ public bool Remove(T item)
+ {
+ RedBlackTreeIterator<T> it = Find(item);
+ if (!it.IsValid) {
+ return false;
+ } else {
+ RemoveAt(it);
+ return true;
+ }
+ }
+
+ IEnumerator<T> IEnumerable<T>.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ bool ICollection<T>.IsReadOnly {
+ get { return false; }
+ }
+
+ public void CopyTo(T[] array, int arrayIndex)
+ {
+ if (array == null) throw new ArgumentNullException("array");
+ foreach (T val in this) {
+ array[arrayIndex++] = val;
+ }
+ }
+ #endregion
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/CheckedList.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/CheckedList.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/CheckedList.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,148 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <author name="Daniel Grunwald"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// A IList{T} that checks that it is only accessed on the thread that created it, and that
+ /// it is not modified while an enumerator is running.
+ /// </summary>
+ sealed class CheckedList<T> : IList<T>
+ {
+ readonly int threadID;
+ readonly IList<T> baseList;
+ int enumeratorCount;
+
+ public CheckedList() : this(new List<T>()) {}
+
+ public CheckedList(IList<T> baseList)
+ {
+ if (baseList == null)
+ throw new ArgumentNullException("baseList");
+ this.baseList = baseList;
+ this.threadID = Thread.CurrentThread.ManagedThreadId;
+ }
+
+ void CheckRead()
+ {
+ if (Thread.CurrentThread.ManagedThreadId != threadID)
+ throw new InvalidOperationException("CheckList cannot be accessed from this thread!");
+ }
+
+ void CheckWrite()
+ {
+ if (Thread.CurrentThread.ManagedThreadId != threadID)
+ throw new InvalidOperationException("CheckList cannot be accessed from this thread!");
+ if (enumeratorCount != 0)
+ throw new InvalidOperationException("CheckList cannot be written to while enumerators are active!");
+ }
+
+ public T this[int index] {
+ get {
+ CheckRead();
+ return baseList[index];
+ }
+ set {
+ CheckWrite();
+ baseList[index] = value;
+ }
+ }
+
+ public int Count {
+ get {
+ CheckRead();
+ return baseList.Count;
+ }
+ }
+
+ public bool IsReadOnly {
+ get {
+ CheckRead();
+ return baseList.IsReadOnly;
+ }
+ }
+
+ public int IndexOf(T item)
+ {
+ CheckRead();
+ return baseList.IndexOf(item);
+ }
+
+ public void Insert(int index, T item)
+ {
+ CheckWrite();
+ baseList.Insert(index, item);
+ }
+
+ public void RemoveAt(int index)
+ {
+ CheckWrite();
+ baseList.RemoveAt(index);
+ }
+
+ public void Add(T item)
+ {
+ CheckWrite();
+ baseList.Add(item);
+ }
+
+ public void Clear()
+ {
+ CheckWrite();
+ baseList.Clear();
+ }
+
+ public bool Contains(T item)
+ {
+ CheckRead();
+ return baseList.Contains(item);
+ }
+
+ public void CopyTo(T[] array, int arrayIndex)
+ {
+ CheckRead();
+ baseList.CopyTo(array, arrayIndex);
+ }
+
+ public bool Remove(T item)
+ {
+ CheckWrite();
+ return baseList.Remove(item);
+ }
+
+ public IEnumerator<T> GetEnumerator()
+ {
+ CheckRead();
+ return Enumerate();
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ CheckRead();
+ return Enumerate();
+ }
+
+ IEnumerator<T> Enumerate()
+ {
+ CheckRead();
+ try {
+ enumeratorCount++;
+ foreach (T val in baseList) {
+ yield return val;
+ CheckRead();
+ }
+ } finally {
+ enumeratorCount--;
+ CheckRead();
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/FileReader.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/FileReader.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/FileReader.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,152 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.IO;
+using System.Text;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// Class that can open text files with auto-detection of the encoding.
+ /// </summary>
+ public static class FileReader
+ {
+ public static bool IsUnicode(Encoding encoding)
+ {
+ int codepage = encoding.CodePage;
+ // return true if codepage is any UTF codepage
+ return codepage == 65001 || codepage == 65000 || codepage == 1200 || codepage == 1201;
+ }
+
+ public static string ReadFileContent(Stream fs, ref Encoding encoding)
+ {
+ using (StreamReader reader = OpenStream(fs, encoding)) {
+ reader.Peek();
+ encoding = reader.CurrentEncoding;
+ return reader.ReadToEnd();
+ }
+ }
+
+ public static string ReadFileContent(string fileName, Encoding encoding)
+ {
+ using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
+ return ReadFileContent(fs, ref encoding);
+ }
+ }
+
+ public static StreamReader OpenStream(Stream fs, Encoding defaultEncoding)
+ {
+ if (fs == null)
+ throw new ArgumentNullException("fs");
+
+ if (fs.Length >= 2) {
+ // the autodetection of StreamReader is not capable of detecting the difference
+ // between ISO-8859-1 and UTF-8 without BOM.
+ int firstByte = fs.ReadByte();
+ int secondByte = fs.ReadByte();
+ switch ((firstByte << 8) | secondByte) {
+ case 0x0000: // either UTF-32 Big Endian or a binary file; use StreamReader
+ case 0xfffe: // Unicode BOM (UTF-16 LE or UTF-32 LE)
+ case 0xfeff: // UTF-16 BE BOM
+ case 0xefbb: // start of UTF-8 BOM
+ // StreamReader autodetection works
+ fs.Position = 0;
+ return new StreamReader(fs);
+ default:
+ return AutoDetect(fs, (byte)firstByte, (byte)secondByte, defaultEncoding);
+ }
+ } else {
+ if (defaultEncoding != null) {
+ return new StreamReader(fs, defaultEncoding);
+ } else {
+ return new StreamReader(fs);
+ }
+ }
+ }
+
+ static StreamReader AutoDetect(Stream fs, byte firstByte, byte secondByte, Encoding defaultEncoding)
+ {
+ int max = (int)Math.Min(fs.Length, 500000); // look at max. 500 KB
+ const int ASCII = 0;
+ const int Error = 1;
+ const int UTF8 = 2;
+ const int UTF8Sequence = 3;
+ int state = ASCII;
+ int sequenceLength = 0;
+ byte b;
+ for (int i = 0; i < max; i++) {
+ if (i == 0) {
+ b = firstByte;
+ } else if (i == 1) {
+ b = secondByte;
+ } else {
+ b = (byte)fs.ReadByte();
+ }
+ if (b < 0x80) {
+ // normal ASCII character
+ if (state == UTF8Sequence) {
+ state = Error;
+ break;
+ }
+ } else if (b < 0xc0) {
+ // 10xxxxxx : continues UTF8 byte sequence
+ if (state == UTF8Sequence) {
+ --sequenceLength;
+ if (sequenceLength < 0) {
+ state = Error;
+ break;
+ } else if (sequenceLength == 0) {
+ state = UTF8;
+ }
+ } else {
+ state = Error;
+ break;
+ }
+ } else if (b >= 0xc2 && b < 0xf5) {
+ // beginning of byte sequence
+ if (state == UTF8 || state == ASCII) {
+ state = UTF8Sequence;
+ if (b < 0xe0) {
+ sequenceLength = 1; // one more byte following
+ } else if (b < 0xf0) {
+ sequenceLength = 2; // two more bytes following
+ } else {
+ sequenceLength = 3; // three more bytes following
+ }
+ } else {
+ state = Error;
+ break;
+ }
+ } else {
+ // 0xc0, 0xc1, 0xf5 to 0xff are invalid in UTF-8 (see RFC 3629)
+ state = Error;
+ break;
+ }
+ }
+ fs.Position = 0;
+ switch (state) {
+ case ASCII:
+ case Error:
+ // when the file seems to be ASCII or non-UTF8,
+ // we read it using the user-specified encoding so it is saved again
+ // using that encoding.
+ if (IsUnicode(defaultEncoding)) {
+ // the file is not Unicode, so don't read it using Unicode even if the
+ // user has choosen Unicode as the default encoding.
+
+ // If we don't do this, SD will end up always adding a Byte Order Mark
+ // to ASCII files.
+ defaultEncoding = Encoding.Default; // use system encoding instead
+ }
+ return new StreamReader(fs, defaultEncoding);
+ default:
+ return new StreamReader(fs);
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LoggingService.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LoggingService.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LoggingService.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,24 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <author name="Daniel Grunwald"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// Central location for logging calls in the text editor.
+ /// </summary>
+ static class LoggingService
+ {
+ public static void Debug(string text)
+ {
+ #if DEBUG
+ Console.WriteLine(text);
+ #endif
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LookupTable.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LookupTable.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/LookupTable.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,156 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// This class implements a keyword map. It implements a digital search trees (tries) to find
+ /// a word.
+ /// </summary>
+ public class LookupTable
+ {
+ Node root = new Node(null, null);
+ bool casesensitive;
+ int length;
+
+ /// <value>
+ /// The number of elements in the table
+ /// </value>
+ public int Count {
+ get {
+ return length;
+ }
+ }
+
+ /// <summary>
+ /// Get the object, which was inserted under the keyword (line, at offset, with length length),
+ /// returns null, if no such keyword was inserted.
+ /// </summary>
+ public object this[IDocument document, LineSegment line, int offset, int length] {
+ get {
+ if(length == 0) {
+ return null;
+ }
+ Node next = root;
+
+ int wordOffset = line.Offset + offset;
+ if (casesensitive) {
+ for (int i = 0; i < length; ++i) {
+ int index = ((int)document.GetCharAt(wordOffset + i)) % 256;
+ next = next[index];
+
+ if (next == null) {
+ return null;
+ }
+
+ if (next.color != null && TextUtility.RegionMatches(document, wordOffset, length, next.word)) {
+ return next.color;
+ }
+ }
+ } else {
+ for (int i = 0; i < length; ++i) {
+ int index = ((int)Char.ToUpper(document.GetCharAt(wordOffset + i))) % 256;
+
+ next = next[index];
+
+ if (next == null) {
+ return null;
+ }
+
+ if (next.color != null && TextUtility.RegionMatches(document, casesensitive, wordOffset, length, next.word)) {
+ return next.color;
+ }
+ }
+ }
+ return null;
+ }
+ }
+
+ /// <summary>
+ /// Inserts an object in the tree, under keyword
+ /// </summary>
+ public object this[string keyword] {
+ set {
+ Node node = root;
+ Node next = root;
+ if (!casesensitive) {
+ keyword = keyword.ToUpper();
+ }
+ ++length;
+
+ // insert word into the tree
+ for (int i = 0; i < keyword.Length; ++i) {
+ int index = ((int)keyword[i]) % 256; // index of curchar
+ bool d = keyword[i] == '\\';
+
+ next = next[index]; // get node to this index
+
+ if (next == null) { // no node created -> insert word here
+ node[index] = new Node(value, keyword);
+ break;
+ }
+
+ if (next.word != null && next.word.Length != i) { // node there, take node content and insert them again
+ string tmpword = next.word; // this word will be inserted 1 level deeper (better, don't need too much
+ object tmpcolor = next.color; // string comparisons for finding.)
+ next.color = next.word = null;
+ this[tmpword] = tmpcolor;
+ }
+
+ if (i == keyword.Length - 1) { // end of keyword reached, insert node there, if a node was here it was
+ next.word = keyword; // reinserted, if it has the same length (keyword EQUALS this word) it will be overwritten
+ next.color = value;
+ break;
+ }
+
+ node = next;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="LookupTable"/>
+ /// </summary>
+ public LookupTable(bool casesensitive)
+ {
+ this.casesensitive = casesensitive;
+ }
+
+ class Node
+ {
+ public Node(object color, string word)
+ {
+ this.word = word;
+ this.color = color;
+ }
+
+ public string word;
+ public object color;
+
+ // Lazily initialize children array. Saves 200 KB of memory for the C# highlighting
+ // because we don't have to store the array for leaf nodes.
+ public Node this[int index] {
+ get {
+ if (children != null)
+ return children[index];
+ else
+ return null;
+ }
+ set {
+ if (children == null)
+ children = new Node[256];
+ children[index] = value;
+ }
+ }
+
+ private Node[] children;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/MouseWheelHandler.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/MouseWheelHandler.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/MouseWheelHandler.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,36 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <author name="Daniel Grunwald"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// Accumulates mouse wheel deltas and reports the actual number of lines to scroll.
+ /// </summary>
+ class MouseWheelHandler
+ {
+ // CODE DUPLICATION: See ICSharpCode.SharpDevelop.Widgets.MouseWheelHandler
+
+ const int WHEEL_DELTA = 120;
+
+ int mouseWheelDelta;
+
+ public int GetScrollAmount(MouseEventArgs e)
+ {
+ // accumulate the delta to support high-resolution mice
+ mouseWheelDelta += e.Delta;
+
+ int linesPerClick = Math.Max(SystemInformation.MouseWheelScrollLines, 1);
+
+ int scrollDistance = mouseWheelDelta * linesPerClick / WHEEL_DELTA;
+ mouseWheelDelta %= Math.Max(1, WHEEL_DELTA / linesPerClick);
+ return scrollDistance;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RedBlackTreeIterator.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RedBlackTreeIterator.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RedBlackTreeIterator.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,85 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ internal struct RedBlackTreeIterator<T> : IEnumerator<T>
+ {
+ internal RedBlackTreeNode<T> node;
+
+ internal RedBlackTreeIterator(RedBlackTreeNode<T> node)
+ {
+ this.node = node;
+ }
+
+ public bool IsValid {
+ get { return node != null; }
+ }
+
+ public T Current {
+ get {
+ if (node != null)
+ return node.val;
+ else
+ throw new InvalidOperationException();
+ }
+ }
+
+ object System.Collections.IEnumerator.Current {
+ get {
+ return this.Current;
+ }
+ }
+
+ void IDisposable.Dispose()
+ {
+ }
+
+ void System.Collections.IEnumerator.Reset()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool MoveNext()
+ {
+ if (node == null)
+ return false;
+ if (node.right != null) {
+ node = node.right.LeftMost;
+ } else {
+ RedBlackTreeNode<T> oldNode;
+ do {
+ oldNode = node;
+ node = node.parent;
+ // we are on the way up from the right part, don't output node again
+ } while (node != null && node.right == oldNode);
+ }
+ return node != null;
+ }
+
+ public bool MoveBack()
+ {
+ if (node == null)
+ return false;
+ if (node.left != null) {
+ node = node.left.RightMost;
+ } else {
+ RedBlackTreeNode<T> oldNode;
+ do {
+ oldNode = node;
+ node = node.parent;
+ // we are on the way up from the left part, don't output node again
+ } while (node != null && node.left == oldNode);
+ }
+ return node != null;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RtfWriter.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RtfWriter.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/RtfWriter.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,190 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Text;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ public class RtfWriter
+ {
+ static Dictionary<string, int> colors;
+ static int colorNum;
+ static StringBuilder colorString;
+
+ public static string GenerateRtf(TextArea textArea)
+ {
+ colors = new Dictionary<string, int>();
+ colorNum = 0;
+ colorString = new StringBuilder();
+
+
+ StringBuilder rtf = new StringBuilder();
+
+ rtf.Append(@"{\rtf1\ansi\ansicpg1252\deff0\deflang1031");
+ BuildFontTable(textArea.Document, rtf);
+ rtf.Append('\n');
+
+ string fileContent = BuildFileContent(textArea);
+ BuildColorTable(textArea.Document, rtf);
+ rtf.Append('\n');
+ rtf.Append(@"\viewkind4\uc1\pard");
+ rtf.Append(fileContent);
+ rtf.Append("}");
+ return rtf.ToString();
+ }
+
+ static void BuildColorTable(IDocument doc, StringBuilder rtf)
+ {
+ rtf.Append(@"{\colortbl ;");
+ rtf.Append(colorString.ToString());
+ rtf.Append("}");
+ }
+
+ static void BuildFontTable(IDocument doc, StringBuilder rtf)
+ {
+ rtf.Append(@"{\fonttbl");
+ rtf.Append(@"{\f0\fmodern\fprq1\fcharset0 " + doc.TextEditorProperties.Font.Name + ";}");
+ rtf.Append("}");
+ }
+
+ static string BuildFileContent(TextArea textArea)
+ {
+ StringBuilder rtf = new StringBuilder();
+ bool firstLine = true;
+ Color curColor = Color.Black;
+ bool oldItalic = false;
+ bool oldBold = false;
+ bool escapeSequence = false;
+
+ foreach (ISelection selection in textArea.SelectionManager.SelectionCollection) {
+ int selectionOffset = textArea.Document.PositionToOffset(selection.StartPosition);
+ int selectionEndOffset = textArea.Document.PositionToOffset(selection.EndPosition);
+ for (int i = selection.StartPosition.Y; i <= selection.EndPosition.Y; ++i) {
+ LineSegment line = textArea.Document.GetLineSegment(i);
+ int offset = line.Offset;
+ if (line.Words == null) {
+ continue;
+ }
+
+ foreach (TextWord word in line.Words) {
+ switch (word.Type) {
+ case TextWordType.Space:
+ if (selection.ContainsOffset(offset)) {
+ rtf.Append(' ');
+ }
+ ++offset;
+ break;
+
+ case TextWordType.Tab:
+ if (selection.ContainsOffset(offset)) {
+ rtf.Append(@"\tab");
+ }
+ ++offset;
+ escapeSequence = true;
+ break;
+
+ case TextWordType.Word:
+ Color c = word.Color;
+
+ if (offset + word.Word.Length > selectionOffset && offset < selectionEndOffset) {
+ string colorstr = c.R + ", " + c.G + ", " + c.B;
+
+ if (!colors.ContainsKey(colorstr)) {
+ colors[colorstr] = ++colorNum;
+ colorString.Append(@"\red" + c.R + @"\green" + c.G + @"\blue" + c.B + ";");
+ }
+ if (c != curColor || firstLine) {
+ rtf.Append(@"\cf" + colors[colorstr].ToString());
+ curColor = c;
+ escapeSequence = true;
+ }
+
+ if (oldItalic != word.Italic) {
+ if (word.Italic) {
+ rtf.Append(@"\i");
+ } else {
+ rtf.Append(@"\i0");
+ }
+ oldItalic = word.Italic;
+ escapeSequence = true;
+ }
+
+ if (oldBold != word.Bold) {
+ if (word.Bold) {
+ rtf.Append(@"\b");
+ } else {
+ rtf.Append(@"\b0");
+ }
+ oldBold = word.Bold;
+ escapeSequence = true;
+ }
+
+ if (firstLine) {
+ rtf.Append(@"\f0\fs" + (textArea.TextEditorProperties.Font.Size * 2));
+ firstLine = false;
+ }
+ if (escapeSequence) {
+ rtf.Append(' ');
+ escapeSequence = false;
+ }
+ string printWord;
+ if (offset < selectionOffset) {
+ printWord = word.Word.Substring(selectionOffset - offset);
+ } else if (offset + word.Word.Length > selectionEndOffset) {
+ printWord = word.Word.Substring(0, (offset + word.Word.Length) - selectionEndOffset);
+ } else {
+ printWord = word.Word;
+ }
+
+ AppendText(rtf, printWord);
+ }
+ offset += word.Length;
+ break;
+ }
+ }
+ if (offset < selectionEndOffset) {
+ rtf.Append(@"\par");
+ }
+ rtf.Append('\n');
+ }
+ }
+
+ return rtf.ToString();
+ }
+
+ static void AppendText(StringBuilder rtfOutput, string text)
+ {
+ //rtf.Append(printWord.Replace(@"\", @"\\").Replace("{", "\\{").Replace("}", "\\}"));
+ foreach (char c in text) {
+ switch (c) {
+ case '\\':
+ rtfOutput.Append(@"\\");
+ break;
+ case '{':
+ rtfOutput.Append("\\{");
+ break;
+ case '}':
+ rtfOutput.Append("\\}");
+ break;
+ default:
+ if (c < 256) {
+ rtfOutput.Append(c);
+ } else {
+ // yes, RTF really expects signed 16-bit integers!
+ rtfOutput.Append("\\u" + unchecked((short)c).ToString() + "?");
+ }
+ break;
+ }
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TextUtility.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TextUtility.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TextUtility.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,81 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Mike Krüger" email="mike at icsharpcode.net"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+
+using ICSharpCode.TextEditor.Document;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ public class TextUtility
+ {
+
+ public static bool RegionMatches(IDocument document, int offset, int length, string word)
+ {
+ if (length != word.Length || document.TextLength < offset + length) {
+ return false;
+ }
+
+ for (int i = 0; i < length; ++i) {
+ if (document.GetCharAt(offset + i) != word[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static bool RegionMatches(IDocument document, bool casesensitive, int offset, int length, string word)
+ {
+ if (casesensitive) {
+ return RegionMatches(document, offset, length, word);
+ }
+
+ if (length != word.Length || document.TextLength < offset + length) {
+ return false;
+ }
+
+ for (int i = 0; i < length; ++i) {
+ if (Char.ToUpper(document.GetCharAt(offset + i)) != Char.ToUpper(word[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static bool RegionMatches(IDocument document, int offset, int length, char[] word)
+ {
+ if (length != word.Length || document.TextLength < offset + length) {
+ return false;
+ }
+
+ for (int i = 0; i < length; ++i) {
+ if (document.GetCharAt(offset + i) != word[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static bool RegionMatches(IDocument document, bool casesensitive, int offset, int length, char[] word)
+ {
+ if (casesensitive) {
+ return RegionMatches(document, offset, length, word);
+ }
+
+ if (length != word.Length || document.TextLength < offset + length) {
+ return false;
+ }
+
+ for (int i = 0; i < length; ++i) {
+ if (Char.ToUpper(document.GetCharAt(offset + i)) != Char.ToUpper(word[i])) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainter.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainter.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainter.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,193 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System.Drawing;
+using System.Drawing.Text;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ static class TipPainter
+ {
+ const float HorizontalBorder = 2;
+ const float VerticalBorder = 1;
+
+ //static StringFormat centerTipFormat = CreateTipStringFormat();
+
+ public static Size GetTipSize(Control control, Graphics graphics, Font font, string description)
+ {
+ return GetTipSize(control, graphics, new TipText (graphics, font, description));
+ }
+
+ static Rectangle GetWorkingArea(Control control)
+ {
+ Form ownerForm = control.FindForm();
+ if (ownerForm.Owner != null) {
+ ownerForm = ownerForm.Owner;
+ }
+
+ return Screen.GetWorkingArea(ownerForm);
+ }
+
+ public static Size GetTipSize(Control control, Graphics graphics, TipSection tipData)
+ {
+ Size tipSize = Size.Empty;
+ SizeF tipSizeF = SizeF.Empty;
+
+ RectangleF workingArea = GetWorkingArea(control);
+
+ PointF screenLocation = control.PointToScreen(Point.Empty);
+
+ SizeF maxLayoutSize = new SizeF(workingArea.Right - screenLocation.X - HorizontalBorder * 2,
+ workingArea.Bottom - screenLocation.Y - VerticalBorder * 2);
+
+ if (maxLayoutSize.Width > 0 && maxLayoutSize.Height > 0) {
+ graphics.TextRenderingHint =
+ TextRenderingHint.AntiAliasGridFit;
+
+ tipData.SetMaximumSize(maxLayoutSize);
+ tipSizeF = tipData.GetRequiredSize();
+ tipData.SetAllocatedSize(tipSizeF);
+
+ tipSizeF += new SizeF(HorizontalBorder * 2,
+ VerticalBorder * 2);
+ tipSize = Size.Ceiling(tipSizeF);
+ }
+
+ if (control.ClientSize != tipSize) {
+ control.ClientSize = tipSize;
+ }
+
+ return tipSize;
+ }
+
+ public static Size GetLeftHandSideTipSize(Control control, Graphics graphics, TipSection tipData, Point p)
+ {
+ Size tipSize = Size.Empty;
+ SizeF tipSizeF = SizeF.Empty;
+
+ RectangleF workingArea = GetWorkingArea(control);
+
+ PointF screenLocation = p;
+
+ SizeF maxLayoutSize = new SizeF(screenLocation.X - HorizontalBorder * 2,
+ workingArea.Bottom - screenLocation.Y - VerticalBorder * 2);
+
+ if (maxLayoutSize.Width > 0 && maxLayoutSize.Height > 0) {
+ graphics.TextRenderingHint =
+ TextRenderingHint.AntiAliasGridFit;
+
+ tipData.SetMaximumSize(maxLayoutSize);
+ tipSizeF = tipData.GetRequiredSize();
+ tipData.SetAllocatedSize(tipSizeF);
+
+ tipSizeF += new SizeF(HorizontalBorder * 2,
+ VerticalBorder * 2);
+ tipSize = Size.Ceiling(tipSizeF);
+ }
+
+ return tipSize;
+ }
+
+ public static Size DrawTip(Control control, Graphics graphics, Font font, string description)
+ {
+ return DrawTip(control, graphics, new TipText (graphics, font, description));
+ }
+
+ public static Size DrawTip(Control control, Graphics graphics, TipSection tipData)
+ {
+ Size tipSize = Size.Empty;
+ SizeF tipSizeF = SizeF.Empty;
+
+ PointF screenLocation = control.PointToScreen(Point.Empty);
+
+ RectangleF workingArea = GetWorkingArea(control);
+
+ SizeF maxLayoutSize = new SizeF(workingArea.Right - screenLocation.X - HorizontalBorder * 2,
+ workingArea.Bottom - screenLocation.Y - VerticalBorder * 2);
+
+ if (maxLayoutSize.Width > 0 && maxLayoutSize.Height > 0) {
+ graphics.TextRenderingHint =
+ TextRenderingHint.AntiAliasGridFit;
+
+ tipData.SetMaximumSize(maxLayoutSize);
+ tipSizeF = tipData.GetRequiredSize();
+ tipData.SetAllocatedSize(tipSizeF);
+
+ tipSizeF += new SizeF(HorizontalBorder * 2,
+ VerticalBorder * 2);
+ tipSize = Size.Ceiling(tipSizeF);
+ }
+
+ if (control.ClientSize != tipSize) {
+ control.ClientSize = tipSize;
+ }
+
+ if (tipSize != Size.Empty) {
+ Rectangle borderRectangle = new Rectangle
+ (Point.Empty, tipSize - new Size(1, 1));
+
+ RectangleF displayRectangle = new RectangleF
+ (HorizontalBorder, VerticalBorder,
+ tipSizeF.Width - HorizontalBorder * 2,
+ tipSizeF.Height - VerticalBorder * 2);
+
+ // DrawRectangle draws from Left to Left + Width. A bug? :-/
+ graphics.DrawRectangle(SystemPens.WindowFrame,
+ borderRectangle);
+ tipData.Draw(new PointF(HorizontalBorder, VerticalBorder));
+ }
+ return tipSize;
+ }
+
+ public static Size DrawFixedWidthTip(Control control, Graphics graphics, TipSection tipData)
+ {
+ Size tipSize = Size.Empty;
+ SizeF tipSizeF = SizeF.Empty;
+
+ PointF screenLocation = control.PointToScreen(new Point(control.Width, 0));
+
+ RectangleF workingArea = GetWorkingArea(control);
+
+ SizeF maxLayoutSize = new SizeF(screenLocation.X - HorizontalBorder * 2,
+ workingArea.Bottom - screenLocation.Y - VerticalBorder * 2);
+
+ if (maxLayoutSize.Width > 0 && maxLayoutSize.Height > 0) {
+ graphics.TextRenderingHint =
+ TextRenderingHint.AntiAliasGridFit;
+
+ tipData.SetMaximumSize(maxLayoutSize);
+ tipSizeF = tipData.GetRequiredSize();
+ tipData.SetAllocatedSize(tipSizeF);
+
+ tipSizeF += new SizeF(HorizontalBorder * 2,
+ VerticalBorder * 2);
+ tipSize = Size.Ceiling(tipSizeF);
+ }
+
+ if (control.Height != tipSize.Height) {
+ control.Height = tipSize.Height;
+ }
+
+ if (tipSize != Size.Empty) {
+ Rectangle borderRectangle = new Rectangle
+ (Point.Empty, control.Size - new Size(1, 1));
+
+ RectangleF displayRectangle = new RectangleF
+ (HorizontalBorder, VerticalBorder,
+ tipSizeF.Width - HorizontalBorder * 2,
+ tipSizeF.Height - VerticalBorder * 2);
+
+ // DrawRectangle draws from Left to Left + Width. A bug? :-/
+ graphics.DrawRectangle(SystemPens.WindowFrame,
+ borderRectangle);
+ tipData.Draw(new PointF(HorizontalBorder, VerticalBorder));
+ }
+ return tipSize;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainterTools.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainterTools.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipPainterTools.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,301 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ static class TipPainterTools
+ {
+ const int SpacerSize = 4;
+
+ public static Size GetLeftHandSideDrawingSizeHelpTipFromCombinedDescription(Control control,
+ Graphics graphics,
+ Font font,
+ string countMessage,
+ string description,
+ Point p)
+ {
+ string basicDescription = null;
+ string documentation = null;
+
+ if (IsVisibleText(description)) {
+ string[] splitDescription = description.Split(new char[] { '\n' }, 2);
+
+ if (splitDescription.Length > 0) {
+ basicDescription = splitDescription[0];
+
+ if (splitDescription.Length > 1) {
+ documentation = splitDescription[1].Trim();
+ }
+ }
+ }
+
+ return GetLeftHandSideDrawingSizeDrawHelpTip(control, graphics, font, countMessage, basicDescription, documentation, p);
+ }
+
+ public static Size GetDrawingSizeHelpTipFromCombinedDescription(Control control,
+ Graphics graphics,
+ Font font,
+ string countMessage,
+ string description)
+ {
+ string basicDescription = null;
+ string documentation = null;
+
+ if (IsVisibleText(description)) {
+ string[] splitDescription = description.Split(new char[] { '\n' }, 2);
+
+ if (splitDescription.Length > 0) {
+ basicDescription = splitDescription[0];
+
+ if (splitDescription.Length > 1) {
+ documentation = splitDescription[1].Trim();
+ }
+ }
+ }
+
+ return GetDrawingSizeDrawHelpTip(control, graphics, font, countMessage, basicDescription, documentation);
+ }
+
+ public static Size DrawHelpTipFromCombinedDescription(Control control,
+ Graphics graphics,
+ Font font,
+ string countMessage,
+ string description)
+ {
+ string basicDescription = null;
+ string documentation = null;
+
+ if (IsVisibleText(description)) {
+ string[] splitDescription = description.Split
+ (new char[] { '\n' }, 2);
+
+ if (splitDescription.Length > 0) {
+ basicDescription = splitDescription[0];
+
+ if (splitDescription.Length > 1) {
+ documentation = splitDescription[1].Trim();
+ }
+ }
+ }
+
+ return DrawHelpTip(control, graphics, font, countMessage,
+ basicDescription, documentation);
+ }
+
+ public static Size DrawFixedWidthHelpTipFromCombinedDescription(Control control,
+ Graphics graphics,
+ Font font,
+ string countMessage,
+ string description)
+ {
+ string basicDescription = null;
+ string documentation = null;
+
+ if (IsVisibleText(description)) {
+ string[] splitDescription = description.Split
+ (new char[] { '\n' }, 2);
+
+ if (splitDescription.Length > 0) {
+ basicDescription = splitDescription[0];
+
+ if (splitDescription.Length > 1) {
+ documentation = splitDescription[1].Trim();
+ }
+ }
+ }
+
+ return DrawFixedWidthHelpTip(control, graphics, font, countMessage,
+ basicDescription, documentation);
+ }
+
+ // btw. I know it's ugly.
+ public static Rectangle DrawingRectangle1;
+ public static Rectangle DrawingRectangle2;
+
+ public static Size GetDrawingSizeDrawHelpTip(Control control,
+ Graphics graphics, Font font,
+ string countMessage,
+ string basicDescription,
+ string documentation)
+ {
+ if (IsVisibleText(countMessage) ||
+ IsVisibleText(basicDescription) ||
+ IsVisibleText(documentation)) {
+ // Create all the TipSection objects.
+ CountTipText countMessageTip = new CountTipText(graphics, font, countMessage);
+
+ TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0));
+
+ TipText descriptionTip = new TipText(graphics, font, basicDescription);
+
+ TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0));
+
+ TipText docTip = new TipText(graphics, font, documentation);
+
+ // Now put them together.
+ TipSplitter descSplitter = new TipSplitter(graphics, false,
+ descriptionTip,
+ docSpacer
+ );
+
+ TipSplitter mainSplitter = new TipSplitter(graphics, true,
+ countMessageTip,
+ countSpacer,
+ descSplitter);
+
+ TipSplitter mainSplitter2 = new TipSplitter(graphics, false,
+ mainSplitter,
+ docTip);
+
+ // Show it.
+ Size size = TipPainter.GetTipSize(control, graphics, mainSplitter2);
+ DrawingRectangle1 = countMessageTip.DrawingRectangle1;
+ DrawingRectangle2 = countMessageTip.DrawingRectangle2;
+ return size;
+ }
+ return Size.Empty;
+ }
+ public static Size GetLeftHandSideDrawingSizeDrawHelpTip(Control control,
+ Graphics graphics, Font font,
+ string countMessage,
+ string basicDescription,
+ string documentation,
+ Point p)
+ {
+ if (IsVisibleText(countMessage) ||
+ IsVisibleText(basicDescription) ||
+ IsVisibleText(documentation)) {
+ // Create all the TipSection objects.
+ CountTipText countMessageTip = new CountTipText(graphics, font, countMessage);
+
+ TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0));
+
+ TipText descriptionTip = new TipText(graphics, font, basicDescription);
+
+ TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0));
+
+ TipText docTip = new TipText(graphics, font, documentation);
+
+ // Now put them together.
+ TipSplitter descSplitter = new TipSplitter(graphics, false,
+ descriptionTip,
+ docSpacer
+ );
+
+ TipSplitter mainSplitter = new TipSplitter(graphics, true,
+ countMessageTip,
+ countSpacer,
+ descSplitter);
+
+ TipSplitter mainSplitter2 = new TipSplitter(graphics, false,
+ mainSplitter,
+ docTip);
+
+ // Show it.
+ Size size = TipPainter.GetLeftHandSideTipSize(control, graphics, mainSplitter2, p);
+ return size;
+ }
+ return Size.Empty;
+ }
+ public static Size DrawHelpTip(Control control,
+ Graphics graphics, Font font,
+ string countMessage,
+ string basicDescription,
+ string documentation)
+ {
+ if (IsVisibleText(countMessage) ||
+ IsVisibleText(basicDescription) ||
+ IsVisibleText(documentation)) {
+ // Create all the TipSection objects.
+ CountTipText countMessageTip = new CountTipText(graphics, font, countMessage);
+
+ TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0));
+
+ TipText descriptionTip = new TipText(graphics, font, basicDescription);
+
+ TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0));
+
+ TipText docTip = new TipText(graphics, font, documentation);
+
+ // Now put them together.
+ TipSplitter descSplitter = new TipSplitter(graphics, false,
+ descriptionTip,
+ docSpacer
+ );
+
+ TipSplitter mainSplitter = new TipSplitter(graphics, true,
+ countMessageTip,
+ countSpacer,
+ descSplitter);
+
+ TipSplitter mainSplitter2 = new TipSplitter(graphics, false,
+ mainSplitter,
+ docTip);
+
+ // Show it.
+ Size size = TipPainter.DrawTip(control, graphics, mainSplitter2);
+ DrawingRectangle1 = countMessageTip.DrawingRectangle1;
+ DrawingRectangle2 = countMessageTip.DrawingRectangle2;
+ return size;
+ }
+ return Size.Empty;
+ }
+
+ public static Size DrawFixedWidthHelpTip(Control control,
+ Graphics graphics, Font font,
+ string countMessage,
+ string basicDescription,
+ string documentation)
+ {
+ if (IsVisibleText(countMessage) ||
+ IsVisibleText(basicDescription) ||
+ IsVisibleText(documentation)) {
+ // Create all the TipSection objects.
+ CountTipText countMessageTip = new CountTipText(graphics, font, countMessage);
+
+ TipSpacer countSpacer = new TipSpacer(graphics, new SizeF(IsVisibleText(countMessage) ? 4 : 0, 0));
+
+ TipText descriptionTip = new TipText(graphics, font, basicDescription);
+
+ TipSpacer docSpacer = new TipSpacer(graphics, new SizeF(0, IsVisibleText(documentation) ? 4 : 0));
+
+ TipText docTip = new TipText(graphics, font, documentation);
+
+ // Now put them together.
+ TipSplitter descSplitter = new TipSplitter(graphics, false,
+ descriptionTip,
+ docSpacer
+ );
+
+ TipSplitter mainSplitter = new TipSplitter(graphics, true,
+ countMessageTip,
+ countSpacer,
+ descSplitter);
+
+ TipSplitter mainSplitter2 = new TipSplitter(graphics, false,
+ mainSplitter,
+ docTip);
+
+ // Show it.
+ Size size = TipPainter.DrawFixedWidthTip(control, graphics, mainSplitter2);
+ DrawingRectangle1 = countMessageTip.DrawingRectangle1;
+ DrawingRectangle2 = countMessageTip.DrawingRectangle2;
+ return size;
+ }
+ return Size.Empty;
+ }
+
+ static bool IsVisibleText(string text)
+ {
+ return text != null && text.Length > 0;
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSection.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSection.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSection.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,84 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ abstract class TipSection
+ {
+ SizeF tipAllocatedSize;
+ Graphics tipGraphics;
+ SizeF tipMaxSize;
+ SizeF tipRequiredSize;
+
+ protected TipSection(Graphics graphics)
+ {
+ tipGraphics = graphics;
+ }
+
+ public abstract void Draw(PointF location);
+
+ public SizeF GetRequiredSize()
+ {
+ return tipRequiredSize;
+ }
+
+ public void SetAllocatedSize(SizeF allocatedSize)
+ {
+ Debug.Assert(allocatedSize.Width >= tipRequiredSize.Width &&
+ allocatedSize.Height >= tipRequiredSize.Height);
+
+ tipAllocatedSize = allocatedSize; OnAllocatedSizeChanged();
+ }
+
+ public void SetMaximumSize(SizeF maximumSize)
+ {
+ tipMaxSize = maximumSize; OnMaximumSizeChanged();
+ }
+
+ protected virtual void OnAllocatedSizeChanged()
+ {
+
+ }
+
+ protected virtual void OnMaximumSizeChanged()
+ {
+
+ }
+
+ protected void SetRequiredSize(SizeF requiredSize)
+ {
+ requiredSize.Width = Math.Max(0, requiredSize.Width);
+ requiredSize.Height = Math.Max(0, requiredSize.Height);
+ requiredSize.Width = Math.Min(tipMaxSize.Width, requiredSize.Width);
+ requiredSize.Height = Math.Min(tipMaxSize.Height, requiredSize.Height);
+
+ tipRequiredSize = requiredSize;
+ }
+
+ protected Graphics Graphics {
+ get {
+ return tipGraphics;
+ }
+ }
+
+ protected SizeF AllocatedSize {
+ get {
+ return tipAllocatedSize;
+ }
+ }
+
+ protected SizeF MaximumSize {
+ get {
+ return tipMaxSize;
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSpacer.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSpacer.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSpacer.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,36 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ class TipSpacer: TipSection
+ {
+ SizeF spacerSize;
+
+ public TipSpacer(Graphics graphics, SizeF size): base(graphics)
+ {
+ spacerSize = size;
+ }
+
+ public override void Draw(PointF location)
+ {
+
+ }
+
+ protected override void OnMaximumSizeChanged()
+ {
+ base.OnMaximumSizeChanged();
+
+ SetRequiredSize(new SizeF
+ (Math.Min(MaximumSize.Width, spacerSize.Width),
+ Math.Min(MaximumSize.Height, spacerSize.Height)));
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSplitter.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSplitter.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipSplitter.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,99 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Diagnostics;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ class TipSplitter: TipSection
+ {
+ bool isHorizontal;
+ float [] offsets;
+ TipSection[] tipSections;
+
+ public TipSplitter(Graphics graphics, bool horizontal, params TipSection[] sections): base(graphics)
+ {
+ Debug.Assert(sections != null);
+
+ isHorizontal = horizontal;
+ offsets = new float[sections.Length];
+ tipSections = (TipSection[])sections.Clone();
+ }
+
+ public override void Draw(PointF location)
+ {
+ if (isHorizontal) {
+ for (int i = 0; i < tipSections.Length; i ++) {
+ tipSections[i].Draw
+ (new PointF(location.X + offsets[i], location.Y));
+ }
+ } else {
+ for (int i = 0; i < tipSections.Length; i ++) {
+ tipSections[i].Draw
+ (new PointF(location.X, location.Y + offsets[i]));
+ }
+ }
+ }
+
+ protected override void OnMaximumSizeChanged()
+ {
+ base.OnMaximumSizeChanged();
+
+ float currentDim = 0;
+ float otherDim = 0;
+ SizeF availableArea = MaximumSize;
+
+ for (int i = 0; i < tipSections.Length; i ++) {
+ TipSection section = (TipSection)tipSections[i];
+
+ section.SetMaximumSize(availableArea);
+
+ SizeF requiredArea = section.GetRequiredSize();
+ offsets[i] = currentDim;
+
+ // It's best to start on pixel borders, so this will
+ // round up to the nearest pixel. Otherwise there are
+ // weird cutoff artifacts.
+ float pixelsUsed;
+
+ if (isHorizontal) {
+ pixelsUsed = (float)Math.Ceiling(requiredArea.Width);
+ currentDim += pixelsUsed;
+
+ availableArea.Width = Math.Max
+ (0, availableArea.Width - pixelsUsed);
+
+ otherDim = Math.Max(otherDim, requiredArea.Height);
+ } else {
+ pixelsUsed = (float)Math.Ceiling(requiredArea.Height);
+ currentDim += pixelsUsed;
+
+ availableArea.Height = Math.Max
+ (0, availableArea.Height - pixelsUsed);
+
+ otherDim = Math.Max(otherDim, requiredArea.Width);
+ }
+ }
+
+ foreach (TipSection section in tipSections) {
+ if (isHorizontal) {
+ section.SetAllocatedSize(new SizeF(section.GetRequiredSize().Width, otherDim));
+ } else {
+ section.SetAllocatedSize(new SizeF(otherDim, section.GetRequiredSize().Height));
+ }
+ }
+
+ if (isHorizontal) {
+ SetRequiredSize(new SizeF(currentDim, otherDim));
+ } else {
+ SetRequiredSize(new SizeF(otherDim, currentDim));
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipText.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipText.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/TipText.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,183 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="none" email=""/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Drawing;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ class CountTipText: TipText
+ {
+ float triHeight = 10;
+ float triWidth = 10;
+
+ public CountTipText(Graphics graphics, Font font, string text) : base(graphics, font, text)
+ {
+ }
+
+ void DrawTriangle(float x, float y, bool flipped)
+ {
+ Brush brush = BrushRegistry.GetBrush(Color.FromArgb(192, 192, 192));
+ base.Graphics.FillRectangle(brush, new RectangleF(x, y, triHeight, triHeight));
+ float triHeight2 = triHeight / 2;
+ float triHeight4 = triHeight / 4;
+ brush = Brushes.Black;
+ if (flipped) {
+ base.Graphics.FillPolygon(brush, new PointF[] {
+ new PointF(x, y + triHeight2 - triHeight4),
+ new PointF(x + triWidth / 2, y + triHeight2 + triHeight4),
+ new PointF(x + triWidth, y + triHeight2 - triHeight4),
+ });
+
+ } else {
+ base.Graphics.FillPolygon(brush, new PointF[] {
+ new PointF(x, y + triHeight2 + triHeight4),
+ new PointF(x + triWidth / 2, y + triHeight2 - triHeight4),
+ new PointF(x + triWidth, y + triHeight2 + triHeight4),
+ });
+ }
+ }
+
+ public Rectangle DrawingRectangle1;
+ public Rectangle DrawingRectangle2;
+
+ public override void Draw(PointF location)
+ {
+ if (tipText != null && tipText.Length > 0) {
+ base.Draw(new PointF(location.X + triWidth + 4, location.Y));
+ DrawingRectangle1 = new Rectangle((int)location.X + 2,
+ (int)location.Y + 2,
+ (int)(triWidth),
+ (int)(triHeight));
+ DrawingRectangle2 = new Rectangle((int)(location.X + base.AllocatedSize.Width - triWidth - 2),
+ (int)location.Y + 2,
+ (int)(triWidth),
+ (int)(triHeight));
+ DrawTriangle(location.X + 2, location.Y + 2, false);
+ DrawTriangle(location.X + base.AllocatedSize.Width - triWidth - 2, location.Y + 2, true);
+ }
+ }
+
+ protected override void OnMaximumSizeChanged()
+ {
+ if (IsTextVisible()) {
+ SizeF tipSize = Graphics.MeasureString
+ (tipText, tipFont, MaximumSize,
+ GetInternalStringFormat());
+ tipSize.Width += triWidth * 2 + 8;
+ SetRequiredSize(tipSize);
+ } else {
+ SetRequiredSize(SizeF.Empty);
+ }
+ }
+
+ }
+
+ class TipText: TipSection
+ {
+ protected StringAlignment horzAlign;
+ protected StringAlignment vertAlign;
+ protected Color tipColor;
+ protected Font tipFont;
+ protected StringFormat tipFormat;
+ protected string tipText;
+
+ public TipText(Graphics graphics, Font font, string text):
+ base(graphics)
+ {
+ tipFont = font; tipText = text;
+ if (text != null && text.Length > short.MaxValue)
+ throw new ArgumentException("TipText: text too long (max. is " + short.MaxValue + " characters)", "text");
+
+ Color = SystemColors.InfoText;
+ HorizontalAlignment = StringAlignment.Near;
+ VerticalAlignment = StringAlignment.Near;
+ }
+
+ public override void Draw(PointF location)
+ {
+ if (IsTextVisible()) {
+ RectangleF drawRectangle = new RectangleF(location, AllocatedSize);
+
+ Graphics.DrawString(tipText, tipFont,
+ BrushRegistry.GetBrush(Color),
+ drawRectangle,
+ GetInternalStringFormat());
+ }
+ }
+
+ protected StringFormat GetInternalStringFormat()
+ {
+ if (tipFormat == null) {
+ tipFormat = CreateTipStringFormat(horzAlign, vertAlign);
+ }
+
+ return tipFormat;
+ }
+
+ protected override void OnMaximumSizeChanged()
+ {
+ base.OnMaximumSizeChanged();
+
+ if (IsTextVisible()) {
+ SizeF tipSize = Graphics.MeasureString
+ (tipText, tipFont, MaximumSize,
+ GetInternalStringFormat());
+
+ SetRequiredSize(tipSize);
+ } else {
+ SetRequiredSize(SizeF.Empty);
+ }
+ }
+
+ static StringFormat CreateTipStringFormat(StringAlignment horizontalAlignment, StringAlignment verticalAlignment)
+ {
+ StringFormat format = (StringFormat)StringFormat.GenericTypographic.Clone();
+ format.FormatFlags = StringFormatFlags.FitBlackBox | StringFormatFlags.MeasureTrailingSpaces;
+ // note: Align Near, Line Center seemed to do something before
+
+ format.Alignment = horizontalAlignment;
+ format.LineAlignment = verticalAlignment;
+
+ return format;
+ }
+
+ protected bool IsTextVisible()
+ {
+ return tipText != null && tipText.Length > 0;
+ }
+
+ public Color Color {
+ get {
+ return tipColor;
+ }
+ set {
+ tipColor = value;
+ }
+ }
+
+ public StringAlignment HorizontalAlignment {
+ get {
+ return horzAlign;
+ }
+ set {
+ horzAlign = value;
+ tipFormat = null;
+ }
+ }
+
+ public StringAlignment VerticalAlignment {
+ get {
+ return vertAlign;
+ }
+ set {
+ vertAlign = value;
+ tipFormat = null;
+ }
+ }
+ }
+}
Added: trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/WeakCollection.cs
===================================================================
--- trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/WeakCollection.cs (rev 0)
+++ trunk/Tools/Maestro/Thirdparty/SharpDevelop/ICSharpCode.TextEditor/Src/Util/WeakCollection.cs 2012-05-29 12:27:02 UTC (rev 6706)
@@ -0,0 +1,136 @@
+// <file>
+// <copyright see="prj:///doc/copyright.txt"/>
+// <license see="prj:///doc/license.txt"/>
+// <owner name="Daniel Grunwald" email="daniel at danielgrunwald.de"/>
+// <version>$Revision$</version>
+// </file>
+
+using System;
+using System.Collections.Generic;
+
+namespace ICSharpCode.TextEditor.Util
+{
+ /// <summary>
+ /// A collection that does not allows its elements to be garbage-collected (unless there are other
+ /// references to the elements). Elements will disappear from the collection when they are
+ /// garbage-collected.
+ ///
+ /// The WeakCollection is not thread-safe, not even for read-only access!
+ /// No methods may be called on the WeakCollection while it is enumerated, not even a Contains or
+ /// creating a second enumerator.
+ /// The WeakCollection does not preserve any order among its contents; the ordering may be different each
+ /// time the collection is enumerated.
+ ///
+ /// Since items may disappear at any time when they are garbage collected, this class
+ /// cannot provide a useful implementation for Count and thus cannot implement the ICollection interface.
+ /// </summary>
+ public class WeakCollection<T> : IEnumerable<T> where T : class
+ {
+ readonly List<WeakReference> innerList = new List<WeakReference>();
+
+ /// <summary>
+ /// Adds an element to the collection. Runtime: O(n).
+ /// </summary>
+ public void Add(T item)
+ {
+ if (item == null)
+ throw new ArgumentNullException("item");
+ CheckNoEnumerator();
+ if (innerList.Count == innerList.Capacity || (innerList.Count % 32) == 31)
+ innerList.RemoveAll(delegate(WeakReference r) { return !r.IsAlive; });
+ innerList.Add(new WeakReference(item));
+ }
+
+ /// <summary>
+ /// Removes all elements from the collection. Runtime: O(n).
+ /// </summary>
+ public void Clear()
+ {
+ innerList.Clear();
+ CheckNoEnumerator();
+ }
+
+ /// <summary>
+ /// Checks if the collection contains an item. Runtime: O(n).
+ /// </summary>
+ public bool Contains(T item)
+ {
+ if (item == null)
+ throw new ArgumentNullException("item");
+ CheckNoEnumerator();
+ foreach (T element in this) {
+ if (item.Equals(element))
+ return true;
+ }
+ return false;
+ }
+
+ /// <summary>
+ /// Removes an element from the collection. Returns true if the item is found and removed,
+ /// false when the item is not found.
+ /// Runtime: O(n).
+ /// </summary>
+ public bool Remove(T item)
+ {
+ if (item == null)
+ throw new ArgumentNullException("item");
+ CheckNoEnumerator();
+ for (int i = 0; i < innerList.Count;) {
+ T element = (T)innerList[i].Target;
+ if (element == null) {
+ RemoveAt(i);
+ } else if (element == item) {
+ RemoveAt(i);
+ return true;
+ } else {
+ i++;
+ }
+ }
+ return false;
+ }
+
+ void RemoveAt(int i)
+ {
+ int lastIndex = innerList.Count - 1;
+ innerList[i] = innerList[lastIndex];
+ innerList.RemoveAt(lastIndex);
+ }
+
+ bool hasEnumerator;
+
+ void CheckNoEnumerator()
+ {
+ if (hasEnumerator)
+ throw new InvalidOperationException("The WeakCollection is already being enumerated, it cannot be modified at the same time. Ensure you dispose the first enumerator before modifying the WeakCollection.");
+ }
+
+ /// <summary>
+ /// Enumerates the collection.
+ /// Each MoveNext() call on the enumerator is O(1), thus the enumeration is O(n).
+ /// </summary>
+ public IEnumerator<T> GetEnumerator()
+ {
+ if (hasEnumerator)
+ throw new InvalidOperationException("The WeakCollection is already being enumerated, it cannot be enumerated twice at the same time. Ensure you dispose the first enumerator before using another enumerator.");
+ try {
+ hasEnumerator = true;
+ for (int i = 0; i < innerList.Count;) {
+ T element = (T)innerList[i].Target;
+ if (element == null) {
+ RemoveAt(i);
+ } else {
+ yield return element;
+ i++;
+ }
+ }
+ } finally {
+ hasEnumerator = false;
+ }
+ }
+
+ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+ }
+}
More information about the mapguide-commits
mailing list