/ftr-gwt-library-date/src/main/java/eu/future/earth/gwt/client/TimeBox.java

http://ftr-gwt-library.googlecode.com/ · Java · 239 lines · 188 code · 32 blank · 19 comment · 142 complexity · 03f39c392b37f31607c0dd02219764bf MD5 · raw file

  1. /*
  2. * Copyright 2007 Future Earth, info@future-earth.eu
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package eu.future.earth.gwt.client;
  17. import java.util.Calendar;
  18. import java.util.Date;
  19. import java.util.GregorianCalendar;
  20. import com.google.gwt.i18n.client.DateTimeFormat;
  21. import com.google.gwt.user.client.DOM;
  22. import com.google.gwt.user.client.Event;
  23. import com.google.gwt.user.client.ui.TextBox;
  24. public class TimeBox extends TextBox {
  25. public final static String DEFAULT_TIME_FORMAT = "HH:mm";
  26. private String format = DEFAULT_TIME_FORMAT;
  27. private DateTimeFormat date = null;
  28. public TimeBox() {
  29. this(DEFAULT_TIME_FORMAT);
  30. }
  31. public TimeBox(String format) {
  32. super.sinkEvents(Event.ONKEYDOWN);
  33. setFormat(format);
  34. }
  35. public void onBrowserEvent(Event event) {
  36. int eventType = DOM.eventGetType(event);
  37. int keyCode = DOM.eventGetKeyCode(event);
  38. switch (eventType) {
  39. case Event.ONKEYDOWN: {
  40. if (keyCode == 37 || keyCode == 39 || keyCode == 18 || keyCode == 9) {
  41. super.onBrowserEvent(event);
  42. return;
  43. } else {
  44. if (isTimeKey(keyCode)) {
  45. final int cursor = super.getCursorPos();
  46. if (cursor >= format.length()) {
  47. } else {
  48. final String temp = super.getText();
  49. final char rep = format.charAt(cursor);
  50. if (rep == ':') {
  51. super.setCursorPos(cursor + 1);
  52. } else {
  53. char next = (char)-1;
  54. if(format.length() > cursor + 1){
  55. next = format.charAt(cursor + 1);
  56. }
  57. char newChar = ((char) convert(keyCode));
  58. boolean allow = false;
  59. if (rep == 'H' && next == 'H') {
  60. if (newChar == '0' || newChar == '1' || newChar == '2') {
  61. allow = true;
  62. }
  63. } else {
  64. if (rep == 'H') {
  65. char prev = temp.charAt(cursor - 1);
  66. if (prev == '2') {
  67. if (newChar == '0' || newChar == '1' || newChar == '2' || newChar == '3') {
  68. allow = true;
  69. }
  70. } else {
  71. allow = true;
  72. }
  73. }
  74. }
  75. if (rep == 'h' && next == 'h') {
  76. if (newChar == '0' || newChar == '1') {
  77. allow = true;
  78. }
  79. } else {
  80. if (rep == 'h') {
  81. char prev = temp.charAt(cursor - 1);
  82. if (prev == '1') {
  83. if (newChar == '0' || newChar == '1' || newChar == '2') {
  84. allow = true;
  85. }
  86. } else {
  87. allow = true;
  88. }
  89. }
  90. }
  91. if (rep == 'm' && next == 'm') {
  92. if (newChar == '0' || newChar == '1' || newChar == '2' || newChar == '3' || newChar == '4' || newChar == '5' || newChar == '6') {
  93. allow = true;
  94. }
  95. } else {
  96. if (rep == 'm') {
  97. final char prev = temp.charAt(cursor - 1);
  98. if (prev == '0' || prev == '1' || prev == '2' || prev == '3' || prev == '4' || prev == '5') {
  99. allow = true;
  100. } else {
  101. if (newChar == '0') {
  102. allow = true;
  103. }
  104. }
  105. }
  106. }
  107. if (rep == 'a' && next == 'a') {
  108. if (newChar == 'A' || newChar == 'a') {
  109. newChar = 'A';
  110. allow = true;
  111. } else if (newChar == 'P' || newChar == 'p') {
  112. newChar = 'P';
  113. allow = true;
  114. }
  115. } else {
  116. if (rep == 'a') {
  117. if (newChar == 'M' || newChar == 'm') {
  118. newChar = 'M';
  119. allow = true;
  120. }
  121. }
  122. }
  123. if (allow) {
  124. final String newString = temp.substring(0, cursor) + newChar + temp.substring(cursor + 1, format.length());
  125. super.setText(newString);
  126. if (next == ':') {
  127. super.setCursorPos(cursor + 2);
  128. } else {
  129. super.setCursorPos(cursor + 1);
  130. }
  131. }
  132. }
  133. }
  134. DOM.eventPreventDefault(event);
  135. return;
  136. } else {
  137. DOM.eventPreventDefault(event);
  138. return;
  139. }
  140. }
  141. }
  142. default:
  143. super.onBrowserEvent(event);
  144. }
  145. }
  146. private int convert(int keyCode) {
  147. // convert 0 - 9 keys on number pad down into normal 0 - 9 range
  148. if (keyCode >= 96 && keyCode <= 105) {
  149. return keyCode - 48;
  150. }
  151. return keyCode;
  152. }
  153. private boolean isTimeKey(int keyCode) {
  154. // 0 - 9 keys above qwerty
  155. if (keyCode >= 48 && keyCode <= 57) {
  156. return true;
  157. }
  158. // 0 - 9 keys on number pad
  159. if (keyCode >= 96 && keyCode <= 105) {
  160. return true;
  161. }
  162. // A, M, P keys
  163. if (keyCode == 65 || keyCode == 77 || keyCode == 80) {
  164. return true;
  165. }
  166. return false;
  167. }
  168. public void setDate(Date newValue) {
  169. if (newValue != null) {
  170. super.setText(date.format(newValue));
  171. } else {
  172. super.setText(format);
  173. }
  174. }
  175. public Date getValue(Date date) {
  176. if (getText() != null && getText().length() == format.length()) {
  177. if(getText().equals(format)){
  178. return null;
  179. }
  180. try {
  181. final Date time = DateTimeFormat.getFormat(format).parse(getText());
  182. final GregorianCalendar thelper = new GregorianCalendar();
  183. thelper.setTime(time);
  184. final GregorianCalendar helper = new GregorianCalendar();
  185. helper.setTime(date);
  186. helper.set(Calendar.HOUR_OF_DAY, thelper.get(Calendar.HOUR_OF_DAY));
  187. helper.set(Calendar.MINUTE, thelper.get(Calendar.MINUTE));
  188. helper.set(Calendar.SECOND, 0);
  189. helper.set(Calendar.MILLISECOND, 0);
  190. return helper.getTime();
  191. } catch (Exception ex) {
  192. return null;
  193. }
  194. }
  195. return null;
  196. }
  197. public String getFormat() {
  198. return format;
  199. }
  200. public void setFormat(String format) {
  201. this.format = format;
  202. date = DateTimeFormat.getFormat(format);
  203. super.setText(format);
  204. super.setMaxLength(format.length());
  205. super.setVisibleLength(format.length());
  206. }
  207. }