Browse Source

Forum-6859: Show code templates in code completion.

Templates are now inserted by pressing Tab (instead of Space).
However, when "Automatic template insertion" in the text editor options is on (new default: off), templates are also inserted when a template is chosen from the code completion list.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2932 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
82bbab8aec
  1. 1
      AddIns/ICSharpCode.SharpDevelop.addin
  2. 16
      data/options/SharpDevelop-templates.xml
  3. 20
      samples/CSharpCodeCompletion/CodeCompletionData.cs
  4. 8
      samples/CSharpCodeCompletion/CodeCompletionProvider.cs
  5. 2
      samples/CSharpCodeCompletion/MainForm.cs
  6. 5
      samples/CSharpCodeCompletion/ToolTipProvider.cs
  7. 8
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionData.cs
  8. 2
      src/AddIns/DisplayBindings/XmlEditor/Test/Completion/FirstCompletionListItemSelectedTestFixture.cs
  9. 1
      src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj
  10. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionListView.cs
  11. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
  12. 13
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionData.cs
  13. 1
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControlBase.cs
  14. 47
      src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs
  15. 7
      src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs
  16. 24
      src/Main/Base/Project/Src/TextEditor/Actions.cs
  17. 9
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  18. 10
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs
  19. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataUsageCache.cs
  20. 10
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CommentCompletionDataProvider.cs
  21. 19
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CtrlSpaceCompletionDataProvider.cs
  22. 72
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/TemplateCompletionDataProvider.cs
  23. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/NRefactoryCodeCompletionBinding.cs
  24. 25
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs
  25. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs
  26. 2
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs

1
AddIns/ICSharpCode.SharpDevelop.addin

@ -1999,6 +1999,7 @@
<EditAction id = "TemplateCompletion" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.TemplateCompletion" keys = "Control|J"/> <EditAction id = "TemplateCompletion" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.TemplateCompletion" keys = "Control|J"/>
<EditAction id = "CodeCompletionPopup" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.CodeCompletionPopup" keys = "Control|Space"/> <EditAction id = "CodeCompletionPopup" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.CodeCompletionPopup" keys = "Control|Space"/>
<EditAction id = "GoToDefinition" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.GoToDefinition" keys = "Control|Enter"/> <EditAction id = "GoToDefinition" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.GoToDefinition" keys = "Control|Enter"/>
<EditAction id = "ExpandTemplateAction" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.ExpandTemplateAction" keys = "Tab"/>
</Path> </Path>
<Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar"> <Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar">

16
data/options/SharpDevelop-templates.xml

