Browse Source

Bookmark/Breakpoint support for AvalonEdit.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3986 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
3fbd48b7d4
  1. 2
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 3
      data/resources/image/BitmapResources/BitmapResources.res
  3. BIN
      data/resources/image/BitmapResources/Bookmarks/Breakpoint.png
  4. BIN
      data/resources/image/BitmapResources/Bookmarks/DisabledBreakpoint.png
  5. BIN
      data/resources/image/BitmapResources/Bookmarks/UnhealthyBreakpoint.png
  6. 54
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
  7. 7
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  8. 9
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs
  9. 35
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlEditorControl.cs
  10. 6
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs
  11. 12
      src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs
  12. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  13. 4
      src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs
  14. 48
      src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs
  15. 2
      src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmarkEventArgs.cs
  16. 3
      src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs
  17. 55
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  18. 168
      src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkBase.cs
  19. 39
      src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkConverter.cs
  20. 24
      src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs
  21. 90
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Commands/MenuCommands.cs
  22. 5
      src/Main/Base/Project/Src/TextEditor/Bookmarks/IBookmarkMargin.cs
  23. 2
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/BookmarkPad.cs
  24. 9
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/BookmarkPadToolbarCommands.cs
  25. 8
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkFolderNode.cs
  26. 29
      src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs
  27. 90
      src/Main/Base/Project/Src/TextEditor/Bookmarks/SDBookmark.cs
  28. 72
      src/Main/Base/Project/Src/TextEditor/Bookmarks/SDMarkerBookmark.cs
  29. 12
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
  30. 17
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs
  31. 9
      src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs
  32. BIN
      src/Main/StartUp/Project/Resources/BitmapResources.resources

2
AddIns/ICSharpCode.SharpDevelop.addin

@ -1765,7 +1765,7 @@ @@ -1765,7 +1765,7 @@
<Path name = "/SharpDevelop/Workbench/ToolBar/Standard">
<ToolbarItem id = "SearchSeparator" type = "Separator"/>
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextEditorControlProvider" action="Disable">
<Condition name = "WindowActive" activewindow="ICSharpCode.SharpDevelop.ITextEditorProvider" action="Disable">
<ToolbarItem id = "Comment"
icon = "Icons.16x16.CommentRegion"
tooltip = "${res:XML.TextAreaContextMenu.CommentUncommentSelection}"

3
data/resources/image/BitmapResources/BitmapResources.res

@ -329,6 +329,9 @@ Bookmarks.DeleteMark = Bookmarks\DeleteMark.png @@ -329,6 +329,9 @@ Bookmarks.DeleteMark = Bookmarks\DeleteMark.png
Bookmarks.DeleteAllMarks = Bookmarks\DeleteAllMarks.png
Bookmarks.EnableDisableAll = Bookmarks\EnableDisableAll.png
Bookmarks.EnableDisableMark = Bookmarks\EnableDisableMark.png
Bookmarks.Breakpoint = Bookmarks\Breakpoint.png
Bookmarks.DisabledBreakpoint = Bookmarks\DisabledBreakpoint.png
Bookmarks.UnhealthyBreakpoint = Bookmarks\UnhealthyBreakpoint.png
#backend icons
C#.ProjectIcon = backendicons\CSharp\SmallProject.png

BIN
data/resources/image/BitmapResources/Bookmarks/Breakpoint.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 B

BIN
data/resources/image/BitmapResources/Bookmarks/DisabledBreakpoint.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

BIN
data/resources/image/BitmapResources/Bookmarks/UnhealthyBreakpoint.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

54
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs

@ -5,7 +5,9 @@ @@ -5,7 +5,9 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.SharpDevelop.Bookmarks;
using System;
using System.Linq;
using System.IO;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.AvalonEdit.Highlighting;
@ -56,11 +58,13 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -56,11 +58,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
return;
isLoading = true;
try {
BookmarksDetach();
codeEditor.FileName = file.FileName;
codeEditor.SyntaxHighlighting =
HighlightingManager.Instance.GetDefinitionByExtension(Path.GetExtension(file.FileName));
LoadFormatter();
codeEditor.Load(stream);
BookmarksAttach();
} finally {
isLoading = false;
}
@ -82,13 +86,61 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -82,13 +86,61 @@ namespace ICSharpCode.AvalonEdit.AddIn
protected override void OnFileNameChanged(OpenedFile file)
{
base.OnFileNameChanged(file);
if (file == PrimaryFile)
if (file == PrimaryFile) {
codeEditor.FileName = file.FileName;
BookmarksNotifyNameChange(file.FileName);
}
}
#region Bookmark Handling
void BookmarksAttach()
{
foreach (SDBookmark bookmark in BookmarkManager.GetBookmarks(codeEditor.FileName)) {
bookmark.Document = codeEditor.Document;
bookmark.BookmarkMargin = codeEditor.IconBarMargin;
codeEditor.IconBarMargin.Bookmarks.Add(bookmark);
}
BookmarkManager.Added += BookmarkManager_Added;
BookmarkManager.Removed += BookmarkManager_Removed;
}
void BookmarksDetach()
{
BookmarkManager.Added -= BookmarkManager_Added;
BookmarkManager.Removed -= BookmarkManager_Removed;
foreach (SDBookmark bookmark in codeEditor.IconBarMargin.Bookmarks.OfType<SDBookmark>()) {
if (bookmark.BookmarkMargin == codeEditor.IconBarMargin) {
bookmark.Document = null;
bookmark.BookmarkMargin = null;
}
}
codeEditor.IconBarMargin.Bookmarks.Clear();
}
void BookmarkManager_Removed(object sender, BookmarkEventArgs e)
{
codeEditor.IconBarMargin.Bookmarks.Remove(e.Bookmark);
}
void BookmarkManager_Added(object sender, BookmarkEventArgs e)
{
if (FileUtility.IsEqualFileName(this.PrimaryFileName, e.Bookmark.FileName)) {
codeEditor.IconBarMargin.Bookmarks.Add(e.Bookmark);
}
}
void BookmarksNotifyNameChange(string newFileName)
{
foreach (SDBookmark bookmark in codeEditor.IconBarMargin.Bookmarks.OfType<SDBookmark>()) {
bookmark.FileName = newFileName;
}
}
#endregion
public override void Dispose()
{
base.Dispose();
BookmarksDetach();
// Unload document on dispose.
codeEditor.Document = null;
}

