Browse Source

解决冲突代码

master
mengao 8 years ago
parent
commit
c3e8ef59f8
  1. 2
      designer_base/src/com/fr/design/locale/designer.properties
  2. 2
      designer_base/src/com/fr/design/locale/designer_en_US.properties
  3. 2
      designer_base/src/com/fr/design/locale/designer_zh_CN.properties
  4. 2
      designer_base/src/com/fr/design/locale/designer_zh_TW.properties
  5. 11
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  6. 26
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRBodyLayoutAdapter.java
  7. 2
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
  8. 11
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRTabFitLayoutAdapter.java
  9. 36
      designer_form/src/com/fr/design/designer/beans/models/AddingModel.java
  10. 46
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  11. 106
      designer_form/src/com/fr/design/designer/beans/models/StateModel.java
  12. 3
      designer_form/src/com/fr/design/designer/beans/painters/AbstractPainter.java
  13. 31
      designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java
  14. 12
      designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
  15. 17
      designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java
  16. 6
      designer_form/src/com/fr/design/mainframe/FormDesigner.java
  17. 12
      designer_form/src/com/fr/design/mainframe/FormSelection.java
  18. 75
      designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java

2
designer_base/src/com/fr/design/locale/designer.properties

@ -589,3 +589,5 @@ FR-Designer_AxisReversed=Axis Reversed
FR-Designer_Logarithmic=Logarithmic
FR-Designer_Chart_Log_Base=Log Base
FR-Designer_Chart_F_Radar_Axis=Chart_F_Radar_Axis
FR-Designer_Too_Large_To_Paste=too large to paste
FR-Designer_Too_Small_To_Paste=Too small to paste

2
designer_base/src/com/fr/design/locale/designer_en_US.properties

@ -590,3 +590,5 @@ FR-Designer_AxisReversed=Axis in reverse order
FR-Designer_Logarithmic=Log scale
FR-Designer_Chart_Log_Base=Log Base
FR-Designer_Chart_F_Radar_Axis=Value Axis
FR-Designer_Too_Large_To_Paste=Too large to paste!
FR-Designer_Too_Small_To_Paste=Too small to paste!

2
designer_base/src/com/fr/design/locale/designer_zh_CN.properties

@ -594,3 +594,5 @@ FR-Designer_AxisReversed=\u8F74\u9006\u5E8F
FR-Designer_Logarithmic=\u5BF9\u6570\u523B\u5EA6
FR-Designer_Chart_Log_Base=\u5E95\u6570
FR-Designer_Chart_F_Radar_Axis=\u503C\u8F74
FR-Designer_Too_Large_To_Paste=\u7EC4\u4EF6\u5927\u5C0F\u8D85\u51FA\u8FB9\u754C\uFF0C\u65E0\u6CD5\u7C98\u8D34\uFF01
FR-Designer_Too_Small_To_Paste=\u6B64\u5904\u65E0\u6CD5\u7C98\u8D34\uFF0C\u5C0F\u4E8E\u7EC4\u4EF6\u6700\u5C0F\u9AD8\u5EA6\uFF01

2
designer_base/src/com/fr/design/locale/designer_zh_TW.properties

@ -582,3 +582,5 @@ FR-Designer_AxisReversed=\u8EF8\u9006\u5E8F
FR-Designer_Logarithmic=\u5C0D\u6578\u523B\u5EA6
FR-Designer_Chart_Log_Base=\u5E95\u6578
FR-Designer_Chart_F_Radar_Axis=\u503C\u8EF8
FR-Designer_Too_Large_To_Paste=\u7D44\u4EF6\u5927\u5C0F\u8D85\u51FA\u908A\u754C\uFF0C\u7121\u6CD5\u7C98\u8CBC\uFF01
FR-Designer_Too_Small_To_Paste=\u6B64\u8655\u7121\u6CD5\u7C98\u8CBC\uFF0C\u5C0F\u65BC\u7D44\u4EF6\u6700\u5C0F\u9AD8\u5EA6\uFF01

11
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java

