/*FreeMind - A Program for creating and viewing Mindmaps *Copyright (C) 2000-2006 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitri Polivaev 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 05.05.2005 * Copyright (C) 2005 Dimitri Polivaev */ package freemind.controller.filter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; import java.util.Vector; import javax.swing.DefaultComboBoxModel; import javax.swing.ImageIcon; import freemind.controller.Controller; import freemind.controller.MapModuleManager.MapModuleChangeObserver; import freemind.controller.filter.condition.Condition; import freemind.controller.filter.condition.ConditionFactory; import freemind.controller.filter.condition.ConditionRenderer; import freemind.controller.filter.condition.NoFilteringCondition; import freemind.main.Resources; import freemind.main.XMLElement; import freemind.modes.MindIcon; import freemind.modes.MindMap; import freemind.modes.Mode; import freemind.modes.common.plugins.NodeNoteBase; import freemind.view.MapModule; /** * @author dimitri * */ public class FilterController implements MapModuleChangeObserver { private Controller c; private FilterToolbar filterToolbar; private DefaultComboBoxModel filterConditionModel; static private ConditionRenderer conditionRenderer = null; static private ConditionFactory conditionFactory; private MindMap map; static final String FREEMIND_FILTER_EXTENSION_WITHOUT_DOT = "mmfilter"; private static Filter inactiveFilter; public FilterController(Controller c) { this.c = c; c.getMapModuleManager().addListener(this); } ConditionRenderer getConditionRenderer() { if (conditionRenderer == null) conditionRenderer = new ConditionRenderer(); return conditionRenderer; } /** */ public FilterToolbar getFilterToolbar() { if (filterToolbar == null) { filterToolbar = new FilterToolbar(c); filterConditionModel = (DefaultComboBoxModel) filterToolbar .getFilterConditionModel(); // FIXME state icons should be created on order to make possible // their use in the filter component. // It should not happen here. MindIcon.factory("AttributeExist", new ImageIcon(Resources .getInstance().getResource("images/showAttributes.gif"))); MindIcon.factory(NodeNoteBase.NODE_NOTE_ICON, new ImageIcon( Resources.getInstance().getResource("images/knotes.png"))); MindIcon.factory("encrypted"); MindIcon.factory("decrypted"); filterToolbar.initConditions(); } return filterToolbar; } /** */ public void showFilterToolbar(boolean show) { if (show == isVisible()) return; getFilterToolbar().setVisible(show); final Filter filter = getMap().getFilter(); if (show) { filter.applyFilter(c); } else { createTransparentFilter().applyFilter(c); } refreshMap(); } public boolean isVisible() { return getFilterToolbar().isVisible(); } void refreshMap() { c.getModeController().refreshMap(); } static public ConditionFactory getConditionFactory() { if (conditionFactory == null) conditionFactory = new ConditionFactory(); return conditionFactory; } /** */ public MindMap getMap() { return map; } /** * @param filterToolbar * The filterToolbar to set. */ private void setFilterToolbar(FilterToolbar filterToolbar) { this.filterToolbar = filterToolbar; } public boolean isMapModuleChangeAllowed(MapModule oldMapModule, Mode oldMode, MapModule newMapModule, Mode newMode) { return true; } public void beforeMapModuleChange(MapModule oldMapModule, Mode oldMode, MapModule newMapModule, Mode newMode) { } public void afterMapClose(MapModule pOldMapModule, Mode pOldMode) { } public void afterMapModuleChange(MapModule oldMapModule, Mode oldMode, MapModule newMapModule, Mode newMode) { MindMap newMap = newMapModule != null ? newMapModule.getModel() : null; FilterComposerDialog fd = getFilterToolbar().getFilterDialog(); if (fd != null) { fd.mapChanged(newMap); } map = newMap; getFilterToolbar().mapChanged(newMap); } public void numberOfOpenMapInformation(int number, int pIndex) { } private static Filter createTransparentFilter() { if (inactiveFilter == null) inactiveFilter = new DefaultFilter( NoFilteringCondition.createCondition(), true, false); return inactiveFilter; } public void saveConditions() { if (filterToolbar != null) { filterToolbar.saveConditions(); } } public DefaultComboBoxModel getFilterConditionModel() { return filterConditionModel; } public void setFilterConditionModel( DefaultComboBoxModel filterConditionModel) { this.filterConditionModel = filterConditionModel; filterToolbar.setFilterConditionModel(filterConditionModel); } void saveConditions(DefaultComboBoxModel filterConditionModel, String pathToFilterFile) throws IOException { XMLElement saver = new XMLElement(); saver.setName("filter_conditions"); Writer writer = new FileWriter(pathToFilterFile); for (int i = 0; i < filterConditionModel.getSize(); i++) { Condition cond = (Condition) filterConditionModel.getElementAt(i); cond.save(saver); } saver.write(writer); writer.close(); } void loadConditions(DefaultComboBoxModel filterConditionModel, String pathToFilterFile) throws IOException { filterConditionModel.removeAllElements(); XMLElement loader = new XMLElement(); Reader reader = new FileReader(pathToFilterFile); loader.parseFromReader(reader); reader.close(); final Vector conditions = loader.getChildren(); for (int i = 0; i < conditions.size(); i++) { filterConditionModel.addElement(FilterController .getConditionFactory().loadCondition( (XMLElement) conditions.get(i))); } } }