Skip to content

Commit c9918ac

Browse files
committed
Merge pull request #277 from JordanMartinez/customESD
Support custom implementations of EditableStyledDocument.
2 parents b6cfdc1 + 89af8ca commit c9918ac

9 files changed

Lines changed: 520 additions & 411 deletions

File tree

richtextfx/src/main/java/org/fxmisc/richtext/AreaFactory.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static <PS, S>VirtualizedScrollPane<StyledTextArea<PS, S>> embeddedStyled
6262
public static <PS, S> StyledTextArea<PS, S> cloneStyleTextArea(StyledTextArea<PS, S> area) {
6363
return new StyledTextArea<>(area.getInitialParagraphStyle(), area.getApplyParagraphStyle(),
6464
area.getInitialTextStyle(), area.getApplyStyle(),
65-
area.getModel().getContent(), area.isPreserveStyle());
65+
area.getContent(), area.isPreserveStyle());
6666
}
6767

6868
// Embeds cloned StyledTextArea
@@ -105,7 +105,7 @@ public static VirtualizedScrollPane<StyleClassedTextArea> embeddedStyleClassedTe
105105

106106
// Clones StyleClassedTextArea
107107
public static StyleClassedTextArea cloneStyleClassedTextArea(StyleClassedTextArea area) {
108-
return new StyleClassedTextArea(area.getModel().getContent(), area.isPreserveStyle());
108+
return new StyleClassedTextArea(area.getContent(), area.isPreserveStyle());
109109
}
110110

