package org.codefx.libfx.control.webview;
import java.util.function.Function;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javax.swing.event.HyperlinkEvent;
import javax.swing.event.HyperlinkListener;
/**
* A listener to {@link HyperlinkEvent}s which are dispatched by a {@link WebView}.
* <p>
* Very similar do the {@link HyperlinkListener} but it can cancel the further processing of events by the
* {@link WebEngine}. This does not extent to other listeners of this type to the same {@code WebView} - these are
* always called.
*/
public interface WebViewHyperlinkListener {
/**
* Adapts the specified (Swing) hyperlink listener to a web view hyperlink listener.
*
* @param listener
* the {@link HyperlinkListener} to adapt
* @param cancel
* a {@link Function} which checks for the specified event whether it should be canceled
* @return a {@link WebViewHyperlinkListener}
*/
static WebViewHyperlinkListener fromHyperlinkListener(HyperlinkListener listener,
Function<HyperlinkEvent, Boolean> cancel) {
return event -> {
listener.hyperlinkUpdate(event);
return cancel.apply(event);
};
}
/**
* Adapts the specified (Swing) hyperlink listener to a web view hyperlink listener.
*
* @param listener
* the {@link HyperlinkListener} to adapt
* @param cancel
* whether the created listener should cancel every event
* @return a {@link WebViewHyperlinkListener}
*/
static WebViewHyperlinkListener fromHyperlinkListener(HyperlinkListener listener, boolean cancel) {
return event -> {
listener.hyperlinkUpdate(event);
return cancel;
};
}
/**
* Called when a hypertext link is updated.
*
* @param event
* the event responsible for the update
* @return whether the event should be canceled; if more than one listener is called on a single event, their return
* values are "ored".
*/
boolean hyperlinkUpdate(HyperlinkEvent event);
}