package de.tud.socom.client.gui.components;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import de.tud.socom.client.logic.Connection;
import de.tud.socom.client.logic.Status;
@SuppressWarnings("serial")
public abstract class ComponentPanel extends JPanel {
private JPanel parameterPanel;
private JList methodList;
private int optioanlParameterCount = 0;
private boolean isPOST = false;
protected Map<String, JTextField> stringParams = new HashMap<String, JTextField>();
private Map<String, JCheckBox> booleanParams = new HashMap<String, JCheckBox>();
private Map<String, JSpinner> integerParams = new HashMap<String, JSpinner>();
private Map<String, JComboBox> comboParams = new HashMap<String, JComboBox>();
private File uploadFile;
public ComponentPanel() {
setLayout(new BorderLayout(0, 0));
JButton btnGenerateUrl = new JButton("Generate URL");
add(btnGenerateUrl, BorderLayout.SOUTH);
JSplitPane splitPane = new JSplitPane();
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
add(splitPane, BorderLayout.CENTER);
JSplitPane splitPane_1 = new JSplitPane();
splitPane_1.setOrientation(JSplitPane.VERTICAL_SPLIT);
splitPane.setLeftComponent(splitPane_1);
JLabel lblSelectMethod = new JLabel("Select Method");
splitPane_1.setLeftComponent(lblSelectMethod);
methodList = getJList();
methodList.setSelectedIndex(0);
methodList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
splitPane_1.setRightComponent(methodList);
parameterPanel = new JPanel();
parameterPanel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
splitPane.setRightComponent(parameterPanel);
btnGenerateUrl.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
generateURL();
}
});
initListener(methodList);
}
private void generateURL() {
String component = getComponent();
String method = getMethod();
if (method == null) {
JOptionPane.showMessageDialog(this, "Select a method.");
return;
}
String URL = Status.SERVER_URL + component + "/" + method + "?";
if (!isPOST) {
URL = appendGETParams(URL);
Status.get().setCurrentMethod(Connection.GET_REQUEST);
} else {
URL = URL.substring(0, URL.length() - 1);
String params = getPOSTParams();
Status.get().setCookieParams(params);
Status.get().setFile(uploadFile);
Status.get().setCurrentMethod(Connection.POST_REQUEST);
}
Status.get().setCurrentURL(URL);
}
private String getPOSTParams() {
String cookieParams = "";
for (String param : stringParams.keySet()) {
cookieParams += param + "=" + stringParams.get(param).getText().replaceAll(",", ";") + ",";
}
for (String param : booleanParams.keySet()) {
cookieParams += param + "=" + booleanParams.get(param).isSelected() + ",";
}
for (String param : integerParams.keySet()) {
JSpinner spinner = integerParams.get(param);
if (spinner.isEnabled())
cookieParams += param + "=" + spinner.getValue() + ",";
}
for (String param : comboParams.keySet()) {
cookieParams += param + "=" + comboParams.get(param).getSelectedItem() + ",";
}
if (cookieParams.endsWith(","))
cookieParams = cookieParams.substring(0, cookieParams.length() - 1);
return cookieParams;
}
private String appendGETParams(String URL) {
for (String param : stringParams.keySet()) {
URL += param + "=" + stringParams.get(param).getText() + "&";
}
for (String param : booleanParams.keySet()) {
URL += param + "=" + booleanParams.get(param).isSelected() + "&";
}
for (String param : integerParams.keySet()) {
URL += param + "=" + integerParams.get(param).getValue() + "&";
}
for (String param : comboParams.keySet()) {
URL += param + "=" + comboParams.get(param).getSelectedItem() + "&";
}
if (URL.endsWith("&"))
URL = URL.substring(0, URL.length() - 1);
if (URL.endsWith("?"))
URL = URL.substring(0, URL.length() - 1);
return URL;
}
protected abstract String getComponent();
protected String getMethod() {
return ((String) methodList.getSelectedValue()).split(" ")[0];
}
protected abstract JList getJList();
protected abstract void updatePanel(Object selectedValue);
protected JCheckBox addOptionalIntegerParameter(final String key) {
JCheckBox keyLabel = new JCheckBox(key);
parameterPanel.add(keyLabel);
final JSpinner paramField = new JSpinner();
paramField.setEnabled(false);
parameterPanel.add(paramField);
keyLabel.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
if (((JCheckBox) arg0.getSource()).isSelected()) {
paramField.setEnabled(true);
integerParams.put(key, paramField);
} else {
integerParams.remove(key);
paramField.setEnabled(false);
}
}
});
return keyLabel;
}
protected void addOptionalStringParameter(String key) {
addOptionalStringParameter(key, null);
}
protected void addOptionalStringParameter(final String key, String tooltip) {
JCheckBox keyLabel = new JCheckBox(key);
parameterPanel.add(keyLabel);
final JTextField paramField = new JTextField();
if(tooltip != null)
paramField.setToolTipText(tooltip);
parameterPanel.add(paramField);
paramField.setColumns(1);
paramField.setEnabled(false);
parameterPanel.add(paramField);
keyLabel.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
if (((JCheckBox) arg0.getSource()).isSelected()) {
paramField.setEnabled(true);
stringParams.put(key, paramField);
} else {
stringParams.remove(key);
paramField.setEnabled(false);
}
}
});
}
protected void addOptionalParameter() {
final JTextField keyBox = new JTextField();
final JTextField valueBox = new JTextField();
keyBox.setToolTipText("Optional Key-Value Pair.");
valueBox.setEnabled(false);
parameterPanel.add(keyBox);
parameterPanel.add(valueBox);
keyBox.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent arg0) {
}
@Override
public void keyReleased(KeyEvent arg0) {
valueBox.setEnabled(!keyBox.getText().trim().isEmpty());
}
@Override
public void keyPressed(KeyEvent arg0) {
}
});
valueBox.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
String keyText = keyBox.getText();
String valueText = valueBox.getText();
if (!keyText.isEmpty() && valueBox.isEnabled() && !valueText.isEmpty())
stringParams.put(keyText, valueBox);
else
stringParams.remove(keyText);
}
@Override
public void keyPressed(KeyEvent e) {
}
});
}
protected void addOptionalBooleanParameter(final String key) {
JCheckBox keyLabel = new JCheckBox(key);
parameterPanel.add(keyLabel);
final JCheckBox paramField = new JCheckBox();
parameterPanel.add(paramField);
paramField.setEnabled(false);
parameterPanel.add(paramField);
keyLabel.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent arg0) {
if (((JCheckBox) arg0.getSource()).isSelected()) {
paramField.setEnabled(true);
booleanParams.put(key, paramField);
} else {
booleanParams.remove(key);
paramField.setEnabled(false);
}
}
});
}
protected JTextField addStringParameter(String key, String tip) {
JLabel keyLabel = new JLabel(key);
parameterPanel.add(keyLabel);
JTextField paramField = new JTextField();
parameterPanel.add(paramField);
paramField.setColumns(1);
if (tip != null) {
paramField.setToolTipText(tip);
paramField.setText(tip);
}
stringParams.put(key, paramField);
return paramField;
}
protected void addBooleanParameter(String key) {
JLabel keyLabel = new JLabel(key);
parameterPanel.add(keyLabel);
JCheckBox paramField = new JCheckBox();
parameterPanel.add(paramField);
booleanParams.put(key, paramField);
}
protected JSpinner addIntegerParameter(String key) {
JLabel keyLabel = new JLabel(key);
parameterPanel.add(keyLabel);
JSpinner paramField = new JSpinner();
parameterPanel.add(paramField);
integerParams.put(key, paramField);
return paramField;
}
protected void addComboParameter(String... lst) {
JLabel param = new JLabel(lst[0]);
parameterPanel.add(param);
JComboBox combo = new JComboBox(Arrays.copyOfRange(lst, 1, lst.length));
parameterPanel.add(combo);
comboParams.put(lst[0], combo);
}
protected void addFileChooserParameter(String name) {
JButton button = new JButton(name);
parameterPanel.add(button);
final JLabel fileLabel = new JLabel("-");
parameterPanel.add(fileLabel);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
jfc.showOpenDialog(null);
File f = jfc.getSelectedFile();
if (f == null || !f.exists() || f.isDirectory())
return;
uploadFile = f;
fileLabel.setText(f.getName());
}
});
}
protected void refresh() {
parameterPanel.setLayout(new GridLayout(getRows(), 2, 0, 0));
parameterPanel.setVisible(false);
parameterPanel.setVisible(true);
}
private int getRows() {
return stringParams.size() + booleanParams.size() + integerParams.size() + comboParams.size() + optioanlParameterCount;
}
protected void initListener(JList comboBox) {
comboBox.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
clearParameterList();
updatePanel(((JList) e.getSource()).getSelectedValue());
}
});
}
protected void addStringParameterList(String... string) {
for (String param : string) {
addStringParameter(param, null);
}
}
protected void addStringPredefinedParameterList(String... string) {
for (int i = 0; i < string.length; i += 2) {
addStringParameter(string[i], string[i + 1]);
}
}
protected void addBooleanParameterList(String... string) {
for (String param : string) {
addBooleanParameter(param);
}
}
protected void setAdditionalParameterCount(int count) {
this.optioanlParameterCount = count;
}
protected void clearParameterList() {
parameterPanel.removeAll();
parameterPanel.setVisible(false);
parameterPanel.setVisible(true);
stringParams.clear();
booleanParams.clear();
integerParams.clear();
comboParams.clear();
Status.get().setFile(null);
isPOST = false;
}
protected void activatePost() {
isPOST = true;
}
protected void setUploadFile(File f) {
this.uploadFile = f;
}
}