svn commit: r658281 - in /ofbiz/trunk/framework: base/src/base/org/ofbiz/base/util/string/ common/widget/ example/config/ example/webapp/example/WEB-INF/ example/widget/example/ images/webapp/images/ widget/dtd/ widget/src/org/ofbiz/widget/form/ widget...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r658281 - in /ofbiz/trunk/framework: base/src/base/org/ofbiz/base/util/string/ common/widget/ example/config/ example/webapp/example/WEB-INF/ example/widget/example/ images/webapp/images/ widget/dtd/ widget/src/org/ofbiz/widget/form/ widget...

adrianc
Author: adrianc
Date: Tue May 20 08:33:22 2008
New Revision: 658281

URL: http://svn.apache.org/viewvc?rev=658281&view=rev
Log:
Improved screen widget Ajax support.

The original Ajax work was a great start, but there were limitations. These changes open things up a bit: 1) Ajax rendering falls back to plain HTML when the user has JavaScript disabled. 2) You can have more than one area updated during an event.

IE7 updates only <div> elements, so be aware of that when using the Ajax feature.

See the Example component for a demonstration.

Modified:
    ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java
    ofbiz/trunk/framework/common/widget/CommonScreens.xml
    ofbiz/trunk/framework/example/config/ExampleUiLabels.xml
    ofbiz/trunk/framework/example/webapp/example/WEB-INF/controller.xml
    ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml
    ofbiz/trunk/framework/example/widget/example/ExampleForms.xml
    ofbiz/trunk/framework/images/webapp/images/selectall.js
    ofbiz/trunk/framework/widget/dtd/widget-form.xsd
    ofbiz/trunk/framework/widget/dtd/widget-screen.xsd
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java

Modified: ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java (original)
+++ ofbiz/trunk/framework/base/src/base/org/ofbiz/base/util/string/FlexibleStringExpander.java Tue May 20 08:33:22 2008
@@ -19,8 +19,6 @@
 package org.ofbiz.base.util.string;
 
 import java.io.Serializable;
-import java.text.DateFormat;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
@@ -30,7 +28,6 @@
 import org.ofbiz.base.util.BshUtil;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.ObjectType;
-import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.collections.FlexibleMapAccessor;
 import org.ofbiz.base.util.UtilFormatOut;
@@ -48,6 +45,7 @@
  * and specified (XXX) currency
  *
  */
