KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > roller > presentation > tags > calendar > CalendarTag


1
2 package org.roller.presentation.tags.calendar;
3
4 import org.apache.commons.beanutils.PropertyUtils;
5 import org.apache.commons.logging.Log;
6 import org.apache.commons.logging.LogFactory;
7 import org.apache.struts.Globals;
8 import org.apache.struts.config.ModuleConfig;
9 import org.apache.struts.util.MessageResources;
10 import org.apache.struts.util.RequestUtils;
11 import org.roller.presentation.tags.HybridTag;
12 import org.roller.util.DateUtil;
13
14 import java.io.PrintWriter JavaDoc;
15 import java.text.SimpleDateFormat JavaDoc;
16 import java.util.Calendar JavaDoc;
17 import java.util.Date JavaDoc;
18 import java.util.Locale JavaDoc;
19 import java.util.StringTokenizer JavaDoc;
20
21 import javax.servlet.ServletContext JavaDoc;
22 import javax.servlet.http.HttpServletRequest JavaDoc;
23 import javax.servlet.jsp.JspException JavaDoc;
24 import javax.servlet.jsp.tagext.Tag JavaDoc;
25 import org.roller.presentation.RollerContext;
26
27
28 /**
29  * Calendar tag.
30  * @jsp.tag name="Calendar"
31  */

