String newText = oldText.substring(0, lineEnd) + lineDelimiter;
doc.replace(offset, length, newText);
- if (offset + length <= cursorOffset) {
- if (oldText.length() != newText.length()) {
- cursorOffset -= oldText.length() - newText.length();
+// if (offset + length <= cursorOffset) {
+// if (oldText.length() != newText.length()) {
+// cursorOffset -= oldText.length() - newText.length();
+// }
+// } else if (offset <= cursorOffset + selectionLength
+// && selectionLength > 0) {
+// selectionLength -= oldText.length() - newText.length();
+// } else if (offset + length == cursorOffset + 2) {
+// // Check if the cursor is at the end of the line.
+// cursorOffset -= 2;
+// }
+
+ int oldEndOffset = offset + length - lineDelimiter.length();
+ int newEndOffset = offset + lineEnd;
+
+ if (cursorOffset >= oldEndOffset) {
+ cursorOffset -= oldText.length() - newText.length();
+ } else if (cursorOffset >= newEndOffset) {
+ cursorOffset = newEndOffset;
+ }
+ if (selectionLength > 0) {
+ int selectionEndOffset = cursorOffset + selectionLength;
+ if (selectionEndOffset >= oldEndOffset) {
+ if (cursorOffset <= newEndOffset) {
+ // full overlap
+ selectionLength -= oldText.length() - newText.length();
+ } else {
+ // starts inside
+ selectionLength -= oldEndOffset - cursorOffset;
+ }
+ } else if (selectionEndOffset >= newEndOffset) {
+ if (cursorOffset <= newEndOffset) {
+ // ends inside
+ selectionLength -= selectionEndOffset - newEndOffset;
+ } else {
+ // full inside
+ selectionLength = 0;
+ }
}
- } else if (offset <= cursorOffset + selectionLength
- && selectionLength > 0) {
- selectionLength -= oldText.length() - newText.length();
- } else if (offset + length == cursorOffset + 2) {
- // Check if the cursor is at the end of the line.
- cursorOffset -= 2;
}
}
currentLine++;