Implemented filter-search, libraries now shown in alphabetical order

This commit is contained in:
pesckal
2011-06-27 08:03:31 +00:00
parent 473facfbe6
commit 1789b23d36
3 changed files with 117 additions and 19 deletions
+27 -1
View File
@@ -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<LibraryInfo, LibraryPanel> libPanelsByInfo;
LibraryListing libraries;
private PreferredViewPositionListener preferredViewPositionListener;
public LibraryListPanel(LibraryListing libraries) {
super();
preferredViewPositionListener = null;
this.libraries = libraries;
setLayout(new GridBagLayout());
libPanelsByInfo = new HashMap<LibraryInfo, LibraryPanel>();
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<String> filters) {
List<LibraryInfo> 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);
}
/**
+58 -9
View File
@@ -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<String, List<LibraryInfo>> librariesByCategory;
ArrayList<LibraryInfo> allLibraries;
public LibraryListing(File xmlFile) {
librariesByCategory = new HashMap<String, List<LibraryInfo>>();
new LibraryXmlParser(xmlFile);
allLibraries = new ArrayList<LibraryInfo>();
for (Entry<String, List<LibraryInfo>> libListEntry : librariesByCategory
.entrySet()) {
allLibraries.addAll(libListEntry.getValue());
}
Collections.sort(allLibraries);
}
public Set<String> getCategories() {
@@ -49,16 +60,50 @@ public class LibraryListing {
}
public List<LibraryInfo> getAllLibararies() {
ArrayList<LibraryInfo> allLibs = new ArrayList<LibraryInfo>();
for (Entry<String, List<LibraryInfo>> libListEntry : librariesByCategory
.entrySet()) {
allLibs.addAll(libListEntry.getValue());
}
return allLibs;
return new ArrayList<LibraryInfo>(allLibraries);
}
public List<LibraryInfo> getLibararies(String category) {
return librariesByCategory.get(category);
ArrayList<LibraryInfo> libinfos = new ArrayList<LibraryInfo>(librariesByCategory.get(category));
Collections.sort(libinfos);
return libinfos;
}
public List<LibraryInfo> getFilteredLibraryList(List<String> filters) {
ArrayList<LibraryInfo> filteredList = new ArrayList<LibraryInfo>();
filteredList.addAll(allLibraries);
Iterator<LibraryInfo> 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<LibraryInfo> {
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);
}
}
/**
+32 -9
View File
@@ -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);