@ -4,12 +4,10 @@
{ {
${Selection} ${Selection}
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="forb" description="for block">for (|; ; ) { <CodeTemplate template="for" description="for block">for (|; ; ) {
${Selection} ${Selection}
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="fors" description="for (no braces)">for (|; ; ) <CodeTemplate template="if" description="if statement">if (|) {
${Selection}</CodeTemplate>
<CodeTemplate template="ifb" description="if statement">if (|) {
${Selection} ${Selection}
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="ife" description="if else">if (|) { <CodeTemplate template="ife" description="if else">if (|) {
@ -17,8 +15,6 @@
} else { } else {
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="ifs" description="if statement (no braces)">if (|)
${Selection}</CodeTemplate>
<CodeTemplate template="switchd" description="switch statement (with default)">switch (|) { <CodeTemplate template="switchd" description="switch statement (with default)">switch (|) {
case: case:
break; break;
@ -26,12 +22,12 @@
${Selection} ${Selection}
break; break;
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="switchs" description="switch statement">switch (|) { <CodeTemplate template="switch" description="switch statement">switch (|) {
case : case :
${Selection} ${Selection}
break; break;
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="tryc" description="try / catch">try { <CodeTemplate template="try" description="try / catch">try {
${Selection}| ${Selection}|
} catch (Exception) { } catch (Exception) {
@ -48,11 +44,9 @@
} finally { } finally {
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="whileb" description="while">while (|) { <CodeTemplate template="while" description="while">while (|) {
${Selection} ${Selection}
}</CodeTemplate> }</CodeTemplate>
<CodeTemplate template="whiles" description="while (no braces)">while (|)
${Selection}</CodeTemplate>
<CodeTemplate template="scwl" description="System.Console.WriteLine">System.Console.WriteLine(${Selection}|);</CodeTemplate> <CodeTemplate template="scwl" description="System.Console.WriteLine">System.Console.WriteLine(${Selection}|);</CodeTemplate>
<CodeTemplate template="scw" description="System.Console.Write">System.Console.Write(${Selection}|);</CodeTemplate> <CodeTemplate template="scw" description="System.Console.Write">System.Console.Write(${Selection}|);</CodeTemplate>
</CodeTemplateGroup> </CodeTemplateGroup>

20
samples/CSharpCodeCompletion/CodeCompletionData.cs

@ -14,6 +14,7 @@ using System.Xml;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.CSharp; using ICSharpCode.SharpDevelop.Dom.CSharp;
using ICSharpCode.SharpDevelop.Dom.VBNet;
using ICSharpCode.TextEditor.Gui.CompletionWindow; using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace CSharpEditor namespace CSharpEditor
@ -76,8 +77,8 @@ namespace CSharpEditor
string ICompletionData.Description { string ICompletionData.Description {
get { get {
if (description == null) { if (description == null) {
IDecoration entity = (IDecoration)member ?? c; IEntity entity = (IEntity)member ?? c;
description = GetCSharpText(entity); description = GetText(entity);
if (overloads > 1) { if (overloads > 1) {
description += " (+" + overloads + " overloads)"; description += " (+" + overloads + " overloads)";
} }
@ -89,21 +90,22 @@ namespace CSharpEditor
/// <summary> /// <summary>
/// Converts a member to text. /// Converts a member to text.
/// Returns the declaration of the member as C# code, e.g. /// Returns the declaration of the member as C# or VB code, e.g.
/// "public void MemberName(string parameter)" /// "public void MemberName(string parameter)"
/// </summary> /// </summary>
static string GetCSharpText(IDecoration entity) static string GetText(IEntity entity)
{ {
IAmbience ambience = MainForm.IsVisualBasic ? (IAmbience)VBNetAmbience.Instance : CSharpAmbience.Instance;
if (entity is IMethod) if (entity is IMethod)
return CSharpAmbience.Instance.Convert(entity as IMethod); return ambience.Convert(entity as IMethod);
if (entity is IProperty) if (entity is IProperty)
return CSharpAmbience.Instance.Convert(entity as IProperty); return ambience.Convert(entity as IProperty);
if (entity is IEvent) if (entity is IEvent)
return CSharpAmbience.Instance.Convert(entity as IEvent); return ambience.Convert(entity as IEvent);
if (entity is IField) if (entity is IField)
return CSharpAmbience.Instance.Convert(entity as IField); return ambience.Convert(entity as IField);
if (entity is IClass) if (entity is IClass)
return CSharpAmbience.Instance.Convert(entity as IClass); return ambience.Convert(entity as IClass);
// unknown entity: // unknown entity:
return entity.ToString(); return entity.ToString();
} }

8
samples/CSharpCodeCompletion/CodeCompletionProvider.cs

@ -119,12 +119,16 @@ namespace CSharpEditor
} else { } else {
finder = new Dom.CSharp.CSharpExpressionFinder(mainForm.parseInformation); finder = new Dom.CSharp.CSharpExpressionFinder(mainForm.parseInformation);
} }
return finder.FindExpression(textArea.Document.TextContent, textArea.Caret.Offset); Dom.ExpressionResult expression = finder.FindExpression(textArea.Document.TextContent, textArea.Caret.Offset);
if (expression.Region.IsEmpty) {
expression.Region = new Dom.DomRegion(textArea.Caret.Line + 1, textArea.Caret.Column + 1);
}
return expression;
} }
void AddCompletionData(List<ICompletionData> resultList, ArrayList completionData) void AddCompletionData(List<ICompletionData> resultList, ArrayList completionData)
{ {
// used to store method the names for grouping overloads // used to store the method names for grouping overloads
Dictionary<string, CodeCompletionData> nameDictionary = new Dictionary<string, CodeCompletionData>(); Dictionary<string, CodeCompletionData> nameDictionary = new Dictionary<string, CodeCompletionData>();
// Add the completion data as returned by SharpDevelop.Dom to the // Add the completion data as returned by SharpDevelop.Dom to the

2
samples/CSharpCodeCompletion/MainForm.cs

@ -181,7 +181,7 @@ class A
// Remove information from lastCompilationUnit and add information from newCompilationUnit. // Remove information from lastCompilationUnit and add information from newCompilationUnit.
myProjectContent.UpdateCompilationUnit(lastCompilationUnit, newCompilationUnit, DummyFileName); myProjectContent.UpdateCompilationUnit(lastCompilationUnit, newCompilationUnit, DummyFileName);
lastCompilationUnit = newCompilationUnit; lastCompilationUnit = newCompilationUnit;
parseInformation.ValidCompilationUnit = newCompilationUnit; parseInformation.SetCompilationUnit(newCompilationUnit);
} }
Dom.ICompilationUnit ConvertCompilationUnit(NRefactory.Ast.CompilationUnit cu) Dom.ICompilationUnit ConvertCompilationUnit(NRefactory.Ast.CompilationUnit cu)

5
samples/CSharpCodeCompletion/ToolTipProvider.cs

@ -64,6 +64,9 @@ namespace CSharpEditor
ExpressionResult expression = expressionFinder.FindFullExpression( ExpressionResult expression = expressionFinder.FindFullExpression(
editor.Text, editor.Text,
editor.Document.PositionToOffset(e.LogicalPosition)); editor.Document.PositionToOffset(e.LogicalPosition));
if (expression.Region.IsEmpty) {
expression.Region = new DomRegion(e.LogicalPosition.Line + 1, e.LogicalPosition.Column + 1);
}
TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea; TextEditor.TextArea textArea = editor.ActiveTextAreaControl.TextArea;
NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language); NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language);
@ -119,7 +122,7 @@ namespace CSharpEditor
} }
} }
static string GetMemberText(IAmbience ambience, IDecoration member) static string GetMemberText(IAmbience ambience, IEntity member)
{ {
StringBuilder text = new StringBuilder(); StringBuilder text = new StringBuilder();
if (member is IField) { if (member is IField) {

8
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionData.cs

@ -101,13 +101,5 @@ namespace ICSharpCode.XmlEditor
} }
return false; return false;
} }
public int CompareTo(object obj)
{
if ((obj == null) || !(obj is XmlCompletionData)) {
return -1;
}
return text.CompareTo(((XmlCompletionData)obj).text);
}
} }
} }

2
src/AddIns/DisplayBindings/XmlEditor/Test/Completion/FirstCompletionListItemSelectedTestFixture.cs

@ -85,7 +85,7 @@ namespace XmlEditor.Tests.Completion
public void SelectedCompletionDataMatches() public void SelectedCompletionDataMatches()
{ {
List<ICompletionData> items = new List<ICompletionData>(completionDataItems); List<ICompletionData> items = new List<ICompletionData>(completionDataItems);
items.Sort(); items.Sort(DefaultCompletionData.Compare);
Assert.AreEqual(items[0].Text, selectedCompletionData.Text); Assert.AreEqual(items[0].Text, selectedCompletionData.Text);
} }
} }

1
src/Libraries/ICSharpCode.Build.Tasks/Project/ICSharpCode.Build.Tasks.csproj

@ -73,7 +73,6 @@
<Content Include="SharpDevelop.CodeAnalysis.targets"> <Content Include="SharpDevelop.CodeAnalysis.targets">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
<Folder Include="Mono" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project> </Project>

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionListView.cs

@ -65,7 +65,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
public CodeCompletionListView(ICompletionData[] completionData) public CodeCompletionListView(ICompletionData[] completionData)
{ {
Array.Sort(completionData); Array.Sort(completionData, DefaultCompletionData.Compare);
this.completionData = completionData; this.completionData = completionData;
// this.KeyDown += new System.Windows.Forms.KeyEventHandler(OnKey); // this.KeyDown += new System.Windows.Forms.KeyEventHandler(OnKey);

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs

@ -246,8 +246,10 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
codeCompletionListView.SelectPrevItem(); codeCompletionListView.SelectPrevItem();
return true; return true;
case Keys.Tab: case Keys.Tab:
InsertSelectedItem('\t');
return true;
case Keys.Return: case Keys.Return:
InsertSelectedItem('\0'); InsertSelectedItem('\n');
return true; return true;
} }
return base.ProcessTextAreaKey(keyData); return base.ProcessTextAreaKey(keyData);

13
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionData.cs

@ -9,7 +9,7 @@ using System;
namespace ICSharpCode.TextEditor.Gui.CompletionWindow namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{ {
public interface ICompletionData : IComparable public interface ICompletionData
{ {
int ImageIndex { int ImageIndex {
get; get;
@ -96,12 +96,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
this.imageIndex = imageIndex; this.imageIndex = imageIndex;
} }
public int CompareTo(object obj) public static int Compare(ICompletionData a, ICompletionData b)
{ {
if (obj == null || !(obj is DefaultCompletionData)) { if (a == null)
return -1; throw new ArgumentNullException("a");
} if (b == null)
return text.CompareTo(((DefaultCompletionData)obj).Text); throw new ArgumentNullException("b");
return string.Compare(a.Text, b.Text, StringComparison.InvariantCultureIgnoreCase);
} }
} }
} }

1
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextEditorControlBase.cs

@ -473,6 +473,7 @@ namespace ICSharpCode.TextEditor
/// purposes. /// purposes.
/// </value> /// </value>
[Browsable(true)] [Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[Description("The base font of the text area. No bold or italic fonts can be used because bold/italic is reserved for highlighting purposes.")] [Description("The base font of the text area. No bold or italic fonts can be used because bold/italic is reserved for highlighting purposes.")]
public override Font Font { public override Font Font {
get { get {

47
src/Main/Base/Project/Src/Internal/Templates/File/FileTemplate.cs

@ -71,39 +71,6 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} }
} }
[Obsolete]
public class TemplateScript
{
string languageName;
string runAt;
string scriptSourceCode;
public string LanguageName {
get {
return languageName;
}
}
public string RunAt {
get {
return runAt;
}
}
string SourceText {
get {
return "public class ScriptObject : System.MarshalByRefObject { " + scriptSourceCode + "}";
}
}
public TemplateScript(XmlElement scriptConfig)
{
languageName = scriptConfig.GetAttribute("language");
runAt = scriptConfig.GetAttribute("runAt");
scriptSourceCode = scriptConfig.InnerText;
}
}
public class TemplateType public class TemplateType
{ {
string name; string name;
@ -244,20 +211,6 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates
} }
} }
[Obsolete]
public List<TemplateScript> Scripts {
get {
return new List<TemplateScript>();
}
}
[Obsolete]
public bool HasScripts {
get {
return false;
}
}
public FileTemplate(string filename) public FileTemplate(string filename)
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();

7
src/Main/Base/Project/Src/Services/ClassBrowserIcons/ClassBrowserIconService.cs

@ -23,8 +23,10 @@ namespace ICSharpCode.SharpDevelop
public const int LocalVariableIndex = 16; public const int LocalVariableIndex = 16;
public const int ParameterIndex = 17; public const int ParameterIndex = 17;
public const int KeywordIndex = NamespaceIndex; // TODO: give keywords their own icon
public const int CodeTemplateIndex = 18;
public const int ClassIndex = 18; public const int ClassIndex = 19;
public const int StructIndex = ClassIndex + 1 * 4; public const int StructIndex = ClassIndex + 1 * 4;
public const int InterfaceIndex = ClassIndex + 2 * 4; public const int InterfaceIndex = ClassIndex + 2 * 4;
public const int EnumIndex = ClassIndex + 3 * 4; public const int EnumIndex = ClassIndex + 3 * 4;
@ -240,8 +242,9 @@ namespace ICSharpCode.SharpDevelop
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Local")); imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Local"));
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Parameter")); imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Parameter"));
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.TextFileIcon"));
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Class")); //18 imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Class")); //19
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.InternalClass")); imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.InternalClass"));
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.ProtectedClass")); imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.ProtectedClass"));
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.PrivateClass")); imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.PrivateClass"));