+@SuppressWarnings("serial")
 public class FlexibleStringExpander implements Serializable {
     
     public static final String module = FlexibleStringExpander.class.getName();

Modified: ofbiz/trunk/framework/common/widget/CommonScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/widget/CommonScreens.xml?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/widget/CommonScreens.xml (original)
+++ ofbiz/trunk/framework/common/widget/CommonScreens.xml Tue May 20 08:33:22 2008
@@ -100,6 +100,7 @@
                 <set field="layoutSettings.javaScripts[]" value="/images/calendar1.js" global="true"/>
                 <set field="layoutSettings.javaScripts[]" value="/images/selectall.js" global="true"/>
                 <set field="layoutSettings.javaScripts[]" value="/images/fieldlookup.js" global="true"/>
+                <set field="layoutSettings.javaScripts[]" value="/images/prototypejs/prototype.js" global="true"/>
                 <!-- The default (global) shortcut icon -->
                 <set field="layoutSettings.shortcutIcon" value="/images/ofbiz.ico" global="true"/>
                 <!-- The default (global) logo -->
@@ -205,6 +206,7 @@
                 <set field="layoutSettings.javaScripts[]" value="/images/calendar1.js" global="true"/>
                 <set field="layoutSettings.javaScripts[]" value="/images/selectall.js" global="true"/>
                 <set field="layoutSettings.javaScripts[]" value="/images/fieldlookup.js" global="true"/>
+                <set field="layoutSettings.javaScripts[]" value="/images/prototypejs/prototype.js" global="true"/>
                 <!-- The default (global) shortcut icon -->
                 <set field="layoutSettings.shortcutIcon" value="/images/ofbiz.ico" global="true"/>
             </actions>

Modified: ofbiz/trunk/framework/example/config/ExampleUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/config/ExampleUiLabels.xml?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/config/ExampleUiLabels.xml (original)
+++ ofbiz/trunk/framework/example/config/ExampleUiLabels.xml Tue May 20 08:33:22 2008
@@ -27,6 +27,9 @@
         <value xml:lang="th">ตัวอย่างโปรแกรมคอมพิวเตอร์</value>
         <value xml:lang="zh">样例应用</value>
     </property>
+    <property key="ExampleAjaxIntro">
+        <value xml:lang="en">To use this Ajax demonstration, you must have JavaScript enabled on your browser.</value>
+    </property>
     <property key="ExampleCompanyName">
         <value xml:lang="en">OFBiz: Example</value>
         <value xml:lang="it">OFBiz: Esempi</value>

Modified: ofbiz/trunk/framework/example/webapp/example/WEB-INF/controller.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/webapp/example/WEB-INF/controller.xml?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/webapp/example/WEB-INF/controller.xml (original)
+++ ofbiz/trunk/framework/example/webapp/example/WEB-INF/controller.xml Tue May 20 08:33:22 2008
@@ -66,6 +66,18 @@
         <response name="success" type="view" value="EditExample"/>
         <response name="error" type="view" value="EditExample"/>
     </request-map>
+    <request-map uri="createExampleAjax">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="createExample"/>
+        <response name="success" type="view" value="findExampleAjax"/>
+        <response name="error" type="view" value="findExampleAjax"/>
+    </request-map>
+    <request-map uri="updateExampleAjax">
+        <security https="true" auth="true"/>
+        <event type="service" invoke="updateExample"/>
+        <response name="success" type="view" value="findExampleAjax"/>
+        <response name="error" type="view" value="findExampleAjax"/>
+    </request-map>
     
     <request-map uri="EditExampleItems"><security https="true" auth="true"/><response name="success" type="view" value="EditExampleItems"/></request-map>
     <request-map uri="createExampleItem">
@@ -147,8 +159,8 @@
 
     <request-map uri="LookupExampleFeature"><security https="true" auth="true"/><response name="success" type="view" value="LookupExampleFeature"/></request-map>
 
-    <request-map uri="ListExampleFormOnly"><security https="true" auth="true"/><response name="success" type="view" value="ListExampleFormOnly"/></request-map>
-    <request-map uri="CreateExampleFormOnly"><security https="true" auth="true"/><response name="success" type="view" value="CreateExampleFormOnly"/></request-map>
+    <request-map uri="ListExampleFormOnly"><security https="true" auth="false"/><response name="success" type="view" value="ListExampleFormOnly"/></request-map>
+    <request-map uri="CreateExampleFormOnly"><security https="true" auth="false"/><response name="success" type="view" value="CreateExampleFormOnly"/></request-map>
     <!-- end of request mappings -->
 
     <!-- View Mappings -->

Modified: ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml (original)
+++ ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml Tue May 20 08:33:22 2008
@@ -26,7 +26,6 @@
             <actions>
                 <set field="headerItem" value="AjaxExample"/>
                 <set field="titleProperty" value="PageTitleFindExample"/>
-                <set field="layoutSettings.javaScripts[+0]" value="/images/prototypejs/prototype.js" global="true"/>
             </actions>
             <widgets>
                 <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
@@ -37,11 +36,22 @@
                             </condition>
                             <widgets>
                                 <container style="h1"><label>${uiLabelMap.${titleProperty}}</label></container>
-                                <container id="ListExamplesAutoUpdate" auto-update-target="ListExampleFormOnly">
+                                <section>
+                                    <condition>
+                                        <if-compare field-name="javaScriptEnabled" value="true" operator="equals"/>
+                                    </condition>
+                                    <widgets/>
+                                    <fail-widgets>
+                                        <container style="button-bar"><label>${uiLabelMap.ExampleAjaxIntro}</label></container>
+                                    </fail-widgets>
+                                </section>
+                                <container id="ListExamplesAjax">
                                     <include-screen name="ListExampleFormOnly"/>
                                 </container>
                                 <container style="h2"><label>${uiLabelMap.ExampleNewExample}</label></container>
-                                <include-screen name="CreateExampleFormOnly"/>
+                                <container id="EditExampleAjax">
+                                    <include-screen name="CreateExampleFormOnly"/>
+                                </container>
                             </widgets>
                             <fail-widgets>
                                 <label style="h3">${uiLabelMap.ExampleViewPermissionError}</label>
@@ -55,21 +65,29 @@
 
     <screen name="ListExampleFormOnly">
         <section>
+            <condition>
+                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+            </condition>
             <actions>
                 <!-- NOTE: these are needed because this may be run as a top level screen and would have no decorator -->
                 <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
                 <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
             </actions>
             <widgets>
-                <include-form name="ListExamples" location="component://example/widget/example/ExampleForms.xml"/>
+                <include-form name="ListExamplesAjax" location="component://example/widget/example/ExampleForms.xml"/>
             </widgets>
         </section>
     </screen>
 
     <screen name="CreateExampleFormOnly">
         <section>
+            <condition>
+                <if-has-permission permission="EXAMPLE" action="_VIEW"/>
+            </condition>
             <actions>
                 <!-- these are only needed so that when bsh evaluates use-when attributes these will exist and not cause an error -->
+                <property-map resource="ExampleUiLabels" map-name="uiLabelMap" global="true"/>
+                <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/>
                 <set field="exampleId" from-field="parameters.exampleId"/>
                 <entity-one entity-name="Example" value-name="example"/>
             </actions>

Modified: ofbiz/trunk/framework/example/widget/example/ExampleForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/widget/example/ExampleForms.xml?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/widget/example/ExampleForms.xml (original)
+++ ofbiz/trunk/framework/example/widget/example/ExampleForms.xml Tue May 20 08:33:22 2008
@@ -34,6 +34,12 @@
         <field name="description" title="${uiLabelMap.CommonDescription}"><display/></field>
     </form>
 
+    <!-- Typically, this extended form wouldn't be necessary. The parent form (ListExamples) would
+        have these attributes. -->
+    <form name="ListExamplesAjax" extends="ListExamples" type="list" paginate-target="authview/findExampleAjax" view-size="3">
+        <on-event-update-area event-type="paginate" area-id="ListExamplesAjax" area-target="ListExampleFormOnly"/>
+    </form>
+
     <form name="EditExample" type="single" target="updateExample" title="" default-map-name="example">
         <actions>
             <entity-one entity-name="StatusItem" value-name="currentStatus" auto-field-map="false">
@@ -84,9 +90,12 @@
         <field name="submitButton" use-when="example!=null" title="${uiLabelMap.CommonUpdate}"><submit button-type="button"/></field>
     </form>
 
-    <form name="EditExampleBackgroundSubmit" extends="EditExample">
-        <field name="submitButton" use-when="example==null" title="${uiLabelMap.CommonCreate}"><submit button-type="button" background-submit-refresh-target="CreateExampleFormOnly"/></field>
-        <field name="submitButton" use-when="example!=null" title="${uiLabelMap.CommonUpdate}"><submit button-type="button" background-submit-refresh-target="CreateExampleFormOnly"/></field>
+    <!-- Typically, this extended form wouldn't be necessary. The parent form (EditExample) would
+        have these settings. -->
+    <form name="EditExampleBackgroundSubmit" type="single" extends="EditExample" target="updateExampleAjax">
+        <alt-target use-when="example==null" target="createExampleAjax"/>
+        <on-event-update-area event-type="submit" area-id="ListExamplesAjax" area-target="ListExampleFormOnly"/>
+        <on-event-update-area event-type="submit" area-id="EditExampleAjax" area-target="CreateExampleFormOnly"/>
     </form>
 
     <!-- ExampleItem -->

Modified: ofbiz/trunk/framework/images/webapp/images/selectall.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/selectall.js?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/images/webapp/images/selectall.js (original)
+++ ofbiz/trunk/framework/images/webapp/images/selectall.js Tue May 20 08:33:22 2008
@@ -226,7 +226,7 @@
 function ajaxUpdateAreas(areaCsvString) {
     var areaArray = areaCsvString.split(",");
     var numAreas = parseInt(areaArray.length / 3);
-    for (var i = 0; i < numAreas; i = i + 3) {
+    for (var i = 0; i < numAreas * 3; i = i + 3) {
         new Ajax.Updater(areaArray[i], areaArray[i + 1], {parameters: areaArray[i + 2]});
     }
 }

Modified: ofbiz/trunk/framework/widget/dtd/widget-form.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-form.xsd?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/dtd/widget-form.xsd (original)
+++ ofbiz/trunk/framework/widget/dtd/widget-form.xsd Tue May 20 08:33:22 2008
@@ -36,6 +36,7 @@
                 <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-service"/>
                 <xs:element minOccurs="0" maxOccurs="unbounded" ref="auto-fields-entity"/>
                 <xs:element minOccurs="0" maxOccurs="unbounded" ref="field"/>
+                <xs:element minOccurs="0" maxOccurs="unbounded" ref="on-event-update-area"/>
                 <xs:element minOccurs="0" ref="sort-order"/>
             </xs:sequence>
             <xs:attributeGroup ref="attlist.form"/>
@@ -317,6 +318,27 @@
     <xs:attributeGroup name="attlist.sort-field">
         <xs:attribute type="xs:string" name="name" use="required"/>
     </xs:attributeGroup>
+    <!-- ================== Form Events ==================== -->
+    <xs:attributeGroup name="attlist.on-form-event-update-area">
+        <xs:attribute name="event-type" use="required">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="paginate"/>
+                    <xs:enumeration value="submit"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:string" name="area-id" use="required"/>
+        <xs:attribute type="xs:string" name="area-target" use="required"/>
+    </xs:attributeGroup>
+    <xs:element name="on-event-update-area">
+        <xs:annotation>
+            <xs:documentation>Area to be updated when a form event occurs.</xs:documentation>
+        </xs:annotation>
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.on-form-event-update-area"/>
+        </xs:complexType>
+    </xs:element>
 
   <!-- ================== FIELDS ==================== -->
     <xs:element name="AllFields" abstract="true"/>
@@ -800,7 +822,8 @@
         </xs:attribute>
         <xs:attribute type="xs:string" name="image-location"/>
         <xs:attribute type="xs:string" name="background-submit-refresh-target">
-            <xs:annotation><xs:documentation>This will submit the form in the background and refresh just this form and not the rest of the page. Note that the button-type must be button.</xs:documentation></xs:annotation>
+            <xs:annotation><xs:documentation>Deprecated. Use the on-event-update-area element
+                instead.</xs:documentation></xs:annotation>
         </xs:attribute>
     </xs:attributeGroup>
     <xs:element name="text" substitutionGroup="AllFields">

Modified: ofbiz/trunk/framework/widget/dtd/widget-screen.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-screen.xsd?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/dtd/widget-screen.xsd (original)
+++ ofbiz/trunk/framework/widget/dtd/widget-screen.xsd Tue May 20 08:33:22 2008
@@ -754,7 +754,17 @@
     <xs:attributeGroup name="attlist.container">
         <xs:attribute type="xs:string" name="id"/>
         <xs:attribute type="xs:string" name="style"/>
-        <xs:attribute type="xs:string" name="auto-update-target"/>
+        <xs:attribute type="xs:string" name="auto-update-target">
+            <xs:annotation>
+                <xs:documentation>The URL to be called for periodic asynchronous area updates.
+                Some widget rendering environments support asynchronous updates.</xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
+        <xs:attribute type="xs:integer" name="auto-update-interval">
+            <xs:annotation>
+                <xs:documentation>The auto-update interval, in seconds.</xs:documentation>
+            </xs:annotation>
+        </xs:attribute>
     </xs:attributeGroup>
     <xs:element name="image" substitutionGroup="AllWidgets">
         <xs:complexType mixed="true">

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Tue May 20 08:33:22 2008
@@ -182,6 +182,11 @@
     protected FlexibleStringExpander rowCountExdr;
     protected List multiSubmitFields = FastList.newInstance();
     protected int rowCount = 0;
+    
+    /** On Submit areas to be updated. */
+    protected List<UpdateArea> onSubmitUpdateAreas;
+    /** On Paginate areas to be updated. */
+    protected List<UpdateArea> onPaginateUpdateAreas;
 
     // ===== CONSTRUCTORS =====
     /** Default Constructor */
@@ -271,11 +276,14 @@
                 this.targetWindowExdr = parent.targetWindowExdr;
                 this.hideHeader = parent.hideHeader;
                 this.clientAutocompleteFields = parent.clientAutocompleteFields;
+                this.paginateTarget = parent.paginateTarget;
 
                 this.altTargets.addAll(parent.altTargets);
                 this.actions = parent.actions;
                 this.rowActions = parent.rowActions;
                 this.defaultViewSize = parent.defaultViewSize;
+                this.onSubmitUpdateAreas = parent.onSubmitUpdateAreas;
+                this.onPaginateUpdateAreas = parent.onPaginateUpdateAreas;
                 
                 //these are done below in a special way...
                 //this.fieldList = parent.fieldList;
@@ -444,6 +452,13 @@
             this.addAltTarget(altTarget);
         }
             
+        // on-event-update-area
+        List<? extends Element> updateAreaElements = UtilXml.childElementList(formElement, "on-event-update-area");
+        for (Element updateAreaElement : updateAreaElements) {
+            UpdateArea updateArea = new UpdateArea(updateAreaElement);
+            this.addOnEventUpdateArea(updateArea);
+        }
+            
         // auto-fields-service
         List autoFieldsServiceElements = UtilXml.childElementList(formElement, "auto-fields-service");
         Iterator autoFieldsServiceElementIter = autoFieldsServiceElements.iterator();
@@ -599,6 +614,40 @@
         }
     }
 
