/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2004 Joerg Mueller, Daniel Polansky, Christian Foltin and others. * *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 12.08.2004 */ package freemind.modes.mindmapmode.actions; import java.awt.event.ActionEvent; import java.util.ListIterator; import java.util.logging.Logger; import javax.swing.AbstractAction; import freemind.controller.actions.generated.instance.CompoundAction; import freemind.controller.actions.generated.instance.FoldAction; import freemind.controller.actions.generated.instance.XmlAction; import freemind.main.FreeMind; import freemind.main.Resources; import freemind.main.Tools; import freemind.modes.MindMapNode; import freemind.modes.common.CommonToggleFoldedAction; import freemind.modes.mindmapmode.MindMapController; import freemind.modes.mindmapmode.actions.xml.ActionPair; import freemind.modes.mindmapmode.actions.xml.ActorXml; public class ToggleFoldedAction extends AbstractAction implements ActorXml { private final MindMapController modeController; private Logger logger; public ToggleFoldedAction(MindMapController controller) { super(controller.getText("toggle_folded")); this.modeController = controller; modeController.getActionFactory().registerActor(this, getDoActionClass()); logger = modeController.getFrame().getLogger(this.getClass().getName()); } public void actionPerformed(ActionEvent e) { toggleFolded(); } public void toggleFolded() { toggleFolded(modeController.getSelecteds().listIterator()); } public void toggleFolded(ListIterator listIterator) { boolean fold = CommonToggleFoldedAction .getFoldingState(CommonToggleFoldedAction.reset(listIterator)); CompoundAction doAction = createFoldAction( CommonToggleFoldedAction.reset(listIterator), fold, false); CompoundAction undoAction = createFoldAction( CommonToggleFoldedAction.reset(listIterator), !fold, true); modeController.doTransaction( (String) getValue(NAME), new ActionPair(doAction, undoAction)); } private CompoundAction createFoldAction(ListIterator iterator, boolean fold, boolean undo) { CompoundAction comp = new CompoundAction(); MindMapNode lastNode = null; // sort selectedNodes list by depth, in order to guarantee that sons // are deleted first: for (ListIterator it = iterator; it.hasNext();) { MindMapNode node = (MindMapNode) it.next(); FoldAction foldAction = createSingleFoldAction(fold, node, undo); if (foldAction != null) { if (!undo) { comp .addChoice(foldAction); } else { // reverse the order: comp .addAtChoice(0, foldAction); } lastNode = node; } } logger.finest("Compound contains " + comp.sizeChoiceList() + " elements."); return comp; } /** * @return null if node cannot be folded. */ private FoldAction createSingleFoldAction(boolean fold, MindMapNode node, boolean undo) { FoldAction foldAction = null; if ((undo && (node.isFolded() == fold)) || (!undo && (node.isFolded() != fold))) { if (node.hasChildren() || Tools.safeEquals( modeController.getFrame().getProperty( "enable_leaves_folding"), "true")) { foldAction = new FoldAction(); foldAction.setFolded(fold); foldAction.setNode(modeController.getNodeID(node)); } } return foldAction; } public void act(XmlAction action) { if (action instanceof FoldAction) { FoldAction foldAction = (FoldAction) action; MindMapNode node = modeController.getNodeFromID(foldAction .getNode()); boolean fold = foldAction.getFolded(); modeController._setFolded(node, fold); if (Resources.getInstance().getBoolProperty( FreeMind.RESOURCES_SAVE_FOLDING_STATE)) { modeController.nodeChanged(node); } } } public Class getDoActionClass() { return FoldAction.class; } /** */ public void setFolded(MindMapNode node, boolean folded) { FoldAction doAction = createSingleFoldAction(folded, node, false); FoldAction undoAction = createSingleFoldAction(!folded, node, true); if (doAction == null || undoAction == null) { return; } modeController.doTransaction( (String) getValue(NAME), new ActionPair(doAction, undoAction)); } }