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