diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Editor.cxx | 45 | ||||
| -rw-r--r-- | src/Editor.h | 1 | ||||
| -rw-r--r-- | src/Selection.cxx | 8 | ||||
| -rw-r--r-- | src/Selection.h | 4 | 
4 files changed, 42 insertions, 16 deletions
| diff --git a/src/Editor.cxx b/src/Editor.cxx index 8cfbbd6e4..f6e7b0603 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -706,6 +706,18 @@ void Editor::SetRectangularRange() {  	}  } +void Editor::ThinRectangularRange() { +	if (sel.IsRectangular()) { +		sel.selType = Selection::selThin; +		if (sel.Rectangular().caret < sel.Rectangular().anchor) { +			sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).caret, sel.Range(0).anchor); +		} else { +			sel.Rectangular() = SelectionRange(sel.Range(sel.Count()-1).anchor, sel.Range(0).caret); +		} +		SetRectangularRange(); +	} +} +  void Editor::InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection) {  	if (sel.Count() > 1 || !(sel.RangeMain().anchor == newMain.anchor) || sel.IsRectangular()) {  		invalidateWholeSelection = true; @@ -3724,10 +3736,7 @@ void Editor::AddCharUTF(char *s, unsigned int len, bool treatAsDBCS) {  	if (wrapState != eWrapNone) {  		SetScrollBars();  	} -	if (sel.IsRectangular()) { -		sel.selType = Selection::selThin; -		sel.Rectangular() = SelectionRange(sel.Rectangular().caret, sel.Range(0).anchor); -	} +	ThinRectangularRange();  	// If in wrap mode rewrap current line so EnsureCaretVisible has accurate information  	EnsureCaretVisible();  	// Avoid blinking during rapid typing: @@ -3788,6 +3797,7 @@ void Editor::ClearSelection() {  			}  		}  	} +	ThinRectangularRange();  	sel.RemoveDuplicates();  	ClaimSelection();  } @@ -3985,11 +3995,6 @@ void Editor::DelCharBack(bool allowLineStartDeletion) {  		}  	} else {  		ClearSelection(); -		if (sel.IsRectangular()) { -			sel.selType = Selection::selThin; -			sel.Rectangular() = SelectionRange(sel.Rectangular().caret, sel.Range(0).anchor); -		} -		//SetEmptySelection(sel.MainCaret());  	}  	sel.RemoveDuplicates();  	// Avoid blinking during rapid typing: @@ -4590,8 +4595,14 @@ void Editor::NewLine() {  }  void Editor::CursorUpOrDown(int direction, Selection::selTypes selt) { -	SelectionPosition caretToUse = sel.IsRectangular() ? -		sel.Rectangular().caret : sel.Range(sel.Main()).caret; +	SelectionPosition caretToUse = sel.Range(sel.Main()).caret; +	if (sel.IsRectangular()) { +		if (selt ==  Selection::noSel) { +			caretToUse = (direction > 0) ? sel.Limits().end : sel.Limits().start; +		} else { +			caretToUse = sel.Rectangular().caret; +		} +	}  	Point pt = LocationFromPosition(caretToUse);  	int lineDoc = pdoc->LineFromPosition(caretToUse.Position());  	Point ptStartLine = LocationFromPosition(pdoc->LineStart(lineDoc)); @@ -4708,15 +4719,16 @@ int Editor::KeyCommand(unsigned int iMessage) {  		break;  	case SCI_CHARLEFT:  		if (SelectionEmpty() || sel.MoveExtends()) { -			if (pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) { +			if ((sel.Count() == 1) && pdoc->IsLineEndPosition(sel.MainCaret()) && sel.RangeMain().caret.VirtualSpace()) {  				SelectionPosition spCaret = sel.RangeMain().caret;  				spCaret.SetVirtualSpace(spCaret.VirtualSpace() - 1);  				MovePositionTo(spCaret);  			} else { -				MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() - 1), -1)); +				MovePositionTo(MovePositionSoVisible( +					SelectionPosition((sel.LimitsForRectangularElseMain().start).Position() - 1), -1));  			}  		} else { -			MovePositionTo(sel.IsRectangular() ? sel.Limits().start : sel.RangeMain().Start()); +			MovePositionTo(sel.LimitsForRectangularElseMain().start);  		}  		SetLastXChosen();  		break; @@ -4747,10 +4759,11 @@ int Editor::KeyCommand(unsigned int iMessage) {  				spCaret.SetVirtualSpace(spCaret.VirtualSpace() + 1);  				MovePositionTo(spCaret);  			} else { -				MovePositionTo(MovePositionSoVisible(SelectionPosition(sel.MainCaret() + 1), 1)); +				MovePositionTo(MovePositionSoVisible( +					SelectionPosition((sel.LimitsForRectangularElseMain().end).Position() + 1), 1));  			}  		} else { -			MovePositionTo(sel.IsRectangular() ? sel.Limits().end : sel.RangeMain().End()); +			MovePositionTo(sel.LimitsForRectangularElseMain().end);  		}  		SetLastXChosen();  		break; diff --git a/src/Editor.h b/src/Editor.h index a0431df29..92dcfb14b 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -283,6 +283,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	SelectionPosition SelectionStart();  	SelectionPosition SelectionEnd();  	void SetRectangularRange(); +	void ThinRectangularRange();  	void InvalidateSelection(SelectionRange newMain, bool invalidateWholeSelection=false);  	void SetSelection(SelectionPosition currentPos_, SelectionPosition anchor_);  	void SetSelection(int currentPos_, int anchor_); diff --git a/src/Selection.cxx b/src/Selection.cxx index 566cb1074..2cdbe60f2 100644 --- a/src/Selection.cxx +++ b/src/Selection.cxx @@ -192,6 +192,14 @@ SelectionSegment Selection::Limits() const {  	}  } +SelectionSegment Selection::LimitsForRectangularElseMain() const { +	if (IsRectangular()) { +		return Limits(); +	} else { +		return SelectionSegment(ranges[mainRange].caret, ranges[mainRange].anchor); +	} +} +  size_t Selection::Count() const {  	return ranges.size();  } diff --git a/src/Selection.h b/src/Selection.h index d064af642..a3bac724a 100644 --- a/src/Selection.h +++ b/src/Selection.h @@ -148,6 +148,10 @@ public:  	int MainAnchor() const;  	SelectionRange &Rectangular();  	SelectionSegment Limits() const; +	// This is for when you want to move the caret in response to a  +	// user direction command - for rectangular selections, use the range +	// that covers all selected text otherwise return the main selection. +	SelectionSegment LimitsForRectangularElseMain() const;  	size_t Count() const;  	size_t Main() const;  	void SetMain(size_t r); | 