+    public void addOnEventUpdateArea(UpdateArea updateArea) {
+        // Event types are sorted as a convenience
+        // for the rendering classes
+        if ("paginate".equals(updateArea.getEventType())) {
+            addOnPaginateUpdateArea(updateArea);
+        } else if ("submit".equals(updateArea.getEventType())) {
+            addOnSubmitUpdateArea(updateArea);
+        }
+    }
+
+    protected void addOnSubmitUpdateArea(UpdateArea updateArea) {
+        if (onSubmitUpdateAreas == null) {
+            onSubmitUpdateAreas = FastList.newInstance();
+        }
+        int index = onSubmitUpdateAreas.indexOf(updateArea);
+        if (index != -1) {
+            onSubmitUpdateAreas.set(index, updateArea);
+        } else {
+            onSubmitUpdateAreas.add(updateArea);
+        }
+    }
+
+    protected void addOnPaginateUpdateArea(UpdateArea updateArea) {
+        if (onPaginateUpdateAreas == null) {
+            onPaginateUpdateAreas = FastList.newInstance();
+        }
+        int index = onPaginateUpdateAreas.indexOf(updateArea);
+        if (index != -1) {
+            onPaginateUpdateAreas.set(index, updateArea);
+        } else {
+            onPaginateUpdateAreas.add(updateArea);
+        }
+    }
+
     public void addAutoFieldsFromService(AutoFieldsService autoFieldsService) {
         autoFieldsServices.add(autoFieldsService);
 
@@ -2169,6 +2218,10 @@
         this.type = string;
     }
 
