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 2008/06/14 05:01:33 UTC

svn commit: r667723 - in /ofbiz/trunk/framework: images/webapp/images/ widget/dtd/ widget/src/org/ofbiz/widget/fo/ widget/src/org/ofbiz/widget/html/ widget/src/org/ofbiz/widget/screen/ widget/src/org/ofbiz/widget/text/

Author: adrianc
Date: Fri Jun 13 20:01:33 2008
New Revision: 667723

URL: http://svn.apache.org/viewvc?rev=667723&view=rev
Log:
Screen widget improvements:

1. Better screenlet collapsible implementation.
2. New widget: horizontal-separator.

The id attribute is no longer required for collapsible screenlets. Just use collapsible="true".

The horizontal-separator widget can be used to divide complicated screens - as an alternative to using screenlets.

Modified:
    ofbiz/trunk/framework/images/webapp/images/maincss.css
    ofbiz/trunk/framework/images/webapp/images/selectall.js
    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/ModelScreenWidget.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/screen/ScreenStringRenderer.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/text/TextScreenRenderer.java

Modified: ofbiz/trunk/framework/images/webapp/images/maincss.css
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/maincss.css?rev=667723&r1=667722&r2=667723&view=diff
==============================================================================
--- ofbiz/trunk/framework/images/webapp/images/maincss.css (original)
+++ ofbiz/trunk/framework/images/webapp/images/maincss.css Fri Jun 13 20:01:33 2008
@@ -1331,15 +1331,15 @@
 .screenlet-title-bar ul .collapsed,
 .screenlet-title-bar ul .collapsed:hover {
 background: url(/images/expand.gif) no-repeat center center;
-min-height: 1em;
-min-width: 1em;
+min-height: 1.1em;
+min-width: 1.1em;
 }
 
 .screenlet-title-bar ul .expanded,
 .screenlet-title-bar ul .expanded:hover {
 background: url(/images/collapse.gif) no-repeat center center;
-min-height: 1em;
-min-width: 1em;
+min-height: 1.1em;
+min-width: 1.1em;
 }
 
 .screenlet-title-bar ul .collapsed a,

Modified: ofbiz/trunk/framework/images/webapp/images/selectall.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/selectall.js?rev=667723&r1=667722&r2=667723&view=diff
==============================================================================
--- ofbiz/trunk/framework/images/webapp/images/selectall.js (original)
+++ ofbiz/trunk/framework/images/webapp/images/selectall.js Fri Jun 13 20:01:33 2008
@@ -300,33 +300,27 @@
     }
 }
 
