/* * DefaultDynamicTableColumnModel.java * Copyright 2008 (C) Connor Petty <mistercpp2000@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Created on Feb 25, 2008, 2:01:31 PM */ package pcgen.gui2.util.table; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.event.TableColumnModelEvent; import javax.swing.table.DefaultTableColumnModel; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import pcgen.gui2.util.event.DynamicTableColumnModelListener; /** * * @author Connor Petty <mistercpp2000@gmail.com> */ public class DefaultDynamicTableColumnModel extends DefaultTableColumnModel implements DynamicTableColumnModel { private final List<TableColumn> availableColumns = new ArrayList<>(5); private final List<TableColumn> safeColumns = Collections.unmodifiableList(availableColumns); private int offset; /** * This constructs an empty table model with an intial offset of {@code offset}. * When adding columns to the model, the first {@code offset} number of colums added will * be made always visible. * @param offset this is the number of always visible columns when this model is populated. */ public DefaultDynamicTableColumnModel(int offset) { this.offset = offset; } /** * * @param model the columns model to copy data from * @param offset describes the number of always visible columns */ public DefaultDynamicTableColumnModel(TableColumnModel model, int offset) { this(offset); ArrayList<TableColumn> allColumns = Collections.list(model.getColumns()); if (offset < allColumns.size()) { tableColumns.addAll(allColumns.subList(0, offset)); availableColumns.addAll(allColumns.subList(offset, allColumns.size())); } } /** * * @param model the columns model to copy data from * @param offset describes the number of always visible columns * @param visibleColumns used to specify additional columns * that will be visible upon initialization */ public DefaultDynamicTableColumnModel(TableColumnModel model, int offset, int[] visibleColumns) { this(model, offset); for (int column : visibleColumns) { super.addColumn(availableColumns.get(column - offset)); } } @Override public void addDynamicTableColumnModelListener(DynamicTableColumnModelListener listener) { listenerList.add(DynamicTableColumnModelListener.class, listener); } @Override public void removeDynamicTableColumnModelListener(DynamicTableColumnModelListener listener) { listenerList.remove(DynamicTableColumnModelListener.class, listener); } /** * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @param e the event received * @see javax.swing.event.EventListenerList */ protected void fireAvailableColumnAdded(TableColumnModelEvent e) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == DynamicTableColumnModelListener.class) { // Lazily create the event: // if (e == null) // e = new ChangeEvent(this); ((DynamicTableColumnModelListener) listeners[i + 1]).availableColumnAdded(e); } } } /** * Notifies all listeners that have registered interest for * notification on this event type. The event instance * is lazily created using the parameters passed into * the fire method. * @param e the event received * @see javax.swing.event.EventListenerList */ protected void fireAvailableColumnRemoved(TableColumnModelEvent e) { // Guaranteed to return a non-null array Object[] listeners = listenerList.getListenerList(); // Process the listeners last to first, notifying // those that are interested in this event for (int i = listeners.length - 2; i >= 0; i -= 2) { if (listeners[i] == DynamicTableColumnModelListener.class) { // Lazily create the event: // if (e == null) // e = new ChangeEvent(this); ((DynamicTableColumnModelListener) listeners[i + 1]).availableColumnRemove(e); } } } @Override public void addColumn(TableColumn column) { if (getColumnCount() < offset) { super.addColumn(column); } else { int index = availableColumns.size(); availableColumns.add(column); fireAvailableColumnAdded(new TableColumnModelEvent(this, -1, index)); } } @Override public void removeColumn(TableColumn column) { super.removeColumn(column); if (availableColumns.contains(column)) { int index = availableColumns.indexOf(column); availableColumns.remove(column); fireAvailableColumnRemoved(new TableColumnModelEvent(this, index, -1)); } } @Override public List<TableColumn> getAvailableColumns() { return safeColumns; } @Override public boolean isVisible(TableColumn column) { return tableColumns.contains(column); } @Override public void setVisible(TableColumn column, boolean visible) { if (availableColumns.contains(column) && isVisible(column) != visible) { if (visible) { super.addColumn(column); } else { super.removeColumn(column); } } } }