[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