Browse Source

Allow writing a space after "+=" completion without closing the completion window.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@384 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
a071440e5f
  1. 38
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs
  2. 93
      src/AddIns/BackendBindings/CSharpBinding/Project/Src/EventHandlerCompletitionDataProvider.cs
  3. 24
      src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionDataProvider.cs
  4. 32
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
  5. 60
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionData.cs
  6. 13
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
  7. 53
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/AbstractCompletionDataProvider.cs
  8. 31
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CachedCompletionDataProvider.cs
  9. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CodeCompletionDataProvider.cs
  10. 22
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CommentCompletionDataProvider.cs
  11. 18
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/TemplateCompletionDataProvider.cs

38
src/AddIns/BackendBindings/CSharpBinding/Project/Src/CSharpCompletionBinding.cs

@ -94,35 +94,20 @@ namespace CSharpBinding @@ -94,35 +94,20 @@ namespace CSharpBinding
cursor = ef.LastExpressionStartPosition;
}
}
}
else if(ch == '=')
{
} else if(ch == '=') {
LineSegment curLine = editor.Document.GetLineSegmentForOffset(cursor);
string curLineText = editor.ActiveTextAreaControl.Document.GetText(curLine);
string documentText = editor.Text;
int position = editor.ActiveTextAreaControl.Caret.Offset - 2;
if(curLineText != null && curLineText.EndsWith("+"))
{
string documentText = editor.Text;
int position = editor.ActiveTextAreaControl.Caret.Offset - 2;
int oldCursor = position;
string textWithoutComments = ef.FilterComments(documentText, ref position);
int commentLength = oldCursor - position;
if (position > 0 && (documentText[position + 1] == '+' || documentText[position + 1] == '-')) {
ExpressionResult result = ef.FindFullExpression(documentText, position);
if (textWithoutComments != null)
{
ExpressionResult result = ef.FindFullExpression(textWithoutComments, position);
if(result.Expression != "")
{
IResolver resolver = ParserService.CreateResolver(editor.FileName);
ResolveResult resolveResult = resolver.Resolve(result, editor.ActiveTextAreaControl.Caret.Line, editor.ActiveTextAreaControl.Caret.Column, editor.FileName, documentText);
if(resolveResult.ResolvedType.GetUnderlyingClass().IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate")))
{
EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult);
eventHandlerProvider.GenerateCompletionData(editor.FileName, editor.ActiveTextAreaControl.TextArea, ch);
editor.ShowCompletionWindow(eventHandlerProvider, ch);
}
if(result.Expression != null) {
ResolveResult resolveResult = ParserService.Resolve(result, editor.ActiveTextAreaControl.Caret.Line, editor.ActiveTextAreaControl.Caret.Column, editor.FileName, documentText);
if (resolveResult.ResolvedType.GetUnderlyingClass().IsTypeInInheritanceTree(ProjectContentRegistry.Mscorlib.GetClass("System.MulticastDelegate"))) {
EventHandlerCompletitionDataProvider eventHandlerProvider = new EventHandlerCompletitionDataProvider(result.Expression, resolveResult);
eventHandlerProvider.InsertSpace = true;
editor.ShowCompletionWindow(eventHandlerProvider, ch);
}
}
}
@ -182,6 +167,7 @@ namespace CSharpBinding @@ -182,6 +167,7 @@ namespace CSharpBinding
}
}
if (cache.DefaultIndex >= 0) {
cache.InsertSpace = true;
editor.ShowCompletionWindow(cache, charTyped);
}
}

93
src/AddIns/BackendBindings/CSharpBinding/Project/Src/EventHandlerCompletitionDataProvider.cs

@ -20,7 +20,7 @@ using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver; @@ -20,7 +20,7 @@ using ICSharpCode.SharpDevelop.Dom.NRefactoryResolver;
namespace CSharpBinding
{
public class EventHandlerCompletitionDataProvider : ICompletionDataProvider
public class EventHandlerCompletitionDataProvider : AbstractCompletionDataProvider
{
string expression;
ResolveResult resolveResult;
@ -31,95 +31,14 @@ namespace CSharpBinding @@ -31,95 +31,14 @@ namespace CSharpBinding
this.resolveResult = resolveResult;
}
public ImageList ImageList
{
get
{
return ClassBrowserIconService.ImageList;
}
}
public int DefaultIndex
{
get
{
return -1;
}
}
public string PreSelection
{
get
{
return null;
}
}
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
/// <summary>
/// Generates the completion data. This method is called by the text editor control.
/// </summary>
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
ArrayList completionData = new ArrayList();
completionData.Add(new EventHandlerCompletionData("new " + resolveResult.ResolvedType.FullyQualifiedName + "()", "Event handler"));
completionData.Add(new DefaultCompletionData("new " + resolveResult.ResolvedType.FullyQualifiedName + "()", "Event handler", ClassBrowserIconService.DelegateIndex));
return (ICompletionData[])completionData.ToArray(typeof(ICompletionData));
}
class EventHandlerCompletionData : ICompletionData
{
string text;
string description;
public int ImageIndex
{
get
{
return ClassBrowserIconService.MethodIndex;
}
}
public string Text
{
get {
return text;
}
set {
text = value;
}
}
public string Description
{
get {
return description;
}
}
public double Priority
{
get {
return 0;
}
}
public bool InsertAction(TextArea textArea, char ch)
{
textArea.InsertString(text);
return false;
}
public EventHandlerCompletionData(string text, string description)
{
this.text = text;
this.description = description;
}
#region System.IComparable interface implementation
public int CompareTo(object obj)
{
if (obj == null || !(obj is EventHandlerCompletionData)) {
return -1;
}
return text.CompareTo(((EventHandlerCompletionData)obj).Text);
}
#endregion
}
}
}

