Browse Source

Fixed SD2-424: Replace performance not acceptable

Caret.PositionChanged now no longer fires when TextAreaControl.IsInUpdate is set to true.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.0@1439 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
f1eb93cb43
  1. 18
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Caret.cs
  2. 4
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs
  3. 50
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaControl.cs
  4. 2
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs
  5. 6
      src/Main/Base/Project/Src/Gui/AbstractViewContent.cs
  6. 25
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs
  7. 2
      src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchStrategy/WildcardSearchStrategy.cs

18
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/Caret.cs

@ -285,8 +285,26 @@ namespace ICSharpCode.TextEditor
static extern bool HideCaret(IntPtr hWnd); static extern bool HideCaret(IntPtr hWnd);
#endregion #endregion
bool firePositionChangedAfterUpdateEnd;
void FirePositionChangedAfterUpdateEnd(object sender, EventArgs e)
{
OnPositionChanged(EventArgs.Empty);
}
protected virtual void OnPositionChanged(EventArgs e) protected virtual void OnPositionChanged(EventArgs e)
{ {
if (this.textArea.MotherTextEditorControl.IsInUpdate) {
if (firePositionChangedAfterUpdateEnd == false) {
firePositionChangedAfterUpdateEnd = true;
this.textArea.Document.UpdateCommited += FirePositionChangedAfterUpdateEnd;
}
return;
} else if (firePositionChangedAfterUpdateEnd) {
this.textArea.Document.UpdateCommited -= FirePositionChangedAfterUpdateEnd;
firePositionChangedAfterUpdateEnd = false;
}
List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(line, column); List<FoldMarker> foldings = textArea.Document.FoldingManager.GetFoldingsFromPosition(line, column);
bool shouldUpdate = false; bool shouldUpdate = false;
foreach (FoldMarker foldMarker in foldings) { foreach (FoldMarker foldMarker in foldings) {

4
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextArea.cs

@ -506,7 +506,7 @@ namespace ICSharpCode.TextEditor
} }
if (adjustScrollBars) { if (adjustScrollBars) {
this.motherTextAreaControl.AdjustScrollBars(null, null); this.motherTextAreaControl.AdjustScrollBars();
} }
Caret.UpdateCaretPosition(); Caret.UpdateCaretPosition();
@ -516,7 +516,7 @@ namespace ICSharpCode.TextEditor
void DocumentFoldingsChanged(object sender, EventArgs e) void DocumentFoldingsChanged(object sender, EventArgs e)
{ {
Invalidate(); Invalidate();
this.motherTextAreaControl.AdjustScrollBars(null, null); this.motherTextAreaControl.AdjustScrollBars();
} }
#region keyboard handling methods #region keyboard handling methods

50
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaControl.cs

@ -111,7 +111,8 @@ namespace ICSharpCode.TextEditor
Controls.Add(this.hScrollBar); Controls.Add(this.hScrollBar);
ResizeRedraw = true; ResizeRedraw = true;
Document.DocumentChanged += new DocumentEventHandler(AdjustScrollBars); Document.DocumentChanged += AdjustScrollBarsOnDocumentChange;
Document.UpdateCommited += AdjustScrollBarsOnCommittedUpdate;
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
@ -119,7 +120,8 @@ namespace ICSharpCode.TextEditor
if (disposing) { if (disposing) {
if (!disposed) { if (!disposed) {
disposed = true; disposed = true;
Document.DocumentChanged -= new DocumentEventHandler(AdjustScrollBars); Document.DocumentChanged -= AdjustScrollBarsOnDocumentChange;
Document.UpdateCommited -= AdjustScrollBarsOnCommittedUpdate;
motherTextEditorControl = null; motherTextEditorControl = null;
if (vScrollBar != null) { if (vScrollBar != null) {
vScrollBar.Dispose(); vScrollBar.Dispose();
@ -172,7 +174,33 @@ namespace ICSharpCode.TextEditor
Width - SystemInformation.HorizontalScrollBarArrowWidth, Width - SystemInformation.HorizontalScrollBarArrowWidth,
SystemInformation.VerticalScrollBarArrowHeight); SystemInformation.VerticalScrollBarArrowHeight);
} }
public void AdjustScrollBars(object sender, DocumentEventArgs e)
bool adjustScrollBarsOnNextUpdate;
Point scrollToPosOnNextUpdate;
void AdjustScrollBarsOnDocumentChange(object sender, DocumentEventArgs e)
{
if (motherTextEditorControl.IsInUpdate == false) {
AdjustScrollBars();
} else {
adjustScrollBarsOnNextUpdate = true;
}
}
void AdjustScrollBarsOnCommittedUpdate(object sender, EventArgs e)
{
if (motherTextEditorControl.IsInUpdate == false) {
if (adjustScrollBarsOnNextUpdate) {
adjustScrollBarsOnNextUpdate = false;
AdjustScrollBars();
}
if (!scrollToPosOnNextUpdate.IsEmpty) {
ScrollTo(scrollToPosOnNextUpdate.Y, scrollToPosOnNextUpdate.X);
}
}
}
public void AdjustScrollBars()
{ {
vScrollBar.Minimum = 0; vScrollBar.Minimum = 0;
// number of visible lines in document (folding!) // number of visible lines in document (folding!)
@ -213,7 +241,7 @@ namespace ICSharpCode.TextEditor
} }
} }
AdjustScrollBars(null, null); AdjustScrollBars();
} }
void VScrollBarValueChanged(object sender, EventArgs e) void VScrollBarValueChanged(object sender, EventArgs e)
@ -265,11 +293,19 @@ namespace ICSharpCode.TextEditor
public void ScrollToCaret() public void ScrollToCaret()
{ {
ScrollTo(textArea.Caret.Line, textArea.Caret.Column);
}
public void ScrollTo(int line, int column)
{
if (motherTextEditorControl.IsInUpdate) {
scrollToPosOnNextUpdate = new Point(column, line);
return;
}
int curCharMin = (int)(this.hScrollBar.Value - this.hScrollBar.Minimum); int curCharMin = (int)(this.hScrollBar.Value - this.hScrollBar.Minimum);
int curCharMax = curCharMin + textArea.TextView.VisibleColumnCount; int curCharMax = curCharMin + textArea.TextView.VisibleColumnCount;
int pos = textArea.TextView.GetVisualColumn(textArea.Caret.Line, int pos = textArea.TextView.GetVisualColumn(line, column);
textArea.Caret.Column);
if (textArea.TextView.VisibleColumnCount < 0) { if (textArea.TextView.VisibleColumnCount < 0) {
hScrollBar.Value = 0; hScrollBar.Value = 0;
@ -282,7 +318,7 @@ namespace ICSharpCode.TextEditor
} }
} }
} }
ScrollTo(textArea.Caret.Line); ScrollTo(line);
} }
int scrollMarginHeight = 3; int scrollMarginHeight = 3;

