/*
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package com.sun.tools.visualvm.modules.jconsole.options;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Enumeration;
import java.util.StringTokenizer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.openide.windows.WindowManager;
/**
*
* @author Jean-Francois Denise
*/
public class PathController implements ActionListener, ListSelectionListener, ListDataListener {
private JList l;
private JButton add;
private JButton remove;
private JButton up;
private JButton down;
private JFileChooser chooser;
private DefaultListModel model;
private JLabel label;
private ListDataListener lstnr;
public PathController(JList l, JLabel label, JButton add, JFileChooser chooser, JButton remove, JButton up, JButton down, ListDataListener lstnr) {
this(l, label, createModel(""), add, chooser, remove, up, down, lstnr); // NOI18N
}
public PathController(JList l, JLabel label, String items, JButton add, JFileChooser chooser, JButton remove, JButton up, JButton down, ListDataListener lstnr) {
this(l, label, createModel(items), add, chooser, remove, up, down, lstnr);
}
/** Creates a new instance of PathController */
public PathController(JList l, JLabel label, DefaultListModel model, JButton add, JFileChooser chooser, JButton remove, JButton up, JButton down, ListDataListener lstnr) {
this.l = l;
this.label = label;
this.model = model;
this.add = add;
this.remove = remove;
this.up = up;
this.down = down;
this.chooser = chooser;
this.lstnr = lstnr;
l.setModel(model);
if (model != null) {
model.addListDataListener(this);
}
add.setActionCommand("add");// NOI18N
remove.setActionCommand("remove");// NOI18N
up.setActionCommand("up");// NOI18N
down.setActionCommand("down");// NOI18N
add.addActionListener(this);
remove.addActionListener(this);
up.addActionListener(this);
down.addActionListener(this);
l.addListSelectionListener(this);
remove.setEnabled(false);
up.setEnabled(false);
down.setEnabled(false);
}
public void setEnabled(boolean b) {
l.setEnabled(b);
label.setEnabled(b);
add.setEnabled(b);
remove.setEnabled(remove.isEnabled() && b);
up.setEnabled(up.isEnabled() && b);
down.setEnabled(down.isEnabled() && b);
}
public void setVisible(boolean b) {
l.setVisible(b);
label.setVisible(b);
add.setVisible(b);
remove.setVisible(b);
up.setVisible(b);
down.setVisible(b);
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("add")) {// NOI18N
int returnVal = chooser.showOpenDialog(WindowManager.getDefault().getMainWindow());
if (returnVal == JFileChooser.APPROVE_OPTION) {
File[] selection = chooser.getSelectedFiles();
int size = selection.length;
int end = l.getModel().getSize();
for (int i = 0; i < size; i++) {
String path = selection[i].getAbsolutePath();
if (!model.contains(path)) {
model.add(end + i, path);
}
}
}
return;
}
if (e.getActionCommand().equals("remove")) {// NOI18N
Object[] values = l.getSelectedValues();
for (int i = 0; i < values.length; i++) {
model.removeElement(values[i]);
}
if (model.getSize() == 0) {
up.setEnabled(false);
down.setEnabled(false);
remove.setEnabled(false);
}
l.setSelectedIndex(0);
}
if (e.getActionCommand().equals("up")) {// NOI18N
int selectedI = l.getSelectedIndex();
Object selected = l.getSelectedValue();
int newIndex = selectedI - 1;
Object previous = model.getElementAt(newIndex);
model.setElementAt(selected, newIndex);
model.setElementAt(previous, selectedI);
l.setSelectedIndex(newIndex);
return;
}
if (e.getActionCommand().equals("down")) {// NOI18N
int selectedI = l.getSelectedIndex();
Object selected = l.getSelectedValue();
int newIndex = selectedI + 1;
Object next = model.getElementAt(newIndex);
model.setElementAt(selected, newIndex);
model.setElementAt(next, selectedI);
l.setSelectedIndex(newIndex);
return;
}
}
// return the list of selected items
@Override
public String toString() {
Enumeration pluginsPath = model.elements();
StringBuffer buffer = new StringBuffer();
while (pluginsPath.hasMoreElements()) {
Object path = pluginsPath.nextElement();
buffer.append(path.toString());
if (pluginsPath.hasMoreElements()) {
buffer.append(File.pathSeparator);
}
}
return buffer.toString();
}
public synchronized void updateModel(String items) {
if (items == null) {
return;
}
ListModel m = l.getModel();
if (m != null) {
m.removeListDataListener(this);
}
model = createModel(items);
model.addListDataListener(this);
l.setModel(model);
}
public static DefaultListModel createModel(String items) {
StringTokenizer tk = new StringTokenizer(items, File.pathSeparator);
DefaultListModel model = new DefaultListModel();
while (tk.hasMoreTokens()) {
String path = tk.nextToken();
model.addElement(path);
}
return model;
}
public void valueChanged(ListSelectionEvent e) {
int[] indices = l.getSelectedIndices();
if (indices.length != 1) {
up.setEnabled(false);
down.setEnabled(false);
return;
}
int single = l.getSelectedIndex();
up.setEnabled(true);
down.setEnabled(true);
if (model.getSize() > 0) {
remove.setEnabled(true);
}
if (single == 0) {
up.setEnabled(false);
if (model.getSize() == 1) {
down.setEnabled(false);
}
}
if (single == model.getSize() - 1) {
down.setEnabled(false);
}
}
public void intervalAdded(ListDataEvent arg0) {
if (lstnr == null) {
return;
}
lstnr.intervalAdded(arg0);
}
public void intervalRemoved(ListDataEvent arg0) {
if (lstnr == null) {
return;
}
lstnr.intervalRemoved(arg0);
}
public void contentsChanged(ListDataEvent arg0) {
if (lstnr == null) {
return;
}
lstnr.contentsChanged(arg0);
}
}