001 package nl.cwi.sen1.gui.plugin.data;
002
003 import java.util.HashMap;
004 import java.util.Iterator;
005 import java.util.LinkedList;
006 import java.util.List;
007 import java.util.Map;
008
009 import javax.swing.event.TreeModelEvent;
010 import javax.swing.tree.TreeModel;
011 import javax.swing.tree.TreePath;
012
013 import nl.cwi.sen1.ioapi.types.File;
014 import aterm.ATerm;
015
016 public class ModuleTreeModel extends AbstractModuleTreeModel implements
017 TreeModel {
018 private ModuleTreeNode root;
019
020 private List<ModuleSelectionListener> moduleSelectionListeners;
021
022 private Map<ATerm, Module> moduleTable;
023
024 public ModuleTreeModel() {
025 moduleTable = new HashMap<ATerm, Module>();
026 moduleSelectionListeners = new LinkedList<ModuleSelectionListener>();
027 root = new ModuleTreeNode(null, "", "", false);
028 }
029
030 public Object getRoot() {
031 return root;
032 }
033
034 public Object getChild(Object parent, int index) {
035 return ((ModuleTreeNode) parent).getChild(index);
036 }
037
038 public int getChildCount(Object parent) {
039 return ((ModuleTreeNode) parent).getChildCount();
040 }
041
042 public boolean isLeaf(Object node) {
043 return ((ModuleTreeNode) node).isLeaf();
044 }
045
046 public void valueForPathChanged(TreePath path, Object newValue) {
047 }
048
049 public int getIndexOfChild(Object par, Object ch) {
050 ModuleTreeNode parent = (ModuleTreeNode) par;
051 ModuleTreeNode child = (ModuleTreeNode) ch;
052
053 if (parent == null)
054 return -1;
055
056 return parent.getIndexOfChild(child);
057 }
058
059 public void addModuleSelectionListener(ModuleSelectionListener listener) {
060 moduleSelectionListeners.add(listener);
061 }
062
063 public void selectModule(ATerm moduleId) {
064 selectModule(getModule(moduleId));
065 }
066
067 public void selectModule(Module module) {
068 Iterator<ModuleSelectionListener> iter = moduleSelectionListeners
069 .iterator();
070 while (iter.hasNext()) {
071 ModuleSelectionListener l = iter.next();
072 l.moduleSelected(module);
073 }
074 }
075
076 public Module getModule(ATerm moduleId) {
077 return moduleTable.get(moduleId);
078 }
079
080 public void addModule(Module module) {
081 ATerm moduleId = module.getId();
082 File file = module.getFile();
083
084 if (file != null && moduleTable.put(moduleId, module) == null) {
085 root.addChild(moduleId, "", file);
086 repaintTree();
087 }
088 }
089
090 public void removeModule(ATerm id) {
091 Module module = getModule(id);
092 File file = module.getFile();
093
094 moduleTable.remove(id);
095 root.removeChild(file);
096 repaintTree();
097 }
098
099 public void clearModules() {
100 moduleTable.clear();
101 root.clearChildren();
102 repaintTree();
103 }
104
105 public TreePath makeTreePath(File file) {
106 List<ModuleTreeNode> l = root.makePath(file);
107
108 return new TreePath(l.toArray());
109 }
110
111 public void repaintTree() {
112 Object path[] = new Object[1];
113 path[0] = root;
114 fireTreeStructureChanged(new TreeModelEvent(root, path));
115 }
116
117 public List<Module> getModules() {
118 return new LinkedList<Module>(moduleTable.values());
119 }
120
121 public void markError(ATerm moduleId) {
122 Module module = getModule(moduleId);
123 File file = module.getFile();
124
125 root.setErrorState(file, true);
126 repaintTree();
127 }
128
129 public void markNormal(ATerm moduleId) {
130 Module module = getModule(moduleId);
131 File file = module.getFile();
132
133 root.setErrorState(file, false);
134 repaintTree();
135 }
136 }