mirror of
https://github.com/processing/processing4.git
synced 2026-06-16 04:26:26 +02:00
Implemented filter-search, libraries now shown in alphabetical order
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user