24
src/Main/Base/Project/Src/TextEditor/Actions.cs

@ -21,27 +21,37 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions
{ {
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl; SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl;
services.AutoClearSelection = false; services.AutoClearSelection = false;
sdtac.ShowCompletionWindow(new TemplateCompletionDataProvider(), '\0'); sdtac.ShowCompletionWindow(new TemplateCompletionDataProvider() { AutomaticInsert = true }, '\0');
} }
} }
public class CodeCompletionPopup : AbstractEditAction public class CodeCompletionPopup : AbstractEditAction
{ {
public override void Execute(TextArea services) public override void Execute(TextArea textArea)
{ {
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl; SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)textArea.MotherTextEditorControl;
CtrlSpaceCompletionDataProvider provider = new CtrlSpaceCompletionDataProvider(); CtrlSpaceCompletionDataProvider provider = new CtrlSpaceCompletionDataProvider();
provider.AllowCompleteExistingExpression = true; provider.AllowCompleteExistingExpression = true;
sdtac.ShowCompletionWindow(provider, '\0'); sdtac.ShowCompletionWindow(provider, '\0');
} }
} }
public class ExpandTemplateAction : Tab
{
public override void Execute(TextArea textArea)
{
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)textArea.MotherTextEditorControl;
if (!sdtac.ExpandTemplateOnTab())
base.Execute(textArea);
}
}
#if DEBUG #if DEBUG
internal class DebugCtrlSpaceCodeCompletionAction : AbstractEditAction internal class DebugCtrlSpaceCodeCompletionAction : AbstractEditAction
{ {
public override void Execute(TextArea services) public override void Execute(TextArea textArea)
{ {
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl; SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)textArea.MotherTextEditorControl;
CtrlSpaceCompletionDataProvider provider = new CtrlSpaceCompletionDataProvider(); CtrlSpaceCompletionDataProvider provider = new CtrlSpaceCompletionDataProvider();
provider.AllowCompleteExistingExpression = true; provider.AllowCompleteExistingExpression = true;
provider.DebugMode = true; provider.DebugMode = true;
@ -51,9 +61,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions
internal class DebugDotCompletionAction : AbstractEditAction internal class DebugDotCompletionAction : AbstractEditAction
{ {
public override void Execute(TextArea services) public override void Execute(TextArea textArea)
{ {
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl; SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)textArea.MotherTextEditorControl;
CodeCompletionDataProvider ccdp = new CodeCompletionDataProvider(); CodeCompletionDataProvider ccdp = new CodeCompletionDataProvider();
ccdp.DebugMode = true; ccdp.DebugMode = true;
sdtac.ShowCompletionWindow(ccdp, '.'); sdtac.ShowCompletionWindow(ccdp, '.');

9
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs

@ -7,6 +7,7 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -105,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
protected int caretColumn; protected int caretColumn;
protected string fileName; protected string fileName;
protected ArrayList completionData = null; protected List<ICompletionData> completionData = null;
protected ExpressionContext overrideContext; protected ExpressionContext overrideContext;
/// <summary> /// <summary>
@ -113,7 +114,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
/// </summary> /// </summary>
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{ {
completionData = new ArrayList(); completionData = new List<ICompletionData>();
this.fileName = fileName; this.fileName = fileName;
IDocument document = textArea.Document; IDocument document = textArea.Document;
@ -123,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
GenerateCompletionData(textArea, charTyped); GenerateCompletionData(textArea, charTyped);
return (ICompletionData[])completionData.ToArray(typeof(ICompletionData)); return completionData.ToArray();
} }
protected ExpressionResult GetExpression(TextArea textArea) protected ExpressionResult GetExpression(TextArea textArea)
@ -155,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
CodeCompletionData ccd = CreateItem(o, context); CodeCompletionData ccd = CreateItem(o, context);
if (object.Equals(o, context.SuggestedItem)) if (object.Equals(o, context.SuggestedItem))
suggestedData = ccd; suggestedData = ccd;
if (ccd != null && !ccd.Text.StartsWith("___")) if (ccd != null)
completionData.Add(ccd); completionData.Add(ccd);
} }
if (context.SuggestedItem != null) { if (context.SuggestedItem != null) {

10
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionData.cs

@ -309,15 +309,5 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
return cref; return cref;
} }
#region System.IComparable interface implementation
public int CompareTo(object obj)
{
if (obj == null || !(obj is CodeCompletionData)) {
return -1;
}
return text.CompareTo(((CodeCompletionData)obj).text);
}
#endregion
} }
} }

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataUsageCache.cs

