You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2013/05/29 20:17:47 UTC

svn commit: r1487587 - in /ofbiz/trunk/framework/widget: dtd/ src/org/ofbiz/widget/fo/ src/org/ofbiz/widget/html/ src/org/ofbiz/widget/screen/ src/org/ofbiz/widget/text/ templates/

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>