X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTEditorWidget.java;h=5ab7a239f76721fac9b2bd91ac3125a743dc4154;hb=051e29138b18fb4b731a72f8727475b10e4c74e4;hp=cf4d887fd3cba5525637f406e4b776e517950d54;hpb=71a389c9810382e014682dde52e94d3f34e385fa;p=fanfix.git diff --git a/src/jexer/TEditorWidget.java b/src/jexer/TEditorWidget.java index cf4d887..5ab7a23 100644 --- a/src/jexer/TEditorWidget.java +++ b/src/jexer/TEditorWidget.java @@ -43,7 +43,12 @@ import static jexer.TKeypress.*; * TEditorWidget displays an editable text document. It is unaware of * scrolling behavior, but can respond to mouse and keyboard events. */ -public final class TEditorWidget extends TWidget { +public class TEditorWidget extends TWidget { + + /** + * The number of lines to scroll on mouse wheel up/down. + */ + private static final int wheelScrollSize = 3; /** * The document being edited. @@ -112,7 +117,6 @@ public final class TEditorWidget extends TWidget { } } } - } /** @@ -123,16 +127,20 @@ public final class TEditorWidget extends TWidget { @Override public void onMouseDown(final TMouseEvent mouse) { if (mouse.isMouseWheelUp()) { - if (topLine > 0) { - topLine--; - alignDocument(false); + for (int i = 0; i < wheelScrollSize; i++) { + if (topLine > 0) { + topLine--; + alignDocument(false); + } } return; } if (mouse.isMouseWheelDown()) { - if (topLine < document.getLineCount() - 1) { - topLine++; - alignDocument(true); + for (int i = 0; i < wheelScrollSize; i++) { + if (topLine < document.getLineCount() - 1) { + topLine++; + alignDocument(true); + } } return; } @@ -141,14 +149,14 @@ public final class TEditorWidget extends TWidget { // Set the row and column int newLine = topLine + mouse.getY(); int newX = leftColumn + mouse.getX(); - if (newLine > document.getLineCount()) { + if (newLine > document.getLineCount() - 1) { // Go to the end document.setLineNumber(document.getLineCount() - 1); document.end(); - if (document.getLineCount() > getHeight()) { - setCursorY(getHeight() - 1); + if (newLine > document.getLineCount() - 1) { + setCursorY(document.getLineCount() - 1 - topLine); } else { - setCursorY(document.getLineCount() - 1); + setCursorY(mouse.getY()); } alignCursor(); return; @@ -160,6 +168,7 @@ public final class TEditorWidget extends TWidget { document.end(); alignCursor(); } else { + document.setCursor(newX); setCursorX(mouse.getX()); } return; @@ -183,8 +192,13 @@ public final class TEditorWidget extends TWidget { // Need to move topLine to bring document back into view. if (topLineIsTop) { topLine = line - (getHeight() - 1); + if (topLine < 0) { + topLine = 0; + } + assert (topLine >= 0); } else { topLine = line; + assert (topLine >= 0); } } @@ -193,6 +207,7 @@ public final class TEditorWidget extends TWidget { */ // Document is in view, let's set cursorY + assert (line >= topLine); setCursorY(line - topLine); alignCursor(); } @@ -206,6 +221,7 @@ public final class TEditorWidget extends TWidget { */ private void alignDocument(final boolean topLineIsTop) { int line = document.getLineNumber(); + int cursor = document.getCursor(); if ((line < topLine) || (line > topLine + getHeight() - 1)) { // Need to move document to ensure it fits view. @@ -214,6 +230,9 @@ public final class TEditorWidget extends TWidget { } else { document.setLineNumber(topLine + (getHeight() - 1)); } + if (cursor < document.getCurrentLine().getDisplayLength()) { + document.setCursor(cursor); + } } /* @@ -244,7 +263,8 @@ public final class TEditorWidget extends TWidget { /* System.err.println("document cursor " + document.getCursor() + " leftColumn " + leftColumn); - */ + */ + setCursorX(document.getCursor() - leftColumn); } @@ -257,13 +277,11 @@ public final class TEditorWidget extends TWidget { @Override public void onKeypress(final TKeypressEvent keypress) { if (keypress.equals(kbLeft)) { - if (document.left()) { - alignCursor(); - } + document.left(); + alignTopLine(false); } else if (keypress.equals(kbRight)) { - if (document.right()) { - alignCursor(); - } + document.right(); + alignTopLine(true); } else if (keypress.equals(kbUp)) { document.up(); alignTopLine(false); @@ -302,14 +320,21 @@ public final class TEditorWidget extends TWidget { } else if (keypress.equals(kbIns)) { document.setOverwrite(!document.getOverwrite()); } else if (keypress.equals(kbDel)) { - // TODO: join lines document.del(); alignCursor(); } else if (keypress.equals(kbBackspace)) { document.backspace(); + alignTopLine(false); + } else if (keypress.equals(kbTab)) { + // TODO: tab character. For now just add spaces until we hit + // modulo 8. + for (int i = document.getCursor(); (i + 1) % 8 != 0; i++) { + document.addChar(' '); + } alignCursor(); } else if (keypress.equals(kbEnter)) { - // TODO: split lines + document.enter(); + alignTopLine(true); } else if (!keypress.getKey().isFnKey() && !keypress.getKey().isAlt() && !keypress.getKey().isCtrl() @@ -360,6 +385,28 @@ public final class TEditorWidget extends TWidget { return document.getLineCount(); } + /** + * Get the current visible top row number. 1-based. + * + * @return the visible top row number. Row 1 is the first row. + */ + public int getVisibleRowNumber() { + return topLine + 1; + } + + /** + * Set the current visible row number. 1-based. + * + * @param row the new visible row number. Row 1 is the first row. + */ + public void setVisibleRowNumber(final int row) { + assert (row > 0); + if ((row > 0) && (row < document.getLineCount())) { + topLine = row - 1; + alignDocument(true); + } + } + /** * Get the current editing row number. 1-based. * @@ -375,7 +422,11 @@ public final class TEditorWidget extends TWidget { * @param row the new editing row number. Row 1 is the first row. */ public void setEditingRowNumber(final int row) { - document.setLineNumber(row - 1); + assert (row > 0); + if ((row > 0) && (row < document.getLineCount())) { + document.setLineNumber(row - 1); + alignTopLine(true); + } } /** @@ -394,7 +445,10 @@ public final class TEditorWidget extends TWidget { * column. */ public void setEditingColumnNumber(final int column) { - document.setCursor(column - 1); + if ((column > 0) && (column < document.getLineLength())) { + document.setCursor(column - 1); + alignCursor(); + } } /**