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"