#66 fix bounds on selection and deletion
authorKevin Lamonte <kevin.lamonte@gmail.com>
Fri, 8 Nov 2019 21:31:37 +0000 (15:31 -0600)
committerKevin Lamonte <kevin.lamonte@gmail.com>
Fri, 8 Nov 2019 21:31:37 +0000 (15:31 -0600)
src/jexer/TEditorWidget.java
src/jexer/backend/LogicalScreen.java

index a329dfa347b770dcb279140a1c5ef170f72aab64..290fa361824ba1e03a3744c86524655076c6c477 100644 (file)
@@ -221,21 +221,25 @@ public class TEditorWidget extends TWidget implements EditMenuUser {
     public void onMouseMotion(final TMouseEvent mouse) {
 
         if (mouse.isMouse1()) {
+            // Set the row and column
+            int newLine = topLine + mouse.getY();
+            int newX = leftColumn + mouse.getX();
+            if ((newLine < 0) || (newX < 0)) {
+                return;
+            }
+
             // Selection.
             if (inSelection) {
-                selectionColumn1 = leftColumn + mouse.getX();
-                selectionLine1 = topLine + mouse.getY();
+                selectionColumn1 = newX;
+                selectionLine1 = newLine;
             } else {
                 inSelection = true;
-                selectionColumn0 = leftColumn + mouse.getX();
-                selectionLine0 = topLine + mouse.getY();
+                selectionColumn0 = newX;
+                selectionLine0 = newLine;
                 selectionColumn1 = selectionColumn0;
                 selectionLine1 = selectionLine0;
             }
 
-            // Set the row and column
-            int newLine = topLine + mouse.getY();
-            int newX = leftColumn + mouse.getX();
             if (newLine > document.getLineCount() - 1) {
                 // Go to the end
                 document.setLineNumber(document.getLineCount() - 1);
@@ -252,7 +256,6 @@ public class TEditorWidget extends TWidget implements EditMenuUser {
                 }
                 return;
             }
-
             document.setLineNumber(newLine);
             setCursorY(mouse.getY());
             if (newX >= document.getCurrentLine().getDisplayLength()) {
@@ -516,12 +519,11 @@ public class TEditorWidget extends TWidget implements EditMenuUser {
         int endRow = selectionLine1;
 
         if (((selectionColumn1 < selectionColumn0)
-                && (selectionLine1 <= selectionLine0))
-            || ((selectionColumn1 <= selectionColumn0)
-                && (selectionLine1 < selectionLine0))
+                && (selectionLine1 == selectionLine0))
+            || (selectionLine1 < selectionLine0)
         ) {
-            // The user selected from bottom-right to top-left.  Reverse the
-            // coordinates for the inverted section.
+            // The user selected from bottom-to-top and/or right-to-left.
+            // Reverse the coordinates for the inverted section.
             startCol = selectionColumn1;
             startRow = selectionLine1;
             endCol = selectionColumn0;
@@ -822,26 +824,74 @@ public class TEditorWidget extends TWidget implements EditMenuUser {
         int endCol = selectionColumn1;
         int endRow = selectionLine1;
 
+        /*
+        System.err.println("INITIAL: " + startRow + " " + startCol + " " +
+            endRow + " " + endCol + " " +
+            document.getLineNumber() + " " + document.getCursor());
+         */
+
         if (((selectionColumn1 < selectionColumn0)
-                && (selectionLine1 <= selectionLine0))
-            || ((selectionColumn1 <= selectionColumn0)
-                && (selectionLine1 < selectionLine0))
+                && (selectionLine1 == selectionLine0))
+            || (selectionLine1 < selectionLine0)
         ) {
-            // The user selected from bottom-right to top-left.  Reverse the
-            // coordinates for the inverted section.
+            // The user selected from bottom-to-top and/or right-to-left.
+            // Reverse the coordinates for the inverted section.
             startCol = selectionColumn1;
             startRow = selectionLine1;
             endCol = selectionColumn0;
             endRow = selectionLine0;
+
+            if (endRow >= document.getLineCount()) {
+                // The selection started beyond EOF, trim it to EOF.
+                endRow = document.getLineCount() - 1;
+                endCol = document.getLine(endRow).getDisplayLength();
+            } else if (endRow == document.getLineCount() - 1) {
+                // The selection started beyond EOF, trim it to EOF.
+                if (endCol >= document.getLine(endRow).getDisplayLength()) {
+                    endCol = document.getLine(endRow).getDisplayLength() - 1;
+                }
+            }
+        }
+        /*
+        System.err.println("FLIP: " + startRow + " " + startCol + " " +
+            endRow + " " + endCol + " " +
+            document.getLineNumber() + " " + document.getCursor());
+        System.err.println(" --END: " + endRow + " " + document.getLineCount() +
+            " " + document.getLine(endRow).getDisplayLength());
+         */
+
+        assert (endRow < document.getLineCount());
+        if (endCol >= document.getLine(endRow).getDisplayLength()) {
+            endCol = document.getLine(endRow).getDisplayLength() - 1;
+        }
+        if (endCol < 0) {
+            endCol = 0;
+        }
+        if (startCol >= document.getLine(startRow).getDisplayLength()) {
+            startCol = document.getLine(startRow).getDisplayLength() - 1;
+        }
+        if (startCol < 0) {
+            startCol = 0;
         }
 
         // Place the cursor on the selection end, and "press backspace" until
         // the cursor matches the selection start.
+        /*
+        System.err.println("BEFORE: " + startRow + " " + startCol + " " +
+            endRow + " " + endCol + " " +
+            document.getLineNumber() + " " + document.getCursor());
+         */
         document.setLineNumber(endRow);
         document.setCursor(endCol + 1);
         while (!((document.getLineNumber() == startRow)
                 && (document.getCursor() == startCol))
         ) {
+            /*
+            System.err.println("DURING: " + startRow + " " + startCol + " " +
+                endRow + " " + endCol + " " +
+                document.getLineNumber() + " " + document.getCursor());
+             */
+
             document.backspace();
         }
         alignTopLine(true);
@@ -861,12 +911,11 @@ public class TEditorWidget extends TWidget implements EditMenuUser {
         int endRow = selectionLine1;
 
         if (((selectionColumn1 < selectionColumn0)
-                && (selectionLine1 <= selectionLine0))
-            || ((selectionColumn1 <= selectionColumn0)
-                && (selectionLine1 < selectionLine0))
+                && (selectionLine1 == selectionLine0))
+            || (selectionLine1 < selectionLine0)
         ) {
-            // The user selected from bottom-right to top-left.  Reverse the
-            // coordinates for the inverted section.
+            // The user selected from bottom-to-top and/or right-to-left.
+            // Reverse the coordinates for the inverted section.
             startCol = selectionColumn1;
             startRow = selectionLine1;
             endCol = selectionColumn0;
index 46776fb2b0685ef9df5b7f3e623336e81f1dd487..22b7e95f6564aad97431ca2e60a2fec09e9d2365 100644 (file)
@@ -1122,11 +1122,11 @@ public class LogicalScreen implements Screen {
         int endX = x1;
         int endY = y1;
 
-        if (((x1 < x0) && (y1 <= y0))
-            || ((x1 <= x0) && (y1 < y0))
+        if (((x1 < x0) && (y1 == y0))
+            || (y1 < y0)
         ) {
-            // The user dragged from bottom-right to top-left.  Reverse the
-            // coordinates for the inverted section.
+            // The user dragged from bottom-to-top and/or right-to-left.
+            // Reverse the coordinates for the inverted section.
             startX = x1;
             startY = y1;
             endX = x0;
@@ -1181,11 +1181,11 @@ public class LogicalScreen implements Screen {
         int endX = x1;
         int endY = y1;
 
-        if (((x1 < x0) && (y1 <= y0))
-            || ((x1 <= x0) && (y1 < y0))
+        if (((x1 < x0) && (y1 == y0))
+            || (y1 < y0)
         ) {
-            // The user dragged from bottom-right to top-left.  Reverse the
-            // coordinates for the inverted section.
+            // The user dragged from bottom-to-top and/or right-to-left.
+            // Reverse the coordinates for the inverted section.
             startX = x1;
             startY = y1;
             endX = x0;