/* The contents of this file are subject to the license and copyright terms
* detailed in the license directory at the root of the source tree (also
* available online at http://fedora-commons.org/license/).
*/
package fedora.server.config;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class ParameterPanel
extends JPanel
implements ListSelectionListener, ActionListener {
private static final long serialVersionUID = 1L;
private final JList m_paramList;
private final ItemListModel m_model;
private final JPanel m_paramValuePanel;
private boolean m_ignoreValueChanged;
public ParameterPanel(java.util.List parameterList) {
super(new BorderLayout());
m_model = new ItemListModel(parameterList);
//
// WEST: Parameter chooser with add/delete buttons
//
JPanel paramChoice = new JPanel(new BorderLayout());
paramChoice.add(new JLabel("Parameter:"), BorderLayout.NORTH);
m_paramList = new JList(m_model);
m_paramList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
m_paramList.setVisibleRowCount(0);
m_paramList.addListSelectionListener(this);
paramChoice.add(new JScrollPane(m_paramList), BorderLayout.CENTER);
JPanel paramButtonPanel = new JPanel(new BorderLayout());
paramButtonPanel.setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 0));
JButton addButton = new JButton("Add Parameter...");
addButton.addActionListener(this);
JButton deleteButton = new JButton("Delete Parameter...");
deleteButton.addActionListener(this);
paramButtonPanel.add(addButton, BorderLayout.NORTH);
JPanel deleteButtonPanel = new JPanel(new BorderLayout());
deleteButtonPanel.add(deleteButton, BorderLayout.CENTER);
deleteButtonPanel
.setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 0));
paramButtonPanel.add(deleteButtonPanel, BorderLayout.SOUTH);
paramChoice.add(paramButtonPanel, BorderLayout.SOUTH);
paramChoice.setBorder(BorderFactory.createEmptyBorder(6, 12, 12, 6));
//
// CENTER: CardLayout, one panel per parameter
//
m_paramValuePanel = new JPanel(new CardLayout());
Iterator iter = parameterList.iterator();
while (iter.hasNext()) {
addParamValueCard((Parameter) iter.next());
}
m_paramValuePanel.setBorder(BorderFactory.createEmptyBorder(6,
6,
12,
12));
add(paramChoice, BorderLayout.WEST);
add(m_paramValuePanel, BorderLayout.CENTER);
m_paramList.setSelectedIndex(0);
}
private void addParamValueCard(Parameter param) {
m_paramValuePanel.add(new ParamValueCard(param), param.getName());
}
private void deleteParamValueCard(Parameter param) {
Component[] components = m_paramValuePanel.getComponents();
for (Component element : components) {
if (element instanceof ParamValueCard) {
ParamValueCard card = (ParamValueCard) element;
if (card.getName().equals(param.getName())) {
m_paramValuePanel.remove(card);
}
}
}
}
public void valueChanged(ListSelectionEvent e) {
if (!m_ignoreValueChanged) {
CardLayout cl = (CardLayout) m_paramValuePanel.getLayout();
Parameter param =
(Parameter) m_model.getElementAt(m_paramList
.getSelectedIndex());
cl.show(m_paramValuePanel, param.getName());
validate();
}
}
/**
* Get the values from the UI into a List of Parameter objects.
*/
public java.util.List getParameters() {
ArrayList out = new ArrayList();
Component[] components = m_paramValuePanel.getComponents();
for (Component element : components) {
if (element instanceof ParamValueCard) {
ParamValueCard card = (ParamValueCard) element;
out.add(card.getParameter());
}
}
return out;
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().startsWith("Add")) {
String paramName =
JOptionPane
.showInputDialog("What is the new parameter name?");
if (paramName != null) {
// first, check if one of that name is in m_model (if so we'll just switch to it)
Iterator iter = m_model.toList().iterator();
Parameter param = null;
while (iter.hasNext()) {
Parameter p = (Parameter) iter.next();
if (p.getName().equals(paramName)) {
param = p;
}
}
if (param == null) {
param =
new Parameter(paramName,
"Enter value here.",
false,
"Enter description here.",
new HashMap());
m_model.addElement(param);
addParamValueCard(param);
}
// switch to the new (or already existing) parameter
m_paramList.setSelectedValue(param, true);
valueChanged(null);
}
} else if (e.getActionCommand().startsWith("Delete")) {
// delete the currently selected item from m_model
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
int i = m_paramList.getSelectedIndex();
if (i >= 0) {
m_ignoreValueChanged = true;
Parameter param =
(Parameter) m_paramList.getSelectedValue();
m_model.remove(i);
m_ignoreValueChanged = false;
// ...and set the selection to something sane
if (m_model.size() > 0) {
if (m_model.size() > i) {
m_paramList.setSelectedIndex(i);
} else {
i = m_model.size() - 1;
m_paramList
.setSelectedIndex(m_model.size() - 1);
}
}
// finally, remove the panel from the cardlayout
deleteParamValueCard(param);
}
}
});
}
}
/**
* A JPanel for modifying the description, value, and server
* profile-specific values of a particular parameter. The layout is
* accomplished through nested Panels using BorderLayouts.
*/
public class ParamValueCard
extends JPanel {
private static final long serialVersionUID = 1L;
private JTextArea m_descArea;
private final JComboBox m_profileList;
private final JTextField m_valueText;
private final String m_name;
private final JPanel m_valuePanel;
@Override
public String getName() {
return m_name;
}
public ParamValueCard(Parameter param) {
super(new BorderLayout());
m_name = param.getName();
//
// First, create all the interesting (non-layout) components
//
// a1
if (param.getComment() == null) {
m_descArea = new JTextArea();
} else {
m_descArea = new JTextArea(param.getComment());
}
// l1
JLabel descriptionLabel = new JLabel("Description:");
// d1
m_profileList =
new JComboBox(new String[] {"Primary value",
"'mckoi' value", "'oracle' value",
"Add Profile...", "Delete Profile..."});
//
// TODO: each value gets it's own card
//
m_valuePanel = new JPanel(new CardLayout());
m_valueText = new JTextField(param.getValue());
//
// Then, lay them out with a bunch of crazy JPanels
//
JPanel c1 = new JPanel(new BorderLayout());
c1.add(new JScrollPane(m_descArea), BorderLayout.CENTER);
c1.add(descriptionLabel, BorderLayout.NORTH);
add(c1, BorderLayout.CENTER);
JPanel s1 = new JPanel(new BorderLayout());
add(s1, BorderLayout.SOUTH);
JPanel c2 = new JPanel(new BorderLayout());
JPanel w3 = new JPanel(new BorderLayout());
w3.setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 6));
w3.add(m_profileList, BorderLayout.NORTH);
JPanel c3 = new JPanel(new BorderLayout());
c3.add(m_valueText, BorderLayout.NORTH);
c3.setBorder(BorderFactory.createEmptyBorder(6, 0, 0, 0));
c2.add(c3, BorderLayout.CENTER);
c2.add(w3, BorderLayout.WEST);
s1.add(c2, BorderLayout.CENTER);
}
public Parameter getParameter() {
String comment = m_descArea.getText();
return null;
// return new Parameter(m_name, comment, value, profileValues);
}
}
}