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. 2
      src/Main/Base/Project/Src/Gui/AbstractViewContent.cs
  6. 15
      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 @@ -285,8 +285,26 @@ namespace ICSharpCode.TextEditor
static extern bool HideCaret(IntPtr hWnd);
#endregion
bool firePositionChangedAfterUpdateEnd;
void FirePositionChangedAfterUpdateEnd(object sender, EventArgs e)
{
OnPositionChanged(EventArgs.Empty);
}
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);
bool shouldUpdate = false;
foreach (FoldMarker foldMarker in foldings) {

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save