/* * Copyright 2004 original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.extremecomponents.table.cell; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Set; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.collections.comparators.NullComparator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.extremecomponents.table.bean.Column; import org.extremecomponents.table.core.TableConstants; import org.extremecomponents.table.core.TableModel; import org.extremecomponents.table.view.html.TableActions; import org.extremecomponents.util.ExtremeUtils; import org.extremecomponents.util.HtmlBuilder; /** * A filter cell that is a droplist * * @author Jeff Johnston */ public class FilterDroplistCell implements Cell { private static Log logger = LogFactory.getLog(FilterDroplistCell.class); public String getExportDisplay(TableModel model, Column column) { return null; } public String getHtmlDisplay(TableModel model, Column column) { HtmlBuilder html = new HtmlBuilder(); if (!column.isFilterable()) { html.append(""); } else { Collection filterOptions = column.getFilterOptions(); if (filterOptions == null || filterOptions.isEmpty()) { filterOptions = getFilterDropList(model, column); } html.append(dropListHtml(model, column, filterOptions)); } return html.toString(); } protected Collection getFilterDropList(TableModel model, Column column) { List droplist = new ArrayList(); Set options = new HashSet(); Collection beans = model.getCollectionOfBeans(); for (Iterator iter = beans.iterator(); iter.hasNext();) { Object bean = iter.next(); try { Object obj = getFilterOption(column, bean); if ((obj != null) && !options.contains(obj)) { droplist.add(new Option(obj)); options.add(obj); } } catch (Exception e) { logger.debug("Problems getting the droplist.", e); } } BeanComparator comparator = new BeanComparator("label", new NullComparator()); Collections.sort(droplist, comparator); return droplist; } protected Object getFilterOption(Column column, Object bean) throws Exception { return PropertyUtils.getProperty(bean, column.getProperty()); } protected String dropListHtml(TableModel model, Column column, Collection droplist) { HtmlBuilder html = new HtmlBuilder(); html.td(2).close(); html.newline(); html.tabs(2); html.select().name(model.getTableHandler().prefixWithTableId() + TableConstants.FILTER + column.getAlias()); StringBuilder onkeypress = new StringBuilder(); onkeypress.append(new TableActions(model).getFilterAction()); html.onchange(onkeypress.toString()); html.close(); html.newline(); html.tabs(2); html.option().value("").close(); html.optionEnd(); Locale locale = model.getLocale(); for (Iterator iter = droplist.iterator(); iter.hasNext();) { FilterOption filterOption = (FilterOption) iter.next(); String value = String.valueOf(filterOption.getValue()); String label = String.valueOf(filterOption.getLabel()); if (column.isDate()) { value = ExtremeUtils.formatDate(column.getParse(), column.getFormat(), filterOption.getValue(), locale); } html.newline(); html.tabs(2); html.option().value(value); if (value.equals(column.getValueAsString())) { html.selected(); } html.close(); html.append(label); html.optionEnd(); } html.newline(); html.tabs(2); html.selectEnd(); html.tdEnd(); return html.toString(); } protected static class Option implements FilterOption { private final Object label; private final Object value; public Option(Object obj) { this.label = obj; this.value = obj; } public Option(Object label, Object value) { this.label = label; this.value = value; } public Object getLabel() { return label; } public Object getValue() { return value; } } }