|
|
|
@ -842,26 +842,59 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
|
|
|
|
|
if (shouldContinue) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
//如果组件为XWCardMainBorderLayout的子组件,直接从XWCardMainBorderLayout中去找
|
|
|
|
|
XWCardMainBorderLayout borderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); |
|
|
|
|
if (borderLayout != null) { |
|
|
|
|
return xCreatorAt(x, y, borderLayout, null); |
|
|
|
|
//获取当前组件父组件相对于rootComponent或者paraComponent的距离
|
|
|
|
|
int relativeParentX = getRelativeParentX(creator.getParent()); |
|
|
|
|
int relativeParentY = getRelativeParentY(creator.getParent()); |
|
|
|
|
|
|
|
|
|
//如果不是布局容器,直接进行对比
|
|
|
|
|
if (!(creator instanceof XLayoutContainer)) { |
|
|
|
|
x -= relativeParentX + creator.getX(); |
|
|
|
|
y -= relativeParentY + creator.getY(); |
|
|
|
|
Rectangle rect = ComponentUtils.computeVisibleRect(creator); |
|
|
|
|
// 判断是否处于交叉区域
|
|
|
|
|
if (isIntersectArea(x, y, rect)) { |
|
|
|
|
return creator; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//如果是布局容器,从布局容器向下找
|
|
|
|
|
if (creator instanceof XLayoutContainer) { |
|
|
|
|
return xCreatorAt(x, y, creator, null); |
|
|
|
|
XCreator result = xCreatorAt(x - relativeParentX, y - relativeParentY, creator, null); |
|
|
|
|
if (result != null) return result; |
|
|
|
|
} |
|
|
|
|
x -= creator.getX(); |
|
|
|
|
y -= creator.getY(); |
|
|
|
|
Rectangle rect = ComponentUtils.computeVisibleRect(creator); |
|
|
|
|
// 判断是否处于交叉区域
|
|
|
|
|
if (!isIntersectArea(x, y, rect)) { |
|
|
|
|
continue; |
|
|
|
|
|
|
|
|
|
//最后,如果组件为Tab容器中的子组件,再从Tab容器中去找
|
|
|
|
|
XWCardMainBorderLayout borderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); |
|
|
|
|
if (borderLayout != null) { |
|
|
|
|
relativeParentX = getRelativeParentX(borderLayout.getParent()); |
|
|
|
|
relativeParentY = getRelativeParentY(borderLayout.getParent()); |
|
|
|
|
return xCreatorAt(x - relativeParentX, y - relativeParentY, borderLayout, null); |
|
|
|
|
} |
|
|
|
|
return creator; |
|
|
|
|
} |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取当前组件相对于rootComponent或者paraComponent的横向距离 |
|
|
|
|
*/ |
|
|
|
|
private int getRelativeParentX(Container container) { |
|
|
|
|
return returnZero(container) ? 0 : container.getX() + getRelativeParentX(container.getParent()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 获取当前组件相对于rootComponent或者paraComponent的纵向距离 |
|
|
|
|
*/ |
|
|
|
|
private int getRelativeParentY(Container container) { |
|
|
|
|
return returnZero(container) ? 0 : container.getY() + getRelativeParentY(container.getParent()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean returnZero(Container container) { |
|
|
|
|
return !(container instanceof XLayoutContainer) |
|
|
|
|
|| container == rootComponent |
|
|
|
|
|| (paraComponent != null && container == paraComponent); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 刷新顶层组件 |
|
|
|
|
* */ |
|
|
|
|