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