You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by tv...@apache.org on 2009/09/22 00:02:10 UTC

svn commit: r817432 - in /incubator/pivot/trunk: tutorials/src/org/apache/pivot/tutorials/ wtk/src/org/apache/pivot/wtk/ wtk/src/org/apache/pivot/wtk/skin/terra/

Author: tvolkert
Date: Mon Sep 21 22:02:10 2009
New Revision: 817432

URL: http://svn.apache.org/viewvc?rev=817432&view=rev
Log:
PIVOT-303 :: Added disabled checkmark filter to tree view

Modified:
    incubator/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/KitchenSink.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeViewListener.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java

Modified: incubator/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/KitchenSink.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/KitchenSink.java?rev=817432&r1=817431&r2=817432&view=diff
==============================================================================
--- incubator/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/KitchenSink.java (original)
+++ incubator/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/KitchenSink.java Mon Sep 21 22:02:10 2009
@@ -641,6 +641,13 @@
                         return include;
                     }
                 });
+
+                checkTreeView.setDisabledCheckmarkFilter(new Filter<TreeNode>() {
+                    @Override
+                    public boolean include(TreeNode treeNode) {
+                        return (treeNode instanceof TreeBranch);
+                    }
+                });
             }
 
             return Vote.APPROVE;

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java?rev=817432&r1=817431&r2=817432&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java Mon Sep 21 22:02:10 2009
@@ -433,11 +433,20 @@
         }
 
         @Override
-        public void disabledNodeFilterChanged(TreeView treeView, Filter<?> previousDisabledNodeFilter) {
+        public void disabledNodeFilterChanged(TreeView treeView,
+            Filter<?> previousDisabledNodeFilter) {
             for (TreeViewListener listener : this) {
                 listener.disabledNodeFilterChanged(treeView, previousDisabledNodeFilter);
             }
         }
+
+        @Override
+        public void disabledCheckmarkFilterChanged(TreeView treeView,
+            Filter<?> previousDisabledCheckmarkFilter) {
+            for (TreeViewListener listener : this) {
+                listener.disabledCheckmarkFilterChanged(treeView, previousDisabledCheckmarkFilter);
+            }
+        }
     }
 
     /**
@@ -955,8 +964,9 @@
     private boolean checkmarksEnabled = false;
     private boolean showMixedCheckmarkState = false;
 
-    // Disabled node filter
+    // Filters
     private Filter<?> disabledNodeFilter = null;
+    private Filter<?> disabledCheckmarkFilter = null;
 
     // Handlers
     private BranchHandler rootBranchHandler;
@@ -1734,6 +1744,45 @@
     }
 
     /**
+     * Returns the disabled checkmark filter, which determines which checkboxes
+     * are interactive and which are not. Note that this filter only affects
+     * user interaction; nodes may still be checked programatically despite
+     * their inclusion in this filter. If this filter is set to <tt>null</tt>,
+     * all checkboxes will be interactive.
+     * <p>
+     * <b>Note:</b> this filter is only relavent if
+     * {@link #setCheckmarksEnabled(boolean) checkmarksEnabled} is set to true.
+     *
+     * @return
+     * The disabled checkmark filter, or <tt>null</tt> if no disabled checkmark
+     * filter is set
+     */
+    public Filter<?> getDisabledCheckmarkFilter() {
+        return disabledCheckmarkFilter;
+    }
+
+    /**
+     * Sets the disabled node filter, which determines the disabled state of
+     * all nodes. Disabled nodes are not interactive to the user. Note, however,
+     * that disabled nodes may still be expanded, selected, and checked
+     * <i>programatically</i>. A disabled node may have enabled children.
+     * <p>
+     * If the disabled node filter is set to <tt>null</tt>, all nodes are
+     * enabled.
+     *
+     * @param disabledNodeFilter
+     * The disabled node filter, or <tt>null</tt> for no disabled node filter
+     */
+    public void setDisabledCheckmarkFilter(Filter<?> disabledCheckmarkFilter) {
+        Filter<?> previousDisabledCheckmarkFilter = this.disabledCheckmarkFilter;
+
+        if (previousDisabledCheckmarkFilter !=disabledCheckmarkFilter ) {
+            this.disabledCheckmarkFilter = disabledCheckmarkFilter;
+            treeViewListeners.disabledCheckmarkFilterChanged(this, previousDisabledCheckmarkFilter);
+        }
+    }
+
+    /**
      * Sets the expansion state of the specified branch. If the branch already
      * has the specified expansion state, nothing happens.
      *

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeViewListener.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeViewListener.java?rev=817432&r1=817431&r2=817432&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeViewListener.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeViewListener.java Mon Sep 21 22:02:10 2009
@@ -32,7 +32,8 @@
         }
 
         @Override
-        public void nodeRendererChanged(TreeView treeView, TreeView.NodeRenderer previousNodeRenderer) {
+        public void nodeRendererChanged(TreeView treeView,
+            TreeView.NodeRenderer previousNodeRenderer) {
         }
 
         @Override
@@ -52,7 +53,13 @@
         }
 
         @Override
-        public void disabledNodeFilterChanged(TreeView treeView, Filter<?> previousDisabledNodeFilter) {
+        public void disabledNodeFilterChanged(TreeView treeView,
+            Filter<?> previousDisabledNodeFilter) {
+        }
+
+        @Override
+        public void disabledCheckmarkFilterChanged(TreeView treeView,
+            Filter<?> previousDisabledCheckmarkFilter) {
         }
     }
 
@@ -109,4 +116,13 @@
      * @param previousDisabledNodeFilter
      */
     public void disabledNodeFilterChanged(TreeView treeView, Filter<?> previousDisabledNodeFilter);
