You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@click.apache.org by sa...@apache.org on 2009/01/04 22:20:13 UTC

svn commit: r731362 - /incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java

Author: sabob
Date: Sun Jan  4 13:20:13 2009
New Revision: 731362

URL: http://svn.apache.org/viewvc?rev=731362&view=rev
Log:
added methods for easier customization

Modified:
    incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java

Modified: incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java
URL: http://svn.apache.org/viewvc/incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java?rev=731362&r1=731361&r2=731362&view=diff
==============================================================================
--- incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java (original)
+++ incubator/click/trunk/click/extras/src/net/sf/click/extras/tree/CheckboxTree.java Sun Jan  4 13:20:13 2009
@@ -164,7 +164,6 @@
      */
     public CheckboxTree(String name) {
         super(name);
-        setDecorator(new DecoratorFactory().createDecorator());
     }
 
     /**
@@ -173,12 +172,22 @@
      * <b>Please note</b> the control's name must be defined before it is valid.
      */
     public CheckboxTree() {
-        setDecorator(new DecoratorFactory().createDecorator());
     }
 
     // --------------------------------------------------------- Public getters and setters
 
     /**
+     * Create and set the Tree's decorator that will render a Checkbox for
+     * each tree node.
+     *
+     * @see #createDecorator()
+     * @see net.sf.click.Control#onInit()
+     */
+    public void onInit() {
+        setDecorator(createDecorator());
+    }
+
+    /**
      * Returns true if child nodes will also be selected/deselected.
      *
      * @return true if child nodes will be selected, false otherwise
@@ -345,88 +354,117 @@
     //------------------------------------------------------------Inner classes
 
     /**
-     * Demonstrates the usage of a decorator to provide custom tree node
-     * rendering.
+     * Creates and returns a custom {@link Decorator} that will render a Checkbox
+     * for each tree node.
+     *
+     * @return a decorator that renders a Checkbox for each tree node
      */
