/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.taglib.ui; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.servlet.taglib.aui.ScriptData; import com.liferay.portal.kernel.theme.PortletDisplay; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.IntegerWrapper; import com.liferay.portal.kernel.util.PortalUtil; import com.liferay.portal.kernel.util.PropsKeys; import com.liferay.portal.kernel.util.PropsUtil; import com.liferay.portal.kernel.util.ServerDetector; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.kernel.util.WebKeys; import com.liferay.taglib.BaseBodyTagSupport; import com.liferay.taglib.FileAvailabilityUtil; import com.liferay.taglib.aui.ScriptTag; import com.liferay.taglib.util.PortalIncludeUtil; import com.liferay.taglib.util.TagResourceBundleUtil; import java.util.Map; import java.util.ResourceBundle; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.BodyTag; /** * @author Brian Wing Shun Chan * @author Shuyang Zhou */ public class IconMenuTag extends BaseBodyTagSupport implements BodyTag { @Override public int doAfterBody() { HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); IntegerWrapper iconCount = (IntegerWrapper)request.getAttribute( "liferay-ui:icon-menu:icon-count"); Boolean singleIcon = (Boolean)request.getAttribute( "liferay-ui:icon-menu:single-icon"); if ((iconCount != null) && (iconCount.getValue() == 1) && (singleIcon == null)) { bodyContent.clearBody(); ScriptData scriptData = (ScriptData)request.getAttribute( WebKeys.AUI_SCRIPT_DATA); if (scriptData != null) { scriptData.reset(); } request.setAttribute( "liferay-ui:icon-menu:single-icon", Boolean.TRUE); return EVAL_BODY_AGAIN; } else { return SKIP_BODY; } } @Override public int doEndTag() throws JspException { try { return processEndTag(); } catch (Exception e) { throw new JspException(e); } finally { if (!ServerDetector.isResin()) { _cssClass = null; _data = null; _direction = "left"; _endPage = null; _extended = true; _icon = null; _id = null; _localizeMessage = true; _maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS; _message = "actions"; _scroll = false; _select = false; _showArrow = true; _showExpanded = false; _showWhenSingleIcon = false; _startPage = null; _triggerCssClass = null; } } } @Override public int doStartTag() { HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); ScriptData scriptData = (ScriptData)request.getAttribute( WebKeys.AUI_SCRIPT_DATA); if (scriptData != null) { scriptData.mark(); } ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute( WebKeys.THEME_DISPLAY); if (_direction == null) { _direction = "left"; } if (Validator.isNull(_id)) { _id = (String)request.getAttribute( "liferay-ui:search-container-row:rowId"); if (Validator.isNull(_id)) { _id = PortalUtil.generateRandomKey( request, IconMenuTag.class.getName()); } _id = _id.concat("_menu"); } request.setAttribute("liferay-ui:icon-menu:id", _id); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); String namespace = portletDisplay.getNamespace(); _id = namespace.concat(_id); request.setAttribute( "liferay-ui:icon-menu:icon-count", new IntegerWrapper()); request.setAttribute( "liferay-ui:icon-menu:showWhenSingleIcon", String.valueOf(_showWhenSingleIcon)); return EVAL_BODY_BUFFERED; } public void setCssClass(String cssClass) { _cssClass = cssClass; } public void setData(Map<String, Object> data) { _data = data; } public void setDirection(String direction) { _direction = direction; } public void setDisabled(boolean disabled) { _disabled = disabled; } public void setEndPage(String endPage) { _endPage = endPage; } public void setExtended(boolean extended) { _extended = extended; } public void setIcon(String icon) { _icon = icon; } public void setId(String id) { _id = id; } public void setLocalizeMessage(boolean localizeMessage) { _localizeMessage = localizeMessage; } public void setMarkupView(String markupView) { _markupView = markupView; } public void setMaxDisplayItems(int maxDisplayItems) { if (maxDisplayItems <= 0) { maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS; } _maxDisplayItems = maxDisplayItems; } public void setMessage(String message) { if (message != null) { _message = message; } } public void setScroll(boolean scroll) { _scroll = scroll; } public void setSelect(boolean select) { _select = select; } public void setShowArrow(boolean showArrow) { _showArrow = showArrow; } public void setShowExpanded(boolean showExpanded) { _showExpanded = showExpanded; } public void setShowWhenSingleIcon(boolean showWhenSingleIcon) { _showWhenSingleIcon = showWhenSingleIcon; } public void setStartPage(String startPage) { _startPage = startPage; } public void setTriggerCssClass(String triggerCssClass) { _triggerCssClass = triggerCssClass; } public void setUseIconCaret(boolean useIconCaret) { _useIconCaret = useIconCaret; } protected String getEndPage() { if (Validator.isNotNull(_endPage)) { return _endPage; } if (Validator.isNotNull(_markupView)) { return "/html/taglib/ui/icon_menu/" + _markupView + "/end.jsp"; } return "/html/taglib/ui/icon_menu/end.jsp"; } protected String getStartPage() { if (Validator.isNotNull(_startPage)) { return _startPage; } if (Validator.isNotNull(_markupView)) { return "/html/taglib/ui/icon_menu/" + _markupView + "/start.jsp"; } return "/html/taglib/ui/icon_menu/start.jsp"; } protected int processEndTag() throws Exception { HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); IntegerWrapper iconCount = (IntegerWrapper)request.getAttribute( "liferay-ui:icon-menu:icon-count"); request.removeAttribute("liferay-ui:icon-menu:icon-count"); request.removeAttribute("liferay-ui:icon-menu:id"); Boolean singleIcon = (Boolean)request.getAttribute( "liferay-ui:icon-menu:single-icon"); request.removeAttribute("liferay-ui:icon-menu:single-icon"); JspWriter jspWriter = pageContext.getOut(); if ((iconCount != null) && (iconCount.getValue() >= 1) && ((singleIcon == null) || _showWhenSingleIcon)) { if (!FileAvailabilityUtil.isAvailable( (ServletContext)request.getAttribute(WebKeys.CTX), getStartPage())) { if (_showExpanded) { jspWriter.write("<ul class=\"lfr-menu-expanded "); jspWriter.write("lfr-menu-list"); if (Validator.isNotNull(_cssClass)) { jspWriter.write(StringPool.SPACE); jspWriter.write(_cssClass); } jspWriter.write("\" id=\""); jspWriter.write(_id); jspWriter.write("\">"); } else { jspWriter.write("<div class=\"btn-group lfr-icon-menu"); if (Validator.isNotNull(_cssClass)) { jspWriter.write(StringPool.SPACE); jspWriter.write(_cssClass); } if (_direction.equals("up")) { jspWriter.write(" dropup"); } jspWriter.write("\"><a class=\"dropdown-toggle direction-"); jspWriter.write(_direction); jspWriter.write(" max-display-items-"); jspWriter.write(String.valueOf(_maxDisplayItems)); if (_disabled) { jspWriter.write(" disabled"); } if (_extended) { jspWriter.write(" btn btn-default"); } if (_select) { jspWriter.write(" select"); } if (Validator.isNotNull(_triggerCssClass)) { jspWriter.write(StringPool.SPACE + _triggerCssClass); } String message = _message; ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle(pageContext); if (_localizeMessage) { message = LanguageUtil.get(resourceBundle, _message); } jspWriter.write("\" href=\"javascript:;\" id=\""); jspWriter.write(_id); jspWriter.write("\" title=\""); jspWriter.write(message); jspWriter.write("\">"); if (_showArrow && _direction.equals("left")) { String caret = "caret"; if (_useIconCaret) { caret = "icon-caret-left"; } jspWriter.write("<i class=\"lfr-icon-menu-arrow "); jspWriter.write(caret); jspWriter.write("\"></i> "); } boolean auiImage = false; if (Validator.isNotNull(_icon)) { auiImage = _icon.startsWith(_AUI_PATH); if (auiImage) { jspWriter.write(" <i class=\"icon-"); jspWriter.write( _icon.substring(_AUI_PATH.length())); jspWriter.write(" lfr-icon-menu-icon"); jspWriter.write("\"></i> "); } else { jspWriter.write( "<img alt=\"\" class=\"lfr-icon-menu-icon\" "); jspWriter.write("src=\""); jspWriter.write(_icon); jspWriter.write("\" /> "); } } if (Validator.isNotNull(message)) { jspWriter.write("<span class=\"lfr-icon-menu-text\">"); jspWriter.write(message); jspWriter.write("</span>"); } if (_showArrow && !_direction.equals("left")) { String caret = "caret"; if (_useIconCaret) { caret = "icon-caret-" + _direction; } jspWriter.write(" <i class=\"lfr-icon-menu-arrow "); jspWriter.write(caret); jspWriter.write("\"></i> "); } jspWriter.write("</a>"); ScriptTag.doTag( null, null, "liferay-menu", "Liferay.Menu.register('" + _id + "');", bodyContent, pageContext); jspWriter.write("<ul class=\"dropdown-menu lfr-menu-list"); jspWriter.write(" direction-"); jspWriter.write(_direction); jspWriter.write("\">"); } } else { setAttributes(); PortalIncludeUtil.include(pageContext, getStartPage()); } } writeBodyContent(jspWriter); if ((iconCount != null) && (iconCount.getValue() >= 1) && ((singleIcon == null) || _showWhenSingleIcon)) { if (!FileAvailabilityUtil.isAvailable( (ServletContext)request.getAttribute(WebKeys.CTX), getEndPage())) { jspWriter.write("</ul>"); if (_showExpanded) { ScriptTag.doTag( null, null, "liferay-menu", "Liferay.Menu.handleFocus('#" + _id + "menu');", bodyContent, pageContext); } else { jspWriter.write("</div>"); } } else { PortalIncludeUtil.include(pageContext, getEndPage()); } } request.removeAttribute("liferay-ui:icon-menu:showWhenSingleIcon"); return EVAL_PAGE; } protected void setAttributes() { HttpServletRequest request = (HttpServletRequest)pageContext.getRequest(); request.setAttribute("liferay-ui:icon-menu:cssClass", _cssClass); request.setAttribute("liferay-ui:icon-menu:data", _data); request.setAttribute("liferay-ui:icon-menu:direction", _direction); request.setAttribute("liferay-ui:icon-menu:icon", _icon); request.setAttribute("liferay-ui:icon-menu:id", _id); String message = _message; ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle( pageContext); if (_localizeMessage) { message = LanguageUtil.get(resourceBundle, _message); } request.setAttribute("liferay-ui:icon-menu:message", message); request.setAttribute("liferay-ui:icon-menu:scroll", _scroll); request.setAttribute( "liferay-ui:icon-menu:triggerCssClass", _triggerCssClass); } private static final String _AUI_PATH = "../aui/"; private static final int _DEFAULT_MAX_DISPLAY_ITEMS = GetterUtil.getInteger( PropsUtil.get(PropsKeys.MENU_MAX_DISPLAY_ITEMS)); private String _cssClass; private Map<String, Object> _data; private String _direction = "left"; private boolean _disabled; private String _endPage; private boolean _extended = true; private String _icon; private String _id; private boolean _localizeMessage = true; private String _markupView; private int _maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS; private String _message = "actions"; private boolean _scroll; private boolean _select; private boolean _showArrow = true; private boolean _showExpanded; private boolean _showWhenSingleIcon; private String _startPage; private String _triggerCssClass; private boolean _useIconCaret; }