All Downloads are FREE. Search and download functionalities are using the official Maven repository.

xdev.ui.XdevGroupTable Maven / Gradle / Ivy

There is a newer version: 6.0.2
Show newest version
package xdev.ui;

/*-
 * #%L
 * XDEV Component Suite
 * %%
 * Copyright (C) 2011 - 2021 XDEV Software
 * %%
 * This program 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 3 of the
 * License, or (at your option) any later version.
 * 
 * This program 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 General Lesser Public License for more details.
 * 
 * You should have received a copy of the GNU General Lesser Public
 * License along with this program.  If not, see
 * .
 * #L%
 */


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import java.util.Vector;

import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;

import xdev.db.Operator;
import xdev.db.sql.Condition;
import xdev.db.sql.SELECT;
import xdev.ui.persistence.Persistable;
import xdev.ui.table.ExtendedTable;
import xdev.ui.table.ExtendedTableSupport;
import xdev.ui.table.XdevTableModelWrapper;
import xdev.util.ObjectUtils;
import xdev.vt.VirtualTable;
import xdev.vt.VirtualTable.VirtualTableRow;
import xdev.vt.VirtualTableModel;
import xdev.vt.VirtualTableWrapper;

import com.jidesoft.grid.AutoFilterTableHeader;
import com.jidesoft.grid.DefaultGroupTableModel;
import com.jidesoft.grid.FilterableTableModel;
import com.jidesoft.grid.GroupTable;
import com.jidesoft.grid.GroupTableHeader;
import com.jidesoft.grid.GroupTablePopupMenuCustomizer;
import com.jidesoft.grid.SortListener;
import com.jidesoft.grid.TableHeaderPopupMenuInstaller;
import com.jidesoft.grid.TableModelWrapperUtils;
import com.jidesoft.grid.TableUtils;


