package thaw.plugins.nodeConfigurator;
import javax.swing.JPanel;
import javax.swing.JList;
import javax.swing.JComboBox;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.ListSelectionModel;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observer;
import java.util.Observable;
import java.util.Hashtable;
import java.util.Enumeration;
import java.util.Vector;
import thaw.core.I18n;
import thaw.fcp.FCPGetConfig;
import thaw.fcp.FCPModifyConfig;
import thaw.fcp.FCPQueueManager;
public class NodeConfiguratorTab implements Observer, ActionListener, ListSelectionListener {
private FCPQueueManager queueManager;
private boolean advanced;
private JPanel panel;
private JButton reload;
private JList categoryChoice;
private JList settingChoice;
private JTextArea descriptionArea;
private JTextField valueField;
private JComboBox valueSelecter;
private boolean selecter = false;
private JTextField defaultField;
private JPanel valuePanel;
private JButton applyButton;
public final static int COLUMNS_WIDTH = 125;
public final static int GRAY = 240;
private Hashtable categories = null;
private Vector categoryNames = null;
private final static String trueStr = I18n.getMessage("thaw.common.true");
private final static String falseStr = I18n.getMessage("thaw.common.false");
public NodeConfiguratorTab(boolean advanced, FCPQueueManager queueManager) {
this.advanced = advanced;
this.queueManager = queueManager;
JScrollPane sc;
panel = new JPanel(new BorderLayout(5, 5));
/* reload */
JPanel reloadPanel = new JPanel(new BorderLayout());
reload = new JButton(I18n.getMessage("thaw.plugin.nodeConfig.reload"));
reload.addActionListener(this);
reloadPanel.add(reload, BorderLayout.WEST);
reloadPanel.add(new JLabel(""), BorderLayout.EAST);
panel.add(reloadPanel, BorderLayout.NORTH);
/* categories */
JPanel categoryPanel = new JPanel(new BorderLayout(0, 0));
categoryPanel.add(new JLabel(I18n.getMessage("thaw.plugin.nodeConfig.categories")), BorderLayout.NORTH);
categoryChoice = new JList();
categoryChoice.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
categoryChoice.addListSelectionListener(this);
categoryPanel.add(sc = new JScrollPane(categoryChoice), BorderLayout.CENTER);
sc.setPreferredSize(new java.awt.Dimension(COLUMNS_WIDTH, COLUMNS_WIDTH));
panel.add(categoryPanel, BorderLayout.WEST);
JPanel subPanel = new JPanel(new BorderLayout(5, 5));
/* settings */
JPanel settingsPanel = new JPanel(new BorderLayout(0, 0));
settingsPanel.add(new JLabel(I18n.getMessage("thaw.plugin.nodeConfig.settings")), BorderLayout.NORTH);
settingChoice = new JList();
settingChoice.addListSelectionListener(this);
settingsPanel.add(sc = new JScrollPane(settingChoice), BorderLayout.CENTER);
sc.setPreferredSize(new java.awt.Dimension((int)(COLUMNS_WIDTH*1.5), (int)(COLUMNS_WIDTH*1.5)));
subPanel.add(settingsPanel, BorderLayout.WEST);
JPanel descAndValuePanel = new JPanel(new GridLayout(2, 1));
/* description */
JPanel descPanel = new JPanel(new BorderLayout(0, 0));
descPanel.add(new JLabel(I18n.getMessage("thaw.plugin.nodeConfig.description")), BorderLayout.NORTH);
descriptionArea = new JTextArea();
descriptionArea.setEditable(false);
descriptionArea.setBackground(new java.awt.Color(GRAY, GRAY, GRAY));
descriptionArea.setLineWrap(true);
descriptionArea.setWrapStyleWord(true);
descPanel.add(new JScrollPane(descriptionArea), BorderLayout.CENTER);
descAndValuePanel.add(descPanel);
JPanel valueAndButtonsPanel = new JPanel(new BorderLayout(0, 0));
/* value */
valuePanel = new JPanel(new GridLayout(4, 0));
valuePanel.add(new JLabel(I18n.getMessage("thaw.plugin.nodeConfig.default")));
defaultField = new JTextField();
defaultField.setEditable(false);
defaultField.setBackground(new java.awt.Color(GRAY, GRAY, GRAY));
valuePanel.add(defaultField);
valuePanel.add(new JLabel(I18n.getMessage("thaw.plugin.nodeConfig.value")));
valueField = new JTextField();
valuePanel.add(valueField);
selecter = false;
valueSelecter = new JComboBox(new String[] {
trueStr,
falseStr
});
valueAndButtonsPanel.add(valuePanel, BorderLayout.NORTH);
/* button(s) */
applyButton = new JButton(I18n.getMessage("thaw.common.apply"));
applyButton.addActionListener(this);
valueAndButtonsPanel.add(new JLabel(""), BorderLayout.CENTER);
valueAndButtonsPanel.add(applyButton, BorderLayout.SOUTH);
descAndValuePanel.add(valueAndButtonsPanel);
subPanel.add(descAndValuePanel, BorderLayout.CENTER);
panel.add(subPanel, BorderLayout.CENTER);
}
public JPanel getPanel() {
return panel;
}
public void refresh() {
FCPGetConfig getConfig = new FCPGetConfig(true /* current */, false /* with short desc */,
true /* with long desc */, true /* with defaults */,
true /* with sort order */, true /* with expert flag */,
false /* with force write flag */);
getConfig.addObserver(this);
getConfig.start(queueManager);
}
private void refreshDisplay() {
categoryChoice.removeListSelectionListener(this);
categoryChoice.setListData(categoryNames);
categoryChoice.addListSelectionListener(this);
settingChoice.removeListSelectionListener(this);
settingChoice.setListData(new Vector());
settingChoice.addListSelectionListener(this);
displayField();
descriptionArea.setText("");
valueField.setText("");
defaultField.setText("");
}
private void displaySelecter() {
if (!selecter) {
valuePanel.remove(valueField);
valuePanel.add(valueSelecter);
selecter = true;
panel.revalidate();
}
}
private void displayField() {
if (selecter) {
valuePanel.remove(valueSelecter);
valuePanel.add(valueField);
selecter = false;
panel.revalidate();
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == applyButton) {
FCPGetConfig.ConfigSetting setting = (FCPGetConfig.ConfigSetting)settingChoice.getSelectedValue();
String name = setting.getName();
String value;
if (!selecter)
value = valueField.getText();
else {
String selected = (String)valueSelecter.getSelectedItem();
if (trueStr == selected)
value = "true";
else
value = "false";
}
FCPModifyConfig modifConf = new FCPModifyConfig(name, value);
modifConf.start(queueManager);
refresh();
} else if (e.getSource() == reload) {
refresh();
}
}
public void valueChanged(ListSelectionEvent e) {
if (e.getSource() == categoryChoice) {
synchronized(categories) {
String catName = (String)categoryChoice.getSelectedValue();
settingChoice.removeListSelectionListener(this);
settingChoice.setListData((Vector)categories.get(catName));
settingChoice.addListSelectionListener(this);
displayField();
descriptionArea.setText("");
valueField.setText("");
defaultField.setText("");
}
} else if (e.getSource() == settingChoice) {
FCPGetConfig.ConfigSetting setting = (FCPGetConfig.ConfigSetting)settingChoice.getSelectedValue();
descriptionArea.setText(setting.getLongDesc());
if ("false".equals(setting.getDefault())
|| "true".equals(setting.getDefault())) {
displaySelecter();
if ("true".equals(setting.getCurrent()))
valueSelecter.setSelectedItem(trueStr);
else
valueSelecter.setSelectedItem(falseStr);
} else {
displayField();
valueField.setText(setting.getCurrent());
}
defaultField.setText(setting.getDefault());
}
}
public void update(Observable o, Object param) {
if (param == null || !(param instanceof Hashtable))
return;
Hashtable configSettings = (Hashtable)param;
/* will restructure the data */
categories = new Hashtable();
categoryNames = new Vector();
synchronized(categories) {
/* first : sort them by category */
for (Enumeration keyEnum = configSettings.keys();
keyEnum.hasMoreElements();) {
String name = (String)keyEnum.nextElement();
FCPGetConfig.ConfigSetting setting = (FCPGetConfig.ConfigSetting)configSettings.get(name);
if (setting.getExpertFlag() && !advanced)
continue;
int dotPos = name.indexOf('.');
String categoryName = name.substring(0, dotPos);
Vector categorySettings = (Vector)categories.get(categoryName);
if (categorySettings == null) {
categoryNames.add(categoryName);
categorySettings = new Vector();
categories.put(categoryName, categorySettings);
}
categorySettings.add(setting);
}
/* second : sort them by sortOrder */
for (Enumeration keyEnum = categories.keys();
keyEnum.hasMoreElements();) {
String catName = (String)keyEnum.nextElement();
Vector categorySettings = (Vector)categories.get(catName);
java.util.Collections.sort(categorySettings);
}
refreshDisplay();
}
}
}