boolean constrainViewport = alignment.isConstrainViewport();
Anchor anch1 = alignment.getAlign();
Anchor anch2 = alignment.getTargetAlign();
// Subtract the aligned el's internal xy from the target's offset xy
// plus custom offset to get the aligned el's new offset xy
Point a1 = getAnchorXY(anch1, true);
Point a2 = el.getAnchorXY(anch2, false);
int x = a2.getX() - a1.getX() + ox;
int y = a2.getY() - a1.getY() + oy;
if (constrainViewport) {
// constrain the aligned el to viewport if necessary
int w = getOffsetWidth();
int h = getOffsetHeight();
Region r = el.getRegion();
// 5px of margin for ie
int dw = XDOM.getViewWidth(false) - 10;
int dh = XDOM.getViewHeight(false) - 10;
// If we are at a viewport boundary and the aligned el is anchored on a
// target border that is
// perpendicular to the vp border, allow the aligned el to slide on that
// border,
// otherwise swap the aligned el to the opposite border of the target.
boolean swapY = (anch1.isTop() && anch2.isBottom()) || (anch1.isBottom() && anch2.isTop());
boolean swapX = (anch1.isRight() && anch2.isLeft()) || (anch1.isLeft() && anch2.isRight());
// EXTGWT-1730 only applying 5 when there is scrolling. 5 may be able to
// be removed
// but not sure why this was added in first place. it exists in 2.0
int scrollX = XDOM.getBodyScrollLeft();
if (scrollX > 0) {
scrollX += 5;
}
int scrollY = XDOM.getBodyScrollTop();
if (scrollY > 0) {
scrollY += 5;
}
if ((x + w) > dw + scrollX) {
x = swapX ? r.getLeft() - w : dw + scrollX - w;
}
if (x < scrollX) {
x = swapX ? r.getRight() : scrollX;
}
if ((y + h) > (dh + scrollY)) {
y = swapY ? r.getTop() - h : dh + scrollY - h;
}
if (y < scrollY) {
y = swapY ? r.getBottom() : scrollY;
}
}
return new Point(x, y);
}