/**
 * This is a extended Version of Jide's {@link GroupTable}.
 * 

* It provides all features of the {@code GroupTable} and provides integration * support for XDEV's {@code VirtualTable}. *

* Integration works by wrapping a {@link VirtualTableModel} within an instance * of {@link DefaultGroupTableModel}. *

*

* * @author XDEV Software * @see GroupTable */ public class XdevGroupTable extends GroupTable implements ExtendedTable, XdevFocusCycleComponent, VirtualTableEditor, Persistable, PopupRowSelectionHandler { /** * serialVersionUID. */ private static final long serialVersionUID = 1L; /** * A specialized support class for {@link XdevGroupTable} instances. * * @author XDEV Software * */ private static class Support extends ExtendedTableSupport { /** * Creates a new instance. * * @param table * the table to support. * @param mdc * the master detail component for this support class. */ Support(XdevGroupTable table) { super(table); setShowGroupHeaders(true); } /** * {@inheritDoc} *

* This override returns a {@link GroupTableHeader}. *

*/ @Override protected AutoFilterTableHeader createTableHeader() { GroupTableHeader header = new GroupTableHeader(table); header.setGroupHeaderEnabled(false); return header; } /** * Displays / hides group headers. * * @param showGroupHeaders * if {@code true} group headers are displayed. */ void setShowGroupHeaders(boolean showGroupHeaders) { ((GroupTableHeader)tableHeader).setGroupHeaderEnabled(showGroupHeaders); } /** * Are group headers displayed? * * @return if {@code true} group headers are displayed */ boolean isShowGroupHeaders() { return ((GroupTableHeader)tableHeader).isGroupHeaderEnabled(); } /** * {@inheritDoc} *

* This override add a {@link GroupTablePopupMenuCustomizer} to the * popup header menu. *

*/ @Override protected void customizeTableHeaderPopupMenuInstaller( TableHeaderPopupMenuInstaller installer) { super.customizeTableHeaderPopupMenuInstaller(installer); installer.addTableHeaderPopupMenuCustomizer(new GroupTablePopupMenuCustomizer()); } } /** * A supporting instance for performing group table specific operations. */ protected Support support; /** * This class provides functionality common to all CS table types . */ protected XdevTableModelWrapper modelWrapper; /** * flag for single level grouping. */ private boolean singleLevel = false; /** * flag for showing columns for group count. */ private boolean showGroupColumns = false; /** * flag for showing count columns. */ private boolean showCountColumns = false; /** * flag for keeping the column order. */ private boolean keepColumnOrder = false; /** * flag for showing a separate grouping column. */ private boolean showSeparateGroupColumn = false; /** * flag for configuring, if table is editable. */ private boolean editable = false; /** * an integer specifying the preferred number of rows to display without * requiring scrolling. */ private int visibleRows = 8; /** * Color of table rows with even index. */ private Color evenBackground = null; /** * Color of table rows with odd index. */ private Color oddBackground = null; /** * Should the gui state be persisted? Defaults to {@code true}. */ private boolean persistenceEnabled = true; /** * @see JTable#JTable() */ public XdevGroupTable() { super(); init(); } /** * * @param numRows * the number of rows the table holds * @param numColumns * the number of columns the table holds * @see JTable#JTable(int, int) */ public XdevGroupTable(int numRows, int numColumns) { super(numRows,numColumns); init(); } /** * @param rowData * the data for the new table * @param columnNames * names of each column * @see JTable#JTable(Object[][], Object[]) * */ public XdevGroupTable(Object[][] rowData, Object[] columnNames) { super(rowData,columnNames); init(); } /** * * @param dm * the data model for the table * @param cm * the column model for the table * @param sm * the row selection model for the table * @see JTable#JTable(TableModel, TableColumnModel, ListSelectionModel) * */ public XdevGroupTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) { super(dm,cm,sm); init(); } /** * * @param dm * the data model for the table * @param cm * the column model for the table * @see JTable#JTable(TableModel, TableColumnModel) * */ public XdevGroupTable(TableModel dm, TableColumnModel cm) { super(dm,cm); init(); } /** * @param dm * the data model for the table * @see JTable#JTable(TableModel) * */ public XdevGroupTable(TableModel dm) { setModel(dm); init(); } /** * @param rowData * the data for the new table * @param columnNames * names of each column * @see JTable#JTable(Vector, Vector) * */ @SuppressWarnings("rawtypes") // inherited untyped Vector from super class public XdevGroupTable(Vector rowData, Vector columnNames) { super(rowData,columnNames); init(); } /** * This Constructor initializes a new XdevGroupTable with a * {@link VirtualTableModel} and number of column indices. * * @param virtualTableModel * the {@link VirtualTableModel} to use * @param groupColumnIndices * the column indices used for grouping */ public XdevGroupTable(VirtualTableModel virtualTableModel, int... groupColumnIndices) { super(wrapVirtualTableRows(virtualTableModel,groupColumnIndices)); init(); } /** * This Constructor initializes a new XdevGroupTable with a * {@link VirtualTableModel} and a number of column names. * * @param virtualTableModel * the {@link VirtualTableModel} to use * @param groupColumnNames * the column indices used for grouping * @throws IllegalArgumentException * if a specified column name does not exist in the * {@link VirtualTableModel}. */ public XdevGroupTable(VirtualTableModel virtualTableModel, String... groupColumnNames) throws IllegalArgumentException { super(wrapVirtualTableRows(virtualTableModel,groupColumnNames)); init(); } private void init() { // #12158 a DefaultGroupTableModel has to be attached to the table, // prior to initializing the support class this.setModel(new DefaultGroupTableModel(this.getModel())); support = new Support(this); support.initRenderersAndEditors(); setFillsViewportHeight(true); setFillsBottom(true); setFillsRight(true); setFillsSelection(true); } /** * re inits properties with dependencies. */ private void initPropertyIndependency() { this.enableShowGroupColumns(this.showGroupColumns); this.enableShowCountColumns(this.showCountColumns); this.enableShowSeparateGroupColumn(this.showSeparateGroupColumn); this.enableKeepColumnOrder(this.keepColumnOrder); this.enableSingleLevel(this.singleLevel); } /** * Wraps a {@code VirtualTableModel} within a {@code DefaultGroupTableModel} * . * * @param virtualTableModel * the {@code VirtualTableModel} to wrap * @param groupColumnIndices * the column indices used for grouping * @return a {@code DefaultGroupTableModel} */ private static DefaultGroupTableModel wrapVirtualTableRows(VirtualTableModel virtualTableModel, int... groupColumnIndices) { FilterableTableModel filterableTableModel = new FilterableTableModel(virtualTableModel); DefaultGroupTableModel model = new DefaultGroupTableModel(filterableTableModel); for(int i : groupColumnIndices) { model.addGroupColumn(i); } model.groupAndRefresh(); return model; } /** * Wraps a {@code VirtualTableModel} within a {@code DefaultGroupTableModel} * . * * @param virtualTableModel * the {@code VirtualTableModel} to wrap * @param groupColumnNames * the column names used for grouping * @return a {@code DefaultGroupTableModel} */ private static DefaultGroupTableModel wrapVirtualTableRows(VirtualTableModel virtualTableModel, String[] groupColumnNames) { FilterableTableModel filterableTableModel = new FilterableTableModel(virtualTableModel); DefaultGroupTableModel groupTableModel = new DefaultGroupTableModel(filterableTableModel); for(String columnName : groupColumnNames) { int columnIndex = virtualTableModel.getVT().getColumnIndex(columnName); if(columnIndex < 0) { throw new IllegalArgumentException("Column name: " + columnName + " does not exist."); } int outerColumnIndex = TableModelWrapperUtils.getColumnAt(groupTableModel, virtualTableModel,columnIndex); groupTableModel.addGroupColumn(outerColumnIndex); } groupTableModel.groupAndRefresh(); return groupTableModel; } /** * Gets the DefaultGroupTableModel for this table. * * @return the DefaultGroupTableModel */ public DefaultGroupTableModel getGroupTableModel() { return (DefaultGroupTableModel)TableModelWrapperUtils.getActualTableModel(getModel(), DefaultGroupTableModel.class); } /** * Sets the {@link TableModel} for this table. *

