Author: adrianc
Date: Mon Feb 11 19:57:14 2008 New Revision: 620699 URL: http://svn.apache.org/viewvc?rev=620699&view=rev Log: New screenlet widget. For details, refer to the xsd or the Jira issue - https://issues.apache.org/jira/browse/OFBIZ-1626. 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/form/ModelForm.java ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.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/widget/dtd/widget-screen.xsd URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-screen.xsd?rev=620699&r1=620698&r2=620699&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/dtd/widget-screen.xsd (original) +++ ofbiz/trunk/framework/widget/dtd/widget-screen.xsd Mon Feb 11 19:57:14 2008 @@ -838,6 +838,53 @@ </xs:simpleType> </xs:attribute> </xs:attributeGroup> + <xs:element name="screenlet" substitutionGroup="AllWidgets"> + <xs:complexType> + <xs:sequence> + <xs:element minOccurs="0" maxOccurs="unbounded" ref="AllWidgets"/> + </xs:sequence> + <xs:attributeGroup ref="attlist.screenlet"/> + </xs:complexType> + </xs:element> + <xs:attributeGroup name="attlist.screenlet"> + <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 name="collapsible" default="false"> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="padded" default="true"> + <xs:annotation><xs:documentation>When set to true, screenlet content will be padded. Defaults to true.</xs:documentation></xs:annotation> + <xs:simpleType> + <xs:restriction base="xs:token"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute type="xs:string" name="navigation-menu-name"> + <xs:annotation><xs:documentation>Name of the screenlet include-menu sub element that will be used for screenlet navigation.</xs:documentation></xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="navigation-form-name"> + <xs:annotation> + <xs:documentation>Name of the screenlet include-form sub element that will be used for screenlet navigation. The form's pagination menu will be included in the screenlet title bar.</xs:documentation> + </xs:annotation> + </xs:attribute> + <xs:attribute type="xs:string" name="tab-menu-name"> + <xs:annotation><xs:documentation>Name of the screenlet include-menu sub element that will be used for the screenlet tab bar.</xs:documentation></xs:annotation> + </xs:attribute> + </xs:attributeGroup> <!-- ================ WIDGETS - Includers ================ --> <xs:element name="content" substitutionGroup="AllWidgets"> 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=620699&r1=620698&r2=620699&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 Mon Feb 11 19:57:14 2008 @@ -22,6 +22,7 @@ import java.io.Writer; import java.util.Map; +import org.ofbiz.base.util.GeneralException; import org.ofbiz.base.util.UtilProperties; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.widget.html.HtmlWidgetRenderer; @@ -124,6 +125,18 @@ } public void renderSubContentEnd(Writer writer, Map context, ModelScreenWidget.SubContent content) throws IOException { + // TODO: not implemented + } + + public void renderScreenletBegin(Writer writer, Map context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException { + // TODO: not implemented + } + + public void renderScreenletSubWidget(Writer writer, Map context, ModelScreenWidget subWidget, ModelScreenWidget.Screenlet screenlet) throws GeneralException { + // TODO: not implemented + } + + public void renderScreenletEnd(Writer writer, Map context, ModelScreenWidget.Screenlet screenlet) throws IOException { // TODO: not implemented } } Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java?rev=620699&r1=620698&r2=620699&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelForm.java Mon Feb 11 19:57:14 2008 @@ -676,6 +676,10 @@ return this.addUpdateField(newFormField); } + public void runFormActions(Map context) { + ModelFormAction.runSubActions(this.actions, context); + } + /** * Renders this form to a String, i.e. in a text format, as defined with the * FormStringRenderer implementation. @@ -692,7 +696,7 @@ * use the same form definitions for many types of form UIs */ public void renderFormString(Writer writer, Map context, FormStringRenderer formStringRenderer) throws IOException { - ModelFormAction.runSubActions(this.actions, context); + runFormActions(context); setWidgetBoundaryComments(context); Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java?rev=620699&r1=620698&r2=620699&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java Mon Feb 11 19:57:14 2008 @@ -74,6 +74,7 @@ HttpServletRequest request; HttpServletResponse response; protected String lastFieldGroupId = ""; + protected boolean renderPagination = true; protected HtmlFormRenderer() {} @@ -82,6 +83,14 @@ this.response = response; } + public boolean getRenderPagination() { + return this.renderPagination; + } + + public void setRenderPagination(boolean renderPagination) { + this.renderPagination = renderPagination; + } + public void appendOfbizUrl(StringBuffer buffer, String location) { ServletContext ctx = (ServletContext) this.request.getAttribute("servletContext"); RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_"); @@ -1159,7 +1168,9 @@ context.put("_QBESTRING_", queryString); renderBeginningBoundaryComment(buffer, "Form Widget", modelForm); - this.renderNextPrev(buffer, context, modelForm); + if (this.renderPagination) { + this.renderNextPrev(buffer, context, modelForm); + } buffer.append(" <table cellspacing=\"0\" class=\""); if(UtilValidate.isNotEmpty(modelForm.getDefaultTableStyle())) { buffer.append(modelForm.getDefaultTableStyle()); @@ -1174,7 +1185,9 @@ buffer.append(" </table>"); appendWhitespace(buffer); - this.renderNextPrev(buffer, context, modelForm); + if (this.renderPagination) { + this.renderNextPrev(buffer, context, modelForm); + } renderEndingBoundaryComment(buffer, "Form Widget", modelForm); } @@ -1973,7 +1986,7 @@ // if this is all there seems to be (if listSize < 0, then size is unknown) if (actualPageSize >= listSize && listSize >= 0) return; - // needed ofr the "Page" and "rows" labels + // needed for the "Page" and "rows" labels Map uiLabelMap = (Map) context.get("uiLabelMap"); String pageLabel = ""; String rowsLabel = ""; 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=620699&r1=620698&r2=620699&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 Mon Feb 11 19:57:14 2008 @@ -20,6 +20,8 @@ import java.io.IOException; import java.io.Writer; +import java.util.HashMap; +import java.util.HashSet; import java.util.Locale; import java.util.Map; @@ -31,13 +33,18 @@ import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.GeneralException; import org.ofbiz.base.util.UtilFormatOut; +import org.ofbiz.base.util.UtilHttp; import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.GenericDelegator; import org.ofbiz.entity.GenericValue; import org.ofbiz.webapp.control.RequestHandler; import org.ofbiz.webapp.taglib.ContentUrlTag; +import org.ofbiz.widget.form.FormStringRenderer; +import org.ofbiz.widget.form.ModelForm; import org.ofbiz.widget.html.HtmlWidgetRenderer; +import org.ofbiz.widget.menu.MenuStringRenderer; +import org.ofbiz.widget.menu.ModelMenu; import org.ofbiz.widget.WidgetContentWorker; import org.ofbiz.widget.WidgetDataResourceWorker; import org.ofbiz.widget.screen.ModelScreenWidget; @@ -84,6 +91,270 @@ public void renderContainerEnd(Writer writer, Map context, ModelScreenWidget.Container container) throws IOException { writer.write("</div>"); appendWhitespace(writer); + } + + public void renderScreenletBegin(Writer writer, Map context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException { + HttpServletRequest request = (HttpServletRequest) context.get("request"); + HttpServletResponse response = (HttpServletResponse) context.get("response"); + ModelScreenWidget.Menu tabMenu = screenlet.getTabMenu(); + if (tabMenu != null) { + tabMenu.renderWidgetString(writer, context, this); + } + writer.write("<div class=\"screenlet\""); + String id = screenlet.getId(context); + if (UtilValidate.isNotEmpty(id)) { + writer.write(" id=\""); + writer.write(id); + writer.write("\""); + } + writer.write(">"); + appendWhitespace(writer); + + String title = screenlet.getTitle(context); + ModelScreenWidget.Menu navMenu = screenlet.getNavigationMenu(); + ModelScreenWidget.Form navForm = screenlet.getNavigationForm(); + if (UtilValidate.isNotEmpty(title) || navMenu != null || navForm != null || screenlet.collapsible()) { + writer.write("<div class=\"screenlet-title-bar\">"); + appendWhitespace(writer); + writer.write("<ul>"); + appendWhitespace(writer); + if (UtilValidate.isNotEmpty(title)) { + writer.write("<li class=\"head3\">"); + writer.write(title); + writer.write("</li>"); + appendWhitespace(writer); + } + if (screenlet.collapsible()) { + String toolTip = null; + Map uiLabelMap = (Map) context.get("uiLabelMap"); + Map requestParameters = new HashMap((Map)context.get("requestParameters")); + writer.write("<li class=\""); + if (collapsed) { + requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "false"); + String queryString = UtilHttp.urlEncodeArgs(requestParameters); + writer.write("collapsed\"><a href=\""); + writer.write(request.getRequestURI() + "?" + queryString); + if (uiLabelMap != null) { + toolTip = (String) uiLabelMap.get("CommonExpand"); + } + } else { + requestParameters.put(screenlet.getPreferenceKey(context) + "_collapsed", "true"); + String queryString = UtilHttp.urlEncodeArgs(requestParameters); + writer.write("expanded\"><a href=\""); + writer.write(request.getRequestURI() + "?" + queryString); + if (uiLabelMap != null) { + toolTip = (String) uiLabelMap.get("CommonCollapse"); + } + } + writer.write("\""); + if (UtilValidate.isNotEmpty(toolTip)) { + writer.write(" title=\"" + toolTip + "\""); + } + writer.write("> </a></li>"); + appendWhitespace(writer); + } + if (!collapsed) { + if (navMenu != null) { + MenuStringRenderer savedRenderer = (MenuStringRenderer) context.get("menuStringRenderer"); + MenuStringRenderer renderer = new ScreenletMenuRenderer(request, response); + context.put("menuStringRenderer", renderer); + navMenu.renderWidgetString(writer, context, this); + context.put("menuStringRenderer", savedRenderer); + } else if (navForm != null) { + renderScreenletPaginateMenu(writer, context, navForm); + } + } + writer.write("</ul>"); + appendWhitespace(writer); + writer.write("<br class=\"clear\" />"); + appendWhitespace(writer); + writer.write("</div>"); + appendWhitespace(writer); + if (screenlet.padded()) { + writer.write("<div class=\"screenlet-body\">"); + appendWhitespace(writer); + } + } + } + + protected void renderScreenletPaginateMenu(Writer writer, Map context, ModelScreenWidget.Form form) throws IOException { + HttpServletResponse response = (HttpServletResponse) context.get("response"); + HttpServletRequest request = (HttpServletRequest) context.get("request"); + ModelForm modelForm = form.getModelForm(context); + modelForm.runFormActions(context); + modelForm.preparePager(context); + String targetService = modelForm.getPaginateTarget(context); + if (targetService == null) { + targetService = "${targetService}"; + } + + // get the parametrized pagination index and size fields + String viewIndexParam = modelForm.getPaginateIndexField(context); + String viewSizeParam = modelForm.getPaginateSizeField(context); + + int viewIndex = modelForm.getViewIndex(context); + int viewSize = modelForm.getViewSize(context); + int listSize = modelForm.getListSize(context); + + int lowIndex = modelForm.getLowIndex(context); + int highIndex = modelForm.getHighIndex(context); + int actualPageSize = modelForm.getActualPageSize(context); + + // if this is all there seems to be (if listSize < 0, then size is unknown) + if (actualPageSize >= listSize && listSize >= 0) return; + + // needed for the "Page" and "rows" labels + Map uiLabelMap = (Map) context.get("uiLabelMap"); + String pageLabel = ""; + String rowsLabel = ""; + String ofLabel = ""; + if (uiLabelMap == null) { + Debug.logWarning("Could not find uiLabelMap in context", module); + } else { + pageLabel = (String) uiLabelMap.get("CommonPage"); + rowsLabel = (String) uiLabelMap.get("CommonRows"); + ofLabel = (String) uiLabelMap.get("CommonOf"); + ofLabel = ofLabel.toLowerCase(); + } + + // for legacy support, the viewSizeParam is VIEW_SIZE and viewIndexParam is VIEW_INDEX when the fields are "viewSize" and "viewIndex" + if (viewIndexParam.equals("viewIndex")) viewIndexParam = "VIEW_INDEX"; + if (viewSizeParam.equals("viewSize")) viewSizeParam = "VIEW_SIZE"; + + ServletContext ctx = (ServletContext) request.getAttribute("servletContext"); + RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_"); + + Map inputFields = (Map) context.get("requestParameters"); + // strip out any multi form fields if the form is of type multi + if (modelForm.getType().equals("multi")) { + inputFields = UtilHttp.removeMultiFormParameters(inputFields); + } + String queryString = UtilHttp.urlEncodeArgs(inputFields); + // strip legacy viewIndex/viewSize params from the query string + queryString = UtilHttp.stripViewParamsFromQueryString(queryString); + // strip parametrized index/size params from the query string + HashSet paramNames = new HashSet(); + paramNames.add(viewIndexParam); + paramNames.add(viewSizeParam); + queryString = UtilHttp.stripNamedParamsFromQueryString(queryString, paramNames); + + String anchor = ""; + String paginateAnchor = modelForm.getPaginateTargetAnchor(); + if (paginateAnchor != null) anchor = "#" + paginateAnchor; + + // preparing the link text, so that later in the code we can reuse this and just add the viewIndex + String prepLinkText = ""; + prepLinkText = targetService; + if (prepLinkText.indexOf("?") < 0) { + prepLinkText += "?"; + } else if (!prepLinkText.endsWith("?")) { + prepLinkText += "&"; + } + if (!UtilValidate.isEmpty(queryString) && !queryString.equals("null")) { + prepLinkText += queryString + "&"; + } + prepLinkText += viewSizeParam + "=" + viewSize + "&" + viewIndexParam + "="; + + String linkText; + + appendWhitespace(writer); + // The current screenlet title bar navigation syling requires rendering + // these links in reverse order + // Last button + writer.write("<li class=\"" + modelForm.getPaginateLastStyle()); + if (highIndex < listSize) { + writer.write("\"><a href=\""); + int page = (listSize / viewSize) - 1; + linkText = prepLinkText + page + anchor; + // - make the link + writer.write(rh.makeLink(request, response, linkText)); + writer.write("\">" + modelForm.getPaginateLastLabel(context) + "</a>"); + } else { + // disabled button + writer.write(" disabled\">" + modelForm.getPaginateLastLabel(context)); + } + writer.write("</li>"); + appendWhitespace(writer); + // Next button + writer.write("<li class=\"" + modelForm.getPaginateNextStyle()); + if (highIndex < listSize) { + writer.write("\"><a href=\""); + linkText = prepLinkText + (viewIndex + 1) + anchor; + // - make the link + writer.write(rh.makeLink(request, response, linkText)); + writer.write("\">" + modelForm.getPaginateNextLabel(context) + "</a>"); + } else { + // disabled button + writer.write(" disabled\">" + modelForm.getPaginateNextLabel(context)); + } + writer.write("</li>"); + appendWhitespace(writer); + if (listSize > 0) { + writer.write("<li>"); + writer.write((lowIndex + 1) + " - " + (lowIndex + actualPageSize ) + " " + ofLabel + " " + listSize); + writer.write("</li>"); + appendWhitespace(writer); + } + // Previous button + writer.write("<li class=\"nav-previous"); + if (viewIndex > 0) { + writer.write("\"><a href=\""); + linkText = prepLinkText + (viewIndex - 1) + anchor; + // - make the link + writer.write(rh.makeLink(request, response, linkText)); + writer.write("\">" + modelForm.getPaginatePreviousLabel(context) + "</a>"); + } else { + // disabled button + writer.write(" disabled\">" + modelForm.getPaginatePreviousLabel(context)); + } + writer.write("</li>"); + appendWhitespace(writer); + // First button + writer.write("<li class=\"nav-first"); + if (viewIndex > 0) { + writer.write("\"><a href=\""); + linkText = prepLinkText + 0 + anchor; + writer.write(rh.makeLink(request, response, linkText)); + writer.write("\">" + modelForm.getPaginateFirstLabel(context) + "</a>"); + } else { + writer.write(" disabled\">" + modelForm.getPaginateFirstLabel(context)); + } + writer.write("</li>"); + appendWhitespace(writer); + } + + public void renderScreenletSubWidget(Writer writer, Map context, ModelScreenWidget subWidget, ModelScreenWidget.Screenlet screenlet) throws GeneralException { + if (subWidget.equals(screenlet.getNavigationForm())) { + HttpServletRequest request = (HttpServletRequest) context.get("request"); + HttpServletResponse response = (HttpServletResponse) context.get("response"); + if (request != null && response != null) { + FormStringRenderer savedRenderer = (FormStringRenderer) context.get("formStringRenderer"); + HtmlFormRenderer renderer = new HtmlFormRenderer(request, response); + renderer.setRenderPagination(false); + context.put("formStringRenderer", renderer); + subWidget.renderWidgetString(writer, context, this); + context.put("formStringRenderer", savedRenderer); + } + } else { + subWidget.renderWidgetString(writer, context, this); + } + } + + public void renderScreenletEnd(Writer writer, Map context, ModelScreenWidget.Screenlet screenlet) throws IOException { + if (screenlet.padded()) { + writer.write("</div>"); + appendWhitespace(writer); + } + writer.write("</div>"); + appendWhitespace(writer); + } + + public static class ScreenletMenuRenderer extends HtmlMenuRenderer { + public ScreenletMenuRenderer(HttpServletRequest request, HttpServletResponse response) { + super(request, response); + } + public void renderMenuOpen(StringBuffer buffer, Map context, ModelMenu modelMenu) {} + public void renderMenuClose(StringBuffer buffer, Map context, ModelMenu modelMenu) {} } public void renderLabel(Writer writer, Map context, ModelScreenWidget.Label label) throws IOException { 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=620699&r1=620698&r2=620699&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 Mon Feb 11 19:57:14 2008 @@ -77,8 +77,8 @@ public abstract String rawString(); - public static List readSubWidgets(ModelScreen modelScreen, List subElementList) { - List subWidgets = new LinkedList(); + public static List<ModelScreenWidget> readSubWidgets(ModelScreen modelScreen, List subElementList) { + List<ModelScreenWidget> subWidgets = new LinkedList<ModelScreenWidget>(); Iterator subElementIter = subElementList.iterator(); while (subElementIter.hasNext()) { Element subElement = (Element) subElementIter.next(); @@ -87,6 +87,8 @@ subWidgets.add(new Section(modelScreen, subElement)); } else if ("container".equals(subElement.getNodeName())) { subWidgets.add(new Container(modelScreen, subElement)); + } else if ("screenlet".equals(subElement.getNodeName())) { + subWidgets.add(new Screenlet(modelScreen, subElement)); } else if ("include-screen".equals(subElement.getNodeName())) { subWidgets.add(new IncludeScreen(modelScreen, subElement)); } else if ("decorator-screen".equals(subElement.getNodeName())) { @@ -299,6 +301,127 @@ } } + @SuppressWarnings("serial") + public static class Screenlet extends ModelScreenWidget { + protected FlexibleStringExpander idExdr; + protected FlexibleStringExpander titleExdr; + protected Menu navigationMenu = null; + protected Menu tabMenu = null; + protected Form navigationForm = null; + protected boolean collapsible = false; + protected boolean padded = true; + protected List<ModelScreenWidget> subWidgets; + + public Screenlet(ModelScreen modelScreen, Element screenletElement) { + super(modelScreen, screenletElement); + this.idExdr = new FlexibleStringExpander(screenletElement.getAttribute("id")); + this.collapsible = "true".equals(screenletElement.getAttribute("collapsible")); + 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() + "]"); + } + this.titleExdr = new FlexibleStringExpander(screenletElement.getAttribute("title")); + List subElementList = UtilXml.childElementList(screenletElement); + this.subWidgets = ModelScreenWidget.readSubWidgets(this.modelScreen, subElementList); + String navMenuName = screenletElement.getAttribute("navigation-menu-name"); + if (UtilValidate.isNotEmpty(navMenuName)) { + for (ModelWidget subWidget : this.subWidgets) { + if (navMenuName.equals(subWidget.getName()) && subWidget instanceof Menu) { + this.navigationMenu = (Menu) subWidget; + subWidgets.remove(subWidget); + break; + } + } + } + String tabMenuName = screenletElement.getAttribute("tab-menu-name"); + if (UtilValidate.isNotEmpty(tabMenuName)) { + for (ModelWidget subWidget : this.subWidgets) { + if (tabMenuName.equals(subWidget.getName()) && subWidget instanceof Menu) { + this.tabMenu = (Menu) subWidget; + subWidgets.remove(subWidget); + break; + } + } + } + String formName = screenletElement.getAttribute("navigation-form-name"); + if (UtilValidate.isNotEmpty(formName) && this.navigationMenu == null) { + for (ModelWidget subWidget : this.subWidgets) { + if (formName.equals(subWidget.getName()) && subWidget instanceof Form) { + this.navigationForm = (Form) subWidget; + // Let's give this a try, it can be removed later if it + // proves to cause problems + this.padded = false; + break; + } + } + } + } + + public void renderWidgetString(Writer writer, Map context, ScreenStringRenderer screenStringRenderer) throws GeneralException { + boolean collapsed = false; + if (this.collapsible) { + String preferenceKey = getPreferenceKey(context) + "_collapsed"; + Map requestParameters = (Map)context.get("requestParameters"); + if (requestParameters != null) { + collapsed = "true".equals(requestParameters.get(preferenceKey)); + } + } + try { + screenStringRenderer.renderScreenletBegin(writer, context, collapsed, this); + if (!collapsed) { + for (ModelScreenWidget subWidget : this.subWidgets) { + screenStringRenderer.renderScreenletSubWidget(writer, context, subWidget, this); + } + } + screenStringRenderer.renderScreenletEnd(writer, context, this); + } catch (IOException e) { + String errMsg = "Error rendering screenlet in screen named [" + this.modelScreen.getName() + "]: "; + Debug.logError(e, errMsg, module); + throw new RuntimeException(errMsg + e); + } + } + + public boolean collapsible() { + return this.collapsible; + } + + public boolean padded() { + return this.padded; + } + + public String getPreferenceKey(Map context) { + String name = this.modelScreen.getName(); + if (UtilValidate.isEmpty(name)) { + name = this.idExdr.expandString(context); + } + return name + "_" + this.name; + } + + public String getId(Map<String, Object> context) { + return this.idExdr.expandString(context); + } + + public String getTitle(Map<String, Object> context) { + return this.titleExdr.expandString(context); + } + + public Menu getNavigationMenu() { + return this.navigationMenu; + } + + public Form getNavigationForm() { + return this.navigationForm; + } + + public Menu getTabMenu() { + return this.tabMenu; + } + + public String rawString() { + return "<screenlet id=\"" + this.idExdr.getOriginal() + "\" title=\"" + this.titleExdr.getOriginal() + "\">"; + } + } + public static class IncludeScreen extends ModelScreenWidget { protected FlexibleStringExpander nameExdr; protected FlexibleStringExpander locationExdr; @@ -585,6 +708,7 @@ protected FlexibleStringExpander nameExdr; protected FlexibleStringExpander locationExdr; protected FlexibleStringExpander shareScopeExdr; + protected ModelForm modelForm = null; public Form(ModelScreen modelScreen, Element formElement) { super(modelScreen, formElement); @@ -625,7 +749,7 @@ } catch (IOException e) { String errMsg = "Error rendering included form named [" + name + "] at location [" + this.getLocation(context) + "]: " + e.toString(); Debug.logError(e, errMsg, module); - throw new RuntimeException(errMsg); + throw new RuntimeException(errMsg + e); } if (protectScope) { @@ -998,20 +1122,27 @@ } public void renderWidgetString(Writer writer, Map context, ScreenStringRenderer screenStringRenderer) { - getModelMenu(context); // try finding the menuStringRenderer by name in the context in case one was prepared and put there MenuStringRenderer menuStringRenderer = (MenuStringRenderer) context.get("menuStringRenderer"); // if there was no menuStringRenderer put in place, now try finding the request/response in the context and creating a new one if (menuStringRenderer == null) { - HttpServletRequest request = (HttpServletRequest) context.get("request"); - HttpServletResponse response = (HttpServletResponse) context.get("response"); - if (request != null && response != null) { - menuStringRenderer = new HtmlMenuRenderer(request, response); + // try finding the menuStringRenderer by name in the context in + // case one was prepared and put there + menuStringRenderer = (MenuStringRenderer) context.get("menuStringRenderer"); + // if there was no menuStringRenderer put in place, now try + // finding the request/response in the context and creating a + // new one + if (menuStringRenderer == null) { + HttpServletRequest request = (HttpServletRequest) context.get("request"); + HttpServletResponse response = (HttpServletResponse) context.get("response"); + if (request != null && response != null) { + menuStringRenderer = new HtmlMenuRenderer(request, response); + } + } + // still null, throw an error + if (menuStringRenderer == null) { + throw new IllegalArgumentException("Could not find a menuStringRenderer in the context, and could not find HTTP request/response objects need to create one."); } - } - // still null, throw an error - if (menuStringRenderer == null) { - throw new IllegalArgumentException("Could not find a menuStringRenderer in the context, and could not find HTTP request/response objects need to create one."); } StringBuffer renderBuffer = new StringBuffer(); 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=620699&r1=620698&r2=620699&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 Mon Feb 11 19:57:14 2008 @@ -22,6 +22,7 @@ import java.io.Writer; import java.util.Map; +import org.ofbiz.base.util.GeneralException; /** * Widget Library - Screen String Renderer interface @@ -43,5 +44,8 @@ public void renderImage(Writer writer, Map context, ModelScreenWidget.Image image) throws IOException; public void renderContentFrame(Writer writer, Map context, ModelScreenWidget.Content content) throws IOException; + public void renderScreenletBegin(Writer writer, Map context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException; + public void renderScreenletSubWidget(Writer writer, Map context, ModelScreenWidget subWidget, ModelScreenWidget.Screenlet screenlet) throws GeneralException; + public void renderScreenletEnd(Writer writer, Map context, ModelScreenWidget.Screenlet screenlet) 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=620699&r1=620698&r2=620699&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 Mon Feb 11 19:57:14 2008 @@ -116,4 +116,13 @@ // appending line ends for now, but this could be replaced with a simple space or something writer.write("\r\n"); } + public void renderScreenletBegin(Writer writer, Map context, boolean collapsed, ModelScreenWidget.Screenlet screenlet) throws IOException { + // TODO: not implemented + } + public void renderScreenletSubWidget(Writer writer, Map context, ModelScreenWidget subWidget, ModelScreenWidget.Screenlet screenlet) throws GeneralException { + // TODO: not implemented + } + public void renderScreenletEnd(Writer writer, Map context, ModelScreenWidget.Screenlet screenlet) throws IOException { + // TODO: not implemented + } } |
Free forum by Nabble | Edit this page |