/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.utils; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Set; import java.util.TreeSet; import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableModel; /** * Liste permettant a un utilisateur de selectionner des filtres sur un tableau. Cette * JListe est connecte a un <code>TableFilter</code> (responsable du filtre). La liste * se rempli avec les informations contenu dans le model. * * @author $Author: marcona $ * @version $Revision: 1.4 $ * * @see TableFilter */ public class TableMultiFilterGui extends JTable { private InnerModel model = new InnerModel(); private TableFilterListener tableListener = new TableFilterListener(); /** * Constructor */ public TableMultiFilterGui() { setModel(model); getColumn(getModel().getColumnName(0)).setMinWidth(25); getColumn(getModel().getColumnName(0)).setMaxWidth(25); } /** * DOCUMENT ME! * * @param filterModel The new TableFilter value * @param column */ public void setTableFilter(TableFilter filterModel, int column) { if (model.tableFilterModel != null) { model.tableFilterModel.removePropertyChangeListener(model.filteredColumn, tableListener); model.tableFilterModel.getModel().removeTableModelListener(tableListener); } model.init(filterModel, column); filterModel.addPropertyChangeListener(column, tableListener); filterModel.getModel().addTableModelListener(tableListener); } /** * Retourne la colonne filtr�e. * * @return The FilteredColumn value */ public int getFilteredColumn() { return model.filteredColumn; } /** * Ecoute les changements de Filtre, et de contenu. * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private class TableFilterListener implements PropertyChangeListener, TableModelListener { /** * DOCUMENT ME! * * @param evt Description of Parameter */ public void tableChanged(TableModelEvent evt) { model.fillTable(); } /** * DOCUMENT ME! * * @param evt */ public void propertyChange(PropertyChangeEvent evt) { repaint(); } } /** * DOCUMENT ME! * * @author $Author: marcona $ * @version $Revision: 1.4 $ */ private static class InnerModel extends AbstractTableModel { static final String[] columnNames = {"Sel", "Valeur"}; static final Class[] columnClass = {Boolean.class, Object.class}; /** Description of the Field */ public TableFilter tableFilterModel = null; /** Description of the Field */ public int filteredColumn = 0; private java.util.List valueList = new java.util.ArrayList(); /** * Constructeur de HashMapTableModel */ InnerModel() {} /** * Sets the valueAt attribute of the HashMapTableModel object * * @param aValue The new valueAt value * @param rowIndex The new valueAt value * @param columnIndex The new valueAt value */ public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (columnIndex == 0) { if (tableFilterModel.containsFilterValue(filteredColumn, valueList.get(rowIndex))) { tableFilterModel.removeFilter(filteredColumn, valueList.get(rowIndex)); } else { tableFilterModel.addFilter(filteredColumn, valueList.get(rowIndex)); } this.fireTableCellUpdated(rowIndex, columnIndex); } } /** * Gets the cellEditable attribute of the HashMapTableModel object * * @param rowIndex Description of Parameter * @param columnIndex Description of Parameter * * @return The cellEditable value */ public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 0; } /** * Gets the RowCount attribute of the HashMapTableModel object * * @return The RowCount value */ public int getRowCount() { return valueList.size(); } /** * Gets the ColumnCount attribute of the HashMapTableModel object * * @return The ColumnCount value */ public int getColumnCount() { return columnNames.length; } /** * Gets the ColumnName attribute of the HashMapTableModel object * * @param columnIndex Description of Parameter * * @return The ColumnName value */ public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } /** * Gets the Class attribute of the HashMapTableModel object * * @param columnIndex Description of Parameter * * @return The ColumnName value */ public Class getColumnClass(int columnIndex) { return columnClass[columnIndex]; } /** * Gets the ValueAt attribute of the HashMapTableModel object * * @param row Description of Parameter * @param column Description of Parameter * * @return The ValueAt value */ public Object getValueAt(int row, int column) { Object value = valueList.get(row); switch (column) { case 0: if (tableFilterModel.containsFilterValue(filteredColumn, value)) { return Boolean.TRUE; } else { return Boolean.FALSE; } case 1: return value; } return null; } /** * Sets the value attribute of the HashMapTableModel object * * @param tfm Description of Parameter * @param filteredColumn Description of Parameter */ public void init(TableFilter tfm, int filteredColumn) { this.filteredColumn = filteredColumn; this.tableFilterModel = tfm; fillTable(); } /** * Overview. * * <p> * Description * </p> */ public void fillTable() { boolean hasNullValue = false; Set set = new TreeSet(); TableModel model = tableFilterModel.getModel(); for (int i = 0; i < model.getRowCount(); i++) { if (model.getValueAt(i, filteredColumn) != null) { set.add(model.getValueAt(i, filteredColumn)); } else { hasNullValue = true; } } valueList.clear(); if (hasNullValue) { valueList.add(null); } valueList.addAll(set); fireTableDataChanged(); } } }