KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > mc4j > console > swing > editor > jmx > TabularDataEditor


1 /*
2  * Copyright 2002-2004 Greg Hinkle
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16
17 package org.mc4j.console.swing.editor.jmx;
18
19
20 import java.awt.BorderLayout JavaDoc;
21 import java.awt.Component JavaDoc;
22 import java.awt.Toolkit JavaDoc;
23 import java.awt.event.ActionEvent JavaDoc;
24 import java.awt.event.ActionListener JavaDoc;
25 import java.beans.PropertyEditor JavaDoc;
26 import java.beans.PropertyEditorManager JavaDoc;
27 import java.beans.PropertyEditorSupport JavaDoc;
28 import java.util.ArrayList JavaDoc;
29 import java.util.List JavaDoc;
30
31 import javax.management.openmbean.CompositeData JavaDoc;
32 import javax.management.openmbean.TabularData JavaDoc;
33 import javax.swing.AbstractCellEditor JavaDoc;
34 import javax.swing.JButton JavaDoc;
35 import javax.swing.JDialog JavaDoc;
36 import javax.swing.JLabel JavaDoc;
37 import javax.swing.JPanel JavaDoc;
38 import javax.swing.JScrollPane JavaDoc;
39 import javax.swing.JTable JavaDoc;
40 import javax.swing.table.AbstractTableModel JavaDoc;
41 import javax.swing.table.DefaultTableCellRenderer JavaDoc;
42 import javax.swing.table.DefaultTableColumnModel JavaDoc;
43 import javax.swing.table.TableCellEditor JavaDoc;
44 import javax.swing.table.TableColumn JavaDoc;
45
46
47
48 /**
49  * A simple table view of Tabular data. Has a hacked mechanism for
50  * viewing customEditors. Mostly important for tabular datas that
51  * contain Composite datas.
52  *
53  * @author Greg Hinkle (ghinkle@users.sourceforge.net), January 2002
54  * @version $Revision: 480 $($Author: ghinkl $ / $Date: 2004-10-05 01:17:41 -0400 (Tue, 05 Oct 2004) $)
55  */

