private void addGlobalResizeStyle() {
   if (clickTarget == topResizeBar) {
     weekGrid.getCalendar().addStyleDependentName("nresize");
   } else if (clickTarget == bottomResizeBar) {
     weekGrid.getCalendar().addStyleDependentName("sresize");
   }
 }
  /**
   * @param dateOffset
   * @return the amount of pixels the given date is from the left side
   */
  private int calculateDateCellOffsetPx(int dateOffset) {
    int dateCellOffset = 0;
    int[] dateWidths = weekGrid.getDateCellWidths();

    if (dateWidths != null) {
      for (int i = 0; i < dateOffset; i++) {
        dateCellOffset += dateWidths[i] + 1;
      }
    } else {
      dateCellOffset = dateOffset * weekGrid.getDateCellWidth();
    }

    return dateCellOffset;
  }
  public void updatePosition(long startFromMinutes, long durationInMinutes) {
    if (startFromMinutes < 0) {
      startFromMinutes = 0;
    }
    top = weekGrid.getPixelTopFor((int) startFromMinutes);

    getElement().getStyle().setTop(top, Unit.PX);
    if (durationInMinutes > 0) {
      int heightMinutes =
          weekGrid.getPixelLengthFor((int) startFromMinutes, (int) durationInMinutes);
      setHeight(heightMinutes);
    } else {
      setHeight(-1);
    }

    boolean multiRowCaption = (durationInMinutes > 30);
    updateCaptions(multiRowCaption);
  }
  /* Returns total width of all date cells. */
  private int getDatesWidth() {
    if (weekGrid.width == -1) {
      // Undefined width. Needs to be calculated by the known cell
      // widths.
      int count = weekGrid.content.getWidgetCount() - 1;
      return count * getDateCellWidth();
    }

    return weekGrid.getInternalWidth();
  }
  public void onMouseDown(MouseDownEvent event) {
    startX = event.getClientX();
    startY = event.getClientY();
    if (isDisabled() || event.getNativeButton() != NativeEvent.BUTTON_LEFT) {
      return;
    }

    clickTarget = Element.as(event.getNativeEvent().getEventTarget());
    mouseMoveCanceled = false;

    if (weekGrid.getCalendar().isEventMoveAllowed() || clickTargetsResize()) {
      moveRegistration = addMouseMoveHandler(this);
      setFocus(true);
      try {
        startYrelative = (int) ((double) event.getRelativeY(caption) % slotHeight);
        startXrelative =
            (event.getRelativeX(weekGrid.getElement()) - weekGrid.timebar.getOffsetWidth())
                % getDateCellWidth();
      } catch (Exception e) {
        GWT.log("Exception calculating relative start position", e);
      }
      mouseMoveStarted = false;
      Style s = getElement().getStyle();
      s.setZIndex(1000);
      startDatetimeFrom = (Date) calendarEvent.getStartTime().clone();
      startDatetimeTo = (Date) calendarEvent.getEndTime().clone();
      Event.setCapture(getElement());
    }

    // make sure the right cursor is always displayed
    if (clickTargetsResize()) {
      addGlobalResizeStyle();
    }

    /*
     * We need to stop the event propagation or else the WeekGrid
     * range select will kick in
     */
    event.stopPropagation();
    event.preventDefault();
  }
  public DateCellDayEvent(DateCell dateCell, WeekGrid parent, CalendarEvent event) {
    super();
    this.dateCell = dateCell;

    handlers = new LinkedList<HandlerRegistration>();

    setStylePrimaryName("v-calendar-event");
    setCalendarEvent(event);

    weekGrid = parent;

    Style s = getElement().getStyle();
    if (event.getStyleName().length() > 0) {
      addStyleDependentName(event.getStyleName());
    }
    s.setPosition(Position.ABSOLUTE);

    caption = DOM.createDiv();
    caption.addClassName("v-calendar-event-caption");
    getElement().appendChild(caption);

    eventContent = DOM.createDiv();
    eventContent.addClassName("v-calendar-event-content");
    getElement().appendChild(eventContent);

    VCalendar calendar = weekGrid.getCalendar();
    if (weekGrid.getCalendar().isEventResizeAllowed()) {
      topResizeBar = DOM.createDiv();
      bottomResizeBar = DOM.createDiv();

      topResizeBar.addClassName("v-calendar-event-resizetop");
      bottomResizeBar.addClassName("v-calendar-event-resizebottom");

      getElement().appendChild(topResizeBar);
      getElement().appendChild(bottomResizeBar);
    }

    eventIndex = event.getIndex();
  }
  public void onMouseUp(MouseUpEvent event) {
    if (mouseMoveCanceled) {
      return;
    }

    Event.releaseCapture(getElement());
    setFocus(false);
    if (moveRegistration != null) {
      moveRegistration.removeHandler();
      moveRegistration = null;
    }
    int endX = event.getClientX();
    int endY = event.getClientY();
    int xDiff = startX - endX;
    int yDiff = startY - endY;
    startX = -1;
    startY = -1;
    mouseMoveStarted = false;
    Style s = getElement().getStyle();
    s.setZIndex(1);
    if (!clickTargetsResize()) {
      // check if mouse has moved over threshold of 3 pixels
      boolean mouseMoved = (xDiff < -3 || xDiff > 3 || yDiff < -3 || yDiff > 3);

      if (!weekGrid.getCalendar().isDisabledOrReadOnly() && mouseMoved) {
        // Event Move:
        // - calendar must be enabled
        // - calendar must not be in read-only mode
        weekGrid.eventMoved(this);
      } else if (!weekGrid.getCalendar().isDisabled()) {
        // Event Click:
        // - calendar must be enabled (read-only is allowed)
        EventTarget et = event.getNativeEvent().getEventTarget();
        Element e = Element.as(et);
        if (e == caption || e == eventContent || e.getParentElement() == caption) {
          if (weekGrid.getCalendar().getEventClickListener() != null) {
            weekGrid.getCalendar().getEventClickListener().eventClick(calendarEvent);
          }
        }
      }

    } else { // click targeted resize bar
      removeGlobalResizeStyle();
      if (weekGrid.getCalendar().getEventResizeListener() != null) {
        weekGrid.getCalendar().getEventResizeListener().eventResized(calendarEvent);
      }
    }
  }
 private void removeGlobalResizeStyle() {
   weekGrid.getCalendar().removeStyleDependentName("nresize");
   weekGrid.getCalendar().removeStyleDependentName("sresize");
 }
 /** @return true if the current mouse movement is resizing */
 private boolean clickTargetsResize() {
   return weekGrid.getCalendar().isEventResizeAllowed()
       && (clickTarget == topResizeBar || clickTarget == bottomResizeBar);
 }