+    public List<UpdateArea> getOnPaginateUpdateAreas() {
+        return this.onPaginateUpdateAreas;
+    }
+
     public String getPaginateTarget(Map context) {
         String targ = this.paginateTarget.expandString(context);
         if (UtilValidate.isEmpty(targ)) {
@@ -2369,9 +2422,6 @@
         this.overridenListSize = overridenListSize;
     }
 
-    /**
-     * @param string
-     */
     public void setPaginateTarget(String string) {
         this.paginateTarget = new FlexibleStringExpander(string);
     }
@@ -2546,6 +2596,12 @@
         return inbetweenList;
     }
     
+    /* Returns the list of ModelForm.UpdateArea objects.
+     */
+    public List<UpdateArea> getOnSubmitUpdateAreas() {
+        return this.onSubmitUpdateAreas;
+    }
+    
     public static class AltTarget {
         public String useWhen;
         public String target;
@@ -2561,6 +2617,48 @@
         }
     }
 
+    /** The UpdateArea class implements the <code>&lt;on-event-update-area&gt;</code>
+     * elements used in form widgets.
+     */
+    public static class UpdateArea {
+        protected String eventType;
+        protected String areaId;
+        protected String areaTarget;
+        /** XML constructor.
+         * @param updateAreaElement The <code>&lt;on-xxx-update-area&gt;</code>
+         * XML element.
+         */
+        public UpdateArea(Element updateAreaElement) {
+            this.eventType = updateAreaElement.getAttribute("event-type");
+            this.areaId = updateAreaElement.getAttribute("area-id");
+            this.areaTarget = updateAreaElement.getAttribute("area-target");
+        }
+        /** String constructor.
+         * @param areaId The id of the widget element to be updated
+         * @param areaTarget The target URL called to update the area
+         */
+        public UpdateArea(String eventType, String areaId, String areaTarget) {
+            this.eventType = eventType;
+            this.areaId = areaId;
+            this.areaTarget = areaTarget;
+        }
+        public int hashCode() {
+            return areaId.hashCode();
+        }
+        public boolean equals(Object obj) {
+            return obj instanceof UpdateArea && obj.hashCode() == this.hashCode();
+        }
+        public String getEventType() {
+            return eventType;
+        }
+        public String getAreaId() {
+            return areaId;
+        }
+        public String getAreaTarget(Map<String, ? extends Object> context) {
+            return FlexibleStringExpander.expandString(areaTarget, context);
+        }
+    }
+
     public static class AutoFieldsService {
         public String serviceName;
         public String mapName;

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java Tue May 20 08:33:22 2008
@@ -18,18 +18,21 @@
  *******************************************************************************/
 package org.ofbiz.widget.html;
 
+import java.sql.Timestamp;
+import java.util.Calendar;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.HashSet;
-import java.util.Calendar;
-import java.sql.Timestamp;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import javolution.util.FastList;
+
+import org.apache.commons.lang.StringEscapeUtils;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilHttp;
 import org.ofbiz.base.util.UtilProperties;
@@ -62,8 +65,6 @@
 import org.ofbiz.widget.form.ModelFormField.TextFindField;
 import org.ofbiz.widget.form.ModelFormField.TextareaField;
 
-import org.apache.commons.lang.StringEscapeUtils;
-
 /**
  * Widget Library - HTML Form Renderer implementation
  */
@@ -872,8 +873,20 @@
         } else {
             // default to "button"
 
+            String formId = modelForm.getContainerId();
+            List<ModelForm.UpdateArea> updateAreas = modelForm.getOnSubmitUpdateAreas();
+            // This is here for backwards compatibility. Use on-event-update-area
+            // elements instead.
             String backgroundSubmitRefreshTarget = submitField.getBackgroundSubmitRefreshTarget(context);
             if (UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) {
+                if (updateAreas == null) {
+                    updateAreas = FastList.newInstance();
+                }
+                updateAreas.add(new ModelForm.UpdateArea("submit", formId, backgroundSubmitRefreshTarget));
+            }
+
+            boolean ajaxEnabled = (updateAreas != null || UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) && UtilHttp.isJavaScriptEnabled(request);
+            if (ajaxEnabled) {
                 buffer.append("<input type=\"button\"");
             } else {
                 buffer.append("<input type=\"submit\"");
@@ -906,17 +919,34 @@
                 // disabling for now, using form onSubmit action instead: buffer.append(singleClickAction);
             }
             
-            if (UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) {
-                // onclick="javascript:submitFormInBackground($('EditExampleBackgroundSubmit'), 'EditExampleBackgroundSubmit', '<@ofbizUrl>/authview/CreateExampleFormOnly</@ofbizUrl>');"
-                String formId = submitField.getModelFormField().getModelForm().getContainerId();
-                String formContainerId = submitField.getModelFormField().getModelForm().getContainerId();
-                buffer.append(" onclick=\"javascript:submitFormInBackground($('");
-                buffer.append(formId);
-                buffer.append("'), '");
-                buffer.append(formContainerId);
-                buffer.append("', '");
-                this.appendOfbizUrl(buffer, backgroundSubmitRefreshTarget);
-                buffer.append("');\"");
+            if (ajaxEnabled) {
+                buffer.append(" onclick=\"");
+                if (updateAreas.size() == 1) {
+                    ModelForm.UpdateArea updateArea = updateAreas.get(0);
+                    buffer.append("submitFormInBackground($('");
+                    buffer.append(formId);
+                    buffer.append("'), '");
+                    buffer.append(updateArea.getAreaId());
+                    buffer.append("', '");
+                    this.appendOfbizUrl(buffer, updateArea.getAreaTarget(context));
+                } else {
+                    buffer.append("ajaxSubmitFormUpdateAreas($('");
+                    buffer.append(formId);
+                    buffer.append("'), '");
+                    boolean firstLoop = true;
+                    for (ModelForm.UpdateArea updateArea : updateAreas) {
+                        if (firstLoop) {
+                            firstLoop = false;
+                        } else {
+                            buffer.append(",");
+                        }
+                        String targetString = updateArea.getAreaTarget(context);
+                        String target = UtilHttp.removeQueryStringFromTarget(targetString);
+                        String targetParams = UtilHttp.getQueryStringFromTarget(targetString);
+                        buffer.append(updateArea.getAreaId() + "," + target + "," + targetParams);
+                    }
+                }
+                buffer.append("')\"");
             }
             
             buffer.append("/>");
@@ -1183,6 +1213,7 @@
         context.put("_QBESTRING_", queryString);
 
         renderBeginningBoundaryComment(buffer, "Form Widget", modelForm);
+
         if (this.renderPagination) {
             this.renderNextPrev(buffer, context, modelForm);
         }
@@ -1989,11 +2020,21 @@
     }
 
     public void renderNextPrev(StringBuffer buffer, Map context, ModelForm modelForm) {
-        String targetService = modelForm.getPaginateTarget(context);
+        boolean javaScriptEnabled = UtilHttp.isJavaScriptEnabled(request);
+        boolean ajaxEnabled = false;
+        List<ModelForm.UpdateArea> updateAreas = modelForm.getOnPaginateUpdateAreas();
+        String targetService = null;
+        if (javaScriptEnabled) {
+            if (UtilValidate.isNotEmpty(updateAreas)) {
+                ajaxEnabled = true;
+            }
+        } else {
+            targetService = modelForm.getPaginateTarget(context);
+        }
         if (targetService == null) {
             targetService = "${targetService}";
         }
-        if (UtilValidate.isEmpty(targetService)) {
+        if (UtilValidate.isEmpty(targetService) && updateAreas == null) {
             Debug.logWarning("Cannot paginate because TargetService is empty for the form: " + modelForm.getName(), module);
             return;
         }
@@ -2048,9 +2089,13 @@
         String paginateAnchor = modelForm.getPaginateTargetAnchor();
         if (paginateAnchor != null) anchor = "#" + paginateAnchor;
 
-        // preparing the link text, so that later in the code we can reuse this and just add the viewIndex
-        String prepLinkText = "";
-        prepLinkText = targetService;
+        // Create separate url path String and request parameters String,
+        // add viewIndex/viewSize parameters to request parameter String
+        String urlPath = UtilHttp.removeQueryStringFromTarget(targetService);
+        String prepLinkText = UtilHttp.getQueryStringFromTarget(targetService);
+        if (prepLinkText == null) {
+            prepLinkText = "";
+        }
         if (prepLinkText.indexOf("?") < 0) {
             prepLinkText += "?";
         } else if (!prepLinkText.endsWith("?")) {
@@ -2060,93 +2105,209 @@
             prepLinkText += queryString + "&amp;";
         }
         prepLinkText += viewSizeParam + "=" + viewSize + "&amp;" + viewIndexParam + "=";
+        if (ajaxEnabled) {
+            // Prepare params for prototype.js
+            prepLinkText = prepLinkText.replace("?", "");
+            prepLinkText = prepLinkText.replace("&amp;", "&");
+        }
 
         buffer.append("<div class=\"").append(modelForm.getPaginateStyle()).append("\">");
-        buffer.append("<ul>");
+        appendWhitespace(buffer);
+        buffer.append(" <ul>");
+        appendWhitespace(buffer);
         String linkText;
 
         // First button
-        buffer.append("<li class=\"").append(modelForm.getPaginateFirstStyle());
+        buffer.append("  <li class=\"").append(modelForm.getPaginateFirstStyle());
         if (viewIndex > 0) {
             buffer.append("\"><a href=\"");
-            linkText = prepLinkText + 0 + anchor;
-            // - make the link
-            buffer.append(rh.makeLink(this.request, this.response, linkText)).append("\">").append(modelForm.getPaginateFirstLabel(context)).append("</a>");
+            if (ajaxEnabled) {
+                buffer.append("javascript:ajaxUpdateAreas('");
+                for (ModelForm.UpdateArea updateArea : updateAreas) {
+                    linkText =  UtilHttp.getQueryStringFromTarget(updateArea.getAreaTarget(context));
+                    if (UtilValidate.isEmpty(linkText)) {
+                        linkText = "";
+                    }
+                    if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) {
+                        linkText += queryString + "&";
+                    }
+                    linkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "=" + 0 + anchor;
+                    linkText = linkText.replace("?", "");
+                    linkText = linkText.replace("&amp;", "&");
+                    buffer.append(updateArea.getAreaId() + ",");
+                    buffer.append(rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(updateArea.getAreaTarget(context))));
+                    buffer.append("," + linkText + ",");
+                }
+                buffer.append("')");
+            } else {
+                linkText = prepLinkText + 0 + anchor;
+                buffer.append(rh.makeLink(this.request, this.response, urlPath + linkText));
+            }
+            buffer.append("\">").append(modelForm.getPaginateFirstLabel(context)).append("</a>");
         } else {
             // disabled button
             buffer.append("-disabled\">").append(modelForm.getPaginateFirstLabel(context));
         }
         buffer.append("</li>");
+        appendWhitespace(buffer);
+
         // Previous button
-        buffer.append("<li class=\"").append(modelForm.getPaginatePreviousStyle());
+        buffer.append("  <li class=\"").append(modelForm.getPaginatePreviousStyle());
         if (viewIndex > 0) {
             buffer.append("\"><a href=\"");
-            linkText = prepLinkText + (viewIndex - 1) + anchor;
-            // - make the link
-            buffer.append(rh.makeLink(this.request, this.response, linkText)).append("\">").append(modelForm.getPaginatePreviousLabel(context)).append("</a>");
+            if (ajaxEnabled) {
+                buffer.append("javascript:ajaxUpdateAreas('");
+                for (ModelForm.UpdateArea updateArea : updateAreas) {
+                    linkText = UtilHttp.getQueryStringFromTarget(updateArea.getAreaTarget(context));
+                    if (UtilValidate.isEmpty(linkText)) {
+                        linkText = "";
+                    }
+                    if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) {
+                        linkText += queryString + "&";
+                    }
+                    linkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "=" + (viewIndex - 1) + anchor;
+                    linkText = linkText.replace("?", "");
+                    linkText = linkText.replace("&amp;", "&");
+                    buffer.append(updateArea.getAreaId() + ",");
+                    buffer.append(rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(updateArea.getAreaTarget(context))));
+                    buffer.append("," + linkText + ",");
+                }
+                buffer.append("')");
+            } else {
+                linkText = prepLinkText + (viewIndex - 1) + anchor;
+                buffer.append(rh.makeLink(this.request, this.response, urlPath + linkText));
+            }
+            buffer.append("\">").append(modelForm.getPaginatePreviousLabel(context)).append("</a>");
         } else {
             // disabled button
             buffer.append("-disabled\">").append(modelForm.getPaginatePreviousLabel(context));
         }
         buffer.append("</li>");
