/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package reportgen.gui.genepanel.corepanel.entitypanel;
import java.util.ArrayList;
import java.util.HashMap;
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 reportgen.prototype.entity.QEntity;
/**
*
* @author axe
*/
public class ReportEntityModel implements TreeModel {
private QEntity rootEntity;
private List<TreeModelListener> tml = new ArrayList<TreeModelListener>();
private HashMap<QEntity, List<QEntity>> map
= new HashMap<QEntity, List<QEntity>>();
public ReportEntityModel(QEntity root) {
this.rootEntity = root;
}
@Override
public Object getRoot() {
return rootEntity;
}
private List<QEntity> children(Object parent) {
if(parent == null) {
return new ArrayList<QEntity>();
}
QEntity par = (QEntity) parent;
List<QEntity> children = map.get(par);
if(children == null) {
children = new ArrayList<QEntity>();
QEntity[] selEnts = par.getSelectedEntities();
if(selEnts != null) {
for(QEntity en: selEnts) {
children.add(en);
}
}
map.put(par, children);
}
return children;
}
@Override
public Object getChild(Object parent, int index) {
return children(parent).get(index);
}
@Override
public int getChildCount(Object parent) {
return children(parent).size();
}
@Override
public boolean isLeaf(Object node) {
return false;
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
TreeModelEvent event = new TreeModelEvent(this, path);
for(TreeModelListener l: tml) {
l.treeNodesChanged(event);
}
}
public void nodeInserted(TreePath path) {
Object child = path.getLastPathComponent();
TreePath parentPath = path.getParentPath();
Object parent = null;
if(parentPath != null) {
parent = parentPath.getLastPathComponent();
}
map.put((QEntity)parent, null);
List<QEntity> childList = children(parent);
int ids[] = new int[] { childList.size()-1 };
Object chs[] = new Object[] { child };
TreeModelEvent event = new TreeModelEvent(this,
(parentPath != null ? parentPath : new TreePath(null)), ids, chs);
for(TreeModelListener l: tml) {
l.treeNodesInserted(event);
}
}
public void nodeRemoved(TreePath parentPath, int ids[], Object chs[]) {
TreeModelEvent event = new TreeModelEvent(this, parentPath, ids, chs);
for(TreeModelListener l: tml) {
l.treeNodesRemoved(event);
}
}
@Override
public void addTreeModelListener(TreeModelListener l) {
tml.add(l);
}
@Override
public void removeTreeModelListener(TreeModelListener l) {
tml.remove(l);
}
@Override
public int getIndexOfChild(Object parent, Object child) {
return children(parent).indexOf(child);
}
}