/*
* 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.support.components;
import com.eviware.soapui.SoapUI;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.types.StringList;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
public class StringListFormComponent extends JPanel implements JFormComponent, ActionListener {
private DefaultListModel listModel;
private String defaultValue = null;
private JButton addButton;
private JButton removeButton;
private JList list;
private JButton editButton;
private Box buttonBox;
private List<JButton> buttons = new ArrayList<JButton>();
public StringListFormComponent(String tooltip) {
this(tooltip, false, null);
}
public StringListFormComponent(String tooltip, boolean editOnly) {
this(tooltip, editOnly, null);
}
public StringListFormComponent(String tooltip, boolean editOnly, String defaultValue) {
super(new BorderLayout());
this.defaultValue = defaultValue;
listModel = new DefaultListModel();
list = new JList(listModel);
list.setToolTipText(tooltip);
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(300, 70));
add(scrollPane, BorderLayout.CENTER);
buttonBox = new Box(BoxLayout.Y_AXIS);
buttonBox.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
if (!editOnly) {
addButton = new JButton("Add..");
addButton.addActionListener(this);
buttonBox.add(addButton);
buttonBox.add(Box.createVerticalStrut(5));
}
editButton = new JButton("Edit..");
editButton.addActionListener(this);
buttons.add(editButton);
buttonBox.add(editButton);
if (!editOnly) {
buttonBox.add(Box.createVerticalStrut(5));
removeButton = new JButton("Remove..");
removeButton.addActionListener(this);
buttonBox.add(removeButton);
buttons.add(removeButton);
}
add(buttonBox, BorderLayout.EAST);
list.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
setButtonState();
}
});
setButtonState();
}
public void addButton(Action action, boolean requireSelection) {
buttonBox.add(Box.createVerticalStrut(5));
JButton button = new JButton(action);
buttonBox.add(button);
if (requireSelection) {
buttons.add(button);
setButtonState();
}
}
public void setValue(String value) {
String[] oldData = getData();
listModel.clear();
try {
StringList stringList = StringList.fromXml(value);
String[] files = stringList.toStringArray();
for (String file : files) {
if (file.trim().length() > 0) {
listModel.addElement(file);
}
}
firePropertyChange("data", oldData, getData());
} catch (Exception e) {
SoapUI.logError(e);
}
}
public String getValue() {
StringList result = new StringList(listModel.toArray());
return result.toXml();
}
public JList getList() {
return list;
}
public void actionPerformed(ActionEvent e) {
String[] oldData = getData();
if (e.getSource() == addButton) {
String value = UISupport.prompt("Specify value to add", "Add..", defaultValue);
if (value != null) {
listModel.addElement(value);
firePropertyChange("options", oldData, getData());
}
} else {
int selectedIndex = list.getSelectedIndex();
if (e.getSource() == removeButton && selectedIndex != -1) {
Object elm = listModel.getElementAt(selectedIndex);
if (UISupport.confirm("Remove [" + elm.toString() + "] from list", "Remove")) {
listModel.remove(selectedIndex);
firePropertyChange("options", oldData, getData());
}
} else if (e.getSource() == editButton && selectedIndex != -1) {
String elm = (String) listModel.getElementAt(selectedIndex);
String value = UISupport.prompt("Specify value", "Edit..", elm);
if (value != null) {
listModel.setElementAt(value, selectedIndex);
firePropertyChange("options", oldData, getData());
}
}
}
}
public void setButtonState() {
boolean b = list.getSelectedIndex() != -1;
for (JButton button : buttons) {
button.setEnabled(b);
}
}
public String[] getData() {
String[] result = new String[listModel.size()];
for (int c = 0; c < result.length; c++) {
result[c] = (String) listModel.get(c);
}
return result;
}
public void setData(String[] strings) {
String[] oldData = getData();
listModel.clear();
if (strings != null) {
for (String str : strings) {
listModel.addElement(str);
}
}
firePropertyChange("options", oldData, getData());
}
public String[] getOptions() {
return getData();
}
public void setOptions(String[] options) {
setData(options);
}
public void setEnabled(boolean b) {
addButton.setEnabled(b);
list.setEnabled(b);
if (b) {
setButtonState();
}
}
public void addItem(String valueOf) {
listModel.addElement(valueOf);
}
}