1 16 17 package org.mc4j.console.swing.editor.jmx; 18 19 20 import java.awt.BorderLayout ; 21 import java.awt.Component ; 22 import java.awt.Toolkit ; 23 import java.awt.event.ActionEvent ; 24 import java.awt.event.ActionListener ; 25 import java.beans.PropertyEditor ; 26 import java.beans.PropertyEditorManager ; 27 import java.beans.PropertyEditorSupport ; 28 import java.util.ArrayList ; 29 import java.util.List ; 30 31 import javax.management.openmbean.CompositeData ; 32 import javax.management.openmbean.TabularData ; 33 import javax.swing.AbstractCellEditor ; 34 import javax.swing.JButton ; 35 import javax.swing.JDialog ; 36 import javax.swing.JLabel ; 37 import javax.swing.JPanel ; 38 import javax.swing.JScrollPane ; 39 import javax.swing.JTable ; 40 import javax.swing.table.AbstractTableModel ; 41 import javax.swing.table.DefaultTableCellRenderer ; 42 import javax.swing.table.DefaultTableColumnModel ; 43 import javax.swing.table.TableCellEditor ; 44 import javax.swing.table.TableColumn ; 45 46 47 48 56 public class TabularDataEditor extends PropertyEditorSupport { 57 58 public boolean supportsCustomEditor() { 59 return true; 60 } 61 62 public Component getCustomEditor() { 63 if (getValue() instanceof TabularData ) { 64 TabularDataTablePanel dataPanel = new TabularDataTablePanel((TabularData ) getValue()); 65 return dataPanel; 66 } 67 return null; 68 } 69 70 71 public static class TabularDataTablePanel extends JPanel { 72 73 private TabularData data; 74 private JScrollPane scrollPane; 75 private JTable table; 76 77 public TabularDataTablePanel(TabularData data) { 78 this.data = data; 79 80 this.table = new JTable (new TabularDataTableModel(data)); 81 82 DefaultTableColumnModel cm = new DefaultTableColumnModel (); 83 List keys = new ArrayList (this.data.getTabularType().getRowType().keySet()); 84 for (int i = 0; i < keys.size(); i++) { 85 String keyName = (String ) keys.get(i); 86 87 TableColumn column = new TableColumn (i, 150); 88 column.setHeaderValue(keyName); 89 cm.addColumn(column); 90 91 String columnTypeString = this.data.getTabularType().getRowType().getType(keyName).getClassName(); 92 try { 93 Class columnType = Class.forName(columnTypeString); 94 PropertyEditor 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 cnfe) { } 103 104 } 105 106 this.table.setColumnModel(cm); 107 108 this.scrollPane = new JScrollPane (this.table); 109 110 setLayout(new BorderLayout ()); 111 add(this.scrollPane, BorderLayout.CENTER); 112 } 113 114 } 115 116 public static class LinkingTableCellEditor extends AbstractCellEditor implements TableCellEditor { 117 118 private PropertyEditor editor; 119 120 public LinkingTableCellEditor(PropertyEditor editor) { 121 this.editor = editor; 122 } 123 124 public Object getCellEditorValue() { 125 return null; 126 } 127 128 public Component getTableCellEditorComponent(JTable table, final Object value, boolean isSelected, int row, int column) { 129 String view = (value!=null)?value.toString() : "null"; 130 JButton button = new JButton ("..."); 131 button.setSize(20,20); 132 JPanel panel = new JPanel (); 133 panel.setLayout(new BorderLayout ()); 134 panel.add(new JLabel (view),BorderLayout.CENTER); 135 panel.add(button,BorderLayout.EAST); 136 panel.validate(); 137 138 button.addActionListener(new ActionListener () { 139 public void actionPerformed(ActionEvent e) { 140 editor.setValue(value); 141 Component comp = editor.getCustomEditor(); 142 final JDialog dialog = new JDialog (); 143 144 dialog.getContentPane().setLayout(new BorderLayout ()); 145 dialog.getContentPane().add(comp, BorderLayout.CENTER); 146 147 JButton okButton = new JButton ("Ok"); 148 okButton.addActionListener(new ActionListener () { 149 public void actionPerformed(ActionEvent 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 { 172 173 private PropertyEditor editor; 174 175 public LinkingTableCellRenderer(PropertyEditor editor) { 176 this.editor = editor; 177 } 178 179 public Component getTableCellRendererComponent( 180 JTable table, final Object value, boolean isSelected, boolean hasFocus, int row, int column) { 181 182 if (column == 1) { 183 String view = (value!=null)?value.toString() : "null"; 184 JButton button = new JButton ("..."); 185 button.setSize(20,20); 186 JPanel panel = new JPanel (); 187 panel.setLayout(new BorderLayout ()); 188 panel.add(new JLabel (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 { 200 201 private TabularData data; 202 private List columnList; 203 private List values; 204 205 public TabularDataTableModel(TabularData data) { 206 this.data = data; 207 this.columnList = new ArrayList (this.data.getTabularType().getRowType().keySet()); 208 this.values = new ArrayList (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 getValueAt(int rowIndex, int columnIndex) { 224 225 String keyName = (String ) this.columnList.get(columnIndex); 226 227 CompositeData dataRow = (CompositeData ) values.get(rowIndex); 228 229 return dataRow.get(keyName); 230 } 231 232 233 } 234 235 } 236 | Popular Tags |