/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2005 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 09.11.2005 */ package freemind.modes.common; import java.awt.event.ActionEvent; import java.util.Iterator; import java.util.ListIterator; import java.util.logging.Logger; import javax.swing.AbstractAction; import freemind.main.Tools; import freemind.modes.ControllerAdapter; import freemind.modes.MindMapNode; /** * @author foltin * */ public class CommonToggleFoldedAction extends AbstractAction { private ControllerAdapter modeController; private Logger logger; public CommonToggleFoldedAction(ControllerAdapter controller) { super(controller.getText("toggle_folded")); this.modeController = controller; 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 = getFoldingState(reset(listIterator)); for (Iterator i = reset(listIterator); i.hasNext();) { MindMapNode node = (MindMapNode) i.next(); modeController.setFolded(node, fold); } } public static ListIterator reset(ListIterator iterator) { while (iterator.hasPrevious()) { iterator.previous(); } return iterator; } /** * Determines whether the nodes should be folded or unfolded depending on * their states. If not all nodes have the same folding status, the result * means folding * * @param iterator * an iterator of MindMapNodes. * @return true, if the nodes should be folded. */ public static boolean getFoldingState(ListIterator iterator) { /* * Retrieve the information whether or not all nodes have the same * folding state. */ Tools.BooleanHolder state = null; boolean allNodeHaveSameFoldedStatus = true; for (ListIterator it = iterator; it.hasNext();) { MindMapNode node = (MindMapNode) it.next(); if (node.getChildCount() == 0) { // no folding state change for unfoldable nodes. continue; } if (state == null) { state = new Tools.BooleanHolder(); state.setValue(node.isFolded()); } else { if (node.isFolded() != state.getValue()) { allNodeHaveSameFoldedStatus = false; break; } } } /* if the folding state is ambiguous, the nodes are folded. */ boolean fold = true; if (allNodeHaveSameFoldedStatus && state != null) { fold = !state.getValue(); } return fold; } }