Skip to content

Commit b0a357f

Browse files
author
Federico Fissore
committed
Library Manager: added Type filter dropdown
1 parent 6679393 commit b0a357f

File tree

10 files changed

+161
-35
lines changed

10 files changed

+161
-35
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package cc.arduino.contributions.libraries.filters;
2+
3+
import cc.arduino.contributions.libraries.ContributedLibrary;
4+
import com.google.common.base.Predicate;
5+
6+
public class TypePredicate implements Predicate<ContributedLibrary> {
7+
8+
private final String type;
9+
10+
public TypePredicate(String type) {
11+
this.type = type;
12+
}
13+
14+
@Override
15+
public boolean apply(ContributedLibrary input) {
16+
return input.getTypes() != null && input.getTypes().contains(type);
17+
}
18+
19+
@Override
20+
public boolean equals(Object obj) {
21+
return obj instanceof TypePredicate && ((TypePredicate) obj).type.equals(type);
22+
}
23+
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cc.arduino.contributions.libraries.ui;
2+
3+
import cc.arduino.contributions.libraries.ContributedLibrary;
4+
import cc.arduino.contributions.libraries.filters.CategoryPredicate;
5+
import cc.arduino.contributions.libraries.filters.TypePredicate;
6+
import cc.arduino.contributions.ui.DropdownItem;
7+
import com.google.common.base.Predicate;
8+
9+
public class DropdownLibraryOfTypeItem implements DropdownItem<ContributedLibrary> {
10+
11+
private final String type;
12+
13+
public DropdownLibraryOfTypeItem(String type) {
14+
this.type = type;
15+
}
16+
17+
public String toString() {
18+
return type;
19+
}
20+
21+
@Override
22+
public Predicate<ContributedLibrary> getFilterPredicate() {
23+
return new TypePredicate(type);
24+
}
25+
}

app/src/cc/arduino/contributions/libraries/ui/LibrariesIndexTableModel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import cc.arduino.contributions.VersionComparator;
3535
import cc.arduino.contributions.ui.FilteredAbstractTableModel;
3636
import com.google.common.base.Predicate;
37+
import com.google.common.base.Predicates;
3738
import com.google.common.collect.Collections2;
3839

3940
import java.util.*;
@@ -137,8 +138,8 @@ public void setIndexer(LibrariesIndexer _index) {
137138
Predicate<ContributedLibrary> selectedCategoryFilter = null;
138139
String selectedFilters[] = null;
139140

140-
public void updateIndexFilter(Predicate<ContributedLibrary> categoryFilter, String filters[]) {
141-
selectedCategoryFilter = categoryFilter;
141+
public void updateIndexFilter(String filters[], Predicate<ContributedLibrary>... additionalFilters) {
142+
selectedCategoryFilter = Predicates.and(additionalFilters);
142143
selectedFilters = filters;
143144
update();
144145
}

app/src/cc/arduino/contributions/libraries/ui/LibraryManagerUI.java

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,23 @@
3333
import cc.arduino.contributions.packages.ui.InstallerJDialogUncaughtExceptionHandler;
3434
import cc.arduino.contributions.ui.*;
3535
import cc.arduino.utils.Progress;
36+
import com.google.common.base.Predicate;
3637

3738
import javax.swing.*;
3839
import java.awt.*;
40+
import java.awt.event.ActionEvent;
41+
import java.awt.event.ActionListener;
42+
import java.util.Arrays;
3943
import java.util.Collection;
4044

4145
import static processing.app.I18n._;
4246

4347
@SuppressWarnings("serial")
44-
public class LibraryManagerUI extends InstallerJDialog {
48+
public class LibraryManagerUI extends InstallerJDialog<ContributedLibrary> {
4549

4650
private LibrariesIndexer indexer;
51+
private final JComboBox typeChooser;
52+
private Predicate<ContributedLibrary> typeFilter;
4753

4854
@Override
4955
protected FilteredAbstractTableModel createContribModel() {
@@ -80,11 +86,46 @@ protected void onRemove(ContributedLibrary library) {
8086

8187
public LibraryManagerUI(Frame parent) {
8288
super(parent, "Library Manager", Dialog.ModalityType.APPLICATION_MODAL, _("No internet connection available, the list of available libraries is not complete. You will be able to manage only the libraries you've already installed."));
89+
90+
filtersContainer.add(new JLabel(_("Category:")), 1);
91+
filtersContainer.remove(2);
92+
93+
typeChooser = new JComboBox();
94+
typeChooser.setMaximumRowCount(20);
95+
typeChooser.setEnabled(false);
96+
97+
filtersContainer.add(Box.createHorizontalStrut(5), 0);
98+
filtersContainer.add(new JLabel(_("Type:")), 1);
99+
filtersContainer.add(typeChooser, 2);
100+
}
101+
102+
protected final ActionListener typeChooserActionListener = new ActionListener() {
103+
104+
@Override
105+
public void actionPerformed(ActionEvent event) {
106+
DropdownItem<ContributedLibrary> selected = (DropdownItem<ContributedLibrary>) typeChooser.getSelectedItem();
107+
if (typeFilter == null || !typeFilter.equals(selected)) {
108+
typeFilter = selected.getFilterPredicate();
109+
if (contribTable.getCellEditor() != null) {
110+
contribTable.getCellEditor().stopCellEditing();
111+
}
112+
updateIndexFilter(filters, categoryFilter, typeFilter);
113+
}
114+
}
115+
};
116+
117+
@Override
118+
public void updateIndexFilter(String[] filters, Predicate<ContributedLibrary>... additionalFilters) {
119+
if (additionalFilters.length == 1) {
120+
additionalFilters = new Predicate[] { additionalFilters[0], typeFilter };
121+
}
122+
super.updateIndexFilter(filters, additionalFilters);
83123
}
84124

85125
public void setIndexer(LibrariesIndexer indexer) {
86126
this.indexer = indexer;
87127
categoryChooser.removeActionListener(categoryChooserActionListener);
128+
typeChooser.removeActionListener(typeChooserActionListener);
88129

89130
// TODO: Remove setIndexer and make getContribModel
90131
// return a FilteredAbstractTableModel
@@ -93,8 +134,6 @@ public void setIndexer(LibrariesIndexer indexer) {
93134
categoryFilter = null;
94135
categoryChooser.removeAllItems();
95136

96-
categoryChooser.addActionListener(categoryChooserActionListener);
97-
98137
// Load categories
99138
categoryChooser.addItem(new DropdownAllItem());
100139
categoryChooser.addItem(new DropdownInstalledContributionItem());
@@ -104,9 +143,21 @@ public void setIndexer(LibrariesIndexer indexer) {
104143
categoryChooser.addItem(new DropdownLibraryOfCategoryItem(category));
105144
}
106145

107-
// Enable categories combo only if there are two or more choices
108-
int count = categoryChooser.getItemCount();
109-
categoryChooser.setEnabled(count > 1);
146+
categoryChooser.setEnabled(categoryChooser.getItemCount() > 1);
147+
148+
categoryChooser.addActionListener(categoryChooserActionListener);
149+
categoryChooser.setSelectedIndex(0);
150+
151+
typeFilter = null;
152+
typeChooser.removeAllItems();
153+
typeChooser.addItem(new DropdownAllItem());
154+
Collection<String> types = indexer.getIndex().getTypes();
155+
for (String type : types) {
156+
typeChooser.addItem(new DropdownLibraryOfTypeItem(type));
157+
}
158+
typeChooser.setEnabled(typeChooser.getItemCount() > 1);
159+
typeChooser.addActionListener(typeChooserActionListener);
160+
typeChooser.setSelectedIndex(1);
110161

111162
filterField.setEnabled(contribModel.getRowCount() > 0);
112163

app/src/cc/arduino/contributions/packages/ui/ContributionIndexTableModel.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import cc.arduino.contributions.packages.ContributionsIndex;
3434
import cc.arduino.contributions.ui.FilteredAbstractTableModel;
3535
import com.google.common.base.Predicate;
36+
import com.google.common.base.Predicates;
3637

3738
import java.util.ArrayList;
3839
import java.util.LinkedList;
@@ -136,11 +137,12 @@ public void setIndex(ContributionsIndex _index) {
136137
index = _index;
137138
}
138139

139-
public void updateIndexFilter(Predicate<ContributedPlatform> categoryFilter, String filters[]) {
140+
public void updateIndexFilter(String filters[], Predicate<ContributedPlatform>... additionalFilters) {
140141
contributions.clear();
142+
Predicate<ContributedPlatform> filter = Predicates.and(additionalFilters);
141143
for (ContributedPackage pack : index.getPackages()) {
142144
for (ContributedPlatform platform : pack.getPlatforms()) {
143-
if (!categoryFilter.apply(platform)) {
145+
if (!filter.apply(platform)) {
144146
continue;
145147
}
146148
if (!stringContainsAll(platform.getName(), filters))

app/src/cc/arduino/contributions/ui/FilteredAbstractTableModel.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@
3434

3535
public abstract class FilteredAbstractTableModel<T> extends AbstractTableModel {
3636

37-
abstract public void updateIndexFilter(Predicate<T> categoryFilter, String[] filters);
37+
abstract public void updateIndexFilter(String[] filters, Predicate<T>... additionalFilters);
3838

3939
}

app/src/cc/arduino/contributions/ui/InstallerJDialog.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
*/
2929
package cc.arduino.contributions.ui;
3030

31+
import cc.arduino.contributions.packages.ui.ContributionIndexTableModel;
3132
import cc.arduino.contributions.ui.listeners.AbstractKeyListener;
3233
import com.google.common.base.Predicate;
34+
import com.google.common.base.Predicates;
35+
import com.google.common.collect.Collections2;
3336
import processing.app.Base;
3437
import processing.app.Theme;
3538

@@ -42,6 +45,9 @@
4245
import java.awt.event.ActionListener;
4346
import java.awt.event.KeyEvent;
4447
import java.awt.event.WindowEvent;
48+
import java.util.Arrays;
49+
import java.util.Collection;
50+
import java.util.LinkedList;
4551

4652
import static cc.arduino.contributions.packages.ui.ContributionIndexTableModel.DESCRIPTION_COL;
4753
import static processing.app.I18n._;
@@ -50,13 +56,10 @@ public abstract class InstallerJDialog<T> extends JDialog {
5056

5157
// Toolbar on top of the window:
5258
// - Categories drop-down menu
53-
protected final JLabel categoryLabel;
5459
protected final JComboBox categoryChooser;
55-
protected final Component categoryStrut1;
56-
protected final Component categoryStrut2;
57-
protected final Component categoryStrut3;
5860
// - Search text-field
5961
protected final FilterJTextField filterField;
62+
protected final JPanel filtersContainer;
6063
// Currently selected category and filters
6164
protected Predicate<T> categoryFilter;
6265
protected String[] filters;
@@ -65,7 +68,7 @@ public abstract class InstallerJDialog<T> extends JDialog {
6568
// Real contribution table
6669
protected JTable contribTable;
6770
// Model behind the table
68-
protected FilteredAbstractTableModel contribModel;
71+
protected FilteredAbstractTableModel<T> contribModel;
6972

7073
abstract protected FilteredAbstractTableModel createContribModel();
7174

@@ -90,12 +93,6 @@ public InstallerJDialog(Frame parent, String title, ModalityType applicationModa
9093
pane.setLayout(new BorderLayout());
9194

9295
{
93-
categoryStrut1 = Box.createHorizontalStrut(5);
94-
categoryStrut2 = Box.createHorizontalStrut(5);
95-
categoryStrut3 = Box.createHorizontalStrut(5);
96-
97-
categoryLabel = new JLabel(_("Category:"));
98-
9996
categoryChooser = new JComboBox();
10097
categoryChooser.setMaximumRowCount(20);
10198
categoryChooser.setEnabled(false);
@@ -107,20 +104,20 @@ protected void onFilter(String[] _filters) {
107104
if (contribTable.getCellEditor() != null) {
108105
contribTable.getCellEditor().stopCellEditing();
109106
}
110-
contribModel.updateIndexFilter(categoryFilter, filters);
107+
updateIndexFilter(filters, categoryFilter);
111108
}
112109
};
113110

114-
JPanel panel = new JPanel();
115-
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
116-
panel.add(categoryStrut1);
117-
panel.add(categoryLabel);
118-
panel.add(categoryStrut2);
119-
panel.add(categoryChooser);
120-
panel.add(categoryStrut3);
121-
panel.add(filterField);
122-
panel.setBorder(new EmptyBorder(7, 7, 7, 7));
123-
pane.add(panel, BorderLayout.NORTH);
111+
filtersContainer = new JPanel();
112+
filtersContainer.setLayout(new BoxLayout(filtersContainer, BoxLayout.X_AXIS));
113+
filtersContainer.add(Box.createHorizontalStrut(5));
114+
filtersContainer.add(new JLabel(_("Type:")));
115+
filtersContainer.add(Box.createHorizontalStrut(5));
116+
filtersContainer.add(categoryChooser);
117+
filtersContainer.add(Box.createHorizontalStrut(5));
118+
filtersContainer.add(filterField);
119+
filtersContainer.setBorder(new EmptyBorder(7, 7, 7, 7));
120+
pane.add(filtersContainer, BorderLayout.NORTH);
124121
}
125122

126123
contribModel = createContribModel();
@@ -216,7 +213,7 @@ public void actionPerformed(ActionEvent arg0) {
216213
}
217214
setProgressVisible(false, "");
218215

219-
setMinimumSize(new Dimension(600, 450));
216+
setMinimumSize(new Dimension(800, 450));
220217

221218
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
222219

@@ -235,6 +232,11 @@ public void run() {
235232
});
236233
}
237234

235+
public void updateIndexFilter(String[] filters, Predicate<T>... additionalFilters) {
236+
Collection<Predicate<T>> notNullAdditionalFilters = Collections2.filter(Arrays.asList(additionalFilters), Predicates.notNull());
237+
contribModel.updateIndexFilter(filters, notNullAdditionalFilters.toArray(new Predicate[notNullAdditionalFilters.size()]));
238+
}
239+
238240
public void setErrorMessage(String message) {
239241
errorMessage.setText("<html><body>" + message + "</body></html>");
240242
errorMessageBox.setVisible(true);
@@ -273,7 +275,7 @@ public void actionPerformed(ActionEvent event) {
273275
if (contribTable.getCellEditor() != null) {
274276
contribTable.getCellEditor().stopCellEditing();
275277
}
276-
contribModel.updateIndexFilter(categoryFilter, filters);
278+
updateIndexFilter(filters, categoryFilter);
277279
}
278280
}
279281
};

arduino-core/src/cc/arduino/contributions/libraries/ContributedLibrary.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ public abstract class ContributedLibrary extends DownloadableContribution {
6262

6363
public abstract List<String> getArchitectures();
6464

65+
public abstract List<String> getTypes();
66+
6567
public abstract List<ContributedLibraryReference> getRequires();
6668

6769
private boolean readOnly;

arduino-core/src/cc/arduino/contributions/libraries/LibrariesIndex.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,18 @@ public List<String> getCategories() {
6262

6363
return categories;
6464
}
65+
66+
public List<String> getTypes() {
67+
Collection<String> typesAccumulator = new HashSet<String>();
68+
for (ContributedLibrary lib : getLibraries()) {
69+
if (lib.getTypes() != null) {
70+
typesAccumulator.addAll(lib.getTypes());
71+
}
72+
}
73+
74+
List<String> types = new LinkedList<String>(typesAccumulator);
75+
Collections.sort(types);
76+
77+
return types;
78+
}
6579
}

arduino-core/src/processing/app/packages/UserLibrary.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,11 @@ public String getCategory() {
190190
return category;
191191
}
192192

193+
@Override
194+
public List<String> getTypes() {
195+
return Arrays.asList("Contributed");
196+
}
197+
193198
@Override
194199
public String getLicense() {
195200
return license;

0 commit comments

Comments
 (0)