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