aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2019-11-26 09:09:26 +1100
committerNeil <nyamatongwe@gmail.com>2019-11-26 09:09:26 +1100
commitb08335168f56212c7d9ae9f236f8fac0746ba090 (patch)
tree36303cf702a28930e0737511dead85440e630a4f
parent86a71cac683e04357bf689817053b60c6b5798d1 (diff)
downloadscintilla-mirror-b08335168f56212c7d9ae9f236f8fac0746ba090.tar.gz
Bug [#2140]. Fix where anchor and caret differ only in amount of virtual space
so one was considered start and was moved for an insertion at that position. This could flip the order of the positions or change the length of the selection.
-rw-r--r--src/Selection.cxx4
-rw-r--r--test/simpleTests.py18
2 files changed, 20 insertions, 2 deletions
diff --git a/src/Selection.cxx b/src/Selection.cxx
index e47ace127..4a397b4aa 100644
--- a/src/Selection.cxx
+++ b/src/Selection.cxx
@@ -96,8 +96,8 @@ void SelectionRange::MoveForInsertDelete(bool insertion, Sci::Position startChan
// which position is the start and pass this into
// SelectionPosition::MoveForInsertDelete.
// There isn't any reason to move an empty selection so don't move it.
- const bool caretStart = caret < anchor;
- const bool anchorStart = anchor < caret;
+ const bool caretStart = caret.Position() < anchor.Position();
+ const bool anchorStart = anchor.Position() < caret.Position();
caret.MoveForInsertDelete(insertion, startChange, length, caretStart);
anchor.MoveForInsertDelete(insertion, startChange, length, anchorStart);
diff --git a/test/simpleTests.py b/test/simpleTests.py
index f56066690..1ede72da3 100644
--- a/test/simpleTests.py
+++ b/test/simpleTests.py
@@ -1665,6 +1665,24 @@ class TestMultiSelection(unittest.TestCase):
self.assertEquals(self.ed.Contents(), b'a1')
self.assertEquals(self.textOfSelection(0), b'')
+ def testInsertThroughVirtualSpace(self):
+ self.ed.SetContents(b"a")
+ self.ed.SetSelection(1, 1)
+ self.ed.SetSelectionNAnchorVirtualSpace(0, 2)
+ self.ed.SetSelectionNCaretVirtualSpace(0, 3)
+ self.assertEquals(self.selectionRepresentation(0), "1+2v-1+3v")
+ self.assertEquals(self.textOfSelection(0), b'')
+
+ # Append '1' past current virtual space
+ self.ed.SetTargetRange(1, 1)
+ self.ed.SetTargetStartVirtualSpace(4)
+ self.ed.SetTargetEndVirtualSpace(5)
+ self.ed.ReplaceTarget(1, b'1')
+ # Virtual space of selection all converted to real positions
+ self.assertEquals(self.selectionRepresentation(0), "3-4")
+ self.assertEquals(self.ed.Contents(), b'a 1')
+ self.assertEquals(self.textOfSelection(0), b' ')
+
class TestModalSelection(unittest.TestCase):