001: /*
002: This library is free software; you can redistribute it and/or
003: modify it under the terms of the GNU General Public
004: License as published by the Free Software Foundation; either
005: version 2 of the license, or (at your option) any later version.
006: */
007:
008: package org.gjt.jclasslib.browser.config.classpath;
009:
010: import org.gjt.jclasslib.browser.BrowserMDIFrame;
011: import org.gjt.jclasslib.browser.config.BrowserConfig;
012: import org.gjt.jclasslib.mdi.BasicFileFilter;
013: import org.gjt.jclasslib.util.GUIHelper;
014:
015: import javax.swing.*;
016: import javax.swing.event.ListSelectionEvent;
017: import javax.swing.event.ListSelectionListener;
018: import java.awt.*;
019: import java.awt.event.*;
020: import java.io.File;
021: import java.util.*;
022: import java.util.List;
023:
024: /**
025: Dialog for viewing and modifying the classpath.
026:
027: @author <a href="mailto:jclasslib@ej-technologies.com">Ingo Kegel</a>
028: @version $Revision: 1.1 $ $Date: 2003/08/18 08:10:15 $
029: */
030: public class ClasspathSetupDialog extends JDialog implements
031: ActionListener, ListSelectionListener {
032:
033: private static final int DIALOG_WIDTH = 500;
034: private static final int DIALOG_HEIGHT = 300;
035:
036: private static final Dimension IMAGE_BUTTON_SIZE = new Dimension(
037: 28, 28);
038: private static final Icon ICON_ADD = BrowserMDIFrame
039: .loadIcon("add.png");
040: private static final Icon ICON_REMOVE = BrowserMDIFrame
041: .loadIcon("remove.png");
042: private static final Icon ICON_UP = BrowserMDIFrame
043: .loadIcon("up.png");
044: private static final Icon ICON_DOWN = BrowserMDIFrame
045: .loadIcon("down.png");
046:
047: private BrowserMDIFrame frame;
048:
049: private DefaultListModel listModel;
050:
051: private JList lstElements;
052: private JScrollPane scpLstElements;
053: private JButton btnAdd;
054: private JButton btnRemove;
055: private JButton btnUp;
056: private JButton btnDown;
057:
058: private JButton btnOk;
059: private JButton btnCancel;
060: private JFileChooser fileChooser;
061:
062: /**
063: * Constructor.
064: * @param frame the parent frame.
065: */
066: public ClasspathSetupDialog(BrowserMDIFrame frame) {
067: super (frame);
068: this .frame = frame;
069: setupControls();
070: setupAccelerators();
071: setupComponent();
072: setupEventHandlers();
073: checkEnabledStatus();
074: }
075:
076: public void valueChanged(ListSelectionEvent event) {
077: checkEnabledStatus();
078: }
079:
080: public void actionPerformed(ActionEvent event) {
081: Object source = event.getSource();
082: if (source == btnAdd) {
083: doAdd();
084: } else if (source == btnRemove) {
085: doRemove();
086: } else if (source == btnUp) {
087: doUp();
088: } else if (source == btnDown) {
089: doDown();
090: } else if (source == btnCancel) {
091: doCancel();
092: } else if (source == btnOk) {
093: doOk();
094: }
095: checkEnabledStatus();
096: }
097:
098: public void setVisible(boolean visible) {
099: if (visible) {
100: updateList();
101: }
102: super .setVisible(visible);
103: }
104:
105: private void updateList() {
106:
107: listModel.clear();
108: Iterator it = frame.getConfig().getClasspath().iterator();
109: while (it.hasNext()) {
110: listModel.addElement(it.next());
111: }
112: }
113:
114: private void setupControls() {
115:
116: listModel = new DefaultListModel();
117:
118: lstElements = new JList(listModel);
119: lstElements
120: .setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
121: lstElements.setCellRenderer(new ClasspathCellRenderer());
122: scpLstElements = new JScrollPane(lstElements);
123: scpLstElements.setBorder(BorderFactory.createEtchedBorder());
124:
125: btnAdd = new JButton(ICON_ADD);
126: btnAdd.setToolTipText("Add a classpath entry (INS)");
127: makeImageButton(btnAdd);
128: btnRemove = new JButton(ICON_REMOVE);
129: btnRemove.setToolTipText("Remove a classpath entry (DEL)");
130: makeImageButton(btnRemove);
131: btnUp = new JButton(ICON_UP);
132: btnUp.setToolTipText("Move a classpath entry up (ALT-UP)");
133: makeImageButton(btnUp);
134: btnDown = new JButton(ICON_DOWN);
135: btnDown
136: .setToolTipText("Move a classpath entry down (ALT-DOWN)");
137: makeImageButton(btnDown);
138:
139: btnOk = new JButton("Ok");
140: btnCancel = new JButton("Cancel");
141: btnOk.setPreferredSize(btnCancel.getPreferredSize());
142:
143: }
144:
145: private void setupComponent() {
146:
147: Container contentPane = getContentPane();
148: contentPane.setLayout(new GridBagLayout());
149: GridBagConstraints gc = new GridBagConstraints();
150: gc.gridx = 0;
151: gc.gridy = 0;
152: gc.insets = new Insets(5, 5, 0, 5);
153: gc.weightx = 1;
154: gc.anchor = GridBagConstraints.NORTHWEST;
155: contentPane.add(new JLabel("Classpath:"), gc);
156: gc.gridy++;
157:
158: gc.weighty = 1;
159: gc.insets.top = 0;
160: gc.fill = GridBagConstraints.BOTH;
161: contentPane.add(createListPanel(), gc);
162: gc.gridy++;
163: gc.fill = GridBagConstraints.HORIZONTAL;
164: gc.weighty = 0;
165: gc.insets.top = 3;
166: gc.insets.bottom = 5;
167: contentPane.add(createButtonBox(), gc);
168: getRootPane().setDefaultButton(btnOk);
169:
170: setSize(DIALOG_WIDTH, DIALOG_HEIGHT);
171: setModal(true);
172: setTitle("Setup classpath");
173: GUIHelper.centerOnParentWindow(this , getOwner());
174: setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
175:
176: }
177:
178: private void setupEventHandlers() {
179:
180: btnCancel.addActionListener(this );
181: btnOk.addActionListener(this );
182:
183: btnAdd.addActionListener(this );
184: btnRemove.addActionListener(this );
185: btnUp.addActionListener(this );
186: btnDown.addActionListener(this );
187:
188: lstElements.addListSelectionListener(this );
189:
190: addWindowListener(new WindowAdapter() {
191: public void windowClosing(WindowEvent event) {
192: doCancel();
193: }
194: });
195: }
196:
197: private void setupAccelerators() {
198:
199: addAccelerator((JComponent) getContentPane(),
200: KeyEvent.VK_ESCAPE, 0, new AbstractAction() {
201: public void actionPerformed(ActionEvent event) {
202: doCancel();
203: }
204: });
205:
206: addAccelerator(lstElements, KeyEvent.VK_INSERT, 0,
207: new AbstractAction() {
208: public void actionPerformed(ActionEvent event) {
209: doAdd();
210: }
211: });
212: addAccelerator(lstElements, KeyEvent.VK_DELETE, 0,
213: new AbstractAction() {
214: public void actionPerformed(ActionEvent event) {
215: doRemove();
216: }
217: });
218: addAccelerator(lstElements, KeyEvent.VK_UP, KeyEvent.ALT_MASK,
219: new AbstractAction() {
220: public void actionPerformed(ActionEvent event) {
221: doUp();
222: }
223: });
224: addAccelerator(lstElements, KeyEvent.VK_DOWN,
225: KeyEvent.ALT_MASK, new AbstractAction() {
226: public void actionPerformed(ActionEvent event) {
227: doDown();
228: }
229: });
230:
231: }
232:
233: private void addAccelerator(JComponent component, int keyCode,
234: int keyMask, AbstractAction action) {
235:
236: KeyStroke keyStroke = KeyStroke.getKeyStroke(keyCode, keyMask);
237: Object key = new Object();
238: component.getInputMap(
239: JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
240: keyStroke, key);
241: component.getActionMap().put(key, action);
242: }
243:
244: private JPanel createListPanel() {
245:
246: JPanel panel = new JPanel();
247: panel.setLayout(new BorderLayout());
248:
249: panel.add(scpLstElements, BorderLayout.CENTER);
250: panel.add(createModificationButtonBox(), BorderLayout.EAST);
251:
252: return panel;
253: }
254:
255: private Box createModificationButtonBox() {
256:
257: Box box = Box.createVerticalBox();
258: box.add(btnAdd);
259: box.add(btnRemove);
260: box.add(Box.createVerticalGlue());
261: box.add(btnUp);
262: box.add(btnDown);
263: return box;
264: }
265:
266: private Box createButtonBox() {
267:
268: Box box = Box.createHorizontalBox();
269: box.add(Box.createHorizontalGlue());
270: box.add(btnOk);
271: box.add(btnCancel);
272:
273: return box;
274: }
275:
276: private void makeImageButton(AbstractButton button) {
277: button.setMinimumSize(IMAGE_BUTTON_SIZE);
278: button.setPreferredSize(IMAGE_BUTTON_SIZE);
279: button.setMaximumSize(IMAGE_BUTTON_SIZE);
280: }
281:
282: private void doCancel() {
283: setVisible(false);
284: }
285:
286: private void doOk() {
287:
288: List newEntries = new ArrayList();
289: for (int i = 0; i < listModel.getSize(); i++) {
290: newEntries.add(listModel.getElementAt(i));
291: }
292: BrowserConfig config = frame.getConfig();
293: List oldEntries = new ArrayList(config.getClasspath());
294:
295: Iterator itOld = oldEntries.iterator();
296: while (itOld.hasNext()) {
297: ClasspathEntry entry = (ClasspathEntry) itOld.next();
298: if (!newEntries.contains(entry)) {
299: config.removeClasspathEntry(entry);
300: }
301: }
302: Iterator itNew = newEntries.iterator();
303: while (itNew.hasNext()) {
304: ClasspathEntry entry = (ClasspathEntry) itNew.next();
305: if (!oldEntries.contains(entry)) {
306: config.addClasspathEntry(entry);
307: }
308: }
309:
310: config.setClasspath(newEntries);
311: setVisible(false);
312: }
313:
314: private void doAdd() {
315:
316: if (fileChooser == null) {
317: fileChooser = new JFileChooser(frame
318: .getClassesChooserPath());
319: fileChooser.setDialogTitle("Choose directory or jar file");
320: fileChooser.setFileFilter(new BasicFileFilter("jar",
321: "jar files and directories"));
322: fileChooser
323: .setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
324: fileChooser.setMultiSelectionEnabled(true);
325: }
326:
327: if (fileChooser.showOpenDialog(this ) == JFileChooser.APPROVE_OPTION) {
328: frame.setClassesChooserPath(fileChooser
329: .getCurrentDirectory().getAbsolutePath());
330: File[] files = fileChooser.getSelectedFiles();
331: for (int i = 0; i < files.length; i++) {
332: File file = files[i];
333: ClasspathEntry entry;
334: if (file.isDirectory()) {
335: entry = new ClasspathDirectoryEntry();
336: entry.setFileName(file.getPath());
337: } else {
338: entry = new ClasspathArchiveEntry();
339: entry.setFileName(file.getPath());
340:
341: }
342: if (!isInModel(entry)) {
343: listModel.addElement(entry);
344: selectIndex(listModel.getSize() - 1);
345: }
346: }
347: }
348: }
349:
350: private boolean isInModel(ClasspathEntry entry) {
351:
352: for (int i = 0; i < listModel.getSize(); i++) {
353: if (listModel.getElementAt(i).equals(entry)) {
354: return true;
355: }
356: }
357: return false;
358: }
359:
360: private void doRemove() {
361: int selectedIndex = lstElements.getSelectedIndex();
362: if (selectedIndex > -1) {
363: listModel.remove(selectedIndex);
364: selectIndex(selectedIndex);
365: }
366: }
367:
368: private void doUp() {
369: int selectedIndex = lstElements.getSelectedIndex();
370: if (selectedIndex > 0) {
371: Object entry = listModel.remove(selectedIndex);
372: int newSelectedIndex = selectedIndex - 1;
373: listModel.insertElementAt(entry, newSelectedIndex);
374: selectIndex(newSelectedIndex);
375: }
376: }
377:
378: private void doDown() {
379: int selectedIndex = lstElements.getSelectedIndex();
380: if (selectedIndex < listModel.getSize() - 1) {
381: Object entry = listModel.remove(selectedIndex);
382: int newSelectedIndex = selectedIndex + 1;
383: listModel.insertElementAt(entry, newSelectedIndex);
384: selectIndex(newSelectedIndex);
385: }
386: }
387:
388: private void selectIndex(int newSelectedIndex) {
389: newSelectedIndex = Math.min(newSelectedIndex, listModel
390: .getSize() - 1);
391: if (newSelectedIndex > -1) {
392: lstElements.setSelectedIndex(newSelectedIndex);
393: lstElements.ensureIndexIsVisible(newSelectedIndex);
394: }
395: }
396:
397: private void checkEnabledStatus() {
398:
399: int selectedIndex = lstElements.getSelectedIndex();
400: boolean removeEnabled = selectedIndex > -1;
401: boolean upEnabled = selectedIndex > 0;
402: boolean downEnabled = selectedIndex > -1
403: && selectedIndex < listModel.getSize() - 1;
404: btnRemove.setEnabled(removeEnabled);
405: btnUp.setEnabled(upEnabled);
406: btnDown.setEnabled(downEnabled);
407: }
408:
409: }
|