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>