/*
* Created on 09.04.2008
*
*/
package org.jdesktop.swingx.demos.table;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import javax.swing.RowFilter;
import org.jdesktop.beans.AbstractBean;
import org.jdesktop.swingx.JXTable;
public class OscarFiltering extends AbstractBean {
private RowFilter<Object, Object> winnerFilter;
private RowFilter<Object, Object> searchFilter;
private String filterString;
private boolean showOnlyWinners = false;
private JXTable oscarTable;
public OscarFiltering(JXTable oscarTable) {
this.oscarTable = oscarTable;
}
public boolean isFilteringByString() {
return !isEmpty(getFilterString());
}
private boolean isEmpty(String filterString) {
return filterString == null || filterString.length() == 0;
}
/**
* @param filterString the filterString to set
*/
public void setFilterString(String filterString) {
String oldValue = getFilterString();
// <snip> Filter control
// set the filter string (bound to the input in the textfield)
// and update the search RowFilter
this.filterString = filterString;
updateSearchFilter();
// </snip>
firePropertyChange("filterString", oldValue, getFilterString());
}
/**
* @return the filterString
*/
public String getFilterString() {
return filterString;
}
/**
* @param showOnlyWinners the showOnlyWinners to set
*/
public void setShowOnlyWinners(boolean showOnlyWinners) {
if (isShowOnlyWinners() == showOnlyWinners) return;
boolean oldValue = isShowOnlyWinners();
this.showOnlyWinners = showOnlyWinners;
updateWinnerFilter();
firePropertyChange("showOnlyWinners", oldValue, isShowOnlyWinners());
}
/**
* @return the showOnlyWinners
*/
public boolean isShowOnlyWinners() {
return showOnlyWinners;
}
private void updateWinnerFilter() {
winnerFilter = showOnlyWinners ? createWinnerFilter() : null;
updateFilters();
}
private void updateSearchFilter() {
if ((filterString != null) && (filterString.length() > 0)) {
searchFilter = createSearchFilter(filterString + ".*");
} else {
searchFilter = null;
}
updateFilters();
}
private void updateFilters() {
// <snip> Filter control
// set the filters to the table
if ((searchFilter != null) && (winnerFilter != null)) {
List<RowFilter<Object, Object>> filters =
new ArrayList<RowFilter<Object, Object>>(2);
filters.add(winnerFilter);
filters.add(searchFilter);
RowFilter<Object, Object> comboFilter = RowFilter.andFilter(filters);
oscarTable.setRowFilter(comboFilter);
} else if (searchFilter != null) {
oscarTable.setRowFilter(searchFilter);
} else {
oscarTable.setRowFilter(winnerFilter);
}
// </snip>
}
private RowFilter<Object, Object> createWinnerFilter() {
return new RowFilter<Object, Object>() {
@Override
public boolean include(Entry<? extends Object, ? extends Object> entry) {
OscarTableModel oscarModel = (OscarTableModel) entry.getModel();
OscarCandidate candidate = oscarModel.getCandidate(((Integer) entry.getIdentifier()).intValue());
if (candidate.isWinner()) {
// Returning true indicates this row should be shown.
return true;
}
// loser
return false;
}
};
}
// <snip> Filter control
// create and return a custom RowFilter specialized on OscarCandidate
private RowFilter<Object, Object> createSearchFilter(final String filterString) {
return new RowFilter<Object, Object>() {
@Override
public boolean include(Entry<? extends Object, ? extends Object> entry) {
OscarTableModel oscarModel = (OscarTableModel) entry.getModel();
OscarCandidate candidate = oscarModel.getCandidate(((Integer) entry.getIdentifier()).intValue());
boolean matches = false;
Pattern p = Pattern.compile(filterString + ".*", Pattern.CASE_INSENSITIVE);
// match against movie title
String movie = candidate.getMovieTitle();
if (movie != null) {
if (movie.startsWith("The ")) {
movie = movie.replace("The ", "");
} else if (movie.startsWith("A ")) {
movie = movie.replace("A ", "");
}
// Returning true indicates this row should be shown.
matches = p.matcher(movie).matches();
}
List<String> persons = candidate.getPersons();
for (String person : persons) {
// match against persons as well
if (p.matcher(person).matches()) {
matches = true;
}
}
return matches;
// </snip>
}
};
}
}