001 /* 002 * $Id: ColumnFactory.java,v 1.4 2005/10/10 18:03:03 rbair Exp $ 003 * 004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, 005 * Santa Clara, California 95054, U.S.A. All rights reserved. 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 020 */ 021 package org.jdesktop.swingx.table; 022 023 import java.awt.Component; 024 import java.awt.Dimension; 025 026 import javax.swing.table.JTableHeader; 027 import javax.swing.table.TableCellRenderer; 028 import javax.swing.table.TableModel; 029 030 import org.jdesktop.swingx.JXTable; 031 032 /** 033 * Creates and configures TableColumns. 034 * 035 * @author Jeanette Winzenburg 036 */ 037 public class ColumnFactory { 038 039 private static ColumnFactory columnFactory; 040 041 public static synchronized ColumnFactory getInstance() { 042 if (columnFactory == null) { 043 columnFactory = new ColumnFactory(); 044 } 045 return columnFactory; 046 } 047 048 public static synchronized void setInstance(ColumnFactory factory) { 049 columnFactory = factory; 050 } 051 052 public TableColumnExt createTableColumn(int modelIndex) { 053 return new TableColumnExt(modelIndex); 054 } 055 056 /** 057 * Configure column properties from TableModel. 058 * 059 * @param model 060 * @param column 061 * @throws NPE if model or column == null 062 * @throws IllegalStateException if column does not have valid modelIndex 063 * (in coordinate space of the tablemodel) 064 */ 065 public void configureTableColumn(TableModel model, TableColumnExt column) { 066 if ((column.getModelIndex() < 0) 067 || (column.getModelIndex() >= model.getColumnCount())) 068 throw new IllegalStateException("column must have valid modelIndex"); 069 column.setHeaderValue(model.getColumnName(column.getModelIndex())); 070 071 } 072 073 public TableColumnExt createAndConfigureTableColumn(TableModel model, int modelIndex) { 074 TableColumnExt column = createTableColumn(modelIndex); 075 configureTableColumn(model, column); 076 return column; 077 } 078 079 public void configureColumnWidths(JXTable table, TableColumnExt columnx) { 080 Dimension cellSpacing = table.getIntercellSpacing(); 081 Object prototypeValue = columnx.getPrototypeValue(); 082 if (prototypeValue != null) { 083 // calculate how much room the prototypeValue requires 084 TableCellRenderer renderer = table.getCellRenderer(0, table 085 .convertColumnIndexToView(columnx.getModelIndex())); 086 Component comp = renderer.getTableCellRendererComponent(table, 087 prototypeValue, false, false, 0, 0); 088 int prefWidth = comp.getPreferredSize().width + cellSpacing.width; 089 090 // now calculate how much room the column header wants 091 renderer = columnx.getHeaderRenderer(); 092 if (renderer == null) { 093 JTableHeader header = table.getTableHeader(); 094 if (header != null) { 095 renderer = header.getDefaultRenderer(); 096 } 097 } 098 if (renderer != null) { 099 comp = renderer.getTableCellRendererComponent(table, columnx 100 .getHeaderValue(), false, false, 0, table 101 .convertColumnIndexToView(columnx.getModelIndex())); 102 103 prefWidth = Math.max(comp.getPreferredSize().width, prefWidth); 104 } 105 prefWidth += table.getColumnModel().getColumnMargin(); 106 columnx.setPreferredWidth(prefWidth); 107 } 108 109 } 110 111 public void packColumn(JXTable table, TableColumnExt col, int margin, int max) { 112 113 /* Get width of column header */ 114 TableCellRenderer renderer = col.getHeaderRenderer(); 115 if (renderer == null) 116 renderer = table.getTableHeader().getDefaultRenderer(); 117 118 int width = 0; 119 120 Component comp = renderer.getTableCellRendererComponent(table, col 121 .getHeaderValue(), false, false, 0, 0); 122 width = comp.getPreferredSize().width; 123 124 int column = table.convertColumnIndexToView(col.getModelIndex()); 125 if(table.getRowCount() > 0) 126 renderer = table.getCellRenderer(0, column); 127 for (int r = 0; r < table.getRowCount(); r++) { 128 comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, 129 column), false, false, r, column); 130 width = Math.max(width, comp.getPreferredSize().width); 131 } 132 width += 2 * margin; 133 134 /* Check if the width exceeds the max */ 135 if( max != -1 && width > max ) 136 width = max; 137 138 col.setPreferredWidth(width); 139 140 } 141 }