]> source.dussan.org Git - vaadin-framework.git/commitdiff
#6155 Javadoc/comments; refresh field value from data source on attach
authorJohannes Dahlström <johannes.dahlstrom@vaadin.com>
Wed, 11 Apr 2012 12:07:29 +0000 (12:07 +0000)
committerJohannes Dahlström <johannes.dahlstrom@vaadin.com>
Wed, 11 Apr 2012 12:07:29 +0000 (12:07 +0000)
svn changeset:23476/svn branch:6.8

src/com/vaadin/ui/AbstractField.java

index f3939de6e13927d76f95bc93786fdb6e6cc885b3..e1d32702254e7881cc6d745c854c2c6acd080bf3 100644 (file)
@@ -140,9 +140,14 @@ public abstract class AbstractField extends AbstractComponent implements Field,
     private boolean valueWasModifiedByDataSourceDuringCommit;
 
     /**
-     * Whether this field currently listens to Property events.
+     * Whether this field is currently registered as listening to events from
+     * its data source.
+     * 
+     * @see #setPropertyDataSource(Property)
+     * @see #addPropertyListeners()
+     * @see #removePropertyListeners()
      */
-    private boolean isListening = false;
+    private boolean isListeningToPropertyEvents = false;
 
     /* Component basics */
 
@@ -582,6 +587,17 @@ public abstract class AbstractField extends AbstractComponent implements Field,
      * </p>
      * 
      * <p>
+     * If the data source implements
+     * {@link com.vaadin.data.Property.ValueChangeNotifier} and/or
+     * {@link com.vaadin.data.Property.ReadOnlyStatusChangeNotifier}, the field
+     * registers itself as a listener and updates itself according to the events
+     * it receives. To avoid memory leaks caused by references to a field no
+     * longer in use, the listener registrations are removed on
+     * {@link AbstractField#detach() detach} and re-added on
+     * {@link AbstractField#attach() attach}.
+     * </p>
+     * 
+     * <p>
      * Note: before 6.5 we actually called discard() method in the beginning of
      * the method. This was removed to simplify implementation, avoid excess
      * calls to backing property and to avoid odd value change events that were
@@ -1120,8 +1136,14 @@ public abstract class AbstractField extends AbstractComponent implements Field,
         if (actionManager != null) {
             actionManager.setViewer(getWindow());
         }
-        // No-op if listeners already registered
-        addPropertyListeners();
+
+        if (!isListeningToPropertyEvents) {
+            addPropertyListeners();
+            if (!isModified() && isReadThrough()) {
+                // Update value from data source
+                discard();
+            }
+        }
     }
 
     @Override
@@ -1334,8 +1356,13 @@ public abstract class AbstractField extends AbstractComponent implements Field,
         }
     }
 
+    /**
+     * Registers this as an event listener for events sent by the data source
+     * (if any). Does nothing if
+     * <code>isListeningToPropertyEvents == true</code>.
+     */
     private void addPropertyListeners() {
-        if (!isListening) {
+        if (!isListeningToPropertyEvents) {
             if (dataSource instanceof Property.ValueChangeNotifier) {
                 ((Property.ValueChangeNotifier) dataSource).addListener(this);
             }
@@ -1343,12 +1370,16 @@ public abstract class AbstractField extends AbstractComponent implements Field,
                 ((Property.ReadOnlyStatusChangeNotifier) dataSource)
                         .addListener(this);
             }
-            isListening = true;
+            isListeningToPropertyEvents = true;
         }
     }
 
+    /**
+     * Stops listening to events sent by the data source (if any). Does nothing
+     * if <code>isListeningToPropertyEvents == false</code>.
+     */
     private void removePropertyListeners() {
-        if (isListening) {
+        if (isListeningToPropertyEvents) {
             if (dataSource instanceof Property.ValueChangeNotifier) {
                 ((Property.ValueChangeNotifier) dataSource)
                         .removeListener(this);
@@ -1357,7 +1388,7 @@ public abstract class AbstractField extends AbstractComponent implements Field,
                 ((Property.ReadOnlyStatusChangeNotifier) dataSource)
                         .removeListener(this);
             }
-            isListening = false;
+            isListeningToPropertyEvents = false;
         }
     }
 }
\ No newline at end of file