
org.jdesktop.beansbinding.PropertyStateEvent Maven / Gradle / Ivy
/***********************************************************************************************************************
*
* BetterBeansBinding - keeping JavaBeans in sync
* ==============================================
*
* Copyright (C) 2009 by Tidalwave s.a.s. (http://www.tidalwave.it)
* http://betterbeansbinding.kenai.com
*
* This is derived work from BeansBinding: http://beansbinding.dev.java.net
* BeansBinding is copyrighted (C) by Sun Microsystems, Inc.
*
***********************************************************************************************************************
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
* Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library 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 Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
***********************************************************************************************************************
*
* $Id: PropertyStateEvent.java 60 2009-04-26 20:47:20Z fabriziogiudici $
*
**********************************************************************************************************************/
package org.jdesktop.beansbinding;
import java.util.EventObject;
/**
* An event characterizing a change in a {@code Property's} state for
* a particular source object.
*
* @see Property
* @see PropertyStateListener
*
* @author Shannon Hickey
*/
public class PropertyStateEvent extends EventObject {
/**
* Used to indicate that a particular value is unreadable.
*/
public static final Object UNREADABLE = new StringBuffer("UNREADABLE");
private Object sourceObject;
private final boolean valueChanged;
private final Object oldValue;
private final Object newValue;
private final boolean writeableChanged;
private boolean isWriteable;
/**
* Creates an instance of {@code PropertyStateEvent} characterizing a
* change in a {@code Property's} state for a particular source object.
*
* Note: To indicate a change in readability, specify {@code valueChanged}
* as {@code true} and reflect the readability status in the {@code oldValue}
* and {@code newValue} arguments.
*
* @param sourceProperty the {@code Property} whose state has changed
* @param sourceObject the source object for which the {@code Property's} state has changed
* @param valueChanged whether or not the {@code Property's} value has changed for the source object
* @param oldValue the old value of the {@code Property} for the source object,
* or {@code UNREADABLE} if the {@code Property} was not previously readable for the source object
* @param newValue the new value of the {@code Property} for the source object,
* or {@code UNREADABLE} if the {@code Property} is not currently readable for the source object
* @param writeableChanged whether or not the {@code Property's} writeability has changed for the source object
* @param isWriteable whether or not the {@code Property} is now writeable for the source object
* @throws IllegalArgumentException if neither the value or the writeability has changed
* @throws IllegalArgumentException if {@code valueChanged} is {@code true} and both
* {@code oldValue} and {@code newValue} are {@code UNREADABLE}
*/
public PropertyStateEvent(Property sourceProperty, Object sourceObject,
boolean valueChanged, Object oldValue, Object newValue,
boolean writeableChanged, boolean isWriteable) {
super(sourceProperty);
if (!writeableChanged && !valueChanged) {
throw new IllegalArgumentException("Nothing has changed");
}
if (valueChanged && (oldValue == UNREADABLE) &&
(newValue == UNREADABLE)) {
throw new IllegalArgumentException(
"Value can't change from UNREADABLE to UNREADABLE");
}
this.sourceObject = sourceObject;
this.valueChanged = valueChanged;
this.oldValue = oldValue;
this.newValue = newValue;
this.writeableChanged = writeableChanged;
this.isWriteable = isWriteable;
}
/**
* Returns the {@code Property} whose state has changed.
* The preferred way to access this value is via the
* {@link #getSourceProperty} method.
*
* @return the {@code Property} whose state has changed.
*/
public final Object getSource() {
return super.getSource();
}
/**
* Returns the {@code Property} whose state has changed.
*
* @return the {@code Property} whose state has changed.
*/
public final Property getSourceProperty() {
return (Property) getSource();
}
/**
* Returns the source object for which the {@code Property's} state has changed.
*
* @return the source object for which the {@code Property's} state has changed
*/
public final Object getSourceObject() {
return sourceObject;
}
/**
* Returns whether or not the {@code Property's} value has changed for the source object.
*
* @return whether or not the {@code Property's} value has changed for the source object.
*/
public final boolean getValueChanged() {
return valueChanged;
}
/**
* Returns the old value of the {@code Property} for the source object,
* or {@code UNREADABLE} if the {@code Property} was not previously readable for the
* source object.
*
* Note: This method must only be called if {@code getValueChanged} returns
* {@code true}.
*
* @return the old value of the {@code Property} for the source object
* or {@code UNREADABLE}
* @throws UnsupportedOperationException if the value hasn't changed
*/
public final Object getOldValue() {
if (!valueChanged) {
throw new UnsupportedOperationException("value hasn't changed");
}
return oldValue;
}
/**
* Returns the new value of the {@code Property} for the source object,
* or {@code UNREADABLE} if the {@code Property} is not currently readable for the
* source object.
*
* Note: This method must only be called if {@code getValueChanged} returns
* {@code true}.
*
* @return the new value of the {@code Property} for the source object
* or {@code UNREADABLE}
* @throws UnsupportedOperationException if the value hasn't changed
*/
public final Object getNewValue() {
if (!valueChanged) {
throw new UnsupportedOperationException("value hasn't changed");
}
return newValue;
}
/**
* Returns whether or not the {@code Property's} readability has changed for
* the source object. In particuler, this returns {@code true} if the value
* has changed and either the old value or new value is {@code UNREADABLE},
* and {@code false} otherwise.
*
* @return whether or not the {@code Property's} readability has changed for
* the source object.
*/
public final boolean getReadableChanged() {
return valueChanged && (oldValue != newValue) &&
((oldValue == UNREADABLE) || (newValue == UNREADABLE));
}
/**
* Returns whether or not the {@code Property} is currently readable for
* the source object. In particular, this returns {@code true} if and only
* if the new value is not {@code UNREADABLE}.
*
* Note: This method must only be called if {@code getReadableChanged} returns
* {@code true}.
*
* @return whether or not the {@code Property} is currently readable for
* the source object.
* @throws UnsupportedOperationException if the readability hasn't changed
*/
public final boolean isReadable() {
if (!getReadableChanged()) {
throw new UnsupportedOperationException(
"readability hasn't changed");
}
return newValue != UNREADABLE;
}
/**
* Returns whether or not the {@code Property's} writeability has changed for
* the source object.
*
* @return whether or not the {@code Property's} writeability has changed for
* the source object.
*/
public final boolean getWriteableChanged() {
return writeableChanged;
}
/**
* Returns whether or not the {@code Property} is currently writeable for
* the source object.
*
* Note: This method must only be called if {@code getWriteableChanged} returns
* {@code true}.
*
* @return whether or not the {@code Property} is currently writeable for
* the source object.
* @throws UnsupportedOperationException if the writeability hasn't changed
*/
public final boolean isWriteable() {
if (!writeableChanged) {
throw new UnsupportedOperationException(
"writeability hasn't changed");
}
return isWriteable;
}
/**
* Returns a string representation of the {@code PropertyStateEvent}. This
* method is intended to be used for debugging purposes only, and
* the content and format of the returned string may vary between
* implementations. The returned string may be empty but may not
* be {@code null}.
*
* @return a string representation of this {@code PropertyStateEvent}
*/
public String toString() {
StringBuffer buffer = new StringBuffer(getClass().getName());
buffer.append(": Property ").append(getSourceProperty())
.append(" changed on ").append(getSourceObject()).append(":\n");
if (getValueChanged()) {
buffer.append(" value changed from ").append(getOldValue())
.append(" to ").append(getNewValue()).append('\n');
}
if (getReadableChanged()) {
buffer.append(" readable changed from ").append(!isReadable())
.append(" to ").append(isReadable()).append('\n');
}
if (getWriteableChanged()) {
buffer.append(" writeable changed from ").append(!isWriteable())
.append(" to ").append(isWriteable()).append('\n');
}
buffer.deleteCharAt(buffer.length() - 1);
return buffer.toString();
}
}