package marubinotto.piggydb.ui.page.control; import java.io.PrintWriter; import java.io.StringWriter; import java.text.SimpleDateFormat; import java.util.Locale; import java.util.Set; import marubinotto.util.Assert; import marubinotto.util.time.DateTime; import marubinotto.util.time.Month; import marubinotto.util.time.TimeVisitors.DayOfMonthVisitor; import net.sf.click.control.PageLink; public class CalendarIndex implements DayOfMonthVisitor { private StringWriter buffer = new StringWriter(); private PrintWriter writer = new PrintWriter(buffer); private CalendarFocus focus; private DateTime today; private PageLink pageLink; private Set<Integer> linkDaysOfMonth; private Locale locale; private SimpleDateFormat dwf; public CalendarIndex( CalendarFocus focus, DateTime today, PageLink pageLink, Set<Integer> linkDaysOfMonth, Locale locale) { Assert.Arg.notNull(today, "today"); Assert.Arg.notNull(pageLink, "pageLink"); Assert.Arg.notNull(linkDaysOfMonth, "linkDaysOfMonth"); Assert.Arg.notNull(locale, "locale"); this.focus = focus; this.today = today; this.pageLink = pageLink; this.linkDaysOfMonth = linkDaysOfMonth; this.locale = locale; this.dwf = new SimpleDateFormat("EEE", this.locale); } public void start(Month month) { this.writer.println("<table id=\"calendar\" class=\"calendar\" summary=\"calendar\">"); this.writer.println("<tr>"); // Link to the previous month String linkToPrev = this.pageLink.getHref() + "?date=" + month.getLastMonth().getFirstDay().format(CalendarFocus.FORMAT_MONTH); this.writer.print("<td class=\"calendar-prev-month\" colspan=\"2\">"); this.writer.println( "<a id=\"link-to-prev-month\" class=\"mark_link\" href=\"" + linkToPrev + "\"><<</a></td>"); // Current month this.writer.print("<td id=\"calendar-current-month\" class=\"calendar-current-month\" colspan=\"3\">"); if (this.focus != null && this.focus.isSelected(month.getStartInstant(), CalendarFocus.Type.MONTH)) { this.writer.print("<span class=\"selected-month\">"); this.writer.print(month.getFirstDay().format("yyyy/MM")); this.writer.print("</span>"); } else { String linkToMonth = this.pageLink.getHref() + "?date=" + month.getStartInstant().format(CalendarFocus.FORMAT_MONTH); this.writer.print("<a class=\"link-to-month\" href=\"" + linkToMonth + "\">"); this.writer.print(month.getFirstDay().format("yyyy/MM")); this.writer.print("</a>"); } this.writer.println("</td>"); // Link to the next month String linkToNext = this.pageLink.getHref() + "?date=" + month.getNextMonth().getFirstDay().format(CalendarFocus.FORMAT_MONTH); this.writer.print("<td class=\"calendar-next-month\" colspan=\"2\">"); this.writer.println( "<a id=\"link-to-next-month\" class=\"mark_link\" href=\"" + linkToNext + "\">>></a></td>"); this.writer.println("</tr>"); this.writer.println("<tr>"); this.writer.println("<td class=\"calendar-sunday\">" + dwf.format(SUNDAY.toDate()) + "</td>"); this.writer.println("<td class=\"calendar-weekday\">" + dwf.format(SUNDAY.addDays(1).toDate()) + "</td>"); this.writer.println("<td class=\"calendar-weekday\">" + dwf.format(SUNDAY.addDays(2).toDate()) + "</td>"); this.writer.println("<td class=\"calendar-weekday\">" + dwf.format(SUNDAY.addDays(3).toDate()) + "</td>"); this.writer.println("<td class=\"calendar-weekday\">" + dwf.format(SUNDAY.addDays(4).toDate()) + "</td>"); this.writer.println("<td class=\"calendar-weekday\">" + dwf.format(SUNDAY.addDays(5).toDate()) + "</td>"); this.writer.println("<td class=\"calendar-saturday\">" + dwf.format(SUNDAY.addDays(6).toDate()) + "</td>"); this.writer.println("</tr>"); } private static final DateTime SUNDAY = new DateTime(2008, 7, 13); public void visit(int dayOfMonth, int dayOfWeek, DateTime dateTime) { if (dayOfWeek == 1 || dayOfMonth == 1) { this.writer.println("<tr>"); outputBlankCell(dayOfWeek - 1); } if (this.focus != null && this.focus.isSelected(dateTime, CalendarFocus.Type.DAY)) { this.writer.print("<td id=\"selected-day-cell\" class=\"calendar-day selected-day"); if (dateTime.isSameDay(this.today)) this.writer.print(" today"); this.writer.print("\">"); this.writer.print(dayOfMonth); } else { this.writer.print("<td class=\"calendar-day"); if (dateTime.isSameDay(this.today)) this.writer.print(" today"); this.writer.print("\">"); if (this.linkDaysOfMonth.contains(new Integer(dayOfMonth))) { String linkToDay = this.pageLink.getHref() + "?date=" + dateTime.format(CalendarFocus.FORMAT_DAY); this.writer.print( "<a id=\"link-to-day-" + dayOfMonth + "\" class=\"link-to-day\" href=\"" + linkToDay + "\">"); this.writer.print(dayOfMonth); this.writer.print("</a>"); } else { this.writer.print(dayOfMonth); } } this.writer.println("</td>"); if (dayOfWeek == 7 || dateTime.isLastDayOfMonth()) { outputBlankCell(7 - dayOfWeek); this.writer.println("</tr>"); } } public void end() { this.writer.println("</table>"); } public String toString() { return buffer.toString(); } public void clearBuffer() { this.buffer = new StringWriter(); this.writer = new PrintWriter(this.buffer); } private void outputBlankCell(int count) { for (int i = 0; i < count; i++) { this.writer.println("<td class=\"calendar-day\"></td>"); } } }