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