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"