package org.markdownwriterfx.preview;
import java.nio.file.Path;
import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.geometry.Side;
import javafx.scene.Node;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TabPane.TabClosingPolicy;
import org.markdownwriterfx.Messages;
import org.pegdown.ast.RootNode;
public class MarkdownPreviewPane
{
private final TabPane tabPane = new TabPane();
private final WebViewPreview webViewPreview = new WebViewPreview();
private final HtmlSourcePreview htmlSourcePreview = new HtmlSourcePreview();
private final ASTPreview astPreview = new ASTPreview();
interface Preview {
void update(RootNode astRoot, Path path);
void scrollY(double value);
}
public MarkdownPreviewPane() {
tabPane.setSide(Side.BOTTOM);
tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
Tab webViewTab = new Tab(Messages.get("MarkdownPreviewPane.webViewTab"), webViewPreview.getNode());
webViewTab.setUserData(webViewPreview);
tabPane.getTabs().add(webViewTab);
Tab htmlSourceTab = new Tab(Messages.get("MarkdownPreviewPane.htmlSourceTab"), htmlSourcePreview.getNode());
htmlSourceTab.setUserData(htmlSourcePreview);
tabPane.getTabs().add(htmlSourceTab);
Tab astTab = new Tab(Messages.get("MarkdownPreviewPane.astTab"), astPreview.getNode());
astTab.setUserData(astPreview);
tabPane.getTabs().add(astTab);
tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, newTab) -> {
update();
scrollY();
});
path.addListener((observable, oldValue, newValue) -> {
update();
});
markdownAST.addListener((observable, oldValue, newValue) -> {
update();
});
scrollY.addListener((observable, oldValue, newValue) -> {
scrollY();
});
}
public Node getNode() {
return tabPane;
}
private Preview getActivePreview() {
return (Preview) tabPane.getSelectionModel().getSelectedItem().getUserData();
}
private void update() {
getActivePreview().update(getMarkdownAST(), getPath());
}
private boolean scrollYrunLaterPending;
private void scrollY() {
if (scrollYrunLaterPending)
return;
scrollYrunLaterPending = true;
Platform.runLater(() -> {
scrollYrunLaterPending = false;
getActivePreview().scrollY(getScrollY());
});
}
private final ObjectProperty<Path> path = new SimpleObjectProperty<>();
public Path getPath() { return path.get(); }
public void setPath(Path path) { this.path.set(path); }
public ObjectProperty<Path> pathProperty() { return path; }
private final ObjectProperty<RootNode> markdownAST = new SimpleObjectProperty<RootNode>();
public RootNode getMarkdownAST() { return markdownAST.get(); }
public void setMarkdownAST(RootNode astRoot) { markdownAST.set(astRoot); }
public ObjectProperty<RootNode> markdownASTProperty() { return markdownAST; }
private final DoubleProperty scrollY = new SimpleDoubleProperty();
public double getScrollY() { return scrollY.get(); }
public void setScrollY(double value) { scrollY.set(value); }
public DoubleProperty scrollYProperty() { return scrollY; }
}