/** @author David Culyba */
public class EventCriteriaManager {
  public void addCondition(ManipulationEventCriteria condition) {
    if (!this.manipulationConditions.contains(condition)) {
      this.manipulationConditions.add(condition);
    }
  }

  public void removeCondition(ManipulationEventCriteria condition) {
    this.manipulationConditions.remove(condition);
  }

  public void setTargetTransformable(
      edu.cmu.cs.dennisc.scenegraph.AbstractTransformable transformable) {
    this.targetTransformable = transformable;
  }

  public boolean matches(ManipulationEvent event) {
    if ((this.targetTransformable == null)
        || (event.getTarget() == null)
        || (this.targetTransformable == event.getTarget())) {
      for (ManipulationEventCriteria condition : this.manipulationConditions) {
        if (condition.matches(event)) {
          return true;
        }
      }
    }
    return false;
  }

  private final java.util.List<ManipulationEventCriteria> manipulationConditions =
      edu.cmu.cs.dennisc.java.util.Lists.newCopyOnWriteArrayList();
  private edu.cmu.cs.dennisc.scenegraph.AbstractTransformable targetTransformable;
}
  public class SwingModel {
    private java.awt.Color value;

    private final java.util.List<javax.swing.event.ChangeListener> changeListeners =
        edu.cmu.cs.dennisc.java.util.Lists.newCopyOnWriteArrayList();

    public SwingModel(java.awt.Color initialValue) {
      this.value = initialValue;
    }

    public java.awt.Color getValue() {
      return this.value;
    }

    public void setValue(java.awt.Color nextValue, java.awt.event.MouseEvent e) {
      if (this.value.equals(nextValue)) {
        // pass
      } else {
        this.value = nextValue;
        IsAdjusting isAdjusting;
        if (e != null) {
          isAdjusting =
              e.getID() != java.awt.event.MouseEvent.MOUSE_RELEASED
                  ? IsAdjusting.TRUE
                  : IsAdjusting.FALSE;
        } else {
          isAdjusting = IsAdjusting.FALSE;
        }

        // todo
        isAdjusting = IsAdjusting.FALSE;

        org.lgna.croquet.triggers.Trigger trigger;
        if (e != null) {
          trigger = org.lgna.croquet.triggers.MouseEventTrigger.createUserInstance(e);
        } else {
          trigger = org.lgna.croquet.triggers.NullTrigger.createUserInstance();
        }
        changeValueFromSwing(this.value, isAdjusting, trigger);
        if (this.changeListeners.size() > 0) {
          Object source = e != null ? e.getSource() : this;
          javax.swing.event.ChangeEvent changeEvent = new javax.swing.event.ChangeEvent(source);
          for (javax.swing.event.ChangeListener changeListener : this.changeListeners) {
            changeListener.stateChanged(changeEvent);
          }
        }
      }
    }

    public void addChangeListener(javax.swing.event.ChangeListener changeListener) {
      this.changeListeners.add(changeListener);
    }

    public void removeChangeListener(javax.swing.event.ChangeListener changeListener) {
      this.changeListeners.remove(changeListener);
    }
  }