diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs
index 78104a3dfb..6dab407120 100644
--- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs
+++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultDocument.cs
@@ -42,7 +42,7 @@ namespace ICSharpCode.TextEditor.Document
/// The indentation from the line above will be
/// taken to indent the curent line
///
- Auto,
+ Auto,
///
/// Inteligent, context sensitive indentation will occur
@@ -91,7 +91,7 @@ namespace ICSharpCode.TextEditor.Document
/// The default implementation.
///
internal class DefaultDocument : IDocument
- {
+ {
bool readOnly = false;
ILineManager lineTrackingStrategy = null;
@@ -334,7 +334,7 @@ namespace ICSharpCode.TextEditor.Document
// {
// return lineTrackingStrategy.GetVisibleColumn(logicalLine, logicalColumn);
// }
-//
+//
public int GetNextVisibleLineAbove(int lineNumber, int lineCount)
{
return lineTrackingStrategy.GetNextVisibleLineAbove(lineNumber, lineCount);
@@ -365,7 +365,7 @@ namespace ICSharpCode.TextEditor.Document
{
for (int i = 0; i < list.Count; ++i) {
ISegment fm = list[i];
-
+
if (e.Offset <= fm.Offset && fm.Offset <= e.Offset + e.Length ||
e.Offset <= fm.Offset + fm.Length && fm.Offset + fm.Length <= e.Offset + e.Length) {
list.RemoveAt(i);
@@ -415,7 +415,7 @@ namespace ICSharpCode.TextEditor.Document
List updateQueue = new List();
public List UpdateQueue {
- get {
+ get {
return updateQueue;
}
}
diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
index b908f7d582..4a2287e640 100644
--- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
+++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/CodeCompletionWindow.cs
@@ -8,6 +8,7 @@
using System;
using System.Drawing;
using System.Windows.Forms;
+using ICSharpCode.TextEditor.Document;
namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{
@@ -17,6 +18,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
CodeCompletionListView codeCompletionListView;
VScrollBar vScrollBar = new VScrollBar();
ICompletionDataProvider dataProvider;
+ IDocument document;
int startOffset;
int endOffset;
@@ -38,6 +40,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{
this.dataProvider = completionDataProvider;
this.completionData = completionData;
+ this.document = control.Document;
workingScreen = Screen.GetWorkingArea(Location);
startOffset = control.ActiveTextAreaControl.Caret.Offset + 1;
@@ -87,6 +90,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
}
vScrollBar.ValueChanged += VScrollBarValueChanged;
+ document.DocumentAboutToBeChanged += DocumentAboutToBeChanged;
}
bool inScrollUpdate;
@@ -164,12 +168,13 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
{
switch (dataProvider.ProcessKey(ch)) {
case CompletionDataProviderKeyResult.BeforeStartKey:
- // increment start + end and process as normal char
+ // increment start+end, then process as normal char
++startOffset;
- goto case CompletionDataProviderKeyResult.NormalKey;
- case CompletionDataProviderKeyResult.NormalKey:
++endOffset;
return base.ProcessKeyEvent(ch);
+ case CompletionDataProviderKeyResult.NormalKey:
+ // just process normally
+ return base.ProcessKeyEvent(ch);
case CompletionDataProviderKeyResult.InsertionKey:
return InsertSelectedItem(ch);
default:
@@ -177,6 +182,20 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
}
}
+ void DocumentAboutToBeChanged(object sender, DocumentEventArgs e)
+ {
+ // => startOffset test required so that this startOffset/endOffset are not incremented again
+ // for BeforeStartKey characters
+ if (e.Offset >= startOffset && e.Offset <= endOffset) {
+ if (e.Length > 0) { // length of removed region
+ endOffset -= e.Length;
+ }
+ if (!string.IsNullOrEmpty(e.Text)) {
+ endOffset += e.Text.Length;
+ }
+ }
+ }
+
protected override void CaretOffsetChanged(object sender, EventArgs e)
{
int offset = control.ActiveTextAreaControl.Caret.Offset;
@@ -197,20 +216,6 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
}
switch (keyData) {
- case Keys.Back:
- --endOffset;
- if (endOffset < startOffset) {
- Close();
- }
- return false;
- case Keys.Delete:
- if (control.ActiveTextAreaControl.Caret.Offset <= endOffset) {
- --endOffset;
- }
- if (endOffset < startOffset) {
- Close();
- }
- return false;
case Keys.Home:
codeCompletionListView.SelectIndex(0);
return true;
@@ -247,18 +252,25 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
control.ActiveTextAreaControl.TextArea.Focus();
}
- protected override void OnClosed(EventArgs e)
+ protected override void Dispose(bool disposing)
{
- base.OnClosed(e);
- Dispose();
- codeCompletionListView.Dispose();
- codeCompletionListView = null;
- declarationViewWindow.Dispose();
- declarationViewWindow = null;
+ if (disposing) {
+ document.DocumentAboutToBeChanged -= DocumentAboutToBeChanged;
+ if (codeCompletionListView != null) {
+ codeCompletionListView.Dispose();
+ codeCompletionListView = null;
+ }
+ if (declarationViewWindow != null) {
+ declarationViewWindow.Dispose();
+ declarationViewWindow = null;
+ }
+ }
+ base.Dispose(disposing);
}
bool InsertSelectedItem(char ch)
{
+ document.DocumentAboutToBeChanged -= DocumentAboutToBeChanged;
ICompletionData data = codeCompletionListView.SelectedCompletionData;
bool result = false;
if (data != null) {
diff --git a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionDataProvider.cs b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
index 544ec52734..4096feaa47 100644
--- a/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
+++ b/src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/CompletionWindow/ICompletionDataProvider.cs
@@ -45,7 +45,7 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
public enum CompletionDataProviderKeyResult
{
///
- /// Normal key, used to choose
+ /// Normal key, used to choose an entry from the completion list
///
NormalKey,
///
@@ -54,7 +54,8 @@ namespace ICSharpCode.TextEditor.Gui.CompletionWindow
InsertionKey,
///
/// Increment both start and end offset of completion region when inserting this
- /// key. Used to insert space.
+ /// key. Can be used to insert whitespace (or other characters) in front of the expression
+ /// while the completion window is open.
///
BeforeStartKey
}