001
014
015 package com.liferay.taglib.ui;
016
017 import com.liferay.portal.kernel.language.LanguageUtil;
018 import com.liferay.portal.kernel.language.UnicodeLanguageUtil;
019 import com.liferay.portal.kernel.servlet.BrowserSnifferUtil;
020 import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
021 import com.liferay.portal.kernel.util.GetterUtil;
022 import com.liferay.portal.kernel.util.HtmlUtil;
023 import com.liferay.portal.kernel.util.Http;
024 import com.liferay.portal.kernel.util.IntegerWrapper;
025 import com.liferay.portal.kernel.util.JavaConstants;
026 import com.liferay.portal.kernel.util.StringBundler;
027 import com.liferay.portal.kernel.util.StringPool;
028 import com.liferay.portal.kernel.util.StringUtil;
029 import com.liferay.portal.kernel.util.Validator;
030 import com.liferay.portal.kernel.util.WebKeys;
031 import com.liferay.portal.model.Portlet;
032 import com.liferay.portal.model.PortletApp;
033 import com.liferay.portal.model.SpriteImage;
034 import com.liferay.portal.model.Theme;
035 import com.liferay.portal.theme.ThemeDisplay;
036 import com.liferay.portal.util.PortalUtil;
037 import com.liferay.taglib.util.IncludeTag;
038 import com.liferay.taglib.util.TagResourceBundleUtil;
039
040 import java.net.MalformedURLException;
041 import java.net.URL;
042
043 import java.util.HashMap;
044 import java.util.Map;
045 import java.util.ResourceBundle;
046
047 import javax.portlet.PortletResponse;
048
049 import javax.servlet.http.HttpServletRequest;
050
051
054 public class IconTag extends IncludeTag {
055
056 @Override
057 public int doStartTag() {
058 return EVAL_BODY_INCLUDE;
059 }
060
061 public String getCssClass() {
062 return _cssClass;
063 }
064
065 public void setAlt(String alt) {
066 _alt = alt;
067 }
068
069 public void setAriaRole(String ariaRole) {
070 _ariaRole = ariaRole;
071 }
072
073 public void setCssClass(String cssClass) {
074 _cssClass = cssClass;
075 }
076
077 public void setData(Map<String, Object> data) {
078 _data = data;
079 }
080
081 public void setIcon(String icon) {
082 _icon = icon;
083 }
084
085 public void setIconCssClass(String iconCssClass) {
086 _iconCssClass = iconCssClass;
087 }
088
089 public void setId(String id) {
090 _id = id;
091 }
092
093 public void setImage(String image) {
094 _image = image;
095 }
096
097 public void setImageHover(String imageHover) {
098 _imageHover = imageHover;
099 }
100
101 public void setLabel(boolean label) {
102 _label = label;
103 }
104
105 public void setLang(String lang) {
106 _lang = lang;
107 }
108
109 public void setLinkCssClass(String linkCssClass) {
110 _linkCssClass = linkCssClass;
111 }
112
113 public void setLocalizeMessage(boolean localizeMessage) {
114 _localizeMessage = localizeMessage;
115 }
116
117 public void setMarkupView(String markupView) {
118 _markupView = markupView;
119 }
120
121 public void setMessage(String message) {
122 _message = message;
123 }
124
125 public void setMethod(String method) {
126 _method = method;
127 }
128
129 public void setOnClick(String onClick) {
130 _onClick = onClick;
131 }
132
133 public void setSrc(String src) {
134 _src = src;
135 }
136
137 public void setSrcHover(String srcHover) {
138 _srcHover = srcHover;
139 }
140
141 public void setTarget(String target) {
142 _target = target;
143 }
144
145 public void setToolTip(boolean toolTip) {
146 _toolTip = toolTip;
147 }
148
149 public void setUrl(String url) {
150 _url = url;
151 }
152
153 public void setUseDialog(boolean useDialog) {
154 _useDialog = useDialog;
155 }
156
157 @Override
158 protected void cleanUp() {
159 _alt = null;
160 _ariaRole = null;
161 _cssClass = null;
162 _data = null;
163 _icon = null;
164 _iconCssClass = null;
165 _id = null;
166 _image = null;
167 _imageHover = null;
168 _label = null;
169 _lang = null;
170 _linkCssClass = null;
171 _localizeMessage = true;
172 _markupView = null;
173 _message = null;
174 _method = null;
175 _onClick = null;
176 _src = null;
177 _srcHover = null;
178 _target = null;
179 _toolTip = false;
180 _url = null;
181 _useDialog = false;
182 }
183
184 protected Map<String, Object> getData() {
185 Map<String, Object> data = null;
186
187 if (_data != null) {
188 data = new HashMap<>(_data);
189 }
190 else {
191 data = new HashMap<>(1);
192 }
193
194 if (_useDialog && Validator.isNull(data.get("title"))) {
195 String message = getProcessedMessage();
196
197 ResourceBundle resourceBundle =
198 TagResourceBundleUtil.getResourceBundle(pageContext);
199
200 if (_localizeMessage) {
201 message = LanguageUtil.get(resourceBundle, message);
202 }
203
204 data.put("title", HtmlUtil.stripHtml(message));
205 }
206
207 return data;
208 }
209
210 protected String getDetails() {
211 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
212 WebKeys.THEME_DISPLAY);
213
214 ResourceBundle resourceBundle = TagResourceBundleUtil.getResourceBundle(
215 pageContext);
216
217 String details = null;
218
219 if (_alt != null) {
220 details = " alt=\"" + LanguageUtil.get(resourceBundle, _alt) + "\"";
221 }
222 else if (isLabel()) {
223 details = " alt=\"\"";
224 }
225 else {
226 StringBundler sb = new StringBundler(6);
227
228 sb.append(" alt=\"");
229 sb.append(LanguageUtil.get(resourceBundle, getProcessedMessage()));
230 sb.append("\"");
231
232 if (_toolTip) {
233 sb.append(" onmouseover=\"Liferay.Portal.ToolTip.show(this, '");
234 sb.append(
235 UnicodeLanguageUtil.get(
236 resourceBundle, getProcessedMessage()));
237 sb.append("')\"");
238 }
239 else {
240 sb.append(" title=\"");
241 sb.append(
242 LanguageUtil.get(resourceBundle, getProcessedMessage()));
243 sb.append("\"");
244 }
245
246 details = sb.toString();
247 }
248
249 if (Validator.isNull(_src) || !themeDisplay.isThemeImagesFastLoad() ||
250 isAUIImage()) {
251
252 return details;
253 }
254
255 SpriteImage spriteImage = null;
256 String spriteFileName = null;
257 String spriteFileURL = null;
258
259 String imageFileName = StringUtil.replace(_src, "common/../", "");
260
261 if (imageFileName.contains(Http.PROTOCOL_DELIMITER)) {
262 String portalURL = PortalUtil.getPortalURL(request);
263
264 if (imageFileName.startsWith(portalURL)) {
265 imageFileName = imageFileName.substring(portalURL.length());
266 }
267 else {
268 URL imageURL = null;
269
270 try {
271 imageURL = new URL(imageFileName);
272
273 imageFileName = imageURL.getPath();
274 }
275 catch (MalformedURLException e) {
276 }
277 }
278 }
279
280 Theme theme = themeDisplay.getTheme();
281
282 String contextPath = theme.getContextPath();
283
284 String imagesPath = contextPath.concat(theme.getImagesPath());
285
286 if (imageFileName.startsWith(imagesPath)) {
287 spriteImage = theme.getSpriteImage(imageFileName);
288
289 if (spriteImage != null) {
290 spriteFileName = spriteImage.getSpriteFileName();
291
292 if (BrowserSnifferUtil.isIe(request) &&
293 (BrowserSnifferUtil.getMajorVersion(request) < 7)) {
294
295 spriteFileName = StringUtil.replace(
296 spriteFileName, ".png", ".gif");
297 }
298
299 String cdnBaseURL = themeDisplay.getCDNBaseURL();
300
301 spriteFileURL = cdnBaseURL.concat(spriteFileName);
302 }
303 }
304
305 if (spriteImage == null) {
306 Portlet portlet = (Portlet)request.getAttribute(
307 "liferay-portlet:icon_portlet:portlet");
308
309 if (portlet == null) {
310 portlet = (Portlet)request.getAttribute(WebKeys.RENDER_PORTLET);
311 }
312
313 if (portlet != null) {
314 PortletApp portletApp = portlet.getPortletApp();
315
316 spriteImage = portletApp.getSpriteImage(imageFileName);
317
318 if (spriteImage != null) {
319 spriteFileName = spriteImage.getSpriteFileName();
320
321 if (BrowserSnifferUtil.isIe(request) &&
322 (BrowserSnifferUtil.getMajorVersion(request) < 7)) {
323
324 spriteFileName = StringUtil.replace(
325 spriteFileName, ".png", ".gif");
326 }
327
328 String cdnBaseURL = themeDisplay.getCDNBaseURL();
329
330 spriteFileURL = cdnBaseURL.concat(spriteFileName);
331 }
332 }
333 }
334
335 if (spriteImage != null) {
336 String themeImagesPath = themeDisplay.getPathThemeImages();
337
338 _src = themeImagesPath.concat("/spacer.png");
339
340 StringBundler sb = new StringBundler(10);
341
342 sb.append(details);
343 sb.append(" style=\"background-image: url('");
344 sb.append(spriteFileURL);
345 sb.append("'); background-position: 50% -");
346 sb.append(spriteImage.getOffset());
347 sb.append("px; background-repeat: no-repeat; height: ");
348 sb.append(spriteImage.getHeight());
349 sb.append("px; width: ");
350 sb.append(spriteImage.getWidth());
351 sb.append("px;\"");
352
353 details = sb.toString();
354 }
355
356 return details;
357 }
358
359 protected String getId() {
360 if (Validator.isNotNull(_id)) {
361 return _id;
362 }
363
364 String id = (String)request.getAttribute("liferay-ui:icon-menu:id");
365
366 String message = _message;
367
368 if (Validator.isNull(message)) {
369 message = _image;
370 }
371
372 if (Validator.isNotNull(id) && Validator.isNotNull(message)) {
373 id = id.concat(StringPool.UNDERLINE).concat(
374 FriendlyURLNormalizerUtil.normalize(message));
375
376 PortletResponse portletResponse =
377 (PortletResponse)request.getAttribute(
378 JavaConstants.JAVAX_PORTLET_RESPONSE);
379
380 String namespace = StringPool.BLANK;
381
382 if (portletResponse != null) {
383 namespace = portletResponse.getNamespace();
384 }
385
386 id = PortalUtil.getUniqueElementId(
387 getOriginalServletRequest(), namespace, id);
388 }
389 else {
390 id = PortalUtil.generateRandomKey(request, IconTag.class.getName());
391 }
392
393 return id;
394 }
395
396 protected String getImage() {
397 return _image;
398 }
399
400 protected String getMessage() {
401 return _message;
402 }
403
404 protected String getMethod() {
405 if (Validator.isNotNull(_method)) {
406 return _method;
407 }
408
409 String url = getUrl();
410
411 if (url.contains("p_p_lifecycle=0")) {
412 return "get";
413 }
414
415 return "post";
416 }
417
418 protected String getOnClick() {
419 String onClick = StringPool.BLANK;
420
421 if (Validator.isNotNull(_onClick)) {
422 onClick = _onClick;
423
424 if (!onClick.endsWith(StringPool.SEMICOLON)) {
425 onClick = onClick + StringPool.SEMICOLON;
426 }
427 }
428
429 if (isForcePost()) {
430 StringBundler sb = new StringBundler(5);
431
432 sb.append("event.preventDefault();");
433 sb.append(onClick);
434 sb.append("submitForm(document.hrefFm, '");
435 sb.append(getUrl());
436 sb.append("')");
437
438 onClick = sb.toString();
439 }
440
441 return onClick;
442 }
443
444 @Override
445 protected String getPage() {
446 return "/html/taglib/ui/icon/page.jsp";
447 }
448
449 protected String getProcessedMessage() {
450 if (_message != null) {
451 return _message;
452 }
453
454 return StringUtil.replace(
455 _image, new String[] {StringPool.UNDERLINE, _AUI_PATH},
456 new String[] {StringPool.DASH, StringPool.BLANK});
457 }
458
459 protected String getProcessedUrl() {
460 if (isForcePost()) {
461 return "javascript:;";
462 }
463
464 return _url;
465 }
466
467 protected String getSrc() {
468 if (Validator.isNotNull(_src)) {
469 return _src;
470 }
471
472 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
473 WebKeys.THEME_DISPLAY);
474
475 if (isAUIImage()) {
476 return themeDisplay.getPathThemeImages().concat("/spacer.png");
477 }
478 else if (Validator.isNotNull(_image)) {
479 StringBundler sb = new StringBundler(4);
480
481 sb.append(themeDisplay.getPathThemeImages());
482 sb.append("/common/");
483 sb.append(_image);
484 sb.append(".png");
485
486 return StringUtil.replace(sb.toString(), "common/../", "");
487 }
488
489 return StringPool.BLANK;
490 }
491
492 protected String getSrcHover() {
493 if (Validator.isNotNull(_srcHover) || Validator.isNull(_imageHover)) {
494 return _srcHover;
495 }
496
497 StringBundler sb = new StringBundler(4);
498
499 ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
500 WebKeys.THEME_DISPLAY);
501
502 sb.append(themeDisplay.getPathThemeImages());
503
504 sb.append("/common/");
505 sb.append(_imageHover);
506 sb.append(".png");
507
508 return sb.toString();
509 }
510
511 protected String getUrl() {
512 return GetterUtil.getString(_url);
513 }
514
515 protected boolean isAUIImage() {
516 if ((_image != null) && _image.startsWith(_AUI_PATH)) {
517 return true;
518 }
519
520 return false;
521 }
522
523 @Override
524 protected boolean isCleanUpSetAttributes() {
525 return _CLEAN_UP_SET_ATTRIBUTES;
526 }
527
528 protected boolean isForcePost() {
529 String method = getMethod();
530
531 if (method.equals("post")) {
532 String url = getUrl();
533
534 if (url.startsWith(Http.HTTP_WITH_SLASH) ||
535 url.startsWith(Http.HTTPS_WITH_SLASH)) {
536
537 return true;
538 }
539 }
540
541 return false;
542 }
543
544 protected boolean isLabel() {
545 if (_label != null) {
546 return _label;
547 }
548
549 IntegerWrapper iconListIconCount = (IntegerWrapper)request.getAttribute(
550 "liferay-ui:icon-list:icon-count");
551
552 Boolean iconListSingleIcon = (Boolean)request.getAttribute(
553 "liferay-ui:icon-list:single-icon");
554
555 if ((iconListIconCount != null) || (iconListSingleIcon != null)) {
556 _label = true;
557
558 return _label;
559 }
560
561 IntegerWrapper iconMenuIconCount = (IntegerWrapper)request.getAttribute(
562 "liferay-ui:icon-menu:icon-count");
563
564 Boolean iconMenuSingleIcon = (Boolean)request.getAttribute(
565 "liferay-ui:icon-menu:single-icon");
566
567 if ((iconMenuIconCount != null) || (iconMenuSingleIcon != null)) {
568 _label = true;
569
570 return _label;
571 }
572
573 _label = false;
574
575 return _label;
576 }
577
578 @Override
579 protected void setAttributes(HttpServletRequest request) {
580 request.setAttribute("liferay-ui:icon:alt", _alt);
581 request.setAttribute("liferay-ui:icon:ariaRole", _ariaRole);
582 request.setAttribute(
583 "liferay-ui:icon:auiImage", String.valueOf(isAUIImage()));
584 request.setAttribute("liferay-ui:icon:cssClass", _cssClass);
585 request.setAttribute("liferay-ui:icon:data", getData());
586 request.setAttribute("liferay-ui:icon:details", getDetails());
587 request.setAttribute("liferay-ui:icon:icon", _icon);
588 request.setAttribute("liferay-ui:icon:iconCssClass", _iconCssClass);
589 request.setAttribute("liferay-ui:icon:id", getId());
590 request.setAttribute("liferay-ui:icon:image", _image);
591 request.setAttribute("liferay-ui:icon:imageHover", _imageHover);
592 request.setAttribute(
593 "liferay-ui:icon:forcePost", String.valueOf(isForcePost()));
594 request.setAttribute(
595 "liferay-ui:icon:label", String.valueOf(isLabel()));
596 request.setAttribute("liferay-ui:icon:lang", _lang);
597 request.setAttribute("liferay-ui:icon:linkCssClass", _linkCssClass);
598 request.setAttribute(
599 "liferay-ui:icon:localizeMessage",
600 String.valueOf(_localizeMessage));
601 request.setAttribute("liferay-ui:icon:markupView", _markupView);
602 request.setAttribute("liferay-ui:icon:message", getProcessedMessage());
603 request.setAttribute("liferay-ui:icon:method", getMethod());
604 request.setAttribute("liferay-ui:icon:onClick", getOnClick());
605 request.setAttribute("liferay-ui:icon:src", getSrc());
606 request.setAttribute("liferay-ui:icon:srcHover", getSrcHover());
607 request.setAttribute("liferay-ui:icon:target", _target);
608 request.setAttribute(
609 "liferay-ui:icon:toolTip", String.valueOf(_toolTip));
610 request.setAttribute("liferay-ui:icon:url", getProcessedUrl());
611 request.setAttribute(
612 "liferay-ui:icon:useDialog", String.valueOf(_useDialog));
613 }
614
615 private static final String _AUI_PATH = "../aui/";
616
617 private static final boolean _CLEAN_UP_SET_ATTRIBUTES = true;
618
619 private String _alt;
620 private String _ariaRole;
621 private String _cssClass;
622 private Map<String, Object> _data;
623 private String _icon;
624 private String _iconCssClass;
625 private String _id;
626 private String _image;
627 private String _imageHover;
628 private Boolean _label;
629 private String _lang;
630 private String _linkCssClass;
631 private boolean _localizeMessage = true;
632 private String _markupView;
633 private String _message;
634 private String _method;
635 private String _onClick;
636 private String _src;
637 private String _srcHover;
638 private String _target = "_self";
639 private boolean _toolTip;
640 private String _url;
641 private boolean _useDialog = false;
642
643 }