/* * Freeplane - mind map editor * Copyright (C) 2011 dimitry * * This file author is dimitry * * 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.features.icon; import java.util.Collection; import java.util.Collections; import java.util.TreeSet; import org.freeplane.core.extension.IExtension; import org.freeplane.features.icon.HierarchicalIcons.Mode; import org.freeplane.features.map.NodeModel; import org.freeplane.features.mode.Controller; /** * @author Dimitry Polivaev * Dec 10, 2011 */ class AccumulatedIcons implements IExtension{ private final TreeSet<UIIcon> childIcons ; private final Collection<? extends UIIcon> ownIcons; AccumulatedIcons(Collection<? extends UIIcon> ownIcons) { this.ownIcons = ownIcons; this.childIcons = new TreeSet<UIIcon>(); } public Collection<UIIcon> getAccumulatedIcons() { return childIcons; } /** */ private void addAccumulatedIconsToTreeSet(final NodeModel child) { final IconController iconController = IconController.getController(); childIcons.addAll(iconController.getIcons(child)); final AccumulatedIcons icons = (AccumulatedIcons) child.getExtension(AccumulatedIcons.class); if (icons == null) { return; } childIcons.addAll((Collection<UIIcon>) icons.childIcons); } static public boolean setStyleCheckForChange(final NodeModel node, Mode mode) { final Collection<MindIcon> ownIcons = IconController.getController().getIcons(node); final AccumulatedIcons iconSet = new AccumulatedIcons(ownIcons); boolean first = true; for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) { if(first || mode.equals(Mode.OR)){ iconSet.addAccumulatedIconsToTreeSet(child); } else{ @SuppressWarnings("unchecked") final AccumulatedIcons iconSet2 = new AccumulatedIcons(Collections.EMPTY_SET); iconSet2.addAccumulatedIconsToTreeSet(child); iconSet.childIcons.retainAll((Collection<UIIcon>) iconSet2.childIcons); if(iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty()) break; } first = false; } iconSet.childIcons.removeAll(ownIcons); final AccumulatedIcons oldSet; if (! (iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty())) { oldSet = (AccumulatedIcons)node.putExtension(iconSet); } else { oldSet = node.removeExtension(AccumulatedIcons.class); } if(iconSet.equals(oldSet) || iconSet.ownIcons.isEmpty() && iconSet.childIcons.isEmpty() && oldSet == null) return false; Controller.getCurrentModeController().getMapController().delayedNodeRefresh(node, HierarchicalIcons.ICONS, null, null); return true; } @Override public int hashCode() { return childIcons.hashCode() + ownIcons.hashCode(); } @Override public boolean equals(Object obj) { if(this == obj) return true; if(obj instanceof AccumulatedIcons){ AccumulatedIcons ai = (AccumulatedIcons) obj; return ownIcons.equals(ai.ownIcons) && childIcons.equals(ai.childIcons); } return false; } }