diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java index c58e01808..bbc7670a4 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java @@ -148,7 +148,7 @@ public interface LayoutAdapter { void dragStart(XCreator xCreator, SelectionModel selectionModel); /** - * 拖拽结束 + * 拖拽经过 * * @param xCreator * @param selectionModel diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java index cb16cf66d..c47188d4e 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java @@ -1,13 +1,6 @@ package com.fr.design.designer.beans.models; 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.mainframe.FormDesigner; -import com.fr.design.utils.ComponentUtils; -import com.fr.general.ComparatorUtils; - -import java.awt.Rectangle; /** * 添加状态下的model @@ -16,7 +9,6 @@ public class AddingModel { // 当前要添加的组件 private XCreator creator; - private boolean added; private boolean addedIllegal = false; // 有时候是添加完成了,但是添加会造成某些控件size不合法,例如tab public AddingModel(XCreator xCreator) { @@ -27,43 +19,6 @@ public class AddingModel { 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 = XCreatorUtils.getTopEditableContainer(container); - if (xLayoutContainer != null) { - container = xLayoutContainer; - } - Rectangle rect = ComponentUtils.getRelativeBounds(container); - if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) { - added = container.getLayoutAdapter().addBean(creator, - x + designer.getHorizontalScaleValue(), - y + designer.getVerticalScaleValue() ); - return added; - } - added = container.getLayoutAdapter().addBean(creator, - x + designer.getHorizontalScaleValue() - rect.x, - y + designer.getVerticalScaleValue() - rect.y); - return added; - } - public boolean isAddedIllegal() { return addedIllegal; } diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/DraggingModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/DraggingModel.java index 95e003faf..6308ff70b 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/DraggingModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/DraggingModel.java @@ -14,6 +14,7 @@ public class DraggingModel { private MouseEvent currentDragEvent; private int creatorLeftTopX = -999; // 隐藏 private int creatorLeftTopY = -999; // 隐藏 + private boolean dragNewWidget; // 是否正在拖拽一个新的组件下来 public DraggingModel() { @@ -39,6 +40,11 @@ public class DraggingModel { return this; } + public DraggingModel dragNewWidget(boolean dragNewWidget) { + this.dragNewWidget = dragNewWidget; + return this; + } + public FormDesigner getDesigner() { return designer; } @@ -73,6 +79,10 @@ public class DraggingModel { return creatorLeftTopY; } + public boolean isDragNewWidget() { + return dragNewWidget; + } + public void moveTo(int x, int y) { XLayoutContainer container = designer.getDraggingHotspotLayout(); LayoutAdapter adapter = container.getLayoutAdapter(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java index 3d0b24847..83a4c01b0 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java @@ -13,9 +13,11 @@ import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.widget.editors.PaddingMarginEditor; import com.fr.design.mainframe.widget.editors.WLayoutBorderStyleEditor; import com.fr.design.parameter.ParameterBridge; +import com.fr.design.utils.ComponentUtils; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WLayout; import com.fr.general.Background; +import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.core.PropertyChangeAdapter; @@ -24,6 +26,7 @@ import javax.swing.JComponent; import java.awt.Component; import java.awt.Dimension; import java.awt.LayoutManager; +import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; import java.beans.IntrospectionException; @@ -609,4 +612,15 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme public boolean isComponent() { return true; } + + public boolean addWidgetToContainer(XCreator creator, int x, int y) { + //考虑不同布局嵌套的情况,获取顶层容器 + XLayoutContainer xLayoutContainer = XCreatorUtils.getTopEditableContainer(this); + XLayoutContainer container = xLayoutContainer != null ? xLayoutContainer : this; + Rectangle rect = ComponentUtils.getRelativeBounds(container); + if (!ComparatorUtils.equals(container.getOuterLayout(), container.getBackupParent())) { + return container.getLayoutAdapter().addBean(creator, x, y); + } + return container.getLayoutAdapter().addBean(creator, x - rect.x, y - rect.y); + } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/DesignerTransferHandler.java b/designer-form/src/main/java/com/fr/design/mainframe/DesignerTransferHandler.java deleted file mode 100644 index 71360a906..000000000 --- a/designer-form/src/main/java/com/fr/design/mainframe/DesignerTransferHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.fr.design.mainframe; - -import com.fr.design.designer.beans.models.AddingModel; -import com.fr.design.file.HistoryTemplateListPane; - -import javax.swing.JComponent; -import javax.swing.TransferHandler; -import java.awt.datatransfer.Transferable; - -public class DesignerTransferHandler extends TransferHandler { - - private FormDesigner designer; - - public DesignerTransferHandler(FormDesigner designer, AddingModel addingModel) { - super("rootComponent"); - this.designer = designer; - } - - protected void exportDone(JComponent source, Transferable data, int action) { - if (designer.getAddingModel() != null && !designer.getAddingModel().isCreatorAdded()) { - undoWhenAddingFailed(); - } - } - - private void undoWhenAddingFailed() { - JTemplate, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (jt != null) { - jt.undoToCurrent(); - } - } -} \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java index e50bf7049..9ec566eac 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java @@ -196,7 +196,6 @@ public class EditingMouseListener extends MouseInputAdapter { } lastPressEvent = null; lastXCreator = null; - designer.stopDragging(); e.translatePoint(oldX - e.getX(), oldY - e.getY()); if (isAutoFire(transEvent, clickEvent)) { // click只有在mouseReleased和mousePressed前后x/y坐标相等时才会被触发在mouseReleased之后 @@ -463,11 +462,26 @@ public class EditingMouseListener extends MouseInputAdapter { return; } + // 调整大小这边单独提出来,不跟后面拖组件混在一起,实在不好管理 + if (isDraggingSize()) { + stateModel.dragging(e); + return; + } + designer.startDraggingFormWidget(lastXCreator, lastPressEvent, e); e.translatePoint(oldX - e.getX(), oldY - e.getY()); designer.repaint(); } + /** + * 是否正在调整大小 + * + * @return + */ + private boolean isDraggingSize() { + return stateModel.getDirection() != Location.inner && stateModel.getDirection() != Location.outer; + } + /** * 当前拖拽是否是正在shift或者control拖拽一个选择框 * @param e diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java index c8e6bdd67..aa58d713e 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java @@ -5,12 +5,14 @@ import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.HoverPainter; import com.fr.design.designer.beans.Painter; import com.fr.design.designer.beans.events.AddingWidgetListener; +import com.fr.design.designer.beans.models.DraggingModel; 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.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.form.util.XCreatorConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.icon.IconPathConstants; @@ -68,6 +70,8 @@ public class FormCreatorDropTarget extends DropTarget { public void afterAdded(boolean addResult) { if (addResult) { tabDragInner.reset(); + } else { + undoWhenAddingFailed(); } } }); @@ -234,7 +238,6 @@ public class FormCreatorDropTarget extends DropTarget { */ @Override public synchronized void drop(DropTargetDropEvent dtde) { - try { dropXCreator(dtde); } catch (Exception e) { @@ -249,27 +252,46 @@ public class FormCreatorDropTarget extends DropTarget { } dtde.rejectDrop(); } + designer.stopDragging(); + designer.clearDropTarget(); } private void dropXCreator(DropTargetDropEvent dtde) { - cancelPromptWidgetForbidEnter(); - Point loc = dtde.getLocation(); - designer.addWidgetToForm(creator, designer.getRelativeX(loc.x), designer.getRelativeY(loc.y)); - // 放到事件末尾执行 - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - // 拖拽释放后标记未选中 - for (XCreator xCreator : designer.getSelectionModel().getSelection().getSelectedCreators()) { - xCreator.setSelected(true); - } + DraggingModel model = designer.getDraggingModel(); + + if (model != null) { + cancelPromptWidgetForbidEnter(); + Point loc = dtde.getLocation(); + int x = designer.getRelativeX(loc.x); + int y = designer.getRelativeY(loc.y); + if (model.isDragNewWidget()) { + designer.addNewWidget(creator, x, y); + } else { + designer.changeWidgetPlace(creator, x, y); } - }); - //针对在表单中拖入一个控件直接ctrl+s无反应 - designer.requestFocus(); + // 放到事件末尾执行 + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // 拖拽释放后标记未选中 + for (XCreator xCreator : designer.getSelectionModel().getSelection().getSelectedCreators()) { + xCreator.setSelected(true); + } + } + }); + //针对在表单中拖入一个控件直接ctrl+s无反应 + designer.requestFocus(); + } } public TabDragInner getTabDragInner() { return this.tabDragInner; } + + private void undoWhenAddingFailed() { + JTemplate, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + if (jt != null) { + jt.undoToCurrent(); + } + } } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java index 435d11cc3..ef1177ece 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java @@ -229,6 +229,7 @@ public class FormDesigner extends TargetComponent