diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/model/Paragraph.java b/richtextfx/src/main/java/org/fxmisc/richtext/model/Paragraph.java index ed80862e3..9cd41a4fb 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/model/Paragraph.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/model/Paragraph.java @@ -230,7 +230,7 @@ public Paragraph restyle(int from, int to, S style) { public Paragraph restyle(int from, StyleSpans styleSpans) { int len = styleSpans.length(); - if(styleSpans.equals(getStyleSpans(from, from + len))) { + if(styleSpans.equals(getStyleSpans(from, from + len)) || length() == 0) { return this; } diff --git a/richtextfx/src/main/java/org/fxmisc/richtext/model/StyleSpansBuilder.java b/richtextfx/src/main/java/org/fxmisc/richtext/model/StyleSpansBuilder.java index d6ed84f96..02f09e693 100644 --- a/richtextfx/src/main/java/org/fxmisc/richtext/model/StyleSpansBuilder.java +++ b/richtextfx/src/main/java/org/fxmisc/richtext/model/StyleSpansBuilder.java @@ -40,6 +40,16 @@ public int getSpanCount() { public StyleSpan getStyleSpan(int index) { return spans.get(index); } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("StyleSpans(length=").append(length()) + .append(" spanCount=").append(getSpanCount()) + .append(" spans=").append(spans) + .append(")"); + return sb.toString(); + } } static StyleSpans overlay( @@ -276,6 +286,20 @@ public StyleSpan getStyleSpan(int index) { return original.getStyleSpan(firstIdxInOrig + index); } } + + @Override + public String toString() { + ArrayList> spans = new ArrayList<>(spanCount); + for (int i = 0; i < spanCount; i++) { + spans.add(getStyleSpan(i)); + } + StringBuilder sb = new StringBuilder(); + sb.append("SubSpans(length=").append(length) + .append(" spanCount=").append(getSpanCount()) + .append(" spans=").append(spans) + .append(")"); + return sb.toString(); + } } diff --git a/richtextfx/src/test/java/org/fxmisc/richtext/model/ParagraphTest.java b/richtextfx/src/test/java/org/fxmisc/richtext/model/ParagraphTest.java index d7ff9ec32..7708ea81f 100644 --- a/richtextfx/src/test/java/org/fxmisc/richtext/model/ParagraphTest.java +++ b/richtextfx/src/test/java/org/fxmisc/richtext/model/ParagraphTest.java @@ -20,4 +20,19 @@ public void concatEmptyParagraphsTest() { assertEquals(Boolean.TRUE, p.getStyleAtPosition(0)); } + // Relates to #345 and #505: calling `EditableStyledDocument::setStyleSpans` when the style spans + // would style an empty paragraph would throw an exception + @Test + public void restylingEmptyParagraphViaStyleSpansWorks() { + TextOps, Boolean> segOps = StyledText.textOps(); + Paragraph, Boolean> p = new Paragraph<>(null, segOps, segOps.createEmpty()); + + StyleSpansBuilder builder = new StyleSpansBuilder<>(); + builder.add(true, 2); + StyleSpans spans = builder.create(); + Paragraph, Boolean> restyledP = p.restyle(0, spans); + + assertEquals(p, restyledP); + } + }