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

http://ftr-gwt-library.googlecode.com/ · Java · 501 lines · 384 code · 95 blank · 22 comment · 71 complexity · d99e6e4f77c2b637c85fa759737688b7 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;
  17. import java.util.ArrayList;
  18. import java.util.Date;
  19. import java.util.List;
  20. import org.cobogw.gwt.user.client.CSS;
  21. import org.cobogw.gwt.user.client.ui.Button;
  22. import com.google.gwt.event.dom.client.ClickEvent;
  23. import com.google.gwt.event.dom.client.ClickHandler;
  24. import com.google.gwt.event.shared.HandlerRegistration;
  25. import com.google.gwt.user.client.ui.HTML;
  26. import com.google.gwt.user.client.ui.HasHorizontalAlignment;
  27. import com.google.gwt.user.client.ui.HorizontalPanel;
  28. import com.google.gwt.user.client.ui.Image;
  29. import com.google.gwt.user.client.ui.Label;
  30. import com.google.gwt.user.client.ui.SimplePanel;
  31. import com.google.gwt.user.client.ui.ToggleButton;
  32. import com.google.gwt.user.client.ui.VerticalPanel;
  33. import com.google.gwt.user.client.ui.Widget;
  34. import eu.future.earth.gwt.client.FtrGwtDateCss;
  35. import eu.future.earth.gwt.client.date.list.EventListPanel;
  36. import eu.future.earth.gwt.client.date.month.MonthPanel;
  37. import eu.future.earth.gwt.client.date.week.WeekPanel;
  38. import eu.future.earth.gwt.client.date.weeklist.WeekListPanel;
  39. public class MultiView<T> extends VerticalPanel implements ClickHandler, DateEventListener<T>, HasDateEventHandlers<T> {
  40. private HorizontalPanel viewType = new HorizontalPanel();
  41. private PanelType type = null;
  42. private ToggleButton day = new ToggleButton(FtrGwtResources.TEXTS.day());
  43. private WeekPanel<T> dayPanel = null;
  44. private ToggleButton week = new ToggleButton(FtrGwtResources.TEXTS.week());
  45. private WeekPanel<T> weekPanel = null;
  46. private ToggleButton month = new ToggleButton(FtrGwtResources.TEXTS.month());
  47. private MonthPanel<T> monthPanel = null;
  48. private EventListPanel<T> listPanel = null;
  49. private ToggleButton list = new ToggleButton(FtrGwtResources.TEXTS.list());
  50. private WeekListPanel<T> weekListPanel = null;
  51. private ToggleButton weekList = new ToggleButton(FtrGwtResources.TEXTS.weekList());
  52. // private RoundedPanel body = new RoundedPanel(RoundedPanel.ALL, 3);
  53. private SimplePanel body = new SimplePanel();
  54. private DatePanel<T> currentView = null;
  55. private HorizontalPanel topPanel = new HorizontalPanel();
  56. private HorizontalPanel navi = new HorizontalPanel();
  57. private List<ToggleButton> tabLabels = new ArrayList<ToggleButton>();
  58. private Image prev = new Image(FtrGwtResources.IMAGES.btn_prev());
  59. private Image next = new Image(FtrGwtResources.IMAGES.btn_next());
  60. private Image prevMore = new Image(FtrGwtResources.IMAGES.btn_prev_2());
  61. private Image nextMore = new Image(FtrGwtResources.IMAGES.btn_next_2());
  62. private Button today = new Button(FtrGwtResources.TEXTS.today());
  63. private Label dayInfo = new Label();
  64. private Date centerDate = new Date();
  65. // private EventController<T> controller = null;
  66. private DateRenderer<T> renderer = null;
  67. public MultiView(DateRenderer<T> newRenderer) {
  68. this(newRenderer, PanelType.WEEK);
  69. }
  70. public MultiView(DateRenderer<T> newRenderer, PanelType defaultType) {
  71. this(newRenderer, defaultType, false, true);
  72. }
  73. public HandlerRegistration addDateEventHandler(DateEventListener<? extends T> handler) {
  74. return addHandler(handler, DateEvent.getType());
  75. }
  76. public void setNaviVisible(boolean newState) {
  77. navi.setVisible(newState);
  78. }
  79. public MultiView(DateRenderer<T> newRenderer, PanelType defaultType, boolean alignNaviCenter, boolean displayTodayButton) {
  80. super();
  81. renderer = newRenderer;
  82. topPanel.setSpacing(0);
  83. today.addClickHandler(this);
  84. // topPanel.setP
  85. super.setSpacing(0);
  86. super.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
  87. topPanel.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
  88. topPanel.setBorderWidth(0);
  89. if (alignNaviCenter) {
  90. topPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
  91. }
  92. this.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
  93. today.setSize(90);
  94. next.addClickHandler(this);
  95. CSS.setProperty(next, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
  96. prev.addClickHandler(this);
  97. CSS.setProperty(prev, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
  98. nextMore.addClickHandler(this);
  99. CSS.setProperty(nextMore, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
  100. prevMore.addClickHandler(this);
  101. CSS.setProperty(prevMore, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
  102. // topPanel.setPixelSize();
  103. if (alignNaviCenter) {
  104. navi.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
  105. }
  106. navi.setVerticalAlignment(ALIGN_MIDDLE);
  107. navi.setSpacing(0);
  108. if (renderer.useShowMore()) {
  109. navi.add(prevMore);
  110. navi.setCellVerticalAlignment(prevMore, ALIGN_MIDDLE);
  111. navi.add(new HTML("&nbsp;"));
  112. }
  113. navi.add(prev);
  114. navi.setCellVerticalAlignment(prev, ALIGN_MIDDLE);
  115. navi.add(new HTML("&nbsp;"));
  116. navi.add(dayInfo);
  117. navi.setCellVerticalAlignment(dayInfo, ALIGN_MIDDLE);
  118. navi.add(new HTML("&nbsp;"));
  119. navi.add(next);
  120. navi.setCellVerticalAlignment(next, ALIGN_MIDDLE);
  121. navi.add(new HTML("&nbsp;"));
  122. if (renderer.useShowMore()) {
  123. navi.add(nextMore);
  124. navi.setCellVerticalAlignment(nextMore, ALIGN_MIDDLE);
  125. navi.add(new HTML("&nbsp;"));
  126. }
  127. if (displayTodayButton) {
  128. navi.add(today);
  129. navi.setCellVerticalAlignment(today, ALIGN_MIDDLE);
  130. navi.add(new HTML("&nbsp;"));
  131. }
  132. topPanel.add(navi);
  133. super.setSpacing(0);
  134. // super.setS
  135. topPanel.add(viewType);
  136. topPanel.setCellVerticalAlignment(viewType, HorizontalPanel.ALIGN_BOTTOM);
  137. topPanel.setWidth("100%");
  138. topPanel.setCellHorizontalAlignment(viewType, HorizontalPanel.ALIGN_RIGHT);
  139. super.add(topPanel);
  140. super.setCellHeight(topPanel, "15px");
  141. viewType.setBorderWidth(0);
  142. viewType.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
  143. // viewType.set
  144. viewType.setSpacing(0);
  145. int tabCount = 0;
  146. if (renderer.supportDayView()) {
  147. tabCount++;
  148. }
  149. if (renderer.supportWeekView()) {
  150. tabCount++;
  151. }
  152. if (renderer.supportMonthView()) {
  153. tabCount++;
  154. }
  155. if (renderer.supportListView()) {
  156. tabCount++;
  157. }
  158. if (renderer.supportWeekListView()) {
  159. tabCount++;
  160. }
  161. if (tabCount > 1) {
  162. if (renderer.supportDayView()) {
  163. addTab(day);
  164. }
  165. if (renderer.supportWeekView()) {
  166. addTab(week);
  167. }
  168. if (renderer.supportMonthView()) {
  169. addTab(month);
  170. }
  171. if (renderer.supportListView()) {
  172. addTab(list);
  173. }
  174. if (renderer.supportWeekListView()) {
  175. addTab(weekList);
  176. }
  177. viewType.add(new HTML("&nbsp;"));
  178. viewType.add(new HTML("&nbsp;"));
  179. }
  180. super.add(body);
  181. super.setCellVerticalAlignment(body, VerticalPanel.ALIGN_TOP);
  182. super.add(spa);
  183. spa.setHeight("10px");
  184. setType(defaultType);
  185. }
  186. private HTML spa = new HTML("&nbsp;");
  187. public DateRenderer<T> getRenderer() {
  188. return renderer;
  189. }
  190. protected void onAttach() {
  191. super.onAttach();
  192. scrollToHour(renderer.getScrollHour());
  193. }
  194. public void addWidgetToNivigationBar(Widget newWidget) {
  195. navi.add(newWidget);
  196. navi.setCellVerticalAlignment(newWidget, ALIGN_MIDDLE);
  197. navi.add(new HTML("&nbsp;"));
  198. }
  199. private void addTab(ToggleButton button) {
  200. tabLabels.add(button);
  201. button.addClickHandler(this);
  202. viewType.add(button);
  203. }
  204. private int height = 300;
  205. private int witdh = 400;
  206. public void setPixelSize(int newWidth, int newHeight) {
  207. super.setPixelSize(newWidth, newHeight);
  208. height = newHeight;
  209. witdh = newWidth;
  210. if (currentView != null) {
  211. currentView.setPixelSize(witdh, height - topPanel.getOffsetHeight() - spa.getOffsetHeight());
  212. }
  213. }
  214. public int getHeight() {
  215. return height;
  216. }
  217. public void rebuildPanel() {
  218. if (weekPanel != null) {
  219. weekPanel.buildPanel();
  220. }
  221. if (dayPanel != null) {
  222. dayPanel.buildPanel();
  223. }
  224. }
  225. public void scrollToHour(int hour) {
  226. DatePanel<T> current = getCurrent();
  227. if (current instanceof WeekPanel<?>) {
  228. WeekPanel<T> real = (WeekPanel<T>) current;
  229. real.scrollToHour(hour);
  230. }
  231. }
  232. private void showCurrent(DatePanel<T> newShows) {
  233. if (currentView != null) {
  234. Widget real = (Widget) currentView;
  235. body.remove(real);
  236. }
  237. Widget newReal = (Widget) newShows;
  238. currentView = newShows;
  239. body.setWidget(newReal);
  240. newReal.setWidth("100%");
  241. setPixelSize(witdh, height);
  242. setDate(centerDate);
  243. }
  244. public void setSelected(ToggleButton button) {
  245. for (int i = 0; i < tabLabels.size(); i++) {
  246. final ToggleButton wi = tabLabels.get(i);
  247. if (wi == button) {
  248. wi.setDown(true);
  249. } else {
  250. wi.setDown(false);
  251. }
  252. }
  253. }
  254. public void setType(PanelType newType) {
  255. if (!newType.equals(type)) {
  256. type = newType;
  257. switch (type) {
  258. case MONTH: {
  259. if (monthPanel == null) {
  260. monthPanel = new MonthPanel<T>(renderer);
  261. monthPanel.addDateEventHandler(this);
  262. }
  263. showCurrent(monthPanel);
  264. setSelected(month);
  265. break;
  266. }
  267. case WEEK: {
  268. if (weekPanel == null) {
  269. weekPanel = new WeekPanel<T>(DateUtils.countDays(renderer), renderer);
  270. weekPanel.addDateEventHandler(this);
  271. }
  272. showCurrent(weekPanel);
  273. setSelected(week);
  274. break;
  275. }
  276. case DAY: {
  277. if (dayPanel == null) {
  278. dayPanel = new WeekPanel<T>(1, renderer);
  279. dayPanel.addDateEventHandler(this);
  280. }
  281. showCurrent(dayPanel);
  282. setSelected(day);
  283. break;
  284. }
  285. case LIST: {
  286. if (listPanel == null) {
  287. listPanel = new EventListPanel<T>(renderer);
  288. listPanel.addDateEventHandler(this);
  289. }
  290. showCurrent(listPanel);
  291. setSelected(list);
  292. break;
  293. }
  294. case WEEK_LIST: {
  295. if (weekListPanel == null) {
  296. weekListPanel = new WeekListPanel<T>(renderer);
  297. weekListPanel.addDateEventHandler(this);
  298. }
  299. showCurrent(weekListPanel);
  300. setSelected(weekList);
  301. break;
  302. }
  303. }
  304. scrollToHour(renderer.getScrollHour());
  305. }
  306. }
  307. public void setDate(Date newCenterDate) {
  308. setDate(newCenterDate, true);
  309. }
  310. public void setDate(Date newCenterDate, boolean setDatapanelDate) {
  311. setDate(newCenterDate, setDatapanelDate, true);
  312. }
  313. // add a reloadData argument so that the controller can handle if it uses cached data or make a RPC call.
  314. public void setDate(Date newCenterDate, boolean setDatapanelDate, boolean reloadData) {
  315. centerDate = newCenterDate;
  316. if (setDatapanelDate) {
  317. currentView.setDate(centerDate);
  318. }
  319. currentView.loadData();
  320. dayInfo.setText(renderer.getTitleDisplayText(currentView));
  321. }
  322. public void clearData() {
  323. currentView.clearData();
  324. }
  325. public void setEvents(T[] events) {
  326. currentView.clearData();
  327. addEvents(events);
  328. }
  329. public void addEvents(T[] events) {
  330. if (events != null) {
  331. for (int i = 0; i < events.length; i++) {
  332. currentView.addEventData(events[i]);
  333. }
  334. }
  335. }
  336. public void setEventsByList(List<? extends T> events) {
  337. currentView.clearData();
  338. addEventsList(events);
  339. }
  340. public void addEventsList(List<? extends T> events) {
  341. if (events != null) {
  342. currentView.addEventsByList(events);
  343. }
  344. }
  345. public void setEventsByArrayList(List<T> events) {
  346. currentView.clearData();
  347. currentView.addEventsByList(events);
  348. }
  349. public void reloadData() {
  350. setDate(centerDate, true, true);
  351. }
  352. public void repaintData() {
  353. setDate(centerDate, true, false);
  354. }
  355. public DatePanel<T> getCurrent() {
  356. return currentView;
  357. }
  358. public void handleDateEvent(DateEvent<T> newEvent) {
  359. switch (newEvent.getCommand()) {
  360. case GO_TO_DAY_VIEW:
  361. if (renderer.supportDayView()) {
  362. setType(PanelType.DAY);
  363. } else {
  364. if (renderer.supportWeekView()) {
  365. setType(PanelType.WEEK);
  366. }
  367. }
  368. break;
  369. default:
  370. break;
  371. }
  372. DateEvent.fire(this, newEvent);
  373. }
  374. public void onClick(ClickEvent event) {
  375. if (event.getSource() == day) {
  376. setType(PanelType.DAY);
  377. }
  378. if (event.getSource() == week) {
  379. setType(PanelType.WEEK);
  380. }
  381. if (event.getSource() == month) {
  382. setType(PanelType.MONTH);
  383. }
  384. if (event.getSource() == list) {
  385. setType(PanelType.LIST);
  386. }
  387. if (event.getSource() == weekList) {
  388. setType(PanelType.WEEK_LIST);
  389. }
  390. if (event.getSource() == prev) {
  391. setDate(currentView.prev(), false);
  392. }
  393. if (event.getSource() == next) {
  394. setDate(currentView.next(), false);
  395. }
  396. if (event.getSource() == prevMore) {
  397. setDate(currentView.prevMore(), false);
  398. }
  399. if (event.getSource() == nextMore) {
  400. setDate(currentView.nextMore(), false);
  401. }
  402. if (event.getSource() == today) {
  403. setDate(new Date());
  404. }
  405. }
  406. }