Browse Source

无任务 调整代码

master
yaoh.wu 8 years ago
parent
commit
6a1e4bcca7
  1. 138
      designer_base/src/com/fr/design/beans/location/MoveUtils.java
  2. 53
      designer_base/src/com/fr/design/beans/location/WidgetForbidWindow.java
  3. 1
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  4. 74
      designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java

138
designer_base/src/com/fr/design/beans/location/MoveUtils.java

@ -18,8 +18,6 @@ public class MoveUtils {
public static final int SORPTION_UNIT = 5;
private static final int EQUIDISTANTLINE_UNIT = 4;
public static WidgetForbidWindow widgetForbidWindow = new WidgetForbidWindow();
public static ArrayList<EquidistantLine> equidistantLines = new ArrayList<>();
private MoveUtils() {
@ -32,9 +30,7 @@ public class MoveUtils {
* 获取块边界的迭代器
*
* @return 块边界的迭代器
*
* @date 2015-2-12-下午2:43:47
*
*/
RectangleIterator createRectangleIterator();
@ -42,9 +38,7 @@ public class MoveUtils {
* 设置X轴的线
*
* @param line 连接线
*
* @date 2015-2-12-下午2:44:04
*
*/
void setXAbsorptionline(Absorptionline line);
@ -52,9 +46,7 @@ public class MoveUtils {
* 设置Y轴的线
*
* @param line 连接线
*
* @date 2015-2-12-下午2:44:04
*
*/
void setYAbsorptionline(Absorptionline line);
@ -62,7 +54,6 @@ public class MoveUtils {
* 获取当前选中块的垂直线数组
*
* @return 块的垂直线数组
*
*/
int[] getVerticalLine();
@ -70,42 +61,47 @@ 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();
@ -117,9 +113,7 @@ public class MoveUtils {
* 是否存在下一个块
*
* @return 是否存在下一个块
*
* @date 2015-2-12-下午2:41:32
*
*/
boolean hasNext();
@ -127,9 +121,7 @@ public class MoveUtils {
* 获取下一个块的bounds
*
* @return 下一个块的bounds
*
* @date 2015-2-12-下午2:41:55
*
*/
Rectangle nextRectangle();
@ -137,9 +129,7 @@ public class MoveUtils {
* 获取块的垂直线数组
*
* @return 块的垂直线数组
*
* @date 2015-2-12-下午2:42:27
*
*/
int[] getVerticalLine();
@ -147,9 +137,7 @@ public class MoveUtils {
* 获取块的水平线数组
*
* @return 块的水平线数组
*
* @date 2015-2-12-下午2:42:27
*
*/
int[] getHorizontalLine();
}
@ -246,46 +234,38 @@ 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();
// }
/**
* 吸附
@ -295,11 +275,8 @@ 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) {
@ -318,53 +295,32 @@ 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(isIntersects) {
// isWidgetsIntersects = true;
// }
// else{
if (!isParameterLayout) {
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;
@ -446,25 +402,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();
}
}
@ -479,13 +435,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);
@ -496,9 +452,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]);
@ -506,9 +462,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]);
@ -519,26 +475,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;
}
}
@ -547,7 +503,7 @@ public class MoveUtils {
return false;
}
private static class EquidistantLine{
private static class EquidistantLine {
//与操作rectangle的距离
private int distance;
//参考rectangle的位置
@ -555,33 +511,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;
}
}

53
designer_base/src/com/fr/design/beans/location/WidgetForbidWindow.java

@ -17,32 +17,29 @@ public class WidgetForbidWindow extends JWindow {
private UIButton promptButton = new UIButton(Inter.getLocText("FR-Designer_Forbid_Widgets_Intersects"), BaseUtils.readIcon(IconPathConstants.FORBID_ICON_PATH));
// /**
// * 构造函数
// */
// public WidgetForbidWindow() {
// this.add(promptButton);
//
// this.setSize(WIDTH, HEIGHT);
// }
//
// /**
// * 在指定位置显示窗口, 默认将window的中心点放到指定位置上
// *
// * @param x x坐标
// * @param y y坐标
// *
// */
// public void showWindow(int x, int y){
// this.setLocation(x - WIDTH / 2, y - HEIGHT / 2);
// this.setVisible(true);
// }
//
// /**
// * 隐藏当前窗口
// *
// */
// public void hideWindow(){
// this.setVisible(false);
// }
/**
* 构造函数
*/
public WidgetForbidWindow() {
this.add(promptButton);
this.setSize(WIDTH, HEIGHT);
}
/**
* 在指定位置显示窗口, 默认将window的中心点放到指定位置上
*
* @param x x坐标
* @param y y坐标
*/
public void showWindow(int x, int y) {
this.setLocation(x - WIDTH / 2, y - HEIGHT / 2);
this.setVisible(true);
}
/**
* 隐藏当前窗口
*/
public void hideWindow() {
this.setVisible(false);
}
}

1
designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java

@ -123,7 +123,6 @@ public class SelectionModel {
if (selection.getSelectedCreator().getClass().equals(XWTabFitLayout.class)) {
Rectangle rec = selection.getRelativeBounds();
//Tab布局
System.out.println("ADD: " + (rec.x + rec.width / 2) + "\t" + (rec.y + BORDER_PROPORTION));
FormSelectionUtils.paste2Container(designer, (XLayoutContainer) selection.getSelectedCreator(),
CLIP_BOARD,
rec.x + rec.width / 2,

74
designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java

@ -1,19 +1,18 @@
package com.fr.design.mainframe;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.fr.base.FRContext;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.AbstractLayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.*;
import com.fr.form.ui.container.WLayout;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.general.ComparatorUtils;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.form.ui.Widget;
import java.awt.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FormSelectionUtils {
@ -22,10 +21,14 @@ public class FormSelectionUtils {
private static final int DELAY_Y = 20;
//组件复制时是否已经向左上偏移
private static boolean BACK_OFFSET = false;
private static boolean backoffset = false;
//组件重命名后缀
private static final String postfix = "_c";
private static final String POSTFIX = "_c";
private FormSelectionUtils() {
}
/**
* @param designer 编辑器
@ -67,12 +70,10 @@ public class FormSelectionUtils {
} else if (parent instanceof XWFitLayout) {
//相对布局
designer.getSelectionModel().getSelection().reset();
Rectangle rec = clipBoard.getSelctionBounds();
for (XCreator creator : clipBoard.getSelectedCreators()) {
try {
Widget copied = copyWidget(designer, creator);
XCreator copiedCreator = XCreatorUtils.createXCreator(copied, creator.getSize());
// TODO 获取位置
boolean addSuccess = adapter.addBean(copiedCreator, x, y);
if (addSuccess) {
@ -104,14 +105,14 @@ public class FormSelectionUtils {
*/
private static Point getPasteLocation(AbstractLayoutAdapter layoutAdapter, XCreator copiedCreator, int x, int y) {
//当宽度为奇数时 设置偏移
int x_offset = (copiedCreator.getWidth() & 1) == 1 ? 1 : 0;
int xoffset = (copiedCreator.getWidth() & 1) == 1 ? 1 : 0;
//当高度为奇数时 设置偏移
int y_offset = (copiedCreator.getHeight() & 1) == 1 ? 1 : 0;
int yoffset = (copiedCreator.getHeight() & 1) == 1 ? 1 : 0;
if (!layoutAdapter.accept(copiedCreator, x, y)) {
XLayoutContainer container = layoutAdapter.getContainer();
boolean xOut = x < 0 || x + copiedCreator.getWidth() / 2 + x_offset > container.getWidth();
boolean yOut = y < 0 || y + copiedCreator.getHeight() / 2 + y_offset > container.getHeight();
boolean xOut = x < 0 || x + copiedCreator.getWidth() / 2 + xoffset > container.getWidth();
boolean yOut = y < 0 || y + copiedCreator.getHeight() / 2 + yoffset > container.getHeight();
/*
* 组件原始位置位于布局的右下角
* 和布局右下边界线紧挨
@ -119,12 +120,12 @@ public class FormSelectionUtils {
* x,y同时越界
*/
if (xOut && yOut) {
x = BACK_OFFSET ? container.getWidth() - copiedCreator.getWidth() / 2 - x_offset
: container.getWidth() - copiedCreator.getWidth() / 2 - DELAY_X - x_offset;
y = BACK_OFFSET ?
container.getHeight() - copiedCreator.getHeight() / 2 - y_offset
: container.getHeight() - copiedCreator.getHeight() / 2 - DELAY_Y - y_offset;
BACK_OFFSET = !BACK_OFFSET;
x = backoffset ? container.getWidth() - copiedCreator.getWidth() / 2 - xoffset
: container.getWidth() - copiedCreator.getWidth() / 2 - DELAY_X - xoffset;
y = backoffset ?
container.getHeight() - copiedCreator.getHeight() / 2 - yoffset
: container.getHeight() - copiedCreator.getHeight() / 2 - DELAY_Y - yoffset;
backoffset = !backoffset;
return new Point(x, y);
}
/*
@ -134,8 +135,8 @@ public class FormSelectionUtils {
* x,y中只有一个越界
*/
else if ((xOut || yOut)) {
x = xOut ? container.getWidth() - copiedCreator.getWidth() / 2 - x_offset : x;
y = yOut ? container.getHeight() - copiedCreator.getHeight() / 2 - y_offset : y;
x = xOut ? container.getWidth() - copiedCreator.getWidth() / 2 - xoffset : x;
y = yOut ? container.getHeight() - copiedCreator.getHeight() / 2 - yoffset : y;
return new Point(x, y);
}
}
@ -143,6 +144,14 @@ public class FormSelectionUtils {
}
/**
* 拷贝组件
*
* @param formDesigner
* @param xCreator
* @return
* @throws CloneNotSupportedException
*/
private static Widget copyWidget(FormDesigner formDesigner, XCreator xCreator) throws
CloneNotSupportedException {
ArrayList<String> nameSpace = new ArrayList<String>();
@ -155,11 +164,6 @@ public class FormSelectionUtils {
} else {
copied.setWidgetName(name);
}
// if (copied instanceof WLayout) {
// for (int i = 0; i < ((WLayout) copied).getWidgetCount(); i++) {
// setCopiedName(formDesigner, ((WLayout) copied).getWidget(i), clonedNameList);
// }
// }
return copied;
}
@ -172,12 +176,12 @@ public class FormSelectionUtils {
* @return name
*/
private static String getCopiedName(FormDesigner formDesigner, Widget copied, ArrayList<String> nameSpace) {
String name = copied.getWidgetName();
StringBuffer name = new StringBuffer(copied.getWidgetName());
do {
name += postfix;
} while (formDesigner.getTarget().isNameExist(name) || nameSpace.contains(name));
nameSpace.add(name);
return name;
name.append(POSTFIX);
} while (formDesigner.getTarget().isNameExist(name.toString()) || nameSpace.contains(name.toString()));
nameSpace.add(name.toString());
return name.toString();
}
public static void rebuildSelection(FormDesigner designer) {

Loading…
Cancel
Save