*
* The MIT License (MIT)
*
- * Copyright (C) 2017 Kevin Lamonte
+ * Copyright (C) 2019 Kevin Lamonte
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
*/
public class TEditorWidget extends TWidget {
+ // ------------------------------------------------------------------------
+ // Constants --------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* The number of lines to scroll on mouse wheel up/down.
*/
private static final int wheelScrollSize = 3;
+ // ------------------------------------------------------------------------
+ // Variables --------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* The document being edited.
*/
*/
private int leftColumn = 0;
+ // ------------------------------------------------------------------------
+ // Constructors -----------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Public constructor.
*
document = new Document(text, defaultColor);
}
+ // ------------------------------------------------------------------------
+ // TWidget ----------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Draw the text box.
*/
super.onMouseDown(mouse);
}
- /**
- * Align visible area with document current line.
- *
- * @param topLineIsTop if true, make the top visible line the document
- * current line if it was off-screen. If false, make the bottom visible
- * line the document current line.
- */
- private void alignTopLine(final boolean topLineIsTop) {
- int line = document.getLineNumber();
-
- if ((line < topLine) || (line > topLine + getHeight() - 1)) {
- // 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);
- }
- }
-
- /*
- System.err.println("line " + line + " topLine " + topLine);
- */
-
- // Document is in view, let's set cursorY
- assert (line >= topLine);
- setCursorY(line - topLine);
- alignCursor();
- }
-
- /**
- * Align document current line with visible area.
- *
- * @param topLineIsTop if true, make the top visible line the document
- * current line if it was off-screen. If false, make the bottom visible
- * line the document current line.
- */
- 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.
- if (topLineIsTop) {
- document.setLineNumber(topLine);
- } else {
- document.setLineNumber(topLine + (getHeight() - 1));
- }
- if (cursor < document.getCurrentLine().getDisplayLength()) {
- document.setCursor(cursor);
- }
- }
-
- /*
- System.err.println("getLineNumber() " + document.getLineNumber() +
- " topLine " + topLine);
- */
-
- // Document is in view, let's set cursorY
- setCursorY(document.getLineNumber() - topLine);
- alignCursor();
- }
-
- /**
- * Align visible cursor with document cursor.
- */
- private void alignCursor() {
- int width = getWidth();
-
- int desiredX = document.getCursor() - leftColumn;
- if (desiredX < 0) {
- // We need to push the screen to the left.
- leftColumn = document.getCursor();
- } else if (desiredX > width - 1) {
- // We need to push the screen to the right.
- leftColumn = document.getCursor() - (width - 1);
- }
-
- /*
- System.err.println("document cursor " + document.getCursor() +
- " leftColumn " + leftColumn);
- */
-
-
- setCursorX(document.getCursor() - leftColumn);
- }
-
/**
* Handle keystrokes.
*
} else if (keypress.equals(kbRight)) {
document.right();
alignTopLine(true);
+ } else if (keypress.equals(kbAltLeft)
+ || keypress.equals(kbCtrlLeft)
+ ) {
+ document.backwardsWord();
+ alignTopLine(false);
+ } else if (keypress.equals(kbAltRight)
+ || keypress.equals(kbCtrlRight)
+ ) {
+ document.forwardsWord();
+ alignTopLine(true);
} else if (keypress.equals(kbUp)) {
document.up();
alignTopLine(false);
} else if (keypress.equals(kbDel)) {
document.del();
alignCursor();
- } else if (keypress.equals(kbBackspace)) {
+ } else if (keypress.equals(kbBackspace)
+ || keypress.equals(kbBackspaceDel)
+ ) {
document.backspace();
alignTopLine(false);
} else if (keypress.equals(kbTab)) {
&& !keypress.getKey().isCtrl()
) {
// Plain old keystroke, process it
+ // TODO: fix document to use ints, not chars
document.addChar(keypress.getKey().getChar());
alignCursor();
} else {
}
}
+ // ------------------------------------------------------------------------
+ // TEditorWidget ----------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Align visible area with document current line.
+ *
+ * @param topLineIsTop if true, make the top visible line the document
+ * current line if it was off-screen. If false, make the bottom visible
+ * line the document current line.
+ */
+ private void alignTopLine(final boolean topLineIsTop) {
+ int line = document.getLineNumber();
+
+ if ((line < topLine) || (line > topLine + getHeight() - 1)) {
+ // 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);
+ }
+ }
+
+ /*
+ System.err.println("line " + line + " topLine " + topLine);
+ */
+
+ // Document is in view, let's set cursorY
+ assert (line >= topLine);
+ setCursorY(line - topLine);
+ alignCursor();
+ }
+
+ /**
+ * Align document current line with visible area.
+ *
+ * @param topLineIsTop if true, make the top visible line the document
+ * current line if it was off-screen. If false, make the bottom visible
+ * line the document current line.
+ */
+ 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.
+ if (topLineIsTop) {
+ document.setLineNumber(topLine);
+ } else {
+ document.setLineNumber(topLine + (getHeight() - 1));
+ }
+ if (cursor < document.getCurrentLine().getDisplayLength()) {
+ document.setCursor(cursor);
+ }
+ }
+
+ /*
+ System.err.println("getLineNumber() " + document.getLineNumber() +
+ " topLine " + topLine);
+ */
+
+ // Document is in view, let's set cursorY
+ setCursorY(document.getLineNumber() - topLine);
+ alignCursor();
+ }
+
+ /**
+ * Align visible cursor with document cursor.
+ */
+ private void alignCursor() {
+ int width = getWidth();
+
+ int desiredX = document.getCursor() - leftColumn;
+ if (desiredX < 0) {
+ // We need to push the screen to the left.
+ leftColumn = document.getCursor();
+ } else if (desiredX > width - 1) {
+ // We need to push the screen to the right.
+ leftColumn = document.getCursor() - (width - 1);
+ }
+
+ /*
+ System.err.println("document cursor " + document.getCursor() +
+ " leftColumn " + leftColumn);
+ */
+
+
+ setCursorX(document.getCursor() - leftColumn);
+ }
+
/**
* Get the number of lines in the underlying Document.
*