package org.korsakow.ide.ui.resourceexplorer; import java.util.Map; import javax.swing.tree.TreePath; import org.korsakow.ide.ui.components.tree.DefaultKTreeTableModel; import org.korsakow.ide.ui.components.tree.FolderNode; import org.korsakow.ide.ui.components.tree.KNode; import org.korsakow.ide.ui.components.tree.ResourceNode; import org.korsakow.ide.util.UIUtil; import org.korsakow.ide.util.WeakReferenceMap; import com.sun.swingx.treetable.TreeTableNode; public class DefaultResourceTreeTableModel extends DefaultKTreeTableModel implements ResourceTreeTableModel { private final Map<Long, ResourceNode> idMap = new WeakReferenceMap<Long, ResourceNode>(); public DefaultResourceTreeTableModel(FolderNode root) { super(root); recursiveMapUpdate(root); } @Override public void setRoot(TreeTableNode root) { super.setRoot(root); recursiveMapUpdate((FolderNode)root); } @Override public FolderNode getRoot() { return (FolderNode)super.getRoot(); } public KNode remove(Long id) { ResourceNode node = findResource(id); if (node != null) { removeNodeFromParent(node); } return node; } @Override public void insertNodeInto(KNode newChild, KNode parent, int index) { if (newChild instanceof ResourceNode) { ResourceNode resourceNode = (ResourceNode)newChild; idMap.put(resourceNode.getResourceId(), resourceNode); } while (parent instanceof FolderNode == false) { parent = parent.getParent(); index = parent.getChildCount(); } super.insertNodeInto(newChild, parent, index); } @Override public void removeNodeFromParent(KNode node) { if (node instanceof ResourceNode) { ResourceNode resourceNode = (ResourceNode)node; idMap.remove(resourceNode.getResourceId()); } if (UIUtil.isRooted(getRoot(), node)) super.removeNodeFromParent(node); } public ResourceNode findResource(Long id) { return idMap.get(id); } public void fireChanged() { fireTreeStructureChanged(this, new TreePath(getPathToRoot(getRoot()))); } public void fireChanged(KNode changed) { fireTreeStructureChanged(this, new TreePath(getPathToRoot(changed))); } protected void recursiveMapUpdate(KNode node) { if (node instanceof ResourceNode) { ResourceNode resourceNode = (ResourceNode)node; idMap.put(resourceNode.getResourceId(), resourceNode); } for (KNode child : node.getChildren()) recursiveMapUpdate(child); } }