/*
* 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.impl.support.actions.ShowOnlineHelpAction;
import com.eviware.soapui.support.UISupport;
import com.eviware.soapui.support.action.swing.ActionList;
import com.eviware.soapui.support.action.swing.DefaultActionList;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
/**
* Utility for creating simple configuration dialogs
*
* @author Ole.Matzura
*/
public class SwingConfigurationDialogImpl implements ConfigurationDialog {
private JDialog dialog;
private SimpleForm form;
private boolean result;
private Map<String, String> values;
private Map<String, FieldType> fieldTypes = new HashMap<String, FieldType>();
private final String title;
private Dimension size;
private JComponent content;
private ActionList actions;
private String description;
private ImageIcon icon;
public SwingConfigurationDialogImpl(String title, String helpUrl, String description, ImageIcon icon) {
this.title = title;
this.description = description;
this.icon = icon;
form = new SimpleForm("10px,left:pref,10px,left:pref,5px");
actions = new DefaultActionList("Actions");
if (helpUrl != null) {
actions.addAction(new ShowOnlineHelpAction(helpUrl));
actions.addSeparator();
}
OkAction okAction = new OkAction();
actions.addAction(okAction);
actions.addAction(new CancelAction());
actions.setDefaultAction(okAction);
}
public boolean show(Map<String, String> values) {
if (dialog == null) {
buildDialog();
}
this.values = values;
result = false;
form.setValues(values);
if (size == null) {
dialog.pack();
} else {
dialog.setSize(size);
}
UISupport.showDialog(dialog);
return result;
}
public Dimension getSize() {
return size;
}
public void setSize(Dimension preferredSize) {
this.size = preferredSize;
}
public void addTextField(String name, String tooltip) {
addTextField(name, tooltip, FieldType.TEXT);
}
public void addTextField(String name, String tooltip, FieldType type) {
if (type == FieldType.DIRECTORY) {
form.append(name, new DirectoryFormComponent(tooltip));
} else {
form.appendTextField(name, tooltip);
}
fieldTypes.put(name, type);
}
public void addCheckBox(String caption, String label, boolean selected) {
form.appendCheckBox(caption, label, selected);
}
public void setContent(JComponent content) {
this.content = content;
}
private void buildDialog() {
dialog = new JDialog(UISupport.getMainFrame(), title, true);
form.getPanel().setBorder(BorderFactory.createEmptyBorder(5, 0, 5, 0));
JPanel panel = new JPanel(new BorderLayout());
JComponent contentPanel = content == null ? form.getPanel() : content;
panel.add(contentPanel, BorderLayout.CENTER);
JButtonBar buttons = UISupport.initDialogActions(actions, dialog);
buttons.setBorder(BorderFactory.createEmptyBorder(3, 5, 3, 5));
if (content == null) {
JPanel p = new JPanel(new BorderLayout());
p.add(new JSeparator(), BorderLayout.NORTH);
p.add(buttons, BorderLayout.CENTER);
panel.add(p, BorderLayout.SOUTH);
} else {
panel.add(buttons, BorderLayout.SOUTH);
}
if (description != null || icon != null) {
dialog.getContentPane().add(UISupport.buildDescription(title, description, icon), BorderLayout.NORTH);
}
dialog.getContentPane().add(panel);
dialog.pack();
}
private class OkAction extends AbstractAction {
public OkAction() {
super("OK");
}
public void actionPerformed(ActionEvent e) {
result = true;
form.getValues(values);
dialog.setVisible(false);
try {
SoapUI.saveSettings();
} catch (Exception e1) {
SoapUI.logError(e1, "There was an error when attempting to save your preferences");
UISupport.showErrorMessage(e1);
}
}
}
private class CancelAction extends AbstractAction {
public CancelAction() {
super("Cancel");
}
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
}
}
public void addComboBox(String label, Object[] objects, String tooltip) {
form.appendComboBox(label, objects, tooltip);
}
public void setValues(String id, String[] values) {
JComponent component = form.getComponent(id);
if (component instanceof JComboBox) {
((JComboBox) component).setModel(new DefaultComboBoxModel(values));
} else if (component instanceof JList) {
((JList) component).setModel(new DefaultComboBoxModel(values));
} else {
throw new RuntimeException("Could not set values on [" + component + "]");
}
}
public void addComboBox(String label, String tooltip) {
form.appendComboBox(label, new String[]{}, tooltip);
}
public void addComponent(JComponent component) {
form.addComponent(component);
}
public void getValues(Map<String, String> values) {
form.getValues(values);
}
public ActionList getActions() {
return actions;
}
public void hide() {
dialog.setVisible(false);
}
}