\r
private void clearCalendarBody(boolean remove) {\r
if (!remove) {\r
+ // Leave the cells in place but clear their contents\r
+\r
+ // This has the side effect of ensuring that the calendar always\r
+ // contain 7 rows.\r
for (int row = 1; row < 7; row++) {\r
- for (int col = 0; col < 7; col++) {\r
+ for (int col = 0; col < 8; col++) {\r
days.setHTML(row, col, " ");\r
}\r
}\r
\r
private void buildCalendarBody() {\r
\r
+ final boolean showISOWeekNumbers = datefield.isShowISOWeekNumbers();\r
+ final int columns = 1 + 5;\r
+ final int weekColumn = 0;\r
+ final int firstWeekdayColumn = 1;\r
+ final int headerRow = 0;\r
+\r
setWidget(1, 0, days);\r
setCellPadding(0);\r
setCellSpacing(0);\r
- getFlexCellFormatter().setColSpan(1, 0, 5);\r
+ getFlexCellFormatter().setColSpan(1, 0, columns);\r
getFlexCellFormatter().setStyleName(1, 0,\r
VDateField.CLASSNAME + "-calendarpanel-body");\r
\r
- days.getFlexCellFormatter().setStyleName(0, 0, "v-first");\r
- days.getFlexCellFormatter().setStyleName(0, 6, "v-last");\r
- days.getRowFormatter().setStyleName(0,\r
+ days.getFlexCellFormatter().setStyleName(headerRow, weekColumn,\r
+ "v-week");\r
+ // Hide the week column if week numbers are not to be displayed.\r
+ days.getFlexCellFormatter().setVisible(headerRow, weekColumn,\r
+ showISOWeekNumbers);\r
+\r
+ days.getFlexCellFormatter().setStyleName(headerRow, firstWeekdayColumn,\r
+ "v-first");\r
+ days.getFlexCellFormatter().setStyleName(headerRow,\r
+ firstWeekdayColumn + 6, "v-last");\r
+ days.getRowFormatter().setStyleName(headerRow,\r
VDateField.CLASSNAME + "-calendarpanel-weekdays");\r
\r
// Print weekday names\r
day = 0;\r
}\r
if (datefield.getCurrentResolution() > VDateField.RESOLUTION_MONTH) {\r
- days.setHTML(0, i, "<strong>"\r
+ days.setHTML(headerRow, firstWeekdayColumn + i, "<strong>"\r
+ datefield.getDateTimeService().getShortDay(day)\r
+ "</strong>");\r
} else {\r
- days.setHTML(0, i, "");\r
+ days.setHTML(headerRow, firstWeekdayColumn + i, "");\r
}\r
}\r
\r
// date actually selected?\r
- Date currentDate = datefield.getCurrentDate();\r
+ Date selectedDate = datefield.getCurrentDate();\r
+ // Showing is the date (year/month+year) that is currently shown in the\r
+ // panel\r
Date showing = datefield.getShowingDate();\r
- boolean selected = (currentDate != null\r
- && currentDate.getMonth() == showing.getMonth() && currentDate\r
- .getYear() == showing.getYear());\r
+\r
+ // The day of month that is selected, -1 if no day of this month is\r
+ // selected (i.e, showing another month/year than selected or nothing is\r
+ // selected)\r
+ int dayOfMonthSelected = -1;\r
+ // The day of month that is today, -1 if no day of this month is today\r
+ // (i.e., showing another month/year than current)\r
+ int dayOfMonthToday = -1;\r
+\r
+ // Find out a day this month is selected\r
+ if (selectedDate != null\r
+ && selectedDate.getMonth() == showing.getMonth()\r
+ && selectedDate.getYear() == showing.getYear()) {\r
+ dayOfMonthSelected = selectedDate.getDate();\r
+ }\r
+\r
+ // Find out if today is in this month\r
+ final Date today = new Date();\r
+ if (today.getMonth() == showing.getMonth()\r
+ && today.getYear() == showing.getYear()) {\r
+ dayOfMonthToday = today.getDate();\r
+ }\r
\r
final int startWeekDay = datefield.getDateTimeService()\r
- .getStartWeekDay(datefield.getShowingDate());\r
- final int numDays = DateTimeService.getNumberOfDaysInMonth(datefield\r
- .getShowingDate());\r
+ .getStartWeekDay(showing);\r
+ final int daysInMonth = DateTimeService.getNumberOfDaysInMonth(showing);\r
+\r
int dayCount = 0;\r
- final Date today = new Date();\r
- final Date curr = new Date(datefield.getShowingDate().getTime());\r
- for (int row = 1; row < 7; row++) {\r
- for (int col = 0; col < 7; col++) {\r
- if (!(row == 1 && col < startWeekDay)) {\r
- if (dayCount < numDays) {\r
- final int selectedDate = ++dayCount;\r
- String title = "";\r
- if (entrySource != null) {\r
- curr.setDate(dayCount);\r
- final List entries = entrySource.getEntries(curr,\r
- VDateField.RESOLUTION_DAY);\r
- if (entries != null) {\r
- for (final Iterator it = entries.iterator(); it\r
- .hasNext();) {\r
- final CalendarEntry entry = (CalendarEntry) it\r
- .next();\r
- title += (title.length() > 0 ? ", " : "")\r
- + entry.getStringForDate(curr);\r
- }\r
+ final Date curr = new Date(showing.getTime());\r
+\r
+ // No month has more than 6 weeks so 6 is a safe maximum for rows.\r
+ for (int weekOfMonth = 1; weekOfMonth < 7; weekOfMonth++) {\r
+ boolean weekNumberProcessed[] = new boolean[] { false, false,\r
+ false, false, false, false, false };\r
+\r
+ for (int dayOfWeek = 0; dayOfWeek < 7; dayOfWeek++) {\r
+ if (!(weekOfMonth == 1 && dayOfWeek < startWeekDay)) {\r
+\r
+ if (dayCount >= daysInMonth) {\r
+ // All days printed and we are done\r
+ break;\r
+ }\r
+\r
+ final int dayOfMonth = ++dayCount;\r
+ final String baseclass = VDateField.CLASSNAME\r
+ + "-calendarpanel-day";\r
+\r
+ String title = "";\r
+ curr.setDate(dayCount);\r
+\r
+ if (entrySource != null) {\r
+ final List entries = entrySource.getEntries(curr,\r
+ VDateField.RESOLUTION_DAY);\r
+ if (entries != null) {\r
+ for (final Iterator it = entries.iterator(); it\r
+ .hasNext();) {\r
+ final CalendarEntry entry = (CalendarEntry) it\r
+ .next();\r
+ title += (title.length() > 0 ? ", " : "")\r
+ + entry.getStringForDate(curr);\r
}\r
}\r
- final String baseclass = VDateField.CLASSNAME\r
- + "-calendarpanel-day";\r
- String cssClass = baseclass;\r
- if (!isEnabledDate(curr)) {\r
- cssClass += " " + baseclass + "-disabled";\r
- }\r
- if (selected\r
- && datefield.getShowingDate().getDate() == dayCount) {\r
- cssClass += " " + baseclass + "-selected";\r
- }\r
- if (today.getDate() == dayCount\r
- && today.getMonth() == datefield\r
- .getShowingDate().getMonth()\r
- && today.getYear() == datefield\r
- .getShowingDate().getYear()) {\r
- cssClass += " " + baseclass + "-today";\r
- }\r
- if (title.length() > 0) {\r
- cssClass += " " + baseclass + "-entry";\r
- }\r
- days.setHTML(row, col, "<span title=\"" + title\r
- + "\" class=\"" + cssClass + "\">"\r
- + selectedDate + "</span>");\r
- } else {\r
- break;\r
}\r
\r
+ // Add CSS classes according to state\r
+ String cssClass = baseclass;\r
+\r
+ if (!isEnabledDate(curr)) {\r
+ cssClass += " " + baseclass + "-disabled";\r
+ }\r
+\r
+ if (dayOfMonthSelected == dayOfMonth) {\r
+ cssClass += " " + baseclass + "-selected";\r
+ }\r
+\r
+ if (dayOfMonthToday == dayOfMonth) {\r
+ cssClass += " " + baseclass + "-today";\r
+ }\r
+ if (title.length() > 0) {\r
+ cssClass += " " + baseclass + "-entry";\r
+ }\r
+\r
+ // Actually write the day of month\r
+ days.setHTML(weekOfMonth, firstWeekdayColumn + dayOfWeek,\r
+ "<span title=\"" + title + "\" class=\"" + cssClass\r
+ + "\">" + dayOfMonth + "</span>");\r
+\r
+ // ISO week numbers if requested\r
+ if (!weekNumberProcessed[weekOfMonth]) {\r
+ days.getCellFormatter().setVisible(weekOfMonth,\r
+ weekColumn, showISOWeekNumbers);\r
+ if (showISOWeekNumbers) {\r
+ final String baseCssClass = VDateField.CLASSNAME\r
+ + "-calendarpanel-weeknumber";\r
+ String weekCssClass = baseCssClass;\r
+\r
+ int weekNumber = DateTimeService\r
+ .getISOWeekNumber(curr);\r
+\r
+ days.setHTML(weekOfMonth, 0, "<span class=\""\r
+ + weekCssClass + "\"" + ">" + weekNumber\r
+ + "</span>");\r
+ weekNumberProcessed[weekOfMonth] = true;\r
+ }\r
+\r
+ }\r
}\r
}\r
}\r
+\r
}\r
\r
private void buildTime(boolean forceRedraw) {\r