7
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -28,11 +28,16 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -28,11 +28,16 @@ namespace ICSharpCode.AvalonEdit.AddIn
public class CodeEditor : TextEditor
{
readonly CodeEditorAdapter textEditorAdapter;
IconBarMargin iconBarMargin;
public CodeEditorAdapter TextEditorAdapter {
get { return textEditorAdapter; }
}
public IconBarMargin IconBarMargin {
get { return iconBarMargin; }
}
public string FileName { get; set; }
public CodeEditor()
@ -51,7 +56,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -51,7 +56,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.TextArea.DefaultInputHandler.CommandBindings.Add(
new CommandBinding(CustomCommands.DeleteLine, OnDeleteLine));
IconBarMargin iconBarMargin = new IconBarMargin { TextView = this.TextArea.TextView };
this.iconBarMargin = new IconBarMargin { TextView = this.TextArea.TextView };
this.TextArea.LeftMargins.Insert(0, iconBarMargin);
this.TextArea.TextView.Services.AddService(typeof(IBookmarkMargin), iconBarMargin);
}

9
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs

@ -40,6 +40,11 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -40,6 +40,11 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
InvalidateVisual();
}
public void Redraw()
{
InvalidateVisual();
}
#endregion
#region OnTextViewChanged
@ -75,8 +80,6 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -75,8 +80,6 @@ namespace ICSharpCode.AvalonEdit.AddIn
return new Size(18, 0);
}
static readonly IImage DefaultImage = new ResourceServiceImage("Bookmarks.ToggleMark");
protected override void OnRender(DrawingContext drawingContext)
{
Size renderSize = this.RenderSize;
@ -100,7 +103,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -100,7 +103,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
IBookmark bm;
if (bookmarkDict.TryGetValue(lineNumber, out bm)) {
Rect rect = new Rect(0, line.VisualTop - textView.VerticalOffset, 16, 16);
drawingContext.DrawImage((bm.Image ?? DefaultImage).ImageSource, rect);
drawingContext.DrawImage((bm.Image ?? BookmarkBase.DefaultBookmarkImage).ImageSource, rect);
}
}
}

35
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlEditorControl.cs

@ -38,10 +38,6 @@ namespace ICSharpCode.XmlEditor @@ -38,10 +38,6 @@ namespace ICSharpCode.XmlEditor
Document.HighlightingStrategy = HighlightingManager.Manager.FindHighlighter("XML");
Document.FoldingManager.FoldingStrategy = new XmlFoldingStrategy();
Document.BookmarkManager.Factory = new SDBookmarkFactory(Document.BookmarkManager);
Document.BookmarkManager.Added += new ICSharpCode.TextEditor.Document.BookmarkEventHandler(BookmarkAdded);
Document.BookmarkManager.Removed += new ICSharpCode.TextEditor.Document.BookmarkEventHandler(BookmarkRemoved);
}
/// <summary>
@ -339,36 +335,5 @@ namespace ICSharpCode.XmlEditor @@ -339,36 +335,5 @@ namespace ICSharpCode.XmlEditor
ActiveTextAreaControl.TextArea.EndUpdate();
Document.UndoStack.EndUndoGroup();
}
/// <summary>
/// Have to remove the bookmark from the document otherwise the text will
/// stay marked in red if the bookmark is a breakpoint. This is because
/// there are two bookmark managers, one in SharpDevelop itself and one
/// in the TextEditor library. By default, only the one in the text editor's
/// bookmark manager will be removed, so SharpDevelop will not know about it.
/// Removing it from the SharpDevelop BookMarkManager informs the debugger
/// service that the breakpoint has been removed so it triggers the removal
/// of the text marker.
/// </summary>
void BookmarkRemoved(object sender, ICSharpCode.TextEditor.Document.BookmarkEventArgs e)
{
ICSharpCode.SharpDevelop.Bookmarks.SDBookmark b = e.Bookmark as ICSharpCode.SharpDevelop.Bookmarks.SDBookmark;
if (b != null) {
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.RemoveMark(b);
}
}
/// <summary>
/// Have to add the bookmark to the BookmarkManager otherwise the bookmark is
/// not remembered when re-opening the file and does not show in the
/// bookmark manager.
/// </summary>
void BookmarkAdded(object sender, ICSharpCode.TextEditor.Document.BookmarkEventArgs e)
{
ICSharpCode.SharpDevelop.Bookmarks.SDBookmark b = e.Bookmark as ICSharpCode.SharpDevelop.Bookmarks.SDBookmark;
if (b != null) {
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.AddMark(b);
}
}
}
}

6
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlView.cs

@ -366,8 +366,6 @@ namespace ICSharpCode.XmlEditor @@ -366,8 +366,6 @@ namespace ICSharpCode.XmlEditor
SetDefaultSchema(extension);
xmlEditor.FileName = newFileName;
ICSharpCode.SharpDevelop.Bookmarks.SDBookmarkFactory factory = (ICSharpCode.SharpDevelop.Bookmarks.SDBookmarkFactory)xmlEditor.Document.BookmarkManager.Factory;
factory.ChangeFilename(newFileName);
}
/// <summary>
@ -564,10 +562,6 @@ namespace ICSharpCode.XmlEditor @@ -564,10 +562,6 @@ namespace ICSharpCode.XmlEditor
}
xmlEditor.LoadFile(file.FileName, stream, false, true);
foreach (Bookmarks.SDBookmark mark in Bookmarks.BookmarkManager.GetBookmarks(file.FileName)) {
mark.Document = xmlEditor.Document;
xmlEditor.Document.BookmarkManager.AddMark(mark);
}
UpdateFolding();
}

12
src/AddIns/Misc/Debugger/Debugger.AddIn/Project/Src/Service/WindowsDebugger.cs

