svn commit: r1686116 - in /ofbiz/trunk: framework/common/widget/ framework/webtools/widget/ framework/widget/dtd/ framework/widget/src/org/ofbiz/widget/artifact/ framework/widget/src/org/ofbiz/widget/model/ framework/widget/src/org/ofbiz/widget/rendere...

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

svn commit: r1686116 - in /ofbiz/trunk: framework/common/widget/ framework/webtools/widget/ framework/widget/dtd/ framework/widget/src/org/ofbiz/widget/artifact/ framework/widget/src/org/ofbiz/widget/model/ framework/widget/src/org/ofbiz/widget/rendere...

nmalin
Author: nmalin
Date: Wed Jun 17 21:50:27 2015
New Revision: 1686116

URL: http://svn.apache.org/r1686116
Log:
Improve widget-form with four elements : include-form, include-grid, include-menu, include-screen to offert more flexibility to define complex display. The main purpose is to complete the screen widget capacity to replace ftl screen.
With these elements, example component have a new FindExample search screen to select the display list type with a example of :
   * include-form : list examples with their features
   * include-screen : list examples with their items
   * include-grid : list examples with their status history
The element include-menu is present on FindUtilCache screen. Also a new CommonInlineBarMenu menu type to display menu with specific purpose (in-line) is now present and with this logic adding in-line-bar css class on themes thomawak and flatgrey.

This patch is combinate Issues :
 * OFBIZ-6502 Add support for form/grid embedding within grids
 * OFBIZ-6501 Add support for screen embedding inside grids
 * OFBIZ-6404 Allow form/grid widget hyperlinks to be grouped into a single column
sub-tasks of master issue OFBIZ-6314 Widget Refactoring - Placeholder issue

Thanks to Christian and Adrian for their time

Modified:
    ofbiz/trunk/framework/common/widget/CommonMenus.xml
    ofbiz/trunk/framework/webtools/widget/CacheForms.xml
    ofbiz/trunk/framework/webtools/widget/Menus.xml
    ofbiz/trunk/framework/widget/dtd/widget-form.xsd
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFieldVisitor.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormField.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/XmlWidgetFieldVisitor.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormStringRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/fo/FoFormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroFormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/text/TextFormRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/xml/XmlFormRenderer.java
    ofbiz/trunk/specialpurpose/example/data/ExampleDemoData.xml
    ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
    ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
    ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
    ofbiz/trunk/themes/flatgrey/webapp/flatgrey/maincss.css
    ofbiz/trunk/themes/tomahawk/webapp/tomahawk/css/style.css

Modified: ofbiz/trunk/framework/common/widget/CommonMenus.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/widget/CommonMenus.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/common/widget/CommonMenus.xml (original)
+++ ofbiz/trunk/framework/common/widget/CommonMenus.xml Wed Jun 17 21:50:27 2015
@@ -31,4 +31,6 @@ under the License.
           menu-container-style="button-bar tab-bar" default-selected-style="selected"/>
 
     <menu name="CommonButtonBarMenu" type="simple" menu-container-style="button-bar" default-widget-style="buttontext"/>
+
+    <menu name="CommonInlineBarMenu" type="simple" menu-container-style="in-line-bar" default-widget-style="linktext"/>
 </menus>

Modified: ofbiz/trunk/framework/webtools/widget/CacheForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/widget/CacheForms.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/widget/CacheForms.xml (original)
+++ ofbiz/trunk/framework/webtools/widget/CacheForms.xml Wed Jun 17 21:50:27 2015
@@ -39,21 +39,7 @@ under the License.
         <field name="useSoftReference" title="${uiLabelMap.WebtoolsUseSoftRef}" sort-field="true"><display/></field>
         <field name="useFileSystemStore" title="${uiLabelMap.WebtoolsUseFileStore}" sort-field="true"><display/></field>
         <field name="cacheMemory" title="${uiLabelMap.WebtoolsCacheMemory}" sort-field="true"><display/></field>
-        <field name="administration" title=" " widget-style="buttontext" use-when="hasUtilCacheEdit">
-            <hyperlink description="${uiLabelMap.WebtoolsElements}" target="FindUtilCacheElements">
-                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
-            </hyperlink>
-        </field>
-        <field name="admin_edit" title=" " widget-style="buttontext" use-when="hasUtilCacheEdit">
-            <hyperlink description="${uiLabelMap.CommonEdit}" target="EditUtilCache">
-                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
-            </hyperlink>
-        </field>
-        <field name="admin_clear" title=" " widget-style="buttontext" use-when="hasUtilCacheEdit">
-            <hyperlink description="${uiLabelMap.CommonClear}" target="FindUtilCacheClear">
-                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
-            </hyperlink>
-        </field>
+        <field name="cacheMenu" title=" " use-when="hasUtilCacheEdit"><include-menu name="ListCacheForm" location="component://webtools/widget/Menus.xml"/></field>
     </form>
 
     <form name="ListCacheElements" type="list" list-name="cacheElementsList" paginate-target="FindUtilCacheElements" separate-columns="true" odd-row-style="alternate-row" default-table-style="basic-table hover-bar" header-row-style="header-row-2">

Modified: ofbiz/trunk/framework/webtools/widget/Menus.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webtools/widget/Menus.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/webtools/widget/Menus.xml (original)
+++ ofbiz/trunk/framework/webtools/widget/Menus.xml Wed Jun 17 21:50:27 2015
@@ -138,6 +138,23 @@ under the License.
             <link target="FindUtilCache"/>
         </menu-item>
     </menu>
+    <menu name="ListCacheForm" extends="CommonInlineBarMenu" extends-resource="component://common/widget/CommonMenus.xml">
+        <menu-item name="findUtilCacheElements" title="${uiLabelMap.WebtoolsElements}">
+            <link target="FindUtilCacheElements">
+                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
+            </link>
+        </menu-item>
+        <menu-item name="EditUtilCache" title="${uiLabelMap.CommonEdit}">
+            <link target="EditUtilCache">
+                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
+            </link>
+        </menu-item>
+        <menu-item name="FindUtilCacheClear" title="${uiLabelMap.CommonClear}">
+            <link target="FindUtilCacheClear" link-type="hidden-form">
+                <parameter param-name="UTIL_CACHE_NAME" from-field="cacheName"/>
+            </link>
+        </menu-item>
+    </menu>
 
     <menu name="artifactTabBar" extends="CommonTabBarMenu" extends-resource="component://common/widget/CommonMenus.xml"
           selected-menuitem-context-field-name="tabButtonItem">

