@ -18,7 +18,9 @@ public class MoveUtils {
public static final int SORPTION_UNIT = 5 ;
private static final int EQUIDISTANTLINE_UNIT = 4 ;
private static ArrayList < EquidistantLine > equidistantLines = new ArrayList < > ( ) ;
public static WidgetForbidWindow widgetForbidWindow = new WidgetForbidWindow ( ) ;
public static ArrayList < EquidistantLine > equidistantLines = new ArrayList < > ( ) ;
private MoveUtils ( ) {
@ -30,7 +32,9 @@ public class MoveUtils {
* 获取块边界的迭代器
*
* @return 块边界的迭代器
*
* @date 2015 - 2 - 12 - 下午2 : 43 : 47
*
* /
RectangleIterator createRectangleIterator ( ) ;
@ -38,7 +42,9 @@ public class MoveUtils {
* 设置X轴的线
*
* @param line 连接线
*
* @date 2015 - 2 - 12 - 下午2 : 44 : 04
*
* /
void setXAbsorptionline ( Absorptionline line ) ;
@ -46,7 +52,9 @@ public class MoveUtils {
* 设置Y轴的线
*
* @param line 连接线
*
* @date 2015 - 2 - 12 - 下午2 : 44 : 04
*
* /
void setYAbsorptionline ( Absorptionline line ) ;
@ -54,6 +62,7 @@ public class MoveUtils {
* 获取当前选中块的垂直线数组
*
* @return 块的垂直线数组
*
* /
int [ ] getVerticalLine ( ) ;
@ -61,47 +70,42 @@ public class MoveUtils {
* 获取当前选中块的水平线数组
*
* @return 块的水平线数组
*
* /
int [ ] getHorizontalLine ( ) ;
/ * *
* 设置designer内部组件是否重叠的标志位
*
* @param isIntersects 是否重叠
* /
void setWidgetsIntersected ( boolean isIntersects ) ;
/ * *
* 获取designer内部组件是否重叠的标志位
*
* @return 重叠
* /
boolean isWidgetsIntersected ( ) ;
/ * *
* 获取designer相对屏幕的位置
*
* @return 位置
* /
Point getDesignerLocationOnScreen ( ) ;
/ * *
* 设置等距线
*
* @param line 吸附线
* /
void setEquidistantLine ( Absorptionline line ) ;
/ * *
* 获取设计器垂直滚动条的值
*
* @return 滚动条的值
* /
int getDesignerScrollVerticalValue ( ) ;
/ * *
* 获取设计器水平滚动条的值
*
* @return 滚动条的值
* /
int getDesignerScrollHorizontalValue ( ) ;
@ -113,7 +117,9 @@ public class MoveUtils {
* 是否存在下一个块
*
* @return 是否存在下一个块
*
* @date 2015 - 2 - 12 - 下午2 : 41 : 32
*
* /
boolean hasNext ( ) ;
@ -121,7 +127,9 @@ public class MoveUtils {
* 获取下一个块的bounds
*
* @return 下一个块的bounds
*
* @date 2015 - 2 - 12 - 下午2 : 41 : 55
*
* /
Rectangle nextRectangle ( ) ;
@ -129,7 +137,9 @@ public class MoveUtils {
* 获取块的垂直线数组
*
* @return 块的垂直线数组
*
* @date 2015 - 2 - 12 - 下午2 : 42 : 27
*
* /
int [ ] getVerticalLine ( ) ;
@ -137,7 +147,9 @@ public class MoveUtils {
* 获取块的水平线数组
*
* @return 块的水平线数组
*
* @date 2015 - 2 - 12 - 下午2 : 42 : 27
*
* /
int [ ] getHorizontalLine ( ) ;
}
@ -234,38 +246,46 @@ public class MoveUtils {
//等距线从各边中点画出,先要判断是不是在范围内
int topMiddleX = left + width / 2 ;
int leftMiddleY = top + height / 2 ;
if ( ( topMiddleX > bounds . getX ( ) ) & & ( topMiddleX < ( bounds . getX ( ) + bounds . getWidth ( ) ) ) ) {
if ( ( topMiddleX > bounds . getX ( ) ) & & ( topMiddleX < ( bounds . getX ( ) + bounds . getWidth ( ) ) ) ) {
//当前操作rec在bounds的下方
if ( top > ( bounds . getY ( ) + bounds . getHeight ( ) ) ) {
if ( top > ( bounds . getY ( ) + bounds . getHeight ( ) ) ) {
equidistantLineInfo . setDistance ( top - ( bounds . y + bounds . height ) ) ;
equidistantLineInfo . setReference ( bounds . y + bounds . height ) ;
equidistantLineInfo . setDirection ( SwingConstants . TOP ) ;
}
//当前操作rec在bounds上方
if ( ( top + height ) < bounds . getY ( ) ) {
if ( ( top + height ) < bounds . getY ( ) ) {
equidistantLineInfo . setDistance ( bounds . y - ( top + height ) ) ;
equidistantLineInfo . setReference ( bounds . y ) ;
equidistantLineInfo . setDirection ( SwingConstants . BOTTOM ) ;
}
} else if ( ( leftMiddleY > bounds . getY ( ) ) & & ( leftMiddleY < ( bounds . getY ( ) + bounds . getHeight ( ) ) ) ) {
}
else if ( ( leftMiddleY > bounds . getY ( ) ) & & ( leftMiddleY < ( bounds . getY ( ) + bounds . getHeight ( ) ) ) ) {
//当前操作rec在bounds的右侧
if ( left > ( bounds . getX ( ) + bounds . getWidth ( ) ) ) {
if ( left > ( bounds . getX ( ) + bounds . getWidth ( ) ) ) {
equidistantLineInfo . setDistance ( left - ( bounds . x + bounds . width ) ) ;
equidistantLineInfo . setReference ( bounds . x + bounds . width ) ;
equidistantLineInfo . setDirection ( SwingConstants . LEFT ) ;
}
//当前操作rec在bounds的左侧
if ( ( left + width ) < bounds . getX ( ) ) {
if ( ( left + width ) < bounds . getX ( ) ) {
equidistantLineInfo . setDistance ( bounds . x - ( left + width ) ) ;
equidistantLineInfo . setReference ( bounds . x ) ;
equidistantLineInfo . setDirection ( SwingConstants . RIGHT ) ;
}
}
if ( equidistantLineInfo . getDistance ( ) > 0 ) {
if ( equidistantLineInfo . getDistance ( ) > 0 ) {
equidistantLines . add ( equidistantLineInfo ) ;
}
}
public static void displayForbidWindow ( int x , int y ) {
widgetForbidWindow . showWindow ( x , y ) ;
}
public static void hideForbidWindow ( ) {
widgetForbidWindow . hideWindow ( ) ;
}
/ * *
* 吸附
@ -275,8 +295,11 @@ public class MoveUtils {
* @param width 宽度
* @param height 高度
* @param designer 块设计器
*
* @return 吸附后坐标
*
* @date 2015 - 2 - 12 - 下午2 : 39 : 16
*
* /
public static Point sorption ( int x , int y , int width , int height , RectangleDesigner designer , boolean isParameterLayout ) {
@ -295,32 +318,53 @@ public class MoveUtils {
RectangleIterator iterator = designer . createRectangleIterator ( ) ;
java . util . List < Rectangle > cacheRecs = new ArrayList < Rectangle > ( ) ;
//是否存在控件重叠
boolean isWidgetsIntersects = false ;
while ( iterator . hasNext ( ) ) {
Rectangle bounds = iterator . nextRectangle ( ) ;
cacheRecs . add ( bounds ) ;
boolean isIntersects = operatingRectangle . intersects ( bounds ) ;
findX ( px , bounds , left , right , width ) ;
findY ( py , bounds , top , bottom , height ) ;
if ( ! isParameterLayout ) {
if ( ! isParameterLayout ) {
if ( isIntersects ) {
isWidgetsIntersects = true ;
}
else {
findEquidistantLine ( bounds , left , top , height , width ) ;
}
}
}
showForbiddenWindow ( designer , x , y , isWidgetsIntersects ) ;
createXAbsorptionline ( px , designer , width , cacheRecs ) ;
createYAbsorptionline ( py , designer , height , cacheRecs ) ;
operatingRectangle . x = px . palce ;
operatingRectangle . y = py . palce ;
createEquidistantLine ( pEquidistantX , pEquidistantY , operatingRectangle , designer ) ;
Point sorptionPoint = new Point ( px . palce , py . palce ) ;
if ( ! px . isFind ( ) ) {
Point sorptionPoint = new Point ( px . palce , py . palce ) ;
if ( ! px . isFind ( ) ) {
sorptionPoint . x = pEquidistantX . palce ;
}
if ( ! py . isFind ( ) ) {
if ( ! py . isFind ( ) ) {
sorptionPoint . y = pEquidistantY . palce ;
}
return sorptionPoint ;
}
public static void showForbiddenWindow ( RectangleDesigner designer , int x , int y , boolean isIntersects ) {
if ( isIntersects ) {
if ( designer . getDesignerLocationOnScreen ( ) ! = null ) {
displayForbidWindow ( x + designer . getDesignerLocationOnScreen ( ) . x , y + designer . getDesignerLocationOnScreen ( ) . y ) ;
}
designer . setWidgetsIntersected ( true ) ;
}
else {
designer . setWidgetsIntersected ( false ) ;
hideForbidWindow ( ) ;
}
}
private static void createXAbsorptionline ( PlacePointing px , RectangleDesigner designer , int width , java . util . List < Rectangle > cacheRecs ) {
Absorptionline line = null ;
@ -402,25 +446,25 @@ public class MoveUtils {
designer . setYAbsorptionline ( line ) ;
}
private static void createEquidistantLine ( PlacePointing px , PlacePointing py , Rectangle operatingRectangle , RectangleDesigner designer ) {
private static void createEquidistantLine ( PlacePointing px , PlacePointing py , Rectangle operatingRectangle , RectangleDesigner designer ) {
processEquidistantLinesList ( px , py , operatingRectangle ) ;
Absorptionline line = null ;
if ( equidistantLines . size ( ) > 0 ) {
if ( equidistantLines . size ( ) > 0 ) {
int top = - 1 ;
int left = - 1 ;
int bottom = - 1 ;
int right = - 1 ;
for ( int i = 0 ; i < equidistantLines . size ( ) ; i + + ) {
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . TOP ) {
for ( int i = 0 ; i < equidistantLines . size ( ) ; i + + ) {
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . TOP ) {
top = equidistantLines . get ( i ) . getReference ( ) ;
}
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . LEFT ) {
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . LEFT ) {
left = equidistantLines . get ( i ) . getReference ( ) ;
}
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . BOTTOM ) {
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . BOTTOM ) {
bottom = equidistantLines . get ( i ) . getReference ( ) ;
}
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . RIGHT ) {
if ( equidistantLines . get ( i ) . getDirection ( ) = = SwingConstants . RIGHT ) {
right = equidistantLines . get ( i ) . getReference ( ) ;
}
}
@ -435,13 +479,13 @@ public class MoveUtils {
designer . setEquidistantLine ( line ) ;
}
private static void processEquidistantLinesList ( PlacePointing pEquidistantX , PlacePointing pEquidistantY , Rectangle operatingRectangle ) {
private static void processEquidistantLinesList ( PlacePointing pEquidistantX , PlacePointing pEquidistantY , Rectangle operatingRectangle ) {
EquidistantLine [ ] equidistantLines1 = new EquidistantLine [ EQUIDISTANTLINE_UNIT ] ;
//先按方向处理,只保留四个方向上距离最近
for ( int count = 0 ; count < equidistantLines . size ( ) ; count + + ) {
for ( int direction = 0 ; direction < EQUIDISTANTLINE_UNIT ; direction + + ) {
if ( equidistantLines . get ( count ) . getDirection ( ) = = ( direction + 1 ) ) { //direction 1,2,3,4 分别对应top,left,bottom,right
if ( equidistantLines1 [ direction ] ! = null
for ( int count = 0 ; count < equidistantLines . size ( ) ; count + + ) {
for ( int direction = 0 ; direction < EQUIDISTANTLINE_UNIT ; direction + + ) {
if ( equidistantLines . get ( count ) . getDirection ( ) = = ( direction + 1 ) ) { //direction 1,2,3,4 分别对应top,left,bottom,right
if ( equidistantLines1 [ direction ] ! = null
& & equidistantLines1 [ direction ] . getDistance ( ) > equidistantLines . get ( count ) . getDistance ( )
| | equidistantLines1 [ direction ] = = null ) {
equidistantLines1 [ direction ] = equidistantLines . get ( count ) ;
@ -452,9 +496,9 @@ public class MoveUtils {
equidistantLines . clear ( ) ;
//找list中横纵分别等距的组合
if ( equidistantLines1 [ 0 ] ! = null & & equidistantLines1 [ 2 ] ! = null ) { //top, bottom
if ( equidistantLines1 [ 0 ] ! = null & & equidistantLines1 [ 2 ] ! = null ) { //top, bottom
int offset = equidistantLines1 [ 0 ] . getDistance ( ) - equidistantLines1 [ 2 ] . getDistance ( ) ;
if ( Math . abs ( offset ) < = SORPTION_UNIT * 2 ) {
if ( Math . abs ( offset ) < = SORPTION_UNIT * 2 ) {
pEquidistantY . direction = SwingConstants . TOP ;
equidistantLines . add ( equidistantLines1 [ 0 ] ) ;
equidistantLines . add ( equidistantLines1 [ 2 ] ) ;
@ -462,9 +506,9 @@ public class MoveUtils {
operatingRectangle . y = pEquidistantY . palce ;
}
}
if ( equidistantLines1 [ 1 ] ! = null & & equidistantLines1 [ 3 ] ! = null ) { //left, right
if ( equidistantLines1 [ 1 ] ! = null & & equidistantLines1 [ 3 ] ! = null ) { //left, right
int offset = equidistantLines1 [ 1 ] . getDistance ( ) - equidistantLines1 [ 3 ] . getDistance ( ) ;
if ( Math . abs ( offset ) < = SORPTION_UNIT * 2 ) {
if ( Math . abs ( offset ) < = SORPTION_UNIT * 2 ) {
pEquidistantX . direction = SwingConstants . LEFT ;
equidistantLines . add ( equidistantLines1 [ 1 ] ) ;
equidistantLines . add ( equidistantLines1 [ 3 ] ) ;
@ -475,26 +519,26 @@ public class MoveUtils {
}
//更新纵向行列线
private static void updateVerticalLine ( int [ ] selfVertical , RectangleIterator iterator , Absorptionline line ) {
private static void updateVerticalLine ( int [ ] selfVertical , RectangleIterator iterator , Absorptionline line ) {
int [ ] targetArray = iterator . getVerticalLine ( ) ;
if ( intersectArrays ( targetArray , selfVertical ) ) {
if ( intersectArrays ( targetArray , selfVertical ) ) {
line . setVerticalLines ( targetArray ) ;
}
}
//更新横向行列线
private static void updateHorizontalLine ( int [ ] selfHorizontal , RectangleIterator iterator , Absorptionline line ) {
private static void updateHorizontalLine ( int [ ] selfHorizontal , RectangleIterator iterator , Absorptionline line ) {
int [ ] targetArray = iterator . getHorizontalLine ( ) ;
if ( intersectArrays ( targetArray , selfHorizontal ) ) {
if ( intersectArrays ( targetArray , selfHorizontal ) ) {
line . setHorizontalLines ( targetArray ) ;
}
}
//检测两个数组是否有相交的部分
private static boolean intersectArrays ( int [ ] targetArray , int [ ] selfArray ) {
private static boolean intersectArrays ( int [ ] targetArray , int [ ] selfArray ) {
for ( int i : targetArray ) {
for ( int j : selfArray ) {
if ( i = = j ) {
if ( i = = j ) {
return true ;
}
}
@ -503,7 +547,7 @@ public class MoveUtils {
return false ;
}
private static class EquidistantLine {
private static class EquidistantLine {
//与操作rectangle的距离
private int distance ;
//参考rectangle的位置
@ -511,33 +555,33 @@ public class MoveUtils {
//等距线的方向
private int direction ;
EquidistantLine ( int distance , int reference , int direction ) {
EquidistantLine ( int distance , int reference , int direction ) {
this . distance = distance ;
this . reference = reference ;
this . direction = direction ;
}
public void setDistance ( int distance ) {
public void setDistance ( int distance ) {
this . distance = distance ;
}
public int getDistance ( ) {
public int getDistance ( ) {
return this . distance ;
}
public void setReference ( int reference ) {
public void setReference ( int reference ) {
this . reference = reference ;
}
public int getReference ( ) {
public int getReference ( ) {
return this . reference ;
}
public void setDirection ( int direction ) {
public void setDirection ( int direction ) {
this . direction = direction ;
}
public int getDirection ( ) {
public int getDirection ( ) {
return this . direction ;
}
}