111111
// Embeds cloned StyleClassedTextArea
@@ -148,7 +148,7 @@ public static VirtualizedScrollPane<CodeArea> embeddedCodeArea(String text) {
148148

149149
// Clones CodeArea
150150
public static CodeArea cloneCodeArea(CodeArea area) {
151-
return new CodeArea(area.getModel().getContent());
151+
return new CodeArea(area.getContent());
152152
}
153153

154154
// Embeds a cloned CodeArea
@@ -189,7 +189,7 @@ public static VirtualizedScrollPane<InlineCssTextArea> embeddedInlineCssTextArea
189189

190190
// Clones InlineCssTextArea
191191
public static InlineCssTextArea cloneInlineCssTextArea(InlineCssTextArea area) {
192-
return new InlineCssTextArea(area.getModel().getContent());
192+
return new InlineCssTextArea(area.getContent());
193193
}
194194

195195
// Embeds a cloned InlineCssTextArea

richtextfx/src/main/java/org/fxmisc/richtext/EditableStyledDocument.java

Lines changed: 35 additions & 381 deletions
Large diffs are not rendered by default.

richtextfx/src/main/java/org/fxmisc/richtext/EditableStyledDocumentImpl.java

Lines changed: 444 additions & 0 deletions
Large diffs are not rendered by default.

richtextfx/src/main/java/org/fxmisc/richtext/InlineCssTextArea.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public class InlineCssTextArea extends StyledTextArea<String, String> {
1010

1111
public InlineCssTextArea() {
12-
this(new EditableStyledDocument<>("", ""));
12+
this(new EditableStyledDocumentImpl<>("", ""));
1313
}
1414

1515
public InlineCssTextArea(EditableStyledDocument<String, String> document) {

richtextfx/src/main/java/org/fxmisc/richtext/StyleClassedTextArea.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public StyleClassedTextArea(EditableStyledDocument<Collection<String>, Collectio
2525
}
2626
public StyleClassedTextArea(boolean preserveStyle) {
2727
this(
28-
new EditableStyledDocument<>(
28+
new EditableStyledDocumentImpl<>(
2929
Collections.<String>emptyList(), Collections.<String>emptyList()
3030
), preserveStyle);
3131
}

richtextfx/src/main/java/org/fxmisc/richtext/StyledTextArea.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -421,38 +421,49 @@ public Optional<Tuple2<Codec<PS>, Codec<S>>> getStyleCodecs() {
421421
/**
422422
* @return this area's {@link StyledTextAreaModel}
423423
*/
424-
protected final StyledTextAreaModel<PS, S> getModel() {
424+
final StyledTextAreaModel<PS, S> getModel() {
425425
return model;
426426
}
427427

428+
/* ********************************************************************** *
429+
* *
430+
* Fields necessary for Cloning *
431+
* *
432+
* ********************************************************************** */
433+
434+
/**
435+
* The underlying document that can be displayed by multiple {@code StyledTextArea}s.
436+
*/
437+
public final EditableStyledDocument<PS, S> getContent() { return model.getContent(); }
438+
428439
/**
429440
* Style used by default when no other style is provided.
430441
*/
431-
protected final S getInitialTextStyle() { return model.getInitialTextStyle(); }
442+
public final S getInitialTextStyle() { return model.getInitialTextStyle(); }
432443

433444
/**
434445
* Style used by default when no other style is provided.
435446
*/
436-
protected final PS getInitialParagraphStyle() { return model.getInitialParagraphStyle(); }
447+
public final PS getInitialParagraphStyle() { return model.getInitialParagraphStyle(); }
437448

438449
/**
439450
* Style applicator used by the default skin.
440451
*/
441452
private final BiConsumer<? super TextExt, S> applyStyle;
442-
protected final BiConsumer<? super TextExt, S> getApplyStyle() { return applyStyle; }
453+
public final BiConsumer<? super TextExt, S> getApplyStyle() { return applyStyle; }
443454

444455
/**
445456
* Style applicator used by the default skin.
446457
*/
447458
private final BiConsumer<TextFlow, PS> applyParagraphStyle;
448-
protected final BiConsumer<TextFlow, PS> getApplyParagraphStyle() { return applyParagraphStyle; }
459+
public final BiConsumer<TextFlow, PS> getApplyParagraphStyle() { return applyParagraphStyle; }
449460

450461
/**
451462
* Indicates whether style should be preserved on undo/redo,
452463
* copy/paste and text move.
453464
* TODO: Currently, only undo/redo respect this flag.
454465
*/
455-
protected final boolean isPreserveStyle() { return model.isPreserveStyle(); }
466+
public final boolean isPreserveStyle() { return model.isPreserveStyle(); }
456467

457468
/* ********************************************************************** *
458469
* *
@@ -485,7 +496,7 @@ public StyledTextArea(PS initialParagraphStyle, BiConsumer<TextFlow, PS> applyPa
485496
boolean preserveStyle
486497
) {
487498
this(initialParagraphStyle, applyParagraphStyle, initialTextStyle, applyStyle,
488-
new EditableStyledDocument<>(initialParagraphStyle, initialTextStyle), preserveStyle);
499+
new EditableStyledDocumentImpl<>(initialParagraphStyle, initialTextStyle), preserveStyle);
489500
}
490501

491502
/**

richtextfx/src/main/java/org/fxmisc/richtext/StyledTextAreaModel.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private static int clamp(int min, int val, int max) {
170170

171171
/* ********************************************************************** *
172172
* *
173-
* Private fields *
173+
* Private & Package-Private fields *
174174
* *
175175
* ********************************************************************** */
176176

@@ -189,27 +189,27 @@ private static int clamp(int min, int val, int max) {
189189
* the same document (Model).
190190
* @return this area's {@link EditableStyledDocument}
191191
*/
192-
protected final EditableStyledDocument<PS, S> getContent() { return content; }
192+
final EditableStyledDocument<PS, S> getContent() { return content; }
193193

194194
/**
195195
* Style used by default when no other style is provided.
196196
*/
197197
private final S initialTextStyle;
198-
protected final S getInitialTextStyle() { return initialTextStyle; }
198+
final S getInitialTextStyle() { return initialTextStyle; }
199199

200200
/**
201201
* Style used by default when no other style is provided.
202202
*/
203203
private final PS initialParagraphStyle;
204-
protected final PS getInitialParagraphStyle() { return initialParagraphStyle; }
204+
final PS getInitialParagraphStyle() { return initialParagraphStyle; }
205205

206206
/**
207207
* Indicates whether style should be preserved on undo/redo,
208208
* copy/paste and text move.
209209
* TODO: Currently, only undo/redo respect this flag.
210210
*/
211211
private final boolean preserveStyle;
212-
protected final boolean isPreserveStyle() { return preserveStyle; }
212+
final boolean isPreserveStyle() { return preserveStyle; }
213213

214214

215215
/* ********************************************************************** *
@@ -233,7 +233,7 @@ public StyledTextAreaModel(PS initialParagraphStyle, S initialTextStyle) {
233233
public StyledTextAreaModel(PS initialParagraphStyle, S initialTextStyle, boolean preserveStyle
234234
) {
235235
this(initialParagraphStyle, initialTextStyle,
236-
new EditableStyledDocument<>(initialParagraphStyle, initialTextStyle), preserveStyle);
236+
new EditableStyledDocumentImpl<>(initialParagraphStyle, initialTextStyle), preserveStyle);
237237
}
238238

239239
/**
@@ -259,13 +259,13 @@ public StyledTextAreaModel(PS initialParagraphStyle, S initialTextStyle,
259259

260260
text = Val.suspendable(content.textProperty());
261261
length = Val.suspendable(content.lengthProperty());
262-
plainTextChanges = content.plainTextChanges().pausable();
262+
plainTextChanges = content.plainChanges().pausable();
263263
richTextChanges = content.richChanges().pausable();
264264

265265
// when content is updated by an area, update the caret
266266
// and selection ranges of all the other
267267
// clones that also share this document
268-
subscribeTo(content.plainTextChanges(), plainTextChange -> {
268+
subscribeTo(content.plainChanges(), plainTextChange -> {
269269
int changeLength = plainTextChange.getInserted().length() - plainTextChange.getRemoved().length();
270270
if (changeLength != 0) {
271271
int indexOfChange = plainTextChange.getPosition();

richtextfx/src/test/java/org/fxmisc/richtext/EditableStyledDocumentTest.java renamed to richtextfx/src/test/java/org/fxmisc/richtext/EditableStyledDocumentImplTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
import org.junit.Test;
66

7-
public class EditableStyledDocumentTest {
7+
public class EditableStyledDocumentImplTest {
88

99
@Test
1010
public void testConsistencyOfTextWithLength() {
11-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
11+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
1212
document.getText(); // enforce evaluation of text property
1313
document.getLength(); // enforce evaluation of length property
1414

@@ -23,7 +23,7 @@ public void testConsistencyOfTextWithLength() {
2323

2424
@Test
2525
public void testConsistencyOfLengthWithText() {
26-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
26+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
2727
document.getText(); // enforce evaluation of text property
2828
document.getLength(); // enforce evaluation of length property
2929

@@ -38,31 +38,31 @@ public void testConsistencyOfLengthWithText() {
3838

3939
@Test
4040
public void testUnixParagraphCount() {
41-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
41+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
4242
String text = "X\nY";
4343
document.replaceText(0, 0, text);
4444
assertEquals(2, document.getParagraphs().size());
4545
}
4646

4747
@Test
4848
public void testMacParagraphCount() {
49-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
49+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
5050
String text = "X\rY";
5151
document.replaceText(0, 0, text);
5252
assertEquals(2, document.getParagraphs().size());
5353
}
5454

5555
@Test
5656
public void testWinParagraphCount() {
57-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
57+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
5858
String text = "X\r\nY";
5959
document.replaceText(0, 0, text);
6060
assertEquals(2, document.getParagraphs().size());
6161
}
6262

6363
@Test
6464
public void testGetTextWithEndAfterNewline() {
65-
EditableStyledDocument<Boolean, String> doc = new EditableStyledDocument<>(true, "");
65+
EditableStyledDocumentImpl<Boolean, String> doc = new EditableStyledDocumentImpl<>(true, "");
6666

6767
doc.replaceText(0, 0, "123\n");
6868
String txt1 = doc.getText(0, 4);
@@ -79,7 +79,7 @@ public void testGetTextWithEndAfterNewline() {
7979

8080
@Test
8181
public void testWinDocumentLength() {
82-
EditableStyledDocument<String, String> document = new EditableStyledDocument<>("", "");
82+
EditableStyledDocumentImpl<String, String> document = new EditableStyledDocumentImpl<>("", "");
8383
document.replaceText(0, 0, "X\r\nY");
8484
assertEquals(document.getText().length(), document.getLength());
8585
}

richtextfx/src/test/java/org/fxmisc/richtext/StyledTextAreaModelTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void testForBug216() {
3232
// set up area with some styled text content
3333
boolean initialStyle = false;
3434
StyledTextAreaModel<String, Boolean> model = new StyledTextAreaModel<>(
35-
"", initialStyle, new EditableStyledDocument<>("", initialStyle), true);
35+
"", initialStyle, new EditableStyledDocumentImpl<>("", initialStyle), true);
3636
model.replaceText("testtest");
3737
model.setStyle(0, 8, true);
3838

0 commit comments

Comments
 (0)