From: Marc Englund Date: Fri, 17 Aug 2007 08:30:54 +0000 (+0000) Subject: Refactoring, client classes moved to subpackages X-Git-Tag: 6.7.0.beta1~6088 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2303bcb5ac905ed15cd6c867550f3f2ef1c05b93;p=vaadin-framework.git Refactoring, client classes moved to subpackages svn changeset:2046/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java index 7a2c7a2136..ad3de9b975 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java @@ -8,7 +8,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.IComponent; import com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout; import com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar; import com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded; -import com.itmill.toolkit.terminal.gwt.client.ui.IEntryCalendar; +import com.itmill.toolkit.terminal.gwt.client.ui.ICalendar; import com.itmill.toolkit.terminal.gwt.client.ui.IForm; import com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout; import com.itmill.toolkit.terminal.gwt.client.ui.ILabel; @@ -113,9 +113,9 @@ public class DefaultWidgetFactory implements WidgetFactory { } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IDateFieldCalendar" .equals(className)) { return new IDateFieldCalendar(); - } else if ("com.itmill.toolkit.terminal.gwt.client.ui.IEntryCalendar" + } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendar" .equals(className)) { - return new IEntryCalendar(); + return new ICalendar(); } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate" .equals(className)) { return new ITextualDate(); @@ -210,7 +210,7 @@ public class DefaultWidgetFactory implements WidgetFactory { return "com.itmill.toolkit.terminal.gwt.client.ui.IPopupCalendar"; } } else if ("calendarfield".equals(tag)) { - return "com.itmill.toolkit.terminal.gwt.client.ui.IEntryCalendar"; + return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"; } else if ("slider".equals(tag)) { return "com.itmill.toolkit.terminal.gwt.client.ui.ISlider"; } else if ("form".equals(tag)) { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendar.java new file mode 100644 index 0000000000..23a5e7c677 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendar.java @@ -0,0 +1,164 @@ +package com.itmill.toolkit.terminal.gwt.client.ui; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; + +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.SourcesTableEvents; +import com.google.gwt.user.client.ui.TableListener; +import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; +import com.itmill.toolkit.terminal.gwt.client.DateTimeService; +import com.itmill.toolkit.terminal.gwt.client.UIDL; +import com.itmill.toolkit.terminal.gwt.client.ui.calendar.ICalendarEntry; +import com.itmill.toolkit.terminal.gwt.client.ui.datefield.ICalendarPanel; + +public class ICalendar extends IDateField { + + private ICalendarPanel calPanel; + + private FlexTable hourTable; + + private EntrySource entrySource; + + private TableListener ftListener = new HourTableListener(); + + private int realResolution = RESOLUTION_DAY; + + public ICalendar() { + super(); + setStyleName(CLASSNAME + "-entrycalendar"); + calPanel = new ICalendarPanel(this); + add(calPanel); + this.entrySource = new EntrySource(); + calPanel.setCalendarEntrySource(this.entrySource); + calPanel.addTableListener(new TableListener() { + public void onCellClicked(SourcesTableEvents sender, int row, + int cell) { + buildDayView(date); + } + }); + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + super.updateFromUIDL(uidl, client); + // We want to draw our own hour list + this.realResolution = currentResolution; + this.currentResolution = RESOLUTION_DAY; + if (uidl.hasAttribute("min")) { + String mins = uidl.getStringAttribute("min"); + long min = (mins != null ? Long.parseLong(mins) : 0); + String maxs = uidl.getStringAttribute("max"); + long max = (maxs != null ? Long.parseLong(maxs) : 0); + Date minDate = (min > 0 ? new Date(min) : null); + Date maxDate = (max > 0 ? new Date(max) : null); + calPanel.setLimits(minDate, maxDate); + } + for (Iterator cit = uidl.getChildIterator(); cit.hasNext();) { + UIDL child = (UIDL) cit.next(); + if (child.getTag().equals("items")) { + for (Iterator iit = child.getChildIterator(); iit.hasNext();) { + UIDL item = (UIDL) iit.next(); + this.entrySource.addItem(item); + } + break; + } + } + calPanel.updateCalendar(); + buildDayView(this.date); + } + + protected void buildDayView(Date date) { + boolean firstRender = false; + if (this.hourTable == null) { + hourTable = new FlexTable(); + firstRender = true; + hourTable.addTableListener(this.ftListener); + } + Date curr = new Date(date.getTime()); + for (int i = 0; i < 24; i++) { + curr.setHours(i); + String style = (i % 2 == 0 ? "even" : "odd"); + if (realResolution >= RESOLUTION_HOUR) { + if (this.date != null && this.date.getHours() == i) { + style = "selected"; + } + } + hourTable.getRowFormatter().setStyleName(i, + getStyleName() + "-row-" + style); + if (firstRender) { + String hstr = (i < 10 ? "0" : "") + i + ":00"; + if (this.dts.isTwelveHourClock()) { + String ampm = (i < 12 ? "am" : "pm"); + hstr = (i <= 12 ? i : i - 12) + ":00 " + ampm; + } + hourTable.setHTML(i, 0, "" + hstr + ""); + } + List entries = this.entrySource.getEntries(curr, + DateTimeService.RESOLUTION_HOUR); + if (entries != null) { + String text = ""; + for (Iterator it = entries.iterator(); it.hasNext();) { + String title = ((ICalendarEntry) it.next()).getTitle(); + text += (text == "" ? "" : ", ") + + (title != null ? title : "?"); + } + hourTable.setHTML(i, 1, "" + text + ""); + } + } + + this.calPanel.getFlexCellFormatter().setColSpan(8, 0, 7); + this.calPanel.setWidget(8, 0, hourTable); + } + + private class HourTableListener implements TableListener { + + public void onCellClicked(SourcesTableEvents sender, int row, int cell) { + if (realResolution < RESOLUTION_HOUR || date == null) { + return; + } + date.setHours(row); + client.updateVariable(id, "hour", row, immediate); + } + + } + + private class EntrySource implements ICalendarPanel.CalendarEntrySource { + + private HashMap items = new HashMap(); + + public void addItem(UIDL item) { + Integer id = new Integer(item.getIntAttribute("id")); + long start = Long.parseLong(item.getStringAttribute("start")); + Date startDate = new Date(start); + long end = Long.parseLong(item.getStringAttribute("end")); + Date endDate = (end > 0 && end != start ? new Date(end) : new Date( + start)); + String title = item.getStringAttribute("title"); + boolean notime = item.getBooleanAttribute("notime"); + if (items.containsKey(id)) { + items.remove(id); + } + items.put(id, new ICalendarEntry(startDate, endDate, title, notime)); + } + + public List getEntries(Date date, int resolution) { + ArrayList res = new ArrayList(); + for (Iterator it = this.items.values().iterator(); it.hasNext();) { + ICalendarEntry item = (ICalendarEntry) it.next(); + if (DateTimeService.isInRange(date, item.getStart(), item + .getEnd(), resolution)) { + res.add(item); + } + } + + return res; + } + + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java deleted file mode 100644 index 8f3dc8a480..0000000000 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java +++ /dev/null @@ -1,405 +0,0 @@ -package com.itmill.toolkit.terminal.gwt.client.ui; - -import java.util.Date; -import java.util.Iterator; -import java.util.List; - -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.Timer; -import com.google.gwt.user.client.ui.ClickListener; -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.MouseListener; -import com.google.gwt.user.client.ui.MouseListenerCollection; -import com.google.gwt.user.client.ui.SourcesMouseEvents; -import com.google.gwt.user.client.ui.SourcesTableEvents; -import com.google.gwt.user.client.ui.TableListener; -import com.google.gwt.user.client.ui.Widget; -import com.itmill.toolkit.terminal.gwt.client.DateTimeService; -import com.itmill.toolkit.terminal.gwt.client.LocaleService; -import com.itmill.toolkit.terminal.gwt.client.ui.calendar.ICalendarEntry; - -public class ICalendarPanel extends FlexTable implements MouseListener, - ClickListener { - - private IDateField datefield; - - private IEventButton prevYear; - private IEventButton nextYear; - private IEventButton prevMonth; - private IEventButton nextMonth; - - private ITime time; - - private Date minDate = null; - private Date maxDate = null; - - private CalendarEntrySource entrySource; - - /* Needed to identify resolution changes */ - private int resolution = IDateField.RESOLUTION_YEAR; - - /* Needed to identify locale changes */ - private String locale = LocaleService.getDefaultLocale(); - - public ICalendarPanel(IDateField parent) { - datefield = parent; - setStyleName(datefield.CLASSNAME + "-calendarpanel"); - // buildCalendar(true); - addTableListener(new DateClickListener(this)); - } - - public ICalendarPanel(IDateField parent, Date min, Date max) { - datefield = parent; - setStyleName(datefield.CLASSNAME + "-calendarpanel"); - // buildCalendar(true); - addTableListener(new DateClickListener(this)); - } - - private void buildCalendar(boolean forceRedraw) { - boolean needsMonth = datefield.currentResolution > IDateField.RESOLUTION_YEAR; - boolean needsBody = datefield.currentResolution >= IDateField.RESOLUTION_DAY; - boolean needsTime = datefield.currentResolution >= IDateField.RESOLUTION_HOUR; - buildCalendarHeader(forceRedraw, needsMonth); - clearCalendarBody(!needsBody); - if (needsBody) - buildCalendarBody(); - if (needsTime) - buildTime(forceRedraw); - else if (time != null) { - remove(time); - time = null; - } - } - - private void clearCalendarBody(boolean remove) { - if (!remove) { - for (int row = 2; row < 8; row++) { - for (int col = 0; col < 7; col++) { - setHTML(row, col, " "); - } - } - } else if (getRowCount() > 2) { - while (getRowCount() > 2) - removeRow(2); - } - } - - private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) { - // Can't draw a calendar without a date :) - if (datefield.date == null) - datefield.date = new Date(); - - if (forceRedraw) { - if (prevMonth == null) { // Only do once - prevYear = new IEventButton(); - prevYear.setHTML("«"); - nextYear = new IEventButton(); - nextYear.setHTML("»"); - prevYear.addMouseListener(this); - nextYear.addMouseListener(this); - prevYear.addClickListener(this); - nextYear.addClickListener(this); - setWidget(0, 0, prevYear); - setWidget(0, 4, nextYear); - - if (needsMonth) { - prevMonth = new IEventButton(); - prevMonth.setHTML("‹"); - nextMonth = new IEventButton(); - nextMonth.setHTML("›"); - prevMonth.addMouseListener(this); - nextMonth.addMouseListener(this); - prevMonth.addClickListener(this); - nextMonth.addClickListener(this); - setWidget(0, 3, nextMonth); - setWidget(0, 1, prevMonth); - } - - getFlexCellFormatter().setColSpan(0, 2, 3); - } else if (!needsMonth) { - // Remove month traverse buttons - prevMonth.removeClickListener(this); - prevMonth.removeMouseListener(this); - nextMonth.removeClickListener(this); - nextMonth.removeMouseListener(this); - remove(prevMonth); - remove(nextMonth); - prevMonth = null; - nextMonth = null; - } - - // Print weekday names - int firstDay = datefield.dts.getFirstDayOfWeek(); - for (int i = 0; i < 7; i++) { - int day = i + firstDay; - if (day > 6) - day = 0; - if (datefield.currentResolution > IDateField.RESOLUTION_MONTH) - setHTML(1, i, "" + datefield.dts.getShortDay(day) - + ""); - else - setHTML(1, i, ""); - } - } - - String monthName = needsMonth ? datefield.dts.getMonth(datefield.date - .getMonth()) : ""; - int year = datefield.date.getYear() + 1900; - setHTML(0, 2, "" + monthName + " " + year - + ""); - } - - private void buildCalendarBody() { - Date date = datefield.date; - if (date == null) - date = new Date(); - int startWeekDay = datefield.dts.getStartWeekDay(date); - int numDays = DateTimeService.getNumberOfDaysInMonth(date); - int dayCount = 0; - Date today = new Date(); - Date curr = new Date(date.getTime()); - for (int row = 2; row < 8; row++) { - for (int col = 0; col < 7; col++) { - if (!(row == 2 && col < startWeekDay)) { - if (dayCount < numDays) { - int selectedDate = ++dayCount; - String title = ""; - if (this.entrySource != null) { - curr.setDate(dayCount); - List entries = this.entrySource - .getEntries(curr,IDateField.RESOLUTION_DAY); - if (entries != null) { - for (Iterator it = entries.iterator(); it.hasNext();) { - ICalendarEntry entry = (ICalendarEntry)it.next(); - title += (title.length() > 0 ? "\n" : "") + entry.getStringForDate(curr); - } - } - } - String baseclass = datefield.CLASSNAME - + "-calendarpanel-day"; - String cssClass = baseclass; - if (!isEnabledDate(curr)) { - cssClass += " " + baseclass + "-disabled"; - } - if (date.getDate() == dayCount) { - cssClass += " " + baseclass + "-selected"; - } - if (today.getDate() == dayCount - && today.getMonth() == date.getMonth() - && today.getYear() == date.getYear()) { - cssClass += " " + baseclass + "-today"; - } - if (title.length() > 0) - cssClass += " " + baseclass + "-entry"; - setHTML(row, col, "" - + selectedDate + ""); - } else { - break; - } - - } - } - } - } - - private void buildTime(boolean forceRedraw) { - if (time == null) { - time = new ITime(datefield); - setText(8, 0, ""); // Add new row - getFlexCellFormatter().setColSpan(8, 0, 7); - setWidget(8, 0, time); - } - time.updateTime(forceRedraw); - } - - /** - * - * @param forceRedraw - * Build all from scratch, in case of e.g. locale changes - */ - public void updateCalendar() { - // Locale and resolution changes force a complete redraw - buildCalendar(locale != datefield.currentLocale - || resolution != datefield.currentResolution); - if (datefield instanceof ITextualDate) - ((ITextualDate) datefield).buildDate(); - locale = datefield.currentLocale; - resolution = datefield.currentResolution; - } - - public void onClick(Widget sender) { - processClickEvent(sender); - } - - private boolean isEnabledDate(Date date) { - if ((this.minDate != null && date.before(this.minDate)) - || (this.maxDate != null && date.after(this.maxDate))) { - return false; - } - return true; - } - - private void processClickEvent(Widget sender) { - if (!datefield.enabled || datefield.readonly) - return; - - if (sender == prevYear) { - datefield.date.setYear(datefield.date.getYear() - 1); - datefield.client.updateVariable(datefield.id, "year", - datefield.date.getYear() + 1900, datefield.immediate); - updateCalendar(); - } else if (sender == nextYear) { - datefield.date.setYear(datefield.date.getYear() + 1); - datefield.client.updateVariable(datefield.id, "year", - datefield.date.getYear() + 1900, datefield.immediate); - updateCalendar(); - } else if (sender == prevMonth) { - datefield.date.setMonth(datefield.date.getMonth() - 1); - datefield.client.updateVariable(datefield.id, "month", - datefield.date.getMonth() + 1, datefield.immediate); - updateCalendar(); - } else if (sender == nextMonth) { - datefield.date.setMonth(datefield.date.getMonth() + 1); - datefield.client.updateVariable(datefield.id, "month", - datefield.date.getMonth() + 1, datefield.immediate); - updateCalendar(); - } - } - - private Timer timer; - - public void onMouseDown(final Widget sender, int x, int y) { - if (sender instanceof IEventButton) { - timer = new Timer() { - public void run() { - processClickEvent(sender); - } - }; - timer.scheduleRepeating(100); - } - } - - public void onMouseEnter(Widget sender) { - } - - public void onMouseLeave(Widget sender) { - if (timer != null) - timer.cancel(); - } - - public void onMouseMove(Widget sender, int x, int y) { - } - - public void onMouseUp(Widget sender, int x, int y) { - if (timer != null) - timer.cancel(); - } - - private class IEventButton extends IButton implements SourcesMouseEvents { - - private MouseListenerCollection mouseListeners; - - public IEventButton() { - super(); - sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK - | Event.MOUSEEVENTS); - } - - public void addMouseListener(MouseListener listener) { - if (mouseListeners == null) { - mouseListeners = new MouseListenerCollection(); - } - mouseListeners.add(listener); - } - - public void removeMouseListener(MouseListener listener) { - if (mouseListeners != null) - mouseListeners.remove(listener); - } - - public void onBrowserEvent(Event event) { - super.onBrowserEvent(event); - switch (DOM.eventGetType(event)) { - case Event.ONMOUSEDOWN: - case Event.ONMOUSEUP: - case Event.ONMOUSEMOVE: - case Event.ONMOUSEOVER: - case Event.ONMOUSEOUT: - if (mouseListeners != null) { - mouseListeners.fireMouseEvent(this, event); - } - break; - } - } - } - - private class DateClickListener implements TableListener { - - private ICalendarPanel cal; - - public DateClickListener(ICalendarPanel panel) { - cal = panel; - } - - public void onCellClicked(SourcesTableEvents sender, int row, int col) { - if (sender != cal || row < 2 || row > 7 || !cal.datefield.enabled - || cal.datefield.readonly) - return; - - String text = cal.getText(row, col); - if (text.equals(" ")) - return; - - Integer day = new Integer(text); - - Date newDate = new Date(cal.datefield.date.getTime()); - newDate.setDate(day.intValue()); - if (!isEnabledDate(newDate)) { - return; - } - cal.datefield.date.setTime(newDate.getTime()); - cal.datefield.client.updateVariable(cal.datefield.id, "day", - cal.datefield.date.getDate(), cal.datefield.immediate); - - updateCalendar(); - } - - } - - public void setLimits(Date min, Date max) { - if (min != null ) { - Date d = new Date(min.getTime()); - d.setHours(0); - d.setMinutes(0); - d.setSeconds(1); - this.minDate = d; - } else { - this.minDate = null; - } - if (max != null) { - Date d = new Date(max.getTime()); - d.setHours(24); - d.setMinutes(59); - d.setSeconds(59); - this.maxDate = d; - }else { - this.maxDate = null; - } - } - - public void setCalendarEntrySource(CalendarEntrySource entrySource) { - this.entrySource = entrySource; - } - - public CalendarEntrySource getCalendarEntrySource() { - return this.entrySource; - } - - public interface CalendarEntrySource { - public List getEntries(Date date, int resolution); - } - -} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java index fbed7063b1..43c17e0a54 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java @@ -19,13 +19,14 @@ public class IDateField extends FlowPanel implements Paintable { protected boolean immediate; - static int RESOLUTION_YEAR = 0; - static int RESOLUTION_MONTH = 1; - static int RESOLUTION_DAY = 2; - static int RESOLUTION_HOUR = 3; - static int RESOLUTION_MIN = 4; - static int RESOLUTION_SEC = 5; - static int RESOLUTION_MSEC = 6; + public static int RESOLUTION_YEAR = 0; + public static int RESOLUTION_MONTH = 1; + public static int RESOLUTION_DAY = 2; + public static int RESOLUTION_HOUR = 3; + public static int RESOLUTION_MIN = 4; + public static int RESOLUTION_SEC = 5; + public static int RESOLUTION_MSEC = 6; + protected int currentResolution = RESOLUTION_YEAR; protected String currentLocale; @@ -130,4 +131,51 @@ public class IDateField extends FlowPanel implements Paintable { date.setTime(date.getTime() / 1000 * 1000 + ms); } + public int getCurrentResolution() { + return currentResolution; + } + + public void setCurrentResolution(int currentResolution) { + this.currentResolution = currentResolution; + } + + public String getCurrentLocale() { + return currentLocale; + } + + public void setCurrentLocale(String currentLocale) { + this.currentLocale = currentLocale; + } + + public Date getCurrentDate() { + return date; + } + + public void setCurrentDate(Date date) { + this.date = date; + } + + public boolean isImmediate() { + return immediate; + } + + public boolean isReadonly() { + return readonly; + } + + public boolean isEnabled() { + return enabled; + } + + public DateTimeService getDateTimeService() { + return dts; + } + + public String getId() { + return id; + } + + public ApplicationConnection getClient() { + return client; + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateFieldCalendar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateFieldCalendar.java index 150f96c504..949ab1d967 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateFieldCalendar.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IDateFieldCalendar.java @@ -2,6 +2,7 @@ package com.itmill.toolkit.terminal.gwt.client.ui; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.UIDL; +import com.itmill.toolkit.terminal.gwt.client.ui.datefield.ICalendarPanel; public class IDateFieldCalendar extends IDateField { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IEntryCalendar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IEntryCalendar.java deleted file mode 100644 index 6119e8f5d0..0000000000 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IEntryCalendar.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.itmill.toolkit.terminal.gwt.client.ui; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; - -import com.google.gwt.user.client.ui.FlexTable; -import com.google.gwt.user.client.ui.SourcesTableEvents; -import com.google.gwt.user.client.ui.TableListener; -import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; -import com.itmill.toolkit.terminal.gwt.client.DateTimeService; -import com.itmill.toolkit.terminal.gwt.client.UIDL; -import com.itmill.toolkit.terminal.gwt.client.ui.calendar.ICalendarEntry; - -public class IEntryCalendar extends IDateField { - - private ICalendarPanel calPanel; - - private FlexTable hourTable; - - private EntrySource entrySource; - - private TableListener ftListener = new HourTableListener(); - - private int realResolution = RESOLUTION_DAY; - - public IEntryCalendar() { - super(); - setStyleName(CLASSNAME + "-entrycalendar"); - calPanel = new ICalendarPanel(this); - add(calPanel); - this.entrySource = new EntrySource(); - calPanel.setCalendarEntrySource(this.entrySource); - calPanel.addTableListener(new TableListener() { - public void onCellClicked(SourcesTableEvents sender, int row, - int cell) { - buildDayView(date); - } - }); - } - - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - super.updateFromUIDL(uidl, client); - // We want to draw our own hour list - this.realResolution = currentResolution; - this.currentResolution = RESOLUTION_DAY; - if (uidl.hasAttribute("min")) { - String mins = uidl.getStringAttribute("min"); - long min = (mins != null ? Long.parseLong(mins) : 0); - String maxs = uidl.getStringAttribute("max"); - long max = (maxs != null ? Long.parseLong(maxs) : 0); - Date minDate = (min > 0 ? new Date(min) : null); - Date maxDate = (max > 0 ? new Date(max) : null); - calPanel.setLimits(minDate, maxDate); - } - for (Iterator cit = uidl.getChildIterator(); cit.hasNext();) { - UIDL child = (UIDL) cit.next(); - if (child.getTag().equals("items")) { - for (Iterator iit = child.getChildIterator(); iit.hasNext();) { - UIDL item = (UIDL) iit.next(); - this.entrySource.addItem(item); - } - break; - } - } - calPanel.updateCalendar(); - buildDayView(this.date); - } - - protected void buildDayView(Date date) { - boolean firstRender = false; - if (this.hourTable == null) { - hourTable = new FlexTable(); - firstRender = true; - hourTable.addTableListener(this.ftListener); - } - Date curr = new Date(date.getTime()); - for (int i = 0; i < 24; i++) { - curr.setHours(i); - String style = (i % 2 == 0 ? "even" : "odd"); - if (realResolution >= RESOLUTION_HOUR) { - if (this.date != null && this.date.getHours() == i) { - style = "selected"; - } - } - hourTable.getRowFormatter().setStyleName(i, - getStyleName() + "-row-" + style); - if (firstRender) { - String hstr = (i < 10 ? "0" : "") + i + ":00"; - if (this.dts.isTwelveHourClock()) { - String ampm = (i < 12 ? "am" : "pm"); - hstr = (i <= 12 ? i : i - 12) + ":00 " + ampm; - } - hourTable.setHTML(i, 0, "" + hstr + ""); - } - List entries = this.entrySource.getEntries(curr, - DateTimeService.RESOLUTION_HOUR); - if (entries != null) { - String text = ""; - for (Iterator it = entries.iterator(); it.hasNext();) { - String title = ((ICalendarEntry) it.next()).getTitle(); - text += (text == "" ? "" : ", ") - + (title != null ? title : "?"); - } - hourTable.setHTML(i, 1, "" + text + ""); - } - } - - this.calPanel.getFlexCellFormatter().setColSpan(8, 0, 7); - this.calPanel.setWidget(8, 0, hourTable); - } - - private class HourTableListener implements TableListener { - - public void onCellClicked(SourcesTableEvents sender, int row, int cell) { - if (realResolution < RESOLUTION_HOUR || date == null) { - return; - } - date.setHours(row); - client.updateVariable(id, "hour", row, immediate); - } - - } - - private class EntrySource implements ICalendarPanel.CalendarEntrySource { - - private HashMap items = new HashMap(); - - public void addItem(UIDL item) { - Integer id = new Integer(item.getIntAttribute("id")); - long start = Long.parseLong(item.getStringAttribute("start")); - Date startDate = new Date(start); - long end = Long.parseLong(item.getStringAttribute("end")); - Date endDate = (end > 0 && end != start ? new Date(end) : new Date( - start)); - String title = item.getStringAttribute("title"); - boolean notime = item.getBooleanAttribute("notime"); - if (items.containsKey(id)) { - items.remove(id); - } - items.put(id, new ICalendarEntry(startDate, endDate, title, notime)); - } - - public List getEntries(Date date, int resolution) { - ArrayList res = new ArrayList(); - for (Iterator it = this.items.values().iterator(); it.hasNext();) { - ICalendarEntry item = (ICalendarEntry) it.next(); - if (DateTimeService.isInRange(date, item.getStart(), item - .getEnd(), resolution)) { - res.add(item); - } - } - - return res; - } - - } - -} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java index b4343225e3..acf4ea0827 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java @@ -7,6 +7,7 @@ import com.google.gwt.user.client.ui.Widget; import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection; import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; +import com.itmill.toolkit.terminal.gwt.client.ui.datefield.ICalendarPanel; public class IPopupCalendar extends ITextualDate implements Paintable, ClickListener, PopupListener { diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java index e929a86ff1..09b6dd5351 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java @@ -30,7 +30,7 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene buildDate(); } - protected void buildDate() { + public void buildDate() { dl = new DateLocale(); DateLocale.setLocale(currentLocale); diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java deleted file mode 100644 index 09ea351a0e..0000000000 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java +++ /dev/null @@ -1,230 +0,0 @@ -package com.itmill.toolkit.terminal.gwt.client.ui; - -import com.google.gwt.user.client.ui.ChangeListener; -import com.google.gwt.user.client.ui.FlowPanel; -import com.google.gwt.user.client.ui.ListBox; -import com.google.gwt.user.client.ui.Widget; - -public class ITime extends FlowPanel implements ChangeListener { - - private IDateField datefield; - - private ListBox hours; - - private ListBox mins; - - private ListBox sec; - - private ListBox msec; - - private ListBox ampm; - - private int resolution = IDateField.RESOLUTION_HOUR; - - private boolean readonly; - - public ITime(IDateField parent) { - super(); - datefield = parent; - setStyleName(IDateField.CLASSNAME+"-time"); - } - - private void buildTime(boolean redraw) { - boolean thc = datefield.dts.isTwelveHourClock(); - if(redraw) { - clear(); - int numHours = thc?12:24; - hours = new ListBox(); - hours.setStyleName(ISelect.CLASSNAME); - for(int i=0; i= IDateField.RESOLUTION_MIN) { - mins = new ListBox(); - mins.setStyleName(ISelect.CLASSNAME); - for(int i=0; i<60; i++) - mins.addItem((i<10)?"0"+i:""+i); - mins.addChangeListener(this); - } - if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) { - sec = new ListBox(); - sec.setStyleName(ISelect.CLASSNAME); - for(int i=0; i<60; i++) - sec.addItem((i<10)?"0"+i:""+i); - sec.addChangeListener(this); - } - if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) { - msec = new ListBox(); - msec.setStyleName(ISelect.CLASSNAME); - for(int i=0; i<1000; i++) { - if(i<10) - msec.addItem("00"+i); - else if(i<100) - msec.addItem("0"+i); - else msec.addItem(""+i); - } - msec.addChangeListener(this); - } - - String delimiter = datefield.dts.getClockDelimeter(); - boolean ro = datefield.readonly; - - if(ro) { - int h = 0; - if(datefield.date != null) - h = datefield.date.getHours(); - if(thc) h -= h<12? 0 : 12; - add(new ILabel(h<10? "0"+h : ""+h)); - } else add(hours); - - if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) { - add(new ILabel(delimiter)); - if(ro) { - int m = mins.getSelectedIndex(); - add(new ILabel(m<10? "0"+m : ""+m)); - } - else add(mins); - } - if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) { - add(new ILabel(delimiter)); - if(ro) { - int s = sec.getSelectedIndex(); - add(new ILabel(s<10? "0"+s : ""+s)); - } - else add(sec); - } - if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) { - add(new ILabel(".")); - if(ro) { - int m = datefield.getMilliseconds(); - String ms = m<100? "0"+m : ""+m; - add(new ILabel(m<10? "0"+ms : ms)); - } - else add(msec); - } - if(datefield.currentResolution == IDateField.RESOLUTION_HOUR) { - add(new ILabel(delimiter+"00")); // o'clock - } - if(thc) { - add(new ILabel(" ")); - if(ro) add(new ILabel(ampm.getItemText(datefield.date.getHours()<12? 0 : 1))); - else add(ampm); - } - - if(ro) return; - } - - // Update times - if(thc) { - int h = datefield.date.getHours(); - ampm.setSelectedIndex(h<12? 0 : 1); - h -= ampm.getSelectedIndex()*12; - hours.setSelectedIndex(h); - } else - hours.setSelectedIndex(datefield.date.getHours()); - if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) - mins.setSelectedIndex(datefield.date.getMinutes()); - if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) - sec.setSelectedIndex(datefield.date.getSeconds()); - if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) - msec.setSelectedIndex(datefield.getMilliseconds()); - if(thc) - ampm.setSelectedIndex(datefield.date.getHours()<12?0:1); - - if(datefield.readonly && !redraw) { - // Do complete redraw when in read-only status - clear(); - String delimiter = datefield.dts.getClockDelimeter(); - - int h = datefield.date.getHours(); - if(thc) h -= h<12? 0 : 12; - add(new ILabel(h<10? "0"+h : ""+h)); - - if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) { - add(new ILabel(delimiter)); - int m = mins.getSelectedIndex(); - add(new ILabel(m<10? "0"+m : ""+m)); - } - if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) { - add(new ILabel(delimiter)); - int s = sec.getSelectedIndex(); - add(new ILabel(s<10? "0"+s : ""+s)); - } - if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) { - add(new ILabel(".")); - int m = datefield.getMilliseconds(); - String ms = m<100? "0"+m : ""+m; - add(new ILabel(m<10? "0"+ms : ms)); - } - if(datefield.currentResolution == IDateField.RESOLUTION_HOUR) { - add(new ILabel(delimiter+"00")); // o'clock - } - if(thc) { - add(new ILabel(" ")); - add(new ILabel(ampm.getItemText(datefield.date.getHours()<12? 0 : 1))); - } - } - - boolean enabled = datefield.enabled; - hours.setEnabled(enabled); - if(mins != null) mins.setEnabled(enabled); - if(sec != null) sec.setEnabled(enabled); - if(msec != null) msec.setEnabled(enabled); - if(ampm != null) ampm.setEnabled(enabled); - - } - - public void updateTime(boolean redraw) { - buildTime(redraw || resolution != datefield.currentResolution - || readonly != datefield.readonly); - if(datefield instanceof ITextualDate) - ((ITextualDate) datefield).buildDate(); - resolution = datefield.currentResolution; - readonly = datefield.readonly; - } - - public void onChange(Widget sender) { - if(sender == hours) { - int h = hours.getSelectedIndex(); - if(datefield.dts.isTwelveHourClock()) - h = h + ampm.getSelectedIndex()*12; - datefield.date.setHours(h); - datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate); - updateTime(false); - } - else if(sender == mins) { - int m = mins.getSelectedIndex(); - datefield.date.setMinutes(m); - datefield.client.updateVariable(datefield.id, "min", m, datefield.immediate); - updateTime(false); - } - else if(sender == sec) { - int s = sec.getSelectedIndex(); - datefield.date.setSeconds(s); - datefield.client.updateVariable(datefield.id, "sec", s, datefield.immediate); - updateTime(false); - } - else if(sender == msec) { - int ms = msec.getSelectedIndex(); - datefield.setMilliseconds(ms); - datefield.client.updateVariable(datefield.id, "msec", ms, datefield.immediate); - updateTime(false); - } - else if(sender == ampm) { - int h = hours.getSelectedIndex() + ampm.getSelectedIndex()*12; - datefield.date.setHours(h); - datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate); - updateTime(false); - } - } - -} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ICalendarPanel.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ICalendarPanel.java new file mode 100644 index 0000000000..df4c32bcca --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ICalendarPanel.java @@ -0,0 +1,412 @@ +package com.itmill.toolkit.terminal.gwt.client.ui.datefield; + +import java.util.Date; +import java.util.Iterator; +import java.util.List; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.FlexTable; +import com.google.gwt.user.client.ui.MouseListener; +import com.google.gwt.user.client.ui.MouseListenerCollection; +import com.google.gwt.user.client.ui.SourcesMouseEvents; +import com.google.gwt.user.client.ui.SourcesTableEvents; +import com.google.gwt.user.client.ui.TableListener; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.DateTimeService; +import com.itmill.toolkit.terminal.gwt.client.LocaleService; +import com.itmill.toolkit.terminal.gwt.client.ui.IButton; +import com.itmill.toolkit.terminal.gwt.client.ui.IDateField; +import com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate; +import com.itmill.toolkit.terminal.gwt.client.ui.calendar.ICalendarEntry; + +public class ICalendarPanel extends FlexTable implements MouseListener, + ClickListener { + + private IDateField datefield; + + private IEventButton prevYear; + private IEventButton nextYear; + private IEventButton prevMonth; + private IEventButton nextMonth; + + private ITime time; + + private Date minDate = null; + private Date maxDate = null; + + private CalendarEntrySource entrySource; + + /* Needed to identify resolution changes */ + private int resolution = IDateField.RESOLUTION_YEAR; + + /* Needed to identify locale changes */ + private String locale = LocaleService.getDefaultLocale(); + + public ICalendarPanel(IDateField parent) { + datefield = parent; + setStyleName(datefield.CLASSNAME + "-calendarpanel"); + // buildCalendar(true); + addTableListener(new DateClickListener(this)); + } + + public ICalendarPanel(IDateField parent, Date min, Date max) { + datefield = parent; + setStyleName(datefield.CLASSNAME + "-calendarpanel"); + // buildCalendar(true); + addTableListener(new DateClickListener(this)); + } + + private void buildCalendar(boolean forceRedraw) { + boolean needsMonth = datefield.getCurrentResolution() > IDateField.RESOLUTION_YEAR; + boolean needsBody = datefield.getCurrentResolution() >= IDateField.RESOLUTION_DAY; + boolean needsTime = datefield.getCurrentResolution() >= IDateField.RESOLUTION_HOUR; + buildCalendarHeader(forceRedraw, needsMonth); + clearCalendarBody(!needsBody); + if (needsBody) + buildCalendarBody(); + if (needsTime) + buildTime(forceRedraw); + else if (time != null) { + remove(time); + time = null; + } + } + + private void clearCalendarBody(boolean remove) { + if (!remove) { + for (int row = 2; row < 8; row++) { + for (int col = 0; col < 7; col++) { + setHTML(row, col, " "); + } + } + } else if (getRowCount() > 2) { + while (getRowCount() > 2) + removeRow(2); + } + } + + private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) { + // Can't draw a calendar without a date :) + if (datefield.getCurrentDate() == null) + datefield.setCurrentDate(new Date()); + + if (forceRedraw) { + if (prevMonth == null) { // Only do once + prevYear = new IEventButton(); + prevYear.setHTML("«"); + nextYear = new IEventButton(); + nextYear.setHTML("»"); + prevYear.addMouseListener(this); + nextYear.addMouseListener(this); + prevYear.addClickListener(this); + nextYear.addClickListener(this); + setWidget(0, 0, prevYear); + setWidget(0, 4, nextYear); + + if (needsMonth) { + prevMonth = new IEventButton(); + prevMonth.setHTML("‹"); + nextMonth = new IEventButton(); + nextMonth.setHTML("›"); + prevMonth.addMouseListener(this); + nextMonth.addMouseListener(this); + prevMonth.addClickListener(this); + nextMonth.addClickListener(this); + setWidget(0, 3, nextMonth); + setWidget(0, 1, prevMonth); + } + + getFlexCellFormatter().setColSpan(0, 2, 3); + } else if (!needsMonth) { + // Remove month traverse buttons + prevMonth.removeClickListener(this); + prevMonth.removeMouseListener(this); + nextMonth.removeClickListener(this); + nextMonth.removeMouseListener(this); + remove(prevMonth); + remove(nextMonth); + prevMonth = null; + nextMonth = null; + } + + // Print weekday names + int firstDay = datefield.getDateTimeService().getFirstDayOfWeek(); + for (int i = 0; i < 7; i++) { + int day = i + firstDay; + if (day > 6) + day = 0; + if (datefield.getCurrentResolution() > IDateField.RESOLUTION_MONTH) + setHTML(1, i, "" + + datefield.getDateTimeService().getShortDay(day) + + ""); + else + setHTML(1, i, ""); + } + } + + String monthName = needsMonth ? datefield.getDateTimeService() + .getMonth(datefield.getCurrentDate().getMonth()) : ""; + int year = datefield.getCurrentDate().getYear() + 1900; + setHTML(0, 2, "" + monthName + " " + year + + ""); + } + + private void buildCalendarBody() { + Date date = datefield.getCurrentDate(); + if (date == null) + date = new Date(); + int startWeekDay = datefield.getDateTimeService().getStartWeekDay(date); + int numDays = DateTimeService.getNumberOfDaysInMonth(date); + int dayCount = 0; + Date today = new Date(); + Date curr = new Date(date.getTime()); + for (int row = 2; row < 8; row++) { + for (int col = 0; col < 7; col++) { + if (!(row == 2 && col < startWeekDay)) { + if (dayCount < numDays) { + int selectedDate = ++dayCount; + String title = ""; + if (this.entrySource != null) { + curr.setDate(dayCount); + List entries = this.entrySource.getEntries(curr, + IDateField.RESOLUTION_DAY); + if (entries != null) { + for (Iterator it = entries.iterator(); it + .hasNext();) { + ICalendarEntry entry = (ICalendarEntry) it + .next(); + title += (title.length() > 0 ? "\n" : "") + + entry.getStringForDate(curr); + } + } + } + String baseclass = datefield.CLASSNAME + + "-calendarpanel-day"; + String cssClass = baseclass; + if (!isEnabledDate(curr)) { + cssClass += " " + baseclass + "-disabled"; + } + if (date.getDate() == dayCount) { + cssClass += " " + baseclass + "-selected"; + } + if (today.getDate() == dayCount + && today.getMonth() == date.getMonth() + && today.getYear() == date.getYear()) { + cssClass += " " + baseclass + "-today"; + } + if (title.length() > 0) + cssClass += " " + baseclass + "-entry"; + setHTML(row, col, "" + + selectedDate + ""); + } else { + break; + } + + } + } + } + } + + private void buildTime(boolean forceRedraw) { + if (time == null) { + time = new ITime(datefield); + setText(8, 0, ""); // Add new row + getFlexCellFormatter().setColSpan(8, 0, 7); + setWidget(8, 0, time); + } + time.updateTime(forceRedraw); + } + + /** + * + * @param forceRedraw + * Build all from scratch, in case of e.g. locale changes + */ + public void updateCalendar() { + // Locale and resolution changes force a complete redraw + buildCalendar(locale != datefield.getCurrentLocale() + || resolution != datefield.getCurrentResolution()); + if (datefield instanceof ITextualDate) + ((ITextualDate) datefield).buildDate(); + locale = datefield.getCurrentLocale(); + resolution = datefield.getCurrentResolution(); + } + + public void onClick(Widget sender) { + processClickEvent(sender); + } + + private boolean isEnabledDate(Date date) { + if ((this.minDate != null && date.before(this.minDate)) + || (this.maxDate != null && date.after(this.maxDate))) { + return false; + } + return true; + } + + private void processClickEvent(Widget sender) { + if (!datefield.isEnabled() || datefield.isReadonly()) + return; + + if (sender == prevYear) { + datefield.getCurrentDate().setYear(datefield.getCurrentDate().getYear() - 1); + datefield.getClient().updateVariable(datefield.getId(), "year", + datefield.getCurrentDate().getYear() + 1900, datefield.isImmediate()); + updateCalendar(); + } else if (sender == nextYear) { + datefield.getCurrentDate().setYear(datefield.getCurrentDate().getYear() + 1); + datefield.getClient().updateVariable(datefield.getId(), "year", + datefield.getCurrentDate().getYear() + 1900, datefield.isImmediate()); + updateCalendar(); + } else if (sender == prevMonth) { + datefield.getCurrentDate().setMonth(datefield.getCurrentDate().getMonth() - 1); + datefield.getClient().updateVariable(datefield.getId(), "month", + datefield.getCurrentDate().getMonth() + 1, datefield.isImmediate()); + updateCalendar(); + } else if (sender == nextMonth) { + datefield.getCurrentDate().setMonth(datefield.getCurrentDate().getMonth() + 1); + datefield.getClient().updateVariable(datefield.getId(), "month", + datefield.getCurrentDate().getMonth() + 1, datefield.isImmediate()); + updateCalendar(); + } + } + + private Timer timer; + + public void onMouseDown(final Widget sender, int x, int y) { + if (sender instanceof IEventButton) { + timer = new Timer() { + public void run() { + processClickEvent(sender); + } + }; + timer.scheduleRepeating(100); + } + } + + public void onMouseEnter(Widget sender) { + } + + public void onMouseLeave(Widget sender) { + if (timer != null) + timer.cancel(); + } + + public void onMouseMove(Widget sender, int x, int y) { + } + + public void onMouseUp(Widget sender, int x, int y) { + if (timer != null) + timer.cancel(); + } + + private class IEventButton extends IButton implements SourcesMouseEvents { + + private MouseListenerCollection mouseListeners; + + public IEventButton() { + super(); + sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK + | Event.MOUSEEVENTS); + } + + public void addMouseListener(MouseListener listener) { + if (mouseListeners == null) { + mouseListeners = new MouseListenerCollection(); + } + mouseListeners.add(listener); + } + + public void removeMouseListener(MouseListener listener) { + if (mouseListeners != null) + mouseListeners.remove(listener); + } + + public void onBrowserEvent(Event event) { + super.onBrowserEvent(event); + switch (DOM.eventGetType(event)) { + case Event.ONMOUSEDOWN: + case Event.ONMOUSEUP: + case Event.ONMOUSEMOVE: + case Event.ONMOUSEOVER: + case Event.ONMOUSEOUT: + if (mouseListeners != null) { + mouseListeners.fireMouseEvent(this, event); + } + break; + } + } + } + + private class DateClickListener implements TableListener { + + private ICalendarPanel cal; + + public DateClickListener(ICalendarPanel panel) { + cal = panel; + } + + public void onCellClicked(SourcesTableEvents sender, int row, int col) { + if (sender != cal || row < 2 || row > 7 || !cal.datefield.isEnabled() + || cal.datefield.isReadonly()) + return; + + String text = cal.getText(row, col); + if (text.equals(" ")) + return; + + Integer day = new Integer(text); + + Date newDate = new Date(cal.datefield.getCurrentDate().getTime()); + newDate.setDate(day.intValue()); + if (!isEnabledDate(newDate)) { + return; + } + cal.datefield.getCurrentDate().setTime(newDate.getTime()); + cal.datefield.getClient().updateVariable(cal.datefield.getId(), "day", + cal.datefield.getCurrentDate().getDate(), cal.datefield.isImmediate()); + + updateCalendar(); + } + + } + + public void setLimits(Date min, Date max) { + if (min != null) { + Date d = new Date(min.getTime()); + d.setHours(0); + d.setMinutes(0); + d.setSeconds(1); + this.minDate = d; + } else { + this.minDate = null; + } + if (max != null) { + Date d = new Date(max.getTime()); + d.setHours(24); + d.setMinutes(59); + d.setSeconds(59); + this.maxDate = d; + } else { + this.maxDate = null; + } + } + + public void setCalendarEntrySource(CalendarEntrySource entrySource) { + this.entrySource = entrySource; + } + + public CalendarEntrySource getCalendarEntrySource() { + return this.entrySource; + } + + public interface CalendarEntrySource { + public List getEntries(Date date, int resolution); + } + +} diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ITime.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ITime.java new file mode 100644 index 0000000000..2b36966172 --- /dev/null +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/datefield/ITime.java @@ -0,0 +1,234 @@ +package com.itmill.toolkit.terminal.gwt.client.ui.datefield; + +import com.google.gwt.user.client.ui.ChangeListener; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.ListBox; +import com.google.gwt.user.client.ui.Widget; +import com.itmill.toolkit.terminal.gwt.client.ui.IDateField; +import com.itmill.toolkit.terminal.gwt.client.ui.ILabel; +import com.itmill.toolkit.terminal.gwt.client.ui.ISelect; +import com.itmill.toolkit.terminal.gwt.client.ui.ITextualDate; + +public class ITime extends FlowPanel implements ChangeListener { + + private IDateField datefield; + + private ListBox hours; + + private ListBox mins; + + private ListBox sec; + + private ListBox msec; + + private ListBox ampm; + + private int resolution = IDateField.RESOLUTION_HOUR; + + private boolean readonly; + + public ITime(IDateField parent) { + super(); + datefield = parent; + setStyleName(IDateField.CLASSNAME+"-time"); + } + + private void buildTime(boolean redraw) { + boolean thc = datefield.getDateTimeService().isTwelveHourClock(); + if(redraw) { + clear(); + int numHours = thc?12:24; + hours = new ListBox(); + hours.setStyleName(ISelect.CLASSNAME); + for(int i=0; i= IDateField.RESOLUTION_MIN) { + mins = new ListBox(); + mins.setStyleName(ISelect.CLASSNAME); + for(int i=0; i<60; i++) + mins.addItem((i<10)?"0"+i:""+i); + mins.addChangeListener(this); + } + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) { + sec = new ListBox(); + sec.setStyleName(ISelect.CLASSNAME); + for(int i=0; i<60; i++) + sec.addItem((i<10)?"0"+i:""+i); + sec.addChangeListener(this); + } + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) { + msec = new ListBox(); + msec.setStyleName(ISelect.CLASSNAME); + for(int i=0; i<1000; i++) { + if(i<10) + msec.addItem("00"+i); + else if(i<100) + msec.addItem("0"+i); + else msec.addItem(""+i); + } + msec.addChangeListener(this); + } + + String delimiter = datefield.getDateTimeService().getClockDelimeter(); + boolean ro = datefield.isReadonly(); + + if(ro) { + int h = 0; + if(datefield.getCurrentDate() != null) + h = datefield.getCurrentDate().getHours(); + if(thc) h -= h<12? 0 : 12; + add(new ILabel(h<10? "0"+h : ""+h)); + } else add(hours); + + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) { + add(new ILabel(delimiter)); + if(ro) { + int m = mins.getSelectedIndex(); + add(new ILabel(m<10? "0"+m : ""+m)); + } + else add(mins); + } + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) { + add(new ILabel(delimiter)); + if(ro) { + int s = sec.getSelectedIndex(); + add(new ILabel(s<10? "0"+s : ""+s)); + } + else add(sec); + } + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) { + add(new ILabel(".")); + if(ro) { + int m = datefield.getMilliseconds(); + String ms = m<100? "0"+m : ""+m; + add(new ILabel(m<10? "0"+ms : ms)); + } + else add(msec); + } + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) { + add(new ILabel(delimiter+"00")); // o'clock + } + if(thc) { + add(new ILabel(" ")); + if(ro) add(new ILabel(ampm.getItemText(datefield.getCurrentDate().getHours()<12? 0 : 1))); + else add(ampm); + } + + if(ro) return; + } + + // Update times + if(thc) { + int h = datefield.getCurrentDate().getHours(); + ampm.setSelectedIndex(h<12? 0 : 1); + h -= ampm.getSelectedIndex()*12; + hours.setSelectedIndex(h); + } else + hours.setSelectedIndex(datefield.getCurrentDate().getHours()); + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) + mins.setSelectedIndex(datefield.getCurrentDate().getMinutes()); + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) + sec.setSelectedIndex(datefield.getCurrentDate().getSeconds()); + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) + msec.setSelectedIndex(datefield.getMilliseconds()); + if(thc) + ampm.setSelectedIndex(datefield.getCurrentDate().getHours()<12?0:1); + + if(datefield.isReadonly() && !redraw) { + // Do complete redraw when in read-only status + clear(); + String delimiter = datefield.getDateTimeService().getClockDelimeter(); + + int h = datefield.getCurrentDate().getHours(); + if(thc) h -= h<12? 0 : 12; + add(new ILabel(h<10? "0"+h : ""+h)); + + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_MIN) { + add(new ILabel(delimiter)); + int m = mins.getSelectedIndex(); + add(new ILabel(m<10? "0"+m : ""+m)); + } + if(datefield.getCurrentResolution() >= IDateField.RESOLUTION_SEC) { + add(new ILabel(delimiter)); + int s = sec.getSelectedIndex(); + add(new ILabel(s<10? "0"+s : ""+s)); + } + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_MSEC) { + add(new ILabel(".")); + int m = datefield.getMilliseconds(); + String ms = m<100? "0"+m : ""+m; + add(new ILabel(m<10? "0"+ms : ms)); + } + if(datefield.getCurrentResolution() == IDateField.RESOLUTION_HOUR) { + add(new ILabel(delimiter+"00")); // o'clock + } + if(thc) { + add(new ILabel(" ")); + add(new ILabel(ampm.getItemText(datefield.getCurrentDate().getHours()<12? 0 : 1))); + } + } + + boolean enabled = datefield.isEnabled(); + hours.setEnabled(enabled); + if(mins != null) mins.setEnabled(enabled); + if(sec != null) sec.setEnabled(enabled); + if(msec != null) msec.setEnabled(enabled); + if(ampm != null) ampm.setEnabled(enabled); + + } + + public void updateTime(boolean redraw) { + buildTime(redraw || resolution != datefield.getCurrentResolution() + || readonly != datefield.isReadonly()); + if(datefield instanceof ITextualDate) + ((ITextualDate) datefield).buildDate(); + resolution = datefield.getCurrentResolution(); + readonly = datefield.isReadonly(); + } + + public void onChange(Widget sender) { + if(sender == hours) { + int h = hours.getSelectedIndex(); + if(datefield.getDateTimeService().isTwelveHourClock()) + h = h + ampm.getSelectedIndex()*12; + datefield.getCurrentDate().setHours(h); + datefield.getClient().updateVariable(datefield.getId(), "hour", h, datefield.isImmediate()); + updateTime(false); + } + else if(sender == mins) { + int m = mins.getSelectedIndex(); + datefield.getCurrentDate().setMinutes(m); + datefield.getClient().updateVariable(datefield.getId(), "min", m, datefield.isImmediate()); + updateTime(false); + } + else if(sender == sec) { + int s = sec.getSelectedIndex(); + datefield.getCurrentDate().setSeconds(s); + datefield.getClient().updateVariable(datefield.getId(), "sec", s, datefield.isImmediate()); + updateTime(false); + } + else if(sender == msec) { + int ms = msec.getSelectedIndex(); + datefield.setMilliseconds(ms); + datefield.getClient().updateVariable(datefield.getId(), "msec", ms, datefield.isImmediate()); + updateTime(false); + } + else if(sender == ampm) { + int h = hours.getSelectedIndex() + ampm.getSelectedIndex()*12; + datefield.getCurrentDate().setHours(h); + datefield.getClient().updateVariable(datefield.getId(), "hour", h, datefield.isImmediate()); + updateTime(false); + } + } + +}