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/04 19:54:40 UTC

svn commit: r919126 - in /pivot/trunk: wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java wtk/src/org/apache/pivot/wtk/Button.java wtk/src/org/apache/pivot/wtk/ListView.java wtk/src/org/apache/pivot/wtk/ListViewListener.java

Author: gbrown
Date: Thu Mar  4 18:54:40 2010
New Revision: 919126

URL: http://svn.apache.org/viewvc?rev=919126&view=rev
Log:
Add list data binding to ListView; add support for bind type.


Modified:
    pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/Button.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListViewListener.java

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=919126&r1=919125&r2=919126&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  4 18:54:40 2010
@@ -27,6 +27,7 @@
 import org.apache.pivot.collections.List;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.util.Filter;
+import org.apache.pivot.wtk.BindType;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Checkbox;
 import org.apache.pivot.wtk.Component;
@@ -1065,17 +1066,50 @@
     }
 
     @Override
+    public void listDataKeyChanged(ListView listView, String previousListDataKey) {
+        // No-op
+    }
+
+    @Override
+    public void listDataBindTypeChanged(ListView listView, BindType previousListDataBindType) {
+        // No-op
+    }
+
+    @Override
+    public void listDataBindMappingChanged(ListView listView,
+        ListView.ListDataBindMapping previousListDataBindMapping) {
+        // No-op
+    }
+
+    @Override
     public void selectedItemKeyChanged(ListView listView, String previousSelectedItemKey) {
         // No-op
     }
 
     @Override
+    public void selectedItemBindTypeChanged(ListView listView, BindType previousSelectedItemBindType) {
+        // No-op
+    }
+
+    @Override
+    public void selectedItemBindMappingChanged(ListView listView,
+        ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        // No-op
+    }
+
+    @Override
     public void selectedItemsKeyChanged(ListView listView, String previousSelectedItemsKey) {
         // No-op
     }
 
     @Override
