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 2015/01/18 22:03:42 UTC

svn commit: r1652852 [17/22] - in /ofbiz/trunk: applications/content/src/org/ofbiz/content/cms/ applications/content/src/org/ofbiz/content/content/ applications/content/src/org/ofbiz/content/data/ applications/content/src/org/ofbiz/content/output/ appl...

Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormWrapper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormWrapper.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormWrapper.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormWrapper.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,200 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.collections.MapStack;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.widget.model.FormFactory;
+import org.ofbiz.widget.model.ModelForm;
+import org.ofbiz.widget.renderer.FormRenderer;
+import org.ofbiz.widget.renderer.FormStringRenderer;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Widget Library - HTML Form Wrapper class - makes it easy to do the setup and render of a form
+ */
+public class HtmlFormWrapper {
+
+    public static final String module = HtmlFormWrapper.class.getName();
+
+    protected String resourceName;
+    protected String formName;
+    protected HttpServletRequest request;
+    protected HttpServletResponse response;
+    protected ModelForm modelForm;
+    protected FormStringRenderer renderer;
+    protected Map<String, Object> context;
+
+    protected HtmlFormWrapper() {}
+
+    public HtmlFormWrapper(String resourceName, String formName, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, SAXException, ParserConfigurationException {
+        this.resourceName = resourceName;
+        this.formName = formName;
+        this.request = request;
+        this.response = response;
+        Delegator delegator = null;
+        try {
+            delegator = (Delegator) request.getAttribute("delegator");
+            LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
+            this.modelForm = FormFactory.getFormFromLocation(resourceName, formName, delegator.getModelReader(), dispatcher.getDispatchContext());
+        } catch (IllegalArgumentException iae) {
+            Debug.logWarning("Could not find form with name [" + formName + "] in class resource [" + resourceName + "], will try to load it using relative path syntax.", module);
+            this.modelForm = FormFactory.getFormFromWebappContext(resourceName, formName, request);
+        }
+
+        this.renderer = new HtmlFormRenderer(request, response);
+
+        this.context = new HashMap<String, Object>();
+        Map<String, Object> parameterMap = UtilHttp.getParameterMap(request);
+        context.put("parameters", parameterMap);
+
+        //make sure the locale is in the context
+        context.put("locale", UtilHttp.getLocale(request));
+        //make sure the timeZone is in the context
+        context.put("timeZone", UtilHttp.getTimeZone(request));
+
+        // if there was an error message, this is an error
+        if (UtilValidate.isNotEmpty(request.getAttribute("_ERROR_MESSAGE_"))) {
+            context.put("isError", Boolean.TRUE);
+        } else {
+            context.put("isError", Boolean.FALSE);
+        }
+
+        // if a parameter was passed saying this is an error, it is an error
+        if ("true".equals(parameterMap.get("isError"))) {
+            context.put("isError", Boolean.TRUE);
+        }
+
+        Map<String, String> uiLabelMap = UtilGenerics.cast(request.getAttribute("uiLabelMap"));
+        if (UtilValidate.isNotEmpty(uiLabelMap) && context.get("uiLabelMap") == null) {
+            Debug.logInfo("Got uiLabelMap: " + uiLabelMap, module);
+            context.put("uiLabelMap", uiLabelMap);
+        }
+        if (UtilValidate.isNotEmpty(delegator) && context.get("delegator") == null) {
+            context.put("delegator", delegator);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    public StringWriter renderFormString(Object contextStack) throws Exception {
+        if (contextStack instanceof MapStack) {
+            return renderFormString((MapStack) contextStack);
+        } else {
+            Debug.logWarning("Call renderFormString with a non-MapStack: " + (contextStack == null ? "null" : contextStack.getClass().getName()), module);
+            return renderFormString();
+        }
+    }
+    public StringWriter renderFormString(MapStack<String> contextStack) throws Exception {
+        // create a new context with the current context on the bottom
+        contextStack.push(this.context);
+        StringWriter buffer = new StringWriter();
+        FormRenderer formRenderer = new FormRenderer(modelForm, renderer);
+        formRenderer.render(buffer, contextStack);
+        contextStack.pop();
+        return buffer;
+    }
+    public StringWriter renderFormString() throws Exception {
+        StringWriter buffer = new StringWriter();
+        FormRenderer formRenderer = new FormRenderer(modelForm, renderer);
+        formRenderer.render(buffer, context);
+        return buffer;
+    }
+
+    /**
+     * Tells the form library whether this is a response to an error or not.
+     * Defaults on initialization according to the presense of an errorMessage
+     * in the request or if an isError parameter was passed to the page with
+     * the value "true". If true then the prefilled values will come from the
+     * parameters Map instead of the value Map.
+     */
+    public void setIsError(boolean isError) {
+        this.context.put("isError", Boolean.valueOf(isError));
+    }
+
+    public boolean getIsError() {
+        Boolean isErrorBoolean = (Boolean) this.context.get("isError");
+        if (isErrorBoolean == null) {
+            return false;
+        } else {
+            return isErrorBoolean.booleanValue();
+        }
+    }
+
+    /**
+     * The "useRequestParameters" value in the form context tells the form library
+     * to use the request parameters to fill in values instead of the value map.
+     * This is generally used when it is an empty form to pre-set inital values.
+     * This is automatically set to false for list and multi forms. For related
+     * functionality see the setIsError method.
+     *
+     * @param useRequestParameters
+     */
+    public void setUseRequestParameters(boolean useRequestParameters) {
+        this.context.put("useRequestParameters", Boolean.valueOf(useRequestParameters));
+    }
+
+    public boolean getUseRequestParameters() {
+        Boolean useRequestParametersBoolean = (Boolean) this.context.get("useRequestParameters");
+        if (useRequestParametersBoolean == null) {
+            return false;
+        } else {
+            return useRequestParametersBoolean.booleanValue();
+        }
+    }
+
+    public void setFormOverrideName(String formName) {
+        this.context.put("formName", formName);
+    }
+
+    public void putInContext(String name, Object value) {
+        this.context.put(name, value);
+    }
+
+    public Object getFromContext(String name) {
+        return this.context.get(name);
+    }
+
+    public ModelForm getModelForm() {
+        return modelForm;
+    }
+
+    public FormStringRenderer getRenderer() {
+        return renderer;
+    }
+
+    public void setRenderer(FormStringRenderer renderer) {
+        this.renderer = renderer;
+    }
+}

Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRenderer.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRenderer.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRenderer.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,592 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.ofbiz.base.util.StringUtil;
+import org.ofbiz.base.util.UtilCodec;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.webapp.control.RequestHandler;
+import org.ofbiz.webapp.taglib.ContentUrlTag;
+import org.ofbiz.widget.WidgetWorker;
+import org.ofbiz.widget.model.CommonWidgetModels.Image;
+import org.ofbiz.widget.model.ModelMenu;
+import org.ofbiz.widget.model.ModelMenuItem;
+import org.ofbiz.widget.model.ModelMenuItem.MenuLink;
+import org.ofbiz.widget.model.ModelWidget;
+import org.ofbiz.widget.renderer.MenuStringRenderer;
+
+/**
+ * Widget Library - HTML Menu Renderer implementation
+ */
+public class HtmlMenuRenderer extends HtmlWidgetRenderer implements MenuStringRenderer {
+
+    HttpServletRequest request;
+    HttpServletResponse response;
+    protected String userLoginIdAtPermGrant;
+    protected String permissionErrorMessage = "";
+
+    public static final String module = HtmlMenuRenderer.class.getName();
+
+    protected HtmlMenuRenderer() {}
+
+    public HtmlMenuRenderer(HttpServletRequest request, HttpServletResponse response) {
+        this.request = request;
+        this.response = response;
+    }
+
+    public void appendOfbizUrl(Appendable writer, String location) throws IOException {
+        ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
+        if (ctx == null) {
+            //if (Debug.infoOn()) Debug.logInfo("in appendOfbizUrl, ctx is null(0): buffer=" + buffer.toString() + " location:" + location, "");
+            HttpSession session = request.getSession();
+            if (session != null) {
+                ctx = session.getServletContext();
+            } else {
+                //if (Debug.infoOn()) Debug.logInfo("in appendOfbizUrl, session is null(1)", "");
+            }
+            if (ctx == null) {
+                throw new RuntimeException("ctx is null. location:" + location);
+            }
+                //if (Debug.infoOn()) Debug.logInfo("in appendOfbizUrl, ctx is NOT null(2)", "");
+        }
+        Delegator delegator = (Delegator)request.getAttribute("delegator");
+        if (delegator == null) {
+                //if (Debug.infoOn()) Debug.logInfo("in appendOfbizUrl, delegator is null(5)", "");
+        }
+        RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
+        // make and append the link
+        String s = rh.makeLink(this.request, this.response, location);
+        if (s.indexOf("null") >= 0) {
+            //if (Debug.infoOn()) Debug.logInfo("in appendOfbizUrl(3), url: " + s, "");
+        }
+        writer.append(s);
+    }
+
+    public void appendContentUrl(Appendable writer, String location) throws IOException {
+        ServletContext ctx = (ServletContext) this.request.getAttribute("servletContext");
+        if (ctx == null) {
+            //if (Debug.infoOn()) Debug.logInfo("in appendContentUrl, ctx is null(0): buffer=" + buffer.toString() + " location:" + location, "");
+            HttpSession session = request.getSession();
+            if (session != null) {
+                ctx = session.getServletContext();
+            } else {
+                //if (Debug.infoOn()) Debug.logInfo("in appendContentUrl, session is null(1)", "");
+            }
+            if (ctx == null) {
+                throw new RuntimeException("ctx is null. location:" + location);
+            }
+            //if (Debug.infoOn()) Debug.logInfo("in appendContentUrl, ctx is NOT null(2)", "");
+            this.request.setAttribute("servletContext", ctx);
+        }
+        Delegator delegator = (Delegator) request.getAttribute("delegator");
+        if (delegator == null) {
+                //if (Debug.infoOn()) Debug.logInfo("in appendContentUrl, delegator is null(6)", "");
+        }
+        StringBuilder buffer = new StringBuilder();
+        ContentUrlTag.appendContentPrefix(this.request, buffer);
+        writer.append(buffer.toString());
+        writer.append(location);
+    }
+
+    public void appendTooltip(Appendable writer, Map<String, Object> context, ModelMenuItem modelMenuItem) throws IOException {
+        // render the tooltip
+        String tooltip = modelMenuItem.getTooltip(context);
+        if (UtilValidate.isNotEmpty(tooltip)) {
+            writer.append("<span class=\"");
+            String tooltipStyle = modelMenuItem.getTooltipStyle();
+            if (UtilValidate.isNotEmpty(tooltipStyle)) {
+                writer.append(tooltipStyle);
+            } else {
+                writer.append("tooltip");
+            }
+            writer.append("\"");
+            writer.append(tooltip);
+            writer.append("</span>");
+        }
+    }
+
+    public void renderFormatSimpleWrapperRows(Appendable writer, Map<String, Object> context, Object menuObj) throws IOException {
+        List<ModelMenuItem> menuItemList = ((ModelMenu) menuObj).getMenuItemList();
+        for (ModelMenuItem currentMenuItem: menuItemList) {
+            renderMenuItem(writer, context, currentMenuItem);
+        }
+    }
+
+    public void renderMenuItem(Appendable writer, Map<String, Object> context, ModelMenuItem menuItem) throws IOException {
+
+        //Debug.logInfo("in renderMenuItem, menuItem:" + menuItem.getName() + " context:" + context ,"");
+        boolean hideThisItem = isHideIfSelected(menuItem, context);
+        //if (Debug.infoOn()) Debug.logInfo("in HtmlMenuRendererImage, hideThisItem:" + hideThisItem,"");
+        if (hideThisItem)
+            return;
+
+        String style = menuItem.getWidgetStyle();
+
+        if (menuItem.isSelected(context)) {
+            style = menuItem.getSelectedStyle();
+            if (UtilValidate.isEmpty(style)) {
+                style = "selected";
+            }
+        }
+
+        if (this.isDisableIfEmpty(menuItem, context)) {
+            style = menuItem.getDisabledTitleStyle();
+        }
+
+        writer.append("  <li");
+        String alignStyle = menuItem.getAlignStyle();
+        if (UtilValidate.isNotEmpty(style) || UtilValidate.isNotEmpty(alignStyle)) {
+            writer.append(" class=\"");
+            if (UtilValidate.isNotEmpty(style)) {
+                writer.append(style).append(" ");
+            }
+            if (UtilValidate.isNotEmpty(alignStyle)) {
+                writer.append(alignStyle);
+            }
+            writer.append("\"");
+        }
+        String toolTip = menuItem.getTooltip(context);
+        if (UtilValidate.isNotEmpty(toolTip)) {
+            writer.append(" title=\"").append(toolTip).append("\"");
+        }
+        writer.append(">");
+
+        MenuLink link = menuItem.getLink();
+        //if (Debug.infoOn()) Debug.logInfo("in HtmlMenuRendererImage, link(0):" + link,"");
+        if (link != null) {
+            renderLink(writer, context, link);
+        } else {
+            String txt = menuItem.getTitle(context);
+            UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
+            if (simpleEncoder != null) {
+                txt = simpleEncoder.encode(txt);
+            }
+            writer.append(txt);
+
+        }
+        if (!menuItem.getMenuItemList().isEmpty()) {
+            appendWhitespace(writer);
+            writer.append("    <ul>");
+            appendWhitespace(writer);
+            for (ModelMenuItem childMenuItem : menuItem.getMenuItemList()) {
+                childMenuItem.renderMenuItemString(writer, context, this);
+            }
+            writer.append("    </ul>");
+            appendWhitespace(writer);
+        }
+
+        writer.append("</li>");
+
+        appendWhitespace(writer);
+    }
+
+    public boolean isDisableIfEmpty(ModelMenuItem menuItem, Map<String, Object> context) {
+        boolean disabled = false;
+        String disableIfEmpty = menuItem.getDisableIfEmpty();
+        if (UtilValidate.isNotEmpty(disableIfEmpty)) {
+            List<String> keys = StringUtil.split(disableIfEmpty, "|");
+            for (String key: keys) {
+                Object obj = context.get(key);
+                if (obj == null) {
+                    disabled = true;
+                    break;
+                }
+            }
+        }
+        return disabled;
+    }
+
+/*
+    public String buildDivStr(ModelMenuItem menuItem, Map<String, Object> context) {
+        String divStr = "";
+        divStr =  menuItem.getTitle(context);
+        return divStr;
+    }
+*/
+    public void renderMenuOpen(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
+
+            //Debug.logInfo("in HtmlMenuRenderer, userLoginIdHasChanged:" + userLoginIdHasChanged,"");
+        this.widgetCommentsEnabled = ModelWidget.widgetBoundaryCommentsEnabled(context);
+        renderBeginningBoundaryComment(writer, "Menu Widget", modelMenu);
+        writer.append("<div");
+        String menuId = modelMenu.getId();
+        if (UtilValidate.isNotEmpty(menuId)) {
+            writer.append(" id=\"").append(menuId).append("\"");
+        } else {
+            // TODO: Remove else after UI refactor - allow both id and style
+            String menuContainerStyle = modelMenu.getMenuContainerStyle(context);
+            if (UtilValidate.isNotEmpty(menuContainerStyle)) {
+                writer.append(" class=\"").append(menuContainerStyle).append("\"");
+            }
+        }
+        String menuWidth = modelMenu.getMenuWidth();
+        // TODO: Eliminate embedded styling after refactor
+        if (UtilValidate.isNotEmpty(menuWidth)) {
+            writer.append(" style=\"width:").append(menuWidth).append(";\"");
+        }
+        writer.append(">");
+        appendWhitespace(writer);
+        String menuTitle = modelMenu.getTitle(context);
+        if (UtilValidate.isNotEmpty(menuTitle)) {
+            writer.append("<h2>").append(menuTitle).append("</h2>");
+            appendWhitespace(writer);
+        }
+        if (modelMenu.renderedMenuItemCount(context) > 0) {
+            writer.append("<ul>");
+            appendWhitespace(writer);
+            writer.append("<li>");
+            appendWhitespace(writer);
+            writer.append(" <ul>");
+            appendWhitespace(writer);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.menu.MenuStringRenderer#renderMenuClose(java.io.Writer, java.util.Map, org.ofbiz.widget.menu.ModelMenu)
+     */
+    public void renderMenuClose(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
+        // TODO: div can't be directly inside an UL
+        String fillStyle = modelMenu.getFillStyle();
+        if (UtilValidate.isNotEmpty(fillStyle)) {
+            writer.append("<div class=\"").append(fillStyle).append("\">&nbsp;</div>");
+        }
+        //String menuContainerStyle = modelMenu.getMenuContainerStyle(context);
+        if (modelMenu.renderedMenuItemCount(context) > 0) {      
+            writer.append(" </ul>");
+            appendWhitespace(writer);
+            writer.append("</li>");
+            appendWhitespace(writer);
+            writer.append("</ul>");
+            appendWhitespace(writer);
+        }
+        writer.append(" <br class=\"clear\"/>");
+        appendWhitespace(writer);
+        writer.append("</div>");
+        appendWhitespace(writer);
+        renderEndingBoundaryComment(writer, "Menu Widget", modelMenu);
+
+        GenericValue userLogin = (GenericValue)request.getSession().getAttribute("userLogin");
+        if (userLogin != null) {
+            String userLoginId = userLogin.getString("userLoginId");
+            //request.getSession().setAttribute("userLoginIdAtPermGrant", userLoginId);
+            setUserLoginIdAtPermGrant(userLoginId);
+            //Debug.logInfo("in HtmlMenuRenderer, userLoginId(Close):" + userLoginId + " userLoginIdAtPermGrant:" + request.getSession().getAttribute("userLoginIdAtPermGrant"),"");
+        } else {
+            request.getSession().setAttribute("userLoginIdAtPermGrant", null);
+        }
+    }
+
+    public void renderFormatSimpleWrapperOpen(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
+        //appendWhitespace(writer);
+    }
+
+    public void renderFormatSimpleWrapperClose(Appendable writer, Map<String, Object> context, ModelMenu modelMenu) throws IOException {
+        //appendWhitespace(writer);
+    }
+
+    public void setRequest(HttpServletRequest request) {
+        this.request = request;
+    }
+
+    public void setResponse(HttpServletResponse response) {
+        this.response = response;
+    }
+
+
+    /**
+     * @param string
+     */
+    public void setUserLoginIdAtPermGrant(String string) {
+            //Debug.logInfo("in HtmlMenuRenderer,  userLoginIdAtPermGrant(setUserLoginIdAtPermGrant):" + string,"");
+        this.userLoginIdAtPermGrant = string;
+    }
+
+    public String getUserLoginIdAtPermGrant() {
+        return this.userLoginIdAtPermGrant;
+    }
+
+    public boolean isHideIfSelected(ModelMenuItem menuItem, Map<String, Object> context) {
+        ModelMenu menu = menuItem.getModelMenu();
+        String currentMenuItemName = menu.getSelectedMenuItemContextFieldName(context);
+        String currentItemName = menuItem.getName();
+        Boolean hideIfSelected = menuItem.getHideIfSelected();
+            //Debug.logInfo("in HtmlMenuRenderer, currentMenuItemName:" + currentMenuItemName + " currentItemName:" + currentItemName + " hideIfSelected:" + hideIfSelected,"");
+        return (hideIfSelected != null && hideIfSelected.booleanValue() && currentMenuItemName != null && currentMenuItemName.equals(currentItemName));
+    }
+
+
+    public boolean userLoginIdHasChanged() {
+        boolean hasChanged = false;
+        GenericValue userLogin = (GenericValue)request.getSession().getAttribute("userLogin");
+        userLoginIdAtPermGrant = getUserLoginIdAtPermGrant();
+        //userLoginIdAtPermGrant = (String)request.getSession().getAttribute("userLoginIdAtPermGrant");
+        String userLoginId = null;
+        if (userLogin != null)
+            userLoginId = userLogin.getString("userLoginId");
+            //Debug.logInfo("in HtmlMenuRenderer, userLoginId:" + userLoginId + " userLoginIdAtPermGrant:" + userLoginIdAtPermGrant ,"");
+        if ((userLoginId == null && userLoginIdAtPermGrant != null)
+           || (userLoginId != null && userLoginIdAtPermGrant == null)
+           || ((userLoginId != null && userLoginIdAtPermGrant != null)
+              && !userLoginId.equals(userLoginIdAtPermGrant))) {
+            hasChanged = true;
+        } else {
+            if (userLoginIdAtPermGrant != null)
+               hasChanged = true;
+            else
+               hasChanged = false;
+
+            userLoginIdAtPermGrant = null;
+        }
+        return hasChanged;
+    }
+
+    public String getTitle(ModelMenuItem menuItem, Map<String, Object> context) {
+        String title = null;
+        title = menuItem.getTitle(context);
+        return title;
+    }
+
+    public void renderLink(Appendable writer, Map<String, Object> context, ModelMenuItem.MenuLink link) throws IOException {
+        String target = link.getTarget(context);
+        ModelMenuItem menuItem = link.getLinkMenuItem();
+        if (isDisableIfEmpty(menuItem, context)) {
+            target = null;
+        }
+
+        if (UtilValidate.isNotEmpty(target)) {
+            HttpServletResponse response = (HttpServletResponse) context.get("response");
+            HttpServletRequest request = (HttpServletRequest) context.get("request");
+
+            String targetWindow = link.getTargetWindow(context);
+            String uniqueItemName = menuItem.getModelMenu().getName() + "_" + menuItem.getName() + "_LF_" + UtilMisc.<String>addToBigDecimalInMap(context, "menuUniqueItemIndex", BigDecimal.ONE);
+
+            String linkType = WidgetWorker.determineAutoLinkType(link.getLinkType(), target, link.getUrlMode(), request);
+            if ("hidden-form".equals(linkType)) {
+                writer.append("<form method=\"post\"");
+                writer.append(" action=\"");
+                // note that this passes null for the parameterList on purpose so they won't be put into the URL
+                WidgetWorker.buildHyperlinkUrl(writer, target, link.getUrlMode(), null, link.getPrefix(context),
+                        link.getFullPath(), link.getSecure(), link.getEncode(), request, response, context);
+                writer.append("\"");
+
+                if (UtilValidate.isNotEmpty(targetWindow)) {
+                    writer.append(" target=\"");
+                    writer.append(targetWindow);
+                    writer.append("\"");
+                }
+
+                writer.append(" name=\"");
+                writer.append(uniqueItemName);
+                writer.append("\">");
+
+                UtilCodec.SimpleEncoder simpleEncoder = (UtilCodec.SimpleEncoder) context.get("simpleEncoder");
+                for (Map.Entry<String, String> parameter: link.getParameterMap(context).entrySet()) {
+                    writer.append("<input name=\"");
+                    writer.append(parameter.getKey());
+                    writer.append("\" value=\"");
+                    if (simpleEncoder != null) {
+                        writer.append(simpleEncoder.encode(parameter.getValue()));
+                    } else {
+                        writer.append(parameter.getValue());
+                    }
+                    writer.append("\" type=\"hidden\"/>");
+                }
+
+                writer.append("</form>");
+            }
+
+            writer.append("<a");
+            String id = link.getId(context);
+            if (UtilValidate.isNotEmpty(id)) {
+                writer.append(" id=\"");
+                writer.append(id);
+                writer.append("\"");
+            }
+
+            String style = link.getStyle(context);
+            if (UtilValidate.isNotEmpty(style)) {
+                writer.append(" class=\"");
+                writer.append(style);
+                writer.append("\"");
+            }
+            String name = link.getName(context);
+            if (UtilValidate.isNotEmpty(name)) {
+                writer.append(" name=\"");
+                writer.append(name);
+                writer.append("\"");
+            }
+            if (!"hidden-form".equals(linkType)) {
+                if (UtilValidate.isNotEmpty(targetWindow)) {
+                    writer.append(" target=\"");
+                    writer.append(targetWindow);
+                    writer.append("\"");
+                }
+            }
+
+            writer.append(" href=\"");
+            String confirmationMsg = null;
+            if ("hidden-form".equals(linkType)) {
+                if (UtilValidate.isNotEmpty(confirmationMsg)) {
+                    writer.append("javascript:confirmActionFormLink('");
+                    writer.append(confirmationMsg);
+                    writer.append("', '");
+                    writer.append(uniqueItemName);
+                    writer.append("')");
+                } else {
+                    writer.append("javascript:document.");
+                    writer.append(uniqueItemName);
+                    writer.append(".submit()");
+                }
+            } else {
+                if (UtilValidate.isNotEmpty(confirmationMsg)) {
+                    writer.append("javascript:confirmActionLink('");
+                    writer.append(confirmationMsg);
+                    writer.append("', '");
+                    WidgetWorker.buildHyperlinkUrl(writer, target, link.getUrlMode(), link.getParameterMap(context), link.getPrefix(context),
+                            link.getFullPath(), link.getSecure(), link.getEncode(), request, response, context);
+                    writer.append("')");
+                } else {
+                WidgetWorker.buildHyperlinkUrl(writer, target, link.getUrlMode(), link.getParameterMap(context), link.getPrefix(context),
+                        link.getFullPath(), link.getSecure(), link.getEncode(), request, response, context);
+                }
+            }
+            writer.append("\">");
+        }
+
+        // the text
+        Image img = link.getImage();
+        if (img != null) {
+            renderImage(writer, context, img);
+            writer.append("&nbsp;" + link.getText(context));
+        } else {
+            writer.append(link.getText(context));
+        }
+
+        if (UtilValidate.isNotEmpty(target)) {
+            // close tag
+            writer.append("</a>");
+        }
+
+        /* NOTE DEJ20090316: This was here as a comment and not sure what it is for or if it is useful... can probably be safely removed in the future if still not used/needed
+        boolean isSelected = menuItem.isSelected(context);
+
+        String style = null;
+
+        if (isSelected) {
+        style = menuItem.getSelectedStyle();
+        } else {
+        style = link.getStyle(context);
+        if (UtilValidate.isEmpty(style))
+        style = menuItem.getTitleStyle();
+        if (UtilValidate.isEmpty(style))
+        style = menuItem.getWidgetStyle();
+        }
+
+        if (menuItem.getDisabled()) {
+        style = menuItem.getDisabledTitleStyle();
+        }
+
+        if (UtilValidate.isNotEmpty(style)) {
+        writer.append(" class=\"");
+        writer.append(style);
+        writer.append("\"");
+        }
+        */
+    }
+
+    public void renderImage(Appendable writer, Map<String, Object> context, Image image) throws IOException {
+        // open tag
+        writer.append("<img ");
+        String id = image.getId(context);
+        if (UtilValidate.isNotEmpty(id)) {
+            writer.append(" id=\"");
+            writer.append(id);
+            writer.append("\"");
+        }
+        String style = image.getStyle(context);
+        if (UtilValidate.isNotEmpty(style)) {
+            writer.append(" class=\"");
+            writer.append(style);
+            writer.append("\"");
+        }
+        String wid = image.getWidth(context);
+        if (UtilValidate.isNotEmpty(wid)) {
+            writer.append(" width=\"");
+            writer.append(wid);
+            writer.append("\"");
+        }
+        String hgt = image.getHeight(context);
+        if (UtilValidate.isNotEmpty(hgt)) {
+            writer.append(" height=\"");
+            writer.append(hgt);
+            writer.append("\"");
+        }
+        String border = image.getBorder(context);
+        if (UtilValidate.isNotEmpty(border)) {
+            writer.append(" border=\"");
+            writer.append(border);
+            writer.append("\"");
+        }
+        String src = image.getSrc(context);
+        if (UtilValidate.isNotEmpty(src)) {
+            writer.append(" src=\"");
+            String urlMode = image.getUrlMode();
+            boolean fullPath = false;
+            boolean secure = false;
+            boolean encode = false;
+            HttpServletResponse response = (HttpServletResponse) context.get("response");
+            HttpServletRequest request = (HttpServletRequest) context.get("request");
+            if (urlMode != null && urlMode.equalsIgnoreCase("ofbiz")) {
+                if (request != null && response != null) {
+                    ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
+                    RequestHandler rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
+                    String urlString = rh.makeLink(request, response, src, fullPath, secure, encode);
+                    writer.append(urlString);
+                } else {
+                    writer.append(src);
+                }
+            } else  if (urlMode != null && urlMode.equalsIgnoreCase("content")) {
+                if (request != null && response != null) {
+                    StringBuilder newURL = new StringBuilder();
+                    ContentUrlTag.appendContentPrefix(request, newURL);
+                    newURL.append(src);
+                    writer.append(newURL.toString());
+                }
+            } else {
+                writer.append(src);
+            }
+
+            writer.append("\"");
+        }
+        writer.append("/>");
+    }
+}

Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRendererImage.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRendererImage.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRendererImage.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuRendererImage.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.widget.content.WidgetContentWorker;
+import org.ofbiz.widget.model.ModelMenuItem;
+
+/**
+ * Widget Library - HTML Menu Renderer implementation
+ */
+
+public class HtmlMenuRendererImage extends HtmlMenuRenderer {
+
+    protected HtmlMenuRendererImage() {}
+
+    public HtmlMenuRendererImage(HttpServletRequest request, HttpServletResponse response) {
+        super(request, response);
+    }
+
+
+    public String buildDivStr(ModelMenuItem menuItem, Map<String, Object> context) throws IOException {
+
+        StringBuilder imgStr = new StringBuilder("<img src=\"");
+        String contentId = menuItem.getAssociatedContentId(context);
+        Delegator delegator = (Delegator)request.getAttribute("delegator");
+        GenericValue webSitePublishPoint = null;
+                //Debug.logInfo("in HtmlMenuRendererImage, contentId:" + contentId,"");
+        try {
+            if (WidgetContentWorker.contentWorker != null) {
+                webSitePublishPoint = WidgetContentWorker.contentWorker.getWebSitePublishPointExt(delegator, contentId, false);
+            } else {
+                Debug.logError("Not rendering image because can't get WebSitePublishPoint, not ContentWorker found.", module);
+            }
+        } catch (GenericEntityException e) {
+                //Debug.logInfo("in HtmlMenuRendererImage, GEException:" + e.getMessage(),"");
+            throw new RuntimeException(e.getMessage());
+        }
+        String medallionLogoStr = webSitePublishPoint.getString("medallionLogo");
+        StringWriter buf = new StringWriter();
+        appendContentUrl(buf, medallionLogoStr);
+        imgStr.append(buf.toString());
+                //Debug.logInfo("in HtmlMenuRendererImage, imgStr:" + imgStr,"");
+        String cellWidth = menuItem.getCellWidth();
+        imgStr.append("\"");
+        if (UtilValidate.isNotEmpty(cellWidth))
+            imgStr.append(" width=\"").append(cellWidth).append("\" ");
+
+        imgStr.append(" border=\"0\" />");
+        return imgStr.toString();
+    }
+
+}

Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapper.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapper.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapper.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,252 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.widget.model.MenuFactory;
+import org.ofbiz.widget.model.ModelMenu;
+import org.ofbiz.widget.renderer.MenuStringRenderer;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Widget Library - HTML Menu Wrapper class - makes it easy to do the setup and render of a menu
+ */
+public class HtmlMenuWrapper {
+
+    public static final String module = HtmlMenuWrapper.class.getName();
+
+    protected String resourceName;
+    protected String menuName;
+    protected HttpServletRequest request;
+    protected HttpServletResponse response;
+    protected ModelMenu modelMenu;
+    protected MenuStringRenderer renderer;
+    protected Map<String, Object> context;
+
+    protected HtmlMenuWrapper() {}
+
+    public HtmlMenuWrapper(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, SAXException, ParserConfigurationException {
+        init(resourceName, menuName, request, response);
+    }
+
+    public void init(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, SAXException, ParserConfigurationException {
+        this.resourceName = resourceName;
+        this.menuName = menuName;
+        this.request = request;
+        this.response = response;
+
+        this.modelMenu = MenuFactory.getMenuFromWebappContext(resourceName, menuName, request);
+
+        this.renderer = getMenuRenderer();
+
+        this.context = new HashMap<String, Object>();
+        Map<String, Object> parameterMap = UtilHttp.getParameterMap(request);
+        context.put("parameters", parameterMap);
+
+        HttpSession session = request.getSession();
+        GenericValue userLogin = (GenericValue)session.getAttribute("userLogin");
+        context.put("userLogin", userLogin);
+
+        //make sure the locale is in the context
+        context.put("locale", UtilHttp.getLocale(request));
+
+        // if there was an error message, this is an error
+        if (UtilValidate.isNotEmpty(request.getAttribute("_ERROR_MESSAGE_"))) {
+            context.put("isError", Boolean.TRUE);
+        } else {
+            context.put("isError", Boolean.FALSE);
+        }
+
+        // if a parameter was passed saying this is an error, it is an error
+        if ("true".equals(parameterMap.get("isError"))) {
+            context.put("isError", Boolean.TRUE);
+        }
+    }
+
+    public MenuStringRenderer getMenuRenderer() {
+        return new HtmlMenuRenderer(request, response);
+    }
+
+    public String renderMenuString() throws IOException {
+        HttpServletRequest req = ((HtmlMenuRenderer)renderer).request;
+        ServletContext ctx = (ServletContext) req.getAttribute("servletContext");
+        if (ctx == null) {
+            if (Debug.infoOn()) Debug.logInfo("in renderMenuString, ctx is null(0)" , "");
+        }
+
+        Writer writer = new StringWriter();
+        modelMenu.renderMenuString(writer, context, renderer);
+
+        HttpServletRequest req2 = ((HtmlMenuRenderer)renderer).request;
+        ServletContext ctx2 = (ServletContext) req2.getAttribute("servletContext");
+        if (ctx2 == null) {
+            if (Debug.infoOn()) Debug.logInfo("in renderMenuString, ctx is null(2)" , "");
+        }
+
+        return writer.toString();
+    }
+
+    /**
+     * Tells the menu library whether this is a response to an error or not.
+     * Defaults on initialization according to the presense of an errorMessage
+     * in the request or if an isError parameter was passed to the page with
+     * the value "true". If true then the prefilled values will come from the
+     * parameters Map instead of the value Map.
+     */
+    public void setIsError(boolean isError) {
+        this.context.put("isError", Boolean.valueOf(isError));
+    }
+
+    public boolean getIsError() {
+        Boolean isErrorBoolean = (Boolean) this.context.get("isError");
+        if (isErrorBoolean == null) {
+            return false;
+        } else {
+            return isErrorBoolean.booleanValue();
+        }
+    }
+
+    public void setMenuOverrideName(String menuName) {
+        this.context.put("menuName", menuName);
+    }
+
+    public void putInContext(String name, Object value) {
+        this.context.put(name, value);
+    }
+
+    public void putInContext(String menuItemName, String valueName,  Object value) {
+        Map<String, Object> valueMap = UtilGenerics.toMap(context.get(menuItemName));
+        if (valueMap == null) {
+            valueMap = new HashMap<String, Object>();
+            context.put(menuItemName, valueMap);
+        }
+        valueMap.put(valueName, value);
+    }
+
+    public Object getFromContext(String name) {
+        return this.context.get(name);
+    }
+
+    public Object getFromContext(String menuItemName, String valueName) {
+        Map<String, Object> valueMap = UtilGenerics.toMap(context.get(menuItemName));
+        if (valueMap == null) {
+            valueMap = new HashMap<String, Object>();
+            context.put(menuItemName, valueMap);
+        }
+        return valueMap.get(valueName);
+    }
+
+    public ModelMenu getModelMenu() {
+        return modelMenu;
+    }
+
+    public MenuStringRenderer getRenderer() {
+        return renderer;
+    }
+
+    public void setRenderer(MenuStringRenderer renderer) {
+        this.renderer = renderer;
+    }
+
+    public void setRequest(HttpServletRequest request) {
+        this.request = request;
+        ((HtmlMenuRenderer)renderer).setRequest(request);
+    }
+
+    public void setResponse(HttpServletResponse response) {
+        this.response = response;
+        ((HtmlMenuRenderer)renderer).setResponse(response);
+    }
+
+    public HttpServletRequest getRequest() {
+        return ((HtmlMenuRenderer)renderer).request;
+    }
+
+    public HttpServletResponse getResponse() {
+        return ((HtmlMenuRenderer)renderer).response;
+    }
+
+    public static HtmlMenuWrapper getMenuWrapper(HttpServletRequest request, HttpServletResponse response, HttpSession session, String menuDefFile, String menuName, String menuWrapperClassName) {
+
+        HtmlMenuWrapper menuWrapper = null;
+
+        String menuSig = menuDefFile + "__" + menuName;
+        if (session != null) {
+             menuWrapper = (HtmlMenuWrapper)session.getAttribute(menuSig);
+        }
+
+        if (menuWrapper == null) {
+            try {
+                Class<?> cls = Class.forName("org.ofbiz.widget.html." + menuWrapperClassName);
+                menuWrapper = (HtmlMenuWrapper)cls.newInstance();
+                menuWrapper.init(menuDefFile, menuName, request, response);
+            } catch (InstantiationException e) {
+                throw new RuntimeException(e.getMessage());
+            } catch (IllegalAccessException e2) {
+                throw new RuntimeException(e2.getMessage());
+            } catch (ClassNotFoundException e3) {
+                throw new RuntimeException("Class not found:" + e3.getMessage());
+            } catch (IOException e4) {
+                throw new RuntimeException(e4.getMessage());
+            } catch (SAXException e5) {
+                throw new RuntimeException(e5.getMessage());
+            } catch (ParserConfigurationException e6) {
+                throw new RuntimeException(e6.getMessage());
+            }
+        } else {
+            menuWrapper.setRequest(request);
+            menuWrapper.setResponse(response);
+            Map<String, Object> parameterMap = UtilHttp.getParameterMap(request);
+            menuWrapper.setParameters(parameterMap);
+
+            GenericValue userLogin = (GenericValue)session.getAttribute("userLogin");
+            menuWrapper.putInContext("userLogin", userLogin);
+
+        }
+
+        if (session != null) {
+            session.setAttribute(menuSig, menuWrapper);
+        }
+        return menuWrapper;
+    }
+
+    public void setParameters(Map<String, Object> paramMap) {
+        context.put("parameters", paramMap);
+    }
+
+}

Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapperImage.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapperImage.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapperImage.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlMenuWrapperImage.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.util.EntityQuery;
+import org.ofbiz.widget.model.ModelMenuItem;
+import org.ofbiz.widget.renderer.MenuStringRenderer;
+import org.xml.sax.SAXException;
+
+/**
+ * Widget Library - HTML Menu Wrapper class - makes it easy to do the setup and render of a menu
+ */
+public class HtmlMenuWrapperImage extends HtmlMenuWrapper {
+
+    public static final String module = HtmlMenuWrapperImage.class.getName();
+
+    protected HtmlMenuWrapperImage() {}
+
+    public HtmlMenuWrapperImage(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, SAXException, ParserConfigurationException {
+        super(resourceName, menuName, request, response);
+    }
+
+    @Override
+    public MenuStringRenderer getMenuRenderer() {
+        return new HtmlMenuRendererImage(request, response);
+    }
+
+    @Override
+    public void init(String resourceName, String menuName, HttpServletRequest request, HttpServletResponse response)
+            throws IOException, SAXException, ParserConfigurationException {
+
+        super.init(resourceName, menuName, request, response);
+        //String pubPt = (String)request.getAttribute("pubPt");
+        //if (Debug.infoOn()) Debug.logInfo("in init, pubPt:" + pubPt, module);
+        Map<String, Object> dummyMap = new HashMap<String, Object>();
+        Delegator delegator = (Delegator)request.getAttribute("delegator");
+        //if (Debug.infoOn()) Debug.logInfo("in init, delegator:" + delegator, module);
+        try {
+            for (ModelMenuItem menuItem : modelMenu.getMenuItemList()) {
+               String contentId = menuItem.getAssociatedContentId(dummyMap);
+               //if (Debug.infoOn()) Debug.logInfo("in init, contentId:" + contentId, module);
+               GenericValue webSitePublishPoint = EntityQuery.use(delegator).from("WebSitePublishPoint").where("contentId", contentId).cache().queryOne();
+               String menuItemName = menuItem.getName();
+               //if (Debug.infoOn()) Debug.logInfo("in init, menuItemName:" + menuItemName, module);
+               //if (Debug.infoOn()) Debug.logInfo("in init, webSitePublishPoint:" + webSitePublishPoint, module);
+               putInContext(menuItemName, "WebSitePublishPoint", webSitePublishPoint);
+            }
+        } catch (GenericEntityException e) {
+            return;
+        }
+    }
+}