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

http://ftr-gwt-library.googlecode.com/ · Java · 221 lines · 165 code · 40 blank · 16 comment · 21 complexity · 33fcea2f3d7175fb4bcb73ac526217f0 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.date.picker;
  17. import java.util.Calendar;
  18. import java.util.Date;
  19. import java.util.GregorianCalendar;
  20. import com.google.gwt.event.shared.HandlerRegistration;
  21. import com.google.gwt.i18n.client.DateTimeFormat;
  22. import com.google.gwt.user.client.DOM;
  23. import com.google.gwt.user.client.ui.Composite;
  24. import com.google.gwt.user.client.ui.Grid;
  25. import com.google.gwt.user.client.ui.HTML;
  26. import com.google.gwt.user.client.ui.HorizontalPanel;
  27. import com.google.gwt.user.client.ui.Widget;
  28. import eu.future.earth.gwt.client.FtrGwtDatePickerCss;
  29. import eu.future.earth.gwt.client.date.DateUtils;
  30. public class DatePickerMonthPanel extends Composite implements DateSelectListener, HasDateSelectHandlers {
  31. private Calendar current = new GregorianCalendar();
  32. private Calendar helperCal = new GregorianCalendar(); // NOPMD;
  33. private Grid monthPanel = new Grid(8, 7);
  34. private int firstDayOfWeek = Calendar.MONDAY; // NOPMD;
  35. private DatePickerRenderer renderer = null;
  36. public DatePickerMonthPanel(DatePickerRenderer newRenderer) {
  37. super();
  38. this.initWidget(monthPanel);
  39. setRenderer(newRenderer);
  40. setStyleName(FtrGwtDatePickerCss.MONTH);
  41. monthPanel.setStyleName(FtrGwtDatePickerCss.MONTH);
  42. }
  43. public void setRenderer(DatePickerRenderer newRenderer) {
  44. renderer = newRenderer;
  45. buildPanel();
  46. }
  47. public void setSelectedDate(Date newDate) {
  48. setDate(newDate);
  49. for (int y = 1; y < 8; y++) {
  50. for (int x = 0; x < 7; x++) {
  51. Widget got = monthPanel.getWidget(y, x);
  52. if (got instanceof DatePickerMonthPanelDayPanel) {
  53. final DatePickerMonthPanelDayPanel result = (DatePickerMonthPanelDayPanel) got;
  54. if (result.isDay(newDate)) {
  55. result.setSelected(true);
  56. } else {
  57. result.setSelected(false);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. public void setDate(Date newDate) {
  64. final Calendar test = new GregorianCalendar();
  65. test.setTime(newDate);
  66. if (DateUtils.isSameDay(test, current)) {
  67. return;
  68. }
  69. current.setTime(newDate);
  70. buildPanel();
  71. }
  72. public Date getCurrent() {
  73. return current.getTime();
  74. }
  75. private int xPos = 0; // NOPMD;
  76. private int yPos = 0; // NOPMD;
  77. private Date first = null;
  78. private Date latest = null;
  79. private void buildPanel() {
  80. monthPanel.clear();
  81. DOM.setStyleAttribute(monthPanel.getElement(), "width", "100%");
  82. DOM.setStyleAttribute(monthPanel.getElement(), "height", "100%");
  83. monthPanel.setCellPadding(1);
  84. monthPanel.setCellSpacing(1);
  85. helperCal.setFirstDayOfWeek(firstDayOfWeek);
  86. xPos = 0;
  87. yPos = 0;
  88. final Calendar today = new GregorianCalendar();
  89. final DateTimeFormat dayFormatter = DateTimeFormat.getFormat("E");
  90. for (int i = firstDayOfWeek; i < 7 + firstDayOfWeek; i++) {
  91. helperCal.set(Calendar.DAY_OF_WEEK, i);
  92. monthPanel.setWidget(yPos, xPos, new HTML(dayFormatter.format(helperCal.getTime()).substring(0, 1)));
  93. monthPanel.getCellFormatter().setHorizontalAlignment(yPos, xPos, HorizontalPanel.ALIGN_CENTER);
  94. monthPanel.getCellFormatter().setHeight(yPos, xPos, "9%");
  95. monthPanel.getColumnFormatter().setWidth(xPos, "12%");
  96. xPos++;
  97. }
  98. yPos++;
  99. helperCal.setTime(current.getTime());
  100. final Calendar prevCalendar = (Calendar) helperCal.clone();
  101. prevCalendar.set(Calendar.DAY_OF_MONTH, 1);
  102. prevCalendar.setFirstDayOfWeek(firstDayOfWeek);
  103. final Calendar nextCalendar = (Calendar) helperCal.clone();
  104. nextCalendar.setFirstDayOfWeek(firstDayOfWeek);
  105. nextCalendar.add(Calendar.MONTH, 1);
  106. nextCalendar.set(Calendar.DAY_OF_MONTH, 1);
  107. helperCal.add(Calendar.DAY_OF_MONTH, -(helperCal.get(Calendar.DAY_OF_MONTH)));
  108. while (helperCal.get(Calendar.DAY_OF_WEEK) != helperCal.getFirstDayOfWeek()) {
  109. helperCal.add(Calendar.DAY_OF_MONTH, -1);
  110. }
  111. first = helperCal.getTime();
  112. final int thisMonth = current.get(Calendar.MONTH);
  113. for (int y = 1; y < 8; y++) {
  114. for (int x = 0; x < 7; x++) {
  115. monthPanel.getCellFormatter().setHeight(y, x, "13%");
  116. monthPanel.getCellFormatter().setVerticalAlignment(y, x, HorizontalPanel.ALIGN_MIDDLE);
  117. final DatePickerMonthPanelDayPanel result = makeJButton(prevCalendar, helperCal, nextCalendar);
  118. if (DateUtils.isSameDay(today, helperCal)) {
  119. result.setToday(true);
  120. }
  121. if (thisMonth != helperCal.get(Calendar.MONTH)) {
  122. result.setOtherMonth(true);
  123. }
  124. if (helperCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || helperCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
  125. result.setWeekend(true);
  126. }
  127. if (DateUtils.isSameDay(helperCal, current)) {
  128. result.setSelected(true);
  129. } else {
  130. result.setSelected(false);
  131. }
  132. monthPanel.setWidget(y, x, result);
  133. helperCal.add(Calendar.DAY_OF_MONTH, 1);
  134. }
  135. }
  136. latest = helperCal.getTime();
  137. }
  138. private DatePickerMonthPanelDayPanel makeJButton(Calendar prevCalender, Calendar calender, Calendar nextCalender) {
  139. final DatePickerMonthPanelDayPanel result = new DatePickerMonthPanelDayPanel(calender.get(Calendar.DAY_OF_MONTH), calender.getTime(), renderer);
  140. result.addDateSelectEventHandler(this);
  141. return result;
  142. }
  143. public void handleDateSelectEvent(DateSelectEvent newEvent) {
  144. switch (newEvent.getCommand()) {
  145. case SELECT_DAY: {
  146. setSelectedDate(newEvent.getDate());
  147. break;
  148. }
  149. }
  150. DateSelectEvent.fire(this, newEvent.getDate(), newEvent.getCommand());
  151. }
  152. public HandlerRegistration addDateSelectEventHandler(DateSelectListener handler) {
  153. return addHandler(handler, DateSelectEvent.getType());
  154. }
  155. public DatePickerRenderer getRenderer() {
  156. return renderer;
  157. }
  158. public Date next() {
  159. current.add(Calendar.MONTH, 1);
  160. buildPanel();
  161. return current.getTime();
  162. }
  163. public Date prev() {
  164. current.add(Calendar.MONTH, -1);
  165. buildPanel();
  166. return current.getTime();
  167. }
  168. private DateTimeFormat formatter = DateTimeFormat.getFormat("MMMM yyyy"); // NOPMD;
  169. public String getDisplayText() {
  170. return formatter.format(current.getTime());
  171. }
  172. public Date getFirstDateShow() {
  173. return first;
  174. }
  175. public Date getLastDateShow() {
  176. return latest;
  177. }
  178. public void setHeight(int newHeight) {
  179. // TODO Auto-generated method stub
  180. }
  181. }