You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by pr...@apache.org on 2005/10/29 00:13:44 UTC

svn commit: r329321 - in /myfaces/sandbox/trunk: conf/ src/java/org/apache/myfaces/custom/ajax/api/ src/java/org/apache/myfaces/custom/autoupdatedatatable/ src/java/org/apache/myfaces/custom/inputAjax/ src/java/org/apache/myfaces/custom/inputAjax/resou...

Author: prophecy
Date: Fri Oct 28 15:13:37 2005
New Revision: 329321

URL: http://svn.apache.org/viewcvs?rev=329321&view=rev
Log:
Added new HtmlSelectManyCheckboxAjax component that will update without having to submit

Added:
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxDecodePhaseListener.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjax.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxRenderer.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxTag.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/resource/
Modified:
    myfaces/sandbox/trunk/conf/faces-config.xml
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxComponent.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/autoupdatedatatable/AutoUpdateDataTable.java
    myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputsuggestajax/InputSuggestAjax.java
    myfaces/sandbox/trunk/tld/myfaces_sandbox.tld

Modified: myfaces/sandbox/trunk/conf/faces-config.xml
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/conf/faces-config.xml?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/conf/faces-config.xml (original)
+++ myfaces/sandbox/trunk/conf/faces-config.xml Fri Oct 28 15:13:37 2005
@@ -30,6 +30,11 @@
   </component>
 
   <component>
+    <component-type>org.apache.myfaces.HtmlSelectManyCheckboxAjax</component-type>
+    <component-class>org.apache.myfaces.custom.inputAjax.HtmlSelectManyCheckboxAjax</component-class>
+  </component>
+
+  <component>
     <component-type>org.apache.myfaces.Planner</component-type>
     <component-class>org.apache.myfaces.custom.schedule.HtmlPlanner</component-class>
   </component>
@@ -67,11 +72,11 @@
   <component>
 	<component-type>org.apache.myfaces.Scope</component-type>
 	<component-class>org.apache.myfaces.custom.scope.UIScope</component-class>
-  </component>
-  
-  <component>
-	<component-type>org.apache.myfaces.HtmlSelectManyPicklist</component-type>
-	<component-class>org.apache.myfaces.custom.picklist.HtmlSelectManyPicklist</component-class>
+  </component>
+  
+  <component>
+	<component-type>org.apache.myfaces.HtmlSelectManyPicklist</component-type>
+	<component-class>org.apache.myfaces.custom.picklist.HtmlSelectManyPicklist</component-class>
   </component>
 
   <!-- sandbox converters -->
@@ -110,6 +115,12 @@
     </renderer>
 
     <renderer>
+      <component-family>javax.faces.SelectMany</component-family>
+      <renderer-type>org.apache.myfaces.CheckboxAjax</renderer-type>
+      <renderer-class>org.apache.myfaces.custom.inputAjax.HtmlSelectManyCheckboxAjaxRenderer</renderer-class>
+    </renderer>
+
+    <renderer>
       <component-family>javax.faces.Panel</component-family>
       <renderer-type>org.apache.myfaces.Planner</renderer-type>
       <renderer-class>org.apache.myfaces.custom.schedule.renderer.PlannerRenderer</renderer-class>
@@ -156,18 +167,20 @@
 		<component-family>javax.faces.Output</component-family>
 		<renderer-type>script.aculo.us.renderer</renderer-type>
 		<renderer-class>org.apache.myfaces.custom.effect.EffectRenderer</renderer-class>
-	</renderer>
-	
-    <renderer>
-        <component-family>javax.faces.SelectMany</component-family>
-        <renderer-type>org.apache.myfaces.PicklistRenderer</renderer-type>
-        <renderer-class>org.apache.myfaces.custom.picklist.HtmlPicklistRenderer</renderer-class>
-    </renderer>
+	</renderer>
+	
+    <renderer>
+        <component-family>javax.faces.SelectMany</component-family>
+        <renderer-type>org.apache.myfaces.PicklistRenderer</renderer-type>
+        <renderer-class>org.apache.myfaces.custom.picklist.HtmlPicklistRenderer</renderer-class>
+    </renderer>
 	
   </render-kit>
 
 
   <lifecycle>