@ -44,6 +44,7 @@ using System.IO; @@ -44,6 +44,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
using Debugger;
using Debugger.AddIn;
using Debugger.AddIn.TreeModel;
@ -57,8 +58,7 @@ using ICSharpCode.SharpDevelop.Debugging; @@ -57,8 +58,7 @@ using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using BM = ICSharpCode.SharpDevelop.Bookmarks;
using Process=Debugger.Process;
using Process = Debugger.Process;
namespace ICSharpCode.SharpDevelop.Services
{
@ -467,7 +467,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -467,7 +467,7 @@ namespace ICSharpCode.SharpDevelop.Services
void AddBreakpoint(BreakpointBookmark bookmark)
{
Breakpoint breakpoint = debugger.AddBreakpoint(bookmark.FileName, null, bookmark.LineNumber + 1, 0, bookmark.IsEnabled);
Breakpoint breakpoint = debugger.AddBreakpoint(bookmark.FileName, null, bookmark.LineNumber, 0, bookmark.IsEnabled);
MethodInvoker setBookmarkColor = delegate {
if (debugger.Processes.Count == 0) {
bookmark.IsHealthy = true;
@ -514,7 +514,7 @@ namespace ICSharpCode.SharpDevelop.Services @@ -514,7 +514,7 @@ namespace ICSharpCode.SharpDevelop.Services
EventHandler<ProcessEventArgs> bp_debugger_ProcessStarted = (sender, e) => {
setBookmarkColor();
// User can change line number by inserting or deleting lines
breakpoint.Line = bookmark.LineNumber + 1;
breakpoint.Line = bookmark.LineNumber;
};
EventHandler<ProcessEventArgs> bp_debugger_ProcessExited = (sender, e) => {
setBookmarkColor();
@ -531,12 +531,12 @@ namespace ICSharpCode.SharpDevelop.Services @@ -531,12 +531,12 @@ namespace ICSharpCode.SharpDevelop.Services
break;
case BreakpointAction.Condition:
if (Evaluate(bookmark.Condition, bookmark.ScriptLanguage))
DebuggerService.PrintDebugMessage(string.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Conditional.Breakpoints.BreakpointHitAtBecause}") + "\n", bookmark.LineNumber + 1, bookmark.FileName, bookmark.Condition));
DebuggerService.PrintDebugMessage(string.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Conditional.Breakpoints.BreakpointHitAtBecause}") + "\n", bookmark.LineNumber, bookmark.FileName, bookmark.Condition));
else
this.debuggedProcess.AsyncContinue();
break;
case BreakpointAction.Trace:
DebuggerService.PrintDebugMessage(string.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Conditional.Breakpoints.BreakpointHitAt}") + "\n", bookmark.LineNumber + 1, bookmark.FileName));
DebuggerService.PrintDebugMessage(string.Format(StringParser.Parse("${res:MainWindow.Windows.Debug.Conditional.Breakpoints.BreakpointHitAt}") + "\n", bookmark.LineNumber, bookmark.FileName));
break;
}
});

2
src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj

@ -474,6 +474,7 @@ @@ -474,6 +474,7 @@
<EmbeddedResource Include="Resources\CodeTemplatePanel.xfrm" />
<EmbeddedResource Include="Resources\MarkersTextEditorPanel.xfrm" />
<EmbeddedResource Include="Resources\SortOptionsDialog.xfrm" />
<Compile Include="Src\TextEditor\Bookmarks\BookmarkBase.cs" />
<Compile Include="Src\TextEditor\Bookmarks\Commands\MenuCommands.cs" />
<Compile Include="Src\TextEditor\Bookmarks\IBookmarkMargin.cs" />
<Compile Include="Src\TextEditor\Bookmarks\Pad\Nodes\BookmarkFolderNode.cs" />
@ -483,6 +484,7 @@ @@ -483,6 +484,7 @@
<Compile Include="Src\TextEditor\Bookmarks\SDBookmark.cs" />
<Compile Include="Src\TextEditor\Bookmarks\BookmarkEventHandler.cs" />
<Compile Include="Src\TextEditor\Bookmarks\BookmarkManager.cs" />
<Compile Include="Src\TextEditor\Bookmarks\SDMarkerBookmark.cs" />
<Compile Include="Src\TextEditor\ClipboardHandling.cs" />
<Compile Include="Src\TextEditor\CodeCompletionItemProvider.cs" />
<Compile Include="Src\TextEditor\Codons\AddInTreeSyntaxModeProvider.cs" />

4
src/Main/Base/Project/Src/Commands/CustomStringTagProvider.cs

@ -110,9 +110,9 @@ namespace ICSharpCode.SharpDevelop.Commands @@ -110,9 +110,9 @@ namespace ICSharpCode.SharpDevelop.Commands
}
case "CURTEXT":
{
var tecp = WorkbenchSingleton.Workbench.ActiveViewContent as DefaultEditor.Gui.Editor.ITextEditorControlProvider;
var tecp = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
if (tecp != null) {
return tecp.TextEditorControl.ActiveTextAreaControl.SelectionManager.SelectedText;
return tecp.TextEditor.Document.GetText(tecp.TextEditor.SelectionStart, tecp.TextEditor.SelectionLength);
}
break;
}

48
src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmark.cs

@ -5,10 +5,9 @@ @@ -5,10 +5,9 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.AvalonEdit.Document;
using System;
using System.Drawing;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.SharpDevelop.Bookmarks;
namespace ICSharpCode.SharpDevelop.Debugging
@ -20,6 +19,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -20,6 +19,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
public class BreakpointBookmark : SDMarkerBookmark
{
bool isHealthy = true;
bool isEnabled = true;
string tooltip;
static readonly Color defaultColor = Color.FromArgb(180, 38, 38);
@ -48,37 +48,63 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -48,37 +48,63 @@ namespace ICSharpCode.SharpDevelop.Debugging
return isHealthy;
}
set {
isHealthy = value;
if (Document != null && !Anchor.IsDeleted) {
Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, LineNumber));
Document.CommitUpdate();
if (isHealthy != value) {
isHealthy = value;
Redraw();
}
}
}
public virtual bool IsEnabled {
get {
return isEnabled;
}
set {
if (isEnabled != value) {
isEnabled = value;
if (IsEnabledChanged != null)
IsEnabledChanged(this, EventArgs.Empty);
Redraw();
}
}
}
public event EventHandler IsEnabledChanged;
public string Tooltip {
get { return tooltip; }
set { tooltip = value; }
}
public BreakpointBookmark(string fileName, IDocument document, TextLocation location, BreakpointAction action, string scriptLanguage, string script) : base(fileName, document, location)
public BreakpointBookmark(string fileName, TextLocation location, BreakpointAction action, string scriptLanguage, string script) : base(fileName, location)
{
this.action = action;
this.scriptLanguage = scriptLanguage;
this.condition = script;
}
public override void Draw(IconBarMargin margin, Graphics g, Point p)
{
margin.DrawBreakpoint(g, p.Y, IsEnabled, IsHealthy);
public static readonly IImage BreakpointImage = new ResourceServiceImage("Bookmarks.Breakpoint");
public static readonly IImage DisabledBreakpointImage = new ResourceServiceImage("Bookmarks.DisabledBreakpoint");
public static readonly IImage UnhealthyBreakpointImage = new ResourceServiceImage("Bookmarks.UnhealthyBreakpoint");
public override IImage Image {
get {
if (!this.IsEnabled)
return DisabledBreakpointImage;
else if (this.IsHealthy)
return BreakpointImage;
else
return UnhealthyBreakpointImage;
}
}
/*
protected override TextMarker CreateMarker()
{
LineSegment lineSeg = Anchor.Line;
TextMarker marker = new TextMarker(lineSeg.Offset, lineSeg.Length, TextMarkerType.SolidBlock, defaultColor, Color.White);
Document.MarkerStrategy.AddMarker(marker);
return marker;
}
}*/
}
}

