Browse Source

Fixed build, more improvements to GetNextCaretPosition / whole-word selection.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3902 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
aa9f587a8f
  1. 5
      src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj
  2. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs
  3. 19
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs
  4. 4
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs
  5. 19
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs

5
src/AddIns/BackendBindings/FSharp/FSharpBinding/Project/FSharpBinding.fsproj

@ -225,6 +225,11 @@ @@ -225,6 +225,11 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\..\Libraries\AvalonEdit\ICSharpCode.AvalonEdit\ICSharpCode.AvalonEdit.csproj">
<Project>{6C55B776-26D4-4DB3-A6AB-87E783B2F3D1}</Project>
<Name>ICSharpCode.AvalonEdit</Name>
<Private>False</Private>
</ProjectReference>
<ProjectReference Include="..\..\..\..\..\Main\ICSharpCode.Core.Presentation\ICSharpCode.Core.Presentation.csproj">
<Project>{7E4A7172-7FF5-48D0-B719-7CD959DD1AC9}</Project>
<Name>ICSharpCode.Core.Presentation</Name>

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs

@ -26,13 +26,21 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -26,13 +26,21 @@ namespace ICSharpCode.AvalonEdit.Gui
/// </summary>
Normal,
/// <summary>
/// Stop only on word borders. This is used for word-selection using the mouse.
/// Stop only on word borders.
/// </summary>
WordBorder,
/// <summary>
/// Stop only at the beginning of words. This is used for Ctrl+Left/Ctrl+Right.
/// </summary>
WordStart
WordStart,
/// <summary>
/// Stop only at the beginning of words, and anywhere in the middle of symbols.
/// </summary>
WordStartOrSymbol,
/// <summary>
/// Stop only on word borders, and anywhere in the middle of symbols.
/// </summary>
WordBorderOrSymbol
}
static class CaretNavigationCommandHandler

19
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs

