* now includes a stylename for each resolution: v-datefield-year, v-datefield-month, v-datefield-day, v-datefield-full
* popup-calendar has its own stylename plus the above resolution stylenames
VCalendarPanel DOM refactored to allow more advanced theming. Won't break any old themes, but will break Testing Tools backwards compatibility.
svn changeset:7771/svn branch:6.0
\r
private CalendarEntrySource entrySource;\r
\r
+ private FlexTable days = new FlexTable();\r
+\r
/* Needed to identify resolution changes */\r
private int resolution = VDateField.RESOLUTION_YEAR;\r
\r
datefield = parent;\r
setStyleName(VDateField.CLASSNAME + "-calendarpanel");\r
// buildCalendar(true);\r
- addTableListener(new DateClickListener(this));\r
+ days.addTableListener(new DateClickListener(this));\r
}\r
\r
public VCalendarPanel(VDateField parent, Date min, Date max) {\r
datefield = parent;\r
setStyleName(VDateField.CLASSNAME + "-calendarpanel");\r
- // buildCalendar(true);\r
- addTableListener(new DateClickListener(this));\r
+ days.addTableListener(new DateClickListener(this));\r
\r
}\r
\r
\r
private void clearCalendarBody(boolean remove) {\r
if (!remove) {\r
- for (int row = 2; row < 8; row++) {\r
+ for (int row = 1; row < 7; row++) {\r
for (int col = 0; col < 7; col++) {\r
- setHTML(row, col, " ");\r
+ days.setHTML(row, col, " ");\r
}\r
}\r
- } else if (getRowCount() > 2) {\r
- while (getRowCount() > 2) {\r
- removeRow(2);\r
- }\r
+ } else if (getRowCount() > 1) {\r
+ removeRow(1);\r
+ days.clear();\r
+\r
}\r
}\r
\r
private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) {\r
if (forceRedraw) {\r
- if (prevMonth == null) { // Only do once\r
+ if (prevMonth == null) {\r
+\r
+ getFlexCellFormatter().setStyleName(0, 0,\r
+ VDateField.CLASSNAME + "-calendarpanel-prevyear");\r
+ getFlexCellFormatter().setStyleName(0, 4,\r
+ VDateField.CLASSNAME + "-calendarpanel-nextyear");\r
+ getFlexCellFormatter().setStyleName(0, 3,\r
+ VDateField.CLASSNAME + "-calendarpanel-nextmonth");\r
+ getFlexCellFormatter().setStyleName(0, 1,\r
+ VDateField.CLASSNAME + "-calendarpanel-prevmonth");\r
+\r
+ getRowFormatter().addStyleName(0,\r
+ VDateField.CLASSNAME + "-calendarpanel-header");\r
+\r
prevYear = new VEventButton();\r
prevYear.setHTML("«");\r
prevYear.setStyleName("v-button-prevyear");\r
setWidget(0, 3, nextMonth);\r
setWidget(0, 1, prevMonth);\r
}\r
-\r
- getFlexCellFormatter().setColSpan(0, 2, 3);\r
- getRowFormatter().addStyleName(0,\r
- VDateField.CLASSNAME + "-calendarpanel-header");\r
} else if (!needsMonth) {\r
// Remove month traverse buttons\r
prevMonth.removeMouseListener(this);\r
prevMonth = null;\r
nextMonth = null;\r
}\r
-\r
- // Print weekday names\r
- final int firstDay = datefield.getDateTimeService()\r
- .getFirstDayOfWeek();\r
- for (int i = 0; i < 7; i++) {\r
- int day = i + firstDay;\r
- if (day > 6) {\r
- day = 0;\r
- }\r
- if (datefield.getCurrentResolution() > VDateField.RESOLUTION_MONTH) {\r
- setHTML(1, i, "<strong>"\r
- + datefield.getDateTimeService().getShortDay(day)\r
- + "</strong>");\r
- } else {\r
- setHTML(1, i, "");\r
- }\r
- }\r
}\r
\r
final String monthName = needsMonth ? datefield.getDateTimeService()\r
.getMonth(datefield.getShowingDate().getMonth()) : "";\r
final int year = datefield.getShowingDate().getYear() + 1900;\r
+ getFlexCellFormatter().setStyleName(0, 2,\r
+ VDateField.CLASSNAME + "-calendarpanel-month");\r
setHTML(0, 2, "<span class=\"" + VDateField.CLASSNAME\r
+ "-calendarpanel-month\">" + monthName + " " + year\r
+ "</span>");\r
}\r
\r
private void buildCalendarBody() {\r
+\r
+ setWidget(1, 0, days);\r
+ setCellPadding(0);\r
+ setCellSpacing(0);\r
+ getFlexCellFormatter().setColSpan(1, 0, 5);\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
+ VDateField.CLASSNAME + "-calendarpanel-weekdays");\r
+\r
+ // Print weekday names\r
+ final int firstDay = datefield.getDateTimeService().getFirstDayOfWeek();\r
+ for (int i = 0; i < 7; i++) {\r
+ int day = i + firstDay;\r
+ if (day > 6) {\r
+ day = 0;\r
+ }\r
+ if (datefield.getCurrentResolution() > VDateField.RESOLUTION_MONTH) {\r
+ days.setHTML(0, i, "<strong>"\r
+ + datefield.getDateTimeService().getShortDay(day)\r
+ + "</strong>");\r
+ } else {\r
+ days.setHTML(0, i, "");\r
+ }\r
+ }\r
+\r
// date actually selected?\r
Date currentDate = datefield.getCurrentDate();\r
Date showing = datefield.getShowingDate();\r
int dayCount = 0;\r
final Date today = new Date();\r
final Date curr = new Date(datefield.getShowingDate().getTime());\r
- for (int row = 2; row < 8; row++) {\r
+ for (int row = 1; row < 7; row++) {\r
for (int col = 0; col < 7; col++) {\r
- if (!(row == 2 && col < startWeekDay)) {\r
+ if (!(row == 1 && col < startWeekDay)) {\r
if (dayCount < numDays) {\r
final int selectedDate = ++dayCount;\r
String title = "";\r
if (title.length() > 0) {\r
cssClass += " " + baseclass + "-entry";\r
}\r
- setHTML(row, col, "<span title=\"" + title\r
+ days.setHTML(row, col, "<span title=\"" + title\r
+ "\" class=\"" + cssClass + "\">"\r
+ selectedDate + "</span>");\r
} else {\r
private void buildTime(boolean forceRedraw) {\r
if (time == null) {\r
time = new VTime(datefield);\r
- setText(8, 0, ""); // Add new row\r
- getFlexCellFormatter().setColSpan(8, 0, 7);\r
- setWidget(8, 0, time);\r
+ setWidget(2, 0, time);\r
+ getFlexCellFormatter().setColSpan(2, 0, 5);\r
+ getFlexCellFormatter().setStyleName(2, 0,\r
+ VDateField.CLASSNAME + "-calendarpanel-time");\r
}\r
time.updateTime(forceRedraw);\r
}\r
}\r
\r
public void onCellClicked(SourcesTableEvents sender, int row, int col) {\r
- if (sender != cal || row < 2 || row > 7\r
+ if (sender != cal.days || row < 1 || row > 6\r
|| !cal.datefield.isEnabled() || cal.datefield.isReadonly()) {\r
return;\r
}\r
\r
- final String text = cal.getText(row, col);\r
+ final String text = cal.days.getText(row, col);\r
if (text.equals(" ")) {\r
return;\r
}\r
public static final int RESOLUTION_SEC = 5;\r
public static final int RESOLUTION_MSEC = 6;\r
\r
+ static String resolutionToString(int res) {\r
+ if (res > RESOLUTION_DAY) {\r
+ return "full";\r
+ }\r
+ if (res == RESOLUTION_DAY) {\r
+ return "day";\r
+ }\r
+ if (res == RESOLUTION_MONTH) {\r
+ return "month";\r
+ }\r
+ return "year";\r
+ }\r
+\r
protected int currentResolution = RESOLUTION_YEAR;\r
\r
protected String currentLocale;\r
\r
currentResolution = newResolution;\r
\r
+ // Add stylename that indicates current resolution\r
+ setStyleName(CLASSNAME + " " + CLASSNAME + "-"\r
+ + resolutionToString(currentResolution));\r
+\r
final int year = uidl.getIntVariable("year");\r
final int month = (currentResolution >= RESOLUTION_MONTH) ? uidl\r
.getIntVariable("month") : -1;\r
@Override\r
public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
super.updateFromUIDL(uidl, client);\r
+ addStyleName(CLASSNAME + "-popupcalendar");\r
+ popup.setStyleName(VDateField.CLASSNAME + "-popup "\r
+ + VDateField.CLASSNAME + "-"\r
+ + resolutionToString(currentResolution));\r
if (date != null) {\r
calendar.updateCalendar();\r
}\r
\r
import java.util.Date;\r
\r
+import com.google.gwt.event.dom.client.BlurEvent;\r
+import com.google.gwt.event.dom.client.BlurHandler;\r
+import com.google.gwt.event.dom.client.ChangeEvent;\r
+import com.google.gwt.event.dom.client.ChangeHandler;\r
+import com.google.gwt.event.dom.client.FocusEvent;\r
+import com.google.gwt.event.dom.client.FocusHandler;\r
import com.google.gwt.i18n.client.DateTimeFormat;\r
import com.google.gwt.user.client.DOM;\r
-import com.google.gwt.user.client.ui.ChangeListener;\r
import com.google.gwt.user.client.ui.TextBox;\r
-import com.google.gwt.user.client.ui.Widget;\r
import com.vaadin.terminal.gwt.client.ApplicationConnection;\r
import com.vaadin.terminal.gwt.client.BrowserInfo;\r
import com.vaadin.terminal.gwt.client.ClientExceptionHandler;\r
import com.vaadin.terminal.gwt.client.UIDL;\r
\r
public class VTextualDate extends VDateField implements Paintable, Field,\r
- ChangeListener, ContainerResizedListener, Focusable {\r
+ ChangeHandler, ContainerResizedListener, Focusable {\r
\r
private static final String PARSE_ERROR_CLASSNAME = CLASSNAME\r
+ "-parseerror";\r
text.setStyleName(VTextField.CLASSNAME);\r
// add datefield spesific style name also\r
text.addStyleName(CLASSNAME + "-textfield");\r
- text.addChangeListener(this);\r
+ text.addChangeHandler(this);\r
+ text.addFocusHandler(new FocusHandler() {\r
+ public void onFocus(FocusEvent event) {\r
+ text.addStyleName(VTextField.CLASSNAME + "-"\r
+ + VTextField.CLASSNAME_FOCUS);\r
+ }\r
+ });\r
+ text.addBlurHandler(new BlurHandler() {\r
+ public void onBlur(BlurEvent event) {\r
+ text.removeStyleName(VTextField.CLASSNAME + "-"\r
+ + VTextField.CLASSNAME_FOCUS);\r
+ }\r
+ });\r
add(text);\r
}\r
\r
\r
}\r
\r
- public void onChange(Widget sender) {\r
- if (sender == text) {\r
- if (!text.getText().equals("")) {\r
- try {\r
- DateTimeFormat format = DateTimeFormat\r
- .getFormat(getFormatString());\r
- date = format.parse(text.getText());\r
- long stamp = date.getTime();\r
- if (stamp == 0) {\r
- // If date parsing fails in firefox the stamp will be 0\r
- date = null;\r
- addStyleName(PARSE_ERROR_CLASSNAME);\r
- } else {\r
- // remove possibly added invalid value indication\r
- removeStyleName(PARSE_ERROR_CLASSNAME);\r
- }\r
- } catch (final Exception e) {\r
- ClientExceptionHandler.displayError(e.getMessage());\r
-\r
- addStyleName(PARSE_ERROR_CLASSNAME);\r
- // this is a hack that may eventually be removed\r
- client.updateVariable(id, "lastInvalidDateString", text\r
- .getText(), false);\r
+ public void onChange(ChangeEvent event) {\r
+ if (!text.getText().equals("")) {\r
+ try {\r
+ DateTimeFormat format = DateTimeFormat\r
+ .getFormat(getFormatString());\r
+ date = format.parse(text.getText());\r
+ long stamp = date.getTime();\r
+ if (stamp == 0) {\r
+ // If date parsing fails in firefox the stamp will be 0\r
date = null;\r
+ addStyleName(PARSE_ERROR_CLASSNAME);\r
+ } else {\r
+ // remove possibly added invalid value indication\r
+ removeStyleName(PARSE_ERROR_CLASSNAME);\r
}\r
- } else {\r
+ } catch (final Exception e) {\r
+ ClientExceptionHandler.displayError(e.getMessage());\r
+\r
+ addStyleName(PARSE_ERROR_CLASSNAME);\r
+ // this is a hack that may eventually be removed\r
+ client.updateVariable(id, "lastInvalidDateString", text\r
+ .getText(), false);\r
date = null;\r
- // remove possibly added invalid value indication\r
- removeStyleName(PARSE_ERROR_CLASSNAME);\r
}\r
- // always send the date string\r
- client.updateVariable(id, "dateString", text.getText(), false);\r
+ } else {\r
+ date = null;\r
+ // remove possibly added invalid value indication\r
+ removeStyleName(PARSE_ERROR_CLASSNAME);\r
+ }\r
+ // always send the date string\r
+ client.updateVariable(id, "dateString", text.getText(), false);\r
\r
- if (date != null) {\r
- showingDate = new Date(date.getTime());\r
- }\r
+ if (date != null) {\r
+ showingDate = new Date(date.getTime());\r
+ }\r
\r
- // Update variables\r
- // (only the smallest defining resolution needs to be\r
- // immediate)\r
- client.updateVariable(id, "year",\r
- date != null ? date.getYear() + 1900 : -1,\r
- currentResolution == VDateField.RESOLUTION_YEAR\r
+ // Update variables\r
+ // (only the smallest defining resolution needs to be\r
+ // immediate)\r
+ client.updateVariable(id, "year", date != null ? date.getYear() + 1900\r
+ : -1, currentResolution == VDateField.RESOLUTION_YEAR\r
+ && immediate);\r
+ if (currentResolution >= VDateField.RESOLUTION_MONTH) {\r
+ client.updateVariable(id, "month",\r
+ date != null ? date.getMonth() + 1 : -1,\r
+ currentResolution == VDateField.RESOLUTION_MONTH\r
&& immediate);\r
- if (currentResolution >= VDateField.RESOLUTION_MONTH) {\r
- client.updateVariable(id, "month", date != null ? date\r
- .getMonth() + 1 : -1,\r
- currentResolution == VDateField.RESOLUTION_MONTH\r
- && immediate);\r
- }\r
- if (currentResolution >= VDateField.RESOLUTION_DAY) {\r
- client.updateVariable(id, "day", date != null ? date.getDate()\r
- : -1, currentResolution == VDateField.RESOLUTION_DAY\r
- && immediate);\r
- }\r
- if (currentResolution >= VDateField.RESOLUTION_HOUR) {\r
- client.updateVariable(id, "hour", date != null ? date\r
- .getHours() : -1,\r
- currentResolution == VDateField.RESOLUTION_HOUR\r
- && immediate);\r
- }\r
- if (currentResolution >= VDateField.RESOLUTION_MIN) {\r
- client.updateVariable(id, "min", date != null ? date\r
- .getMinutes() : -1,\r
- currentResolution == VDateField.RESOLUTION_MIN\r
- && immediate);\r
- }\r
- if (currentResolution >= VDateField.RESOLUTION_SEC) {\r
- client.updateVariable(id, "sec", date != null ? date\r
- .getSeconds() : -1,\r
- currentResolution == VDateField.RESOLUTION_SEC\r
- && immediate);\r
- }\r
- if (currentResolution == VDateField.RESOLUTION_MSEC) {\r
- client.updateVariable(id, "msec",\r
- date != null ? getMilliseconds() : -1, immediate);\r
- }\r
-\r
}\r
+ if (currentResolution >= VDateField.RESOLUTION_DAY) {\r
+ client\r
+ .updateVariable(id, "day", date != null ? date.getDate()\r
+ : -1,\r
+ currentResolution == VDateField.RESOLUTION_DAY\r
+ && immediate);\r
+ }\r
+ if (currentResolution >= VDateField.RESOLUTION_HOUR) {\r
+ client.updateVariable(id, "hour", date != null ? date.getHours()\r
+ : -1, currentResolution == VDateField.RESOLUTION_HOUR\r
+ && immediate);\r
+ }\r
+ if (currentResolution >= VDateField.RESOLUTION_MIN) {\r
+ client.updateVariable(id, "min", date != null ? date.getMinutes()\r
+ : -1, currentResolution == VDateField.RESOLUTION_MIN\r
+ && immediate);\r
+ }\r
+ if (currentResolution >= VDateField.RESOLUTION_SEC) {\r
+ client.updateVariable(id, "sec", date != null ? date.getSeconds()\r
+ : -1, currentResolution == VDateField.RESOLUTION_SEC\r
+ && immediate);\r
+ }\r
+ if (currentResolution == VDateField.RESOLUTION_MSEC) {\r
+ client.updateVariable(id, "msec", date != null ? getMilliseconds()\r
+ : -1, immediate);\r
+ }\r
+\r
}\r
\r
private String cleanFormat(String format) {\r