You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

VTime.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui;
  5. import java.util.Date;
  6. import com.google.gwt.user.client.ui.ChangeListener;
  7. import com.google.gwt.user.client.ui.FlowPanel;
  8. import com.google.gwt.user.client.ui.ListBox;
  9. import com.google.gwt.user.client.ui.Widget;
  10. public class VTime extends FlowPanel implements ChangeListener {
  11. private final VDateField datefield;
  12. private ListBox hours;
  13. private ListBox mins;
  14. private ListBox sec;
  15. private ListBox msec;
  16. private ListBox ampm;
  17. private int resolution = VDateField.RESOLUTION_HOUR;
  18. private boolean readonly;
  19. public VTime(VDateField parent) {
  20. super();
  21. datefield = parent;
  22. setStyleName(VDateField.CLASSNAME + "-time");
  23. }
  24. private void buildTime(boolean redraw) {
  25. final boolean thc = datefield.getDateTimeService().isTwelveHourClock();
  26. if (redraw) {
  27. clear();
  28. final int numHours = thc ? 12 : 24;
  29. hours = new ListBox();
  30. hours.setStyleName(VNativeSelect.CLASSNAME);
  31. for (int i = 0; i < numHours; i++) {
  32. hours.addItem((i < 10) ? "0" + i : "" + i);
  33. }
  34. hours.addChangeListener(this);
  35. if (thc) {
  36. ampm = new ListBox();
  37. ampm.setStyleName(VNativeSelect.CLASSNAME);
  38. final String[] ampmText = datefield.getDateTimeService()
  39. .getAmPmStrings();
  40. ampm.addItem(ampmText[0]);
  41. ampm.addItem(ampmText[1]);
  42. ampm.addChangeListener(this);
  43. }
  44. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_MIN) {
  45. mins = new ListBox();
  46. mins.setStyleName(VNativeSelect.CLASSNAME);
  47. for (int i = 0; i < 60; i++) {
  48. mins.addItem((i < 10) ? "0" + i : "" + i);
  49. }
  50. mins.addChangeListener(this);
  51. }
  52. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_SEC) {
  53. sec = new ListBox();
  54. sec.setStyleName(VNativeSelect.CLASSNAME);
  55. for (int i = 0; i < 60; i++) {
  56. sec.addItem((i < 10) ? "0" + i : "" + i);
  57. }
  58. sec.addChangeListener(this);
  59. }
  60. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_MSEC) {
  61. msec = new ListBox();
  62. msec.setStyleName(VNativeSelect.CLASSNAME);
  63. for (int i = 0; i < 1000; i++) {
  64. if (i < 10) {
  65. msec.addItem("00" + i);
  66. } else if (i < 100) {
  67. msec.addItem("0" + i);
  68. } else {
  69. msec.addItem("" + i);
  70. }
  71. }
  72. msec.addChangeListener(this);
  73. }
  74. final String delimiter = datefield.getDateTimeService()
  75. .getClockDelimeter();
  76. final boolean ro = datefield.isReadonly();
  77. if (ro) {
  78. int h = 0;
  79. if (datefield.getCurrentDate() != null) {
  80. h = datefield.getCurrentDate().getHours();
  81. }
  82. if (thc) {
  83. h -= h < 12 ? 0 : 12;
  84. }
  85. add(new VLabel(h < 10 ? "0" + h : "" + h));
  86. } else {
  87. add(hours);
  88. }
  89. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_MIN) {
  90. add(new VLabel(delimiter));
  91. if (ro) {
  92. final int m = mins.getSelectedIndex();
  93. add(new VLabel(m < 10 ? "0" + m : "" + m));
  94. } else {
  95. add(mins);
  96. }
  97. }
  98. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_SEC) {
  99. add(new VLabel(delimiter));
  100. if (ro) {
  101. final int s = sec.getSelectedIndex();
  102. add(new VLabel(s < 10 ? "0" + s : "" + s));
  103. } else {
  104. add(sec);
  105. }
  106. }
  107. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_MSEC) {
  108. add(new VLabel("."));
  109. if (ro) {
  110. final int m = datefield.getMilliseconds();
  111. final String ms = m < 100 ? "0" + m : "" + m;
  112. add(new VLabel(m < 10 ? "0" + ms : ms));
  113. } else {
  114. add(msec);
  115. }
  116. }
  117. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_HOUR) {
  118. add(new VLabel(delimiter + "00")); // o'clock
  119. }
  120. if (thc) {
  121. add(new VLabel("&nbsp;"));
  122. if (ro) {
  123. add(new VLabel(ampm.getItemText(datefield.getCurrentDate()
  124. .getHours() < 12 ? 0 : 1)));
  125. } else {
  126. add(ampm);
  127. }
  128. }
  129. if (ro) {
  130. return;
  131. }
  132. }
  133. // Update times
  134. Date cdate = datefield.getCurrentDate();
  135. boolean selected = true;
  136. if (cdate == null) {
  137. cdate = new Date();
  138. selected = false;
  139. }
  140. if (thc) {
  141. int h = cdate.getHours();
  142. ampm.setSelectedIndex(h < 12 ? 0 : 1);
  143. h -= ampm.getSelectedIndex() * 12;
  144. hours.setSelectedIndex(h);
  145. } else {
  146. hours.setSelectedIndex(cdate.getHours());
  147. }
  148. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_MIN) {
  149. mins.setSelectedIndex(cdate.getMinutes());
  150. }
  151. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_SEC) {
  152. sec.setSelectedIndex(cdate.getSeconds());
  153. }
  154. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_MSEC) {
  155. if (selected) {
  156. msec.setSelectedIndex(datefield.getMilliseconds());
  157. } else {
  158. msec.setSelectedIndex(0);
  159. }
  160. }
  161. if (thc) {
  162. ampm.setSelectedIndex(cdate.getHours() < 12 ? 0 : 1);
  163. }
  164. if (datefield.isReadonly() && !redraw) {
  165. // Do complete redraw when in read-only status
  166. clear();
  167. final String delimiter = datefield.getDateTimeService()
  168. .getClockDelimeter();
  169. int h = cdate.getHours();
  170. if (thc) {
  171. h -= h < 12 ? 0 : 12;
  172. }
  173. add(new VLabel(h < 10 ? "0" + h : "" + h));
  174. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_MIN) {
  175. add(new VLabel(delimiter));
  176. final int m = mins.getSelectedIndex();
  177. add(new VLabel(m < 10 ? "0" + m : "" + m));
  178. }
  179. if (datefield.getCurrentResolution() >= VDateField.RESOLUTION_SEC) {
  180. add(new VLabel(delimiter));
  181. final int s = sec.getSelectedIndex();
  182. add(new VLabel(s < 10 ? "0" + s : "" + s));
  183. }
  184. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_MSEC) {
  185. add(new VLabel("."));
  186. final int m = datefield.getMilliseconds();
  187. final String ms = m < 100 ? "0" + m : "" + m;
  188. add(new VLabel(m < 10 ? "0" + ms : ms));
  189. }
  190. if (datefield.getCurrentResolution() == VDateField.RESOLUTION_HOUR) {
  191. add(new VLabel(delimiter + "00")); // o'clock
  192. }
  193. if (thc) {
  194. add(new VLabel("&nbsp;"));
  195. add(new VLabel(ampm.getItemText(cdate.getHours() < 12 ? 0 : 1)));
  196. }
  197. }
  198. final boolean enabled = datefield.isEnabled();
  199. hours.setEnabled(enabled);
  200. if (mins != null) {
  201. mins.setEnabled(enabled);
  202. }
  203. if (sec != null) {
  204. sec.setEnabled(enabled);
  205. }
  206. if (msec != null) {
  207. msec.setEnabled(enabled);
  208. }
  209. if (ampm != null) {
  210. ampm.setEnabled(enabled);
  211. }
  212. }
  213. public void updateTime(boolean redraw) {
  214. buildTime(redraw || resolution != datefield.getCurrentResolution()
  215. || readonly != datefield.isReadonly());
  216. if (datefield instanceof VTextualDate) {
  217. ((VTextualDate) datefield).buildDate();
  218. }
  219. resolution = datefield.getCurrentResolution();
  220. readonly = datefield.isReadonly();
  221. }
  222. public void onChange(Widget sender) {
  223. if (datefield.getCurrentDate() == null) {
  224. // was null on server, need to set
  225. Date now = datefield.getShowingDate();
  226. if (now == null) {
  227. now = new Date();
  228. datefield.setShowingDate(now);
  229. }
  230. datefield.setCurrentDate(new Date(now.getTime()));
  231. // Init variables with current time
  232. datefield.getClient().updateVariable(datefield.getId(), "year",
  233. now.getYear() + 1900, false);
  234. datefield.getClient().updateVariable(datefield.getId(), "month",
  235. now.getMonth() + 1, false);
  236. datefield.getClient().updateVariable(datefield.getId(), "day",
  237. now.getDate(), false);
  238. datefield.getClient().updateVariable(datefield.getId(), "hour",
  239. now.getHours(), false);
  240. datefield.getClient().updateVariable(datefield.getId(), "min",
  241. now.getMinutes(), false);
  242. datefield.getClient().updateVariable(datefield.getId(), "sec",
  243. now.getSeconds(), false);
  244. datefield.getClient().updateVariable(datefield.getId(), "msec",
  245. datefield.getMilliseconds(), false);
  246. }
  247. if (sender == hours) {
  248. int h = hours.getSelectedIndex();
  249. if (datefield.getDateTimeService().isTwelveHourClock()) {
  250. h = h + ampm.getSelectedIndex() * 12;
  251. }
  252. datefield.getCurrentDate().setHours(h);
  253. datefield.getShowingDate().setHours(h);
  254. datefield.getClient().updateVariable(datefield.getId(), "hour", h,
  255. datefield.isImmediate());
  256. updateTime(false);
  257. } else if (sender == mins) {
  258. final int m = mins.getSelectedIndex();
  259. datefield.getCurrentDate().setMinutes(m);
  260. datefield.getShowingDate().setMinutes(m);
  261. datefield.getClient().updateVariable(datefield.getId(), "min", m,
  262. datefield.isImmediate());
  263. updateTime(false);
  264. } else if (sender == sec) {
  265. final int s = sec.getSelectedIndex();
  266. datefield.getCurrentDate().setSeconds(s);
  267. datefield.getShowingDate().setSeconds(s);
  268. datefield.getClient().updateVariable(datefield.getId(), "sec", s,
  269. datefield.isImmediate());
  270. updateTime(false);
  271. } else if (sender == msec) {
  272. final int ms = msec.getSelectedIndex();
  273. datefield.setMilliseconds(ms);
  274. datefield.setShowingMilliseconds(ms);
  275. datefield.getClient().updateVariable(datefield.getId(), "msec", ms,
  276. datefield.isImmediate());
  277. updateTime(false);
  278. } else if (sender == ampm) {
  279. final int h = hours.getSelectedIndex() + ampm.getSelectedIndex()
  280. * 12;
  281. datefield.getCurrentDate().setHours(h);
  282. datefield.getShowingDate().setHours(h);
  283. datefield.getClient().updateVariable(datefield.getId(), "hour", h,
  284. datefield.isImmediate());
  285. updateTime(false);
  286. }
  287. }
  288. }