You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2010/03/11 14:31:06 UTC

svn commit: r921842 - in /pivot/trunk: tests/src/org/apache/pivot/tests/ wtk-terra/src/org/apache/pivot/wtk/skin/terra/ wtk/src/org/apache/pivot/wtk/ wtk/src/org/apache/pivot/wtk/skin/

Author: gbrown
Date: Thu Mar 11 13:31:05 2010
New Revision: 921842

URL: http://svn.apache.org/viewvc?rev=921842&view=rev
Log:
Add support for BindType to Label, TextInput, and TextArea; add support for binding to checked state in ListView.

Modified:
    pivot/trunk/tests/src/org/apache/pivot/tests/DataBindingTest.java
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/Label.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/LabelListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButton.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButtonListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/Spinner.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/SpinnerListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/TextArea.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/TextAreaListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInputListener.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/LabelSkin.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java

Modified: pivot/trunk/tests/src/org/apache/pivot/tests/DataBindingTest.java
URL: http://svn.apache.org/viewvc/pivot/trunk/tests/src/org/apache/pivot/tests/DataBindingTest.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/tests/src/org/apache/pivot/tests/DataBindingTest.java (original)
+++ pivot/trunk/tests/src/org/apache/pivot/tests/DataBindingTest.java Thu Mar 11 13:31:05 2010
@@ -83,7 +83,7 @@ public class DataBindingTest implements 
         }
     }
 