+
+      <phase-listener>org.apache.myfaces.custom.ajax.api.AjaxDecodePhaseListener</phase-listener>
       <phase-listener>org.apache.myfaces.custom.ajax.api.AjaxPhaseListener</phase-listener>
 	  <phase-listener>org.apache.myfaces.custom.graphicimagedynamic.GraphicImageDynamicPhaseListener</phase-listener>
 	  <phase-listener>org.apache.myfaces.custom.scope.AfterScopePhaseListener</phase-listener>

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxComponent.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxComponent.java?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxComponent.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxComponent.java Fri Oct 28 15:13:37 2005
@@ -26,4 +26,6 @@
 public interface AjaxComponent
 {
     void encodeAjax(FacesContext context) throws IOException;
+
+    void decodeAjax(FacesContext context);
 }

Added: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxDecodePhaseListener.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxDecodePhaseListener.java?rev=329321&view=auto
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxDecodePhaseListener.java (added)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxDecodePhaseListener.java Fri Oct 28 15:13:37 2005
@@ -0,0 +1,118 @@
+package org.apache.myfaces.custom.ajax.api;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.custom.buffer.HtmlBufferResponseWriterWrapper;
+import org.apache.myfaces.renderkit.RendererUtils;
+import org.apache.myfaces.application.jsp.JspStateManagerImpl;
+import org.apache.myfaces.application.ComponentNotFoundException;
+import org.apache.myfaces.util.DebugUtils;
+
+import javax.faces.event.PhaseListener;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.context.FacesContext;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
+import javax.servlet.http.HttpServletResponse;
+import java.io.PrintWriter;
+import java.io.IOException;
+
+/**
+ * User: treeder
+ * Date: Oct 26, 2005
+ * Time: 6:03:21 PM
+ */
+public class AjaxDecodePhaseListener
+        implements PhaseListener
+{
+    private static Log log = LogFactory.getLog(AjaxDecodePhaseListener.class);
+
+
+    /**
+     * Some Ajax components might do special decoding at apply request values phase
+     *
+     * @return PhaseId The AJAX phase listener will be invoked after the invoke application phase.
+     */
+    public PhaseId getPhaseId()
+    {
+        return PhaseId.APPLY_REQUEST_VALUES;
+
+    }
+
+
+    public void beforePhase(PhaseEvent event)
+    {
+        log.debug("In AjaxDecodePhaseListener beforePhase");
+        FacesContext context = event.getFacesContext();
+
+        if (context.getExternalContext().getRequestParameterMap().containsKey("affectedAjaxComponent"))
+        {
+            UIViewRoot root = context.getViewRoot();
+            //DebugUtils.printView(root, System.out);
+            String affectedAjaxComponent = (String) context.getExternalContext().getRequestParameterMap().get("affectedAjaxComponent");
+            log.debug("affectedAjaxComponent: " + ajaxComponent + " - " + ajaxComponent.getId());
+            UIComponent ajaxComponent = root.findComponent(affectedAjaxComponent);
+
+            if (ajaxComponent == null)
+            {
+                String msg = "Component with id [" + affectedAjaxComponent + "] not found in view tree.";
+                log.error(msg);
+                throw new ComponentNotFoundException(msg);
+            }
+            if (ajaxComponent instanceof AjaxComponent)
+            {
+                try
+                {
+                    // Now let the component decode this request
+                    ((AjaxComponent) ajaxComponent).decodeAjax(context);
+                }
+                catch (Exception e)
+                {
+                    log.error("Exception while decoding ajax-request", e);
+                }
+            }
+            else
+            {
+                log.error("Found component is no ajaxComponent : " + RendererUtils.getPathToComponent(ajaxComponent));
+            }
+
+        }
+    }
+
+    public static Object getValueForComponent(FacesContext facesContext, UIComponent component)
+    {
+        String possibleClientId = component.getClientId(facesContext);
+
+        if (facesContext.getExternalContext().getRequestParameterMap().containsKey(possibleClientId))
+        {
+            return facesContext.getExternalContext().getRequestParameterMap().get(possibleClientId);
+        }
+        else
+        {
+            possibleClientId = (String) facesContext.getExternalContext().getRequestParameterMap().get(
+                    "affectedAjaxComponent");
+            log.debug("affectedAjaxComponent: " + possibleClientId);
+
+            UIViewRoot root = facesContext.getViewRoot();
+            UIComponent ajaxComponent = root.findComponent(possibleClientId);
+            if (ajaxComponent == component)
+            {
+                return facesContext.getExternalContext().getRequestParameterMap().get(possibleClientId);
+            }
+            else
+            {
+                log.error("No value found for this component : " + possibleClientId);
+                return null;
+            }
+        }
+    }
+
+
+    public void afterPhase(PhaseEvent event)
+    {
+
+    }
+
+
+}

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/ajax/api/AjaxPhaseListener.java Fri Oct 28 15:13:37 2005
@@ -41,6 +41,11 @@
 {
     private static Log log=LogFactory.getLog(AjaxPhaseListener.class);
 
+    public void beforePhase(PhaseEvent event)
+    {
+
+    }
+
     public static Object getValueForComponent(FacesContext facesContext, UIComponent component)
     {
         String possibleClientId = component.getClientId(facesContext);
@@ -73,7 +78,8 @@
 
     public void afterPhase(PhaseEvent event)
     {
-         FacesContext context = event.getFacesContext();
+        log.debug("In AjaxPhaseListener afterPhase");
+        FacesContext context = event.getFacesContext();
 
         if(context.getExternalContext().getRequestParameterMap().containsKey("affectedAjaxComponent"))
         {                                 
@@ -81,6 +87,7 @@
 
             UIComponent ajaxComponent = root.findComponent((String)context.getExternalContext().getRequestParameterMap().get("affectedAjaxComponent"));
 
+            log.debug("affectedAjaxComponent: " + ajaxComponent + " - " + ajaxComponent.getId());
             if(ajaxComponent instanceof AjaxComponent)
             {                
 
@@ -128,10 +135,7 @@
         }
     }
 
-    public void beforePhase(PhaseEvent event)
-    {
 
-    }
 
     /**
      * We need to hang our AJAX phase listener in the invoke application phase as it is

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/autoupdatedatatable/AutoUpdateDataTable.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/autoupdatedatatable/AutoUpdateDataTable.java?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/autoupdatedatatable/AutoUpdateDataTable.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/autoupdatedatatable/AutoUpdateDataTable.java Fri Oct 28 15:13:37 2005
@@ -144,4 +144,9 @@
             
         }
     }
+
+    public void decodeAjax(FacesContext context)
+    {
+
+    }
 }

Added: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjax.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjax.java?rev=329321&view=auto
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjax.java (added)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjax.java Fri Oct 28 15:13:37 2005
@@ -0,0 +1,156 @@
+package org.apache.myfaces.custom.inputAjax;
+
+import org.apache.myfaces.component.html.ext.HtmlSelectManyCheckbox;
+import org.apache.myfaces.custom.ajax.api.AjaxComponent;
+import org.apache.myfaces.custom.ajax.api.AjaxRenderer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.render.Renderer;
+import javax.faces.el.MethodBinding;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.List;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Current limitations
+ * - Bound value must be a Collection of Strings!
+ *
+ *
+ * User: treeder
+ * Date: Oct 20, 2005
+ * Time: 1:40:15 PM
+ */
+public class HtmlSelectManyCheckboxAjax extends HtmlSelectManyCheckbox implements AjaxComponent
+{
+    private static final Log log = LogFactory.getLog(HtmlSelectManyCheckboxAjax.class);
+    public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlSelectManyCheckboxAjax";
+    public static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.CheckboxAjax";
+
+    private String onSuccess;
+    private String onFailure;
+    private String onStart;
+
+    public HtmlSelectManyCheckboxAjax()
+    {
+        super();
+        setRendererType(DEFAULT_RENDERER_TYPE);
+    }
+
+    /**
+     * Decode ajax request and apply value changes
+     *
+     * @param context
+     */
+    public void decodeAjax(FacesContext context)
+    {
+        log.debug("entering HtmlSelectManyCheckboxAjax.decodeAjax");
+        Object requestOb = context.getExternalContext().getRequest();
+        if (requestOb instanceof HttpServletRequest)
+        {
+            HttpServletRequest request = (HttpServletRequest) requestOb;
+            String elname = request.getParameter("elname");
+            String elvalue = request.getParameter("elvalue");
+            boolean checked = Boolean.parseBoolean(request.getParameter("checked"));
+            // now apply this to the
+            Object valOb = this.getValue();
+            log.debug("valOb: " + valOb);
+            if(valOb instanceof Collection){
+                // then all good
+                Collection c = (Collection) valOb;
+                updateChosenValue(c, elname, elvalue, checked);
+            } else {
+                log.error("Invalid chosen values type in HtmlSelectManyCheckbox");
+            }
+
+
+
+        }
+    }
+    /**
+     * Will find the chosen value in the chosenValues list and update set or unset accordingly.
+     *
+     * @param c
+     * @param elname
+     * @param elvalue
+     * @param checked
+     */
+    public void updateChosenValue(Collection c, String elname, String elvalue, boolean checked) {
+        boolean found = false;
+        if (c != null) {
+            Iterator iter = c.iterator();
+            while (iter.hasNext())
+            {
+                String value = (String) iter.next();
+                if (value.equals(elvalue)) {
+                    found = true;
+                    if (!checked) {
+                        // then remove
+                        log.debug("Removing elvalue: " + elvalue);
+                        iter.remove();
+                    } else {
+                        // would this ever happen?
+                    }
+                    break;
+                }
+            }
+            if (!found && checked) {
+                // then add it
+                log.debug("Adding elvalue: " + elvalue);
+                c.add(elvalue);
+            }
+        } else {
+            log.error("LIST IS NULL!!!");
+        }
+    }
+
+    public void encodeAjax(FacesContext context) throws IOException
+    {
+        log.debug("encodeAjax in HtmlSelectManyCheckbox");
+        if (context == null) throw new NullPointerException("context");
+        if (!isRendered()) return;
+        Renderer renderer = getRenderer(context);
+
+        if (renderer != null && renderer instanceof AjaxRenderer)
+        {
+            ((AjaxRenderer) renderer).encodeAjax(context, this);
+
+        }
+    }
+
+
+    public String getOnSuccess()
+    {
+        return onSuccess;
+    }
+
+    public void setOnSuccess(String onSuccess)
+    {
+        this.onSuccess = onSuccess;
+    }
+
+    public String getOnFailure()
+    {
+        return onFailure;
+    }
+
+    public void setOnFailure(String onFailure)
+    {
+        this.onFailure = onFailure;
+    }
+
+    public String getOnStart()
+    {
+        return onStart;
+    }
+
+    public void setOnStart(String onStart)
+    {
+        this.onStart = onStart;
+    }
+
+
+}

Added: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxRenderer.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxRenderer.java?rev=329321&view=auto
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxRenderer.java (added)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxRenderer.java Fri Oct 28 15:13:37 2005
@@ -0,0 +1,196 @@
+package org.apache.myfaces.custom.inputAjax;
+
+import org.apache.myfaces.renderkit.html.ext.HtmlTextRenderer;
+import org.apache.myfaces.renderkit.html.ext.HtmlCheckboxRenderer;
+import org.apache.myfaces.renderkit.html.HtmlRendererUtils;
+import org.apache.myfaces.renderkit.html.HTML;
+import org.apache.myfaces.renderkit.JSFAttr;
+import org.apache.myfaces.renderkit.RendererUtils;
+import org.apache.myfaces.custom.ajax.api.AjaxRenderer;
+import org.apache.myfaces.custom.prototype.PrototypeResourceLoader;
+import org.apache.myfaces.custom.inputsuggestajax.InputSuggestAjax;
+import org.apache.myfaces.component.html.util.AddResource;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UISelectItem;
+import javax.faces.application.ViewHandler;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.List;
+
+/**
+ * For onSuccess, onFailure, onStart functions, they should accept (elname, elvalue) attributes for the specific item
+ * <p/>
+ * User: treeder
+ * Date: Oct 20, 2005
+ * Time: 3:28:04 PM
+ */
+public class HtmlSelectManyCheckboxAjaxRenderer extends HtmlCheckboxRenderer implements AjaxRenderer
+{
+    private static final Log log = LogFactory.getLog(HtmlSelectManyCheckboxAjaxRenderer.class);
+    private static final String JAVASCRIPT_ENCODED = "org.apache.myfaces.custom.inputAjax.JAVASCRIPT_ENCODED";
+
+
+    /**
+     * Encodes any stand-alone javascript functions that are needed.
+     * Uses either the extension filter, or a
+     * user-supplied location for the javascript files.
+     *
+     * @param context   FacesContext
+     * @param component UIComponent
+     * @throws java.io.IOException
+     */
+    private void encodeJavascript(FacesContext context, UIComponent component) throws IOException
+    {
+        // check to see if javascript has already been written
+        // (which could happen if more than one inputSuggestAjax on the same page)
+        if (context.getExternalContext().getRequestMap().containsKey(JAVASCRIPT_ENCODED))
+        {
+            return;
+        }
+        HtmlSelectManyCheckboxAjax selectManyCheckbox = (HtmlSelectManyCheckboxAjax) component;
+
+        String javascriptLocation = (String) component.getAttributes().get(JSFAttr.JAVASCRIPT_LOCATION);
+
+        AddResource addResource = AddResource.getInstance(context);
+        addResource.addJavaScriptToHeader(context,
+                PrototypeResourceLoader.class, "prototype.js");
+
+        String clientId = component.getClientId(context);
+        String viewId = context.getViewRoot().getViewId();
+        ViewHandler viewHandler = context.getApplication().getViewHandler();
+        String actionURL = viewHandler.getActionURL(context, viewId);
+        // TODO: THIS SHOULD GO TO A SERVLET OR SOMETHING INSTEAD OF A JSP, NOT THE ORIGINAL PAGE I DON'T THINK BECAUSE YOU WOULDN'T WANT TO GO THROUGH THE WHOLE LIFE CYCLE
+        String ajaxURL = actionURL;
+        String viewId2 = context.getExternalContext().getRequestPathInfo();
+
+        ResponseWriter out = context.getResponseWriter();
+
+        out.startElement(HTML.SCRIPT_ELEM, null);
+        out.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
+
+        out.writeText("var MyFaces_inputAjax_ajaxUrl = '" + ajaxURL + "';\n", null);
+        if (selectManyCheckbox.getOnSuccess() != null)
+            out.writeText("var MyFaces_inputAjax_onSuccessFunction = " + selectManyCheckbox.getOnSuccess() + ";\n", null);
+        if (selectManyCheckbox.getOnFailure() != null)
+            out.writeText("var MyFaces_inputAjax_onFailureFunction = " + selectManyCheckbox.getOnFailure() + ";\n", null);
+        if (selectManyCheckbox.getOnStart() != null)
+            out.writeText("var MyFaces_inputAjax_onStartFunction = " + selectManyCheckbox.getOnStart() + ";\n", null);
+
+        // todo: stringbuffer this
+        StringBuffer buff = new StringBuffer();
+        buff.append("\n" +
+                "function MyFaces_inputAjax_notifyElement(originalRequest, successful)\n" +
+                "{\n" +
+                // "    alert(\"originalRequest: \" + originalRequest + \" - \" + successful);\n" +
+                "    var myObElement = originalRequest.responseXML.getElementsByTagName(\"response\")[0].getElementsByTagName(\"elementUpdated\")[0];\n" +
+                "    var elname = myObElement.getAttribute(\"elname\");\n" +
+                "    var elvalue = myObElement.getAttribute(\"elvalue\");\n" +
+                "    if (successful)\n" +
+                "    {\n");
+        if (selectManyCheckbox.getOnSuccess() != null)
+            buff.append("        MyFaces_inputAjax_onSuccessFunction(elname, elvalue);\n");
+        buff.append("    }\n" +
+                "    else\n" +
+                "    {\n");
+        if (selectManyCheckbox.getOnFailure() != null)
+            buff.append("        MyFaces_inputAjax_onFailureFunction(elname, elvalue);\n");
+        buff.append("    }\n" +
+                "}\n" +
+                "function MyFaces_inputAjax_notifyElementFailure(originalRequest)\n" +
+                "{\n" +
+                "    MyFaces_inputAjax_notifyElement(originalRequest, false);\n" +
+                "}\n" +
+                "function MyFaces_inputAjax_notifyElementSuccess(originalRequest)\n" +
+                "{\n" +
+                "    MyFaces_inputAjax_notifyElement(originalRequest, true);\n" +
+                "}\n" +
+                "function MyFaces_inputAjax_ajaxSubmit(f, elname)\n" +
+                "{\n" +
+                " var elvalue = f.value;\n")
+                .append("var checked = f.checked;\n");
+        if (selectManyCheckbox.getOnStart() != null)
+            buff.append("    MyFaces_inputAjax_onStartFunction(elname, elvalue);\n");
+        buff.append("    var pars = \"affectedAjaxComponent=\" + elname + \"&elname=\" + elname + \"&elvalue=\" + elvalue + \"");
+        buff.append("&checked=\" + checked + \"");
+        buff.append("&vi=").append(context.getExternalContext().encodeActionURL(actionURL));
+        buff.append("&vi2=").append(context.getExternalContext().encodeActionURL(viewId2));
+        buff.append("&vi3=").append(context.getExternalContext().encodeActionURL(viewId));
+        if (context.getApplication().getStateManager().isSavingStateInClient(context))
+        {
+            buff.append("&jsf_tree_64=\"+encodeURIComponent(document.getElementById(\"jsf_tree_64\").value)+\"&jsf_state_64=\"+encodeURIComponent(document.getElementById(\"jsf_state_64\").value)+\"&jsf_viewid=\"+encodeURIComponent(document.getElementById(\"jsf_viewid\").value)+\"");
+        }
+        buff.append("\";\n");
+
+        buff.append(
+                "    var myAjax = new Ajax.Request(\n" +
+                        "    MyFaces_inputAjax_ajaxUrl,\n" +
+                        "    {method: 'post'" +
+                        ",   parameters: pars\n");
+        if (selectManyCheckbox.getOnSuccess() != null)
+            buff.append(", onComplete: MyFaces_inputAjax_notifyElementSuccess");
+        if (selectManyCheckbox.getOnFailure() != null)
+            buff.append(", onFailure: MyFaces_inputAjax_notifyElementFailure");
+        buff.append("} \n" +
+                "            );\n" +
+                "}");
+        out.writeText(buff.toString(), null);
+
+        out.endElement(HTML.SCRIPT_ELEM);
+
+        context.getExternalContext().getRequestMap().put(JAVASCRIPT_ENCODED, Boolean.TRUE);
+    }
+
+
+    public void encodeEnd(FacesContext context, UIComponent component) throws IOException
+    {
+        RendererUtils.checkParamValidity(context, component, HtmlSelectManyCheckboxAjax.class);
+
+        if (HtmlRendererUtils.isDisplayValueOnly(component) || isDisabled(context, component))
+        {
+            super.encodeEnd(context, component);
+            return;
+        }
+
+        String clientId = component.getClientId(context);
+        String viewId = context.getViewRoot().getViewId();
+        ViewHandler viewHandler = context.getApplication().getViewHandler();
+        String actionURL = viewHandler.getActionURL(context, viewId);
+
+        HtmlSelectManyCheckboxAjax selectManyCheckbox = (HtmlSelectManyCheckboxAjax) component;
+        selectManyCheckbox.setOnclick("MyFaces_inputAjax_ajaxSubmit(this, '" + clientId + "');");
+
+        this.encodeJavascript(context, component);
+
+        super.encodeEnd(context, component);
+
+    }
+
+    public void encodeAjax(FacesContext context, UIComponent component) throws IOException
+    {
+        log.debug("encodeAjax in HtmlSelectManyCheckbox");
+        HtmlSelectManyCheckboxAjax comp = (HtmlSelectManyCheckboxAjax) component;
+        Object responseOb = context.getExternalContext().getResponse();
+        if (responseOb instanceof HttpServletResponse)
+        {
+            HttpServletResponse response = (HttpServletResponse) responseOb;
+            response.setContentType("application/xml");
+            HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
+            PrintWriter out = response.getWriter();
+            out.println("<?xml version=\"1.0\"?>");
+            out.println("<response>");
+            out.println("<elementUpdated elname=\"" + request.getParameter("elname") + "\" elvalue=\"" +
+                    request.getParameter("elvalue") + "\" checked=\"" + request.getParameter("checked") + "\"/>");
+            out.println("</response>");
+        }
+
+
+    }
+
+}

Added: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxTag.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxTag.java?rev=329321&view=auto
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxTag.java (added)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputAjax/HtmlSelectManyCheckboxAjaxTag.java Fri Oct 28 15:13:37 2005
@@ -0,0 +1,74 @@
+package org.apache.myfaces.custom.inputAjax;
+
+import org.apache.myfaces.taglib.html.ext.HtmlSelectManyCheckboxTag;
+import org.apache.myfaces.custom.autoupdatedatatable.AutoUpdateDataTable;
+
+import javax.faces.component.UIComponent;
+
+/**
+ * User: treeder
+ * Date: Oct 20, 2005
+ * Time: 3:05:46 PM
+ */
+public class HtmlSelectManyCheckboxAjaxTag extends HtmlSelectManyCheckboxTag
+{
+    private String onSuccess;
+    private String onFailure;
+    private String onStart;
+
+    public void release()
+    {
+        super.release();
+        onSuccess = null;
+        onFailure = null;
+        onStart = null;
+    }
+     protected void setProperties(UIComponent component) {
+        super.setProperties(component);
+
+        setStringProperty(component, "onSuccess", onSuccess);
+        setStringProperty(component, "onFailure", onFailure);
+        setStringProperty(component, "onStart", onStart);
+    }
+
+     public String getComponentType() {
+        return HtmlSelectManyCheckboxAjax.COMPONENT_TYPE;
+    }
+
+    /**
+     * @return the RendererType String
+     */
+    public String getRendererType() {
+        return HtmlSelectManyCheckboxAjax.DEFAULT_RENDERER_TYPE;
+    }
+
+    public String getOnSuccess()
+    {
+        return onSuccess;
+    }
+
+    public void setOnSuccess(String onSuccess)
+    {
+        this.onSuccess = onSuccess;
+    }
+
+    public String getOnFailure()
+    {
+        return onFailure;
+    }
+
+    public void setOnFailure(String onFailure)
+    {
+        this.onFailure = onFailure;
+    }
+
+    public String getOnStart()
+    {
+        return onStart;
+    }
+
+    public void setOnStart(String onStart)
+    {
+        this.onStart = onStart;
+    }
+}

Modified: myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputsuggestajax/InputSuggestAjax.java
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputsuggestajax/InputSuggestAjax.java?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputsuggestajax/InputSuggestAjax.java (original)
+++ myfaces/sandbox/trunk/src/java/org/apache/myfaces/custom/inputsuggestajax/InputSuggestAjax.java Fri Oct 28 15:13:37 2005
@@ -109,6 +109,11 @@
         }
     }
 
+    public void decodeAjax(FacesContext context)
+    {
+
+    }
+
     public String getLayout()
     {
         if (_layout != null)

Modified: myfaces/sandbox/trunk/tld/myfaces_sandbox.tld
URL: http://svn.apache.org/viewcvs/myfaces/sandbox/trunk/tld/myfaces_sandbox.tld?rev=329321&r1=329320&r2=329321&view=diff
==============================================================================
--- myfaces/sandbox/trunk/tld/myfaces_sandbox.tld (original)
+++ myfaces/sandbox/trunk/tld/myfaces_sandbox.tld Fri Oct 28 15:13:37 2005
@@ -665,4 +665,37 @@
        &user_role_attributes;
     </tag>
 
+     <!-- selectManyCheckboxAjax -->
+    <tag>
+        <name>selectManyCheckboxAjax</name>
+        <tag-class>org.apache.myfaces.custom.inputAjax.HtmlSelectManyCheckboxAjaxTag</tag-class>
+        <body-content>JSP</body-content>
+        <description>
+            Extends standard selectManyCheckbox allowing for dynamic ajax submitting.
+        </description>
+        &standard_select_many_checkbox_attributes;
+        &ext_forceId_attribute;
+        <attribute>
+			<name>onSuccess</name>
+			<required>false</required>
+			<rtexprvalue>false</rtexprvalue>
+			<type>java.lang.String</type>
+            <description>Javascript method to call on successful ajax update</description>
+        </attribute>
+        <attribute>
+			<name>onFailure</name>
+			<required>false</required>
+			<rtexprvalue>false</rtexprvalue>
+			<type>java.lang.String</type>
+            <description>Javascript method to call on failed ajax update</description>
+        </attribute>
+        <attribute>
+			<name>onStart</name>
+			<required>false</required>
+			<rtexprvalue>false</rtexprvalue>
+			<type>java.lang.String</type>
+            <description>Javascript method to call on start of ajax update</description>
+        </attribute>
+    </tag>
+
 </taglib>