From 2b85ce40ad1a4a7ad127868dd5737287b7e5a88e Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Fri, 15 Aug 2014 13:32:24 +0200 Subject: [PATCH 01/16] Fix #532: 'Go to base method' is missing from entity context menu. --- data/resources/StringResources.resx | 10 ++++ .../AvalonEdit.AddIn/AvalonEdit.AddIn.addin | 12 ++--- .../Src/ContextActions/FindBaseClasses.cs | 54 +++++++++++++++++-- .../SymbolTypeAtCaretConditionEvaluator.cs | 2 +- 4 files changed, 66 insertions(+), 12 deletions(-) diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index c6d41f1639..4acee42bfb 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -3789,6 +3789,10 @@ Please configure the NAnt executable's location in the SharpDevelop Options.Could not find type definition at the cursor position. Error message when using Search>Find Base Classes when the cursor is not on a type reference. + + Could not find type definition or type member at the cursor position. + Error message when using Search>Find Base Classes when the cursor is not on a type reference or type member. + Send Line to Ruby Console @@ -6473,6 +6477,9 @@ Removed the end part of the original message ", reason '${Message}'" since this Base classes of ${Name} + + Base members of ${Name} + The operation cannot be performed because your source code contains errors: @@ -6525,6 +6532,9 @@ Removed the end part of the original message ", reason '${Message}'" since this Find base classes + + Find base symbols + Find &derived classes diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin index 9fb440f6b1..b74dd89bc2 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.addin @@ -149,20 +149,20 @@ icon="Icons.16x16.Class" class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindDerivedClassesOrOverrides"/> - + class = "ICSharpCode.AvalonEdit.AddIn.ContextActions.FindBaseClassesOrMembers"/> - + - + item="/SharpDevelop/Workbench/MainMenu/Search/FindBaseClassesOrMembers" /> diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs index 690d0b0b88..9194c1ca97 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/FindBaseClasses.cs @@ -31,16 +31,20 @@ using ICSharpCode.SharpDevelop.Editor.ContextActions; namespace ICSharpCode.AvalonEdit.AddIn.ContextActions { - public class FindBaseClasses : ResolveResultMenuCommand + public class FindBaseClassesOrMembers : ResolveResultMenuCommand { public override void Run(ResolveResult symbol) { IEntity entityUnderCaret = GetSymbol(symbol) as IEntity; if (entityUnderCaret is ITypeDefinition) { MakePopupWithBaseClasses((ITypeDefinition)entityUnderCaret).OpenAtCaretAndFocus(); - } else { - MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassUnderCursorError}"); + return; } + if (entityUnderCaret is IMember) { + MakePopupWithBaseMembers((IMember)entityUnderCaret).OpenAtCaretAndFocus(); + return; + } + MessageService.ShowError("${res:ICSharpCode.Refactoring.NoClassOrMemberUnderCursorError}"); } static ContextActionsPopup MakePopupWithBaseClasses(ITypeDefinition @class) @@ -49,14 +53,54 @@ namespace ICSharpCode.AvalonEdit.AddIn.ContextActions var popupViewModel = new ContextActionsPopupViewModel(); popupViewModel.Title = MenuService.ConvertLabel(StringParser.Parse( "${res:SharpDevelop.Refactoring.BaseClassesOf}", new StringTagPair("Name", @class.Name))); - popupViewModel.Actions = BuildListViewModel(baseClassList); + popupViewModel.Actions = BuildBaseClassListViewModel(baseClassList); return new ContextActionsPopup { Actions = popupViewModel }; } - static ObservableCollection BuildListViewModel(IEnumerable classList) + static ObservableCollection BuildBaseClassListViewModel(IEnumerable classList) { return new ObservableCollection( classList.Select(@class => GoToEntityAction.MakeViewModel(@class, null))); } + + #region Base (overridden) members + static ContextActionsPopup MakePopupWithBaseMembers(IMember member) + { + var baseClassList = member.DeclaringTypeDefinition.GetAllBaseTypeDefinitions().Where( + baseClass => baseClass != member.DeclaringTypeDefinition).ToList(); + var popupViewModel = new ContextActionsPopupViewModel { + Title = MenuService.ConvertLabel(StringParser.Parse( + "${res:SharpDevelop.Refactoring.BaseMembersOf}", + new StringTagPair("Name", member.FullName)) + )}; + popupViewModel.Actions = BuildBaseMemberListViewModel(member); + return new ContextActionsPopup { Actions = popupViewModel }; + } + + static ObservableCollection BuildBaseMemberListViewModel(IMember member) + { + var c = new ObservableCollection(); + ObservableCollection lastBase = c; + + IMember thisMember = member; + while (thisMember != null) { + IMember baseMember = InheritanceHelper.GetBaseMembers(thisMember, true).FirstOrDefault(); + if (baseMember != null) { + // Only allow this base member, if overriding a virtual/abstract member of a class + // or implementing a member of an interface. + if ((baseMember.DeclaringTypeDefinition.Kind == TypeKind.Interface) || (baseMember.IsOverridable && thisMember.IsOverride)) { + var newChild = new ObservableCollection(); + lastBase.Add(GoToEntityAction.MakeViewModel(baseMember, newChild)); + lastBase = newChild; + } else { + thisMember = null; + } + } + thisMember = baseMember; + } + + return c; + } + #endregion } } diff --git a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs index 02f9110143..defd05dddb 100644 --- a/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs +++ b/src/Main/Base/Project/Src/Internal/ConditionEvaluators/SymbolTypeAtCaretConditionEvaluator.cs @@ -44,7 +44,7 @@ namespace ICSharpCode.SharpDevelop.Internal.ConditionEvaluators string typesList = condition.Properties["type"]; if (typesList != null) { foreach (string type in typesList.Split(',')) { - switch (type) { + switch (type.Trim()) { case "*": // Wildcard -> allow any type return true; From 3409a32fda2daeb0c8b0a3b23729bad382650939 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Fri, 15 Aug 2014 19:51:00 +0100 Subject: [PATCH 02/16] Fix service references. Fixed #383 - Handle empty string for service retrieval url. Fix SvcUtil commmand line being mangled by ProcessRunner's RunInOutputPadAsync by generating the command line arguments as an array instead of a string. --- .../ServiceReference/SvcUtilCommandLine.cs | 36 +++++-------------- .../ServiceReference/SvcUtilRunner.cs | 2 +- .../ReferenceDialog/ServiceReferenceHelper.cs | 4 +-- 3 files changed, 11 insertions(+), 31 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs index 5cc6c8780a..3e1762be87 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilCommandLine.cs @@ -24,7 +24,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference { public class SvcUtilCommandLine { - StringBuilder argumentBuilder = new StringBuilder(); + List arguments = new List(); public SvcUtilCommandLine(ServiceReferenceGeneratorOptions options) { @@ -32,7 +32,11 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference } public string Command { get; set; } - public string Arguments { get; private set; } + + public string[] GetArguments() + { + return arguments.ToArray(); + } void GenerateCommandLine(ServiceReferenceGeneratorOptions options) { @@ -48,8 +52,6 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference AppendIfNotEmpty("/ct:", options.GetDictionaryCollectionTypeDescription()); AppendAssemblyReferences(options.Assemblies); AppendIfNotEmpty(options.Url); - - this.Arguments = argumentBuilder.ToString(); } void AppendIfTrue(string argument, bool flag) @@ -62,7 +64,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void AppendIfNotEmpty(string argumentName, string argumentValue) { if (!String.IsNullOrEmpty(argumentValue)) { - Append(argumentName + GetQuotedArgument(argumentValue)); + Append(argumentName + argumentValue); } } @@ -75,29 +77,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference void Append(string argument) { - argumentBuilder.Append(argument); - argumentBuilder.Append(' '); - } - - public override string ToString() - { - return String.Format( - "{0} {1}", - GetQuotedCommand(), - Arguments); - } - - string GetQuotedCommand() - { - return GetQuotedArgument(Command); - } - - string GetQuotedArgument(string argument) - { - if (ContainsSpaceCharacter(argument)) { - return String.Format("\"{0}\"", argument); - } - return argument; + arguments.Add(argument); } bool ContainsSpaceCharacter(string text) diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs index ad54add75e..c18949da6d 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReference/SvcUtilRunner.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Gui.Dialogs.ReferenceDialog.ServiceReference var commandLine = new SvcUtilCommandLine(Options); commandLine.Command = GetSvcUtilPath(); using (ProcessRunner processRunner = new ProcessRunner()) { - this.ExitCode = await processRunner.RunInOutputPadAsync(SvcUtilMessageView.Category, commandLine.Command, ProcessRunner.CommandLineToArgumentArray(commandLine.Arguments)); + this.ExitCode = await processRunner.RunInOutputPadAsync(SvcUtilMessageView.Category, commandLine.Command, commandLine.GetArguments()); } if (ProcessExited != null) { ProcessExited(this, new EventArgs()); diff --git a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs index fdde3ea3f4..e88a1aa5d1 100644 --- a/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs +++ b/src/Main/Base/Project/Src/Gui/Dialogs/ReferenceDialog/ServiceReferenceHelper.cs @@ -24,12 +24,12 @@ using System.Web.Services.Discovery; namespace ICSharpCode.SharpDevelop.Gui { internal static class ServiceReferenceHelper - { + { public static string GetServiceName(ServiceDescription description) { if (description.Name != null) { return description.Name; - } else if (description.RetrievalUrl != null) { + } else if (!String.IsNullOrEmpty(description.RetrievalUrl)) { Uri uri = new Uri(description.RetrievalUrl); if (uri.Segments.Length > 0) { return uri.Segments[uri.Segments.Length - 1]; From 09e8eacea6d5d588fa463360331e50253fb3f474 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 12:51:06 +0200 Subject: [PATCH 03/16] enhance bookmark tooltips: allow breakpoint tooltip to be displayed even if CurrentLineBookmark is on the same line. --- .../Debugger.AddIn/Breakpoints/BreakpointBookmark.cs | 4 ++++ .../DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs | 8 ++++++-- src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs | 4 ++++ src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs | 4 ++++ src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs | 5 +++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs b/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs index 6ea6bb3a16..893eb203ae 100644 --- a/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs +++ b/src/AddIns/Debugger/Debugger.AddIn/Breakpoints/BreakpointBookmark.cs @@ -152,6 +152,10 @@ namespace Debugger.AddIn.Breakpoints return string.Format("{0} @{1}", this.FileName, this.LineNumber); } + public override bool DisplaysTooltip { + get { return true; } + } + public override object CreateTooltipContent() { return new BreakpointEditorPopup(this) { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index 24f8b416da..ec63f87575 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; @@ -286,7 +287,10 @@ namespace ICSharpCode.AvalonEdit.AddIn int line = GetLineFromMousePosition(e); if (line < 1) return; - IBookmark bm = GetBookmarkFromLine(line); + IBookmark bm = manager.Bookmarks + .Where(m => m.LineNumber == line && m.DisplaysTooltip) + .OrderBy(m => m.ZOrder) + .FirstOrDefault(); if (bm == null) return; object content = bm.CreateTooltipContent(); popupToolTip = content as Popup; @@ -301,7 +305,7 @@ namespace ICSharpCode.AvalonEdit.AddIn e.Handled = true; popupToolTip.IsOpen = true; distanceToPopupLimit = double.PositiveInfinity; // reset limit; we'll re-calculate it on the next mouse movement - } else { + } else if (content != null) { if (toolTip == null) { toolTip = new ToolTip(); toolTip.Closed += ToolTipClosed; diff --git a/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs index 1f060e0787..e1fbb0accf 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/BookmarkBase.cs @@ -195,6 +195,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks { } + public virtual bool DisplaysTooltip { + get { return false; } + } + public virtual object CreateTooltipContent() { return null; diff --git a/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs index 1c077f4d45..26825bd7c7 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/EntityBookmark.cs @@ -98,6 +98,10 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks throw new NotSupportedException(); } + bool IBookmark.DisplaysTooltip { + get { return false; } + } + object IBookmark.CreateTooltipContent() { return null; diff --git a/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs index c80366c656..07efd13911 100644 --- a/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs +++ b/src/Main/Base/Project/Editor/Bookmarks/IBookmark.cs @@ -61,6 +61,11 @@ namespace ICSharpCode.SharpDevelop.Editor.Bookmarks /// void Drop(int lineNumber); + /// + /// Gets whether this bookmark might want to display a tooltip. + /// + bool DisplaysTooltip { get; } + /// /// Creates the tooltip content for the bookmark. /// From 871078db99dedec00d1cf181e241a81fc33445ac Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 14:45:42 +0200 Subject: [PATCH 04/16] fix #528: Code completion doesn't scroll to pre-selection --- .../ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs index bc1a88fefd..bf4e38bc32 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionList.cs @@ -200,6 +200,7 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion if (listBox == null && value != null) ApplyTemplate(); listBox.SelectedItem = value; + listBox.ScrollIntoView(value); } } From efcc1c080b2efec2624156130da40bcee5f48642 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 15:02:40 +0200 Subject: [PATCH 05/16] fix InvalidCastException in GeneratePartialClassStub: not every IMethod corresponds to a MethodDeclaration (there are ConstructorDeclaration and DestructorDeclaration, for ex.) --- .../CSharpBinding/Project/Src/CSharpLanguageBinding.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs index 8921e09daf..1139a8a51d 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpLanguageBinding.cs @@ -74,7 +74,7 @@ namespace CSharpBinding return ""; var builder = new TypeSystemAstBuilder(); MethodDeclaration decl; - if (member is IMethod) { + if (member.SymbolKind == SymbolKind.Method) { // If it's a method, convert it directly (including parameters + type parameters) decl = (MethodDeclaration)builder.ConvertEntity(member); } else { From 7b27c8b6997f32b06c8b3e2ecee5a5d12940fd03 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 15:56:44 +0200 Subject: [PATCH 06/16] rename CodeCompletionPanelXaml.xaml[.cs] to CodeCompletionOptionPanel.xaml[.cs] --- .../CodeCompletion/CodeCompletionOptionPanel.xaml} | 0 .../CodeCompletion/CodeCompletionOptionPanel.xaml.cs} | 0 src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj | 6 ++++-- 3 files changed, 4 insertions(+), 2 deletions(-) rename src/Main/Base/Project/{Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml => Editor/CodeCompletion/CodeCompletionOptionPanel.xaml} (100%) rename src/Main/Base/Project/{Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs => Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs} (100%) diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml similarity index 100% rename from src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml rename to src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml diff --git a/src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs similarity index 100% rename from src/Main/Base/Project/Src/Editor/CodeCompletion/CodeCompletionPanelXaml.xaml.cs rename to src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj index 8013c235ff..1b58b2e940 100644 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.csproj @@ -140,6 +140,9 @@ + + CodeCompletionOptionPanel.xaml + @@ -228,7 +231,6 @@ - @@ -890,7 +892,7 @@ - + From 320cd692abd5ee41a564f2d20e45fdc4fdb40759 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 16:04:18 +0200 Subject: [PATCH 07/16] rename the class as well --- .../Editor/CodeCompletion/CodeCompletionOptionPanel.xaml | 2 +- .../CodeCompletion/CodeCompletionOptionPanel.xaml.cs | 7 +++---- src/Main/Base/Project/ICSharpCode.SharpDevelop.addin | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml index d450b86852..f39d4b88cd 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml +++ b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml @@ -1,4 +1,4 @@ - - /// Interaction logic for CodeCompletionPanelXaml.xaml + /// Interaction logic for CodeCompletionOptionPanel.xaml /// - public partial class CodeCompletionPanel : OptionPanel + public partial class CodeCompletionOptionPanel : OptionPanel { - public CodeCompletionPanel() + public CodeCompletionOptionPanel() { InitializeComponent(); this.DataContext = this; diff --git a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin index c590200465..f56c9d0d50 100755 --- a/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin +++ b/src/Main/Base/Project/ICSharpCode.SharpDevelop.addin @@ -2178,7 +2178,7 @@ + class = "ICSharpCode.SharpDevelop.Editor.CodeCompletion.CodeCompletionOptionPanel"/> From 4db8797a5dad9cb40d256c640bb0f52a721b95a5 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 16:05:12 +0200 Subject: [PATCH 08/16] add StringResources.resx to SharpDevelop.csproj for better accessibility --- src/Main/SharpDevelop/SharpDevelop.csproj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Main/SharpDevelop/SharpDevelop.csproj b/src/Main/SharpDevelop/SharpDevelop.csproj index abc1ba0b2e..c28c87fe62 100644 --- a/src/Main/SharpDevelop/SharpDevelop.csproj +++ b/src/Main/SharpDevelop/SharpDevelop.csproj @@ -241,6 +241,9 @@ Resources\StringResources.resx + + StringResources.resx + Configuration\GlobalAssemblyInfo.cs.template From 4e4ee835acded24b923106d0f5e92a7a3cb6484c Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Fri, 15 Aug 2014 17:43:19 +0200 Subject: [PATCH 09/16] fix some CommandManager-related bugs in ResourceEditor - make it suitable for translation-related usage --- .../HexEditor/Project/Src/View/HexEditView.cs | 4 +- .../Project/ResourceEditor.csproj | 2 +- .../Src/ResourceEdit/ResourceEditor.cs | 41 ++++++++------- ...ion.cs => ResourceEditorDisplayBinding.cs} | 52 ++++++------------- .../Base/Project/WinForms/IWinFormsService.cs | 5 ++ .../AbstractViewContentHandlingLoadErrors.cs | 2 +- .../SharpDevelop/WinForms/WinFormsService.cs | 6 ++- 7 files changed, 52 insertions(+), 60 deletions(-) rename src/AddIns/DisplayBindings/ResourceEditor/Project/Src/{DisplayDefinition.cs => ResourceEditorDisplayBinding.cs} (79%) diff --git a/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs b/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs index bfe4d78981..cfeb86cb19 100644 --- a/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs +++ b/src/AddIns/DisplayBindings/HexEditor/Project/Src/View/HexEditView.cs @@ -136,12 +136,12 @@ namespace HexEditor.View void DocumentChanged(object sender, EventArgs e) { if (PrimaryFile != null) PrimaryFile.MakeDirty(); - CommandManager.InvalidateRequerySuggested(); + SD.WinForms.InvalidateCommands(); } void SelectionChanged(object sender, System.EventArgs e) { - CommandManager.InvalidateRequerySuggested(); + SD.WinForms.InvalidateCommands(); } } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj index 6b2f2acc10..58b4161739 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/ResourceEditor.csproj @@ -54,7 +54,7 @@ - + Component diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs index ff5ceefb46..b81caa748d 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEdit/ResourceEditor.cs @@ -21,6 +21,7 @@ using System.Drawing; using System.Windows.Forms; using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.WinForms; namespace ResourceEditor { @@ -39,7 +40,7 @@ namespace ResourceEditor protected ListViewViewState internalState = ListViewViewState.Nothing; - public System.Enum InternalState { + public Enum InternalState { get { return internalState; } @@ -55,14 +56,14 @@ namespace ResourceEditor public ResourceEditorControl() { InitializeComponent(); - resourceList.SelectedIndexChanged += new EventHandler(resourceListSelectionChanged); + resourceList.SelectedIndexChanged += ResourceListSelectionChanged; } - void resourceListSelectionChanged(object sender, EventArgs e) + void ResourceListSelectionChanged(object sender, EventArgs e) { if(resourceList.SelectedItems.Count == 0) { internalState = ListViewViewState.Nothing; - showResource(null); + ShowResource(null); } else { internalState = ListViewViewState.ItemsSelected; } @@ -72,7 +73,7 @@ namespace ResourceEditor } object key = resourceList.SelectedItems[0].Text; ResourceItem item = (ResourceItem)resourceList.Resources[key.ToString()]; - showResource(item); + ShowResource(item); } void InitializeComponent() @@ -92,17 +93,17 @@ namespace ResourceEditor Controls.Add(splitter); Controls.Add(resourceList); - this.Resize += new EventHandler(initializeLayout); + this.Resize += InitializeLayout; } - void initializeLayout(object sender, EventArgs e) + void InitializeLayout(object sender, EventArgs e) { resourceList.Height = Convert.ToInt32(0.75 * Height); } - void showView(Control viewer) + void ShowView(Control viewer) { - // remvoe old view if there is one + // remove old view if there is one if(panel.Controls.Count == 1) { Control control = panel.Controls[0]; panel.Controls.Remove(control); @@ -114,41 +115,41 @@ namespace ResourceEditor panel.Controls.Add(viewer); currentView = (IResourceView)viewer; currentView.WriteProtected = resourceList.WriteProtected; - currentView.ResourceChanged += new ResourceChangedEventHandler(viewResourceChanged); + currentView.ResourceChanged += ViewResourceChanged; } } - void viewResourceChanged(object sender, ResourceEventArgs e) + void ViewResourceChanged(object sender, ResourceEventArgs e) { resourceList.SetResourceValue(e.ResourceName, e.ResourceValue); } - void showResource(ResourceItem item) + void ShowResource(ResourceItem item) { if(item == null) { - showView(null); + ShowView(null); return; } if (item.ResourceValue is Icon) { IconView iv = new IconView(item); - showView(iv); + ShowView(iv); } else if(item.ResourceValue is Bitmap) { BitmapView bv = new BitmapView(item); - showView(bv); + ShowView(bv); } else if(item.ResourceValue is Cursor) { CursorView cv = new CursorView(item); - showView(cv); + ShowView(cv); } else if(item.ResourceValue is string) { TextView tv = new TextView(item); - showView(tv); + ShowView(tv); } else if(item.ResourceValue is byte[]) { BinaryView bv = new BinaryView(item); - showView(bv); + ShowView(bv); } else if(item.ResourceValue is bool) { BooleanView bv = new BooleanView(item); - showView(bv); + ShowView(bv); } else { - showView(null); + ShowView(null); } } diff --git a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs similarity index 79% rename from src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs rename to src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs index 28ad9149da..6fc0f754c0 100644 --- a/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/DisplayDefinition.cs +++ b/src/AddIns/DisplayBindings/ResourceEditor/Project/Src/ResourceEditorDisplayBinding.cs @@ -32,7 +32,6 @@ namespace ResourceEditor { public class ResourceEditorDisplayBinding : IDisplayBinding { - // IDisplayBinding interface public bool CanCreateContentForFile(FileName fileName) { return true; // definition in .addin does extension-based filtering @@ -54,9 +53,6 @@ namespace ResourceEditor } } - /// - /// This class describes the main functionality of a language codon - /// public class ResourceEditWrapper : AbstractViewContentHandlingLoadErrors, IClipboardHandler { ResourceEditorControl resourceEditor = new ResourceEditorControl(); @@ -73,14 +69,16 @@ namespace ResourceEditor void SetDirty(object sender, EventArgs e) { - this.PrimaryFile.MakeDirty(); + PrimaryFile.MakeDirty(); + SD.WinForms.InvalidateCommands(); } public ResourceEditWrapper(OpenedFile file) { this.TabPageText = "Resource editor"; - base.UserContent = resourceEditor; - resourceEditor.ResourceList.Changed += new EventHandler(SetDirty); + UserContent = resourceEditor; + resourceEditor.ResourceList.Changed += SetDirty; + resourceEditor.ResourceList.ItemSelectionChanged += (sender, e) => SD.WinForms.InvalidateCommands(); this.Files.Add(file); } @@ -104,7 +102,7 @@ namespace ResourceEditor public bool EnableCut { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -114,7 +112,7 @@ namespace ResourceEditor public bool EnableCopy { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -124,7 +122,7 @@ namespace ResourceEditor public bool EnablePaste { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return true; @@ -134,7 +132,7 @@ namespace ResourceEditor public bool EnableDelete { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return resourceEditor.ResourceList.SelectedItems.Count > 0; @@ -144,7 +142,7 @@ namespace ResourceEditor public bool EnableSelectAll { get { - if (resourceEditor.ResourceList.IsEditing || !resourceEditor.ResourceList.Focused) { + if (resourceEditor.ResourceList.IsEditing) { return false; } return true; @@ -241,33 +239,17 @@ namespace ResourceEditor public void Delete() { - if (resourceEditor.ResourceList.WriteProtected) { + var resourceList = resourceEditor.ResourceList; + if (resourceList.WriteProtected || resourceList.SelectedItems.Count == 0) return; - } - - if (resourceEditor.ResourceList.SelectedItems.Count==0) return; // nothing to do - DialogResult rc; - - try { - - rc=MessageBox.Show(ResourceService.GetString("ResourceEditor.DeleteEntry.Confirm"),ResourceService.GetString("ResourceEditor.DeleteEntry.Title"),MessageBoxButtons.OKCancel); - } - catch { - // when something happens - like resource is missing - try to use default message - rc = MessageBox.Show("Do you really want to delete?","Delete-Warning!",MessageBoxButtons.OKCancel); - } - - if (rc != DialogResult.OK) { + if (!SD.MessageService.AskQuestion("${res:ResourceEditor.DeleteEntry.Confirm}", "${res:ResourceEditor.DeleteEntry.Title}")) return; - } - foreach (ListViewItem item in resourceEditor.ResourceList.SelectedItems) { - //// not clear why this check is present here - seems to be extra - ////if (item.Text != null) { - resourceEditor.ResourceList.Resources.Remove(item.Text); - resourceEditor.ResourceList.Items.Remove(item); + foreach (ListViewItem item in resourceList.SelectedItems) { + resourceList.Resources.Remove(item.Text); + resourceList.Items.Remove(item); // and set dirty flag - resourceEditor.ResourceList.OnChanged(); + resourceList.OnChanged(); } } diff --git a/src/Main/Base/Project/WinForms/IWinFormsService.cs b/src/Main/Base/Project/WinForms/IWinFormsService.cs index 4af46757f2..1eb510550c 100644 --- a/src/Main/Base/Project/WinForms/IWinFormsService.cs +++ b/src/Main/Base/Project/WinForms/IWinFormsService.cs @@ -142,5 +142,10 @@ namespace ICSharpCode.SharpDevelop.WinForms /// /// SDWindowsFormsHost instance CustomWindowsFormsHost CreateWindowsFormsHost(IServiceProvider serviceProvider = null, bool processShortcutsInWPF = false); + + /// + /// Provides access to from Windows Forms-based AddIns. + /// + void InvalidateCommands(); } } diff --git a/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs b/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs index 37e20e3b2e..582fe34d29 100644 --- a/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs +++ b/src/Main/Base/Project/Workbench/AbstractViewContentHandlingLoadErrors.cs @@ -40,7 +40,7 @@ namespace ICSharpCode.SharpDevelop.Workbench /// public abstract class AbstractViewContentHandlingLoadErrors : AbstractViewContent { - ContentPresenter contentControl = new ContentPresenter(); + readonly ContentPresenter contentControl = new ContentPresenter(); object userContent; protected AbstractViewContentHandlingLoadErrors() diff --git a/src/Main/SharpDevelop/WinForms/WinFormsService.cs b/src/Main/SharpDevelop/WinForms/WinFormsService.cs index 03be27db7c..5500fea972 100644 --- a/src/Main/SharpDevelop/WinForms/WinFormsService.cs +++ b/src/Main/SharpDevelop/WinForms/WinFormsService.cs @@ -22,7 +22,6 @@ using System.Drawing.Printing; using System.Windows.Forms; using ICSharpCode.Core; using ICSharpCode.Core.WinForms; -using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Widgets; using ICSharpCode.SharpDevelop.Workbench; @@ -195,5 +194,10 @@ namespace ICSharpCode.SharpDevelop.WinForms DisposeChild = false }; } + + public void InvalidateCommands() + { + System.Windows.Input.CommandManager.InvalidateRequerySuggested(); + } } } From 3fe3e66195a76a9f624e80c76cc2b5f1ada8aa29 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 16 Aug 2014 18:12:23 +0200 Subject: [PATCH 10/16] work on #527: Code Completion Options broken in 5.0 --- .../Src/Completion/CSharpCompletionBinding.cs | 3 +- .../AvalonEdit.AddIn/Src/CodeEditor.cs | 4 + .../CodeCompletionOptionPanel.xaml | 134 +++++++----------- .../CodeCompletionOptionPanel.xaml.cs | 43 +++--- .../CodeCompletion/ICompletionItemList.cs | 20 +-- .../Base/Project/Editor/ToolTipService.cs | 2 +- .../ParserService/CodeCompletionOptions.cs | 20 ++- 7 files changed, 104 insertions(+), 122 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs index 11bbd494da..c17fd5b888 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionBinding.cs @@ -115,6 +115,7 @@ namespace CSharpBinding.Completion } else { startPos = caretOffset; if (char.IsLetterOrDigit (completionChar) || completionChar == '_') { + if (!CodeCompletionOptions.CompleteWhenTyping) return false; if (startPos > 1 && char.IsLetterOrDigit (completionContext.Document.GetCharAt (startPos - 2))) return false; completionData = cce.GetCompletionData(startPos, false); @@ -137,7 +138,7 @@ namespace CSharpBinding.Completion return true; } - if (!ctrlSpace) { + if (CodeCompletionOptions.InsightEnabled && !ctrlSpace) { // Method Insight var pce = new CSharpParameterCompletionEngine( completionContext.Document, diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 0c14792c7c..df011392f8 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -569,6 +569,10 @@ namespace ICSharpCode.AvalonEdit.AddIn SD.ParserService.ParseAsync(this.FileName, this.Document.CreateSnapshot()).FireAndForget(); } else { if (e.Text.Length == 1) { + // disable all code completion bindings when CC is disabled + if (!CodeCompletionOptions.EnableCodeCompletion) + return; + foreach (ICodeCompletionBinding cc in CodeCompletionBindings) { if (cc.HandleKeyPressed(adapter, c)) break; diff --git a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml index f39d4b88cd..9d395de780 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml +++ b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml @@ -5,106 +5,68 @@ xmlns:gui="clr-namespace:ICSharpCode.SharpDevelop.Gui" xmlns:sd="clr-namespace:ICSharpCode.SharpDevelop" xmlns:widgets="clr-namespace:ICSharpCode.SharpDevelop.Widgets;assembly=ICSharpCode.SharpDevelop.Widgets"> - - - - - - - + + VerticalAlignment="Center" /> - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - + + + + + + + - - + - - + - - + - - - - + + - + - + \ No newline at end of file diff --git a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs index e70363988c..51de768fa9 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs +++ b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml.cs @@ -42,11 +42,7 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion this.UseDataUsageCache = CodeCompletionOptions.DataUsageCacheEnabled; DataUsageCacheItemCount = CodeCompletionOptions.DataUsageCacheItemCount; UseTooltips = CodeCompletionOptions.TooltipsEnabled; - useDebugTooltipsOnly.IsChecked = CodeCompletionOptions.TooltipsOnlyWhenDebugging; - completeWhenTyping.IsChecked = CodeCompletionOptions.CompleteWhenTyping; - useKeywordCompletionCheckBox.IsChecked = CodeCompletionOptions.KeywordCompletionEnabled; UseInsight = CodeCompletionOptions.InsightEnabled; - refreshInsightOnComma.IsChecked = CodeCompletionOptions.InsightRefreshOnComma; } @@ -54,13 +50,9 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion { CodeCompletionOptions.EnableCodeCompletion = this.EnableCodeCompletion; CodeCompletionOptions.DataUsageCacheEnabled = this.UseDataUsageCache; - CodeCompletionOptions.DataUsageCacheItemCount = DataUsageCacheItemCount; - CodeCompletionOptions.TooltipsEnabled = UseTooltips; - CodeCompletionOptions.TooltipsOnlyWhenDebugging = (bool)useDebugTooltipsOnly.IsChecked; - CodeCompletionOptions.CompleteWhenTyping = (bool)completeWhenTyping.IsChecked; - CodeCompletionOptions.KeywordCompletionEnabled = (bool)useKeywordCompletionCheckBox.IsChecked; + CodeCompletionOptions.DataUsageCacheItemCount = DataUsageCacheItemCount; + CodeCompletionOptions.TooltipsEnabled = UseTooltips; CodeCompletionOptions.InsightEnabled = UseInsight; - CodeCompletionOptions.InsightRefreshOnComma = (bool)refreshInsightOnComma.IsChecked; return base.SaveOptions(); } @@ -72,8 +64,10 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion public bool EnableCodeCompletion { get { return enableCodeCompletion; } - set { enableCodeCompletion = value; - base.RaisePropertyChanged(() => EnableCodeCompletion);} + set { + enableCodeCompletion = value; + base.RaisePropertyChanged(() => EnableCodeCompletion); + } } @@ -81,33 +75,40 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion public bool UseDataUsageCache { get { return useDataUsageCache; } - set { useDataUsageCache = value; - base.RaisePropertyChanged(() => UseDataUsageCache);} + set { + useDataUsageCache = value; + base.RaisePropertyChanged(() => UseDataUsageCache); + } } private int dataUsageCacheItemCount; public int DataUsageCacheItemCount { get { return dataUsageCacheItemCount; } - set { dataUsageCacheItemCount = value; - base.RaisePropertyChanged(() => DataUsageCacheItemCount);} + set { + dataUsageCacheItemCount = value; + base.RaisePropertyChanged(() => DataUsageCacheItemCount); + } } - private bool useTooltips; public bool UseTooltips { get { return useTooltips; } - set { useTooltips = value; - base.RaisePropertyChanged(() => UseTooltips);} + set { + useTooltips = value; + base.RaisePropertyChanged(() => UseTooltips); + } } private bool useInsight; public bool UseInsight { get { return useInsight; } - set { useInsight = value; - base.RaisePropertyChanged(() => UseInsight);} + set { + useInsight = value; + base.RaisePropertyChanged(() => UseInsight); + } } #endregion diff --git a/src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs b/src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs index faefa1a8aa..031d1abb6a 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs +++ b/src/Main/Base/Project/Editor/CodeCompletion/ICompletionItemList.cs @@ -138,16 +138,20 @@ namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion /// public virtual CompletionItemListKeyResult ProcessInput(char key) { - if (key == ' ' && this.InsertSpace) { - this.InsertSpace = false; // insert space only once - return CompletionItemListKeyResult.BeforeStartKey; - } else if (char.IsLetterOrDigit(key) || key == '_') { - this.InsertSpace = false; // don't insert space if user types normally + if (char.IsLetterOrDigit(key) || key == '_') { + InsertSpace = false; // don't insert space if user types normally return CompletionItemListKeyResult.NormalKey; - } else { - // do not reset insertSpace when doing an insertion! - return CompletionItemListKeyResult.InsertionKey; } + if (key == ' ' && InsertSpace) { + InsertSpace = false; + // insert space only once + return CompletionItemListKeyResult.BeforeStartKey; + } + if (CodeCompletionOptions.CommitOnTabEnterOnly || !CodeCompletionOptions.CommitOnChar(key)) { + return CompletionItemListKeyResult.Cancel; + } + // do not reset insertSpace when doing an insertion! + return CompletionItemListKeyResult.InsertionKey; } /// diff --git a/src/Main/Base/Project/Editor/ToolTipService.cs b/src/Main/Base/Project/Editor/ToolTipService.cs index 912765c35e..aa98e2bf6d 100644 --- a/src/Main/Base/Project/Editor/ToolTipService.cs +++ b/src/Main/Base/Project/Editor/ToolTipService.cs @@ -41,7 +41,7 @@ namespace ICSharpCode.SharpDevelop.Editor if (e == null) throw new ArgumentNullException("e"); - if (!CodeCompletionOptions.EnableCodeCompletion || !CodeCompletionOptions.TooltipsEnabled) { + if (!CodeCompletionOptions.TooltipsEnabled) { e.Handled = true; return; } diff --git a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs index b82f1bb429..4e2965dbeb 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/CodeCompletionOptions.cs @@ -63,16 +63,16 @@ namespace ICSharpCode.SharpDevelop set { properties.Set("TooltipsOnlyWhenDebugging", value); } } - public static bool KeywordCompletionEnabled { - get { return properties.Get("KeywordCompletionEnabled", true); } - set { properties.Set("KeywordCompletionEnabled", value); } - } - public static bool CompleteWhenTyping { get { return properties.Get("CompleteWhenTyping", true); } set { properties.Set("CompleteWhenTyping", value); } } + public static bool CommitOnTabEnterOnly { + get { return properties.Get("CommitOnTabEnterOnly", false); } + set { properties.Set("CommitOnTabEnterOnly", value); } + } + public static bool InsightEnabled { get { return properties.Get("InsightEnabled", true); } set { properties.Set("InsightEnabled", value); } @@ -87,6 +87,16 @@ namespace ICSharpCode.SharpDevelop get { return properties.Get("TooltipLinkTarget", TooltipLinkTarget.Documentation); } set { properties.Set("TooltipLinkTarget", value); } } + + public static string CompletionCharList { + get { return properties.Get("CompletionCharList", @"{}[]().,:;+-*/%&|^!~=<>?@#'""\"); } + set { properties.Set("CompletionCharList", value); } + } + + public static bool CommitOnChar(char key) + { + return CompletionCharList.IndexOf(key) >= 0; + } } public enum TooltipLinkTarget { From 3288019d739443526181b0d39d5acff5c5e6ee18 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sun, 17 Aug 2014 19:22:01 +0200 Subject: [PATCH 11/16] fix #527: Code Completion Options broken in 5.0 fix #151: Add option "Complete only when pressing Return/Tab" --- data/resources/StringResources.resx | 9 +++ .../Project/Src/Completion/CompletionData.cs | 3 +- .../Src/Snippets/SnippetCompletionItem.cs | 3 +- .../CodeCompletion/CompletionWindow.cs | 10 ++- .../CodeCompletionOptionPanel.xaml | 68 ++++++++++------ .../CodeCompletionOptionPanel.xaml.cs | 81 ------------------- .../Editor/CodeCompletion/ICompletionItem.cs | 3 +- .../ParserService/CodeCompletionOptions.cs | 5 -- 8 files changed, 65 insertions(+), 117 deletions(-) diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index 4acee42bfb..0be935f412 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -8192,4 +8192,13 @@ Error while starting: This resource is not being used. Its purpose is to test the translation database and has a line break + + Tooltip settings + + + Insert selected code completion entry by typing the following characters: + + + Only insert selected code completion entry by typing <Tab> or <Enter>. + \ No newline at end of file diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs index 7c04f56b9f..d717ebaf7b 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CompletionData.cs @@ -78,13 +78,14 @@ namespace CSharpBinding.Completion public IImage Image { get; set; } public virtual double Priority { - get { return 0; } + get { return CodeCompletionDataUsageCache.GetPriority(DisplayText, true); } } public virtual void Complete(CompletionContext context) { context.Editor.Document.Replace(context.StartOffset, context.Length, this.CompletionText); context.EndOffset = context.StartOffset + this.CompletionText.Length; + CodeCompletionDataUsageCache.IncrementUsage(DisplayText); } object fancyContent; diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs index d2882c81f7..4b58cbfdc4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetCompletionItem.cs @@ -49,8 +49,7 @@ namespace ICSharpCode.AvalonEdit.AddIn.Snippets if (textArea == null) throw new ArgumentException("textEditor must be an AvalonEdit text editor"); this.codeSnippet = codeSnippet; - - //this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true); + this.Priority = CodeCompletionDataUsageCache.GetPriority("snippet" + codeSnippet.Name, true); } public bool AlwaysInsertSnippet { get; set; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs index 1810c94e0e..3a81b86a0f 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindow.cs @@ -17,13 +17,10 @@ // DEALINGS IN THE SOFTWARE. using System; -using System.Diagnostics; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; -using System.Windows.Data; using System.Windows.Input; -using System.Windows.Threading; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Editing; @@ -67,6 +64,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion } #region ToolTip handling + public bool ShowDocumentationTooltips { get; set; } + void toolTip_Closed(object sender, RoutedEventArgs e) { // Clear content after tooltip is closed. @@ -78,6 +77,11 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion void completionList_SelectionChanged(object sender, SelectionChangedEventArgs e) { + if (!ShowDocumentationTooltips) { + toolTip.IsOpen = false; + return; + } + var item = completionList.SelectedItem; if (item == null) return; diff --git a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml index 9d395de780..d2bca2d28d 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml +++ b/src/Main/Base/Project/Editor/CodeCompletion/CodeCompletionOptionPanel.xaml @@ -6,22 +6,17 @@ xmlns:sd="clr-namespace:ICSharpCode.SharpDevelop" xmlns:widgets="clr-namespace:ICSharpCode.SharpDevelop.Widgets;assembly=ICSharpCode.SharpDevelop.Widgets"> - - - - + Margin="5"> + + + - + @@ -33,6 +28,35 @@ + + + + + + + + + +