001 /* 002 @license.text@ 003 */ 004 package biz.hammurapi.swing; 005 006 import java.awt.GridBagConstraints; 007 import java.awt.GridBagLayout; 008 import java.awt.event.WindowEvent; 009 010 import javax.swing.JFrame; 011 import javax.swing.JScrollPane; 012 import javax.swing.JSplitPane; 013 import javax.swing.JTable; 014 import javax.swing.JTree; 015 import javax.swing.WindowConstants; 016 import javax.swing.table.TableModel; 017 import javax.swing.tree.DefaultMutableTreeNode; 018 import javax.swing.tree.TreeNode; 019 import javax.swing.tree.DefaultTreeModel; 020 import javax.swing.tree.TreePath; 021 022 import biz.hammurapi.convert.ConvertingService; 023 /** 024 * @author Pavel Vlasov 025 * 026 * @version $Revision: 1.2 $ 027 */ 028 public class Browser extends JFrame { 029 030 private javax.swing.JPanel jContentPane = null; 031 032 private JSplitPane jSplitPane = null; 033 034 private JScrollPane jScrollPane = null; 035 036 private JScrollPane jDetailsPane = null; 037 038 private JTree jTree = null; 039 040 private JTable jTable = null; 041 /** 042 * This method initializes jSplitPane 043 * 044 * @return javax.swing.JSplitPane 045 */ 046 private JSplitPane getJSplitPane() { 047 if (jSplitPane == null) { 048 jSplitPane = new JSplitPane(); 049 jSplitPane.setLeftComponent(getJScrollPane()); 050 jSplitPane.setRightComponent(getJScrollPane1()); 051 jSplitPane.setDividerLocation(400); 052 } 053 return jSplitPane; 054 } 055 056 /** 057 * This method initializes jScrollPane 058 * 059 * @return javax.swing.JScrollPane 060 */ 061 private JScrollPane getJScrollPane() { 062 if (jScrollPane == null) { 063 jScrollPane = new JScrollPane(); 064 jScrollPane.setViewportView(getJTree()); 065 } 066 return jScrollPane; 067 } 068 069 /** 070 * This method initializes jScrollPane1 071 * 072 * @return javax.swing.JScrollPane 073 */ 074 private JScrollPane getJScrollPane1() { 075 if (jDetailsPane == null) { 076 jDetailsPane = new JScrollPane(); 077 jDetailsPane.setViewportView(getJTable()); 078 } 079 return jDetailsPane; 080 } 081 082 /** 083 * This method initializes jTree 084 * 085 * @return javax.swing.JTree 086 */ 087 private JTree getJTree() { 088 if (jTree == null) { 089 jTree = new JTree(); 090 jTree.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() { 091 public void valueChanged(javax.swing.event.TreeSelectionEvent e) { 092 TreePath newLeadSelectionPath = e.getNewLeadSelectionPath(); 093 if (newLeadSelectionPath==null) { 094 jTable.setVisible(false); 095 } else { 096 Object lastPathComponent = newLeadSelectionPath.getLastPathComponent(); 097 if (lastPathComponent instanceof DefaultMutableTreeNode) { // For compatibility with old visualizables 098 lastPathComponent = ((DefaultMutableTreeNode) lastPathComponent).getUserObject(); 099 } 100 if (lastPathComponent instanceof TableVisualizable) { 101 TableModel toTable = ((TableVisualizable) lastPathComponent).toTable(); 102 if (toTable!=null) { 103 jTable.setModel(toTable); 104 } 105 jTable.setVisible(toTable!=null); 106 } else { 107 jTable.setVisible(false); 108 } 109 //jTable.getColumnModel().getColumn(0).setMaxWidth(150); 110 } 111 } 112 }); 113 } 114 return jTree; 115 } 116 117 /** 118 * This method initializes jTable 119 * 120 * @return javax.swing.JTable 121 */ 122 private JTable getJTable() { 123 if (jTable == null) { 124 jTable = new JTable(); 125 } 126 return jTable; 127 } 128 129 130 /** 131 * @param root 132 */ 133 public Browser(String title, TreeNode root) { 134 super(); 135 initialize(); 136 setTitle(title); 137 getJTree().setModel(new DefaultTreeModel(root)); 138 } 139 140 /** 141 * This method initializes this 142 * 143 * @return void 144 */ 145 private void initialize() { 146 this.setSize(921, 616); 147 this.setContentPane(getJContentPane()); 148 this.setTitle("JFrame"); 149 } 150 151 /** 152 * This method initializes jContentPane 153 * 154 * @return javax.swing.JPanel 155 */ 156 private javax.swing.JPanel getJContentPane() { 157 if (jContentPane == null) { 158 GridBagConstraints gridBagConstraints1 = new GridBagConstraints(); 159 jContentPane = new javax.swing.JPanel(); 160 jContentPane.setLayout(new GridBagLayout()); 161 gridBagConstraints1.gridx = 0; 162 gridBagConstraints1.gridy = 0; 163 gridBagConstraints1.weightx = 1.0; 164 gridBagConstraints1.weighty = 1.0; 165 gridBagConstraints1.fill = java.awt.GridBagConstraints.BOTH; 166 jContentPane.add(getJSplitPane(), gridBagConstraints1); 167 } 168 return jContentPane; 169 } 170 171 /** 172 * Shows objects in Browser. Blocks current thread until browser closes. 173 * @param o 174 * @param title 175 */ 176 public static void show(Object o, String title) { 177 Visualizable vs = (Visualizable) ConvertingService.convert(o, Visualizable.class); 178 if (vs!=null) { 179 Object v = vs.toTreeNode(null, title); 180 181 if (v instanceof TreeNode) { 182 final Object monitor = new Object(); 183 Browser browser = new Browser(title, (TreeNode) v) { 184 protected void processWindowEvent(WindowEvent e) { 185 super.processWindowEvent(e); 186 if (e.getID()==WindowEvent.WINDOW_CLOSED) { 187 synchronized (monitor) { 188 monitor.notifyAll(); 189 } 190 } 191 } 192 }; 193 194 browser.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 195 browser.setVisible(true); 196 197 synchronized (monitor) { 198 try { 199 monitor.wait(); 200 } catch (InterruptedException ex) { 201 // Ignore 202 } 203 } 204 } 205 } 206 } 207 208 /** 209 * Shows object in browser with default close operation <code>WindowConstants.EXIT_ON_CLOSE</code> 210 * @param o 211 * @param title 212 */ 213 public static void showAndExitOnClose(Object o, String title) { 214 Visualizable vs = (Visualizable) ConvertingService.convert(o, Visualizable.class); 215 if (vs!=null) { 216 Object v = vs.toTreeNode(null, title); 217 218 if (v instanceof TreeNode) { 219 Browser browser = new Browser(title, (TreeNode) v); 220 browser.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 221 browser.setVisible(true); 222 } 223 } 224 } 225 226 } // @jve:decl-index=0:visual-constraint="10,10"