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

http://ftr-gwt-library.googlecode.com/ · Java · 313 lines · 238 code · 49 blank · 26 comment · 50 complexity · 1359fca0bacfe706ac8aaa6887eded2d 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.weeklist;
  17. import java.util.ArrayList;
  18. import java.util.Calendar;
  19. import java.util.Collections;
  20. import java.util.Date;
  21. import java.util.GregorianCalendar;
  22. import java.util.List;
  23. import org.cobogw.gwt.user.client.CSS;
  24. import com.google.gwt.core.client.GWT;
  25. import com.google.gwt.event.dom.client.MouseDownEvent;
  26. import com.google.gwt.event.dom.client.MouseDownHandler;
  27. import com.google.gwt.event.dom.client.MouseMoveEvent;
  28. import com.google.gwt.event.dom.client.MouseMoveHandler;
  29. import com.google.gwt.event.dom.client.MouseOutEvent;
  30. import com.google.gwt.event.dom.client.MouseOutHandler;
  31. import com.google.gwt.event.dom.client.MouseUpEvent;
  32. import com.google.gwt.event.dom.client.MouseUpHandler;
  33. import com.google.gwt.event.shared.HandlerRegistration;
  34. import com.google.gwt.user.client.ui.FlowPanel;
  35. import com.google.gwt.user.client.ui.FocusPanel;
  36. import com.google.gwt.user.client.ui.VerticalPanel;
  37. import com.google.gwt.user.client.ui.Widget;
  38. import eu.future.earth.gwt.client.FtrGwtDateCss;
  39. import eu.future.earth.gwt.client.date.DateEvent;
  40. import eu.future.earth.gwt.client.date.DateEvent.DateEventActions;
  41. import eu.future.earth.gwt.client.date.DateEventListener;
  42. import eu.future.earth.gwt.client.date.DateRenderer;
  43. import eu.future.earth.gwt.client.date.EventPanel;
  44. import eu.future.earth.gwt.client.date.EventWildComparator;
  45. import eu.future.earth.gwt.client.date.HasDateEventHandlers;
  46. import eu.future.earth.gwt.client.date.week.DayEventElement;
  47. import eu.future.earth.gwt.client.date.week.DayHelper;
  48. public class WeekListDayPanel<T> extends FocusPanel implements MouseDownHandler, MouseMoveHandler, MouseUpHandler, MouseOutHandler, DayEventElement<T>, HasDateEventHandlers<T>, DateEventListener<T> {
  49. private Calendar helper = new GregorianCalendar();
  50. private DayHelper<T> theDay = new DayHelper<T>();
  51. private DateRenderer<T> renderer = null;
  52. private String startTimeString = null;
  53. private EventWildComparator<T> sorter = new EventWildComparator<T>();
  54. private List<EventPanel<? extends T>> events = new ArrayList<EventPanel<? extends T>>();
  55. public Date getDate() {
  56. return theDay.getTime();
  57. }
  58. private VerticalPanel body = null;
  59. private FlowPanel topper = new FlowPanel();
  60. public WeekListDayPanel(DateRenderer<T> newRenderer) {
  61. super();
  62. this.renderer = newRenderer;
  63. body = new VerticalPanel();
  64. this.setWidget(topper);
  65. topper.add(body);
  66. super.setWidth(getPrefferedWitdh());
  67. CSS.setProperty(body, CSS.A.WIDTH, "100%");
  68. CSS.setProperty(this, CSS.A.HEIGHT, "100%");
  69. CSS.setProperty(this, CSS.A.BORDER_RIGHT_COLOR, "#d0e4f6");
  70. CSS.setProperty(this, CSS.A.BORDER_RIGHT_STYLE, CSS.V.BORDER_STYLE.SOLID);
  71. CSS.setProperty(this, CSS.A.BORDER_RIGHT_WIDTH, "2px");
  72. theDay.setRenderer(newRenderer);
  73. setStyleName(FtrGwtDateCss.DAY_PANEL);
  74. this.addMouseOutHandler(this);
  75. this.addMouseDownHandler(this);
  76. this.addMouseUpHandler(this);
  77. }
  78. public void destroy() {
  79. if (getParent() != null) {
  80. removeFromParent();
  81. }
  82. }
  83. public void clearEvents() {
  84. for (EventPanel<? extends T> ev : events) {
  85. body.remove(ev);
  86. }
  87. events.clear();
  88. }
  89. public int calculateIntervalSnapForY(int y) {
  90. return (int) Math.round(((double) y) / renderer.getIntervalHeight());
  91. }
  92. public void addEventDrop(EventPanel<T> newEvent, boolean sameDay) {
  93. GWT.log("Not same day", null);
  94. events.add(newEvent);
  95. repaintEvents();
  96. GWT.log("Adding", null);
  97. DateEvent.fire(this, DateEventActions.DRAG_DROP, newEvent.getValue());
  98. }
  99. public HandlerRegistration addDateEventHandler(DateEventListener<? extends T> handler) {
  100. return addHandler(handler, DateEvent.getType());
  101. }
  102. public void addEvent(EventPanel<? extends T> newEvent, boolean partOfBatch) {
  103. if (!partOfBatch) {
  104. removeEvent(newEvent.getValue()); // Be safe
  105. }
  106. events.add(newEvent);
  107. if (!partOfBatch) {
  108. repaintEvents();
  109. }
  110. }
  111. public void updateEvent(EventPanel<? extends T> newEvent) {
  112. EventPanel<? extends T> found = null;
  113. for (EventPanel<? extends T> test : events) {
  114. if (renderer.equal(test.getValue(), newEvent.getValue())) {
  115. found = test;
  116. }
  117. }
  118. if (found != null) {
  119. removeEvent(found.getValue(), false);
  120. }
  121. events.add(newEvent);
  122. repaintEvents();
  123. }
  124. private void paintEvent(EventPanel<? extends T> newEvent) {
  125. newEvent.repaintTime();
  126. int wide = getOffsetWidth() - 6;
  127. if (wide < 0) {
  128. wide = 80;
  129. }
  130. body.add(newEvent);
  131. }
  132. public EventPanel<? extends T> removeEvent(T event) {
  133. return removeEvent(event, true);
  134. }
  135. public EventPanel<? extends T> removeEvent(T event, boolean repaint) {
  136. for (EventPanel<? extends T> ev : events) {
  137. if (renderer.equal(ev.getValue(), event)) {
  138. body.remove(ev);
  139. events.remove(ev);
  140. // Only repaint when there is something removed.
  141. if (repaint) {
  142. repaintEvents();
  143. }
  144. return ev;
  145. }
  146. }
  147. return null;
  148. }
  149. public void repaintEvents() {
  150. if (events != null) {
  151. Collections.sort(events, sorter);
  152. for (EventPanel<? extends T> ev : events) {
  153. body.remove(ev);
  154. paintEvent(ev);
  155. }
  156. }
  157. }
  158. public void repaint(EventPanel<T> notRepaint) {
  159. if (events != null) {
  160. Collections.sort(events, sorter);
  161. for (EventPanel<? extends T> ev : events) {
  162. if (!renderer.equal(ev.getValue(), notRepaint.getValue())) {
  163. body.remove(ev);
  164. paintEvent(ev);
  165. }
  166. }
  167. }
  168. }
  169. public DateRenderer<T> getRenderer() {
  170. return renderer;
  171. }
  172. public void setDay(Calendar newDay) {
  173. theDay.setTime(newDay.getTime());
  174. theDay.setFirstDayOfWeek(newDay.getFirstDayOfWeek());
  175. }
  176. public boolean isDay(T newEvent) {
  177. if (renderer.isWholeDayEvent(newEvent)) {
  178. return false;
  179. }
  180. return theDay.isDay(newEvent);
  181. }
  182. protected String getPrefferedWitdh() {
  183. return "100%";
  184. }
  185. public void onMouseDown(MouseDownEvent event) {
  186. if (event.getSource() instanceof Widget) {
  187. Widget widget = (Widget) event.getSource();
  188. if (widget != this) {
  189. startTimeString = widget.getTitle();
  190. }
  191. }
  192. }
  193. public void onMouseOut(MouseOutEvent event) {
  194. if (event.getSource() instanceof Widget) {
  195. Widget widget = (Widget) event.getSource();
  196. if (widget == this) {
  197. startTimeString = null;
  198. }
  199. }
  200. }
  201. public void onMouseMove(MouseMoveEvent event) {
  202. if (event.getSource() instanceof Widget) {
  203. Widget widget = (Widget) event.getSource();
  204. if (startTimeString != null && widget != this) {
  205. widget.addStyleName(FtrGwtDateCss.HOURS_SELECTED);
  206. }
  207. }
  208. }
  209. public void onMouseUp(MouseUpEvent event) {
  210. if (event.getSource() instanceof Widget) {
  211. Widget widget = (Widget) event.getSource();
  212. // startTime
  213. Boolean add12 = false;
  214. if (startTimeString != null && widget != this) {
  215. if (startTimeString.indexOf("AM") > -1 || startTimeString.indexOf("PM") > -1) {
  216. if (renderer.show24HourClock() == false) {
  217. if (startTimeString.indexOf("PM") > -1) {
  218. add12 = true;
  219. }
  220. }
  221. startTimeString = startTimeString.substring(0, startTimeString.length() - 3);
  222. }
  223. helper.setTime(theDay.getTime());
  224. final Calendar helperTime = new GregorianCalendar();
  225. helperTime.setTime(theDay.getTime());
  226. // Transplant the hour and minutes
  227. if (add12 && helperTime.get(Calendar.HOUR_OF_DAY) != 12) {
  228. helper.set(Calendar.HOUR_OF_DAY, helperTime.get(Calendar.HOUR_OF_DAY) + 12);
  229. } else {
  230. helper.set(Calendar.HOUR_OF_DAY, helperTime.get(Calendar.HOUR_OF_DAY));
  231. }
  232. // helper.set(Calendar.HOUR_OF_DAY,
  233. // helperTime.get(Calendar.HOUR_OF_DAY));
  234. helper.set(Calendar.MINUTE, helperTime.get(Calendar.MINUTE));
  235. helper.set(Calendar.SECOND, 0);
  236. helper.set(Calendar.MILLISECOND, 0);
  237. final Date start = helper.getTime();
  238. // add one interval's worth of time to get to the END of the
  239. // selected interval
  240. String endTimeString = widget.getTitle();
  241. if (endTimeString != null) {
  242. if (endTimeString.indexOf("AM") > -1 || endTimeString.indexOf("PM") > -1) {
  243. endTimeString = endTimeString.substring(0, endTimeString.length() - 3);
  244. }
  245. }
  246. renderer.createNewAfterClick(start, this);
  247. startTimeString = null;
  248. }
  249. }
  250. }
  251. public void setElementWide(int newWide) {
  252. // for (int i = 0; i < events.size(); i++) {
  253. // final EventPanel ev = (EventPanel) events.get(i);
  254. // ev.setWidth(newWide + "px");
  255. // }
  256. }
  257. public void notifyParentOfUpdate(DateEventActions action, T data) {
  258. DateEvent.fire(this, action, data);
  259. }
  260. public void handleDateEvent(DateEvent<T> newEvent) {
  261. GWT.log("Here foor " + newEvent.getCommand(), null);
  262. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  263. }
  264. }