/*
* Copyright 2004-2014 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.x.impl.swing;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.border.Border;
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.actions.iface.tools.support.NamespaceTable;
import com.eviware.soapui.model.iface.Interface;
import com.eviware.soapui.support.StringUtils;
import com.eviware.soapui.support.types.StringToStringMap;
import com.eviware.x.form.XForm;
import com.eviware.x.form.XFormField;
import com.eviware.x.form.XFormOptionsField;
import com.eviware.x.form.XFormTextField;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
public class SwingXFormImpl implements XForm {
private JPanel panel;
private CellConstraints cc = new CellConstraints();
private FormLayout layout;
private RowSpec rowSpec;
private int rowSpacing = 5;
private Map<String, XFormField> components = new HashMap<String, XFormField>();
private String rowAlignment = "top";
private String name;
public SwingXFormImpl(String name) {
this(name, 5);
}
public SwingXFormImpl(String name, int leftIndent) {
this.name = name;
layout = new FormLayout(leftIndent + "px,left:pref,5px,left:default,5px:grow(1.0)");
panel = new JPanel(layout);
rowSpec = new RowSpec(rowAlignment + ":pref");
}
public SwingXFormImpl(String name, FormLayout layout) {
this.name = name;
this.layout = layout;
panel = new JPanel(layout);
rowSpec = new RowSpec(rowAlignment + ":pref");
}
public String getName() {
return name;
}
public int getRowSpacing() {
return rowSpacing;
}
public void setRowSpacing(int rowSpacing) {
this.rowSpacing = rowSpacing;
}
public void setName(String name) {
this.name = name;
}
public JPanel getPanel() {
return panel;
}
public void addSpace(int size) {
if (size > 0) {
layout.appendRow(new RowSpec(size + "px"));
}
}
public XFormField addCheckBox(String name, String description) {
JCheckBoxFormField checkBox = new JCheckBoxFormField(description == null ? name : description);
if (name != null && description != null) {
checkBox.setToolTip(description);
}
addComponent(name, checkBox);
return checkBox;
}
/*
* If label starts with '###' do not show them. (non-Javadoc) if label ends
* with '___' (3) right border is 30 and no ':' at the end
*
* @see com.eviware.x.form.XForm#addComponent(java.lang.String,
* com.eviware.x.form.XFormField)
*/
public XFormField addComponent(String label, XFormField formComponent) {
if (rowSpacing > 0 && !components.isEmpty()) {
addSpace(rowSpacing);
}
components.put(label, formComponent);
layout.appendRow(rowSpec);
int row = layout.getRowCount();
AbstractSwingXFormField<?> swingFormComponent = (AbstractSwingXFormField<?>) formComponent;
if (!StringUtils.isNullOrEmpty(label) && !label.startsWith("###")) {
JLabel jlabel = null;
if (label.endsWith("___")) {
jlabel = new JLabel(label.substring(0, label.length() - 3));
jlabel.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 30));
} else {
jlabel = new JLabel(label.endsWith(":") ? label : label + ":");
jlabel.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
}
panel.add(jlabel, cc.xy(2, row));
jlabel.setLabelFor(swingFormComponent.getComponent());
int ix = label.indexOf('&');
if (ix >= 0) {
jlabel.setText(label.substring(0, ix) + label.substring(ix + 1));
jlabel.setDisplayedMnemonicIndex(ix);
jlabel.setDisplayedMnemonic(label.charAt(ix + 1));
}
swingFormComponent.getComponent().getAccessibleContext().setAccessibleDescription(label);
}
if (!StringUtils.isNullOrEmpty(label) && label.startsWith("###")) {
panel.add(swingFormComponent.getComponent(), cc.xyw(2, row, 4));
} else //Keep the name/Label to empty/null to add only the component (in column 4), not the JLabel for name
{
panel.add(swingFormComponent.getComponent(), cc.xy(4, row));
}
components.put(label, formComponent);
return formComponent;
}
public XFormOptionsField addComboBox(String name, Object[] values, String description) {
JComboBoxFormField comboBox = new JComboBoxFormField(values);
comboBox.setToolTip(description);
comboBox.getComponent().setName(name);
addComponent(name, comboBox);
return comboBox;
}
public void addSeparator() {
addSeparator(null);
}
public void addSeparator(String label) {
addSpace(rowSpacing);
addSpace(rowSpacing);
layout.appendRow(rowSpec);
int row = layout.getRowCount();
if (StringUtils.isNullOrEmpty(label)) {
panel.add(new JSeparator(), cc.xywh(2, row, 3, 1));
} else {
panel.add(new JLabel(label), cc.xywh(2, row, 3, 1));
}
addSpace(rowSpacing);
}
public XFormTextField addTextField(String name, String description, FieldType type) {
if (type == FieldType.FOLDER || type == FieldType.FILE || type == FieldType.PROJECT_FOLDER
|| type == FieldType.PROJECT_FILE || type == FieldType.FILE_OR_FOLDER) {
return (XFormTextField) addComponent(name, new FileFormField(description, type, name));
} else if (type == FieldType.PASSWORD) {
JPasswordFieldFormField pwdField = new JPasswordFieldFormField();
pwdField.getComponent().setColumns(30);
pwdField.setToolTip(description);
addComponent(name, pwdField);
return pwdField;
} else if (type == FieldType.TEXTAREA) {
JTextAreaFormField field = new JTextAreaFormField();
field.getTextArea().setColumns(40);
field.getTextArea().setRows(5);
field.setToolTip(description);
addComponent(name, field);
return field;
} else {
JTextFieldFormField textField = new JTextFieldFormField();
textField.getComponent().setColumns(40);
textField.getComponent().setName(name);
textField.setToolTip(description);
addComponent(name, textField);
return textField;
}
}
public void setComponentValue(String label, String value) {
XFormField component = getComponent(label);
if (component != null) {
component.setValue(value);
}
}
public String getComponentValue(String name) {
XFormField component = getComponent(name);
return component == null ? null : component.getValue();
}
public XFormField getComponent(String label) {
return components.get(label);
}
public void setBorder(Border border) {
panel.setBorder(border);
}
public XFormField addComponent(XFormField component) {
if (rowSpacing > 0 && !components.isEmpty()) {
addSpace(rowSpacing);
}
layout.appendRow(rowSpec);
int row = layout.getRowCount();
AbstractSwingXFormField<?> swingFormComponent = (AbstractSwingXFormField<?>) component;
panel.add(swingFormComponent.getComponent(), cc.xyw(1, row, 4));
return component;
}
public void setValues(StringToStringMap values) {
for (Map.Entry<String, String> entry : values.entrySet()) {
setComponentValue(entry.getKey(), entry.getValue());
}
}
public StringToStringMap getValues() {
StringToStringMap values = new StringToStringMap();
for (Iterator<String> i = components.keySet().iterator(); i.hasNext(); ) {
String key = i.next();
values.put(key, getComponentValue(key));
}
return values;
}
public XFormField addNameSpaceTable(String label, Interface modelItem) {
return addComponent(label, new NamespaceTable((WsdlInterface) modelItem));
}
public void setOptions(String name, Object[] values) {
XFormOptionsField combo = (XFormOptionsField) getComponent(name);
if (combo != null) {
combo.setOptions(values);
}
}
public void addLabel(String name, String label) {
addComponent(name, new JLabelFormField(label));
}
public XFormField[] getFormFields() {
return components.values().toArray(new XFormField[components.size()]);
}
public void setFormFieldProperty(String name, Object value) {
for (XFormField field : components.values()) {
field.setProperty(name, value);
}
}
public Object[] getOptions(String name) {
XFormField combo = getComponent(name);
if (combo instanceof XFormOptionsField) {
return ((XFormOptionsField) combo).getOptions();
}
return null;
}
public XFormField getFormField(String name) {
return components.get(name);
}
}