From 2ec6a90b70f62c070c1985b7365f482d52737cee Mon Sep 17 00:00:00 2001 From: hneemann Date: Mon, 17 Jul 2017 21:21:25 +0200 Subject: [PATCH] split library and user defined circuits to different tree nodes --- .../digital/draw/library/ElementLibrary.java | 74 ++++--------- .../draw/library/ElementLibraryFolder.java | 103 ++++++++++++++++++ .../digital/draw/library/LibraryNode.java | 7 ++ src/main/resources/lang/lang_de.xml | 1 + src/main/resources/lang/lang_en.xml | 1 + 5 files changed, 134 insertions(+), 52 deletions(-) create mode 100644 src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index 417357640..0388bd0df 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -66,7 +66,8 @@ public class ElementLibrary implements Iterable private final ArrayList listeners = new ArrayList<>(); private final LibraryNode root; private ShapeFactory shapeFactory; - private LibraryNode customNode; + private ElementLibraryFolder custom; + private ElementLibraryFolder library; private File rootLibraryPath; /** @@ -159,6 +160,9 @@ public class ElementLibrary implements Iterable populateNodeMap(); + custom = new ElementLibraryFolder(root, Lang.get("menu_custom")); + library = new ElementLibraryFolder(root, Lang.get("menu_library")); + isProgrammable.clear(); root.traverse(libraryNode -> { ElementTypeDescription d = libraryNode.getDescriptionOrNull(); @@ -190,7 +194,7 @@ public class ElementLibrary implements Iterable * @return the node with the custom elements */ public LibraryNode getCustomNode() { - return customNode; + return custom.getNode(); } private void populateNodeMap() { @@ -295,32 +299,19 @@ public class ElementLibrary implements Iterable File libPath = Settings.getInstance().get(Keys.SETTINGS_LIBRARY_PATH); if (libPath != null && !libPath.exists()) libPath = null; - LibraryNode changedNode = null; - if (rootLibraryPath != null || libPath != null) { - if (customNode == null) { - customNode = new LibraryNode(Lang.get("menu_custom")); - root.add(customNode); - changedNode = root; - } else { - customNode.removeAll(); - changedNode = customNode; - } - int num = 0; - if (libPath != null) - num += scanFolder(libPath, customNode); - if (rootLibraryPath != null) - num += scanFolder(rootLibraryPath, customNode); - LOGGER.debug("found " + num + " files"); - } else if (customNode != null) { - root.remove(customNode); - customNode = null; - changedNode = root; - } + LibraryNode cn1 = library.scanFolder(libPath); + LibraryNode cn2 = custom.scanFolder(rootLibraryPath); populateNodeMap(); - if (changedNode != null) - fireLibraryChanged(changedNode); + if (cn1 == root || cn2 == root) { + fireLibraryChanged(root); + } else { + if (cn1 != null) + fireLibraryChanged(cn1); + if (cn2 != null) + fireLibraryChanged(cn2); + } } /** @@ -333,31 +324,6 @@ public class ElementLibrary implements Iterable l.libraryChanged(node); } - private static int scanFolder(File path, LibraryNode node) { - int num = 0; - File[] list = path.listFiles(); - if (list != null) { - ArrayList orderedList = new ArrayList<>(Arrays.asList(list)); - orderedList.sort((f1, f2) -> NumStringComparator.compareStr(f1.getName(), f2.getName())); - for (File f : orderedList) { - if (f.isDirectory()) { - LibraryNode n = new LibraryNode(f.getName()); - num += scanFolder(f, n); - if (!n.isEmpty()) - node.add(n); - } - } - for (File f : orderedList) { - final String name = f.getName(); - if (f.isFile() && name.endsWith(".dig")) { - node.add(new LibraryNode(f)); - num++; - } - } - } - return num; - } - /** * Adds a listener to this library * @@ -598,8 +564,12 @@ public class ElementLibrary implements Iterable map.put(name, libraryNode); libraryNode.setUnique(true); } else { - presentNode.setUnique(false); - libraryNode.setUnique(false); + if (presentNode.getFile().equals(libraryNode.getFile())) + libraryNode.setUnique(true); + else { + presentNode.setUnique(false); // ToDo does not work if there are more than two duplicates and + libraryNode.setUnique(false); // some of the duplicates point to the same file + } } } } diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java b/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java new file mode 100644 index 000000000..0c413570f --- /dev/null +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java @@ -0,0 +1,103 @@ +package de.neemann.digital.draw.library; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; + +/** + * Handles a single folder + * Created by hneemann on 17.07.17. + */ +public class ElementLibraryFolder { + private static final Logger LOGGER = LoggerFactory.getLogger(ElementLibraryFolder.class); + + private final LibraryNode root; + private final String menuTitle; + private LibraryNode node; + private File lastPath; + + /** + * create a new folder manager + * + * @param root the root node + * @param menuTitle string to show in menu + */ + public ElementLibraryFolder(LibraryNode root, String menuTitle) { + this.root = root; + this.menuTitle = menuTitle; + } + + /** + * @return the managed node + */ + public LibraryNode getNode() { + return node; + } + + private boolean hasChanged(File path) { + File lp = lastPath; + lastPath = path; + + if (lp == path) return false; + + return lp == null || !lp.equals(path); + } + + /** + * scans the given folder + * + * @param path the path to scan + * @return the node which has changed + */ + public LibraryNode scanFolder(File path) { + LibraryNode changedNode = null; + if (hasChanged(path)) { + if (path != null) { + if (node == null) { + node = new LibraryNode(menuTitle); + root.add(node); + changedNode = root; + } else { + node.removeAll(); + changedNode = node; + } + int num = scanFolder(path, node); + LOGGER.debug("found " + num + " files in " + path); + } else if (node != null) { + root.remove(node); + node = null; + changedNode = root; + } + } + return changedNode; + } + + private static int scanFolder(File path, LibraryNode node) { + int num = 0; + File[] list = path.listFiles(); + if (list != null) { + ArrayList orderedList = new ArrayList<>(Arrays.asList(list)); + orderedList.sort((f1, f2) -> NumStringComparator.compareStr(f1.getName(), f2.getName())); + for (File f : orderedList) { + if (f.isDirectory()) { + LibraryNode n = new LibraryNode(f.getName()); + num += scanFolder(f, n); + if (!n.isEmpty()) + node.add(n); + } + } + for (File f : orderedList) { + final String name = f.getName(); + if (f.isFile() && name.endsWith(".dig")) { + node.add(new LibraryNode(f)); + num++; + } + } + } + return num; + } + +} diff --git a/src/main/java/de/neemann/digital/draw/library/LibraryNode.java b/src/main/java/de/neemann/digital/draw/library/LibraryNode.java index 95c3625fc..c4372861f 100644 --- a/src/main/java/de/neemann/digital/draw/library/LibraryNode.java +++ b/src/main/java/de/neemann/digital/draw/library/LibraryNode.java @@ -359,4 +359,11 @@ public class LibraryNode implements Iterable { public boolean isUnique() { return unique; } + + /** + * @return the file containing this circuit + */ + public File getFile() { + return file; + } } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 184fb10b3..e9db528c8 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -747,6 +747,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Ausschneiden Kopieren Benutzerdefiniert + Bibliothek Löschen Löscht ausgewählte Elemente Bearbeiten diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index cb795528a..f86c7b0d7 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -734,6 +734,7 @@ The names of the variables may not be unique. Cut Copy Custom + Library Delete components Delete selected single component or group of components. Edit