-    public static class TestBindMapping implements ListView.SelectedItemBindMapping, Spinner.SelectedItemBindMapping {
+    public static class TestBindMapping implements ListView.ItemBindMapping, Spinner.ItemBindMapping {
         @SuppressWarnings("unchecked")
         public int indexOf(List<?> list, Object value) {
             int i = 0;

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java Thu Mar 11 13:31:05 2010
@@ -1093,7 +1093,7 @@ public class TerraListViewSkin extends C
 
     @Override
     public void selectedItemBindMappingChanged(ListView listView,
-        ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        ListView.ItemBindMapping previousSelectedItemBindMapping) {
         // No-op
     }
 
@@ -1109,7 +1109,23 @@ public class TerraListViewSkin extends C
 
     @Override
     public void selectedItemsBindMappingChanged(ListView listView,
-        ListView.SelectedItemBindMapping previousSelectedItemsBindMapping) {
+        ListView.ItemBindMapping previousSelectedItemsBindMapping) {
+        // No-op
+    }
+
+    @Override
+    public void checkedItemsKeyChanged(ListView listView, String previousCheckedItemsKey) {
+        // No-op
+    }
+
+    @Override
+    public void checkedItemsBindTypeChanged(ListView listView, BindType previousCheckedItemsBindType) {
+        // No-op
+    }
+
+    @Override
+    public void checkedItemsBindMappingChanged(ListView listView,
+        ListView.ItemBindMapping previousCheckedItemsBindMapping) {
         // No-op
     }
 

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java Thu Mar 11 13:31:05 2010
@@ -861,7 +861,7 @@ public class TerraSpinnerSkin extends Co
     }
 
     @Override
-    public void selectedItemBindMappingChanged(Spinner spinner, Spinner.SelectedItemBindMapping previousSelectedItemBindMapping) {
+    public void selectedItemBindMappingChanged(Spinner spinner, Spinner.ItemBindMapping previousSelectedItemBindMapping) {
         // No-op
     }
 

Modified: pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java (original)
+++ pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java Thu Mar 11 13:31:05 2010
@@ -34,6 +34,7 @@ import java.text.StringCharacterIterator
 
 import org.apache.pivot.collections.Dictionary;
 import org.apache.pivot.wtk.ApplicationContext;
+import org.apache.pivot.wtk.BindType;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Component;
 import org.apache.pivot.wtk.Cursor;
@@ -1356,6 +1357,11 @@ public class TerraTextInputSkin extends 
     }
 
     @Override
+    public void textBindTypeChanged(TextInput textInput, BindType previousTextBindType) {
+        // No-op
+    }
+
+    @Override
     public void textBindMappingChanged(TextInput textInput, TextInput.TextBindMapping previousTextBindMapping) {
         // No-op
     }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java Thu Mar 11 13:31:05 2010
@@ -72,14 +72,16 @@ public abstract class Button extends Com
      */
     public interface SelectedBindMapping {
         /**
-         * Converts a context value to a selection state.
+         * Converts a context value to a selection state during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param value
          */
         public boolean isSelected(Object value);
 
         /**
-         * Converts a selection state to a context value.
+         * Converts a selection state to a context value during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param selected
          */
@@ -91,14 +93,16 @@ public abstract class Button extends Com
      */
     public interface StateBindMapping {
         /**
-         * Converts a context value to a button state.
+         * Converts a context value to a button state during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param value
          */
         public State toState(Object value);
 
         /**
-         * Converts a button state to a context value.
+         * Converts a button state to a context value during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param state
          */

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/Label.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/Label.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/Label.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/Label.java Thu Mar 11 13:31:05 2010
@@ -29,14 +29,16 @@ public class Label extends Component {
      */
     public interface TextBindMapping {
         /**
-         * Converts a value from the bind context to a text representation.
+         * Converts a value from the bind context to a text representation during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param value
          */
         public String toString(Object value);
 
         /**
-         * Converts a text string to a value to be stored in the bind context.
+         * Converts a text string to a value to be stored in the bind context during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param text
          */
@@ -60,6 +62,13 @@ public class Label extends Component {
         }
 
         @Override
+        public void textBindTypeChanged(Label label, BindType previousTextBindType) {
+            for (LabelListener listener : this) {
+                listener.textBindTypeChanged(label, previousTextBindType);
+            }
+        }
+
+        @Override
         public void textBindMappingChanged(Label label, Label.TextBindMapping previousTextBindMapping) {
             for (LabelListener listener : this) {
                 listener.textBindMappingChanged(label, previousTextBindMapping);
@@ -68,7 +77,9 @@ public class Label extends Component {
     }
 
     private String text = null;
+
     private String textKey = null;
+    private BindType textBindType = BindType.BOTH;
     private TextBindMapping textBindMapping = null;
 
     private LabelListenerList labelListeners = new LabelListenerList();
@@ -120,6 +131,19 @@ public class Label extends Component {
         }
     }
 
+    public BindType getTextBindType() {
+        return textBindType;
+    }
+
+    public void setTextBindType(BindType textBindType) {
+        BindType previousTextBindType = this.textBindType;
+        if (previousTextBindType != textBindType) {
+            this.textBindType = textBindType;
+            labelListeners.textBindTypeChanged(this, previousTextBindType);
+        }
+
+    }
+
     public TextBindMapping getTextBindMapping() {
         return textBindMapping;
     }
@@ -136,7 +160,8 @@ public class Label extends Component {
     @Override
     public void load(Dictionary<String, ?> context) {
         if (textKey != null
-            && JSON.containsKey(context, textKey)) {
+            && JSON.containsKey(context, textKey)
+            && textBindType != BindType.STORE) {
             Object value = JSON.get(context, textKey);
 
             if (textBindMapping == null) {
@@ -153,8 +178,8 @@ public class Label extends Component {
 
     @Override
     public void store(Dictionary<String, ?> context) {
-        if (isEnabled()
-            && textKey != null) {
+        if (textKey != null
+            && textBindType != BindType.LOAD) {
             String text = getText();
             JSON.put(context, textKey, (textBindMapping == null) ?
                 text : textBindMapping.valueOf(text));

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/LabelListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/LabelListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/LabelListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/LabelListener.java Thu Mar 11 13:31:05 2010
@@ -33,6 +33,10 @@ public interface LabelListener {
         }
 
         @Override
+        public void textBindTypeChanged(Label label, BindType previousTextBindType) {
+        }
+
+        @Override
         public void textBindMappingChanged(Label label, Label.TextBindMapping previousTextBindMapping) {
         }
     }
@@ -54,6 +58,14 @@ public interface LabelListener {
     public void textKeyChanged(Label label, String previousTextKey);
 
     /**
+     * Called when a label's text bind type has changed.
+     *
+     * @param label
+     * @param previousTextBindType
+     */
+    public void textBindTypeChanged(Label label, BindType previousTextBindType);
+
+    /**
      * Called when a label's bind mapping has changed.
      *
      * @param label

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButton.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButton.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButton.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButton.java Thu Mar 11 13:31:05 2010
@@ -93,7 +93,7 @@ public class ListButton extends Button {
         }
 
         @Override
-        public void selectedItemBindMappingChanged(ListButton listButton, ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        public void selectedItemBindMappingChanged(ListButton listButton, ListView.ItemBindMapping previousSelectedItemBindMapping) {
             for (ListButtonListener listener : this) {
                 listener.selectedItemBindMappingChanged(listButton, previousSelectedItemBindMapping);
             }
@@ -121,7 +121,7 @@ public class ListButton extends Button {
 
     private String selectedItemKey = null;
     private BindType selectedItemBindType = BindType.BOTH;
-    private ListView.SelectedItemBindMapping selectedItemBindMapping = null;
+    private ListView.ItemBindMapping selectedItemBindMapping = null;
 
     private ListButtonListenerList listButtonListeners = new ListButtonListenerList();
     private ListButtonSelectionListenerList listButtonSelectionListeners = new ListButtonSelectionListenerList();
@@ -425,12 +425,12 @@ public class ListButton extends Button {
         }
     }
 
-    public ListView.SelectedItemBindMapping getSelectedItemBindMapping() {
+    public ListView.ItemBindMapping getSelectedItemBindMapping() {
         return selectedItemBindMapping;
     }
 
-    public void setSelectedItemBindMapping(ListView.SelectedItemBindMapping selectedItemBindMapping) {
-        ListView.SelectedItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
+    public void setSelectedItemBindMapping(ListView.ItemBindMapping selectedItemBindMapping) {
+        ListView.ItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
 
         if (previousSelectedItemBindMapping != selectedItemBindMapping) {
             this.selectedItemBindMapping = selectedItemBindMapping;

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButtonListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButtonListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButtonListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/ListButtonListener.java Thu Mar 11 13:31:05 2010
@@ -62,7 +62,7 @@ public interface ListButtonListener {
 
         @Override
         public void selectedItemBindMappingChanged(ListButton listButton,
-            ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+            ListView.ItemBindMapping previousSelectedItemBindMapping) {
         }
     }
 
@@ -137,5 +137,5 @@ public interface ListButtonListener {
      * @param previousSelectedItemBindMapping
      */
     public void selectedItemBindMappingChanged(ListButton listButton,
-        ListView.SelectedItemBindMapping previousSelectedItemBindMapping);
+        ListView.ItemBindMapping previousSelectedItemBindMapping);
 }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java Thu Mar 11 13:31:05 2010
@@ -366,14 +366,16 @@ public class ListView extends Component 
      */
     public interface ListDataBindMapping {
         /**
-         * Converts a context value to list data.
+         * Converts a context value to list data during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param value
          */
         public List<?> toListData(Object value);
 
         /**
-         * Converts list data to a context value.
+         * Converts list data to a context value during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param listData
          */
@@ -381,11 +383,12 @@ public class ListView extends Component 
     }
 
     /**
-     * Translates between selection and bind context data during data binding.
+     * Translates between item position and bind context data during data binding.
      */
-    public interface SelectedItemBindMapping {
+    public interface ItemBindMapping {
         /**
-         * Returns the index of the item in the source list.
+         * Returns the index of the item in the source list during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param listData
          * The source list data.
@@ -400,7 +403,8 @@ public class ListView extends Component 
         public int indexOf(List<?> listData, Object value);
 
         /**
-         * Retrieves the value at the given index.
+         * Retrieves the value at the given index during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param listData
          * The source list data.
@@ -508,7 +512,7 @@ public class ListView extends Component 
 
         @Override
         public void selectedItemBindMappingChanged(ListView listView,
-            SelectedItemBindMapping previousSelectedItemBindMapping) {
+            ItemBindMapping previousSelectedItemBindMapping) {
             for (ListViewListener listener : this) {
                 listener.selectedItemBindMappingChanged(listView, previousSelectedItemBindMapping);
             }
@@ -530,11 +534,33 @@ public class ListView extends Component 
 
         @Override
         public void selectedItemsBindMappingChanged(ListView listView,
-            SelectedItemBindMapping previousSelectedItemsBindMapping) {
+            ItemBindMapping previousSelectedItemsBindMapping) {
             for (ListViewListener listener : this) {
                 listener.selectedItemsBindMappingChanged(listView, previousSelectedItemsBindMapping);
             }
         }
+
+        @Override
+        public void checkedItemsKeyChanged(ListView listView, String previousCheckedItemsKey) {
+            for (ListViewListener listener : this) {
+                listener.checkedItemsKeyChanged(listView, previousCheckedItemsKey);
+            }
+        }
+
+        @Override
+        public void checkedItemsBindTypeChanged(ListView listView, BindType previousCheckedItemsBindType) {
+            for (ListViewListener listener : this) {
+                listener.checkedItemsBindTypeChanged(listView, previousCheckedItemsBindType);
+            }
+        }
+
+        @Override
+        public void checkedItemsBindMappingChanged(ListView listView,
+            ListView.ItemBindMapping previousCheckedItemsBindMapping) {
+            for (ListViewListener listener : this) {
+                listener.checkedItemsBindMappingChanged(listView, previousCheckedItemsBindMapping);
+            }
+        }
     }
 
     /**
@@ -638,11 +664,15 @@ public class ListView extends Component 
 
     private String selectedItemKey = null;
     private BindType selectedItemBindType = BindType.BOTH;
-    private SelectedItemBindMapping selectedItemBindMapping = null;
+    private ItemBindMapping selectedItemBindMapping = null;
 
     private String selectedItemsKey = null;
     private BindType selectedItemsBindType = BindType.BOTH;
-    private SelectedItemBindMapping selectedItemsBindMapping = null;
+    private ItemBindMapping selectedItemsBindMapping = null;
+
+    private String checkedItemsKey = null;
+    private BindType checkedItemsBindType = BindType.BOTH;
+    private ItemBindMapping checkedItemsBindMapping = null;
 
     private ListListener<Object> listDataListener = new ListListener<Object>() {
         @Override
@@ -1409,6 +1439,18 @@ public class ListView extends Component 
     }
 
     /**
+     * Clears the checked state of all checked items.
+     */
+    public void clearCheckmarks() {
+        ArrayList<Integer> checkedIndexes = this.checkedIndexes;
+        this.checkedIndexes = new ArrayList<Integer>();
+
+        for (Integer index : checkedIndexes) {
+            listViewItemStateListeners.itemCheckedChanged(this, index);
+        }
+    }
+
+    /**
      * Tells whether or not an item's checkmark is disabled.
      *
      * @param index
@@ -1591,12 +1633,12 @@ public class ListView extends Component 
         }
     }
 
-    public SelectedItemBindMapping getSelectedItemBindMapping() {
+    public ItemBindMapping getSelectedItemBindMapping() {
         return selectedItemBindMapping;
     }
 
-    public void setSelectedItemBindMapping(SelectedItemBindMapping selectedItemBindMapping) {
-        SelectedItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
+    public void setSelectedItemBindMapping(ItemBindMapping selectedItemBindMapping) {
+        ItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
 
         if (previousSelectedItemBindMapping != selectedItemBindMapping) {
             this.selectedItemBindMapping = selectedItemBindMapping;
@@ -1633,12 +1675,12 @@ public class ListView extends Component 
         }
     }
 
-    public SelectedItemBindMapping getSelectedItemsBindMapping() {
+    public ItemBindMapping getSelectedItemsBindMapping() {
         return selectedItemsBindMapping;
     }
 
-    public void setSelectedItemsBindMapping(SelectedItemBindMapping selectedItemsBindMapping) {
-        SelectedItemBindMapping previousSelectedItemsBindMapping = this.selectedItemsBindMapping;
+    public void setSelectedItemsBindMapping(ItemBindMapping selectedItemsBindMapping) {
+        ItemBindMapping previousSelectedItemsBindMapping = this.selectedItemsBindMapping;
 
         if (previousSelectedItemsBindMapping != selectedItemsBindMapping) {
             this.selectedItemsBindMapping = selectedItemsBindMapping;
@@ -1646,6 +1688,48 @@ public class ListView extends Component 
         }
     }
 
+    public String getCheckedItemsKey() {
+        return checkedItemsKey;
+    }
+
+    public void setCheckedItemsKey(String checkedItemsKey) {
+        String previousCheckedItemsKey = this.checkedItemsKey;
+
+        if (previousCheckedItemsKey != checkedItemsKey) {
+            this.checkedItemsKey = checkedItemsKey;
+            listViewListeners.checkedItemsKeyChanged(this, previousCheckedItemsKey);
+        }
+    }
+
+    public BindType getCheckedItemsBindType() {
+        return checkedItemsBindType;
+    }
+
+    public void setCheckedItemsBindType(BindType checkedItemsBindType) {
+        if (checkedItemsBindType == null) {
+            throw new IllegalArgumentException();
+        }
+
+        BindType previousCheckedItemsBindType = this.checkedItemsBindType;
+        if (previousCheckedItemsBindType != checkedItemsBindType) {
+            this.checkedItemsBindType = checkedItemsBindType;
+            listViewListeners.checkedItemsBindTypeChanged(this, previousCheckedItemsBindType);
+        }
+    }
+
+    public ItemBindMapping getCheckedItemsBindMapping() {
+        return checkedItemsBindMapping;
+    }
+
+    public void setCheckedItemsBindMapping(ItemBindMapping checkedItemsBindMapping) {
+        ItemBindMapping previousCheckedItemsBindMapping = this.checkedItemsBindMapping;
+
+        if (previousCheckedItemsBindMapping != checkedItemsBindMapping) {
+            this.checkedItemsBindMapping = checkedItemsBindMapping;
+            listViewListeners.checkedItemsBindMappingChanged(this, previousCheckedItemsBindMapping);
+        }
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public void load(Dictionary<String, ?> context) {
@@ -1714,6 +1798,31 @@ public class ListView extends Component 
                 break;
             }
         }
+
+        if (checkmarksEnabled) {
+            if (checkedItemsKey != null
+                && JSON.containsKey(context, checkedItemsKey)
+                && checkedItemsBindType != BindType.STORE) {
+                Sequence<Object> items = (Sequence<Object>)JSON.get(context, checkedItemsKey);
+
+                clearCheckmarks();
+
+                for (int i = 0, n = items.getLength(); i < n; i++) {
+                    Object item = items.get(i);
+
+                    int index;
+                    if (checkedItemsBindMapping == null) {
+                        index = ((List<Object>)listData).indexOf(item);
+                    } else {
+                        index = checkedItemsBindMapping.indexOf(listData, item);
+                    }
+
+                    if (index != -1) {
+                        setItemChecked(index, true);
+                    }
+                }
+            }
+        }
     }
 
     @Override
@@ -1784,6 +1893,29 @@ public class ListView extends Component 
                 break;
             }
         }
+
+        if (checkmarksEnabled) {
+            if (checkedItemsKey != null
+                && JSON.containsKey(context, checkedItemsKey)
+                && checkedItemsBindType != BindType.LOAD) {
+                ArrayList<Object> items = new ArrayList<Object>();
+
+                for (int i = 0, n = checkedIndexes.getLength(); i < n; i++) {
+                    Integer index = checkedIndexes.get(i);
+
+                    Object item;
+                    if (checkedItemsBindMapping == null) {
+                        item = listData.get(index);
+                    } else {
+                        item = checkedItemsBindMapping.get(listData, index);
+                    }
+
+                    items.add(item);
+                }
+
+                JSON.put(context, checkedItemsKey, items);
+            }
+        }
     }
 
     @Override
@@ -1796,6 +1928,10 @@ public class ListView extends Component 
             || selectedItemsKey != null) {
             setSelectedItem(null);
         }
+
+        if (checkedItemsKey != null) {
+            clearCheckmarks();
+        }
     }
 
     /**

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java Thu Mar 11 13:31:05 2010
@@ -80,7 +80,7 @@ public interface ListViewListener {
 
         @Override
         public void selectedItemBindMappingChanged(ListView listView,
-            ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+            ListView.ItemBindMapping previousSelectedItemBindMapping) {
         }
 
         @Override
@@ -93,7 +93,20 @@ public interface ListViewListener {
 
         @Override
         public void selectedItemsBindMappingChanged(ListView listView,
-            ListView.SelectedItemBindMapping previousSelectedItemsBindMapping) {
+            ListView.ItemBindMapping previousSelectedItemsBindMapping) {
+        }
+
+        @Override
+        public void checkedItemsKeyChanged(ListView listView, String previousCheckedItemsKey) {
+        }
+
+        @Override
+        public void checkedItemsBindTypeChanged(ListView listView, BindType previousCheckedItemsBindType) {
+        }
+
+        @Override
+        public void checkedItemsBindMappingChanged(ListView listView,
+            ListView.ItemBindMapping previousCheckedItemsBindMapping) {
         }
     }
 
@@ -200,7 +213,7 @@ public interface ListViewListener {
      * @param previousSelectedItemBindMapping
      */
     public void selectedItemBindMappingChanged(ListView listView,
-        ListView.SelectedItemBindMapping previousSelectedItemBindMapping);
+        ListView.ItemBindMapping previousSelectedItemBindMapping);
 
     /**
      * Called when a list view's selected items key has changed.
@@ -225,5 +238,30 @@ public interface ListViewListener {
      * @param previousSelectedItemsBindMapping
      */
     public void selectedItemsBindMappingChanged(ListView listView,
-        ListView.SelectedItemBindMapping previousSelectedItemsBindMapping);
+        ListView.ItemBindMapping previousSelectedItemsBindMapping);
+
+    /**
+     * Called when a list view's checked items key has changed.
+     *
+     * @param listView
+     * @param previousCheckedItemsKey
+     */
+    public void checkedItemsKeyChanged(ListView listView, String previousCheckedItemsKey);
+
+    /**
+     * Called when a list view's checked items bind type has changed.
+     *
+     * @param listView
+     * @param previousCheckedItemsBindType
+     */
+    public void checkedItemsBindTypeChanged(ListView listView, BindType previousCheckedItemsBindType);
+
+    /**
+     * Called when a list view's checked items bind mapping has changed.
+     *
+     * @param listView
+     * @param previousCheckedItemsBindMapping
+     */
+    public void checkedItemsBindMappingChanged(ListView listView,
+        ListView.ItemBindMapping previousCheckedItemsBindMapping);
 }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/Spinner.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/Spinner.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/Spinner.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/Spinner.java Thu Mar 11 13:31:05 2010
@@ -75,9 +75,10 @@ public class Spinner extends Container {
     /**
      * Translates between spinner and bind context data during data binding.
      */
-    public interface SelectedItemBindMapping {
+    public interface ItemBindMapping {
         /**
-         * Returns the index of the item in the source list.
+         * Returns the index of the item in the source list during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param spinnerData
          * The source spinner data.
@@ -92,7 +93,8 @@ public class Spinner extends Container {
         public int indexOf(List<?> spinnerData, Object value);
 
         /**
-         * Retrieves the item at the given index.
+         * Retrieves the item at the given index during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param spinnerData
          * The source spinner data.
@@ -189,7 +191,7 @@ public class Spinner extends Container {
         }
 
         @Override
-        public void selectedItemBindMappingChanged(Spinner spinner, SelectedItemBindMapping previousSelectedItemBindMapping) {
+        public void selectedItemBindMappingChanged(Spinner spinner, ItemBindMapping previousSelectedItemBindMapping) {
             for (SpinnerListener listener : this) {
                 listener.selectedItemBindMappingChanged(spinner, previousSelectedItemBindMapping);
             }
@@ -259,7 +261,7 @@ public class Spinner extends Container {
     private boolean circular = false;
     private int selectedIndex = -1;
     private String selectedItemKey = null;
-    private SelectedItemBindMapping selectedItemBindMapping = null;
+    private ItemBindMapping selectedItemBindMapping = null;
 
     private SpinnerListenerList spinnerListeners = new SpinnerListenerList();
     private SpinnerItemListenerList spinnerItemListeners = new SpinnerItemListenerList();
@@ -448,12 +450,12 @@ public class Spinner extends Container {
         }
     }
 
-    public SelectedItemBindMapping getSelectedItemBindMapping() {
+    public ItemBindMapping getSelectedItemBindMapping() {
         return selectedItemBindMapping;
     }
 
-    public void setSelectedItemBindMapping(SelectedItemBindMapping selectedItemBindMapping) {
-        SelectedItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
+    public void setSelectedItemBindMapping(ItemBindMapping selectedItemBindMapping) {
+        ItemBindMapping previousSelectedItemBindMapping = this.selectedItemBindMapping;
 
         if (previousSelectedItemBindMapping != selectedItemBindMapping) {
             this.selectedItemBindMapping = selectedItemBindMapping;

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/SpinnerListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/SpinnerListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/SpinnerListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/SpinnerListener.java Thu Mar 11 13:31:05 2010
@@ -43,7 +43,7 @@ public interface SpinnerListener {
         }
 
         @Override
-        public void selectedItemBindMappingChanged(Spinner spinner, Spinner.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        public void selectedItemBindMappingChanged(Spinner spinner, Spinner.ItemBindMapping previousSelectedItemBindMapping) {
         }
     }
 
@@ -84,5 +84,5 @@ public interface SpinnerListener {
      * @param spinner
      * @param previousSelectedItemBindMapping
      */
-    public void selectedItemBindMappingChanged(Spinner spinner, Spinner.SelectedItemBindMapping previousSelectedItemBindMapping);
+    public void selectedItemBindMappingChanged(Spinner spinner, Spinner.ItemBindMapping previousSelectedItemBindMapping);
 }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/TextArea.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextArea.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/TextArea.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/TextArea.java Thu Mar 11 13:31:05 2010
@@ -99,6 +99,27 @@ public class TextArea extends Component 
         public Bounds getCharacterBounds(int offset);
     }
 
+    /**
+     * Translates between text and context data during data binding.
+     */
+    public interface TextBindMapping {
+        /**
+         * Converts a value from the bind context to a text representation during a
+         * {@link Component#load(Dictionary)} operation.
+         *
+         * @param value
+         */
+        public String toString(Object value);
+
+        /**
+         * Converts a text string to a value to be stored in the bind context during a
+         * {@link Component#store(Dictionary)} operation.
+         *
+         * @param text
+         */
+        public Object valueOf(String text);
+    }
+
     private static class TextAreaListenerList extends ListenerList<TextAreaListener>
         implements TextAreaListener {
         @Override
@@ -121,6 +142,20 @@ public class TextArea extends Component 
                 listener.textKeyChanged(textArea, previousTextKey);
             }
         }
+
+        @Override
+        public void textBindTypeChanged(TextArea textArea, BindType previousTextBindType) {
+            for (TextAreaListener listener : this) {
+                listener.textBindTypeChanged(textArea, previousTextBindType);
+            }
+        }
+
+        @Override
+        public void textBindMappingChanged(TextArea textArea, TextBindMapping previousTextBindMapping) {
+            for (TextAreaListener listener : this) {
+                listener.textBindMappingChanged(textArea, previousTextBindMapping);
+            }
+        }
     }
 
     private static class TextAreaCharacterListenerList extends ListenerList<TextAreaCharacterListener>
@@ -157,7 +192,10 @@ public class TextArea extends Component 
     private int selectionLength = 0;
 
     private boolean editable = true;
+
     private String textKey = null;
+    private BindType textBindType = BindType.BOTH;
+    private TextBindMapping textBindMapping = null;
 
     private NodeListener documentListener = new NodeListener() {
         @Override
@@ -779,13 +817,45 @@ public class TextArea extends Component 
         }
     }
 
+    public BindType getTextBindType() {
+        return textBindType;
+    }
+
+    public void setTextBindType(BindType textBindType) {
+        BindType previousTextBindType = this.textBindType;
+        if (previousTextBindType != textBindType) {
+            this.textBindType = textBindType;
+            textAreaListeners.textBindTypeChanged(this, previousTextBindType);
+        }
+
+    }
+
+    public TextBindMapping getTextBindMapping() {
+        return textBindMapping;
+    }
+
+    public void setTextBindMapping(TextBindMapping textBindMapping) {
+        TextBindMapping previousTextBindMapping = this.textBindMapping;
+
+        if (previousTextBindMapping != textBindMapping) {
+            this.textBindMapping = textBindMapping;
+            textAreaListeners.textBindMappingChanged(this, previousTextBindMapping);
+        }
+    }
+
     @Override
     public void load(Dictionary<String, ?> context) {
         if (textKey != null
-            && JSON.containsKey(context, textKey)) {
+            && JSON.containsKey(context, textKey)
+            && textBindType != BindType.STORE) {
             Object value = JSON.get(context, textKey);
-            if (value != null) {
-                value = value.toString();
+
+            if (textBindMapping == null) {
+                if (value != null) {
+                    value = value.toString();
+                }
+            } else {
+                value = textBindMapping.toString(value);
             }
 
             setText((String)value);
@@ -794,9 +864,11 @@ public class TextArea extends Component 
 
     @Override
     public void store(Dictionary<String, ?> context) {
-        if (isEnabled()
-            && textKey != null) {
-            JSON.put(context, textKey, getText());
+        if (textKey != null
+            && textBindType != BindType.LOAD) {
+            String text = getText();
+            JSON.put(context, textKey, (textBindMapping == null) ?
+                text : textBindMapping.valueOf(text));
         }
     }
 

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/TextAreaListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextAreaListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/TextAreaListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/TextAreaListener.java Thu Mar 11 13:31:05 2010
@@ -37,6 +37,14 @@ public interface TextAreaListener {
         @Override
         public void textKeyChanged(TextArea textArea, String previousTextKey) {
         }
+
+        @Override
+        public void textBindTypeChanged(TextArea textArea, BindType previousTextBindType) {
+        }
+
+        @Override
+        public void textBindMappingChanged(TextArea textArea, TextArea.TextBindMapping previousTextBindMapping) {
+        }
     }
 
     /**
@@ -64,4 +72,20 @@ public interface TextAreaListener {
      * @param previousTextKey
      */
     public void textKeyChanged(TextArea textArea, String previousTextKey);
+
+    /**
+     * Called when a text area's text bind type has changed.
+     *
+     * @param textArea
+     * @param previousTextBindType
+     */
+    public void textBindTypeChanged(TextArea textArea, BindType previousTextBindType);
+
+    /**
+     * Called when a text area's bind mapping has changed.
+     *
+     * @param textArea
+     * @param previousTextBindMapping
+     */
+    public void textBindMappingChanged(TextArea textArea, TextArea.TextBindMapping previousTextBindMapping);
 }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInput.java Thu Mar 11 13:31:05 2010
@@ -64,14 +64,16 @@ public class TextInput extends Component
      */
     public interface TextBindMapping {
         /**
-         * Converts a value from the bind context to a text representation.
+         * Converts a value from the bind context to a text representation during a
+         * {@link Component#load(Dictionary)} operation.
          *
          * @param value
          */
         public String toString(Object value);
 
         /**
-         * Converts a text string to a value to be stored in the bind context.
+         * Converts a text string to a value to be stored in the bind context during a
+         * {@link Component#store(Dictionary)} operation.
          *
          * @param text
          */
@@ -123,6 +125,13 @@ public class TextInput extends Component
         }
 
         @Override
+        public void textBindTypeChanged(TextInput textInput, BindType previousTextBindType) {
+            for (TextInputListener listener : this) {
+                listener.textBindTypeChanged(textInput, previousTextBindType);
+            }
+        }
+
+        @Override
         public void textBindMappingChanged(TextInput textInput, TextInput.TextBindMapping previousTextBindMapping) {
             for (TextInputListener listener : this) {
                 listener.textBindMappingChanged(textInput, previousTextBindMapping);
@@ -195,6 +204,7 @@ public class TextInput extends Component
     private String prompt = null;
 
     private String textKey = null;
+    private BindType textBindType = BindType.BOTH;
     private TextBindMapping textBindMapping = null;
 
     private Validator validator = null;
@@ -740,6 +750,19 @@ public class TextInput extends Component
         }
     }
 
+    public BindType getTextBindType() {
+        return textBindType;
+    }
+
+    public void setTextBindType(BindType textBindType) {
+        BindType previousTextBindType = this.textBindType;
+        if (previousTextBindType != textBindType) {
+            this.textBindType = textBindType;
+            textInputListeners.textBindTypeChanged(this, previousTextBindType);
+        }
+
+    }
+
     public TextBindMapping getTextBindMapping() {
         return textBindMapping;
     }
@@ -756,7 +779,8 @@ public class TextInput extends Component
     @Override
     public void load(Dictionary<String, ?> context) {
         if (textKey != null
-            && JSON.containsKey(context, textKey)) {
+            && JSON.containsKey(context, textKey)
+            && textBindType != BindType.STORE) {
             Object value = JSON.get(context, textKey);
 
             if (textBindMapping == null) {
@@ -773,8 +797,8 @@ public class TextInput extends Component
 
     @Override
     public void store(Dictionary<String, ?> context) {
-        if (isEnabled()
-            && textKey != null) {
+        if (textKey != null
+            && textBindType != BindType.LOAD) {
             String text = getText();
             JSON.put(context, textKey, (textBindMapping == null) ?
                 text : textBindMapping.valueOf(text));
@@ -784,7 +808,7 @@ public class TextInput extends Component
     @Override
     public void clear() {
         if (textKey != null) {
-            setText("");
+            setText(null);
         }
     }
 

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInputListener.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInputListener.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInputListener.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/TextInputListener.java Thu Mar 11 13:31:05 2010
@@ -52,6 +52,10 @@ public interface TextInputListener {
         }
 
         @Override
+        public void textBindTypeChanged(TextInput textInput, BindType previousTextBindType) {
+        }
+
+        @Override
         public void textBindMappingChanged(TextInput textInput, TextInput.TextBindMapping previousTextBindMapping) {
         }
 
@@ -115,6 +119,14 @@ public interface TextInputListener {
     public void textKeyChanged(TextInput textInput, String previousTextKey);
 
     /**
+     * Called when a text input's text bind type has changed.
+     *
+     * @param textInput
+     * @param previousTextBindType
+     */
+    public void textBindTypeChanged(TextInput textInput, BindType previousTextBindType);
+
+    /**
      * Called when a text input's bind mapping has changed.
      *
      * @param textInput

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/LabelSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/LabelSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/LabelSkin.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/LabelSkin.java Thu Mar 11 13:31:05 2010
@@ -31,6 +31,7 @@ import java.text.StringCharacterIterator
 
 import org.apache.pivot.collections.ArrayList;
 import org.apache.pivot.collections.Dictionary;
+import org.apache.pivot.wtk.BindType;
 import org.apache.pivot.wtk.Component;
 import org.apache.pivot.wtk.Dimensions;
 import org.apache.pivot.wtk.GraphicsUtilities;
@@ -590,6 +591,11 @@ public class LabelSkin extends Component
     }
 
     @Override
+    public void textBindTypeChanged(Label label, BindType previousTextBindType) {
+        // No-op
+    }
+
+    @Override
     public void textBindMappingChanged(Label label, Label.TextBindMapping previousTextBindMapping) {
         // No-op
     }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java Thu Mar 11 13:31:05 2010
@@ -373,7 +373,7 @@ public abstract class ListButtonSkin ext
     }
 
     @Override
-    public void selectedItemBindMappingChanged(ListButton listButton, ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+    public void selectedItemBindMappingChanged(ListButton listButton, ListView.ItemBindMapping previousSelectedItemBindMapping) {
         // No-op
     }
 

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java?rev=921842&r1=921841&r2=921842&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java Thu Mar 11 13:31:05 2010
@@ -36,6 +36,7 @@ import org.apache.pivot.collections.Dict
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.ImmutableIterator;
 import org.apache.pivot.wtk.ApplicationContext;
+import org.apache.pivot.wtk.BindType;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Component;
 import org.apache.pivot.wtk.Cursor;
@@ -2294,6 +2295,16 @@ public class TextAreaSkin extends Compon
         // No-op
     }
 
+    @Override
+    public void textBindTypeChanged(TextArea textArea, BindType previousTextBindType) {
+        // No-op
+    }
+
+    @Override
+    public void textBindMappingChanged(TextArea textArea, TextArea.TextBindMapping previousTextBindMapping) {
+        // No-op
+    }
+
     // Text area selection events
     @Override
     public void selectionChanged(TextArea textArea, int previousSelectionStart,