diff options
11 files changed, 141 insertions, 93 deletions
diff --git a/main/src/core/MonoDevelop.Ide/ChangeLog b/main/src/core/MonoDevelop.Ide/ChangeLog index 0176dfe94a..ac1a0bd58a 100644 --- a/main/src/core/MonoDevelop.Ide/ChangeLog +++ b/main/src/core/MonoDevelop.Ide/ChangeLog @@ -1,5 +1,26 @@ 2010-05-11 Mike Krüger <mkrueger@novell.com> + * Makefile.am: + * MonoDevelop.Ide.csproj: + * MonoDevelop.Ide.CodeCompletion/DisplayFlags.cs: + * MonoDevelop.Ide.CodeCompletion/CompletionData.cs: + * MonoDevelop.Ide.CodeTemplates/ExpansionObject.cs: + * MonoDevelop.Ide.CodeCompletion/ICompletionData.cs: + * MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs: + * MonoDevelop.Ide.CodeCompletion/CompletionCategory.cs: + * MonoDevelop.Ide.CodeCompletion/MemberCompletionData.cs: + * MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs: + * MonoDevelop.Ide.CodeCompletion/IMemberCompletionData.cs: + * MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs: + Made the code completion system a more consistent (Removed + interfaces, provided common base class - easier to extend), + ActionCompletionData in conjunction with completion history + now works correctly. Custom CompletionData now has access to + the list window as well (Required for more complex insert + actions). + +2010-05-11 Mike Krüger <mkrueger@novell.com> + * MonoDevelop.Ide.NavigateToDialog/NavigateToDialog.cs: filter matches. diff --git a/main/src/core/MonoDevelop.Ide/Makefile.am b/main/src/core/MonoDevelop.Ide/Makefile.am index 12f5b74872..4a3c7aef6e 100644 --- a/main/src/core/MonoDevelop.Ide/Makefile.am +++ b/main/src/core/MonoDevelop.Ide/Makefile.am @@ -264,17 +264,18 @@ FILES = \ MonoDevelop.Components/WindowTransparencyDecorator.cs \ MonoDevelop.Ide.CodeCompletion/CodeCompletionContext.cs \ MonoDevelop.Ide.CodeCompletion/CodeCompletionContextEventArgs.cs \ + MonoDevelop.Ide.CodeCompletion/CompletionCategory.cs \ MonoDevelop.Ide.CodeCompletion/CompletionData.cs \ MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs \ MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs \ MonoDevelop.Ide.CodeCompletion/CompletionWindowManager.cs \ MonoDevelop.Ide.CodeCompletion/DeclarationViewWindow.cs \ - MonoDevelop.Ide.CodeCompletion/ICompletionData.cs \ + MonoDevelop.Ide.CodeCompletion/DisplayFlags.cs \ MonoDevelop.Ide.CodeCompletion/ICompletionWidget.cs \ - MonoDevelop.Ide.CodeCompletion/IMemberCompletionData.cs \ MonoDevelop.Ide.CodeCompletion/IParameterDataProvider.cs \ MonoDevelop.Ide.CodeCompletion/ListWidget.cs \ MonoDevelop.Ide.CodeCompletion/ListWindow.cs \ + MonoDevelop.Ide.CodeCompletion/MemberCompletionData.cs \ MonoDevelop.Ide.CodeCompletion/MutableCompletionDataList.cs \ MonoDevelop.Ide.CodeCompletion/ParameterInformationWindow.cs \ MonoDevelop.Ide.CodeCompletion/ParameterInformationWindowManager.cs \ diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionCategory.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionCategory.cs new file mode 100644 index 0000000000..a94ff7356f --- /dev/null +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionCategory.cs @@ -0,0 +1,50 @@ +// +// CompletionData.cs +// +// Author: +// Mike Krüger <mkrueger@novell.com> +// +// Copyright (c) 2010 Novell, Inc (http://www.novell.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +using System; +using System.Collections.Generic; +using System.Linq; +using MonoDevelop.Core; +namespace MonoDevelop.Ide.CodeCompletion +{ +public abstract class CompletionCategory : IComparable<CompletionCategory> + { + public string DisplayText { get; set; } + public IconId Icon { get; set; } + + public CompletionCategory () + { + } + + public CompletionCategory (string displayText, IconId icon) + { + this.DisplayText = displayText; + this.Icon = icon; + } + + public abstract int CompareTo (CompletionCategory other); + } +} diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionData.cs index 6e57a2e253..55787325dc 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionData.cs @@ -1,5 +1,5 @@ // -// SimpleCompletionData.cs +// CompletionData.cs // // Author: // Michael Hutchinson <mhutchinson@novell.com> @@ -33,27 +33,30 @@ using MonoDevelop.Core; namespace MonoDevelop.Ide.CodeCompletion { - public abstract class CompletionCategory : IComparable<CompletionCategory> + public class CompletionData { - public string DisplayText { get; set; } - public IconId Icon { get; set; } + protected CompletionData () {} - public CompletionCategory () - { + public virtual IconId Icon { get; set; } + public virtual string DisplayText { get; set; } + public virtual string Description { get; set; } + public virtual string CompletionText { get; set; } + public virtual string DisplayDescription { get; set; } + public virtual CompletionCategory CompletionCategory { get; set; } + public virtual DisplayFlags DisplayFlags { get; set; } + + public virtual bool IsOverloaded { + get { + return false; + } } - public CompletionCategory (string displayText, IconId icon) - { - this.DisplayText = displayText; - this.Icon = icon; + public virtual IEnumerable<CompletionData> OverloadedData { + get { + throw new System.InvalidOperationException (); + } } - public abstract int CompareTo (CompletionCategory other); - } - - public class CompletionData : ICompletionData - { - protected CompletionData () {} public CompletionData (string text) : this (text, null, null) {} public CompletionData (string text, IconId icon) : this (text, icon, null) {} public CompletionData (string text, IconId icon, string description) : this (text, icon, description, text) {} @@ -66,13 +69,15 @@ namespace MonoDevelop.Ide.CodeCompletion this.CompletionText = completionText; } - public virtual IconId Icon { get; set; } - public virtual string DisplayText { get; set; } - public virtual string Description { get; set; } - public virtual string CompletionText { get; set; } - public virtual string DisplayDescription { get; set; } - public virtual CompletionCategory CompletionCategory { get; set; } - public virtual DisplayFlags DisplayFlags { get; set; } + public virtual void InsertCompletionText (CompletionListWindow window) + { + int partialWordLength = window.PartialWord != null ? window.PartialWord.Length : 0; + + int replaceLength = window.CodeCompletionContext.TriggerWordLength + partialWordLength - window.InitialWordLength; + string currentWord = window.CompletionWidget.GetText (window.CodeCompletionContext.TriggerOffset, window.CodeCompletionContext.TriggerOffset + replaceLength); + + window.CompletionWidget.SetCompletionText (window.CodeCompletionContext, currentWord, CompletionText); + } public override string ToString () { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs index e46bcd711c..8e9b675127 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionDataList.cs @@ -33,7 +33,7 @@ using MonoDevelop.Core; namespace MonoDevelop.Ide.CodeCompletion { - public interface ICompletionDataList : IList<ICompletionData> + public interface ICompletionDataList : IList<CompletionData> { bool IsSorted { get; } bool AutoCompleteUniqueMatch { get; } @@ -42,8 +42,8 @@ namespace MonoDevelop.Ide.CodeCompletion bool AutoSelect { get; } string DefaultCompletionString { get; } CompletionSelectionMode CompletionSelectionMode { get; } - void Sort (Comparison<ICompletionData> comparison); - void Sort (IComparer<ICompletionData> comparison); + void Sort (Comparison<CompletionData> comparison); + void Sort (IComparer<CompletionData> comparison); IEnumerable<ICompletionKeyHandler> KeyHandler { get; } } @@ -59,7 +59,7 @@ namespace MonoDevelop.Ide.CodeCompletion OwnTextField } - public class CompletionDataList : List<ICompletionData>, ICompletionDataList + public class CompletionDataList : List<CompletionData>, ICompletionDataList { public bool IsSorted { get; set; } @@ -78,7 +78,7 @@ namespace MonoDevelop.Ide.CodeCompletion this.AutoSelect = true; } - public CompletionDataList (IEnumerable<ICompletionData> data) : base(data) + public CompletionDataList (IEnumerable<CompletionData> data) : base(data) { this.AutoSelect = true; } @@ -116,9 +116,9 @@ namespace MonoDevelop.Ide.CodeCompletion return datum; } - public ICompletionData Find (string name) + public CompletionData Find (string name) { - foreach (ICompletionData datum in this) + foreach (CompletionData datum in this) if (datum.CompletionText == name) return datum; return null; @@ -135,7 +135,7 @@ namespace MonoDevelop.Ide.CodeCompletion return false; } - public void RemoveWhere (Func<ICompletionData,bool> shouldRemove) + public void RemoveWhere (Func<CompletionData,bool> shouldRemove) { for (int i = 0; i < this.Count;) { if (shouldRemove (this[i])) diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs index 9748b64b3e..a2adbfa162 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/CompletionListWindow.cs @@ -40,7 +40,7 @@ namespace MonoDevelop.Ide.CodeCompletion const int declarationWindowMargin = 3; DeclarationViewWindow declarationviewwindow = new DeclarationViewWindow (); - ICompletionData currentData; + CompletionData currentData; Widget parsingMessage; System.Action closedDelegate; int initialWordLength; @@ -59,6 +59,10 @@ namespace MonoDevelop.Ide.CodeCompletion public int X { get; private set; } public int Y { get; private set; } + public int InitialWordLength { + get { return this.initialWordLength; } + } + IMutableCompletionDataList mutableList; ICompletionDataList completionDataList; public ICompletionDataList CompletionDataList { @@ -237,9 +241,9 @@ namespace MonoDevelop.Ide.CodeCompletion return false; } - class DataItemComparer : IComparer<ICompletionData> + class DataItemComparer : IComparer<CompletionData> { - public int Compare (ICompletionData a, ICompletionData b) + public int Compare (CompletionData a, CompletionData b) { return ((a.DisplayFlags & DisplayFlags.Obsolete) == (b.DisplayFlags & DisplayFlags.Obsolete)) ? StringComparer.OrdinalIgnoreCase.Compare (a.DisplayText, b.DisplayText) @@ -316,22 +320,13 @@ namespace MonoDevelop.Ide.CodeCompletion { if (SelectionIndex == -1 || completionDataList == null) return; - ICompletionData item = completionDataList[SelectionIndex]; + CompletionData item = completionDataList[SelectionIndex]; if (item == null) return; - IActionCompletionData ac = item as IActionCompletionData; - if (ac != null) { - ac.InsertCompletionText (CompletionWidget, CodeCompletionContext); - return; - } - int partialWordLength = PartialWord != null ? PartialWord.Length : 0; - int replaceLength = CodeCompletionContext.TriggerWordLength + partialWordLength - initialWordLength; - string currentWord = CompletionWidget.GetText (CodeCompletionContext.TriggerOffset, CodeCompletionContext.TriggerOffset + replaceLength); - string completedWord = item.CompletionText; - AddWordToHistory (completedWord); - CompletionWidget.SetCompletionText (CodeCompletionContext, currentWord, completedWord); - OnWordCompleted (new CodeCompletionContextEventArgs (CompletionWidget, CodeCompletionContext, completedWord)); + item.InsertCompletionText (this); + AddWordToHistory (item.CompletionText); + OnWordCompleted (new CodeCompletionContextEventArgs (CompletionWidget, CodeCompletionContext, item.CompletionText)); } protected virtual void OnWordCompleted (CodeCompletionContextEventArgs e) @@ -410,14 +405,13 @@ namespace MonoDevelop.Ide.CodeCompletion HideDeclarationView (); return; } - ICompletionData data = completionDataList[List.SelectionIndex]; - IOverloadedCompletionData overloadedData = data as IOverloadedCompletionData; - - IList<ICompletionData> overloads; - if (overloadedData != null) { - overloads = new List<ICompletionData> (overloadedData.GetOverloadedData ()); + CompletionData data = completionDataList[List.SelectionIndex]; + + IList<CompletionData> overloads; + if (data.IsOverloaded) { + overloads = new List<CompletionData> (data.OverloadedData); } else { - overloads = new ICompletionData[] { data }; + overloads = new CompletionData[] { data }; } if (data != currentData) { @@ -426,14 +420,14 @@ namespace MonoDevelop.Ide.CodeCompletion declarationviewwindow.Clear (); declarationviewwindow.Realize (); - foreach (ICompletionData overload in overloads) { + foreach (CompletionData overload in overloads) { bool oDataHasMarkup = (overload.DisplayFlags & DisplayFlags.DescriptionHasMarkup) != 0; declarationviewwindow.AddOverload (oDataHasMarkup ? overload.Description : GLib.Markup.EscapeText (overload.Description)); } - declarationviewwindow.Multiple = (overloadedData != null && overloadedData.IsOverloaded); + declarationviewwindow.Multiple = data.IsOverloaded; currentData = data; } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ICompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/DisplayFlags.cs index e71e516377..32f6d01571 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/ICompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/DisplayFlags.cs @@ -32,30 +32,6 @@ using MonoDevelop.Core; namespace MonoDevelop.Ide.CodeCompletion { - public interface IOverloadedCompletionData : ICompletionData - { - IEnumerable<ICompletionData> GetOverloadedData (); - bool IsOverloaded { get; } - } - - public interface ICompletionData - { - IconId Icon { get; } - string DisplayText { get; } - string DisplayDescription { get; } - - string Description { get; } - - string CompletionText { get; } - CompletionCategory CompletionCategory { get; } - DisplayFlags DisplayFlags { get; } - } - - public interface IActionCompletionData : ICompletionData - { - void InsertCompletionText (ICompletionWidget widget, CodeCompletionContext context); - } - [Flags] public enum DisplayFlags { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/IMemberCompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/MemberCompletionData.cs index 9671740d73..7617542ab1 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/IMemberCompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeCompletion/MemberCompletionData.cs @@ -29,9 +29,9 @@ using MonoDevelop.Projects.Dom; namespace MonoDevelop.Ide.CodeCompletion { - public interface IMemberCompletionData : ICompletionData + public class MemberCompletionData : CompletionData { - INode Member { + public INode Member { get; set; } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs index 7bf87f33b9..315057bc64 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/CodeTemplateCompletionData.cs @@ -37,7 +37,7 @@ namespace MonoDevelop.Ide.CodeTemplates void InsertTemplate (CodeTemplate template, Document document); } - public class CodeTemplateCompletionData : CompletionData, IActionCompletionData + public class CodeTemplateCompletionData : CompletionData { Document doc; CodeTemplate template; @@ -52,10 +52,10 @@ namespace MonoDevelop.Ide.CodeTemplates this.Description = template.Shortcut + Environment.NewLine + GettextCatalog.GetString (template.Description); } - public void InsertCompletionText (ICompletionWidget widget, CodeCompletionContext context) + public override void InsertCompletionText (CompletionListWindow window) { - if (widget is ICodeTemplateWidget) { - ((ICodeTemplateWidget)widget).InsertTemplate (template, doc); + if (window.CompletionWidget is ICodeTemplateWidget) { + ((ICodeTemplateWidget)window.CompletionWidget).InsertTemplate (template, doc); } else { template.InsertTemplate (doc); } diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/ExpansionObject.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/ExpansionObject.cs index 48748cb84e..fa2bb6e562 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/ExpansionObject.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.CodeTemplates/ExpansionObject.cs @@ -142,7 +142,7 @@ namespace MonoDevelop.Ide.CodeTemplates list = ext.CodeCompletionCommand (CurrentContext.Document.TextEditor.CurrentCodeCompletionContext); foreach (object o in list) { - MonoDevelop.Ide.CodeCompletion.IMemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.IMemberCompletionData; + MonoDevelop.Ide.CodeCompletion.MemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.MemberCompletionData; if (data == null) continue; @@ -154,7 +154,7 @@ namespace MonoDevelop.Ide.CodeTemplates } foreach (object o in list) { - MonoDevelop.Ide.CodeCompletion.IMemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.IMemberCompletionData; + MonoDevelop.Ide.CodeCompletion.MemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.MemberCompletionData; if (data == null) continue; if (data.Member is IParameter) { @@ -165,7 +165,7 @@ namespace MonoDevelop.Ide.CodeTemplates } foreach (object o in list) { - MonoDevelop.Ide.CodeCompletion.IMemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.IMemberCompletionData; + MonoDevelop.Ide.CodeCompletion.MemberCompletionData data = o as MonoDevelop.Ide.CodeCompletion.MemberCompletionData; if (data == null) continue; if (data.Member is LocalVariable) { diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj index 0d24493c26..621d45a9ef 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.csproj @@ -1212,11 +1212,9 @@ <Compile Include="MonoDevelop.Ide.CodeCompletion\IParameterDataProvider.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\ParameterInformationWindowManager.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\ParameterInformationWindow.cs" /> - <Compile Include="MonoDevelop.Ide.CodeCompletion\ICompletionData.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\CompletionData.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\CompletionDataList.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\MutableCompletionDataList.cs" /> - <Compile Include="MonoDevelop.Ide.CodeCompletion\IMemberCompletionData.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\CompletionWindowManager.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\ListWidget.cs" /> <Compile Include="MonoDevelop.Ide.CodeCompletion\CodeCompletionContext.cs" /> @@ -1355,6 +1353,9 @@ <Compile Include="MonoDevelop.Ide.NavigateToDialog\NavigateToCommand.cs" /> <Compile Include="MonoDevelop.Ide.NavigateToDialog\SearchResult.cs" /> <Compile Include="MonoDevelop.Ide.NavigateToDialog\ResultsDataSource.cs" /> + <Compile Include="MonoDevelop.Ide.CodeCompletion\DisplayFlags.cs" /> + <Compile Include="MonoDevelop.Ide.CodeCompletion\MemberCompletionData.cs" /> + <Compile Include="MonoDevelop.Ide.CodeCompletion\CompletionCategory.cs" /> </ItemGroup> <ItemGroup> <None Include="ChangeLog" /> |