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"