diff options
author | Michael Hutchinson <mhutch@xamarin.com> | 2011-09-27 03:22:18 +0400 |
---|---|---|
committer | Michael Hutchinson <mhutch@xamarin.com> | 2011-09-27 03:25:38 +0400 |
commit | fa68831c453fcaef2ebc7770cbf9279e80a30932 (patch) | |
tree | 19058171f5c2bd26f8c7f24dedd1b63c480cf773 /main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui | |
parent | 5632d46e154bfa865c646336bf703176bc4ddd2f (diff) |
[Ide] Improve the uppercase/lowercase commands
* Don't access SelectedText multiple times, it's expensive
* When running without a selection, move the caret even if
the char wasn't changed
* Use atomic undo for the remove-insert
* Simplify control flow using early return
Diffstat (limited to 'main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui')
-rw-r--r-- | main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs | 84 |
1 files changed, 51 insertions, 33 deletions
diff --git a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs index 438d7d0136..d9b07dc8ce 100644 --- a/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs +++ b/main/src/core/MonoDevelop.Ide/MonoDevelop.Ide.Gui/ViewCommandHandlers.cs @@ -232,24 +232,33 @@ namespace MonoDevelop.Ide.Gui public void OnUppercaseSelection () { IEditableTextBuffer buffer = GetContent <IEditableTextBuffer> (); - if (buffer != null) - { - if (buffer.SelectedText == String.Empty) - { - int pos = buffer.CursorPosition; - string ch = buffer.GetText (pos, pos + 1); - if (!char.IsLower (ch[0])) - return; - buffer.DeleteText (pos, 1); - buffer.InsertText (pos, ch.ToUpper ()); + if (buffer == null) + return; + + string selectedText = buffer.SelectedText; + if (string.IsNullOrEmpty (selectedText)) { + int pos = buffer.CursorPosition; + string ch = buffer.GetText (pos, pos + 1); + string upper = ch.ToUpper (); + if (upper == ch) { buffer.CursorPosition = pos + 1; - } else - { - string newText = buffer.SelectedText.ToUpper (); - int startPos = buffer.SelectionStartPosition; - buffer.DeleteText (startPos, buffer.SelectedText.Length); - buffer.InsertText (startPos, newText); + return; } + buffer.BeginAtomicUndo (); + buffer.DeleteText (pos, 1); + buffer.InsertText (pos, upper); + buffer.CursorPosition = pos + 1; + buffer.EndAtomicUndo (); + } else { + string newText = selectedText.ToUpper (); + if (newText == selectedText) + return; + int startPos = buffer.SelectionStartPosition; + buffer.BeginAtomicUndo (); + buffer.DeleteText (startPos, selectedText.Length); + buffer.InsertText (startPos, newText); + buffer.Select (startPos, startPos + newText.Length); + buffer.EndAtomicUndo (); } } @@ -264,24 +273,33 @@ namespace MonoDevelop.Ide.Gui public void OnLowercaseSelection () { IEditableTextBuffer buffer = GetContent <IEditableTextBuffer> (); - if (buffer != null) - { - if (buffer.SelectedText == String.Empty) - { - int pos = buffer.CursorPosition; - string ch = buffer.GetText (pos, pos + 1); - if (!char.IsUpper (ch[0])) - return; - buffer.DeleteText (pos, 1); - buffer.InsertText (pos, ch.ToLower ()); + if (buffer == null) + return; + + string selectedText = buffer.SelectedText; + if (string.IsNullOrEmpty (selectedText)) { + int pos = buffer.CursorPosition; + string ch = buffer.GetText (pos, pos + 1); + string lower = ch.ToLower (); + if (lower == ch) { buffer.CursorPosition = pos + 1; - } else - { - string newText = buffer.SelectedText.ToLower (); - int startPos = buffer.SelectionStartPosition; - buffer.DeleteText (startPos, buffer.SelectedText.Length); - buffer.InsertText (startPos, newText); - } + return; + }; + buffer.BeginAtomicUndo (); + buffer.DeleteText (pos, 1); + buffer.InsertText (pos, lower); + buffer.CursorPosition = pos + 1; + buffer.EndAtomicUndo (); + } else { + string newText = selectedText.ToLower (); + if (newText == selectedText) + return; + int startPos = buffer.SelectionStartPosition; + buffer.BeginAtomicUndo (); + buffer.DeleteText (startPos, selectedText.Length); + buffer.InsertText (startPos, newText); + buffer.Select (startPos, startPos + newText.Length); + buffer.EndAtomicUndo (); } } |