diff --git a/src/AddIns/Misc/ResourceToolkit/Project/ResourceToolkit.csproj b/src/AddIns/Misc/ResourceToolkit/Project/ResourceToolkit.csproj index 4c8a52f323..6ba21e5c88 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/ResourceToolkit.csproj +++ b/src/AddIns/Misc/ResourceToolkit/Project/ResourceToolkit.csproj @@ -16,6 +16,8 @@ 4096 4 false + False + -Microsoft.Design#CA1020 obj\ @@ -93,6 +95,7 @@ + diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreResourceCodeCompletionBinding.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreResourceCodeCompletionBinding.cs index 3af384223a..cf594460f8 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreResourceCodeCompletionBinding.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreResourceCodeCompletionBinding.cs @@ -19,7 +19,7 @@ namespace Hornung.ResourceToolkit.CodeCompletion { /// /// Provides code completion for inserting resource keys - /// for ICSharpCode.Core resources references ("${res:...}"). + /// for ICSharpCode.Core resources references ("${res: ... }"). /// public class ICSharpCodeCoreResourceCodeCompletionBinding : DefaultCodeCompletionBinding { @@ -60,6 +60,18 @@ namespace Hornung.ResourceToolkit.CodeCompletion } + } else if (ch == '$') { + + // Provide ${res: as code completion + // in an ICSharpCode.Core application + if (ICSharpCodeCoreResourceResolver.GetICSharpCodeCoreHostResourceFileName(editor.FileName) != null || + ICSharpCodeCoreResourceResolver.GetICSharpCodeCoreLocalResourceFileName(editor.FileName) != null) { + + editor.ShowCompletionWindow(new ICSharpCodeCoreTagCompletionDataProvider(), ch); + return true; + + } + } return false; diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreTagCompletionDataProvider.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreTagCompletionDataProvider.cs new file mode 100644 index 0000000000..761a27aae5 --- /dev/null +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/CodeCompletion/ICSharpCodeCoreTagCompletionDataProvider.cs @@ -0,0 +1,86 @@ +// +// +// +// +// $Revision$ +// + +using System; +using System.Text; + +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor; +using ICSharpCode.TextEditor; +using ICSharpCode.TextEditor.Gui.CompletionWindow; + +namespace Hornung.ResourceToolkit.CodeCompletion +{ + /// + /// Provides code completion data for the ${res tag. + /// + public class ICSharpCodeCoreTagCompletionDataProvider : AbstractCompletionDataProvider + { + int startOffset; + TextArea textArea; + bool nonMatchingCharTyped; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303:DoNotPassLiteralsAsLocalizedParameters", MessageId = "ICSharpCode.TextEditor.Gui.CompletionWindow.DefaultCompletionData.#ctor(System.String,System.String,System.Int32)")] + public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) + { + this.textArea = textArea; + this.startOffset = textArea.Caret.Offset; + this.nonMatchingCharTyped = false; + this.DefaultIndex = 0; + return new ICompletionData[] { new DefaultCompletionData("{res", null, ClassBrowserIconService.GotoArrowIndex) }; + } + + public override CompletionDataProviderKeyResult ProcessKey(char key) + { + // Return NormalKey as long as: + // - the typed string matches the ${res tag + // - ':' is not pressed + // Return InsertionKey when: + // - ':' is pressed and the typed string matches the ${res tag + // - the typed string does not match the ${res tag and more than one + // character has already been typed (to close the completion window) + + string typedTag = this.GetTypedText(); + if (key != ':') { + typedTag += key; + } + + bool match = "${res:".StartsWith(typedTag, StringComparison.InvariantCultureIgnoreCase); + + if (key == ':') { + if (match || this.nonMatchingCharTyped) { + return CompletionDataProviderKeyResult.InsertionKey; + } else { + this.nonMatchingCharTyped = true; + return CompletionDataProviderKeyResult.NormalKey; + } + } else { + if (match) { + this.nonMatchingCharTyped = false; + return CompletionDataProviderKeyResult.NormalKey; + } else { + if (this.nonMatchingCharTyped) { + return CompletionDataProviderKeyResult.InsertionKey; + } else { + this.nonMatchingCharTyped = true; + return CompletionDataProviderKeyResult.NormalKey; + } + } + } + } + + string GetTypedText() + { + if (this.textArea == null) { + return String.Empty; + } + + int offset = Math.Max(this.startOffset, 0); + return this.textArea.Document.GetText(offset, Math.Min(Math.Max(this.textArea.Caret.Offset - offset, 0), this.textArea.Document.TextLength - offset)); + } + } +} diff --git a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ICSharpCodeCoreResourceResolver.cs b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ICSharpCodeCoreResourceResolver.cs index 07c471293f..4093588d69 100644 --- a/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ICSharpCodeCoreResourceResolver.cs +++ b/src/AddIns/Misc/ResourceToolkit/Project/Src/Resolver/ICSharpCodeCoreResourceResolver.cs @@ -20,7 +20,7 @@ namespace Hornung.ResourceToolkit.Resolver { /// /// Resolves references to resources that are accessed using ICSharpCode.Core - /// ("${res:...}"). + /// ("${res: ... }"). /// public class ICSharpCodeCoreResourceResolver : AbstractResourceResolver {