From 8d3480c7b92b79c8e774261fd6a8fe719286cf67 Mon Sep 17 00:00:00 2001 From: Kevin Lamonte Date: Fri, 8 Nov 2019 15:31:37 -0600 Subject: [PATCH] #66 fix bounds on selection and deletion --- src/jexer/TEditorWidget.java | 95 +++++++++++++++++++++------- src/jexer/backend/LogicalScreen.java | 16 ++--- 2 files changed, 80 insertions(+), 31 deletions(-) diff --git a/src/jexer/TEditorWidget.java b/src/jexer/TEditorWidget.java index a329dfa3..290fa361 100644 --- a/src/jexer/TEditorWidget.java +++ b/src/jexer/TEditorWidget.java @@ -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; diff --git a/src/jexer/backend/LogicalScreen.java b/src/jexer/backend/LogicalScreen.java index 46776fb2..22b7e95f 100644 --- a/src/jexer/backend/LogicalScreen.java +++ b/src/jexer/backend/LogicalScreen.java @@ -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; -- 2.27.0