* The passed {@code model} gets wrapped into a new * {@link XdevTableModelWrapper}, if necessary. *

* * @param model * the {@link TableModel} to set. */ @Override public void setModel(TableModel model) { if(model instanceof XdevTableModelWrapper) { modelWrapper = (XdevTableModelWrapper)model; } else if(model instanceof VirtualTableModel) { DefaultGroupTableModel groupTableModel = wrapVirtualTableRows((VirtualTableModel)model, new int[]{}); modelWrapper = createXdevTableModelWrapper(groupTableModel); } else { modelWrapper = createXdevTableModelWrapper(model); } super.setModel(modelWrapper); this.initPropertyIndependency(); if(support != null) { support.adjustColumnWidths(); } // refresh // enableKeepColumnOrder(keepColumnOrder); } /** * Sets the {@link TableModel} for this table. *

* The passed {@code model} gets wrapped into a new * {@link XdevTableModelWrapper}, if necessary. *

* * @param model * the {@link TableModel} to set. * @param groupColumnIndices * the column indices used for grouping */ public void setModel(VirtualTableModel model, int... groupColumnIndices) { this.setModel(wrapVirtualTableRows(model,groupColumnIndices)); } /** * Sets the {@link TableModel} for this table. *

* The passed {@code model} gets wrapped into a new * {@link XdevTableModelWrapper}, if necessary. *

* * @param model * the {@link TableModel} to set. * @param groupColumnNames * the column indices used for grouping * @throws IllegalArgumentException * if a specified column name does not exist in the * {@link VirtualTableModel}. */ public void setModel(VirtualTableModel model, String... groupColumnNames) throws IllegalArgumentException { this.setModel(wrapVirtualTableRows(model,groupColumnNames)); } /** * Creates a wrapped version of the passed {@code model}. * * @param model * the {@link TableModel} to wrap. * @return a wrapped {@link TableModel} of type * {@link XdevTableModelWrapper}. */ protected XdevTableModelWrapper createXdevTableModelWrapper(TableModel model) { return new XdevTableModelWrapper(model); } /** * Returns, if group headers are shown. * * @return {@code true}, if group headers are shown. * @see #setShowGroupHeaders(boolean) */ public boolean isShowGroupHeaders() { return support.isShowGroupHeaders(); } /** * Sets the display of group table headers. *

* Creates a label for each grouped column. Those labels can be moved per * Drag & Drop to customize the grouping order. *

* * @param showGroupHeaders * {@code true}, if group headers should be displayed */ public void setShowGroupHeaders(boolean showGroupHeaders) { support.setShowGroupHeaders(showGroupHeaders); } /** * Returns, if group columns are shown. * * @return {@code true}, if group columns are shown. */ public boolean isShowGroupColumns() { return showGroupColumns; } /** * Sets the display of group columns. * * @param showGroupColumns * {@code true}, if grouped columns are to be shown. */ public void setShowGroupColumns(boolean showGroupColumns) { this.showGroupColumns = showGroupColumns; enableShowGroupColumns(showGroupColumns); } /** * Enables or disabled the display of group columns. * * @param isShown * if {@code true}, group columns are shown */ private void enableShowGroupColumns(boolean isShown) { TableModel model = TableModelWrapperUtils.getActualTableModel(this.getModel(), DefaultGroupTableModel.class); if(model instanceof DefaultGroupTableModel) { DefaultGroupTableModel defaultGroupTableModel = (DefaultGroupTableModel)model; defaultGroupTableModel.setDisplayGroupColumns(isShown); defaultGroupTableModel.groupAndRefresh(); defaultGroupTableModel.fireTableStructureChanged(); this.expandAll(); } } /** * Returns, if count columns are shown. * * @return {@code true}, if count columns are shown. */ public boolean isShowCountColumns() { return showCountColumns; } /** * Sets the display of group columns. *

* Works only if {@link #showGroupColumns} is set to {@code true}. *

* * @param showCountColumns * {@code true}, if count columns are to be shown. */ public void setShowCountColumns(boolean showCountColumns) { this.showCountColumns = showCountColumns; enableShowCountColumns(showCountColumns); } /** * Enables or disabled the display of count columns. * * @param isShown * if {@code true}, count columns are shown */ private void enableShowCountColumns(boolean isShown) { TableModel model = TableModelWrapperUtils.getActualTableModel(this.getModel(), DefaultGroupTableModel.class); if(model instanceof DefaultGroupTableModel) { DefaultGroupTableModel defaultGroupTableModel = (DefaultGroupTableModel)model; defaultGroupTableModel.setDisplayCountColumn(isShown); defaultGroupTableModel.groupAndRefresh(); defaultGroupTableModel.fireTableStructureChanged(); TableUtils.saveColumnOrders(this,false); this.expandAll(); } } /** * Returns, if grouping should be restricted to one column. * * @return {@code true}, if grouping is restricted to one column. */ public boolean isSingleLevel() { return singleLevel; } /** * Sets the single level grouping restriction. * * @param singleLevel * {@code true}, if grouping is restricted to one column. */ public void setSingleLevel(boolean singleLevel) { this.singleLevel = singleLevel; enableSingleLevel(singleLevel); } /** * Enables or disabled the single level grouping restriction. * * @param singleLevel * if {@code true}, count columns are shown */ private void enableSingleLevel(boolean singleLevel) { TableModel model = TableModelWrapperUtils.getActualTableModel(this.getModel(), DefaultGroupTableModel.class); if(model instanceof DefaultGroupTableModel) { DefaultGroupTableModel defaultGroupTableModel = (DefaultGroupTableModel)model; defaultGroupTableModel.setSingleLevelGrouping(singleLevel); defaultGroupTableModel.groupAndRefresh(); defaultGroupTableModel.fireTableStructureChanged(); this.expandAll(); } } /** * Returns {@code true}, if column order is kept. * * @return {@code true}, if column order should be kept */ public boolean isKeepColumnOrder() { return keepColumnOrder; } /** * Sets the keeping of the column order. * * @param keepColumnOrder * {@code true}, if column order should be kept */ public void setKeepColumnOrder(boolean keepColumnOrder) { this.keepColumnOrder = keepColumnOrder; enableKeepColumnOrder(keepColumnOrder); } /** * Enables or disabled the column order keeping. * * @param keepColumnOrder * if {@code true}, count columns are shown */ private void enableKeepColumnOrder(boolean keepColumnOrder) { TableModel model = TableModelWrapperUtils.getActualTableModel(this.getModel(), DefaultGroupTableModel.class); if(model instanceof DefaultGroupTableModel) { DefaultGroupTableModel defaultGroupTableModel = (DefaultGroupTableModel)model; String preference = TableUtils.getTablePreferenceByName(this); defaultGroupTableModel.setKeepColumnOrder(keepColumnOrder); defaultGroupTableModel.groupAndRefresh(); defaultGroupTableModel.fireTableStructureChanged(); TableUtils.setTablePreferenceByName(this,preference); this.expandAll(); } } /** * Returns, if a separate column is displayed for grouped values. * * @return {@code true}, if separate group is displayed */ public boolean isShowSeparateGroupColumn() { return showSeparateGroupColumn; } /** * Sets the display of a separate group column. * * @param showSeparateGroupColumn * {@code true}, if separate group column should be displayed. */ public void setShowSeparateGroupColumn(boolean showSeparateGroupColumn) { this.showSeparateGroupColumn = showSeparateGroupColumn; enableShowSeparateGroupColumn(showSeparateGroupColumn); } /** * Enables or disabled the column order keeping. * * @param showSeparateGroupColumn * if {@code true}, separate group columns are shown. */ private void enableShowSeparateGroupColumn(boolean showSeparateGroupColumn) { TableModel model = TableModelWrapperUtils.getActualTableModel(this.getModel(), DefaultGroupTableModel.class); if(model instanceof DefaultGroupTableModel) { DefaultGroupTableModel defaultGroupTableModel = (DefaultGroupTableModel)model; defaultGroupTableModel.setDisplaySeparateGroupColumn(showSeparateGroupColumn); defaultGroupTableModel.groupAndRefresh(); defaultGroupTableModel.fireTableStructureChanged(); TableUtils.saveColumnOrders(this,false); this.expandAll(); } } /** * Gets the autoFilterEnabled flag. * * @return {@code true}, if auto filtering headers are enabled */ public boolean isAutoFilterEnabled() { return support.isAutoFilterEnabled(); } /** * Sets the autoFilterEnabled flag. *

* When autofiltering gets enabled, every column of the table gets a * additional header with a combobox, that can be used to filter the values * of the table. *

* * @param autoFilterEnabled * if {@code true}, auto filtering headers get enabled */ public void setAutoFilterEnabled(boolean autoFilterEnabled) { support.setAutoFilterEnabled(autoFilterEnabled); if(autoFilterEnabled) { support.getAutoFilterTableHeader().setUseNativeHeaderRenderer(true); } } /** * Gets the tableHeaderPopupMenuEnabled flag. * * @return {@code true}, if table popup menu headers are enabled */ public boolean isTableHeaderPopupMenuEnabled() { return support.isTableHeaderPopupMenuEnabled(); } /** * Sets the tableHeaderPopupMenuEnabled flag. *

* Header popup menus are displayed, whenever the user right-clicks on a * table column of the table. *

* * @param tablePopupMenuEnabled * if {@code true}, table header popup menus are enabled */ public void setTableHeaderPopupMenuEnabled(boolean tablePopupMenuEnabled) { support.setTableHeaderPopupMenuEnabled(tablePopupMenuEnabled); } // // MasterDetailComponent implementations - Start // /** * {@inheritDoc} */ @Override public String getFormularName() { return support.getFormularName(); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void setDataField(String dataField) { support.setDataField(dataField); } /** * {@inheritDoc} * * @since 3.1 */ @Override public String getDataField() { return support.getDataField(); } /** * {@inheritDoc} */ @Override @Deprecated public final void setFormularValue(VirtualTable vt, int col, Object value) { support.setFormularValue(vt,col,value); } /** * {@inheritDoc} * * @since 3.2 */ @Override public void setFormularValue(VirtualTable vt, Map record) { support.setFormularValue(vt,record); } /** * {@inheritDoc} * * @since 3.2 */ @Override public void setMasterValue(VirtualTable vt, Map record) { support.setValue(vt,record); } /** * {@inheritDoc} */ @Override public Object getFormularValue() { return support.getFormularValue(); } /** * {@inheritDoc} */ @Override public void saveState() { support.saveState(); } /** * {@inheritDoc} */ @Override public void restoreState() { support.restoreState(); } /** * {@inheritDoc} * * @since 3.1 */ @Override public boolean hasStateChanged() { return support.hasStateChanged(); } /** * {@inheritDoc} */ @Override public boolean isMultiSelect() { return support.isMultiSelect(); } /** * {@inheritDoc} */ @Override public boolean verify() { return support.verify(); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void addValidator(Validator validator) { support.addValidator(validator); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void removeValidator(Validator validator) { support.removeValidator(validator); } /** * {@inheritDoc} * * @since 3.1 */ @Override public Validator[] getValidators() { return support.getValidators(); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void validateState() throws ValidationException { support.validateState(); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void validateState(Validation validation) throws ValidationException { support.validateState(validation); } /** * {@inheritDoc} * * @since 3.1 */ @Override public void setFilterOperator(Operator filterOperator) { support.setFilterOperator(filterOperator); } /** * {@inheritDoc} * * @since 3.1 */ @Override public Operator getFilterOperator() { return support.getFilterOperator(); } /** * {@inheritDoc} * * @since 3.2 */ @Override public void setReadOnly(boolean readOnly) { support.setReadOnly(readOnly); } /** * {@inheritDoc} * * @since 3.2 */ @Override public boolean isReadOnly() { return support.isReadOnly(); } /** * {@inheritDoc} * * @since 4.0 */ @Override public void setVirtualTable(VirtualTable vt) { setModel(vt); } /** * {@inheritDoc} */ @Override public VirtualTable getVirtualTable() { return support.getVirtualTable(); } /** * {@inheritDoc} */ @Override public VirtualTableWrapper getVirtualTableWrapper() { return support.getVirtualTableWrapper(); } /** * {@inheritDoc} */ @Override public void refresh() { support.refresh(); } /** * {@inheritDoc} */ @Override public void updateModel(Condition condition, Object... params) { support.updateModel(condition,params); } /** * {@inheritDoc} */ @Override public void clearModel() { support.clearModel(); } /** * {@inheritDoc} */ @Override public void addValueChangeListener(xdev.ui.MasterDetailComponent.ValueChangeListener l) { support.addValueChangeListener(l); } /** * {@inheritDoc} */ @Override public void setDetailHandler(xdev.ui.MasterDetailComponent.DetailHandler detailHandler) { support.setDetailHandler(detailHandler); } // // MasterDetailComponent implementations - End // // // XdevFocusCycleComponent impl - start // /** * the initial tabIndex. */ private int tabIndex = -1; /** * {@inheritDoc} */ @Override public int getTabIndex() { return tabIndex; } /** * {@inheritDoc} */ @Override public void setTabIndex(int tabIndex) { if(this.tabIndex != tabIndex) { int oldValue = this.tabIndex; this.tabIndex = tabIndex; firePropertyChange(TAB_INDEX_PROPERTY,oldValue,tabIndex); } } // // XdevFocusCycleComponent impl - end // /** * {@inheritDoc} */ @Override public boolean isEditable() { return editable; } /** * {@inheritDoc} */ @Override public void setEditable(boolean editable) { if(this.editable != editable) { boolean oldValue = this.editable; this.editable = editable; firePropertyChange(EDITABLE_PROPERTY,oldValue,editable); } } /** * {@inheritDoc} */ @Override public boolean isCellEditable(int row, int column) { return isEditable() && super.isCellEditable(row,column); } /** * {@inheritDoc} */ @Override public void setModel(VirtualTable vt) { support.setModel(vt); // this.initPropertyIndependency(); } /** * {@inheritDoc} */ @Override public void setModel(VirtualTable vt, String columns, boolean queryData) { support.setModel(vt,columns,queryData); // this.initPropertyIndependency(); } /** * {@inheritDoc} */ @Override public void setModel(final VirtualTable vt, final String columns, final boolean queryData, final boolean selectiveQuery) { this.support.setModel(vt,columns,queryData,selectiveQuery); // this.initPropertyIndependency(); } /** * {@inheritDoc} */ @Override public void setModel(VirtualTable vt, String columns, SELECT select, Object... params) { support.setModel(vt,columns,select,params); // this.initPropertyIndependency(); } /** * {@inheritDoc} */ @Override public void setVisibleRowCount(int visibleRows) { if(this.visibleRows != visibleRows) { int oldValue = this.visibleRows; this.visibleRows = visibleRows; firePropertyChange(XdevTable.VISIBLE_ROWS_PROPERTY,oldValue,visibleRows); revalidate(); } } /** * {@inheritDoc} */ @Override public int getVisibleRowCount() { return visibleRows; } /** * {@inheritDoc} */ @Override public Dimension getPreferredScrollableViewportSize() { Dimension d = super.getPreferredScrollableViewportSize(); if(visibleRows > 0) { d.height = visibleRows * (getRowHeight() + getRowMargin()); } return d; } /** * {@inheritDoc} */ @Override public void setEvenBackground(Color evenBackground) { if(!ObjectUtils.equals(this.evenBackground,evenBackground)) { Object oldValue = this.evenBackground; this.evenBackground = evenBackground; support.setAlternatingBackgroundColors(); firePropertyChange(XdevTable.EVEN_BACKGROUND_PROPERTY,oldValue,evenBackground); } } /** * {@inheritDoc} */ @Override public Color getEvenBackground() { return evenBackground; } /** * {@inheritDoc} */ @Override public void setOddBackground(Color oddBackground) { if(!ObjectUtils.equals(this.oddBackground,oddBackground)) { Object oldValue = this.oddBackground; this.oddBackground = oddBackground; support.setAlternatingBackgroundColors(); firePropertyChange(XdevTable.ODD_BACKGROUND_PROPERTY,oldValue,oddBackground); } } /** * {@inheritDoc} */ @Override public Color getOddBackground() { return oddBackground; } /** * {@inheritDoc} */ @Override public void exportCSV(Writer writer) throws IOException { support.exportCSV(writer); } /** * {@inheritDoc} */ @Override public void exportCSV(Writer writer, char delimiter) throws IOException { support.exportCSV(writer,delimiter); } /** * {@inheritDoc} */ @Override public void exportCSV(Writer writer, char delimiter, boolean withColumnNames) throws IOException { support.exportCSV(writer,delimiter,withColumnNames); } /** * {@inheritDoc} */ @Override public void clear() { super.setModel(new DefaultTableModel()); } /** * {@inheritDoc} */ @Override public void setDefaultRenderer(TableCellRenderer renderer) { defaultRenderersByColumnClass.clear(); setDefaultCellRenderer(renderer); } /** * {@inheritDoc} */ @Override public void setDefaultEditor(TableCellEditor editor) { defaultEditorsByColumnClass.clear(); setDefaultEditor(Object.class,editor); } /** * {@inheritDoc} */ @Override public boolean isSomethingSelected() { return support.isSomethingSelected(); } /** * {@inheritDoc} */ @Override public int getSelectedModelRow() throws IndexOutOfBoundsException { return support.getSelectedModelRow(); } /** * {@inheritDoc} */ @Override public int[] getSelectedModelRows() throws IndexOutOfBoundsException { return support.getSelectedModelRows(); } /** * {@inheritDoc} */ @Override public VirtualTableRow getSelectedVirtualTableRow() { return support.getSelectedVirtualTableRow(); } /** * {@inheritDoc} */ @Override public VirtualTableRow[] getSelectedVirtualTableRows() { return support.getSelectedVirtualTableRows(); } /** * {@inheritDoc} */ @Override public void setSelectedVirtualTableRow(VirtualTableRow row) { support.setSelectedVirtualTableRow(row); } /** * {@inheritDoc} */ @Override public void setSelectedVirtualTableRows(VirtualTableRow[] rows) { support.setSelectedVirtualTableRows(rows); } /** * {@inheritDoc} */ @Override public void setSelectedModelRow(int row) throws IndexOutOfBoundsException, IllegalArgumentException { support.setSelectedModelRow(row); } /** * {@inheritDoc} */ @Override public void setSelectedModelRows(int[] rows) throws IndexOutOfBoundsException, IllegalArgumentException { support.setSelectedModelRows(rows); } /** * {@inheritDoc} */ @Override public void setSelectedModelRows(int start, int end) { support.setSelectedModelRows(start,end); } /** * {@inheritDoc} */ @Override public void setSelectedRows(int[] indices) { support.setSelectedRows(indices); } /** * {@inheritDoc} */ @Override public int getRowAtPoint(int x, int y) throws IndexOutOfBoundsException { return support.getRowAtPoint(x,y); } /** * {@inheritDoc} */ @Override public int getRowAtPoint(Point location) throws IndexOutOfBoundsException { return support.getRowAtPoint(location); } /** * {@inheritDoc} */ @Override public int getColumnAtPoint(int x, int y) { return support.getColumnAtPoint(x,y); } /** * {@inheritDoc} */ @Override public int getColumnAtPoint(Point location) { return support.getColumnAtPoint(location); } /** * {@inheritDoc} */ @Override public void setColumnWidth(int index, int width) { support.setColumnWidth(index,width); } /** * {@inheritDoc} */ @Override public void setColumnTitle(int index, String title) { support.setColumnTitle(index,title); } /** * {@inheritDoc} * * @see #savePersistentState() */ @Override public void loadPersistentState(String persistentState) { support.loadPersistentState(persistentState); } /** * {@inheritDoc}. *

* Persisted properties: *

    *
  • column visibility
  • *
  • column ordering
  • *
  • column widths
  • *
  • sorting order
  • *
  • sorting direction
  • *
*

*/ @Override public String savePersistentState() { return support.savePersistentState(); } /** * {@inheritDoc} */ @Override public String getPersistentId() { return support.getPersistentId(); } /** * {@inheritDoc} * * @return {@code true} if the GUI state should be persisted */ @Override public boolean isPersistenceEnabled() { return persistenceEnabled; } /** * Sets the persistenceEnabled flag. * * @param persistenceEnabled * the state for this instance */ public void setPersistenceEnabled(boolean persistenceEnabled) { this.persistenceEnabled = persistenceEnabled; } /** * {@inheritDoc} */ @Override public void ensureCellIsVisible(int rowIndex, int columnIndex) { this.support.ensureCellIsVisible(rowIndex,columnIndex); } /** * {@inheritDoc} */ @Override public void ensureRowIsVisible(int rowIndex) { this.support.ensureRowIsVisible(rowIndex); } /** * {@inheritDoc} */ @Override public void ensureColumnIsVisible(int columnIndex) { this.support.ensureColumnIsVisible(columnIndex); } /** * En- or disables the display of the filter name in the column header. *

* Has only effect if autofiltering is enabled *

* * @param showFilterName * {@code true} for enabling */ public void setShowFilterName(boolean showFilterName) { support.setShowFilterName(showFilterName); } /** * Is filter name currently displayed? * * @return {@code} true for displayed */ public boolean isShowFilterName() { return support.isShowFilterName(); } /** * En- or disables the display of the filter name as tooltip. *

* Has only effect if autofiltering is enabled *

* * @param showFilterNameAsToolTip * {@code true} for enabling */ public void setShowFilterNameAsToolTip(boolean showFilterNameAsToolTip) { support.setShowFilterNameAsToolTip(showFilterNameAsToolTip); } /** * Is filter name currently displayed as tooltip? * * @return {@code} true for displayed */ public boolean isShowFilterNameAsToolTip() { return support.isShowFilterNameAsToolTip(); } /** * Sort column specified by columnName. * * @param columnName * name of column to be sorted. * @param ascending * whether the sort order is ascending or descending. * @return this */ public XdevGroupTable sort(String columnName, boolean ascending) { support.sort(columnName,ascending); return this; } /** * Groups columns. * * @param columnNames * names of columns to group * @return this */ // group can only be invoked after setting the model public XdevGroupTable group(String... columnNames) { DefaultGroupTableModel groupModel = getGroupTableModel(); if(groupModel != null) { TableModel model = TableModelWrapperUtils.getActualTableModel(getModel(), VirtualTableWrapper.class); VirtualTableWrapper wrapper = null; if(model instanceof VirtualTableWrapper) { wrapper = (VirtualTableWrapper)model; } for(String columnName : columnNames) { boolean groupDefault = true; if(wrapper != null) { int[] indices = wrapper.getModelColumnIndices(); for(int i = 0; i < indices.length; i++) { if(wrapper.getVirtualTable().getColumnAt(indices[i]).getName() .equals(columnName)) { groupModel.addGroupColumn(i); groupDefault = false; break; } } } if(groupDefault) { try { groupModel.addGroupColumn(getColumnModel().getColumnIndex(columnName)); } catch(IllegalArgumentException e) { // column not found } } } groupModel.groupAndRefresh(); } return this; } /** * Ungroup's all grouped columns. */ public void ungroup() { DefaultGroupTableModel groupModel = getGroupTableModel(); if(groupModel != null) { groupModel.clearGroupColumns(); groupModel.groupAndRefresh(); } } /** * Adds the specified listener to receive SortEvents from this GroupTable. * * @param l * a {@link SortListener} */ public void addSortListener(SortListener l) { getSortableTableModel().addSortListener(l); } /** * Removes the specified SortListener so that it no longer receives * SortEvents from this GroupTable. * * @param l * a {@link SortListener} */ public void removeSortListener(SortListener l) { getSortableTableModel().removeSortListener(l); } /** * Add a {@link ListSelectionListener} to the list that's notified each time * a change to the selection occurs. * * @param listener * the ListSelectionListener * * @see #removeListSelectionListener(ListSelectionListener) */ public void addListSelectionListener(ListSelectionListener listener) { getSelectionModel().addListSelectionListener(listener); } /** * Remove a listener from the {@link ListSelectionModel} that's notified * each time a change to the selection occurs. * * @param listener * the {@link ListSelectionListener} * * @see #addListSelectionListener(ListSelectionListener) */ public void removeListSelectionListener(ListSelectionListener listener) { getSelectionModel().removeListSelectionListener(listener); } /** * Returns the current selection mode. * * @return the current selection mode * @see #setSelectionMode(int) */ public int getSelectionMode() { return getSelectionModel().getSelectionMode(); } /** * {@inheritDoc} * * @since 3.2 */ @Override public void handlePopupRowSelection(int x, int y) { int row = this.getRowAtPoint(x,y); if(!this.getSelectionModel().isSelectedIndex(row) && row >= 0) { support.getRowSelectionHandler().selectRow(row); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy