]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/modulebrowser/ModuleNameTreeEntry.java
(refs #7242) First version of SCL Development perspective
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / modulebrowser / ModuleNameTreeEntry.java
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/modulebrowser/ModuleNameTreeEntry.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/modulebrowser/ModuleNameTreeEntry.java
new file mode 100644 (file)
index 0000000..6f657b3
--- /dev/null
@@ -0,0 +1,62 @@
+package org.simantics.scl.ui.modulebrowser;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+import gnu.trove.map.hash.THashMap;
+
+public class ModuleNameTreeEntry implements Comparable<ModuleNameTreeEntry> {
+    public final ModuleNameTreeEntry parent;
+    public final String fullName;
+    public final String name;
+    public final THashMap<String, ModuleNameTreeEntry> childMap = new THashMap<String, ModuleNameTreeEntry>();
+    public boolean isModule;
+    
+    public ModuleNameTreeEntry(ModuleNameTreeEntry parent, String fullName, String name) {
+        this.parent = parent;
+        this.fullName = fullName;
+        this.name = name;
+    }
+    
+    public void addModule(String moduleFullName) {
+        int startingPos = fullName.isEmpty() ? 0 : fullName.length()+1;
+        int p = moduleFullName.indexOf('/', startingPos);
+        if(p == -1) {
+            String name = moduleFullName.substring(startingPos);
+            ModuleNameTreeEntry entry = getOrCreateChildMapEntry(name);
+            entry.isModule = true;
+        }
+        else {
+            String name = moduleFullName.substring(startingPos, p);
+            ModuleNameTreeEntry entry = getOrCreateChildMapEntry(name);
+            entry.addModule(moduleFullName);
+        }
+    }
+    
+    private ModuleNameTreeEntry getOrCreateChildMapEntry(String name) {
+        ModuleNameTreeEntry entry = childMap.get(name);
+        if(entry == null) {
+            String newFullName = fullName.isEmpty() ? name : fullName + "/" + name;
+            entry = new ModuleNameTreeEntry(this, newFullName, name);
+            childMap.put(name, entry);
+        }
+        return entry;
+    }
+    
+    public Collection<ModuleNameTreeEntry> children() {
+        ArrayList<ModuleNameTreeEntry> children = new ArrayList<ModuleNameTreeEntry>(childMap.values());
+        Collections.sort(children);
+        return children;
+    }
+
+    @Override
+    public int compareTo(ModuleNameTreeEntry o) {
+        return name.compareTo(o.name);
+    }
+    
+    @Override
+    public String toString() {
+        return name;
+    }
+}