/** This method is called when the selection of one of the two combo boxes is changed. */
  public void actionPerformed(ActionEvent ev) {

    sequenceField.hidePopup();
    separationField.hidePopup();

    try {
      if (ev.getSource() == sequenceField) {
        Animation listValue = sequenceField.getValue();
        Animation tileValue = tilePattern.getAnimation();
        if (listValue != tileValue) {
          // the tile pattern's animation sequence has changed
          tilePattern.setAnimation(listValue);
        }
      } else {
        AnimationSeparation listValue = separationField.getValue();
        AnimationSeparation tileValue = tilePattern.getAnimationSeparation();
        if (listValue != tileValue) {
          // the direction of the animation separation has changed
          tilePattern.setAnimationSeparation(listValue);
        }
      }
    } catch (TilesetException ex) {
      JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
      update(tilePattern);
    }
  }
  /**
   * This method is called when the tile pattern is changed.
   *
   * @param tilePattern the tile pattern to represent in this view (can be null)
   */
  public void update(TilePattern tilePattern) {

    this.tilePattern = tilePattern;
    if (tilePattern == null) {
      sequenceField.setEnabled(false);
      separationField.setEnabled(false);
    } else {
      Animation sequence = tilePattern.getAnimation();
      sequenceField.setEnabled(true);
      sequenceField.setValue(sequence);

      if (tilePattern.isAnimated()) {
        separationField.setValue(tilePattern.getAnimationSeparation());
        separationField.setEnabled(true);
      } else {
        separationField.setEnabled(false);
      }
    }
  }
  /** Constructor. */
  public TilePatternAnimationView() {
    super();

    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));

    // list for the animation sequence
    sequenceField = new EnumerationChooser<Animation>(Animation.class);
    sequenceField.addActionListener(this);

    // list for the separation
    separationField = new EnumerationIconChooser<AnimationSeparation>(AnimationSeparation.class);
    separationField.addActionListener(this);

    // add the two lists
    add(sequenceField);
    add(Box.createRigidArea(new Dimension(5, 0)));
    add(separationField);
  }