X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTField.java;h=c93cecbcbf97670babe1d07d26508498467a3030;hb=eb29bbb5ec70c43895dd0f053630c7e3cd402cba;hp=fbe726bc04ca2f1d68a38155569890a2780166e3;hpb=a2018e9964f6c58742cd1e6dd0a0c63e244a89d6;p=fanfix.git diff --git a/src/jexer/TField.java b/src/jexer/TField.java index fbe726b..c93cecb 100644 --- a/src/jexer/TField.java +++ b/src/jexer/TField.java @@ -218,7 +218,8 @@ public class TField extends TWidget { } /** - * Update the cursor position. + * Update the visible cursor position to match the location of position + * and windowStart. */ protected void updateCursor() { if ((position > getWidth()) && fixed) { @@ -230,6 +231,23 @@ public class TField extends TWidget { } } + /** + * Normalize windowStart such that most of the field data if visible. + */ + protected void normalizeWindowStart() { + if (fixed) { + // windowStart had better be zero, there is nothing to do here. + assert (windowStart == 0); + return; + } + windowStart = position - (getWidth() - 1); + if (windowStart < 0) { + windowStart = 0; + } + + updateCursor(); + } + /** * Handle mouse button presses. * @@ -268,6 +286,7 @@ public class TField extends TWidget { windowStart--; } } + normalizeWindowStart(); return; } @@ -297,23 +316,12 @@ public class TField extends TWidget { return; } if (keypress.equals(kbHome)) { - position = 0; - windowStart = 0; + home(); return; } if (keypress.equals(kbEnd)) { - position = text.length(); - if (fixed == true) { - if (position >= getWidth()) { - position = text.length() - 1; - } - } else { - windowStart = text.length() - getWidth() + 1; - if (windowStart < 0) { - windowStart = 0; - } - } + end(); return; } @@ -322,6 +330,7 @@ public class TField extends TWidget { text = text.substring(0, position) + text.substring(position + 1); } + dispatch(false); return; } @@ -339,6 +348,7 @@ public class TField extends TWidget { } } dispatch(false); + normalizeWindowStart(); return; } @@ -446,4 +456,48 @@ public class TField extends TWidget { } } + /** + * Position the cursor at the first column. The field may adjust the + * window start to show as much of the field as possible. + */ + public void home() { + position = 0; + windowStart = 0; + } + + /** + * Set the editing position to the last filled character. The field may + * adjust the window start to show as much of the field as possible. + */ + public void end() { + position = text.length(); + if (fixed == true) { + if (position >= getWidth()) { + position = text.length() - 1; + } + } else { + windowStart = text.length() - getWidth() + 1; + if (windowStart < 0) { + windowStart = 0; + } + } + } + + /** + * Set the editing position. The field may adjust the window start to + * show as much of the field as possible. + * + * @param position the new position + * @throws IndexOutOfBoundsException if position is outside the range of + * the available text + */ + public void setPosition(final int position) { + if ((position < 0) || (position >= text.length())) { + throw new IndexOutOfBoundsException("Max length is " + + text.length() + ", requested position " + position); + } + this.position = position; + normalizeWindowStart(); + } + }