View Javadoc

1   /**
2    * Copyright 2005-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.krad.uif.element;
17  
18  import org.apache.commons.lang.StringUtils;
19  import org.kuali.rice.krad.datadictionary.validator.ErrorReport;
20  import org.kuali.rice.krad.datadictionary.validator.RDValidator;
21  import org.kuali.rice.krad.datadictionary.validator.TracerToken;
22  import org.kuali.rice.krad.uif.component.Component;
23  import org.kuali.rice.krad.uif.util.ComponentFactory;
24  import org.kuali.rice.krad.uif.view.View;
25  
26  import java.util.ArrayList;
27  import java.util.List;
28  
29  /**
30   * Content element that renders a HTML <code>&lt;IMG&gt;</code> tag
31   *
32   * @author Kuali Rice Team (rice.collab@kuali.org)
33   */
34  public class Image extends ContentElementBase {
35      private static final long serialVersionUID = -3911849875276940507L;
36  
37      private String source;
38      private String altText;
39      private String height;
40      private String width;
41  
42      private boolean captionHeaderPlacementAboveImage;
43  
44      private String captionHeaderText;
45      private Header captionHeader;
46  
47      private String cutlineText;
48      private Message cutlineMessage;
49  
50      public Image() {
51          super();
52  
53          altText = "";
54      }
55      
56      /**
57       * The following initialization is performed:
58       *
59       * <ul>
60       * <li>Initializes the cutline message and caption header components if necessary</li>
61       * </ul>
62       *
63       * @see org.kuali.rice.krad.uif.component.ComponentBase#performInitialization(org.kuali.rice.krad.uif.view.View,
64       *      java.lang.Object)
65       */
66      @Override
67      public void performInitialization(View view, Object model) {
68          super.performInitialization(view, model);
69  
70          if ((StringUtils.isNotBlank(captionHeaderText) || (getPropertyExpression("captionHeaderText") != null)) && (
71                  captionHeader == null)) {
72              captionHeader = ComponentFactory.getImageCaptionHeader();
73              view.assignComponentIds(captionHeader);
74          }
75  
76          if ((StringUtils.isNotBlank(cutlineText) || (getPropertyExpression("cutlineText") != null)) && (cutlineMessage
77                  == null)) {
78              cutlineMessage = ComponentFactory.getImageCutlineMessage();
79              view.assignComponentIds(cutlineMessage);
80          }
81      }
82  
83      /**
84       * Performs the final lifecycle phase for this element.
85       *
86       * <p>
87       * Performs the following steps
88       * <ul>
89       * <li>Set the caption header text on the caption header</li>
90       * <li>Set the cutline text on the cutline message</li>
91       * </ul>
92       * </p>
93       *
94       * @see Component#performFinalize(org.kuali.rice.krad.uif.view.View, java.lang.Object, org.kuali.rice.krad.uif.component.Component)
95       */
96      @Override
97      public void performFinalize(View view, Object model, Component parent) {
98          super.performFinalize(view, model, parent);
99  
100         if (StringUtils.isNotBlank(captionHeaderText)) {
101             captionHeader.setHeaderText(captionHeaderText);
102         }
103 
104         if (StringUtils.isNotBlank(cutlineText)) {
105             cutlineMessage.setMessageText(cutlineText);
106         }
107     }
108 
109     /**
110      * @see org.kuali.rice.krad.uif.component.ComponentBase#getComponentsForLifecycle()
111      */
112     @Override
113     public List<Component> getComponentsForLifecycle() {
114         List<Component> components = super.getComponentsForLifecycle();
115 
116         components.add(captionHeader);
117         components.add(cutlineMessage);
118 
119         return components;
120     }
121 
122     /**
123      * returns the URL of this image
124      *
125      * @return String containing the URL of this image.
126      */
127     public String getSource() {
128         return this.source;
129     }
130 
131     /**
132      * Sets the URL of this image
133      *
134      * @param source - String representing the URL of this image
135      */
136     public void setSource(String source) {
137         this.source = source;
138     }
139 
140     /**
141      * Provides alternate information for the image element
142      *
143      * <p>The altText property specifies an alternate text for an image. It is displayed by the browser
144      * if the image cannot be displayed.  This is especially important for accessibility, because screen
145      * readers can't understand images, but rather will read aloud the alternative text assigned to them.
146      * <br>
147      * Some best practices:
148      * <ul>
149      * <li>spacer images, bullets, and icons should have the altText set to null or the empty string. This
150      * will prevent screen readers from announcing it.</li>
151      * <li>Make the altText message as short and succinct as possible</li>
152      * <li>Describe the content of the image and nothing more</li>
153      * </ul>
154      * </p>
155      *
156      * @return a String representing alternative information about this image
157      */
158     public String getAltText() {
159         return this.altText;
160     }
161 
162     /**
163      * Sets the alternate text property for this image
164      *
165      * @param altText - a String containing the alternative information about the image
166      */
167     public void setAltText(String altText) {
168         this.altText = altText;
169     }
170 
171     /**
172      * Returns the height style attribute of this image
173      *
174      * <p>
175      * The default unit of measure is pixels.<br>
176      * It is good practice to specify both the height and width attributes for an image.
177      * If these attributes are set, the space required for the image is reserved when the page is loaded.
178      * However, without these attributes, the browser does not know the size of the image. The effect will
179      * be that the page layout will change while the images load.
180      * </p>
181      *
182      * @return String containing of the height style attribute of this image
183      */
184     public String getHeight() {
185         return this.height;
186     }
187 
188     /**
189      * Sets the height style attribute of the image.
190      *
191      * @param height - String containing the height of the image
192      */
193     public void setHeight(String height) {
194         this.height = height;
195     }
196 
197     /**
198      * Returns the width style attribute of the image
199      *
200      * <p>
201      * The default unit of measure is pixels.<br>
202      * It is good practice to specify both the height and width attributes for an image.
203      * If these attributes are set, the space required for the image is reserved when the page is loaded.
204      * However, without these attributes, the browser does not know the size of the image. The effect will
205      * be that the page layout will change while the images load.
206      * <p>
207      *
208      * @return String containing the width of this image
209      */
210     public String getWidth() {
211         return width;
212     }
213 
214     /**
215      * Sets the width style attribute of the image
216      *
217      * @param width - a String containing the width of this image
218      */
219     public void setWidth(String width) {
220         this.width = width;
221     }
222 
223     /**
224      * Retrieves the caption text for this image
225      *
226      * <p>
227      * The caption text is a headline for the picture. It may be displayed either above or below the picture.
228      * </p>
229      *
230      * @return String containing the caption
231      */
232     public String getCaptionHeaderText() {
233         return captionHeaderText;
234     }
235 
236     /**
237      * Sets the text displayed as of the caption for the picture
238      *
239      * @param captionHeaderText - String containing the caption text.
240      */
241     public void setCaptionHeaderText(String captionHeaderText) {
242         this.captionHeaderText = captionHeaderText;
243     }
244 
245     /**
246      * Retrieves the {@link Header} component used to display the caption for this image
247      *
248      * @return Header component which wraps the caption text.
249      */
250     public Header getCaptionHeader() {
251         return captionHeader;
252     }
253 
254     /**
255      * Sets the Header used to display the caption for this image
256      *
257      * @param captionHeader - Header component which wraps the caption text.
258      */
259     public void setCaptionHeader(Header captionHeader) {
260         this.captionHeader = captionHeader;
261     }
262 
263     /**
264      * Retrieves the cutline text for this image
265      *
266      * <p>
267      * The cutline text give more detailed information about the picture. Generally it describes
268      * the who, what, where, when of this image.
269      * </p>
270      *
271      * @return String containing the cutline text.
272      */
273     public String getCutlineText() {
274         return cutlineText;
275     }
276 
277     /**
278      * Sets the cutline text that describes this image
279      *
280      * @param cutlineText - String describing this image
281      */
282     public void setCutlineText(String cutlineText) {
283         this.cutlineText = cutlineText;
284     }
285 
286     /**
287      * Gets the {@link Message} component used to display the cutline.
288      *
289      * <p>
290      * Wrapping the cutline text with a Message component allows styling of the cutline text.
291      * </p>
292      *
293      * @return Message component wrapping the cutline.
294      */
295     public Message getCutlineMessage() {
296         return cutlineMessage;
297     }
298 
299     /**
300      * Sets the Message component used to display the cutline for this image
301      *
302      * @param cutlineMessage - Message
303      */
304     public void setCutlineMessage(Message cutlineMessage) {
305         this.cutlineMessage = cutlineMessage;
306     }
307 
308     /**
309      * Specifies whether the image caption is to be displayed above or below the image
310      *
311      * @return true if the caption is to be displayed above the image. false if displayed below the image.
312      */
313     public boolean isCaptionHeaderPlacementAboveImage() {
314         return captionHeaderPlacementAboveImage;
315     }
316 
317     /**
318      * Sets whether the image caption is to be displayed above or below the image
319      *
320      * @param captionHeaderPlacementAboveImage - true displays above image, false displays below image
321      */
322     public void setCaptionHeaderPlacementAboveImage(boolean captionHeaderPlacementAboveImage) {
323         this.captionHeaderPlacementAboveImage = captionHeaderPlacementAboveImage;
324     }
325 
326     /**
327      * @see org.kuali.rice.krad.uif.component.Component#completeValidation
328      */
329     @Override
330     public ArrayList<ErrorReport> completeValidation(TracerToken tracer){
331         ArrayList<ErrorReport> reports=new ArrayList<ErrorReport>();
332         tracer.addBean(this);
333 
334         // Checks that a source is set
335         if(getSource()==null){
336             if(!RDValidator.checkExpressions(this,"source")){
337                 ErrorReport error = ErrorReport.createError("Source must be set",tracer);
338                 error.addCurrentValue("source ="+getSource());
339                 reports.add(error);
340             }
341         }
342 
343         // Checks that alt text is set
344         if(getAltText().compareTo("")==0){
345             if(RDValidator.checkExpressions(this,"altText")){
346                 ErrorReport error = ErrorReport.createWarning("Alt text should be set, violates accessibility standards if not set",tracer);
347                 error.addCurrentValue("altText ="+getAltText());
348                 reports.add(error);
349             }
350         }
351 
352         reports.addAll(super.completeValidation(tracer.getCopy()));
353 
354         return reports;
355     }
356 }