|
|
|
@ -2,9 +2,11 @@ package com.fr.design.designer.beans.adapters.layout;
|
|
|
|
|
|
|
|
|
|
import com.fr.design.designer.creator.XCreator; |
|
|
|
|
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.utils.ComponentUtils; |
|
|
|
|
import com.fr.form.ui.PaddingMargin; |
|
|
|
|
import com.fr.form.ui.container.WBorderLayout; |
|
|
|
|
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; |
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
|
|
|
|
@ -17,7 +19,7 @@ import java.util.*;
|
|
|
|
|
* 所以把公共的方法挪动这边父类里来 |
|
|
|
|
* Created by zhouping on 2016/8/18. |
|
|
|
|
*/ |
|
|
|
|
public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{ |
|
|
|
|
public class FRBodyLayoutAdapter extends AbstractLayoutAdapter { |
|
|
|
|
protected static final int COMP_TOP = 1; |
|
|
|
|
protected static final int COMP_BOTTOM = 2; |
|
|
|
|
protected static final int COMP_LEFT = 3; |
|
|
|
@ -34,7 +36,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
protected static final int BORDER_PROPORTION = 10; //边界三等分或交叉区域大小取组件1/10和默认大小
|
|
|
|
|
|
|
|
|
|
protected int trisectAreaDirect = 0; |
|
|
|
|
protected int crossPointAreaDirect = 0; |
|
|
|
|
private int crossPointAreaDirect = 0; |
|
|
|
|
// 增加删除拉伸控件用的临时list
|
|
|
|
|
protected java.util.List<Component> rightComps; |
|
|
|
|
protected java.util.List<Component> leftComps; |
|
|
|
@ -49,6 +51,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
protected int minHeight = 0; |
|
|
|
|
protected int actualVal = 0; // 存在间隔时,add move drag 判断对齐等都要考虑
|
|
|
|
|
protected PaddingMargin margin; // 布局容器边距
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 在添加组件状态时,当鼠标移动到某个容器上方时,如果该容器有布局管理器,则会调用该布局 |
|
|
|
|
* 管理适配器的accept来决定当前位置是否可以放置,并提供特殊的标识,比如红色区域标识。比 |
|
|
|
@ -76,9 +79,10 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 交叉点区域时,能否对应位置放入组件 |
|
|
|
|
* |
|
|
|
|
* @param comp 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @return 能否放入 |
|
|
|
|
*/ |
|
|
|
|
protected boolean canAcceptWhileCrossPoint(Component comp, int x, int y) { |
|
|
|
@ -95,7 +99,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
min = isNotDefaultArea ? min : minWidth * 2; |
|
|
|
|
} else if (ComparatorUtils.equals(crossPointAreaDirect, COMP_RIGHT_BOTTOM)) { |
|
|
|
|
bottomComp = container.getRightBottomComp(cX, cY, cH, cW); |
|
|
|
|
isNotDefaultArea = (bottomComp == null) || (bottomComp.getX()+bottomComp.getWidth() != cX + cW) ; |
|
|
|
|
isNotDefaultArea = (bottomComp == null) || (bottomComp.getX() + bottomComp.getWidth() != cX + cW); |
|
|
|
|
rightComp = container.getBottomRightComp(cX, cY, cH, cW); |
|
|
|
|
minLength = isNotDefaultArea ? Math.min(cH, rightComp.getHeight()) : Math.min(cW, bottomComp.getWidth()); |
|
|
|
|
min = isNotDefaultArea ? min : minWidth * 2; |
|
|
|
@ -105,12 +109,12 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
minLength = isNotDefaultArea ? Math.min(cW, bottomComp.getWidth()) : Math.min(cH, leftComp.getHeight()); |
|
|
|
|
min = isNotDefaultArea ? minWidth * 2 : min; |
|
|
|
|
} else if (ComparatorUtils.equals(crossPointAreaDirect, COMP_RIGHT_TOP)) { |
|
|
|
|
isNotDefaultArea = (rightComp == null) || (rightComp.getY() != cY) ; |
|
|
|
|
isNotDefaultArea = (rightComp == null) || (rightComp.getY() != cY); |
|
|
|
|
topComp = container.getRightTopComp(cX, cY, cW); |
|
|
|
|
minLength = isNotDefaultArea ? Math.min(cW, topComp.getWidth()) : Math.min(cH, rightComp.getWidth()); |
|
|
|
|
min = isNotDefaultArea ? minWidth * 2 : min ; |
|
|
|
|
min = isNotDefaultArea ? minWidth * 2 : min; |
|
|
|
|
} else if (ComparatorUtils.equals(crossPointAreaDirect, COMP_TOP)) { |
|
|
|
|
minLength= Math.min(rightComp.getHeight(), Math.min(cH, leftComp.getHeight())); |
|
|
|
|
minLength = Math.min(rightComp.getHeight(), Math.min(cH, leftComp.getHeight())); |
|
|
|
|
} else if (ComparatorUtils.equals(crossPointAreaDirect, COMP_BOTTOM)) { |
|
|
|
|
leftComp = container.getBottomLeftComp(cX, cY, cH); |
|
|
|
|
rightComp = container.getBottomRightComp(cX, cY, cH, cW); |
|
|
|
@ -129,9 +133,10 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 三等分区域时,能否对应位置放入组件 |
|
|
|
|
* |
|
|
|
|
* @param comp 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @return 能否放入 |
|
|
|
|
*/ |
|
|
|
|
protected boolean canAcceptWhileTrisection(Component comp, int x, int y) { |
|
|
|
@ -142,28 +147,28 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
upMinHeight = getUpMinHeightComp(cY, x); |
|
|
|
|
downMinHeight = getDownMinHeightComp(comp, y); |
|
|
|
|
return upMinHeight == 0 ? downMinHeight >= minHeight * 2 + actualVal : (upMinHeight + downMinHeight) >= minHeight * 3 + actualVal; |
|
|
|
|
} else if(ComparatorUtils.equals(trisectAreaDirect, COMP_BOTTOM)) { |
|
|
|
|
} else if (ComparatorUtils.equals(trisectAreaDirect, COMP_BOTTOM)) { |
|
|
|
|
upMinHeight = getUpMinHeightComp(cY + cH + actualVal, x); |
|
|
|
|
if (cY + cH + DEFAULT_AREA_LENGTH>container.getHeight() - margin.getBottom()){ |
|
|
|
|
if (cY + cH + DEFAULT_AREA_LENGTH > container.getHeight() - margin.getBottom()) { |
|
|
|
|
downMinHeight = 0; |
|
|
|
|
} else { |
|
|
|
|
Component targetComp = container.getBottomComp(x, cY, cH); |
|
|
|
|
downMinHeight = getDownMinHeightComp(targetComp, cY + cH + DEFAULT_AREA_LENGTH + actualVal); |
|
|
|
|
} |
|
|
|
|
return downMinHeight == 0 ? (upMinHeight >= minHeight * 2 + actualVal) : ((upMinHeight+downMinHeight) >= minHeight * 3 + actualVal); |
|
|
|
|
} else if(ComparatorUtils.equals(trisectAreaDirect, COMP_LEFT)) { |
|
|
|
|
rightMinWidth = getMinRightWidth(cX, 0, y); |
|
|
|
|
if(cX - DEFAULT_AREA_LENGTH < margin.getLeft()) { |
|
|
|
|
return downMinHeight == 0 ? (upMinHeight >= minHeight * 2 + actualVal) : ((upMinHeight + downMinHeight) >= minHeight * 3 + actualVal); |
|
|
|
|
} else if (ComparatorUtils.equals(trisectAreaDirect, COMP_LEFT)) { |
|
|
|
|
rightMinWidth = getMinRightWidth(cX, 0, y); |
|
|
|
|
if (cX - DEFAULT_AREA_LENGTH < margin.getLeft()) { |
|
|
|
|
leftMinWidth = 0; |
|
|
|
|
} else { |
|
|
|
|
Component targetRightComp = container.getLeftComp(cX, y); |
|
|
|
|
leftMinWidth = getMinLeftWidth(targetRightComp, cX - DEFAULT_AREA_LENGTH - actualVal); |
|
|
|
|
} |
|
|
|
|
return leftMinWidth == 0 ? (rightMinWidth >= minWidth * 2 + actualVal) : ((leftMinWidth+rightMinWidth) >= minWidth * 3 + actualVal); |
|
|
|
|
} else if(ComparatorUtils.equals(trisectAreaDirect, COMP_RIGHT)) { |
|
|
|
|
return leftMinWidth == 0 ? (rightMinWidth >= minWidth * 2 + actualVal) : ((leftMinWidth + rightMinWidth) >= minWidth * 3 + actualVal); |
|
|
|
|
} else if (ComparatorUtils.equals(trisectAreaDirect, COMP_RIGHT)) { |
|
|
|
|
leftMinWidth = getMinLeftWidth(comp, x); |
|
|
|
|
rightMinWidth = getMinRightWidth(cX, cW, y); |
|
|
|
|
return rightMinWidth == 0 ? (leftMinWidth >= minWidth * 2 + actualVal) : ((leftMinWidth+rightMinWidth) >= minWidth * 3 + actualVal); |
|
|
|
|
return rightMinWidth == 0 ? (leftMinWidth >= minWidth * 2 + actualVal) : ((leftMinWidth + rightMinWidth) >= minWidth * 3 + actualVal); |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
@ -176,16 +181,16 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (cY == margin.getTop()) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
int max=container.getWidth() - margin.getRight(); |
|
|
|
|
int max = container.getWidth() - margin.getRight(); |
|
|
|
|
int mouseX = x; |
|
|
|
|
int minHeight = cY; |
|
|
|
|
int bott = 0; |
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
upComps = new ArrayList<Component>(); |
|
|
|
|
} |
|
|
|
|
for(; mouseX<max; ){ |
|
|
|
|
for (; mouseX < max; ) { |
|
|
|
|
Component comp = container.getTopComp(mouseX, cY); |
|
|
|
|
if(comp == null){ |
|
|
|
|
if (comp == null) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
bott = comp.getHeight() + comp.getY() + actualVal; |
|
|
|
@ -197,26 +202,26 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
upComps.add(comp); |
|
|
|
|
} |
|
|
|
|
} else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(container.getTopComp(x, cY) == null){ |
|
|
|
|
if (container.getTopComp(x, cY) == null) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
mouseX = container.getTopComp(x, cY).getX() - DEFAULT_AREA_LENGTH - actualVal; |
|
|
|
|
while(mouseX > margin.getLeft()) { |
|
|
|
|
while (mouseX > margin.getLeft()) { |
|
|
|
|
Component comp = container.getTopComp(mouseX, cY); |
|
|
|
|
bott = comp.getHeight() + comp.getY()+actualVal; |
|
|
|
|
bott = comp.getHeight() + comp.getY() + actualVal; |
|
|
|
|
if (bott == cY) { |
|
|
|
|
if (comp.getHeight() < minHeight) { |
|
|
|
|
minHeight = comp.getHeight(); |
|
|
|
|
} |
|
|
|
|
mouseX = comp.getX()-DEFAULT_AREA_LENGTH-actualVal; |
|
|
|
|
mouseX = comp.getX() - DEFAULT_AREA_LENGTH - actualVal; |
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
upComps.add(comp); |
|
|
|
|
} |
|
|
|
|
} else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -231,13 +236,13 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int cX = currentcomp.getX(); |
|
|
|
|
int cY = currentcomp.getY(); |
|
|
|
|
int minHeight = currentcomp.getHeight(); |
|
|
|
|
int max=container.getWidth() - margin.getRight(); |
|
|
|
|
int max = container.getWidth() - margin.getRight(); |
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
downComps = new ArrayList<Component>(); |
|
|
|
|
} |
|
|
|
|
int mouseX = cX + DEFAULT_AREA_LENGTH; |
|
|
|
|
while (mouseX < max) { |
|
|
|
|
Component comp = container.getComponentAt(mouseX, y); |
|
|
|
|
Component comp = container.getComponentAt(mouseX, y); |
|
|
|
|
if (comp.getY() == cY) { |
|
|
|
|
if (comp.getHeight() < minHeight) { |
|
|
|
|
minHeight = comp.getHeight(); |
|
|
|
@ -246,12 +251,12 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
downComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
mouseX = cX - DEFAULT_AREA_LENGTH - actualVal; |
|
|
|
|
while(mouseX > margin.getLeft()) { |
|
|
|
|
while (mouseX > margin.getLeft()) { |
|
|
|
|
Component comp = container.getComponentAt(mouseX, y); |
|
|
|
|
if (comp.getY() == cY) { |
|
|
|
|
if (comp.getHeight() < minHeight) { |
|
|
|
@ -261,7 +266,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
downComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -273,9 +278,9 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
* 判断对齐时考虑间隔 |
|
|
|
|
*/ |
|
|
|
|
private int getMinRightWidth(int cX, int cW, int y) { |
|
|
|
|
int xL = cX + DEFAULT_AREA_LENGTH ; |
|
|
|
|
int xL = cX + DEFAULT_AREA_LENGTH; |
|
|
|
|
xL = cW == 0 ? xL : (xL + cW + actualVal); |
|
|
|
|
if (xL > container.getWidth() - margin.getRight()){ |
|
|
|
|
if (xL > container.getWidth() - margin.getRight()) { |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
// 以当前组件紧挨着右侧的组件为基准,在y轴方向查找符合条件的组件
|
|
|
|
@ -286,7 +291,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
rightComps = new ArrayList<Component>(); |
|
|
|
|
} |
|
|
|
|
int mouseY = targetComp.getY() + DEFAULT_AREA_LENGTH; |
|
|
|
|
while (mouseY<max) { |
|
|
|
|
while (mouseY < max) { |
|
|
|
|
Component comp = container.getComponentAt(xL, mouseY); |
|
|
|
|
if (comp.getX() == targetComp.getX()) { |
|
|
|
|
if (comp.getWidth() < minWidth) { |
|
|
|
@ -296,12 +301,12 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
rightComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
mouseY = targetComp.getY() - DEFAULT_AREA_LENGTH - actualVal; |
|
|
|
|
while(mouseY > margin.getTop()) { |
|
|
|
|
while (mouseY > margin.getTop()) { |
|
|
|
|
Component comp = container.getComponentAt(xL, mouseY); |
|
|
|
|
if (comp.getX() == targetComp.getX()) { |
|
|
|
|
if (comp.getWidth() < minWidth) { |
|
|
|
@ -311,7 +316,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
rightComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -329,9 +334,9 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
leftComps = new ArrayList<Component>(); |
|
|
|
|
} |
|
|
|
|
int rightx = 0; |
|
|
|
|
int rightx = 0; |
|
|
|
|
int mouseY = currentComp.getY() + DEFAULT_AREA_LENGTH; |
|
|
|
|
while(mouseY<max) { |
|
|
|
|
while (mouseY < max) { |
|
|
|
|
Component comp = container.getComponentAt(x, mouseY); |
|
|
|
|
rightx = comp.getX() + comp.getWidth(); |
|
|
|
|
if (rightx == compRightLength) { |
|
|
|
@ -342,14 +347,14 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
leftComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
mouseY = currentComp.getY() - DEFAULT_AREA_LENGTH - actualVal; |
|
|
|
|
while(mouseY>margin.getTop()) { |
|
|
|
|
while (mouseY > margin.getTop()) { |
|
|
|
|
Component comp = container.getComponentAt(x, mouseY); |
|
|
|
|
rightx = comp.getX()+comp.getWidth(); |
|
|
|
|
rightx = comp.getX() + comp.getWidth(); |
|
|
|
|
if (rightx == compRightLength) { |
|
|
|
|
if (comp.getWidth() < minWidth) { |
|
|
|
|
minWidth = comp.getWidth(); |
|
|
|
@ -358,7 +363,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (isFindRelatedComps) { |
|
|
|
|
leftComps.add(comp); |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
} else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -367,13 +372,14 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断是否鼠标在组件的三等分区域,如果组件在布局管理器中间,上下左右都可能会三等分 |
|
|
|
|
* |
|
|
|
|
* @param parentComp 鼠标所在区域的组件 |
|
|
|
|
* @param x 坐标x |
|
|
|
|
* @param y 坐标y |
|
|
|
|
* @param x 坐标x |
|
|
|
|
* @param y 坐标y |
|
|
|
|
* @return 是则返回true |
|
|
|
|
*/ |
|
|
|
|
public boolean isTrisectionArea(Component parentComp, int x, int y) { |
|
|
|
|
XCreator creator = (XCreator)parentComp; |
|
|
|
|
XCreator creator = (XCreator) parentComp; |
|
|
|
|
if (container.getComponentCount() <= 1) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
@ -382,23 +388,23 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int xL = parentComp.getX(); |
|
|
|
|
int yL = parentComp.getY(); |
|
|
|
|
// 组件宽高的十分之一和默认值取大
|
|
|
|
|
int minRangeWidth = Math.max(maxWidth/BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
int minRangeHeight = Math.max(maxHeight/BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
if(y < yL+minRangeHeight ) { |
|
|
|
|
int minRangeWidth = Math.max(maxWidth / BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
int minRangeHeight = Math.max(maxHeight / BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
if (y < yL + minRangeHeight) { |
|
|
|
|
// 在组件上侧三等分
|
|
|
|
|
trisectAreaDirect = COMP_TOP; |
|
|
|
|
} else if(y > yL + maxHeight - minRangeHeight) { |
|
|
|
|
} else if (y > yL + maxHeight - minRangeHeight) { |
|
|
|
|
// 在组件下侧三等分
|
|
|
|
|
trisectAreaDirect = COMP_BOTTOM; |
|
|
|
|
} else if (x < xL + minRangeWidth) { |
|
|
|
|
// 在组件左侧三等分
|
|
|
|
|
trisectAreaDirect = COMP_LEFT; |
|
|
|
|
} else if(x > xL + maxWidth - minRangeWidth) { |
|
|
|
|
} else if (x > xL + maxWidth - minRangeWidth) { |
|
|
|
|
// 在组件右侧三等分
|
|
|
|
|
trisectAreaDirect = COMP_RIGHT; |
|
|
|
|
} |
|
|
|
|
// tab布局的边界特殊处理,不进行三等分
|
|
|
|
|
if(!creator.getTargetChildrenList().isEmpty()){ |
|
|
|
|
if (!creator.getTargetChildrenList().isEmpty()) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -407,21 +413,22 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 是否为组件交叉点区域 或者是相邻三组建中间点 |
|
|
|
|
* |
|
|
|
|
* @param currentComp 当前组件 |
|
|
|
|
* @param x 坐标x |
|
|
|
|
* @param y 坐标y |
|
|
|
|
* @param x 坐标x |
|
|
|
|
* @param y 坐标y |
|
|
|
|
* @return 是则返回true |
|
|
|
|
*/ |
|
|
|
|
public boolean isCrossPointArea(Component currentComp, int x, int y) { |
|
|
|
|
// 3个及以上都会出现交叉点区域(包括边界处的)
|
|
|
|
|
if(currentComp == null || container.getComponentCount() <= 2){ |
|
|
|
|
if (currentComp == null || container.getComponentCount() <= 2) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
int cX = currentComp.getX(); |
|
|
|
|
int cY = currentComp.getY(); |
|
|
|
|
int cW = currentComp.getWidth(); |
|
|
|
|
int cH = currentComp.getHeight(); |
|
|
|
|
int areaWidth = Math.max(cW / BORDER_PROPORTION ,DEFAULT_AREA_LENGTH); |
|
|
|
|
int areaWidth = Math.max(cW / BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
int areaHeight = Math.max(cH / BORDER_PROPORTION, DEFAULT_AREA_LENGTH); |
|
|
|
|
int rx = cX + cW; |
|
|
|
|
int by = cY + cH; |
|
|
|
@ -432,27 +439,27 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
if (x < objX && y < objY) { |
|
|
|
|
//左上角区域
|
|
|
|
|
crossPointAreaDirect = cY > margin.getTop() || cX > margin.getLeft() ? COMP_LEFT_TOP : 0; |
|
|
|
|
} else if (y < objY && x > rx - areaWidth){ |
|
|
|
|
} else if (y < objY && x > rx - areaWidth) { |
|
|
|
|
//右上角
|
|
|
|
|
crossPointAreaDirect = cY > margin.getTop() || rx < containerW ? COMP_RIGHT_TOP : 0; |
|
|
|
|
} else if (x < objX && y > by - areaHeight) { |
|
|
|
|
//左下角
|
|
|
|
|
crossPointAreaDirect = cX > margin.getLeft() || by < containerH ? COMP_LEFT_BOTTOM : 0; |
|
|
|
|
} else if (x > rx-areaWidth && y > by - areaHeight) { |
|
|
|
|
} else if (x > rx - areaWidth && y > by - areaHeight) { |
|
|
|
|
//右下角
|
|
|
|
|
crossPointAreaDirect = by < containerH || rx < containerW ? COMP_RIGHT_BOTTOM : 0; |
|
|
|
|
} else { |
|
|
|
|
isMiddlePosition(currentComp, x, y, areaWidth, areaHeight); |
|
|
|
|
} |
|
|
|
|
// tab布局的边界特殊处理
|
|
|
|
|
XCreator creator = (XCreator)currentComp; |
|
|
|
|
if(!creator.getTargetChildrenList().isEmpty()){ |
|
|
|
|
XCreator creator = (XCreator) currentComp; |
|
|
|
|
if (!creator.getTargetChildrenList().isEmpty()) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
return crossPointAreaDirect != 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void isMiddlePosition(Component comp, int x, int y, int areaWidth , int areaHeight) { |
|
|
|
|
private void isMiddlePosition(Component comp, int x, int y, int areaWidth, int areaHeight) { |
|
|
|
|
int cX = comp.getX(); |
|
|
|
|
int cY = comp.getY(); |
|
|
|
|
int cW = comp.getWidth(); |
|
|
|
@ -479,14 +486,14 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
Component bottomComp = container.getBottomComp(cX, cY, cH); |
|
|
|
|
if (x < (cX + areaWidth)) { |
|
|
|
|
isCrosspoint = topComp != null && bottomComp != null && topComp.getX() == cX && bottomComp.getX() == cX; |
|
|
|
|
crossPointAreaDirect = isCrosspoint ? COMP_LEFT : 0; |
|
|
|
|
crossPointAreaDirect = isCrosspoint ? COMP_LEFT : 0; |
|
|
|
|
} else if (x > (cX + cW - areaWidth)) { |
|
|
|
|
topComp = container.getRightTopComp(cX, cY, cW); |
|
|
|
|
bottomComp = container.getRightBottomComp(cX, cY, cH, cW); |
|
|
|
|
if (topComp != null && bottomComp != null) { |
|
|
|
|
isCrosspoint = topComp.getX() + topComp.getWidth() == cX + cW && bottomComp.getX() + bottomComp.getWidth() == cX+cW; |
|
|
|
|
isCrosspoint = topComp.getX() + topComp.getWidth() == cX + cW && bottomComp.getX() + bottomComp.getWidth() == cX + cW; |
|
|
|
|
} |
|
|
|
|
crossPointAreaDirect = isCrosspoint ? COMP_RIGHT : 0; |
|
|
|
|
crossPointAreaDirect = isCrosspoint ? COMP_RIGHT : 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -513,15 +520,16 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 平分,正常情况拖入组件时,按照上1/4区域、下1/4区域为上下平分,中左侧1/2区域、中右侧1/2区域为左右平分 |
|
|
|
|
* |
|
|
|
|
* @param currentComp 当前位置组件 |
|
|
|
|
* @param child 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @param child 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
*/ |
|
|
|
|
protected void fixHalve(Component currentComp, XCreator child, int x, int y) { |
|
|
|
|
XCreator creator = (XCreator)currentComp; |
|
|
|
|
if(!creator.getTargetChildrenList().isEmpty()){ |
|
|
|
|
fixHalveOfTab(creator,child,x,y); |
|
|
|
|
XCreator creator = (XCreator) currentComp; |
|
|
|
|
if (!creator.getTargetChildrenList().isEmpty()) { |
|
|
|
|
fixHalveOfTab(creator, child, x, y); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
int maxWidth = currentComp.getWidth(); |
|
|
|
@ -536,18 +544,18 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int finalY = yL; |
|
|
|
|
int finalW = maxWidth; |
|
|
|
|
int finalH = maxHeight; |
|
|
|
|
if (isDividUp){ |
|
|
|
|
if (isDividUp) { |
|
|
|
|
dim.width = maxWidth; |
|
|
|
|
dim.height = maxHeight / 2 - actualVal / 2; |
|
|
|
|
finalY = yL + dim.height + actualVal; |
|
|
|
|
finalH = maxHeight - dim.height - actualVal; |
|
|
|
|
} else if(isDividDown){ |
|
|
|
|
} else if (isDividDown) { |
|
|
|
|
// 若当前区域高度非偶数,那么和isDividUp时计算一致,否则永远都是上半部分小1px
|
|
|
|
|
dim.height = maxHeight / 2 - actualVal / 2; |
|
|
|
|
dim.width = maxWidth; |
|
|
|
|
finalH = maxHeight - dim.height - actualVal; |
|
|
|
|
yL = yL + finalH + actualVal; |
|
|
|
|
} else if(isDividLeft){ |
|
|
|
|
} else if (isDividLeft) { |
|
|
|
|
dim.width = maxWidth / 2 - actualVal / 2; |
|
|
|
|
dim.height = maxHeight; |
|
|
|
|
finalX = xL + dim.width + actualVal; |
|
|
|
@ -571,7 +579,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
// 边界判断抄得原来的逻辑
|
|
|
|
|
// tab布局的边界拖入新组件,和当前tab布局平分,这时候的actualVal组建间隔是tab里面的组建间隔
|
|
|
|
|
// 不应该在外层自适应布局添加
|
|
|
|
|
private void fixHalveOfTab(XCreator currentCreator, XCreator child, int x, int y){ |
|
|
|
|
private void fixHalveOfTab(XCreator currentCreator, XCreator child, int x, int y) { |
|
|
|
|
int maxWidth = currentCreator.getWidth(); |
|
|
|
|
int maxHeight = currentCreator.getHeight(); |
|
|
|
|
int xL = currentCreator.getX(); |
|
|
|
@ -582,7 +590,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int finalY = yL; |
|
|
|
|
int finalW = maxWidth; |
|
|
|
|
int finalH = maxHeight; |
|
|
|
|
switch(position){ |
|
|
|
|
switch (position) { |
|
|
|
|
case COMP_TOP: |
|
|
|
|
dim.width = maxWidth; |
|
|
|
|
dim.height = maxHeight / 2; |
|
|
|
@ -592,7 +600,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
case COMP_BOTTOM: |
|
|
|
|
dim.height = maxHeight / 2; |
|
|
|
|
dim.width = maxWidth; |
|
|
|
|
finalH = maxHeight-dim.height; |
|
|
|
|
finalH = maxHeight - dim.height; |
|
|
|
|
yL = yL + finalH; |
|
|
|
|
break; |
|
|
|
|
case COMP_LEFT: |
|
|
|
@ -619,13 +627,26 @@ 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; |
|
|
|
|
XLayoutContainer cardLayout = ((XWCardMainBorderLayout) currentCreator).getCardPart(); |
|
|
|
|
XLayoutContainer container = (XLayoutContainer) cardLayout.getComponent(0); |
|
|
|
|
Rectangle rect = ComponentUtils.getRelativeBounds(container); |
|
|
|
|
/* |
|
|
|
|
* 为了获取到鼠标drop位置的控件, |
|
|
|
|
* 我们之前已经将y值变为相对坐标值; |
|
|
|
|
* 由于在x轴上没有偏移,所以x值一直等于相对坐标值,最多差一个边界值1。 |
|
|
|
|
* 在进行新添加的控件位置计算时, |
|
|
|
|
* 又通过ComponentUtils.getRelativeBounds()方法获取到了绝对坐标, |
|
|
|
|
* 再次计算相对坐标,所以将y值重新变成绝对坐标。 |
|
|
|
|
* */ |
|
|
|
|
if (currentCreator.getBackupParent().getLocation().y == WBorderLayout.DEFAULT_SIZE) { |
|
|
|
|
y = y + WCardMainBorderLayout.TAB_HEIGHT + WBorderLayout.DEFAULT_SIZE; |
|
|
|
|
} else { |
|
|
|
|
y = y + WCardMainBorderLayout.TAB_HEIGHT; |
|
|
|
|
} |
|
|
|
|
int tempX = x - rect.x; |
|
|
|
|
int tempY = y - rect.y + WCardMainBorderLayout.TAB_HEIGHT; |
|
|
|
|
int tempY = y - rect.y; |
|
|
|
|
int containerX = container.getX(); |
|
|
|
|
int containerY = container.getY(); |
|
|
|
|
int containerWidth = container.getWidth(); |
|
|
|
@ -634,13 +655,13 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
Rectangle currentXY = new Rectangle(tempX, tempY, 1, 1); |
|
|
|
|
// 上边缘
|
|
|
|
|
Rectangle upEdge = new Rectangle(containerX, containerY, containerWidth, BORDER_PROPORTION); |
|
|
|
|
if(upEdge.intersects(currentXY)){ |
|
|
|
|
if (upEdge.intersects(currentXY)) { |
|
|
|
|
position = COMP_TOP; |
|
|
|
|
} |
|
|
|
|
int bottomY = containerY + containerHeight - BORDER_PROPORTION; |
|
|
|
|
// 下边缘
|
|
|
|
|
Rectangle bottomEdge = new Rectangle(containerX, bottomY, containerWidth, BORDER_PROPORTION); |
|
|
|
|
if(bottomEdge.intersects(currentXY)){ |
|
|
|
|
if (bottomEdge.intersects(currentXY)) { |
|
|
|
|
position = COMP_BOTTOM; |
|
|
|
|
} |
|
|
|
|
//左右边缘的高度 -10*2 是为了不和上下边缘重合
|
|
|
|
@ -648,7 +669,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int leftY = containerY + BORDER_PROPORTION; |
|
|
|
|
// 左边缘
|
|
|
|
|
Rectangle leftEdge = new Rectangle(containerX, leftY, BORDER_PROPORTION, verticalHeight); |
|
|
|
|
if(leftEdge.intersects(currentXY)){ |
|
|
|
|
if (leftEdge.intersects(currentXY)) { |
|
|
|
|
position = COMP_LEFT; |
|
|
|
|
} |
|
|
|
|
return position; |
|
|
|
@ -658,37 +679,38 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
* 组件交叉区域进行插入时,调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑,后面测试中发现有bug,改为和bi一样的鼠标所在侧平分 |
|
|
|
|
* 默认左上角、右下角区域是垂直方向插入组件 |
|
|
|
|
* 右上角和左下角是水平方向插入组件,这样避免田字块时重复 |
|
|
|
|
* |
|
|
|
|
* @param currentComp 当前位置组件 |
|
|
|
|
* @param child 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
* @param child 待放置组件 |
|
|
|
|
* @param x x |
|
|
|
|
* @param y y |
|
|
|
|
*/ |
|
|
|
|
protected void fixCrossPointArea(Component currentComp, XCreator child, int x, int y) { |
|
|
|
|
//计算前先全部初始化待调整控件所在的list
|
|
|
|
|
initCompsList(); |
|
|
|
|
switch(crossPointAreaDirect) { |
|
|
|
|
case COMP_LEFT_TOP : |
|
|
|
|
switch (crossPointAreaDirect) { |
|
|
|
|
case COMP_LEFT_TOP: |
|
|
|
|
dealCrossPointAtLeftTop(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_RIGHT_BOTTOM : |
|
|
|
|
case COMP_RIGHT_BOTTOM: |
|
|
|
|
dealCrossPointAtRightBottom(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_LEFT_BOTTOM : |
|
|
|
|
case COMP_LEFT_BOTTOM: |
|
|
|
|
dealCrossPointAtLeftBottom(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_RIGHT_TOP : |
|
|
|
|
case COMP_RIGHT_TOP: |
|
|
|
|
dealCrossPointAtRightTop(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_TOP : |
|
|
|
|
case COMP_TOP: |
|
|
|
|
dealCrossPointAtTop(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_BOTTOM : |
|
|
|
|
case COMP_BOTTOM: |
|
|
|
|
dealCrossPointAtBottom(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_LEFT : |
|
|
|
|
case COMP_LEFT: |
|
|
|
|
dealCrossPointAtLeft(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
case COMP_RIGHT : |
|
|
|
|
case COMP_RIGHT: |
|
|
|
|
dealCrossPointAtRight(currentComp, child); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -708,16 +730,16 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
Component topComp = container.getTopComp(cX, cY); |
|
|
|
|
Component leftComp = container.getLeftComp(cX, cY); |
|
|
|
|
//上方没有组件或者有一个x坐标不相同的组件
|
|
|
|
|
if (topComp==null || topComp.getX()!=cX) { |
|
|
|
|
if (topComp == null || topComp.getX() != cX) { |
|
|
|
|
minDH = cH < leftComp.getHeight() ? cH : leftComp.getHeight(); |
|
|
|
|
downComps.add(leftComp); |
|
|
|
|
downComps.add(currentComp); |
|
|
|
|
int dLength = minDH / 2; |
|
|
|
|
childw = leftComp.getWidth()+cW+actualVal; |
|
|
|
|
childh = dLength-actualVal / 2; |
|
|
|
|
childw = leftComp.getWidth() + cW + actualVal; |
|
|
|
|
childh = dLength - actualVal / 2; |
|
|
|
|
if (isCalculateChildPos) { |
|
|
|
|
childPosition = new int[]{leftComp.getX(), leftComp.getY(), childw, childh}; |
|
|
|
|
} else{ |
|
|
|
|
} else { |
|
|
|
|
//先设置child位置,不然leftComp坐标调整后就不对了
|
|
|
|
|
child.setLocation(leftComp.getX(), leftComp.getY()); |
|
|
|
|
child.setSize(childw, childh); |
|
|
|
@ -726,7 +748,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
} else { |
|
|
|
|
rightComps.add(currentComp); |
|
|
|
|
rightComps.add(topComp); |
|
|
|
|
minRW = cW<topComp.getWidth() ? cW : topComp.getWidth(); |
|
|
|
|
minRW = cW < topComp.getWidth() ? cW : topComp.getWidth(); |
|
|
|
|
int rightLength = minRW / 2; |
|
|
|
|
childw = rightLength - actualVal / 2; |
|
|
|
|
childh = currentComp.getHeight() + topComp.getHeight() + actualVal; |
|
|
|
@ -755,12 +777,12 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
minUH = cH < rightComp.getHeight() ? cH : rightComp.getHeight(); |
|
|
|
|
upComps.add(currentComp); |
|
|
|
|
upComps.add(rightComp); |
|
|
|
|
int uLength = minUH / 2 ; |
|
|
|
|
int uLength = minUH / 2; |
|
|
|
|
calculateTopComps(uLength, child, uLength); |
|
|
|
|
} else { |
|
|
|
|
leftComps.add(currentComp); |
|
|
|
|
leftComps.add(bottomComp); |
|
|
|
|
minLW = cW<bottomComp.getWidth() ? cW : bottomComp.getWidth(); |
|
|
|
|
minLW = cW < bottomComp.getWidth() ? cW : bottomComp.getWidth(); |
|
|
|
|
int leftLength = minLW / 2; |
|
|
|
|
calculateLeftComps(leftLength, child, leftLength); |
|
|
|
|
} |
|
|
|
@ -807,7 +829,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
Component topComp = container.getRightTopComp(cX, cY, cW); |
|
|
|
|
Component rightComp = container.getRightComp(cX, cY, cW); |
|
|
|
|
//右方没有组件或者有一个右侧不对齐的组件
|
|
|
|
|
if (rightComp==null || (rightComp.getY()!=cY)) { |
|
|
|
|
if (rightComp == null || (rightComp.getY() != cY)) { |
|
|
|
|
leftComps.add(currentComp); |
|
|
|
|
leftComps.add(topComp); |
|
|
|
|
minLW = cW < topComp.getWidth() ? cW : topComp.getWidth(); |
|
|
|
@ -840,9 +862,9 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
downComps.add(currentComp); |
|
|
|
|
downComps.add(rightComp); |
|
|
|
|
int dLength = minDH / 2; |
|
|
|
|
int childw = cW+leftComp.getWidth()+rightComp.getWidth() + actualVal * 2; |
|
|
|
|
int childw = cW + leftComp.getWidth() + rightComp.getWidth() + actualVal * 2; |
|
|
|
|
int childh = dLength - actualVal / 2; |
|
|
|
|
if (isCalculateChildPos){ |
|
|
|
|
if (isCalculateChildPos) { |
|
|
|
|
childPosition = new int[]{leftComp.getX(), leftComp.getY(), childw, childh}; |
|
|
|
|
} else { |
|
|
|
|
child.setLocation(leftComp.getX(), leftComp.getY()); |
|
|
|
@ -889,7 +911,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int rightLength = minRW / 2; |
|
|
|
|
int childw = rightLength - actualVal / 2; |
|
|
|
|
int childh = topComp.getHeight() + currentComp.getHeight() + bottomComp.getHeight() + actualVal * 2; |
|
|
|
|
if (isCalculateChildPos){ |
|
|
|
|
if (isCalculateChildPos) { |
|
|
|
|
childPosition = new int[]{topComp.getX(), topComp.getY(), childw, childh}; |
|
|
|
|
} else { |
|
|
|
|
child.setLocation(topComp.getX(), topComp.getY()); |
|
|
|
@ -900,8 +922,9 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 三等分区域时,调整相关联的组件 |
|
|
|
|
* @param currentComp 鼠标所在组件 |
|
|
|
|
* @param child 待插入组件 |
|
|
|
|
* |
|
|
|
|
* @param currentComp 鼠标所在组件 |
|
|
|
|
* @param child 待插入组件 |
|
|
|
|
*/ |
|
|
|
|
protected void fixTrisect(Component currentComp, XCreator child, int x, int y) { |
|
|
|
|
int minUpH = 0, minDownH = 0, minLeftW = 0, minRightW = 0; |
|
|
|
@ -940,15 +963,15 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
*/ |
|
|
|
|
private void dealTrisectAtTop(XCreator child, int minUH, int minDH) { |
|
|
|
|
// 三等分有间隔时,实际是两侧都要减去半个间隔大小
|
|
|
|
|
int averageH = (minUH+minDH - actualVal) / 3; |
|
|
|
|
int averageH = (minUH + minDH - actualVal) / 3; |
|
|
|
|
int dLength = 0; |
|
|
|
|
int uLength = 0; |
|
|
|
|
if (minDH==0) { |
|
|
|
|
if (minDH == 0) { |
|
|
|
|
dLength = 0; |
|
|
|
|
uLength = minUH / 2; |
|
|
|
|
calculateTopComps(uLength, child, uLength); |
|
|
|
|
return; |
|
|
|
|
} else if(minUH == 0){ |
|
|
|
|
} else if (minUH == 0) { |
|
|
|
|
dLength = minDH / 2; |
|
|
|
|
int witdh = container.getWidth() - margin.getLeft() - margin.getRight(); |
|
|
|
|
if (!isCalculateChildPos) { |
|
|
|
@ -956,22 +979,22 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
child.setLocation(margin.getLeft(), margin.getRight()); |
|
|
|
|
child.setSize(witdh, dLength - actualVal / 2); |
|
|
|
|
} else { |
|
|
|
|
childPosition = new int[] {margin.getLeft(), margin.getRight(), witdh, dLength - actualVal / 2}; |
|
|
|
|
childPosition = new int[]{margin.getLeft(), margin.getRight(), witdh, dLength - actualVal / 2}; |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} else if (minUH >= minDH) { |
|
|
|
|
minDH -= actualVal / 2; |
|
|
|
|
if ((minDH * 2 / 3) < minHeight) { |
|
|
|
|
dLength = minDH - minHeight; |
|
|
|
|
}else { |
|
|
|
|
} else { |
|
|
|
|
dLength = minDH / 3; |
|
|
|
|
} |
|
|
|
|
uLength = averageH - dLength; |
|
|
|
|
} else{ |
|
|
|
|
} else { |
|
|
|
|
minUH -= actualVal / 2; |
|
|
|
|
if ((minUH * 2 / 3) < minHeight) { |
|
|
|
|
uLength = minUH - minHeight; |
|
|
|
|
}else { |
|
|
|
|
} else { |
|
|
|
|
uLength = minUH / 3; |
|
|
|
|
} |
|
|
|
|
dLength = averageH - uLength; |
|
|
|
@ -999,16 +1022,16 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
child.setLocation(margin.getLeft(), margin.getRight()); |
|
|
|
|
child.setSize(rightLength - actualVal / 2, height); |
|
|
|
|
} else { |
|
|
|
|
childPosition = new int[] {margin.getLeft(), margin.getRight(), rightLength - actualVal / 2, height}; |
|
|
|
|
childPosition = new int[]{margin.getLeft(), margin.getRight(), rightLength - actualVal / 2, height}; |
|
|
|
|
} |
|
|
|
|
return; |
|
|
|
|
} else if(minRW == 0){ |
|
|
|
|
} else if (minRW == 0) { |
|
|
|
|
leftLength = minLW / 2; |
|
|
|
|
calculateLeftComps(leftLength, child, leftLength); |
|
|
|
|
return; |
|
|
|
|
} else if (minRW >= minLW) { |
|
|
|
|
minLW -= actualVal / 2; |
|
|
|
|
if(minLW * 2 / 3 < minWidth) { |
|
|
|
|
if (minLW * 2 / 3 < minWidth) { |
|
|
|
|
leftLength = minLW - minWidth; |
|
|
|
|
} else { |
|
|
|
|
leftLength = minLW / 3; |
|
|
|
@ -1016,7 +1039,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
rightLength = averageW - leftLength; |
|
|
|
|
} else { |
|
|
|
|
minRW -= actualVal / 2; |
|
|
|
|
if(minRW * 2 / 3 < minWidth) { |
|
|
|
|
if (minRW * 2 / 3 < minWidth) { |
|
|
|
|
rightLength = minRW - minWidth; |
|
|
|
|
} else { |
|
|
|
|
rightLength = minRW / 3; |
|
|
|
@ -1033,12 +1056,12 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
private void calculateBottomComps(int length) { |
|
|
|
|
length += actualVal / 2; |
|
|
|
|
for (int i = 0,num = downComps.size(); i < num; i++){ |
|
|
|
|
for (int i = 0, num = downComps.size(); i < num; i++) { |
|
|
|
|
Component comp = downComps.get(i); |
|
|
|
|
comp.setLocation(comp.getX(), comp.getY() + length); |
|
|
|
|
int offset = comp.getHeight() - length; |
|
|
|
|
comp.setSize(comp.getWidth(), offset); |
|
|
|
|
XCreator creator = (XCreator)comp; |
|
|
|
|
XCreator creator = (XCreator) comp; |
|
|
|
|
creator.recalculateChildHeight(offset); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -1048,24 +1071,24 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
int childWidth = (upComps.size() - 1) * actualVal; |
|
|
|
|
int childX = container.getWidth() - margin.getLeft() - margin.getRight(); |
|
|
|
|
int childY = 0; |
|
|
|
|
if(upComps.size() > INDEX_ZERO){ |
|
|
|
|
if (upComps.size() > INDEX_ZERO) { |
|
|
|
|
childY = upComps.get(INDEX_ZERO).getY() + upComps.get(INDEX_ZERO).getHeight() - length; |
|
|
|
|
} |
|
|
|
|
for (int i = 0,num = upComps.size(); i < num; i++){ |
|
|
|
|
for (int i = 0, num = upComps.size(); i < num; i++) { |
|
|
|
|
Component comp = upComps.get(i); |
|
|
|
|
childWidth += comp.getWidth(); |
|
|
|
|
if (comp.getX() < childX){ |
|
|
|
|
if (comp.getX() < childX) { |
|
|
|
|
childX = comp.getX(); |
|
|
|
|
} |
|
|
|
|
if (!isCalculateChildPos) { |
|
|
|
|
int offset = comp.getHeight() - length; |
|
|
|
|
comp.setSize(comp.getWidth(), offset); |
|
|
|
|
XCreator creator = (XCreator)comp; |
|
|
|
|
XCreator creator = (XCreator) comp; |
|
|
|
|
creator.recalculateChildHeight(offset); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
childY += actualVal; |
|
|
|
|
averageH -= actualVal/2; |
|
|
|
|
averageH -= actualVal / 2; |
|
|
|
|
if (isCalculateChildPos) { |
|
|
|
|
childPosition = new int[]{childX, childY, childWidth, averageH}; |
|
|
|
|
} else { |
|
|
|
@ -1081,25 +1104,25 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
} |
|
|
|
|
int childH = (leftComps.size() - 1) * actualVal; |
|
|
|
|
int childX = 0; |
|
|
|
|
if(leftComps.size() > INDEX_ZERO){ |
|
|
|
|
if (leftComps.size() > INDEX_ZERO) { |
|
|
|
|
childX = leftComps.get(INDEX_ZERO).getX() + leftComps.get(INDEX_ZERO).getWidth() - length; |
|
|
|
|
} |
|
|
|
|
int childY = container.getHeight() - margin.getBottom(); |
|
|
|
|
for (int i = 0,num = leftComps.size(); i < num; i++){ |
|
|
|
|
for (int i = 0, num = leftComps.size(); i < num; i++) { |
|
|
|
|
Component comp = leftComps.get(i); |
|
|
|
|
childH += comp.getHeight(); |
|
|
|
|
if (comp.getY() < childY){ |
|
|
|
|
if (comp.getY() < childY) { |
|
|
|
|
childY = comp.getY(); |
|
|
|
|
} |
|
|
|
|
if (!isCalculateChildPos) { |
|
|
|
|
int offset = comp.getWidth() - length; |
|
|
|
|
comp.setSize(offset, comp.getHeight()); |
|
|
|
|
XCreator creator = (XCreator)comp; |
|
|
|
|
XCreator creator = (XCreator) comp; |
|
|
|
|
creator.recalculateChildWidth(offset); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
childX += actualVal; |
|
|
|
|
averageW -= actualVal/2; |
|
|
|
|
averageW -= actualVal / 2; |
|
|
|
|
if (isCalculateChildPos) { |
|
|
|
|
childPosition = new int[]{childX, childY, averageW, childH}; |
|
|
|
|
} else { |
|
|
|
@ -1110,33 +1133,34 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter{
|
|
|
|
|
|
|
|
|
|
private void calculateRightComps(int length) { |
|
|
|
|
length += actualVal / 2; |
|
|
|
|
for (int i=0,num=rightComps.size(); i<num; i++){ |
|
|
|
|
for (int i = 0, num = rightComps.size(); i < num; i++) { |
|
|
|
|
Component comp = rightComps.get(i); |
|
|
|
|
comp.setLocation(comp.getX() + length, comp.getY()); |
|
|
|
|
int offset = comp.getWidth() - length; |
|
|
|
|
comp.setSize(offset, comp.getHeight()); |
|
|
|
|
XCreator creator = (XCreator)comp; |
|
|
|
|
XCreator creator = (XCreator) comp; |
|
|
|
|
creator.recalculateChildWidth(offset); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 不调整,只计算位置 |
|
|
|
|
* |
|
|
|
|
* @return child的位置 |
|
|
|
|
*/ |
|
|
|
|
public int[] getChildPosition(Component currentComp, XCreator child, int x, int y ) { |
|
|
|
|
public int[] getChildPosition(Component currentComp, XCreator child, int x, int y) { |
|
|
|
|
if (currentComp == container) { |
|
|
|
|
return new int[]{0, 0, container.getWidth(), container.getHeight()}; |
|
|
|
|
} |
|
|
|
|
this.isCalculateChildPos = true; |
|
|
|
|
if (isCrossPointArea(currentComp, x, y)){ |
|
|
|
|
if (isCrossPointArea(currentComp, x, y)) { |
|
|
|
|
fixCrossPointArea(currentComp, child, x, y); |
|
|
|
|
} else if (isTrisectionArea(currentComp, x, y)) { |
|
|
|
|
fixTrisect(currentComp, child, x, y); |
|
|
|
|
} else { |
|
|
|
|
fixHalve(currentComp, child, x, y); |
|
|
|
|
} |
|
|
|
|
if (childPosition==null) { |
|
|
|
|
if (childPosition == null) { |
|
|
|
|
childPosition = new int[]{0, 0, 0, 0}; |
|
|
|
|
} |
|
|
|
|
this.isCalculateChildPos = false; |
|
|
|
|