package com.jsonde.gui.components.listpane; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.*; import java.util.LinkedList; import java.util.List; public class JListPane extends JList { private List<ActionListener> actionListeners = new LinkedList<ActionListener>(); private ListPaneModel listPaneModel; private final ListCellRenderer listCellRenderer = new JListPaneListCellRenderer(); private final ListModel listModel = new JListPaneListModel(); private final MouseListener mouseListener = new JListPaneMouseListener(); public JListPane() { this(new DefaultListPaneModel()); } public JListPane(ListPaneModel listPaneModel) { this.listPaneModel = listPaneModel; setModel(listModel); addMouseListener(mouseListener); } public synchronized void addActionListener(ActionListener actionListener) { actionListeners.add(actionListener); } public synchronized void removeActionListener(ActionListener actionListener) { actionListeners.remove(actionListener); } public ListPaneModel getListPaneModel() { return listPaneModel; } public void setListPaneModel(ListPaneModel listPaneModel) { this.listPaneModel = listPaneModel; } private void fireActionEvent(int index, ActionEvent e) { Action action = getListPaneModel().getActionAt(index); if (null != action) { action.actionPerformed(e); } for (ActionListener actionListener : actionListeners) { actionListener.actionPerformed(e); } } @Override public ListCellRenderer getCellRenderer() { return listCellRenderer; } private class JListPaneListCellRenderer implements ListCellRenderer { public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { JLabel label = new JLabel(); label.setIcon(listPaneModel.getIconAt(index)); label.setText(listPaneModel.getLabelAt(index)); label.setBackground(list.getBackground()); label.setForeground(list.getForeground()); label.setEnabled(list.isEnabled()); label.setFont(list.getFont()); label.setComponentOrientation(list.getComponentOrientation()); Border border = null; if (cellHasFocus) { if (isSelected) { border = UIManager.getBorder("List.focusSelectedCellHighlightBorder"); } if (border == null) { border = UIManager.getBorder("List.focusCellHighlightBorder"); } } else { border = getNoFocusBorder(); } label.setBorder(border); return label; } private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1); private final Border SAFE_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1); private Border getNoFocusBorder() { if (System.getSecurityManager() != null) { return SAFE_NO_FOCUS_BORDER; } else { return noFocusBorder; } } } private class JListPaneListModel extends AbstractListModel { private static final long serialVersionUID = 1979045198103713994L; public int getSize() { return listPaneModel.getSize(); } public Object getElementAt(int index) { return listPaneModel.getLabelAt(index); } } private class JListPaneMouseListener extends MouseAdapter { @Override public void mouseClicked(MouseEvent e) { if ((MouseEvent.BUTTON1 == e.getButton()) && (2 == e.getClickCount())) { for (int i = 0; i < listPaneModel.getSize(); i++) { if (isSelectedIndex(i)) { ActionEvent actionEvent = new ActionEvent(JListPane.this, ActionEvent.ACTION_PERFORMED, "listPaneItemDoubleClicked"); fireActionEvent(i, actionEvent); } } } } } }