package org.lrg.outcode.views; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Platform; import org.eclipse.swt.SWT; import org.eclipse.swt.browser.Browser; import org.eclipse.swt.browser.BrowserFunction; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; import org.lrg.outcode.Activator; import org.lrg.outcode.views.browseractions.GetDBStatus; import org.lrg.outcode.views.browseractions.IBrowserAction; import org.lrg.outcode.views.browseractions.OpenCommitDiff; public class Hindsight extends ViewPart { public static final String VIEW_ID = "outCode.browser"; private Browser browser; private BrowserFunction function; private Map<String, IBrowserAction> configuredActions = new HashMap<>(); @Override public void createPartControl(Composite parent) { browser = new Browser(parent, SWT.NONE); function = new CustomFunction(browser, "theJavaFunction"); URL indexPage = Platform.getBundle(Activator.PLUGIN_ID).getResource("html/src/client/index.html"); try { URL resolvedFileURL = FileLocator.toFileURL(indexPage); browser.setUrl(resolvedFileURL.toExternalForm()); } catch (IOException e) { e.printStackTrace(); } configuredActions.put(OpenCommitDiff.class.getSimpleName(), new OpenCommitDiff()); configuredActions.put(GetDBStatus.class.getSimpleName(), new GetDBStatus()); } public void sendMessage(String message) { browser.evaluate("document.dispatchEvent(new CustomEvent('build', { 'detail': " + message + " }));"); } class CustomFunction extends BrowserFunction { CustomFunction(Browser browser, String name) { super(browser, name); } @Override public Object function(Object[] arguments) { System.out.println("theJavaFunction() called from javascript " + arguments[0]); if (configuredActions.containsKey(arguments[0].toString())) return configuredActions.get(arguments[0].toString()).onMessage(arguments[0].toString(), arguments); return "no action configured for method"; // Object returnValue = new Object[] { new Short((short) 3), new Boolean(true), null, new Object[] { "a string", new Boolean(false) }, "hi", new Float(2.0f / 3.0f), }; // int z = 3 / 0; // uncomment to cause a java error instead // return returnValue; } } @Override public void setFocus() { browser.setFocus(); } @Override public void dispose() { function.dispose(); browser.dispose(); super.dispose(); } }