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

http://ftr-gwt-library.googlecode.com/ · Java · 647 lines · 525 code · 94 blank · 28 comment · 68 complexity · ebe7df3b546e17b4b16b1216cd952e77 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.Date;
  20. import java.util.GregorianCalendar;
  21. import java.util.List;
  22. import org.cobogw.gwt.user.client.CSS;
  23. import com.allen_sauer.gwt.dnd.client.drop.AbstractDropController;
  24. import com.google.gwt.core.client.GWT;
  25. import com.google.gwt.event.shared.HandlerRegistration;
  26. import com.google.gwt.user.client.DOM;
  27. import com.google.gwt.user.client.ui.AbsolutePanel;
  28. import com.google.gwt.user.client.ui.Grid;
  29. import com.google.gwt.user.client.ui.HTML;
  30. import com.google.gwt.user.client.ui.HorizontalPanel;
  31. import com.google.gwt.user.client.ui.ScrollPanel;
  32. import com.google.gwt.user.client.ui.VerticalPanel;
  33. import eu.future.earth.gwt.client.FtrGwtDateCss;
  34. import eu.future.earth.gwt.client.date.DateEvent;
  35. import eu.future.earth.gwt.client.date.DateEvent.DateEventActions;
  36. import eu.future.earth.gwt.client.date.DateEventListener;
  37. import eu.future.earth.gwt.client.date.DatePanel;
  38. import eu.future.earth.gwt.client.date.DateRenderer;
  39. import eu.future.earth.gwt.client.date.DateUtils;
  40. import eu.future.earth.gwt.client.date.EventPanel;
  41. import eu.future.earth.gwt.client.date.HasDateEventHandlers;
  42. import eu.future.earth.gwt.client.date.PanelType;
  43. import eu.future.earth.gwt.client.date.week.DayEventElement;
  44. import eu.future.earth.gwt.client.date.week.DayHeader;
  45. import eu.future.earth.gwt.client.date.week.whole.DayEventpanel;
  46. import eu.future.earth.gwt.client.date.week.whole.DayPanelParent;
  47. import eu.future.earth.gwt.client.date.week.whole.WholeDayDragController;
  48. import eu.future.earth.gwt.client.date.week.whole.WholeDayPanelDropController;
  49. public class WeekListPanel<T> extends VerticalPanel implements DateEventListener<T>, DatePanel<T>, HasDateEventHandlers<T>, DayPanelParent<T> {
  50. private AbsolutePanel wholeDayDragPanel = new AbsolutePanel();
  51. private WholeDayDragController wholeDayDragController = null;
  52. private List<AbstractDropController> dropControllers = new ArrayList<AbstractDropController>();
  53. private ArrayList<DayEventElement<T>> dayList = new ArrayList<DayEventElement<T>>();
  54. private HorizontalPanel headerPanel = new HorizontalPanel();
  55. private VerticalPanel topPanelDays = new VerticalPanel();
  56. private Grid labels = new Grid();
  57. private Grid dayEvents = new Grid();
  58. // private Grid mainPanel = new Grid(1, 2);
  59. private Grid daysGrid = new Grid();
  60. private WeekListPanelDragController weekDragController = null;
  61. private AbsolutePanel dragPanel = new AbsolutePanel();
  62. private ScrollPanel scroller = new ScrollPanel(dragPanel);
  63. private Calendar current = new GregorianCalendar();
  64. private int daysShown = 7;
  65. private int firstDayOfWeek = Calendar.MONDAY;
  66. public WeekListPanel(DateRenderer<T> newRenderer) {
  67. this(DateUtils.countDays(newRenderer), newRenderer);
  68. }
  69. public int getTopScrollable() {
  70. return daysGrid.getAbsoluteTop();
  71. }
  72. public WeekListPanel(int newNumberOfDays, DateRenderer<T> newRenderer) {
  73. this(newNumberOfDays, newRenderer, true);
  74. }
  75. private boolean showDayLabel = true;
  76. public WeekListPanel(int newNumberOfDays, DateRenderer<T> newRenderer, boolean newShowDayLabel) {
  77. super();
  78. showDayLabel = newShowDayLabel;
  79. super.setWidth("100%");
  80. daysShown = newNumberOfDays;
  81. labels.resize(1, newNumberOfDays);
  82. daysGrid.resize(1, newNumberOfDays);
  83. dayEvents.resize(1, newNumberOfDays);
  84. renderer = newRenderer;
  85. if (renderer.enableDragAndDrop()) {
  86. weekDragController = new WeekListPanelDragController(dragPanel);
  87. wholeDayDragController = new WholeDayDragController(wholeDayDragPanel);
  88. }
  89. dragPanel.add(daysGrid);
  90. headerPanel.setWidth("100%");
  91. headerPanel.setStyleName(FtrGwtDateCss.WEEK_HEADER);
  92. // mainPanel.setWidth("100%");
  93. // mainPanel.setCellPadding(0);
  94. // mainPanel.setCellSpacing(0);
  95. topPanelDays.setWidth("100%");
  96. labels.setWidth("100%");
  97. dayEvents.setWidth("100%");
  98. daysGrid.setWidth("100%");
  99. daysGrid.setStyleName(FtrGwtDateCss.WEEK_BODY);
  100. CSS.setProperty(daysGrid, CSS.A.HEIGHT, "100%");
  101. CSS.setProperty(daysGrid, CSS.A.BORDER_COLOR, "#d0e4f6");
  102. CSS.setProperty(daysGrid, CSS.A.BORDER_STYLE, CSS.V.BORDER_STYLE.SOLID);
  103. CSS.setProperty(daysGrid, CSS.A.BORDER_WIDTH, "1px");
  104. daysGrid.setCellPadding(0);
  105. daysGrid.setCellSpacing(0);
  106. dragPanel.setWidth("100%");
  107. super.add(headerPanel);
  108. super.setCellVerticalAlignment(headerPanel, VerticalPanel.ALIGN_BOTTOM);
  109. super.add(scroller);
  110. headerSpaceBefore = new HTML("&nbsp;");
  111. headerPanel.add(headerSpaceBefore);
  112. headerPanel.add(topPanelDays);
  113. headerSpaceAfter = new HTML("&nbsp;");
  114. headerPanel.add(headerSpaceAfter);
  115. headerPanel.setSpacing(0);
  116. if (showDayLabel) {
  117. topPanelDays.add(labels);
  118. }
  119. if (renderer.showWholeDayEventView()) {
  120. topPanelDays.add(wholeDayDragPanel);
  121. wholeDayDragPanel.add(dayEvents);
  122. wholeDayDragPanel.setStyleName(FtrGwtDateCss.DATE_DAY_FULL);
  123. wholeDayDragPanel.setWidth("100%");
  124. dayEvents.setStyleName(FtrGwtDateCss.WEEK_HEADER_EVENTS);
  125. dayEvents.setCellPadding(0);
  126. dayEvents.setCellSpacing(0);
  127. dayEvents.setWidth("100%");
  128. }
  129. topPanelDays.setSpacing(0);
  130. super.setSpacing(0);
  131. current.setFirstDayOfWeek(firstDayOfWeek);
  132. current.setTime(new Date());
  133. current.set(Calendar.HOUR_OF_DAY, 0);
  134. current.set(Calendar.MINUTE, 0);
  135. current.set(Calendar.SECOND, 0);
  136. current.set(Calendar.MILLISECOND, 0);
  137. buildPanel();
  138. }
  139. private DateRenderer<T> renderer = null;
  140. public DateRenderer<T> getRenderer() {
  141. return renderer;
  142. }
  143. public void setRenderer(DateRenderer<T> renderer) {
  144. this.renderer = renderer;
  145. buildPanel();
  146. }
  147. private Date firstLogical = null;
  148. private Date lastLogical = null;
  149. @SuppressWarnings("unchecked")
  150. public void buildPanel() {
  151. if (renderer.enableDragAndDrop()) {
  152. for (AbstractDropController dropController : dropControllers) {
  153. if (dropController instanceof WeekListDayDropController<?>) {
  154. final WeekListDayDropController<T> real = (WeekListDayDropController<T>) dropController;
  155. weekDragController.unregisterDropController(real);
  156. } else {
  157. if (renderer.showWholeDayEventView()) {
  158. if (dropController instanceof WholeDayPanelDropController<?>) {
  159. final WholeDayPanelDropController<T> real = (WholeDayPanelDropController<T>) dropController;
  160. wholeDayDragController.unregisterDropController(real);
  161. }
  162. }
  163. }
  164. }
  165. for (int i = 0; i < dayList.size(); i++) {
  166. final DayEventElement<T> result = dayList.get(i);
  167. result.destroy();
  168. result.clearEvents();
  169. }
  170. dropControllers.clear();
  171. }
  172. dayList.clear();
  173. labels.clear();
  174. dayEvents.clear();
  175. daysGrid.clear();
  176. DOM.removeElementAttribute(scroller.getElement(), "style");
  177. DOM.setStyleAttribute(scroller.getElement(), "overflow", "auto");
  178. DOM.setStyleAttribute(scroller.getElement(), "overflowY", "auto");
  179. DOM.setStyleAttribute(scroller.getElement(), "position", "relative");
  180. DOM.setStyleAttribute(scroller.getElement(), "overflowX", "hidden");
  181. scroller.setStyleName(FtrGwtDateCss.WEEK_SCROLLER);
  182. headerSpaceAfter.setWidth("16px");
  183. headerPanel.setCellWidth(headerSpaceAfter, "16px");
  184. // mainPanel.getCellFormatter().setStyleName(0, 0, FtrGwtDateCss.HOUR_MAIN_PANEL);
  185. // mainPanel.getCellFormatter().setHorizontalAlignment(0, 0, ALIGN_RIGHT);
  186. Calendar helperCal = new GregorianCalendar();
  187. helperCal.setTime(current.getTime());
  188. helperCal.setFirstDayOfWeek(getFirstDayOfWeek());
  189. if (daysShown > 1) {
  190. helperCal.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek());
  191. }
  192. firstLogical = helperCal.getTime();
  193. final Calendar today = new GregorianCalendar();
  194. final String colWide = (100 / daysShown) + "%";
  195. for (int i = 0; i < daysShown; i++) {
  196. if (renderer.showDay(helperCal.get(Calendar.DAY_OF_WEEK))) {
  197. final Date currentDate = helperCal.getTime();
  198. final WeekListDayPanel<T> dayPanel = new WeekListDayPanel<T>(renderer);
  199. if (DateUtils.isSameDay(today, helperCal)) {
  200. dayPanel.addStyleName(FtrGwtDateCss.DATE_DAY_TODAY);
  201. }
  202. dayPanel.setDay(helperCal);
  203. dayPanel.addDateEventHandler(this);
  204. daysGrid.setWidget(0, i, dayPanel);
  205. if (renderer.enableDragAndDrop()) {
  206. final WeekListDayDropController<T> dayController = new WeekListDayDropController<T>(dayPanel, this);
  207. dropControllers.add(dayController);
  208. weekDragController.registerDropController(dayController);
  209. }
  210. daysGrid.getCellFormatter().setWidth(0, i, colWide);
  211. // Set the headers
  212. final DayHeader<T> label = new DayHeader<T>(currentDate, renderer);
  213. labels.setWidget(0, i, label);
  214. labels.getCellFormatter().setWidth(0, i, colWide);
  215. label.addDateEventHandler(this);
  216. if (renderer.showWholeDayEventView()) {
  217. final DayEventpanel<T> eventPanel = new DayEventpanel<T>(renderer, currentDate, this);
  218. dayEvents.setWidget(0, i, eventPanel);
  219. if (renderer.enableDragAndDrop()) {
  220. final WholeDayPanelDropController<T> dayController = new WholeDayPanelDropController<T>(eventPanel);
  221. dropControllers.add(dayController);
  222. wholeDayDragController.registerDropController(dayController);
  223. }
  224. dayEvents.getCellFormatter().setWidth(0, i, colWide);
  225. eventPanel.addDateEventHandler(this);
  226. eventPanel.setDay(helperCal);
  227. dayList.add(eventPanel);
  228. }
  229. dayList.add(dayPanel);
  230. } else {
  231. i--;
  232. }
  233. helperCal.add(Calendar.DAY_OF_WEEK, 1);
  234. }
  235. lastLogical = helperCal.getTime();
  236. int topNeeds = getTopPanelNeeds();
  237. topPanelDays.setHeight(topNeeds + "px");
  238. scroller.setHeight((headerPanel.getOffsetHeight()) + "px");
  239. }
  240. public void setDate(Date activeday) {
  241. GWT.log("Setting to " + activeday, null);
  242. final Calendar test = new GregorianCalendar();
  243. test.setTime(activeday);
  244. test.set(Calendar.HOUR_OF_DAY, 0);
  245. test.set(Calendar.MINUTE, 0);
  246. test.set(Calendar.SECOND, 0);
  247. test.set(Calendar.MILLISECOND, 0);
  248. if (DateUtils.isSameDay(test, current)) {
  249. return;
  250. }
  251. current.setTime(activeday);
  252. current.set(Calendar.HOUR_OF_DAY, 0);
  253. current.set(Calendar.MINUTE, 0);
  254. current.set(Calendar.SECOND, 0);
  255. current.set(Calendar.MILLISECOND, 0);
  256. // buildPanel();
  257. modifyDate();
  258. }
  259. @SuppressWarnings("unchecked")
  260. private void modifyDate() {
  261. if (dayList != null) {
  262. for (int i = 0; i < dayList.size(); i++) {
  263. final DayEventElement<T> result = dayList.get(i);
  264. result.clearEvents();
  265. }
  266. }
  267. Calendar helperCal = new GregorianCalendar();
  268. helperCal.setFirstDayOfWeek(getFirstDayOfWeek());
  269. helperCal.setTime(current.getTime());
  270. if (daysShown > 1) {
  271. helperCal.set(Calendar.DAY_OF_WEEK, helperCal.getFirstDayOfWeek());
  272. }
  273. GWT.log("Start on " + helperCal.getTime(), null);
  274. firstLogical = helperCal.getTime();
  275. final Calendar today = new GregorianCalendar();
  276. for (int i = 0; i < daysShown; i++) {
  277. if (renderer.showDay(helperCal.get(Calendar.DAY_OF_WEEK))) {
  278. WeekListDayPanel<T> dayPanel = (WeekListDayPanel<T>) daysGrid.getWidget(0, i);
  279. dayPanel.setDay(helperCal);
  280. if (DateUtils.isSameDay(today, helperCal)) {
  281. dayPanel.addStyleName(FtrGwtDateCss.DATE_DAY_TODAY);
  282. } else {
  283. dayPanel.removeStyleName(FtrGwtDateCss.DATE_DAY_TODAY);
  284. }
  285. final DayHeader<T> label = (DayHeader<T>) labels.getWidget(0, i);
  286. label.setDate(helperCal.getTime());
  287. if (renderer.showWholeDayEventView()) {
  288. final DayEventpanel<T> eventPanel = (DayEventpanel<T>) dayEvents.getWidget(0, i);
  289. eventPanel.setDay(helperCal);
  290. }
  291. }
  292. helperCal.add(Calendar.DAY_OF_WEEK, 1);
  293. }
  294. lastLogical = helperCal.getTime();
  295. }
  296. public int getDaysShown() {
  297. return daysShown;
  298. }
  299. public PanelType getType() {
  300. return PanelType.WEEK_LIST;
  301. }
  302. public int getFirstDayOfWeek() {
  303. return firstDayOfWeek;
  304. }
  305. public void setDaysShown(int newDaysShown) {
  306. if (daysShown == newDaysShown) {
  307. return;
  308. }
  309. this.daysShown = newDaysShown;
  310. buildPanel();
  311. }
  312. public void setFirstDayOfWeek(int newFirstDayOfWeek) {
  313. if (firstDayOfWeek == newFirstDayOfWeek) {
  314. return;
  315. }
  316. this.firstDayOfWeek = newFirstDayOfWeek;
  317. current.setFirstDayOfWeek(firstDayOfWeek);
  318. buildPanel();
  319. }
  320. @SuppressWarnings("unchecked")
  321. private void createPanel(DayEventElement<T> result, T newEvent, boolean partOfBatch) {
  322. final EventPanel<T> entry = (EventPanel<T>) renderer.createPanel(newEvent, getType());
  323. if (entry != null) {
  324. if (renderer.showWholeDayEventView()) {
  325. if (wholeDayDragController != null && entry.isDraggable()) {
  326. wholeDayDragController.makeDraggable(entry, entry.getDraggableItem());
  327. }
  328. }
  329. result.addEvent(entry, partOfBatch);
  330. entry.addParentDateEventHandler(this);
  331. }
  332. }
  333. public void notifyReady(DateEventActions action, T data, boolean reload) {
  334. if (reload) {
  335. loadData();
  336. }
  337. switch (action) {
  338. case ADD_DONE: {
  339. addEventData(data);
  340. break;
  341. }
  342. case REMOVE_DONE: {
  343. removeEventData(data);
  344. break;
  345. }
  346. case UPDATE_DONE: {
  347. updateEventData(data);
  348. break;
  349. }
  350. default:
  351. break;
  352. }
  353. DateEvent.fire(this, action, data);
  354. }
  355. public void loadData() {
  356. clearData();
  357. renderer.getEventsForRange(getFirstDateShow(), getLastDateShow(), this, true);
  358. }
  359. public void handleDateEvent(DateEvent<T> newEvent) {
  360. switch (newEvent.getCommand()) {
  361. case DRAG_DROP: {
  362. renderer.updateEvent(renderer.createUpdateHandler(this, newEvent.getData()));
  363. break;
  364. }
  365. case UPDATE: {
  366. renderer.updateEvent(renderer.createUpdateHandler(this, newEvent.getData()));
  367. break;
  368. }
  369. case REMOVE: {
  370. renderer.removeEvent(renderer.createRemoveHandler(this, newEvent.getData()));
  371. break;
  372. }
  373. case ADD: {
  374. renderer.addEvent(renderer.createAddHandler(this, newEvent.getData()));
  375. break;
  376. }
  377. case ADD_DONE: {
  378. addEventData(newEvent.getData());
  379. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  380. break;
  381. }
  382. case REMOVE_DONE: {
  383. removeEventData(newEvent.getData());
  384. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  385. break;
  386. }
  387. case UPDATE_DONE: {
  388. updateEventData(newEvent.getData());
  389. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  390. break;
  391. }
  392. case EDIT: {
  393. renderer.editAfterClick(newEvent.getData(), this);
  394. break;
  395. }
  396. case RELOAD: {
  397. loadData();
  398. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  399. break;
  400. }
  401. default:
  402. DateEvent.fire(this, newEvent.getDate(), newEvent.getCommand(), newEvent.getData());
  403. break;
  404. }
  405. }
  406. public HandlerRegistration addDateEventHandler(DateEventListener<? extends T> handler) {
  407. return addHandler(handler, DateEvent.getType());
  408. }
  409. public Date next() {
  410. if (daysShown > 1) {
  411. current.add(Calendar.DAY_OF_WEEK, 7);
  412. } else {
  413. current.add(Calendar.DAY_OF_WEEK, 1);
  414. }
  415. // current.add(Calendar.DAY_OF_WEEK, daysShown);
  416. // buildPanel();
  417. modifyDate();
  418. return current.getTime();
  419. }
  420. public Date prev() {
  421. if (daysShown > 1) {
  422. current.add(Calendar.DAY_OF_WEEK, -7);
  423. } else {
  424. current.add(Calendar.DAY_OF_WEEK, -1);
  425. }
  426. // buildPanel();
  427. modifyDate();
  428. return current.getTime();
  429. }
  430. public Date nextMore() {
  431. if (daysShown > 1) {
  432. current.add(Calendar.MONTH, 1);
  433. } else {
  434. current.add(Calendar.DAY_OF_WEEK, 7);
  435. }
  436. // buildPanel();
  437. modifyDate();
  438. return current.getTime();
  439. }
  440. public Date prevMore() {
  441. if (daysShown > 1) {
  442. current.add(Calendar.MONTH, -1);
  443. } else {
  444. current.add(Calendar.DAY_OF_WEEK, -7);
  445. }
  446. // buildPanel();
  447. modifyDate();
  448. return current.getTime();
  449. }
  450. public void updateEventData(T newEvent) {
  451. removeEventData(newEvent);
  452. addEventData(newEvent);
  453. }
  454. public void removeEventData(T newEvent) {
  455. for (DayEventElement<T> panel : dayList) {
  456. EventPanel<? extends T> removed = panel.removeEvent(newEvent);
  457. if (removed != null) {
  458. removed.clearParent();
  459. return;
  460. }
  461. }
  462. }
  463. public void addEventsByList(List<? extends T> events) {
  464. if (events != null) {
  465. for (int i = 0; i < events.size(); i++) {
  466. addEventData(events.get(i), true);
  467. }
  468. }
  469. for (DayEventElement<T> panel : dayList) {
  470. panel.repaintEvents();
  471. }
  472. }
  473. private void addEventData(T newEvent, boolean isPartOfBatch) {
  474. for (DayEventElement<T> panel : dayList) {
  475. if (panel.isDay(newEvent)) {
  476. createPanel(panel, newEvent, isPartOfBatch);
  477. }
  478. }
  479. }
  480. public void addEventData(T newEvent) {
  481. addEventData(newEvent, false);
  482. }
  483. private HTML headerSpaceBefore;
  484. private HTML headerSpaceAfter;
  485. public int getHeight() {
  486. return height;
  487. }
  488. public void repaint() {
  489. for (DayEventElement<T> panel : dayList) {
  490. panel.repaintEvents();
  491. }
  492. }
  493. private int width = 100;
  494. private int height = 400;
  495. public void setPixelSize(int newWidth, int newHeight) {
  496. width = newWidth;
  497. int topDragNeeds = getTopPanelNeeds();
  498. topPanelDays.setHeight(topDragNeeds + "px");
  499. height = newHeight;
  500. scroller.setHeight((height - headerPanel.getOffsetHeight()) + "px");
  501. super.setWidth(width + "px");
  502. int wi = width;
  503. if (wi < 0) {
  504. wi = this.getElement().getOffsetWidth();
  505. }
  506. int maxWi = wi / getDaysShown();
  507. for (int i = 0; i < dayList.size(); i++) {
  508. final DayEventElement<T> result = dayList.get(i);
  509. result.setElementWide(maxWi);
  510. }
  511. GWT.log("Panle " + width + " Result " + maxWi, null);
  512. repaint();
  513. }
  514. public int getTopPanelNeeds() {
  515. int max = 0;
  516. if (renderer.showWholeDayEventView()) {
  517. for (DayEventElement<T> panel : dayList) {
  518. if (panel instanceof DayEventpanel<?>) {
  519. final DayEventpanel<T> real = (DayEventpanel<T>) panel;
  520. final int newTest = real.neededHeight();
  521. if (newTest > max) {
  522. max = newTest;
  523. }
  524. }
  525. }
  526. wholeDayDragPanel.setHeight(max + "px");
  527. }
  528. return max + labels.getOffsetHeight();
  529. }
  530. public Date getFirstDateShow() {
  531. return firstLogical;
  532. }
  533. public Date getLastDateShow() {
  534. return lastLogical;
  535. }
  536. public Date getFirstDateLogical() {
  537. return firstLogical;
  538. }
  539. public Date getLastDateLogical() {
  540. return lastLogical;
  541. }
  542. public void clearData() {
  543. if (dayList != null) {
  544. for (DayEventElement<T> panel : dayList) {
  545. panel.clearEvents();
  546. }
  547. }
  548. }
  549. public void setEvents(List<? extends T> events) {
  550. clearData();
  551. addEventsByList(events);
  552. }
  553. }