package com.wilutions.itol;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.concurrent.Worker.State;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class WebViewHelper {
public static void addClickHandlerToWebView(WebView webView) {
WebEngine webEngine = webView.getEngine();
webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue) {
if (newValue == Worker.State.SUCCEEDED) {
EventListener listener = new EventListener() {
@Override
public void handleEvent(org.w3c.dom.events.Event ev) {
EventTarget target = ev.getCurrentTarget();
String type = ev.getType();
if (type.equals("click")) {
ev.preventDefault();
Platform.runLater(() -> {
String href = ((Element)target).getAttribute("href");
if (href != null && !href.isEmpty()) {
IssueApplication.showDocument(href);
}
});
}
}
};
// Bind click-event listeners only once.
bindClickListenersToAnchors(listener);
}
}
private void bindClickListenersToAnchors(EventListener listener) {
Document doc = webEngine.getDocument();
NodeList anchors = doc.getElementsByTagName("a");
for (int i=0; i<anchors.getLength(); i++) {
EventTarget elm = ((EventTarget)anchors.item(i));
elm.addEventListener("click", listener, false);
}
}
});
}
}