/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.panels.teststeps;
import com.eviware.soapui.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.impl.wsdl.panels.support.TestRunComponentEnabler;
import com.eviware.soapui.impl.wsdl.panels.teststeps.support.PropertyHolderTable;
import com.eviware.soapui.impl.wsdl.support.HelpUrls;
import com.eviware.soapui.impl.wsdl.teststeps.WsdlPropertiesTestStep;
import com.eviware.soapui.model.ModelItem;
import com.eviware.soapui.model.support.ModelSupport;
import com.eviware.soapui.support.DocumentListenerAdapter;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.components.JXToolBar;
import com.eviware.soapui.ui.support.ModelItemDesktopPanel;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.text.Document;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.IOException;
/**
* DesktopPanel for WsdlPropertiesTestSteps
*
* @author Ole.Matzura
*/
public class PropertiesStepDesktopPanel extends ModelItemDesktopPanel<WsdlPropertiesTestStep> implements
PropertyChangeListener {
private final WsdlPropertiesTestStep testStep;
private JTextField sourceField;
private JTextField targetField;
private PropertyHolderTable propertiesTable;
private TestRunComponentEnabler componentEnabler;
protected boolean updatingSource;
protected boolean updatingTarget;
public PropertiesStepDesktopPanel(WsdlPropertiesTestStep testStep) {
super(testStep);
this.testStep = testStep;
componentEnabler = new TestRunComponentEnabler(testStep.getTestCase());
buildUI();
testStep.addPropertyChangeListener(this);
}
private void buildUI() {
propertiesTable = createPropertyHolderTable();
add(propertiesTable, BorderLayout.CENTER);
JXToolBar toolbar = propertiesTable.getToolbar();
toolbar.addRelatedGap();
JButton reloadButton = UISupport.createToolbarButton(new ReloadPropertiesFromSourceAction());
toolbar.add(reloadButton);
toolbar.addSeparator();
toolbar.add(new JLabel("Load from:"));
sourceField = new JTextField(testStep.getSource(), 20) {
@Override
public String getToolTipText(MouseEvent event) {
return testStep.getSource(true);
}
};
sourceField.setToolTipText("The filename/url or referring system-property to load properties from");
sourceField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
public void update(Document document) {
if (updatingSource) {
return;
}
updatingSource = true;
testStep.setSource(sourceField.getText());
updatingSource = false;
}
});
toolbar.addRelatedGap();
toolbar.addFixed(sourceField);
JButton setSourceButton = UISupport.createToolbarButton(new SetPropertiesSourceAction());
toolbar.addRelatedGap();
toolbar.add(setSourceButton);
toolbar.addSeparator();
toolbar.add(new JLabel("Save to:"));
targetField = new JTextField(testStep.getTarget(), 20) {
@Override
public String getToolTipText(MouseEvent event) {
return testStep.getTarget(true);
}
};
targetField.setToolTipText("The filename/url or referring system-property to save properties to");
targetField.getDocument().addDocumentListener(new DocumentListenerAdapter() {
public void update(Document document) {
if (updatingTarget) {
return;
}
updatingTarget = true;
testStep.setTarget(targetField.getText());
updatingTarget = false;
}
});
toolbar.addRelatedGap();
toolbar.addFixed(targetField);
JButton setTargetButton = UISupport.createToolbarButton(new SetPropertiesTargetAction());
toolbar.addRelatedGap();
toolbar.add(setTargetButton);
toolbar.add(Box.createHorizontalGlue());
toolbar.addSeparator();
toolbar.add(UISupport.createToolbarButton(new ShowOnlineHelpAction(HelpUrls.PROPERTIESSTEPEDITOR_HELP_URL)));
componentEnabler.add(sourceField);
componentEnabler.add(targetField);
componentEnabler.add(setTargetButton);
componentEnabler.add(setSourceButton);
componentEnabler.add(propertiesTable);
setPreferredSize(new Dimension(600, 400));
}
protected PropertyHolderTable createPropertyHolderTable() {
return new PropertyHolderTable(getModelItem());
}
public boolean onClose(boolean canCancel) {
componentEnabler.release();
propertiesTable.release();
return release();
}
public JComponent getComponent() {
return this;
}
public boolean dependsOn(ModelItem modelItem) {
return modelItem == testStep || modelItem == testStep.getTestCase()
|| modelItem == testStep.getTestCase().getTestSuite()
|| modelItem == testStep.getTestCase().getTestSuite().getProject();
}
private class SetPropertiesSourceAction extends AbstractAction {
public SetPropertiesSourceAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/set_properties_source.gif"));
putValue(Action.SHORT_DESCRIPTION, "Selects the properties source file");
}
public void actionPerformed(ActionEvent e) {
String root = ModelSupport.getResourceRoot(testStep);
File file = UISupport.getFileDialogs().open(this, "Set properties source", "properties",
"Properties Files (*.properties)", root);
if (file != null) {
updatingSource = true;
testStep.setSource(file.getAbsolutePath());
sourceField.setText(testStep.getSource());
updatingSource = false;
try {
boolean createMissing = UISupport.confirm("Create missing properties?", "Set Properties Source");
int cnt = testStep.loadProperties(createMissing);
UISupport.showInfoMessage("Loaded " + cnt + " properties from [" + testStep.getSource() + "]");
} catch (IOException e1) {
UISupport.showErrorMessage("Failed to load properties from [" + testStep.getSource() + "]; " + e1);
}
}
}
}
private class ReloadPropertiesFromSourceAction extends AbstractAction {
public ReloadPropertiesFromSourceAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/reload_properties.gif"));
putValue(Action.SHORT_DESCRIPTION, "Reloads the current properties from the selected file");
}
public void actionPerformed(ActionEvent e) {
if (StringUtils.isNullOrEmpty(testStep.getSource())) {
UISupport.showErrorMessage("Missing source-file to load from");
return;
}
try {
boolean createMissing = UISupport.confirm("Create missing properties?", "Reload Properties");
int cnt = testStep.loadProperties(createMissing);
UISupport.showInfoMessage("Loaded " + cnt + " properties from [" + testStep.getSource() + "]");
} catch (Exception e1) {
UISupport.showErrorMessage("Failed to load properties from [" + testStep.getSource() + "]; " + e1);
}
}
}
private class SetPropertiesTargetAction extends AbstractAction {
public SetPropertiesTargetAction() {
putValue(Action.SMALL_ICON, UISupport.createImageIcon("/set_properties_target.gif"));
putValue(Action.SHORT_DESCRIPTION, "Selects the properties target file");
}
public void actionPerformed(ActionEvent e) {
String root = ModelSupport.getResourceRoot(testStep);
File file = UISupport.getFileDialogs().saveAs(this, "Set properties target", "properties",
"Properties Files (*.properties)", new File(root));
if (file != null) {
updatingTarget = true;
testStep.setTarget(file.getAbsolutePath());
targetField.setText(testStep.getTarget());
updatingTarget = false;
try {
int cnt = testStep.saveProperties();
UISupport.showInfoMessage("Saved " + cnt + " properties to [" + testStep.getTarget() + "]");
} catch (IOException e1) {
UISupport.showErrorMessage("Failed to save properties to [" + testStep.getTarget() + "]; " + e1);
}
}
}
}
public void propertyChange(PropertyChangeEvent evt) {
if (!updatingSource && evt.getPropertyName().equals(WsdlPropertiesTestStep.SOURCE_PROPERTY)) {
sourceField.setText(evt.getNewValue().toString());
} else if (!updatingTarget && evt.getPropertyName().equals(WsdlPropertiesTestStep.TARGET_PROPERTY)) {
targetField.setText(evt.getNewValue().toString());
}
super.propertyChange(evt);
}
@Override
protected boolean release() {
testStep.removePropertyChangeListener(this);
return super.release();
}
/*
* public class PropertiesTransferHandler extends
* AbstractPropertiesTransferHandler { public
* PropertiesTransferHandler(JComponent component) { super(component); }
*
* protected StepProperty getSelectedProperty(JComponent c) { int rowIndex =
* propertiesTable.getSelectedRow(); if (rowIndex == -1) return null;
*
* return testStep.getTestStepPropertyAt(rowIndex); } }
*/
}