From 1789b23d36ae0a64b72ef89708bbc5280cf0522b Mon Sep 17 00:00:00 2001 From: pesckal Date: Mon, 27 Jun 2011 08:03:31 +0000 Subject: [PATCH] Implemented filter-search, libraries now shown in alphabetical order --- app/src/processing/app/LibraryListPanel.java | 28 +++++++- app/src/processing/app/LibraryListing.java | 67 +++++++++++++++++--- app/src/processing/app/LibraryManager.java | 41 +++++++++--- 3 files changed, 117 insertions(+), 19 deletions(-) diff --git a/app/src/processing/app/LibraryListPanel.java b/app/src/processing/app/LibraryListPanel.java index 9ed421c34..eecf3e965 100644 --- a/app/src/processing/app/LibraryListPanel.java +++ b/app/src/processing/app/LibraryListPanel.java @@ -22,6 +22,9 @@ package processing.app; +import java.util.*; +import java.util.List; + import javax.swing.*; import javax.swing.text.*; @@ -34,14 +37,20 @@ import processing.app.LibraryListing.LibraryInfo; public class LibraryListPanel extends JPanel implements Scrollable { + HashMap libPanelsByInfo; + LibraryListing libraries; private PreferredViewPositionListener preferredViewPositionListener; public LibraryListPanel(LibraryListing libraries) { super(); preferredViewPositionListener = null; + this.libraries = libraries; setLayout(new GridBagLayout()); + + libPanelsByInfo = new HashMap(); + int row = 0; for (LibraryInfo libInfo : libraries.getAllLibararies()) { GridBagConstraints c = new GridBagConstraints(); @@ -50,7 +59,9 @@ public class LibraryListPanel extends JPanel implements Scrollable { c.gridx = 0; c.gridy = row++; - add(new LibraryPanel(libInfo), c); + LibraryPanel libPanel = new LibraryPanel(libInfo); + libPanelsByInfo.put(libPanel.libInfo, libPanel); + add(libPanel, c); } GridBagConstraints verticalFill = new GridBagConstraints(); @@ -67,7 +78,22 @@ public class LibraryListPanel extends JPanel implements Scrollable { requestFocusInWindow(); } }); + + } + + public void filterLibraries(List filters) { + List hiddenLibraries = libraries.getAllLibararies(); + for (LibraryInfo lib : libraries.getFilteredLibraryList(filters)) { + libPanelsByInfo.get(lib).setVisible(true); + hiddenLibraries.remove(lib); + } + + for (LibraryInfo lib : hiddenLibraries) { + libPanelsByInfo.get(lib).setVisible(false); + } + + updateLibraryListSizeAndPosition(0, false, null); } /** diff --git a/app/src/processing/app/LibraryListing.java b/app/src/processing/app/LibraryListing.java index f2992d150..3e83c63e0 100644 --- a/app/src/processing/app/LibraryListing.java +++ b/app/src/processing/app/LibraryListing.java @@ -33,15 +33,26 @@ import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; +import processing.app.LibraryListing.LibraryInfo.Author; + public class LibraryListing { Map> librariesByCategory; - + ArrayList allLibraries; + public LibraryListing(File xmlFile) { librariesByCategory = new HashMap>(); new LibraryXmlParser(xmlFile); + + allLibraries = new ArrayList(); + for (Entry> libListEntry : librariesByCategory + .entrySet()) { + allLibraries.addAll(libListEntry.getValue()); + } + + Collections.sort(allLibraries); } public Set getCategories() { @@ -49,16 +60,50 @@ public class LibraryListing { } public List getAllLibararies() { - ArrayList allLibs = new ArrayList(); - for (Entry> libListEntry : librariesByCategory - .entrySet()) { - allLibs.addAll(libListEntry.getValue()); - } - return allLibs; + return new ArrayList(allLibraries); } public List getLibararies(String category) { - return librariesByCategory.get(category); + ArrayList libinfos = new ArrayList(librariesByCategory.get(category)); + Collections.sort(libinfos); + return libinfos; + } + + public List getFilteredLibraryList(List filters) { + ArrayList filteredList = new ArrayList(); + filteredList.addAll(allLibraries); + + Iterator it = filteredList.iterator(); + while (it.hasNext()) { + LibraryInfo libInfo = it.next(); + + for (String filter : filters) { + if (!matches(libInfo, filter)) { + it.remove(); + break; + } + } + + } + + return filteredList; + } + + private boolean matches(LibraryInfo libInfo, String filter) { + filter = "\\p{Alnum}*" + filter.toLowerCase() + "\\p{Alnum}*"; + + if (filter.isEmpty()) { + return true; + } + + for (Author author : libInfo.authors) { + if (author.name.toLowerCase().matches(filter)) { + return true; + } + } + return libInfo.name.toLowerCase().matches(filter) + || libInfo.name.toLowerCase().matches(filter); + } public static class LibraryListFetcher { @@ -115,7 +160,7 @@ public class LibraryListing { } } - public static class LibraryInfo { + public static class LibraryInfo implements Comparable { public final String categoryName; public final String name; @@ -155,6 +200,10 @@ public class LibraryListing { } + public int compareTo(LibraryInfo o) { + return name.compareTo(o.name); + } + } /** diff --git a/app/src/processing/app/LibraryManager.java b/app/src/processing/app/LibraryManager.java index 346253775..f3699419d 100644 --- a/app/src/processing/app/LibraryManager.java +++ b/app/src/processing/app/LibraryManager.java @@ -33,14 +33,6 @@ import java.util.zip.*; import javax.swing.*; import javax.swing.event.*; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.w3c.dom.Document; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; import processing.app.LibraryListPanel.PreferredViewPositionListener; import processing.app.LibraryListing.LibraryListFetcher; @@ -136,6 +128,8 @@ public class LibraryManager { urlLabel = new JLabel("Library URL:"); libraryUrl = new JTextField(); + libraryUrl.setPreferredSize(new Dimension(0, 10 + libraryUrl + .getFontMetrics(libraryUrl.getFont()).getHeight())); installButton = new JButton("Install"); installProgressBar = new JProgressBar(); @@ -253,6 +247,30 @@ public class LibraryManager { c.weightx = 1; c.fill = GridBagConstraints.HORIZONTAL; filterField = new FilterField(); + filterField.getDocument().addDocumentListener(new DocumentListener() { + + public void removeUpdate(DocumentEvent e) { + filter(); + } + + public void insertUpdate(DocumentEvent e) { + filter(); + } + + public void changedUpdate(DocumentEvent e) { + filter(); + } + + void filter() { + String filter = filterField.getFilterText(); + filter = filter.toLowerCase(); + + // Replace anything but 0-9 or a-z with a space + filter = filter.replaceAll("[^\\x30-\\x39^\\x61-\\x7a]", " "); + libraryListPane.filterLibraries(Arrays.asList(filter.split(" "))); + } + }); + pane.add(filterField, c); LibraryListFetcher llf = new LibraryListFetcher(); @@ -274,10 +292,11 @@ public class LibraryManager { final JScrollPane scrollPane = new JScrollPane(); scrollPane.setPreferredSize(new Dimension(300,300)); scrollPane.setViewportView(libraryListPane); + scrollPane.getViewport().setBackground(UIManager.getColor("List.background")); scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); pane.add(scrollPane, c); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - + scrollPane.getViewport().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent ce) { @@ -599,6 +618,10 @@ public class LibraryManager { }); } + public String getFilterText() { + return isShowingHint ? "" : getText(); + } + public void updateStyle() { if (isShowingHint) { filterField.setText(filterHint);