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 }