/** * Display the events for the cell located at <code>column</code>, <code>row</code> * * @param row * @param column * @param date * @param currentMonth */ private void drawEvents(int row, int column, final Date date) { final FlexTable grid = (FlexTable) getWidget(); // final VerticalPanel cell = (VerticalPanel) grid.getWidget(row, // column); final FlowPanel cell = (FlowPanel) grid.getWidget(row, column); if (cell == null) throw new NullPointerException( "The specified cell (" + row + ',' + column + ") doesn't exist."); // Displaying events final TreeSet<Event> sortedEvents = new TreeSet<Event>( new Comparator<Event>() { @Override public int compare(Event o1, Event o2) { int compare = 0; if (o1 == null && o2 == null) return 0; else if (o2 == null) return 1; else if (o1 == null) return -1; if (compare == 0 && o1.getDtstart() != null && o2.getDtstart() != null) { long o1Start = o1.getDtstart().getTime(); long o2Start = o2.getDtstart().getTime(); if (o1Start < o2Start) compare = -1; else if (o1Start > o2Start) compare = 1; } if (compare == 0 && o1.getSummary() != null && o2.getSummary() != null) compare = o1.getSummary().compareTo(o2.getSummary()); return compare; } }); for (final Calendar calendar : calendars) { final Map<Date, List<Event>> eventMap = normalize(calendar); final List<Event> events = eventMap.get(date); if (events != null) { sortedEvents.addAll(events); } } final Iterator<Event> iterator = sortedEvents.iterator(); for (int i = 0; iterator.hasNext() && i < eventLimit; i++) { final Event event = iterator.next(); final ClickableFlowPanel flowPanel = new ClickableFlowPanel(); flowPanel.addStyleName("calendar-event"); boolean fullDayEvent = false; final StringBuilder eventDate = new StringBuilder(); eventDate.append(hourFormatter.format(event.getDtstart())); if (event.getDtend() != null) { eventDate.append(" "); eventDate.append(hourFormatter.format(event.getDtend())); if (event.getDtstart().getDate() != event.getDtend().getDate() || event.getDtstart().getMonth() != event.getDtend().getMonth() || event.getDtstart().getYear() != event.getDtend().getYear()) { fullDayEvent = true; flowPanel.addStyleName("calendar-fullday-event"); } } final InlineLabel dateLabel = new InlineLabel(eventDate.toString()); dateLabel.addStyleName("calendar-event-date"); final InlineLabel eventLabel = new InlineLabel(event.getSummary()); eventLabel.addStyleName("calendar-event-label"); if (fullDayEvent) flowPanel.addStyleName("calendar-fullday-event-" + event.getParent().getStyle()); else eventLabel.addStyleName("calendar-event-" + event.getParent().getStyle()); if (!fullDayEvent) flowPanel.add(dateLabel); flowPanel.add(eventLabel); final DecoratedPopupPanel detailPopup = new DecoratedPopupPanel(true); final Grid popupContent = new Grid(event.getParent().isEditable() ? 5 : 3, 1); popupContent.setText(0, 0, event.getSummary()); popupContent.getCellFormatter().addStyleName(0, 0, "calendar-popup-header"); if (!fullDayEvent) { popupContent.getCellFormatter().addStyleName(1, 0, "calendar-popup-date"); popupContent .getCellFormatter() .addStyleName(1, 0, "calendar-event-" + event.getParent().getStyle()); popupContent.setText(1, 0, eventDate.toString()); } else popupContent.setText(1, 0, ""); if (event.getDescription() != null && !"".equals(event.getDescription())) { popupContent.getCellFormatter().addStyleName(2, 0, "calendar-popup-description"); popupContent.setText(2, 0, event.getDescription()); } else popupContent.setText(2, 0, ""); if (event.getParent().isEditable() && ProfileUtils.isGranted(authentication, GlobalPermissionEnum.EDIT_PROJECT_AGENDA)) { final Anchor editAnchor = new Anchor(I18N.CONSTANTS.calendarEditEvent()); editAnchor.addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent clickEvent) { delegate.edit(event, CalendarWidget.this); } }); final Anchor deleteAnchor = new Anchor(I18N.CONSTANTS.calendarDeleteEvent()); deleteAnchor.addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent clickEvent) { delegate.delete(event, CalendarWidget.this); detailPopup.hide(); } }); popupContent.setWidget(3, 0, editAnchor); popupContent.setWidget(4, 0, deleteAnchor); } detailPopup.setWidget(popupContent); flowPanel.addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent event) { final int left = flowPanel.getAbsoluteLeft() - 10; final int bottom = Window.getClientHeight() - flowPanel.getAbsoluteTop(); detailPopup.setWidth((getCellWidth(CELL_DEFAULT_WIDTH) + 20) + "px"); // Show the popup detailPopup.setPopupPositionAndShow( new PositionCallback() { @Override public void setPosition(int offsetWidth, int offsetHeight) { detailPopup.getElement().getStyle().setPropertyPx("left", left); detailPopup.getElement().getStyle().setProperty("top", ""); detailPopup.getElement().getStyle().setPropertyPx("bottom", bottom); } }); } }); cell.add(flowPanel); } if (eventLimit != UNDEFINED && sortedEvents.size() > eventLimit) { final Anchor eventLabel = new Anchor("\u25BC"); final Date thisDate = new Date(date.getTime()); eventLabel.addClickHandler( new ClickHandler() { @Override public void onClick(ClickEvent event) { startDate = thisDate; setDisplayMode(DisplayMode.WEEK); } }); eventLabel.addStyleName("calendar-event-limit"); cell.add(eventLabel); } }