Just as you've seen
TextComponentMatcherEditor
filter issues with a
JTextField
, you can create a custom
MatcherEditor
to filter with the users
JList
. The first step is to create a simple
Matcher
for static
filtering. Then we'll create MatcherEditor
to
implement dynamic filtering using our static
Matcher
.
Implementing the Matcher
will require you
to write a single method, matches()
to test whether
a given element should be filtered out. You'll need to create a
Matcher
that accepts issues for a list of
users.
It's unfortunate that Glazed Lists'
Matcher
uses the same class name as
java.util.regex.Matcher
. If you find yourself
implementing a Glazed Lists Matcher
that
requires regular expressions, you'll need to fully qualify classnames
throughout your code, and we apologize. We considered 'Predicate' for
the interface name but decided it was too presumptuous. Naming is very
important to us at Glazed Lists!
import java.util.*; // glazed lists import ca.odell.glazedlists.*; import ca.odell.glazedlists.matchers.*; // a simple issues library import ca.odell.issuezilla.*; /** * This {@link Matcher} only matches users in a predefined set. * * @author <a href="mailto:jesse@odel.on.ca">Jesse Wilson</a> */ public class IssuesForUsersMatcher implements Matcher { /** the users to match */ private Set users = new HashSet(); /** * Create a new {@link IssuesForUsersMatcher} that matches only * {@link Issue}s that have one or more user in the specified list. */ public IssuesForUsersMatcher(Collection users) { // make a defensive copy of the users this.users.addAll(users); } /** * Test whether to include or not include the specified issue based * on whether or not their user is selected. */ public boolean matches(Object o) { if(o == null) return false; if(users.isEmpty()) return true; Issue issue = (Issue)o; String user = issue.getReporter(); return users.contains(user); } }
With this IssuesForUsersMatcher
in place,
create an EventList
that contains the issues that
match only the specified users:
List users = new ArrayList(); users.add("jessewilson"); users.add("kevinmaltby"); users.add("tmao"); Matcher usersMatcher = new IssuesForUsersMatcher(users); EventList issues = ... FilterList IssuesForUsers = new FilterList(issues, usersMatcher);
To avoid concurrency problems, make your
Matcher
s immutable. This
enables your matches()
method to be used from
multiple threads without synchronization.