-Event.observe(window,'load', function() {
-    var collapseablePanels = $$('li.collapsed', 'li.expanded');
-    collapseablePanels.each( function(e) {
-      if(e){
-          atag = e.down('a');
-          atag.observe('click', toggleCollapsablePanel);
-      }
-  });    
-
-});
-
-function toggleCollapsablePanel(event){
-	var atag = event.element();
-	titleDiv = atag.up('div.screenlet-title-bar');
-	bodyDiv = titleDiv.next();
-    liElement = atag.up('li');
-    if(bodyDiv.visible()){
+/** Toggle area visibility on/off.
+  * @param link The <a> element calling this function
+  * @param areaId The id of the HTML container to toggle
+  * @param expandTxt Localized 'Expand' text
+  * @param collapseTxt Localized 'Collapse' text
+*/
+function toggleCollapsiblePanel(link, areaId, expandTxt, collapseTxt){
+    var container = $(areaId);
+    var liElement = $(link).up('li');
+    if(container.visible()){
         liElement.removeClassName('expanded');
         liElement.addClassName('collapsed');
+        link.title = expandTxt;
     } else {
         liElement.removeClassName('collapsed');
-    	liElement.addClassName('expanded');
-    	
+        liElement.addClassName('expanded');
+        link.title = collapseTxt;
     }
-	Effect.toggle(bodyDiv, 'appear');
-	Event.stop(event);
+    Effect.toggle(container, 'appear');
 }
+
 // ===== End of Ajax Functions ===== //
 
 function submitFormDisableSubmits(form) {

Modified: ofbiz/trunk/framework/widget/dtd/widget-screen.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-screen.xsd?rev=667723&r1=667722&r2=667723&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/dtd/widget-screen.xsd (original)
+++ ofbiz/trunk/framework/widget/dtd/widget-screen.xsd Fri Jun 13 20:01:33 2008
@@ -766,6 +766,16 @@
             </xs:annotation>
         </xs:attribute>
     </xs:attributeGroup>
+    <xs:element name="horizontal-separator" substitutionGroup="AllWidgets">
+        <xs:complexType mixed="true">
+            <xs:attributeGroup ref="attlist.horizontal-separator"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.horizontal-separator">
+        <xs:attribute type="xs:string" name="id"/>
+        <xs:attribute type="xs:string" name="name"/>
+        <xs:attribute type="xs:string" name="style"/>
+    </xs:attributeGroup>
     <xs:element name="image" substitutionGroup="AllWidgets">
         <xs:complexType mixed="true">
             <xs:attributeGroup ref="attlist.image"/>
@@ -861,12 +871,8 @@
         <xs:attribute type="xs:string" name="title">
             <xs:annotation><xs:documentation>Title text to be placed in the screenlet title bar.</xs:documentation></xs:annotation>
         </xs:attribute>
-        <xs:attribute type="xs:string" name="id">
-            <xs:annotation><xs:documentation>Collapsible screenlets must have a name or ID.</xs:documentation></xs:annotation>
-        </xs:attribute>
-        <xs:attribute type="xs:string" name="name">
-            <xs:annotation><xs:documentation>Collapsible screenlets must have a name or ID.</xs:documentation></xs:annotation>
-        </xs:attribute>
+        <xs:attribute type="xs:string" name="id"/>
+        <xs:attribute type="xs:string" name="name"/>
         <xs:attribute name="collapsible" default="false">
             <xs:simpleType>
                 <xs:restriction base="xs:token">

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=667723&r1=667722&r2=667723&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 Fri Jun 13 20:01:33 2008
@@ -91,6 +91,15 @@
         appendWhitespace(writer);
     }
 
+    public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException {
+        writer.append("<fo:block>");
+        appendWhitespace(writer);
+        writer.append("<fo:leader leader-length=\"100%\" leader-pattern=\"rule\" rule-style=\"solid\" rule-thickness=\"0.1mm\" color=\"black\"/>");
+        appendWhitespace(writer);
+        writer.append("</fo:block>");
+        appendWhitespace(writer);
+    }
+
     public void renderLink(Appendable writer, Map<String, Object> context, ModelScreenWidget.Link link) 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=667723&r1=667722&r2=667723&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 Fri Jun 13 20:01:33 2008
@@ -115,9 +115,24 @@
         appendWhitespace(writer);
     }
 
+    public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException {
+        writer.append("<hr");
+        String className = separator.getStyle(context);
+        if (UtilValidate.isNotEmpty(className)) {
+            writer.append(" class=\"" + className + "\"");
+        }
+        String idName = separator.getId(context);
+        if (UtilValidate.isNotEmpty(idName)) {
+            writer.append(" id=\"" + idName + "\"");
+        }
+        writer.append("/>");
+        appendWhitespace(writer);
+    }
+
     public void renderScreenletBegin(Appendable writer, Map<String, Object> context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException {
         HttpServletRequest request = (HttpServletRequest) context.get("request");
         HttpServletResponse response = (HttpServletResponse) context.get("response");
+        boolean javaScriptEnabled = UtilHttp.isJavaScriptEnabled(request);
         ModelScreenWidget.Menu tabMenu = screenlet.getTabMenu();
         if (tabMenu != null) {
             tabMenu.renderWidgetString(writer, context, this);
@@ -135,6 +150,7 @@
         String title = screenlet.getTitle(context);
         ModelScreenWidget.Menu navMenu = screenlet.getNavigationMenu();
         ModelScreenWidget.Form navForm = screenlet.getNavigationForm();
+        String collapsibleAreaId = null;
         if (UtilValidate.isNotEmpty(title) || navMenu != null || navForm != null || screenlet.collapsible()) {
             writer.append("<div class=\"screenlet-title-bar\">");
             appendWhitespace(writer);
@@ -147,31 +163,41 @@
                 appendWhitespace(writer);
             }
             if (screenlet.collapsible()) {
-                String toolTip = null;
+                collapsibleAreaId = this.getNextElementId();
+                String expandToolTip = null;
+                String collapseToolTip = null;
                 Map<String, Object> uiLabelMap = UtilGenerics.checkMap(context.get("uiLabelMap"));
                 Map<String, Object> paramMap = UtilGenerics.checkMap(context.get("requestParameters"));
                 Map<String, Object> requestParameters = new HashMap<String, Object>(paramMap);
+                if (uiLabelMap != null) {
+                    expandToolTip = (String) uiLabelMap.get("CommonExpand");
+                    collapseToolTip = (String) uiLabelMap.get("CommonCollapse");
+                }
                 writer.append("<li class=\"");
                 if (collapsed) {
-                    requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "false");
-                    String queryString = UtilHttp.urlEncodeArgs(requestParameters);
-                    writer.append("collapsed\"><a href=\"");
-                    writer.append(request.getRequestURI() + "?" + queryString);
-                    if (uiLabelMap != null) {
-                        toolTip = (String) uiLabelMap.get("CommonExpand");
+                    writer.append("collapsed\"><a ");
+                    if (javaScriptEnabled) {
+                        writer.append("onclick=\"javascript:toggleCollapsiblePanel(this, '" + collapsibleAreaId + "', '" + expandToolTip + "', '" + collapseToolTip + "');\"");
+                    } else {
+                        requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "false");
+                        String queryString = UtilHttp.urlEncodeArgs(requestParameters);
+                        writer.append("href=\"" + request.getRequestURI() + "?" + queryString + "\"");
+                    }
+                    if (UtilValidate.isNotEmpty(expandToolTip)) {
+                        writer.append(" title=\"" + expandToolTip + "\"");
                     }
                 } else {
-                    requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "true");
-                    String queryString = UtilHttp.urlEncodeArgs(requestParameters);
-                    writer.append("expanded\"><a href=\"");
-                    writer.append(request.getRequestURI() + "?" + queryString);
-                    if (uiLabelMap != null) {
-                        toolTip = (String) uiLabelMap.get("CommonCollapse");
+                    writer.append("expanded\"><a ");
+                    if (javaScriptEnabled) {
+                        writer.append("onclick=\"javascript:toggleCollapsiblePanel(this, '" + collapsibleAreaId + "', '" + expandToolTip + "', '" + collapseToolTip + "');\"");
+                    } else {
+                        requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "true");
+                        String queryString = UtilHttp.urlEncodeArgs(requestParameters);
+                        writer.append("href=\"" + request.getRequestURI() + "?" + queryString + "\"");
+                    }
+                    if (UtilValidate.isNotEmpty(collapseToolTip)) {
+                        writer.append(" title=\"" + collapseToolTip + "\"");
                     }
-                }
-                writer.append("\"");
-                if (UtilValidate.isNotEmpty(toolTip)) {
-                    writer.append(" title=\"" + toolTip + "\"");
                 }
                 writer.append(">&nbsp</a></li>");
                 appendWhitespace(writer);
@@ -193,10 +219,15 @@
             appendWhitespace(writer);
             writer.append("</div>");
             appendWhitespace(writer);
+            writer.append("<div");
+            if (UtilValidate.isNotEmpty(collapsibleAreaId)) {
+                writer.append(" id=\"" + collapsibleAreaId + "\"");
+            }
             if (screenlet.padded()) {
-                writer.append("<div class=\"screenlet-body\">");
-                appendWhitespace(writer);
+                writer.append(" class=\"screenlet-body\"");
             }
+            writer.append(">");
+            appendWhitespace(writer);
         }
     }
     
@@ -360,10 +391,8 @@
     }
 
     public void renderScreenletEnd(Appendable writer, Map<String, Object> context, ModelScreenWidget.Screenlet screenlet) throws IOException {
-        if (screenlet.padded()) {
-            writer.append("</div>");
-            appendWhitespace(writer);
-        }
+        writer.append("</div>");
+        appendWhitespace(writer);
         writer.append("</div>");
         appendWhitespace(writer);
     }

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=667723&r1=667722&r2=667723&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 Fri Jun 13 20:01:33 2008
@@ -118,6 +118,8 @@
                 subWidgets.add(new Image(modelScreen, subElement));
             } else if ("iterate-section".equals(subElement.getNodeName())) {
                 subWidgets.add(new IterateSectionWidget(modelScreen, subElement));
+            } else if ("horizontal-separator".equals(subElement.getNodeName())) {
+                subWidgets.add(new HorizontalSeparator(modelScreen, subElement));
             } else {
                 throw new IllegalArgumentException("Found invalid screen widget element with name: " + subElement.getNodeName());
             }