2
src/Main/Base/Project/Src/Services/Debugger/BreakpointBookmarkEventArgs.cs

@ -9,7 +9,7 @@ using System; @@ -9,7 +9,7 @@ using System;
namespace ICSharpCode.SharpDevelop.Debugging
{
public class BreakpointBookmarkEventArgs: EventArgs
public class BreakpointBookmarkEventArgs : EventArgs
{
BreakpointBookmark breakpointBookmark;

3
src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs

@ -15,6 +15,7 @@ using ICSharpCode.SharpDevelop.Bookmarks; @@ -15,6 +15,7 @@ using ICSharpCode.SharpDevelop.Bookmarks;
namespace ICSharpCode.SharpDevelop.Debugging
{
/*
public class CurrentLineBookmark: SDMarkerBookmark
{
static CurrentLineBookmark instance;
@ -93,5 +94,5 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -93,5 +94,5 @@ namespace ICSharpCode.SharpDevelop.Debugging
Document.MarkerStrategy.InsertMarker(0, marker);
return marker;
}
}
}*/
}

55
src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs

@ -1,26 +1,22 @@ @@ -1,26 +1,22 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <owner name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using ICSharpCode.NRefactory;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ICSharpCode.Core;
using ICSharpCode.NRefactory;
using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Project;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
using BM = ICSharpCode.SharpDevelop.Bookmarks;
using ITextAreaToolTipProvider = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextAreaToolTipProvider;
using ITextEditorControlProvider = ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ITextEditorControlProvider;
namespace ICSharpCode.SharpDevelop.Debugging
{
@ -36,8 +32,8 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -36,8 +32,8 @@ namespace ICSharpCode.SharpDevelop.Debugging
ClearDebugMessages();
};
BM.BookmarkManager.Added += BookmarkAdded;
BM.BookmarkManager.Removed += BookmarkRemoved;
BookmarkManager.Added += BookmarkAdded;
BookmarkManager.Removed += BookmarkRemoved;
}
static void GetDescriptors()
@ -120,7 +116,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -120,7 +116,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
static void OnDebugStopped(object sender, EventArgs e)
{
CurrentLineBookmark.Remove();
RemoveCurrentLineMarker();
WorkbenchSingleton.Workbench.WorkbenchLayout.StoreConfiguration();
LayoutConfiguration.CurrentLayoutName = oldLayoutConfiguration;
if (DebugStopped != null)
@ -149,7 +145,6 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -149,7 +145,6 @@ namespace ICSharpCode.SharpDevelop.Debugging
debugCategory.AppendText(msg);
}
public static event EventHandler<BreakpointBookmarkEventArgs> BreakPointChanged;
public static event EventHandler<BreakpointBookmarkEventArgs> BreakPointAdded;
public static event EventHandler<BreakpointBookmarkEventArgs> BreakPointRemoved;
@ -178,7 +173,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -178,7 +173,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
public static IList<BreakpointBookmark> Breakpoints {
get {
List<BreakpointBookmark> breakpoints = new List<BreakpointBookmark>();
foreach (BM.SDBookmark bookmark in BM.BookmarkManager.Bookmarks) {
foreach (SDBookmark bookmark in BookmarkManager.Bookmarks) {
BreakpointBookmark breakpoint = bookmark as BreakpointBookmark;
if (breakpoint != null) {
breakpoints.Add(breakpoint);
@ -188,7 +183,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -188,7 +183,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
}
}
static void BookmarkAdded(object sender, BM.BookmarkEventArgs e)
static void BookmarkAdded(object sender, BookmarkEventArgs e)
{
BreakpointBookmark bb = e.Bookmark as BreakpointBookmark;
if (bb != null) {
@ -197,7 +192,7 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -197,7 +192,7 @@ namespace ICSharpCode.SharpDevelop.Debugging
}
}
static void BookmarkRemoved(object sender, BM.BookmarkEventArgs e)
static void BookmarkRemoved(object sender, BookmarkEventArgs e)
{
BreakpointBookmark bb = e.Bookmark as BreakpointBookmark;
if (bb != null) {
@ -216,26 +211,10 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -216,26 +211,10 @@ namespace ICSharpCode.SharpDevelop.Debugging
public static void ToggleBreakpointAt(ITextEditor editor, int lineNumber)
{
/*ReadOnlyCollection<Bookmark> bookmarks = document.BookmarkManager.Marks;
for (int i = bookmarks.Count - 1; i >= 0; --i) {
BreakpointBookmark breakpoint = bookmarks[i] as BreakpointBookmark;
if (breakpoint != null) {
if (breakpoint.LineNumber == lineNumber) {
document.BookmarkManager.RemoveMark(breakpoint);
return;
}
}
}
int column = 0;
foreach (char ch in document.GetText(document.GetLineSegment(lineNumber))) {
if (!char.IsWhiteSpace(ch)) {
document.BookmarkManager.AddMark(new BreakpointBookmark(fileName, document, new TextLocation(column, lineNumber), BreakpointAction.Break, "", ""));
document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, lineNumber));
document.CommitUpdate();
break;
}
column++;
}*/
BookmarkManager.ToggleBookmark(
editor, lineNumber,
b => b.CanToggle && b is BreakpointBookmark,
location => new BreakpointBookmark(editor.FileName, location, BreakpointAction.Break, "", ""));
}
/* TODO: reimplement this stuff
@ -248,13 +227,13 @@ namespace ICSharpCode.SharpDevelop.Debugging @@ -248,13 +227,13 @@ namespace ICSharpCode.SharpDevelop.Debugging
public static void RemoveCurrentLineMarker()
{
CurrentLineBookmark.Remove();
// CurrentLineBookmark.Remove();
}
public static void JumpToCurrentLine(string SourceFullFilename, int StartLine, int StartColumn, int EndLine, int EndColumn)
{
IViewContent viewContent = FileService.JumpToFilePosition(SourceFullFilename, StartLine, StartColumn);
CurrentLineBookmark.SetPosition(viewContent, StartLine, StartColumn, EndLine, EndColumn);
// CurrentLineBookmark.SetPosition(viewContent, StartLine, StartColumn, EndLine, EndColumn);
}
#region Tool tips

168
src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkBase.cs

@ -0,0 +1,168 @@ @@ -0,0 +1,168 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <author name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.AvalonEdit.Document;
using System.Windows.Input;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
/// <summary>
/// A bookmark that can be attached to an AvalonEdit TextDocument.
/// </summary>
public class BookmarkBase : IBookmark
{
TextLocation location;
TextDocument document;
TextAnchor anchor;
IBookmarkMargin bookmarkMargin;
public TextDocument Document {
get {
return document;
}
set {
if (document != value) {
if (anchor != null) {
location = anchor.Location;
anchor = null;
}
document = value;
CreateAnchor();
OnDocumentChanged(EventArgs.Empty);
}
}
}
public IBookmarkMargin BookmarkMargin {
get { return bookmarkMargin; }
set {
if (bookmarkMargin != value) {
bookmarkMargin = value;
OnBookmarkMarginChanged(EventArgs.Empty);
}
}
}
void CreateAnchor()
{
if (document != null) {
int lineNumber = Math.Max(1, Math.Min(location.Line, document.LineCount));
int lineLength = document.GetLineByNumber(lineNumber).Length;
int offset = document.GetOffset(
new TextLocation(
lineNumber,
Math.Max(1, Math.Min(location.Column, lineLength + 1))
));
anchor = document.CreateAnchor(offset);
// after insertion: keep bookmarks after the initial whitespace (see DefaultFormattingStrategy.SmartReplaceLine)
anchor.MovementType = AnchorMovementType.AfterInsertion;
anchor.Deleted += AnchorDeleted;
} else {
anchor = null;
}
}
void AnchorDeleted(object sender, EventArgs e)
{
RemoveMark();
}
protected virtual void RemoveMark()
{
if (bookmarkMargin != null)
bookmarkMargin.Bookmarks.Remove(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);
}
}
protected virtual void OnBookmarkMarginChanged(EventArgs e)
{
}
protected virtual void Redraw()
{
if (bookmarkMargin != null)
bookmarkMargin.Redraw();
}
public int LineNumber {
get {
if (anchor != null)
return anchor.Line;
else
return location.Line;
}
}
public int ColumnNumber {
get {
if (anchor != null)
return anchor.Column;
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 BookmarkBase(TextLocation location)
{
this.Location = location;
}
public static readonly IImage DefaultBookmarkImage = new ResourceServiceImage("Bookmarks.ToggleMark");
public virtual IImage Image {
get { return DefaultBookmarkImage; }
}
public virtual void MouseDown(MouseButtonEventArgs e)
{
if (e.ChangedButton == MouseButton.Left && CanToggle) {
RemoveMark();
e.Handled = true;
}
}
}
}

39
src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkConverter.cs

@ -5,12 +5,12 @@ @@ -5,12 +5,12 @@
// <version>$Revision$</version>
// </file>
using ICSharpCode.Core;
using ICSharpCode.AvalonEdit.Document;
using System;
using System.ComponentModel;
using System.Globalization;
using System.Text;
using ICSharpCode.TextEditor;
using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
@ -49,13 +49,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -49,13 +49,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
SDBookmark bookmark;
switch (v[0]) {
case "Breakpoint":
bookmark = new Debugging.BreakpointBookmark(fileName, null, new TextLocation(columnNumber, lineNumber), action, scriptLanguage, script);
// bookmark = new Debugging.BreakpointBookmark(fileName, null, new TextLocation(columnNumber, lineNumber), action, scriptLanguage, script);
// bookmark.IsEnabled = bool.Parse(v[4]);
throw new NotImplementedException();
break;
default:
bookmark = new SDBookmark(fileName, null, new TextLocation(columnNumber, lineNumber));
bookmark = new SDBookmark(fileName, new TextLocation(lineNumber, columnNumber));
break;
}
bookmark.IsEnabled = bool.Parse(v[4]);
return bookmark;
} else {
return base.ConvertFrom(context, culture, value);
@ -67,11 +68,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -67,11 +68,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
SDBookmark bookmark = value as SDBookmark;
if (destinationType == typeof(string) && bookmark != null) {
StringBuilder b = new StringBuilder();
if (bookmark is Debugging.BreakpointBookmark) {
b.Append("Breakpoint");
} else {
// if (bookmark is Debugging.BreakpointBookmark) {
// b.Append("Breakpoint");
// } else {
b.Append("Bookmark");
}
// }
b.Append('|');
b.Append(bookmark.FileName);
b.Append('|');
@ -79,16 +80,16 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -79,16 +80,16 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
b.Append('|');
b.Append(bookmark.ColumnNumber);
b.Append('|');
b.Append(bookmark.IsEnabled.ToString());
if (bookmark is Debugging.BreakpointBookmark) {
Debugging.BreakpointBookmark bbm = (Debugging.BreakpointBookmark)bookmark;
b.Append('|');
b.Append(bbm.Action);
b.Append('|');
b.Append(bbm.ScriptLanguage);
b.Append('|');
b.Append(bbm.Condition);
}
// b.Append(bookmark.IsEnabled.ToString());
// if (bookmark is Debugging.BreakpointBookmark) {
// Debugging.BreakpointBookmark bbm = (Debugging.BreakpointBookmark)bookmark;
// b.Append('|');
// b.Append(bbm.Action);
// b.Append('|');
// b.Append(bbm.ScriptLanguage);
// b.Append('|');
// b.Append(bbm.Condition);
// }
return b.ToString();
} else {
return base.ConvertTo(context, culture, value, destinationType);

24
src/Main/Base/Project/Src/TextEditor/Bookmarks/BookmarkManager.cs

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <owner name="Daniel Grunwald"/>
// <version>$Revision$</version>
// </file>
@ -12,7 +12,7 @@ using ICSharpCode.Core; @@ -12,7 +12,7 @@ using ICSharpCode.Core;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
/// <summary>
/// Description of BookmarkManager.
/// Static class that maintains the list of bookmarks and breakpoints.
/// </summary>
public static class BookmarkManager
{
@ -80,14 +80,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -80,14 +80,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
Project.ProjectService.SolutionClosing += delegate { Clear(); };
}
static void OnRemoved(BookmarkEventArgs e)
static void OnRemoved(BookmarkEventArgs e)
{
if (Removed != null) {
Removed(null, e);
}
}
static void OnAdded(BookmarkEventArgs e)
static void OnAdded(BookmarkEventArgs e)
{
if (Added != null) {
Added(null, e);
@ -105,6 +105,22 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -105,6 +105,22 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
return projectBookmarks;
}
public static void ToggleBookmark(ITextEditor editor, int line,
Predicate<SDBookmark> canToggle,
Func<ICSharpCode.AvalonEdit.Document.TextLocation, SDBookmark> bookmarkFactory)
{
foreach (SDBookmark bookmark in GetBookmarks(editor.FileName)) {
if (canToggle(bookmark) && bookmark.LineNumber == line) {
BookmarkManager.RemoveMark(bookmark);
return;
}
}
// no bookmark at that line: create a new bookmark
int lineStartOffset = editor.Document.GetLine(line).Offset;
int column = 1 + DocumentUtilitites.GetIndentation(editor.Document, lineStartOffset).Length;
BookmarkManager.AddMark(bookmarkFactory(new ICSharpCode.AvalonEdit.Document.TextLocation(line, column)));
}
public static event BookmarkEventHandler Removed;
public static event BookmarkEventHandler Added;
}

90
src/Main/Base/Project/Src/TextEditor/Bookmarks/Commands/MenuCommands.cs

@ -6,50 +6,92 @@ @@ -6,50 +6,92 @@
// </file>
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.DefaultEditor.Commands;
using ICSharpCode.TextEditor.Actions;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
public class ToggleBookmark : AbstractEditActionMenuCommand
public abstract class BookmarkMenuCommand : AbstractMenuCommand
{
public override IEditAction EditAction {
get {
return new ICSharpCode.TextEditor.Actions.ToggleBookmark();
public override void Run()
{
ITextEditorProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorProvider;
if (provider != null) {
ITextEditor editor = provider.TextEditor;
IBookmarkMargin margin = editor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin;
if (editor != null && margin != null) {
Run(editor, margin);
}
}
}
protected static List<SDBookmark> GetBookmarks(IBookmarkMargin bookmarkMargin)
{
return (from b in bookmarkMargin.Bookmarks.OfType<SDBookmark>()
where b.CanToggle
orderby b.LineNumber
select b).ToList();
}
protected abstract void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin);
}
public class PrevBookmark : AbstractEditActionMenuCommand
public class ToggleBookmark : BookmarkMenuCommand
{
public static bool AcceptOnlyStandardBookmarks(Bookmark mark)
protected override void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin)
{
return (mark is SDBookmark);
BookmarkManager.ToggleBookmark(editor, editor.Caret.Line,
b => b.CanToggle,
location => new SDBookmark(editor.FileName, location));
}
public override IEditAction EditAction {
get {
return new ICSharpCode.TextEditor.Actions.GotoPrevBookmark(PrevBookmark.AcceptOnlyStandardBookmarks);
}
public class PrevBookmark : BookmarkMenuCommand
{
protected override void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin)
{
int line = editor.Caret.Line;
var bookmarks = GetBookmarks(bookmarkMargin);
var bookmark = bookmarks.LastOrDefault(b => b.LineNumber < line);
if (bookmark == null && bookmarks.Count > 0) {
bookmark = bookmarks[bookmarks.Count - 1]; // jump around to last bookmark
}
if (bookmark != null) {
FileService.JumpToFilePosition(bookmark.FileName, bookmark.LineNumber, bookmark.ColumnNumber);
}
}
}
public class NextBookmark : AbstractEditActionMenuCommand
public class NextBookmark : BookmarkMenuCommand
{
public override IEditAction EditAction {
get {
return new ICSharpCode.TextEditor.Actions.GotoNextBookmark(PrevBookmark.AcceptOnlyStandardBookmarks);
protected override void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin)
{
int line = editor.Caret.Line;
var bookmarks = GetBookmarks(bookmarkMargin);
var bookmark = bookmarks.FirstOrDefault(b => b.LineNumber > line);
if (bookmark == null && bookmarks.Count > 0) {
bookmark = bookmarks[0]; // jump around to first bookmark
}
if (bookmark != null) {
FileService.JumpToFilePosition(bookmark.FileName, bookmark.LineNumber, bookmark.ColumnNumber);
}
}
}
public class ClearBookmarks : AbstractEditActionMenuCommand
public class ClearBookmarks : BookmarkMenuCommand
{
public override IEditAction EditAction {
get {
return new ICSharpCode.TextEditor.Actions.ClearAllBookmarks(PrevBookmark.AcceptOnlyStandardBookmarks);
}
protected override void Run(ITextEditor editor, IBookmarkMargin bookmarkMargin)
{
var bookmarks = (from b in bookmarkMargin.Bookmarks.OfType<SDBookmark>()
where b.CanToggle
select b).ToList();
foreach (SDBookmark b in bookmarks)
BookmarkManager.RemoveMark(b);
}
}
}

5
src/Main/Base/Project/Src/TextEditor/Bookmarks/IBookmarkMargin.cs

@ -20,6 +20,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -20,6 +20,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
/// Gets the list of bookmarks.
/// </summary>
IList<IBookmark> Bookmarks { get; }
/// <summary>
/// Redraws the bookmark margin. Bookmarks need to call this method when the Image changes.
/// </summary>
void Redraw();
}
/// <summary>

2
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/BookmarkPad.cs

@ -127,7 +127,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -127,7 +127,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
protected virtual bool ShowBookmarkInThisPad(SDBookmark mark)
{
return mark.IsVisibleInBookmarkPad && !(mark is Debugging.BreakpointBookmark);
return mark.IsVisibleInBookmarkPad;
}
void BookmarkManagerAdded(object sender, BookmarkEventArgs e)

9
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/BookmarkPadToolbarCommands.cs

@ -17,6 +17,7 @@ using System.Windows.Forms; @@ -17,6 +17,7 @@ using System.Windows.Forms;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
#region Goto Commands
/*
public class GotoNext : AbstractEditActionMenuCommand
{
public override IEditAction EditAction {
@ -34,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -34,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
}
}
}
*/
#endregion Goto Commands
#region Delete BookMark(s) commands
@ -42,11 +43,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -42,11 +43,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public abstract class AbstractDeleteMarkClass : AbstractMenuCommand
{
protected void deleteBookMark (BookmarkNode node) {
if (node.Bookmark.Document != null) {
node.Bookmark.Document.BookmarkManager.RemoveMark(node.Bookmark);
} else {
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.RemoveMark(node.Bookmark);
}
ICSharpCode.SharpDevelop.Bookmarks.BookmarkManager.RemoveMark(node.Bookmark);
}
}

8
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkFolderNode.cs

@ -118,10 +118,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -118,10 +118,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
{
Nodes.Clear();
if (marks.Count > 0) {
IDocument document = marks[0].Document;
if (document != null && document.HighlightingStrategy == null) {
document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(fileName);
}
// IDocument document = marks[0].Document;
// if (document != null && document.HighlightingStrategy == null) {
// document.HighlightingStrategy = HighlightingStrategyFactory.CreateHighlightingStrategyForFile(fileName);
// }
foreach (SDBookmark mark in marks) {
TreeNode newResult = new BookmarkNode(mark);
Nodes.Add(newResult);

29
src/Main/Base/Project/Src/TextEditor/Bookmarks/Pad/Nodes/BookmarkNode.cs

@ -21,12 +21,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -21,12 +21,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public class BookmarkNode : ExtTreeNode
{
SDBookmark bookmark;
LineSegment line;
SizeF spaceSize;
static StringFormat sf = (StringFormat)System.Drawing.StringFormat.GenericTypographic.Clone();
LineSegment line;
string positionText;
public SDBookmark Bookmark {
@ -40,8 +39,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -40,8 +39,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
drawDefault = false;
this.bookmark = bookmark;
Tag = bookmark;
Checked = bookmark.IsEnabled;
positionText = "(" + (bookmark.LineNumber + 1) + ") ";
// Checked = bookmark.IsEnabled;
positionText = "(" + (bookmark.LineNumber) + ") ";
bookmark.DocumentChanged += BookmarkDocumentChanged;
bookmark.LineNumberChanged += BookmarkLineNumberChanged;
@ -54,20 +53,20 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -54,20 +53,20 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public override void CheckedChanged()
{
bookmark.IsEnabled = Checked;
// bookmark.IsEnabled = Checked;
}
void BookmarkDocumentChanged(object sender, EventArgs e)
{
if (bookmark.Document != null) {
line = bookmark.Document.GetLineSegment(Math.Min(bookmark.LineNumber, bookmark.Document.TotalNumberOfLines));
Text = positionText + bookmark.Document.GetText(line);
// line = bookmark.Document.GetLineSegment(Math.Min(bookmark.LineNumber, bookmark.Document.TotalNumberOfLines));
// Text = positionText + bookmark.Document.GetText(line);
}
}
void BookmarkLineNumberChanged(object sender, EventArgs e)
{
positionText = "(" + (bookmark.LineNumber + 1) + ") ";
positionText = "(" + (bookmark.LineNumber) + ") ";
BookmarkDocumentChanged(sender, e);
}
@ -76,7 +75,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -76,7 +75,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
Graphics g = e.Graphics;
int x = MeasureTextWidth(g, positionText, BoldMonospacedFont);
if (line != null && !line.IsDeleted) {
x += MeasureTextWidth(g, bookmark.Document.GetText(line).Replace("\t", " "), BoldMonospacedFont);
// x += MeasureTextWidth(g, bookmark.Document.GetText(line).Replace("\t", " "), BoldMonospacedFont);
}
return x;
}
@ -140,12 +139,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -140,12 +139,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
}
}
} else {
DrawDocumentWord(g,
bookmark.Document.GetText(line),
new PointF(xPos, yPos),
RegularMonospacedFont,
GetTextColor(state, Color.Black)
);
// DrawDocumentWord(g,
// bookmark.Document.GetText(line),
// new PointF(xPos, yPos),
// RegularMonospacedFont,
// GetTextColor(state, Color.Black)
// );
}
}
}

90
src/Main/Base/Project/Src/TextEditor/Bookmarks/SDBookmark.cs

@ -7,8 +7,7 @@ @@ -7,8 +7,7 @@
using System;
using System.ComponentModel;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Document;
using ICSharpCode.AvalonEdit.Document;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
@ -16,9 +15,9 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -16,9 +15,9 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
/// A bookmark that is persistant across SharpDevelop sessions.
/// </summary>
[TypeConverter(typeof(BookmarkConverter))]
public class SDBookmark : Bookmark
public class SDBookmark : BookmarkBase
{
public SDBookmark(string fileName, IDocument document, TextLocation location) : base(document, location)
public SDBookmark(string fileName, TextLocation location) : base(location)
{
this.fileName = fileName;
}
@ -89,89 +88,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -89,89 +88,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
isVisibleInBookmarkPad = value;
}
}
}
/// <summary>
/// A bookmark that is persistant across SharpDevelop sessions and has a text marker assigned to it.
/// </summary>
public abstract class SDMarkerBookmark : SDBookmark
{
public SDMarkerBookmark(string fileName, IDocument document, TextLocation location) : base(fileName, document, location)
{
SetMarker();
}
IDocument oldDocument;
TextMarker oldMarker;
protected abstract TextMarker CreateMarker();
void SetMarker()
{
RemoveMarker();
if (Document != null) {
TextMarker marker = CreateMarker();
// Perform editor update
Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, LineNumber));
Document.CommitUpdate();
oldMarker = marker;
}
oldDocument = Document;
}
protected override void OnDocumentChanged(EventArgs e)
{
base.OnDocumentChanged(e);
SetMarker();
}
public void RemoveMarker()
{
if (oldDocument != null) {
int from = SafeGetLineNumberForOffset(oldDocument, oldMarker.Offset);
int to = SafeGetLineNumberForOffset(oldDocument, oldMarker.Offset + oldMarker.Length);
oldDocument.MarkerStrategy.RemoveMarker(oldMarker);
oldDocument.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, from, to));
oldDocument.CommitUpdate();
}
oldDocument = null;
oldMarker = null;
}
static int SafeGetLineNumberForOffset(IDocument document, int offset)
{
if (offset <= 0)
return 0;
if (offset >= document.TextLength)
return document.TotalNumberOfLines;
return document.GetLineNumberForOffset(offset);
}
}
public class SDBookmarkFactory : IBookmarkFactory
{
string fileName;
ICSharpCode.TextEditor.Document.BookmarkManager manager;
public SDBookmarkFactory(ICSharpCode.TextEditor.Document.BookmarkManager manager)
{
this.manager = manager;
}
public void ChangeFilename(string newFileName)
{
fileName = newFileName;
foreach (Bookmark mark in manager.Marks) {
SDBookmark sdMark = mark as SDBookmark;
if (sdMark != null) {
sdMark.FileName = newFileName;
}
}
}
public Bookmark CreateBookmark(IDocument document, TextLocation location)
protected override void RemoveMark()
{
return new SDBookmark(fileName, document, location);
BookmarkManager.RemoveMark(this);
}
}
}

