1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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(" ");
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
144
145
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
163
164
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
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 }