/** * Creates a new <code>ListOptionUI</code> for the given <code>ListOption</code>. * * @param gui The <code>GUI</code> to display on. * @param option The <code>ListOption</code> to display. * @param editable boolean whether user can modify the setting */ @SuppressWarnings("unchecked") // FIXME in Java7 public ListOptionUI(final GUI gui, final ListOption<T> option, boolean editable) { super(gui, option, editable); panel.setBorder( BorderFactory.createTitledBorder( BorderFactory.createLineBorder(Color.BLACK), super.getLabel().getText())); panel.setLayout(new MigLayout("wrap 2, fill", "[fill, grow]20[fill]")); model = new DefaultListModel(); for (AbstractOption<T> o : option.getValue()) { try { AbstractOption<T> c = o.clone(); model.addElement(c); } catch (CloneNotSupportedException e) { logger.log(Level.WARNING, "Can not clone" + o.getId(), e); } } list = new JList(model); AbstractOption<T> o = option.getValue().isEmpty() ? option.getTemplate() : option.getValue().get(0); if (o != null) { OptionUI ui = OptionUI.getOptionUI(gui, o, editable); if (ui != null && ui.getListCellRenderer() != null) { list.setCellRenderer(ui.getListCellRenderer()); } list.setSelectedIndex(0); } list.setVisibleRowCount(4); JScrollPane pane = new JScrollPane(list); panel.add(pane, "grow, spany 5"); for (JButton button : buttons) { button.setEnabled(editable); panel.add(button); } addButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { AbstractOption<T> oldValue = (AbstractOption<T>) list.getSelectedValue(); if (oldValue == null) oldValue = option.getTemplate(); try { AbstractOption<T> newValue = oldValue.clone(); if (gui.showEditOptionDialog(newValue)) { if (option.canAdd(newValue)) { model.addElement(newValue); list.setSelectedValue(newValue, true); list.repaint(); } } } catch (CloneNotSupportedException e) { logger.log(Level.WARNING, "Can not clone: " + oldValue, e); } } }); editButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { Object object = list.getSelectedValue(); if (object != null) { if (gui.showEditOptionDialog((Option) object)) { list.repaint(); } } } }); removeButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { model.removeElementAt(list.getSelectedIndex()); } }); upButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { if (list.getSelectedIndex() == 0) return; final int index = list.getSelectedIndex(); final Object temp = model.getElementAt(index); model.setElementAt(model.getElementAt(index - 1), index); model.setElementAt(temp, index - 1); list.setSelectedIndex(index - 1); } }); downButton.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { if (list.getSelectedIndex() == model.getSize() - 1) return; final int index = list.getSelectedIndex(); final Object temp = model.getElementAt(index); model.setElementAt(model.getElementAt(index + 1), index); model.setElementAt(temp, index + 1); list.setSelectedIndex(index + 1); } }); list.addListSelectionListener(this); initialize(); }