X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fjexer%2FTField.java;h=6aaf5912497659bfa3b3b07fc0ff1e64743ba0ad;hb=c348e2b5c815f5586d5b166ccdb4728b67fc5527;hp=0a99840db7f06d9aadff53e6fa11aa35520472ee;hpb=84a34fdf1e9b8c2911744c0d0c39e27108c20b76;p=fanfix.git diff --git a/src/jexer/TField.java b/src/jexer/TField.java index 0a99840..6aaf591 100644 --- a/src/jexer/TField.java +++ b/src/jexer/TField.java @@ -219,12 +219,8 @@ public class TField extends TWidget { if (keypress.equals(kbLeft)) { if (position > 0) { - if (position < text.length()) { - screenPosition -= StringUtils.width(text.codePointAt(position)); - } else { - screenPosition--; - } - position--; + screenPosition -= StringUtils.width(text.codePointBefore(position)); + position -= Character.charCount(text.codePointBefore(position)); } if (fixed == false) { if ((screenPosition == windowStart) && (windowStart > 0)) { @@ -239,19 +235,23 @@ public class TField extends TWidget { if (keypress.equals(kbRight)) { if (position < text.length()) { screenPosition += StringUtils.width(text.codePointAt(position)); - position++; + position += Character.charCount(text.codePointAt(position)); if (fixed == true) { if (screenPosition == getWidth()) { screenPosition--; - position--; + position -= Character.charCount(text.codePointAt(position)); } } else { - if ((screenPosition - windowStart) >= getWidth()) { + while ((screenPosition - windowStart + + StringUtils.width(text.codePointAt(text.length() - 1))) + > getWidth() + ) { windowStart += StringUtils.width(text.codePointAt( screenToTextPosition(windowStart))); } } } + assert (position <= text.length()); return; } @@ -286,7 +286,7 @@ public class TField extends TWidget { if (keypress.equals(kbBackspace) || keypress.equals(kbBackspaceDel)) { if (position > 0) { - position--; + position -= Character.charCount(text.codePointBefore(position)); text = text.substring(0, position) + text.substring(position + 1); screenPosition = StringUtils.width(text.substring(0, position)); @@ -416,6 +416,7 @@ public class TField extends TWidget { private String codePointString(final int ch) { StringBuilder sb = new StringBuilder(1); sb.append(Character.toChars(ch)); + assert (Character.charCount(ch) == sb.length()); return sb.toString(); } @@ -590,7 +591,7 @@ public class TField extends TWidget { screenPosition = StringUtils.width(text); if (fixed == true) { if (screenPosition >= getWidth()) { - position = text.length() - 1; + position -= Character.charCount(text.codePointBefore(position)); screenPosition = StringUtils.width(text) - 1; } } else { @@ -612,7 +613,7 @@ public class TField extends TWidget { public void setPosition(final int position) { if ((position < 0) || (position >= text.length())) { throw new IndexOutOfBoundsException("Max length is " + - StringUtils.width(text) + ", requested position " + position); + text.length() + ", requested position " + position); } this.position = position; normalizeWindowStart();