1 package org.tinyjee.maven.dim.extensions;
2
3 import org.tinyjee.maven.dim.spi.RequestParameterTransformer;
4
5 import java.util.Map;
6
7 import static org.tinyjee.maven.dim.IncludeMacroSignature.*;
8
9 /**
10 * The message box extension is implemented as a {@link RequestParameterTransformer} that is triggered when the parameter
11 * "<code>message-box</code>" is set with the macro call. When "<code>message-box=text to display</code>" is present, the transformer
12 * sets "<code>source</code>" to a bundled velocity template that performs the actual rendering.
13 * <p/>
14 * <b>Note:</b> Message boxes are rendered as pure <i>HTML</i> and will only work if a XhtmlSink or derived class
15 * is used for rendering the output (=> any HTML render target should be fine, including the standard Maven site generation).
16 * Furthermore all built-in icons are rendered using embedded <i>SVG</i> graphics, which is currently supported in:
17 * IE 9+, FF 4+, Chrome, Safari and Opera.
18 *
19 * @author Juergen_Kellerer, 2011-10-06
20 */
21 public class MessageBoxParameterTransformer implements RequestParameterTransformer {
22
23 /**
24 * Enables this extension and sets the text to display inside the message box.
25 * <p/>
26 * <b>Note:</b> Setting this property has no effect in case of "<code>source</code>" or "<code>source-class</code>" were
27 * specified with the macro call. This behaviour ensures that the parameter "<code>message-box</code>" can still be used
28 * with ordinary macro calls where a source or source-class was set.
29 * <p/>
30 * <b>Markup:</b> The message box is rendered as pure HTML and text is added to the box <b>as-is</b>.
31 * As a consequence HTML can be used as markup inside the given message and it is also the only valid
32 * markup that may be used here.
33 * <br/>
34 * E.g. <code>%{include|message-box=Hello <b>World!</b>}</code> can be used with the APT format,
35 * to have "<b>World!</b>" formatted in strong text style.
36 */
37 public static final String PARAM_MESSAGE_BOX = "message-box";
38
39 /**
40 * <i>Optional parameter</i> specifying the type of message box to display.
41 * <ul>
42 * <li><b>info</b>: displays a message box with an information icon (= default).</li>
43 * <li><b>warning</b>: displays a message box showing the given warning with a corresponding icon.</li>
44 * <li><b>alert</b>: displays a message box showing the given alert with a corresponding icon.</li>
45 * </ul>
46 */
47 public static final String PARAM_TYPE = "type";
48
49 /**
50 * <i>Optional parameter</i> overriding the text color of the message box.
51 */
52 public static final String PARAM_TEXT_COLOR = "text-color";
53
54 /**
55 * <i>Optional parameter</i> overriding the border color of the message box.
56 */
57 public static final String PARAM_COLOR = "color";
58
59 /**
60 * <i>Optional parameter</i> overriding the color of the message box background.
61 */
62 public static final String PARAM_BACKGROUND_COLOR = "background-color";
63
64 /**
65 * <i>Optional parameter</i> setting a site resource path to the image that is used with the message box instead of
66 * the built-in SVG graphics.
67 * <p/>
68 * Supported formats include GIF, PNG, JPG and SVG. The path has to be chosen relative to the site's web root, e.g.:<br/>
69 * <code>%{include|icon=images/alert.png|message-box=This is an alert message}</code>
70 * <p/>
71 * <i>Note:</i> If no <code>type</code> is specified, it will be set accordingly when the image path contains one of the
72 * keywords "<code>alert</code>" or "<code>warn(ing)</code>" ("info" remains the default message box type).
73 */
74 public static final String PARAM_ICON = "icon";
75
76 private static volatile int idSequence;
77
78 private static boolean isSourceSet(Map<String, Object> requestParams) {
79 return requestParams.containsKey(PARAM_SOURCE) && requestParams.containsKey(PARAM_SOURCE_CLASS);
80 }
81
82 public void transformParameters(Map<String, Object> requestParams) {
83 Object messageBoxText = requestParams.get(PARAM_MESSAGE_BOX);
84 if (messageBoxText != null && !isSourceSet(requestParams)) {
85 requestParams.put("idSequence", ++idSequence);
86 requestParams.put(PARAM_SOURCE, "classpath:/templates/dim/message-box.html.vm");
87 requestParams.put(PARAM_VERBATIM, false);
88
89 requestParams.put("text", messageBoxText);
90
91 if (requestParams.containsKey(PARAM_BACKGROUND_COLOR))
92 requestParams.put("backgroundColor", requestParams.get(PARAM_BACKGROUND_COLOR));
93 if (requestParams.containsKey(PARAM_TEXT_COLOR))
94 requestParams.put("textColor", requestParams.get(PARAM_TEXT_COLOR));
95 }
96 }
97 }