package org.openswing.swing.table.columns.client; import java.beans.*; import java.awt.*; import javax.swing.*; import javax.swing.table.*; import org.openswing.swing.table.client.*; import org.openswing.swing.util.client.*; import org.openswing.swing.util.java.*; import org.openswing.swing.message.send.java.FilterWhereClause; /** * <p>Title: OpenSwing Framework</p> * <p>Description: Based column of the Grid component. * This class has not be used directly by the programmer: it's called by GridControl.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class Column extends JPanel { /** column cell under the column header */ private JPanel colRow = new JPanel(); /** used to add column header and column cell */ private GridBagLayout gridBagLayout1 = new GridBagLayout(); /** column header */ private JLabel colHeader = new JLabel(); /** attribute name linked to this column */ private String columnName = "columnname"; /** column width */ private int preferredWidth = 100; /** maximum column width */ private int maxWidth = 500; /** minimum column width */ private int minWidth = 0; /** flag to enable column editing on insert grid mode */ private boolean editableOnInsert = false; /** flag to enable column editing on edit grid mode */ private boolean editableOnEdit = false; /** flag to view the column */ private boolean columnVisible = true; /** flag to enable column sorting by clicking on column header */ private boolean columnSortable = false; /** flag to enable column filtering by clicking with right mouse key */ private boolean columnFilterable = false; /** current sorting versus; 3 possible values: NO_SORTED, ASC_SORTED, DESC_SORTED (this property is managed only if "columnSortable" is true) */ private String sortVersus = Consts.NO_SORTED; /** flag to enable column (in)visibility, by clicking with right mouse key */ private boolean columnSelectable = true; /** flag to define mandatory of column values when the grid is on edit/insert mode */ private boolean columnRequired = true; /** column type (used on design time) */ private static Class designColumnType; /** sequence of columns sorting in ORDER BY */ private int sortingOrder = 0; /** column header description */ private String headerColumnName = null; /** column header horizontal alignment; default value: <code>SwingConstants.CENTER</code> */ private int headerTextHorizontalAlignment = SwingConstants.CENTER; /** define if the cell column value is duplicated when user has clicked on COPY button */ private boolean columnDuplicable = false; /** inner grid */ private Grids table; /** header font; default value: ClientSettings.HEADER_FONT */ private Font headerFont = ClientSettings.HEADER_FONT; /** header foreground color; default value: ClientSettings.HEADER_FOREGROUND_COLOR (which is null as default value, i.e. default JLabel foreground color) */ private Color headerForegroundColor = ClientSettings.HEADER_FOREGROUND_COLOR; /** column text horizontal alignment */ private int textAlignment = SwingConstants.LEFT; /** additional column header description */ private String additionalHeaderColumnName = null; /** additional column header description; default value: 0 (i.e. it is not visible) */ private int additionalHeaderColumnSpan = 0; /** column header vertical alignment; default value: ClientSettings.HEADER_TEXT_VERTICAL_ALIGNMENT */ private int headerTextVerticalAlignment = ClientSettings.HEADER_TEXT_VERTICAL_ALIGNMENT; /** list-filter to add to this column (optional) */ private ListFilterController filter = null; /** default filter conditions to apply when the grid is showed */ private FilterWhereClause[] defaultFilterValues = null; /** flag used to auto fit column size, according to text header; default value: <code>ClientSettings.AUTO_FIT_COLUMNS</code> */ public boolean autoFitColumn = ClientSettings.AUTO_FIT_COLUMNS; public static final int TYPE_TEXT = 0; public static final int TYPE_DATE = Consts.TYPE_DATE; public static final int TYPE_DATE_TIME = Consts.TYPE_DATE_TIME; public static final int TYPE_TIME = Consts.TYPE_TIME; public static final int TYPE_INT = 4; public static final int TYPE_DEC = 5; public static final int TYPE_CHECK = 6; public static final int TYPE_COMBO = 7; public static final int TYPE_LOOKUP = 8; public static final int TYPE_PERC = 9; public static final int TYPE_CURRENCY = 10; public static final int TYPE_BUTTON = 11; public static final int TYPE_IMAGE = 12; public static final int TYPE_FORMATTED_TEXT = 13; public static final int TYPE_MULTI_LINE_TEXT = 14; public static final int TYPE_MULTIPLE_TYPE = 15; public static final int TYPE_PROGRESS_BAR = 16; public static final int TYPE_COMBO_VO = 17; public static final int TYPE_FILE = 18; public static final int TYPE_LINK = 19; public static final int TYPE_SPINNER_NUMBER = 20; public static final int TYPE_SPINNER_LIST = 21; public Column() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.setLayout(gridBagLayout1); colRow.setBackground(Color.white); colRow.setBorder(BorderFactory.createEtchedBorder()); colRow.setPreferredSize(new Dimension(preferredWidth, ClientSettings.CELL_HEIGHT)); colHeader.setPreferredSize(new Dimension(preferredWidth, ClientSettings.HEADER_HEIGHT)); colHeader.setText(columnName); colHeader.setBorder(BorderFactory.createRaisedBevelBorder()); this.add(colHeader, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 ,GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); this.add(colRow, new GridBagConstraints(0, 2, 1, 1, 1.0, 1.0 ,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); } /** * @return column type */ public int getColumnType() { throw new UnsupportedOperationException("This method must be override in "+this.getClass().getName()+" class."); } /** * Set attribute name linked to this column. * @param columnName attribute name of the value object associated to the grid */ public final void setColumnName(String columnName) { this.columnName = columnName; if (headerColumnName==null || headerColumnName.equals("")) { colHeader.setText(columnName); additionalHeaderColumnName = columnName; } } /** * @return attribute name of the value object associated to the grid */ public final String getColumnName() { try { designColumnType = this.getClass(); } catch (Throwable ex) { } return columnName; } /** * Set column width. * @param preferredWidth column width */ public final void setPreferredWidth(int preferredWidth) { this.preferredWidth = preferredWidth; colHeader.setPreferredSize(new Dimension(preferredWidth,ClientSettings.HEADER_HEIGHT)); colRow.setPreferredSize(new Dimension(preferredWidth, ClientSettings.CELL_HEIGHT)); } /** * @return column width */ public final int getPreferredWidth() { return preferredWidth; } /** * Set maximum column width. * @param maxWidth maximum column width */ public final void setMaxWidth(int maxWidth) { this.maxWidth = maxWidth; } /** * @return maximum column width */ public final int getMaxWidth() { return maxWidth; } /** * Set minimum column width. * @param minWidth minimum column width */ public final void setMinWidth(int minWidth) { this.minWidth = minWidth; } /** * @return minimum column width */ public final int getMinWidth() { return minWidth; } /** * Set column editing on insert grid mode (this setting is used only if is not set a cell editing manager oin the grid). * @param editableOnEdit column editing on insert grid mode */ public final void setEditableOnInsert(boolean editableOnInsert) { this.editableOnInsert = editableOnInsert; } /** * @return column editing on insert grid mode */ public boolean isEditableOnInsert() { return editableOnInsert; } /** * Set column editing on edit grid mode (this setting is used only if is not set a cell editing manager oin the grid). * @param editableOnEdit column editing on edit grid mode */ public final void setEditableOnEdit(boolean editableOnEdit) { this.editableOnEdit = editableOnEdit; } /** * @return column editing on edit grid mode */ public boolean isEditableOnEdit() { return editableOnEdit; } /** * @return mandatory of column values when the grid is on edit/insert mode */ public final boolean isColumnRequired() { return columnRequired; } /** * Set mandatory of column values when the grid is on edit/insert mode. * @param columnRequired mandatory of column values when the grid is on edit/insert mode */ public final void setColumnRequired(boolean columnRequired) { this.columnRequired = columnRequired; } /** * Set column visibility. * @param columnVisibile column visibility */ public final void setColumnVisible(boolean columnVisible) { this.columnVisible = columnVisible; super.setVisible(columnVisible); } /** * @return column visibility */ public final boolean isColumnVisible() { return columnVisible; } /** * Set column sorting abilitation by clicking on column header. * @param columnSortable column sorting is enabled */ public final void setColumnSortable(boolean columnSortable) { this.columnSortable = columnSortable; } /** * @return column sorting is enabled */ public final boolean isColumnSortable() { return columnSortable; } /** * Set column filtering. * @param columnFilterable column filtering is enabled */ public final void setColumnFilterable(boolean columnFilterable) { this.columnFilterable = columnFilterable; } /** * @return column filtering is enabled */ public final boolean isColumnFilterable() { return columnFilterable; } /** * Set current sorting versus; 3 possible values: NO_SORTED, ASC_SORTED, DESC_SORTED (this property is managed only if "columnSortable" is true). * @param sortVersus current sorting versus */ public final void setSortVersus(String sortVersus) { this.sortVersus = sortVersus; } /** * @return current sorting versus; 3 possible values: NO_SORTED, ASC_SORTED, DESC_SORTED (this property is managed only if "columnSortable" is true) */ public final String getSortVersus() { return sortVersus; } /** * Set if column (in)visibility state can be changed by user. * @param columnSelectable column (in)visibility state can be changed by user */ public final void setColumnSelectable(boolean columnSelectable) { this.columnSelectable = columnSelectable; } /** * @return <code>true</code> if column (in)visibility state can be changed by user */ public final boolean isColumnSelectable() { return columnSelectable; } /** * @return colunm type */ public static Class getDesignColumnType() { return designColumnType; } /** * @return order of sorting columns in ORDER BY */ public final int getSortingOrder() { return sortingOrder; } /** * Set order of sorting columns in ORDER BY. * @param sortingOrder order of sorting columns in ORDER BY */ public final void setSortingOrder(int sortingOrder) { this.sortingOrder = sortingOrder; } /** * @return String header column name */ public final String getHeaderColumnName() { return (headerColumnName==null || headerColumnName.equals("")?getColumnName():headerColumnName); } /** * Set header column name. * @param headerColumnName header column name */ public final void setHeaderColumnName(String headerColumnName) { this.headerColumnName = headerColumnName; if (headerColumnName!=null && !headerColumnName.equals("")) { colHeader.setText(headerColumnName); additionalHeaderColumnName = headerColumnName; } else { colHeader.setText(columnName); additionalHeaderColumnName = columnName; } } /** * @return column header horizontal alignment */ public final int getHeaderTextHorizontalAlignment() { return this.headerTextHorizontalAlignment; } /** * Set column header horizontal alignement. * @param alignment column header horizontal alignement; possible values: "SwingConstants.LEFT", "SwingConstants.RIGHT", "SwingConstants.CENTER". */ public final void setHeaderTextHorizontalAlignment(int alignment) { this.headerTextHorizontalAlignment = alignment; try { if (!Beans.isDesignTime()) return; this.remove(colHeader); int align = GridBagConstraints.NORTHWEST; if (alignment==SwingConstants.RIGHT) align = GridBagConstraints.NORTHEAST; else if (alignment==SwingConstants.CENTER) align = GridBagConstraints.NORTH; this.add(colHeader, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0 , align, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); this.revalidate(); this.repaint(); } catch (Exception ex) { } } /** * @return column header horizontal alignment */ public final int getHeaderTextVerticalAlignment() { return this.headerTextVerticalAlignment; } /** * Set column header vertical alignement. * @param alignment column header vertical alignement; possible values: "SwingConstants.TOP", "SwingConstants.CENTER", "SwingConstants.BOTTOM". */ public final void setHeaderTextVerticalAlignment(int alignment) { this.headerTextVerticalAlignment = alignment; } /** * @return define if the cell column value is duplicated when user has clicked on COPY button */ public final boolean isColumnDuplicable() { return columnDuplicable; } /** * Define if the cell column value is duplicated when user has clicked on COPY button. * @param columnDuplicable define if the cell column value is duplicated when user has clicked on COPY button */ public final void setColumnDuplicable(boolean columnDuplicable) { this.columnDuplicable = columnDuplicable; } /** * @return table linked to this column */ public final Grids getTable() { return table; } /** * Set table linked to this column */ public final void setTable(Grids table) { this.table = table; } /** * Set column header font. */ public final void setHeaderFont(Font headerFont) { this.headerFont = headerFont; if (headerFont!=null && Beans.isDesignTime()) { colHeader.setFont(headerFont); } } /** * @return column header font */ public final Font getHeaderFont() { return this.headerFont; } /** * Set foreground color for column header. */ public final void setHeaderForegroundColor(Color headerForegroundColor) { this.headerForegroundColor = headerForegroundColor; if (headerForegroundColor!=null && Beans.isDesignTime()) { colHeader.setForeground(headerForegroundColor); } } /** * @return foreground color for column header */ public final Color getHeaderForegroundColor() { return this.headerForegroundColor; } /** * @return column text horizontal alignment */ public final int getTextAlignment() { return this.textAlignment; } /** * Set column text horizontal alignement. * @param alignment column text horizontal alignement; possible values: "SwingConstants.LEFT", "SwingConstants.RIGHT", "SwingConstants.CENTER". */ public final void setTextAlignment(int alignment) { this.textAlignment = alignment; } /** * @return additional column header description */ public final String getAdditionalHeaderColumnName() { return additionalHeaderColumnName; } /** * @return additional column header description */ public final int getAdditionalHeaderColumnSpan() { return additionalHeaderColumnSpan; } /** * Set the additional column header description. * @param additionalHeaderColumnName additional column header description */ public final void setAdditionalHeaderColumnName(String additionalHeaderColumnName) { this.additionalHeaderColumnName = additionalHeaderColumnName; } /** * Set the additional column header description. * @param additionalHeaderColumnSpan additional column header description */ public final void setAdditionalHeaderColumnSpan(int additionalHeaderColumnSpan) { this.additionalHeaderColumnSpan = additionalHeaderColumnSpan; } /** * @return TableCellRenderer for this column */ public TableCellRenderer getCellRenderer(GridController tableContainer,Grids grids) { return new DefaultTableCellRenderer(); } /** * @return TableCellEditor for this column */ public TableCellEditor getCellEditor(GridController tableContainer,Grids grids) { return new DefaultTableCellEditor(); } /** * Add a list-filter for the specified column, showed in the quick filter panel. * @param attributeName attribute name that identifies the column having a list-filter to remove */ public final void setListFilter(ListFilterController filter) { this.filter = filter; } /** * @return list-filter for the specified column, showed in the quick filter panel */ public final ListFilterController getListFilter() { return this.filter; } /** * @return flag used to auto fit column size, according to text header */ public final boolean isAutoFitColumn() { return autoFitColumn; } /** * Set auto fit column size, according to text headers. * Default value: <code>ClientSettings.AUTO_FIT_COLUMNS</code> * @param autoFitColumns used to auto fit columns size, according to text header */ public final void setAutoFitColumn(boolean autoFitColumn) { this.autoFitColumn = autoFitColumn; } /** * @return default filter conditions to apply when the grid is showed */ public final FilterWhereClause[] getDefaultFilterValues() { return defaultFilterValues; } /** * Set the default filter conditions to apply when the grid is showed. * @param defaultFilterValues default filter conditions to apply when the grid is showed (a two elements length array is required) */ public final void setDefaultFilterValues(FilterWhereClause firstFilterValue,FilterWhereClause optionalSecondFilterValue) { this.defaultFilterValues = new FilterWhereClause[]{firstFilterValue,optionalSecondFilterValue}; } /** * <p>Title: OpenSwing Framework</p> * <p>Description: Inner class used in getCellEditor() method.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * @author Mauro Carniel * @version 1.0 */ class DefaultTableCellEditor extends DefaultCellEditor implements TableCellEditor { public DefaultTableCellEditor() { super(new JTextField()); } } }