2
src/Libraries/ICSharpCode.TextEditor/Project/Src/Gui/TextAreaMouseHandler.cs

@ -217,7 +217,7 @@ namespace ICSharpCode.TextEditor
mousepos.Y - textArea.TextView.DrawingPosition.Y); mousepos.Y - textArea.TextView.DrawingPosition.Y);
if (marker != null && marker.IsFolded) { if (marker != null && marker.IsFolded) {
marker.IsFolded = false; marker.IsFolded = false;
textArea.MotherTextAreaControl.AdjustScrollBars(null, null); textArea.MotherTextAreaControl.AdjustScrollBars();
} }
if (textArea.Caret.Offset < textArea.Document.TextLength) { if (textArea.Caret.Offset < textArea.Document.TextLength) {
switch (textArea.Document.GetCharAt(textArea.Caret.Offset)) { switch (textArea.Document.GetCharAt(textArea.Caret.Offset)) {

6
src/Main/Base/Project/Src/Gui/AbstractViewContent.cs

@ -185,8 +185,10 @@ namespace ICSharpCode.SharpDevelop.Gui
return isDirty; return isDirty;
} }
set { set {
isDirty = value; if (isDirty != value) {
OnDirtyChanged(EventArgs.Empty); isDirty = value;
OnDirtyChanged(EventArgs.Empty);
}
} }
} }
bool isDirty = false; bool isDirty = false;

25
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchReplaceManager.cs

@ -201,28 +201,33 @@ namespace SearchAndReplace
return; return;
List<TextEditorControl> textAreas = new List<TextEditorControl>(); List<TextEditorControl> textAreas = new List<TextEditorControl>();
TextEditorControl textArea = null;
for (int count = 0;; count++) { for (int count = 0;; count++) {
SearchResult result = SearchReplaceManager.find.FindNext(); SearchResult result = SearchReplaceManager.find.FindNext();
if (result == null) { if (result == null) {
if (count != 0) { if (count != 0) {
foreach (TextEditorControl textArea in textAreas) { foreach (TextEditorControl ta in textAreas) {
textArea.EndUpdate(); ta.EndUpdate();
textArea.Refresh(); ta.Refresh();
} }
} }
ShowReplaceDoneMessage(count); ShowReplaceDoneMessage(count);
find.Reset(); find.Reset();
return; return;
} else { } else {
TextEditorControl textArea = OpenTextArea(result.FileName); if (textArea == null || textArea.FileName != result.FileName) {
if (textArea != null) { // we need to open another text area
if (!textAreas.Contains(textArea)) { textArea = OpenTextArea(result.FileName);
textArea.BeginUpdate(); if (textArea != null) {
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear(); if (!textAreas.Contains(textArea)) {
textAreas.Add(textArea); textArea.BeginUpdate();
textArea.ActiveTextAreaControl.TextArea.SelectionManager.SelectionCollection.Clear();
textAreas.Add(textArea);
}
} }
}
if (textArea != null) {
string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern); string transformedPattern = result.TransformReplacePattern(SearchOptions.ReplacePattern);
find.Replace(result.Offset, result.Length, transformedPattern); find.Replace(result.Offset, result.Length, transformedPattern);
if (find.CurrentDocumentInformation.Document == null) { if (find.CurrentDocumentInformation.Document == null) {

2
src/Main/Base/Project/Src/TextEditor/SearchAndReplace/Engine/SearchStrategy/WildcardSearchStrategy.cs

@ -114,7 +114,7 @@ namespace SearchAndReplace
case CommandType.AnySingle: case CommandType.AnySingle:
break; break;
case CommandType.AnyDigit: case CommandType.AnyDigit:
if (!Char.IsDigit(ch)) { if (!Char.IsDigit(ch) && ch != '#') {
return false; return false;
} }
break; break;

Loading…
Cancel
Save