/**
* A Word represents text that was entered by the user. It can be either
* whitespace or non-whitespace.
+ *
+ * Very dumb highlighting is supported, it has no sense of parsing (not even
+ * comments). For now this only highlights some Java keywords and
+ * puctuation.
*/
public class Word {
+ // ------------------------------------------------------------------------
+ // Variables --------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* The color to render this word as on screen.
*/
private CellAttributes color = new CellAttributes();
+ /**
+ * The default color for the TEditor class.
+ */
+ private CellAttributes defaultColor = null;
+
+ /**
+ * The text highlighter to use.
+ */
+ private Highlighter highlighter = null;
+
/**
* The actual text of this word. Average word length is 6 characters,
* with a lot of shorter ones, so start with 3.
*/
private StringBuilder text = new StringBuilder(3);
+ // ------------------------------------------------------------------------
+ // Constructors -----------------------------------------------------------
+ // ------------------------------------------------------------------------
+
+ /**
+ * Construct a word with one character.
+ *
+ * @param ch the first character of the word
+ * @param defaultColor the color for unhighlighted text
+ * @param highlighter the highlighter to use
+ */
+ public Word(final char ch, final CellAttributes defaultColor,
+ final Highlighter highlighter) {
+
+ this.defaultColor = defaultColor;
+ this.highlighter = highlighter;
+ text.append(ch);
+ }
+
+ /**
+ * Construct a word with an empty string.
+ *
+ * @param defaultColor the color for unhighlighted text
+ * @param highlighter the highlighter to use
+ */
+ public Word(final CellAttributes defaultColor,
+ final Highlighter highlighter) {
+
+ this.defaultColor = defaultColor;
+ this.highlighter = highlighter;
+ }
+
+ // ------------------------------------------------------------------------
+ // Word -------------------------------------------------------------------
+ // ------------------------------------------------------------------------
+
/**
* Get the color used to display this word on screen.
*
}
/**
- * Construct a word with one character.
- *
- * @param ch the first character of the word
+ * Perform highlighting.
*/
- public Word(final char ch) {
- text.append(ch);
+ public void applyHighlight() {
+ color.setTo(defaultColor);
+ if (highlighter == null) {
+ return;
+ }
+ String key = text.toString();
+ CellAttributes newColor = highlighter.getColor(key);
+ if (newColor != null) {
+ color.setTo(newColor);
+ }
}
- /**
- * Construct a word with an empty string.
- */
- public Word() {}
-
/**
* Add a character to this word. If this is a whitespace character
* adding to a non-whitespace word, create a new word and return that;
* similarly if this a non-whitespace character adding to a whitespace
- * word, create a new word and return that.
+ * word, create a new word and return that. Note package private access:
+ * this is only called by Line to figure out highlighting boundaries.
*
* @param ch the new character to add
* @return either this word (if it was added), or a new word that
text.append(ch);
return this;
}
+
+ // Give the highlighter the option to split here.
+ if (highlighter != null) {
+ if (highlighter.shouldSplit(ch)
+ || highlighter.shouldSplit(text.charAt(0))
+ ) {
+ Word newWord = new Word(ch, defaultColor, highlighter);
+ return newWord;
+ }
+ }
+
+ // Highlighter didn't care, so split at whitespace.
if (Character.isWhitespace(text.charAt(0))
&& Character.isWhitespace(ch)
) {
+ // Adding to a whitespace word, keep at it.
text.append(ch);
return this;
}
if (!Character.isWhitespace(text.charAt(0))
&& !Character.isWhitespace(ch)
) {
+ // Adding to a non-whitespace word, keep at it.
text.append(ch);
return this;
}
- // We will be splitting here.
- Word newWord = new Word(ch);
+ // Switching from whitespace to non-whitespace or vice versa, so
+ // split here.
+ Word newWord = new Word(ch, defaultColor, highlighter);
return newWord;
}