package org.markdownwriterfx.editor;
import java.util.ArrayList;
import java.util.Collection;
import javafx.collections.ObservableList;
import javafx.geometry.Rectangle2D;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.text.Text;
import org.fxmisc.richtext.Paragraph;
import org.fxmisc.richtext.StyledText;
import org.markdownwriterfx.editor.ParagraphOverlayGraphicFactory.OverlayFactory;
class WhitespaceOverlayFactory
extends OverlayFactory
{
@Override
public Node[] createOverlayNodes(int paragraphIndex) {
ObservableList<Paragraph<Collection<String>>> paragraphs = getTextArea().getParagraphs();
Paragraph<Collection<String>> par = paragraphs.get(paragraphIndex);
ArrayList<Node> nodes = new ArrayList<>();
int segmentStart = 0;
for(StyledText<Collection<String>> segment : par.getSegments()) {
String text = segment.toString();
int textLength = text.length();
for (int i = 0; i < textLength; i++) {
char ch = text.charAt(i);
if (ch != ' ' && ch != '\t')
continue;
Rectangle2D bounds = getBounds(segmentStart + i, segmentStart + i + 1);
nodes.add(createTextNode(
(ch == ' ') ? "\u00B7" : "\u00BB",
segment.getStyle(),
bounds.getMinX(),
bounds.getMinY()));
}
segmentStart += textLength;
}
if (paragraphIndex < paragraphs.size() - 1) {
Rectangle2D bounds = getBounds(segmentStart - 1, segmentStart);
nodes.add(createTextNode("\u00B6",
par.getStyleAtPosition(segmentStart),
bounds.getMaxX(),
bounds.getMinY()));
}
return nodes.toArray(new Node[nodes.size()]);
}
private Text createTextNode(String text, Collection<String> styleClasses,
double x, double y)
{
Text t = new Text(text);
t.setTextOrigin(VPos.TOP);
t.getStyleClass().add("text");
t.setOpacity(0.3);
t.getStyleClass().addAll(styleClasses);
t.setLayoutX(x);
t.setLayoutY(y);
return t;
}
}