72
src/Main/Base/Project/Src/TextEditor/Bookmarks/SDMarkerBookmark.cs

@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Mike Krüger" email="mike@icsharpcode.net"/>
// <version>$Revision$</version>
// </file>
using System;
using ICSharpCode.AvalonEdit.Document;
namespace ICSharpCode.SharpDevelop.Bookmarks
{
/// <summary>
/// A bookmark that is persistant across SharpDevelop sessions and has a text marker assigned to it.
/// </summary>
public abstract class SDMarkerBookmark : SDBookmark
{
public SDMarkerBookmark(string fileName, TextLocation location) : base(fileName, location)
{
//SetMarker();
}
/*
IDocument oldDocument;
TextMarker oldMarker;
protected abstract TextMarker CreateMarker();
void SetMarker()
{
RemoveMarker();
if (Document != null) {
TextMarker marker = CreateMarker();
// Perform editor update
Document.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.SingleLine, LineNumber));
Document.CommitUpdate();
oldMarker = marker;
}
oldDocument = Document;
}
protected override void OnDocumentChanged(EventArgs e)
{
base.OnDocumentChanged(e);
SetMarker();
}
*/
public void RemoveMarker()
{
/*
if (oldDocument != null) {
int from = SafeGetLineNumberForOffset(oldDocument, oldMarker.Offset);
int to = SafeGetLineNumberForOffset(oldDocument, oldMarker.Offset + oldMarker.Length);
oldDocument.MarkerStrategy.RemoveMarker(oldMarker);
oldDocument.RequestUpdate(new TextAreaUpdate(TextAreaUpdateType.LinesBetween, from, to));
oldDocument.CommitUpdate();
}
oldDocument = null;
oldMarker = null;*/
}
static int SafeGetLineNumberForOffset(TextDocument document, int offset)
{
if (offset <= 0)
return 0;
if (offset >= document.TextLength)
return document.LineCount;
return document.GetLineByOffset(offset).LineNumber;
}
}
}