Modified: ofbiz/trunk/framework/widget/dtd/widget-form.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-form.xsd?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/dtd/widget-form.xsd (original)
+++ ofbiz/trunk/framework/widget/dtd/widget-form.xsd Wed Jun 17 21:50:27 2015
@@ -1459,6 +1459,30 @@ under the License.
             </xs:attribute>
         </xs:complexType>
     </xs:element>
+    <xs:element name="include-menu" substitutionGroup="AllFields">
+        <xs:complexType>
+            <xs:attribute type="xs:string" name="name" use="required" />
+            <xs:attribute type="xs:string" name="location" use="required" />
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="include-form" substitutionGroup="AllFields">
+        <xs:complexType>
+            <xs:attribute type="xs:string" name="name" use="required" />
+            <xs:attribute type="xs:string" name="location" use="required" />
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="include-grid" substitutionGroup="AllFields">
+        <xs:complexType>
+            <xs:attribute type="xs:string" name="name" use="required" />
+            <xs:attribute type="xs:string" name="location" use="required" />
+        </xs:complexType>
+    </xs:element>
+    <xs:element name="include-screen" substitutionGroup="AllFields">
+        <xs:complexType>
+            <xs:attribute type="xs:string" name="name" use="required" />
+            <xs:attribute type="xs:string" name="location" use="required" />
+        </xs:complexType>
+    </xs:element>
     <xs:element name="password" substitutionGroup="AllFields">
         <xs:complexType>
             <xs:sequence>

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/artifact/ArtifactInfoGatherer.java Wed Jun 17 21:50:27 2015
@@ -58,15 +58,19 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.DropDownField;
 import org.ofbiz.widget.model.ModelFormField.FieldInfoWithOptions;
 import org.ofbiz.widget.model.ModelFormField.FileField;
+import org.ofbiz.widget.model.ModelFormField.FormField;
+import org.ofbiz.widget.model.ModelFormField.GridField;
 import org.ofbiz.widget.model.ModelFormField.HiddenField;
 import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
 import org.ofbiz.widget.model.ModelFormField.ResetField;
+import org.ofbiz.widget.model.ModelFormField.ScreenField;
 import org.ofbiz.widget.model.ModelFormField.SubmitField;
 import org.ofbiz.widget.model.ModelFormField.TextField;
 import org.ofbiz.widget.model.ModelFormField.TextFindField;
@@ -453,6 +457,21 @@ public final class ArtifactInfoGatherer
         }
 
         @Override
+        public void visit(MenuField menuField) {
+            //TODO
+        }
+        
+        @Override
+        public void visit(FormField formField) {
+            //TODO
+        }
+        
+        @Override
+        public void visit(GridField gridField) {
+            //TODO
+        }
+
+        @Override
         public void visit(IgnoredField ignoredField) {
         }
 
@@ -484,6 +503,11 @@ public final class ArtifactInfoGatherer
         @Override
         public void visit(ResetField resetField) {
         }
