protected void onMouseMove(Event event) {
   targetXY = event.<XEvent>cast().getXY();
   if (isAttached() && toolTipConfig.isTrackMouse()) {
     Side origAnchor = toolTipConfig.getAnchor();
     Point p = getTargetXY(0);
     toolTipConfig.setAnchor(origAnchor);
     if (constrainPosition) {
       p = getElement().adjustForConstraints(p);
     }
     setPagePosition(p.getX(), p.getY());
   }
 }
  private Point getTargetXY(int targetCounter) {
    if (toolTipConfig.getAnchor() != null) {
      targetCounter++;
      int[] offsets = getOffsets();
      Point xy =
          (toolTipConfig.isAnchorToTarget() && !toolTipConfig.isTrackMouse())
              ? getElement().getAlignToXY(target.getElement(), getAnchorAlign(), null)
              : targetXY;

      int dw = XDOM.getViewWidth(false) - 5;
      int dh = XDOM.getViewHeight(false) - 5;
      int scrollX = XDOM.getBodyScrollLeft() + 5;
      int scrollY = XDOM.getBodyScrollTop() + 5;

      int[] axy = new int[] {xy.getX() + offsets[0], xy.getY() + offsets[1]};
      Size sz = getElement().getSize();
      Region r = XElement.as(target.getElement()).getRegion();

      appearance.removeAnchorStyle(anchorEl);

      // if we are not inside valid ranges we try to switch the anchor
      if (!((toolTipConfig.getAnchor() == Side.TOP
                  && (sz.getHeight() + offsets[1] + scrollY < dh - r.getBottom()))
              || (toolTipConfig.getAnchor() == Side.RIGHT
                  && (sz.getWidth() + offsets[0] + scrollX < r.getLeft()))
              || (toolTipConfig.getAnchor() == Side.BOTTOM
                  && (sz.getHeight() + offsets[1] + scrollY < r.getTop()))
              || (toolTipConfig.getAnchor() == Side.LEFT
                  && (sz.getWidth() + offsets[0] + scrollX < dw - r.getRight())))
          && targetCounter < 4) {
        if (sz.getWidth() + offsets[0] + scrollX < dw - r.getRight()) {
          toolTipConfig.setAnchor(Side.LEFT);
          return getTargetXY(targetCounter);
        }
        if (sz.getWidth() + offsets[0] + scrollX < r.getLeft()) {
          toolTipConfig.setAnchor(Side.RIGHT);
          return getTargetXY(targetCounter);
        }
        if (sz.getHeight() + offsets[1] + scrollY < dh - r.getBottom()) {
          toolTipConfig.setAnchor(Side.TOP);
          return getTargetXY(targetCounter);
        }
        if (sz.getHeight() + offsets[1] + scrollY < r.getTop()) {
          toolTipConfig.setAnchor(Side.BOTTOM);
          return getTargetXY(targetCounter);
        }
      }

      appearance.applyAnchorDirectionStyle(anchorEl, toolTipConfig.getAnchor());

      targetCounter = 0;
      return new Point(axy[0], axy[1]);

    } else {
      int x = targetXY.getX();
      int y = targetXY.getY();

      int[] mouseOffset = toolTipConfig.getMouseOffset();
      if (mouseOffset != null) {
        x += mouseOffset[0];
        y += mouseOffset[1];
      }
      return new Point(x, y);
    }
  }