You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ck...@apache.org on 2006/08/22 22:56:01 UTC

svn commit: r433750 - in /myfaces/tomahawk/trunk/sandbox: core/src/main/java/org/apache/myfaces/custom/ppr/ core/src/main/resources-facesconfig/META-INF/ core/src/main/resources/org/apache/myfaces/custom/ppr/ core/src/main/resources/org/apache/myfaces/...

Author: ckormos
Date: Tue Aug 22 13:56:00 2006
New Revision: 433750

URL: http://svn.apache.org/viewvc?rev=433750&view=rev
Log:
Initial commit for PPR provided by Ernst Fastl.

Added:
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroup.java
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupRenderer.java
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupTag.java
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPhaseListener.java
    myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/
    myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/
    myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/ppr.js
    myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/
    myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/PPRExampleBean.java
    myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/pprPanelGroup.jsp
Modified:
    myfaces/tomahawk/trunk/sandbox/core/src/main/resources-facesconfig/META-INF/faces-config.xml
    myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld
    myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/examples-config.xml
    myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/home.jsp

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroup.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroup.java?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroup.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroup.java Tue Aug 22 13:56:00 2006
@@ -0,0 +1,60 @@
+package org.apache.myfaces.custom.ppr;
+
+import org.apache.myfaces.component.html.ext.HtmlPanelGroup;
+
+import javax.faces.context.FacesContext;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Ernst
+ * Date: 20.06.2006
+ * Time: 03:30:13
+ * To change this template use File | Settings | File Templates.
+ */
+public class PPRPanelGroup extends HtmlPanelGroup
+{
+    private String _partialTriggers;
+
+    public static final String COMPONENT_TYPE = "org.apache.myfaces.PPRPanelGroup";
+
+    public static final String COMPONENT_FAMILY = "org.apache.myfaces.PPRPanelGroup";
+
+    public static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.PPRPanelGroup";
+
+    public PPRPanelGroup()
+    {
+        setRendererType(DEFAULT_RENDERER_TYPE);
+    }
+
+    public String getFamily()
+    {
+        return COMPONENT_FAMILY;
+    }
+
+    public String getPartialTriggers()
+    {
+        return _partialTriggers;
+    }
+
+    public void setPartialTriggers(String partialTriggers)
+    {
+        this._partialTriggers = partialTriggers;
+    }
+
+    public void restoreState(FacesContext context, Object state)
+    {
+
+        Object[] values = (Object[]) state;
+        super.restoreState(context, values[0]);
+        _partialTriggers = (String) values[1];
+
+    }
+
+    public Object saveState(FacesContext context)
+    {
+        Object[] values = new Object[2];
+        values[0] = super.saveState(context);
+        values[1] = _partialTriggers;
+        return values;
+    }
+}

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupRenderer.java?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupRenderer.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupRenderer.java Tue Aug 22 13:56:00 2006
@@ -0,0 +1,131 @@
+package org.apache.myfaces.custom.ppr;
+
+import org.apache.myfaces.renderkit.html.ext.HtmlGroupRenderer;
+import org.apache.myfaces.renderkit.html.util.AddResource;
+import org.apache.myfaces.renderkit.html.util.AddResourceFactory;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
+import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
+import org.apache.myfaces.custom.dojo.DojoUtils;
+import org.apache.myfaces.custom.dojo.DojoConfig;
+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.servlet.http.HttpServletRequest;
+
+import java.io.IOException;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+
+public class PPRPanelGroupRenderer extends HtmlGroupRenderer
+{
+    private static Log log = LogFactory.getLog(PPRPanelGroupRenderer.class);
+    private static final String MY_FACES_PPR_INITIALIZED = "/*MyFaces PPR initialized*/";
+    private static final String ADD_PARTIAL_TRIGGER_FUNCTION = "myFacesPPRCtrl.addPartialTrigger";
+    private static final String PPR_JS_FILE = "ppr.js";
+    private static final String BODY_SCRIPT_INFOS_ATTRIBUTE_NAME = "bodyScriptInfos";
+    private static final String MY_FACES_PPR_INIT_CODE =
+            "var myFacesPPRCtrl = new org.apache.myfaces.PPRCtrl(\"mainform\");";
+
+    public void encodeJavaScript(FacesContext facesContext, UIComponent uiComponent) throws IOException
+    {
+        if (!isInlineScriptSet(facesContext, MY_FACES_PPR_INITIALIZED)) {
+            String javascriptLocation = (String)uiComponent.getAttributes().get(JSFAttr.JAVASCRIPT_LOCATION);
+            AddResource addResource = AddResourceFactory.getInstance(facesContext);
+            DojoUtils.addMainInclude(facesContext, uiComponent, javascriptLocation, new DojoConfig());
+            DojoUtils.addRequire(facesContext, uiComponent, "dojo.io.*");
+            DojoUtils.addRequire(facesContext, uiComponent, "dojo.event.*");
+            addResource.addInlineScriptAtPosition(facesContext, AddResource.HEADER_BEGIN, MY_FACES_PPR_INITIALIZED);
+            
+            addResource.addJavaScriptAtPosition(facesContext, 
+            		AddResource.HEADER_BEGIN, 
+            		PPRPanelGroup.class,
+            		PPR_JS_FILE);
+            
+            writeInlineScript(facesContext,uiComponent,MY_FACES_PPR_INIT_CODE);
+        }
+    	String partialTriggerId=null;
+    	String partialTriggerClientId=null;
+    	UIComponent partialTriggerComponent=null;
+        String partialTriggers = ((PPRPanelGroup)uiComponent).getPartialTriggers();
+        String clientId = uiComponent.getClientId(facesContext);
+        StringTokenizer st = new StringTokenizer(partialTriggers, ",; ", false);
+        while (st.hasMoreTokens())
+        {
+            partialTriggerId = st.nextToken();
+            partialTriggerComponent = facesContext.getViewRoot().findComponent(partialTriggerId);
+            if(partialTriggerComponent != null)
+            {
+                partialTriggerClientId = partialTriggerComponent.getClientId(facesContext);
+                writeInlineScript(facesContext,uiComponent,
+                        ADD_PARTIAL_TRIGGER_FUNCTION +
+                        "('" +
+                        partialTriggerClientId +
+                        "','" +
+                        clientId +
+                        "');");
+            }
+            else
+            {
+                log.debug("PPRPanelGroupRenderer Component with id " + partialTriggerId + " not found!");
+            }
+        }
+
+    }
+
+    public void encodeEnd(FacesContext facesContext, UIComponent uiComponent) throws IOException
+    {
+        super.encodeEnd(facesContext, uiComponent);
+        if(uiComponent instanceof PPRPanelGroup){
+            if(((PPRPanelGroup)uiComponent).getPartialTriggers()!=null &&
+                    ((PPRPanelGroup)uiComponent).getPartialTriggers().length()>0)
+            {
+                encodeJavaScript(facesContext, uiComponent);
+            }
+        }
+    }
+
+    /**
+         * helper to write an inline javascript at the
+         * exact resource location of the call
+         * @param facesContext
+         * @param component
+         * @param script
+         * @throws IOException
+         */
+        private static void writeInlineScript(FacesContext facesContext, UIComponent component, String script) throws IOException {
+            ResponseWriter writer = facesContext.getResponseWriter();
+            writer.startElement(HTML.SCRIPT_ELEM, component);
+            writer.writeAttribute(HTML.TYPE_ATTR, HTML.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
+            writer.write(script);
+            writer.endElement(HTML.SCRIPT_ELEM);
+        }
+        
+        public static boolean isInlineScriptSet(FacesContext context, String inlineScript) {
+            HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
+            Set                set     = getBodyScriptInfos(request);
+
+            if (!set.contains(inlineScript)) {
+                set.add(inlineScript);
+
+                return false;
+            }
+
+            return true;
+        }
+        
+        private static Set getBodyScriptInfos(HttpServletRequest request) {
+            Set set = (Set) request.getAttribute(BODY_SCRIPT_INFOS_ATTRIBUTE_NAME);
+
+            if (set == null) {
+                set = new TreeSet();
+                request.setAttribute(BODY_SCRIPT_INFOS_ATTRIBUTE_NAME, set);
+            }
+
+            return set;
+        }
+
+}

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupTag.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupTag.java?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupTag.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPanelGroupTag.java Tue Aug 22 13:56:00 2006
@@ -0,0 +1,50 @@
+package org.apache.myfaces.custom.ppr;
+
+import org.apache.myfaces.taglib.html.ext.HtmlPanelGroupTag;
+
+import javax.faces.component.UIComponent;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Ernst
+ * Date: 20.06.2006
+ * Time: 03:25:46
+ * To change this template use File | Settings | File Templates.
+ */
+public class PPRPanelGroupTag extends HtmlPanelGroupTag
+{
+    private String _partialTriggers;
+
+    public String getComponentType()
+    {
+        return PPRPanelGroup.COMPONENT_TYPE;
+    }
+
+    public String getRendererType()
+    {
+        return PPRPanelGroup.DEFAULT_RENDERER_TYPE;
+    }
+
+
+    public void release()
+    {
+        super.release();
+        _partialTriggers = null;
+    }
+     protected void setProperties(UIComponent component) {
+        super.setProperties(component);
+
+        setStringProperty(component, "partialTriggers", _partialTriggers);
+    }
+
+    public String getPartialTriggers()
+    {
+        return _partialTriggers;
+    }
+
+    public void setPartialTriggers(String partialTriggers)
+    {
+        this._partialTriggers = partialTriggers;
+    }
+
+}

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPhaseListener.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPhaseListener.java?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPhaseListener.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/ppr/PPRPhaseListener.java Tue Aug 22 13:56:00 2006
@@ -0,0 +1,104 @@
+package org.apache.myfaces.custom.ppr;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlResponseWriterImpl;
+import org.apache.myfaces.shared_tomahawk.renderkit.RendererUtils;
+
+import javax.faces.event.PhaseListener;
+import javax.faces.event.PhaseEvent;
+import javax.faces.event.PhaseId;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.component.UIViewRoot;
+import javax.faces.component.UIComponent;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletRequest;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Ernst
+ * Date: 25.06.2006
+ * Time: 17:28:15
+ * To change this template use File | Settings | File Templates.
+ */
+public class PPRPhaseListener implements PhaseListener
+{
+    private static Log log = LogFactory.getLog(PPRPhaseListener.class);
+    private static final String PPR_PARAMETER = "org.apache.myfaces.PPRCtrl.ajaxRequest";
+    private static final String TRIGGERED_COMPONENTS_PARAMETER = "org.apache.myfaces.PPRCtrl.triggeredComponents";
+    private static final String XML_HEADER = "<?xml version=\"1.0\"?>\n";
+
+    public void afterPhase(PhaseEvent phaseEvent)
+    {
+    }
+
+    public void beforePhase(PhaseEvent event)
+    {
+        log.debug("In PPRPhaseListener beforePhase");
+        FacesContext context = event.getFacesContext();
+        Map externalRequestMap = context.getExternalContext().getRequestParameterMap();
+
+        if (externalRequestMap.containsKey(PPR_PARAMETER))
+        {
+            ServletResponse response =
+            (ServletResponse) context.getExternalContext().getResponse();
+            ServletRequest request =
+            (ServletRequest) context.getExternalContext().getRequest();
+            UIViewRoot viewRoot = context.getViewRoot();
+            ResponseWriter writer=context.getResponseWriter();
+            response.setContentType("text/xml;charset=utf-8");
+            response.setLocale(viewRoot.getLocale());
+            String triggeredComponents=(String) externalRequestMap.get(TRIGGERED_COMPONENTS_PARAMETER);
+            try
+            {
+                PrintWriter out = response.getWriter();
+                context.setResponseWriter(new HtmlResponseWriterImpl(out,
+                        null,
+                        request.getCharacterEncoding()));
+                out.print(XML_HEADER);
+                out.print("<response>\n");
+                encodeTriggeredComponents(out,triggeredComponents,viewRoot,context);
+                out.print("</response>");
+                out.flush();
+            } catch (IOException e)
+            {
+                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            }
+
+            context.responseComplete();
+        }
+    }
+
+    private void encodeTriggeredComponents(PrintWriter out, String triggeredComponents,UIViewRoot viewRoot,FacesContext context)
+    {
+        StringTokenizer st = new StringTokenizer(triggeredComponents, ",", false);
+        String clientId=null;
+        UIComponent component=null;
+        while (st.hasMoreTokens())
+        {
+            clientId = st.nextToken();
+            component = viewRoot.findComponent(clientId);
+            out.print("<component id=\"" +
+                    component.getClientId(context) +
+                    "\"><![CDATA[");
+            try
+            {
+                RendererUtils.renderChild(context,component);
+            } catch (IOException e)
+            {
+                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+            }
+            out.print("]]></component>");
+        }
+    }
+
+    public PhaseId getPhaseId()
+    {
+        return PhaseId.RENDER_RESPONSE;
+    }
+}

Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/resources-facesconfig/META-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/resources-facesconfig/META-INF/faces-config.xml?rev=433750&r1=433749&r2=433750&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/resources-facesconfig/META-INF/faces-config.xml (original)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/resources-facesconfig/META-INF/faces-config.xml Tue Aug 22 13:56:00 2006
@@ -185,12 +185,16 @@
     <component-class>org.apache.myfaces.custom.template.XmlTemplate</component-class>
   </component>
 
-
   <component>
     <component-type>org.apache.myfaces.UISelectItems</component-type>
     <component-class>org.apache.myfaces.custom.selectitems.UISelectItems</component-class>
   </component>
 
+  <component>
+    <component-type>org.apache.myfaces.PPRPanelGroup</component-type>
+    <component-class>org.apache.myfaces.custom.ppr.PPRPanelGroup</component-class>
+  </component>
+
   <!-- sandbox converters -->
 
   <converter>
@@ -393,6 +397,12 @@
 	    <renderer-type>org.apache.myfaces.TimedNotifierRenderer</renderer-type>
 	    <renderer-class>org.apache.myfaces.custom.timednotifier.TimedNotifierRenderer</renderer-class>
 	</renderer>
+
+    <renderer>
+	    <component-family>org.apache.myfaces.PPRPanelGroup</component-family>
+	    <renderer-type>org.apache.myfaces.PPRPanelGroup</renderer-type>
+	    <renderer-class>org.apache.myfaces.custom.ppr.PPRPanelGroupRenderer</renderer-class>
+	</renderer>
    <!-- <renderer>
         <component-family>javax.faces.Messages</component-family>
         <renderer-type>org.apache.myfaces.MessagesSandbox</renderer-type>
@@ -405,6 +415,7 @@
       <phase-listener>org.apache.myfaces.custom.ajax.api.AjaxDecodePhaseListener</phase-listener>
   	  <phase-listener>org.apache.myfaces.custom.valueChangeNotifier.ValueChangePhaseListener</phase-listener>
 	  <phase-listener>org.apache.myfaces.custom.redirectTracker.RedirectTrackerPhaseListener</phase-listener>
+	  <phase-listener>org.apache.myfaces.custom.ppr.PPRPhaseListener</phase-listener>
   </lifecycle>
 
   <application>

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/ppr.js
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/ppr.js?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/ppr.js (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/resources/org/apache/myfaces/custom/ppr/resource/ppr.js Tue Aug 22 13:56:00 2006
@@ -0,0 +1,182 @@
+//Declare the myfaces package in the JS Context
+
+dojo.provide("org.apache.myfaces");
+
+//Define the Partial Page Rendering Controller Class
+
+org.apache.myfaces.PPRCtrl = function(formId)
+{
+    this.partialTriggers = new Array;
+    this.replaceFormSubmitFunction(formId);
+    this.addButtonOnClickHandlers();
+}
+
+//Method for JSF Components to register their Partial Triggers
+
+org.apache.myfaces.PPRCtrl.prototype.addPartialTrigger= function(inputElementId, refreshZoneId)
+{
+    if (this.partialTriggers[inputElementId] === undefined)
+    {
+        this.partialTriggers[inputElementId] = refreshZoneId;
+    }
+    else
+    {
+        this.partialTriggers[inputElementId] =
+        this.partialTriggers[inputElementId] +
+        "," +
+        refreshZoneId;
+    }
+};
+
+//Callback Method which handles the AJAX Response
+
+org.apache.myfaces.PPRCtrl.prototype.handleCallback = function(type, data, evt)
+{
+    if(type == "load")
+    {
+    var componentUpdates = data.getElementsByTagName("component");
+    var componentUpdate = null;
+    var domElement = null;
+        for (var i = 0; i < componentUpdates.length; i++)
+        {
+            componentUpdate = componentUpdates[i];
+            domElement = document.getElementById(componentUpdate.getAttribute("id"));
+            domElement.innerHTML = componentUpdate.firstChild.data;
+        }
+    }
+    else
+    {
+        alert("an Error occured during the ajax-request " + data.message);
+    }
+}
+
+//This Method checks if an AJAX Call is to be done instead of submitting the form
+//as usual. If so it uses dojo.bind to submit the mainform via AJAX
+
+org.apache.myfaces.PPRCtrl.prototype.ajaxSubmitFunction = function(triggerElement)
+{
+    if(typeof triggerElement != "undefined")
+    {
+        var triggeredComponents = this.getTriggeredComponents(triggerElement);
+        if(triggeredComponents !=null)
+        {
+            var requestUri = "";
+            var formAction = this.form.attributes["action"];
+            if(formAction == null)
+            {
+                requestUri = location.href;
+            }
+            else
+            {
+                requestUri = formAction.nodeValue;
+            }
+
+            var content=new Array;
+            content[triggerElement.name]=triggerElement.value;
+            content["org.apache.myfaces.PPRCtrl.triggeredComponents"]=triggeredComponents;
+            content["org.apache.myfaces.PPRCtrl.ajaxRequest"]="true";
+            dojo.io.bind({
+                url		: requestUri,
+                method	: "post",
+                useCache: false,
+                content	: content,
+                handle	: this.handleCallback,
+                mimetype: "text/xml",
+                transport: "XMLHTTPTransport",
+                formNode: this.form
+            });
+            return false;
+        }
+        else
+        {
+            this.form.submit_orig();
+        }
+    }
+    else
+    {
+        this.form.submit_orig();
+    }
+}
+
+//This Method replaces the mainform Submitfunciton to call AJAX submit
+
+org.apache.myfaces.PPRCtrl.prototype.formSubmitReplacement = function(triggeredElement)
+{
+    this.myFacesPPRCtrl.ajaxSubmitFunction(triggeredElement);
+}
+
+//The submit Function of the mainform is replaced with the AJAX submit method
+//This Method is called during the initailisation of a PPR Controller
+
+org.apache.myfaces.PPRCtrl.prototype.replaceFormSubmitFunction = function(formId)
+{
+    this.form = document.getElementById(formId);
+    if(typeof this.form == "undefined" || this.form.tagName.toLowerCase() != "form")
+    {
+        alert("MyFaces PPR Engine: Form with id:" + formId + " not found!");
+        return;
+    }
+    this.form.submit_orig = this.form.submit;
+    this.form.myFacesPPRCtrl = this;
+    this.form.submit = this.formSubmitReplacement;
+}
+
+//TODO: event connect
+//This Method defines joinpoints for all inputs of either type submit or image
+
+org.apache.myfaces.PPRCtrl.prototype.addButtonOnClickHandlers = function()
+{
+    if (typeof this.form == "undefined" || this.form.tagName.toLowerCase() != "form")
+    {
+        return;
+    }
+
+        formButtons = new Array();
+        for (var i = 0; i < this.form.elements.length; i++)
+        {
+            if (this.form.elements[i].tagName.toLowerCase() == "input" &&
+                (this.form.elements[i].type.toLowerCase() == "submit" ||
+                 this.form.elements[i].type.toLowerCase() == "image")
+                )
+            {
+            formButtons.push(this.form.elements[i]);
+            }
+        }
+
+        for (var i = 0; i < formButtons.length; i++)
+        {
+            var button = formButtons[i];
+                button.onclick_orig = button.onclick;
+                button.onclick = this.buttonOnClickHandler;
+                button.myFacesPPRCtrl=this;
+                //dojo.event.connect(button,"onClick",this,"buttonOnClickHandler");
+        }
+
+}
+
+//PointCutAdvisor which invokes the AJAX Submit Method of the PPR Controller after custom
+//onclick-handlers for submit-buttons and submit-images
+
+org.apache.myfaces.PPRCtrl.prototype.buttonOnClickHandler = function (_event)
+{
+    if(this.onclick_orig.type != "undefined")
+    {
+        this.onclick_orig();
+    }
+    return this.myFacesPPRCtrl.ajaxSubmitFunction(this);
+}
+
+//Based on the Component which triggerd the submit this Method returns a comma-seperated
+//list of component-ids which are to be updated via an AJAX call
+
+org.apache.myfaces.PPRCtrl.prototype.getTriggeredComponents = function(triggerElement)
+{
+    if (typeof triggerElement != "undefined")
+    {
+        if (typeof this.partialTriggers[triggerElement.id] != "undefined")
+        {
+            return this.partialTriggers[triggerElement.id];
+        }
+    }
+    return null;
+};
\ No newline at end of file

Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld?rev=433750&r1=433749&r2=433750&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld (original)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/tld/myfaces_sandbox.tld Tue Aug 22 13:56:00 2006
@@ -1186,4 +1186,20 @@
 		&ui_select_items_attributes;
 		&select_items_attributes;
 	</tag>
+    <!-- inputSuggest -->
+	<tag>
+		<name>pprPanelGroup</name>
+		<tag-class>org.apache.myfaces.custom.ppr.PPRPanelGroupTag</tag-class>
+		<body-content>JSP</body-content>
+		<description>PanelGroup which supports a partialTriggers Attribute similar to the one in Trinidad</description>
+		&standard_panel_group_attributes;
+		<attribute>
+			<name>partialTriggers</name>
+			<required>false</required>
+			<rtexprvalue>false</rtexprvalue>
+			<type>java.lang.String</type>
+            <description>Comma or Space seperated List of ids from ui_command-items which trigger
+            a partial update of this PanelGroup</description>
+        </attribute>
+	</tag>
 </taglib>

Added: myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/PPRExampleBean.java
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/PPRExampleBean.java?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/PPRExampleBean.java (added)
+++ myfaces/tomahawk/trunk/sandbox/examples/src/main/java/org/apache/myfaces/examples/ppr/PPRExampleBean.java Tue Aug 22 13:56:00 2006
@@ -0,0 +1,23 @@
+package org.apache.myfaces.examples.ppr;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: Ernst
+ * Date: 20.08.2006
+ * Time: 18:44:10
+ * To change this template use File | Settings | File Templates.
+ */
+public class PPRExampleBean
+{
+    private String _textField;
+
+    public String getTextField()
+    {
+        return _textField;
+    }
+
+    public void setTextField(String textField)
+    {
+        this._textField = textField;
+    }
+}

Modified: myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/examples-config.xml
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/examples-config.xml?rev=433750&r1=433749&r2=433750&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/examples-config.xml (original)
+++ myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/WEB-INF/examples-config.xml Tue Aug 22 13:56:00 2006
@@ -10,8 +10,8 @@
 
     <!--  logger/debugging phase listener -->
     <lifecycle>
-       <phase-listener>org.apache.myfaces.examples.debug.DebugPhaseListener</phase-listener>
-    </lifecycle>
+       <!--<phase-listener>org.apache.myfaces.examples.debug.DebugPhaseListener</phase-listener>
+    --></lifecycle>
 
     <!-- managed bean for notifierBean-->
 
@@ -81,6 +81,14 @@
         <managed-bean-name>ajaxChildComboBoxBean</managed-bean-name>
         <managed-bean-class>org.apache.myfaces.examples.ajaxchildcombobox.AjaxChildComboBoxBean</managed-bean-class>
         <managed-bean-scope>session</managed-bean-scope>
+    </managed-bean>
+
+    <!-- Managed Beans for pprPanelGroup.jsp -->
+
+    <managed-bean>
+        <managed-bean-name>pprExampleBean</managed-bean-name>
+        <managed-bean-class>org.apache.myfaces.examples.ppr.PPRExampleBean</managed-bean-class>
+        <managed-bean-scope>request</managed-bean-scope>
     </managed-bean>
 
   <managed-bean>

Modified: myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/home.jsp
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/home.jsp?rev=433750&r1=433749&r2=433750&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/home.jsp (original)
+++ myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/home.jsp Tue Aug 22 13:56:00 2006
@@ -1,4 +1,4 @@
-??<%@ page session="false" contentType="text/html;charset=utf-8"%>
+<%@ page session="false" contentType="text/html;charset=utf-8"%>
 <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
 <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
 
@@ -20,7 +20,10 @@
                     <h:outputText style="font-size:10px;color:#FFFFFF" value=" (Sandbox Version #{buildInfo['tomahawk_version']}, using #{buildInfo ['jsf_implementation']})"/>
                 </f:verbatim>
             </h:panelGrid>
-
+            <h:outputText value="Partial Page Rendering"/>
+            <h:panelGrid style="padding-left:25px">
+	            <h:outputLink value="pprPanelGroup.jsf" ><f:verbatim>PPRPanelGroup - Panelgroup which gets refreshed by AJAX-Calls</f:verbatim></h:outputLink>
+            </h:panelGrid>
             <h:outputText value="Resource Serving"/>
             <h:panelGrid style="padding-left:25px">
 	            <h:outputLink value="graphicImageDynamic.jsf" ><f:verbatim>GraphicImageDynamic - graphic image without a dedicated servlet</f:verbatim></h:outputLink>

Added: myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/pprPanelGroup.jsp
URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/pprPanelGroup.jsp?rev=433750&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/pprPanelGroup.jsp (added)
+++ myfaces/tomahawk/trunk/sandbox/examples/src/main/webapp/pprPanelGroup.jsp Tue Aug 22 13:56:00 2006
@@ -0,0 +1,51 @@
+<%@ page session="false" contentType="text/html;charset=utf-8" %>
+<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
+<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
+<%@ taglib uri="http://myfaces.apache.org/sandbox" prefix="s" %>
+<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
+
+<html>
+
+<%@ include file="inc/head.inc" %>
+
+
+<body>
+<h1>PPR Example </h1>
+<span id="cnt">0</span> seconds since last page refresh.
+<script>
+    var sec=0;
+    function counter(){
+        setTimeout("counter();",1000);
+        document.getElementById("cnt").innerHTML = sec++;
+    }
+    counter();
+</script>
+
+<f:view>
+
+    <h:form id="mainform" >
+       
+
+<t:messages id="messageList" styleClass="error" showDetail="true" summaryFormat="{0} "/>
+    <h:inputText value="#{pprExampleBean.textField}" />
+
+    <h:commandButton id="pprSubmit1" value="PPR Submit" />
+    <h:commandButton id="pprSubmit2" value="2 nd PPR Submit" />
+    <h:commandButton id="normalSubmit" value="Submit" />
+
+    <s:pprPanelGroup id="ppr1" partialTriggers="mainform:pprSubmit1,mainform:pprSubmit2">
+        <h:outputText value="#{pprExampleBean.textField}" />
+    </s:pprPanelGroup>
+
+    <s:pprPanelGroup id="ppr2" partialTriggers="mainform:pprSubmit1,mainform:pprSubmit2">
+         <h:outputText value="#{pprExampleBean.textField}" />
+    </s:pprPanelGroup>
+
+    </h:form>
+
+</f:view>
+
+</body>
+
+</html>
+