1
2
3
4
5
6
7
8
9
10
11
12
13 package com.eviware.soapui.impl.wsdl.panels.teststeps;
14
15 import java.awt.BorderLayout;
16 import java.awt.Component;
17 import java.awt.Dimension;
18 import java.awt.event.ActionEvent;
19 import java.io.File;
20 import java.io.IOException;
21
22 import javax.swing.AbstractAction;
23 import javax.swing.Action;
24 import javax.swing.Box;
25 import javax.swing.JButton;
26 import javax.swing.JComponent;
27 import javax.swing.JLabel;
28 import javax.swing.JScrollPane;
29 import javax.swing.JTable;
30 import javax.swing.JTextField;
31 import javax.swing.SwingUtilities;
32 import javax.swing.event.ListSelectionEvent;
33 import javax.swing.event.ListSelectionListener;
34 import javax.swing.table.AbstractTableModel;
35 import javax.swing.text.Document;
36
37 import com.eviware.soapui.impl.wsdl.actions.support.ShowOnlineHelpAction;
38 import com.eviware.soapui.impl.wsdl.panels.support.TestRunComponentEnabler;
39 import com.eviware.soapui.impl.wsdl.support.HelpUrls;
40 import com.eviware.soapui.impl.wsdl.teststeps.WsdlPropertiesTestStep;
41 import com.eviware.soapui.impl.wsdl.teststeps.WsdlTestStepListenerAdapter;
42 import com.eviware.soapui.impl.wsdl.teststeps.WsdlPropertiesTestStep.StepProperty;
43 import com.eviware.soapui.model.ModelItem;
44 import com.eviware.soapui.model.testsuite.TestStepProperty;
45 import com.eviware.soapui.support.DocumentListenerAdapter;
46 import com.eviware.soapui.support.StringUtils;
47 import com.eviware.soapui.support.UISupport;
48 import com.eviware.soapui.support.components.JXToolBar;
49 import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
50
51 /***
52 * DesktopPanel for WsdlPropertiesTestSteps
53 *
54 * @author Ole.Matzura
55 */
56
57 public class PropertiesStepDesktopPanel extends ModelItemDesktopPanel<WsdlPropertiesTestStep>
58 {
59 private final WsdlPropertiesTestStep testStep;
60 private JTextField sourceField;
61 private JTextField targetField;
62 private PropertiesModel propertiesModel;
63 private JTable propertiesTable;
64 private RemovePropertyAction removePropertyAction;
65 private TestRunComponentEnabler componentEnabler;
66 private InternalWsdlTestStepListener wsdlTestStepListener;
67
68 public PropertiesStepDesktopPanel(WsdlPropertiesTestStep testStep)
69 {
70 super(testStep);
71 this.testStep = testStep;
72 componentEnabler = new TestRunComponentEnabler(testStep.getTestCase());
73 buildUI();
74
75 wsdlTestStepListener = new InternalWsdlTestStepListener();
76 testStep.addTestStepListener(wsdlTestStepListener);
77 }
78
79 private void buildUI()
80 {
81 add(buildToolbar(), BorderLayout.NORTH);
82 add(buildPropertiesTable(), BorderLayout.CENTER);
83
84 setPreferredSize(new Dimension(600, 400));
85 }
86
87 private Component buildPropertiesTable()
88 {
89 propertiesModel = new PropertiesModel();
90 propertiesTable = new JTable(propertiesModel);
91 propertiesTable.setSurrendersFocusOnKeystroke( true );
92
93
94
95
96 propertiesTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
97 propertiesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
98 {
99 public void valueChanged(ListSelectionEvent e)
100 {
101 removePropertyAction.setEnabled(propertiesTable.getSelectedRow() != -1);
102 }
103 });
104
105 componentEnabler.add(propertiesTable);
106
107 return new JScrollPane(propertiesTable);
108 }
109
110 private JComponent buildToolbar()
111 {
112 JXToolBar toolbar = UISupport.createToolbar();
113
114 JButton addPropertyButton = UISupport.createToolbarButton(new AddPropertyAction());
115 toolbar.add(addPropertyButton);
116 removePropertyAction = new RemovePropertyAction();
117 JButton removePropertyButton = UISupport.createToolbarButton(removePropertyAction);
118 toolbar.add(removePropertyButton);
119 JButton clearPropertiesButton = UISupport.createToolbarButton(new ClearPropertiesAction());
120 toolbar.add(clearPropertiesButton);
121
122 toolbar.addRelatedGap();
123 JButton reloadButton = UISupport.createToolbarButton(new ReloadPropertiesFromSourceAction());
124 toolbar.add(reloadButton);
125
126 toolbar.addSeparator();
127 toolbar.add(new JLabel("Load from:"));
128 sourceField = new JTextField(testStep.getSource(), 15);
129 sourceField.setToolTipText("The filename/url or referring system-property to load properties from");
130 sourceField.getDocument().addDocumentListener(new DocumentListenerAdapter()
131 {
132 public void update(Document document)
133 {
134 testStep.setSource(sourceField.getText());
135
136 }
137 });
138
139 toolbar.addFixed(sourceField);
140 JButton setSourceButton = UISupport.createToolbarButton(new SetPropertiesSourceAction());
141 toolbar.add(setSourceButton);
142
143 toolbar.addSeparator();
144 toolbar.add(new JLabel("Save to:"));
145 targetField = new JTextField(testStep.getTarget(), 15);
146 targetField.setToolTipText("The filename/url or referring system-property to save properties to");
147 targetField.getDocument().addDocumentListener(new DocumentListenerAdapter()
148 {
149 public void update(Document document)
150 {
151 testStep.setTarget(targetField.getText());
152
153 }
154 });
155
156 toolbar.addFixed(targetField);
157 JButton setTargetButton = UISupport.createToolbarButton(new SetPropertiesTargetAction());
158 toolbar.add(setTargetButton);
159
160 toolbar.add(Box.createHorizontalGlue());
161 toolbar.addSeparator();
162 toolbar.add(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.PROPERTIESSTEPEDITOR_HELP_URL)));
163
164 componentEnabler.add(sourceField);
165 componentEnabler.add(targetField);
166 componentEnabler.add(setTargetButton);
167 componentEnabler.add(setSourceButton);
168 componentEnabler.add(addPropertyButton);
169 componentEnabler.add(removePropertyButton);
170
171 return toolbar;
172 }
173
174 public boolean onClose(boolean canCancel)
175 {
176 if( propertiesTable.isEditing() )
177 propertiesTable.getCellEditor().stopCellEditing();
178
179 componentEnabler.release();
180 testStep.removeTestStepListener(wsdlTestStepListener);
181 super.release();
182 return true;
183 }
184
185 public JComponent getComponent()
186 {
187 return this;
188 }
189
190 public boolean dependsOn(ModelItem modelItem)
191 {
192 return modelItem == testStep || modelItem == testStep.getTestCase()
193 || modelItem == testStep.getTestCase().getTestSuite()
194 || modelItem == testStep.getTestCase().getTestSuite().getProject();
195 }
196
197 private final class InternalWsdlTestStepListener extends WsdlTestStepListenerAdapter
198 {
199 private boolean enabled = true;
200
201 public boolean isEnabled()
202 {
203 return enabled;
204 }
205
206 public void setEnabled(boolean enabled)
207 {
208 this.enabled = enabled;
209 }
210
211 public void propertyAdded(String name)
212 {
213 if (enabled)
214 propertiesModel.fireTableDataChanged();
215 }
216
217 public void propertyRemoved(String name)
218 {
219 if (enabled)
220 propertiesModel.fireTableDataChanged();
221 }
222
223 public void propertyRenamed(String oldName, String newName)
224 {
225 if (enabled)
226 propertiesModel.fireTableDataChanged();
227 }
228
229 public void propertyValueChanged(String name, String oldValue, String newValue)
230 {
231 if (enabled)
232 propertiesModel.fireTableDataChanged();
233 }
234 }
235
236 private class PropertiesModel extends AbstractTableModel
237 {
238 public int getRowCount()
239 {
240 return testStep.getStepPropertyCount();
241 }
242
243 public int getColumnCount()
244 {
245 return 2;
246 }
247
248 public String getColumnName(int columnIndex)
249 {
250 switch (columnIndex)
251 {
252 case 0:
253 return "Name";
254 case 1:
255 return "Value";
256 }
257
258 return null;
259 }
260
261 public boolean isCellEditable(int rowIndex, int columnIndex)
262 {
263 return true;
264 }
265
266 public void setValueAt(Object aValue, int rowIndex, int columnIndex)
267 {
268 StepProperty property = testStep.getTestStepPropertyAt(rowIndex);
269 switch (columnIndex)
270 {
271 case 0:
272 {
273 TestStepProperty prop = testStep.getProperty((String) aValue);
274 if (prop != null && prop != property)
275 {
276 UISupport.showErrorMessage("Property name exists!");
277 return;
278 }
279 wsdlTestStepListener.setEnabled(false);
280 property.setName(aValue.toString());
281 wsdlTestStepListener.setEnabled(true);
282 break;
283 }
284 case 1:
285 {
286 wsdlTestStepListener.setEnabled(false);
287 property.setValue(aValue.toString());
288 wsdlTestStepListener.setEnabled(true);
289 break;
290 }
291 }
292 }
293
294 public Object getValueAt(int rowIndex, int columnIndex)
295 {
296 TestStepProperty property = testStep.getTestStepPropertyAt(rowIndex);
297
298 switch (columnIndex)
299 {
300 case 0:
301 return property.getName();
302 case 1:
303 return property.getValue();
304 }
305
306 return null;
307 }
308 }
309
310 private class AddPropertyAction extends AbstractAction
311 {
312 public AddPropertyAction()
313 {
314 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/add_property.gif"));
315 putValue(Action.SHORT_DESCRIPTION, "Adds a property to the property list");
316 }
317
318 public void actionPerformed(ActionEvent e)
319 {
320 String name = UISupport.prompt("Specify property name", "Add Property", "");
321 if (name != null)
322 {
323 wsdlTestStepListener.setEnabled(false);
324 testStep.addProperty(name);
325 wsdlTestStepListener.setEnabled(true);
326 final int row = testStep.getStepPropertyCount() - 1;
327 propertiesModel.fireTableRowsInserted(row, row);
328 SwingUtilities.invokeLater( new Runnable()
329 {
330 public void run()
331 {
332 propertiesTable.requestFocusInWindow();
333 propertiesTable.scrollRectToVisible( propertiesTable.getCellRect( row,1,true ) );
334 SwingUtilities.invokeLater( new Runnable()
335 {
336 public void run()
337 {
338 propertiesTable.editCellAt(row, 1);
339 propertiesTable.getEditorComponent().requestFocusInWindow();
340 }
341 } );
342 }
343 } );
344
345 }
346 }
347 }
348
349 private class RemovePropertyAction extends AbstractAction
350 {
351 public RemovePropertyAction()
352 {
353 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/remove_property.gif"));
354 putValue(Action.SHORT_DESCRIPTION, "Removes the selected property from the property list");
355 setEnabled(false);
356 }
357
358 public void actionPerformed(ActionEvent e)
359 {
360 int row = propertiesTable.getSelectedRow();
361 if (row == -1)
362 return;
363
364 UISupport.stopCellEditing(propertiesTable);
365
366 if (UISupport.confirm("Remove property [" + propertiesModel.getValueAt(row, 0) + "]?", "Remove Property"))
367 {
368 wsdlTestStepListener.setEnabled(false);
369 testStep.removePropertyAt(row);
370 wsdlTestStepListener.setEnabled(true);
371 propertiesModel.fireTableRowsDeleted(row, row);
372 }
373 }
374 }
375
376 private class SetPropertiesSourceAction extends AbstractAction
377 {
378 public SetPropertiesSourceAction()
379 {
380 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/set_properties_source.gif"));
381 putValue(Action.SHORT_DESCRIPTION, "Selects the properties source file");
382 }
383
384 public void actionPerformed(ActionEvent e)
385 {
386 File file = UISupport.getFileDialogs().open(this, "Set properties source", null, null, null);
387 if (file != null)
388 {
389 testStep.setSource(file.getAbsolutePath());
390 sourceField.setText(testStep.getSource());
391 try
392 {
393 boolean createMissing = UISupport.confirm("Create missing properties?", "Set Properties Source");
394 int cnt = testStep.loadProperties(createMissing);
395 UISupport.showInfoMessage("Loaded " + cnt + " properties from [" + testStep.getSource() + "]");
396 }
397 catch (IOException e1)
398 {
399 UISupport.showErrorMessage("Failed to load properties from [" + testStep.getSource() + "]; " + e1);
400 }
401 }
402 }
403 }
404
405 private class ReloadPropertiesFromSourceAction extends AbstractAction
406 {
407 public ReloadPropertiesFromSourceAction()
408 {
409 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/reload_properties.gif"));
410 putValue(Action.SHORT_DESCRIPTION, "Reloads the current properties from the selected file");
411 }
412
413 public void actionPerformed(ActionEvent e)
414 {
415 if( StringUtils.isNullOrEmpty( testStep.getSource() ))
416 {
417 UISupport.showErrorMessage( "Missing source-file to load from" );
418 return;
419 }
420
421 try
422 {
423 boolean createMissing = UISupport.confirm("Create missing properties?", "Reload Properties");
424 int cnt = testStep.loadProperties(createMissing);
425 UISupport.showInfoMessage("Loaded " + cnt + " properties from [" + testStep.getSource() + "]");
426 }
427 catch (Exception e1)
428 {
429 UISupport.showErrorMessage("Failed to load properties from [" + testStep.getSource() + "]; " + e1);
430 }
431 }
432 }
433
434 private class ClearPropertiesAction extends AbstractAction
435 {
436 public ClearPropertiesAction()
437 {
438 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/clear_properties.gif"));
439 putValue(Action.SHORT_DESCRIPTION, "Clears all current property values");
440 }
441
442 public void actionPerformed(ActionEvent e)
443 {
444 if( UISupport.confirm("Clear all property values?", "Clear Properties"))
445 testStep.clearPropertyValues();
446 }
447 }
448
449 private class SetPropertiesTargetAction extends AbstractAction
450 {
451 public SetPropertiesTargetAction()
452 {
453 putValue(Action.SMALL_ICON, UISupport.createImageIcon("/set_properties_target.gif"));
454 putValue(Action.SHORT_DESCRIPTION, "Selects the properties target file");
455 }
456
457 public void actionPerformed(ActionEvent e)
458 {
459 File file = UISupport.getFileDialogs().saveAs(this, "Set properties target");
460 if (file != null)
461 {
462 testStep.setTarget(file.getAbsolutePath());
463 targetField.setText(testStep.getTarget());
464
465 try
466 {
467 int cnt = testStep.saveProperties();
468 UISupport.showInfoMessage("Saved " + cnt + " properties to [" + testStep.getTarget() + "]");
469 }
470 catch (IOException e1)
471 {
472 UISupport.showErrorMessage("Failed to save properties to [" + testStep.getTarget() + "]; " + e1);
473 }
474 }
475 }
476 }
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495 }