From ac063e2bd64cc6e760a8101cd9190bb9d1746778 Mon Sep 17 00:00:00 2001 From: hneemann Date: Thu, 31 May 2018 16:16:52 +0200 Subject: [PATCH] limits the menu size in the component menu. Closes #152 --- .../draw/library/ElementLibraryFolder.java | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java b/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java index de485b80e..40a3dd0ae 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibraryFolder.java @@ -5,6 +5,7 @@ */ package de.neemann.digital.draw.library; +import de.neemann.digital.lang.Lang; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,14 +19,14 @@ import java.util.Arrays; public class ElementLibraryFolder { private static final Logger LOGGER = LoggerFactory.getLogger(ElementLibraryFolder.class); private static final int MAX_FILES_TO_SCAN = 5000; + private static final int MAX_MENU_SIZE = 12; private final LibraryNode root; private final String menuTitle; private LibraryNode node; - private File lastPath; /** - * create a new folder manager + * Create a new folder manager. * * @param root the root node * @param menuTitle string to show in menu @@ -43,7 +44,7 @@ public class ElementLibraryFolder { } /** - * scans the given folder + * Scans the given folder * * @param path the path to scan * @param isLibrary true if this is the library @@ -84,17 +85,58 @@ public class ElementLibraryFolder { node.add(n); } } + + ArrayList fileList = new ArrayList<>(); for (File f : orderedList) { scanCounter.incFile(); final String name = f.getName(); if (f.isFile() && name.endsWith(".dig")) { - node.add(new LibraryNode(f, isLibrary)); + fileList.add(f); scanCounter.incCircuit(); } } + + if (fileList.size() <= MAX_MENU_SIZE + 1) { + for (File f : fileList) + node.add(new LibraryNode(f, isLibrary)); + } else { + for (int i = 0; i < MAX_MENU_SIZE; i++) + node.add(new LibraryNode(fileList.get(i), isLibrary)); + + final int size = fileList.size() - MAX_MENU_SIZE; + int subMenus = (size - 1) / MAX_MENU_SIZE + 1; + int delta = (size - 1) / subMenus + 1; + + int pos = MAX_MENU_SIZE; + while (pos < fileList.size()) { + int pos2 = pos + delta; + if (pos2 > fileList.size()) + pos2 = fileList.size(); + + String name; + if (subMenus > 1) + name = clean(fileList.get(pos)) + " - " + clean(fileList.get(pos2 - 1)); + else + name = Lang.get("lib_more"); + + LibraryNode n = new LibraryNode(name); + node.add(n); + for (int p = pos; p < pos2; p++) + n.add(new LibraryNode(fileList.get(p), isLibrary)); + + pos = pos2; + } + } } } + private static String clean(File file) { + String s = file.getName(); + if (s.endsWith(".dig")) + s = s.substring(0, s.length() - 4); + return s; + } + private static final class ScanCounter { private int fileCounter; private int circuitCounter;