package tk.amberide.ide.tool.rb; import tk.amberide.ide.tool.IDecoratorTool; import tk.amberide.ide.tool.Tool; import java.awt.Component; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptException; /** * * @author Tudor */ public final class RubyTool extends Tool implements IDecoratorTool { private final ScriptEngine engine; public RubyTool(ScriptEngine engine) { this.engine = engine; } @Override public void enable() { try { if ((Boolean) engine.eval("self.respond_to?('enable')")) { ((Invocable) engine).invokeFunction("enable", new Object[0]); } } catch (ScriptException ex) { throw new RuntimeException("exception enabling tool", ex); } catch (NoSuchMethodException ex) { } } @Override public void disable() { try { if ((Boolean) engine.eval("self.respond_to?('disable')")) { ((Invocable) engine).invokeFunction("disable", new Object[0]); } } catch (ScriptException ex) { throw new RuntimeException("exception enabling tool", ex); } catch (NoSuchMethodException ex) { } } @Override public Component getToolPanel() { if (isDecorator()) { try { return (Component) ((Invocable) engine).invokeFunction("get_tool_panel"); } catch (ScriptException ex) { throw new RuntimeException("exception decorating", ex); } catch (NoSuchMethodException ex) { } } else { throw new UnsupportedOperationException("current tool is not a decorator tool"); } return null; } public boolean isDecorator() { try { return (Boolean) engine.eval("self.respond_to?('get_tool_panel')"); } catch (ScriptException ex) { // Will be thrown because we do not pass Component ex.printStackTrace(); return false; } } }