-        // used for iterator and for the last page
-        int page = 0;
-        if (listSize > 0) {
-
-            linkText = prepLinkText;
-            if(linkText.startsWith("/")) {
-                linkText = linkText.substring(1 , linkText.length());
-            }
+        appendWhitespace(buffer);
 
-            buffer.append("<li>").append(pageLabel).append(" <select name=\"page\" size=\"1\" onchange=\"location.href = '" + linkText + "' + this.value;\" >");
-            //actual value
-            for(int i = 0; i < listSize ; ) {
-                if(  page == viewIndex ) {
+        // Page select dropdown
+        if (listSize > 0 && javaScriptEnabled) {
+            buffer.append("  <li>").append(pageLabel).append(" <select name=\"page\" size=\"1\" onchange=\"");
+            if (ajaxEnabled) {
+                buffer.append("javascript:ajaxUpdateAreas('");
+                for (ModelForm.UpdateArea updateArea : updateAreas) {
+                    linkText = UtilHttp.getQueryStringFromTarget(updateArea.getAreaTarget(context));
+                    if (UtilValidate.isEmpty(linkText)) {
+                        linkText = "";
+                    }
+                    if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) {
+                        linkText += queryString + "&";
+                    }
+                    linkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "=' + this.value + '";
+                    linkText = linkText.replace("?", "");
+                    linkText = linkText.replace("&amp;", "&");
+                    buffer.append(updateArea.getAreaId() + ",");
+                    buffer.append(rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(updateArea.getAreaTarget(context))));
+                    buffer.append("," + linkText + ",");
+                }
+                buffer.append("')\"");
+            } else {
+                linkText = prepLinkText;
+                if (linkText.startsWith("/")) {
+                    linkText = linkText.substring(1);
+                }
+                buffer.append("location.href = '" + urlPath + linkText + "' + this.value;\"");
+            }
+            buffer.append(">");
+            // actual value
+            int page = 0;
+            for (int i = 0; i < listSize;) {
+                if (page == viewIndex) {
                     buffer.append("<option selected value=\"");
                 } else {
                     buffer.append("<option value=\"");
                 }
                 buffer.append(page);
                 buffer.append("\">");
-                buffer.append( 1 + page);
+                buffer.append(1 + page);
                 buffer.append("</option>");
                 // increment page and calculate next index
                 page++;
                 i = page * viewSize;
             }
             buffer.append("</select></li>");
-
             buffer.append("<li>");
-            buffer.append((lowIndex + 1) + " - " + (lowIndex + actualPageSize ) + " " + ofLabel + " " + listSize).append(" " + rowsLabel);
+            buffer.append((lowIndex + 1) + " - " + (lowIndex + actualPageSize) + " " + ofLabel + " " + listSize).append(" " + rowsLabel);
             buffer.append("</li>");
+            appendWhitespace(buffer);
         }
 
         // Next button
-        buffer.append("<li class=\"").append(modelForm.getPaginateNextStyle());
+        buffer.append("  <li class=\"").append(modelForm.getPaginateNextStyle());
         if (highIndex < listSize) {
             buffer.append("\"><a href=\"");
-            linkText = prepLinkText + (viewIndex + 1) + anchor;
-            // - make the link
-            buffer.append(rh.makeLink(this.request, this.response, linkText)).append("\">").append(modelForm.getPaginateNextLabel(context)).append("</a>");
+            if (ajaxEnabled) {
+                buffer.append("javascript:ajaxUpdateAreas('");
+                for (ModelForm.UpdateArea updateArea : updateAreas) {
+                    linkText = UtilHttp.getQueryStringFromTarget(updateArea.getAreaTarget(context));
+                    if (UtilValidate.isEmpty(linkText)) {
+                        linkText = "";
+                    }
+                    if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) {
+                        linkText += queryString + "&";
+                    }
+                    linkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "=" + (viewIndex + 1) + anchor;
+                    linkText = linkText.replace("?", "");
+                    linkText = linkText.replace("&amp;", "&");
+                    buffer.append(updateArea.getAreaId() + ",");
+                    buffer.append(rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(updateArea.getAreaTarget(context))));
+                    buffer.append("," + linkText + ",");
+                }
+                buffer.append("')");
+            } else {
+                linkText = prepLinkText + (viewIndex + 1) + anchor;
+                buffer.append(rh.makeLink(this.request, this.response, urlPath + linkText));
+            }
+            buffer.append("\">").append(modelForm.getPaginateNextLabel(context)).append("</a>");
         } else {
             // disabled button
             buffer.append("-disabled\">").append(modelForm.getPaginateNextLabel(context));
         }
         buffer.append("</li>");