+        
+        @Override
+        public void visit(ScreenField screenField) {
+            //TODO
+        }
 
         @Override
         public void visit(SubmitField submitField) {

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/FieldInfo.java Wed Jun 17 21:50:27 2015
@@ -19,8 +19,10 @@
 package org.ofbiz.widget.model;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.ofbiz.base.util.Debug;
@@ -54,6 +56,11 @@ public abstract class FieldInfo {
     public static final int PASSWORD = 18;
     public static final int IMAGE = 19;
     public static final int DISPLAY_ENTITY = 20;
+    public static final int CONTAINER = 21;
+    public static final int MENU = 22;
+    public static final int FORM = 23;
+    public static final int GRID = 24;
+    public static final int SCREEN = 25;
     // the numbering here represents the priority of the source;
     //when setting a new fieldInfo on a modelFormField it will only set
     //the new one if the fieldSource is less than or equal to the existing
@@ -62,6 +69,7 @@ public abstract class FieldInfo {
     public static final int SOURCE_AUTO_ENTITY = 2;
     public static final int SOURCE_AUTO_SERVICE = 3;
     private static Map<String, Integer> fieldTypeByName = createFieldTypeMap();
+    private static List<Integer> nonInputFieldTypeList = createNonInputFieldTypeList();
 
     private static Map<String, Integer> createFieldTypeMap() {
         Map<String, Integer> fieldTypeByName = new HashMap<String, Integer>();
@@ -86,9 +94,27 @@ public abstract class FieldInfo {
         fieldTypeByName.put("image", Integer.valueOf(19));
         fieldTypeByName.put("display-entity", Integer.valueOf(20));
         fieldTypeByName.put("container", Integer.valueOf(21));
+        fieldTypeByName.put("include-menu", Integer.valueOf(22));
+        fieldTypeByName.put("include-form", Integer.valueOf(23));
+        fieldTypeByName.put("include-grid", Integer.valueOf(24));
+        fieldTypeByName.put("include-screen", Integer.valueOf(25));
         return Collections.unmodifiableMap(fieldTypeByName);
     }
 
+    private static List<Integer> createNonInputFieldTypeList() {
+        List<Integer> nonInputFieldTypeList = new ArrayList<Integer>();
+        nonInputFieldTypeList.add(FieldInfo.IGNORED);
+        nonInputFieldTypeList.add(FieldInfo.HIDDEN);
+        nonInputFieldTypeList.add(FieldInfo.DISPLAY);
+        nonInputFieldTypeList.add(FieldInfo.DISPLAY_ENTITY);
+        nonInputFieldTypeList.add(FieldInfo.HYPERLINK);
+        nonInputFieldTypeList.add(FieldInfo.MENU);
+        nonInputFieldTypeList.add(FieldInfo.FORM);
+        nonInputFieldTypeList.add(FieldInfo.GRID);
+        nonInputFieldTypeList.add(FieldInfo.SCREEN);
+        return Collections.unmodifiableList(nonInputFieldTypeList);
+    }
+
     public static int findFieldTypeFromName(String name) {
         Integer fieldTypeInt = FieldInfo.fieldTypeByName.get(name);
         if (fieldTypeInt != null) {
@@ -98,6 +124,10 @@ public abstract class FieldInfo {
         }
     }
 
+    public static boolean isInputFieldType(Integer fieldType) {
+        return ! nonInputFieldTypeList.contains(fieldType);
+    }
+
     private final int fieldType;
     private final int fieldSource;
     private final ModelFormField modelFormField;

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFieldVisitor.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFieldVisitor.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFieldVisitor.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFieldVisitor.java Wed Jun 17 21:50:27 2015
@@ -26,15 +26,19 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.DisplayField;
 import org.ofbiz.widget.model.ModelFormField.DropDownField;
 import org.ofbiz.widget.model.ModelFormField.FileField;
+import org.ofbiz.widget.model.ModelFormField.FormField;
+import org.ofbiz.widget.model.ModelFormField.GridField;
 import org.ofbiz.widget.model.ModelFormField.HiddenField;
 import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
 import org.ofbiz.widget.model.ModelFormField.ResetField;
+import org.ofbiz.widget.model.ModelFormField.ScreenField;
 import org.ofbiz.widget.model.ModelFormField.SubmitField;
 import org.ofbiz.widget.model.ModelFormField.TextField;
 import org.ofbiz.widget.model.ModelFormField.TextFindField;
@@ -60,6 +64,10 @@ public interface ModelFieldVisitor {
     void visit(DropDownField dropDownField) throws Exception ;
 
     void visit(FileField textField) throws Exception ;
+    
+    void visit(FormField formField) throws Exception ;
+
+    void visit(GridField gridField) throws Exception ;
 
     void visit(HiddenField hiddenField) throws Exception ;
 
@@ -71,6 +79,8 @@ public interface ModelFieldVisitor {
 
     void visit(LookupField textField) throws Exception ;
 
+    void visit(MenuField menuField) throws Exception ;
+
     void visit(PasswordField textField) throws Exception ;
 
     void visit(RadioField radioField) throws Exception ;
@@ -79,6 +89,8 @@ public interface ModelFieldVisitor {
 
     void visit(ResetField resetField) throws Exception ;
 
+    void visit(ScreenField screenField) throws Exception ;
+
     void visit(SubmitField submitField) throws Exception ;
 
     void visit(TextareaField textareaField) throws Exception ;

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormField.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormField.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormField.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormField.java Wed Jun 17 21:50:27 2015
@@ -70,7 +70,11 @@ import org.ofbiz.widget.model.CommonWidg
 import org.ofbiz.widget.model.CommonWidgetModels.Link;
 import org.ofbiz.widget.model.CommonWidgetModels.Parameter;
 import org.ofbiz.widget.model.ModelForm.UpdateArea;
+import org.ofbiz.widget.renderer.FormRenderer;
 import org.ofbiz.widget.renderer.FormStringRenderer;
+import org.ofbiz.widget.renderer.MenuStringRenderer;
+import org.ofbiz.widget.renderer.ScreenRenderer;
+import org.ofbiz.widget.renderer.ScreenStringRenderer;
 import org.w3c.dom.Element;
 
 import bsh.EvalError;
@@ -2100,6 +2104,164 @@ public class ModelFormField {
             formStringRenderer.renderFileField(writer, context, this);
         }
     }
+    
+    /**
+     * Models the &lt;form&gt; element.
+     *
+     * @see <code>widget-form.xsd</code>
+     */
+    public static class FormField extends FieldInfo {
+        private final FlexibleStringExpander formName;
+        private final FlexibleStringExpander formLocation;
+
+        public FormField(Element element, ModelFormField modelFormField) {
+            super(element, modelFormField);
+            this.formName = FlexibleStringExpander.getInstance(element.getAttribute("name"));
+            this.formLocation = FlexibleStringExpander.getInstance(element.getAttribute("location"));
+        }
+
+        private FormField(FormField original, ModelFormField modelFormField) {
+            super(original.getFieldSource(), original.getFieldType(), modelFormField);
+            this.formName = original.formName;
+            this.formLocation = original.formLocation;
+        }
+
+        @Override
+        public void accept(ModelFieldVisitor visitor) throws Exception {
+            visitor.visit(this);
+        }
+
+        @Override
+        public FieldInfo copy(ModelFormField modelFormField) {
+            return new FormField(this, modelFormField);
+        }
+
+        public String getFormName(Map<String, Object> context) {
+            return this.formName.expandString(context);
+        }
+
+        public FlexibleStringExpander getFormName() {
+            return formName;
+        }
+
+        public String getFormLocation(Map<String, Object> context) {
+            return this.formLocation.expandString(context);
+        }
+
+        public FlexibleStringExpander getFormLocation() {
+            return formLocation;
+        }
+
+        @Override
+        public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer)
+                throws IOException {
+            // Output format might not support menus, so make menu rendering optional.
+            ModelForm modelForm = getModelForm(context);
+            try {
+                FormRenderer renderer = new FormRenderer(modelForm, formStringRenderer);
+                renderer.render(writer, context);
+            } catch (Exception e) {
+                String errMsg = "Error rendering included form named [" + modelForm.getName() + "] at location [" + modelForm.getFormLocation() + "]: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+        }
+
+        public ModelForm getModelForm(Map<String, Object> context) {
+            String name = this.getFormName(context);
+            String location = this.getFormLocation(context);
+            ModelForm modelForm = null;
+            try {
+                org.ofbiz.entity.model.ModelReader entityModelReader = ((org.ofbiz.entity.Delegator)context.get("delegator")).getModelReader();
+                org.ofbiz.service.DispatchContext dispatchContext = ((org.ofbiz.service.LocalDispatcher)context.get("dispatcher")).getDispatchContext();
+                modelForm = FormFactory.getFormFromLocation(location, name, entityModelReader, dispatchContext);
+            } catch (Exception e) {
+                String errMsg = "Error rendering form named [" + name + "] at location [" + location + "]: ";
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+            return modelForm;
+        }
+    }
+    
+    /**
+     * Models the &lt;grid&gt; element.
+     *
+     * @see <code>widget-grid.xsd</code>
+     */
+    public static class GridField extends FieldInfo {
+        private final FlexibleStringExpander gridName;
+        private final FlexibleStringExpander gridLocation;
+
+        public GridField(Element element, ModelFormField modelFormField) {
+            super(element, modelFormField);
+            this.gridName = FlexibleStringExpander.getInstance(element.getAttribute("name"));
+            this.gridLocation = FlexibleStringExpander.getInstance(element.getAttribute("location"));
+        }
+
+        private GridField(GridField original, ModelFormField modelFormField) {
+            super(original.getFieldSource(), original.getFieldType(), modelFormField);
+            this.gridName = original.gridName;
+            this.gridLocation = original.gridLocation;
+        }
+
+        @Override
+        public void accept(ModelFieldVisitor visitor) throws Exception {
+            visitor.visit(this);
+        }
+
+        @Override
+        public FieldInfo copy(ModelFormField modelFormField) {
+            return new GridField(this, modelFormField);
+        }
+
+        public String getGridName(Map<String, Object> context) {
+            return this.gridName.expandString(context);
+        }
+
+        public FlexibleStringExpander getGridName() {
+            return gridName;
+        }
+
+        public String getGridLocation(Map<String, Object> context) {
+            return this.gridLocation.expandString(context);
+        }
+
+        public FlexibleStringExpander getGridLocation() {
+            return gridLocation;
+        }
+
+        @Override
+        public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer)
+                throws IOException {
+            // Output format might not support menus, so make menu rendering optional.
+            ModelForm modelGrid = getModelGrid(context);
+            try {
+                FormRenderer renderer = new FormRenderer(modelGrid, formStringRenderer);
+                renderer.render(writer, context);
+            } catch (Exception e) {
+                String errMsg = "Error rendering included grid named [" + modelGrid.getName() + "] at location [" + modelGrid.getFormLocation() + "]: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+        }
+
+        public ModelForm getModelGrid(Map<String, Object> context) {
+            String name = this.getGridName(context);
+            String location = this.getGridLocation(context);
+            ModelForm modelForm = null;
+            try {
+                org.ofbiz.entity.model.ModelReader entityModelReader = ((org.ofbiz.entity.Delegator)context.get("delegator")).getModelReader();
+                org.ofbiz.service.DispatchContext dispatchContext = ((org.ofbiz.service.LocalDispatcher)context.get("dispatcher")).getDispatchContext();
+                modelForm = GridFactory.getGridFromLocation(location, name, entityModelReader, dispatchContext);
+            } catch (Exception e) {
+                String errMsg = "Error rendering grid named [" + name + "] at location [" + location + "]: ";
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+            return modelForm;
+        }
+    }
 
     /**
      * Models the &lt;hidden&gt; element.
@@ -2957,6 +3119,81 @@ public class ModelFormField {
         }
     }
 
+    /**
+     * Models the &lt;menu&gt; element.
+     *
+     * @see <code>widget-form.xsd</code>
+     */
+    public static class MenuField extends FieldInfo {
+        private final FlexibleStringExpander menuName;
+        private final FlexibleStringExpander menuLocation;
+
+        public MenuField(Element element, ModelFormField modelFormField) {
+            super(element, modelFormField);
+            this.menuName = FlexibleStringExpander.getInstance(element.getAttribute("name"));
+            this.menuLocation = FlexibleStringExpander.getInstance(element.getAttribute("location"));
+        }
+
+        private MenuField(MenuField original, ModelFormField modelFormField) {
+            super(original.getFieldSource(), original.getFieldType(), modelFormField);
+            this.menuName = original.menuName;
+            this.menuLocation = original.menuLocation;
+        }
+
+        @Override
+        public void accept(ModelFieldVisitor visitor) throws Exception {
+            visitor.visit(this);
+        }
+
+        @Override
+        public FieldInfo copy(ModelFormField modelFormField) {
+            return new MenuField(this, modelFormField);
+        }
+
+        public String getMenuName(Map<String, Object> context) {
+            return this.menuName.expandString(context);
+        }
+
+        public FlexibleStringExpander getMenuName() {
+            return menuName;
+        }
+
+        public String getMenuLocation(Map<String, Object> context) {
+            return this.menuLocation.expandString(context);
+        }
+
+        public FlexibleStringExpander getMenuLocation() {
+            return menuLocation;
+        }
+
+        @Override
+        public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer)
+                throws IOException {
+            // Output format might not support menus, so make menu rendering optional.
+            MenuStringRenderer menuStringRenderer = (MenuStringRenderer) context.get("menuStringRenderer");
+            if (menuStringRenderer == null) {
+                Debug.logVerbose("MenuStringRenderer instance not found in rendering context, menu not rendered.", module);
+                return;
+            }
+            ModelMenu modelMenu = getModelMenu(context);
+            modelMenu.renderMenuString(writer, context, menuStringRenderer);
+        }
+
+        public ModelMenu getModelMenu(Map<String, Object> context) {
+            String name = this.getMenuName(context);
+            String location = this.getMenuLocation(context);
+            ModelMenu modelMenu = null;
+            try {
+                modelMenu = MenuFactory.getMenuFromLocation(location, name);
+            } catch (Exception e) {
+                String errMsg = "Error rendering menu named [" + name + "] at location [" + location + "]: ";
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+            return modelMenu;
+        }
+    }
+
     public static abstract class OptionSource {
 
         private final ModelFormField modelFormField;
@@ -3159,6 +3396,72 @@ public class ModelFormField {
             formStringRenderer.renderResetField(writer, context, this);
         }
     }
+    
+    /**
+     * Models the &lt;grid&gt; element.
+     *
+     * @see <code>widget-grid.xsd</code>
+     */
+    public static class ScreenField extends FieldInfo {
+        private final FlexibleStringExpander screenName;
+        private final FlexibleStringExpander screenLocation;
+
+        public ScreenField(Element element, ModelFormField modelFormField) {
+            super(element, modelFormField);
+            this.screenName = FlexibleStringExpander.getInstance(element.getAttribute("name"));
+            this.screenLocation = FlexibleStringExpander.getInstance(element.getAttribute("location"));
+        }
+
+        private ScreenField(ScreenField original, ModelFormField modelFormField) {
+            super(original.getFieldSource(), original.getFieldType(), modelFormField);
+            this.screenName = original.screenName;
+            this.screenLocation = original.screenLocation;
+        }
+
+        @Override
+        public void accept(ModelFieldVisitor visitor) throws Exception {
+            visitor.visit(this);
+        }
+
+        @Override
+        public FieldInfo copy(ModelFormField modelFormField) {
+            return new ScreenField(this, modelFormField);
+        }
+
+        public String getScreenName(Map<String, Object> context) {
+            return this.screenName.expandString(context);
+        }
+
+        public FlexibleStringExpander getScreenName() {
+            return screenName;
+        }
+
+        public String getScreenLocation(Map<String, Object> context) {
+            return this.screenLocation.expandString(context);
+        }
+
+        public FlexibleStringExpander getScreenLocation() {
+            return screenLocation;
+        }
+
+        @Override
+        public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer)
+                throws IOException {
+            String name = this.getScreenName(context);
+            String location = this.getScreenLocation(context);
+            try {
+                ScreenRenderer renderer = (ScreenRenderer)context.get("screens");
+                if (renderer != null) {
+                    ScreenRenderer subRenderer = new ScreenRenderer(writer, (MapStack)UtilGenerics.cast(context), renderer.getScreenStringRenderer());
+                    writer.append(subRenderer.render(location, name));
+                }
+            } catch (Exception e) {
+                String errMsg = "Error rendering included screen named [" + name + "] at location [" + location + "]: " + e.toString();
+                Debug.logError(e, errMsg, module);
+                throw new RuntimeException(errMsg + e);
+            }
+        }
+    }
 
     /**
      * Models the &lt;option&gt; element.

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormFieldBuilder.java Wed Jun 17 21:50:27 2015
@@ -44,16 +44,20 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.DisplayField;
 import org.ofbiz.widget.model.ModelFormField.DropDownField;
 import org.ofbiz.widget.model.ModelFormField.FileField;
+import org.ofbiz.widget.model.ModelFormField.FormField;
+import org.ofbiz.widget.model.ModelFormField.GridField;
 import org.ofbiz.widget.model.ModelFormField.HiddenField;
 import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.OptionSource;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
 import org.ofbiz.widget.model.ModelFormField.ResetField;
+import org.ofbiz.widget.model.ModelFormField.ScreenField;
 import org.ofbiz.widget.model.ModelFormField.SubmitField;
 import org.ofbiz.widget.model.ModelFormField.TextField;
 import org.ofbiz.widget.model.ModelFormField.TextFindField;
@@ -212,6 +216,14 @@ public class ModelFormFieldBuilder {
             this.fieldInfo = new RangeFindField(childElement, null);
         else if ("lookup".equals(this.fieldType))
             this.fieldInfo = new LookupField(childElement, null);
+        else if ("include-menu".equals(this.fieldType))
+            this.fieldInfo = new MenuField(childElement, null);
+        else if ("include-form".equals(this.fieldType))
+            this.fieldInfo = new FormField(childElement, null);
+        else if ("include-grid".equals(this.fieldType))
+            this.fieldInfo = new GridField(childElement, null);
+        else if ("include-screen".equals(this.fieldType))
+            this.fieldInfo = new ScreenField(childElement, null);
         else if ("file".equals(this.fieldType))
             this.fieldInfo = new FileField(childElement, null);
         else if ("password".equals(this.fieldType))

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/XmlWidgetFieldVisitor.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/XmlWidgetFieldVisitor.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/XmlWidgetFieldVisitor.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/XmlWidgetFieldVisitor.java Wed Jun 17 21:50:27 2015
@@ -31,16 +31,20 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.DropDownField;
 import org.ofbiz.widget.model.ModelFormField.FieldInfoWithOptions;
 import org.ofbiz.widget.model.ModelFormField.FileField;
+import org.ofbiz.widget.model.ModelFormField.FormField;
+import org.ofbiz.widget.model.ModelFormField.GridField;
 import org.ofbiz.widget.model.ModelFormField.HiddenField;
 import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.InPlaceEditor;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
 import org.ofbiz.widget.model.ModelFormField.ResetField;
+import org.ofbiz.widget.model.ModelFormField.ScreenField;
 import org.ofbiz.widget.model.ModelFormField.SubHyperlink;
 import org.ofbiz.widget.model.ModelFormField.SubmitField;
 import org.ofbiz.widget.model.ModelFormField.TextField;
@@ -174,6 +178,42 @@ public class XmlWidgetFieldVisitor exten
     }
 
     @Override
+    public void visit(FormField formField) throws Exception {
+        visitModelField(formField.getModelFormField());
+        writer.append("<include-form");
+        visitAttribute("name", formField.getFormName());
+        visitAttribute("location", formField.getFormLocation());
+        writer.append("/>");
+    }
+
+    @Override
+    public void visit(GridField gridField) throws Exception {
+        visitModelField(gridField.getModelFormField());
+        writer.append("<include-grid");
+        visitAttribute("name", gridField.getGridName());
+        visitAttribute("location", gridField.getGridLocation());
+        writer.append("/>");
+    }
+
+    @Override
+    public void visit(MenuField menuField) throws Exception {
+        visitModelField(menuField.getModelFormField());
+        writer.append("<include-menu");
+        visitAttribute("name", menuField.getMenuName());
+        visitAttribute("location", menuField.getMenuLocation());
+        writer.append("/>");
+    }
+
+    @Override
+    public void visit(ScreenField screenField) throws Exception {
+        visitModelField(screenField.getModelFormField());
+        writer.append("<include-screen");
+        visitAttribute("name", screenField.getScreenName());
+        visitAttribute("location", screenField.getScreenLocation());
+        writer.append("/>");
+    }
+
+    @Override
     public void visit(IgnoredField ignoredField) throws Exception {
         visitModelField(ignoredField.getModelFormField());
         writer.append("<ignored/></field>");

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormRenderer.java Wed Jun 17 21:50:27 2015
@@ -73,7 +73,10 @@ public class FormRenderer {
         Locale locale = UtilMisc.ensureLocale(context.get("locale"));
         String retVal = FlexibleStringExpander.expandString(modelForm.getContainerId(), context, locale);
         Integer itemIndex = (Integer) context.get("itemIndex");
-        if (itemIndex != null && "list".equals(modelForm.getType())) {
+        if (itemIndex != null/* && "list".equals(modelForm.getType())*/) {
+            if (UtilValidate.isNotEmpty(context.get("parentItemIndex"))) {
+                return retVal + context.get("parentItemIndex") + modelForm.getItemIndexSeparator() + itemIndex.intValue();
+            }
             return retVal + modelForm.getItemIndexSeparator() + itemIndex.intValue();
         }
         return retVal;
@@ -340,13 +343,11 @@ public class FormRenderer {
                     continue;
                 }
 
-                if(modelFormField.shouldIgnore(context)) {
+                if (modelFormField.shouldIgnore(context)) {
                     continue;
                 }
 
-                if (fieldInfo.getFieldType() != FieldInfo.DISPLAY
-                        && fieldInfo.getFieldType() != FieldInfo.DISPLAY_ENTITY
-                        && fieldInfo.getFieldType() != FieldInfo.HYPERLINK) {
+                if (FieldInfo.isInputFieldType(fieldInfo.getFieldType())) {
                     inputFieldFound = true;
                     continue;
                 }
@@ -371,9 +372,7 @@ public class FormRenderer {
                 }
 
                 // skip all of the display/hyperlink fields
-                if (fieldInfo.getFieldType() == FieldInfo.DISPLAY
-                        || fieldInfo.getFieldType() == FieldInfo.DISPLAY_ENTITY
-                        || fieldInfo.getFieldType() == FieldInfo.HYPERLINK) {
+                if (!FieldInfo.isInputFieldType(fieldInfo.getFieldType())) {
                     continue;
                 }
 
@@ -708,6 +707,13 @@ public class FormRenderer {
 
         if (iter != null) {
             // render item rows
+            if (UtilValidate.isNotEmpty(context.get("itemIndex"))) {
+                if (UtilValidate.isNotEmpty(context.get("parentItemIndex"))) {
+                    context.put("parentItemIndex", context.get("parentItemIndex") + modelForm.getItemIndexSeparator() + context.get("itemIndex"));
+                } else {
+                    context.put("parentItemIndex", modelForm.getItemIndexSeparator() + context.get("itemIndex"));
+                }
+            }
             int itemIndex = -1;
             Object item = null;
             context.put("wholeFormContext", context);
@@ -819,9 +825,7 @@ public class FormRenderer {
                             continue;
                         }
 
-                        if (fieldInfo.getFieldType() != FieldInfo.DISPLAY
-                                && fieldInfo.getFieldType() != FieldInfo.DISPLAY_ENTITY
-                                && fieldInfo.getFieldType() != FieldInfo.HYPERLINK) {
+                        if (FieldInfo.isInputFieldType(fieldInfo.getFieldType())) {
                             // okay, now do the form cell
                             break;
                         }
@@ -846,9 +850,7 @@ public class FormRenderer {
                         }
 
                         // skip all of the display/hyperlink fields
-                        if (fieldInfo.getFieldType() == FieldInfo.DISPLAY
-                                || fieldInfo.getFieldType() == FieldInfo.DISPLAY_ENTITY
-                                || fieldInfo.getFieldType() == FieldInfo.HYPERLINK) {
+                        if (!FieldInfo.isInputFieldType(fieldInfo.getFieldType())) {
                             continue;
                         }
 
@@ -871,9 +873,7 @@ public class FormRenderer {
                         }
 
                         // skip all non-display and non-hyperlink fields
-                        if (fieldInfo.getFieldType() != FieldInfo.DISPLAY
-                                && fieldInfo.getFieldType() != FieldInfo.DISPLAY_ENTITY
-                                && fieldInfo.getFieldType() != FieldInfo.HYPERLINK) {
+                        if (FieldInfo.isInputFieldType(fieldInfo.getFieldType())) {
                             continue;
                         }
 

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormStringRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormStringRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormStringRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/FormStringRenderer.java Wed Jun 17 21:50:27 2015
@@ -30,6 +30,7 @@ import org.ofbiz.widget.model.ModelFormF
 public interface FormStringRenderer {
     public void renderDisplayField(Appendable writer, Map<String, Object> context, ModelFormField.DisplayField displayField) throws IOException;
     public void renderHyperlinkField(Appendable writer, Map<String, Object> context, ModelFormField.HyperlinkField hyperlinkField) throws IOException;
+    public void renderMenuField(Appendable writer, Map<String, Object> context, ModelFormField.MenuField menuField) throws IOException;
 
     public void renderTextField(Appendable writer, Map<String, Object> context, ModelFormField.TextField textField) throws IOException;
     public void renderTextareaField(Appendable writer, Map<String, Object> context, ModelFormField.TextareaField textareaField) throws IOException;

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/fo/FoFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/fo/FoFormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/fo/FoFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/fo/FoFormRenderer.java Wed Jun 17 21:50:27 2015
@@ -44,6 +44,7 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
@@ -98,6 +99,10 @@ public class FoFormRenderer extends Html
         appendWhitespace(writer);
     }
 
+    public void renderMenuField(Appendable writer, Map<String, Object> context, MenuField menuField) throws IOException {
+        menuField.renderFieldString(writer, context, null);
+    }
+
     public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
         ModelFormField modelFormField = textField.getModelFormField();
         this.makeBlockString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textField.getDefaultValue(context)));

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java Wed Jun 17 21:50:27 2015
@@ -60,6 +60,7 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
@@ -371,6 +372,10 @@ public class HtmlFormRenderer extends Ht
         return value;
     }
 
+    public void renderMenuField(Appendable writer, Map<String, Object> context, MenuField menuField) throws IOException {
+        menuField.renderFieldString(writer, context, null);
+    }
+
     /* (non-Javadoc)
      * @see org.ofbiz.widget.form.FormStringRenderer#renderTextField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.TextField)
      */

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroFormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroFormRenderer.java Wed Jun 17 21:50:27 2015
@@ -71,6 +71,7 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
@@ -319,6 +320,10 @@ public final class MacroFormRenderer imp
         this.request.removeAttribute("descriptionSize");
     }
 
+    public void renderMenuField(Appendable writer, Map<String, Object> context, MenuField menuField) throws IOException {
+        menuField.renderFieldString(writer, context, null);
+    }
+
     public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
         ModelFormField modelFormField = textField.getModelFormField();
         String name = modelFormField.getParameterName(context);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroMenuRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroMenuRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroMenuRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/macro/MacroMenuRenderer.java Wed Jun 17 21:50:27 2015
@@ -205,11 +205,19 @@ public class MacroMenuRenderer implement
         parameters.put("name", link.getName(context));
         parameters.put("text", link.getText(context));
         parameters.put("targetWindow", link.getTargetWindow(context));
-        String uniqueItemName = menuItem.getModelMenu().getName() + "_" + menuItem.getName() + "_LF_" + UtilMisc.<String> addToBigDecimalInMap(context, "menuUniqueItemIndex", BigDecimal.ONE);
-        if(menuItem.getModelMenu().getExtraIndex(context) != null){
- uniqueItemName += "_" + menuItem.getModelMenu().getExtraIndex(context);
- }
-        parameters.put("uniqueItemName", uniqueItemName);
+        StringBuffer uniqueItemName = new StringBuffer(menuItem.getModelMenu().getName());
+        uniqueItemName.append("_").append(menuItem.getName()).append("_LF_").append(UtilMisc.<String> addToBigDecimalInMap(context, "menuUniqueItemIndex", BigDecimal.ONE));
+        if (menuItem.getModelMenu().getExtraIndex(context) != null) {
+            uniqueItemName.append("_").append(menuItem.getModelMenu().getExtraIndex(context));
+        }
+        if (context.containsKey("itemIndex")) {
+            if (context.containsKey("parentItemIndex")) {
+                uniqueItemName.append(context.get("parentItemIndex")).append("_").append(context.get("itemIndex"));
+            } else {
+                uniqueItemName.append("_").append(context.get("itemIndex"));
+            }
+        }
+        parameters.put("uniqueItemName", uniqueItemName.toString());
         String linkType = "";
         if (UtilValidate.isNotEmpty(target)) {
             linkType = WidgetWorker.determineAutoLinkType(link.getLinkType(), target, link.getUrlMode(), request);

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/text/TextFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/text/TextFormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/text/TextFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/text/TextFormRenderer.java Wed Jun 17 21:50:27 2015
@@ -42,6 +42,7 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
@@ -92,6 +93,10 @@ public class TextFormRenderer implements
         this.makeTextString(writer, modelFormField.getWidgetStyle(), hyperlinkField.getDescription(context));
     }
 
+    public void renderMenuField(Appendable writer, Map<String, Object> context, MenuField menuField) throws IOException {
+        menuField.renderFieldString(writer, context, null);
+    }
+
     public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
         ModelFormField modelFormField = textField.getModelFormField();
         this.makeTextString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textField.getDefaultValue(context)));

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/xml/XmlFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/xml/XmlFormRenderer.java?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/xml/XmlFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/xml/XmlFormRenderer.java Wed Jun 17 21:50:27 2015
@@ -42,6 +42,7 @@ import org.ofbiz.widget.model.ModelFormF
 import org.ofbiz.widget.model.ModelFormField.IgnoredField;
 import org.ofbiz.widget.model.ModelFormField.ImageField;
 import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.MenuField;
 import org.ofbiz.widget.model.ModelFormField.PasswordField;
 import org.ofbiz.widget.model.ModelFormField.RadioField;
 import org.ofbiz.widget.model.ModelFormField.RangeFindField;
@@ -94,6 +95,10 @@ public class XmlFormRenderer implements
         this.appendWhitespace(writer);
     }
 
+    public void renderMenuField(Appendable writer, Map<String, Object> context, MenuField menuField) throws IOException {
+        menuField.renderFieldString(writer, context, null);
+    }
+
     public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
         ModelFormField modelFormField = textField.getModelFormField();
         this.makeTextString(writer, modelFormField.getWidgetStyle(), modelFormField.getEntry(context, textField.getDefaultValue(context)));

Modified: ofbiz/trunk/specialpurpose/example/data/ExampleDemoData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/data/ExampleDemoData.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/data/ExampleDemoData.xml (original)
+++ ofbiz/trunk/specialpurpose/example/data/ExampleDemoData.xml Wed Jun 17 21:50:27 2015
@@ -77,4 +77,17 @@ under the License.
         <Example exampleId="EX09"/>
     </delete>
     <Example exampleId="EX10" exampleName="Example 10 after update"/>
+
+    <ExampleItem exampleId="EX01" exampleItemSeqId="00001" description="EX1-001" amount="10"/>
+    <ExampleItem exampleId="EX01" exampleItemSeqId="00002" description="EX1-002" amount="20"/>
+    <ExampleItem exampleId="EX02" exampleItemSeqId="00001" description="EX2-001" amount="10"/>
+    <ExampleItem exampleId="EX02" exampleItemSeqId="00002" description="EX2-002" amount="20"/>
+    <ExampleItem exampleId="EX02" exampleItemSeqId="00003" description="EX2-003" amount="30"/>
+
+    <ExampleStatus exampleId="EX01" statusDate="2010-01-02 00:00:00" statusEndDate="2011-01-02 00:00:00" statusId="EXST_IN_DESIGN"/>
+    <ExampleStatus exampleId="EX01" statusDate="2011-01-02 00:00:01" statusEndDate="2012-01-02 00:00:00" statusId="EXST_DEFINED"/>
+    <ExampleStatus exampleId="EX01" statusDate="2012-01-02 00:00:00" statusEndDate="2013-01-02 00:00:00" statusId="EXST_APPROVED"/>
+    <ExampleStatus exampleId="EX02" statusDate="2010-01-02 00:00:00" statusEndDate="2011-01-02 00:00:00" statusId="EXST_IN_DESIGN"/>
+    <ExampleStatus exampleId="EX02" statusDate="2011-01-02 00:00:01" statusEndDate="2012-01-02 00:00:00" statusId="EXST_DEFINED"/>
+    <ExampleStatus exampleId="EX02" statusDate="2012-01-02 00:00:00" statusEndDate="2013-01-02 00:00:00" statusId="EXST_APPROVED"/>
 </entity-engine-xml>

Modified: ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/CommonScreens.xml Wed Jun 17 21:50:27 2015
@@ -256,6 +256,14 @@ under the License.
         </section>
     </screen>
 
+    <screen name="SimpleDecorator">
+        <section>
+            <widgets>
+                 <include-screen name="SimpleDecorator" location="component://common/widget/CommonScreens.xml"/>
+            </widgets>
+        </section>
+    </screen>
+
     <screen name="main">
         <!-- This is the screen for the Main page in the Example component. A common pattern
             in OFBiz is to have each component include a Main page as a starting point for

Modified: ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleForms.xml Wed Jun 17 21:50:27 2015
@@ -37,6 +37,13 @@ under the License.
                 <entity-options description="${description}" key-field-name="statusId" entity-name="ExampleStatusItem"/>
             </drop-down>
         </field>
+        <field name="listOtherElements">
+            <radio>
+                <option key="items"/>
+                <option key="features"/>
+                <option key="status"/>
+            </radio>
+        </field>
         <field name="searchButton" title="${uiLabelMap.CommonFind}" widget-style="smallSubmit"><submit button-type="button" image-location="/images/icons/magnifier.png"/></field>
     </form>
 
@@ -66,6 +73,59 @@ under the License.
         <field name="conditionalDesc" ignore-when="&quot;exampleName&quot;.equals(sortField)" title="my desc"><display description="${description}"/></field>
     </form>
 
+    <!--example form with include an other form -->
+    <form name="ListExamplesWithFeatures" type="list" extends="ListExamples" extends-resource="component://example/widget/example/ExampleForms.xml">
+        <actions>
+            <call-parent-actions/>
+        </actions>
+        <field name="features"><include-form name="ExampleFeaturesInLine" location="component://example/widget/example/ExampleForms.xml"/></field>
+    </form>
+    <form name="ExampleFeaturesInLine" type="list" default-table-style="basic-table light-grid" default-entity-name="ExampleFeatureAppl">
+        <actions>
+            <entity-condition entity-name="ExampleFeatureAppl">
+                <condition-expr field-name="exampleId" from-field="exampleId"/>
+                <order-by field-name="sequenceNum"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-entity entity-name="ExampleFeatureAppl" default-field-type="display"/>
+        <field name="exampleId"><ignored/></field>
+    </form>
+
+    <!--example form with include a screen -->
+    <form name="ListExamplesWithItems" type="list" extends="ListExamples" extends-resource="component://example/widget/example/ExampleForms.xml">
+        <actions>
+            <call-parent-actions/>
+        </actions>
+        <field name="items"><include-screen name="ExampleItemsInLine" location="component://example/widget/example/ExampleScreens.xml"/></field>
+    </form>
+    <form name="ListExampleItemsInLine" type="list" default-table-style="basic-table light-grid">
+        <actions>
+            <entity-condition entity-name="ExampleItem">
+                <condition-expr field-name="exampleId" from-field="exampleId"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-entity entity-name="ExampleItem" default-field-type="display"/>
+        <field name="exampleId"><ignored/></field>
+    </form>
+
+    <!--example form with include a grid -->
+    <form name="ListExamplesWithStatus" type="list" extends="ListExamples" extends-resource="component://example/widget/example/ExampleForms.xml">
+        <actions>
+            <call-parent-actions/>
+        </actions>
+        <field name="status"><include-grid name="ExampleStatusInLine" location="component://example/widget/example/ExampleForms.xml"/></field>
+    </form>
+    <grid name="ExampleStatusInLine" type="list" default-table-style="basic-table light-grid" default-entity-name="ExampleStatus">
+        <actions>
+            <entity-condition entity-name="ExampleStatus">
+                <condition-expr field-name="exampleId" from-field="exampleId"/>
+                <order-by field-name="statusDate"/>
+            </entity-condition>
+        </actions>
+        <auto-fields-entity entity-name="ExampleStatus" default-field-type="display"/>
+        <field name="exampleId"><ignored/></field>
+    </grid>
+
     <!-- Typically, this extended form wouldn't be necessary. The parent form (ListExamples) would
         have these attributes.
          For the Ajax example we want all example entities listed, so the we use the entity-condition

Modified: ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml (original)
+++ ofbiz/trunk/specialpurpose/example/widget/example/ExampleScreens.xml Wed Jun 17 21:50:27 2015
@@ -28,6 +28,11 @@ under the License.
                 <set field="headerItem" value="ExampleMenuItem"/>
                 <set field="titleProperty" value="PageTitleFindExample"/>
                 <set field="exampleCtx" from-field="parameters"/>
+                <set field="formExampleListName" value="${groovy:
+                    if (parameters.listOtherElements == 'items') return 'ListExamplesWithItems';
+                    else if (parameters.listOtherElements == 'features') return 'ListExamplesWithFeatures';
+                    else if (parameters.listOtherElements == 'status') return 'ListExamplesWithStatus';
+                    else return 'ListExamples'}"/>
             </actions>
             <widgets>
                 <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}">
@@ -38,14 +43,14 @@ under the License.
                             </condition>
                             <widgets>
                                 <decorator-screen name="FindScreenDecorator" location="component://common/widget/CommonScreens.xml">
-                                    <decorator-section name="menu-bar">
+                                    <decorator-section name="menu-bar"><label>${formExampleListName}</label>
                                         <container style="button-bar"><link target="EditExampleLayer" link-type="ajax-window" height="500" width="500" text="${uiLabelMap.ExampleNewExample}" style="buttontext create"/></container>
                                     </decorator-section>
                                     <decorator-section name="search-options">
                                         <include-form name="FindExamples" location="component://example/widget/example/ExampleForms.xml"/>
                                     </decorator-section>
                                     <decorator-section name="search-results">
-                                        <include-form name="ListExamples" location="component://example/widget/example/ExampleForms.xml"/>
+                                        <include-form name="${formExampleListName}" location="component://example/widget/example/ExampleForms.xml"/>
                                     </decorator-section>
                                 </decorator-screen>
                             </widgets>
@@ -128,6 +133,17 @@ under the License.
             </widgets>
         </section>
     </screen>
+
+    <screen name="ExampleItemsInLine">
+        <section>
+            <widgets>
+                 <link text="${uiLabelMap.CommonEdit}" target="EditExampleItems">
+                     <parameter param-name="exampleId" from-field="exampleId"/>
+                 </link>
+                 <include-form name="ListExampleItemsInLine" location="component://example/widget/example/ExampleForms.xml"/>
+            </widgets>
+        </section>
+    </screen>
 
     <screen name="EditExampleFeatureAppls">
         <section>

Modified: ofbiz/trunk/themes/flatgrey/webapp/flatgrey/maincss.css
URL: http://svn.apache.org/viewvc/ofbiz/trunk/themes/flatgrey/webapp/flatgrey/maincss.css?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/themes/flatgrey/webapp/flatgrey/maincss.css (original)
+++ ofbiz/trunk/themes/flatgrey/webapp/flatgrey/maincss.css Wed Jun 17 21:50:27 2015
@@ -737,6 +737,15 @@ margin-bottom: 0.5em;
 display: table;
 }
 
+/* ===== In line bar ===== */
+.in-line-bar ul {
+display: inline; /* IE Fix */
+}
+.in-line-bar ul li {
+float : left;
+padding : 0 0.5em;
+}
+
 .tool-bar {
 padding: 0.2em;
 }

Modified: ofbiz/trunk/themes/tomahawk/webapp/tomahawk/css/style.css
URL: http://svn.apache.org/viewvc/ofbiz/trunk/themes/tomahawk/webapp/tomahawk/css/style.css?rev=1686116&r1=1686115&r2=1686116&view=diff
==============================================================================
--- ofbiz/trunk/themes/tomahawk/webapp/tomahawk/css/style.css (original)
+++ ofbiz/trunk/themes/tomahawk/webapp/tomahawk/css/style.css Wed Jun 17 21:50:27 2015
@@ -1605,6 +1605,24 @@ background-image:url(../images/tab_norma
 background-color: none;
 }
 
+/* ===== In line bar ===== */
+.in-line-bar ul li ul{
+    position: relative;
+    top: 0em; left: 0;
+    max-height: 0em;
+    margin: 0;
+    padding: 0;
+    overflow: hidden;
+    transition: 1.5s max-height 0.3s;
+}
+.in-line-bar > li li {
+    position: relative;
+    display:inline-block;
+}
+tr:hover td div.in-line-bar li ul {
+    max-height: 20em;
+}
+
 /* ===== Button bar decorators ===== */
 .tool-bar {
 background-color: #D4D0C8;