Mirror of the JODE repository
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
jode/jode/src/net/sf/jode/swingui/ClassPathDialog.java

269 lines
8.2 KiB

/* ClassPathDialog Copyright (C) 2000-2002 Jochen Hoenicke.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
package net.sf.jode.swingui;
import net.sf.jode.bytecode.ClassPath;
///#def JAVAX_SWING javax.swing
import javax.swing.*;
import javax.swing.filechooser.*;
import javax.swing.event.*;
///#enddef
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.awt.AWTEventMulticaster;
import java.io.File;
public class ClassPathDialog {
JDialog dialog;
JTextField editField;
boolean editFieldChanged = false;
JList pathList;
DefaultListModel pathListModel;
ClassPath currentClassPath;
ActionListener actionListener = null;
public ClassPathDialog(JFrame frame, String[] classPath) {
dialog = new JDialog(frame, Main.bundle.getString("cpdialog.title"),
false);
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
panel.add(BorderLayout.NORTH, createEditPane());
panel.add(BorderLayout.CENTER, createListPane());
panel.add(BorderLayout.SOUTH, createOkayCancelPane());
dialog.getContentPane().add(BorderLayout.CENTER, panel);
dialog.pack();
dialog.addWindowListener(new WindowAdapter() {
public void windowClosing() {
dialog.setVisible(false);
}
});
for (int i = 0; i < classPath.length; i++)
pathListModel.addElement(classPath[i]);
createNewClassPath();
}
public void showDialog() {
dialog.setVisible(true);
}
public ClassPath getClassPath() {
return currentClassPath;
}
public void addActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.add(actionListener, l);
}
public void removeActionListener(ActionListener l) {
actionListener = AWTEventMulticaster.remove(actionListener, l);
}
ClassPath reflectClassPath = new ClassPath("reflection:");
private void createNewClassPath() {
String[] paths = new String[pathListModel.getSize()];
pathListModel.copyInto(paths);
currentClassPath = new ClassPath(paths, reflectClassPath);
if (actionListener != null)
actionListener.actionPerformed
(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, null));
}
void add() {
String entry = editField.getText();
int index = pathListModel.getSize();
if (pathList.isSelectionEmpty())
pathListModel.addElement(entry);
else {
index = pathList.getLeadSelectionIndex() + 1;
pathListModel.add(index - 1,
editField.getText());
}
pathList.setSelectedIndex(index);
editFieldChanged = false;
}
static class JarFileFilter extends FileFilter {
public boolean accept(File f) {
if (f.isDirectory())
return true;
String name = f.getName();
int dot = name.lastIndexOf('.');
if (dot >= 0) {
String ext = name.substring(dot+1);
if (ext.equals("jar") || ext.equals("zip"))
return true;
}
return false;
}
public String getDescription() {
return Main.bundle.getString("browse.filter.description");
}
}
class BrowseListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String fileName = editField.getText();
if (fileName.length() == 0)
fileName = null;
JFileChooser fileChooser = new JFileChooser(fileName);
fileChooser.setFileSelectionMode
(JFileChooser.FILES_AND_DIRECTORIES);
fileChooser.setDialogType(JFileChooser.CUSTOM_DIALOG);
fileChooser.setDialogTitle(Main.bundle.getString("browse.title"));
fileChooser.setFileFilter(new JarFileFilter());
fileChooser.setApproveButtonText
(Main.bundle.getString("button.select"));
fileChooser.setApproveButtonMnemonic('s');
if (fileChooser.showDialog(dialog, null)
== JFileChooser.APPROVE_OPTION) {
editField.setText(fileChooser.getSelectedFile().getPath());
add();
}
}
}
private JPanel createEditPane() {
editField = new JTextField();
JButton browseButton = new JButton
(Main.bundle.getString("button.browse"));
browseButton.setMnemonic('b');
browseButton.addActionListener(new BrowseListener());
JButton addButton = new JButton
(Main.bundle.getString("button.add"));
addButton.setMnemonic('d');
JButton removeButton = new JButton
(Main.bundle.getString("button.remove"));
removeButton.setMnemonic('r');
ActionListener addListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
add();
}
};
addButton.addActionListener(addListener);
editField.addActionListener(addListener);
editField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
editFieldChanged = true;
}
public void insertUpdate(DocumentEvent e) {
editFieldChanged = true;
}
public void removeUpdate(DocumentEvent e) {
editFieldChanged = (editField.getText().length() > 0);
}
});
removeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (!pathList.isSelectionEmpty()) {
int index = pathList.getLeadSelectionIndex();
pathListModel.remove(index);
if (index < pathListModel.getSize())
pathList.setSelectedIndex(index);
}
}
});
JPanel editPane = new JPanel();
editPane.setLayout(new BorderLayout());
editPane.add(BorderLayout.EAST, browseButton);
editPane.add(BorderLayout.SOUTH,
createButtonPane(new JButton[] { addButton,
removeButton }));
editPane.add(BorderLayout.CENTER, editField);
return editPane;
}
private JComponent createListPane() {
pathListModel = new DefaultListModel();
pathList = new JList(pathListModel);
pathList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane listScroller = new JScrollPane(pathList);
listScroller.setMinimumSize(new Dimension(250, 80));
listScroller.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);
pathList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!pathList.isSelectionEmpty()
&& !editFieldChanged) {
editField.setText((String)
pathList.getSelectedValue());
editFieldChanged = false;
}
}
});
return listScroller;
}
private JPanel createOkayCancelPane() {
JButton okayButton = new JButton
(Main.bundle.getString("button.okay"));
okayButton.setMnemonic('o');
okayButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
createNewClassPath();
dialog.setVisible(false);
}
});
JButton applyButton = new JButton
(Main.bundle.getString("button.apply"));
applyButton.setMnemonic('a');
applyButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
createNewClassPath();
}
});
JButton cancelButton = new JButton
(Main.bundle.getString("button.cancel"));
cancelButton.setMnemonic('c');
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
}
});
return createButtonPane
(new JButton[] { okayButton, applyButton, cancelButton });
}
private JPanel createButtonPane(JButton[] buttons) {
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.X_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
buttonPane.add(Box.createHorizontalGlue());
buttonPane.add(buttons[0]);
for (int i=1; i < buttons.length; i++) {
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPane.add(buttons[i]);
}
buttonPane.add(Box.createHorizontalGlue());
return buttonPane;
}
}