+        appendWhitespace(buffer);
+
         // Last button
-        buffer.append("<li class=\"").append(modelForm.getPaginateLastStyle());
+        buffer.append("  <li class=\"").append(modelForm.getPaginateLastStyle());
         if (highIndex < listSize) {
             buffer.append("\"><a href=\"");
-            linkText = prepLinkText + (page - 1) + anchor;
-            // - make the link
-            buffer.append(rh.makeLink(this.request, this.response, linkText)).append("\">").append(modelForm.getPaginateLastLabel(context)).append("</a>");
+            if (ajaxEnabled) {
+                buffer.append("javascript:ajaxUpdateAreas('");
+                for (ModelForm.UpdateArea updateArea : updateAreas) {
+                    linkText = UtilHttp.getQueryStringFromTarget(updateArea.getAreaTarget(context));
+                    if (UtilValidate.isEmpty(linkText)) {
+                        linkText = "";
+                    }
+                    if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) {
+                        linkText += queryString + "&";
+                    }
+                    linkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "=" + (listSize / viewSize) + anchor;
+                    linkText = linkText.replace("?", "");
+                    linkText = linkText.replace("&amp;", "&");
+                    buffer.append(updateArea.getAreaId() + ",");
+                    buffer.append(rh.makeLink(this.request, this.response, UtilHttp.removeQueryStringFromTarget(updateArea.getAreaTarget(context))));
+                    buffer.append("," + linkText + ",");
+                }
+                buffer.append("')");
+            } else {
+                linkText = prepLinkText + (listSize / viewSize) + anchor;
+                buffer.append(rh.makeLink(this.request, this.response, urlPath + linkText));
+            }
+            buffer.append("\">").append(modelForm.getPaginateLastLabel(context)).append("</a>");
         } else {
             // disabled button
             buffer.append("-disabled\">").append(modelForm.getPaginateLastLabel(context));
         }
         buffer.append("</li>");
