Browse Source

report-1945 frm组件复用绝对布局bug处理

master
yaoh.wu 7 years ago
parent
commit
7d57afb46e
  1. 11
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  2. 2
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
  3. 272
      designer_form/src/com/fr/design/designer/beans/models/AddingModel.java
  4. 17
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  5. 920
      designer_form/src/com/fr/design/designer/beans/models/StateModel.java
  6. 435
      designer_form/src/com/fr/design/designer/creator/XLayoutContainer.java
  7. 338
      designer_form/src/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
  8. 17
      designer_form/src/com/fr/design/mainframe/FormCreatorDropTarget.java
  9. 6
      designer_form/src/com/fr/design/mainframe/FormDesigner.java
  10. 70
      designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java

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);

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;
}
//如果当前处于边缘地带, 那么就把他贴到父容器上

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

@ -1,133 +1,141 @@
package com.fr.design.designer.beans.models;
import java.awt.Rectangle;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.adapters.component.CompositeComponentAdapter;
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.utils.ComponentUtils;
import com.fr.general.ComparatorUtils;
/**
* 添加状态下的model
*/
public class AddingModel {
// 当前要添加的组件
private XCreator creator;
// 记录当前鼠标的位置信息
private int current_x;
private int current_y;
private boolean added;
public AddingModel(FormDesigner designer, XCreator xCreator) {
String creatorName = getXCreatorName(designer, xCreator);
this.creator = xCreator;
instantiateCreator(designer, creatorName);
// 初始的时候隐藏该组件的图标
current_x = -this.creator.getWidth();
current_y = -this.creator.getHeight();
}
/**
* 待说明
* @param designer 设计器
* @param creatorName 组件名
*/
public void instantiateCreator(FormDesigner designer, String creatorName) {
creator.toData().setWidgetName(creatorName);
ComponentAdapter adapter = new CompositeComponentAdapter(designer, creator);
adapter.initialize();
creator.addNotify();
creator.putClientProperty(AdapterBus.CLIENT_PROPERTIES, adapter);
}
public AddingModel(XCreator xCreator, int x, int y) {
this.creator = xCreator;
this.creator.backupCurrentSize();
this.creator.backupParent();
this.creator.setSize(xCreator.initEditorSize());
current_x = x - (xCreator.getWidth() / 2);
current_y = y - (xCreator.getHeight() / 2);
}
/**
* 隐藏当前组件的图标
*/
public void reset() {
current_x = -this.creator.getWidth();
current_y = -this.creator.getHeight();
}
public String getXCreatorName(FormDesigner designer,XCreator x){
String def= x.createDefaultName();
if (x.acceptType(XWParameterLayout.class)) {
return def;
}
int i = 0;
while (designer.getTarget().isNameExist(def + i)) {
i++;
}
return def+i;
}
public int getCurrentX() {
return current_x;
}
public int getCurrentY() {
return current_y;
}
/**
* 移动组件图标到鼠标事件发生的位置
* @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);
}
public XCreator getXCreator() {
return this.creator;
}
/**
* 当前组件是否已经添加到某个容器中
* @return 是返回true
*/
public boolean isCreatorAdded() {
return added;
}
/**
* 加入容器
* @param designer 设计器
* @param container 容器
* @param x 坐标
* @param y 坐标
* @return 成功返回true
*/
public boolean add2Container(FormDesigner designer, XLayoutContainer container, int x, int y) {
//考虑不同布局嵌套的情况,获取顶层容器
XLayoutContainer xLayoutContainer = container.getTopLayout();
if(xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class)){
container = xLayoutContainer;
}
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());
}
return added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue() - rect.x,
y + designer.getArea().getVerticalValue() - rect.y);
}
package com.fr.design.designer.beans.models;
import java.awt.Rectangle;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.adapters.component.CompositeComponentAdapter;
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.utils.ComponentUtils;
import com.fr.general.ComparatorUtils;
/**
* 添加状态下的model
*/
public class AddingModel {
// 当前要添加的组件
private XCreator creator;
// 记录当前鼠标的位置信息
private int currentX;
private int currentY;
private boolean added;
public AddingModel(FormDesigner designer, XCreator xCreator) {
String creatorName = getXCreatorName(designer, xCreator);
this.creator = xCreator;
instantiateCreator(designer, creatorName);
// 初始的时候隐藏该组件的图标
currentY = -this.creator.getWidth();
currentX = -this.creator.getHeight();
}
/**
* 待说明
*
* @param designer 设计器
* @param creatorName 组件名
*/
public void instantiateCreator(FormDesigner designer, String creatorName) {
creator.toData().setWidgetName(creatorName);
ComponentAdapter adapter = new CompositeComponentAdapter(designer, creator);
adapter.initialize();
creator.addNotify();
creator.putClientProperty(AdapterBus.CLIENT_PROPERTIES, adapter);
}
public AddingModel(XCreator xCreator, int x, int y) {
this.creator = xCreator;
this.creator.backupCurrentSize();
this.creator.backupParent();
this.creator.setSize(xCreator.initEditorSize());
currentX = x - (xCreator.getWidth() / 2);
currentY = y - (xCreator.getHeight() / 2);
}
/**
* 隐藏当前组件的图标
*/
public void reset() {
currentX = -this.creator.getWidth();
currentY = -this.creator.getHeight();
}
public String getXCreatorName(FormDesigner designer, XCreator x) {
String def = x.createDefaultName();
if (x.acceptType(XWParameterLayout.class)) {
return def;
}
int i = 0;
while (designer.getTarget().isNameExist(def + i)) {
i++;
}
return def + i;
}
public int getCurrentX() {
return currentX;
}
public int getCurrentY() {
return currentY;
}
/**
* 移动组件图标到鼠标事件发生的位置
*
* @param x 坐标
* @param y 坐标
*/
public void moveTo(int x, int y) {
currentX = x - (this.creator.getWidth() / 2);
currentY = y - (this.creator.getHeight() / 2);
}
public XCreator getXCreator() {
return this.creator;
}
/**
* 当前组件是否已经添加到某个容器中
*
* @return 是返回true
*/
public boolean isCreatorAdded() {
return added;
}
/**
* 加入容器
*
* @param designer 设计器
* @param container 容器
* @param x 坐标
* @param y 坐标
* @return 成功返回true
*/
public boolean add2Container(FormDesigner designer, XLayoutContainer container, int x, int y) {
//考虑不同布局嵌套的情况,获取顶层容器
XLayoutContainer xLayoutContainer = container.getTopLayout();
if (xLayoutContainer != null && xLayoutContainer.acceptType(XWAbsoluteLayout.class)) {
container = xLayoutContainer;
}
Rectangle rect = ComponentUtils.getRelativeBounds(container);
if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) {
added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue(),
y + designer.getArea().getVerticalValue());
return added;
}
added = container.getLayoutAdapter().addBean(creator,
x + designer.getArea().getHorizontalValue() - rect.x,
y + designer.getArea().getVerticalValue() - rect.y);
return added;
}
}

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

