/* PropertyChangeEvent.java -- describes a change in a property
   Copyright (C) 1998, 2000, 2002, 2005  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.beans;

import java.util.EventObject;

/**
 * PropertyChangeEvents are fired in the PropertyChange and VetoableChange
 * event classes.  They represent the old and new values as well as the
 * source Bean. If the old or new value is a primitive type, it must be
 * wrapped in the appropriate wrapper type (java.lang.Integer for int, etc.,
 * etc.).
 *
 * <p>If the old or new values are unknown (although why that would be I do
 * not know), they may be null. Also, if the set of properties itself has
 * changed, the name should be null, and the old and new values may also be
 * null. Right now Sun put in a propagationId, reserved for future use. Read
 * the comments on the constructor and on setPropagationId for more
 * information.
 *
 * @author John Keiser
 * @author Eric Blake (ebb9@email.byu.edu)
 * @since 1.1
 * @status udpated to 1.4
 */
public class PropertyChangeEvent extends EventObject
{
  /**
   * Compatible with JDK 1.1+.
   */
  private static final long serialVersionUID = 7042693688939648123L;

  /**
   * The name of the property that changed, may be null. Package visible for
   * use by PropertyChangeSupport.
   *
   * @serial the changed property name
   */
  final String propertyName;

  /**
   * The new value of the property, may be null. Package visible for use by
   * PropertyChangeSupport.
   *
   * @serial the new property value
   */
  final Object newValue;

  /**
   * The old value of the property, may be null. Package visible for use by
   * PropertyChangeSupport.
   *
   * @serial the old property value
   */
  final Object oldValue;

  /**
   * The propagation ID, reserved for future use. May be null.
   *
   * @see #getPropagationId()
   * @serial the Propagation ID
   */
  private Object propagationId;

  /**
   * Create a new PropertyChangeEvent. Remember that if you received a
   * PropertyChangeEvent and are sending a new one, you should also set the
   * propagation ID from the old PropertyChangeEvent.
   *
   * @param source the Bean containing the property
   * @param propertyName the property's name
   * @param oldVal the old value of the property
   * @param newVal the new value of the property
   * @throws IllegalArgumentException if source is null
   */
  public PropertyChangeEvent(Object source, String propertyName,
                             Object oldVal, Object newVal)
  {
    super(source);
    this.propertyName = propertyName;
    oldValue = oldVal;
    newValue = newVal;
  }

  /**
   * Get the property name. May be null if multiple properties changed.
   *
   * @return the property name
   */
  public String getPropertyName()
  {
    return propertyName;
  }

  /**
   * Get the property's new value. May be null if multiple properties changed.
   *
   * @return the property's new value
   */
  public Object getNewValue()
  {
    return newValue;
  }

  /**
   * Get the property's old value. May be null if multiple properties changed.
   *
   * @return the property's old value
   */
  public Object getOldValue()
  {
    return oldValue;
  }

  /**
   * Set the propagation ID.  This is a way for the event to be passed from
   * hand to hand and retain a little extra state.  Right now it is unused,
   * but it should be propagated anyway so that future versions of JavaBeans
   * can use it, for God knows what.
   *
   * @param propagationId the propagation ID
   * @see #getPropagationId()
   */
  public void setPropagationId(Object propagationId)
  {
    this.propagationId = propagationId;
  }

  /**
   * Get the propagation ID. Right now, it is not used for anything.
   *
   * @return the propagation ID
   * @see #setPropagationId(Object)
   */
  public Object getPropagationId()
  {
    return propagationId;
  }

  /**
   * Utility method to rollback a change.
   *
   * @param event the event to rollback
   * @return a new event with old and new swapped
   */
  PropertyChangeEvent rollback()
  {
    PropertyChangeEvent result
      = new PropertyChangeEvent(source, propertyName, newValue, oldValue);
    result.propagationId = propagationId;
    return result;
  }
} // class PropertyChangeEvent
