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 <form> 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 <grid> 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 <hidden> element. @@ -2957,6 +3119,81 @@ public class ModelFormField { } } + /** + * Models the <menu> 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 <grid> 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 <option> 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=""exampleName".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; |
Free forum by Nabble | Edit this page |