/** * */ package plugins.script; import java.io.File; import java.io.PrintStream; import java.util.HashMap; import java.util.List; import java.util.Vector; import plugins.script.ScriptEditorPanel.ScriptHolder; import plugins.script.ScriptEditorPanel.ScriptModel; import plugins.script.ScriptingEngine.ErrorHandler; import freemind.common.BooleanProperty; import freemind.common.ScriptEditorProperty; import freemind.common.SeparatorProperty; import freemind.common.StringProperty; import freemind.common.TextTranslator; import freemind.controller.actions.generated.instance.Pattern; import freemind.controller.actions.generated.instance.ScriptEditorWindowConfigurationStorage; import freemind.extensions.HookRegistration; import freemind.main.FreeMind; import freemind.main.FreeMindMain.StartupDoneListener; import freemind.main.HtmlTools; import freemind.main.Tools; import freemind.main.Tools.BooleanHolder; import freemind.modes.MindMap; import freemind.modes.MindMapNode; import freemind.modes.ModeController; import freemind.modes.mindmapmode.MindMapController; import freemind.modes.mindmapmode.actions.ApplyPatternAction.ExternalPatternAction; import freemind.preferences.FreemindPropertyContributor; import freemind.preferences.layout.OptionPanel; public class ScriptingRegistration implements HookRegistration, ExternalPatternAction, StartupDoneListener { private static final class ScriptingPluginPropertyContributor implements FreemindPropertyContributor { private final MindMapController modeController; public ScriptingPluginPropertyContributor( MindMapController modeController) { this.modeController = modeController; } public List getControls(TextTranslator pTextTranslator) { Vector controls = new Vector(); controls.add(new OptionPanel.NewTabProperty( "plugins/scripting/tab_name")); controls.add(new SeparatorProperty( "plugins/scripting/separatorPropertyName")); controls.add(new BooleanProperty( FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_FILE_RESTRICTION + ".tooltip", FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_FILE_RESTRICTION)); controls.add(new BooleanProperty( FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION + ".tooltip", FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION)); controls.add(new BooleanProperty( FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION + ".tooltip", FreeMind.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION)); controls.add(new BooleanProperty( FreeMind.RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED + ".tooltip", FreeMind.RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED)); controls.add(new StringProperty( FreeMind.RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING + ".tooltip", FreeMind.RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING)); return controls; } } private final class PatternScriptModel implements ScriptModel { private String mScript; private String mOriginalScript; public PatternScriptModel(String pScript) { mScript = pScript; mOriginalScript = pScript; } public ScriptEditorWindowConfigurationStorage decorateDialog( ScriptEditorPanel pPanel, String pWindow_preference_storage_property) { return (ScriptEditorWindowConfigurationStorage) controller .decorateDialog(pPanel, pWindow_preference_storage_property); } public void endDialog(boolean pIsCanceled) { if (pIsCanceled) { mScript = mOriginalScript; } } public boolean executeScript(int pIndex, PrintStream pOutStream, ErrorHandler pErrorHandler) { return ScriptingEngine.executeScript(controller.getSelected(), new BooleanHolder(true), mScript, controller, pErrorHandler, pOutStream, getScriptCookies()); } public int getAmountOfScripts() { return 1; } public ScriptHolder getScript(int pIndex) { return new ScriptHolder("Script", mScript); } public boolean isDirty() { return !Tools.safeEquals(mScript, mOriginalScript); } public void setScript(int pIndex, ScriptHolder pScript) { mScript = pScript.getScript(); } public void storeDialogPositions(ScriptEditorPanel pPanel, ScriptEditorWindowConfigurationStorage pStorage, String pWindow_preference_storage_property) { controller.storeDialogPositions(pPanel, pStorage, pWindow_preference_storage_property); } public String getScript() { return mScript; } public int addNewScript() { return 0; } } private final MindMapController controller; private final MindMap mMap; private ScriptEditorProperty.ScriptEditorStarter mScriptEditorStarter; private HashMap mScriptCookies = new HashMap(); private ScriptingPluginPropertyContributor mScriptingPluginPropertyContributor; public ScriptingRegistration(ModeController controller, MindMap map) { this.controller = (MindMapController) controller; mMap = map; ScriptingEngine.logger = controller.getFrame().getLogger( this.getClass().getName()); } public void register() { controller.registerPlugin(this); mScriptEditorStarter = new ScriptEditorProperty.ScriptEditorStarter() { public String startEditor(String pScriptInput) { ScriptingEngine.logger.info("Start to edit script..." + pScriptInput); PatternScriptModel patternScriptModel = new PatternScriptModel( pScriptInput); ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel( patternScriptModel, controller.getFrame(), false); scriptEditorPanel.setVisible(true); return patternScriptModel.getScript(); } }; controller.registerPlugin(mScriptEditorStarter); mScriptingPluginPropertyContributor = new ScriptingPluginPropertyContributor( controller); OptionPanel.addContributor(mScriptingPluginPropertyContributor); controller.getFrame().registerStartupDoneListener(this); } public void deRegister() { controller.deregisterPlugin(this); controller.deregisterPlugin(mScriptEditorStarter); OptionPanel.removeContributor(mScriptingPluginPropertyContributor); } public void act(MindMapNode node, Pattern pattern) { if (pattern.getPatternScript() != null && pattern.getPatternScript().getValue() != null) { String scriptString = HtmlTools.toXMLUnescapedText(HtmlTools.unescapeHTMLUnicodeEntity(pattern .getPatternScript().getValue())); ScriptingEngine.logger.info("Executing script: " +scriptString); executeScript(node, scriptString); } } private void executeScript(MindMapNode node, String scriptString) { ScriptingEngine.executeScript(node, new BooleanHolder(false), scriptString, controller, new ErrorHandler() { public void gotoLine(int pLineNumber) { } }, System.out, getScriptCookies()); } public HashMap getScriptCookies() { return mScriptCookies; } public void startupDone() { /* Is there a startup groovy script? */ String startupScriptFile = System.getProperty("startup_groovy_script"); if (startupScriptFile != null && !startupScriptFile.isEmpty()) { String expandFileName = Tools.expandFileName(startupScriptFile); ScriptingEngine.logger.info("Starting script at " + expandFileName); String scriptString = Tools.getFile(new File(expandFileName)); if (scriptString != null && !scriptString.isEmpty()) { ScriptingEngine.logger.info("Starting script " + scriptString); try { executeScript(controller.getRootNode(), scriptString); } catch (Exception e) { freemind.main.Resources.getInstance().logException(e); } } else { ScriptingEngine.logger.warning("Starting script not found!"); } } } }