@ -143,7 +143,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public int Compare(KeyValuePair<string, UsageStruct> x, KeyValuePair<string, UsageStruct> y) public int Compare(KeyValuePair<string, UsageStruct> x, KeyValuePair<string, UsageStruct> y)
{ {
double a = ((double)x.Value.Uses / x.Value.ShowCount); double a = ((double)x.Value.Uses / x.Value.ShowCount);
return a.CompareTo((double)y.Value.Uses / y.Value.ShowCount); return -a.CompareTo((double)y.Value.Uses / y.Value.ShowCount);
} }
} }

10
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CommentCompletionDataProvider.cs

@ -113,16 +113,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
this.text = text; this.text = text;
this.description = description; this.description = description;
} }
#region System.IComparable interface implementation
public int CompareTo(object obj)
{
if (obj == null || !(obj is CommentCompletionData)) {
return -1;
}
return text.CompareTo(((CommentCompletionData)obj).text);
}
#endregion
} }
} }
} }

19
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CtrlSpaceCompletionDataProvider.cs

@ -11,6 +11,7 @@ using System.Diagnostics;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.TextEditor; using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{ {
@ -52,6 +53,24 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
ExpressionContext context = overrideContext ?? ExpressionContext.Default; ExpressionContext context = overrideContext ?? ExpressionContext.Default;
AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName, textArea.Document.TextContent, context), context); AddResolveResults(ParserService.CtrlSpace(caretLineNumber, caretColumn, fileName, textArea.Document.TextContent, context), context);
ICompletionData[] templateCompletionData = new TemplateCompletionDataProvider().GenerateCompletionData(fileName, textArea, charTyped);
for (int i = 0; i < completionData.Count; i++) {
if (completionData[i].ImageIndex == ClassBrowserIconService.KeywordIndex) {
string text = completionData[i].Text;
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null && templateCompletionData[j].Text == text) {
// replace keyword with template
completionData[i] = templateCompletionData[j];
templateCompletionData[j] = null;
}
}
}
}
// add non-keyword code templates
for (int j = 0; j < templateCompletionData.Length; j++) {
if (templateCompletionData[j] != null)
completionData.Add(templateCompletionData[j]);
}
return; return;
} }

