/*
* Copyright (C) 2004 The Concord Consortium, Inc.,
* 10 Concord Crossing, Concord, MA 01742
*
* Web Site: http://www.concord.org
* Email: info@concord.org
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* END LICENSE */
package org.concord.swing;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ListModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.concord.swing.event.VariableListener;
public class VariableDialog
extends JDialog
implements ActionListener, ListSelectionListener
{
protected JList variableList = new JList();
protected JTextArea variableComment = new JTextArea();
protected JButton doneButton = new JButton("Done");
protected JButton addButton = new JButton("Add");
protected JButton modifyButton = new JButton("Modify");
protected JButton removeButton = new JButton("Remove");
protected JPanel controlPanel = new JPanel();
protected JPanel listPanel = new JPanel();
protected JScrollPane commentScroll = new JScrollPane(variableComment);
protected JScrollPane listScroll = new JScrollPane(variableList);
protected ModifyValueDialog modifyDialog;
protected Properties prefixTable = new Properties();
protected JPanel contentPane;
protected String selectedItem;
protected Map variables;
protected boolean javaVariable = true;
protected VariableErrorDialog errorDialog;
protected final String COMMENT = ".comment";
public VariableDialog(JFrame frame, String title, Map variables)
{
super(frame, title, false);
modifyDialog = createModifyValueDialog(frame);
errorDialog = new VariableErrorDialog(frame);
setVariables(variables);
initialize();
}
public VariableDialog(JFrame frame, String title)
{
this(frame, title, null);
}
public ModifyValueDialog createModifyValueDialog(JFrame frame)
{
return new ModifyValueDialog(frame, "Edit value");
}
public static boolean isVariable(Object object)
{
if (object instanceof String)
{
String value = (String) object;
int n = value.length();
if (n == 0)
return false;
if (! Character.isJavaIdentifierStart(value.charAt(0)))
return false;
for (int i = 1; i < n; i++)
{
if (! Character.isJavaIdentifierPart(value.charAt(i)))
return false;
}
return true;
}
return false;
}
public void initialize()
{
controlPanel.setLayout(new GridLayout(0, 1));
controlPanel.add(doneButton);
controlPanel.add(addButton);
controlPanel.add(modifyButton);
controlPanel.add(removeButton);
listPanel.setLayout(new GridLayout(1, 0));
listPanel.add(listScroll);
listPanel.add(commentScroll);
contentPane = (JPanel) getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(listPanel, "Center");
contentPane.add(controlPanel, "East");
doneButton.addActionListener(this);
addButton.addActionListener(this);
modifyButton.addActionListener(this);
removeButton.addActionListener(this);
removeButton.setEnabled(false);
variableComment.setLineWrap(true);
variableComment.setWrapStyleWord(true);
variableList.addListSelectionListener(this);
setLocation(200, 200);
pack();
setResizable(false);
}
public boolean isJavaVariable()
{
return javaVariable;
}
public void setJavaVariable(boolean value)
{
javaVariable = value;
}
public void setVariables(Map variables)
{
this.variables = variables;
}
protected Vector getVariableList(Map varTable)
{
Vector variableList = new Vector();
Set keySet = varTable.keySet();
Iterator keys = keySet.iterator();
while (keys.hasNext())
{
Object key = keys.next();
if ((! javaVariable) || isVariable(key))
variableList.add(key);
}
return variableList;
}
public void show()
{
if (variables instanceof Map)
{
Vector list = getVariableList(variables);
variableList.setListData(list);
selectedItem = (String) variableList.getSelectedValue();
if ((selectedItem instanceof String) && variables.containsKey(selectedItem))
{
variableList.setSelectedValue(selectedItem, true);
modifyButton.setEnabled(true);
}
else
{
modifyButton.setEnabled(false);
}
super.show();
}
}
public boolean showSelectedVariable(String varName)
{
if (variables instanceof Map)
{
variableList.setListData(getVariableList(variables));
ListModel listModel = variableList.getModel();
for (int i = 0; i < listModel.getSize(); i++)
{
Object listElement = listModel.getElementAt(i);
if (varName.equals((String) listElement))
{
variableList.setSelectedValue(listElement, true);
modifyButton.setEnabled(true);
super.show();
return true;
}
}
}
return false;
}
public void addVariableListener(VariableListener listener)
{
modifyDialog.addVariableListener(listener);
}
public void removeVariableListener(VariableListener listener)
{
modifyDialog.removeVariableListener(listener);
}
public void addVariableValue(String variable, Object value)
{
if (variables instanceof Map)
{
boolean varExists = false;
while (true)
{
modifyDialog.setModify(false);
modifyDialog.setVariable(variable);
modifyDialog.setValue(value);
modifyDialog.show();
variable = modifyDialog.getVariable();
value = modifyDialog.getValue();
varExists = variables.containsKey(variable);
if ((variable instanceof String) && varExists)
{
errorDialog.setBounds(getBounds());
errorDialog.setErrorText("Variable (" + variable + ") already exists.\nChange the variable name or Cancel.");
continue;
}
break;
}
if ((variable instanceof String) && (variable.length() > 0))
{
variables.put(variable, modifyDialog.getValue());
modifyButton.setEnabled(true);
removeButton.setEnabled(true);
}
if (variable.length() == 0)
variable = null;
selectedItem = variable;
}
}
public void actionPerformed(ActionEvent event)
{
if (variables instanceof Map)
{
Object source = event.getSource();
JButton button = (source instanceof JButton) ? (JButton) source : null;
if (button == doneButton)
{
setVisible(false);
}
else if (button == addButton)
{
addVariableValue(modifyDialog.getVariable(), null);
}
else if (button == modifyButton)
{
boolean varExists = variables.containsKey(selectedItem);
if ((selectedItem instanceof String) && varExists)
{
String variable = selectedItem;
Object value = variables.get(variable);
modifyDialog.setVariable(variable);
modifyDialog.setValue(value);
modifyDialog.setModify(true);
modifyDialog.show();
variable = modifyDialog.getVariable();
if ((variable instanceof String) && (variable.length() > 0))
{
variables.put(variable, modifyDialog.getValue());
}
selectedItem = variable;
}
}
else if (button == removeButton)
{
if (selectedItem instanceof String)
{
variables.remove(selectedItem);
selectedItem = null;
}
}
setSelected(selectedItem);
}
}
public void setSelected(String item)
{
if (variables instanceof Map)
{
variableList.removeListSelectionListener(this);
variableList.setListData(getVariableList(variables));
if ((selectedItem instanceof String) && variables.containsKey(item))
{
variableList.setSelectedValue(item, true);
}
variableList.addListSelectionListener(this);
}
}
protected void updateVariableComment(String oldItem, String newItem)
{
String oldItemComment = oldItem + COMMENT;
String newItemComment = newItem + COMMENT;
String comment = variableComment.getText();
comment = (comment == null) ? "" : comment.trim();
if (comment.length() > 0)
variables.put(oldItemComment, comment);
else
variables.remove(oldItemComment);
comment = (String) variables.get(newItemComment);
variableComment.setText(comment == null ? "" : comment);
}
public void setSelectedItem(String item)
{
if (variables instanceof Map)
{
removeButton.setEnabled(item instanceof String);
if (selectedItem instanceof String)
{
// System.out.println("selectedItem = " + selectedItem + " item = " + item);
if (selectedItem == item)
{
String comment = (String) variables.get(item + COMMENT);
variableComment.setText((comment == null) ? "" : comment);
modifyDialog.setVariable(item);
boolean varExists = (item instanceof String) && variables.containsKey(item);
if (varExists)
{
modifyDialog.setValue(variables.get(item));
modifyButton.setEnabled(true);
}
}
else
{
updateVariableComment(selectedItem, item);
}
}
else
{
modifyButton.setEnabled(false);
}
selectedItem = item;
}
}
public void valueChanged(ListSelectionEvent event)
{
Object object = event.getSource();
if (object instanceof JList)
{
JList list = (JList) object;
setSelectedItem((String) list.getSelectedValue());
}
}
public class VariableErrorDialog
extends JDialog
implements ActionListener
{
protected JTextArea errorTextArea = new JTextArea();
protected JButton continueButton = new JButton("Continue");
protected JPanel buttonPanel = new JPanel();
public VariableErrorDialog(JFrame owner)
{
super(owner, "Variable Error", true);
errorTextArea.setEditable(false);
errorTextArea.setLineWrap(true);
errorTextArea.setWrapStyleWord(true);
errorTextArea.setBackground(buttonPanel.getBackground());
getContentPane().setLayout(new BorderLayout());
buttonPanel.add(continueButton);
getContentPane().add(buttonPanel, "South");
getContentPane().add(errorTextArea, "Center");
continueButton.addActionListener(this);
setSize(300, 150);
setResizable(false);
}
public void setErrorText(String errorText)
{
errorTextArea.setText(errorText);
this.show();
}
public void actionPerformed(ActionEvent event)
{
this.hide();
}
}
}