Browse Source

Context menu for AvalonEdit

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4090 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
c33cfbabe9
  1. 7
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 10
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin
  3. 16
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  4. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/TextEditor.cs
  5. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorComponent.cs
  6. 115
      src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

7
AddIns/ICSharpCode.SharpDevelop.addin

@ -1724,7 +1724,7 @@
<Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/> <Include id = "Common" path = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/Common"/>
</Path> </Path>
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu"> <Path name = "/SharpDevelop/ViewContent/TextEditor/ContextMenu">
<MenuItem id = "Refactoring" type = "Builder" class = "ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder"/> <MenuItem id = "Refactoring" type = "Builder" class = "ICSharpCode.SharpDevelop.Refactoring.RefactoringMenuBuilder"/>
<Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/> <Include id = "Cut" item = "/SharpDevelop/Workbench/MainMenu/Edit/Cut"/>
<Include id = "Copy" item = "/SharpDevelop/Workbench/MainMenu/Edit/Copy"/> <Include id = "Copy" item = "/SharpDevelop/Workbench/MainMenu/Edit/Copy"/>
@ -1743,6 +1743,11 @@
label = "${res:XML.MainMenu.FileMenu.Close}" label = "${res:XML.MainMenu.FileMenu.Close}"
icon = "Icons.16x16.CloseFileIcon" icon = "Icons.16x16.CloseFileIcon"
class ="ICSharpCode.SharpDevelop.Commands.CloseFile"/> class ="ICSharpCode.SharpDevelop.Commands.CloseFile"/>
</Path>
<!-- DefaultTextEditor=old editor. TODO: remove this -->
<Path name = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu">
<Include id="DefaultEditor" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu"/>
<MenuItem id = "Separator2" type = "Separator" /> <MenuItem id = "Separator2" type = "Separator" />
<MenuItem id = "Comment" <MenuItem id = "Comment"
icon = "Icons.16x16.CommentRegion" icon = "Icons.16x16.CommentRegion"

10
src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin

@ -11,15 +11,13 @@
<Import assembly = "ICSharpCode.AvalonEdit.AddIn.dll"/> <Import assembly = "ICSharpCode.AvalonEdit.AddIn.dll"/>
</Runtime> </Runtime>
<!-- Extend the SharpDevelop AddIn-Tree like this:
<Path name = ...>
<.../>
</Path>
-->
<Path name = "/SharpDevelop/Workbench/DisplayBindings"> <Path name = "/SharpDevelop/Workbench/DisplayBindings">
<DisplayBinding id = "Text" <DisplayBinding id = "Text"
title = "${res:Gui.ProjectBrowser.OpenWith.Bindings.TextEditor} (AvalonEdit)" title = "${res:Gui.ProjectBrowser.OpenWith.Bindings.TextEditor} (AvalonEdit)"
class = "ICSharpCode.AvalonEdit.AddIn.AvalonEditDisplayBinding"/> class = "ICSharpCode.AvalonEdit.AddIn.AvalonEditDisplayBinding"/>
</Path> </Path>
<Path name = "/SharpDevelop/ViewContent/AvalonEdit/ContextMenu">
<Include id="DefaultEditor" path="/SharpDevelop/ViewContent/TextEditor/ContextMenu"/>
</Path>
</AddIn> </AddIn>

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