24
src/AddIns/DisplayBindings/XmlEditor/Project/Src/XmlCompletionDataProvider.cs

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
using ICSharpCode.TextEditor;
using ICSharpCode.TextEditor.Gui.CompletionWindow;
using ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor;
using System;
using System.Collections;
using System.Windows.Forms;
@ -18,12 +19,11 @@ namespace ICSharpCode.XmlEditor @@ -18,12 +19,11 @@ namespace ICSharpCode.XmlEditor
/// Provides the autocomplete (intellisense) data for an
/// xml document that specifies a known schema.
/// </summary>
public class XmlCompletionDataProvider : ICompletionDataProvider
public class XmlCompletionDataProvider : AbstractCompletionDataProvider
{
XmlSchemaCompletionDataCollection schemaCompletionDataItems;
XmlSchemaCompletionData defaultSchemaCompletionData;
string defaultNamespacePrefix = String.Empty;
string preSelection = null;
public XmlCompletionDataProvider(XmlSchemaCompletionDataCollection schemaCompletionDataItems, XmlSchemaCompletionData defaultSchemaCompletionData, string defaultNamespacePrefix)
{
@ -32,30 +32,14 @@ namespace ICSharpCode.XmlEditor @@ -32,30 +32,14 @@ namespace ICSharpCode.XmlEditor
this.defaultNamespacePrefix = defaultNamespacePrefix;
}
public ImageList ImageList {
public override ImageList ImageList {
get
{
return XmlCompletionDataImageList.GetImageList();
}
}
/// <summary>
/// Gets the preselected text.
/// </summary>
public string PreSelection {
get
{
return preSelection;
}
}
public int DefaultIndex {
get {
return -1;
}
}
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
preSelection = null;
string text = String.Concat(textArea.Document.GetText(0, textArea.Caret.Offset), charTyped);

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

@ -18,9 +18,10 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -18,9 +18,10 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{
public class CodeCompletionWindow : AbstractCompletionWindow
{
static ICompletionData[] completionData;
ICompletionData[] completionData;
CodeCompletionListView codeCompletionListView;
VScrollBar vScrollBar = new VScrollBar();
ICompletionDataProvider dataProvider;
int startOffset;
int endOffset;
@ -29,17 +30,20 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -29,17 +30,20 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
public static CodeCompletionWindow ShowCompletionWindow(Form parent, TextEditorControl control, string fileName, ICompletionDataProvider completionDataProvider, char firstChar)
{
completionData = completionDataProvider.GenerateCompletionData(fileName, control.ActiveTextAreaControl.TextArea, firstChar);
ICompletionData[] completionData = completionDataProvider.GenerateCompletionData(fileName, control.ActiveTextAreaControl.TextArea, firstChar);
if (completionData == null || completionData.Length == 0) {
return null;
}
CodeCompletionWindow codeCompletionWindow = new CodeCompletionWindow(completionDataProvider, parent, control, fileName);
CodeCompletionWindow codeCompletionWindow = new CodeCompletionWindow(completionDataProvider, completionData, parent, control, fileName);
codeCompletionWindow.ShowCompletionWindow();
return codeCompletionWindow;
}
CodeCompletionWindow(ICompletionDataProvider completionDataProvider, Form parentForm, TextEditorControl control, string fileName) : base(parentForm, control, fileName)
CodeCompletionWindow(ICompletionDataProvider completionDataProvider, ICompletionData[] completionData, Form parentForm, TextEditorControl control, string fileName) : base(parentForm, control, fileName)
{
this.dataProvider = completionDataProvider;
this.completionData = completionData;
workingScreen = Screen.GetWorkingArea(Location);
startOffset = control.ActiveTextAreaControl.Caret.Offset + 1;
endOffset = startOffset;
@ -85,8 +89,6 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -85,8 +89,6 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
CaretOffsetChanged(this, EventArgs.Empty);
}
vScrollBar.Scroll += new ScrollEventHandler(DoScroll);
}
@ -150,8 +152,14 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -150,8 +152,14 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
public override bool ProcessKeyEvent(char ch)
{
if (!Char.IsLetterOrDigit(ch) && ch != '_') {
return InsertSelectedItem(ch);
if (ch == ' ' && dataProvider.InsertSpace) {
// increment start + end and process as normal space
++startOffset;
} else {
return InsertSelectedItem(ch);
}
}
dataProvider.InsertSpace = false;
++endOffset;
return base.ProcessKeyEvent(ch);
}
@ -159,6 +167,9 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -159,6 +167,9 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
protected override void CaretOffsetChanged(object sender, EventArgs e)
{
int offset = control.ActiveTextAreaControl.Caret.Offset;
if (offset == startOffset) {
return;
}
if (offset < startOffset || offset > endOffset) {
Close();
} else {
@ -251,8 +262,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -251,8 +262,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
if (endOffset - startOffset > 0) {
control.Document.Remove(startOffset, endOffset - startOffset);
control.ActiveTextAreaControl.Caret.Position = control.Document.OffsetToPosition(startOffset);
}
if (dataProvider.InsertSpace) {
Console.WriteLine("Inserting space..");
control.Document.Insert(startOffset++, " ");
}
control.ActiveTextAreaControl.Caret.Position = control.Document.OffsetToPosition(startOffset);
result = data.InsertAction(control.ActiveTextAreaControl.TextArea, ch);
control.EndUpdate();
}

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

@ -49,4 +49,64 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -49,4 +49,64 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
/// <paramref name="ch"/>; false when the character was not processed.</returns>
bool InsertAction(TextArea textArea, char ch);
}
public class DefaultCompletionData : ICompletionData
{
string text;
string description;
int imageIndex;
public int ImageIndex {
get {
return imageIndex;
}
}
public string Text {
get {
return text;
}
set {
text = value;
}
}
public string Description {
get {
return description;
}
}
double priority;
public double Priority {
get {
return priority;
}
set {
priority = value;
}
}
public bool InsertAction(TextArea textArea, char ch)
{
textArea.InsertString(text);
return false;
}
public DefaultCompletionData(string text, string description, int imageIndex)
{
this.text = text;
this.description = description;
this.imageIndex = imageIndex;
}
public int CompareTo(object obj)
{
if (obj == null || !(obj is DefaultCompletionData)) {
return -1;
}
return text.CompareTo(((DefaultCompletionData)obj).Text);
}
}
}

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

@ -23,10 +23,23 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow @@ -23,10 +23,23 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
string PreSelection {
get;
}
/// <summary>
/// Gets the index of the element in the list that is chosen by default.
/// </summary>
int DefaultIndex {
get;
}
/// <summary>
/// Gets/Sets if a space should be inserted in front of the completed expression.
/// </summary>
bool InsertSpace {
get;
set;
}
/// <summary>
/// Generates the completion data. This method is called by the text editor control.
/// </summary>
ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped);
}
}

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