+        appendWhitespace(buffer);
 
-        buffer.append("</ul>").append("</div>");
+        buffer.append(" </ul>");
+        appendWhitespace(buffer);
+        buffer.append("</div>");
         appendWhitespace(buffer);
     }
 

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java Tue May 20 08:33:22 2008
@@ -30,6 +30,8 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import javolution.util.FastMap;
+
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilFormatOut;
@@ -38,19 +40,17 @@
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericValue;
+import org.ofbiz.service.LocalDispatcher;
 import org.ofbiz.webapp.control.RequestHandler;
 import org.ofbiz.webapp.taglib.ContentUrlTag;
+import org.ofbiz.widget.WidgetContentWorker;
+import org.ofbiz.widget.WidgetDataResourceWorker;
 import org.ofbiz.widget.form.FormStringRenderer;
 import org.ofbiz.widget.form.ModelForm;
-import org.ofbiz.widget.html.HtmlWidgetRenderer;
 import org.ofbiz.widget.menu.MenuStringRenderer;
 import org.ofbiz.widget.menu.ModelMenu;
-import org.ofbiz.widget.WidgetContentWorker;
-import org.ofbiz.widget.WidgetDataResourceWorker;
 import org.ofbiz.widget.screen.ModelScreenWidget;
 import org.ofbiz.widget.screen.ScreenStringRenderer;
