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    }