@ -22,6 +22,7 @@ using ICSharpCode.AvalonEdit.Gui;
using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.AvalonEdit.Highlighting;
using ICSharpCode.AvalonEdit.Indentation; using ICSharpCode.AvalonEdit.Indentation;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -34,6 +35,8 @@ namespace ICSharpCode.AvalonEdit.AddIn
/// </summary> /// </summary>
public class CodeEditor : Grid public class CodeEditor : Grid
{ {
const string contextMenuPath = "/SharpDevelop/ViewContent/AvalonEdit/ContextMenu";
QuickClassBrowser quickClassBrowser; QuickClassBrowser quickClassBrowser;
readonly TextEditor primaryTextEditor; readonly TextEditor primaryTextEditor;
readonly CodeEditorAdapter primaryTextEditorAdapter; readonly CodeEditorAdapter primaryTextEditorAdapter;
@ -160,9 +163,22 @@ namespace ICSharpCode.AvalonEdit.AddIn
var iconBarMargin = new IconBarMargin(iconBarManager) { TextView = textView }; var iconBarMargin = new IconBarMargin(iconBarManager) { TextView = textView };
textEditor.TextArea.LeftMargins.Insert(0, iconBarMargin); textEditor.TextArea.LeftMargins.Insert(0, iconBarMargin);
textEditor.TextArea.TextView.ContextMenu = MenuService.CreateContextMenu(adapter, contextMenuPath);
textEditor.TextArea.TextView.MouseRightButtonDown += textEditor_TextArea_TextView_MouseRightButtonDown;
return textEditor; return textEditor;
} }
void textEditor_TextArea_TextView_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
ITextEditorComponent component = (ITextEditorComponent)sender;
TextEditor textEditor = (TextEditor)component.GetService(typeof(TextEditor));
var position = textEditor.GetPositionFromPoint(e.GetPosition(textEditor));
if (position.HasValue) {
textEditor.TextArea.Caret.Position = position.Value;
}
}
// always use primary text editor for loading/saving // always use primary text editor for loading/saving
// (the file encoding is stored only there) // (the file encoding is stored only there)
public void Load(Stream stream) public void Load(Stream stream)

7
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/TextEditor.cs

@ -30,7 +30,7 @@ namespace ICSharpCode.AvalonEdit
/// Contains a scrollable TextArea. /// Contains a scrollable TextArea.
/// </summary> /// </summary>
[Localizability(LocalizationCategory.Text), ContentProperty("Text")] [Localizability(LocalizationCategory.Text), ContentProperty("Text")]
public class TextEditor : Control, ITextEditorComponent, IWeakEventListener public class TextEditor : Control, ITextEditorComponent, IServiceProvider, IWeakEventListener
{ {
static TextEditor() static TextEditor()
{ {
@ -829,5 +829,10 @@ namespace ICSharpCode.AvalonEdit
add { AddHandler(MouseHoverStoppedEvent, value); } add { AddHandler(MouseHoverStoppedEvent, value); }
remove { RemoveHandler(MouseHoverStoppedEvent, value); } remove { RemoveHandler(MouseHoverStoppedEvent, value); }
} }
object IServiceProvider.GetService(Type serviceType)
{
return textArea.GetService(serviceType);
}
} }
} }

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorComponent.cs

