Author: adrianc Date: Wed May 29 18:17:46 2013 New Revision: 1487587 URL: http://svn.apache.org/r1487587 Log: New feature - Column screen widgets. This enables easy layout of multi-column screens/reports. The columns are rendered as <table> elements - so no more broken layouts caused by unpredictable floats, etc.
Modified: ofbiz/trunk/framework/widget/dtd/widget-screen.xsd ofbiz/trunk/framework/widget/src/org/ofbiz/widget/fo/FoScreenRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/MacroScreenRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java ofbiz/trunk/framework/widget/templates/csvScreenMacroLibrary.ftl ofbiz/trunk/framework/widget/templates/foScreenMacroLibrary.ftl ofbiz/trunk/framework/widget/templates/htmlScreenMacroLibrary.ftl ofbiz/trunk/framework/widget/templates/textScreenMacroLibrary.ftl Modified: ofbiz/trunk/framework/widget/dtd/widget-screen.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-screen.xsd?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/dtd/widget-screen.xsd (original) +++ ofbiz/trunk/framework/widget/dtd/widget-screen.xsd Wed May 29 18:17:46 2013 @@ -697,6 +697,24 @@ under the License. </xs:complexType> </xs:element> + <xs:element name="column-container" substitutionGroup="AllWidgets"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="1" maxOccurs="unbounded" name="column"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="AllWidgets" /> + </xs:sequence> + <xs:attribute type="xs:string" name="id" /> + <xs:attribute type="xs:string" name="style" /> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute type="xs:string" name="id" /> + <xs:attribute type="xs:string" name="style" /> + </xs:complexType> + </xs:element> + <xs:element name="container" substitutionGroup="AllWidgets"> <xs:complexType> <xs:sequence> Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/fo/FoScreenRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/fo/FoScreenRenderer.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/fo/FoScreenRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/fo/FoScreenRenderer.java Wed May 29 18:17:46 2013 @@ -28,10 +28,12 @@ import org.ofbiz.widget.ModelWidget; import org.ofbiz.widget.html.HtmlWidgetRenderer; import org.ofbiz.widget.screen.ModelScreenWidget; import org.ofbiz.widget.screen.ScreenStringRenderer; +import org.ofbiz.widget.screen.ModelScreenWidget.ColumnContainer; import org.ofbiz.entity.GenericValue; /** * Widget Library - HTML Form Renderer implementation + * @deprecated Use MacroScreenRenderer. */ public class FoScreenRenderer extends HtmlWidgetRenderer implements ScreenStringRenderer { @@ -185,4 +187,9 @@ public class FoScreenRenderer extends Ht public void renderPortalPagePortletBody(Appendable writer, Map<String, Object> context, ModelScreenWidget.PortalPage portalPage, GenericValue portalPortlet) throws GeneralException, IOException { // TODO: not implemented } + + @Override + public void renderColumnContainer(Appendable writer, Map<String, Object> context, ColumnContainer columnContainer) throws IOException { + // TODO: not implemented + } } Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlScreenRenderer.java Wed May 29 18:17:46 2013 @@ -53,9 +53,11 @@ import org.ofbiz.widget.menu.MenuStringR import org.ofbiz.widget.menu.ModelMenu; import org.ofbiz.widget.screen.ModelScreenWidget; import org.ofbiz.widget.screen.ScreenStringRenderer; +import org.ofbiz.widget.screen.ModelScreenWidget.ColumnContainer; /** * Widget Library - HTML Form Renderer implementation + * @deprecated Use MacroScreenRenderer. */ public class HtmlScreenRenderer extends HtmlWidgetRenderer implements ScreenStringRenderer { @@ -903,4 +905,9 @@ public class HtmlScreenRenderer extends public void renderPortalPagePortletBody(Appendable writer, Map<String, Object> context, ModelScreenWidget.PortalPage portalPage, GenericValue portalPortlet) throws GeneralException, IOException { // TODO: not implemented } + + @Override + public void renderColumnContainer(Appendable writer, Map<String, Object> context, ColumnContainer columnContainer) throws IOException { + // TODO: not implemented + } } Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/MacroScreenRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/MacroScreenRenderer.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/MacroScreenRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/MacroScreenRenderer.java Wed May 29 18:17:46 2013 @@ -59,6 +59,7 @@ import org.ofbiz.widget.form.MacroFormRe import org.ofbiz.widget.form.ModelForm; import org.ofbiz.widget.html.HtmlScreenRenderer.ScreenletMenuRenderer; import org.ofbiz.widget.menu.MenuStringRenderer; +import org.ofbiz.widget.screen.ModelScreenWidget.*; import org.xml.sax.SAXException; import freemarker.core.Environment; @@ -1008,4 +1009,37 @@ public class MacroScreenRenderer impleme } modelScreen.renderScreenString(writer, context, this); } + + @Override + public void renderColumnContainer(Appendable writer, Map<String, Object> context, ColumnContainer columnContainer) throws IOException { + String id = columnContainer.getId(context); + String style = columnContainer.getStyle(context); + StringBuilder sb = new StringBuilder("<@renderColumnContainerBegin"); + sb.append(" id=\""); + sb.append(id); + sb.append("\" style=\""); + sb.append(style); + sb.append("\" />"); + executeMacro(writer, sb.toString()); + for (Column column : columnContainer.getColumns()) { + id = column.getId(context); + style = column.getStyle(context); + sb = new StringBuilder("<@renderColumnBegin"); + sb.append(" id=\""); + sb.append(id); + sb.append("\" style=\""); + sb.append(style); + sb.append("\" />"); + executeMacro(writer, sb.toString()); + for (ModelScreenWidget subWidget : column.getSubWidgets()) { + try { + subWidget.renderWidgetString(writer, context, this); + } catch (GeneralException e) { + throw new IOException(e); + } + } + executeMacro(writer, "<@renderColumnEnd />"); + } + executeMacro(writer, "<@renderColumnContainerEnd />"); + } } Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ModelScreenWidget.java Wed May 29 18:17:46 2013 @@ -20,8 +20,10 @@ package org.ofbiz.widget.screen; import java.io.IOException; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.ArrayList; import java.util.Map; import java.util.ListIterator; @@ -229,6 +231,78 @@ public abstract class ModelScreenWidget } } + public static class ColumnContainer extends ModelScreenWidget { + public static final String TAG_NAME = "column-container"; + private final FlexibleStringExpander idExdr; + private final FlexibleStringExpander styleExdr; + private final List<Column> columns; + + public ColumnContainer(ModelScreen modelScreen, Element containerElement) { + super(modelScreen, containerElement); + this.idExdr = FlexibleStringExpander.getInstance(containerElement.getAttribute("id")); + this.styleExdr = FlexibleStringExpander.getInstance(containerElement.getAttribute("style")); + List<? extends Element> subElementList = UtilXml.childElementList(containerElement, "column"); + List<Column> columns = new ArrayList<Column>(subElementList.size()); + for (Element element : subElementList) { + columns.add(new Column(modelScreen, element)); + } + this.columns = Collections.unmodifiableList(columns); + } + + @Override + public void renderWidgetString(Appendable writer, Map<String, Object> context, ScreenStringRenderer screenStringRenderer) throws GeneralException, IOException { + try { + screenStringRenderer.renderColumnContainer(writer, context, this); + } catch (IOException e) { + String errMsg = "Error rendering container in screen named [" + this.modelScreen.getName() + "]: " + e.toString(); + Debug.logError(e, errMsg, module); + throw new RuntimeException(errMsg); + } + } + + public List<Column> getColumns() { + return this.columns; + } + + public String getId(Map<String, Object> context) { + return this.idExdr.expandString(context); + } + + public String getStyle(Map<String, Object> context) { + return this.styleExdr.expandString(context); + } + + @Override + public String rawString() { + return "<column-container id=\"" + this.idExdr.getOriginal() + "\" style=\"" + this.styleExdr.getOriginal() + "\">"; + } + } + + public static class Column { + private final FlexibleStringExpander idExdr; + private final FlexibleStringExpander styleExdr; + private final List<ModelScreenWidget> subWidgets; + + public Column(ModelScreen modelScreen, Element columnElement) { + this.idExdr = FlexibleStringExpander.getInstance(columnElement.getAttribute("id")); + this.styleExdr = FlexibleStringExpander.getInstance(columnElement.getAttribute("style")); + List<? extends Element> subElementList = UtilXml.childElementList(columnElement); + this.subWidgets = Collections.unmodifiableList(readSubWidgets(modelScreen, subElementList)); + } + + public List<ModelScreenWidget> getSubWidgets() { + return this.subWidgets; + } + + public String getId(Map<String, Object> context) { + return this.idExdr.expandString(context); + } + + public String getStyle(Map<String, Object> context) { + return this.styleExdr.expandString(context); + } + } + public static class Container extends ModelScreenWidget { public static final String TAG_NAME = "container"; protected FlexibleStringExpander idExdr; Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java Wed May 29 18:17:46 2013 @@ -33,6 +33,7 @@ public interface ScreenStringRenderer { public void renderScreenEnd(Appendable writer, Map<String, Object> context) throws IOException; public void renderSectionBegin(Appendable writer, Map<String, Object> context, ModelScreenWidget.Section section) throws IOException; public void renderSectionEnd(Appendable writer, Map<String, Object> context, ModelScreenWidget.Section section) throws IOException; + public void renderColumnContainer(Appendable writer, Map<String, Object> context, ModelScreenWidget.ColumnContainer columnContainer) throws IOException; public void renderContainerBegin(Appendable writer, Map<String, Object> context, ModelScreenWidget.Container container) throws IOException; public void renderContainerEnd(Appendable writer, Map<String, Object> context, ModelScreenWidget.Container container) throws IOException; public void renderContentBegin(Appendable writer, Map<String, Object> context, ModelScreenWidget.Content content) throws IOException; Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java Wed May 29 18:17:46 2013 @@ -25,10 +25,12 @@ import org.ofbiz.base.util.GeneralExcept import org.ofbiz.base.util.UtilValidate; import org.ofbiz.widget.screen.ModelScreenWidget; import org.ofbiz.widget.screen.ScreenStringRenderer; +import org.ofbiz.widget.screen.ModelScreenWidget.ColumnContainer; import org.ofbiz.entity.GenericValue; /** * Widget Library - Text Screen Renderer implementation + * @deprecated Use MacroScreenRenderer. */ public class TextScreenRenderer implements ScreenStringRenderer { @@ -143,4 +145,9 @@ public class TextScreenRenderer implemen public void renderPortalPagePortletBody(Appendable writer, Map<String, Object> context, ModelScreenWidget.PortalPage portalPage, GenericValue portalPortlet) throws GeneralException, IOException { // TODO: not implemented } + + @Override + public void renderColumnContainer(Appendable writer, Map<String, Object> context, ColumnContainer columnContainer) throws IOException { + // TODO: not implemented + } } Modified: ofbiz/trunk/framework/widget/templates/csvScreenMacroLibrary.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/templates/csvScreenMacroLibrary.ftl?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/templates/csvScreenMacroLibrary.ftl (original) +++ ofbiz/trunk/framework/widget/templates/csvScreenMacroLibrary.ftl Wed May 29 18:17:46 2013 @@ -53,3 +53,8 @@ under the License. <#macro renderScreenletEnd></#macro> <#macro renderScreenletPaginateMenu lowIndex actualPageSize ofLabel listSize paginateLastStyle lastLinkUrl paginateLastLabel paginateNextStyle nextLinkUrl paginateNextLabel paginatePreviousStyle paginatePreviousLabel previousLinkUrl paginateFirstStyle paginateFirstLabel firstLinkUrl></#macro> + +<#macro renderColumnContainerBegin id style></#macro> +<#macro renderColumnContainerEnd></#macro> +<#macro renderColumnBegin id style></#macro> +<#macro renderColumnEnd></#macro> Modified: ofbiz/trunk/framework/widget/templates/foScreenMacroLibrary.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/templates/foScreenMacroLibrary.ftl?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/templates/foScreenMacroLibrary.ftl (original) +++ ofbiz/trunk/framework/widget/templates/foScreenMacroLibrary.ftl Wed May 29 18:17:46 2013 @@ -59,7 +59,7 @@ under the License. <#macro renderSubContentEnd urlString editMode editContainerStyle editRequest enableEditValue></#macro> <#macro renderHorizontalSeparator id style><fo:block><fo:leader leader-length="100%" leader-pattern="rule" rule-style="solid" rule-thickness="0.1mm" color="black"/></fo:block></#macro> -<#macro renderLabel text id style><#if text?has_content><fo:block <#if style?has_content><@getFoStyle style/></#if>>${text}</fo:block></#if></#macro> +<#macro renderLabel text id style><#if text?has_content><fo:block <#if id?has_content> id="${id}"</#if>>${text}</fo:block></#if></#macro> <#macro renderLink parameterList targetWindow target uniqueItemName linkType actionUrl id style name linkUrl text imgStr></#macro> <#macro renderImage src id style wid hgt border alt urlString></#macro> @@ -69,5 +69,25 @@ under the License. <#macro renderScreenletEnd></#macro> <#macro renderScreenletPaginateMenu lowIndex actualPageSize ofLabel listSize paginateLastStyle lastLinkUrl paginateLastLabel paginateNextStyle nextLinkUrl paginateNextLabel paginatePreviousStyle paginatePreviousLabel previousLinkUrl paginateFirstStyle paginateFirstLabel firstLinkUrl></#macro> -</#escape> +<#macro renderColumnContainerBegin id style> + <fo:table width="100%"<#if id?has_content> id="${id}"</#if><#if style?has_content> <@getFoStyle style/></#if>> + <fo:table-body> + <fo:table-row> +</#macro> + +<#macro renderColumnContainerEnd> + </fo:table-row> + </fo:table-body> + </fo:table> +</#macro> + +<#macro renderColumnBegin id style> + <fo:table-cell<#if id?has_content> id="${id}"</#if><#if style?has_content> <@getFoStyle style/></#if>> +</#macro> + +<#macro renderColumnEnd> + </fo:table-cell> +</#macro> + +</#escape> Modified: ofbiz/trunk/framework/widget/templates/htmlScreenMacroLibrary.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/templates/htmlScreenMacroLibrary.ftl?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/templates/htmlScreenMacroLibrary.ftl (original) +++ ofbiz/trunk/framework/widget/templates/htmlScreenMacroLibrary.ftl Wed May 29 18:17:46 2013 @@ -320,3 +320,21 @@ ${menuString} </div> </#if> </#macro> + +<#macro renderColumnContainerBegin id style> + <table cellspacing="0"<#if id?has_content> id="${id}"</#if><#if style?has_content> class="${style}"</#if>> + <tr> +</#macro> + +<#macro renderColumnContainerEnd> + </tr> + </table> +</#macro> + +<#macro renderColumnBegin id style> + <td<#if id?has_content> id="${id}"</#if><#if style?has_content> class="${style}"</#if>> +</#macro> + +<#macro renderColumnEnd> + </td> +</#macro> Modified: ofbiz/trunk/framework/widget/templates/textScreenMacroLibrary.ftl URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/templates/textScreenMacroLibrary.ftl?rev=1487587&r1=1487586&r2=1487587&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/templates/textScreenMacroLibrary.ftl (original) +++ ofbiz/trunk/framework/widget/templates/textScreenMacroLibrary.ftl Wed May 29 18:17:46 2013 @@ -53,3 +53,8 @@ under the License. <#macro renderScreenletEnd></#macro> <#macro renderScreenletPaginateMenu lowIndex actualPageSize ofLabel listSize paginateLastStyle lastLinkUrl paginateLastLabel paginateNextStyle nextLinkUrl paginateNextLabel paginatePreviousStyle paginatePreviousLabel previousLinkUrl paginateFirstStyle paginateFirstLabel firstLinkUrl></#macro> + +<#macro renderColumnContainerBegin id style></#macro> +<#macro renderColumnContainerEnd></#macro> +<#macro renderColumnBegin id style></#macro> +<#macro renderColumnEnd></#macro>