Browse Source

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
shortcuts
Daniel Grunwald 21 years ago
parent
commit
864ed8b726
  1. 4
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/Bookmark.cs
  3. 12
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/BookmarkManager.cs
  4. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs
  5. 2
      src/Libraries/NRefactory/Project/NRefactory.csproj
  6. 2
      src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj
  7. 134
      src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs
  8. 12
      src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs
  9. 1
      src/Main/Base/Project/Src/Gui/IProgressMonitor.cs
  10. 1
      src/Main/Base/Project/Src/Services/Debugger/DebuggerService.cs
  11. 12
      src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs
  12. 4
      src/Main/Base/Project/Src/Services/ParserService/ParserService.cs
  13. 82
      src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs
  14. 10
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
  15. 22
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/TextEditorDisplayBinding.cs
  16. 3
      src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs

4
AddIns/ICSharpCode.SharpDevelop.addin

@ -1451,6 +1451,10 @@ @@ -1451,6 +1451,10 @@
class = "ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.TextEditorDisplayBinding" />
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu">
<MenuItem id = "MenuBuilder" type="Builder" class = "ICSharpCode.SharpDevelop.Commands.ClassMemberMenuBuilder" />
</Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu">
<MenuItem id = "Cut"
label = "${res:XML.TextAreaContextMenu.Cut}"

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/Bookmark.cs

@ -95,9 +95,9 @@ namespace ICSharpCode.TextEditor.Document @@ -95,9 +95,9 @@ namespace ICSharpCode.TextEditor.Document
this.isEnabled = isEnabled;
}
public virtual void Click(SWF.MouseButtons mouseButtons)
public virtual void Click(SWF.Control parent, SWF.MouseEventArgs e)
{
if (mouseButtons == SWF.MouseButtons.Left) {
if (e.Button == SWF.MouseButtons.Left) {
document.BookmarkManager.RemoveMark(this);
}
}

12
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/BookmarkManager/BookmarkManager.cs

@ -97,6 +97,18 @@ namespace ICSharpCode.TextEditor.Document @@ -97,6 +97,18 @@ namespace ICSharpCode.TextEditor.Document
OnChanged(EventArgs.Empty);
}
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));
}
}
OnChanged(EventArgs.Empty);
}
/// <returns>
/// true, if a mark at mark exists, otherwise false
/// </returns>

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/IconBarMargin.cs

@ -69,7 +69,7 @@ namespace ICSharpCode.TextEditor @@ -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);
}

2
src/Libraries/NRefactory/Project/NRefactory.csproj

@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>8.0.41115</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{3a9ae6aa-bc07-4a2f-972c-581e3ae2f195}</ProjectGuid>
<ProjectGuid>{3A9AE6AA-BC07-4A2F-972C-581E3AE2F195}</ProjectGuid>
<RootNamespace>ICSharpCode.NRefactory</RootNamespace>
<AssemblyName>ICSharpCode.NRefactory</AssemblyName>
<OutputTarget>Library</OutputTarget>

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

@ -662,6 +662,8 @@ @@ -662,6 +662,8 @@
<SubType>Component</SubType>
</Compile>
<Compile Include="Src\TextEditor\Bookmarks\BookmarkConverter.cs" />
<Compile Include="Src\TextEditor\Bookmarks\ClassMemberBookmark.cs" />
<Compile Include="Src\Commands\ClassMemberMenuBuilder.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Libraries\DockPanel_Src\WinFormsUI\WinFormsUI.csproj">

134
src/Main/Base/Project/Src/Commands/ClassMemberMenuBuilder.cs

@ -0,0 +1,134 @@ @@ -0,0 +1,134 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version value="$version"/>
// </file>
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
{
/// <summary>
/// Build context menu for class members in the text editor.
/// </summary>
public class ClassMemberMenuBuilder : ISubmenuBuilder
{
public ToolStripItem[] BuildSubmenu(Codon codon, object owner)
{
MenuCommand cmd;
ClassMemberBookmark bookmark = (ClassMemberBookmark)owner;
IMember member = bookmark.Member;
List<ToolStripItem> list = new List<ToolStripItem>();
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.");
}
}
}

12
src/Main/Base/Project/Src/Gui/Components/StatusBar/SdStatusBar.cs

@ -156,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -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 @@ -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;
}
}
}

1
src/Main/Base/Project/Src/Gui/IProgressMonitor.cs

@ -24,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui @@ -24,6 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui
string TaskName {
get;
set;
}
}
}

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

@ -459,6 +459,7 @@ namespace ICSharpCode.Core @@ -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);

12
src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs

@ -222,16 +222,22 @@ namespace ICSharpCode.Core @@ -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 @@ -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 @@ -257,8 +263,8 @@ namespace ICSharpCode.Core
if (!initializing) return;
}
} finally {
StatusBarService.ProgressMonitor.Done();
initializing = false;
StatusBarService.ProgressMonitor.WorkDone = progressStart + arr.Length;
getParseableContentEncoding = null;
}
}

4
src/Main/Base/Project/Src/Services/ParserService/ParserService.cs

@ -122,15 +122,18 @@ namespace ICSharpCode.Core @@ -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 @@ -140,6 +143,7 @@ namespace ICSharpCode.Core
ICSharpCode.Core.MessageService.ShowError(e);
}
}
StatusBarService.ProgressMonitor.Done();
}
public static IProjectContent GetProjectContent(IProject project)

82
src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs

@ -0,0 +1,82 @@ @@ -0,0 +1,82 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version value="$version"/>
// </file>
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
{
/// <summary>
/// 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.
/// </summary>
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);
}
}
}

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

@ -56,12 +56,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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)

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

@ -415,6 +415,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -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 @@ -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<Bookmark>(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 {

3
src/Main/Core/Project/Src/AddInTree/AddIn/AddIn.cs

@ -23,7 +23,8 @@ namespace ICSharpCode.Core @@ -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<Runtime> Runtimes {

Loading…
Cancel
Save