diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Editor.cxx | 30 | ||||
| -rw-r--r-- | src/Editor.h | 1 | 
2 files changed, 22 insertions, 9 deletions
diff --git a/src/Editor.cxx b/src/Editor.cxx index 00bdfcf57..db5fe54b5 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -2887,29 +2887,41 @@ void Editor::NewLine() {  	EnsureCaretVisible();  } -int Editor::KeyCommand(unsigned int iMessage) { +void Editor::CursorUpOrDown(int direction, bool extend) {  	Point pt = LocationFromPosition(currentPos); +	int posNew = PositionFromLocation( +		Point(lastXChosen, pt.y + direction * vs.lineHeight)); +	if (direction < 0) { +		// Line wrapping may lead to a location on the same line, so +		// seek back if that is the case. +		// There is an equivalent case when moving down which skips  +		// over a line but as that does not trap the user it is fine. +		Point ptNew = LocationFromPosition(posNew); +		while ((posNew > 0) && (pt.y == ptNew.y)) { +			posNew--; +			ptNew = LocationFromPosition(posNew); +		} +	} +	MovePositionTo(posNew, extend); +} +int Editor::KeyCommand(unsigned int iMessage) {  	switch (iMessage) {  	case SCI_LINEDOWN: -		MovePositionTo(PositionFromLocation( -		                   Point(lastXChosen, pt.y + vs.lineHeight))); +		CursorUpOrDown(1);  		break;  	case SCI_LINEDOWNEXTEND: -		MovePositionTo(PositionFromLocation( -		                   Point(lastXChosen, pt.y + vs.lineHeight)), true); +		CursorUpOrDown(1, true);  		break;  	case SCI_LINESCROLLDOWN:  		ScrollTo(topLine + 1);  		MoveCaretInsideView();  		break;  	case SCI_LINEUP: -		MovePositionTo(PositionFromLocation( -		                   Point(lastXChosen, pt.y - vs.lineHeight))); +		CursorUpOrDown(-1);  		break;  	case SCI_LINEUPEXTEND: -		MovePositionTo(PositionFromLocation( -		                   Point(lastXChosen, pt.y - vs.lineHeight)), true); +		CursorUpOrDown(-1, true);  		break;  	case SCI_LINESCROLLUP:  		ScrollTo(topLine - 1); diff --git a/src/Editor.h b/src/Editor.h index 5a82f32ff..353e4ee9f 100644 --- a/src/Editor.h +++ b/src/Editor.h @@ -400,6 +400,7 @@ protected:	// ScintillaBase subclass needs access to much of Editor  	void LineTranspose();      	virtual void CancelModes();  	void NewLine(); +	void CursorUpOrDown(int direction, bool extend=false);  	virtual int KeyCommand(unsigned int iMessage);  	virtual int KeyDefault(int /* key */, int /*modifiers*/);  	int KeyDown(int key, bool shift, bool ctrl, bool alt, bool *consumed=0);  | 
