001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.taglib.ui;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.servlet.taglib.aui.ScriptData;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.IntegerWrapper;
021    import com.liferay.portal.kernel.util.PropsKeys;
022    import com.liferay.portal.kernel.util.PropsUtil;
023    import com.liferay.portal.kernel.util.ServerDetector;
024    import com.liferay.portal.kernel.util.StringPool;
025    import com.liferay.portal.kernel.util.Validator;
026    import com.liferay.portal.kernel.util.WebKeys;
027    import com.liferay.portal.theme.PortletDisplay;
028    import com.liferay.portal.theme.ThemeDisplay;
029    import com.liferay.portal.util.PortalUtil;
030    import com.liferay.taglib.BaseBodyTagSupport;
031    import com.liferay.taglib.FileAvailabilityUtil;
032    import com.liferay.taglib.aui.ScriptTag;
033    import com.liferay.taglib.util.PortalIncludeUtil;
034    
035    import javax.servlet.ServletContext;
036    import javax.servlet.http.HttpServletRequest;
037    import javax.servlet.jsp.JspException;
038    import javax.servlet.jsp.JspWriter;
039    import javax.servlet.jsp.tagext.BodyTag;
040    
041    /**
042     * @author Brian Wing Shun Chan
043     * @author Shuyang Zhou
044     */
045    public class IconMenuTag extends BaseBodyTagSupport implements BodyTag {
046    
047            @Override
048            public int doAfterBody() {
049                    HttpServletRequest request =
050                            (HttpServletRequest)pageContext.getRequest();
051    
052                    IntegerWrapper iconCount = (IntegerWrapper)request.getAttribute(
053                            "liferay-ui:icon-menu:icon-count");
054    
055                    Boolean singleIcon = (Boolean)request.getAttribute(
056                            "liferay-ui:icon-menu:single-icon");
057    
058                    if ((iconCount != null) && (iconCount.getValue() == 1) &&
059                            (singleIcon == null)) {
060    
061                            bodyContent.clearBody();
062    
063                            ScriptData scriptData = (ScriptData)request.getAttribute(
064                                    WebKeys.AUI_SCRIPT_DATA);
065    
066                            if (scriptData != null) {
067                                    scriptData.reset();
068                            }
069    
070                            request.setAttribute(
071                                    "liferay-ui:icon-menu:single-icon", Boolean.TRUE);
072    
073                            return EVAL_BODY_AGAIN;
074                    }
075                    else {
076                            return SKIP_BODY;
077                    }
078            }
079    
080            @Override
081            public int doEndTag() throws JspException {
082                    try {
083                            return processEndTag();
084                    }
085                    catch (Exception e) {
086                            throw new JspException(e);
087                    }
088                    finally {
089                            if (!ServerDetector.isResin()) {
090                                    _cssClass = null;
091                                    _direction = "left";
092                                    _endPage = null;
093                                    _extended = true;
094                                    _icon = null;
095                                    _id = null;
096                                    _localizeMessage = true;
097                                    _maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS;
098                                    _message = "actions";
099                                    _scroll = false;
100                                    _select = false;
101                                    _showArrow = true;
102                                    _showExpanded = false;
103                                    _showWhenSingleIcon = false;
104                                    _startPage = null;
105                                    _triggerCssClass = null;
106                            }
107                    }
108            }
109    
110            @Override
111            public int doStartTag() {
112                    HttpServletRequest request =
113                            (HttpServletRequest)pageContext.getRequest();
114    
115                    ScriptData scriptData = (ScriptData)request.getAttribute(
116                            WebKeys.AUI_SCRIPT_DATA);
117    
118                    if (scriptData != null) {
119                            scriptData.mark();
120                    }
121    
122                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
123                            WebKeys.THEME_DISPLAY);
124    
125                    if (_direction == null) {
126                            _direction = "left";
127                    }
128    
129                    if (Validator.isNull(_id)) {
130                            _id = (String)request.getAttribute(
131                                    "liferay-ui:search-container-row:rowId");
132    
133                            if (Validator.isNull(_id)) {
134                                    _id = PortalUtil.generateRandomKey(
135                                            request, IconMenuTag.class.getName());
136                            }
137    
138                            _id = _id.concat("_menu");
139                    }
140    
141                    request.setAttribute("liferay-ui:icon-menu:id", _id);
142    
143                    PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
144    
145                    String namespace = portletDisplay.getNamespace();
146    
147                    _id = namespace.concat(_id);
148    
149                    request.setAttribute(
150                            "liferay-ui:icon-menu:icon-count", new IntegerWrapper());
151                    request.setAttribute(
152                            "liferay-ui:icon-menu:showWhenSingleIcon",
153                            String.valueOf(_showWhenSingleIcon));
154    
155                    return EVAL_BODY_BUFFERED;
156            }
157    
158            public void setCssClass(String cssClass) {
159                    _cssClass = cssClass;
160            }
161    
162            public void setDirection(String direction) {
163                    _direction = direction;
164            }
165    
166            public void setDisabled(boolean disabled) {
167                    _disabled = disabled;
168            }
169    
170            public void setEndPage(String endPage) {
171                    _endPage = endPage;
172            }
173    
174            public void setExtended(boolean extended) {
175                    _extended = extended;
176            }
177    
178            public void setIcon(String icon) {
179                    _icon = icon;
180            }
181    
182            public void setId(String id) {
183                    _id = id;
184            }
185    
186            public void setLocalizeMessage(boolean localizeMessage) {
187                    _localizeMessage = localizeMessage;
188            }
189    
190            public void setMarkupView(String markupView) {
191                    _markupView = markupView;
192            }
193    
194            public void setMaxDisplayItems(int maxDisplayItems) {
195                    if (maxDisplayItems <= 0) {
196                            maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS;
197                    }
198    
199                    _maxDisplayItems = maxDisplayItems;
200            }
201    
202            public void setMessage(String message) {
203                    if (message != null) {
204                            _message = message;
205                    }
206            }
207    
208            public void setScroll(boolean scroll) {
209                    _scroll = scroll;
210            }
211    
212            public void setSelect(boolean select) {
213                    _select = select;
214            }
215    
216            public void setShowArrow(boolean showArrow) {
217                    _showArrow = showArrow;
218            }
219    
220            public void setShowExpanded(boolean showExpanded) {
221                    _showExpanded = showExpanded;
222            }
223    
224            public void setShowWhenSingleIcon(boolean showWhenSingleIcon) {
225                    _showWhenSingleIcon = showWhenSingleIcon;
226            }
227    
228            public void setStartPage(String startPage) {
229                    _startPage = startPage;
230            }
231    
232            public void setTriggerCssClass(String triggerCssClass) {
233                    _triggerCssClass = triggerCssClass;
234            }
235    
236            public void setUseIconCaret(boolean useIconCaret) {
237                    _useIconCaret = useIconCaret;
238            }
239    
240            protected String getEndPage() {
241                    if (Validator.isNotNull(_endPage)) {
242                            return _endPage;
243                    }
244    
245                    if (Validator.isNotNull(_markupView)) {
246                            return "/html/taglib/ui/icon_menu/" + _markupView + "/end.jsp";
247                    }
248    
249                    return "/html/taglib/ui/icon_menu/end.jsp";
250            }
251    
252            protected String getStartPage() {
253                    if (Validator.isNotNull(_startPage)) {
254                            return _startPage;
255                    }
256    
257                    if (Validator.isNotNull(_markupView)) {
258                            return "/html/taglib/ui/icon_menu/" + _markupView + "/start.jsp";
259                    }
260    
261                    return "/html/taglib/ui/icon_menu/start.jsp";
262            }
263    
264            protected int processEndTag() throws Exception {
265                    HttpServletRequest request =
266                            (HttpServletRequest)pageContext.getRequest();
267    
268                    IntegerWrapper iconCount = (IntegerWrapper)request.getAttribute(
269                            "liferay-ui:icon-menu:icon-count");
270    
271                    request.removeAttribute("liferay-ui:icon-menu:icon-count");
272                    request.removeAttribute("liferay-ui:icon-menu:id");
273    
274                    Boolean singleIcon = (Boolean)request.getAttribute(
275                            "liferay-ui:icon-menu:single-icon");
276    
277                    request.removeAttribute("liferay-ui:icon-menu:single-icon");
278    
279                    JspWriter jspWriter = pageContext.getOut();
280    
281                    if ((iconCount != null) && (iconCount.getValue() >= 1) &&
282                            ((singleIcon == null) || _showWhenSingleIcon)) {
283    
284                            if (!FileAvailabilityUtil.isAvailable(
285                                            (ServletContext)request.getAttribute(WebKeys.CTX),
286                                            getStartPage())) {
287    
288                                    if (_showExpanded) {
289                                            jspWriter.write("<ul class=\"lfr-menu-expanded ");
290                                            jspWriter.write("lfr-menu-list");
291    
292                                            if (Validator.isNotNull(_cssClass)) {
293                                                    jspWriter.write(StringPool.SPACE);
294                                                    jspWriter.write(_cssClass);
295                                            }
296    
297                                            jspWriter.write("\" id=\"");
298                                            jspWriter.write(_id);
299                                            jspWriter.write("\">");
300                                    }
301                                    else {
302                                            jspWriter.write("<div class=\"btn-group lfr-icon-menu");
303    
304                                            if (Validator.isNotNull(_cssClass)) {
305                                                    jspWriter.write(StringPool.SPACE);
306                                                    jspWriter.write(_cssClass);
307                                            }
308    
309                                            if (_direction.equals("up")) {
310                                                    jspWriter.write(" dropup");
311                                            }
312    
313                                            jspWriter.write("\"><a class=\"dropdown-toggle direction-");
314                                            jspWriter.write(_direction);
315                                            jspWriter.write(" max-display-items-");
316                                            jspWriter.write(String.valueOf(_maxDisplayItems));
317    
318                                            if (_disabled) {
319                                                    jspWriter.write(" disabled");
320                                            }
321    
322                                            if (_extended) {
323                                                    jspWriter.write(" btn btn-default");
324                                            }
325    
326                                            if (_select) {
327                                                    jspWriter.write(" select");
328                                            }
329    
330                                            if (Validator.isNotNull(_triggerCssClass)) {
331                                                    jspWriter.write(StringPool.SPACE + _triggerCssClass);
332                                            }
333    
334                                            String message = _message;
335    
336                                            if (_localizeMessage) {
337                                                    message = LanguageUtil.get(request, _message);
338                                            }
339    
340                                            jspWriter.write("\" href=\"javascript:;\" id=\"");
341                                            jspWriter.write(_id);
342                                            jspWriter.write("\" title=\"");
343                                            jspWriter.write(message);
344                                            jspWriter.write("\">");
345    
346                                            if (_showArrow && _direction.equals("left")) {
347                                                    String caret = "caret";
348    
349                                                    if (_useIconCaret) {
350                                                            caret = "icon-caret-left";
351                                                    }
352    
353                                                    jspWriter.write("<i class=\"lfr-icon-menu-arrow ");
354                                                    jspWriter.write(caret);
355                                                    jspWriter.write("\"></i> ");
356                                            }
357    
358                                            boolean auiImage = false;
359    
360                                            if (Validator.isNotNull(_icon)) {
361                                                    auiImage = _icon.startsWith(_AUI_PATH);
362    
363                                                    if (auiImage) {
364                                                            jspWriter.write(" <i class=\"icon-");
365                                                            jspWriter.write(
366                                                                    _icon.substring(_AUI_PATH.length()));
367                                                            jspWriter.write(" lfr-icon-menu-icon");
368                                                            jspWriter.write("\"></i> ");
369                                                    }
370                                                    else {
371                                                            jspWriter.write(
372                                                                    "<img alt=\"\" class=\"lfr-icon-menu-icon\" ");
373                                                            jspWriter.write("src=\"");
374                                                            jspWriter.write(_icon);
375                                                            jspWriter.write("\" /> ");
376                                                    }
377                                            }
378    
379                                            if (Validator.isNotNull(message)) {
380                                                    jspWriter.write("<span class=\"lfr-icon-menu-text\">");
381                                                    jspWriter.write(message);
382                                                    jspWriter.write("</span>");
383                                            }
384    
385                                            if (_showArrow && !_direction.equals("left")) {
386                                                    String caret = "caret";
387    
388                                                    if (_useIconCaret) {
389                                                            caret = "icon-caret-" + _direction;
390                                                    }
391    
392                                                    jspWriter.write(" <i class=\"lfr-icon-menu-arrow ");
393                                                    jspWriter.write(caret);
394                                                    jspWriter.write("\"></i> ");
395                                            }
396    
397                                            jspWriter.write("</a>");
398    
399                                            ScriptTag.doTag(
400                                                    null, null, "liferay-menu",
401                                                    "Liferay.Menu.register('" + _id + "');", bodyContent,
402                                                    pageContext);
403    
404                                            jspWriter.write("<ul class=\"dropdown-menu lfr-menu-list");
405                                            jspWriter.write(" direction-");
406                                            jspWriter.write(_direction);
407                                            jspWriter.write("\">");
408                                    }
409                            }
410                            else {
411                                    setAttributes();
412    
413                                    PortalIncludeUtil.include(pageContext, getStartPage());
414                            }
415                    }
416    
417                    writeBodyContent(jspWriter);
418    
419                    if ((iconCount != null) && (iconCount.getValue() >= 1) &&
420                            ((singleIcon == null) || _showWhenSingleIcon)) {
421    
422                            if (!FileAvailabilityUtil.isAvailable(
423                                            (ServletContext)request.getAttribute(WebKeys.CTX),
424                                            getEndPage())) {
425    
426                                    jspWriter.write("</ul>");
427    
428                                    if (_showExpanded) {
429                                            ScriptTag.doTag(
430                                                    null, null, "liferay-menu",
431                                                    "Liferay.Menu.handleFocus('#" + _id + "menu');",
432                                                    bodyContent, pageContext);
433                                    }
434                                    else {
435                                            jspWriter.write("</div>");
436                                    }
437                            }
438                            else {
439                                    PortalIncludeUtil.include(pageContext, getEndPage());
440                            }
441                    }
442    
443                    request.removeAttribute("liferay-ui:icon-menu:showWhenSingleIcon");
444    
445                    return EVAL_PAGE;
446            }
447    
448            protected void setAttributes() {
449                    HttpServletRequest request =
450                            (HttpServletRequest)pageContext.getRequest();
451    
452                    request.setAttribute("liferay-ui:icon-menu:cssClass", _cssClass);
453                    request.setAttribute("liferay-ui:icon-menu:direction", _direction);
454                    request.setAttribute("liferay-ui:icon-menu:icon", _icon);
455    
456                    String message = _message;
457    
458                    if (_localizeMessage) {
459                            message = LanguageUtil.get(request, _message);
460                    }
461    
462                    request.setAttribute("liferay-ui:icon-menu:message", message);
463                    request.setAttribute("liferay-ui:icon-menu:scroll", _scroll);
464                    request.setAttribute(
465                            "liferay-ui:icon-menu:triggerCssClass", _triggerCssClass);
466            }
467    
468            private static final String _AUI_PATH = "../aui/";
469    
470            private static final int _DEFAULT_MAX_DISPLAY_ITEMS = GetterUtil.getInteger(
471                    PropsUtil.get(PropsKeys.MENU_MAX_DISPLAY_ITEMS));
472    
473            private String _cssClass;
474            private String _direction = "left";
475            private boolean _disabled;
476            private String _endPage;
477            private boolean _extended = true;
478            private String _icon;
479            private String _id;
480            private boolean _localizeMessage = true;
481            private String _markupView;
482            private int _maxDisplayItems = _DEFAULT_MAX_DISPLAY_ITEMS;
483            private String _message = "actions";
484            private boolean _scroll;
485            private boolean _select;
486            private boolean _showArrow = true;
487            private boolean _showExpanded;
488            private boolean _showWhenSingleIcon;
489            private String _startPage;
490            private String _triggerCssClass;
491            private boolean _useIconCaret;
492    
493    }