@ -20,11 +20,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -20,11 +20,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public abstract class AbstractCompletionDataProvider : ICompletionDataProvider
{
Hashtable insertedElements = new Hashtable();
Hashtable insertedPropertiesElements = new Hashtable();
Hashtable insertedEventElements = new Hashtable();
public ImageList ImageList {
public virtual ImageList ImageList {
get {
return ClassBrowserIconService.ImageList;
}
@ -32,15 +28,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -32,15 +28,18 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
int defaultIndex = -1;
/// <summary>
/// Gets the index of the element in the list that is chosen by default.
/// </summary>
public int DefaultIndex {
get {
return defaultIndex;
}
set {
defaultIndex = value;
}
}
protected int caretLineNumber;
protected int caretColumn;
protected string fileName;
protected string preSelection = null;
public string PreSelection {
@ -48,10 +47,44 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -48,10 +47,44 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return preSelection;
}
}
bool insertSpace;
/// <summary>
/// Gets/Sets if a space should be inserted in front of the completed expression.
/// </summary>
public bool InsertSpace {
get {
return insertSpace;
}
set {
insertSpace = value;
}
}
/// <summary>
/// Generates the completion data. This method is called by the text editor control.
/// </summary>
public abstract ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped);
}
public abstract class AbstractCodeCompletionDataProvider : AbstractCompletionDataProvider
{
Hashtable insertedElements = new Hashtable();
Hashtable insertedPropertiesElements = new Hashtable();
Hashtable insertedEventElements = new Hashtable();
protected int caretLineNumber;
protected int caretColumn;
protected string fileName;
protected ArrayList completionData = null;
protected ExpressionContext overrideContext;
public virtual ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
/// <summary>
/// Generates the completion data. This method is called by the text editor control.
/// </summary>
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
completionData = new ArrayList();
this.fileName = fileName;
@ -107,7 +140,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -107,7 +140,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
if (suggestedData != null) {
completionData.Sort();
defaultIndex = completionData.IndexOf(suggestedData);
this.DefaultIndex = completionData.IndexOf(suggestedData);
}
}
}

