From 2d3f60d832e59424fa5159b1a2d68e7a8eccae33 Mon Sep 17 00:00:00 2001 From: Kevin Lamonte Date: Wed, 14 Aug 2019 20:31:27 -0500 Subject: [PATCH] #35 editor wip --- src/jexer/TEditorWidget.java | 2 +- src/jexer/teditor/Document.java | 2 +- src/jexer/teditor/Highlighter.java | 8 ++++--- src/jexer/teditor/Line.java | 35 ++++++++++++++++++++---------- src/jexer/teditor/Word.java | 15 +++++++------ 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/jexer/TEditorWidget.java b/src/jexer/TEditorWidget.java index 204b575..32263de 100644 --- a/src/jexer/TEditorWidget.java +++ b/src/jexer/TEditorWidget.java @@ -266,7 +266,7 @@ public class TEditorWidget extends TWidget { ) { // Plain old keystroke, process it // TODO: fix document to use ints, not chars - document.addChar((char) keypress.getKey().getChar()); + document.addChar(keypress.getKey().getChar()); alignCursor(); } else { // Pass other keys (tab etc.) on to TWidget diff --git a/src/jexer/teditor/Document.java b/src/jexer/teditor/Document.java index 9b04538..159a95f 100644 --- a/src/jexer/teditor/Document.java +++ b/src/jexer/teditor/Document.java @@ -430,7 +430,7 @@ public class Document { * * @param ch the character to replace or insert */ - public void addChar(final char ch) { + public void addChar(final int ch) { dirty = true; if (overwrite) { lines.get(lineNumber).replaceChar(ch); diff --git a/src/jexer/teditor/Highlighter.java b/src/jexer/teditor/Highlighter.java index 4f60155..a484194 100644 --- a/src/jexer/teditor/Highlighter.java +++ b/src/jexer/teditor/Highlighter.java @@ -69,11 +69,13 @@ public class Highlighter { * @param ch the character * @return true if the word should be split */ - public boolean shouldSplit(final char ch) { + public boolean shouldSplit(final int ch) { // For now, split on punctuation String punctuation = "'\"\\<>{}[]!@#$%^&*();:.,-+/*?"; - if (punctuation.indexOf(ch) != -1) { - return true; + if (ch < 0x100) { + if (punctuation.indexOf((char) ch) != -1) { + return true; + } } return false; } diff --git a/src/jexer/teditor/Line.java b/src/jexer/teditor/Line.java index 965c38f..345cfcd 100644 --- a/src/jexer/teditor/Line.java +++ b/src/jexer/teditor/Line.java @@ -32,6 +32,7 @@ import java.util.ArrayList; import java.util.List; import jexer.bits.CellAttributes; +import jexer.bits.StringUtils; /** * A Line represents a single line of text on the screen, as a collection of @@ -145,7 +146,7 @@ public class Line { * @return the number of cells needed to display this line */ public int getDisplayLength() { - int n = rawText.length(); + int n = StringUtils.width(rawText.toString()); // For now just return the raw text length. if (n > 0) { @@ -172,8 +173,9 @@ public class Line { words.clear(); Word word = new Word(this.defaultColor, this.highlighter); words.add(word); - for (int i = 0; i < rawText.length(); i++) { - char ch = rawText.charAt(i); + for (int i = 0; i < rawText.length();) { + int ch = rawText.codePointAt(i); + i += Character.charCount(ch); Word newWord = word.addChar(ch); if (newWord != word) { words.add(newWord); @@ -194,7 +196,7 @@ public class Line { if (cursor == 0) { return false; } - cursor--; + cursor -= StringUtils.width(rawText.codePointAt(cursor - 1)); return true; } @@ -210,7 +212,11 @@ public class Line { if (cursor == getDisplayLength() - 1) { return false; } - cursor++; + if (cursor < getDisplayLength()) { + cursor += StringUtils.width(rawText.codePointAt(cursor)); + } else { + cursor++; + } return true; } @@ -250,7 +256,9 @@ public class Line { assert (words.size() > 0); if (cursor < getDisplayLength()) { - rawText.deleteCharAt(cursor); + for (int i = 0; i < Character.charCount(rawText.charAt(cursor)); i++) { + rawText.deleteCharAt(cursor); + } } // Re-scan the line to determine the new word boundaries. @@ -271,11 +279,11 @@ public class Line { * * @param ch the character to insert */ - public void addChar(final char ch) { + public void addChar(final int ch) { if (cursor < getDisplayLength() - 1) { - rawText.insert(cursor, ch); + rawText.insert(cursor, Character.toChars(ch)); } else { - rawText.append(ch); + rawText.append(Character.toChars(ch)); } scanLine(); cursor++; @@ -286,11 +294,14 @@ public class Line { * * @param ch the character to replace */ - public void replaceChar(final char ch) { + public void replaceChar(final int ch) { if (cursor < getDisplayLength() - 1) { - rawText.setCharAt(cursor, ch); + for (int i = 0; i < Character.charCount(rawText.charAt(cursor)); i++) { + rawText.deleteCharAt(cursor); + } + rawText.insert(cursor, Character.toChars(ch)); } else { - rawText.append(ch); + rawText.append(Character.toChars(ch)); } scanLine(); cursor++; diff --git a/src/jexer/teditor/Word.java b/src/jexer/teditor/Word.java index ffb11aa..eada29c 100644 --- a/src/jexer/teditor/Word.java +++ b/src/jexer/teditor/Word.java @@ -29,6 +29,7 @@ package jexer.teditor; import jexer.bits.CellAttributes; +import jexer.bits.StringUtils; /** * A Word represents text that was entered by the user. It can be either @@ -76,12 +77,12 @@ public class Word { * @param defaultColor the color for unhighlighted text * @param highlighter the highlighter to use */ - public Word(final char ch, final CellAttributes defaultColor, + public Word(final int ch, final CellAttributes defaultColor, final Highlighter highlighter) { this.defaultColor = defaultColor; this.highlighter = highlighter; - text.append(ch); + text.append(Character.toChars(ch)); } /** @@ -139,7 +140,7 @@ public class Word { // TODO: figure out how to handle the tab character. Do we have a // global tab stops list and current word position? - return text.length(); + return StringUtils.width(text.toString()); } /** @@ -184,9 +185,9 @@ public class Word { * @return either this word (if it was added), or a new word that * contains ch */ - public Word addChar(final char ch) { + public Word addChar(final int ch) { if (text.length() == 0) { - text.append(ch); + text.append(Character.toChars(ch)); return this; } @@ -205,14 +206,14 @@ public class Word { && Character.isWhitespace(ch) ) { // Adding to a whitespace word, keep at it. - text.append(ch); + text.append(Character.toChars(ch)); return this; } if (!Character.isWhitespace(text.charAt(0)) && !Character.isWhitespace(ch) ) { // Adding to a non-whitespace word, keep at it. - text.append(ch); + text.append(Character.toChars(ch)); return this; } -- 2.27.0