diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 284fd35a3..e877ec8e2 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -399,7 +399,7 @@ public final class Main extends JFrame implements ClosingWindowListener.ConfirmS componentOnPane = split; } else { if (treeModel != null) { - library.removeListener(treeModel); + treeModel.close(); treeModel = null; } getContentPane().add(circuitScrollPanel); diff --git a/src/main/java/de/neemann/digital/gui/components/tree/LibraryTreeModel.java b/src/main/java/de/neemann/digital/gui/components/tree/LibraryTreeModel.java index ef6e5149c..cde1e22a2 100644 --- a/src/main/java/de/neemann/digital/gui/components/tree/LibraryTreeModel.java +++ b/src/main/java/de/neemann/digital/gui/components/tree/LibraryTreeModel.java @@ -22,6 +22,7 @@ import java.util.Iterator; */ public class LibraryTreeModel implements TreeModel, LibraryListener { private final LibraryNode root; + private final ElementLibrary library; private final Filter filter; private final ArrayList listeners = new ArrayList<>(); private final HashMap map; @@ -43,11 +44,19 @@ public class LibraryTreeModel implements TreeModel, LibraryListener { */ public LibraryTreeModel(ElementLibrary library, Filter filter) { root = library.getRoot(); + this.library = library; this.filter = filter; map = new HashMap<>(); library.addListener(this); } + /** + * Called to detach the model from the library + */ + public void close() { + library.removeListener(this); + } + @Override public Object getRoot() { return root; @@ -89,11 +98,17 @@ public class LibraryTreeModel implements TreeModel, LibraryListener { @Override public void libraryChanged(LibraryNode node) { - if (map.remove(node) == null) + if (node.isLeaf()) { + map.remove(node); + TreeModelEvent treeModelEvent = new TreeModelEvent(this, new TreePath(node.getPath())); + for (TreeModelListener l : listeners) + l.treeNodesChanged(treeModelEvent); + } else { map.clear(); - final TreeModelEvent treeModelEvent = new TreeModelEvent(this, new TreePath(node.getPath())); - for (TreeModelListener l : listeners) - l.treeStructureChanged(treeModelEvent); + TreeModelEvent treeModelEvent = new TreeModelEvent(this, new TreePath(root.getPath())); + for (TreeModelListener l : listeners) + l.treeStructureChanged(treeModelEvent); + } } /** @@ -143,8 +158,11 @@ public class LibraryTreeModel implements TreeModel, LibraryListener { if (filter.accept(ln)) list.add(ln); } else { - if (getContainer(ln).size() > 0) + Container c = new Container(ln, filter); + if (c.size() > 0) { list.add(ln); + map.put(ln, c); + } } } } diff --git a/src/main/java/de/neemann/digital/gui/components/tree/SelectTree.java b/src/main/java/de/neemann/digital/gui/components/tree/SelectTree.java index bf5b96dc3..8c49003a5 100644 --- a/src/main/java/de/neemann/digital/gui/components/tree/SelectTree.java +++ b/src/main/java/de/neemann/digital/gui/components/tree/SelectTree.java @@ -80,8 +80,9 @@ public class SelectTree extends JTree { if (!oldModel.isFiltered() && newModel.isFiltered()) storedExpanded = getExpandedDescendants(new TreePath(getModel().getRoot())); - boolean restore = oldModel.isFiltered() && !newModel.isFiltered(); + oldModel.close(); + boolean restore = oldModel.isFiltered() && !newModel.isFiltered(); super.setModel(newModel); if (restore && storedExpanded != null) { while (storedExpanded.hasMoreElements())