@@ -337,6 +339,9 @@
             this.idExdr = new FlexibleStringExpander(screenletElement.getAttribute("id"));
             this.collapsible = "true".equals(screenletElement.getAttribute("collapsible"));
             this.initiallyCollapsed = "true".equals(screenletElement.getAttribute("initially-collapsed"));
+            if (this.initiallyCollapsed) {
+                this.collapsible = true;
+            }
             this.padded = !"false".equals(screenletElement.getAttribute("padded"));
             if (this.collapsible && UtilValidate.isEmpty(this.name) && idExdr.isEmpty()) {
                 throw new IllegalArgumentException("Collapsible screenlets must have a name or id [" + this.modelScreen.getName() + "]");
@@ -420,7 +425,7 @@
         public String getPreferenceKey(Map<String, Object> context) {
             String name = this.idExdr.expandString(context);
             if (UtilValidate.isEmpty(name)) {
-                name = this.modelScreen.getName() + "_" + this.name;
+                name = "screenlet" + "_" + Integer.toHexString(hashCode());
             }
             return name;
         }
@@ -451,6 +456,34 @@
     }
 
     @SuppressWarnings("serial")
+    public static class HorizontalSeparator extends ModelScreenWidget {
+        protected FlexibleStringExpander idExdr;
+        protected FlexibleStringExpander styleExdr;
+        
+        public HorizontalSeparator(ModelScreen modelScreen, Element separatorElement) {
+            super(modelScreen, separatorElement);
+            this.idExdr = new FlexibleStringExpander(separatorElement.getAttribute("id"));
+            this.styleExdr = new FlexibleStringExpander(separatorElement.getAttribute("style"));
+        }
+
+        public void renderWidgetString(Appendable writer, Map<String, Object> context, ScreenStringRenderer screenStringRenderer) throws GeneralException, IOException {
+            screenStringRenderer.renderHorizontalSeparator(writer, context, this);
+        }
+        
+        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 String rawString() {
+            return "<horizontal-separator id=\"" + this.idExdr.getOriginal() + "\" name=\"" + this.idExdr.getOriginal() + "\" style=\"" + this.styleExdr.getOriginal() + "\">";
+        }
+    }
+
+    @SuppressWarnings("serial")
     public static class IncludeScreen extends ModelScreenWidget {
         protected FlexibleStringExpander nameExdr;
         protected FlexibleStringExpander locationExdr;
@@ -1509,3 +1542,4 @@
 
 
 
+

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=667723&r1=667722&r2=667723&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 Fri Jun 13 20:01:33 2008
@@ -38,6 +38,7 @@
     public void renderSubContentBody(Appendable writer, Map<String, Object> context, ModelScreenWidget.SubContent content) throws IOException;
     public void renderSubContentEnd(Appendable writer, Map<String, Object> context, ModelScreenWidget.SubContent content) throws IOException;
 
+    public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException;
     public void renderLabel(Appendable writer, Map<String, Object> context, ModelScreenWidget.Label label) throws IOException;
     public void renderLink(Appendable writer, Map<String, Object> context, ModelScreenWidget.Link link) throws IOException;
     public void renderImage(Appendable writer, Map<String, Object> context, ModelScreenWidget.Image image) throws IOException;
@@ -49,3 +50,4 @@
 }
 
 
+

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=667723&r1=667722&r2=667723&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 Fri Jun 13 20:01:33 2008
@@ -58,6 +58,10 @@
         appendWhitespace(writer);
     }
 
+    public void renderHorizontalSeparator(Appendable writer, Map<String, Object> context, ModelScreenWidget.HorizontalSeparator separator) throws IOException {
+        // TODO: not implemented
+    }
+
     public void renderLink(Appendable writer, Map<String, Object> context, ModelScreenWidget.Link link) throws IOException {
         // TODO: not implemented
     }