72
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/TemplateCompletionDataProvider.cs

@ -7,6 +7,8 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic;
using ICSharpCode.Core;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Internal.Templates; using ICSharpCode.SharpDevelop.Internal.Templates;
@ -17,86 +19,54 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{ {
public class TemplateCompletionDataProvider : AbstractCompletionDataProvider public class TemplateCompletionDataProvider : AbstractCompletionDataProvider
{ {
ImageList imageList = new ImageList();
public override ImageList ImageList { public override ImageList ImageList {
get { get {
return imageList; return ClassBrowserIconService.ImageList;
} }
} }
public bool AutomaticInsert;
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped) public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{ {
preSelection = ""; preSelection = "";
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TextFileIcon"));
CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(fileName); CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(fileName);
if (templateGroup == null) { if (templateGroup == null) {
return null; return null;
} }
ArrayList completionData = new ArrayList(); bool automaticInsert = this.AutomaticInsert || DefaultEditor.Gui.Editor.SharpDevelopTextEditorProperties.Instance.AutoInsertTemplates;
List<ICompletionData> completionData = new List<ICompletionData>();
foreach (CodeTemplate template in templateGroup.Templates) { foreach (CodeTemplate template in templateGroup.Templates) {
completionData.Add(new TemplateCompletionData(template)); completionData.Add(new TemplateCompletionData(template, automaticInsert));
} }
return (ICompletionData[])completionData.ToArray(typeof(ICompletionData)); return completionData.ToArray();
} }
class TemplateCompletionData : ICompletionData, IComparable class TemplateCompletionData : DefaultCompletionData
{ {
CodeTemplate template; CodeTemplate template;
bool automaticInsert;
public int ImageIndex { public override bool InsertAction(TextArea textArea, char ch)
get {
return 0;
}
}
public string Text {
get {
return template.Shortcut + "\t" + template.Description;
}
set {
throw new NotSupportedException();
}
}
public string Description {
get {
return template.Text;
}
}
public double Priority {
get {
return 0;
}
}
public bool InsertAction(TextArea textArea, char ch)
{ {
if (ch == '\t' || automaticInsert) {
((SharpDevelopTextAreaControl)textArea.MotherTextEditorControl).InsertTemplate(template); ((SharpDevelopTextAreaControl)textArea.MotherTextEditorControl).InsertTemplate(template);
return false; return false;
} else {
return base.InsertAction(textArea, ch);
} }
public TemplateCompletionData(CodeTemplate template)
{
this.template = template;
} }
public TemplateCompletionData(CodeTemplate template, bool automaticInsert)
: base(template.Shortcut,
#region System.IComparable interface implementation template.Description + StringParser.Parse("\n${res:Dialog.Options.CodeTemplate.PressTabToInsertTemplate}\n\n") + template.Text,
public int CompareTo(object obj) ClassBrowserIconService.CodeTemplateIndex)
{ {
if (obj == null || !(obj is TemplateCompletionData)) { this.template = template;
return -1; this.automaticInsert = automaticInsert;
}
return template.Shortcut.CompareTo(((TemplateCompletionData)obj).template.Shortcut);
} }
#endregion
} }
} }
} }

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/NRefactoryCodeCompletionBinding.cs

