1 7 34 35 package com.sun.tools.example.debug.gui; 36 37 import java.util.List ; 38 import java.util.ArrayList ; 39 import java.util.Map ; 40 import java.util.HashMap ; 41 import java.util.Iterator ; 42 43 import java.io.IOException ; 44 45 import java.awt.BorderLayout ; 46 import java.awt.Color ; 47 import java.awt.Container ; 48 import java.awt.event.ActionEvent ; 49 import java.awt.event.ActionListener ; 50 import java.awt.event.WindowAdapter ; 51 import java.awt.event.WindowEvent ; 52 53 import javax.swing.*; 54 import javax.swing.border.Border ; 55 import javax.swing.border.TitledBorder ; 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 etched = BorderFactory.createEtchedBorder(); 74 Border titled = BorderFactory.createTitledBorder(etched, 75 arg.description(), 76 TitledBorder.LEFT, TitledBorder.TOP); 77 panel.setBorder(titled); 78 } 79 80 abstract String getText(); 81 82 boolean isValid() { 83 return arg.isValid(getText()); 84 } 85 86 boolean isSpecified() { 87 String 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); comp.add(panel); 108 } 109 110 String 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 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 content = dialog.getContentPane(); 140 final JPanel radioPanel = new JPanel(); 141 final ButtonGroup radioGroup = new ButtonGroup(); 142 VirtualMachineManager manager = Bootstrap.virtualMachineManager(); 143 List all = manager.allConnectors(); 144 Map modelToConnector = new HashMap (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 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 () { 160 public void actionPerformed(ActionEvent 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 args = connector.defaultArguments(); 185 186 dialog.setModal(true); 187 dialog.setTitle("Connector Arguments"); 188 Container content = dialog.getContentPane(); 189 JPanel guts = new JPanel(); 190 Border etched = BorderFactory.createEtchedBorder(); 191 Border 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 199 final List argReps = new ArrayList (args.size()); 200 for (Iterator it = args.values().iterator(); it.hasNext(); ) { 201 Object 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 () { 213 public void actionPerformed(ActionEvent event) { 214 for (Iterator 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 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 () { 262 public void actionPerformed(ActionEvent 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 |