Mercurial > illumos > onarm
diff usr/src/cmd/cmd-inet/usr.sadm/dhcpmgr/com/sun/dhcpmgr/ui/AutosizingTable.java @ 0:c9caec207d52 b86
Initial porting based on b86
author | Koji Uno <koji.uno@sun.com> |
---|---|
date | Tue, 02 Jun 2009 18:56:50 +0900 |
parents | |
children | 1a15d5aaf794 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/cmd-inet/usr.sadm/dhcpmgr/com/sun/dhcpmgr/ui/AutosizingTable.java Tue Jun 02 18:56:50 2009 +0900 @@ -0,0 +1,141 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ +/* + * ident "@(#)AutosizingTable.java 1.5 05/06/08 SMI" + * + * Copyright (c) 1999-2001 by Sun Microsystems, Inc. + * All rights reserved. + */ +package com.sun.dhcpmgr.ui; + +import javax.swing.JTable; +import javax.swing.table.*; +import javax.swing.event.TableModelEvent; +import java.awt.Component; +import java.util.Date; + +import com.sun.dhcpmgr.data.IPAddress; +import com.sun.dhcpmgr.data.ValidationException; + +/** + * A subclass of Swing's JTable which automatically resizes its columns to + * fit the data being displayed in them. + */ +public class AutosizingTable extends JTable { + Date aDate = null; + IPAddress longIP = null; + + /** + * Construct the table + */ + public AutosizingTable() { + super(); + } + + /** + * Construct the table with the given model. + * @param model the TableModel to be used. + */ + public AutosizingTable(TableModel model) { + super(model); + } + + /** + * The table has changed; we'll resize the columns to contain the new data + * as best they can. + */ + public void tableChanged(TableModelEvent e) { + /* + * Let JTable do its thing, which probably includes wiping out + * the old columns and creating new ones + */ + super.tableChanged(e); + TableModel model = getModel(); + if (model.getRowCount() == 0) { + // No data, so just skip all the gymnastics + return; + } + /* + * Set column widths by first finding largest value in each column + * and then sizing accordingly + */ + for (int i = 0; i < getColumnCount(); ++i) { + TableColumn col = getColumnModel().getColumn(i); + + // Get the width of the header for this column + TableCellRenderer r = col.getHeaderRenderer(); + int headerWidth = 0; + Component c; + if (r == null) + r = getTableHeader().getDefaultRenderer(); + if (r != null) { + c = r.getTableCellRendererComponent(this, col.getHeaderValue(), + false, false, 0, 0); + headerWidth = c.getPreferredSize().width; + } + Object maxVal = null; + + if (model.getColumnClass(i) == String.class) { + // Column contains strings; find the longest one + String maxString = ""; + for (int j = 0; j < model.getRowCount(); ++j) { + String s = (String)model.getValueAt(j, i); + if (s != null) { + if (maxString.length() < s.length()) { + maxString = s; + } + } + } + maxVal = maxString; + } else if (model.getColumnClass(i) == IPAddress.class) { + // Column contains IP addresses; one long one is as good as any + if (longIP == null) { + try { + longIP = new IPAddress("222.222.222.222"); + } catch (ValidationException ex) { + // This should never happen! + } + } + maxVal = longIP; + } else if (model.getColumnClass(i) == Date.class) { + // Column contains dates; now is as good a time as any other. + if (aDate == null) { + aDate = new Date(); + } + maxVal = aDate; + } + // Now compute the width of the cell containing the longest value + c = getDefaultRenderer( + model.getColumnClass(i)).getTableCellRendererComponent( + this, maxVal, false, false, 0, i); + int cellWidth = c.getPreferredSize().width; + + // Set preferred width to the greater of the header & cell widths + col.setPreferredWidth(Math.max(headerWidth, cellWidth)); + } + // Now force the resizing we just did to be displayed + sizeColumnsToFit(-1); + + // Force header to repaint itself, otherwise it won't align correctly + getTableHeader().resizeAndRepaint(); + } +}