/*
* Copyright (C) 2007 Sun Microsystems, Inc. All rights reserved. Use is
* subject to license terms.
*/
package org.jdesktop.beansbinding;
import static org.jdesktop.beansbinding.PropertyStateEvent.UNREADABLE;
/**
* An immutable, read-only, {@code Property} implementation whose {@code getValue}
* method returns the source object that it is given. This class is useful when
* you want to configure a {@code Binding} to use its source object directly,
* rather than some property of the source object. For example:
* <p>
* <pre><code>
* new SomeBindingClass(sourceObject, ObjectProperty.create(), targetObject, targetProperty);
* </code></pre>
* <p>
* Explicitly using {@code ObjectProperty} isn't necessary when creating {@code Bindings}
* from this package or the {@code SwingBindings} package, as the set of static creation
* methods include versions that handle this for you.
*
* @param <S> the type of source object that this {@code Property} operates on
* and therefore the type of value that it represents
*
* @author Shannon Hickey
*/
public final class ObjectProperty<S> extends Property<S, S> {
/**
* Creates an instance of {@code ObjectProperty}.
*/
public static <S> ObjectProperty<S> create() {
return new ObjectProperty<S>();
}
private ObjectProperty() {}
/**
* Throws {@code UnsupportedOperationException}; {@code ObjectProperty} is never writeable.
*
* @param source {@inheritDoc}
* @return never returns; always throws {@code UnsupportedOperationException}; {@code ObjectProperty} is never writeable
* @throws UnsupportedOperationException always; {@code ObjectProperty} is never writeable
* @see #isWriteable
*/
public Class<? extends S> getWriteType(S source) {
throw new UnsupportedOperationException("Unwriteable");
}
/**
* Returns the source object passed to the method.
*
* @return the value of the {@code source} argument
* @see #isReadable
*/
public S getValue(S source) {
return source;
}
/**
* Throws {@code UnsupportedOperationException}; {@code ObjectProperty} is never writeable.
*
* @param source {@inheritDoc}
* @throws UnsupportedOperationException always; {@code ObjectProperty} is never writeable
* @see #isWriteable
* @see #getWriteType
*/
public void setValue(S source, S value) {
throw new UnsupportedOperationException("Unwriteable");
}
/**
* Returns {@code true}; {@code ObjectProperty} is always readable.
*
* @return {@code true}; {@code ObjectPropert} is always readable
* @see #isWriteable
*/
public boolean isReadable(Object source) {
return true;
}
/**
* Returns {@code false}; {@code ObjectProperty} is never writeable.
*
* @return {@code false}; {@code ObjectPropert} is never writeable
* @see #isReadable
*/
public boolean isWriteable(Object source) {
return false;
}
/**
* Returns a string representation of the {@code ObjectProperty}. 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 ObjectProperty}
*/
public String toString() {
return getClass().getName();
}
/**
* Does nothing; the state of an {@code ObjectProperty} never changes so
* listeners aren't useful.
*/
public void addPropertyStateListener(S source, PropertyStateListener listener) {}
/**
* Does nothing; the state of an {@code ObjectProperty} never changes so
* listeners aren't useful.
*
* @see #addPropertyStateListener
*/
public void removePropertyStateListener(S source, PropertyStateListener listener) {}
/**
* Returns an empty array; the state of an {@code ObjectProperty} never changes
* so listeners aren't useful.
*
* @return an empty array
* @see #addPropertyStateListener
*/
public PropertyStateListener[] getPropertyStateListeners(S source) {
return new PropertyStateListener[0];
}
}