Esempio n. 10
0
 private int getDateCellWidth() {
   return weekGrid.getDateCellWidth();
 }
Esempio n. 11
0
  @SuppressWarnings("deprecation")
  public void onMouseMove(MouseMoveEvent event) {
    if (startY < 0 && startX < 0) {
      return;
    }
    if (isDisabled()) {
      Event.releaseCapture(getElement());
      mouseMoveStarted = false;
      startY = -1;
      startX = -1;
      removeGlobalResizeStyle();
      return;
    }
    int currentY = event.getClientY();
    int currentX = event.getClientX();
    int moveY = (currentY - startY);
    int moveX = (currentX - startX);
    if ((moveY < 5 && moveY > -6) && (moveX < 5 && moveX > -6)) {
      return;
    }
    if (!mouseMoveStarted) {
      setWidth(moveWidth);
      getElement().getStyle().setMarginLeft(0, Unit.PX);
      mouseMoveStarted = true;
    }

    HorizontalPanel parent = (HorizontalPanel) getParent().getParent();
    int relativeX = event.getRelativeX(parent.getElement()) - weekGrid.timebar.getOffsetWidth();
    int halfHourDiff = 0;
    if (moveY > 0) {
      halfHourDiff = (startYrelative + moveY) / slotHeight;
    } else {
      halfHourDiff = (moveY - startYrelative) / slotHeight;
    }

    int dateCellWidth = getDateCellWidth();
    long dayDiff = 0;
    if (moveX >= 0) {
      dayDiff = (startXrelative + moveX) / dateCellWidth;
    } else {
      dayDiff = (moveX - (dateCellWidth - startXrelative)) / dateCellWidth;
    }

    int dayOffset = relativeX / dateCellWidth;

    // sanity check for right side overflow
    int dateCellCount = weekGrid.getDateCellCount();
    if (dayOffset >= dateCellCount) {
      dayOffset--;
      dayDiff--;
    }

    int dayOffsetPx = calculateDateCellOffsetPx(dayOffset) + weekGrid.timebar.getOffsetWidth();

    GWT.log(
        "DateCellWidth: "
            + dateCellWidth
            + " dayDiff: "
            + dayDiff
            + " dayOffset: "
            + dayOffset
            + " dayOffsetPx: "
            + dayOffsetPx
            + " startXrelative: "
            + startXrelative
            + " moveX: "
            + moveX);

    if (relativeX < 0 || relativeX >= getDatesWidth()) {
      return;
    }

    Style s = getElement().getStyle();

    Date from = calendarEvent.getStartTime();
    Date to = calendarEvent.getEndTime();
    long duration = to.getTime() - from.getTime();

    if (!clickTargetsResize() && weekGrid.getCalendar().isEventMoveAllowed()) {
      long daysMs = dayDiff * DateConstants.DAYINMILLIS;
      from.setTime(startDatetimeFrom.getTime() + daysMs);
      from.setTime(from.getTime() + ((long) halfHourInMilliSeconds * halfHourDiff));
      to.setTime((from.getTime() + duration));

      calendarEvent.setStartTime(from);
      calendarEvent.setEndTime(to);
      calendarEvent.setStart(new Date(from.getTime()));
      calendarEvent.setEnd(new Date(to.getTime()));

      // Set new position for the event
      long startFromMinutes = (from.getHours() * 60) + from.getMinutes();
      long range = calendarEvent.getRangeInMinutes();
      startFromMinutes = calculateStartFromMinute(startFromMinutes, from, to, dayOffsetPx);
      if (startFromMinutes < 0) {
        range += startFromMinutes;
      }
      updatePosition(startFromMinutes, range);

      s.setLeft(dayOffsetPx, Unit.PX);

      if (weekGrid.getDateCellWidths() != null) {
        s.setWidth(weekGrid.getDateCellWidths()[dayOffset], Unit.PX);
      } else {
        setWidth(moveWidth);
      }

    } else if (clickTarget == topResizeBar) {
      long oldStartTime = startDatetimeFrom.getTime();
      long newStartTime = oldStartTime + ((long) halfHourInMilliSeconds * halfHourDiff);

      if (!isTimeRangeTooSmall(newStartTime, startDatetimeTo.getTime())) {
        newStartTime = startDatetimeTo.getTime() - getMinTimeRange();
      }

      from.setTime(newStartTime);

      calendarEvent.setStartTime(from);
      calendarEvent.setStart(new Date(from.getTime()));

      // Set new position for the event
      long startFromMinutes = (from.getHours() * 60) + from.getMinutes();
      long range = calendarEvent.getRangeInMinutes();

      updatePosition(startFromMinutes, range);

    } else if (clickTarget == bottomResizeBar) {
      long oldEndTime = startDatetimeTo.getTime();
      long newEndTime = oldEndTime + ((long) halfHourInMilliSeconds * halfHourDiff);

      if (!isTimeRangeTooSmall(startDatetimeFrom.getTime(), newEndTime)) {
        newEndTime = startDatetimeFrom.getTime() + getMinTimeRange();
      }

      to.setTime(newEndTime);

      calendarEvent.setEndTime(to);
      calendarEvent.setEnd(new Date(to.getTime()));

      // Set new position for the event
      long startFromMinutes = (startDatetimeFrom.getHours() * 60) + startDatetimeFrom.getMinutes();
      long range = calendarEvent.getRangeInMinutes();
      startFromMinutes = calculateStartFromMinute(startFromMinutes, from, to, dayOffsetPx);
      if (startFromMinutes < 0) {
        range += startFromMinutes;
      }
      updatePosition(startFromMinutes, range);
    }
  }