/** @param e */
  @Override
  public void mouseDragged(MouseEvent e) {
    inDrag = true;

    Point coords = toRealCoords(e.getPoint());

    if ((dragDiff == null) && (getSelectedObject() != null)) {
      dragDiff =
          new Dimension(
              (int)
                  Math.abs(
                      coords.getX()
                          - getSelectedObject()
                              .getPojo()
                              .getCurrentRepresentation()
                              .getOffset()
                              .getX()),
              (int)
                  Math.abs(
                      coords.getY()
                          - getSelectedObject()
                              .getPojo()
                              .getCurrentRepresentation()
                              .getOffset()
                              .getY()));
    }

    int xSnapped = (int) coords.getX() - ((int) coords.getX() % SNAP_TO_GRID);
    int ySnapped = (int) coords.getY() - ((int) coords.getY() % SNAP_TO_GRID);

    // in object edit mode
    if (objectEditMode && (getSelectedObject() != null)) {
      for (Representation representation : getSelectedObject().getPojo().getRepresentations()) {
        // move an object
        representation.setOffset(
            xSnapped - (int) dragDiff.getWidth(), ySnapped - (int) dragDiff.getHeight());
        setNeedRepaint(true);
      }
    } else {
      if (roomEditMode) {
        removeIndicators();

        Callout callout =
            new Callout(
                this.getClass().getCanonicalName(),
                "mouse",
                selectedZone.getPojo().getName() + ": " + xSnapped + "cm," + ySnapped + "cm",
                (int) coords.getX() + 50,
                (int) coords.getY() + 50,
                0,
                -1);
        createCallout(callout);

        for (Handle handle : handles) {
          // move the zone point
          if (handle.isSelected()) {
            if (null == originalHandleLocation) {
              originalHandleLocation =
                  new FreedomPoint(handle.getPoint().getX(), handle.getPoint().getY());
            }
            handle.move(xSnapped, ySnapped);
            addIndicator(TopologyUtils.convertToAWT(selectedZone.getPojo().getShape()));
            // add indicators for overlapping zones
            selectedZone = handle.getZone();
            for (ZoneLogic overlapped : overlappedRooms(selectedZone)) {
              // mark the zone in red if it is overlapped
              addIndicator(
                  TopologyUtils.convertToAWT(overlapped.getPojo().getShape()),
                  new Color(255, 0, 0, HIGH_OPACITY));
            }
          }
        }
        setNeedRepaint(true);
      }
    }
  }