32 public class CalendarTag extends HybridTag
33 {
34     private static Log mLogger =
35         LogFactory.getFactory().getInstance(CalendarTag.class);
36
37     // JSP Attributes
38

39     /** @jsp.attribute required="true" */
40     public String JavaDoc getName() { return mName; }
41     public void setName( String JavaDoc name ) { mName = name; }
42     private String JavaDoc mName = null;
43
44     /* @jsp.attribute description="Date in yyyyMMdd format"
45     public String getDate() { return mDate; }
46     public void setDate( String s ) { mDate = s; }
47     private String mDate = null;
48     */

49
50     /** @jsp.attribute */
51     public String JavaDoc getModel() { return mModelName; }
52     public void setModel( String JavaDoc s ) { mModelName= s; }
53     private String JavaDoc mModelName = null;
54
55     /** @jsp.attribute */
56     public String JavaDoc getClassSuffix() { return mClassSuffix; }
57     public void setClassSuffix( String JavaDoc s ) { mClassSuffix= s; }
58     private String JavaDoc mClassSuffix = "";
59
60     // not a tag attribute
61
public void setLocale(Locale JavaDoc locale) {
62         if (locale != null)
63             mLocale = locale;
64     }
65     private Locale JavaDoc mLocale = Locale.getDefault();
66
67     // not a tag attribute
68
/*
69     private TimeZone mTimeZone = TimeZone.getDefault();
70     public void setTimeZone(TimeZone zone) {
71         if (zone != null)
72             mTimeZone = zone;
73     }
74     private TimeZone getTimeZone()
75     {
76         // I've seen TimeZone.getDefault() return null. -Lance
77         if (mTimeZone == null)
78             mTimeZone = TimeZone.getTimeZone("America/New_York");
79         return mTimeZone;
80     }
81     */

82
83     private String JavaDoc[] mDayNames = null;
84
85     public CalendarTag()
86     {
87         /*
88          * Empty constructor.
89          *
90          * Used to build the day names, but the correct locale
91          * was not set at this stage. Day-name-building has moved to the
92          * doStartTag() method.
93          */

94     }
95
96     //------------------------------------------------------------------------
97
/**
98      * Write to a PrintWriter so that tag may be used from Velocity
99      */

100     public int doStartTag( PrintWriter JavaDoc pw ) throws JspException JavaDoc
101     {
102         try
103         {
104             // build week day names
105
this.buildDayNames();
106
107             Date JavaDoc day=null; // day to be displayed
108
Calendar JavaDoc dayCal; // set to day to be displayed
109
Calendar JavaDoc cal; // for iterating through days of month
110
Calendar JavaDoc todayCal; // for iterating through days of month
111
CalendarModel model; // the calendar model
112

113             // ---------------------------------
114
// --- initialize date variables ---
115
// ---------------------------------
116

117             // check for parameter map and target url
118
StringTokenizer JavaDoc toker = new StringTokenizer JavaDoc(mModelName,".");
119             String JavaDoc tok1 = toker.nextToken();
120             if (toker.hasMoreTokens())
121             {
122                 String JavaDoc tok2 = toker.nextToken();
123                 Object JavaDoc bean = pageContext.findAttribute(tok1);
124                 model = (CalendarModel)PropertyUtils.getProperty(bean, tok2);
125             }
126             else
127             {
128                 model = (CalendarModel)pageContext.findAttribute( mModelName );
129             }
130             
131             // no model specified, nothing to generate
132
if (model == null)
133             {
134                 return SKIP_BODY;
135             }
136             
137             day = model.getDay();
138
139             // ceate object to represent today
140
todayCal = model.getCalendar();
141             todayCal.setTime( new Date JavaDoc() );
142
143             // formatter Month-Year title of calendar
144
SimpleDateFormat JavaDoc formatTitle = new SimpleDateFormat JavaDoc("MMMM yyyy", mLocale);
145
146             HttpServletRequest JavaDoc request =
147                 (HttpServletRequest JavaDoc)pageContext.getRequest();
148
149             // get Resource Bundle
150
MessageResources resources = getResources(request);
151
152             // go back to first day in month
153
cal = model.getCalendar();
154             day = DateUtil.getNoonOfDay(day, cal);
155             cal.set( Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH) );
156
157             // go back to sunday before that: the first sunday in the calendar
158
while ( cal.get( Calendar.DAY_OF_WEEK ) != Calendar.SUNDAY )
159             {
160                 cal.add( Calendar.DATE, -1 );
161             }
162
163             // create table of 5 weeks, 7 days per row
164
dayCal = model.getCalendar();
165             dayCal.setTime( day );
166
167             // -------------------------
168
// --- draw the calendar ---
169
// -------------------------
170
pw.print("<table cellspacing=\"0\" border=\"0\" ");
171             pw.print(" summary=\""
172                 +resources.getMessage(mLocale, "calendar.summary")
173                 +"\" class=\"hCalendarTable"
174                 +mClassSuffix+"\">");
175             pw.print("<tr>");
176             pw.print("<td colspan=\"7\" align=\"center\" "+
177                 "class=\"hCalendarMonthYearRow"+mClassSuffix+"\">");
178             pw.print("<a HREF=\"" + model.computePrevMonthUrl()
179                      + "\" title=\"" + resources.getMessage(mLocale, "calendar.prev")
180                      + "\" class=\"hCalendarNavBar\">&laquo;</a> ");
181             pw.print( formatTitle.format(day) );
182             if (todayCal.getTime().compareTo(model.getNextMonth()) >= 0)
183             {
184                 pw.print(" <a HREF=\"" + model.computeNextMonthUrl()
185                      + "\" title=\"" + resources.getMessage(mLocale, "calendar.next")
186                      + "\" class=\"hCalendarNavBar\">&raquo;</a>");
187             }
188             pw.print("</td></tr>");
189
190             // emit the HTML calendar
191
for ( int w=-1; w<6; w++ )
192             {
193                 pw.print("<tr>");
194                 for ( int d=0; d<7; d++ )
195                 {
196                     if ( w == -1 )
197                     {
198                         pw.print(
199                             "<th class=\"hCalendarDayNameRow"
200                             +mClassSuffix+"\" align=\"center\">");
201                         pw.print( mDayNames[d] );
202                         pw.print("</th>");
203                         continue;
204                     }
205
206                     // determine URL for this calendar day
207
Date JavaDoc tddate = cal.getTime();
208                     String JavaDoc url = model.computeUrl( tddate, false );
209                     String JavaDoc content = model.getContent( tddate );
210
211                     if // day is today then use today style
212
(( cal.get(Calendar.DAY_OF_MONTH)
213                             == todayCal.get(Calendar.DAY_OF_MONTH))
214                         && ( cal.get(Calendar.MONTH)
215                             == todayCal.get(Calendar.MONTH))
216                         && ( cal.get(Calendar.YEAR)
217                             == todayCal.get(Calendar.YEAR)))
218                     {
219                         printToday(pw, cal, url, content);
220                     }
221                     else if // day is in calendar month
222
((cal.get(Calendar.MONTH) == dayCal.get(Calendar.MONTH))
223                      && (cal.get(Calendar.YEAR) == dayCal.get(Calendar.YEAR)))
224                     {
225                         printDayInThisMonth(pw, cal, url, content);
226                     }
227                     else // apply day-not-in-month style ;-)
228
{
229                         printDayNotInMonth(pw, cal);
230                     }
231
232                     // increment calendar by one day
233
cal.add( Calendar.DATE, 1 );
234                 }
235                 pw.print("</tr>");
236             }
237
238             pw.print("<tr class=\"hCalendarNextPrev"
239                 +mClassSuffix+"\">");
240             pw.print("<td colspan=\"7\" align=\"center\">");
241
242             pw.print("<a HREF=\""+model.computeTodayMonthUrl()
243                 +"\" class=\"hCalendarNavBar\">"
244                 +resources.getMessage(mLocale, "calendar.today")
245                 +"</a>");
246
247             pw.print("</td>");
248             pw.print("</tr>");
249
250             pw.print("</table>");
251         }
252         catch (Exception JavaDoc e)
253         {
254             pw.print("<span class=\"error\">");
255             pw.print("<p><b>An ERROR has occured CalendarTag</b></p>");
256             pw.print("</span>");
257             mLogger.error("Calendar tag exception",e);
258         }
259         return Tag.SKIP_BODY;
260     }
261
262     private void printDayNotInMonth(PrintWriter JavaDoc pw, Calendar JavaDoc cal)
263     {
264         pw.print("<td class=\"hCalendarDayNotInMonth"+mClassSuffix+"\">");
265         //pw.print(cal.get(Calendar.DAY_OF_MONTH));
266
pw.print("&nbsp;");
267         pw.print("</td>");
268     }
269     
270     private void printDayInThisMonth(PrintWriter JavaDoc pw, Calendar JavaDoc cal, String JavaDoc url, String JavaDoc content)
271     {
272         if ( content!=null )
273         {
274             pw.print("<td class=\"hCalendarDayCurrent"
275                 +mClassSuffix+"\">");
276             pw.print( content );
277             pw.print("</td>");
278         }
279         else if (url!=null)
280         {
281             pw.print("<td class=\"hCalendarDayLinked"
282                 +mClassSuffix+"\">");
283             pw.print("<div class=\"hCalendarDayTitle"
284                 +mClassSuffix+"\">");
285             pw.print("<a HREF=\""+url+"\">");
286             pw.print(cal.get(Calendar.DAY_OF_MONTH));
287             pw.print("</a></div>");
288             pw.print("</td>");
289         }
290         else
291         {
292             pw.print("<td class=\"hCalendarDay"
293                 +mClassSuffix+"\">");
294             pw.print("<div class=\"hCalendarDayTitle"
295                 +mClassSuffix+"\">");
296             pw.print(cal.get(Calendar.DAY_OF_MONTH));
297             pw.print("</div>");
298             pw.print("</td>");
299         }
300     }
301     
302     private void printToday(PrintWriter JavaDoc pw, Calendar JavaDoc cal, String JavaDoc url, String JavaDoc content)
303     {
304         if ( content!=null )
305         {
306             pw.print("<td class=\"hCalendarDayCurrent"
307                 +mClassSuffix+"\">");
308             pw.print( content );
309             pw.print("</td>");
310         }
311         else if (url!=null)
312         {
313             pw.print("<td class=\"hCalendarDayCurrent"
314                +mClassSuffix+"\">");
315             pw.print("<a HREF=\""+url+"\" "
316                +"class=\"hCalendarDayTitle"+mClassSuffix+"\">");
317             pw.print(cal.get(Calendar.DAY_OF_MONTH));
318             pw.print("</a>");
319             pw.print("</td>");
320         }
321         else
322         {
323             pw.print("<td class=\"hCalendarDayCurrent"
324                 +mClassSuffix+"\">");
325             pw.print("<div class=\"hCalendarDayTitle"
326                 +mClassSuffix+"\">");
327             pw.print(cal.get(Calendar.DAY_OF_MONTH));
328             pw.print("</div></td>");
329         }
330     }
331     private MessageResources getResources(HttpServletRequest JavaDoc request) {
332         ServletContext JavaDoc app = RollerContext.getServletContext();
333         ModuleConfig moduleConfig = RequestUtils.getModuleConfig(request, app);
334         return (MessageResources)app.getAttribute(Globals.MESSAGES_KEY +
335                                                   moduleConfig.getPrefix());
336     }
337
338     /**
339      * Helper method to build the names of the weekdays. This
340      * used to take place in the <code>CalendarTag</code> constructor,
341      * but there, <code>mLocale</code> doesn't have the correct value yet.
342      */

343     private void buildDayNames()
344     {
345         // build array of names of days of week
346
mDayNames = new String JavaDoc[7];
347         Calendar JavaDoc dayNameCal = Calendar.getInstance();
348         SimpleDateFormat JavaDoc dayFormatter = new SimpleDateFormat JavaDoc("EEE", mLocale);
349         dayNameCal.set(Calendar.DAY_OF_WEEK, 0);
350         for (int dnum = 0; dnum < 7; dnum++)
351         {
352             dayNameCal.add(Calendar.DATE, 1);
353             mDayNames[dnum] = dayFormatter.format(dayNameCal.getTime());
354         }
355     }
356
357 }
358
359
Popular Tags