+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;
+ }
+}