Revision: 1744
          http://svn.sourceforge.net/spring-rich-c/?rev=1744&view=rev
Author:   jhoskens
Date:     2007-04-16 04:03:30 -0700 (Mon, 16 Apr 2007)

Log Message:
-----------
Added some javadoc.

Modified Paths:
--------------
    
trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/FormModelMediatingValueModel.java

Modified: 
trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/FormModelMediatingValueModel.java
===================================================================
--- 
trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/FormModelMediatingValueModel.java
    2007-04-10 09:17:10 UTC (rev 1743)
+++ 
trunk/spring-richclient/support/src/main/java/org/springframework/binding/form/support/FormModelMediatingValueModel.java
    2007-04-16 11:03:30 UTC (rev 1744)
@@ -28,144 +28,240 @@
 import org.springframework.richclient.util.EventListenerListHelper;
 
 /**
- * A value model wrapper that mediates between the (wrapped) data value model 
and the 
- * derived view value model. Allows for value change event delivery to be 
disabled.
+ * <p>
+ * A value model wrapper that mediates between the (wrapped) data value model
+ * and the derived view value model. Allows for value change event delivery to
+ * be disabled.
+ * </p>
  * 
+ * <p>
+ * Use the provided method [EMAIL PROTECTED] 
#setDeliverValueChangeEvents(boolean)} to
+ * enable/disable the event mechanism. This makes it possible to change all
+ * valueModels and only then fire all events (as it is used in
+ * [EMAIL PROTECTED] AbstractFormModel}). Events are handled internally by the
+ * [EMAIL PROTECTED] #dirtyChangeListeners} and the [EMAIL PROTECTED] 
#mediatedValueHolder}.
+ * </p>
+ * 
+ * <p>
+ * As this is also a [EMAIL PROTECTED] DirtyTrackingValueModel}, the 
implementation allows
+ * reverting to the original value by using [EMAIL PROTECTED] 
#revertToOriginal()}, which
+ * uses the value stored in [EMAIL PROTECTED] #originalValue} to reset the
+ * wrappedValueModel. This originalValue is updated to hold the wrappedValue
+ * when using [EMAIL PROTECTED] #clearDirty()}.
+ * </p>
+ * 
+ * <p>Small sketch to illustrate the positioning and usage:</p>
+ * <pre>
+ * &lt;setup&gt;
+ * External actor -> FormModelMediatingValueModel -> wrappedValueModel
+ *                   holds originalValue = ori       wrappedValue = ori
+ *                   events = enabled
+ * 
+ * &lt;use case&gt;
+ * events disabled -> events = disabled            -> wrappedValue = ori
+ * write value A   -> delagates to wrappedModel    -> wrappedValue = A
+ *                    originalValue = ori
+ *                    update dirty state
+ * events enabled  -> events = enabled             -> wrappedValue = A
+ *                    sends events (dirty...)
+ * clearDirty      -> originalValue = A            -> wrappedValue = A
+ * OR
+ * revertToOriginal-> set originalValue on wrapped -> wrappedValue = ori
+ *                    update dirty state                  
+ * </pre>
+ * 
  * @author Oliver Hutchison
  */
 public class FormModelMediatingValueModel extends AbstractValueModelWrapper 
