From 864ed8b726c9383df0acb43dcf76dea85aa903f8 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 17 May 2005 18:29:41 +0000 Subject: [PATCH] IconMargin now shows icons for methods and properties that can be clicked to execute actions on the properties/methods. Currently, only "go to base class" is available for overridden methods, which jumps to the method that was overridden. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@146 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- AddIns/ICSharpCode.SharpDevelop.addin | 4 + .../Src/Document/BookmarkManager/Bookmark.cs | 4 +- .../BookmarkManager/BookmarkManager.cs | 12 ++ .../Project/Src/Gui/IconBarMargin.cs | 2 +- .../NRefactory/Project/NRefactory.csproj | 4 +- .../Project/ICSharpCode.SharpDevelop.csproj | 2 + .../Src/Commands/ClassMemberMenuBuilder.cs | 134 ++++++++++++++++++ .../Gui/Components/StatusBar/SdStatusBar.cs | 12 +- .../Base/Project/Src/Gui/IProgressMonitor.cs | 1 + .../Src/Services/Debugger/DebuggerService.cs | 1 + .../CaseSensitiveProjectContent.cs | 12 +- .../Services/ParserService/ParserService.cs | 4 + .../Bookmarks/ClassMemberBookmark.cs | 82 +++++++++++ .../Gui/Editor/SharpDevelopTextAreaControl.cs | 10 +- .../Gui/Editor/TextEditorDisplayBinding.cs | 22 +++ .../Core/Project/Src/AddInTree/AddIn/AddIn.cs | 3 +- 16 files changed, 297 insertions(+), 12 deletions(-) create mode 100644 src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs create mode 100644 src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs diff --git a/AddIns/ICSharpCode.SharpDevelop.addin b/AddIns/ICSharpCode.SharpDevelop.addin index 7af879c82b..7cf7c08391 100644 --- a/AddIns/ICSharpCode.SharpDevelop.addin +++ b/AddIns/ICSharpCode.SharpDevelop.addin @@ -1451,6 +1451,10 @@ class = "ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.TextEditorDisplayBinding" /> + + + + predicate) + { + for (int i = 0; i < bookmark.Count; ++i) { + Bookmark bm = bookmark[i]; + if (predicate(bm)) { + bookmark.RemoveAt(i--); + OnRemoved(new BookmarkEventArgs(bm)); + } + } + OnChanged(EventArgs.Empty); + } + /// /// true, if a mark at mark exists, otherwise false /// diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs index 9ed803d719..f01482c5dd 100644 --- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs +++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs @@ -69,7 +69,7 @@ namespace ICSharpCode.TextEditor int fontHeight = textArea.TextView.FontHeight; int yPos = lineNumber * fontHeight - textArea.VirtualTop.Y; if (mousePos.Y > yPos && mousePos.Y < yPos + fontHeight) { - mark.Click(mouseButtons); + mark.Click(textArea, new MouseEventArgs(mouseButtons, 1, mousePos.X, mousePos.Y, 0)); if (oldCount != marks.Count) { textArea.UpdateLine(lineNumber); } diff --git a/src/Libraries/NRefactory/Project/NRefactory.csproj b/src/Libraries/NRefactory/Project/NRefactory.csproj index 11b0202654..ff1ebca922 100644 --- a/src/Libraries/NRefactory/Project/NRefactory.csproj +++ b/src/Libraries/NRefactory/Project/NRefactory.csproj @@ -4,7 +4,7 @@ AnyCPU 8.0.41115 2.0 - {3a9ae6aa-bc07-4a2f-972c-581e3ae2f195} + {3A9AE6AA-BC07-4A2F-972C-581E3AE2F195} ICSharpCode.NRefactory ICSharpCode.NRefactory Library @@ -197,4 +197,4 @@ - + \ No newline at end of file diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 077327133f..cce4ae8091 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -662,6 +662,8 @@ Component + + diff --git a/src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs b/src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs new file mode 100644 index 0000000000..f47eed9606 --- /dev/null +++ b/src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs @@ -0,0 +1,134 @@ +// +// +// +// +// +// + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using ICSharpCode.Core; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Dom; +using ICSharpCode.SharpDevelop.Bookmarks; + +namespace ICSharpCode.SharpDevelop.Commands +{ + /// + /// Build context menu for class members in the text editor. + /// + public class ClassMemberMenuBuilder : ISubmenuBuilder + { + public ToolStripItem[] BuildSubmenu(Codon codon, object owner) + { + MenuCommand cmd; + ClassMemberBookmark bookmark = (ClassMemberBookmark)owner; + IMember member = bookmark.Member; + List list = new List(); + + cmd = new MenuCommand("&Rename", Rename); + cmd.Tag = member; + list.Add(cmd); + + if (member.IsOverride) { + cmd = new MenuCommand("Go to &base class", GoToBase); + cmd.Tag = member; + list.Add(cmd); + } + if (member.IsVirtual || member.IsAbstract || (member.IsOverride && !member.DeclaringType.IsSealed)) { + cmd = new MenuCommand("Find &overrides", FindOverrides); + cmd.Tag = member; + list.Add(cmd); + } + + cmd = new MenuCommand("&Find references", FindReferences); + cmd.Tag = member; + list.Add(cmd); + + return list.ToArray(); + } + + #region GoToBase + void GoToBase(object sender, EventArgs e) + { + MenuCommand item = (MenuCommand)sender; + IMember member = (IMember)item.Tag; + IMember baseMember = FindBaseMember(member); + if (baseMember != null) { + ICompilationUnit cu = baseMember.DeclaringType.CompilationUnit; + if (cu != null) { + string fileName = cu.FileName; + if (fileName != null) { + if (baseMember.Region != null && baseMember.Region.BeginLine > 0) { + FileService.JumpToFilePosition(fileName, baseMember.Region.BeginLine - 1, 0); + } else { + FileService.JumpToFilePosition(fileName, 0, 0); + } + return; + } + } + } + } + + IMember FindBaseMember(IMember member) + { + IClass parentClass = member.DeclaringType; + IClass baseClass = parentClass.BaseClass; + if (baseClass == null) return null; + if (member is IMethod) { + IMethod parentMethod = (IMethod)member; + foreach (IClass childClass in baseClass.ClassInheritanceTree) { + foreach (IMethod m in childClass.Methods) { + if (string.Equals(parentMethod.Name, m.Name, StringComparison.InvariantCultureIgnoreCase)) { + if (m.IsStatic == parentMethod.IsStatic) { + if (DiffUtility.Compare(parentMethod.Parameters, m.Parameters) == 0) { + return m; + } + } + } + } + } + } else if (member is IProperty) { + IProperty parentMethod = (IProperty)member; + foreach (IClass childClass in baseClass.ClassInheritanceTree) { + foreach (IProperty m in childClass.Properties) { + if (string.Equals(parentMethod.Name, m.Name, StringComparison.InvariantCultureIgnoreCase)) { + if (m.IsStatic == parentMethod.IsStatic) { + if (DiffUtility.Compare(parentMethod.Parameters, m.Parameters) == 0) { + return m; + } + } + } + } + } + } + return null; + } + #endregion + + void Rename(object sender, EventArgs e) + { + MenuCommand item = (MenuCommand)sender; + IMember member = (IMember)item.Tag; + MessageService.ShowMessage("Not implemented."); + } + + void FindOverrides(object sender, EventArgs e) + { + MenuCommand item = (MenuCommand)sender; + IMember member = (IMember)item.Tag; + MessageService.ShowMessage("Not implemented."); + } + + void FindReferences(object sender, EventArgs e) + { + MenuCommand item = (MenuCommand)sender; + IMember member = (IMember)item.Tag; + MessageService.ShowMessage("Not implemented."); + } + } +} diff --git a/src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs b/src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs index 4206dae56f..cf883a625f 100644 --- a/src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs +++ b/src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs @@ -156,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.Gui void SetWorkDone() { - if (workDone < totalWork) { + if (workDone < statusProgressBar.Maximum) { statusProgressBar.Value = workDone; } } @@ -173,6 +173,16 @@ namespace ICSharpCode.SharpDevelop.Gui get { return taskName; } + set { + if (taskName == value) return; + taskName = value; + this.BeginInvoke(new MethodInvoker(SetTaskName)); + } + } + + void SetTaskName() + { + jobNamePanel.Text = taskName; } } } diff --git a/src/Main/Base/Project/Src/Gui/IProgressMonitor.cs b/src/Main/Base/Project/Src/Gui/IProgressMonitor.cs index f6a08c6266..e3ae82f9d1 100644 --- a/src/Main/Base/Project/Src/Gui/IProgressMonitor.cs +++ b/src/Main/Base/Project/Src/Gui/IProgressMonitor.cs @@ -24,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui string TaskName { get; + set; } } } diff --git a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs index 632c5614f7..effbdb9a73 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs @@ -459,6 +459,7 @@ namespace ICSharpCode.Core static void IconBarMouseDown(AbstractMargin iconBar, Point mousepos, MouseButtons mouseButtons) { + if (mouseButtons != MouseButtons.Left) return; Rectangle viewRect = iconBar.TextArea.TextView.DrawingPosition; Point logicPos = iconBar.TextArea.TextView.GetLogicalPosition(0, mousepos.Y - viewRect.Top); diff --git a/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs b/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs index e2c9331257..949146e71d 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs @@ -222,16 +222,22 @@ namespace ICSharpCode.Core } } + internal int GetInitializationWorkAmount() + { + return project.Items.Count; + } + internal void Initialize2() { if (!initializing) return; ProjectItem[] arr = project.Items.ToArray(); + int progressStart = StatusBarService.ProgressMonitor.WorkDone; try { Properties textEditorProperties = ((Properties)PropertyService.Get("ICSharpCode.TextEditor.Document.Document.DefaultDocumentAggregatorProperties", new Properties())); getParseableContentEncoding = Encoding.GetEncoding(textEditorProperties.Get("Encoding", 1252)); textEditorProperties = null; - StatusBarService.ProgressMonitor.BeginTask("Parsing " + project.Name + "...", arr.Length); + StatusBarService.ProgressMonitor.TaskName = "Parsing " + project.Name + "..."; GetParseableContentDelegate pcd = new GetParseableContentDelegate(GetParseableFileContent); ProjectItem item; ProjectItem nextItem = arr[0]; @@ -240,7 +246,7 @@ namespace ICSharpCode.Core item = nextItem; nextItem = (i < arr.Length - 1) ? arr[i + 1] : null; if ((i % 5) == 2) - StatusBarService.ProgressMonitor.WorkDone = i; + StatusBarService.ProgressMonitor.WorkDone = progressStart + i; if (item.ItemType == ItemType.Compile) { string fileName = item.FileName; string fileContent; @@ -257,8 +263,8 @@ namespace ICSharpCode.Core if (!initializing) return; } } finally { - StatusBarService.ProgressMonitor.Done(); initializing = false; + StatusBarService.ProgressMonitor.WorkDone = progressStart + arr.Length; getParseableContentEncoding = null; } } diff --git a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs index 98c30676eb..296bb296e9 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/ParserService.cs @@ -122,15 +122,18 @@ namespace ICSharpCode.Core ICSharpCode.Core.MessageService.ShowError(e); } } + int workAmount = 0; foreach (DefaultProjectContent newContent in createdContents) { if (abortLoadSolutionProjectsThread) return; try { newContent.Initialize1(); + workAmount += newContent.GetInitializationWorkAmount(); } catch (Exception e) { Console.WriteLine("Error while initializing project references:" + newContent); ICSharpCode.Core.MessageService.ShowError(e); } } + StatusBarService.ProgressMonitor.BeginTask("Parsing...", workAmount); foreach (DefaultProjectContent newContent in createdContents) { if (abortLoadSolutionProjectsThread) return; try { @@ -140,6 +143,7 @@ namespace ICSharpCode.Core ICSharpCode.Core.MessageService.ShowError(e); } } + StatusBarService.ProgressMonitor.Done(); } public static IProjectContent GetProjectContent(IProject project) diff --git a/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs b/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs new file mode 100644 index 0000000000..98733fae67 --- /dev/null +++ b/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs @@ -0,0 +1,82 @@ +// +// +// +// +// +// + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Drawing; +using System.Text; +using System.Windows.Forms; +using ICSharpCode.Core; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Document; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.SharpDevelop.Bookmarks +{ + /// + /// Bookmark used to give additional operations for class members. + /// Does not derive from SDBookmark because it is not stored in the central BookmarkManager, + /// but only in the document's BookmarkManager. + /// + public class ClassMemberBookmark : Bookmark + { + IMember member; + + public IMember Member { + get { + return member; + } + } + + public ClassMemberBookmark(IDocument document, IMember member) + : base(document, member.Region.BeginLine - 1) + { + this.member = member; + } + + public override void Click(Control parent, MouseEventArgs e) + { + MenuService.ShowContextMenu(this, "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu", parent, e.X, e.Y); + } + + protected void DrawIcon(int iconIndex, Graphics g, Point p) + { + g.DrawImageUnscaled(ClassBrowserIconService.ImageList.Images[iconIndex], p); + } + } + + public class PropertyBookmark : ClassMemberBookmark + { + IProperty property; + + public PropertyBookmark(IDocument document, IProperty property) : base(document, property) + { + this.property = property; + } + + public override void Draw(IconBarMargin margin, Graphics g, Point p) + { + DrawIcon(ClassBrowserIconService.GetIcon(property), g, p); + } + } + + public class MethodBookmark : ClassMemberBookmark + { + IMethod method; + + public MethodBookmark(IDocument document, IMethod method) : base(document, method) + { + this.method = method; + } + + public override void Draw(IconBarMargin margin, Graphics g, Point p) + { + DrawIcon(ClassBrowserIconService.GetIcon(method), g, p); + } + } +} diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs index 3ad6aca7ec..a6cff132ef 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs @@ -56,12 +56,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor void BookmarkAdded(object sender, BookmarkEventArgs e) { - Bookmarks.BookmarkManager.AddMark((Bookmarks.SDBookmark)e.Bookmark); + Bookmarks.SDBookmark b = e.Bookmark as Bookmarks.SDBookmark; + if (b != null) { + Bookmarks.BookmarkManager.AddMark(b); + } } void BookmarkRemoved(object sender, BookmarkEventArgs e) { - Bookmarks.BookmarkManager.RemoveMark((Bookmarks.SDBookmark)e.Bookmark); + Bookmarks.SDBookmark b = e.Bookmark as Bookmarks.SDBookmark; + if (b != null) { + Bookmarks.BookmarkManager.RemoveMark(b); + } } public virtual ICompletionDataProvider CreateCodeCompletionDataProvider(bool ctrlSpace) diff --git a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs index f9622640ec..8fcd8dd96b 100644 --- a/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs +++ b/src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs @@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor parseInfo = ParserService.GetParseInformation(fileName); } textAreaControl.Document.FoldingManager.UpdateFoldings(fileName, parseInfo); + UpdateClassMemberBookmarks(parseInfo); } } @@ -434,11 +435,32 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor try { textAreaControl.Document.FoldingManager.UpdateFoldings(TitleName, parseInfo); textAreaControl.ActiveTextAreaControl.TextArea.Refresh(textAreaControl.ActiveTextAreaControl.TextArea.FoldMargin); + UpdateClassMemberBookmarks(parseInfo); } catch (Exception ex) { MessageService.ShowError(ex); } } + void UpdateClassMemberBookmarks(ParseInformation parseInfo) + { + BookmarkManager bm = textAreaControl.Document.BookmarkManager; + bm.RemoveMarks(new Predicate(IsClassMemberBookmark)); + foreach (IClass c in parseInfo.MostRecentCompilationUnit.Classes) { + foreach (IMethod m in c.Methods) { + if (m.Region == null || m.Region.BeginLine <= 0) continue; + bm.AddMark(new Bookmarks.MethodBookmark(textAreaControl.Document, m)); + } + foreach (IProperty m in c.Properties) { + if (m.Region == null || m.Region.BeginLine <= 0) continue; + bm.AddMark(new Bookmarks.PropertyBookmark(textAreaControl.Document, m)); + } + } + } + + bool IsClassMemberBookmark(Bookmark b) + { + return b is Bookmarks.ClassMemberBookmark; + } #region ICSharpCode.SharpDevelop.Gui.IClipboardHandler interface implementation public bool EnableCut { diff --git a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs index 092ba332f4..85f6407567 100644 --- a/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs +++ b/src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs @@ -23,7 +23,8 @@ namespace ICSharpCode.Core return o; } } - throw new ArgumentException("Cannot create object: " + className); + MessageService.ShowError("Cannot create object: " + className); + return null; } public List Runtimes {