148 lines
3.8 KiB
Java
148 lines
3.8 KiB
Java
package net.filebot.ui;
|
|
|
|
import java.awt.BorderLayout;
|
|
import java.awt.event.ActionEvent;
|
|
import java.awt.event.KeyEvent;
|
|
|
|
import javax.swing.AbstractAction;
|
|
import javax.swing.Action;
|
|
import javax.swing.JComponent;
|
|
import javax.swing.JList;
|
|
import javax.swing.JScrollPane;
|
|
import javax.swing.KeyStroke;
|
|
import javax.swing.ListSelectionModel;
|
|
import javax.swing.border.TitledBorder;
|
|
|
|
import net.filebot.ui.transfer.DefaultTransferHandler;
|
|
import net.filebot.ui.transfer.TextFileExportHandler;
|
|
import net.filebot.ui.transfer.TransferablePolicy;
|
|
import net.filebot.util.ui.DefaultFancyListCellRenderer;
|
|
import net.filebot.util.ui.SwingUI;
|
|
import ca.odell.glazedlists.BasicEventList;
|
|
import ca.odell.glazedlists.EventList;
|
|
import ca.odell.glazedlists.swing.EventListModel;
|
|
|
|
public class FileBotList<E> extends JComponent {
|
|
|
|
protected EventList<E> model = new BasicEventList<E>();
|
|
|
|
protected JList list = new JList(new EventListModel<E>(model));
|
|
|
|
protected JScrollPane listScrollPane = new JScrollPane(list);
|
|
|
|
public FileBotList() {
|
|
setLayout(new BorderLayout());
|
|
setBorder(new TitledBorder(getTitle()));
|
|
|
|
list.setCellRenderer(new DefaultFancyListCellRenderer());
|
|
list.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
|
|
|
|
list.setTransferHandler(new DefaultTransferHandler(null, null));
|
|
list.setDragEnabled(false);
|
|
|
|
add(listScrollPane, BorderLayout.CENTER);
|
|
|
|
// Shortcut DELETE, disabled by default
|
|
getRemoveAction().setEnabled(false);
|
|
|
|
SwingUI.installAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), removeHook);
|
|
SwingUI.installAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, KeyEvent.ALT_DOWN_MASK), removeHook);
|
|
}
|
|
|
|
public EventList<E> getModel() {
|
|
return model;
|
|
}
|
|
|
|
public void setModel(EventList<E> model) {
|
|
this.model = model;
|
|
list.setModel(new EventListModel<E>(model));
|
|
}
|
|
|
|
public JList getListComponent() {
|
|
return list;
|
|
}
|
|
|
|
public JScrollPane getListScrollPane() {
|
|
return listScrollPane;
|
|
}
|
|
|
|
@Override
|
|
public DefaultTransferHandler getTransferHandler() {
|
|
return (DefaultTransferHandler) list.getTransferHandler();
|
|
}
|
|
|
|
public void setTransferablePolicy(TransferablePolicy transferablePolicy) {
|
|
getTransferHandler().setTransferablePolicy(transferablePolicy);
|
|
}
|
|
|
|
public TransferablePolicy getTransferablePolicy() {
|
|
return getTransferHandler().getTransferablePolicy();
|
|
}
|
|
|
|
public void setExportHandler(TextFileExportHandler exportHandler) {
|
|
getTransferHandler().setExportHandler(exportHandler);
|
|
|
|
// enable drag if export handler is available
|
|
list.setDragEnabled(exportHandler != null);
|
|
}
|
|
|
|
public TextFileExportHandler getExportHandler() {
|
|
return (TextFileExportHandler) getTransferHandler().getExportHandler();
|
|
}
|
|
|
|
public String getTitle() {
|
|
return (String) getClientProperty("title");
|
|
}
|
|
|
|
public void setTitle(String title) {
|
|
putClientProperty("title", title);
|
|
|
|
if (getBorder() instanceof TitledBorder) {
|
|
TitledBorder border = (TitledBorder) getBorder();
|
|
border.setTitle(title);
|
|
|
|
repaint();
|
|
}
|
|
}
|
|
|
|
private final AbstractAction defaultRemoveAction = new AbstractAction("Remove") {
|
|
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
int index = list.getSelectedIndex();
|
|
Object values[] = list.getSelectedValues();
|
|
|
|
for (Object value : values)
|
|
getModel().remove(value);
|
|
|
|
int maxIndex = list.getModel().getSize() - 1;
|
|
|
|
if (index > maxIndex)
|
|
index = maxIndex;
|
|
|
|
list.setSelectedIndex(index);
|
|
}
|
|
};
|
|
|
|
private Action removeAction = defaultRemoveAction;
|
|
|
|
public Action getRemoveAction() {
|
|
return removeAction;
|
|
}
|
|
|
|
public void setRemoveAction(Action action) {
|
|
this.removeAction = action;
|
|
}
|
|
|
|
private final AbstractAction removeHook = new AbstractAction("Remove") {
|
|
|
|
@Override
|
|
public void actionPerformed(ActionEvent e) {
|
|
if (getRemoveAction() != null && getRemoveAction().isEnabled()) {
|
|
getRemoveAction().actionPerformed(e);
|
|
}
|
|
}
|
|
};
|
|
|
|
}
|