/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2001 Joerg Mueller <joergmueller@bigfoot.com> *See COPYING for Details * *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, write to the Free Software *Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Created on 05.05.2004 */ package freemind.modes.mindmapmode.actions; import java.awt.Color; import java.awt.Point; import java.awt.datatransfer.Transferable; import java.awt.event.KeyEvent; import java.awt.event.MouseWheelEvent; import java.util.List; import java.util.Properties; import freemind.controller.actions.generated.instance.Pattern; import freemind.controller.actions.generated.instance.XmlAction; import freemind.extensions.ModeControllerHook; import freemind.extensions.NodeHook; import freemind.modes.MindIcon; import freemind.modes.MindMap; import freemind.modes.MindMapArrowLink; import freemind.modes.MindMapLink; import freemind.modes.MindMapNode; import freemind.modes.NodeAdapter; import freemind.modes.attributes.Attribute; import freemind.modes.mindmapmode.MindMapArrowLinkModel; import freemind.modes.mindmapmode.actions.xml.ActionFactory; /** * This is the central method interface of actions that can be undertaken on * nodes. Whenever you want to change the mindmap choose one of these actions as * they do proper redisplay, inform others about the actions, the actions are * all undoable etc.etc. * * All these methods do redisplay, because they are offered from the * MindMapController for use. * * @author foltin see MindMapController * */ public interface MindMapActions { public static final int NEW_CHILD_WITHOUT_FOCUS = 1; // old model of // insertion public static final int NEW_CHILD = 2; public static final int NEW_SIBLING_BEHIND = 3; public static final int NEW_SIBLING_BEFORE = 4; /** * Call this method, if you changed anything at a node. This method makes * the map dirty. */ public void nodeChanged(MindMapNode node); /** * This is nodeChanged without making the map dirty. */ public void nodeRefresh(MindMapNode node); public void nodeStructureChanged(MindMapNode node); /** * The following modes are present: public final int NEW_CHILD_WITHOUT_FOCUS * = 1; // old model of insertion public final int NEW_CHILD = 2; public * final int NEW_SIBLING_BEHIND = 3; public final int NEW_SIBLING_BEFORE = * 4; see MindMapController * */ public void edit(KeyEvent e, boolean addNew, boolean editLong); public void setNodeText(MindMapNode selected, String newText); public void setNoteText(MindMapNode selected, String newText); public MindMapNode addNew(final MindMapNode target, final int newNodeMode, final KeyEvent e); /** * Another variant of addNew. If the index of the new node as a child of * parent is known, this method is easier to use. Moreover, it does not * automatically start an editor. * @param index 0-based index of the new node. Use getChildCount or -1 to * add a new node at the bottom. * @param newNodeIsLeft * here, normally parent.isLeft() or null is used. * @return returns the new node. */ MindMapNode addNewNode(MindMapNode parent, int index, boolean newNodeIsLeft); public void deleteNode(MindMapNode selectedNode); public Transferable cut(); /** * @param nodeList * a list of MindMapNode elements * @return the result of the cut operation. */ public Transferable cut(List nodeList); /** * moves selected and selecteds (if they are child of the same parent and * adjacent) in the direction specified (up = -1, down = 1). * */ void moveNodes(MindMapNode selected, List selecteds, int direction); /** */ void setFolded(MindMapNode node, boolean folded); /** * Switches the folding state of all selected nodes. In fact, it determines * one action (fold or unfold) and applies this action to every selected * node. */ void toggleFolded(); public void setBold(MindMapNode node, boolean bolded); public void setItalic(MindMapNode node, boolean isItalic); public void setNodeColor(MindMapNode node, Color color); public void setNodeBackgroundColor(MindMapNode node, Color color); public void blendNodeColor(MindMapNode node); public void setFontFamily(MindMapNode node, String fontFamily); public void setFontSize(MindMapNode node, String fontSizeValue); /** * This method is nice, but how to get a MindIcon ? see * freemind.modes.MindIcon.factory(String) */ public void addIcon(MindMapNode node, MindIcon icon); public int removeLastIcon(MindMapNode node); public void removeAllIcons(MindMapNode node); /** * @param patternName * is one of the names. They can be received using the patterns * list of ApplyPatternActions from the MindMapController. Each * action has a getPattern() method and the pattern has a * getName() method ... */ public void applyPattern(MindMapNode node, String patternName); public void applyPattern(MindMapNode node, Pattern pattern); public void setNodeStyle(MindMapNode node, String style); public void setEdgeColor(MindMapNode node, Color color); /** The widths range from -1 (for equal to parent) to 0 (thin), 1, 2, 4, 8. */ public void setEdgeWidth(MindMapNode node, int width); public void setEdgeStyle(MindMapNode node, String style); public void setCloud(MindMapNode node, boolean enable); public void setCloudColor(MindMapNode node, Color color); // public void setCloudWidth(MindMapNode node, int width); // public void setCloudStyle(MindMapNode node, String style); /** * Source holds the MindMapArrowLinkModel and points to the id placed in * target. */ public void addLink(MindMapNode source, MindMapNode target); public void removeReference(MindMapLink arrowLink); public void changeArrowsOfArrowLink(MindMapArrowLinkModel arrowLink, boolean hasStartArrow, boolean hasEndArrow); public void setArrowLinkColor(MindMapLink arrowLink, Color color); public void setArrowLinkEndPoints(MindMapArrowLink link, Point startPoint, Point endPoint); /** * Adds a textual hyperlink to a node (e.g. http:/freemind.sourceforge.net) */ public void setLink(MindMapNode node, String link); // public void setUnderlined(MindMapNode node); // public void setNormalFont(MindMapNode node); public void increaseFontSize(MindMapNode node, int increment); public void splitNode(MindMapNode node, int caretPosition, String newText); public void joinNodes(MindMapNode selectedNode, List selectedNodes); public void paste(Transferable t, MindMapNode parent); /** * @param t the content to be pasted * @param target destination node * @param asSibling true: the past will be a direct sibling of target, otherwise it will become a child * @param isLeft * determines, whether or not the node is placed on the left or * right. * @return true, if successfully. */ public boolean paste(Transferable t, MindMapNode target, boolean asSibling, boolean isLeft); public void paste(MindMapNode node, MindMapNode parent); // hooks, fc 28.2.2004: public void addHook(MindMapNode focussed, List selecteds, String hookName, Properties pHookProperties); public void removeHook(MindMapNode focussed, List selecteds, String hookName); /** * This is the only way to instanciate new Hooks. THEY HAVE TO BE INVOKED * AFTERWARDS! The hook is equipped with the map and controller information. * Furthermore, the hook is added to the node, if it is an instance of the * PermanentNodeHook. If the hook policy specifies, that only one instance * may exist per node, it returns this instance if it already exists. * * @param map * may be null if not known. But it has to be set afterwards! * */ NodeHook createNodeHook(String hookName, MindMapNode node, MindMap map); /** Creates and invokes a ModeControllerHook.*/ void createModeControllerHook(String hookName); void invokeHook(ModeControllerHook hook); void invokeHooksRecursively(NodeAdapter node, MindMap map); // end hooks ActionFactory getActionFactory(); // XML Actions: public String marshall(XmlAction action); public XmlAction unMarshall(String inputString); /** undo in progress? */ boolean isUndoAction(); public MindMapNode getRootNode(); /** * Moves the node to a new position. */ public void moveNodePosition(MindMapNode node, int vGap, int hGap, int shiftY); /** * Load the given map (as String) instead of the currently opened map. * * @param pPrefix * is used for as the file name prefix for the temporary file * that holds the contents. * @return false, if an exception has occured. */ boolean load(String xmlMapContents, String pPrefix); public interface MouseWheelEventHandler { /** * @return true if the event was sucessfully processed and false if the * event did not apply. */ boolean handleMouseWheelEvent(MouseWheelEvent e); } void registerMouseWheelEventHandler(MouseWheelEventHandler handler); void deRegisterMouseWheelEventHandler(MouseWheelEventHandler handler); void setAttribute(MindMapNode node, int pPosition, Attribute pAttribute); /** * Inserts a new attribute at the end of the attributes table. * * @param node * to which the attribute is added * @param pAttribute * itself * @return the index of the new attribute. */ int addAttribute(MindMapNode node, Attribute pAttribute); /** * Removes the attribute at the given position * * @param pPosition * the position to delete. * */ void removeAttribute(MindMapNode node, int pPosition); /** * If an attribute with the same name exists, its value is changed. If the * new value is null, the attribute is deleted. Otherwise an attribute is * created. If several attributes with the same name exist, only the first * is changed. * * @param pNode * to which the attribute is associated * @param pName * the name of the attribute * @param pNewValue * its new value * @return the index of the attribute, or -1 if an attribute should be * deleted, but wasn't found. */ int editAttribute(MindMapNode pNode, String pName, String pNewValue); /** * Erases all content of the node as text, colors, fonts, etc. */ void clearNodeContents(MindMapNode pNode); /** * Switches the display to the map this controller belongs to. */ void showThisMap(); }