X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjexer%2FTField.java;h=c93cecbcbf97670babe1d07d26508498467a3030;hb=eb29bbb5ec70c43895dd0f053630c7e3cd402cba;hp=b25858476bb00fccfd2a9668aa1ba16e874c449e;hpb=e16dda65585466c8987bd1efd718431450a96605;p=fanfix.git diff --git a/src/jexer/TField.java b/src/jexer/TField.java index b258584..c93cecb 100644 --- a/src/jexer/TField.java +++ b/src/jexer/TField.java @@ -3,7 +3,7 @@ * * The MIT License (MIT) * - * Copyright (C) 2016 Kevin Lamonte + * Copyright (C) 2017 Kevin Lamonte * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -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(); + } + }