Пример #1
0
  /**
   * 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();
  }