//<pre> 

package actor;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.Iterator;

/**
 * $Id: AbstractBehavior.java,v 1.15 2004/03/03 22:57:05 robbins Exp $
 */
public abstract class AbstractBehavior
  implements Behavior, PropertyChangeListener
{
  private String name;
  private int priority;
  private boolean blocking, enabled;
  private BehaviorArbitrator arbitrator;
  private BehaviorList behaviors = new BehaviorList();
  private PropertyChangeSupport changes = new PropertyChangeSupport(this);  
  
  // Public Methods =====================================  
  public abstract MotionChange doBehavior(WorldState ws, InvariantActor a);
  
  public void addPropertyChangeListener(PropertyChangeListener listener)
  {
    this.changes.addPropertyChangeListener(listener);
  }

  public void removePropertyChangeListener(PropertyChangeListener listener)
  {
    this.changes.removePropertyChangeListener(listener);
  }
    
  public void removeAllPropertyChangeListeners()
  {    
    PropertyChangeListener[] listeners =
      this.changes.getPropertyChangeListeners();
    for (int i = 0; i < listeners.length; i++)
    {
      PropertyChangeListener listener = listeners[i];
      this.changes.removePropertyChangeListener(listener);
      
    }
  }
  
  public void addBehavior(AbstractBehavior behavior)
  {
    this.behaviors.add(behavior);
    behavior.addPropertyChangeListener(this);         
  }
  
  public void removeBehavior(AbstractBehavior behavior)
  {
    behavior.removePropertyChangeListener(this); 
    this.behaviors.remove(behavior);
  }
  
  public void removeAllBehaviors()
  {
    this.behaviors.clear();
  }
  
  // Getters and Setters =================================
  public BehaviorArbitrator getArbitrator()
  {
    return arbitrator;
  }
  
  public void setArbitrator(BehaviorArbitrator arbitrator)
  {
    BehaviorArbitrator oldArbitrator = this.arbitrator;    
    this.arbitrator = arbitrator;
    changes.firePropertyChange("arbitrator", oldArbitrator, this.arbitrator);
  }

  public BehaviorList getBehaviors()
  {
    return behaviors;
  }

  public void setBehaviors(BehaviorList behaviors)
  {
    BehaviorList oldBehaviors = this.behaviors;
    behaviors.clear();
    for (Iterator iter = behaviors.iterator(); iter.hasNext();)
    {
      AbstractBehavior element = (AbstractBehavior)iter.next();
      this.addBehavior(element);
    }
    changes.firePropertyChange("behaviors", oldBehaviors, this.behaviors);
  }

  public boolean isBlocking()
  {
    return blocking;
  }

  public void setBlocking(boolean blocking)
  {
    boolean oldBlocking = this.blocking;
    this.blocking = blocking;
    changes.firePropertyChange("blocking", oldBlocking, this.blocking);
  }

  public int getPriority()
  {
    return priority;
  }

  public void setPriority(int priority)
  {    
    int oldPriority = this.priority;
    this.priority = priority;
    changes.firePropertyChange("priority", oldPriority, this.priority);
  }

  public boolean isEnabled()
  {
    return enabled;
  }

  public void setEnabled(boolean enabled)
  {
    boolean oldEnabled = this.enabled;
    this.enabled = enabled;
    changes.firePropertyChange("enabled", oldEnabled, this.enabled);
  }

  public String getName()
  {
    return name;
  }

  public void setName(String name)
  {
    String oldName = this.name;
    this.name = name;
    changes.firePropertyChange("name", oldName, this.name);
  }


  public void propertyChange(PropertyChangeEvent e) {}

}// end