001 package nl.cwi.sen1.gui.plugin.data; 002 003 import java.util.ArrayList; 004 import java.util.List; 005 006 import nl.cwi.sen1.ioapi.types.File; 007 import nl.cwi.sen1.ioapi.types.Path; 008 import nl.cwi.sen1.ioapi.types.Segment; 009 import nl.cwi.sen1.ioapi.types.SegmentList; 010 import aterm.ATerm; 011 012 public class ModuleTreeNode { 013 ATerm id; 014 015 String name; 016 017 String prefix; 018 019 ArrayList<ModuleTreeNode> children; 020 021 boolean leaf; 022 023 boolean error; 024 025 public ModuleTreeNode(ATerm id, String name, String prefix, boolean leaf) { 026 this.id = id; 027 this.name = name; 028 this.prefix = prefix; 029 this.leaf = leaf; 030 children = new ArrayList<ModuleTreeNode>(); 031 } 032 033 public boolean hasError() { 034 if (leaf == true) { 035 return error; 036 } 037 038 for (int i = 0; i < children.size(); i++) { 039 if (children.get(i).hasError() == true) { 040 return true; 041 } 042 } 043 044 return false; 045 } 046 047 public ATerm getId() { 048 return id; 049 } 050 051 public String getName() { 052 return name; 053 } 054 055 public String getFullName() { 056 return prefix + getName(); 057 } 058 059 public ModuleTreeNode addChild(ATerm id, String p, File file) { 060 Path path = file.getPath(); 061 062 SegmentList segments = path.getList(); 063 ModuleTreeNode childNode = null; 064 065 if (segments.isEmpty()) { 066 childNode = new ModuleTreeNode(id, file.getName(), p, true); 067 children.add(getInsertIndex(file.getName()), childNode); 068 069 return childNode; 070 } 071 072 Segment segment = segments.getHead(); 073 String childName = segment.getName(); 074 int childIndex = getNodeChild(childName); 075 076 if (childIndex != -1) { 077 childNode = getChild(childIndex); 078 } 079 if (childNode == null) { 080 childNode = new ModuleTreeNode(null, childName, p, false); 081 children.add(getInsertIndex(childName), childNode); 082 } 083 path = path.getIoapiFactory().makePath_Relative(segments.getTail()); 084 file = file.getIoapiFactory().makeFile_File(path, file.getName(), 085 file.getExtension()); 086 087 return childNode.addChild(id, p + childName + "/", file); 088 } 089 090 public void removeChild(File file) { 091 SegmentList segments = file.getPath().getList(); 092 segments = segments.append(file.getIoapiFactory().makeSegment_Segment( 093 file.getName())); 094 removeChild(segments); 095 } 096 097 public void removeChild(SegmentList segments) { 098 if (!segments.isEmpty()) { 099 String childName = segments.getHead().getName(); 100 int childIndex = getChild(childName); 101 ModuleTreeNode childNode = getChild(childIndex); 102 103 if (childNode != null) { 104 if (!segments.isEmpty()) { 105 childNode.removeChild(segments.getTail()); 106 } 107 if (childNode.getChildCount() == 0) { 108 children.remove(childIndex); 109 } 110 } 111 } 112 } 113 114 public void clearChildren() { 115 children.clear(); 116 } 117 118 public ModuleTreeNode getChild(int index) { 119 if ((index < 0) || (index >= children.size())) { 120 return null; 121 } 122 123 return children.get(index); 124 } 125 126 public int getChild(String n) { 127 for (int i = 0; i < children.size(); i++) { 128 ModuleTreeNode curNode = children.get(i); 129 130 if (curNode.getName().equals(n)) { 131 return i; 132 } 133 } 134 135 return -1; 136 } 137 138 public int getLeafChild(String n) { 139 for (int i = 0; i < children.size(); i++) { 140 ModuleTreeNode curNode = children.get(i); 141 142 if (curNode.getName().equals(n) && curNode.isLeaf()) { 143 return i; 144 } 145 } 146 147 return -1; 148 } 149 150 public int getNodeChild(String n) { 151 for (int i = 0; i < children.size(); i++) { 152 ModuleTreeNode curNode = children.get(i); 153 154 if (curNode.getName().equals(n) && !curNode.isLeaf()) { 155 return i; 156 } 157 } 158 159 return -1; 160 } 161 162 public int getInsertIndex(String n) { 163 for (int i = 0; i < children.size(); i++) { 164 ModuleTreeNode curNode = children.get(i); 165 166 if (curNode.getName().compareTo(n) > 0) { 167 return i; 168 } 169 } 170 171 return children.size(); 172 } 173 174 public int getChildCount() { 175 return children.size(); 176 } 177 178 public boolean isLeaf() { 179 return leaf; 180 } 181 182 public int getIndexOfChild(ModuleTreeNode child) { 183 if (child == null) 184 return -1; 185 186 for (int i = 0; i < children.size(); i++) { 187 if (children.get(i) == child) { 188 return i; 189 } 190 } 191 return -1; 192 } 193 194 public List<ModuleTreeNode> makePath(File file) { 195 SegmentList segments = file.getPath().getList(); 196 segments = segments.append(file.getIoapiFactory().makeSegment_Segment( 197 file.getName())); 198 return makePath(segments, new ArrayList<ModuleTreeNode>()); 199 } 200 201 public List<ModuleTreeNode> makePath(SegmentList segments, 202 List<ModuleTreeNode> result) { 203 result.add(this); 204 205 if (isLeaf()) { 206 return result; 207 } 208 209 if (!segments.isEmpty()) { 210 String childName = segments.getHead().getName(); 211 segments = segments.getTail(); 212 213 ModuleTreeNode childNode; 214 int childIndex; 215 if (!segments.isEmpty()) { 216 childIndex = getNodeChild(childName); 217 } else { 218 childIndex = getLeafChild(childName); 219 } 220 childNode = getChild(childIndex); 221 222 if (childNode != null) { 223 if (!segments.isEmpty()) { 224 return childNode.makePath(segments, result); 225 } 226 result.add(childNode); 227 } 228 } 229 230 return result; 231 } 232 233 public String toString() { 234 return name; 235 } 236 237 public void setErrorState(File file, boolean b) { 238 SegmentList segments = file.getPath().getList(); 239 segments = segments.append(file.getIoapiFactory().makeSegment_Segment( 240 file.getName())); 241 setErrorState(segments, b); 242 } 243 244 private void setErrorState(SegmentList segments, boolean b) { 245 if (!segments.isEmpty()) { 246 String childName = segments.getHead().getName(); 247 int childIndex = getChild(childName); 248 ModuleTreeNode childNode = getChild(childIndex); 249 250 if (childNode != null) { 251 if (!segments.isEmpty()) { 252 childNode.setErrorState(segments.getTail(), b); 253 } 254 } 255 } 256 else { 257 error = b; 258 } 259 } 260 }