@ -389,10 +389,10 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -389,10 +389,10 @@ namespace ICSharpCode.AvalonEdit.Gui
VisualLine line = textView.GetVisualLineFromVisualTop(pos.Y);
if (line != null) {
int visualColumn = line.GetVisualColumn(pos);
int wordStartVC = line.GetNextCaretPosition(visualColumn + 1, true, CaretPositioningMode.WordStart);
int wordStartVC = line.GetNextCaretPosition(visualColumn + 1, true, CaretPositioningMode.WordStartOrSymbol);
if (wordStartVC == -1)
wordStartVC = 0;
int wordEndVC = line.GetNextCaretPosition(wordStartVC, false, CaretPositioningMode.WordBorder);
int wordEndVC = line.GetNextCaretPosition(wordStartVC, false, CaretPositioningMode.WordBorderOrSymbol);
if (wordEndVC == -1)
wordEndVC = line.VisualLength;
int relOffset = line.FirstDocumentLine.Offset;
@ -457,9 +457,17 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -457,9 +457,17 @@ namespace ICSharpCode.AvalonEdit.Gui
#region ExtendSelection
void SetCaretOffsetToMousePosition(MouseEventArgs e)
{
SetCaretOffsetToMousePosition(e, null);
}
void SetCaretOffsetToMousePosition(MouseEventArgs e, ISegment allowedSegment)
{
int visualColumn;
int offset = GetOffsetFromMousePosition(e, out visualColumn);
if (allowedSegment != null) {
offset = Math.Max(allowedSegment.Offset, Math.Min(allowedSegment.EndOffset, offset));
}
if (offset >= 0) {
textArea.Caret.Position = new TextViewPosition(textArea.Document.GetLocation(offset), visualColumn);
textArea.Caret.DesiredXPos = double.NaN;
@ -469,14 +477,19 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -469,14 +477,19 @@ namespace ICSharpCode.AvalonEdit.Gui
void ExtendSelectionToMouse(MouseEventArgs e)
{
int oldOffset = textArea.Caret.Offset;
SetCaretOffsetToMousePosition(e);
if (mode == SelectionMode.Normal) {
SetCaretOffsetToMousePosition(e);
textArea.Selection = textArea.Selection.StartSelectionOrSetEndpoint(oldOffset, textArea.Caret.Offset);
} else if (mode == SelectionMode.WholeWord) {
var newWord = GetWordAtMousePosition(e);
if (newWord != SimpleSegment.Invalid) {
textArea.Selection = new SimpleSelection(Math.Min(newWord.Offset, startWord.Offset),
Math.Max(newWord.EndOffset, startWord.EndOffset));
// Set caret offset, but limit the caret to stay inside the selection.
// in whole-word selection, it's otherwise possible that we get the caret outside the
// selection - but the TextArea doesn't like that and will reset the selection, causing
// flickering.
SetCaretOffsetToMousePosition(e, textArea.Selection.SurroundingSegment);
}
}
}

4
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs

@ -179,14 +179,14 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -179,14 +179,14 @@ namespace ICSharpCode.AvalonEdit.Gui
int stop1 = this.VisualColumn;
int stop2 = this.VisualColumn + this.VisualLength;
if (backwards) {
if (mode != CaretPositioningMode.WordStart && visualColumn > stop2)
if (visualColumn > stop2 && mode != CaretPositioningMode.WordStart && mode != CaretPositioningMode.WordStartOrSymbol)
return stop2;
else if (visualColumn > stop1)
return stop1;
} else {
if (visualColumn < stop1)
return stop1;
else if (mode != CaretPositioningMode.WordStart && visualColumn < stop2)
else if (visualColumn < stop2 && mode != CaretPositioningMode.WordStart && mode != CaretPositioningMode.WordStartOrSymbol)
return stop2;
}
return -1;

19
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs

@ -47,7 +47,9 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -47,7 +47,9 @@ namespace ICSharpCode.AvalonEdit.Utils
throw new ArgumentNullException("textSource");
if (mode != CaretPositioningMode.Normal
&& mode != CaretPositioningMode.WordBorder
&& mode != CaretPositioningMode.WordStart)
&& mode != CaretPositioningMode.WordStart
&& mode != CaretPositioningMode.WordBorderOrSymbol
&& mode != CaretPositioningMode.WordStartOrSymbol)
{
throw new ArgumentException("Unsupported CaretPositioningMode: " + mode, "mode");
}
@ -82,7 +84,7 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -82,7 +84,7 @@ namespace ICSharpCode.AvalonEdit.Utils
return nextPos;
} else if (nextPos == textLength) {
// at the document end, there's never a word start
if (mode != CaretPositioningMode.WordStart) {
if (mode != CaretPositioningMode.WordStart && mode != CaretPositioningMode.WordStartOrSymbol) {
// at the document end, there's only a word border
// if the last character is not whitespace
if (!char.IsWhiteSpace(textSource.GetCharAt(textLength - 1)))
@ -91,12 +93,21 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -91,12 +93,21 @@ namespace ICSharpCode.AvalonEdit.Utils
} else {
CharacterClass charBefore = GetCharacterClass(textSource.GetCharAt(nextPos - 1));
CharacterClass charAfter = GetCharacterClass(textSource.GetCharAt(nextPos));
if (charBefore != charAfter) {
if (charBefore == charAfter) {
if (charBefore == CharacterClass.Other &&
(mode == CaretPositioningMode.WordBorderOrSymbol || mode == CaretPositioningMode.WordStartOrSymbol))
{
// With the "OrSymbol" modes, there's a word border and start between any two unknown characters
return nextPos;
}
} else {
// this looks like a possible border
// if we're looking for word starts, check that this is a word start (and not a word end)
// if we're just checking for word borders, accept unconditionally
if (!(mode == CaretPositioningMode.WordStart && (charAfter == CharacterClass.Whitespace || charAfter == CharacterClass.LineTerminator))) {
if (!((mode == CaretPositioningMode.WordStart || mode == CaretPositioningMode.WordStartOrSymbol)
&& (charAfter == CharacterClass.Whitespace || charAfter == CharacterClass.LineTerminator)))
{
return nextPos;
}
}

Loading…
Cancel
Save