Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

reworked preview: - update only active preview tab - reduced scrollY() invokations

AuthorKarl Tauber <email>
Date2015-07-29 19:27:56 GMT+0200
Commit91e37b33602fb687a3a5a7f2664a31ef2e516602
Parent63a13d7
Delta58 lines added, 27 lines removed, 31-line increase
src/main/java/org/markdownwriterfx/preview/ASTPreview.java
*/
class ASTPreview
+ implements MarkdownPreviewPane.Preview
{
private final TextArea textArea = new TextArea();
}
- void update(RootNode astRoot) {
+ @Override
+ public void update(RootNode astRoot) {
double scrollTop = textArea.getScrollTop();
double scrollLeft = textArea.getScrollLeft();
textArea.setText(GraphUtils.printTree(astRoot, new ToStringFormatter<>()));
textArea.setScrollTop(scrollTop);
textArea.setScrollLeft(scrollLeft);
}
- void scrollY(double value) {
+ @Override
+ public void scrollY(double value) {
if (vScrollBar == null)
vScrollBar = Utils.findVScrollBar(textArea);
src/main/java/org/markdownwriterfx/preview/HtmlSourcePreview.java
*/
class HtmlSourcePreview
+ implements MarkdownPreviewPane.Preview
{
private final TextArea textArea = new TextArea();
}
- void update(RootNode astRoot) {
+ @Override
+ public void update(RootNode astRoot) {
double scrollTop = textArea.getScrollTop();
textArea.setText(WebViewPreview.toHtml(astRoot));
textArea.setScrollTop(scrollTop);
}
- void scrollY(double value) {
+ @Override
+ public void scrollY(double value) {
if (vScrollBar == null)
vScrollBar = Utils.findVScrollBar(textArea);
src/main/java/org/markdownwriterfx/preview/MarkdownPreviewPane.java
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();
- private TabPane tabPane;
+
+ interface Preview {
+ void update(RootNode astRoot);
+ void scrollY(double value);
+ }
public MarkdownPreviewPane() {
+ tabPane.setSide(Side.BOTTOM);
+ tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
+
+ Tab webViewTab = new Tab("Preview", webViewPreview.getNode());
+ webViewTab.setUserData(webViewPreview);
+ tabPane.getTabs().add(webViewTab);
+
+ Tab htmlSourceTab = new Tab("HTML Source", htmlSourcePreview.getNode());
+ htmlSourceTab.setUserData(htmlSourcePreview);
+ tabPane.getTabs().add(htmlSourceTab);
+
+ Tab astTab = new Tab("Markdown AST", astPreview.getNode());
+ astTab.setUserData(astPreview);
+ tabPane.getTabs().add(astTab);
+
+ tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, newTab) -> {
+ getActivePreview().update(getMarkdownAST());
+ scrollY();
+ });
+
markdownAST.addListener((observable, oldValue, newValue) -> {
- webViewPreview.update(newValue);
- htmlSourcePreview.update(newValue);
- astPreview.update(newValue);
+ getActivePreview().update(newValue);
});
scrollY.addListener((observable, oldValue, newValue) -> {
- Platform.runLater(() -> {
- webViewPreview.scrollY(newValue.doubleValue());
- htmlSourcePreview.scrollY(newValue.doubleValue());
- astPreview.scrollY(newValue.doubleValue());
- });
+ scrollY();
});
}
public Node getNode() {
- if(tabPane == null) {
- tabPane = new TabPane();
- tabPane.setSide(Side.BOTTOM);
- tabPane.setTabClosingPolicy(TabClosingPolicy.UNAVAILABLE);
+ return tabPane;
+ }
- Tab webViewTab = new Tab("Preview", webViewPreview.getNode());
- tabPane.getTabs().add(webViewTab);
+ private Preview getActivePreview() {
+ return (Preview) tabPane.getSelectionModel().getSelectedItem().getUserData();
+ }
- Tab htmlSourceTab = new Tab("HTML Source", htmlSourcePreview.getNode());
- tabPane.getTabs().add(htmlSourceTab);
+ private boolean scrollYrunLaterPending;
+ private void scrollY() {
+ // avoid too many (and useless) runLater() invocations
+ if (scrollYrunLaterPending)
+ return;
+ scrollYrunLaterPending = true;
- Tab astTab = new Tab("Markdown AST", astPreview.getNode());
- tabPane.getTabs().add(astTab);
- }
- return tabPane;
+ Platform.runLater(() -> {
+ scrollYrunLaterPending = false;
+ getActivePreview().scrollY(getScrollY());
+ });
}
src/main/java/org/markdownwriterfx/preview/WebViewPreview.java
*/
class WebViewPreview
+ implements MarkdownPreviewPane.Preview
{
private final WebView webView = new WebView();
}
- void update(RootNode astRoot) {
+ @Override
+ public void update(RootNode astRoot) {
Object scrollXobj = webView.getEngine().executeScript("window.scrollX");
Object scrollYobj = webView.getEngine().executeScript("window.scrollY");
}
- void scrollY(double value) {
+ @Override
+ public void scrollY(double value) {
webView.getEngine().executeScript(
"window.scrollTo(0, (document.body.scrollHeight - window.innerHeight) * "+value+");");