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 18 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. 76
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/TemplateCompletionDataProvider.cs
  23. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/NRefactoryCodeCompletionBinding.cs
  24. 51
      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 @@ @@ -1999,6 +1999,7 @@
<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 = "GoToDefinition" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.GoToDefinition" keys = "Control|Enter"/>
<EditAction id = "ExpandTemplateAction" class = "ICSharpCode.SharpDevelop.DefaultEditor.Actions.ExpandTemplateAction" keys = "Tab"/>
</Path>
<Path name = "/SharpDevelop/Pads/BookmarkPad/Toolbar">

16
data/options/SharpDevelop-templates.xml

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

20
samples/CSharpCodeCompletion/CodeCompletionData.cs

@ -14,6 +14,7 @@ using System.Xml; @@ -14,6 +14,7 @@ using System.Xml;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Dom.CSharp;
using ICSharpCode.SharpDevelop.Dom.VBNet;
using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace CSharpEditor
@ -76,8 +77,8 @@ namespace CSharpEditor @@ -76,8 +77,8 @@ namespace CSharpEditor
string ICompletionData.Description {
get {
if (description == null) {
IDecoration entity = (IDecoration)member ?? c;
description = GetCSharpText(entity);
IEntity entity = (IEntity)member ?? c;
description = GetText(entity);
if (overloads > 1) {
description += " (+" + overloads + " overloads)";
}
@ -89,21 +90,22 @@ namespace CSharpEditor @@ -89,21 +90,22 @@ namespace CSharpEditor
/// <summary>
/// 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)"
/// </summary>
static string GetCSharpText(IDecoration entity)
static string GetText(IEntity entity)
{
IAmbience ambience = MainForm.IsVisualBasic ? (IAmbience)VBNetAmbience.Instance : CSharpAmbience.Instance;
if (entity is IMethod)
return CSharpAmbience.Instance.Convert(entity as IMethod);
return ambience.Convert(entity as IMethod);
if (entity is IProperty)
return CSharpAmbience.Instance.Convert(entity as IProperty);
return ambience.Convert(entity as IProperty);
if (entity is IEvent)
return CSharpAmbience.Instance.Convert(entity as IEvent);
return ambience.Convert(entity as IEvent);
if (entity is IField)
return CSharpAmbience.Instance.Convert(entity as IField);
return ambience.Convert(entity as IField);
if (entity is IClass)
return CSharpAmbience.Instance.Convert(entity as IClass);
return ambience.Convert(entity as IClass);
// unknown entity:
return entity.ToString();
}

8
samples/CSharpCodeCompletion/CodeCompletionProvider.cs

@ -119,12 +119,16 @@ namespace CSharpEditor @@ -119,12 +119,16 @@ namespace CSharpEditor
} else {
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)
{
// 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>();
// Add the completion data as returned by SharpDevelop.Dom to the

2
samples/CSharpCodeCompletion/MainForm.cs

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

5
samples/CSharpCodeCompletion/ToolTipProvider.cs

@ -64,6 +64,9 @@ namespace CSharpEditor @@ -64,6 +64,9 @@ namespace CSharpEditor
ExpressionResult expression = expressionFinder.FindFullExpression(
editor.Text,
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;
NRefactoryResolver resolver = new NRefactoryResolver(mainForm.myProjectContent.Language);
@ -119,7 +122,7 @@ namespace CSharpEditor @@ -119,7 +122,7 @@ namespace CSharpEditor
}
}
static string GetMemberText(IAmbience ambience, IDecoration member)
static string GetMemberText(IAmbience ambience, IEntity member)
{
StringBuilder text = new StringBuilder();
if (member is IField) {

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

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

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

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

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

@ -65,7 +65,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -65,7 +65,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
public CodeCompletionListView(ICompletionData[] completionData)
{
Array.Sort(completionData);
Array.Sort(completionData, DefaultCompletionData.Compare);
this.completionData = completionData;
// 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 @@ -246,8 +246,10 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
codeCompletionListView.SelectPrevItem();
return true;
case Keys.Tab:
InsertSelectedItem('\t');
return true;
case Keys.Return:
InsertSelectedItem('\0');
InsertSelectedItem('\n');
return true;
}
return base.ProcessTextAreaKey(keyData);

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

@ -9,7 +9,7 @@ using System; @@ -9,7 +9,7 @@ using System;
namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{
public interface ICompletionData : IComparable
public interface ICompletionData
{
int ImageIndex {
get;
@ -96,12 +96,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -96,12 +96,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
this.imageIndex = imageIndex;
}
public int CompareTo(object obj)
public static int Compare(ICompletionData a, ICompletionData b)
{
if (obj == null || !(obj is DefaultCompletionData)) {
return -1;
}
return text.CompareTo(((DefaultCompletionData)obj).Text);
if (a == null)
throw new ArgumentNullException("a");
if (b == null)
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 @@ -473,6 +473,7 @@ namespace ICSharpCode.TextEditor
/// purposes.
/// </value>
[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.")]
public override Font Font {
get {

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

@ -71,39 +71,6 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -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
{
string name;
@ -244,20 +211,6 @@ namespace ICSharpCode.SharpDevelop.Internal.Templates @@ -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)
{
XmlDocument doc = new XmlDocument();

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

@ -23,8 +23,10 @@ namespace ICSharpCode.SharpDevelop @@ -23,8 +23,10 @@ namespace ICSharpCode.SharpDevelop
public const int LocalVariableIndex = 16;
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 InterfaceIndex = ClassIndex + 2 * 4;
public const int EnumIndex = ClassIndex + 3 * 4;
@ -240,8 +242,9 @@ namespace ICSharpCode.SharpDevelop @@ -240,8 +242,9 @@ namespace ICSharpCode.SharpDevelop
imglist.Images.Add(ResourceService.GetBitmap("Icons.16x16.Local"));
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.ProtectedClass"));
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 @@ -21,27 +21,37 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions
{
SharpDevelopTextAreaControl sdtac = (SharpDevelopTextAreaControl)services.MotherTextEditorControl;
services.AutoClearSelection = false;
sdtac.ShowCompletionWindow(new TemplateCompletionDataProvider(), '\0');
sdtac.ShowCompletionWindow(new TemplateCompletionDataProvider() { AutomaticInsert = true }, '\0');
}
}
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();
provider.AllowCompleteExistingExpression = true;
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
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();
provider.AllowCompleteExistingExpression = true;
provider.DebugMode = true;
@ -51,9 +61,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions @@ -51,9 +61,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Actions
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();
ccdp.DebugMode = true;
sdtac.ShowCompletionWindow(ccdp, '.');

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

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Dom;
@ -105,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -105,7 +106,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
protected int caretColumn;
protected string fileName;
protected ArrayList completionData = null;
protected List<ICompletionData> completionData = null;
protected ExpressionContext overrideContext;
/// <summary>
@ -113,7 +114,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -113,7 +114,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
/// </summary>
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
completionData = new ArrayList();
completionData = new List<ICompletionData>();
this.fileName = fileName;
IDocument document = textArea.Document;
@ -123,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -123,7 +124,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
GenerateCompletionData(textArea, charTyped);
return (ICompletionData[])completionData.ToArray(typeof(ICompletionData));
return completionData.ToArray();
}
protected ExpressionResult GetExpression(TextArea textArea)
@ -155,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -155,7 +156,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
CodeCompletionData ccd = CreateItem(o, context);
if (object.Equals(o, context.SuggestedItem))
suggestedData = ccd;
if (ccd != null && !ccd.Text.StartsWith("___"))
if (ccd != null)
completionData.Add(ccd);
}
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 @@ -309,15 +309,5 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
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 @@ -143,7 +143,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
public int Compare(KeyValuePair<string, UsageStruct> x, KeyValuePair<string, UsageStruct> y)
{
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 @@ -113,16 +113,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
this.text = text;
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; @@ -11,6 +11,7 @@ using System.Diagnostics;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.Core;
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
@ -52,6 +53,24 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -52,6 +53,24 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
ExpressionContext context = overrideContext ?? ExpressionContext.Default;
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;
}

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

@ -7,6 +7,8 @@ @@ -7,6 +7,8 @@
using System;
using System.Collections;
using System.Collections.Generic;
using ICSharpCode.Core;
using System.Windows.Forms;
using ICSharpCode.SharpDevelop.Internal.Templates;
@ -17,86 +19,54 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -17,86 +19,54 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class TemplateCompletionDataProvider : AbstractCompletionDataProvider
{
ImageList imageList = new ImageList();
public override ImageList ImageList {
get {
return imageList;
return ClassBrowserIconService.ImageList;
}
}
public bool AutomaticInsert;
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
preSelection = "";
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TextFileIcon"));
CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(fileName);
if (templateGroup == 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) {
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;
bool automaticInsert;
public int ImageIndex {
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)
public override bool InsertAction(TextArea textArea, char ch)
{
((SharpDevelopTextAreaControl)textArea.MotherTextEditorControl).InsertTemplate(template);
return false;
if (ch == '\t' || automaticInsert) {
((SharpDevelopTextAreaControl)textArea.MotherTextEditorControl).InsertTemplate(template);
return false;
} else {
return base.InsertAction(textArea, ch);
}
}
public TemplateCompletionData(CodeTemplate template)
public TemplateCompletionData(CodeTemplate template, bool automaticInsert)
: base(template.Shortcut,
template.Description + StringParser.Parse("\n${res:Dialog.Options.CodeTemplate.PressTabToInsertTemplate}\n\n") + template.Text,
ClassBrowserIconService.CodeTemplateIndex)
{
this.template = template;
this.automaticInsert = automaticInsert;
}
#region System.IComparable interface implementation
public int CompareTo(object obj)
{
if (obj == null || !(obj is TemplateCompletionData)) {
return -1;
}
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 @@ -168,7 +168,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
cache.activationKey = charTyped;
cache.GenerateCompletionData(editor.FileName, editor.ActiveTextAreaControl.TextArea, charTyped);
ICompletionData[] completionData = cache.CompletionData;
Array.Sort(completionData);
Array.Sort(completionData, DefaultCompletionData.Compare);
for (int i = 0; i < completionData.Length; i++) {
CodeCompletionData ccd = completionData[i] as CodeCompletionData;
if (ccd != null && ccd.Class != null) {

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

@ -23,10 +23,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -23,10 +23,10 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class SharpDevelopTextAreaControl : TextEditorControl
{
readonly static string contextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu";
readonly static string editActionsPath = "/AddIns/DefaultTextEditor/EditActions";
readonly static string formatingStrategyPath = "/AddIns/DefaultTextEditor/Formatter";
readonly static string advancedHighlighterPath = "/AddIns/DefaultTextEditor/AdvancedHighlighter";
const string contextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ContextMenu";
const string editActionsPath = "/AddIns/DefaultTextEditor/EditActions";
const string formatingStrategyPath = "/AddIns/DefaultTextEditor/Formatter";
const string advancedHighlighterPath = "/AddIns/DefaultTextEditor/AdvancedHighlighter";
QuickClassBrowserPanel quickClassBrowserPanel = null;
Control customQuickClassBrowserPanel = null;
@ -316,26 +316,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -316,26 +316,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return false;
}
}
if (ch == ' ' && SharpDevelopTextEditorProperties.Instance.AutoInsertTemplates) {
string word = GetWordBeforeCaret();
if (word != null) {
CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(FileName);
if (templateGroup != null) {
foreach (CodeTemplate template in templateGroup.Templates) {
if (template.Shortcut == word) {
if (word.Length > 0) {
int newCaretOffset = DeleteWordBeforeCaret();
//// set new position in text area
ActiveTextAreaControl.TextArea.Caret.Position = Document.OffsetToPosition(newCaretOffset);
}
InsertTemplate(template);
return true;
}
}
}
}
}
} catch (Exception ex) {
LogException(ex);
} finally {
@ -344,6 +324,29 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -344,6 +324,29 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return false;
}
internal bool ExpandTemplateOnTab()
{
string word = GetWordBeforeCaret();
if (word != null) {
CodeTemplateGroup templateGroup = CodeTemplateLoader.GetTemplateGroupPerFilename(FileName);
if (templateGroup != null) {
foreach (CodeTemplate template in templateGroup.Templates) {
if (template.Shortcut == word) {
if (word.Length > 0) {
int newCaretOffset = DeleteWordBeforeCaret();
//// set new position in text area
ActiveTextAreaControl.TextArea.Caret.Position = Document.OffsetToPosition(newCaretOffset);
}
InsertTemplate(template);
return true;
}
}
}
}
return false;
}
public void ShowInsightWindow(IInsightDataProvider insightDataProvider)
{
if (insightWindow == null || insightWindow.IsDisposed) {

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

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

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

@ -328,7 +328,7 @@ namespace ICSharpCode.SharpDevelop.Dom @@ -328,7 +328,7 @@ namespace ICSharpCode.SharpDevelop.Dom
newParts.Add(addClass);
// construct a replacement CompoundClass with the new part list
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 {
// Instead of overwriting a class with another, treat both parts as partial.
// This fixes SD2-1217.

Loading…
Cancel
Save