package net.sf.jabref.external; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.*; import javax.swing.*; import net.sf.jabref.GUIGlobals; import net.sf.jabref.Globals; import com.jgoodies.forms.builder.ButtonBarBuilder; /** * Dialog box for choosing an icon for an external file type. */ public class IconSelection extends JDialog { JList icons; List<String> iconKeys; DefaultListModel listModel; JButton ok = new JButton(Globals.lang("Ok")), cancel = new JButton(Globals.lang("Cancel")); private boolean okPressed = false; private int selected = -1; private JDialog parent; public IconSelection(JDialog parent, String initialSelection) { super(parent, Globals.lang("Select icon"), true); this.parent = parent; init(initialSelection); } public void setVisible(boolean visible) { if (visible) { okPressed = false; selected = -1; } super.setVisible(visible); } /** * After dialog has closed, this method reports whether a selection was made * or it was cancelled. * @return true if a selection was made. */ public boolean isOkPressed() { return okPressed; } public String getSelectedIconKey() { if (selected >= 0) return iconKeys.get(selected); else return null; } private void init(String initialSelection) { int initSelIndex = -1; iconKeys = new ArrayList<String>(); Map<String, String> icns = GUIGlobals.getAllIcons(); HashSet<ImageIcon> iconSet = new LinkedHashSet<ImageIcon>(); for (String key : icns.keySet()){ ImageIcon icon = GUIGlobals.getImage(key); if (!iconSet.contains(icon)) { iconKeys.add(key); if (key.equals(initialSelection)) initSelIndex = iconKeys.size()-1; } iconSet.add(icon); } listModel = new DefaultListModel(); icons = new JList(listModel); for (Iterator<ImageIcon> iterator = iconSet.iterator(); iterator.hasNext();) { listModel.addElement(new JLabel(iterator.next())); } class MyRenderer implements ListCellRenderer { JLabel comp = new JLabel(); public MyRenderer() { comp.setOpaque(true); comp.setIconTextGap(0); comp.setHorizontalAlignment(JLabel.CENTER); } public Component getListCellRendererComponent(JList list, Object value, int i, boolean isSelected, boolean hasFocus) { comp.setText(null); comp.setIcon(((JLabel)value).getIcon()); if (isSelected) { comp.setBackground(list.getSelectionBackground()); comp.setForeground(list.getSelectionForeground()); comp.setBorder(BorderFactory.createEtchedBorder()); } else { comp.setBackground(list.getBackground()); comp.setForeground(list.getForeground()); comp.setBorder(null); } return comp; } } if (initSelIndex >= 0) icons.setSelectedIndex(initSelIndex); icons.setCellRenderer(new MyRenderer()); icons.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); icons.setLayoutOrientation(JList.HORIZONTAL_WRAP); ButtonBarBuilder bb = new ButtonBarBuilder(); bb.addGlue(); bb.addGridded(ok); bb.addGridded(cancel); bb.addGlue(); bb.getPanel().setBorder(BorderFactory.createEmptyBorder(5,5,5,5)); ok.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { okPressed = true; if (icons.getSelectedValue() != null) selected = icons.getSelectedIndex(); dispose(); } }); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { okPressed = false; dispose(); } }); icons.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { } } }); getContentPane().add(new JScrollPane(icons), BorderLayout.CENTER); getContentPane().add(bb.getPanel(), BorderLayout.SOUTH); pack(); setLocationRelativeTo(parent); } }