KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > sun > tools > example > debug > gui > LaunchTool


1 /*
2  * @(#)LaunchTool.java 1.8 05/11/17
3  *
4  * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
5  * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
6  */

7 /*
8  * Copyright (c) 1997-1999 by Sun Microsystems, Inc. All Rights Reserved.
9  *
10  * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use,
11  * modify and redistribute this software in source and binary code form,
12  * provided that i) this copyright notice and license appear on all copies of
13  * the software; and ii) Licensee does not utilize the software in a manner
14  * which is disparaging to Sun.
15  *
16  * This software is provided "AS IS," without a warranty of any kind. ALL
17  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
18  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
19  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
20  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
21  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
22  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
23  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
24  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
25  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGES.
27  *
28  * This software is not designed or intended for use in on-line control of
29  * aircraft, air traffic, aircraft navigation or aircraft communications; or in
30  * the design, construction, operation or maintenance of any nuclear
31  * facility. Licensee represents and warrants that it will not use or
32  * redistribute the Software for such purposes.
33  */

34
35 package com.sun.tools.example.debug.gui;
36
37 import java.util.List JavaDoc;
38 import java.util.ArrayList JavaDoc;
39 import java.util.Map JavaDoc;
40 import java.util.HashMap JavaDoc;
41 import java.util.Iterator JavaDoc;
42
43 import java.io.IOException JavaDoc;
44
45 import java.awt.BorderLayout JavaDoc;
46 import java.awt.Color JavaDoc;
47 import java.awt.Container JavaDoc;
48 import java.awt.event.ActionEvent JavaDoc;
49 import java.awt.event.ActionListener JavaDoc;
50 import java.awt.event.WindowAdapter JavaDoc;
51 import java.awt.event.WindowEvent JavaDoc;
52
53 import javax.swing.*;
54 import javax.swing.border.Border JavaDoc;
55 import javax.swing.border.TitledBorder JavaDoc;
56
57 import com.sun.jdi.*;
58 import com.sun.jdi.connect.*;
59
60 import com.sun.tools.example.debug.bdi.*;
61
62 class LaunchTool {
63
64     private final ExecutionManager runtime;
65
66     private abstract class ArgRep {
67         final Connector.Argument arg;
68         final JPanel panel;
69
70         ArgRep(Connector.Argument arg) {
71             this.arg = arg;
72             panel = new JPanel();
73             Border JavaDoc etched = BorderFactory.createEtchedBorder();
74             Border JavaDoc titled = BorderFactory.createTitledBorder(etched,
75                                       arg.description(),
76                                       TitledBorder.LEFT, TitledBorder.TOP);
77             panel.setBorder(titled);
78         }
79
80         abstract String JavaDoc getText();
81
82         boolean isValid() {
83             return arg.isValid(getText());
84         }
85
86         boolean isSpecified() {
87             String JavaDoc value = getText();
88             return (value != null && value.length() > 0) ||
89                 !arg.mustSpecify();
90         }
91
92         void install() {
93             arg.setValue(getText());
94         }
95     }
96
97     private class StringArgRep extends ArgRep {
98         final JTextField textField;
99
100         StringArgRep(Connector.Argument arg, JPanel comp) {
101             super(arg);
102             textField = new JTextField(arg.value(), 50 );
103             textField.setBorder(BorderFactory.createLoweredBevelBorder());
104
105             panel.add(new JLabel(arg.label(), SwingConstants.RIGHT));
106             panel.add(textField); // , BorderLayout.CENTER);
107
comp.add(panel);
108         }
109
110         String JavaDoc getText() {
111             return textField.getText();
112         }
113     }
114
115     private class BooleanArgRep extends ArgRep {
116         final JCheckBox check;
117
118         BooleanArgRep(Connector.BooleanArgument barg, JPanel comp) {
119             super(barg);
120             check = new JCheckBox(barg.label());
121             check.setSelected(barg.booleanValue());
122             panel.add(check);
123             comp.add(panel);
124         }
125
126         String JavaDoc getText() {
127             return ((Connector.BooleanArgument)arg)
128                            .stringValueOf(check.getModel().isSelected());
129         }
130     }
131         
132
133     private LaunchTool(ExecutionManager runtime) {
134         this.runtime = runtime;
135     }
136
137     private Connector selectConnector() {
138         final JDialog dialog = new JDialog();
139         Container JavaDoc content = dialog.getContentPane();
140         final JPanel radioPanel = new JPanel();
141         final ButtonGroup radioGroup = new ButtonGroup();
142         VirtualMachineManager manager = Bootstrap.virtualMachineManager();
143         List JavaDoc all = manager.allConnectors();
144         Map JavaDoc modelToConnector = new HashMap JavaDoc(all.size(), 0.5f);
145
146         dialog.setModal(true);
147         dialog.setTitle("Select Connector Type");
148         radioPanel.setLayout(new BoxLayout(radioPanel, BoxLayout.Y_AXIS));
149         for (Iterator JavaDoc it = all.iterator(); it.hasNext(); ) {
150             Connector connector = (Connector)it.next();
151             JRadioButton radio = new JRadioButton(connector.description());
152             modelToConnector.put(radio.getModel(), connector);
153             radioPanel.add(radio);
154             radioGroup.add(radio);
155         }
156         content.add(radioPanel);
157
158         final boolean[] oked = {false};
159         JPanel buttonPanel = okCancel( dialog, new ActionListener JavaDoc() {
160             public void actionPerformed(ActionEvent JavaDoc event) {
161                 if (radioGroup.getSelection() == null) {
162                     JOptionPane.showMessageDialog(dialog,
163                                     "Please select a connector type",
164                                     "No Selection",
165                                      JOptionPane.ERROR_MESSAGE);
166                 } else {
167                     oked[0] = true;
168                     dialog.setVisible(false);
169                     dialog.dispose();
170                 }
171             }
172         } );
173         content.add(BorderLayout.SOUTH, buttonPanel);
174         dialog.pack();
175         dialog.show();
176
177         return oked[0] ?
178             (Connector)(modelToConnector.get(radioGroup.getSelection())) :
179             null;
180     }
181
182     private void configureAndConnect(final Connector connector) {
183         final JDialog dialog = new JDialog();
184         final Map JavaDoc args = connector.defaultArguments();
185         
186         dialog.setModal(true);
187         dialog.setTitle("Connector Arguments");
188         Container JavaDoc content = dialog.getContentPane();
189         JPanel guts = new JPanel();
190         Border JavaDoc etched = BorderFactory.createEtchedBorder();
191         Border JavaDoc titled = BorderFactory.createTitledBorder(etched,
192                                 connector.description(),
193                                 TitledBorder.LEFT, TitledBorder.TOP);
194         guts.setBorder(etched);
195         guts.setLayout(new BoxLayout(guts, BoxLayout.Y_AXIS));
196
197         // guts.add(new JLabel(connector.description()));
198

199         final List JavaDoc argReps = new ArrayList JavaDoc(args.size());
200         for (Iterator JavaDoc it = args.values().iterator(); it.hasNext(); ) {
201             Object JavaDoc arg = it.next();
202             ArgRep ar;
203             if (arg instanceof Connector.BooleanArgument) {
204                 ar = new BooleanArgRep((Connector.BooleanArgument)arg, guts);
205             } else {
206                 ar = new StringArgRep((Connector.Argument)arg, guts);
207             }
208             argReps.add(ar);
209         }
210         content.add(guts);
211
212         JPanel buttonPanel = okCancel( dialog, new ActionListener JavaDoc() {
213             public void actionPerformed(ActionEvent JavaDoc event) {
214                 for (Iterator JavaDoc it = argReps.iterator(); it.hasNext(); ) {
215                     ArgRep ar = (ArgRep)it.next();
216                     if (!ar.isSpecified()) {
217                         JOptionPane.showMessageDialog(dialog,
218                                     ar.arg.label() +
219                                          ": Argument must be specified",
220                                     "No argument", JOptionPane.ERROR_MESSAGE);
221                         return;
222                     }
223                     if (!ar.isValid()) {
224                         JOptionPane.showMessageDialog(dialog,
225                                     ar.arg.label() +
226                                          ": Bad argument value: " +
227                                          ar.getText(),
228                                     "Bad argument", JOptionPane.ERROR_MESSAGE);
229                         return;
230                     }
231                     ar.install();
232                 }
233                 try {
234                     if (runtime.explictStart(connector, args)) {
235                         dialog.setVisible(false);
236                         dialog.dispose();
237                     } else {
238                         JOptionPane.showMessageDialog(dialog,
239                            "Bad arguments values: See diagnostics window.",
240                            "Bad arguments", JOptionPane.ERROR_MESSAGE);
241                     }
242                 } catch (VMLaunchFailureException exc) {
243                         JOptionPane.showMessageDialog(dialog,
244                            "Launch Failure: " + exc,
245                            "Launch Failed",JOptionPane.ERROR_MESSAGE);
246                 }
247             }
248         } );
249         content.add(BorderLayout.SOUTH, buttonPanel);
250         dialog.pack();
251         dialog.show();
252     }
253
254     private JPanel okCancel(final JDialog dialog, ActionListener JavaDoc okListener) {
255         JPanel buttonPanel = new JPanel();
256         JButton ok = new JButton("OK");
257         JButton cancel = new JButton("Cancel");
258         buttonPanel.add(ok);
259         buttonPanel.add(cancel);
260         ok.addActionListener(okListener);
261         cancel.addActionListener( new ActionListener JavaDoc() {
262             public void actionPerformed(ActionEvent JavaDoc event) {
263                 dialog.setVisible(false);
264                 dialog.dispose();
265             }
266         } );
267         return buttonPanel;
268     }
269
270     static void queryAndLaunchVM(ExecutionManager runtime)
271                                          throws VMLaunchFailureException {
272         LaunchTool lt = new LaunchTool(runtime);
273         Connector connector = lt.selectConnector();
274         if (connector != null) {
275             lt.configureAndConnect(connector);
276         }
277     }
278 }
279
Popular Tags