+
+    /**
+     * Called when a tree view's disabled checkmark filter has changed.
+     *
+     * @param treeView
+     * @param previousDisabledCheckmarkFilter
+     */
+    public void disabledCheckmarkFilterChanged(TreeView treeView,
+        Filter<?> previousDisabledCheckmarkFilter);
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java?rev=817432&r1=817431&r2=817432&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java Mon Sep 21 22:02:10 2009
@@ -54,16 +54,16 @@
     TreeViewNodeStateListener, TreeViewSelectionListener{
 
     /**
-     * Callback that can be executed on a node info object.
+     * Node info visitor interface.
      */
-    protected interface NodeInfoCallback {
+    protected interface NodeInfoVisitor {
         /**
-         * Called to execute this callback on the specified node info.
+         * Visits the specified node info.
          *
          * @param nodeInfo
-         * The object on which to execute this callback
+         * The object to visit
          */
-        public void run(NodeInfo nodeInfo);
+        public void visit(NodeInfo nodeInfo);
     }
 
     /**
@@ -95,10 +95,12 @@
         public static final byte HIGHLIGHTED_MASK = 1 << 0;
         public static final byte SELECTED_MASK = 1 << 1;
         public static final byte DISABLED_MASK = 1 << 2;
-        public static final byte CHECK_STATE_CHECKED_MASK = 1 << 3;
-        public static final byte CHECK_STATE_MIXED_MASK = 1 << 4;
+        public static final byte CHECKMARK_DISABLED_MASK = 1 << 3;
+        public static final byte CHECK_STATE_CHECKED_MASK = 1 << 4;
+        public static final byte CHECK_STATE_MIXED_MASK = 1 << 5;
 
-        public static final byte CHECK_STATE_MASK = CHECK_STATE_CHECKED_MASK | CHECK_STATE_MIXED_MASK;
+        public static final byte CHECK_STATE_MASK = CHECK_STATE_CHECKED_MASK
+            | CHECK_STATE_MIXED_MASK;
 
         @SuppressWarnings("unchecked")
         public NodeInfo(TreeView treeView, BranchInfo parent, Object data) {
@@ -109,11 +111,19 @@
             depth = (parent == null) ? 0 : parent.depth + 1;
 
             // Newly created nodes are guaranteed to not be selected or checked,
-            // but they may be disabled, so we set that flag appropriately here
+            // but they may be disabled or have their checkmarks disabled, so
+            // we set those flags appropriately here.
+
             Filter<Object> disabledNodeFilter = (Filter<Object>)treeView.getDisabledNodeFilter();
             if (disabledNodeFilter != null) {
                 setDisabled(disabledNodeFilter.include(data));
             }
+
+            Filter<Object> disabledCheckmarkFilter = (Filter<Object>)
+                treeView.getDisabledCheckmarkFilter();
+            if (disabledCheckmarkFilter != null) {
+                setCheckmarkDisabled(disabledCheckmarkFilter.include(data));
+            }
         }
 
         @SuppressWarnings("unchecked")
@@ -182,6 +192,18 @@
             }
         }
 
+        public boolean isCheckmarkDisabled() {
+            return ((fields & CHECKMARK_DISABLED_MASK) != 0);
+        }
+
+        public void setCheckmarkDisabled(boolean checkmarkDisabled) {
+            if (checkmarkDisabled) {
+                fields |= CHECKMARK_DISABLED_MASK;
+            } else {
+                fields &= ~CHECKMARK_DISABLED_MASK;
+            }
+        }
+
         public TreeView.NodeCheckState getCheckState() {
             TreeView.NodeCheckState checkState;
 
@@ -230,7 +252,7 @@
         // Core skin metadata
         protected List<NodeInfo> children = null;
 
-        public static final byte EXPANDED_MASK = 1 << 5;
+        public static final byte EXPANDED_MASK = 1 << 6;
 
         public BranchInfo(TreeView treeView, BranchInfo parent, List<Object> data) {
             super(treeView, parent, data);
@@ -543,6 +565,7 @@
                 }
 
                 CHECKBOX.setState(state);
+                CHECKBOX.setEnabled(!nodeInfo.isCheckmarkDisabled());
                 CHECKBOX.paint(checkboxGraphics);
                 checkboxGraphics.dispose();
 
@@ -564,7 +587,8 @@
             if (showGridLines) {
                 graphics.setPaint(gridColor);
 
-                GraphicsUtilities.drawLine(graphics, 0, nodeY + nodeHeight, width, Orientation.HORIZONTAL);
+                GraphicsUtilities.drawLine(graphics, 0, nodeY + nodeHeight, width,
+                    Orientation.HORIZONTAL);
             }
 
             nodeY += nodeHeight + VERTICAL_SPACING;
@@ -1107,10 +1131,10 @@
      * Executes the specified callback on all node info objects that exist in
      * this skin's node info hierarchy.
      *
-     * @param nodeInfoCallback
+     * @param visitor
      * The callback to execute on each node info object
      */
-    protected final void propagateNodeInfoCallback(NodeInfoCallback nodeInfoCallback) {
+    protected final void accept(NodeInfoVisitor visitor) {
         Sequence<NodeInfo> nodes = new ArrayList<NodeInfo>();
         nodes.add(rootBranchInfo);
 
@@ -1118,7 +1142,7 @@
             NodeInfo nodeInfo = nodes.get(0);
             nodes.remove(0, 1);
 
-            nodeInfoCallback.run(nodeInfo);
+            visitor.visit(nodeInfo);
 
             if (nodeInfo instanceof BranchInfo) {
                 BranchInfo branchInfo = (BranchInfo)nodeInfo;
@@ -1316,9 +1340,9 @@
      * The bitmask specifying which field to clear.
      */
     private void clearFields(final byte mask) {
-        propagateNodeInfoCallback(new NodeInfoCallback() {
+        accept(new NodeInfoVisitor() {
             @Override
-            public void run(NodeInfo nodeInfo) {
+            public void visit(NodeInfo nodeInfo) {
                 nodeInfo.clearField(mask);
             }
         });
@@ -1383,6 +1407,7 @@
 
                 // Only proceed if the user DIDN'T click on a checkbox
                 if (!treeView.getCheckmarksEnabled()
+                    || nodeInfo.isCheckmarkDisabled()
                     || x < nodeX + checkboxX
                     || x >= nodeX + checkboxX + checkboxWidth
                     || y < nodeY + checkboxY
@@ -1468,6 +1493,7 @@
                 int checkboxY = (nodeHeight - checkboxHeight) / 2;
 
                 if (treeView.getCheckmarksEnabled()
+                    && !nodeInfo.isCheckmarkDisabled()
                     && x >= nodeX + checkboxX
                     && x < nodeX + checkboxX + checkboxWidth
                     && y >= nodeY + checkboxY
@@ -1646,7 +1672,12 @@
                 Path selectedPath = treeView.getSelectedPath();
 
                 if (selectedPath != null) {
-                    treeView.setNodeChecked(selectedPath, !treeView.isNodeChecked(selectedPath));
+                    NodeInfo nodeInfo = getNodeInfoAt(selectedPath);
+
+                    if (!nodeInfo.isCheckmarkDisabled()) {
+                        treeView.setNodeChecked(selectedPath,
+                            !treeView.isNodeChecked(selectedPath));
+                    }
                 }
             }
         } else {
@@ -1801,9 +1832,9 @@
     public void disabledNodeFilterChanged(TreeView treeView, Filter<?> previousDisabledNodeFilter) {
         final Filter<Object> disabledNodeFilter = (Filter<Object>)treeView.getDisabledNodeFilter();
 
-        propagateNodeInfoCallback(new NodeInfoCallback() {
+        accept(new NodeInfoVisitor() {
             @Override
-            public void run(NodeInfo nodeInfo) {
+            public void visit(NodeInfo nodeInfo) {
                 nodeInfo.setDisabled(disabledNodeFilter != null
                     && disabledNodeFilter.include(nodeInfo.data));
             }
@@ -1812,6 +1843,24 @@
         repaintComponent();
     }
 
+    @Override
+    @SuppressWarnings("unchecked")
+    public void disabledCheckmarkFilterChanged(TreeView treeView,
+        Filter<?> previousDisabledCheckmarkFilter) {
+        final Filter<Object> disabledCheckmarkFilter = (Filter<Object>)
+            treeView.getDisabledCheckmarkFilter();
+
+        accept(new NodeInfoVisitor() {
+            @Override
+            public void visit(NodeInfo nodeInfo) {
+                nodeInfo.setCheckmarkDisabled(disabledCheckmarkFilter != null
+                    && disabledCheckmarkFilter.include(nodeInfo.data));
+            }
+        });
+
+        repaintComponent();
+    }
+
     // TreeViewBranchListener methods
 
     @Override