Fixed locale loading and parsing (now supports all possible locales found from JVM).
svn changeset:1821/svn branch:trunk
else if (uidl.hasAttribute("readonly"))
enabled = !uidl.getBooleanAttribute("readonly");
((FocusWidget) component).setEnabled(enabled);
+ } else {
+ boolean enabled = true;
+ if (uidl.hasAttribute("disabled"))
+ enabled = !uidl.getBooleanAttribute("disabled");
+ if(!enabled)
+ component.addStyleName("i-disabled");
+ else
+ component.removeStyleName("i-disabled");
}
boolean visible = !uidl.getBooleanAttribute("invisible");
component.setVisible(visible);
return 0;\r
}\r
\r
+ public boolean isTwelveHourClock() {\r
+ try {\r
+ return LocaleService.isTwelveHourClock(currentLocale);\r
+ } catch (LocaleNotLoadedException e) {\r
+ // TODO redirect to console\r
+ System.out.println(e + ":" + e.getMessage());\r
+ }\r
+ return false;\r
+ }\r
+ \r
+ public String getClockDelimeter() {\r
+ try {\r
+ return LocaleService.getClockDelimiter(currentLocale);\r
+ } catch (LocaleNotLoadedException e) {\r
+ // TODO redirect to console\r
+ System.out.println(e + ":" + e.getMessage());\r
+ }\r
+ return ":";\r
+ }\r
+ \r
+ public String[] getAmPmStrings() {\r
+ try {\r
+ return LocaleService.getAmPmStrings(currentLocale);\r
+ } catch (LocaleNotLoadedException e) {\r
+ // TODO redirect to console\r
+ System.out.println(e + ":" + e.getMessage());\r
+ }\r
+ String[] temp = new String[2];\r
+ temp[0] = "AM";\r
+ temp[1] = "PM";\r
+ return temp;\r
+ }\r
+ \r
public int getStartWeekDay(Date date){\r
Date dateForFirstOfThisMonth = new Date(date.getYear(), date.getMonth(), 1);\r
int firstDay;\r
\r
/**\r
* Date / time etc. localisation service for all widgets.\r
- * Should cache all loaded locales as JSON strings.\r
+ * Caches all loaded locales as JSONObjects.\r
* \r
* @author IT Mill Ltd.\r
*\r
return hmd.stringValue();\r
} else throw new LocaleNotLoadedException(locale);\r
}\r
+ \r
+ public static String[] getAmPmStrings(String locale) throws LocaleNotLoadedException {\r
+ if(cache.containsKey(locale)) {\r
+ JSONObject l = (JSONObject) cache.get(locale);\r
+ JSONArray ampm = (JSONArray) l.get("ampm");\r
+ String[] temp = new String[2];\r
+ temp[0] = ((JSONString)ampm.get(0)).stringValue();\r
+ temp[1] = ((JSONString)ampm.get(1)).stringValue();\r
+ return temp;\r
+ } else throw new LocaleNotLoadedException(locale);\r
+ }\r
\r
}\r
\r
public class ICalendar extends IDateField {\r
\r
- private ICalendarPanel body;\r
- \r
- private String locale;\r
+ private ICalendarPanel date;\r
\r
public ICalendar() {\r
super();\r
- body = new ICalendarPanel(this);\r
- container.add(body);\r
+ setStyleName(CLASSNAME+"-calendar");\r
+ date = new ICalendarPanel(this);\r
+ add(date);\r
}\r
\r
public void updateFromUIDL(UIDL uidl, Client client) {\r
super.updateFromUIDL(uidl, client);\r
- boolean needsRedraw = (locale == null || !locale.equals(currentLocale));\r
- body.updateCalendar(needsRedraw);\r
- locale = currentLocale;\r
+ date.updateCalendar();\r
}\r
\r
}\r
\r
import java.util.Date;\r
\r
+import com.google.gwt.user.client.DOM;\r
+import com.google.gwt.user.client.Event;\r
+import com.google.gwt.user.client.Timer;\r
import com.google.gwt.user.client.ui.ClickListener;\r
import com.google.gwt.user.client.ui.FlexTable;\r
+import com.google.gwt.user.client.ui.MouseListener;\r
+import com.google.gwt.user.client.ui.MouseListenerCollection;\r
+import com.google.gwt.user.client.ui.SourcesMouseEvents;\r
+import com.google.gwt.user.client.ui.SourcesTableEvents;\r
+import com.google.gwt.user.client.ui.TableListener;\r
import com.google.gwt.user.client.ui.Widget;\r
import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
+import com.itmill.toolkit.terminal.gwt.client.LocaleService;\r
\r
-public class ICalendarPanel extends FlexTable implements ClickListener {\r
+public class ICalendarPanel extends FlexTable implements MouseListener, ClickListener {\r
\r
private IDateField datefield;\r
\r
- private IButton prevYear;\r
- private IButton nextYear;\r
- private IButton prevMonth;\r
- private IButton nextMonth;\r
+ private IEventButton prevYear;\r
+ private IEventButton nextYear;\r
+ private IEventButton prevMonth;\r
+ private IEventButton nextMonth;\r
+ \r
+ private ITime time;\r
+ \r
+ /* Needed to identify resolution changes */\r
+ private int resolution = IDateField.RESOLUTION_YEAR;\r
+ \r
+ /* Needed to identify locale changes */\r
+ private String locale = LocaleService.getDefaultLocale();\r
\r
public ICalendarPanel(IDateField parent) {\r
datefield = parent;\r
- // Force table size\r
- setText(0, 0, "");\r
- setText(7, 6, "");\r
- buildCalendar(true);\r
+ setStyleName(datefield.CLASSNAME+"-calendarpanel");\r
+ //buildCalendar(true);\r
+ addTableListener(new DateClickListener(this));\r
}\r
\r
- public void buildCalendar(boolean forceRedraw) {\r
- buildCalendarHeader(forceRedraw);\r
- buildCalendarBody();\r
+ private void buildCalendar(boolean forceRedraw) {\r
+ boolean needsMonth = datefield.currentResolution > IDateField.RESOLUTION_YEAR;\r
+ boolean needsBody = datefield.currentResolution >= IDateField.RESOLUTION_DAY;\r
+ boolean needsTime = datefield.currentResolution >= IDateField.RESOLUTION_HOUR;\r
+ buildCalendarHeader(forceRedraw, needsMonth);\r
+ clearCalendarBody(!needsBody);\r
+ if(needsBody)\r
+ buildCalendarBody();\r
+ if(needsTime)\r
+ buildTime(forceRedraw);\r
+ else if(time != null) {\r
+ remove(time);\r
+ time = null;\r
+ }\r
}\r
- \r
- private void clearCalendarBody() {\r
- for (int row=2; row < 8; row++){\r
- for (int col=0; col < 7; col++){\r
- setText(row, col, "");\r
+\r
+ private void clearCalendarBody(boolean remove) {\r
+ if(!remove) {\r
+ for (int row = 2; row < 8; row++) {\r
+ for (int col = 0; col < 7; col++) {\r
+ setHTML(row, col, " ");\r
+ }\r
}\r
+ } else if(getRowCount() > 2) {\r
+ while(getRowCount() > 2)\r
+ removeRow(2);\r
}\r
}\r
\r
- private void buildCalendarHeader(boolean forceRedraw) {\r
+ private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) {\r
if(forceRedraw) {\r
- prevYear = new IButton(); prevYear.setText("«");\r
- nextYear = new IButton(); nextYear.setText("»");\r
- prevMonth = new IButton(); prevMonth.setText("‹");\r
- nextMonth = new IButton(); nextMonth.setText("›");\r
- prevYear.addClickListener(this); nextYear.addClickListener(this);\r
- prevMonth.addClickListener(this); nextMonth.addClickListener(this);setWidget(0, 0, prevYear);\r
- \r
- setWidget(0, 1, prevMonth);\r
- setWidget(0, 3, nextMonth);\r
- setWidget(0, 4, nextYear);\r
- getFlexCellFormatter().setColSpan(0, 2, 3);\r
+ if(prevMonth == null) { // Only do once\r
+ prevYear = new IEventButton(); prevYear.setHTML("«");\r
+ nextYear = new IEventButton(); nextYear.setHTML("»");\r
+ prevYear.addMouseListener(this); nextYear.addMouseListener(this);\r
+ prevYear.addClickListener(this); nextYear.addClickListener(this);\r
+ setWidget(0, 0, prevYear);\r
+ setWidget(0, 4, nextYear);\r
+ \r
+ if(needsMonth) {\r
+ prevMonth = new IEventButton(); prevMonth.setHTML("‹");\r
+ nextMonth = new IEventButton(); nextMonth.setHTML("›");\r
+ prevMonth.addMouseListener(this); nextMonth.addMouseListener(this);\r
+ prevMonth.addClickListener(this); nextMonth.addClickListener(this);\r
+ setWidget(0, 3, nextMonth);\r
+ setWidget(0, 1, prevMonth);\r
+ }\r
+ \r
+ getFlexCellFormatter().setColSpan(0, 2, 3);\r
+ } else if(!needsMonth){\r
+ // Remove month traverse buttons\r
+ prevMonth.removeClickListener(this);\r
+ prevMonth.removeMouseListener(this);\r
+ nextMonth.removeClickListener(this);\r
+ nextMonth.removeMouseListener(this);\r
+ remove(prevMonth);\r
+ remove(nextMonth);\r
+ prevMonth = null; nextMonth = null;\r
+ }\r
\r
+ // Print weekday names\r
int firstDay = datefield.dts.getFirstDayOfWeek();\r
for(int i = 0; i < 7; i++) {\r
int day = i + firstDay;\r
if(day > 6) day = 0;\r
- setText(1,i, datefield.dts.getShortDay(day));\r
+ if(datefield.currentResolution > IDateField.RESOLUTION_MONTH)\r
+ setHTML(1,i, "<strong>" + datefield.dts.getShortDay(day) + "</strong>");\r
+ else\r
+ setHTML(1,i, "");\r
}\r
}\r
\r
- String monthName = datefield.dts.getMonth(datefield.date.getMonth());\r
+ String monthName = needsMonth? datefield.dts.getMonth(datefield.date.getMonth()) : "";\r
int year = datefield.date.getYear()+1900;\r
- setText(0, 2, monthName + " " + year);\r
+ setHTML(0, 2, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-month\">" + monthName + " " + year + "</span>");\r
}\r
\r
private void buildCalendarBody() {\r
int startWeekDay = datefield.dts.getStartWeekDay(date);\r
int numDays = DateTimeService.getNumberOfDaysInMonth(date);\r
int dayCount = 0;\r
+ Date today = new Date();\r
for (int row = 2; row < 8; row++){\r
for (int col = 0; col < 7; col++){\r
- if(row == 2 && col < startWeekDay){\r
- setText(row, col, "");\r
- //cellValues[row][col] = ""; \r
- } else {\r
- if(numDays > dayCount){\r
+ if(!(row == 2 && col < startWeekDay)) {\r
+ if(dayCount < numDays){\r
int selectedDate = ++dayCount;\r
- //cellValues[row][col] = selectedDate +"";\r
- //if(true == isSelectedDate(date, selectedDate)){\r
- //setHTML(row, col, "<font class='currentDate'>" + selectedDate+"<font>");\r
- //}else{\r
- setText(row, col, ""+selectedDate);\r
- //}\r
+ if(date.getDate() == dayCount){\r
+ setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day-selected\">" + selectedDate + "</span>");\r
+ } else if(today.getDate() == dayCount && today.getMonth() == date.getMonth() && today.getYear() == date.getYear()){\r
+ setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day-today\">" + selectedDate + "</span>");\r
+ } else {\r
+ setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day\">" + selectedDate + "</span>");\r
+ }\r
} else {\r
- setText(row, col, "");\r
- //cellValues[row][col] = ""; \r
+ break;\r
}\r
}\r
}\r
}\r
}\r
\r
+ private void buildTime(boolean forceRedraw) {\r
+ if(time == null) {\r
+ time = new ITime(datefield);\r
+ setText(8,0,""); // Add new row\r
+ getFlexCellFormatter().setColSpan(8, 0, 7);\r
+ setWidget(8, 0, time);\r
+ }\r
+ time.updateTime(forceRedraw);\r
+ }\r
+ \r
/**\r
* \r
* @param forceRedraw Build all from scratch, in case of e.g. locale changes\r
*/\r
- public void updateCalendar(boolean forceRedraw) {\r
- clearCalendarBody();\r
- buildCalendar(forceRedraw);\r
+ public void updateCalendar() {\r
+ // Locale and resolution changes force a complete redraw\r
+ buildCalendar(locale != datefield.currentLocale || resolution != datefield.currentResolution);\r
+ locale = datefield.currentLocale;\r
+ resolution = datefield.currentResolution;\r
}\r
\r
public void onClick(Widget sender) {\r
+ processClickEvent(sender);\r
+ }\r
+\r
+ private void processClickEvent(Widget sender) {\r
+ if(!datefield.enabled || datefield.readonly)\r
+ return;\r
if(sender == prevYear) {\r
datefield.date.setYear(datefield.date.getYear()-1);\r
datefield.client.updateVariable(datefield.id, "year", datefield.date.getYear()+1900, datefield.immediate);\r
- updateCalendar(false);\r
+ updateCalendar();\r
} else if(sender == nextYear) {\r
datefield.date.setYear(datefield.date.getYear()+1);\r
datefield.client.updateVariable(datefield.id, "year", datefield.date.getYear()+1900, datefield.immediate);\r
- updateCalendar(false);\r
+ updateCalendar();\r
} else if(sender == prevMonth) {\r
datefield.date.setMonth(datefield.date.getMonth()-1);\r
datefield.client.updateVariable(datefield.id, "month", datefield.date.getMonth()+1, datefield.immediate);\r
- updateCalendar(false);\r
+ updateCalendar();\r
} else if(sender == nextMonth) {\r
datefield.date.setMonth(datefield.date.getMonth()+1);\r
datefield.client.updateVariable(datefield.id, "month", datefield.date.getMonth()+1, datefield.immediate);\r
- updateCalendar(false);\r
+ updateCalendar();\r
+ }\r
+ }\r
+ \r
+ private Timer timer;\r
+\r
+ public void onMouseDown(final Widget sender, int x, int y) {\r
+ if(sender instanceof IEventButton) {\r
+ timer = new Timer() {\r
+ public void run() {\r
+ processClickEvent(sender);\r
+ }\r
+ };\r
+ timer.scheduleRepeating(100);\r
+ }\r
+ }\r
+\r
+ public void onMouseEnter(Widget sender) {}\r
+\r
+ public void onMouseLeave(Widget sender) {\r
+ if(timer != null)\r
+ timer.cancel();\r
+ }\r
+\r
+ public void onMouseMove(Widget sender, int x, int y) {}\r
+\r
+ public void onMouseUp(Widget sender, int x, int y) {\r
+ if(timer != null)\r
+ timer.cancel();\r
+ }\r
+ \r
+ private class IEventButton extends IButton implements SourcesMouseEvents {\r
+\r
+ private MouseListenerCollection mouseListeners;\r
+ \r
+ public IEventButton() {\r
+ super();\r
+ sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK\r
+ | Event.MOUSEEVENTS);\r
+ }\r
+ \r
+ public void addMouseListener(MouseListener listener) {\r
+ if (mouseListeners == null) {\r
+ mouseListeners = new MouseListenerCollection();\r
+ }\r
+ mouseListeners.add(listener);\r
+ }\r
+\r
+ public void removeMouseListener(MouseListener listener) {\r
+ if (mouseListeners != null)\r
+ mouseListeners.remove(listener);\r
+ }\r
+ \r
+ public void onBrowserEvent(Event event) {\r
+ super.onBrowserEvent(event);\r
+ switch (DOM.eventGetType(event)) {\r
+ case Event.ONMOUSEDOWN:\r
+ case Event.ONMOUSEUP:\r
+ case Event.ONMOUSEMOVE:\r
+ case Event.ONMOUSEOVER:\r
+ case Event.ONMOUSEOUT:\r
+ if (mouseListeners != null) {\r
+ mouseListeners.fireMouseEvent(this, event);\r
+ }\r
+ break;\r
+ }\r
+ } \r
+ }\r
+ \r
+ private class DateClickListener implements TableListener {\r
+ \r
+ private ICalendarPanel cal;\r
+ \r
+ public DateClickListener(ICalendarPanel panel) {\r
+ cal = panel;\r
+ }\r
+\r
+ public void onCellClicked(SourcesTableEvents sender, int row, int col) {\r
+ if(sender != cal || row < 2 || row > 7 || !cal.datefield.enabled || cal.datefield.readonly)\r
+ return;\r
+ \r
+ Integer day = new Integer(cal.getText(row, col));\r
+ cal.datefield.date.setDate(day.intValue());\r
+ cal.datefield.client.updateVariable(cal.datefield.id, "day", cal.datefield.date.getDate(), cal.datefield.immediate);\r
+ \r
+ // No need to update calendar header\r
+ cal.clearCalendarBody(false);\r
+ cal.buildCalendarBody();\r
}\r
+ \r
}\r
}\r
\r
import java.util.Date;\r
\r
-import com.google.gwt.user.client.ui.Composite;\r
import com.google.gwt.user.client.ui.FlowPanel;\r
import com.itmill.toolkit.terminal.gwt.client.Client;\r
import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
\r
-public class IDateField extends Composite implements Paintable {\r
+public class IDateField extends FlowPanel implements Paintable {\r
\r
public static final String CLASSNAME = "i-datefield";\r
\r
String id;\r
\r
Client client;\r
-\r
- protected FlowPanel container;\r
\r
protected boolean immediate;\r
\r
\r
protected String currentLocale;\r
\r
+ protected boolean readonly;\r
+ \r
+ protected boolean enabled;\r
+ \r
protected Date date;\r
\r
+ /* For easy access, because java.util.Date doesn't have getMilliseconds method */\r
+ private int milliseconds = 0;\r
+ \r
protected DateTimeService dts;\r
\r
public IDateField() {\r
- container = new FlowPanel();\r
- initWidget(container);\r
+ setStyleName(CLASSNAME);\r
date = new Date();\r
dts = new DateTimeService();\r
}\r
\r
// Save details\r
this.client = client;\r
- id = uidl.getId();\r
- immediate = uidl.getBooleanAttribute("immediate");\r
+ this.id = uidl.getId();\r
+ this.immediate = uidl.getBooleanAttribute("immediate");\r
+ \r
+ readonly = uidl.getBooleanAttribute("readonly");\r
+ enabled = !uidl.getBooleanAttribute("disabled");\r
\r
if(uidl.hasAttribute("locale")) {\r
String locale = uidl.getStringAttribute("locale");\r
dts.setLocale(locale);\r
currentLocale = locale;\r
} catch (LocaleNotLoadedException e) {\r
- dts = new DateTimeService();\r
currentLocale = dts.getLocale();\r
+ // TODO redirect this to console\r
System.out.println("Tried to use an unloaded locale \"" + locale + "\". Using default locale (" + currentLocale + ").");\r
}\r
}\r
- \r
- int newResolution = RESOLUTION_YEAR;\r
- if(uidl.hasAttribute("month"))\r
- newResolution = RESOLUTION_MONTH;\r
- if(uidl.hasAttribute("day"))\r
- newResolution = RESOLUTION_DAY;\r
- if(uidl.hasAttribute("hour"))\r
- newResolution = RESOLUTION_HOUR;\r
- if(uidl.hasAttribute("min"))\r
- newResolution = RESOLUTION_MIN;\r
- if(uidl.hasAttribute("sec"))\r
- newResolution = RESOLUTION_SEC;\r
- if(uidl.hasAttribute("msec"))\r
+\r
+ int newResolution;\r
+ if(uidl.hasVariable("msec"))\r
newResolution = RESOLUTION_MSEC;\r
- \r
- if(currentResolution > newResolution)\r
- container.clear();\r
+ else if(uidl.hasVariable("sec"))\r
+ newResolution = RESOLUTION_SEC;\r
+ else if(uidl.hasVariable("min"))\r
+ newResolution = RESOLUTION_MIN;\r
+ else if(uidl.hasVariable("hour"))\r
+ newResolution = RESOLUTION_HOUR;\r
+ else if(uidl.hasVariable("day"))\r
+ newResolution = RESOLUTION_DAY;\r
+ else if(uidl.hasVariable("month"))\r
+ newResolution = RESOLUTION_MONTH;\r
+ else\r
+ newResolution = RESOLUTION_YEAR;\r
\r
currentResolution = newResolution;\r
\r
- int year = uidl.getIntAttribute("year");\r
- int month = uidl.getIntAttribute("month");\r
- int day = uidl.getIntAttribute("day");\r
- int hour = uidl.getIntAttribute("hour");\r
- int min = uidl.getIntAttribute("min");\r
- int sec = uidl.getIntAttribute("sec");\r
- int msec = uidl.getIntAttribute("msec");\r
+ int year = uidl.getIntVariable("year");\r
+ int month = (currentResolution >= RESOLUTION_MONTH)? uidl.getIntVariable("month") : -1;\r
+ int day = (currentResolution >= RESOLUTION_DAY)? uidl.getIntVariable("day") : -1;\r
+ int hour = (currentResolution >= RESOLUTION_HOUR)? uidl.getIntVariable("hour") : -1;\r
+ int min = (currentResolution >= RESOLUTION_MIN)? uidl.getIntVariable("min") : -1;\r
+ int sec = (currentResolution >= RESOLUTION_SEC)? uidl.getIntVariable("sec") : -1;\r
+ int msec = (currentResolution >= RESOLUTION_MSEC)? uidl.getIntVariable("msec") : -1;\r
\r
- date = new Date((long) buildDate(year, month, day, hour, min, sec, msec));\r
+ // Construct new date for this datefield\r
+ date = new Date((long) buildTime(year, month, day, hour, min, sec, msec));\r
+ milliseconds = msec<0? 0 : msec;\r
\r
}\r
\r
/*\r
* We need this redundant native function because \r
- * GWT hasn't implemented setMilliseconds to the Date class.\r
+ * Java's Date object doesn't have a setMilliseconds method.\r
*/\r
- private native double buildDate(int y, int m, int d, int h, int mi, int s, int ms) /*-{\r
+ private static native double buildTime(int y, int m, int d, int h, int mi, int s, int ms) /*-{\r
try {\r
var date = new Date();\r
- if(y) date.setFullYear(y-1900);\r
- if(m) date.setMonth(m-1);\r
- if(d) date.setDate(d);\r
- if(h) date.setHour(h);\r
- if(mi) date.setMinutes(mi);\r
- if(s) date.setSeconds(s);\r
- if(ms) date.setMilliseconds(ms);\r
+ if(y && y >= 0) date.setFullYear(y);\r
+ if(m && m >= 1) date.setMonth(m-1);\r
+ if(d && d >= 0) date.setDate(d);\r
+ if(h && h >= 0) date.setHours(h);\r
+ if(mi && mi >= 0) date.setMinutes(mi);\r
+ if(s && s >= 0) date.setSeconds(s);\r
+ if(ms && ms >= 0) date.setMilliseconds(ms);\r
return date.getTime();\r
} catch (e) {\r
- console.error(e);\r
+ // TODO print some error message on the console\r
+ //console.log(e);\r
+ return (new Date()).getTime();\r
}\r
}-*/;\r
+ \r
+ public int getMilliseconds() {\r
+ return milliseconds;\r
+ }\r
+\r
+ public void setMilliseconds(int ms) {\r
+ long time = (long) buildTime(date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), ms);\r
+ date = new Date(time);\r
+ milliseconds = ms;\r
+ }\r
\r
}\r
public class ILabel extends HTML implements Paintable {
public static final String CLASSNAME = "i-label";
+
+ public ILabel() {
+ super();
+ }
+
+ public ILabel(String text) {
+ super(text);
+ setStyleName(CLASSNAME);
+ }
public void updateFromUIDL(UIDL uidl, Client client) {
-
- setStyleName(CLASSNAME);
if (client.updateComponent(this, uidl, true))
return;
\r
if(uidl.hasVariable("year")) {\r
int selectedYear = uidl.getIntVariable("year");\r
- int y = container.getWidgetIndex(year);\r
+ int y = getWidgetIndex(year);\r
if(y > -1 || !currentLocale.equals(uidl.getStringAttribute("locale"))) {\r
- year = (ListBox) container.getWidget(y);\r
+ year = (ListBox) getWidget(y);\r
// Deselect old value\r
year.setItemSelected(year.getSelectedIndex(), false);\r
// and select new\r
year.setSelectedIndex(year.getItemCount()-1);\r
}\r
year.addChangeListener(this);\r
- container.add(year);\r
+ add(year);\r
}\r
}\r
if(uidl.hasVariable("month")) {\r
int selectedMonth = uidl.getIntVariable("month");\r
- int y = container.getWidgetIndex(month);\r
+ int y = getWidgetIndex(month);\r
if(y > -1) {\r
- month = (ListBox) container.getWidget(y);\r
+ month = (ListBox) getWidget(y);\r
// Deselect old value\r
month.setItemSelected(month.getSelectedIndex(), false);\r
// and select new\r
month.setSelectedIndex(month.getItemCount()-1);\r
}\r
month.addChangeListener(this);\r
- container.add(month);\r
+ add(month);\r
}\r
}\r
if(uidl.hasVariable("day")) {\r
int selectedMonth = uidl.getIntVariable("day");\r
- int y = container.getWidgetIndex(day);\r
+ int y = getWidgetIndex(day);\r
if(y > -1) {\r
- day = (ListBox) container.getWidget(y);\r
+ day = (ListBox) getWidget(y);\r
// Deselect old value\r
day.setItemSelected(day.getSelectedIndex(), false);\r
// and select new\r
day.setSelectedIndex(day.getItemCount()-1);\r
}\r
day.addChangeListener(this);\r
- container.add(day);\r
+ add(day);\r
}\r
}\r
}\r
--- /dev/null
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import com.google.gwt.user.client.ui.ChangeListener;\r
+import com.google.gwt.user.client.ui.FlowPanel;\r
+import com.google.gwt.user.client.ui.ListBox;\r
+import com.google.gwt.user.client.ui.Widget;\r
+\r
+public class ITime extends FlowPanel implements ChangeListener {\r
+ \r
+ private IDateField datefield;\r
+ \r
+ private ListBox hours;\r
+ \r
+ private ListBox mins;\r
+ \r
+ private ListBox sec;\r
+ \r
+ private ListBox msec;\r
+ \r
+ private ListBox ampm;\r
+ \r
+ private int resolution = IDateField.RESOLUTION_HOUR;\r
+ \r
+ private boolean readonly;\r
+ \r
+ public ITime(IDateField parent) {\r
+ super();\r
+ datefield = parent;\r
+ setStyleName(IDateField.CLASSNAME+"-time");\r
+ }\r
+ \r
+ private void buildTime(boolean redraw) {\r
+ boolean thc = datefield.dts.isTwelveHourClock();\r
+ if(redraw) {\r
+ clear();\r
+ int numHours = thc?12:24;\r
+ hours = new ListBox();\r
+ hours.setStyleName(ISelect.CLASSNAME);\r
+ for(int i=0; i<numHours; i++)\r
+ hours.addItem((i<10)?"0"+i:""+i);\r
+ hours.addChangeListener(this);\r
+ if(thc) {\r
+ ampm = new ListBox();\r
+ ampm.setStyleName(ISelect.CLASSNAME);\r
+ String[] ampmText = datefield.dts.getAmPmStrings();\r
+ ampm.addItem(ampmText[0]);\r
+ ampm.addItem(ampmText[1]);\r
+ ampm.addChangeListener(this);\r
+ }\r
+ \r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) {\r
+ mins = new ListBox();\r
+ mins.setStyleName(ISelect.CLASSNAME);\r
+ for(int i=0; i<60; i++)\r
+ mins.addItem((i<10)?"0"+i:""+i);\r
+ mins.addChangeListener(this);\r
+ }\r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) {\r
+ sec = new ListBox();\r
+ sec.setStyleName(ISelect.CLASSNAME);\r
+ for(int i=0; i<60; i++)\r
+ sec.addItem((i<10)?"0"+i:""+i);\r
+ sec.addChangeListener(this);\r
+ }\r
+ if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) {\r
+ msec = new ListBox();\r
+ msec.setStyleName(ISelect.CLASSNAME);\r
+ for(int i=0; i<1000; i++) {\r
+ if(i<10)\r
+ msec.addItem("00"+i);\r
+ else if(i<100)\r
+ msec.addItem("0"+i);\r
+ else msec.addItem(""+i);\r
+ }\r
+ msec.addChangeListener(this);\r
+ }\r
+ \r
+ // Update times\r
+ if(thc) {\r
+ int h = datefield.date.getHours();\r
+ ampm.setSelectedIndex(h<12? 0 : 1);\r
+ h -= ampm.getSelectedIndex()*12;\r
+ hours.setSelectedIndex(h);\r
+ } else\r
+ hours.setSelectedIndex(datefield.date.getHours());\r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_MIN)\r
+ mins.setSelectedIndex(datefield.date.getMinutes());\r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_SEC)\r
+ sec.setSelectedIndex(datefield.date.getSeconds());\r
+ if(datefield.currentResolution == IDateField.RESOLUTION_MSEC)\r
+ msec.setSelectedIndex(datefield.getMilliseconds());\r
+ if(thc)\r
+ ampm.setSelectedIndex(datefield.date.getHours()<12?0:1);\r
+\r
+ \r
+ String delimiter = datefield.dts.getClockDelimeter();\r
+ boolean ro = datefield.readonly;\r
+ \r
+ if(ro) {\r
+ int h = datefield.date.getHours();\r
+ if(thc) h -= h<12? 0 : 12;\r
+ add(new ILabel(h<10? "0"+h : ""+h));\r
+ } else add(hours);\r
+ \r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) {\r
+ add(new ILabel(delimiter));\r
+ if(ro) {\r
+ int m = mins.getSelectedIndex();\r
+ add(new ILabel(m<10? "0"+m : ""+m));\r
+ }\r
+ else add(mins);\r
+ }\r
+ if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) {\r
+ add(new ILabel(delimiter));\r
+ if(ro) {\r
+ int s = sec.getSelectedIndex();\r
+ add(new ILabel(s<10? "0"+s : ""+s));\r
+ }\r
+ else add(sec);\r
+ }\r
+ if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) {\r
+ add(new ILabel("."));\r
+ if(ro) {\r
+ int m = datefield.getMilliseconds();\r
+ String ms = m<100? "0"+m : ""+m;\r
+ add(new ILabel(m<10? "0"+ms : ms));\r
+ }\r
+ else add(msec);\r
+ }\r
+ if(datefield.currentResolution == IDateField.RESOLUTION_HOUR) {\r
+ add(new ILabel(delimiter+"00")); // o'clock\r
+ }\r
+ if(thc) {\r
+ add(new ILabel(" "));\r
+ if(ro) add(new ILabel(ampm.getItemText(datefield.date.getHours()<12? 0 : 1)));\r
+ else add(ampm);\r
+ }\r
+ \r
+ if(ro) return;\r
+ }\r
+ \r
+ boolean enabled = datefield.enabled;\r
+ hours.setEnabled(enabled);\r
+ if(mins != null) mins.setEnabled(enabled);\r
+ if(sec != null) sec.setEnabled(enabled);\r
+ if(msec != null) msec.setEnabled(enabled);\r
+ if(ampm != null) ampm.setEnabled(enabled);\r
+ \r
+ }\r
+\r
+ public void updateTime(boolean redraw) {\r
+ buildTime(redraw || resolution != datefield.currentResolution \r
+ || readonly != datefield.readonly);\r
+ resolution = datefield.currentResolution;\r
+ readonly = datefield.readonly;\r
+ }\r
+\r
+ public void onChange(Widget sender) {\r
+ if(sender == hours) {\r
+ int h = hours.getSelectedIndex();\r
+ if(datefield.dts.isTwelveHourClock())\r
+ h = h + ampm.getSelectedIndex()*12;\r
+ datefield.date.setHours(h);\r
+ datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate);\r
+ //updateTime(false);\r
+ }\r
+ else if(sender == mins) {\r
+ int m = mins.getSelectedIndex();\r
+ datefield.date.setMinutes(m);\r
+ datefield.client.updateVariable(datefield.id, "min", m, datefield.immediate);\r
+ //updateTime(false);\r
+ }\r
+ else if(sender == sec) {\r
+ int s = sec.getSelectedIndex();\r
+ datefield.date.setSeconds(s);\r
+ datefield.client.updateVariable(datefield.id, "sec", s, datefield.immediate);\r
+ //updateTime(false);\r
+ }\r
+ else if(sender == msec) {\r
+ int ms = msec.getSelectedIndex();\r
+ datefield.setMilliseconds(ms);\r
+ datefield.client.updateVariable(datefield.id, "msec", ms, datefield.immediate);\r
+ //updateTime(false);\r
+ }\r
+ else if(sender == ampm) {\r
+ int h = hours.getSelectedIndex() + ampm.getSelectedIndex()*12;\r
+ datefield.date.setHours(h);\r
+ datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate);\r
+ //updateTime(false);\r
+ }\r
+ }\r
+\r
+}\r
@import "textfield/css/textfield.css";\r
@import "select/css/select.css";\r
@import "panel/css/panel.css";\r
-@import "tabsheet/css/tabsheet.css";
\ No newline at end of file
+@import "tabsheet/css/tabsheet.css";\r
+@import "datefield/css/datefield.css";
\ No newline at end of file
select {\r
padding: 0;\r
margin: 0;\r
+}\r
+\r
+.i-disabled {\r
+ opacity: 0.3;\r
+ filter: alpha(opacity:30);\r
}
/* TODO move table styles to separate file */
--- /dev/null
+.i-datefield-calendarpanel {\r
+ width: 22em;\r
+}\r
+.i-datefield-calendarpanel table {\r
+ width: 100%;\r
+}\r
+.i-datefield-calendarpanel td {\r
+ width: 14.2%;\r
+ text-align: center;\r
+ padding: 0;\r
+}\r
+.i-datefield-calendarpanel .i-button {\r
+ width: 22px;\r
+ height: 22px;\r
+ font-size: 1.1em;\r
+ padding: 0;\r
+ line-height: 1em;\r
+}\r
+.i-datefield-calendarpanel-month {\r
+ font-size: 1.1em;\r
+}\r
+.i-datefield-calendarpanel-day {\r
+ cursor: pointer;\r
+ padding: 0 3px;\r
+}\r
+.i-datefield-calendarpanel-day-today {\r
+ font-weight: bold;\r
+ border: 1px solid #aaa;\r
+ padding: 0 3px;\r
+ cursor: pointer;\r
+}\r
+.i-disabled .i-datefield-calendarpanel-day,\r
+.i-disabled .i-datefield-calendarpanel-day-today {\r
+ cursor: default;\r
+}\r
+.i-datefield-calendarpanel-day-selected {\r
+ font-weight: bold;\r
+ color: #fff;\r
+ padding: 0 3px;\r
+ background-color: #1C3E6E;\r
+ cursor: default;\r
+}\r
+.i-datefield-time {\r
+ white-space: nowrap;\r
+}\r
+.i-datefield-time .i-label {\r
+ display: inline;\r
+}\r
+\r
+\r
+.i-datefield-calendar {\r
+ border: 1px solid #29528a;\r
+ padding: 5px;\r
+ background: #fff;\r
+}\r
+.i-datefield-calendar:before {\r
+ display: block;\r
+ height: 2px;\r
+ overflow: hidden;\r
+ background: transparent url(../../panel/img/top-right-small.png) no-repeat right top;\r
+ content: url(../../panel/img/top-left-small.png);\r
+ margin: -6px -6px 3px -6px;\r
+}\r
+.i-datefield-calendar:after {\r
+ display: block;\r
+ height: 2px;\r
+ overflow: hidden;\r
+ background: transparent url(../../panel/img/bottom-right.png) no-repeat right top;\r
+ content: url(../../panel/img/bottom-left.png);\r
+ margin: 5px -6px -6px -6px;\r
+}
\ No newline at end of file
public AjaxApplicationManager(Application application) {
this.application = application;
- requireLocale(application.getLocale().getLanguage());
+ requireLocale(application.getLocale().toString());
}
/**
// Reset sent locales
locales = null;
- requireLocale(application.getLocale().getLanguage());
+ requireLocale(application.getLocale().toString());
// Adds all non-native windows
for (Iterator i = window.getApplication().getWindows()
}
outWriter.print("}");
+
+ /* -----------------------------
+ * Sending Locale sensitive date
+ * -----------------------------
+ */
+
// Store JVM default locale for later restoration
// (we'll have to change the default locale for a while)
Locale jvmDefault = Locale.getDefault();
outWriter.print(", \"locales\":[");
for(;pendingLocalesIndex < locales.size(); pendingLocalesIndex++) {
- Locale l = new Locale((String) locales.get(pendingLocalesIndex));
+ Locale l = generateLocale((String) locales.get(pendingLocalesIndex));
// Locale name
outWriter.print("{\"name\":\"" + l.toString() + "\",");
//outWriter.print("\"tf\":\"" + timeformat + "\",");
outWriter.print("\"thc\":" + twelve_hour_clock + ",");
outWriter.print("\"hmd\":\"" + hour_min_delimiter + "\"");
-
+ if(twelve_hour_clock) {
+ String[] ampm = dfs.getAmPmStrings();
+ outWriter.print(",\"ampm\":[\""+ampm[0]+"\",\""+ampm[1]+"\"]");
+ }
outWriter.print("}");
if(pendingLocalesIndex < locales.size()-1)
outWriter.print(",");
public void requireLocale(String value) {
if(locales == null) {
locales = new ArrayList();
- locales.add(application.getLocale().getLanguage());
+ locales.add(application.getLocale().toString());
pendingLocalesIndex = 0;
}
if(!locales.contains(value))
locales.add(value);
}
+
+ private Locale generateLocale(String value) {
+ String[] temp = value.split("_");
+ if(temp.length == 1)
+ return new Locale(temp[0]);
+ else if(temp.length == 2)
+ return new Locale(temp[0], temp[1]);
+ else
+ return new Locale(temp[0], temp[1], temp[2]);
+ }
}
* content is written.
*
* @param name
- * the Boolean attribute name.
+ * the String attribute name.
* @param value
- * the Boolean attribute value.
+ * the String attribute value.
*
* @throws PaintException
* if the paint operation failed.
if (newDate != oldDate
&& (newDate == null || !newDate.equals(oldDate)))
- setValue(newDate);
+ setValue(newDate, true); // Don't require a repaint, client updates itself
}
}
*/
public void setValue(Object newValue) throws Property.ReadOnlyException,
Property.ConversionException {
+ setValue(newValue, false);
+ }
+
+ public void setValue(Object newValue, boolean repaintIsNotNeeded) throws Property.ReadOnlyException,
+ Property.ConversionException {
// Allows setting dates directly
if (newValue == null || newValue instanceof Date)
- super.setValue(newValue);
+ super.setValue(newValue, repaintIsNotNeeded);
else {
-
+
// Try to parse as string
try {
SimpleDateFormat parser = new SimpleDateFormat();
Date val = parser.parse(newValue.toString());
- super.setValue(val);
+ super.setValue(val, repaintIsNotNeeded);
} catch (ParseException e) {
throw new Property.ConversionException(e.getMessage());
}