package flow.netbeans.markdown.preview; import flow.netbeans.markdown.options.MarkdownGlobalOptions; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author Holger Stenger */ public class HtmlViewFactory { private static final Logger LOG = Logger.getLogger(HtmlViewFactory.class.getName()); public HtmlViewFactory() { } public HtmlView createHtmlView() { if (MarkdownGlobalOptions.getInstance().isFXHtmlViewEnabled()) { try { return createFXHtmlView(); } catch (UnsupportedOperationException ex) { LOG.log(Level.INFO, "Falling back to Swing implementation", ex); } } return createDefaultHtmlView(); } public HtmlView createDefaultHtmlView() { return new SwingHtmlView(); } private HtmlView createFXHtmlView() throws UnsupportedOperationException { ClassLoader cl = getClassLoader(); checkFXFeatures(cl); return createFXHtmlView(cl); } private ClassLoader getClassLoader() throws UnsupportedOperationException { return HtmlViewFactory.class.getClassLoader(); } private HtmlView createFXHtmlView(ClassLoader cl) throws UnsupportedOperationException { try { Class<?> htmlViewClass = cl.loadClass("flow.netbeans.markdown.preview.ext.FXHtmlView"); Constructor<?> htmlViewConstructor = htmlViewClass.getConstructor(); return (HtmlView) htmlViewConstructor.newInstance(); } catch (Throwable ex) { throw new UnsupportedOperationException(ex); } } public void checkFXFeatures(ClassLoader cl) throws UnsupportedOperationException { try { Class<?> platformClass = cl.loadClass("javafx.application.Platform"); Method setImplicitExitMethod = platformClass.getMethod("setImplicitExit", boolean.class); Class<?> jfxPanelClass = cl.loadClass("javafx.embed.swing.JFXPanel"); } catch (ClassNotFoundException ex) { throw new UnsupportedOperationException(ex); } catch (NoSuchMethodException ex) { throw new UnsupportedOperationException(ex); } catch (SecurityException ex) { throw new UnsupportedOperationException(ex); } } }