@ -16,7 +16,7 @@ namespace ICSharpCode.AvalonEdit
/// Represents a text editor control (<see cref="TextEditor"/>, <see cref="TextArea"/> /// Represents a text editor control (<see cref="TextEditor"/>, <see cref="TextArea"/>
/// or <see cref="Gui.TextView"/>). /// or <see cref="Gui.TextView"/>).
/// </summary> /// </summary>
public interface ITextEditorComponent public interface ITextEditorComponent : IServiceProvider
{ {
/// <summary> /// <summary>
/// Gets the document being edited. /// Gets the document being edited.

115
src/Main/Base/Project/Src/Services/RefactoringService/RefactoringMenuBuilder.cs

@ -5,17 +5,20 @@
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
using ICSharpCode.SharpDevelop.Editor;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Threading;
using System.Windows.Controls;
using System.Windows.Input;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.WinForms; using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.Refactoring; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.ClassBrowser; using ICSharpCode.SharpDevelop.Gui.ClassBrowser;
using ICSharpCode.SharpDevelop.Project; using ICSharpCode.SharpDevelop.Project;
@ -33,16 +36,16 @@ namespace ICSharpCode.SharpDevelop.Refactoring
/// <summary> /// <summary>
/// Build a menu with refactoring commands for the item that has been clicked on in the text editor. /// Build a menu with refactoring commands for the item that has been clicked on in the text editor.
/// </summary> /// </summary>
public class RefactoringMenuBuilder : ISubmenuBuilder public class RefactoringMenuBuilder : IMenuItemBuilder
{ {
public ToolStripItem[] BuildSubmenu(Codon codon, object owner) public ICollection BuildItems(Codon codon, object owner)
{ {
ToolStripMenuItem item; MenuItem item;
ITextEditor textEditor = (ITextEditor)owner; ITextEditor textEditor = (ITextEditor)owner;
if (string.IsNullOrEmpty(textEditor.FileName)) if (string.IsNullOrEmpty(textEditor.FileName))
return new ToolStripItem[0]; return new object[0];
List<ToolStripItem> resultItems = new List<ToolStripItem>(); List<object> resultItems = new List<object>();
IDocument doc = textEditor.Document; IDocument doc = textEditor.Document;
int caretLine = textEditor.Caret.Line; int caretLine = textEditor.Caret.Line;
IBookmarkMargin bookmarkMargin = textEditor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin; IBookmarkMargin bookmarkMargin = textEditor.GetService(typeof(IBookmarkMargin)) as IBookmarkMargin;
@ -62,9 +65,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
IClass type = null; IClass type = null;
if (cmb != null) { if (cmb != null) {
definitions.Add(cmb.Member.DotNetName); definitions.Add(cmb.Member.DotNetName);
item = new ToolStripMenuItem(MemberNode.GetText(cmb.Member), item = new MenuItem {
cmb.Image.Bitmap); Header = MemberNode.GetText(cmb.Member),
MenuService.AddItemsToMenu(item.DropDown.Items, mark, ClassMemberBookmark.ContextMenuPath); Icon = cmb.Image.ImageSource,
ItemsSource = MenuService.CreateMenuItems(null, mark, ClassMemberBookmark.ContextMenuPath)
};
resultItems.Add(item); resultItems.Add(item);
type = cmb.Member.DeclaringType; type = cmb.Member.DeclaringType;
} else if (cb != null) { } else if (cb != null) {
@ -72,10 +77,13 @@ namespace ICSharpCode.SharpDevelop.Refactoring
} }
if (type != null) { if (type != null) {
definitions.Add(type.DotNetName); definitions.Add(type.DotNetName);
item = new ToolStripMenuItem(ClassNode.GetText(type), ClassBrowserIconService.GetIcon(type).Bitmap); item = new MenuItem {
MenuService.AddItemsToMenu(item.DropDown.Items, Header = ClassNode.GetText(type),
cb ?? new ClassBookmark(type), Icon = ClassBrowserIconService.GetIcon(type).ImageSource,
ClassBookmark.ContextMenuPath); ItemsSource = MenuService.CreateMenuItems(null,
cb ?? new ClassBookmark(type),
ClassBookmark.ContextMenuPath)
};
resultItems.Add(item); resultItems.Add(item);
} }
} }
@ -144,37 +152,35 @@ namespace ICSharpCode.SharpDevelop.Refactoring
if (callingMember != null) { if (callingMember != null) {
item = MakeItem(definitions, callingMember); item = MakeItem(definitions, callingMember);
if (item != null) { if (item != null) {
item.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name; item.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.CurrentMethod}: ") + callingMember.Name;
resultItems.Add(item); resultItems.Add(item);
} }
} }
if (resultItems.Count == 0) { if (resultItems.Count > 0) {
return new ToolStripItem[0]; resultItems.Add(new Separator());
} else {
resultItems.Add(new MenuSeparator());
return resultItems.ToArray();
} }
return resultItems;
} }
ToolStripMenuItem MakeItemForResolveError(UnknownIdentifierResolveResult rr, ExpressionContext context, ITextEditor textArea) MenuItem MakeItemForResolveError(UnknownIdentifierResolveResult rr, ExpressionContext context, ITextEditor textArea)
{ {
return MakeItemForUnknownClass(rr.CallingClass, rr.Identifier, textArea); return MakeItemForUnknownClass(rr.CallingClass, rr.Identifier, textArea);
} }
ToolStripMenuItem MakeItemForResolveError(UnknownConstructorCallResolveResult rr, ExpressionContext context, ITextEditor textArea) MenuItem MakeItemForResolveError(UnknownConstructorCallResolveResult rr, ExpressionContext context, ITextEditor textArea)
{ {
return MakeItemForUnknownClass(rr.CallingClass, rr.TypeName, textArea); return MakeItemForUnknownClass(rr.CallingClass, rr.TypeName, textArea);
} }
ToolStripMenuItem MakeItemForUnknownClass(IClass callingClass, string unknownClassName, ITextEditor textArea) MenuItem MakeItemForUnknownClass(IClass callingClass, string unknownClassName, ITextEditor textArea)
{ {
if (callingClass == null) if (callingClass == null)
return null; return null;
IProjectContent pc = callingClass.ProjectContent; IProjectContent pc = callingClass.ProjectContent;
if (!pc.Language.RefactoringProvider.IsEnabledForFile(callingClass.CompilationUnit.FileName)) if (!pc.Language.RefactoringProvider.IsEnabledForFile(callingClass.CompilationUnit.FileName))
return null; return null;
ToolStripMenuItem item = MakeItemInternal(unknownClassName, ClassBrowserIconService.GotoArrow, callingClass.CompilationUnit, DomRegion.Empty); MenuItem item = MakeItemInternal(unknownClassName, ClassBrowserIconService.GotoArrow, callingClass.CompilationUnit, DomRegion.Empty);
List<IClass> searchResults = new List<IClass>(); List<IClass> searchResults = new List<IClass>();
SearchAllClassesWithName(searchResults, pc, unknownClassName, pc.Language); SearchAllClassesWithName(searchResults, pc, unknownClassName, pc.Language);
foreach (IProjectContent rpc in pc.ReferencedContents) { foreach (IProjectContent rpc in pc.ReferencedContents) {
@ -184,8 +190,10 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null; return null;
foreach (IClass c in searchResults) { foreach (IClass c in searchResults) {
string newNamespace = c.Namespace; string newNamespace = c.Namespace;
ToolStripMenuItem subItem = new ToolStripMenuItem("using " + newNamespace, ClassBrowserIconService.Namespace.Bitmap); MenuItem subItem = new MenuItem();
item.DropDownItems.Add(subItem); subItem.Header = "using " + newNamespace;
subItem.Icon = ClassBrowserIconService.Namespace.Bitmap;
item.Items.Add(subItem);
subItem.Click += delegate { subItem.Click += delegate {
NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true); NamespaceRefactoringService.AddUsingDeclaration(callingClass.CompilationUnit, textArea.Document, newNamespace, true);
}; };
@ -220,36 +228,37 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return null; return null;
} }
ToolStripMenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context) MenuItem MakeItem(LocalResolveResult local, RefactoringMenuContext context)
{ {
Debug.Assert(local == context.ResolveResult); Debug.Assert(local == context.ResolveResult);
ToolStripMenuItem item = MakeItemInternal(local.VariableName, MenuItem item = MakeItemInternal(local.VariableName,
local.IsParameter ? ClassBrowserIconService.Parameter : ClassBrowserIconService.LocalVariable, local.IsParameter ? ClassBrowserIconService.Parameter : ClassBrowserIconService.LocalVariable,
local.CallingClass.CompilationUnit, local.CallingClass.CompilationUnit,
context.IsDefinition ? DomRegion.Empty : local.VariableDefinitionRegion); context.IsDefinition ? DomRegion.Empty : local.VariableDefinitionRegion);
string treePath = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/"; string treePath = "/SharpDevelop/ViewContent/DefaultTextEditor/Refactoring/";
treePath += local.IsParameter ? "Parameter" : "LocalVariable"; treePath += local.IsParameter ? "Parameter" : "LocalVariable";
if (context.IsDefinition) treePath += "Definition"; if (context.IsDefinition) treePath += "Definition";
MenuService.AddItemsToMenu(item.DropDown.Items, context, treePath); foreach (object obj in MenuService.CreateMenuItems(null, context, treePath))
item.Items.Add(obj);
return item; return item;
} }
ToolStripMenuItem MakeItem(List<string> definitions, IMember member) MenuItem MakeItem(List<string> definitions, IMember member)
{ {
if (member == null) return null; if (member == null) return null;
if (definitions.Contains(member.DotNetName)) return null; if (definitions.Contains(member.DotNetName)) return null;
definitions.Add(member.DotNetName); definitions.Add(member.DotNetName);
ToolStripMenuItem item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region); MenuItem item = MakeItem(MemberNode.Create(member), member.DeclaringType.CompilationUnit, member.Region);
ToolStripMenuItem declaringType = MakeItem(null, member.DeclaringType); MenuItem declaringType = MakeItem(null, member.DeclaringType);
if (declaringType != null) { if (declaringType != null) {
item.DropDown.Items.Add(new ToolStripSeparator()); item.Items.Add(new Separator());
declaringType.Text = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Text; declaringType.Header = StringParser.Parse("${res:SharpDevelop.Refactoring.DeclaringType}: ") + declaringType.Header;
item.DropDown.Items.Add(declaringType); item.Items.Add(declaringType);
} }
return item; return item;
} }
ToolStripMenuItem MakeItem(List<string> definitions, IClass c) MenuItem MakeItem(List<string> definitions, IClass c)
{ {
if (c == null) return null; if (c == null) return null;
if (definitions != null) { if (definitions != null) {
@ -259,9 +268,11 @@ namespace ICSharpCode.SharpDevelop.Refactoring
return MakeItem(new ClassNode((IProject)c.ProjectContent.Project, c), c.CompilationUnit, c.Region); return MakeItem(new ClassNode((IProject)c.ProjectContent.Project, c), c.CompilationUnit, c.Region);
} }
ToolStripMenuItem MakeItemInternal(string title, IImage image, ICompilationUnit cu, DomRegion region) MenuItem MakeItemInternal(string title, IImage image, ICompilationUnit cu, DomRegion region)
{ {
ToolStripMenuItem item = new ToolStripMenuItem(title, image.Bitmap); MenuItem item = new MenuItem();
item.Header = title;
item.Icon = image.ImageSource;
//ToolStripMenuItem titleItem = new ToolStripMenuItem(title); //ToolStripMenuItem titleItem = new ToolStripMenuItem(title);
//titleItem.Enabled = false; //titleItem.Enabled = false;
@ -269,22 +280,24 @@ namespace ICSharpCode.SharpDevelop.Refactoring
//item.DropDown.Items.Add(new ToolStripSeparator()); //item.DropDown.Items.Add(new ToolStripSeparator());
if (cu != null && cu.FileName != null && !region.IsEmpty) { if (cu != null && cu.FileName != null && !region.IsEmpty) {
ToolStripMenuItem gotoDefinitionItem = new ToolStripMenuItem(StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}"), MenuItem gotoDefinitionItem = new MenuItem();
ClassBrowserIconService.GotoArrow.Bitmap); gotoDefinitionItem.Header = StringParser.Parse("${res:ICSharpCode.NAntAddIn.GotoDefinitionMenuLabel}");
gotoDefinitionItem.ShortcutKeys = Keys.Control | Keys.Enter; gotoDefinitionItem.Icon = ClassBrowserIconService.GotoArrow.ImageSource;
gotoDefinitionItem.InputGestureText = new KeyGesture(Key.Enter, ModifierKeys.Control).GetDisplayStringForCulture(Thread.CurrentThread.CurrentUICulture);
gotoDefinitionItem.Click += delegate { gotoDefinitionItem.Click += delegate {
FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn); FileService.JumpToFilePosition(cu.FileName, region.BeginLine, region.BeginColumn);
}; };
item.DropDown.Items.Add(gotoDefinitionItem); item.Items.Add(gotoDefinitionItem);
item.DropDown.Items.Add(new ToolStripSeparator()); item.Items.Add(new Separator());
} }
return item; return item;
} }
ToolStripMenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region) MenuItem MakeItem(ExtTreeNode classBrowserTreeNode, ICompilationUnit cu, DomRegion region)
{ {
ToolStripMenuItem item = MakeItemInternal(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region); MenuItem item = MakeItemInternal(classBrowserTreeNode.Text, ClassBrowserIconService.GetImageByIndex(classBrowserTreeNode.ImageIndex), cu, region);
MenuService.AddItemsToMenu(item.DropDown.Items, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath); foreach (object obj in MenuService.CreateMenuItems(null, classBrowserTreeNode, classBrowserTreeNode.ContextmenuAddinTreePath))
item.Items.Add(obj);
return item; return item;
} }

Loading…
Cancel
Save