Skip to content

Commit 63b56f9

Browse files
committed
Rewrite StyledTextAreaContent as StyledTextDocument.
1 parent befe9fc commit 63b56f9

File tree

5 files changed

+236
-186
lines changed

5 files changed

+236
-186
lines changed

.classpath

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<classpath>
3-
<classpathentry kind="src" path="src/test"/>
43
<classpathentry kind="src" path="src/main/java"/>
54
<classpathentry kind="src" path="src/main/resources"/>
65
<classpathentry kind="src" path="src/demo/java"/>
76
<classpathentry kind="src" path="src/demo/resources"/>
7+
<classpathentry kind="src" path="src/test/java"/>
88
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
9+
<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
910
<classpathentry kind="output" path="build"/>
1011
</classpath>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package codearea.control;
2+
3+
import java.util.function.IntFunction;
4+
import java.util.function.Supplier;
5+
import java.util.function.ToIntFunction;
6+
7+
import javafx.beans.binding.IntegerBinding;
8+
import javafx.beans.binding.ObjectBinding;
9+
import javafx.beans.binding.StringBinding;
10+
import javafx.beans.value.ObservableIntegerValue;
11+
import javafx.beans.value.ObservableValue;
12+
13+
/**
14+
* Helper methods for creating bindings.
15+
*/
16+
class BindingFactories {
17+
18+
public static StringBinding createStringBinding(Supplier<String> computeValue) {
19+
return new StringBinding() {
20+
@Override
21+
protected String computeValue() {
22+
return computeValue.get();
23+
}
24+
25+
};
26+
}
27+
28+
public static <T> ObjectBinding<T> createBinding(ObservableIntegerValue dep, IntFunction<T> computeValue) {
29+
return new ObjectBinding<T>() {
30+
{ bind(dep); }
31+
32+
@Override
33+
protected T computeValue() {
34+
return computeValue.apply(dep.get());
35+
}
36+
};
37+
}
38+
39+
public static <A> IntegerBinding createIntegerBinding(ObservableValue<A> dep, ToIntFunction<A> computeValue) {
40+
return new IntegerBinding() {
41+
{ bind(dep); }
42+
43+
@Override
44+
protected int computeValue() {
45+
return computeValue.applyAsInt(dep.getValue());
46+
}
47+
};
48+
}
49+
50+
}

src/main/java/codearea/control/StyledTextArea.java

+17-42
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,7 @@
66
import java.util.function.BiConsumer;
77
import java.util.function.BiFunction;
88
import java.util.function.Consumer;
9-
import java.util.function.IntFunction;
10-
import java.util.function.ToIntFunction;
119

12-
import javafx.beans.binding.IntegerBinding;
13-
import javafx.beans.binding.ObjectBinding;
1410
import javafx.beans.binding.StringBinding;
1511
import javafx.beans.property.BooleanProperty;
1612
import javafx.beans.property.ReadOnlyIntegerProperty;
@@ -21,7 +17,6 @@
2117
import javafx.beans.value.ObservableIntegerValue;
2218
import javafx.beans.value.ObservableStringValue;
2319
import javafx.beans.value.ObservableValue;
24-
import javafx.collections.FXCollections;
2520
import javafx.collections.ObservableList;
2621
import javafx.css.CssMetaData;
2722
import javafx.css.Styleable;
@@ -119,12 +114,12 @@ public void setUndoManager(UndoManagerProvider<TextChange> undoManagerProvider)
119114
**************************************************************************/
120115

121116
// text
122-
@Override public final String getText() { return content.get(); }
123-
@Override public final ObservableStringValue textProperty() { return content; }
117+
@Override public final String getText() { return content.getText(); }
118+
@Override public final ObservableStringValue textProperty() { return content.textProperty(); }
124119

125120
// length
126-
@Override public final int getLength() { return content.length().get(); }
127-
@Override public final ObservableIntegerValue lengthProperty() { return content.length(); }
121+
@Override public final int getLength() { return content.getLength(); }
122+
@Override public final ObservableIntegerValue lengthProperty() { return content.lengthProperty(); }
128123

129124
// caret position
130125
private final ReadOnlyIntegerWrapper caretPosition = new ReadOnlyIntegerWrapper(this, "caretPosition", 0);
@@ -156,8 +151,9 @@ public void setUndoManager(UndoManagerProvider<TextChange> undoManagerProvider)
156151
@Override public final int getCaretColumn() { return caretColumn.get(); }
157152

