001    /*
002     * Copyright (c) 2005 Jens Schou, Staffan Gustafsson, Björn Lanneskog, 
003     * Einar Pehrson and Sebastian Kekkonen
004     *
005     * This file is part of
006     * CleanSheets Extension for Test Cases
007     *
008     * CleanSheets Extension for Test Cases is free software; you can
009     * redistribute it and/or modify it under the terms of the GNU General Public
010     * License as published by the Free Software Foundation; either version 2 of
011     * the License, or (at your option) any later version.
012     *
013     * CleanSheets Extension for Test Cases is distributed in the hope that
014     * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
015     * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with CleanSheets Extension for Test Cases; if not, write to the
020     * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
021     * Boston, MA  02111-1307  USA
022     */
023    package csheets.ext.test.ui;
024    
025    import java.awt.Component;
026    
027    import javax.swing.JTable;
028    import javax.swing.ListSelectionModel;
029    import javax.swing.table.DefaultTableColumnModel;
030    import javax.swing.table.TableCellRenderer;
031    import javax.swing.table.TableColumn;
032    import javax.swing.table.TableModel;
033    
034    /**
035     * A base class for the test case and test case parameter tables.
036     * @author Einar Pehrson
037     */
038    @SuppressWarnings("serial")
039    public class TestTable extends JTable {
040    
041            /** The margin around the packed columns for this model. */
042        public static final int COLUMN_MARGIN = 10;
043    
044            /** The minimum width of a column. */
045        public static final int MINIMUM_COLUMN_WIDTH = 30;
046    
047            /** The table's column model */
048            private DefaultTableColumnModel columnModel;
049    
050            /**
051             * Creates a new test table.
052             * @param tableModel the table model
053             */
054            public TestTable(TableModel tableModel) {
055                    super(tableModel);
056    
057                    // Stores members
058                    this.columnModel = (DefaultTableColumnModel)getColumnModel();
059    
060                    // Prevents user from moving and resizing columns
061                    getTableHeader().setReorderingAllowed(false);
062                    getTableHeader().setResizingAllowed(false);
063                    setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
064    
065                    // Configures selection mode
066                    setColumnSelectionAllowed(true);
067                    setRowSelectionAllowed(true);
068                    setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
069    
070                    // Packs columns into right size
071                    packColumns();
072            }
073    
074            /**
075             * Adjusts the width of all the columns in the table.
076             */
077            public void packColumns() {
078            for (int i = 0; i < getColumnCount(); i++)
079                            packColumn(i);
080            }
081    
082            /**
083             * Adjusts the width of the column at the given index.
084             * @param columnIndex the index of the column to pack
085             */
086            public void packColumn(int columnIndex) {
087                    TableColumn column = columnModel.getColumn(columnIndex);
088    
089                    // Get width of column header
090                    TableCellRenderer renderer = column.getHeaderRenderer();
091                    if (renderer == null)
092                            renderer = this.getTableHeader().getDefaultRenderer();
093                    Component comp = renderer.getTableCellRendererComponent(
094                            this, column.getHeaderValue(), false, false, 0, 0);
095                    int width = comp.getPreferredSize().width;
096                    
097                    // Get maximum width of column data
098                    for (int rowIndex = 0; rowIndex < this.getRowCount(); rowIndex++) {
099                            renderer = this.getCellRenderer(rowIndex, columnIndex);
100                            comp = renderer.getTableCellRendererComponent(this, getValueAt(
101                                    rowIndex, columnIndex), false, false, rowIndex, columnIndex);
102                            width = Math.max(width, comp.getPreferredSize().width);
103                    }
104    
105                    // Add margin
106                    width += 2 * COLUMN_MARGIN;
107                    if (width > MINIMUM_COLUMN_WIDTH) {
108                            column.setPreferredWidth(width);
109                    } else
110                            column.setPreferredWidth(MINIMUM_COLUMN_WIDTH);
111            }
112    }