@ -168,7 +168,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
cache.activationKey = charTyped; cache.activationKey = charTyped;
cache.GenerateCompletionData(editor.FileName, editor.ActiveTextAreaControl.TextArea, charTyped); cache.GenerateCompletionData(editor.FileName, editor.ActiveTextAreaControl.TextArea, charTyped);
ICompletionData[] completionData = cache.CompletionData; ICompletionData[] completionData = cache.CompletionData;
Array.Sort(completionData); Array.Sort(completionData, DefaultCompletionData.Compare);
for (int i = 0; i < completionData.Length; i++) { for (int i = 0; i < completionData.Length; i++) {
CodeCompletionData ccd = completionData[i] as CodeCompletionData; CodeCompletionData ccd = completionData[i] as CodeCompletionData;
if (ccd != null && ccd.Class != null) { if (ccd != null && ccd.Class != null) {

25
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

@ -23,10 +23,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{ {
public class SharpDevelopTextAreaControl : TextEditorControl public class SharpDevelopTextAreaControl : TextEditorControl
{ {
readonly static string contextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu"; const string contextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu";
readonly static string editActionsPath = "/AddIns/DefaultTextEditor/EditActions"; const string editActionsPath = "/AddIns/DefaultTextEditor/EditActions";
readonly static string formatingStrategyPath = "/AddIns/DefaultTextEditor/Formatter"; const string formatingStrategyPath = "/AddIns/DefaultTextEditor/Formatter";
readonly static string advancedHighlighterPath = "/AddIns/DefaultTextEditor/AdvancedHighlighter"; const string advancedHighlighterPath = "/AddIns/DefaultTextEditor/AdvancedHighlighter";
QuickClassBrowserPanel quickClassBrowserPanel = null; QuickClassBrowserPanel quickClassBrowserPanel = null;
Control customQuickClassBrowserPanel = null; Control customQuickClassBrowserPanel = null;
@ -316,7 +316,16 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return false; return false;
} }
} }
if (ch == ' ' && SharpDevelopTextEditorProperties.Instance.AutoInsertTemplates) { } catch (Exception ex) {
LogException(ex);
} finally {
inHandleKeyPress = false;
}
return false;
}
internal bool ExpandTemplateOnTab()
{
string word = GetWordBeforeCaret(); string word = GetWordBeforeCaret();
if (word != null) { if (word != null) {
CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(FileName); CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(FileName);
@ -335,12 +344,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
} }
} }
}
} catch (Exception ex) {
LogException(ex);
} finally {
inHandleKeyPress = false;
}
return false; return false;
} }

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextEditorProperties.cs

@ -301,7 +301,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
} }
public bool AutoInsertTemplates { public bool AutoInsertTemplates {
get { get {
return properties.Get("AutoInsertTemplates", true); return properties.Get("AutoInsertTemplates", false);
} }
set { set {
properties.Set("AutoInsertTemplates", value); properties.Set("AutoInsertTemplates", value);

2
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/ProjectContent/DefaultProjectContent.cs

@ -328,7 +328,7 @@ namespace ICSharpCode.SharpDevelop.Dom
newParts.Add(addClass); newParts.Add(addClass);
// construct a replacement CompoundClass with the new part list // construct a replacement CompoundClass with the new part list
addClass = CompoundClass.Create(newParts); addClass = CompoundClass.Create(newParts);
LoggingService.Debug("Added new part / Replaced part! (old part count=" + compound.Parts.Count +", new part count=" + newParts.Count + ")"); LoggingService.Debug("Added new part (old part count=" + compound.Parts.Count +", new part count=" + newParts.Count + ")");
} else { } else {
// Instead of overwriting a class with another, treat both parts as partial. // Instead of overwriting a class with another, treat both parts as partial.
// This fixes SD2-1217. // This fixes SD2-1217.

Loading…
Cancel
Save