@ -283,7 +283,6 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter {
} else if (isCrossPointArea(parentComp, x, y)) {
//交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入
fixCrossPointArea(parentComp, child, x, y);
//TODO 尽量不要出现这种写法吧?if else条件要么互斥,要么多个if判断return,不要在一条if else语句里面return吧?
return;
} else if (isTrisectionArea(parentComp, x, y)) {
// 在边界三等分区域,就不再和组件二等分了
@ -320,17 +319,15 @@ public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter {
int height = creator.getHeight();
int width = creator.getWidth();
if (x < 0) {
width += x;
x = 0;
x = container.getX();
} else if (x + creator.getWidth() > container.getWidth()) {
width = container.getWidth() - x;
x = container.getWidth() - width;
}
if (y < 0) {
height += y;
y = 0;
y = container.getY();
} else if (y + creator.getHeight() > container.getHeight()) {
height = container.getHeight() - y;
y = container.getHeight() - height;
}
creator.setBounds(x, y, width, height);

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

@ -640,11 +640,7 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter {
* 又通过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;
}
y = y + WCardMainBorderLayout.TAB_HEIGHT + this.getParaEditorYOffset();
int tempX = x - rect.x;
int tempY = y - rect.y;
int containerX = container.getX();
@ -675,6 +671,26 @@ public class FRBodyLayoutAdapter extends AbstractLayoutAdapter {
return position;
}
/**
* 获取因为参数面板导致的Y坐标偏移
*
* @return 参数面板导致的Y坐标偏移
*/
protected int getParaEditorYOffset() {
int offset = 0;
if (container.getParent() != null) {
Component components[] = container.getParent().getComponents();
for (Component component : components) {
if (component instanceof XWParameterLayout) {
offset = component.getY() + component.getHeight();
break;
}
}
}
return offset;
}
/**
* 组件交叉区域进行插入时调整受到变动的其他组件,之前是交叉区域插入也按照三等分逻辑后面测试中发现有bug改为和bi一样的鼠标所在侧平分
* 默认左上角右下角区域是垂直方向插入组件

2
designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java

@ -133,7 +133,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
isFindRelatedComps = false;
//拖入组件判断时,先判断是否为交叉点区域,其次三等分区域,再次平分区域
Component comp = container.getComponentAt(x, y);
if (checkInterval(comp)) {
if (comp == null || checkInterval(comp)) {
return false;
}
//如果当前处于边缘地带, 那么就把他贴到父容器上

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

@ -7,11 +7,13 @@ package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.beans.GroupModel;
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.XWidgetCreator;
import com.fr.design.designer.creator.cardlayout.XWCardLayout;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.designer.properties.FRTabFitLayoutPropertiesGroupModel;
import com.fr.design.mainframe.widget.editors.ParameterEditor;
import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.container.WBorderLayout;
@ -82,16 +84,14 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
return true;
}
// tab布局的纵坐标受到tab高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界,
// 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度减掉
// tab布局的纵坐标受到tab高度以及参数面板高度的影响,判断的上边界取得是里面XWTabFitLayout的上边界,
// 实际计算的时候的纵坐标用了外层的CardMainBorerLayout,需要将tab高度和参数面板高度减掉
// 将y值变为相对坐标以实现获取到鼠标drop位置的控件
// TODO 可以直接在这边将x,y都变成相对坐标,这样在后面判断拖进来的新控件放置方式的时候就不用再判断了
private int adjustY(int y, XWTabFitLayout tabLayout) {
XWCardLayout cardLayout = (XWCardLayout) tabLayout.getBackupParent();
LayoutBorderStyle style = cardLayout.toData().getBorderStyle();
if (container.getLocation().y == WBorderLayout.DEFAULT_SIZE) {
y = y - WBorderLayout.DEFAULT_SIZE;
}
y = y - this.getParaEditorYOffset();
if (ComparatorUtils.equals(style.getType(), LayoutBorderStyle.TITLE)) {
y = y - WCardMainBorderLayout.TAB_HEIGHT;
}
@ -101,4 +101,5 @@ public class FRTabFitLayoutAdapter extends FRFitLayoutAdapter {
protected Rectangle getLayoutBound(XWCardMainBorderLayout mainLayout) {
return ComponentUtils.getRelativeBounds(mainLayout);
}
}

36
designer_form/src/com/fr/design/designer/beans/models/AddingModel.java

@ -21,8 +21,8 @@ public class AddingModel {
// 当前要添加的组件
private XCreator creator;
// 记录当前鼠标的位置信息
private int current_x;
private int current_y;
private int currentX;
private int currentY;
private boolean added;
public AddingModel(FormDesigner designer, XCreator xCreator) {
@ -30,12 +30,13 @@ public class AddingModel {
this.creator = xCreator;
instantiateCreator(designer, creatorName);
// 初始的时候隐藏该组件的图标
current_x = -this.creator.getWidth();
current_y = -this.creator.getHeight();
currentY = -this.creator.getWidth();
currentX = -this.creator.getHeight();
}
/**
* 待说明
*
* @param designer 设计器
* @param creatorName 组件名
*/
@ -52,16 +53,16 @@ public class AddingModel {
this.creator.backupCurrentSize();
this.creator.backupParent();
this.creator.setSize(xCreator.initEditorSize());
current_x = x - (xCreator.getWidth() / 2);
current_y = y - (xCreator.getHeight() / 2);
currentX = x - (xCreator.getWidth() / 2);
currentY = y - (xCreator.getHeight() / 2);
}
/**
* 隐藏当前组件的图标
*/
public void reset() {
current_x = -this.creator.getWidth();
current_y = -this.creator.getHeight();
currentX = -this.creator.getWidth();
currentY = -this.creator.getHeight();
}
public String getXCreatorName(FormDesigner designer, XCreator x) {
@ -77,22 +78,23 @@ public class AddingModel {
}
public int getCurrentX() {
return current_x;
return currentX;
}
public int getCurrentY() {
return current_y;
return currentY;
}
/**
* 移动组件图标到鼠标事件发生的位置
*
* @param x 坐标
* @param y 坐标
*/
public void moveTo(int x, int y) {
current_x = x - (this.creator.getWidth() / 2);
current_y = y - (this.creator.getHeight() / 2);
currentX = x - (this.creator.getWidth() / 2);
currentY = y - (this.creator.getHeight() / 2);
}
public XCreator getXCreator() {
@ -101,6 +103,7 @@ public class AddingModel {
/**
* 当前组件是否已经添加到某个容器中
*
* @return 是返回true
*/
public boolean isCreatorAdded() {
@ -109,6 +112,7 @@ public class AddingModel {
/**
* 加入容器
*
* @param designer 设计器
* @param container 容器
* @param x 坐标
@ -124,10 +128,14 @@ public class AddingModel {
Rectangle rect = ComponentUtils.getRelativeBounds(container);
if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) {
return added = container.getLayoutAdapter().addBean(creator, x + designer.getArea().getHorizontalValue(), y + designer.getArea().getVerticalValue());
added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue(),
y + designer.getArea().getVerticalValue());
return added;
}
return added = container.getLayoutAdapter().addBean(creator,
added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue() - rect.x,
y + designer.getArea().getVerticalValue() - rect.y);
return added;
}
}

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

@ -13,6 +13,7 @@ import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.stable.ArrayUtils;
@ -26,7 +27,7 @@ import java.util.ArrayList;
public class SelectionModel {
//被粘贴组件在所选组件位置处往下、往右各错开20像素。执行多次粘贴时,在上一次粘贴的位置处错开20像素。
private static final int DELTA_X_Y = 20; //粘贴时候的偏移距离
private static final int BORDER_PROPORTION = 20;
private static final double OFFSET_RELATIVE = 0.80;
private static FormSelection clipboard = new FormSelection();
private FormDesigner designer;
private FormSelection selection;
@ -111,7 +112,7 @@ public class SelectionModel {
*/
public boolean pasteFromClipBoard() {
if (!clipboard.isEmpty()) {
if (!hasSelectionComponent()) {
if (!hasSelectedPasteSource()) {
//未选
unselectedPaste();
} else {
@ -140,14 +141,14 @@ public class SelectionModel {
FormSelectionUtils.paste2Container(designer, (XLayoutContainer) selection.getSelectedCreator(),
clipboard,
rec.x + rec.width / 2,
rec.y + BORDER_PROPORTION);
rec.y + DELTA_X_Y);
} else {
Rectangle rec = selection.getRelativeBounds();
//自适应布局
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),
clipboard,
rec.x + rec.width / 2,
rec.y + BORDER_PROPORTION);
rec.y + DELTA_X_Y);
}
} else {
//绝对布局
@ -172,18 +173,22 @@ public class SelectionModel {
* 粘贴时选择组件
*/
private void selectedPaste() {
XLayoutContainer parent = null;
XLayoutContainer container = null;
//获取到编辑器的表层容器(已选的组件的父容器就是表层容器)
parent = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator());
if (parent != null && selection.getSelectedCreator().getParent() instanceof XWFitLayout) {
container = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator());
if (container != null && selection.getSelectedCreator().getParent() instanceof XWFitLayout) {
//自适应布局
Rectangle rec = selection.getRelativeBounds();
FormSelectionUtils.paste2Container(designer, parent, clipboard, rec.x + rec.width / 2, rec.y +
rec.height - BORDER_PROPORTION);
} else if (parent != null && selection.getSelectedCreator().getParent() instanceof XWAbsoluteLayout) {
Rectangle selectionRec = selection.getRelativeBounds();
Rectangle containerRec = ComponentUtils.getRelativeBounds(container);
//计算自适应布局位置
int positionX = selectionRec.x - containerRec.x + selectionRec.width / 2;
int positionY = (int) (selectionRec.y - containerRec.y + selectionRec.height * OFFSET_RELATIVE);
FormSelectionUtils.paste2Container(designer, container, clipboard, positionX, positionY);
} else if (container != null && selection.getSelectedCreator().getParent() instanceof XWAbsoluteLayout) {
//绝对布局
Rectangle rec = selection.getSelctionBounds();
FormSelectionUtils.paste2Container(designer, parent, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
}
}
@ -198,13 +203,13 @@ public class SelectionModel {
if (creator.acceptType(XWParameterLayout.class)) {
designer.removeParaComponent();
}
removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight());
creator.removeAll();
// 清除被选中的组件
selection.reset();
}
setSelectedCreator(designer.getRootComponent());
FormSelectionUtils.rebuildSelection(designer);
// 触发事件
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED);
designer.repaint();
@ -275,7 +280,7 @@ public class SelectionModel {
* 但是编辑窗口的最外层其实是表层@see {@link com.fr.design.designer.creator.XWAbsoluteBodyLayout},
* 其他两层不是靠添加组件就可以编辑的
*/
public boolean hasSelectionComponent() {
public boolean hasSelectedPasteSource() {
XCreator selectionXCreator = selection.getSelectedCreator();
if (designer.getClass().equals(FormDesigner.class)) {
//frm本地组件复用
@ -286,10 +291,12 @@ public class SelectionModel {
|| selectionXCreator.getClass().equals(XWTabFitLayout.class);
//选中的是否是frm绝对布局编辑器本身
boolean absoluteEditor = selectionXCreator.getClass().equals(XWAbsoluteBodyLayout.class);
//选中是否是frm绝对画布块编辑器本身
boolean absoluteCanvas = selectionXCreator.getClass().equals(XWAbsoluteLayout.class);
//选中的是否是相对布局编辑器本身
boolean relativeEditor = selectionXCreator.getClass().equals(XWFitLayout.class);
return !(tabEditor || absoluteEditor || relativeEditor);
return !(tabEditor || absoluteEditor || absoluteCanvas || relativeEditor);
} else {
return false;
}
@ -299,6 +306,15 @@ public class SelectionModel {
}
}
/**
* 是否有组件被选择如果所选组件是最底层容器也视为无选择
*
* @return 是则返回true
*/
public boolean hasSelectionComponent() {
return !selection.isEmpty() && selection.getSelectedCreator().getParent() != null;
}
/**
* 移动组件至指定位置
*

106
designer_form/src/com/fr/design/designer/beans/models/StateModel.java

@ -1,30 +1,21 @@
package com.fr.design.designer.beans.models;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import com.fr.design.beans.location.Absorptionline;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location;
import com.fr.design.designer.creator.XConnector;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.*;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.utils.ComponentUtils;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
/**
* 普通模式下的状态model
*/
@ -36,8 +27,11 @@ public class StateModel {
private Direction driection;
// 当前拖拽的起始位置
private int current_x;
private int current_y;
private int currentX;
private int currentY;
//拖拽组件原始位置大小备份
private Rectangle selectedPositionBackup;
private Point startPoint = new Point();
private Point currentPoint = new Point();
@ -62,6 +56,7 @@ public class StateModel {
/**
* 返回direction
*
* @return direction方向
*/
public Direction getDirection() {
@ -79,6 +74,7 @@ public class StateModel {
/**
* 是否能拖拽
*
* @return 非outer且选中为空
*/
public boolean dragable() {
@ -118,22 +114,35 @@ public class StateModel {
}
}
private boolean addBean(XLayoutContainer container, int x, int y) {
/**
* @param container 容器
* @param mouseX 鼠标释放位置X
* @param mouseY 鼠标释放位置Y
* @return 是否成功
*/
private boolean addBean(XLayoutContainer container, int mouseX, int mouseY) {
LayoutAdapter adapter = container.getLayoutAdapter();
Rectangle r = ComponentUtils.getRelativeBounds(container);
Rectangle rectangleContainer = ComponentUtils.getRelativeBounds(container);
if (selectionModel.getSelection().size() == 1) {
return adapter.addBean(selectionModel.getSelection().getSelectedCreator(), x
+ designer.getArea().getHorizontalValue() - r.x, y + designer.getArea().getVerticalValue() - r.y);
return adapter.addBean(selectionModel.getSelection().getSelectedCreator(),
mouseX + designer.getArea().getHorizontalValue() - rectangleContainer.x,
mouseY + designer.getArea().getVerticalValue() - rectangleContainer.y);
}
for (XCreator creator : selectionModel.getSelection().getSelectedCreators()) {
adapter.addBean(creator, x + designer.getArea().getHorizontalValue() - r.x, y + designer.getArea().getVerticalValue()- r.y);
adapter.addBean(creator,
mouseX + designer.getArea().getHorizontalValue() - rectangleContainer.x,
mouseY + designer.getArea().getVerticalValue() - rectangleContainer.y);
}
return true;
}
private void adding(int x, int y) {
/**
* @param mouseReleasedX 鼠标释放位置X
* @param mouseReleasedY 鼠标释放位置Y
*/
private void adding(int mouseReleasedX, int mouseReleasedY) {
// 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(x, y, selectionModel.getSelection().getSelectedCreators());
XCreator hoveredComponent = designer.getComponentAt(mouseReleasedX, mouseReleasedY, selectionModel.getSelection().getSelectedCreators());
// 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
@ -142,7 +151,7 @@ public class StateModel {
if (container != null) {
// 如果是容器,则调用其acceptComponent接受组件
success = addBean(container, x, y);
success = addBean(container, mouseReleasedX, mouseReleasedY);
}
if (success) {
@ -150,15 +159,16 @@ public class StateModel {
designer.getEditListenerTable().fireCreatorModified(
selectionModel.getSelection().getSelectedCreator(), DesignerEvent.CREATOR_ADDED);
} else {
selectionModel.getSelection().setSelectionBounds(selectedPositionBackup, designer);
Toolkit.getDefaultToolkit().beep();
}
// 取消提示
designer.setPainter(null);
}
/**
* 是否拖拽
*
* @return dragging状态
*/
public boolean isDragging() {
@ -167,6 +177,7 @@ public class StateModel {
/**
* 是否可以开始画线
*
* @return startPoint不为空返回true
*/
public boolean prepareForDrawLining() {
@ -175,6 +186,7 @@ public class StateModel {
/**
* 设置开始位置
*
* @param p point位置
*/
public void setStartPoint(Point p) {
@ -183,6 +195,7 @@ public class StateModel {
/**
* 返回开始位置
*
* @return 点位置
*/
public Point getStartPoint() {
@ -191,6 +204,7 @@ public class StateModel {
/**
* 返回当前点位置
*
* @return 点位置
*/
public Point getEndPoint() {
@ -199,29 +213,32 @@ public class StateModel {
/**
* 当前选中组件
*
* @param e 鼠标事件
*/
public void startSelecting(MouseEvent e) {
selecting = true;
selectionModel.setHotspotBounds(new Rectangle());
current_x = getMouseXY(e).x;
current_y = getMouseXY(e).y;
currentX = getMouseXY(e).x;
currentY = getMouseXY(e).y;
}
/**
* 当前鼠标的xy
*
* @param e 鼠标事件
*/
public void startResizing(MouseEvent e) {
if (!selectionModel.getSelection().isEmpty()) {
driection.backupBounds(designer);
}
current_x = getMouseXY(e).x;
current_y = getMouseXY(e).y;
currentX = getMouseXY(e).x;
currentY = getMouseXY(e).y;
}
/**
* 起始点开始DrawLine
*
* @param p 点位置
*/
public void startDrawLine(Point p) {
@ -238,6 +255,7 @@ public class StateModel {
/**
* 鼠标释放时所在的区域及圈中的组件
*
* @param e 鼠标事件
*/
public void selectCreators(MouseEvent e) {
@ -246,7 +264,7 @@ public class StateModel {
Rectangle bounds = createCurrentBounds(x, y);
if ((x != current_x) || (y != current_y)) {
if ((x != currentX) || (y != currentY)) {
selectionModel.setSelectedCreators(getHotspotCreators(bounds, designer.getRootComponent()));
}
selectionModel.setHotspotBounds(null);
@ -254,6 +272,7 @@ public class StateModel {
/**
* 画所在区域线
*
* @param e 鼠标事件
*/
public void drawLine(MouseEvent e) {
@ -270,16 +289,16 @@ public class StateModel {
private Rectangle createCurrentBounds(int x, int y) {
Rectangle bounds = new Rectangle();
bounds.x = Math.min(x, current_x);
bounds.y = Math.min(y, current_y);
bounds.width = Math.max(x, current_x) - bounds.x;
bounds.height = Math.max(y, current_y) - bounds.y;
bounds.x = Math.min(x, currentX);
bounds.y = Math.min(y, currentY);
bounds.width = Math.max(x, currentX) - bounds.x;
bounds.height = Math.max(y, currentY) - bounds.y;
return bounds;
}
private ArrayList<XCreator> getHotspotCreators(Rectangle selection, XCreator root) {
ArrayList<XCreator> creators = new ArrayList<XCreator>();
ArrayList<XCreator> creators = new ArrayList<>();
if (!root.isVisible() && !designer.isRoot(root)) {
return creators;
@ -334,6 +353,7 @@ public class StateModel {
/**
* 设置可拉伸方向
*
* @param dir 拉伸方向
*/
public void setDirection(Direction dir) {
@ -345,6 +365,7 @@ public class StateModel {
/**
* x吸附线赋值
*
* @param line 线
*/
public void setXAbsorptionline(Absorptionline line) {
@ -353,6 +374,7 @@ public class StateModel {
/**
* y吸附线赋值
*
* @param line 线
*/
public void setYAbsorptionline(Absorptionline line) {
@ -361,6 +383,7 @@ public class StateModel {
/**
* 等距线赋值
*
* @param line 线
*/
public void setEquidistantLine(Absorptionline line) {
@ -369,6 +392,7 @@ public class StateModel {
/**
* 画吸附线
*
* @param g Graphics类
*/
public void paintAbsorptionline(Graphics g) {
@ -385,12 +409,17 @@ public class StateModel {
/**
* 拖拽
*
* @param e 鼠标事件
*/
public void dragging(MouseEvent e) {
//进入dragging状态时备份组件大小和位置
if (!dragging) {
selectedPositionBackup = selectionModel.getSelection().getRelativeBounds();
}
checkAddable(e);
setDependLinePainter(e);
driection.drag(getMouseXY(e).x-current_x, getMouseXY(e).y-current_y, designer);
driection.drag(getMouseXY(e).x - currentX, getMouseXY(e).y - currentY, designer);
this.dragging = true;
}
@ -409,6 +438,7 @@ public class StateModel {
/**
* 释放捕获
*
* @param e 鼠标事件
*/
public void releaseDragging(MouseEvent e) {

3
designer_form/src/com/fr/design/designer/beans/painters/AbstractPainter.java

@ -22,6 +22,7 @@ public abstract class AbstractPainter implements HoverPainter {
/**
* 构造函数
*
* @param container 容器
*/
public AbstractPainter(XLayoutContainer container) {
@ -35,6 +36,7 @@ public abstract class AbstractPainter implements HoverPainter {
/**
* 画初始区域
*
* @param g 画图类
* @param startX 起始x位置
* @param startY 起始y位置
@ -47,6 +49,7 @@ public abstract class AbstractPainter implements HoverPainter {
/**
* 设置边界
*
* @param rect 位置
*/
@Override

31
designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java

@ -45,6 +45,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
protected boolean editable = false;
//鼠标移动到布局画出编辑层
protected boolean isMouseEnter = false;
public void setMouseEnter(boolean mouseEnter) {
isMouseEnter = mouseEnter;
}
@ -56,6 +57,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 得到属性名
*
* @return 属性名
* @throws IntrospectionException
*/
@ -81,6 +83,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 控件名属性
*
* @return
* @throws IntrospectionException
*/
@ -91,6 +94,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 边距属性
*
* @return
* @throws IntrospectionException
*/
@ -102,6 +106,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回对应的wlayout
*
* @return wlayout控件
*/
public WLayout toData() {
@ -123,6 +128,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 当前组件zorder位置替换新的控件
*
* @param widget 控件
* @param oldcreator 旧组件
* @return 组件
@ -141,6 +147,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 初始化时默认的组件大小
*
* @return 默认Dimension
*/
public Dimension initEditorSize() {
@ -172,6 +179,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 设计界面中有组件添加时要通知WLayout容器重新paint
*
* @param e 待说明
*/
@Override
@ -188,6 +196,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 设计界面中有组件添加时要通知WLayout容器重新paint
*
* @param e 待说明
*/
@Override
@ -203,6 +212,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 根据widget的属性值来获取
*
* @param wgt
* @return
*/
@ -233,6 +243,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 该组件是否可以拖入参数面板
*
* @return 是则返回true
*/
public boolean canEnterIntoParaPane() {
@ -241,6 +252,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否作为控件树的叶子节点
*
* @return 是则返回true
*/
public boolean isComponentTreeLeaf() {
@ -257,6 +269,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否有查询按钮
*
* @param xCreator 控件或容器
* @return 有无查询按钮
*/
@ -295,6 +308,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 主要为自适应用
* 返回指定point的上方组件
*
* @param x x位置
* @param y y位置
* @return 指定位置的组件
@ -306,6 +320,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 主要为自适应用
* 返回指定point的左方组件
*
* @param x x位置
* @param y y位置
* @return 指定位置的组件
@ -316,6 +331,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的右方组件
*
* @param x x位置
* @param y y位置
* @param w 宽度
@ -327,6 +343,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的下方组件
*
* @param x x位置
* @param y y位置
* @param h 高度
@ -338,6 +355,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的上方且是右侧的组件
*
* @param x x位置
* @param y y位置
* @param w 宽度
@ -349,6 +367,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的左方且是下侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
@ -360,6 +379,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的右方且是下侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
@ -372,6 +392,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 返回指定point的下方且是右侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
@ -384,6 +405,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否延迟展示报表内容也就是说是否要等点击了查询之后才执行报表
*
* @return 如果是true则表示点击之后才开始计算false则表示会根据参数默认值直接计算报表并展现
*/
public boolean isDelayDisplayContent() {
@ -392,6 +414,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否显示参数界面
*
* @return 显示参数界面则返回true否则返回false
*/
public boolean isDisplay() {
@ -404,6 +427,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 获取参数界面的宽度
*
* @return 宽度
*/
public int getDesignWidth() {
@ -412,6 +436,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 获取参数面板的对齐方式
*
* @return 左中右三种对齐方式
*/
public int getPosition() {
@ -424,17 +449,13 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
* @param designer 表单设计器
*/
public void stopAddingState(FormDesigner designer) {
return;
}
/**
* 寻找最近的为自适应布局的父容器
*
* @return 布局容器
*
*
* @date 2014-12-30-下午3:15:28
*
*/
public XLayoutContainer findNearestFit() {
//一层一层网上找, 找到最近的fit那一层就return
@ -478,6 +499,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 布局是否可编辑不可则显示编辑蒙层
*
* @return 可否编辑
*/
public boolean isEditable() {
@ -486,6 +508,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 设置布局是否可编辑不可则显示编辑蒙层
*
* @param isEditable 可否编辑
*/
public void setEditable(boolean isEditable) {

12
designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java

@ -25,8 +25,6 @@ import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout;
/**
*
*
* @date: 2014-11-25-下午3:11:14
*/
public class XWCardTagLayout extends XWHorizontalBoxLayout {
@ -92,10 +90,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
* 添加组件的监听事件
*
* @param e 事件
*
*
* @date 2014-11-25-下午6:20:10
*
*/
public void componentAdded(ContainerEvent e) {
super.componentAdded(e);
@ -152,7 +147,6 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
*/
public void stopAddingState(FormDesigner designer) {
designer.stopAddingState();
return;
}
//新增时去tabFitLayout名字中最大的Index+1,防止重名
@ -173,7 +167,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
/**
* 调整tab宽度
*
* <p>
* void
*/
public void adjustComponentWidth() {
@ -182,11 +176,11 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
/**
* 该布局需要隐藏无需对边框进行操作
* @param 边框
*
* @param
*/
public void setBorder(Border border) {
return;
}
@Override

17
designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java

@ -43,7 +43,7 @@ public class FormCreatorDropTarget extends DropTarget {
* 当前添加模式对应的model
*/
private AddingModel addingModel;
private final static int GAP = 30;
private static final int GAP = 30;
private JWindow promptWindow = new JWindow();
private UIButton promptButton = new UIButton("", BaseUtils.readIcon(IconPathConstants.FORBID_ICON_PATH));
@ -59,10 +59,11 @@ public class FormCreatorDropTarget extends DropTarget {
XCreator hoveredComponent = designer.getComponentAt(x, y);
// 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
//cardTagLayout里用到
container.stopAddingState(designer);
boolean success = false;
if (container != null) {
//XWCardTagLayout 切换添加状态到普通状态
container.stopAddingState(designer);
// 如果是容器,则调用其acceptComponent接受组件
AddingModel model = designer.getAddingModel();
@ -129,9 +130,7 @@ public class FormCreatorDropTarget extends DropTarget {
//提示组件是否可以拖入
promptUser(x, y, container);
if (container != null) {
dealWithContainer(x, y, container);
} else {
// 如果鼠标不在任何组件上,则取消提示器
designer.setPainter(null);
@ -197,11 +196,9 @@ public class FormCreatorDropTarget extends DropTarget {
private void promptWidgetForbidEnter(int x, int y, XLayoutContainer container) {
container.setBorder(BorderFactory.createLineBorder(Color.RED, Constants.LINE_MEDIUM));
int screen_X = (int) designer.getArea().getLocationOnScreen().getX();
int screen_Y = (int) designer.getArea().getLocationOnScreen().getY();
this.promptWindow.setSize(promptWindow.getPreferredSize());
this.promptWindow.setPreferredSize(promptWindow.getPreferredSize());
promptWindow.setLocation(screen_X + x + GAP, screen_Y + y + GAP);
int screenX = designer.getArea().getLocationOnScreen().x;
int screenY = designer.getArea().getLocationOnScreen().y;
promptWindow.setLocation(screenX + x + GAP, screenY + y + GAP);
promptWindow.setVisible(true);
}

6
designer_form/src/com/fr/design/mainframe/FormDesigner.java

@ -612,6 +612,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return true;
}
public void showMessageDialog(String message) {
JOptionPane.showMessageDialog(this, message, Inter.getLocText("FR-Designer_Alert"), JOptionPane.WARNING_MESSAGE);
FormSelectionUtils.rebuildSelection(this);
repaint();
}
/**
* 保存参数界面的宽度
*

12
designer_form/src/com/fr/design/mainframe/FormSelection.java

@ -8,12 +8,7 @@ import com.fr.base.FRContext;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.creator.XComponent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.creator.*;
import com.fr.form.ui.Widget;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils;
@ -273,6 +268,11 @@ public class FormSelection {
if (parent == null) {
return;
}
boolean changeCreator = creator.shouldScaleCreator() || creator.hasTitleStyle();
if (parent.acceptType(XWFitLayout.class) && changeCreator) {
creator = (XCreator) creator.getParent();
}
parent.getLayoutAdapter().removeBean(creator, creator.getWidth(), creator.getHeight());
// 删除其根组件,同时就删除了同时被选择的叶子组件
parent.remove(creator);
LayoutManager layout = parent.getLayout();

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

@ -8,6 +8,7 @@ import com.fr.design.designer.creator.*;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WTitleLayout;
import com.fr.general.ComparatorUtils;
import com.fr.general.Inter;
import java.awt.*;
import java.util.ArrayList;
@ -17,11 +18,7 @@ import java.util.List;
public class FormSelectionUtils {
//组件复制时坐标偏移
private static final int DELAY_X = 20;
private static final int DELAY_Y = 20;
//组件复制时是否已经向左上偏移
private static boolean backoffset = false;
private static final int DELAY_X_Y = 20;
//组件重命名后缀
private static final String POSTFIX = "_c";
@ -31,11 +28,7 @@ public class FormSelectionUtils {
}
/**
* @param designer 编辑器
* @param parent 粘贴依据的组件
* @param clipboard 剪贴板内容
* @param x x
* @param y y
* 粘贴到容器
*/
public static void paste2Container(FormDesigner designer, XLayoutContainer parent,
FormSelection clipboard, int x, int y) {
@ -54,12 +47,6 @@ public class FormSelectionUtils {
/**
* 绝对布局粘贴
*
* @param designer
* @param clipboard
* @param adapter
* @param x
* @param y
*/
private static void absolutePaste(FormDesigner designer, FormSelection clipboard, LayoutAdapter adapter, int x, int y) {
@ -74,6 +61,10 @@ public class FormSelectionUtils {
copiedCreator,
x + creator.getX() - rec.x + copiedCreator.getWidth() / 2,
y + creator.getY() - rec.y + copiedCreator.getHeight() / 2);
if (!adapter.accept(copiedCreator, point.x, point.y)) {
designer.showMessageDialog(Inter.getLocText("FR-Designer_Too_Large_To_Paste"));
return;
}
boolean addSuccess = adapter.addBean(copiedCreator, point.x, point.y);
if (addSuccess) {
designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
@ -90,12 +81,6 @@ public class FormSelectionUtils {
/**
* 相对布局粘贴
*
* @param designer
* @param clipboard
* @param adapter
* @param x
* @param y
*/
private static void relativePaste(FormDesigner designer, FormSelection clipboard, LayoutAdapter adapter, int x, int y) {
designer.getSelectionModel().getSelection().reset();
@ -103,6 +88,10 @@ public class FormSelectionUtils {
try {
Widget copied = copyWidget(designer, creator);
XCreator copiedCreator = XCreatorUtils.createXCreator(copied, creator.getSize());
if (!adapter.accept(copiedCreator, x, y)) {
designer.showMessageDialog(Inter.getLocText("FR-Designer_Too_Small_To_Paste"));
return;
}
boolean addSuccess = adapter.addBean(copiedCreator, x, y);
if (addSuccess) {
designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
@ -118,14 +107,6 @@ public class FormSelectionUtils {
/**
* 组件复用绝对布局获取粘贴组件位置
*
* @param layoutAdapter 绝对布局容器AbstractLayoutAdapter
* @param copiedCreator 复制的组件
* @param x x=组件x + clonedCreator.getWidth() / 2
* @param y y=组件y + clonedCreator.getHeight() / 2
* 除2的步骤会导致当宽度或者高度为奇数是中心点向左上各偏移一个像素
* 由于中心点向左上各偏移一个像素依赖中心点计算的右下点就会相应的想做上偏移一个像素导致结果不准确
* @return 新位置坐标
*/
private static Point getPasteLocation(AbstractLayoutAdapter layoutAdapter, XCreator copiedCreator, int x, int y) {
//当宽度为奇数时 设置偏移
@ -144,12 +125,10 @@ public class FormSelectionUtils {
* x,y同时越界
*/
if (xOut && yOut) {
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;
//向左偏移
x = container.getWidth() - copiedCreator.getWidth() / 2 - DELAY_X_Y - xoffset;
//紧贴下边界
y = container.getHeight() - copiedCreator.getHeight() / 2 - yoffset;
return new Point(x, y);
}
/*
@ -158,7 +137,7 @@ public class FormSelectionUtils {
* 距离大于20像素的一侧正常错开
* x,y中只有一个越界
*/
else if ((xOut || yOut)) {
if ((xOut || yOut)) {
x = xOut ? container.getWidth() - copiedCreator.getWidth() / 2 - xoffset : x;
y = yOut ? container.getHeight() - copiedCreator.getHeight() / 2 - yoffset : y;
return new Point(x, y);
@ -170,15 +149,10 @@ 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>();
ArrayList<String> nameSpace = new ArrayList<>();
Widget copied = (Widget) xCreator.toData().clone();
//重命名拷贝的组件
String name = getCopiedName(formDesigner, copied, nameSpace);
@ -193,14 +167,9 @@ public class FormSelectionUtils {
/**
* 组件拷贝命名规则
*
* @param formDesigner
* @param copied
* @param nameSpace
* @return name
*/
private static String getCopiedName(FormDesigner formDesigner, Widget copied, ArrayList<String> nameSpace) {
StringBuffer name = new StringBuffer(copied.getWidgetName());
StringBuilder name = new StringBuilder(copied.getWidgetName());
do {
name.append(POSTFIX);
} while (formDesigner.getTarget().isNameExist(name.toString()) || nameSpace.contains(name.toString()));
@ -209,8 +178,8 @@ public class FormSelectionUtils {
}
public static void rebuildSelection(FormDesigner designer) {
ArrayList<XCreator> newSelection = new ArrayList<XCreator>();
List<Widget> widgetList = new ArrayList<Widget>();
ArrayList<XCreator> newSelection = new ArrayList<>();
List<Widget> widgetList = new ArrayList<>();
for (XCreator comp : designer.getSelectionModel().getSelection().getSelectedCreators()) {
widgetList.add(comp.toData());
}
@ -219,11 +188,11 @@ public class FormSelectionUtils {
}
public static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, Widget[] selectWidgets) {
List<Widget> selectionWidget = new ArrayList<Widget>();
List<Widget> selectionWidget = new ArrayList<>();
if (selectWidgets != null) {
selectionWidget.addAll(Arrays.asList(selectWidgets));
}
return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<XCreator>());
return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<>());
}
private static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, List<Widget> selectionWidget,

Loading…
Cancel
Save