/* * Freeplane - mind map editor * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev * * This file author is Christian Foltin * It is modified by Dimitry Polivaev in 2008. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.plugin.script; import java.awt.event.ActionEvent; import java.io.PrintStream; import java.util.ArrayList; import org.freeplane.core.resources.ResourceController; import org.freeplane.core.ui.AFreeplaneAction; import org.freeplane.features.attribute.Attribute; import org.freeplane.features.attribute.AttributeController; import org.freeplane.features.attribute.NodeAttributeTableModel; import org.freeplane.features.attribute.mindmapmode.MAttributeController; import org.freeplane.features.map.NodeModel; import org.freeplane.features.mode.Controller; import org.freeplane.features.mode.ModeController; import org.freeplane.plugin.script.ScriptEditorPanel.IScriptModel; import org.freeplane.plugin.script.ScriptEditorPanel.ScriptHolder; import org.freeplane.plugin.script.ScriptingEngine.IErrorHandler; /** * @author foltin */ class ScriptEditor extends AFreeplaneAction { final private class AttributeHolder { Attribute mAttribute; int mPosition; public AttributeHolder(final Attribute pAttribute, final int pPosition) { super(); mAttribute = pAttribute; mPosition = pPosition; } } final private class NodeScriptModel implements IScriptModel { private boolean isDirty = false; // final private MModeController mMindMapController; final private NodeModel mNode; /** * Of AttributeHolder */ final private ArrayList<AttributeHolder> mScripts; private NodeScriptModel(final ArrayList<AttributeHolder> pScripts, final NodeModel node) { mScripts = pScripts; mNode = node; } public int addNewScript() { final int index = mScripts.size(); /** * is in general different from index, as not all attributes need to * be scripts. */ final int attributeIndex = NodeAttributeTableModel.getModel(mNode).getAttributeTableLength(); final String scriptName = ScriptingEngine.SCRIPT_PREFIX; int scriptNameSuffix = 1; boolean found; do { found = false; for (final AttributeHolder holder : mScripts) { if ((scriptName + scriptNameSuffix).equals(holder.mAttribute.getName())) { found = true; scriptNameSuffix++; break; } } } while (found); mScripts.add(new AttributeHolder(new Attribute(scriptName + scriptNameSuffix, ""), attributeIndex)); isDirty = true; return index; } public ScriptEditorWindowConfigurationStorage decorateDialog(final ScriptEditorPanel pPanel, final String pWindow_preference_storage_property) { final String marshalled = ResourceController.getResourceController().getProperty( pWindow_preference_storage_property); return ScriptEditorWindowConfigurationStorage.decorateDialog(marshalled, pPanel); } public void endDialog(final boolean pIsCanceled) { if (!pIsCanceled) { final int attributeTableLength = NodeAttributeTableModel.getModel(mNode).getAttributeTableLength(); for (final AttributeHolder holder : mScripts) { final Attribute attribute = holder.mAttribute; final int position = holder.mPosition; final MAttributeController attributeController = (MAttributeController) AttributeController .getController(); if (attributeTableLength <= position) { attributeController.addAttribute(mNode, attribute); } else if (NodeAttributeTableModel.getModel(mNode).getAttribute(position).getValue() != attribute .getValue()) { attributeController.setAttribute(mNode, position, attribute); } } } } public Object executeScript(final int pIndex, final PrintStream pOutStream, final IErrorHandler pErrorHandler) { final String script = getScript(pIndex).getScript(); ModeController mMindMapController = Controller.getCurrentModeController(); return ScriptingEngine.executeScript(mMindMapController.getMapController().getSelectedNode(), script, pErrorHandler, pOutStream, null, ScriptingPermissions.getPermissiveScriptingPermissions()); } public int getAmountOfScripts() { return mScripts.size(); } public ScriptHolder getScript(final int pIndex) { final Attribute attribute = ((AttributeHolder) mScripts.get(pIndex)).mAttribute; return new ScriptHolder(attribute.getName(), attribute.getValue().toString()); } public boolean isDirty() { return isDirty; } public void setScript(final int pIndex, final ScriptHolder pScript) { final AttributeHolder oldHolder = (AttributeHolder) mScripts.get(pIndex); if (!pScript.mScriptName.equals(oldHolder.mAttribute.getName())) { isDirty = true; } if (!pScript.mScript.equals(oldHolder.mAttribute.getValue())) { isDirty = true; } oldHolder.mAttribute.setName(pScript.mScriptName); oldHolder.mAttribute.setValue(pScript.mScript); } public void storeDialogPositions(final ScriptEditorPanel pPanel, final ScriptEditorWindowConfigurationStorage pStorage, final String pWindow_preference_storage_property) { pStorage.storeDialogPositions(pPanel, pWindow_preference_storage_property); } } private static final long serialVersionUID = 1L; public ScriptEditor() { super("ScriptEditor"); } public void actionPerformed(final ActionEvent e) { final ModeController modeController = Controller.getCurrentModeController(); final NodeModel node = modeController.getMapController().getSelectedNode(); final ArrayList<AttributeHolder> scripts = new ArrayList<AttributeHolder>(); for (int position = 0; position < NodeAttributeTableModel.getModel(node).getAttributeTableLength(); position++) { final Attribute attribute = NodeAttributeTableModel.getModel(node).getAttribute(position); if (attribute.getName().startsWith(ScriptingEngine.SCRIPT_PREFIX)) { scripts.add(new AttributeHolder(new Attribute(attribute), position)); } } final NodeScriptModel nodeScriptModel = new NodeScriptModel(scripts, node); final ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel(nodeScriptModel, true); scriptEditorPanel.setVisible(true); } }