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

http://ftr-gwt-library.googlecode.com/ · Java · 396 lines · 321 code · 56 blank · 19 comment · 38 complexity · 8baa3712723cb154a500b2d460cd38a1 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.month;
  17. import java.util.ArrayList;
  18. import java.util.Calendar;
  19. import java.util.Date;
  20. import java.util.GregorianCalendar;
  21. import java.util.List;
  22. import com.google.gwt.event.shared.HandlerRegistration;
  23. import com.google.gwt.i18n.client.DateTimeFormat;
  24. import com.google.gwt.user.client.DOM;
  25. import com.google.gwt.user.client.ui.AbsolutePanel;
  26. import com.google.gwt.user.client.ui.Grid;
  27. import com.google.gwt.user.client.ui.HTML;
  28. import com.google.gwt.user.client.ui.HorizontalPanel;
  29. import eu.future.earth.gwt.client.FtrGwtDateCss;
  30. import eu.future.earth.gwt.client.date.DateEvent;
  31. import eu.future.earth.gwt.client.date.DateEvent.DateEventActions;
  32. import eu.future.earth.gwt.client.date.DateEventListener;
  33. import eu.future.earth.gwt.client.date.DatePanel;
  34. import eu.future.earth.gwt.client.date.DateRenderer;
  35. import eu.future.earth.gwt.client.date.DateUtils;
  36. import eu.future.earth.gwt.client.date.EventPanel;
  37. import eu.future.earth.gwt.client.date.HasDateEventHandlers;
  38. import eu.future.earth.gwt.client.date.PanelType;
  39. public class MonthPanel<T> extends AbsolutePanel implements DateEventListener<T>, DatePanel<T>, HasDateEventHandlers<T> {
  40. private ArrayList<MonthPanelDropController<T>> dropControllers = new ArrayList<MonthPanelDropController<T>>();
  41. private Calendar current = new GregorianCalendar();
  42. private Calendar helperCal = new GregorianCalendar(); // NOPMD;
  43. private Grid monthPanels = new Grid(7, 7);
  44. private List<MonthPanelDayPanel<T>> panels = new ArrayList<MonthPanelDayPanel<T>>();
  45. private List<HandlerRegistration> registrations = new ArrayList<HandlerRegistration>();
  46. public int getFirstDayOfWeek() {
  47. return firstDayOfWeek;
  48. }
  49. public void setFirstDayOfWeek(int newFirstDayOfWeek) {
  50. if (firstDayOfWeek == newFirstDayOfWeek) {
  51. return;
  52. }
  53. this.firstDayOfWeek = newFirstDayOfWeek;
  54. current.setFirstDayOfWeek(firstDayOfWeek);
  55. buildPanel();
  56. }
  57. private int firstDayOfWeek = Calendar.MONDAY;
  58. private MonthPanelDragController dragController = null;
  59. private DateRenderer<T> renderer = null;
  60. public MonthPanel(DateRenderer<T> newRenderer) {
  61. super();
  62. setRenderer(newRenderer);
  63. // firstDayOfWeek = newRenderer.
  64. setStyleName(FtrGwtDateCss.MONTH_PANEL);
  65. monthPanels.setStyleName(FtrGwtDateCss.MONTH_PANEL);
  66. monthPanels.setCellSpacing(0);
  67. monthPanels.setCellPadding(0);
  68. this.add(monthPanels, 2, 0);
  69. }
  70. int maxWi = 70;
  71. public void setPixelSize(int width, int newHeight) {
  72. if (newHeight > 0) {
  73. super.setHeight(newHeight + "px");
  74. }
  75. if (width > 8) {
  76. super.setWidth(width + "px");
  77. monthPanels.setWidth(width - 3 + "px");
  78. maxWi = ((width - 7) / 7);
  79. if (maxWi > 0) {
  80. for (MonthPanelDayPanel<T> result : panels) {
  81. result.setWidth(maxWi);
  82. }
  83. }
  84. }
  85. }
  86. public final void setRenderer(DateRenderer<T> newRenderer) {
  87. renderer = newRenderer;
  88. if (renderer.enableDragAndDrop()) {
  89. if (dragController != null) {
  90. for (int i = 0; i < dropControllers.size(); i++) {
  91. final MonthPanelDropController<T> real = dropControllers.get(i);
  92. dragController.unregisterDropController(real);
  93. }
  94. }
  95. dragController = new MonthPanelDragController(this);
  96. }
  97. buildPanel();
  98. }
  99. public void setDate(Date newDate) {
  100. if (DateUtils.isSameDay(current.getTime(), newDate)) {
  101. return;
  102. }
  103. current.setTime(newDate);
  104. buildPanel();
  105. }
  106. private int xPos = 0; // NOPMD;
  107. private int yPos = 0; // NOPMD;
  108. private Date firstShow = null;
  109. private Date lastShow = null;
  110. private Date firstLogical = null;
  111. private Date lastLogical = null;
  112. private void buildPanel() {
  113. if (renderer.enableDragAndDrop()) {
  114. for (int i = 0; i < dropControllers.size(); i++) {
  115. final MonthPanelDropController<T> real = dropControllers.get(i);
  116. dragController.unregisterDropController(real);
  117. }
  118. dropControllers.clear();
  119. }
  120. for (HandlerRegistration registration : registrations) {
  121. registration.removeHandler();
  122. }
  123. registrations.clear();
  124. monthPanels.clear();
  125. DOM.setStyleAttribute(monthPanels.getElement(), "width", "100%");
  126. DOM.setStyleAttribute(monthPanels.getElement(), "height", "100%");
  127. helperCal.setFirstDayOfWeek(firstDayOfWeek);
  128. xPos = 0;
  129. yPos = 0;
  130. final Calendar today = new GregorianCalendar();
  131. final DateTimeFormat dayFormatter = DateTimeFormat.getFormat("E");
  132. for (int i = firstDayOfWeek; i < 7 + firstDayOfWeek; i++) {
  133. helperCal.set(Calendar.DAY_OF_WEEK, i);
  134. monthPanels.setWidget(yPos, xPos, new HTML(dayFormatter.format(helperCal.getTime())));
  135. monthPanels.getCellFormatter().setHorizontalAlignment(yPos, xPos, HorizontalPanel.ALIGN_CENTER);
  136. monthPanels.getCellFormatter().setHeight(yPos, xPos, "9%");
  137. monthPanels.getColumnFormatter().setWidth(xPos, "12%");
  138. xPos++;
  139. }
  140. yPos++;
  141. // set logical first day of the month
  142. helperCal.setTime(current.getTime());
  143. helperCal.set(Calendar.DAY_OF_MONTH, 1);
  144. helperCal.set(Calendar.HOUR_OF_DAY, 0);
  145. helperCal.set(Calendar.MINUTE, 0);
  146. helperCal.set(Calendar.SECOND, 0);
  147. helperCal.set(Calendar.MILLISECOND, 0);
  148. firstLogical = helperCal.getTime();
  149. // set logical last day of the month
  150. helperCal.add(Calendar.MONTH, 1);
  151. helperCal.add(Calendar.MILLISECOND, -1);
  152. lastLogical = helperCal.getTime();
  153. // now loop over full weeks for showing days
  154. helperCal.setTime(current.getTime());
  155. helperCal.add(Calendar.DAY_OF_MONTH, -(helperCal.get(Calendar.DAY_OF_MONTH)));
  156. while (helperCal.get(Calendar.DAY_OF_WEEK) != helperCal.getFirstDayOfWeek()) {
  157. helperCal.add(Calendar.DAY_OF_MONTH, -1);
  158. }
  159. panels.clear();
  160. firstShow = helperCal.getTime();
  161. for (int y = 1; y < 7; y++) {
  162. for (int x = 0; x < 7; x++) {
  163. monthPanels.getCellFormatter().setHeight(y, x, "13%");
  164. final MonthPanelDayPanel<T> result = makeDayPanel(helperCal);
  165. panels.add(result);
  166. registrations.add(result.addDateEventHandler(this));
  167. if (DateUtils.isSameDay(today, helperCal)) {
  168. result.addStyleName(FtrGwtDateCss.DATE_DAY_TODAY);
  169. }
  170. monthPanels.setWidget(y, x, result);
  171. if (renderer.enableDragAndDrop() && dragController != null) {
  172. final MonthPanelDropController<T> dropController = new MonthPanelDropController<T>(result);
  173. dropControllers.add(dropController);
  174. dragController.registerDropController(dropController);
  175. }
  176. helperCal.add(Calendar.DAY_OF_MONTH, 1);
  177. }
  178. }
  179. lastShow = helperCal.getTime();
  180. }
  181. private MonthPanelDayPanel<T> makeDayPanel(Calendar calender) {
  182. return new MonthPanelDayPanel<T>(calender.get(Calendar.DAY_OF_MONTH), calender.getTime(), this, renderer);
  183. }
  184. @SuppressWarnings("unchecked")
  185. public void addEventData(T newEvent) {
  186. for (MonthPanelDayPanel<T> result : panels) {
  187. if (result.isDay(newEvent)) {
  188. final EventPanel<T> entry = (EventPanel<T>) renderer.createPanel(newEvent, getType());
  189. if (dragController != null && entry.isDraggable()) {
  190. dragController.makeDraggable(entry, entry.getDraggableItem());
  191. }
  192. entry.addParentDateEventHandler(this);
  193. result.addEvent(entry);
  194. }
  195. }
  196. }
  197. public void notifyReady(DateEventActions action, T data, boolean reload) {
  198. if (reload) {
  199. loadData();
  200. }
  201. switch (action) {
  202. case ADD_DONE: {
  203. addEventData(data);
  204. break;
  205. }
  206. case REMOVE_DONE: {
  207. removeEventData(data);
  208. break;
  209. }
  210. case UPDATE_DONE: {
  211. updateEventData(data);
  212. break;
  213. }
  214. default:
  215. break;
  216. }
  217. DateEvent.fire(this, action, data);
  218. }
  219. public void loadData() {
  220. clearData();
  221. renderer.getEventsForRange(getFirstDateShow(), getLastDateShow(), this, true);
  222. }
  223. public void handleDateEvent(DateEvent<T> newEvent) {
  224. switch (newEvent.getCommand()) {
  225. case DRAG_DROP: {
  226. renderer.updateEvent(renderer.createUpdateHandler(this, newEvent.getData()));
  227. break;
  228. }
  229. case UPDATE: {
  230. renderer.updateEvent(renderer.createUpdateHandler(this, newEvent.getData()));
  231. break;
  232. }
  233. case REMOVE: {
  234. renderer.removeEvent(renderer.createRemoveHandler(this, newEvent.getData()));
  235. break;
  236. }
  237. case ADD: {
  238. renderer.addEvent(renderer.createAddHandler(this, newEvent.getData()));
  239. break;
  240. }
  241. case ADD_DONE: {
  242. addEventData(newEvent.getData());
  243. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  244. break;
  245. }
  246. case REMOVE_DONE: {
  247. removeEventData(newEvent.getData());
  248. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  249. break;
  250. }
  251. case UPDATE_DONE: {
  252. updateEventData(newEvent.getData());
  253. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  254. break;
  255. }
  256. case EDIT: {
  257. renderer.editAfterClick(newEvent.getData(), this);
  258. break;
  259. }
  260. case RELOAD: {
  261. loadData();
  262. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  263. break;
  264. }
  265. default:
  266. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  267. break;
  268. }
  269. }
  270. public HandlerRegistration addDateEventHandler(DateEventListener<? extends T> handler) {
  271. return addHandler(handler, DateEvent.getType());
  272. }
  273. public DateRenderer<T> getRenderer() {
  274. return renderer;
  275. }
  276. public Date next() {
  277. current.add(Calendar.MONTH, 1);
  278. buildPanel();
  279. return current.getTime();
  280. }
  281. public Date prev() {
  282. current.add(Calendar.MONTH, -1);
  283. buildPanel();
  284. return current.getTime();
  285. }
  286. public Date nextMore() {
  287. current.add(Calendar.YEAR, 1);
  288. buildPanel();
  289. return current.getTime();
  290. }
  291. public Date prevMore() {
  292. current.add(Calendar.YEAR, -1);
  293. buildPanel();
  294. return current.getTime();
  295. }
  296. public void updateEventData(T newEvent) {
  297. removeEventData(newEvent);
  298. addEventData(newEvent);
  299. }
  300. public void removeEventData(T newEvent) {
  301. for (MonthPanelDayPanel<T> result : panels) {
  302. EventPanel<T> removed = result.removeEvent(newEvent);
  303. if (removed != null) {
  304. removed.clearParent();
  305. return;
  306. }
  307. }
  308. }
  309. public Date getFirstDateShow() {
  310. return firstShow;
  311. }
  312. public Date getLastDateShow() {
  313. return lastShow;
  314. }
  315. public Date getFirstDateLogical() {
  316. return firstLogical;
  317. }
  318. public Date getLastDateLogical() {
  319. return lastLogical;
  320. }
  321. public void clearData() {
  322. for (MonthPanelDayPanel<T> result : panels) {
  323. result.clearEvents();
  324. }
  325. }
  326. public PanelType getType() {
  327. return PanelType.MONTH;
  328. }
  329. public void setEvents(List<? extends T> events) {
  330. clearData();
  331. addEventsByList(events);
  332. }
  333. public void addEventsByList(List<? extends T> events) {
  334. if (events != null) {
  335. for (int i = 0; i < events.size(); i++) {
  336. addEventData(events.get(i));
  337. }
  338. }
  339. }
  340. }