12
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

@ -72,12 +72,13 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -72,12 +72,13 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
adapter = new TextEditorAdapter(this);
Document.FoldingManager.FoldingStrategy = new ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.ParserFoldingStrategy();
Document.BookmarkManager.Factory = new Bookmarks.SDBookmarkFactory(Document.BookmarkManager);
Document.BookmarkManager.Added += new BookmarkEventHandler(BookmarkAdded);
Document.BookmarkManager.Removed += new BookmarkEventHandler(BookmarkRemoved);
Document.LineCountChanged += BookmarkLineCountChanged;
// Document.BookmarkManager.Factory = new Bookmarks.SDBookmarkFactory(Document.BookmarkManager);
// Document.BookmarkManager.Added += new BookmarkEventHandler(BookmarkAdded);
// Document.BookmarkManager.Removed += new BookmarkEventHandler(BookmarkRemoved);
// Document.LineCountChanged += BookmarkLineCountChanged;
}
/*
void BookmarkAdded(object sender, BookmarkEventArgs e)
{
Bookmarks.SDBookmark b = e.Bookmark as Bookmarks.SDBookmark;
@ -104,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -104,7 +105,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
}
}
}*/
protected override void InitializeTextAreaControl(TextAreaControl newControl)
{
@ -286,7 +287,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -286,7 +287,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
protected override void OnFileNameChanged(EventArgs e)
{
base.OnFileNameChanged(e);
((Bookmarks.SDBookmarkFactory)Document.BookmarkManager.Factory).ChangeFilename(this.FileName);
ActivateQuickClassBrowserOnDemand();
}

17
src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs

@ -251,10 +251,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -251,10 +251,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
bool autodetectEncoding = true;
textEditorControl.LoadFile(file.FileName, stream, true, autodetectEncoding);
textEditorControl.FileLoaded();
foreach (Bookmarks.SDBookmark mark in Bookmarks.BookmarkManager.GetBookmarks(file.FileName)) {
mark.Document = textEditorControl.Document;
textEditorControl.Document.BookmarkManager.AddMark(mark);
}
// foreach (Bookmarks.SDBookmark mark in Bookmarks.BookmarkManager.GetBookmarks(file.FileName)) {
// mark.Document = textEditorControl.Document;
// textEditorControl.Document.BookmarkManager.AddMark(mark);
// }
ForceFoldingUpdate();
}
@ -392,7 +392,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -392,7 +392,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
textEditorControl.Document.TextContent, false);
}
textEditorControl.Document.FoldingManager.UpdateFoldings(fileName, parseInfo);
UpdateClassMemberBookmarks(parseInfo);
//UpdateClassMemberBookmarks(parseInfo);
}
}
@ -407,7 +407,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -407,7 +407,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
try {
textEditorControl.Document.FoldingManager.UpdateFoldings(TitleName, parseInfo);
UpdateClassMemberBookmarks(parseInfo);
//UpdateClassMemberBookmarks(parseInfo);
textEditorControl.ActiveTextAreaControl.TextArea.Refresh(textEditorControl.ActiveTextAreaControl.TextArea.FoldMargin);
textEditorControl.ActiveTextAreaControl.TextArea.Refresh(textEditorControl.ActiveTextAreaControl.TextArea.IconBarMargin);
} catch (Exception ex) {
@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
/*
void UpdateClassMemberBookmarks(ParseInformation parseInfo)
{
BookmarkManager bm = textEditorControl.Document.BookmarkManager;
@ -431,7 +432,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -431,7 +432,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
void AddClassMemberBookmarks(BookmarkManager bm, IClass c)
{
/*
if (c.IsSynthetic) return;
if (!c.Region.IsEmpty) {
bm.AddMark(new Bookmarks.ClassBookmark(c));
@ -454,13 +454,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -454,13 +454,14 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
foreach (IEvent e in c.Events) {
if (e.Region.IsEmpty || e.IsSynthetic) continue;
bm.AddMark(new Bookmarks.EventBookmark(e));
}*/
}
}
bool IsClassMemberBookmark(Bookmark b)
{
return b is Bookmarks.ClassMemberBookmark || b is Bookmarks.ClassBookmark;
}
*/
#region ICSharpCode.SharpDevelop.Gui.IClipboardHandler interface implementation
public bool EnableCut {

9
src/Main/ICSharpCode.SharpDevelop.Sda/Src/ExceptionBox.cs

@ -71,9 +71,16 @@ namespace ICSharpCode.SharpDevelop.Sda @@ -71,9 +71,16 @@ namespace ICSharpCode.SharpDevelop.Sda
ShowErrorBox(exception, message, false);
}
[ThreadStatic]
static bool showingBox;
[SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
static void ShowErrorBox(Exception exception, string message, bool mustTerminate)
{
// ignore reentrant calls (e.g. when there's an exception in OnRender)
if (showingBox)
return;
showingBox = true;
try {
using (ExceptionBox box = new ExceptionBox(exception, message, mustTerminate)) {
if (ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.InvokeRequired)
@ -85,6 +92,8 @@ namespace ICSharpCode.SharpDevelop.Sda @@ -85,6 +92,8 @@ namespace ICSharpCode.SharpDevelop.Sda
LoggingService.Warn("Error showing ExceptionBox", ex);
MessageBox.Show(exception.ToString(), message, MessageBoxButtons.OK,
MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly);
} finally {
showingBox = false;
}
}

BIN
src/Main/StartUp/Project/Resources/BitmapResources.resources

Binary file not shown.
Loading…
Cancel
Save