@ -111,7 +111,7 @@ public class SelectionModel {
*/
public boolean pasteFromClipBoard() {
if (!clipboard.isEmpty()) {
if (!hasSelectionComponent()) {
if (!hasSelectedPasteSource()) {
//未选
unselectedPaste();
} else {
@ -275,7 +275,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 +286,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 +301,15 @@ public class SelectionModel {
}
}
/**
* 是否有组件被选择如果所选组件是最底层容器也视为无选择
*
* @return 是则返回true
*/
public boolean hasSelectionComponent() {
return !selection.isEmpty() && selection.getSelectedCreator().getParent() != null;
}
/**
* 移动组件至指定位置
*

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

@ -1,446 +1,476 @@
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.utils.ComponentUtils;
/**
* 普通模式下的状态model
*/
public class StateModel {
// 对应的selection model
private SelectionModel selectionModel;
// 当前鼠标进入拖拽区域的位置类型
private Direction driection;
// 当前拖拽的起始位置
private int current_x;
private int current_y;
private Point startPoint = new Point();
private Point currentPoint = new Point();
private Absorptionline lineInX;
private Absorptionline lineInY;
//等距线
private Absorptionline lineEquidistant;
// 当前是否处于拖拽选择状态
private boolean selecting;
private boolean dragging;
private boolean addable;
private FormDesigner designer;
public StateModel(FormDesigner designer) {
this.designer = designer;
selectionModel = designer.getSelectionModel();
}
/**
* 返回direction
* @return direction方向
*/
public Direction getDirection() {
return driection;
}
/**
* 是否有组件正被选中
*
* @return true 如果至少一个组件被选中
*/
public boolean isSelecting() {
return selecting;
}
/**
*是否能拖拽
* @return 非outer且选中为空
*/
public boolean dragable() {
return ((driection != Location.outer) && !selecting);
}
/**
* 拖拽中是否可以转换为添加模式
* 如果拖拽组件只有一个鼠标当前所在位置的最底层表单容器与这个组件的容器不同
* 如果拖拽组件为多个鼠标当前所在位置的最底层表单容器除了要求要跟这些组件的容器不同外还必须是绝对定位布局
*/
private void checkAddable(MouseEvent e) {
addable = false;
designer.setPainter(null);
if (driection != Location.inner) {
return;
}
XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
XCreator creator = selectionModel.getSelection().getSelectedCreator();
Component creatorContainer = XCreatorUtils.getParentXLayoutContainer(creator);
if (creatorContainer != null && creatorContainer != container
&& (selectionModel.getSelection().size() == 1 || container instanceof XWAbsoluteLayout)) {
HoverPainter painter = AdapterBus.getContainerPainter(designer, container);
designer.setPainter(painter);
if (painter != null) {
Rectangle rect = ComponentUtils.getRelativeBounds(container);
rect.x -= designer.getArea().getHorizontalValue();
rect.y -= designer.getArea().getVerticalValue();
painter.setRenderingBounds(rect);
painter.setHotspot(new Point(e.getX(), e.getY()));
painter.setCreator(creator);
}
addable = true;
}
}
private boolean addBean(XLayoutContainer container, int x, int y) {
LayoutAdapter adapter = container.getLayoutAdapter();
Rectangle r = 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);
}
for (XCreator creator : selectionModel.getSelection().getSelectedCreators()) {
adapter.addBean(creator, x + designer.getArea().getHorizontalValue() - r.x, y + designer.getArea().getVerticalValue()- r.y);
}
return true;
}
private void adding(int x, int y) {
// 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(x, y, selectionModel.getSelection().getSelectedCreators());
// 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
boolean success = false;
if (container != null) {
// 如果是容器,则调用其acceptComponent接受组件
success = addBean(container, x, y);
}
if (success) {
FormSelectionUtils.rebuildSelection(designer);
designer.getEditListenerTable().fireCreatorModified(
selectionModel.getSelection().getSelectedCreator(), DesignerEvent.CREATOR_ADDED);
} else {
Toolkit.getDefaultToolkit().beep();
}
// 取消提示
designer.setPainter(null);
}
/**
*是否拖拽
* @return dragging状态
*/
public boolean isDragging() {
return dragging;
}
/**
*是否可以开始画线
* @return startPoint不为空返回true
*/
public boolean prepareForDrawLining() {
return startPoint != null;
}
/**
*设置开始位置
* @param p point位置
*/
public void setStartPoint(Point p) {
this.startPoint = p;
}
/**
*返回开始位置
* @return 点位置
*/
public Point getStartPoint() {
return startPoint;
}
/**
*返回当前点位置
* @return 点位置
*/
public Point getEndPoint() {
return currentPoint;
}
/**
*当前选中组件
* @param e 鼠标事件
*/
public void startSelecting(MouseEvent e) {
selecting = true;
selectionModel.setHotspotBounds(new Rectangle());
current_x = getMouseXY(e).x;
current_y = 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;
}
/**
*起始点开始DrawLine
* @param p 点位置
*/
public void startDrawLine(Point p) {
this.startPoint = p;
if(p != null) {
try {
designer.setCursor(XConnector.connectorCursor);
} catch (Exception e) {
}
} else {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
/**
*鼠标释放时所在的区域及圈中的组件
* @param e 鼠标事件
*/
public void selectCreators(MouseEvent e) {
int x = getMouseXY(e).x;
int y = getMouseXY(e).y;
Rectangle bounds = createCurrentBounds(x, y);
if ((x != current_x) || (y != current_y)) {
selectionModel.setSelectedCreators(getHotspotCreators(bounds, designer.getRootComponent()));
}
selectionModel.setHotspotBounds(null);
}
/**
*画所在区域线
* @param e 鼠标事件
*/
public void drawLine(MouseEvent e) {
designer.getDrawLineHelper().setDrawLine(true);
Point p = designer.getDrawLineHelper().getNearWidgetPoint(e);
if (p != null) {
currentPoint = p;
} else {
currentPoint.x = e.getX() + designer.getArea().getHorizontalValue();
currentPoint.y = e.getY() + designer.getArea().getVerticalValue();
}
}
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;
return bounds;
}
private ArrayList<XCreator> getHotspotCreators(Rectangle selection, XCreator root) {
ArrayList<XCreator> creators = new ArrayList<XCreator>();
if (!root.isVisible() && !designer.isRoot(root)) {
return creators;
}
if (root instanceof XLayoutContainer) {
XLayoutContainer container = (XLayoutContainer) root;
int count = container.getXCreatorCount();
Rectangle clipped = new Rectangle(selection);
for (int i = count - 1; i >= 0; i--) {
XCreator child = container.getXCreator(i);
if (selection.contains(child.getBounds())) {
creators.add(child);
} else {
clipped.x = selection.x - child.getX();
clipped.y = selection.y - child.getY();
creators.addAll(getHotspotCreators(clipped, child));
}
}
}
return creators;
}
/**
*重置model
*/
public void resetModel() {
dragging = false;
selecting = false;
}
/**
*重置
*/
public void reset() {
driection = Location.outer;
dragging = false;
selecting = false;
}
/**
*取消拖拽
*/
public void draggingCancel() {
designer.repaint();
reset();
}
/**
*设置可拉伸方向
* @param dir 拉伸方向
*/
public void setDirection(Direction dir) {
if(driection != dir) {
this.driection = dir;
driection.updateCursor(designer);
}
}
/**
*x吸附线赋值
* @param line 线
*/
public void setXAbsorptionline(Absorptionline line) {
this.lineInX = line;
}
/**
*y吸附线赋值
* @param line 线
*/
public void setYAbsorptionline(Absorptionline line) {
this.lineInY = line;
}
/**
* 等距线赋值
* @param line 线
*/
public void setEquidistantLine(Absorptionline line){
this.lineEquidistant = line;
}
/**
*画吸附线
* @param g Graphics类
*/
public void paintAbsorptionline(Graphics g) {
if(lineInX != null) {
lineInX.paint(g,designer.getArea());
}
if(lineInY != null) {
lineInY.paint(g,designer.getArea());
}
if(lineEquidistant != null){
lineEquidistant.paint(g,designer.getArea());
}
}
/**
*拖拽
* @param e 鼠标事件
*/
public void dragging(MouseEvent e) {
checkAddable(e);
setDependLinePainter(e);
driection.drag(getMouseXY(e).x-current_x, getMouseXY(e).y-current_y, designer);
this.dragging = true;
}
// 拖拽时画依附线用到的painter
private void setDependLinePainter(MouseEvent e){
XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
XCreator creator = selectionModel.getSelection().getSelectedCreator();
HoverPainter painter = AdapterBus.getContainerPainter(designer, container);
designer.setPainter(painter);
if (painter != null) {
painter.setHotspot(new Point(e.getX(), e.getY()));
painter.setCreator(creator);
}
}
/**
*释放捕获
* @param e 鼠标事件
*/
public void releaseDragging(MouseEvent e) {
this.dragging = false;
if (addable) {
adding(e.getX(), e.getY());
} else if (!selectionModel.getSelection().isEmpty()) {
selectionModel.releaseDragging();
}
designer.repaint();
}
/**
*改变选择区域
*
* @param e 鼠标事件
*/
public void changeSelection(MouseEvent e) {
Rectangle bounds = createCurrentBounds(getMouseXY(e).x, getMouseXY(e).y);
selectionModel.setHotspotBounds(bounds);
}
/**
*返回鼠标所在的xy 考虑滚动条的值
*
* @param e 鼠标事件
* @return xy值
*/
public Point getMouseXY(MouseEvent e) {
Point p1 = new Point(e.getX() + designer.getArea().getHorizontalValue(), e.getY()
+ designer.getArea().getVerticalValue());
return p1;
}
package com.fr.design.designer.beans.models;
import com.fr.design.beans.location.Absorptionline;
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.*;
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
*/
public class StateModel {
// 对应的selection model
private SelectionModel selectionModel;
// 当前鼠标进入拖拽区域的位置类型
private Direction driection;
// 当前拖拽的起始位置
private int currentX;
private int currentY;
//拖拽组件原始位置大小备份
private Rectangle selectedPositionBackup;
private Point startPoint = new Point();
private Point currentPoint = new Point();
private Absorptionline lineInX;
private Absorptionline lineInY;
//等距线
private Absorptionline lineEquidistant;
// 当前是否处于拖拽选择状态
private boolean selecting;
private boolean dragging;
private boolean addable;
private FormDesigner designer;
public StateModel(FormDesigner designer) {
this.designer = designer;
selectionModel = designer.getSelectionModel();
}
/**
* 返回direction
*
* @return direction方向
*/
public Direction getDirection() {
return driection;
}
/**
* 是否有组件正被选中
*
* @return true 如果至少一个组件被选中
*/
public boolean isSelecting() {
return selecting;
}
/**
* 是否能拖拽
*
* @return 非outer且选中为空
*/
public boolean dragable() {
return ((driection != Location.outer) && !selecting);
}
/**
* 拖拽中是否可以转换为添加模式
* 如果拖拽组件只有一个鼠标当前所在位置的最底层表单容器与这个组件的容器不同
* 如果拖拽组件为多个鼠标当前所在位置的最底层表单容器除了要求要跟这些组件的容器不同外还必须是绝对定位布局
*/
private void checkAddable(MouseEvent e) {
addable = false;
designer.setPainter(null);
if (driection != Location.inner) {
return;
}
XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
XCreator creator = selectionModel.getSelection().getSelectedCreator();
Component creatorContainer = XCreatorUtils.getParentXLayoutContainer(creator);
if (creatorContainer != null && creatorContainer != container
&& (selectionModel.getSelection().size() == 1 || container instanceof XWAbsoluteLayout)) {
HoverPainter painter = AdapterBus.getContainerPainter(designer, container);
designer.setPainter(painter);
if (painter != null) {
Rectangle rect = ComponentUtils.getRelativeBounds(container);
rect.x -= designer.getArea().getHorizontalValue();
rect.y -= designer.getArea().getVerticalValue();
painter.setRenderingBounds(rect);
painter.setHotspot(new Point(e.getX(), e.getY()));
painter.setCreator(creator);
}
addable = true;
}
}
/**
* @param container 容器
* @param mouseX 鼠标释放位置X
* @param mouseY 鼠标释放位置Y
* @return 是否成功
*/
private boolean addBean(XLayoutContainer container, int mouseX, int mouseY) {
LayoutAdapter adapter = container.getLayoutAdapter();
Rectangle rectangleContainer = ComponentUtils.getRelativeBounds(container);
if (selectionModel.getSelection().size() == 1) {
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,
mouseX + designer.getArea().getHorizontalValue() - rectangleContainer.x,
mouseY + designer.getArea().getVerticalValue() - rectangleContainer.y);
}
return true;
}
/**
* @param mouseReleasedX 鼠标释放位置X
* @param mouseReleasedY 鼠标释放位置Y
*/
private void adding(int mouseReleasedX, int mouseReleasedY) {
// 当前鼠标所在的组件
XCreator hoveredComponent = designer.getComponentAt(mouseReleasedX, mouseReleasedY, selectionModel.getSelection().getSelectedCreators());
// 获取该组件所在的焦点容器
XLayoutContainer container = XCreatorUtils.getHotspotContainer(hoveredComponent);
boolean success = false;
if (container != null) {
// 如果是容器,则调用其acceptComponent接受组件
success = addBean(container, mouseReleasedX, mouseReleasedY);
}
if (success) {
FormSelectionUtils.rebuildSelection(designer);
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() {
return dragging;
}
/**
* 是否可以开始画线
*
* @return startPoint不为空返回true
*/
public boolean prepareForDrawLining() {
return startPoint != null;
}
/**
* 设置开始位置
*
* @param p point位置
*/
public void setStartPoint(Point p) {
this.startPoint = p;
}
/**
* 返回开始位置
*
* @return 点位置
*/
public Point getStartPoint() {
return startPoint;
}
/**
* 返回当前点位置
*
* @return 点位置
*/
public Point getEndPoint() {
return currentPoint;
}
/**
* 当前选中组件
*
* @param e 鼠标事件
*/
public void startSelecting(MouseEvent e) {
selecting = true;
selectionModel.setHotspotBounds(new Rectangle());
currentX = getMouseXY(e).x;
currentY = getMouseXY(e).y;
}
/**
* 当前鼠标的xy
*
* @param e 鼠标事件
*/
public void startResizing(MouseEvent e) {
if (!selectionModel.getSelection().isEmpty()) {
driection.backupBounds(designer);
}
currentX = getMouseXY(e).x;
currentY = getMouseXY(e).y;
}
/**
* 起始点开始DrawLine
*
* @param p 点位置
*/
public void startDrawLine(Point p) {
this.startPoint = p;
if (p != null) {
try {
designer.setCursor(XConnector.connectorCursor);
} catch (Exception e) {
}
} else {
designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
}
/**
* 鼠标释放时所在的区域及圈中的组件
*
* @param e 鼠标事件
*/
public void selectCreators(MouseEvent e) {
int x = getMouseXY(e).x;
int y = getMouseXY(e).y;
Rectangle bounds = createCurrentBounds(x, y);
if ((x != currentX) || (y != currentY)) {
selectionModel.setSelectedCreators(getHotspotCreators(bounds, designer.getRootComponent()));
}
selectionModel.setHotspotBounds(null);
}
/**
* 画所在区域线
*
* @param e 鼠标事件
*/
public void drawLine(MouseEvent e) {
designer.getDrawLineHelper().setDrawLine(true);
Point p = designer.getDrawLineHelper().getNearWidgetPoint(e);
if (p != null) {
currentPoint = p;
} else {
currentPoint.x = e.getX() + designer.getArea().getHorizontalValue();
currentPoint.y = e.getY() + designer.getArea().getVerticalValue();
}
}
private Rectangle createCurrentBounds(int x, int y) {
Rectangle bounds = new Rectangle();
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<>();
if (!root.isVisible() && !designer.isRoot(root)) {
return creators;
}
if (root instanceof XLayoutContainer) {
XLayoutContainer container = (XLayoutContainer) root;
int count = container.getXCreatorCount();
Rectangle clipped = new Rectangle(selection);
for (int i = count - 1; i >= 0; i--) {
XCreator child = container.getXCreator(i);
if (selection.contains(child.getBounds())) {
creators.add(child);
} else {
clipped.x = selection.x - child.getX();
clipped.y = selection.y - child.getY();
creators.addAll(getHotspotCreators(clipped, child));
}
}
}
return creators;
}
/**
* 重置model
*/
public void resetModel() {
dragging = false;
selecting = false;
}
/**
* 重置
*/
public void reset() {
driection = Location.outer;
dragging = false;
selecting = false;
}
/**
* 取消拖拽
*/
public void draggingCancel() {
designer.repaint();
reset();
}
/**
* 设置可拉伸方向
*
* @param dir 拉伸方向
*/
public void setDirection(Direction dir) {
if (driection != dir) {
this.driection = dir;
driection.updateCursor(designer);
}
}
/**
* x吸附线赋值
*
* @param line 线
*/
public void setXAbsorptionline(Absorptionline line) {
this.lineInX = line;
}
/**
* y吸附线赋值
*
* @param line 线
*/
public void setYAbsorptionline(Absorptionline line) {
this.lineInY = line;
}
/**
* 等距线赋值
*
* @param line 线
*/
public void setEquidistantLine(Absorptionline line) {
this.lineEquidistant = line;
}
/**
* 画吸附线
*
* @param g Graphics类
*/
public void paintAbsorptionline(Graphics g) {
if (lineInX != null) {
lineInX.paint(g, designer.getArea());
}
if (lineInY != null) {
lineInY.paint(g, designer.getArea());
}
if (lineEquidistant != null) {
lineEquidistant.paint(g, designer.getArea());
}
}
/**
* 拖拽
*
* @param e 鼠标事件
*/
public void dragging(MouseEvent e) {
//进入dragging状态时备份组件大小和位置
if (!dragging) {
selectedPositionBackup = selectionModel.getSelection().getRelativeBounds();
}
checkAddable(e);
setDependLinePainter(e);
driection.drag(getMouseXY(e).x - currentX, getMouseXY(e).y - currentY, designer);
this.dragging = true;
}
// 拖拽时画依附线用到的painter
private void setDependLinePainter(MouseEvent e) {
XCreator comp = designer.getComponentAt(e.getX(), e.getY(), selectionModel.getSelection().getSelectedCreators());
XLayoutContainer container = XCreatorUtils.getHotspotContainer(comp);
XCreator creator = selectionModel.getSelection().getSelectedCreator();
HoverPainter painter = AdapterBus.getContainerPainter(designer, container);
designer.setPainter(painter);
if (painter != null) {
painter.setHotspot(new Point(e.getX(), e.getY()));
painter.setCreator(creator);
}
}
/**
* 释放捕获
*
* @param e 鼠标事件
*/
public void releaseDragging(MouseEvent e) {
this.dragging = false;
if (addable) {
adding(e.getX(), e.getY());
} else if (!selectionModel.getSelection().isEmpty()) {
selectionModel.releaseDragging();
}
designer.repaint();
}
/**
* 改变选择区域
*
* @param e 鼠标事件
*/
public void changeSelection(MouseEvent e) {
Rectangle bounds = createCurrentBounds(getMouseXY(e).x, getMouseXY(e).y);
selectionModel.setHotspotBounds(bounds);
}
/**
* 返回鼠标所在的xy 考虑滚动条的值
*
* @param e 鼠标事件
* @return xy值
*/
public Point getMouseXY(MouseEvent e) {
Point p1 = new Point(e.getX() + designer.getArea().getHorizontalValue(), e.getY()
+ designer.getArea().getVerticalValue());
return p1;
}
}

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

@ -30,12 +30,12 @@ import java.util.List;
* @since 6.5.3
*/
public abstract class XLayoutContainer extends XBorderStyleWidgetCreator implements ContainerListener, ParameterBridge {
// 布局内部组件默认最小宽度36,最小高度21
public static int MIN_WIDTH = 36;
public static int MIN_HEIGHT = 21;
protected static final Dimension LARGEPREFERREDSIZE = new Dimension(200, 200);
// 布局内部组件默认最小宽度36,最小高度21
public static int MIN_WIDTH = 36;
public static int MIN_HEIGHT = 21;
protected static final Dimension LARGEPREFERREDSIZE = new Dimension(200, 200);
protected boolean isRefreshing;
protected int default_Length = 5; // 取指定点坐在的组件,默认为5保证取四侧相邻的组件时x、y在组件内非边框上
@ -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;
}
@ -55,12 +56,13 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
}
/**
* 得到属性名
* 得到属性名
*
* @return 属性名
* @throws IntrospectionException
*/
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException {
return new CRPropertyDescriptor[] {
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException {
return new CRPropertyDescriptor[]{
new CRPropertyDescriptor("widgetName", this.data.getClass()).setI18NName(Inter
.getLocText("FR-Designer_Form-Widget_Name")),
new CRPropertyDescriptor("borderStyle", this.data.getClass()).setEditorClass(
@ -68,19 +70,20 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
Inter.getLocText("FR-Engine_Style")).putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced")
.setPropertyChangeListener(new PropertyChangeAdapter() {
@Override
public void propertyChange() {
initStyle();
}
}),
@Override
public void propertyChange() {
initStyle();
}
}),
new CRPropertyDescriptor("margin", this.data.getClass()).setEditorClass(PaddingMarginEditor.class)
.setI18NName(Inter.getLocText("FR-Designer_Layout-Padding"))
.putKeyValue(XCreatorConstants.PROPERTY_CATEGORY, "Advanced"),
};
}
};
}
/**
* 控件名属性
*
* @return
* @throws IntrospectionException
*/
@ -91,6 +94,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 边距属性
*
* @return
* @throws IntrospectionException
*/
@ -101,47 +105,50 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
}
/**
* 返回对应的wlayout
* 返回对应的wlayout
*
* @return wlayout控件
*/
public WLayout toData() {
return (WLayout) data;
}
@Override
protected void initXCreatorProperties() {
super.initXCreatorProperties();
initBorderStyle();
this.initLayoutManager();
this.convert();
}
@Override
protected void initXCreatorProperties() {
super.initXCreatorProperties();
initBorderStyle();
this.initLayoutManager();
this.convert();
}
@Override
protected JComponent initEditor() {
return this;
}
/**
* 当前组件zorder位置替换新的控件
* @param widget 控件
* @param oldcreator 旧组件
* @return 组件
*/
public XCreator replace(Widget widget, XCreator oldcreator) {
int i = this.getComponentZOrder(oldcreator);
if (i != -1) {
this.toData().replace(widget, oldcreator.toData());
this.convert();
XCreator creator = (XCreator) this.getComponent(i);
creator.setSize(oldcreator.getSize());
return creator;
}
return null;
}
/**
* 初始化时默认的组件大小
* @return 默认Dimension
protected JComponent initEditor() {
return this;
}
/**
* 当前组件zorder位置替换新的控件
*
* @param widget 控件
* @param oldcreator 旧组件
* @return 组件
*/
public XCreator replace(Widget widget, XCreator oldcreator) {
int i = this.getComponentZOrder(oldcreator);
if (i != -1) {
this.toData().replace(widget, oldcreator.toData());
this.convert();
XCreator creator = (XCreator) this.getComponent(i);
creator.setSize(oldcreator.getSize());
return creator;
}
return null;
}
/**
* 初始化时默认的组件大小
*
* @return 默认Dimension
*/
public Dimension initEditorSize() {
return LARGEPREFERREDSIZE;
@ -172,7 +179,8 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 设计界面中有组件添加时要通知WLayout容器重新paint
* @param e 待说明
*
* @param e 待说明
*/
@Override
public void componentAdded(ContainerEvent e) {
@ -188,7 +196,8 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 设计界面中有组件添加时要通知WLayout容器重新paint
* @param e 待说明
*
* @param e 待说明
*/
@Override
public void componentRemoved(ContainerEvent e) {
@ -203,6 +212,7 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 根据widget的属性值来获取
*
* @param wgt
* @return
*/
@ -226,30 +236,32 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
public int getXCreatorCount() {
return getComponentCount();
}
public XCreator getXCreator(int i) {
return (XCreator) getComponent(i);
}
/**
* 该组件是否可以拖入参数面板
*
* @return 是则返回true
*/
public boolean canEnterIntoParaPane(){
public boolean canEnterIntoParaPane() {
return false;
}
/**
* 是否作为控件树的叶子节点
* @return 是则返回true
*/
public boolean isComponentTreeLeaf() {
return false;
}
* 是否作为控件树的叶子节点
*
* @return 是则返回true
*/
public boolean isComponentTreeLeaf() {
return false;
}
public List<String> getAllXCreatorNameList(XCreator xCreator, List<String> namelist){
for (int i = 0; i < ((XLayoutContainer)xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer)xCreator).getXCreator(i);
public List<String> getAllXCreatorNameList(XCreator xCreator, List<String> namelist) {
for (int i = 0; i < ((XLayoutContainer) xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer) xCreator).getXCreator(i);
creatorSon.getAllXCreatorNameList(creatorSon, namelist);
}
return namelist;
@ -257,19 +269,20 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否有查询按钮
* @param xCreator 控件或容器
* @return 有无查询按钮
*
* @param xCreator 控件或容器
* @return 有无查询按钮
*/
public boolean SearchQueryCreators(XCreator xCreator) {
for (int i = 0; i < ((XLayoutContainer)xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer)xCreator).getXCreator(i);
if(creatorSon.SearchQueryCreators(creatorSon)){
for (int i = 0; i < ((XLayoutContainer) xCreator).getXCreatorCount(); i++) {
XCreator creatorSon = ((XLayoutContainer) xCreator).getXCreator(i);
if (creatorSon.SearchQueryCreators(creatorSon)) {
return true;
}
}
return false;
}
public FRLayoutManager getFRLayout() {
LayoutManager layout = getLayout();
if (layout instanceof FRLayoutManager) {
@ -279,111 +292,120 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
return null;
}
public abstract LayoutAdapter getLayoutAdapter();
public int getIndexOfChild(Object child) {
int count = getComponentCount();
for (int i = 0; i < count; i++) {
Component comp = getComponent(i);
if (comp == child) {
return i;
}
}
return -1;
}
/**
* 主要为自适应用
* 返回指定point的上方组件
* @param x x位置
* @param y y位置
* @return 指定位置的组件
*/
public Component getTopComp(int x, int y) {
return this.getComponentAt(x, y-default_Length);
}
/**
* 主要为自适应用
* 返回指定point的左方组件
* @param x x位置
* @param y y位置
* @return 指定位置的组件
*/
public Component getLeftComp(int x, int y) {
return this.getComponentAt(x-default_Length, y);
}
/**
* 返回指定point的右方组件
* @param x x位置
* @param y y位置
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightComp(int x, int y, int w) {
return this.getComponentAt(x+w+default_Length, y);
}
/**
* 返回指定point的下方组件
* @param x x位置
* @param y y位置
* @param h 高度
* @return 指定位置的组件
*/
public Component getBottomComp(int x, int y, int h) {
return this.getComponentAt(x, y+h+default_Length);
}
/**
* 返回指定point的上方且是右侧的组件
* @param x x位置
* @param y y位置
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightTopComp(int x, int y, int w) {
return this.getComponentAt(x+w-default_Length, y-default_Length);
}
/**
* 返回指定point的左方且是下侧的组件
* @param x x位置
* @param y y位置
* @param h 高度
* @return 指定位置的组件
*/
public Component getBottomLeftComp(int x, int y, int h) {
return this.getComponentAt(x-default_Length, y+h-default_Length);
}
/**
* 返回指定point的右方且是下侧的组件
* @param x x位置
* @param y y位置
* @param h 高度
* @param w 宽度
* @return 指定位置的组件
*/
public Component getBottomRightComp(int x, int y, int h, int w) {
return this.getComponentAt(x+w+default_Length, y+h-default_Length);
}
/**
* 返回指定point的下方且是右侧的组件
* @param x x位置
* @param y y位置
* @param h 高度
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightBottomComp(int x, int y, int h, int w) {
return this.getComponentAt(x+w-default_Length, y+h+default_Length);
}
public abstract LayoutAdapter getLayoutAdapter();
public int getIndexOfChild(Object child) {
int count = getComponentCount();
for (int i = 0; i < count; i++) {
Component comp = getComponent(i);
if (comp == child) {
return i;
}
}
return -1;
}
/**
* 主要为自适应用
* 返回指定point的上方组件
*
* @param x x位置
* @param y y位置
* @return 指定位置的组件
*/
public Component getTopComp(int x, int y) {
return this.getComponentAt(x, y - default_Length);
}
/**
* 主要为自适应用
* 返回指定point的左方组件
*
* @param x x位置
* @param y y位置
* @return 指定位置的组件
*/
public Component getLeftComp(int x, int y) {
return this.getComponentAt(x - default_Length, y);
}
/**
* 返回指定point的右方组件
*
* @param x x位置
* @param y y位置
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightComp(int x, int y, int w) {
return this.getComponentAt(x + w + default_Length, y);
}
/**
* 返回指定point的下方组件
*
* @param x x位置
* @param y y位置
* @param h 高度
* @return 指定位置的组件
*/
public Component getBottomComp(int x, int y, int h) {
return this.getComponentAt(x, y + h + default_Length);
}
/**
* 返回指定point的上方且是右侧的组件
*
* @param x x位置
* @param y y位置
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightTopComp(int x, int y, int w) {
return this.getComponentAt(x + w - default_Length, y - default_Length);
}
/**
* 返回指定point的左方且是下侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
* @return 指定位置的组件
*/
public Component getBottomLeftComp(int x, int y, int h) {
return this.getComponentAt(x - default_Length, y + h - default_Length);
}
/**
* 返回指定point的右方且是下侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
* @param w 宽度
* @return 指定位置的组件
*/
public Component getBottomRightComp(int x, int y, int h, int w) {
return this.getComponentAt(x + w + default_Length, y + h - default_Length);
}
/**
* 返回指定point的下方且是右侧的组件
*
* @param x x位置
* @param y y位置
* @param h 高度
* @param w 宽度
* @return 指定位置的组件
*/
public Component getRightBottomComp(int x, int y, int h, int w) {
return this.getComponentAt(x + w - default_Length, y + h + default_Length);
}
/**
* 是否延迟展示报表内容也就是说是否要等点击了查询之后才执行报表
*
* @return 如果是true则表示点击之后才开始计算false则表示会根据参数默认值直接计算报表并展现
*/
public boolean isDelayDisplayContent() {
@ -392,18 +414,20 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 是否显示参数界面
*
* @return 显示参数界面则返回true否则返回false
*/
public boolean isDisplay() {
return false;
}
public Background getDataBackground(){
public Background getDataBackground() {
return toData().getBackground();
}
/**
* 获取参数界面的宽度
*
* @return 宽度
*/
public int getDesignWidth() {
@ -412,83 +436,82 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
/**
* 获取参数面板的对齐方式
*
* @return 左中右三种对齐方式
*/
public int getPosition() {
return 0;
}
/**
* 切换到非添加状态
*
*
* @param designer 表单设计器
*/
public void stopAddingState(FormDesigner designer){
return;
}
/**
* 寻找最近的为自适应布局的父容器
*
* @return 布局容器
*
*
* @date 2014-12-30-下午3:15:28
*
*/
public XLayoutContainer findNearestFit(){
//一层一层网上找, 找到最近的fit那一层就return
XLayoutContainer parent = this.getBackupParent();
return parent == null ? null : parent.findNearestFit();
}
public void stopAddingState(FormDesigner designer) {
}
/**
* 寻找最近的为自适应布局的父容器
*
* @return 布局容器
* @date 2014-12-30-下午3:15:28
*/
public XLayoutContainer findNearestFit() {
//一层一层网上找, 找到最近的fit那一层就return
XLayoutContainer parent = this.getBackupParent();
return parent == null ? null : parent.findNearestFit();
}
/**
* 获取容器所有内部组件横坐标值
*
*
* @return 横坐标数组
*/
public int[] getHors(){
return ArrayUtils.EMPTY_INT_ARRAY;
public int[] getHors() {
return ArrayUtils.EMPTY_INT_ARRAY;
}
/**
* 获取容器所有内部组件纵坐标值
*
*
* @return 纵坐标数组
*/
public int[] getVeris(){
return ArrayUtils.EMPTY_INT_ARRAY;
public int[] getVeris() {
return ArrayUtils.EMPTY_INT_ARRAY;
}
public void setDelayDisplayContent(boolean delayPlaying){
public void setDelayDisplayContent(boolean delayPlaying) {
}
public void setPosition(int align){
public void setPosition(int align) {
}
public void setDisplay(boolean showWindow){
public void setDisplay(boolean showWindow) {
}
public void setBackground(Background background){
public void setBackground(Background background) {
}
/**
* 布局是否可编辑不可则显示编辑蒙层
*
* @return 可否编辑
*/
public boolean isEditable(){
public boolean isEditable() {
return this.editable;
}
/**
* 设置布局是否可编辑不可则显示编辑蒙层
*
* @param isEditable 可否编辑
*/
public void setEditable(boolean isEditable){
public void setEditable(boolean isEditable) {
this.editable = isEditable;
}
}

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

@ -1,5 +1,5 @@
/**
*
*
*/
package com.fr.design.designer.creator.cardlayout;
@ -25,114 +25,109 @@ 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 {
private static final int MIN_SIZE = 1;
private String tagName = "Tab";
private boolean switchingTab = false;
//增加一个tabNameIndex防止tabFitLayout重名
private int tabFitIndex = 0;
private CardSwitchButton currentCard;
public CardSwitchButton getCurrentCard() {
return currentCard;
}
public void setCurrentCard(CardSwitchButton currentCard) {
this.currentCard = currentCard;
}
public int getTabFitIndex() {
return tabFitIndex;
}
public void setTabFitIndex(int tabFitIndex) {
this.tabFitIndex = tabFitIndex;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public boolean isSwitchingTab() {
return switchingTab;
}
public void setSwitchingTab(boolean switchingTab) {
this.switchingTab = switchingTab;
}
private XWCardLayout cardLayout;
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize){
super(widget, initSize);
}
/**
* 构造函数
*/
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize, XWCardLayout cardLayout) {
super(widget, initSize);
this.cardLayout = cardLayout;
}
/**
* 添加组件的监听事件
*
* @param e 事件
*
*
* @date 2014-11-25-下午6:20:10
*
*/
public void componentAdded(ContainerEvent e) {
super.componentAdded(e);
if (isSwitchingTab()){
return;
}
if(this.cardLayout == null){
initCardLayout();
}
int index = this.cardLayout.toData().getWidgetCount();
//新加一个card
String widgetName = tagName+getTabNameIndex();
WTabFitLayout fitLayout = new WTabFitLayout(widgetName,tabFitIndex,currentCard);
fitLayout.setTabNameIndex(getTabNameIndex());
XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension());
tabFitLayout.setBackupParent(cardLayout);
cardLayout.add(tabFitLayout, widgetName);
this.cardLayout.toData().setShowIndex(index);
cardLayout.showCard();
}
private void initCardLayout(){
XWCardTitleLayout titleLayout = (XWCardTitleLayout)this.getBackupParent();
XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent();
this.cardLayout = borderLayout.getCardPart();
}
private static final int MIN_SIZE = 1;
private String tagName = "Tab";
private boolean switchingTab = false;
//增加一个tabNameIndex防止tabFitLayout重名
private int tabFitIndex = 0;
private CardSwitchButton currentCard;
public CardSwitchButton getCurrentCard() {
return currentCard;
}
public void setCurrentCard(CardSwitchButton currentCard) {
this.currentCard = currentCard;
}
public int getTabFitIndex() {
return tabFitIndex;
}
public void setTabFitIndex(int tabFitIndex) {
this.tabFitIndex = tabFitIndex;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public boolean isSwitchingTab() {
return switchingTab;
}
public void setSwitchingTab(boolean switchingTab) {
this.switchingTab = switchingTab;
}
private XWCardLayout cardLayout;
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize) {
super(widget, initSize);
}
/**
* 构造函数
*/
public XWCardTagLayout(WCardTagLayout widget, Dimension initSize, XWCardLayout cardLayout) {
super(widget, initSize);
this.cardLayout = cardLayout;
}
/**
* 添加组件的监听事件
*
* @param e 事件
* @date 2014-11-25-下午6:20:10
*/
public void componentAdded(ContainerEvent e) {
super.componentAdded(e);
if (isSwitchingTab()) {
return;
}
if (this.cardLayout == null) {
initCardLayout();
}
int index = this.cardLayout.toData().getWidgetCount();
//新加一个card
String widgetName = tagName + getTabNameIndex();
WTabFitLayout fitLayout = new WTabFitLayout(widgetName, tabFitIndex, currentCard);
fitLayout.setTabNameIndex(getTabNameIndex());
XWTabFitLayout tabFitLayout = new XWTabFitLayout(fitLayout, new Dimension());
tabFitLayout.setBackupParent(cardLayout);
cardLayout.add(tabFitLayout, widgetName);
this.cardLayout.toData().setShowIndex(index);
cardLayout.showCard();
}
private void initCardLayout() {
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent();
XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
this.cardLayout = borderLayout.getCardPart();
}
/**
* 将WLayout转换为XLayoutContainer
*/
public void convert() {
isRefreshing = true;
WCardTagLayout layout = (WCardTagLayout)this.toData();
WCardTagLayout layout = (WCardTagLayout) this.toData();
this.removeAll();
for (int i = 0; i < layout.getWidgetCount(); i++) {
Widget wgt = layout.getWidget(i);
@ -144,82 +139,81 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
}
isRefreshing = false;
}
/**
* 切换到非添加状态
*
*
* @return designer 表单设计器
*/
public void stopAddingState(FormDesigner designer){
designer.stopAddingState();
return;
public void stopAddingState(FormDesigner designer) {
designer.stopAddingState();
}
//新增时去tabFitLayout名字中最大的Index+1,防止重名
private int getTabNameIndex(){
int tabNameIndex = 0;
WCardLayout layout = this.cardLayout.toData();
int size = layout.getWidgetCount();
if(size < MIN_SIZE){
return tabNameIndex;
}
for(int i=0;i<size;i++){
WTabFitLayout fitLayout = (WTabFitLayout) layout.getWidget(i);
int tempIndex = fitLayout.getTabNameIndex();
tabNameIndex = Math.max(tempIndex, tabNameIndex);
}
return ++tabNameIndex;
}
/**
* 调整tab宽度
*
* void
*/
public void adjustComponentWidth(){
}
/**
* 该布局需要隐藏无需对边框进行操作
* @param 边框
*
*/
private int getTabNameIndex() {
int tabNameIndex = 0;
WCardLayout layout = this.cardLayout.toData();
int size = layout.getWidgetCount();
if (size < MIN_SIZE) {
return tabNameIndex;
}
for (int i = 0; i < size; i++) {
WTabFitLayout fitLayout = (WTabFitLayout) layout.getWidget(i);
int tempIndex = fitLayout.getTabNameIndex();
tabNameIndex = Math.max(tempIndex, tabNameIndex);
}
return ++tabNameIndex;
}
/**
* 调整tab宽度
* <p>
* void
*/
public void adjustComponentWidth() {
}
/**
* 该布局需要隐藏无需对边框进行操作
*
* @param
*/
public void setBorder(Border border) {
return;
}
@Override
/**
* 该布局隐藏点击该布局时选中相应的tab布局主体
* @param editingMouseListener 监听
* @param e 鼠标点击事件
*
*/
public void respondClick(EditingMouseListener editingMouseListener,
MouseEvent e) {
FormDesigner designer = editingMouseListener.getDesigner();
SelectionModel selectionModel = editingMouseListener.getSelectionModel();
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent();
if(titleLayout != null){
XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent();
if(mainLayout != null){
XWCardLayout cardLayout = mainLayout.getCardPart();
selectionModel.setSelectedCreator(cardLayout);
}
}
if (editingMouseListener.stopEditing()) {
if (this != designer.getRootComponent()) {
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this);
editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter);
}
}
}
@Override
public XLayoutContainer getTopLayout() {
return this.getBackupParent().getTopLayout();
}
}
@Override
/**
* 该布局隐藏点击该布局时选中相应的tab布局主体
* @param editingMouseListener 监听
* @param e 鼠标点击事件
*
*/
public void respondClick(EditingMouseListener editingMouseListener,
MouseEvent e) {
FormDesigner designer = editingMouseListener.getDesigner();
SelectionModel selectionModel = editingMouseListener.getSelectionModel();
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.getBackupParent();
if (titleLayout != null) {
XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
if (mainLayout != null) {
XWCardLayout cardLayout = mainLayout.getCardPart();
selectionModel.setSelectedCreator(cardLayout);
}
}
if (editingMouseListener.stopEditing()) {
if (this != designer.getRootComponent()) {
ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this);
editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter);
}
}
}
@Override
public XLayoutContainer getTopLayout() {
return this.getBackupParent().getTopLayout();
}
}

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();
}
/**
* 保存参数界面的宽度
*

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

@ -17,11 +17,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 +27,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 +46,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 +60,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("Too large to paste into container");
return;
}
boolean addSuccess = adapter.addBean(copiedCreator, point.x, point.y);
if (addSuccess) {
designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
@ -90,12 +80,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();
@ -118,14 +102,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 +120,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 +132,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 +144,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 +162,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 +173,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 +183,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