package helpmaker.components;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.web.HTMLEditor;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public final class CustomHTMLEditor extends HTMLEditor {
private Button btnAddLink;
private Button btnSave;
private boolean pageChanged;
private WebView webView;
private static final String JS_GET_SELECTED_TEXT =
"(function getSelectionText() {\n" +
" var text = \"\";\n" +
" if (window.getSelection) {\n" +
" text = window.getSelection().toString();\n" +
" } else if (document.selection && document.selection.type != \"Control\") {\n" +
" text = document.selection.createRange().text;\n" +
" }\n" +
" return text;\n" +
"})()";
private static final String JS_CREATE_LINK =
"(function createLink(link, caption) {\n" +
" var selRange = window.getSelection().getRangeAt(0);\n" +
" var span = document.createElement('span');\n" +
" span.innerHTML = '<a href=\\'' + link + '\\'>' + caption + '</a>';\n" +
" selRange.deleteContents();\n" +
" selRange.insertNode(span);\n" +
"})";
private static final String HTMLStyle = "<style>p{margin-top:3px;margin-bottom:3px;}</style>";
public CustomHTMLEditor() {
pageChanged = false;
webView = (WebView) this.lookup("WebView");
this.setOnKeyTyped(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
pageChanged = true;
}
});
}
public void initializeNewFunctionality() {
addSaveButton();
addLinkButton();
}
private void addLinkButton() {
ImageView graphic = new ImageView(new Image("helpmaker/res/link.png", 16, 16, true, true));
btnAddLink = new Button("", graphic);
addNodeToTopToolbar(btnAddLink);
}
private void addSaveButton() {
ImageView graphic = new ImageView(new Image("helpmaker/res/save.png", 16, 16, true, true));
btnSave = new Button("", graphic);
addNodeToTopToolbar(true, btnSave);
}
private void addNodeToTopToolbar(boolean asFirst, Node newNode) {
Node node = this.lookup(".top-toolbar");
if (node instanceof ToolBar) {
ToolBar bar = (ToolBar) node;
if (asFirst)
bar.getItems().add(0, newNode);
else
bar.getItems().add(newNode);
}
}
private void addNodeToTopToolbar(Node newNode) {
addNodeToTopToolbar(false, newNode);
}
public void setBtnSaveSetOnAction(EventHandler<ActionEvent> eventHandler) {
btnSave.setOnAction(eventHandler);
}
public void setBtnAddLinkSetOnAction(EventHandler<ActionEvent> eventHandler) {
btnAddLink.setOnAction(eventHandler);
}
public boolean pageChanged() {
return pageChanged;
}
public void setPageChanged(boolean state) {
pageChanged = state;
}
public void saveHTMLPageToFile(String fileName) {
if ((pageChanged()) && (!fileName.equals(""))) {
String resultHTML;
if (getHtmlText().contains(HTMLStyle))
resultHTML = this.getHtmlText();
else
resultHTML = getHtmlText().replace("<head>", "<head>"+ HTMLStyle);
resultHTML = resultHTML.replace("contenteditable=\"true\"", "");
try {
BufferedWriter outBuffer = new BufferedWriter(new FileWriter(new File(fileName)));
outBuffer.write(resultHTML);
outBuffer.flush();
outBuffer.close();
setPageChanged(false);
} catch (IOException e) {
e.printStackTrace();
}
}
setPageChanged(false);
}
public String getSelectedText() {
if (webView == null) return "";
return (String)webView.getEngine().executeScript(JS_GET_SELECTED_TEXT);
}
public void insertLink(String link, String caption) {
if (webView == null) return;
WebEngine engine = webView.getEngine();
engine.executeScript(JS_CREATE_LINK+"('"+link+"','"+caption+"')");
}
}