/*
 * SIP Communicator, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package net.java.sip.communicator.service.configuration.event;

import net.java.sip.communicator.service.configuration.*;
import net.java.sip.communicator.util.xml.*;
import net.java.sip.communicator.impl.configuration.xml.*;

/**
 * A "ConfigurationChange" event gets delivered whenever a someone changes a
 * configuration property.  A ConfigurationEvent object is sent as an
 * argument to the ConfigurationChangeListener methods.
 * <P>
 * Normally ConfigurationChangeEvents are accompanied by the name and the old
 * and new values of the changed property.  If the new value is a primitive
 * type (such as int or boolean) it must be wrapped as the
 * corresponding java.lang.* Object type (such as Integer or Boolean).
 * <P>
 * Null values may be provided for the old and the new values if their
 * true values are not known.
 * <P>
 * An event source may send a null object as the name to indicate that an
 * arbitrary set of if its properties have changed.  In this case the
 * old and new values should also be null.
 * <P>
 * In the case where the event reflects the change of a constrained property,
 * it will first be dispatched to all propertyWillChange methods and only in
 * case that none of them has objected (no ChangeVetoException has been thrown)
 * the propertyChange method is called.
 *
 * @author Emil Ivov
 */
public class PropertyChangeEvent
    extends java.util.EventObject
{

    /**
     * name of the property that changed.  May be null, if not known.
     * @serial
     */
    private String propertyName;

    /**
     * New value for property.  May be null if not known.
     * @serial
     */
    private Object newValue;

    /**
     * Previous value for property.  May be null if not known.
     * @serial
     */
    private Object oldValue;

    /**
     * Constructs a new <tt>PropertyChangeEvent</tt>.
     *
     * @param source  The bean that fired the event.
     * @param propertyName  The programmatic name of the property
     *                      that was changed.
     * @param oldValue  The old value of the property.
     * @param newValue  The new value of the property.
     */
    public PropertyChangeEvent(Object source, String propertyName,
                               Object oldValue, Object newValue)
    {
        super(source);
        this.propertyName = propertyName;
        this.newValue = newValue;
        this.oldValue = oldValue;
    }

    /**
     * Gets the programmatic name of the property that was changed.
     *
     * @return  The programmatic name of the property that was changed.
     *    May be null if multiple properties have changed.
     */
    public String getPropertyName()
    {
        return propertyName;
    }

    /**
     * Sets the new value for the property, expressed as an Object.
     *
     * @return  The new value for the property, expressed as an Object.
     *          May be null if multiple properties have changed.
     */
    public Object getNewValue()
    {
        return newValue;
    }

    /**
     * Gets the old value for the property, expressed as an Object.
     *
     * @return  The old value for the property, expressed as an Object.
     *      May be null if multiple properties have changed.
     */
    public Object getOldValue()
    {
        return oldValue;
    }
}
