Mercurial > illumos > onarm
comparison 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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:c9caec207d52 |
---|---|
1 /* | |
2 * CDDL HEADER START | |
3 * | |
4 * The contents of this file are subject to the terms of the | |
5 * Common Development and Distribution License, Version 1.0 only | |
6 * (the "License"). You may not use this file except in compliance | |
7 * with the License. | |
8 * | |
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
10 * or http://www.opensolaris.org/os/licensing. | |
11 * See the License for the specific language governing permissions | |
12 * and limitations under the License. | |
13 * | |
14 * When distributing Covered Code, include this CDDL HEADER in each | |
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
16 * If applicable, add the following below this CDDL HEADER, with the | |
17 * fields enclosed by brackets "[]" replaced with your own identifying | |
18 * information: Portions Copyright [yyyy] [name of copyright owner] | |
19 * | |
20 * CDDL HEADER END | |
21 */ | |
22 /* | |
23 * ident "@(#)AutosizingTable.java 1.5 05/06/08 SMI" | |
24 * | |
25 * Copyright (c) 1999-2001 by Sun Microsystems, Inc. | |
26 * All rights reserved. | |
27 */ | |
28 package com.sun.dhcpmgr.ui; | |
29 | |
30 import javax.swing.JTable; | |
31 import javax.swing.table.*; | |
32 import javax.swing.event.TableModelEvent; | |
33 import java.awt.Component; | |
34 import java.util.Date; | |
35 | |
36 import com.sun.dhcpmgr.data.IPAddress; | |
37 import com.sun.dhcpmgr.data.ValidationException; | |
38 | |
39 /** | |
40 * A subclass of Swing's JTable which automatically resizes its columns to | |
41 * fit the data being displayed in them. | |
42 */ | |
43 public class AutosizingTable extends JTable { | |
44 Date aDate = null; | |
45 IPAddress longIP = null; | |
46 | |
47 /** | |
48 * Construct the table | |
49 */ | |
50 public AutosizingTable() { | |
51 super(); | |
52 } | |
53 | |
54 /** | |
55 * Construct the table with the given model. | |
56 * @param model the TableModel to be used. | |
57 */ | |
58 public AutosizingTable(TableModel model) { | |
59 super(model); | |
60 } | |
61 | |
62 /** | |
63 * The table has changed; we'll resize the columns to contain the new data | |
64 * as best they can. | |
65 */ | |
66 public void tableChanged(TableModelEvent e) { | |
67 /* | |
68 * Let JTable do its thing, which probably includes wiping out | |
69 * the old columns and creating new ones | |
70 */ | |
71 super.tableChanged(e); | |
72 TableModel model = getModel(); | |
73 if (model.getRowCount() == 0) { | |
74 // No data, so just skip all the gymnastics | |
75 return; | |
76 } | |
77 /* | |
78 * Set column widths by first finding largest value in each column | |
79 * and then sizing accordingly | |
80 */ | |
81 for (int i = 0; i < getColumnCount(); ++i) { | |
82 TableColumn col = getColumnModel().getColumn(i); | |
83 | |
84 // Get the width of the header for this column | |
85 TableCellRenderer r = col.getHeaderRenderer(); | |
86 int headerWidth = 0; | |
87 Component c; | |
88 if (r == null) | |
89 r = getTableHeader().getDefaultRenderer(); | |
90 if (r != null) { | |
91 c = r.getTableCellRendererComponent(this, col.getHeaderValue(), | |
92 false, false, 0, 0); | |
93 headerWidth = c.getPreferredSize().width; | |
94 } | |
95 Object maxVal = null; | |
96 | |
97 if (model.getColumnClass(i) == String.class) { | |
98 // Column contains strings; find the longest one | |
99 String maxString = ""; | |
100 for (int j = 0; j < model.getRowCount(); ++j) { | |
101 String s = (String)model.getValueAt(j, i); | |
102 if (s != null) { | |
103 if (maxString.length() < s.length()) { | |
104 maxString = s; | |
105 } | |
106 } | |
107 } | |
108 maxVal = maxString; | |
109 } else if (model.getColumnClass(i) == IPAddress.class) { | |
110 // Column contains IP addresses; one long one is as good as any | |
111 if (longIP == null) { | |
112 try { | |
113 longIP = new IPAddress("222.222.222.222"); | |
114 } catch (ValidationException ex) { | |
115 // This should never happen! | |
116 } | |
117 } | |
118 maxVal = longIP; | |
119 } else if (model.getColumnClass(i) == Date.class) { | |
120 // Column contains dates; now is as good a time as any other. | |
121 if (aDate == null) { | |
122 aDate = new Date(); | |
123 } | |
124 maxVal = aDate; | |
125 } | |
126 // Now compute the width of the cell containing the longest value | |
127 c = getDefaultRenderer( | |
128 model.getColumnClass(i)).getTableCellRendererComponent( | |
129 this, maxVal, false, false, 0, i); | |
130 int cellWidth = c.getPreferredSize().width; | |
131 | |
132 // Set preferred width to the greater of the header & cell widths | |
133 col.setPreferredWidth(Math.max(headerWidth, cellWidth)); | |
134 } | |
135 // Now force the resizing we just did to be displayed | |
136 sizeColumnsToFit(-1); | |
137 | |
138 // Force header to repaint itself, otherwise it won't align correctly | |
139 getTableHeader().resizeAndRepaint(); | |
140 } | |
141 } |