ListEditorPanel.java

package algorithmen.umleditor;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.*;

/**
 * Panel zum Editieren einer Liste (definiert als Vector).
 * Zeigt die Liste an und Buttons zum Löschen, Ändern und Hinzufügen
 *    von Elementen.
 */
public class ListEditorPanel extends JPanel {
  
  protected JList listField;
  protected Vector theList;
  protected View elementView;
  protected JDialog parent;
  
  /**
   * Erzeugt einen Editor für eine Liste list von UmlObjekten mit Titel string.
   * Der View subview ermöglicht, einen passenden Editor für die Objekte zu
   *   erzeugen.
   * Der Parameter dialog ist der aufrufende JDialog (Editor) selbst, er ist
   *    Bezugspunkt für den modalen Untereditor.
   */
  public ListEditorPanel(Vector list, String title, View view, JDialog parent) {
    super(new BorderLayout());
    int bSize = 3;
    Border emptyBorder = BorderFactory.createEmptyBorder(bSize, bSize, bSize, bSize);
    setBorder(emptyBorder);
    theList = list;
    elementView = view;
    this.parent = parent;
    
    JLabel titleLabel = new JLabel(title + ":");
    titleLabel.setBorder(emptyBorder);
    
    listField = new JList();
    listField.setListData(list);
    listField.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    
    JScrollPane scrollPane = new JScrollPane(listField);
    
    // rechts kommen drei Buttons dazu
    Box buttonBox = new Box(BoxLayout.Y_AXIS);
    buttonBox.setBorder(emptyBorder);
    
    JButton newButton = new JButton("Neu");
    newButton.addActionListener(new AddListener());
    newButton.setMaximumSize(new Dimension(100, 25));

    JButton changeButton = new JButton("Ändern");
    changeButton.addActionListener(new ChangeListener());
    changeButton.setMaximumSize(new Dimension(100, 25));
    
    JButton deleteButton = new JButton("Löschen");
    deleteButton.addActionListener(new DeleteListener());
    deleteButton.setMaximumSize(new Dimension(100, 25));
    
    buttonBox.add(newButton);
    buttonBox.add(changeButton);
    buttonBox.add(deleteButton);
    
    // und jetzt Komponenten zusammensez
    add(titleLabel, BorderLayout.NORTH);
    add(scrollPane, BorderLayout.CENTER);
    add(buttonBox, BorderLayout.EAST);
  }
  
  class AddListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      UmlElement o = elementView.createStandardObject();
      theList.add(o);
      listField.setListData(theList);
      repaint();
    }
  }
  
  class ChangeListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      int index = listField.getSelectedIndex();
      if (index != -1) {
        UmlElement o = (UmlElement) theList.get(index);
        elementView.createEditor(o, parent);
        repaint();
      }
    }
  }
  
  class DeleteListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      int index = listField.getSelectedIndex();
      if (index != -1) {
        theList.remove(index);
        repaint();
      }
    }
  }
}