/* * RapidMiner * * Copyright (C) 2001-2008 by Rapid-I and the contributors * * Complete list of developers available at our web site: * * http://rapid-i.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.gui.processeditor; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import javax.swing.event.TreeModelEvent; import javax.swing.event.TreeModelListener; import javax.swing.tree.TreeModel; import javax.swing.tree.TreePath; import com.rapidminer.operator.OperatorDescription; import com.rapidminer.tools.GroupTree; /** * This is the model for the group selection tree in the new operator editor panel. * * @author Ingo Mierswa * @version $Id: NewOperatorGroupTreeModel.java,v 1.4 2008/05/09 19:23:16 ingomierswa Exp $ */ public class NewOperatorGroupTreeModel implements TreeModel { private GroupTree completeTree; private GroupTree displayedTree; /** The list of all tree model listeners. */ private List<TreeModelListener> treeModelListeners = new LinkedList<TreeModelListener>(); public NewOperatorGroupTreeModel(GroupTree root) { this.completeTree = root; this.displayedTree = this.completeTree; } public void addTreeModelListener(TreeModelListener l) { treeModelListeners.add(l); } public Object getChild(Object parent, int index) { return ((GroupTree)parent).getSubGroup(index); } public int getChildCount(Object parent) { return ((GroupTree)parent).getSubGroups().size(); } public int getIndexOfChild(Object parent, Object child) { return ((GroupTree)parent).getIndexOfSubGroup((GroupTree)child); } public Object getRoot() { return displayedTree; } public boolean isLeaf(Object node) { return getChildCount(node) == 0; } public void removeTreeModelListener(TreeModelListener l) { treeModelListeners.remove(l); } /** Will be invoked after editing changes of nodes. */ public void valueForPathChanged(TreePath path, Object node) { fireTreeChanged(node, path); } private void fireTreeChanged(Object source, TreePath path) { Iterator i = treeModelListeners.iterator(); while (i.hasNext()) { ((TreeModelListener) i.next()).treeStructureChanged(new TreeModelEvent(source, path)); } } private void fireCompleteTreeChanged(Object source) { Iterator i = treeModelListeners.iterator(); while (i.hasNext()) { ((TreeModelListener) i.next()).treeStructureChanged(new TreeModelEvent(this, new TreePath(getRoot()))); } } public void applyFilter(String filter) { if ((filter == null) || (filter.trim().length() == 0)) { this.displayedTree = completeTree; } else { GroupTree filteredTree = (GroupTree)this.completeTree.clone(); removeFilteredInstances(filter, filteredTree); this.displayedTree = filteredTree; } fireCompleteTreeChanged(this); } private void removeFilteredInstances(String filter, GroupTree filteredTree) { Iterator<GroupTree> g = filteredTree.getSubGroups().iterator(); while (g.hasNext()) { GroupTree child = g.next(); if (child.getName().toLowerCase().indexOf(filter.toLowerCase()) < 0) { removeFilteredInstances(filter, child); if (child.getAllOperatorDescriptions().size() == 0) g.remove(); } } // remove non matching operator descriptions if the group does not match, keep all in matching group if (filteredTree.getName().toLowerCase().indexOf(filter.toLowerCase()) < 0) { Iterator<OperatorDescription> o = filteredTree.getOperatorDescriptions().iterator(); while (o.hasNext()) { OperatorDescription description = o.next(); if (description.getName().toLowerCase().indexOf(filter.toLowerCase()) < 0) o.remove(); } } } }