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