diff --git a/app/src/cc/arduino/libraries/contributions/ui/DropdownAllLibrariesItem.java b/app/src/cc/arduino/libraries/contributions/ui/DropdownAllLibrariesItem.java new file mode 100644 index 000000000..cc1584bc0 --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/DropdownAllLibrariesItem.java @@ -0,0 +1,20 @@ +package cc.arduino.libraries.contributions.ui; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import cc.arduino.ui.filters.NoopPredicate; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +import static processing.app.I18n._; + +public class DropdownAllLibrariesItem implements DropdownItem { + + public String toString() { + return _("All"); + } + + @Override + public Predicate getFilterPredicate() { + return new NoopPredicate(); + } +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/DropdownBuiltInLibrariesItem.java b/app/src/cc/arduino/libraries/contributions/ui/DropdownBuiltInLibrariesItem.java new file mode 100644 index 000000000..5b6c8ac94 --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/DropdownBuiltInLibrariesItem.java @@ -0,0 +1,20 @@ +package cc.arduino.libraries.contributions.ui; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import cc.arduino.libraries.contributions.ui.filters.BuiltInPredicate; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +import static processing.app.I18n._; + +public class DropdownBuiltInLibrariesItem implements DropdownItem { + + public String toString() { + return _("Built-in"); + } + + @Override + public Predicate getFilterPredicate() { + return new BuiltInPredicate(); + } +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/DropdownInstalledLibrariesItem.java b/app/src/cc/arduino/libraries/contributions/ui/DropdownInstalledLibrariesItem.java new file mode 100644 index 000000000..bcbc0234b --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/DropdownInstalledLibrariesItem.java @@ -0,0 +1,20 @@ +package cc.arduino.libraries.contributions.ui; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import cc.arduino.libraries.contributions.ui.filters.InstalledPredicate; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +import static processing.app.I18n._; + +public class DropdownInstalledLibrariesItem implements DropdownItem { + + public String toString() { + return _("Installed"); + } + + @Override + public Predicate getFilterPredicate() { + return new InstalledPredicate(); + } +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/DropdownLibraryOfCategoryItem.java b/app/src/cc/arduino/libraries/contributions/ui/DropdownLibraryOfCategoryItem.java new file mode 100644 index 000000000..b846d9a51 --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/DropdownLibraryOfCategoryItem.java @@ -0,0 +1,24 @@ +package cc.arduino.libraries.contributions.ui; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import cc.arduino.libraries.contributions.ui.filters.CategoryPredicate; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +public class DropdownLibraryOfCategoryItem implements DropdownItem { + + private final String category; + + public DropdownLibraryOfCategoryItem(String category) { + this.category = category; + } + + public String toString() { + return category; + } + + @Override + public Predicate getFilterPredicate() { + return new CategoryPredicate(category); + } +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/LibrariesIndexTableModel.java b/app/src/cc/arduino/libraries/contributions/ui/LibrariesIndexTableModel.java index 7567f4b91..5b221a3e9 100644 --- a/app/src/cc/arduino/libraries/contributions/ui/LibrariesIndexTableModel.java +++ b/app/src/cc/arduino/libraries/contributions/ui/LibrariesIndexTableModel.java @@ -30,7 +30,6 @@ package cc.arduino.libraries.contributions.ui; import cc.arduino.libraries.contributions.ContributedLibrary; import cc.arduino.libraries.contributions.LibrariesIndexer; -import cc.arduino.packages.contributions.ContributedPackage; import cc.arduino.packages.contributions.ContributedPlatform; import cc.arduino.packages.contributions.VersionComparator; import cc.arduino.ui.FilteredAbstractTableModel; @@ -39,14 +38,12 @@ import com.google.common.collect.Collections2; import java.util.*; -import static cc.arduino.packages.contributions.VersionComparator.VERSION_COMPARATOR; - @SuppressWarnings("serial") -public class LibrariesIndexTableModel extends FilteredAbstractTableModel { +public class LibrariesIndexTableModel extends FilteredAbstractTableModel { public final static int DESCRIPTION_COL = 0; - public static class ContributedLibraryReleases implements Comparable { + public static class ContributedLibraryReleases implements Comparable { public String name; public List releases = new ArrayList(); public List versions = new ArrayList(); @@ -139,11 +136,11 @@ public class LibrariesIndexTableModel extends FilteredAbstractTableModel { indexer = _index; } - String selectedCategory = null; + Predicate selectedCategoryFilter = null; String selectedFilters[] = null; - public void updateIndexFilter(String category, String filters[]) { - selectedCategory = category; + public void updateIndexFilter(Predicate categoryFilter, String filters[]) { + selectedCategoryFilter = categoryFilter; selectedFilters = filters; update(); } @@ -245,10 +242,8 @@ public class LibrariesIndexTableModel extends FilteredAbstractTableModel { } private void applyFilterToLibrary(ContributedLibrary lib) { - if (selectedCategory != null && !selectedCategory.isEmpty()) { - if (lib.getCategory() == null || !lib.getCategory().equals(selectedCategory)) { - return; - } + if (selectedCategoryFilter != null && !selectedCategoryFilter.apply(lib)) { + return; } if (!stringContainsAll(lib.getName(), selectedFilters) && !stringContainsAll(lib.getParagraph(), selectedFilters) && !stringContainsAll(lib.getSentence(), selectedFilters)) { return; diff --git a/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java b/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java index 639ee8673..eb0d4a2a9 100644 --- a/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java +++ b/app/src/cc/arduino/libraries/contributions/ui/LibraryManagerUI.java @@ -31,13 +31,9 @@ package cc.arduino.libraries.contributions.ui; import cc.arduino.libraries.contributions.ContributedLibrary; import cc.arduino.libraries.contributions.LibrariesIndexer; import cc.arduino.packages.contributions.ui.InstallerJDialogUncaughtExceptionHandler; -import cc.arduino.ui.DropdownALLItem; -import cc.arduino.ui.FilteredAbstractTableModel; -import cc.arduino.ui.InstallerJDialog; -import cc.arduino.ui.InstallerTableCell; +import cc.arduino.ui.*; import cc.arduino.utils.Progress; -import javax.swing.*; import java.awt.*; import java.util.Collection; @@ -87,17 +83,20 @@ public class LibraryManagerUI extends InstallerJDialog { // return a FilteredAbstractTableModel getContribModel().setIndexer(indexer); - category = null; + categoryFilter = null; categoryChooser.removeAllItems(); getContribModel().addTableModelListener(tableModelListener); categoryChooser.addActionListener(categoryChooserActionListener); // Load categories + categoryChooser.addItem(new DropdownAllLibrariesItem()); + categoryChooser.addItem(new DropdownInstalledLibrariesItem()); + categoryChooser.addItem(new DropdownBuiltInLibrariesItem()); Collection categories = indexer.getIndex().getCategories(); - categoryChooser.addItem(new DropdownALLItem()); - for (String s : categories) - categoryChooser.addItem(s); + for (String category : categories) { + categoryChooser.addItem(new DropdownLibraryOfCategoryItem(category)); + } // Enable categories combo only if there are two or more choices int count = categoryChooser.getItemCount(); diff --git a/app/src/cc/arduino/libraries/contributions/ui/filters/BuiltInPredicate.java b/app/src/cc/arduino/libraries/contributions/ui/filters/BuiltInPredicate.java new file mode 100644 index 000000000..3778b782a --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/filters/BuiltInPredicate.java @@ -0,0 +1,17 @@ +package cc.arduino.libraries.contributions.ui.filters; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import com.google.common.base.Predicate; + +public class BuiltInPredicate implements Predicate { + + @Override + public boolean apply(ContributedLibrary input) { + return input.isReadOnly(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof BuiltInPredicate; + } +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/filters/CategoryPredicate.java b/app/src/cc/arduino/libraries/contributions/ui/filters/CategoryPredicate.java new file mode 100644 index 000000000..354076c93 --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/filters/CategoryPredicate.java @@ -0,0 +1,24 @@ +package cc.arduino.libraries.contributions.ui.filters; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import com.google.common.base.Predicate; + +public class CategoryPredicate implements Predicate { + + private final String category; + + public CategoryPredicate(String category) { + this.category = category; + } + + @Override + public boolean apply(ContributedLibrary input) { + return input.getCategory() != null && category.equals(input.getCategory()); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CategoryPredicate && ((CategoryPredicate) obj).category.equals(category); + } + +} diff --git a/app/src/cc/arduino/libraries/contributions/ui/filters/InstalledPredicate.java b/app/src/cc/arduino/libraries/contributions/ui/filters/InstalledPredicate.java new file mode 100644 index 000000000..bc0219afc --- /dev/null +++ b/app/src/cc/arduino/libraries/contributions/ui/filters/InstalledPredicate.java @@ -0,0 +1,17 @@ +package cc.arduino.libraries.contributions.ui.filters; + +import cc.arduino.libraries.contributions.ContributedLibrary; +import com.google.common.base.Predicate; + +public class InstalledPredicate implements Predicate { + @Override + public boolean apply(ContributedLibrary input) { + return input.isInstalled(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof InstalledPredicate; + } + +} diff --git a/app/src/cc/arduino/packages/contributions/ui/ContributionIndexTableModel.java b/app/src/cc/arduino/packages/contributions/ui/ContributionIndexTableModel.java index 8cd9423c5..e9d9cf682 100644 --- a/app/src/cc/arduino/packages/contributions/ui/ContributionIndexTableModel.java +++ b/app/src/cc/arduino/packages/contributions/ui/ContributionIndexTableModel.java @@ -32,6 +32,7 @@ import cc.arduino.packages.contributions.ContributedPackage; import cc.arduino.packages.contributions.ContributedPlatform; import cc.arduino.packages.contributions.ContributionsIndex; import cc.arduino.ui.FilteredAbstractTableModel; +import com.google.common.base.Predicate; import java.util.ArrayList; import java.util.LinkedList; @@ -40,7 +41,7 @@ import java.util.List; import static processing.app.I18n._; @SuppressWarnings("serial") -public class ContributionIndexTableModel extends FilteredAbstractTableModel { +public class ContributionIndexTableModel extends FilteredAbstractTableModel { public final static int DESCRIPTION_COL = 0; @@ -137,13 +138,12 @@ public class ContributionIndexTableModel extends FilteredAbstractTableModel { index = _index; } - public void updateIndexFilter(String category, String filters[]) { + public void updateIndexFilter(Predicate categoryFilter, String filters[]) { contributions.clear(); for (ContributedPackage pack : index.getPackages()) { for (ContributedPlatform platform : pack.getPlatforms()) { - if (category != null) { - if (!category.equals(platform.getCategory())) - continue; + if (!categoryFilter.apply(platform)) { + continue; } if (!stringContainsAll(platform.getName(), filters)) continue; diff --git a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java index 195889932..4a654e810 100644 --- a/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java +++ b/app/src/cc/arduino/packages/contributions/ui/ContributionManagerUI.java @@ -28,15 +28,16 @@ */ package cc.arduino.packages.contributions.ui; +import cc.arduino.libraries.contributions.ui.DropdownLibraryOfCategoryItem; import cc.arduino.packages.contributions.ContributedPlatform; import cc.arduino.packages.contributions.ContributionInstaller; import cc.arduino.packages.contributions.ContributionsIndexer; +import cc.arduino.libraries.contributions.ui.DropdownAllLibrariesItem; import cc.arduino.ui.FilteredAbstractTableModel; import cc.arduino.ui.InstallerJDialog; import cc.arduino.ui.InstallerTableCell; import cc.arduino.utils.Progress; -import javax.swing.*; import java.awt.*; import java.util.Collection; @@ -86,7 +87,7 @@ public class ContributionManagerUI extends InstallerJDialog { getContribModel().setIndex(indexer.getIndex()); - category = null; + categoryFilter = null; categoryChooser.removeAllItems(); filterField.setEnabled(getContribModel().getRowCount() > 0); @@ -95,12 +96,11 @@ public class ContributionManagerUI extends InstallerJDialog { categoryChooser.addActionListener(categoryChooserActionListener); // Enable categories combo only if there are two or more choices + categoryChooser.addItem(new DropdownAllCoresItem()); Collection categories = indexer.getIndex().getCategories(); - int count = categories.size(); - categoryChooser.setEnabled(count > 1); - - for (String s : categories) - categoryChooser.addItem(s); + for (String s : categories) { + categoryChooser.addItem(new DropdownCoreOfCategoryItem(s)); + } // Create ConstributionInstaller tied with the provided index installer = new ContributionInstaller(indexer) { diff --git a/app/src/cc/arduino/packages/contributions/ui/DropdownAllCoresItem.java b/app/src/cc/arduino/packages/contributions/ui/DropdownAllCoresItem.java new file mode 100644 index 000000000..82b66aa6e --- /dev/null +++ b/app/src/cc/arduino/packages/contributions/ui/DropdownAllCoresItem.java @@ -0,0 +1,20 @@ +package cc.arduino.packages.contributions.ui; + +import cc.arduino.ui.filters.NoopPredicate; +import cc.arduino.packages.contributions.ContributedPlatform; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +import static processing.app.I18n._; + +public class DropdownAllCoresItem implements DropdownItem { + + public String toString() { + return _("All"); + } + + @Override + public Predicate getFilterPredicate() { + return new NoopPredicate(); + } +} diff --git a/app/src/cc/arduino/packages/contributions/ui/DropdownCoreOfCategoryItem.java b/app/src/cc/arduino/packages/contributions/ui/DropdownCoreOfCategoryItem.java new file mode 100644 index 000000000..73a0c0fa5 --- /dev/null +++ b/app/src/cc/arduino/packages/contributions/ui/DropdownCoreOfCategoryItem.java @@ -0,0 +1,24 @@ +package cc.arduino.packages.contributions.ui; + +import cc.arduino.packages.contributions.ContributedPlatform; +import cc.arduino.packages.contributions.ui.filters.CategoryPredicate; +import cc.arduino.ui.DropdownItem; +import com.google.common.base.Predicate; + +public class DropdownCoreOfCategoryItem implements DropdownItem { + + private final String category; + + public DropdownCoreOfCategoryItem(String category) { + this.category = category; + } + + public String toString() { + return category; + } + + @Override + public Predicate getFilterPredicate() { + return new CategoryPredicate(category); + } +} diff --git a/app/src/cc/arduino/packages/contributions/ui/filters/CategoryPredicate.java b/app/src/cc/arduino/packages/contributions/ui/filters/CategoryPredicate.java new file mode 100644 index 000000000..7a47b3e37 --- /dev/null +++ b/app/src/cc/arduino/packages/contributions/ui/filters/CategoryPredicate.java @@ -0,0 +1,24 @@ +package cc.arduino.packages.contributions.ui.filters; + +import cc.arduino.packages.contributions.ContributedPlatform; +import com.google.common.base.Predicate; + +public class CategoryPredicate implements Predicate { + + private final String category; + + public CategoryPredicate(String category) { + this.category = category; + } + + @Override + public boolean apply(ContributedPlatform input) { + return input.getCategory() != null && category.equals(input.getCategory()); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CategoryPredicate && ((CategoryPredicate) obj).category.equals(category); + } + +} diff --git a/app/src/cc/arduino/ui/DropdownALLItem.java b/app/src/cc/arduino/ui/DropdownALLItem.java deleted file mode 100644 index 094fc55d5..000000000 --- a/app/src/cc/arduino/ui/DropdownALLItem.java +++ /dev/null @@ -1,15 +0,0 @@ -package cc.arduino.ui; - -import static processing.app.I18n._; - -public class DropdownALLItem implements DropdownItem { - - @Override - public String toString() { - return _("All"); - } - - public String getItemValue() { - return ""; - } -} diff --git a/app/src/cc/arduino/ui/DropdownItem.java b/app/src/cc/arduino/ui/DropdownItem.java index aada7bb34..b91bdcfb7 100644 --- a/app/src/cc/arduino/ui/DropdownItem.java +++ b/app/src/cc/arduino/ui/DropdownItem.java @@ -1,6 +1,9 @@ package cc.arduino.ui; -public interface DropdownItem { +import com.google.common.base.Predicate; + +public interface DropdownItem { + + Predicate getFilterPredicate(); - String getItemValue(); } diff --git a/app/src/cc/arduino/ui/FilteredAbstractTableModel.java b/app/src/cc/arduino/ui/FilteredAbstractTableModel.java index 6e267dcc6..fd006c93b 100644 --- a/app/src/cc/arduino/ui/FilteredAbstractTableModel.java +++ b/app/src/cc/arduino/ui/FilteredAbstractTableModel.java @@ -28,10 +28,13 @@ */ package cc.arduino.ui; +import cc.arduino.libraries.contributions.ContributedLibrary; +import com.google.common.base.Predicate; + import javax.swing.table.AbstractTableModel; -public abstract class FilteredAbstractTableModel extends AbstractTableModel { +public abstract class FilteredAbstractTableModel extends AbstractTableModel { - abstract public void updateIndexFilter(String category, String[] filters); + abstract public void updateIndexFilter(Predicate categoryFilter, String[] filters); } diff --git a/app/src/cc/arduino/ui/InstallerJDialog.java b/app/src/cc/arduino/ui/InstallerJDialog.java index 675db1207..1fc7e05a1 100644 --- a/app/src/cc/arduino/ui/InstallerJDialog.java +++ b/app/src/cc/arduino/ui/InstallerJDialog.java @@ -28,6 +28,8 @@ */ package cc.arduino.ui; +import cc.arduino.libraries.contributions.ContributedLibrary; +import com.google.common.base.Predicate; import processing.app.Base; import processing.app.Theme; @@ -46,7 +48,7 @@ import java.awt.event.WindowEvent; import static cc.arduino.packages.contributions.ui.ContributionIndexTableModel.DESCRIPTION_COL; import static processing.app.I18n._; -public abstract class InstallerJDialog extends JDialog { +public abstract class InstallerJDialog extends JDialog { // Toolbar on top of the window: // - Categories drop-down menu @@ -58,7 +60,7 @@ public abstract class InstallerJDialog extends JDialog { // - Search text-field protected FilterJTextField filterField; // Currently selected category and filters - protected String category; + protected Predicate categoryFilter; protected String[] filters; // Real contribution table @@ -118,7 +120,7 @@ public abstract class InstallerJDialog extends JDialog { protected void onFilter(String[] _filters) { filters = _filters; cellEditor.stopCellEditing(); - contribModel.updateIndexFilter(category, filters); + contribModel.updateIndexFilter(categoryFilter, filters); } }; @@ -271,22 +273,13 @@ public abstract class InstallerJDialog extends JDialog { protected ActionListener categoryChooserActionListener = new ActionListener() { - public String getSelectedItem() { - Object obj = categoryChooser.getSelectedItem(); - if (obj instanceof String) { - return (String) obj; - } - DropdownItem item = (DropdownItem) obj; - return item.getItemValue(); - } - @Override public void actionPerformed(ActionEvent event) { - String selected = getSelectedItem(); - if (category == null || !category.equals(selected)) { - category = selected; + DropdownItem selected = (DropdownItem) categoryChooser.getSelectedItem(); + if (categoryFilter == null || !categoryFilter.equals(selected)) { + categoryFilter = selected.getFilterPredicate(); cellEditor.stopCellEditing(); - contribModel.updateIndexFilter(category, filters); + contribModel.updateIndexFilter(categoryFilter, filters); } } }; diff --git a/app/src/cc/arduino/ui/filters/NoopPredicate.java b/app/src/cc/arduino/ui/filters/NoopPredicate.java new file mode 100644 index 000000000..3384a59f4 --- /dev/null +++ b/app/src/cc/arduino/ui/filters/NoopPredicate.java @@ -0,0 +1,18 @@ +package cc.arduino.ui.filters; + +import com.google.common.base.Predicate; + +public class NoopPredicate implements Predicate { + + @Override + public boolean apply(T input) { + return true; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof NoopPredicate; + } + + +}