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
{