-import org.ofbiz.service.LocalDispatcher;
-import javolution.util.FastMap;
 
 /**
  * Widget Library - HTML Form Renderer implementation
@@ -58,9 +58,15 @@
 public class HtmlScreenRenderer extends HtmlWidgetRenderer implements ScreenStringRenderer {
 
     public static final String module = HtmlScreenRenderer.class.getName();
+    protected int elementId = 999;
 
     public HtmlScreenRenderer() {}
 
+    protected String getNextElementId() {
+        elementId++;
+        return "hsr" + elementId;
+    }
+
     public void renderSectionBegin(Writer writer, Map context, ModelScreenWidget.Section section) throws IOException {
         renderBeginningBoundaryComment(writer, section.isMainSection?"Screen":"Section Widget", section);
     }
@@ -69,12 +75,30 @@
     }
 
     public void renderContainerBegin(Writer writer, Map context, ModelScreenWidget.Container container) throws IOException {
+        String containerId = container.getId(context);
+        String autoUpdateTarget = container.getAutoUpdateTargetExdr(context);
+        HttpServletRequest request = (HttpServletRequest) context.get("request");
+        if (UtilValidate.isNotEmpty(autoUpdateTarget) && UtilHttp.isJavaScriptEnabled(request)) {
+            if (UtilValidate.isEmpty(containerId)) {
+                containerId = getNextElementId();
+            }
+            HttpServletResponse response = (HttpServletResponse) context.get("response");
+            ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
+            RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
+
+            writer.write("<script type=\"text/javascript\">ajaxUpdateAreaPeriodic('");
+            writer.write(containerId);
+            writer.write("', '");
+            writer.write(rh.makeLink(request, response, autoUpdateTarget));
+            writer.write("', '");
+            writer.write("', '" + container.getAutoUpdateInterval() + "');</script>");
+            appendWhitespace(writer);
+        }
         writer.write("<div");
 
-        String id = container.getId(context);
-        if (UtilValidate.isNotEmpty(id)) {
+        if (UtilValidate.isNotEmpty(containerId)) {
             writer.write(" id=\"");
-            writer.write(id);
+            writer.write(containerId);
             writer.write("\"");
         }
         
@@ -91,21 +115,6 @@
     public void renderContainerEnd(Writer writer, Map context, ModelScreenWidget.Container container) throws IOException {
         writer.write("</div>");
         appendWhitespace(writer);
-        String autoUpdateTarget = container.getAutoUpdateTargetExdr(context);
-        String containerId = container.getId(context);
-        if (UtilValidate.isNotEmpty(autoUpdateTarget) && UtilValidate.isNotEmpty(containerId)) {
-            HttpServletResponse response = (HttpServletResponse) context.get("response");
-            HttpServletRequest request = (HttpServletRequest) context.get("request");
-            ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
-            RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
-            
-            writer.write("<script type=\"text/javascript\">new Ajax.PeriodicalUpdater('");
-            writer.write(containerId);
-            writer.write("', '");
-            writer.write(rh.makeLink(request, response, autoUpdateTarget));
-            writer.write("');</script>");
-            appendWhitespace(writer);
-        }
     }
 
     public void renderScreenletBegin(Writer writer, Map context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException {

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java?rev=658281&r1=658280&r2=658281&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java Tue May 20 08:33:22 2008
@@ -263,6 +263,7 @@
         protected FlexibleStringExpander idExdr;
         protected FlexibleStringExpander styleExdr;
         protected FlexibleStringExpander autoUpdateTargetExdr;
+        protected String autoUpdateInterval = "2";
         protected List<ModelScreenWidget> subWidgets;
         
         public Container(ModelScreen modelScreen, Element containerElement) {
@@ -270,6 +271,9 @@
             this.idExdr = new FlexibleStringExpander(containerElement.getAttribute("id"));
             this.styleExdr = new FlexibleStringExpander(containerElement.getAttribute("style"));
             this.autoUpdateTargetExdr = new FlexibleStringExpander(containerElement.getAttribute("auto-update-target"));
+            if (containerElement.hasAttribute("auto-update-interval")) {
+                this.autoUpdateInterval = containerElement.getAttribute("auto-update-interval");
+            }
             
             // read sub-widgets
             List subElementList = UtilXml.childElementList(containerElement);
@@ -303,6 +307,10 @@
             return this.autoUpdateTargetExdr.expandString(context);
         }
 
+        public String getAutoUpdateInterval() {
+            return this.autoUpdateInterval;
+        }
+
         public String rawString() {
             return "<container id=\"" + this.idExdr.getOriginal() + "\" style=\"" + this.styleExdr.getOriginal() + "\" auto-update-target=\"" + this.autoUpdateTargetExdr.getOriginal() + "\">";
         }
@@ -1437,3 +1445,12 @@
     }
 }
 
+
+
+
+
+
+
+
+
+