-    protected class DecoratorFactory {
+    protected Decorator createDecorator() {
+        return new Decorator() {
 
-        /**
-         * Creates and returns a custom created {@link Decorator}.
-         *
-         * @return custom defined rendering of the tree node
-         */
-        protected Decorator createDecorator() {
-            return new Decorator() {
-                public String render(Object object, Context context) {
-                    TreeNode treeNode = (TreeNode) object;
-                    HtmlStringBuffer buffer = new HtmlStringBuffer();
+            public String render(Object object, Context context) {
+                TreeNode treeNode = (TreeNode) object;
+                HtmlStringBuffer buffer = new HtmlStringBuffer();
 
-                    renderIcon(buffer, treeNode);
+                renderIcon(buffer, treeNode);
 
-                    buffer.append("<input ");
-                    if (isJavascriptEnabled()) {
-                        ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderCheckbox(buffer);
-                    }
-                    buffer.append(" style=\"margin:0\" type=\"checkbox\"");
-                    buffer.appendAttribute("name", SELECT_TREE_NODE_PARAM);
-                    buffer.appendAttribute("value", treeNode.getId());
+                renderCheckbox(buffer, treeNode);
 
-                    if (treeNode.isSelected()) {
-                        buffer.appendAttribute("checked", "checked");
-                    }
+                buffer.elementStart("span");
+                if (treeNode.isSelected()) {
+                    buffer.appendAttribute("class", "selected");
+                } else {
+                    buffer.appendAttribute("class", "unselected");
+                }
+                if (isJavascriptEnabled()) {
+                    ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderSelect(
+                        buffer);
+                }
+                buffer.closeTag();
 
-                    buffer.elementEnd();
+                renderValue(buffer, treeNode);
+                buffer.elementEnd("span");
 
-                    buffer.elementStart("span");
-                    if (treeNode.isSelected()) {
-                        buffer.appendAttribute("class", "selected");
-                    } else {
-                        buffer.appendAttribute("class", "unselected");
-                    }
-                    if (isJavascriptEnabled()) {
-                        ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderSelect(buffer);
-                    }
-                    buffer.closeTag();
+                return buffer.toString();
+            }
 
-                    renderValue(buffer, treeNode);
-                    buffer.elementEnd("span");
+            /**
+             * Render the node's value.
+             *
+             * @param buffer string buffer containing the markup
+             * @param treeNode treeNode to render
+             */
+            protected void renderValue(HtmlStringBuffer buffer,
+                TreeNode treeNode) {
+
+                if (isJavascriptEnabled()) {
+                    //create a href to interact with the checkbox on browser
+                    buffer.elementStart("a");
+                    Map hrefParameters =
+                        Collections.singletonMap(SELECT_TREE_NODE_PARAM,
+                                                 treeNode.getId());
+                    buffer.appendAttribute("href", getHref(hrefParameters));
 
-                    return buffer.toString();
-                }
+                    ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderValue(
+                        buffer);
+                    buffer.closeTag();
+                    if (treeNode.getValue() != null) {
+                        buffer.append(treeNode.getValue());
+                    }
+                    buffer.elementEnd("a");
+                    buffer.append("\n");
 
-                /**
-                 * Render the node's value.
-                 *
-                 * @param buffer string buffer containing the markup
-                 * @param treeNode treeNode to render
-                 */
-                protected void renderValue(HtmlStringBuffer buffer, TreeNode treeNode) {
-
-                    if (isJavascriptEnabled()) {
-                        //create a href to interact with the checkbox on browser
-                        buffer.elementStart("a");
-                        Map hrefParameters =
-                            Collections.singletonMap(SELECT_TREE_NODE_PARAM, treeNode.getId());
-                        buffer.appendAttribute("href", getHref(hrefParameters));
-
-                        ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderValue(buffer);
-                        buffer.closeTag();
-                        if (treeNode.getValue() != null) {
-                            buffer.append(treeNode.getValue());
-                        }
-                        buffer.elementEnd("a");
-                        buffer.append("\n");
-
-                    } else {
-                        //just print normal value
-                        if (treeNode.getValue() != null) {
-                            buffer.append(treeNode.getValue());
-                        }
-                        buffer.append("\n");
+                } else {
+                    //just print normal value
+                    if (treeNode.getValue() != null) {
+                        buffer.append(treeNode.getValue());
                     }
+                    buffer.append("\n");
                 }
-            };
+            }
+        };
+    }
+
+    /**
+     * Renders a Checkbox for the specified treeNode to the buffer.
+     * <p/>
+     * This method invokes {@link #getInputType()} which returns <tt>"checkbox"</tt>
+     * by default, but allows subclasses to change the input type if necessary.
+     *
+     * @param buffer string buffer containing the markup
+     * @param treeNode treeNode to render
+     */
+    protected void renderCheckbox(HtmlStringBuffer buffer, TreeNode treeNode) {
+        buffer.append("<input ");
+        if (isJavascriptEnabled()) {
+            ((CheckboxJavascriptRenderer) javascriptHandler.getJavascriptRenderer()).renderCheckbox(
+                buffer);
         }
+        buffer.append(" style=\"margin:0\" type=\"");
+        buffer.append(getInputType());
+        buffer.append("\"");
+        buffer.appendAttribute("name", SELECT_TREE_NODE_PARAM);
+        buffer.appendAttribute("value", treeNode.getId());
+
+        if (treeNode.isSelected()) {
+            buffer.appendAttribute("checked", "checked");
+        }
+
+        buffer.elementEnd();
+    }
+
+    /**
+     * Return the input type of the CheckboxTree, default value is
+     * <tt>"checkbox"</tt>.
+     * <p/>
+     * This method allows subclasses to change the input type if necessary.
+     * For example in order to render Radio buttons instead of Checkboxes,
+     * override this method and return the input type <tt>"radio"</tt>.
+     *
+     * @return the input type of the CheckboxTree
+     */
+    protected String getInputType() {
+        return "checkbox";
     }
 
     /**
@@ -436,7 +474,7 @@
      * Provides the contract for pluggable javascript renderers, for
      * the CheckboxTree.
      */
-    interface CheckboxJavascriptRenderer {
+    protected interface CheckboxJavascriptRenderer {
 
         /**
          * Called when a tree node's value is rendered. Enables the renderer