Пример #1
0
  /**
   * 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);
    }
  }