158153
// paragraphs
154+
private final ObservableList<Paragraph<S>> paragraphs;
159155
@Override public ObservableList<Paragraph<S>> getParagraphs() {
160-
return FXCollections.unmodifiableObservableList(content.paragraphs);
156+
return paragraphs;
161157
}
162158

163159

@@ -181,7 +177,7 @@ public void setUndoManager(UndoManagerProvider<TextChange> undoManagerProvider)
181177
/**
182178
* content model
183179
*/
184-
private final StyledTextAreaContent<S> content;
180+
private final StyledTextDocument<S> content;
185181

186182
/**
187183
* Style used by default when no other style is provided.
@@ -212,27 +208,28 @@ public void setUndoManager(UndoManagerProvider<TextChange> undoManagerProvider)
212208
public StyledTextArea(S initialStyle, BiConsumer<Text, S> applyStyle) {
213209
this.initialStyle = initialStyle;
214210
this.applyStyle = applyStyle;
215-
content = new StyledTextAreaContent<>(initialStyle);
211+
content = new StyledTextDocument<>(initialStyle);
212+
paragraphs = content.getParagraphs();
216213

217214
undoManager = createUndoManager(defaultUndoManagerFactory);
218215

219-
ObservableValue<Position> caretPosition2D = createBinding(caretPosition, p -> content.offsetToPosition(p));
220-
currentParagraph = createIntegerBinding(caretPosition2D, p -> p.getMajor());
221-
caretColumn = createIntegerBinding(caretPosition2D, p -> p.getMinor());
216+
ObservableValue<Position> caretPosition2D = BindingFactories.createBinding(caretPosition, p -> content.offsetToPosition(p));
217+
currentParagraph = BindingFactories.createIntegerBinding(caretPosition2D, p -> p.getMajor());
218+
caretColumn = BindingFactories.createIntegerBinding(caretPosition2D, p -> p.getMinor());
222219

223220
// Keep caret position in the current paragraph up to date.
224221
caretPosition.addListener(obs -> {
225222
// by the time this listener is called, both currentParagraph and
226223
// caretColumn have been invalidated, so get()-ing them yields
227224
// up-to-date values.
228-
Paragraph<S> par = content.paragraphs.get(currentParagraph.get());
225+
Paragraph<S> par = paragraphs.get(currentParagraph.get());
229226
par.setCaretPosition(caretColumn.get());
230227
});
231228

232229
selectedText = new StringBinding() {
233230
{ bind(selection, textProperty()); }
234231
@Override protected String computeValue() {
235-
return content.get(selection.get());
232+
return content.getText(selection.get());
236233
}
237234
};
238235

@@ -250,12 +247,12 @@ public StyledTextArea(S initialStyle, BiConsumer<Text, S> applyStyle) {
250247

251248
@Override
252249
public final String getText(int start, int end) {
253-
return content.get(start, end);
250+
return content.getText(start, end);
254251
}
255252

256253
@Override
257254
public String getText(int paragraph) {
258-
return content.paragraphs.get(paragraph).toString();
255+
return paragraphs.get(paragraph).toString();
259256
}
260257

261258
/**
@@ -358,7 +355,7 @@ public void selectRange(int anchor, int caretPosition) {
358355
// update selection in paragraphs
359356
int start = selection.getStart();
360357
int end = selection.getEnd();
361-
for(Paragraph<S> par: content.paragraphs) {
358+
for(Paragraph<S> par: paragraphs) {
362359
int len = par.length();
363360
if(end > 0 && start < len) {
364361
par.setSelection(start, Math.min(end, len));
@@ -408,26 +405,4 @@ private UndoManager createUndoManager(UndoManagerProvider<TextChange> factory) {
408405
BiFunction<TextChange, TextChange, Optional<TextChange>> merge = (change1, change2) -> change1.mergeWith(change2);
409406
return factory.get(apply, undo, merge, textChanges());
410407
}
411-
412-
private static <T> ObjectBinding<T> createBinding(ObservableIntegerValue dep, IntFunction<T> computeValue) {
413-
return new ObjectBinding<T>() {
414-
{ bind(dep); }
415-
416-
@Override
417-
protected T computeValue() {
418-
return computeValue.apply(dep.get());
419-
}
420-
};
421-
}
422-
423-
private static <A> IntegerBinding createIntegerBinding(ObservableValue<A> dep, ToIntFunction<A> computeValue) {
424-
return new IntegerBinding() {
425-
{ bind(dep); }
426-
427-
@Override
428-
protected int computeValue() {
429-
return computeValue.applyAsInt(dep.getValue());
430-
}
431-
};
432-
}
433408
}

0 commit comments

Comments
 (0)