31
src/Main/Base/Project/Src/TextEditor/Gui/Editor/CompletionWindow/CachedCompletionDataProvider.cs

@ -18,7 +18,7 @@ using ICSharpCode.TextEditor.Gui.CompletionWindow; @@ -18,7 +18,7 @@ using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class CachedCompletionDataProvider : ICompletionDataProvider
public class CachedCompletionDataProvider : AbstractCompletionDataProvider
{
ICompletionDataProvider baseProvider;
@ -27,31 +27,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -27,31 +27,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
this.baseProvider = baseProvider;
}
public ImageList ImageList {
get {
return ClassBrowserIconService.ImageList;
}
}
int defaultIndex;
public int DefaultIndex {
get {
return defaultIndex;
}
set {
defaultIndex = value;
}
}
string preSelection;
public string PreSelection {
get {
return preSelection;
}
}
ICompletionData[] completionData;
public ICompletionData[] CompletionData {
@ -63,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -63,12 +38,12 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
}
}
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
if (completionData == null) {
completionData = baseProvider.GenerateCompletionData(fileName, textArea, charTyped);
preSelection = baseProvider.PreSelection;
defaultIndex = baseProvider.DefaultIndex;
this.DefaultIndex = baseProvider.DefaultIndex;
}
return completionData;
}

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

@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -19,7 +19,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
/// <summary>
/// Data provider for code completion.
/// </summary>
public class CodeCompletionDataProvider : AbstractCompletionDataProvider
public class CodeCompletionDataProvider : AbstractCodeCompletionDataProvider
{
/// <summary>
/// Initialize a CodeCompletionDataProvider that reads the expression from the text area.

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

@ -24,17 +24,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -24,17 +24,11 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
/// <summary>
/// Data provider for code completion.
/// </summary>
public class CommentCompletionDataProvider : ICompletionDataProvider
public class CommentCompletionDataProvider : AbstractCompletionDataProvider
{
int caretLineNumber;
int caretColumn;
public int DefaultIndex {
get {
return -1;
}
}
string[][] commentTags = new string[][] {
new string[] {"c", "marks text as code"},
new string[] {"code", "marks text as code"},
@ -58,18 +52,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -58,18 +52,6 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
new string[] {"value", "A description of a property"}
};
public ImageList ImageList {
get {
return ClassBrowserIconService.ImageList;
}
}
public string PreSelection {
get {
return null;
}
}
/// <remarks>
/// Returns true, if the given coordinates (row, column) are in the region.
/// </remarks>
@ -78,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor @@ -78,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
return row >= region.BeginLine && (row <= region.EndLine || region.EndLine == -1);
}
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
caretLineNumber = textArea.Caret.Line;
caretColumn = textArea.Caret.Column;

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

@ -19,29 +19,17 @@ using ICSharpCode.TextEditor.Gui.CompletionWindow; @@ -19,29 +19,17 @@ using ICSharpCode.TextEditor.Gui.CompletionWindow;
namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{
public class TemplateCompletionDataProvider : ICompletionDataProvider
public class TemplateCompletionDataProvider : AbstractCompletionDataProvider
{
ImageList imageList = new ImageList();
public ImageList ImageList {
public override ImageList ImageList {
get {
return imageList;
}
}
public int DefaultIndex {
get {
return -1;
}
}
public string PreSelection {
get {
return String.Empty;
}
}
public ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
{
imageList.Images.Add(IconService.GetBitmap("Icons.16x16.TextFileIcon"));

Loading…
Cancel
Save