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 }