/*
* 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.io.File;
import java.util.Enumeration;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class PathDialog
extends JDialog
implements ActionListener, ListSelectionListener
{
public final static String JAVA_HOME = "java.home";
public final static String USER_DIR = "user.dir";
public final static String OS_NAME = "os.name";
public final static String PREFIX_BREAK = "$";
protected JList pathList = new JList();
protected Vector paths = new Vector();
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 JButton upButton = new JButton("Move Up");
protected JButton downButton = new JButton("Move Down");
protected JButton javaHomeButton = new JButton();
protected JPanel controlPanel = new JPanel();
protected String javaHome;
protected JScrollPane listScroll = new JScrollPane(pathList);
protected JFileChooser selectPathChooser = new JFileChooser();
protected ModifyPathDialog modifyPathDialog;
protected Properties prefixTable = new Properties();
protected JPanel contentPane;
protected String selectedItem;
public PathDialog(JFrame frame)
{
super(frame, "Add and Remove Path Components", true);
addPrefix(USER_DIR, System.getProperty(USER_DIR, ""));
setJavaHome(System.getProperty(JAVA_HOME, ""));
modifyPathDialog = new ModifyPathDialog(frame);
controlPanel.setLayout(new GridLayout(0, 1));
controlPanel.add(doneButton);
controlPanel.add(addButton);
controlPanel.add(modifyButton);
controlPanel.add(removeButton);
controlPanel.add(upButton);
controlPanel.add(downButton);
contentPane = (JPanel) getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(listScroll, "Center");
contentPane.add(controlPanel, "East");
contentPane.add(javaHomeButton, "South");
doneButton.addActionListener(this);
addButton.addActionListener(this);
modifyButton.addActionListener(this);
removeButton.addActionListener(this);
upButton.addActionListener(this);
downButton.addActionListener(this);
javaHomeButton.addActionListener(this);
removeButton.setEnabled(false);
upButton.setEnabled(false);
downButton.setEnabled(false);
pathList.addListSelectionListener(this);
selectPathChooser.setMultiSelectionEnabled(false);
selectPathChooser.setCurrentDirectory(new File(System.getProperty("user.dir")));
setLocation(200, 200);
pack();
}
public void addPrefix(String prefix, String value)
{
prefixTable.put(prefix, value);
}
protected String substitutePrefix(String element)
{
StringTokenizer tokens = new StringTokenizer(element, PREFIX_BREAK);
if (tokens.hasMoreTokens())
{
String prefix = tokens.nextToken();
if (tokens.hasMoreTokens())
element = tokens.nextToken();
String pathPrefix = prefixTable.getProperty(prefix);
if (pathPrefix == null)
pathPrefix = System.getProperty(prefix, "");
return pathPrefix + element;
}
return element;
}
protected String removePrefix(String element, String toRemove)
{
StringTokenizer tokens = new StringTokenizer(element, PREFIX_BREAK);
if (tokens.hasMoreTokens())
{
String prefix = tokens.nextToken();
if (toRemove.equals(prefix) && tokens.hasMoreTokens())
element = tokens.nextToken().substring(1);
}
return element;
}
protected String matchPrefix(String element)
{
Enumeration enumer = prefixTable.keys();
while (enumer.hasMoreElements())
{
String key = (String) enumer.nextElement();
String value = (String) prefixTable.get(key);
if (element.startsWith(value))
{
element = element.substring(value.length());
element = key + PREFIX_BREAK + element;
break;
}
}
return element;
}
public String getPath(boolean expand)
{
return getPath(expand, null);
}
public String getPath(boolean expand, String toRemove)
{
String path = "";
int n = paths.size();
for (int i = 0; i < n; i++)
{
String pathElement = (String) paths.elementAt(i);
if (toRemove instanceof String)
pathElement = removePrefix(pathElement, toRemove);
if (expand)
pathElement = substitutePrefix(pathElement);
path += pathElement;
if (i < (n - 1))
path += File.pathSeparator;
}
System.out.println(path);
return path;
}
public String getPath()
{
return getPath(true, "user.dir");
}
public void setPath(String path)
{
if ((path instanceof String) && (path.length() > 0))
{
StringTokenizer tokens = new StringTokenizer(path, ";");
paths.removeAllElements();
while (tokens.hasMoreTokens())
{
paths.addElement(tokens.nextToken());
}
selectedItem = null;
pathList.setListData(paths);
}
}
public void addToPath(String pathElement)
{
if (pathElement instanceof String)
{
pathElement = matchPrefix(pathElement);
paths.addElement(pathElement);
pathList.setListData(paths);
}
}
public void addToPath(String prefix, String partialPath)
{
if (partialPath instanceof String)
{
paths.addElement(prefix + PREFIX_BREAK + partialPath);
pathList.setListData(paths);
}
}
public void setJavaHome(String path)
{
File javaDir = new File(path);
if (javaDir.exists() && javaDir.isDirectory())
{
javaHome = path;
javaHomeButton.setText("Set Java Home Directory: " + javaHome);
prefixTable.put(JAVA_HOME, path);
}
}
public String getJavaHome()
{
return javaHome;
}
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
JButton button = (source instanceof JButton) ? (JButton) source : null;
if (button == doneButton)
{
setVisible(false);
}
else if (button == addButton)
{
selectPathChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
selectPathChooser.showDialog(this, "Select Path");
File selectedFile = selectPathChooser.getSelectedFile();
try
{
selectedItem = selectedFile.getCanonicalPath();
selectedItem = matchPrefix(selectedItem);
paths.addElement(selectedItem);
pathList.setListData(paths);
pathList.setSelectedValue(selectedItem, true);
}
catch (Exception e)
{
}
}
else if (button == modifyButton)
{
int index = paths.indexOf(selectedItem);
modifyPathDialog.setPathElement(selectedItem);
modifyPathDialog.show();
selectedItem = modifyPathDialog.getPathElement();
paths.setElementAt(selectedItem, index);
pathList.setSelectedValue(selectedItem, true);
}
else if (button == removeButton)
{
if (selectedItem instanceof String)
{
paths.removeElement(selectedItem);
selectedItem = null;
pathList.setListData(paths);
}
}
else if (button == upButton)
{
if (selectedItem instanceof String)
{
int index = paths.indexOf(selectedItem);
if (index > 0)
{
paths.removeElementAt(index);
paths.insertElementAt(selectedItem, index - 1);
pathList.setSelectedValue(selectedItem, true);
}
}
}
else if (button == downButton)
{
if (selectedItem instanceof String)
{
int index = paths.indexOf(selectedItem);
int n = paths.size();
if ((index > -1) && (index < (n - 1)))
{
paths.removeElementAt(index);
paths.insertElementAt(selectedItem, index + 1);
pathList.setSelectedValue(selectedItem, true);
}
}
}
else if (button == javaHomeButton)
{
selectPathChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
selectPathChooser.showDialog(this, "Select Java Home");
File selectedFile = selectPathChooser.getSelectedFile();
try
{
String javaDir = selectedFile.getCanonicalPath();
if (javaDir.indexOf(PREFIX_BREAK) > -1)
{
int length = selectPathChooser.getCurrentDirectory().toString().length();
javaDir = selectedItem.substring(length + 1);
}
setJavaHome(javaDir);
}
catch (Exception e)
{
setJavaHome(System.getProperty("java.home"));
}
}
}
public void valueChanged(ListSelectionEvent event)
{
Object object = event.getSource();
if (object instanceof JList)
{
JList list = (JList) object;
selectedItem = (String) list.getSelectedValue();
boolean haveSelection = (selectedItem instanceof String);
removeButton.setEnabled(haveSelection);
upButton.setEnabled(haveSelection);
downButton.setEnabled(haveSelection);
}
}
}
class ModifyPathDialog
extends JDialog
implements ActionListener
{
protected JTextField field = new JTextField();
protected JLabel label = new JLabel("Modify Path Element: ");
protected JButton doneButton = new JButton("Done");
protected JButton cancelButton = new JButton("Cancel");
protected JPanel buttonPanel = new JPanel();
protected String pathElement;
public ModifyPathDialog(JFrame parent)
{
super(parent, "Modify Path Element String", true);
buttonPanel.add(doneButton);
buttonPanel.add(cancelButton);
getContentPane().add(label, "North");
getContentPane().add(field, "Center");
getContentPane().add(buttonPanel, "South");
doneButton.addActionListener(this);
cancelButton.addActionListener(this);
setLocation(200, 200);
pack();
}
public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
JButton button = (source instanceof JButton) ? (JButton) source : null;
if (button == doneButton)
{
pathElement = field.getText();
}
setVisible(false);
}
public void setPathElement(String element)
{
pathElement = element;
field.setText(element);
}
public String getPathElement()
{
return pathElement;
}
}