001: /*
002: $Id: ValueHolder.java 4032 2006-08-30 07:18:49Z mguillem $
003:
004: Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005:
006: Redistribution and use of this software and associated documentation
007: ("Software"), with or without modification, are permitted provided
008: that the following conditions are met:
009:
010: 1. Redistributions of source code must retain copyright
011: statements and notices. Redistributions must also contain a
012: copy of this document.
013:
014: 2. Redistributions in binary form must reproduce the
015: above copyright notice, this list of conditions and the
016: following disclaimer in the documentation and/or other
017: materials provided with the distribution.
018:
019: 3. The name "groovy" must not be used to endorse or promote
020: products derived from this Software without prior written
021: permission of The Codehaus. For written permission,
022: please contact info@codehaus.org.
023:
024: 4. Products derived from this Software may not be called "groovy"
025: nor may "groovy" appear in their names without prior written
026: permission of The Codehaus. "groovy" is a registered
027: trademark of The Codehaus.
028:
029: 5. Due credit should be given to The Codehaus -
030: http://groovy.codehaus.org/
031:
032: THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS
033: ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
034: NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
035: FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
036: THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
037: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
038: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
039: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
040: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
041: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
042: ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
043: OF THE POSSIBILITY OF SUCH DAMAGE.
044:
045: */
046: package groovy.model;
047:
048: import java.beans.PropertyChangeListener;
049: import java.beans.PropertyChangeSupport;
050:
051: /**
052: * A simple ValueModle implementation which is a holder of an object value.
053: * Used to share local variables with closures
054: *
055: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
056: * @version $Revision: 4032 $
057: */
058: public class ValueHolder implements ValueModel {
059: private Object value;
060: private Class type;
061: private PropertyChangeSupport propertyChangeSupport;
062: private boolean editable = true;
063:
064: public ValueHolder() {
065: this (Object.class);
066: }
067:
068: public ValueHolder(Class type) {
069: this .type = type;
070: }
071:
072: public ValueHolder(Object value) {
073: this .value = value;
074: this .type = (value != null) ? value.getClass() : Object.class;
075: }
076:
077: /**
078: * Add a PropertyChangeListener to the listener list.
079: * @param listener The listener to add.
080: */
081: public void addPropertyChangeListener(
082: PropertyChangeListener listener) {
083: if (propertyChangeSupport == null) {
084: propertyChangeSupport = new PropertyChangeSupport(this );
085: }
086: propertyChangeSupport.addPropertyChangeListener(listener);
087: }
088:
089: /**
090: * Removes a PropertyChangeListener from the listener list.
091: * @param listener The listener to remove.
092: */
093: public void removePropertyChangeListener(
094: PropertyChangeListener listener) {
095: if (propertyChangeSupport != null) {
096: propertyChangeSupport
097: .removePropertyChangeListener(listener);
098: }
099: }
100:
101: public Object getValue() {
102: return value;
103: }
104:
105: public void setValue(Object value) {
106: Object oldValue = this .value;
107: this .value = value;
108: if (propertyChangeSupport != null) {
109: propertyChangeSupport.firePropertyChange("value", oldValue,
110: value);
111: }
112: }
113:
114: public Class getType() {
115: return type;
116: }
117:
118: public boolean isEditable() {
119: return editable;
120: }
121:
122: public void setEditable(boolean editable) {
123: this.editable = editable;
124: }
125:
126: }
|