001
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
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 }