View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  
20  package org.apache.myfaces.tobago.renderkit.html.scarborough.standard.tag;
21  
22  import org.apache.commons.lang.StringUtils;
23  import org.apache.myfaces.tobago.component.Attributes;
24  import org.apache.myfaces.tobago.component.UICalendar;
25  import org.apache.myfaces.tobago.context.Markup;
26  import org.apache.myfaces.tobago.context.ResourceManagerUtils;
27  import org.apache.myfaces.tobago.model.CalendarModel;
28  import org.apache.myfaces.tobago.model.DateModel;
29  import org.apache.myfaces.tobago.renderkit.LayoutComponentRendererBase;
30  import org.apache.myfaces.tobago.renderkit.css.Classes;
31  import org.apache.myfaces.tobago.renderkit.css.Style;
32  import org.apache.myfaces.tobago.renderkit.html.DataAttributes;
33  import org.apache.myfaces.tobago.renderkit.html.HtmlAttributes;
34  import org.apache.myfaces.tobago.renderkit.html.HtmlElements;
35  import org.apache.myfaces.tobago.renderkit.html.util.HtmlRendererUtils;
36  import org.apache.myfaces.tobago.webapp.TobagoResponseWriter;
37  
38  import javax.faces.component.UIComponent;
39  import javax.faces.context.FacesContext;
40  import java.io.IOException;
41  import java.text.SimpleDateFormat;
42  import java.util.Calendar;
43  import java.util.Date;
44  import java.util.GregorianCalendar;
45  import java.util.Locale;
46  
47  public class CalendarRenderer extends LayoutComponentRendererBase {
48  
49    @Override
50    public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {
51  
52      UICalendar output = (UICalendar) component;
53      String id = output.getClientId(facesContext);
54  
55      Locale locale = facesContext.getViewRoot().getLocale();
56  
57      Object value = output.getValue();
58      Calendar calendar;
59      if (value instanceof Calendar) {
60        calendar = (Calendar) value;
61      } else { 
62        calendar = new GregorianCalendar();
63        if (value instanceof Date) {
64          calendar.setTime((Date) value);
65        }
66      }
67      CalendarModel model = new CalendarModel(calendar);
68  
69      // rendering
70      TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
71  
72      writer.startElement(HtmlElements.DIV, component);
73      writer.writeIdAttribute(id);
74      writer.writeClassAttribute(Classes.create(output));
75      HtmlRendererUtils.writeDataAttributes(facesContext, writer, component);
76      Style style = new Style(facesContext, output);
77      writer.writeStyleAttribute(style);
78      String dateInputId = (String) output.getAttributes().get(Attributes.DATE_INPUT_ID);
79      if (dateInputId != null) {
80        writer.writeAttribute(DataAttributes.DATEINPUTID, dateInputId, false);
81      }
82      writer.writeAttribute(DataAttributes.DAY, Integer.toString(calendar.get(Calendar.YEAR)), false);
83      writer.writeAttribute(DataAttributes.MONTH, Integer.toString(1 + calendar.get(Calendar.MONTH)), false);
84      writer.writeAttribute(DataAttributes.YEAR, Integer.toString(calendar.get(Calendar.DAY_OF_MONTH)), false);
85  
86      writer.writeAttribute(DataAttributes.FIRSTDAYOFWEEK, Integer.toString(calendar.getFirstDayOfWeek()), false);
87      writer.writeAttribute(DataAttributes.MONTHNAMES, getMonthNames(locale), false);
88  
89      // begin header
90      writer.startElement(HtmlElements.DIV, null);
91      writer.writeClassAttribute(Classes.create(output, "row"));
92  
93      writer.startElement(HtmlElements.IMG, null);
94      writer.writeClassAttribute(Classes.create(output, "header"));
95      writer.writeAttribute(HtmlAttributes.ALT, "", false);
96      writer.writeAttribute(HtmlAttributes.SRC,
97          ResourceManagerUtils.getImageWithPath(facesContext, "image/calendarFastPrev.gif"), false);
98      writer.writeAttribute(DataAttributes.COMMAND, "fastPrev", false);
99      writer.endElement(HtmlElements.IMG);
100 
101     writer.startElement(HtmlElements.IMG, null);
102     writer.writeClassAttribute(Classes.create(output, "header"));
103     writer.writeAttribute(HtmlAttributes.ALT, "", false);
104     writer.writeAttribute(HtmlAttributes.SRC,
105         ResourceManagerUtils.getImageWithPath(facesContext, "image/calendarPrev.gif"), false);
106     writer.writeAttribute(DataAttributes.COMMAND, "prev", false);
107     writer.endElement(HtmlElements.IMG);
108 
109     writer.startElement(HtmlElements.SPAN, null);
110     writer.writeClassAttribute(Classes.create(output, "header"));
111 
112     writer.startElement(HtmlElements.SPAN, null);
113     writer.writeAttribute(DataAttributes.COMMAND, "month", false);
114     writer.writeText(new SimpleDateFormat("MMMMM", locale).format(calendar.getTime()));
115     writer.endElement(HtmlElements.SPAN);
116 
117     writer.writeText(" "); // non breaking space
118 
119     writer.startElement(HtmlElements.SPAN, null);
120     writer.writeAttribute(DataAttributes.COMMAND, "year", false);
121     writer.writeText(new SimpleDateFormat("yyyy", locale).format(calendar.getTime()));
122     writer.endElement(HtmlElements.SPAN);
123 
124     writer.endElement(HtmlElements.SPAN);
125 
126     writer.startElement(HtmlElements.IMG, null);
127     writer.writeClassAttribute(Classes.create(output, "header"));
128     writer.writeAttribute(HtmlAttributes.ALT, "", false);
129     writer.writeAttribute(HtmlAttributes.SRC,
130         ResourceManagerUtils.getImageWithPath(facesContext, "image/calendarNext.gif"), false);
131     writer.writeAttribute(DataAttributes.COMMAND, "next", false);
132     writer.endElement(HtmlElements.IMG);
133 
134     writer.startElement(HtmlElements.IMG, null);
135     writer.writeClassAttribute(Classes.create(output, "header"));
136     writer.writeAttribute(HtmlAttributes.ALT, "", false);
137     writer.writeAttribute(HtmlAttributes.SRC,
138         ResourceManagerUtils.getImageWithPath(facesContext, "image/calendarFastNext.gif"), false);
139     writer.writeAttribute(DataAttributes.COMMAND, "fastNext", false);
140     writer.endElement(HtmlElements.IMG);
141 
142     writer.endElement(HtmlElements.DIV);
143     // end header
144 
145     // begin weeks
146     writer.startElement(HtmlElements.DIV, null);
147     writer.writeClassAttribute(Classes.create(output, "row"));
148 
149     SimpleDateFormat dayInWeekFormat = new SimpleDateFormat("E", locale);
150     for (int dayIt = 0; dayIt < 7; ++dayIt) {
151       DateModel date = model.getDate(0, dayIt);
152       String dayName = dayInWeekFormat.format(date.getCalendar().getTime());
153       dayName = StringUtils.substring(dayName, 0, 2);
154 
155       writer.startElement(HtmlElements.SPAN, null);
156       writer.writeClassAttribute(Classes.create(output, "dayOfWeek"));
157       writer.writeText(dayName);
158       writer.endElement(HtmlElements.SPAN);
159     }
160 
161     writer.endElement(HtmlElements.DIV);
162     // end weeks
163 
164     // begin grid
165     writer.startElement(HtmlElements.DIV, null);
166     writer.writeClassAttribute(Classes.create(output, "grid"));
167     for (int week = 0; week < 6; ++week) {
168       writer.startElement(HtmlElements.DIV, null);
169       writer.writeClassAttribute(Classes.create(output, "row"));
170 
171       for (int dayIt = 0; dayIt < 7; ++dayIt) {
172         DateModel date = model.getDate(week, dayIt);
173         String dayDescription = String.valueOf(date.getDay());
174 
175         writer.startElement(HtmlElements.SPAN, null);
176         writer.writeClassAttribute(
177             Classes.create(output, "day", date.getMonth() == model.getMonth() ? null : Markup.DISABLED));
178 
179         writer.writeText(dayDescription);
180 
181         writer.endElement(HtmlElements.SPAN);
182       }
183       writer.endElement(HtmlElements.DIV);
184     }
185     writer.endElement(HtmlElements.DIV);
186     // end grid
187 
188     writer.endElement(HtmlElements.DIV);
189   }
190   
191   private String getMonthNames(Locale locale) {
192     SimpleDateFormat dateFormat = new SimpleDateFormat("MMMMM", locale);
193     StringBuilder buffer = new StringBuilder(64);
194     Calendar calendar = Calendar.getInstance();
195     calendar.set(2000, Calendar.JANUARY, 1);
196     for (int month = 0; month < 12; ++month) {
197       if (month > 0) {
198         buffer.append(',');
199       }
200       buffer.append(dateFormat.format(calendar.getTime()));
201       calendar.add(java.util.Calendar.MONTH, 1);
202     }
203     return buffer.toString();
204   }
205 
206 }