/**
* Copyright (C) 2001-2017 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.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.viewer.collection;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import com.rapidminer.operator.GroupedModel;
import com.rapidminer.operator.IOObject;
import com.rapidminer.operator.IOObjectCollection;
import com.rapidminer.operator.learner.meta.MetaModel;
/**
* Tree model backed by an {@link IOObjectCollection}.
*
* @author Simon Fischer
*/
public class CollectionTreeModel implements TreeModel {
private final CollectionTreeElement root;
public CollectionTreeModel(CollectionTreeElement root) {
this.root = root;
}
@Override
public void addTreeModelListener(TreeModelListener l) {
// tree is immutable, no listeners
}
@Override
public void removeTreeModelListener(TreeModelListener l) {
// tree is immutable, no listeners
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
throw new UnsupportedOperationException("Tree is immutable.");
}
@SuppressWarnings("unchecked")
@Override
public Object getChild(Object parent, int index) {
IOObject parentIOObject = getIOObject(parent);
IOObject ioobject = null;
if (parentIOObject instanceof IOObjectCollection) {
IOObjectCollection<IOObject> col = (IOObjectCollection<IOObject>) parentIOObject;
ioobject = col.getElement(index, false);
} else if (parentIOObject instanceof GroupedModel) {
ioobject = ((GroupedModel) parentIOObject).getModel(index);
} else if (parentIOObject instanceof MetaModel) {
ioobject = ((MetaModel) parentIOObject).getModels().get(index);
}
return new CollectionTreeElement(ioobject);
}
@SuppressWarnings("unchecked")
@Override
public int getChildCount(Object parent) {
IOObject parentIOObject = getIOObject(parent);
if (parentIOObject instanceof IOObjectCollection) {
IOObjectCollection<IOObject> col = (IOObjectCollection<IOObject>) parentIOObject;
return col.size();
} else if (parentIOObject instanceof GroupedModel) {
return ((GroupedModel) parentIOObject).getNumberOfModels();
} else if (parentIOObject instanceof MetaModel) {
return ((MetaModel) parentIOObject).getModels().size();
} else {
return 0;
}
}
@SuppressWarnings("unchecked")
@Override
public int getIndexOfChild(Object parent, Object child) {
IOObject parentIOObject = getIOObject(parent);
if (parentIOObject instanceof IOObjectCollection) {
IOObjectCollection<IOObject> col = (IOObjectCollection<IOObject>) parentIOObject;
return col.getObjects().indexOf(child);
} else if (parentIOObject instanceof GroupedModel) {
return ((GroupedModel) parentIOObject).getModels().indexOf(child);
} else if (parentIOObject instanceof MetaModel) {
return ((MetaModel) parentIOObject).getModels().indexOf(child);
} else {
return -1;
}
}
@Override
public Object getRoot() {
return root;
}
@Override
public boolean isLeaf(Object node) {
IOObject ioObject = getIOObject(node);
return !(ioObject instanceof IOObjectCollection || ioObject instanceof MetaModel || ioObject instanceof GroupedModel);
}
private IOObject getIOObject(Object element) {
return ((CollectionTreeElement) element).getIOObject();
}
}