implements DirtyTrackingValueModel,
-        PropertyChangeListener {
+               PropertyChangeListener {
 
-    private final EventListenerListHelper dirtyChangeListeners = new 
EventListenerListHelper(
-            PropertyChangeListener.class);
+       /** Holds all propertyChangeListeners that are interested in Dirty 
changes. */
+       private final EventListenerListHelper dirtyChangeListeners = new 
EventListenerListHelper(
+                       PropertyChangeListener.class);
 
-    private boolean deliverValueChangeEvents = true;
+       /** Allows to turn off the tracking mechanism. */
+       private boolean deliverValueChangeEvents = true;
 
-    private final ValueHolder mediatedValueHolder;
+       /** Holds the originalValue. Used to register listeners. */
+       private final ValueHolder mediatedValueHolder;
 
-    private Object originalValue;
+       /** The original value of the wrapped ValueModel. */
+       private Object originalValue;
 
-    private boolean oldDirty;
+       /** Previous dirty state. */
+       private boolean oldDirty;
 
-    private final boolean trackDirty;
+       /** Dirty tracking can be disabled. */
+       private final boolean trackDirty;
 
-    private ValueChangeDetector valueChangeDetector;
+       /** The pluggable valueChangeDetector used to track dirty changes. */
+       private ValueChangeDetector valueChangeDetector;
 
-    public FormModelMediatingValueModel(ValueModel propertyValueModel) {
-        this(propertyValueModel, true);
-    }
+       /**
+        * Constructor which defaults <code>trackDirty=true</code>.
+        * 
+        * @param propertyValueModel the ValueModel to mediate.
+        */
+       public FormModelMediatingValueModel(ValueModel propertyValueModel) {
+               this(propertyValueModel, true);
+       }
 
-    public FormModelMediatingValueModel(ValueModel propertyValueModel, boolean 
trackDirty) {
-        super(propertyValueModel);
-        super.addValueChangeListener(this);
-        this.originalValue = getValue();
-        this.mediatedValueHolder = new ValueHolder(originalValue);
-        this.trackDirty = trackDirty;
-    }
+       /**
+        * Constructor.
+        * 
+        * @param propertyValueModel the valueModel to mediate.
+        * @param trackDirty disable/enable dirty tracking.
+        */
+       public FormModelMediatingValueModel(ValueModel propertyValueModel, 
boolean trackDirty) {
+               super(propertyValueModel);
+               super.addValueChangeListener(this);
+               this.originalValue = getValue();
+               this.mediatedValueHolder = new ValueHolder(originalValue);
+               this.trackDirty = trackDirty;
+       }
 
-    public void setValueSilently(Object value, PropertyChangeListener 
listenerToSkip) {
-        super.setValueSilently(value, this);
-        if (deliverValueChangeEvents) {
-            mediatedValueHolder.setValueSilently(value, listenerToSkip);
-            updateDirtyState();
-        }        
-    }
+       public void setValueSilently(Object value, PropertyChangeListener 
listenerToSkip) {
+               super.setValueSilently(value, this);
+               if (deliverValueChangeEvents) {
+                       mediatedValueHolder.setValueSilently(value, 
listenerToSkip);
+                       updateDirtyState();
+               }
+       }
 
-    // called by the wrapped value model
-    public void propertyChange(PropertyChangeEvent evt) {
-        originalValue = getValue();
-        if (deliverValueChangeEvents) {            
-            mediatedValueHolder.setValue(originalValue);
-            updateDirtyState();
-        }        
-    }
+       // called by the wrapped value model
+       public void propertyChange(PropertyChangeEvent evt) {
+               originalValue = getValue();
+               if (deliverValueChangeEvents) {
+                       mediatedValueHolder.setValue(originalValue);
+                       updateDirtyState();
+               }
+       }
 
-    public void setDeliverValueChangeEvents(boolean deliverValueChangeEvents) {
-        boolean oldDeliverValueChangeEvents = this.deliverValueChangeEvents;
-        this.deliverValueChangeEvents = deliverValueChangeEvents;
-        if (!oldDeliverValueChangeEvents && deliverValueChangeEvents) {
-            mediatedValueHolder.setValue(getValue());
-            updateDirtyState();            
-        }
-    }
+       /**
+        * <p>
+        * Enable/disable the event mechanism. Makes it possible to control the
+        * timing of event firing (delay the events).
+        * </p>
+        * 
+        * <p>
+        * When disabling, no dirty events will be fired and the mediating
+        * valueHolder will not set it's value. The latter results in not firing
+        * other events like valueChangedEvents.
+        * </p>
+        * <p>
+        * When enabling, original (stored) value is compared to the newer 
value in
+        * the wrapped model and the necessary events are fired
+        * (dirty/valueChanged).
+        * <p>
+        * 
+        * @param deliverValueChangeEvents boolean to enable/disable event
+        * mechanism.
+        */
+       public void setDeliverValueChangeEvents(boolean 
deliverValueChangeEvents) {
+               boolean oldDeliverValueChangeEvents = 
this.deliverValueChangeEvents;
+               this.deliverValueChangeEvents = deliverValueChangeEvents;
+               if (!oldDeliverValueChangeEvents && deliverValueChangeEvents) {
+                       mediatedValueHolder.setValue(getValue());
+                       updateDirtyState();
+               }
+       }
 
-    public boolean isDirty() {
-        return trackDirty && 
getValueChangeDetector().hasValueChanged(originalValue, getValue());
-    }
+       public boolean isDirty() {
+               return trackDirty && 
getValueChangeDetector().hasValueChanged(originalValue, getValue());
+       }
 
-    public void clearDirty() {
-        if (isDirty()) {
-            originalValue = getValue();
-            updateDirtyState();
-        }
-    }
+       public void clearDirty() {
+               if (isDirty()) {
+                       originalValue = getValue();
+                       updateDirtyState();
+               }
+       }
 
-    public void revertToOriginal() {
-        if (isDirty()) {
-            setValue(originalValue);
-        }
-    }
+       public void revertToOriginal() {
+               if (isDirty()) {
+                       setValue(originalValue);
+               }
+       }
 
-    protected void updateDirtyState() {
-        boolean dirty = isDirty();
-        if (oldDirty != dirty) {
-            oldDirty = dirty;
-            firePropertyChange(DIRTY_PROPERTY, !dirty, dirty);
-        }
-    }
+       /**
+        * Check the dirty state and fire events if needed.
+        */
+       protected void updateDirtyState() {
+               boolean dirty = isDirty();
+               if (oldDirty != dirty) {
+                       oldDirty = dirty;
+                       firePropertyChange(DIRTY_PROPERTY, !dirty, dirty);
+               }
+       }
 
-    public void setValueChangeDetector(ValueChangeDetector 
valueChangeDetector) {
-        this.valueChangeDetector = valueChangeDetector;
-    }
+       /**
+        * @param valueChangeDetector set the [EMAIL PROTECTED] 
ValueChangeDetector} to use
+        * when checking the dirty state.
+        */
+       public void setValueChangeDetector(ValueChangeDetector 
valueChangeDetector) {
+               this.valueChangeDetector = valueChangeDetector;
+       }
 
-    protected ValueChangeDetector getValueChangeDetector() {
-        if (valueChangeDetector == null) {
-            valueChangeDetector = 
(ValueChangeDetector)ApplicationServicesLocator.services().getService(ValueChangeDetector.class);
-        }
-        return valueChangeDetector;
-    }
+       /**
+        * @return a [EMAIL PROTECTED] ValueChangeDetector} to use when 
checking the dirty
+        * state.
+        */
+       protected ValueChangeDetector getValueChangeDetector() {
+               if (valueChangeDetector == null) {
+                       valueChangeDetector = (ValueChangeDetector) 
ApplicationServicesLocator.services().getService(
+                                       ValueChangeDetector.class);
+               }
+               return valueChangeDetector;
+       }
 
-    public void addValueChangeListener(PropertyChangeListener listener) {
-        mediatedValueHolder.addValueChangeListener(listener);
-    }
+       public void addValueChangeListener(PropertyChangeListener listener) {
+               mediatedValueHolder.addValueChangeListener(listener);
+       }
 
-    public void removeValueChangeListener(PropertyChangeListener listener) {
-        mediatedValueHolder.removeValueChangeListener(listener);
-    }
+       public void removeValueChangeListener(PropertyChangeListener listener) {
+               mediatedValueHolder.removeValueChangeListener(listener);
+       }
 
-    public void addPropertyChangeListener(PropertyChangeListener listener) {
-        throw new UnsupportedOperationException("not implemented");
-    }
+       public void addPropertyChangeListener(PropertyChangeListener listener) {
+               throw new UnsupportedOperationException("not implemented");
+       }
 
-    public void addPropertyChangeListener(String propertyName, 
PropertyChangeListener listener) {
-        if (DIRTY_PROPERTY.equals(propertyName)) {
-            dirtyChangeListeners.add(listener);
-        }
-        else if (VALUE_PROPERTY.equals(propertyName)) {
-            addValueChangeListener(listener);
-        }
-    }
+       public void addPropertyChangeListener(String propertyName, 
PropertyChangeListener listener) {
+               if (DIRTY_PROPERTY.equals(propertyName)) {
+                       dirtyChangeListeners.add(listener);
+               }
+               else if (VALUE_PROPERTY.equals(propertyName)) {
+                       addValueChangeListener(listener);
+               }
+       }
 
-    public void removePropertyChangeListener(PropertyChangeListener listener) {
-        throw new UnsupportedOperationException("not implemented");
-    }
+       public void removePropertyChangeListener(PropertyChangeListener 
listener) {
+               throw new UnsupportedOperationException("not implemented");
+       }
 
-    public void removePropertyChangeListener(String propertyName, 
PropertyChangeListener listener) {
-        if (DIRTY_PROPERTY.equals(propertyName)) {
-            dirtyChangeListeners.remove(listener);
-        }
-        else if (VALUE_PROPERTY.equals(propertyName)) {
-            removeValueChangeListener(listener);
-        }
-    }
+       public void removePropertyChangeListener(String propertyName, 
PropertyChangeListener listener) {
+               if (DIRTY_PROPERTY.equals(propertyName)) {
+                       dirtyChangeListeners.remove(listener);
+               }
+               else if (VALUE_PROPERTY.equals(propertyName)) {
+                       removeValueChangeListener(listener);
+               }
+       }
 
-    protected final void firePropertyChange(String propertyName, boolean 
oldValue, boolean newValue) {
-        if (DIRTY_PROPERTY.equals(propertyName)) {
-            PropertyChangeEvent evt = new PropertyChangeEvent(this, 
propertyName, Boolean.valueOf(oldValue),
-                    Boolean.valueOf(newValue));
-            for (Iterator i = dirtyChangeListeners.iterator(); i.hasNext();) {
-                ((PropertyChangeListener)i.next()).propertyChange(evt);
-            }
-        }
-    }
+       /**
+        * Handles the dirty event firing.
+        * 
+        * @param propertyName implementation only handles DIRTY_PROPERTY.
+        * @param oldValue
+        * @param newValue
+        */
+       protected final void firePropertyChange(String propertyName, boolean 
oldValue, boolean newValue) {
+               if (DIRTY_PROPERTY.equals(propertyName)) {
+                       PropertyChangeEvent evt = new PropertyChangeEvent(this, 
propertyName, Boolean.valueOf(oldValue), Boolean
+                                       .valueOf(newValue));
+                       for (Iterator i = dirtyChangeListeners.iterator(); 
i.hasNext();) {
+                               ((PropertyChangeListener) 
i.next()).propertyChange(evt);
+                       }
+               }
+       }
 }
\ No newline at end of file


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
spring-rich-c-cvs mailing list
spring-rich-c-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spring-rich-c-cvs

Reply via email to