filebot/source/net/filebot/ui/FileBotList.java

149 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 ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.swing.DefaultEventListModel;
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;
public class FileBotList<E> extends JComponent {
protected EventList<E> model = new BasicEventList<E>();
protected JList<E> list = new JList<E>(new DefaultEventListModel<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 DefaultEventListModel(model));
}
public JList<E> 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();
for (Object value : list.getSelectedValuesList()) {
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);
}
}
};
}