Browse Source

REPORT-1899

master
yaoh.wu 8 years ago
parent
commit
d6b22c772d
  1. 30
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java
  2. 8
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java

30
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java

@ -2,6 +2,7 @@ package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.PaddingMargin; import com.fr.form.ui.PaddingMargin;
@ -49,6 +50,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
protected int minHeight = 0; protected int minHeight = 0;
protected int actualVal = 0; // 存在间隔时,add move drag 判断对齐等都要考虑 protected int actualVal = 0; // 存在间隔时,add move drag 判断对齐等都要考虑
protected PaddingMargin margin; // 布局容器边距 protected PaddingMargin margin; // 布局容器边距
/** /**
* 在添加组件状态时当鼠标移动到某个容器上方时如果该容器有布局管理器则会调用该布局 * 在添加组件状态时当鼠标移动到某个容器上方时如果该容器有布局管理器则会调用该布局
* 管理适配器的accept来决定当前位置是否可以放置并提供特殊的标识比如红色区域标识 * 管理适配器的accept来决定当前位置是否可以放置并提供特殊的标识比如红色区域标识
@ -76,6 +78,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 交叉点区域时能否对应位置放入组件 * 交叉点区域时能否对应位置放入组件
*
* @param comp 待放置组件 * @param comp 待放置组件
* @param x x * @param x x
* @param y y * @param y y
@ -129,6 +132,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 三等分区域时能否对应位置放入组件 * 三等分区域时能否对应位置放入组件
*
* @param comp 待放置组件 * @param comp 待放置组件
* @param x x * @param x x
* @param y y * @param y y
@ -367,6 +371,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 判断是否鼠标在组件的三等分区域如果组件在布局管理器中间上下左右都可能会三等分 * 判断是否鼠标在组件的三等分区域如果组件在布局管理器中间上下左右都可能会三等分
*
* @param parentComp 鼠标所在区域的组件 * @param parentComp 鼠标所在区域的组件
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
@ -407,6 +412,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 是否为组件交叉点区域 或者是相邻三组建中间点 * 是否为组件交叉点区域 或者是相邻三组建中间点
*
* @param currentComp 当前组件 * @param currentComp 当前组件
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
@ -513,6 +519,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 平分正常情况拖入组件时按照上1/4区域下1/4区域为上下平分中左侧1/2区域中右侧1/2区域为左右平分 * 平分正常情况拖入组件时按照上1/4区域下1/4区域为上下平分中左侧1/2区域中右侧1/2区域为左右平分
*
* @param currentComp 当前位置组件 * @param currentComp 当前位置组件
* @param child 待放置组件 * @param child 待放置组件
* @param x x * @param x x
@ -622,10 +629,28 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
private int getPositionOfFix(XCreator currentCreator, int x, int y) { private int getPositionOfFix(XCreator currentCreator, int x, int y) {
int position = 0; int position = 0;
XLayoutContainer cardLayout = ((XWCardMainBorderLayout) currentCreator).getCardPart(); XLayoutContainer cardLayout = ((XWCardMainBorderLayout) currentCreator).getCardPart();
XLayoutContainer container = (XLayoutContainer) cardLayout.getComponent(0); XLayoutContainer container = (XLayoutContainer) cardLayout.getComponent(0);
Rectangle rect = ComponentUtils.getRelativeBounds(container); Rectangle rect = ComponentUtils.getRelativeBounds(container);
/*
* 为了获取到鼠标drop位置的控件
* 我们之前已经将y值变为相对坐标值
* 由于在x轴上没有偏移所以x值一直等于相对坐标值最多差一个边界值1
* 在进行新添加的控件位置计算时
* 又通过ComponentUtils.getRelativeBounds()方法获取到了绝对坐标
* 再次计算相对坐标所以将y值重新变成绝对坐标
* */
if (currentCreator.getParent().getParent().getComponent(0) instanceof XWParameterLayout) {
int high = currentCreator.getParent().getParent().getComponent(0).getHeight();
y = y + WCardMainBorderLayout.TAB_HEIGHT + high;
} else {
y = y + WCardMainBorderLayout.TAB_HEIGHT;
}
int tempX = x - rect.x; int tempX = x - rect.x;
int tempY = y - rect.y + WCardMainBorderLayout.TAB_HEIGHT; int tempY = y - rect.y;
int containerX = container.getX(); int containerX = container.getX();
int containerY = container.getY(); int containerY = container.getY();
int containerWidth = container.getWidth(); int containerWidth = container.getWidth();
@ -658,6 +683,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
* 组件交叉区域进行插入时调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑后面测试中发现有bug改为和bi一样的鼠标所在侧平分 * 组件交叉区域进行插入时调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑后面测试中发现有bug改为和bi一样的鼠标所在侧平分
* 默认左上角右下角区域是垂直方向插入组件 * 默认左上角右下角区域是垂直方向插入组件
* 右上角和左下角是水平方向插入组件这样避免田字块时重复 * 右上角和左下角是水平方向插入组件这样避免田字块时重复
*
* @param currentComp 当前位置组件 * @param currentComp 当前位置组件
* @param child 待放置组件 * @param child 待放置组件
* @param x x * @param x x
@ -900,6 +926,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 三等分区域时调整相关联的组件 * 三等分区域时调整相关联的组件
*
* @param currentComp 鼠标所在组件 * @param currentComp 鼠标所在组件
* @param child 待插入组件 * @param child 待插入组件
*/ */
@ -1122,6 +1149,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
/** /**
* 不调整只计算位置 * 不调整只计算位置
*
* @return child的位置 * @return child的位置
*/ */
public int[] getChildPosition(Component currentComp, XCreator child, int x, int y) { public int[] getChildPosition(Component currentComp, XCreator child, int x, int y) {

8
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java

@ -9,6 +9,7 @@ import java.awt.Rectangle;
import com.fr.design.beans.GroupModel; import com.fr.design.beans.GroupModel;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.creator.XWidgetCreator; import com.fr.design.designer.creator.XWidgetCreator;
import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
@ -30,6 +31,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
/** /**
* 构造函数 * 构造函数
*
* @param container XWTabFitLayout容器 * @param container XWTabFitLayout容器
*/ */
public FRTabFitLayoutAdapter(XLayoutContainer container) { public FRTabFitLayoutAdapter(XLayoutContainer container) {
@ -48,6 +50,7 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
/** /**
* 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的 * 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的
* addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能 * addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能
*
* @param creator 被添加的新组件 * @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的 * @param y 添加的位置y该位置是相对于container的
@ -83,9 +86,14 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
// tab布局的纵坐标受到tab高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界, // tab布局的纵坐标受到tab高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界,
// 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度减掉 // 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度减掉
//将y值变为相对坐标以实现获取到鼠标drop位置的控件
//TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了
private int adjustY(int y, XWTabFitLayout tabLayout) { private int adjustY(int y, XWTabFitLayout tabLayout) {
XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent(); XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent();
LayoutBorderStyle style = cardLayout.toData().getBorderStyle(); LayoutBorderStyle style = cardLayout.toData().getBorderStyle();
if (container.getParent().getComponent(0) instanceof XWParameterLayout) {
y = y - container.getParent().getComponent(0).getHeight() - container.getParent().getComponent(0).getY();
}
if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) { if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) {
y -= WCardMainBorderLayout.TAB_HEIGHT; y -= WCardMainBorderLayout.TAB_HEIGHT;
} }

Loading…
Cancel
Save