-    public void selectedItemBindMappingChanged(ListView listView, ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+    public void selectedItemsBindTypeChanged(ListView listView, BindType previousSelectedItemsBindType) {
+        // No-op
+    }
+
+    @Override
+    public void selectedItemsBindMappingChanged(ListView listView,
+        ListView.SelectedItemBindMapping previousSelectedItemsBindMapping) {
         // 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=919126&r1=919125&r2=919126&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  4 18:54:40 2010
@@ -557,6 +557,10 @@
     }
 
     public void setSelectedBindType(BindType selectedBindType) {
+        if (selectedBindType == null) {
+            throw new IllegalArgumentException();
+        }
+
         BindType previousSelectedBindType = this.selectedBindType;
 
         if (previousSelectedBindType != selectedBindType) {
@@ -596,6 +600,10 @@
     }
 
     public void setStateBindType(BindType stateBindType) {
+        if (stateBindType == null) {
+            throw new IllegalArgumentException();
+        }
+
         BindType previousStateBindType = this.stateBindType;
 
         if (previousStateBindType != stateBindType) {

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=919126&r1=919125&r2=919126&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  4 18:54:40 2010
@@ -363,6 +363,25 @@
     /**
      * Translates between list and bind context data during data binding.
      */
+    public interface ListDataBindMapping {
+        /**
+         * Converts a context value to list data.
+         *
+         * @param value
+         */
+        public List<?> toListData(Object value);
+
+        /**
+         * Converts list data to a context value.
+         * @param list
+         * @return
+         */
+        public Object valueOf(List<?> list);
+    }
+
+    /**
+     * Translates between selection and bind context data during data binding.
+     */
     public interface SelectedItemBindMapping {
         /**
          * Returns the index of the item in the source list.
@@ -394,8 +413,8 @@
     /**
      * List view listener list.
      */
-    private static class ListViewListenerList extends ListenerList<ListViewListener> implements
-            ListViewListener {
+    private static class ListViewListenerList extends ListenerList<ListViewListener>
+        implements ListViewListener {
         @Override
         public void listDataChanged(ListView listView, List<?> previousListData) {
             for (ListViewListener listener : this) {
@@ -451,6 +470,28 @@
         }
 
         @Override
+        public void listDataKeyChanged(ListView listView, String previousListDataKey) {
+            for (ListViewListener listener : this) {
+                listener.listDataKeyChanged(listView, previousListDataKey);
+            }
+        }
+
+        @Override
+        public void listDataBindTypeChanged(ListView listView, BindType previousListDataBindType) {
+            for (ListViewListener listener : this) {
+                listener.listDataBindTypeChanged(listView, previousListDataBindType);
+            }
+        }
+
+        @Override
+        public void listDataBindMappingChanged(ListView listView,
+            ListView.ListDataBindMapping previousListDataBindMapping) {
+            for (ListViewListener listener : this) {
+                listener.listDataBindMappingChanged(listView, previousListDataBindMapping);
+            }
+        }
+
+        @Override
         public void selectedItemKeyChanged(ListView listView, String previousSelectedItemKey) {
             for (ListViewListener listener : this) {
                 listener.selectedItemKeyChanged(listView, previousSelectedItemKey);
@@ -458,6 +499,21 @@
         }
 
         @Override
+        public void selectedItemBindTypeChanged(ListView listView, BindType previousSelectedItemBindType) {
+            for (ListViewListener listener : this) {
+                listener.selectedItemBindTypeChanged(listView, previousSelectedItemBindType);
+            }
+        }
+
+        @Override
+        public void selectedItemBindMappingChanged(ListView listView,
+            SelectedItemBindMapping previousSelectedItemBindMapping) {
+            for (ListViewListener listener : this) {
+                listener.selectedItemBindMappingChanged(listView, previousSelectedItemBindMapping);
+            }
+        }
+
+        @Override
         public void selectedItemsKeyChanged(ListView listView, String previousSelectedItemsKey) {
             for (ListViewListener listener : this) {
                 listener.selectedItemsKeyChanged(listView, previousSelectedItemsKey);
@@ -465,9 +521,17 @@
         }
 
         @Override
-        public void selectedItemBindMappingChanged(ListView listView, SelectedItemBindMapping previousSelectedItemBindMapping) {
+        public void selectedItemsBindTypeChanged(ListView listView, BindType previousSelectedItemsBindType) {
             for (ListViewListener listener : this) {
-                listener.selectedItemBindMappingChanged(listView, previousSelectedItemBindMapping);
+                listener.selectedItemsBindTypeChanged(listView, previousSelectedItemsBindType);
+            }
+        }
+
+        @Override
+        public void selectedItemsBindMappingChanged(ListView listView,
+            SelectedItemBindMapping previousSelectedItemsBindMapping) {
+            for (ListViewListener listener : this) {
+                listener.selectedItemsBindMappingChanged(listView, previousSelectedItemsBindMapping);
             }
         }
     }
@@ -650,9 +714,15 @@
     private Filter<?> disabledItemFilter = null;
     private Filter<?> disabledCheckmarkFilter = null;
 
+    private String listDataKey = null;
+    private BindType listDataBindType = BindType.BOTH;
+    private ListDataBindMapping listDataBindMapping = null;
     private String selectedItemKey = null;
-    private String selectedItemsKey = null;
+    private BindType selectedItemBindType = BindType.BOTH;
     private SelectedItemBindMapping selectedItemBindMapping = null;
+    private String selectedItemsKey = null;
+    private BindType selectedItemsBindType = BindType.BOTH;
+    private SelectedItemBindMapping selectedItemsBindMapping = null;
 
     private ListViewListenerList listViewListeners = new ListViewListenerList();
     private ListViewItemListenerList listViewItemListeners = new ListViewItemListenerList();
@@ -1447,6 +1517,48 @@
         }
     }
 
+    public String getListDataKey() {
+        return listDataKey;
+    }
+
+    public void setListDataKey(String listDataKey) {
+        String previousListDataKey = this.listDataKey;
+        if (previousListDataKey != listDataKey) {
+            this.listDataKey = listDataKey;
+            listViewListeners.listDataKeyChanged(this, previousListDataKey);
+        }
+    }
+
+    public BindType getListDataBindType() {
+        return listDataBindType;
+    }
+
+    public void setListDataBindType(BindType listDataBindType) {
+        if (listDataBindType == null) {
+            throw new IllegalArgumentException();
+        }
+
+        BindType previousListDataBindType = this.listDataBindType;
+
+        if (previousListDataBindType != listDataBindType) {
+            this.listDataBindType = listDataBindType;
+            listViewListeners.listDataBindTypeChanged(this, previousListDataBindType);
+        }
+    }
+
+    public ListDataBindMapping getListDataBindMapping() {
+        return listDataBindMapping;
+    }
+
+    public void setListDataBindMapping(ListDataBindMapping listDataBindMapping) {
+        ListDataBindMapping previousListDataBindMapping = this.listDataBindMapping;
+
+        if (previousListDataBindMapping != listDataBindMapping) {
+            this.listDataBindMapping = listDataBindMapping;
+            listViewListeners.listDataBindMappingChanged(this, previousListDataBindMapping);
+        }
+    }
+
     public String getSelectedItemKey() {
         return selectedItemKey;
     }
@@ -1460,16 +1572,19 @@
         }
     }
 
-    public String getSelectedItemsKey() {
-        return selectedItemsKey;
+    public BindType getSelectedItemBindType() {
+        return selectedItemBindType;
     }
 
-    public void setSelectedItemsKey(String selectedItemsKey) {
-        String previousSelectedItemsKey = this.selectedItemsKey;
+    public void setSelectedItemBindType(BindType selectedItemBindType) {
+        if (selectedItemBindType == null) {
+            throw new IllegalArgumentException();
+        }
 
-        if (previousSelectedItemsKey != selectedItemsKey) {
-            this.selectedItemsKey = selectedItemsKey;
-            listViewListeners.selectedItemsKeyChanged(this, previousSelectedItemsKey);
+        BindType previousSelectedItemBindType = this.selectedItemBindType;
+        if (previousSelectedItemBindType != selectedItemBindType) {
+            this.selectedItemBindType = selectedItemBindType;
+            listViewListeners.selectedItemBindTypeChanged(this, previousSelectedItemBindType);
         }
     }
 
@@ -1486,86 +1601,184 @@
         }
     }
 
+    public String getSelectedItemsKey() {
+        return selectedItemsKey;
+    }
+
+    public void setSelectedItemsKey(String selectedItemsKey) {
+        String previousSelectedItemsKey = this.selectedItemsKey;
+
+        if (previousSelectedItemsKey != selectedItemsKey) {
+            this.selectedItemsKey = selectedItemsKey;
+            listViewListeners.selectedItemsKeyChanged(this, previousSelectedItemsKey);
+        }
+    }
+
+    public BindType getSelectedItemsBindType() {
+        return selectedItemsBindType;
+    }
+
+    public void setSelectedItemsBindType(BindType selectedItemsBindType) {
+        if (selectedItemsBindType == null) {
+            throw new IllegalArgumentException();
+        }
+
+        BindType previousSelectedItemsBindType = this.selectedItemsBindType;
+        if (previousSelectedItemsBindType != selectedItemsBindType) {
+            this.selectedItemsBindType = selectedItemsBindType;
+            listViewListeners.selectedItemsBindTypeChanged(this, previousSelectedItemsBindType);
+        }
+    }
+
+    public SelectedItemBindMapping getSelectedItemsBindMapping() {
+        return selectedItemsBindMapping;
+    }
+
+    public void setSelectedItemsBindMapping(SelectedItemBindMapping selectedItemsBindMapping) {
+        SelectedItemBindMapping previousSelectedItemsBindMapping = this.selectedItemsBindMapping;
+
+        if (previousSelectedItemsBindMapping != selectedItemsBindMapping) {
+            this.selectedItemsBindMapping = selectedItemsBindMapping;
+            listViewListeners.selectedItemsBindMappingChanged(this, previousSelectedItemsBindMapping);
+        }
+    }
+
     @Override
     @SuppressWarnings("unchecked")
     public void load(Dictionary<String, ?> context) {
-        if (selectedItemKey != null
-            && JSONSerializer.containsKey(context, selectedItemKey)) {
-            Object item = JSONSerializer.get(context, selectedItemKey);
-
-            int index;
-            if (selectedItemBindMapping == null) {
-                index = ((List<Object>)listData).indexOf(item);
+        // Bind to list data
+        if (listDataKey != null
+            && listDataBindType != BindType.STORE
+            && JSONSerializer.containsKey(context, listDataKey)) {
+            Object value = JSONSerializer.get(context, listDataKey);
+
+            List<?> listData;
+            if (listDataBindMapping == null) {
+                listData = (List<?>)value;
             } else {
-                index = selectedItemBindMapping.indexOf(listData, item);
+                listData = listDataBindMapping.toListData(value);
             }
 
-            setSelectedIndex(index);
+            setListData(listData);
         }
 
-        if (selectedItemsKey != null
-            && JSONSerializer.containsKey(context, selectedItemsKey)) {
-            Sequence<Object> items = (Sequence<Object>)JSONSerializer.get(context, selectedItemsKey);
-
-            clearSelection();
+        switch (selectMode) {
+            case SINGLE: {
+                // Bind using selected item key
+                if (selectedItemKey != null
+                    && selectedItemBindType != BindType.STORE
+                    && JSONSerializer.containsKey(context, selectedItemKey)) {
+                    Object item = JSONSerializer.get(context, selectedItemKey);
 
-            for (int i = 0, n = items.getLength(); i < n; i++) {
-                Object item = items.get(i);
+                    int index;
+                    if (selectedItemBindMapping == null) {
+                        index = ((List<Object>)listData).indexOf(item);
+                    } else {
+                        index = selectedItemBindMapping.indexOf(listData, item);
+                    }
 
-                int index;
-                if (selectedItemBindMapping == null) {
-                    index = ((List<Object>)listData).indexOf(item);
-                } else {
-                    index = selectedItemBindMapping.indexOf(listData, item);
+                    setSelectedIndex(index);
                 }
 
-                if (index != -1) {
-                    addSelectedIndex(index);
+                break;
+            }
+
+            case MULTI: {
+                // Bind using selected items key
+                if (selectedItemsKey != null
+                    && selectedItemsBindType != BindType.STORE
+                    && JSONSerializer.containsKey(context, selectedItemsKey)) {
+                    Sequence<Object> items = (Sequence<Object>)JSONSerializer.get(context, selectedItemsKey);
+
+                    clearSelection();
+
+                    for (int i = 0, n = items.getLength(); i < n; i++) {
+                        Object item = items.get(i);
+
+                        int index;
+                        if (selectedItemsBindMapping == null) {
+                            index = ((List<Object>)listData).indexOf(item);
+                        } else {
+                            index = selectedItemsBindMapping.indexOf(listData, item);
+                        }
+
+                        if (index != -1) {
+                            addSelectedIndex(index);
+                        }
+                    }
                 }
+
+                break;
             }
         }
     }
 
     @Override
     public void store(Dictionary<String, ?> context) {
-        if (isEnabled()) {
-            if (selectedItemKey != null) {
-                Object item;
-
-                int selectedIndex = getSelectedIndex();
-                if (selectedIndex == -1) {
-                    item = null;
-                } else {
-                    if (selectedItemBindMapping == null) {
-                        item = listData.get(selectedIndex);
-                    } else {
-                        item = selectedItemBindMapping.get(listData, selectedIndex);
-                    }
-                }
-
-                JSONSerializer.put(context, selectedItemKey, item);
+        // Bind to list data
+        if (listDataKey != null
+            && listDataBindType != BindType.LOAD) {
+
+            Object value;
+            if (listDataBindMapping == null) {
+                value = listData;
+            } else {
+                value = listDataBindMapping.valueOf(listData);
             }
 
-            if (selectedItemsKey != null) {
-                ArrayList<Object> items = new ArrayList<Object>();
+            JSONSerializer.put(context, listDataKey, value);
+        }
 
-                Sequence<Span> selectedRanges = getSelectedRanges();
-                for (int i = 0, n = selectedRanges.getLength(); i < n; i++) {
-                    Span range = selectedRanges.get(i);
+        switch (selectMode) {
+            case SINGLE: {
+                // Bind using selected item key
+                if (selectedItemKey != null
+                    && selectedItemBindType != BindType.LOAD) {
+                    Object item;
 
-                    for (int index = range.start; index <= range.end; index++) {
-                        Object item;
+                    int selectedIndex = getSelectedIndex();
+                    if (selectedIndex == -1) {
+                        item = null;
+                    } else {
                         if (selectedItemBindMapping == null) {
-                            item = listData.get(index);
+                            item = listData.get(selectedIndex);
                         } else {
-                            item = selectedItemBindMapping.get(listData, index);
+                            item = selectedItemBindMapping.get(listData, selectedIndex);
                         }
+                    }
+
+                    JSONSerializer.put(context, selectedItemKey, item);
+                }
+
+                break;
+            }
+
+            case MULTI: {
+                // Bind using selected items key
+                if (selectedItemsKey != null
+                    && selectedItemsBindType != BindType.LOAD) {
+                    ArrayList<Object> items = new ArrayList<Object>();
+
+                    Sequence<Span> selectedRanges = getSelectedRanges();
+                    for (int i = 0, n = selectedRanges.getLength(); i < n; i++) {
+                        Span range = selectedRanges.get(i);
+
+                        for (int index = range.start; index <= range.end; index++) {
+                            Object item;
+                            if (selectedItemsBindMapping == null) {
+                                item = listData.get(index);
+                            } else {
+                                item = selectedItemsBindMapping.get(listData, index);
+                            }
 
-                        items.add(item);
+                            items.add(item);
+                        }
                     }
+
+                    JSONSerializer.put(context, selectedItemsKey, items);
                 }
 
-                JSONSerializer.put(context, selectedItemsKey, items);
+                break;
             }
         }
     }

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=919126&r1=919125&r2=919126&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  4 18:54:40 2010
@@ -58,15 +58,42 @@
         }
 
         @Override
+        public void listDataKeyChanged(ListView listView, String previousListDataKey) {
+        }
+
+        @Override
+        public void listDataBindTypeChanged(ListView listView, BindType previousListDataBindType) {
+        }
+
+        @Override
+        public void listDataBindMappingChanged(ListView listView,
+            ListView.ListDataBindMapping previousListDataBindMapping) {
+        }
+
+        @Override
         public void selectedItemKeyChanged(ListView listView, String previousSelectedItemKey) {
         }
 
         @Override
+        public void selectedItemBindTypeChanged(ListView listView, BindType previousSelectedItemBindType) {
+        }
+
+        @Override
+        public void selectedItemBindMappingChanged(ListView listView,
+            ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        }
+
+        @Override
         public void selectedItemsKeyChanged(ListView listView, String previousSelectedItemsKey) {
         }
 
         @Override
-        public void selectedItemBindMappingChanged(ListView listView, ListView.SelectedItemBindMapping previousSelectedItemBindMapping) {
+        public void selectedItemsBindTypeChanged(ListView listView, BindType previousSelectedItemsBindType) {
+        }
+
+        @Override
+        public void selectedItemsBindMappingChanged(ListView listView,
+            ListView.SelectedItemBindMapping previousSelectedItemsBindMapping) {
         }
     }
 
@@ -127,6 +154,30 @@
         Filter<?> previousDisabledCheckmarkFilter);
 
     /**
+     * Called when a list view's list data key has changed.
+     *
+     * @param listView
+     * @param previousListDataKey
+     */
+    public void listDataKeyChanged(ListView listView, String previousListDataKey);
+
+    /**
+     * Called when a list view's list data bind type has changed.
+     *
+     * @param listView
+     * @param previousListDataBindType
+     */
+    public void listDataBindTypeChanged(ListView listView, BindType previousListDataBindType);
+
+    /**
+     * Called when a list view's list data bind mapping has changed.
+     *
+     * @param listView
+     * @param previousListDataBindMapping
+     */
+    public void listDataBindMappingChanged(ListView listView, ListView.ListDataBindMapping previousListDataBindMapping);
+
+    /**
      * Called when a list view's selected item key has changed.
      *
      * @param listView
@@ -135,6 +186,23 @@
     public void selectedItemKeyChanged(ListView listView, String previousSelectedItemKey);
 
     /**
+     * Called when a list view's selected item bind type has changed.
+     *
+     * @param listView
+     * @param previousSelectedItemBindType
+     */
+    public void selectedItemBindTypeChanged(ListView listView, BindType previousSelectedItemBindType);
+
+    /**
+     * Called when a list view's selected item bind mapping has changed.
+     *
+     * @param listView
+     * @param previousSelectedItemBindMapping
+     */
+    public void selectedItemBindMappingChanged(ListView listView,
+        ListView.SelectedItemBindMapping previousSelectedItemBindMapping);
+
+    /**
      * Called when a list view's selected items key has changed.
      *
      * @param listView
@@ -143,10 +211,19 @@
     public void selectedItemsKeyChanged(ListView listView, String previousSelectedItemsKey);
 
     /**
-     * Called when a list view's bind mapping has changed.
+     * Called when a list view's selected items bind type has changed.
      *
      * @param listView
-     * @param previousSelectedItemBindMapping
+     * @param previousSelectedItemsBindType
+     */
+    public void selectedItemsBindTypeChanged(ListView listView, BindType previousSelectedItemsBindType);
+
+    /**
+     * Called when a list view's selected items bind mapping has changed.
+     *
+     * @param listView
+     * @param previousSelectedItemsBindMapping
      */
-    public void selectedItemBindMappingChanged(ListView listView, ListView.SelectedItemBindMapping previousSelectedItemBindMapping);
+    public void selectedItemsBindMappingChanged(ListView listView,
+        ListView.SelectedItemBindMapping previousSelectedItemsBindMapping);
 }