56 public class TabularDataEditor extends PropertyEditorSupport JavaDoc {
57
58     public boolean supportsCustomEditor() {
59         return true;
60     }
61
62     public Component JavaDoc getCustomEditor() {
63         if (getValue() instanceof TabularData JavaDoc) {
64             TabularDataTablePanel dataPanel = new TabularDataTablePanel((TabularData JavaDoc) getValue());
65             return dataPanel;
66         }
67         return null;
68     }
69
70
71     public static class TabularDataTablePanel extends JPanel JavaDoc {
72
73         private TabularData JavaDoc data;
74         private JScrollPane JavaDoc scrollPane;
75         private JTable JavaDoc table;
76
77         public TabularDataTablePanel(TabularData JavaDoc data) {
78             this.data = data;
79
80             this.table = new JTable JavaDoc(new TabularDataTableModel(data));
81
82             DefaultTableColumnModel JavaDoc cm = new DefaultTableColumnModel JavaDoc();
83             List JavaDoc keys = new ArrayList JavaDoc(this.data.getTabularType().getRowType().keySet());
84             for (int i = 0; i < keys.size(); i++) {
85                 String JavaDoc keyName = (String JavaDoc) keys.get(i);
86
87                 TableColumn JavaDoc column = new TableColumn JavaDoc(i, 150);
88                 column.setHeaderValue(keyName);
89                 cm.addColumn(column);
90
91                 String JavaDoc columnTypeString = this.data.getTabularType().getRowType().getType(keyName).getClassName();
92                 try {
93                     Class JavaDoc columnType = Class.forName(columnTypeString);
94                     PropertyEditor JavaDoc editor = PropertyEditorManager.findEditor(columnType);
95
96                     if (editor != null) {
97                         if (editor.supportsCustomEditor()) {
98                             column.setCellRenderer(new LinkingTableCellRenderer(editor));
99                             column.setCellEditor(new LinkingTableCellEditor(editor));
100                         }
101                     }
102                 } catch(ClassNotFoundException JavaDoc cnfe) { }
103
104             }
105
106             this.table.setColumnModel(cm);
107
108             this.scrollPane = new JScrollPane JavaDoc(this.table);
109
110             setLayout(new BorderLayout JavaDoc());
111             add(this.scrollPane, BorderLayout.CENTER);
112         }
113
114     }
115
116     public static class LinkingTableCellEditor extends AbstractCellEditor JavaDoc implements TableCellEditor JavaDoc {
117
118         private PropertyEditor JavaDoc editor;
119
120         public LinkingTableCellEditor(PropertyEditor JavaDoc editor) {
121             this.editor = editor;
122         }
123
124         public Object JavaDoc getCellEditorValue() {
125             return null;
126         }
127
128         public Component JavaDoc getTableCellEditorComponent(JTable JavaDoc table, final Object JavaDoc value, boolean isSelected, int row, int column) {
129             String JavaDoc view = (value!=null)?value.toString() : "null";
130             JButton JavaDoc button = new JButton JavaDoc("...");
131             button.setSize(20,20);
132             JPanel JavaDoc panel = new JPanel JavaDoc();
133             panel.setLayout(new BorderLayout JavaDoc());
134             panel.add(new JLabel JavaDoc(view),BorderLayout.CENTER);
135             panel.add(button,BorderLayout.EAST);
136             panel.validate();
137
138             button.addActionListener(new ActionListener JavaDoc() {
139                 public void actionPerformed(ActionEvent JavaDoc e) {
140                     editor.setValue(value);
141                     Component JavaDoc comp = editor.getCustomEditor();
142                     final JDialog JavaDoc dialog = new JDialog JavaDoc();
143
144                     dialog.getContentPane().setLayout(new BorderLayout JavaDoc());
145                     dialog.getContentPane().add(comp, BorderLayout.CENTER);
146
147                     JButton JavaDoc okButton = new JButton JavaDoc("Ok");
148                     okButton.addActionListener(new ActionListener JavaDoc() {
149                         public void actionPerformed(ActionEvent JavaDoc e) {
150                             dialog.hide();
151                             dialog.dispose();
152                         }
153                     });
154                     dialog.getContentPane().add(okButton, BorderLayout.SOUTH);
155
156                     dialog.setModal(true);
157                     dialog.setSize(450,400);
158                     dialog.validate();
159                     dialog.setLocation(
160                         Toolkit.getDefaultToolkit().getScreenSize().width/2 - (dialog.getWidth()/2),
161                         Toolkit.getDefaultToolkit().getScreenSize().height/2 - (dialog.getHeight()/2)
162                     );
163                     dialog.show();
164                 }
165             });
166             return panel;
167         }
168     }
169
170
171     public static class LinkingTableCellRenderer extends DefaultTableCellRenderer JavaDoc {
172
173         private PropertyEditor JavaDoc editor;
174
175         public LinkingTableCellRenderer(PropertyEditor JavaDoc editor) {
176             this.editor = editor;
177         }
178
179         public Component JavaDoc getTableCellRendererComponent(
180             JTable JavaDoc table, final Object JavaDoc value, boolean isSelected, boolean hasFocus, int row, int column) {
181
182             if (column == 1) {
183                 String JavaDoc view = (value!=null)?value.toString() : "null";
184                 JButton JavaDoc button = new JButton JavaDoc("...");
185                 button.setSize(20,20);
186                 JPanel JavaDoc panel = new JPanel JavaDoc();
187                 panel.setLayout(new BorderLayout JavaDoc());
188                 panel.add(new JLabel JavaDoc(view),BorderLayout.CENTER);
189                 panel.add(button,BorderLayout.EAST);
190                 panel.validate();
191                 return panel;
192             }
193
194             return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
195         }
196     }
197
198
199     public static class TabularDataTableModel extends AbstractTableModel JavaDoc {
200
201         private TabularData JavaDoc data;
202         private List JavaDoc columnList;
203         private List JavaDoc values;
204
205         public TabularDataTableModel(TabularData JavaDoc data) {
206             this.data = data;
207             this.columnList = new ArrayList JavaDoc(this.data.getTabularType().getRowType().keySet());
208             this.values = new ArrayList JavaDoc(data.values());
209         }
210
211         public int getColumnCount() {
212             return this.columnList.size();
213         }
214
215         public int getRowCount() {
216             return data.size();
217         }
218
219         public boolean isCellEditable(int rowIndex, int columnIndex) {
220             return columnIndex!=0;
221         }
222
223         public Object JavaDoc getValueAt(int rowIndex, int columnIndex) {
224
225             String JavaDoc keyName = (String JavaDoc) this.columnList.get(columnIndex);
226
227             CompositeData JavaDoc dataRow = (CompositeData JavaDoc) values.get(rowIndex);
228
229             return dataRow.get(keyName);
230         }
231
232
233     }
234
235 }
236
Popular Tags