Browse Source

frm本地组件复用 绝对布局,遗留:重命名问题

master
yaoh.wu 8 years ago
parent
commit
5a9c222dc2
  1. 2
      designer_base/src/com/fr/design/actions/edit/CopyAction.java
  2. 52
      designer_base/src/com/fr/design/beans/location/MoveUtils.java
  3. 56
      designer_base/src/com/fr/design/beans/location/WidgetForbidWindow.java
  4. 2
      designer_base/src/com/fr/design/mainframe/BaseJForm.java
  5. 20
      designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java
  6. 2
      designer_base/src/com/fr/design/parameter/ParameterDesignerProvider.java
  7. 30
      designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java
  8. 83
      designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java
  9. 553
      designer_form/src/com/fr/design/designer/beans/adapters/layout/FRAbsoluteLayoutAdapter.java
  10. 40
      designer_form/src/com/fr/design/designer/beans/location/AccessDirection.java
  11. 580
      designer_form/src/com/fr/design/designer/beans/models/SelectionModel.java
  12. 1242
      designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java
  13. 2
      designer_form/src/com/fr/design/mainframe/EditingMouseListener.java
  14. 218
      designer_form/src/com/fr/design/mainframe/FormDesigner.java
  15. 301
      designer_form/src/com/fr/design/mainframe/FormSelectionUtils.java
  16. 66
      designer_form/src/com/fr/design/mainframe/JForm.java
  17. 3
      designer_form/src/com/fr/design/mainframe/MobileWidgetTable.java
  18. 31
      designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java

2
designer_base/src/com/fr/design/actions/edit/CopyAction.java

@ -18,7 +18,7 @@ import com.fr.general.Inter;
public class CopyAction extends TemplateComponentAction { public class CopyAction extends TemplateComponentAction {
public CopyAction(TargetComponent t) { public CopyAction(TargetComponent t) {
super(t); super(t);
this.setName(Inter.getLocText("M_Edit-Copy")); this.setName(Inter.getLocText("M_Edit-Copy"));
this.setMnemonic('C'); this.setMnemonic('C');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png"));

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

@ -279,13 +279,13 @@ public class MoveUtils {
} }
} }
public static void displayForbidWindow(int x, int y) { // public static void displayForbidWindow(int x, int y) {
widgetForbidWindow.showWindow(x, y); // widgetForbidWindow.showWindow(x, y);
} // }
public static void hideForbidWindow() { // public static void hideForbidWindow() {
widgetForbidWindow.hideWindow(); // widgetForbidWindow.hideWindow();
} // }
/** /**
* 吸附 * 吸附
@ -319,24 +319,24 @@ public class MoveUtils {
java.util.List<Rectangle> cacheRecs = new ArrayList<Rectangle>(); java.util.List<Rectangle> cacheRecs = new ArrayList<Rectangle>();
//是否存在控件重叠 //是否存在控件重叠
boolean isWidgetsIntersects = false; // boolean isWidgetsIntersects = false;
while (iterator.hasNext()) { while (iterator.hasNext()) {
Rectangle bounds = iterator.nextRectangle(); Rectangle bounds = iterator.nextRectangle();
cacheRecs.add(bounds); cacheRecs.add(bounds);
boolean isIntersects = operatingRectangle.intersects(bounds); // boolean isIntersects = operatingRectangle.intersects(bounds);
findX(px, bounds, left, right, width); findX(px, bounds, left, right, width);
findY(py, bounds, top, bottom, height); findY(py, bounds, top, bottom, height);
if(!isParameterLayout){ if(!isParameterLayout){
if(isIntersects) { // if(isIntersects) {
isWidgetsIntersects = true; // isWidgetsIntersects = true;
} // }
else{ // else{
findEquidistantLine(bounds, left, top, height, width); findEquidistantLine(bounds, left, top, height, width);
} // }
} }
} }
showForbiddenWindow(designer, x, y, isWidgetsIntersects); //showForbiddenWindow(designer, x, y, isWidgetsIntersects);
createXAbsorptionline(px, designer, width, cacheRecs); createXAbsorptionline(px, designer, width, cacheRecs);
createYAbsorptionline(py, designer, height, cacheRecs); createYAbsorptionline(py, designer, height, cacheRecs);
@ -353,18 +353,18 @@ public class MoveUtils {
return sorptionPoint; return sorptionPoint;
} }
public static void showForbiddenWindow(RectangleDesigner designer, int x, int y, boolean isIntersects){ // public static void showForbiddenWindow(RectangleDesigner designer, int x, int y, boolean isIntersects){
if (isIntersects){ // if (isIntersects){
if(designer.getDesignerLocationOnScreen() != null) { // if(designer.getDesignerLocationOnScreen() != null) {
displayForbidWindow(x + designer.getDesignerLocationOnScreen().x, y + designer.getDesignerLocationOnScreen().y); // displayForbidWindow(x + designer.getDesignerLocationOnScreen().x, y + designer.getDesignerLocationOnScreen().y);
} // }
designer.setWidgetsIntersected(true); // designer.setWidgetsIntersected(true);
} // }
else{ // else{
designer.setWidgetsIntersected(false); // designer.setWidgetsIntersected(false);
hideForbidWindow(); // hideForbidWindow();
} // }
} // }
private static void createXAbsorptionline(PlacePointing px, RectangleDesigner designer, int width, java.util.List<Rectangle> cacheRecs) { private static void createXAbsorptionline(PlacePointing px, RectangleDesigner designer, int width, java.util.List<Rectangle> cacheRecs) {
Absorptionline line = null; Absorptionline line = null;

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

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

2
designer_base/src/com/fr/design/mainframe/BaseJForm.java

@ -1 +1 @@
package com.fr.design.mainframe; import javax.swing.JComponent; import com.fr.form.FormElementCaseContainerProvider; /** * Author : Shockway * Date: 13-7-15 * Time: 上午10:28 */ public interface BaseJForm extends JTemplateProvider{ public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; public static final int ELEMENTCASE_TAB = 1; public static final int ELEMENTCASE_CHANGE_TAB = 2; /** * 刷新所有控件 */ { { { { { public static final String XML_TAG = "JForm"; { public static final int FORM_TAB = 0; public void populateParameter(); /** { public static final int ELEMENTCASE_CHANGE_TAB = 2; */ { /** /** { * 刷新所有控件 */ { */ /** { */ public static final String XML_TAG = "JForm"; /** public static final int FORM_TAB = 0; */ public static final int ELEMENTCASE_TAB = 1; { * 只在Form和ElementCase之间切换 /** { public static final int FORM_TAB = 0; * 刷新所有控件 /** */ public static final String XML_TAG = "JForm"; public static final String XML_TAG = "JForm"; { { public static final int FORM_TAB = 0; public void tabChanged(int index, FormElementCaseContainerProvider ecContainer); } package com.fr.design.mainframe; import javax.swing.JComponent; import com.fr.form.FormElementCaseContainerProvider; /** * Author : Shockway * Date: 13-7-15 * Time: 上午10:28 */ public interface BaseJForm extends JTemplateProvider { public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; public static final String XML_TAG = "JForm"; public static final int ELEMENTCASE_TAB = 1; public static final String XML_TAG = "JForm"; public static final int ELEMENTCASE_CHANGE_TAB = 2; public static final String XML_TAG = "JForm"; /** public static final String XML_TAG = "JForm"; * 刷新所有控件 public static final String XML_TAG = "JForm"; */ public static final int FORM_TAB = 0; public static final int FORM_TAB = 0; { public static final int FORM_TAB = 0; /** public static final int FORM_TAB = 0; public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; { public static final int FORM_TAB = 0; public static final int FORM_TAB = 0; /** * 刷新选中的控件 public static final int FORM_TAB = 0; { public static final int FORM_TAB = 0; public static final int ELEMENTCASE_CHANGE_TAB = 2; public static final String XML_TAG = "JForm"; */ public static final int FORM_TAB = 0; /** public static final int FORM_TAB = 0; { public static final int FORM_TAB = 0; * 刷新所有控件 public static final String XML_TAG = "JForm"; */ * 执行撤销 public static final int ELEMENTCASE_TAB = 1; * @param o 之前保存的状态 public static final int FORM_TAB = 0; { public static final int ELEMENTCASE_TAB = 1; public static final String XML_TAG = "JForm"; */ public static final int ELEMENTCASE_TAB = 1; public static final String XML_TAG = "JForm"; */ JComponent getEditingPane(); public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; public static final String XML_TAG = "JForm"; */ public static final int ELEMENTCASE_TAB = 1; public static final int ELEMENTCASE_TAB = 1; * * @param index 切换位置 public static final int FORM_TAB = 0; { public static final int ELEMENTCASE_TAB = 1; /** public static final String XML_TAG = "JForm"; public static final int FORM_TAB = 0; /** public static final int ELEMENTCASE_TAB = 1; * 刷新所有控件 * public static final int ELEMENTCASE_TAB = 1; */ public static final int ELEMENTCASE_CHANGE_TAB = 2; public static final int FORM_TAB = 0; { public static final int ELEMENTCASE_CHANGE_TAB = 2; { void tabChanged(int index, FormElementCaseContainerProvider ecContainer); }

20
designer_base/src/com/fr/design/mainframe/toolbar/ToolBarMenuDockPlus.java

@ -12,52 +12,52 @@ public interface ToolBarMenuDockPlus {
* *
* @return 工具 * @return 工具
*/ */
public ToolBarDef[] toolbars4Target(); ToolBarDef[] toolbars4Target();
/** /**
* 文件菜单的子菜单 * 文件菜单的子菜单
* *
* @return 子菜单 * @return 子菜单
*/ */
public ShortCut[] shortcut4FileMenu(); ShortCut[] shortcut4FileMenu();
/** /**
* 目标的菜单 * 目标的菜单
* *
* @return 菜单 * @return 菜单
*/ */
public MenuDef[] menus4Target(); MenuDef[] menus4Target();
/** /**
* 表单的工具栏 * 表单的工具栏
* *
* @return 表单工具栏 * @return 表单工具栏
*/ */
public JPanel[] toolbarPanes4Form(); JPanel[] toolbarPanes4Form();
/** /**
* 表单的工具按钮 * 表单的工具按钮
* *
* @return 工具按钮 * @return 工具按钮
*/ */
public JComponent[] toolBarButton4Form(); JComponent[] toolBarButton4Form();
/** /**
* 权限细粒度状态下的工具面板 * 权限细粒度状态下的工具面板
* *
* @return 工具面板 * @return 工具面板
*/ */
public JComponent toolBar4Authority(); JComponent toolBar4Authority();
public int getMenuState(); int getMenuState();
public int getToolBarHeight(); int getToolBarHeight();
/** /**
* 导出菜单的子菜单 目前用于图表设计器 * 导出菜单的子菜单 目前用于图表设计器
* *
* @return 子菜单 * @return 子菜单
*/ */
public ShortCut[] shortcut4ExportMenu(); ShortCut[] shortcut4ExportMenu();
} }

2
designer_base/src/com/fr/design/parameter/ParameterDesignerProvider.java

@ -1 +1 @@
package com.fr.design.parameter; import com.fr.base.Parameter; import com.fr.base.parameter.ParameterUI; import com.fr.design.mainframe.AuthorityEditPane; import javax.swing.*; import java.awt.*; /** * 参数设计界面接口 */ public interface ParameterDesignerProvider { public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); public void setDesignHeight(int height); public Dimension getDesignSize(); public Dimension getPreferredSize(); public void populate(ParameterUI p); public void refreshAllNameWidgets(); public void refresh4TableData(String oldName, String newName); d">public void addListener(ParaDefinitePane paraDefinitePane); d">public void addListener(ParaDefinitePane paraDefinitePane); d">public void addListener(ParaDefinitePane paraDefinitePane); d">public void addListener(ParaDefinitePane paraDefinitePane); d">public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); public void setDesignHeight(int height); d">public void addListener(ParaDefinitePane paraDefinitePane); public Dimension getDesignSize(); d">public void addListener(ParaDefinitePane paraDefinitePane); public Dimension getPreferredSize(); d">public void addListener(ParaDefinitePane paraDefinitePane); public void populate(ParameterUI p); d">public void addListener(ParaDefinitePane paraDefinitePane); public void refreshAllNameWidgets(); d">public void addListener(ParaDefinitePane paraDefinitePane); public void refresh4TableData(String oldName, String newName); d">public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); public void setDesignHeight(int height); public Dimension getDesignSize(); public Dimension getPreferredSize(); public void populate(ParameterUI p); public void refreshAllNameWidgets(); public ParameterBridge getParaComponent(); } package com.fr.design.parameter; import com.fr.base.Parameter; import com.fr.base.parameter.ParameterUI; import com.fr.design.mainframe.AuthorityEditPane; import javax.swing.*; import java.awt.*; /** * 参数设计界面接口 */ public interface ParameterDesignerProvider { void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); public Component createWrapper(); public Component createWrapper(); public Component createWrapper(); public void setDesignHeight(int height); public Component createWrapper(); public Dimension getDesignSize(); public Component createWrapper(); public Dimension getPreferredSize(); public Component createWrapper(); public void populate(ParameterUI p); public Component createWrapper(); public void refreshAllNameWidgets(); public Component createWrapper(); public void refresh4TableData(String oldName, String newName); public void setDesignHeight(int height); public void setDesignHeight(int height); d">public void addListener(ParaDefinitePane paraDefinitePane); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); public void setDesignHeight(int height); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); boolean isBlank(); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); ParameterUI getParaTarget(); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); boolean addingParameter2Editor(Parameter parameter, int index); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); boolean addingParameter2EditorWithQueryButton(Parameter parameter, int index); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); void addingAllParameter2Editor(Parameter[] parameterArray, int currentIndex); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); JPanel[] toolbarPanes4Form(); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); JComponent[] toolBarButton4Form(); public Component createWrapper(); d">public void addListener(ParaDefinitePane paraDefinitePane); public Dimension getDesignSize(); public Dimension getDesignSize(); d">public void addListener(ParaDefinitePane paraDefinitePane); public Dimension getDesignSize(); public Dimension getDesignSize(); public Component createWrapper(); public Dimension getDesignSize(); public void setDesignHeight(int height); public Dimension getDesignSize(); public Dimension getDesignSize(); public Dimension getDesignSize(); public Dimension getPreferredSize(); public Dimension getDesignSize(); public void populate(ParameterUI p); public Dimension getDesignSize(); public void refreshAllNameWidgets(); ParameterBridge getParaComponent(); }

30
designer_form/src/com/fr/design/designer/beans/actions/CopyAction.java

@ -11,21 +11,21 @@ import com.fr.design.mainframe.FormDesigner;
public class CopyAction extends FormEditAction { public class CopyAction extends FormEditAction {
public CopyAction(FormDesigner t) { public CopyAction(FormDesigner t) {
super(t); super(t);
this.setName(Inter.getLocText("M_Edit-Copy")); this.setName(Inter.getLocText("M_Edit-Copy"));
this.setMnemonic('C'); this.setMnemonic('C');
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png"));
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK)); this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
} }
@Override @Override
public boolean executeActionReturnUndoRecordNeeded() { public boolean executeActionReturnUndoRecordNeeded() {
FormDesigner tc = getEditingComponent(); FormDesigner tc = getEditingComponent();
if (tc != null) { if (tc != null) {
tc.copy(); tc.copy();
} }
return false; return false;
} }
} }

83
designer_form/src/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java

@ -23,32 +23,35 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
this.container = container; this.container = container;
this.layout = container.getLayout(); this.layout = container.getLayout();
} }
/** /**
* 是否使用控件备份大小 * 是否使用控件备份大小
*
* @param xCreator 控件 * @param xCreator 控件
* @return 所在容器相同且支持备份的话返回true * @return 所在容器相同且支持备份的话返回true
*/ */
public boolean whetherUseBackupSize(XCreator xCreator) { public boolean whetherUseBackupSize(XCreator xCreator) {
Class clazz = container.getClass(); Class clazz = container.getClass();
Class bkClazz = null; Class bkClazz = null;
if(xCreator.getBackupParent() != null) { if (xCreator.getBackupParent() != null) {
bkClazz = xCreator.getBackupParent().getClass(); bkClazz = xCreator.getBackupParent().getClass();
} }
return ComparatorUtils.equals(bkClazz, clazz) return ComparatorUtils.equals(bkClazz, clazz)
&& supportBackupSize(); && supportBackupSize();
} }
/** /**
* 是否支持用备份大小 * 是否支持用备份大小
*
* @return * @return
*/ */
public boolean supportBackupSize() { public boolean supportBackupSize() {
return false; return false;
} }
/** /**
* 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下 * 有的控件在拖拽调整大小后需要根据自身内容重新计算下当前的尺寸是否合适如果不合适就需要重新fix一下
*
* @param creator 组件 * @param creator 组件
*/ */
public void fix(XCreator creator) { public void fix(XCreator creator) {
@ -56,48 +59,52 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况 * 显示parent的字组件child解决CardLayout中显示某个非显示组件的特殊情况
*
* @param child 组件 * @param child 组件
*/ */
@Override @Override
public void showComponent(XCreator child) { public void showComponent(XCreator child) {
child.setVisible(true); child.setVisible(true);
} }
/** /**
* 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的 * 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的
* addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能 * addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能
*
* @param creator 被添加的新组件 * @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的 * @param y 添加的位置y该位置是相对于container的
* @return 是否添加成功成功返回true否则false * @return 是否添加成功成功返回true否则false
*/ */
@Override @Override
public boolean addBean(XCreator creator, int x, int y) { public boolean addBean(XCreator creator, int x, int y) {
if (!accept(creator, x, y)) { if (!accept(creator, x, y)) {
return false; return false;
} }
addComp(creator, x, y); addComp(creator, x, y);
((XWidgetCreator) creator).recalculateChildrenSize(); ((XWidgetCreator) creator).recalculateChildrenSize();
return true; return true;
} }
/** /**
* 删除组件 * 删除组件
* @param creator 组件 *
* @param initWidth 组件之前宽度 * @param creator 组件
* @param initHeight 组件之前高度 * @param creatorWidth
* @param creatorHeight
*/ */
public void removeBean(XCreator creator, int creatorWidth, int creatorHeight) { public void removeBean(XCreator creator, int creatorWidth, int creatorHeight) {
delete(creator, creatorWidth, creatorHeight); delete(creator, creatorWidth, creatorHeight);
} }
protected void delete(XCreator creator, int creatorWidth, int creatorHeight) { protected void delete(XCreator creator, int creatorWidth, int creatorHeight) {
} }
protected abstract void addComp(XCreator creator, int x, int y); protected abstract void addComp(XCreator creator, int x, int y);
/** /**
* 增加下一个组件 * 增加下一个组件
*
* @param dragged 组件 * @param dragged 组件
*/ */
@Override @Override
@ -108,8 +115,9 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 目标控件位置插入组件 * 目标控件位置插入组件
*
* @param target 目标 * @param target 目标
* @param added 增加组件 * @param added 增加组件
*/ */
@Override @Override
public void addBefore(XCreator target, XCreator added) { public void addBefore(XCreator target, XCreator added) {
@ -126,8 +134,9 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
/** /**
* 插在目标组件后面 * 插在目标组件后面
*
* @param target 目标 * @param target 目标
* @param added 增加组件 * @param added 增加组件
*/ */
@Override @Override
public void addAfter(XCreator target, XCreator added) { public void addAfter(XCreator target, XCreator added) {
@ -147,14 +156,15 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
LayoutUtils.layoutRootContainer(container); LayoutUtils.layoutRootContainer(container);
} }
@Override @Override
public HoverPainter getPainter() { public HoverPainter getPainter() {
return new NullPainter(container); return new NullPainter(container);
} }
/** /**
* 是否能接收更多的组件 * 是否能接收更多的组件
*
* @return 能则返回true * @return 能则返回true
*/ */
@Override @Override
@ -171,4 +181,9 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
public GroupModel getLayoutProperties() { public GroupModel getLayoutProperties() {
return null; return null;
} }
public XLayoutContainer getContainer() {
return this.container;
}
} }

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

@ -17,338 +17,347 @@ import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogger; import com.fr.general.FRLogger;
public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter { public class FRAbsoluteLayoutAdapter extends FRBodyLayoutAdapter {
//是不是添加到父容器上 //是不是添加到父容器上
private boolean isAdd2ParentLayout = false; private boolean isAdd2ParentLayout = false;
private HoverPainter painter; private HoverPainter painter;
public FRAbsoluteLayoutAdapter(XLayoutContainer container) { public FRAbsoluteLayoutAdapter(XLayoutContainer container) {
super(container); super(container);
painter = new FRAbsoluteLayoutPainter(container); painter = new FRAbsoluteLayoutPainter(container);
initMinSize(); initMinSize();
} }
private void initMinSize() { private void initMinSize() {
XWAbsoluteLayout layout = (XWAbsoluteLayout) container; XWAbsoluteLayout layout = (XWAbsoluteLayout) container;
minWidth = layout.getActualMinWidth(); minWidth = layout.getActualMinWidth();
minHeight = layout.getActualMinHeight(); minHeight = layout.getActualMinHeight();
actualVal = layout.getAcualInterval(); actualVal = layout.getAcualInterval();
margin = layout.toData().getMargin(); margin = layout.toData().getMargin();
} }
@Override
public HoverPainter getPainter() {
return painter;
}
@Override
public HoverPainter getPainter() {
return painter;
}
/** /**
* 是否能在指定位置添加组件 * 是否能在指定位置添加组件
*
* @param creator 组件 * @param creator 组件
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
* @return 能则返回true * @return 能则返回true
*/ */
//这个地方的逻辑非常复杂, //这个地方的逻辑非常复杂,
// 1.当前绝对布局是不可编辑且是最外层,那么其他控件添加在它周围, // 1.当前绝对布局是不可编辑且是最外层,那么其他控件添加在它周围,
// 2.当前绝对布局是不可编辑且不是最外层,那么控件不可添加,(嵌套) // 2.当前绝对布局是不可编辑且不是最外层,那么控件不可添加,(嵌套)
// 3.当前绝对布局可编辑,那么控件添加 // 3.当前绝对布局可编辑,那么控件添加
@Override @Override
public boolean accept(XCreator creator, int x, int y) { public boolean accept(XCreator creator, int x, int y) {
Component comp = container.getComponentAt(x, y); Component comp = container.getComponentAt(x, y);
//布局控件要先判断是不是可编辑 //布局控件要先判断是不是可编辑
//可以编辑,按原有逻辑判断 //可以编辑,按原有逻辑判断
//不可编辑,当成一整个控件处理 //不可编辑,当成一整个控件处理
if (comp == null){ if (comp == null) {
return false; return false;
} }
//参数面板内的组件不允许拖往绝对布局中 //参数面板内的组件不允许拖往绝对布局中
if (creator.getParent() != null && ((XCreator)creator.getParent()).acceptType(XWParameterLayout.class)){ if (creator.getParent() != null && ((XCreator) creator.getParent()).acceptType(XWParameterLayout.class)) {
Rectangle rec = creator.getBounds(); Rectangle rec = creator.getBounds();
rec.y = creator.getParent().getHeight() - rec.height; rec.y = creator.getParent().getHeight() - rec.height;
creator.setBounds(rec); creator.setBounds(rec);
return false; return false;
} }
//判断下组件能不能拖入绝对布局 //判断组件能不能拖入绝对布局
if (!creator.canEnterIntoAbsolutePane()){ if (!creator.canEnterIntoAbsolutePane()) {
return false; return false;
} }
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer((XCreator)comp).getTopLayout(); XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer((XCreator) comp).getTopLayout();
if(topLayout != null){ if (topLayout != null) {
if (topLayout.isEditable()){ if (topLayout.isEditable()) {
return topLayoutAccept(creator, x, y, topLayout); return topLayoutAccept(creator, x, y, topLayout);
} }
//绝对布局嵌套,处于内层,不可编辑,不添加,topLayout只能获取到最外层可编辑的布局 //绝对布局嵌套,处于内层,不可编辑,不添加,topLayout只能获取到最外层可编辑的布局
else if (((XLayoutContainer)topLayout.getParent()).acceptType(XWAbsoluteLayout.class)) { else if (((XLayoutContainer) topLayout.getParent()).acceptType(XWAbsoluteLayout.class)) {
return false; return false;
} } else {
else { return acceptWidget(creator, x, y);
return acceptWidget(creator, x, y); }
} } else {
} FRLogger.getLogger().error("top layout is null!");
else{ }
FRLogger.getLogger().error("top layout is null!");
}
return false;
}
//toplayout假如可以编辑的话就往里面添加组件 return false;
private boolean topLayoutAccept(XCreator creator, int x, int y, XLayoutContainer topLayout) { }
//判断有没有和当前控件重叠
//先计算当前控件的位置
int creatorX, creatorY;
if (XCreatorUtils.getParentXLayoutContainer(creator) != null) {
//topLayout假如可以编辑的话就往里面添加组件
private boolean topLayoutAccept(XCreator creator, int x, int y, XLayoutContainer topLayout) {
//允许组件重叠,可以不判断有没有和当前控件重叠
//先计算当前控件的位置
int creatorX, creatorY;
if (XCreatorUtils.getParentXLayoutContainer(creator) != null) {
Rectangle creatorRectangle = ComponentUtils.getRelativeBounds(creator); Rectangle creatorRectangle = ComponentUtils.getRelativeBounds(creator);
creatorX = creatorRectangle.x; creatorX = creatorRectangle.x;
creatorY = creatorRectangle.y; creatorY = creatorRectangle.y;
} else { } else {
//这边计算得到的组件其实位置是正确的,
//因为传入的x和y已经加上了宽度或者高度的一半,再减去相同的宽度和高度的一半是没区别的,
// 例如高度为21,那么就是+10-10;
// 高度为20,那么就是+10-10; 没区别
int w = creator.getWidth() / 2; int w = creator.getWidth() / 2;
int h = creator.getHeight() / 2; int h = creator.getHeight() / 2;
creatorX = x - w; creatorX = x - w;
creatorY = y - h; creatorY = y - h;
} }
//再判断和布局中其他控件重叠 //frm 组件复用允许组件重叠
Rectangle curRec = new Rectangle(creatorX, creatorY, creator.getWidth(), creator.getHeight()); //无须再判断和布局中其他控件重叠
WAbsoluteLayout wAbsoluteLayout = (WAbsoluteLayout)topLayout.toData(); //Rectangle curRec = new Rectangle(creatorX, creatorY, creator.getWidth(), creator.getHeight());
for (int i = 0, count = wAbsoluteLayout.getWidgetCount(); i < count; i++) { //WAbsoluteLayout wAbsoluteLayout = (WAbsoluteLayout) topLayout.toData();
BoundsWidget temp = (BoundsWidget) wAbsoluteLayout.getWidget(i); //for (int i = 0, count = wAbsoluteLayout.getWidgetCount(); i < count; i++) {
Rectangle rectangle = temp.getBounds(); //BoundsWidget temp = (BoundsWidget) wAbsoluteLayout.getWidget(i);
if (curRec.intersects(rectangle)){ //Rectangle rectangle = temp.getBounds();
return false; //if (curRec.intersects(rectangle)) {
} //允许组件重叠
} //return false;
if (creatorX < 0 || creatorX + creator.getWidth() > container.getWidth()) { //}
//}
if (creatorX < 0 || creatorX + creator.getWidth() > container.getWidth()) {
return false; return false;
} }
if (creatorY < 0 || creatorY + creator.getHeight() > container.getHeight()){ if (creatorY < 0 || creatorY + creator.getHeight() > container.getHeight()) {
return false; return false;
} }
return x >= 0 && y >= 0 && creator.getHeight() <= container.getHeight() return x >= 0 && y >= 0 && creator.getHeight() <= container.getHeight()
&& creator.getWidth() <= container.getWidth(); && creator.getWidth() <= container.getWidth();
} }
/** /**
* 判断是否鼠标在组件的三等分区域如果组件在布局管理器中间上下左右都可能会三等分 * 判断是否鼠标在组件的三等分区域如果组件在布局管理器中间上下左右都可能会三等分
* @param parentComp 鼠标所在区域的组件 *
* @param x 坐标x * @param parentComp 鼠标所在区域的组件
* @param y 坐标y * @param x 坐标x
* @return 是则返回true * @param y 坐标y
*/ * @return 是则返回true
public boolean isTrisectionArea(Component parentComp, int x, int y) { */
XCreator creator = (XCreator)parentComp; public boolean isTrisectionArea(Component parentComp, int x, int y) {
trisectAreaDirect = 0; XCreator creator = (XCreator) parentComp;
if (container.getComponentCount()<=1) { trisectAreaDirect = 0;
return false; if (container.getComponentCount() <= 1) {
} return false;
int maxWidth = parentComp.getWidth(); }
int maxHeight = parentComp.getHeight(); int maxWidth = parentComp.getWidth();
int xL = parentComp.getX(); int maxHeight = parentComp.getHeight();
int yL = parentComp.getY(); int xL = parentComp.getX();
// 组件宽高的十分之一和默认值取大 int yL = parentComp.getY();
int minRangeWidth = Math.max(maxWidth/BORDER_PROPORTION, DEFAULT_AREA_LENGTH); // 组件宽高的十分之一和默认值取大
int minRangeHeight = Math.max(maxHeight/BORDER_PROPORTION, DEFAULT_AREA_LENGTH); int minRangeWidth = Math.max(maxWidth / BORDER_PROPORTION, DEFAULT_AREA_LENGTH);
if(y<yL+minRangeHeight ) { int minRangeHeight = Math.max(maxHeight / BORDER_PROPORTION, DEFAULT_AREA_LENGTH);
// 在组件上侧三等分 if (y < yL + minRangeHeight) {
trisectAreaDirect = COMP_TOP; // 在组件上侧三等分
} else if(y>yL+maxHeight-minRangeHeight) { trisectAreaDirect = COMP_TOP;
// 在组件下侧三等分 } else if (y > yL + maxHeight - minRangeHeight) {
trisectAreaDirect = COMP_BOTTOM; // 在组件下侧三等分
} else if (x<xL+minRangeWidth) { trisectAreaDirect = COMP_BOTTOM;
// 在组件左侧三等分 } else if (x < xL + minRangeWidth) {
trisectAreaDirect = COMP_LEFT; // 在组件左侧三等分
} else if(x>xL+maxWidth-minRangeWidth) { trisectAreaDirect = COMP_LEFT;
// 在组件右侧三等分 } else if (x > xL + maxWidth - minRangeWidth) {
trisectAreaDirect = COMP_RIGHT; // 在组件右侧三等分
} trisectAreaDirect = COMP_RIGHT;
// tab布局的边界特殊处理,不进行三等分 }
if(!creator.getTargetChildrenList().isEmpty()){ // tab布局的边界特殊处理,不进行三等分
return false; if (!creator.getTargetChildrenList().isEmpty()) {
} return false;
}
return !ComparatorUtils.equals(trisectAreaDirect, 0); return !ComparatorUtils.equals(trisectAreaDirect, 0);
} }
//当前绝对布局不可编辑,就当成一个控件,组件添加在周围 //当前绝对布局不可编辑,就当成一个控件,组件添加在周围
private boolean acceptWidget(XCreator creator, int x, int y){ private boolean acceptWidget(XCreator creator, int x, int y) {
isFindRelatedComps = false; isFindRelatedComps = false;
//拖入组件判断时,先判断是否为交叉点区域,其次三等分区域,再次平分区域 //拖入组件判断时,先判断是否为交叉点区域,其次三等分区域,再次平分区域
Component comp = container.getComponentAt(x, y); Component comp = container.getComponentAt(x, y);
boolean isMatchEdge = false; boolean isMatchEdge = false;
//如果当前处于边缘地带, 那么就把他贴到父容器上 //如果当前处于边缘地带, 那么就把他贴到父容器上
XLayoutContainer parent = container.findNearestFit(); XLayoutContainer parent = container.findNearestFit();
container = parent != null ? parent : container; container = parent != null ? parent : container;
isAdd2ParentLayout = true; isAdd2ParentLayout = true;
int componentHeight = comp.getHeight(); int componentHeight = comp.getHeight();
int componentWidth = comp.getWidth(); int componentWidth = comp.getWidth();
//上半部分高度 //上半部分高度
int upHeight = (int) (componentHeight * TOP_HALF) + comp.getY(); int upHeight = (int) (componentHeight * TOP_HALF) + comp.getY();
//下半部分高度 //下半部分高度
int downHeight = (int) (componentHeight * BOTTOM_HALF) + comp.getY(); int downHeight = (int) (componentHeight * BOTTOM_HALF) + comp.getY();
if (isCrossPointArea(comp, x, y)) { if (isCrossPointArea(comp, x, y)) {
return canAcceptWhileCrossPoint(comp, x, y); return canAcceptWhileCrossPoint(comp, x, y);
} }
if (isTrisectionArea(comp, x, y)) { if (isTrisectionArea(comp, x, y)) {
return canAcceptWhileTrisection(comp, x, y); return canAcceptWhileTrisection(comp, x, y);
} }
boolean horizonValid = componentWidth >= minWidth * 2 + actualVal; boolean horizonValid = componentWidth >= minWidth * 2 + actualVal;
boolean verticalValid = componentHeight >= minHeight * 2 + actualVal; boolean verticalValid = componentHeight >= minHeight * 2 + actualVal;
return y > upHeight && y < downHeight ? horizonValid : verticalValid; return y > upHeight && y < downHeight ? horizonValid : verticalValid;
} }
/** /**
* 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的 * 组件的ComponentAdapter在添加组件时如果发现布局管理器不为空会继而调用该布局管理器的
* addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能 * addComp方法来完成组件的具体添加在该方法内布局管理器可以提供额外的功能
* *
* @param creator 被添加的新组件 * @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的 * @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的 * @param y 添加的位置y该位置是相对于container的
* @return 是否添加成功成功返回true否则false * @return 是否添加成功成功返回true否则false
*/ */
@Override @Override
public boolean addBean(XCreator creator, int x, int y) { public boolean addBean(XCreator creator, int x, int y) {
Rectangle rect = ComponentUtils.getRelativeBounds(container); Rectangle rect = ComponentUtils.getRelativeBounds(container);
int posX = x + rect.x; int posX = x + rect.x;
int posY = y + rect.y; int posY = y + rect.y;
if (!accept(creator, x, y)) { if (!accept(creator, x, y)) {
return false; return false;
} }
addComp(creator, posX, posY); addComp(creator, posX, posY);
((XWidgetCreator) creator).recalculateChildrenSize(); ((XWidgetCreator) creator).recalculateChildrenSize();
return true; return true;
} }
@Override @Override
protected void addComp(XCreator creator, int x, int y) { protected void addComp(XCreator creator, int x, int y) {
if(!isAdd2ParentLayout) { if (!isAdd2ParentLayout) {
Rectangle r = ComponentUtils.getRelativeBounds(container); Rectangle r = ComponentUtils.getRelativeBounds(container);
x = x - r.x; x = x - r.x;
y = y - r.y; y = y - r.y;
if (XCreatorUtils.getParentXLayoutContainer(creator) != null) { if (XCreatorUtils.getParentXLayoutContainer(creator) != null) {
Rectangle creatorRectangle = ComponentUtils.getRelativeBounds(creator); Rectangle creatorRectangle = ComponentUtils.getRelativeBounds(creator);
x = creatorRectangle.x - r.x; x = creatorRectangle.x - r.x;
y = creatorRectangle.y - r.y; y = creatorRectangle.y - r.y;
} else { } else {
int w = creator.getWidth() / 2; int w = creator.getWidth() / 2;
int h = creator.getHeight() / 2; int h = creator.getHeight() / 2;
x = x - w; x = x - w;
y = y - h; y = y - h;
} }
fix(creator, x, y); fix(creator, x, y);
if (creator.hasTitleStyle()) { if (creator.hasTitleStyle()) {
addParentCreator(creator); addParentCreator(creator);
} else { } else {
container.add(creator, creator.toData().getWidgetName()); container.add(creator, creator.toData().getWidgetName());
} }
XWAbsoluteLayout layout = (XWAbsoluteLayout) container; XWAbsoluteLayout layout = (XWAbsoluteLayout) container;
layout.updateBoundsWidget(creator); layout.updateBoundsWidget(creator);
updateCreatorBackBound(); updateCreatorBackBound();
LayoutUtils.layoutRootContainer(container); LayoutUtils.layoutRootContainer(container);
}else{ } else {
fixAbsolute(creator, x, y); fixAbsolute(creator, x, y);
if (creator.shouldScaleCreator() || creator.hasTitleStyle()) { if (creator.shouldScaleCreator() || creator.hasTitleStyle()) {
addParentCreator(creator); addParentCreator(creator);
} else { } else {
container.add(creator, creator.toData().getWidgetName()); container.add(creator, creator.toData().getWidgetName());
} }
XWFitLayout layout = (XWFitLayout) container; XWFitLayout layout = (XWFitLayout) container;
// 更新对应的BoundsWidget // 更新对应的BoundsWidget
layout.updateBoundsWidget(); layout.updateBoundsWidget();
updateCreatorBackBound(); updateCreatorBackBound();
} }
} }
private void updateCreatorBackBound() { private void updateCreatorBackBound() {
for (int i=0,size=container.getComponentCount(); i<size; i++) { for (int i = 0, size = container.getComponentCount(); i < size; i++) {
XCreator creator = (XCreator) container.getComponent(i); XCreator creator = (XCreator) container.getComponent(i);
creator.updateChildBound(minHeight); creator.updateChildBound(minHeight);
creator.setBackupBound(creator.getBounds()); creator.setBackupBound(creator.getBounds());
} }
} }
private void addParentCreator(XCreator child) { private void addParentCreator(XCreator child) {
XLayoutContainer parentPanel = child.initCreatorWrapper(child.getHeight()); XLayoutContainer parentPanel = child.initCreatorWrapper(child.getHeight());
container.add(parentPanel, child.toData().getWidgetName()); container.add(parentPanel, child.toData().getWidgetName());
} }
/** /**
* 新拖入组件时计算调整其他关联组件位置大小 * 新拖入组件时计算调整其他关联组件位置大小
* @param child 新拖入的组件 *
* @param x 鼠标所在x坐标 * @param child 新拖入的组件
* @param y 鼠标所在y坐标 * @param x 鼠标所在x坐标
*/ * @param y 鼠标所在y坐标
private void fixAbsolute(XCreator child, int x, int y) { */
Component parentComp = container.getComponentAt(x, y); private void fixAbsolute(XCreator child, int x, int y) {
if (container.getComponentCount()==0){ Component parentComp = container.getComponentAt(x, y);
child.setLocation(0, 0); if (container.getComponentCount() == 0) {
child.setSize(parentComp.getWidth(), parentComp.getHeight()); child.setLocation(0, 0);
} else if(isCrossPointArea(parentComp, x, y)){ child.setSize(parentComp.getWidth(), parentComp.getHeight());
//交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入 } else if (isCrossPointArea(parentComp, x, y)) {
fixCrossPointArea(parentComp, child, x, y); //交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入
return; fixCrossPointArea(parentComp, child, x, y);
} else if (isTrisectionArea(parentComp, x, y)) { //TODO 尽量不要出现这种写法吧?if else条件要么互斥,要么多个if判断return,不要在一条if else语句里面return吧?
// 在边界三等分区域,就不再和组件二等分了 return;
fixTrisect(parentComp, child, x, y); } else if (isTrisectionArea(parentComp, x, y)) {
return; // 在边界三等分区域,就不再和组件二等分了
} else{ fixTrisect(parentComp, child, x, y);
fixHalve(parentComp, child, x, y); return;
} } else {
} fixHalve(parentComp, child, x, y);
}
}
/** /**
* 组件拖拽后调整大小 * 组件拖拽后调整大小
*
* @param creator 组件 * @param creator 组件
*/ */
@Override @Override
public void fix(XCreator creator) { public void fix(XCreator creator) {
WAbsoluteLayout wabs = (WAbsoluteLayout)container.toData(); WAbsoluteLayout wabs = (WAbsoluteLayout) container.toData();
fix(creator,creator.getX(),creator.getY()); fix(creator, creator.getX(), creator.getY());
wabs.setBounds(creator.toData(),creator.getBounds()); wabs.setBounds(creator.toData(), creator.getBounds());
XWAbsoluteLayout layout = (XWAbsoluteLayout) container; XWAbsoluteLayout layout = (XWAbsoluteLayout) container;
layout.updateBoundsWidget(creator); layout.updateBoundsWidget(creator);
} }
/** /**
* 调整组件大小到合适尺寸位置 * 调整组件大小到合适尺寸位置
*
* @param creator 组件 * @param creator 组件
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
*/ */
public void fix(XCreator creator ,int x, int y) { public void fix(XCreator creator, int x, int y) {
int height = creator.getHeight(); int height = creator.getHeight();
int width = creator.getWidth(); int width = creator.getWidth();
if (x < 0) { if (x < 0) {
width += x; width += x;
x = 0; x = 0;
} else if (x + creator.getWidth() > container.getWidth()) { } else if (x + creator.getWidth() > container.getWidth()) {
width = container.getWidth() - x; width = container.getWidth() - x;
} }
if (y < 0) { if (y < 0) {
height += y; height += y;
y = 0; y = 0;
} else if (y + creator.getHeight() > container.getHeight()) { } else if (y + creator.getHeight() > container.getHeight()) {
height = container.getHeight() - y; height = container.getHeight() - y;
} }
creator.setBounds(x, y, width, height); creator.setBounds(x, y, width, height);
} }
@Override @Override
public ConstraintsGroupModel getLayoutConstraints(XCreator creator) { public ConstraintsGroupModel getLayoutConstraints(XCreator creator) {
return new BoundsGroupModel((XWAbsoluteLayout)container, creator); return new BoundsGroupModel((XWAbsoluteLayout) container, creator);
} }
@Override @Override
public GroupModel getLayoutProperties() { public GroupModel getLayoutProperties() {
XWAbsoluteLayout xwAbsoluteLayout = (XWAbsoluteLayout) container; XWAbsoluteLayout xwAbsoluteLayout = (XWAbsoluteLayout) container;
return new FRAbsoluteLayoutPropertiesGroupModel(xwAbsoluteLayout); return new FRAbsoluteLayoutPropertiesGroupModel(xwAbsoluteLayout);
} }
} }

40
designer_form/src/com/fr/design/designer/beans/location/AccessDirection.java

@ -69,7 +69,7 @@ public abstract class AccessDirection implements Direction {
boolean findInY = current_bounds.getHeight() <= MoveUtils.SORPTION_UNIT ? true : false; boolean findInY = current_bounds.getHeight() <= MoveUtils.SORPTION_UNIT ? true : false;
WAbsoluteLayout layout =getLayout(designer); WAbsoluteLayout layout =getLayout(designer);
FormSelection selection = designer.getSelectionModel().getSelection(); FormSelection selection = designer.getSelectionModel().getSelection();
boolean isWidgetsIntersect = false; // boolean isWidgetsIntersect = false;
for (int i = 0, count = layout.getWidgetCount(); i < count; i++) { for (int i = 0, count = layout.getWidgetCount(); i < count; i++) {
BoundsWidget temp = (BoundsWidget) layout.getWidget(i); BoundsWidget temp = (BoundsWidget) layout.getWidget(i);
if (!temp.isVisible() || selection.contains(temp.getWidget())) { if (!temp.isVisible() || selection.contains(temp.getWidget())) {
@ -105,13 +105,13 @@ public abstract class AccessDirection implements Direction {
break; break;
} }
if (current_bounds.intersects(bounds) && !(layout instanceof WParameterLayout)){ // if (current_bounds.intersects(bounds) && !(layout instanceof WParameterLayout)) {
isWidgetsIntersect = true; // isWidgetsIntersect = true;
} // }
} }
processRectangleIntersects(designer, point.x, point.y, isWidgetsIntersect); // processRectangleIntersects(designer, point.x, point.y, isWidgetsIntersect);
setDesignerStateModelProperties(designer, findInX, findInY, current_bounds, point); setDesignerStateModelProperties(designer, findInX, findInY, current_bounds, point);
} }
private void setDesignerStateModelProperties (FormDesigner designer, boolean findInX, boolean findInY, Rectangle current_bounds, Point point) { private void setDesignerStateModelProperties (FormDesigner designer, boolean findInX, boolean findInY, Rectangle current_bounds, Point point) {
designer.getStateModel().setXAbsorptionline(findInX && current_bounds.getWidth() > MoveUtils.SORPTION_UNIT ? Absorptionline.createXAbsorptionline(point.x) : null); designer.getStateModel().setXAbsorptionline(findInX && current_bounds.getWidth() > MoveUtils.SORPTION_UNIT ? Absorptionline.createXAbsorptionline(point.x) : null);
@ -131,18 +131,18 @@ public abstract class AccessDirection implements Direction {
return relativeRec; return relativeRec;
} }
private void processRectangleIntersects(FormDesigner designer, int x, int y, boolean isIntersects){ // private void processRectangleIntersects(FormDesigner designer, int x, int y, boolean isIntersects){
if(isIntersects){ // if(isIntersects){
if(designer.getLocationOnScreen() != null) { // if(designer.getLocationOnScreen() != null) {
MoveUtils.displayForbidWindow(x + designer.getLocationOnScreen().x, y + designer.getLocationOnScreen().y); // MoveUtils.displayForbidWindow(x + designer.getLocationOnScreen().x, y + designer.getLocationOnScreen().y);
} // }
designer.setWidgetsIntersect(true); // designer.setWidgetsIntersect(true);
} // }
else{ // else{
MoveUtils.hideForbidWindow(); // MoveUtils.hideForbidWindow();
designer.setWidgetsIntersect(false); // designer.setWidgetsIntersect(false);
} // }
} // }
private WAbsoluteLayout getLayout(final FormDesigner designer){ private WAbsoluteLayout getLayout(final FormDesigner designer){
XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator( XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(

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

@ -11,11 +11,7 @@ import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.beans.location.Direction; import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.beans.location.Location; import com.fr.design.designer.beans.location.Location;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.*;
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.form.util.XCreatorConstants; import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.FormSelection;
@ -27,302 +23,342 @@ import com.fr.stable.ArrayUtils;
* 该model保存当前选择的组件和剪切版信息 * 该model保存当前选择的组件和剪切版信息
*/ */
public class SelectionModel { public class SelectionModel {
//被粘贴组件在所选组件位置处往下、往右各错开20像素。执行多次粘贴时,在上一次粘贴的位置处错开20像素。
private static final int DELTA_X_Y = 20; //粘贴时候的偏移距离 private static final int DELTA_X_Y = 20; //粘贴时候的偏移距离
private static FormSelection CLIP_BOARD = new FormSelection(); private static FormSelection CLIP_BOARD = new FormSelection();
private FormDesigner designer; private FormDesigner designer;
private FormSelection selection; private FormSelection selection;
private Rectangle hotspot_bounds; private Rectangle hotspot_bounds;
public SelectionModel(FormDesigner designer) { public SelectionModel(FormDesigner designer) {
this.designer = designer; this.designer = designer;
selection = new FormSelection(); selection = new FormSelection();
} }
/** /**
* 重置清空formSelction以及选择区域 * 重置清空formSelction以及选择区域
*/ */
public void reset() { public void reset() {
selection.reset(); selection.reset();
hotspot_bounds = null; hotspot_bounds = null;
} }
/**
* formSelction是否为空
* @return 是否为空
*/
public static boolean isEmpty(){
return CLIP_BOARD.isEmpty();
}
/** /**
* 鼠标点击一下所选中的单个组件按下Ctrl或者shift键时鼠标可以进行多选 * formSelction是否为空
* @param e 鼠标事件 *
*/ * @return 是否为空
public void selectACreatorAtMouseEvent(MouseEvent e) { */
if (!e.isControlDown() && !e.isShiftDown()) { public static boolean isEmpty() {
// 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 return CLIP_BOARD.isEmpty();
selection.reset(); }
}
// 获取e所在的组件 /**
XCreator comp = designer.getComponentAt(e); * 鼠标点击一下所选中的单个组件按下Ctrl或者shift键时鼠标可以进行多选
*
* @param e 鼠标事件
*/
public void selectACreatorAtMouseEvent(MouseEvent e) {
if (!e.isControlDown() && !e.isShiftDown()) {
// 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件
selection.reset();
}
//布局组件的顶层布局如不可编辑,要获取其顶层布局 // 获取e所在的组件
XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout(); XCreator comp = designer.getComponentAt(e);
if(topLayout != null && !topLayout.isEditable()){
comp = topLayout;
}
// 如果父层是scale和title两个专属容器,返回其父层,组件本身是不让被选中的 //布局组件的顶层布局如不可编辑,要获取其顶层布局
if (comp != designer.getRootComponent() && comp != designer.getParaComponent()) { XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout();
XCreator parentContainer = (XCreator) comp.getParent(); if (topLayout != null && !topLayout.isEditable()) {
comp = parentContainer.isDedicateContainer() ? parentContainer : comp; comp = topLayout;
} }
if (selection.removeSelectedCreator(comp) || selection.addSelectedCreator(comp)) {
designer.getEditListenerTable().fireCreatorModified(comp, DesignerEvent.CREATOR_SELECTED);
designer.repaint();
}
}
/** // 如果父层是scale和title两个专属容器,返回其父层,组件本身是不让被选中的
* 将所选组件剪切到剪切板上 if (comp != designer.getRootComponent() && comp != designer.getParaComponent()) {
*/ XCreator parentContainer = (XCreator) comp.getParent();
public void cutSelectedCreator2ClipBoard() { comp = parentContainer.isDedicateContainer() ? parentContainer : comp;
if (hasSelectionComponent()) { }
selection.cut2ClipBoard(CLIP_BOARD); if (selection.removeSelectedCreator(comp) || selection.addSelectedCreator(comp)) {
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED); designer.getEditListenerTable().fireCreatorModified(comp, DesignerEvent.CREATOR_SELECTED);
designer.repaint(); designer.repaint();
} }
} }
/** /**
* 复制当前选中的组件到剪切板 * 将所选组件剪切到剪切板上
*/ */
public void copySelectedCreator2ClipBoard() { public void cutSelectedCreator2ClipBoard() {
if (!selection.isEmpty()) { if (hasSelectionComponent()) {
selection.copy2ClipBoard(CLIP_BOARD); selection.cut2ClipBoard(CLIP_BOARD);
} designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_CUTED);
} designer.repaint();
}
}
/** /**
* 从剪切板粘帖组件 * 复制当前选中的组件到剪切板
* @return */
*/ public void copySelectedCreator2ClipBoard() {
public boolean pasteFromClipBoard() { if (!selection.isEmpty()) {
if (!CLIP_BOARD.isEmpty()) { selection.copy2ClipBoard(CLIP_BOARD);
XLayoutContainer parent = null; }
if (!hasSelectionComponent()) { }
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),CLIP_BOARD, DELTA_X_Y, DELTA_X_Y);
} else {
parent = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator());
if (parent != null) {
Rectangle rec = selection.getSelctionBounds();
FormSelectionUtils.paste2Container(designer, parent,CLIP_BOARD, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
}
}
} else {
Toolkit.getDefaultToolkit().beep();
}
return false;
}
public FormSelection getSelection() { /**
return selection; * 从剪切板粘帖组件
} *
* @return
*/
public boolean pasteFromClipBoard() {
if (!CLIP_BOARD.isEmpty()) {
XLayoutContainer parent = null;
if (!hasSelectionComponent()) {
if (designer.getClass().equals(FormDesigner.class)) {
//编辑器外面还有两层容器,使用designer.getRootComponent()获取到的是编辑器中层的容器,不是编辑器表层
//当前选择的就是编辑器表层
FormSelectionUtils.paste2Container(designer, (XLayoutContainer) selection.getSelectedCreator(),
CLIP_BOARD,
DELTA_X_Y,
DELTA_X_Y);
} else {
//cpt本地组件复用,编辑器就一层,是最底层,使用designer.getRootComponent()就可以获取到
//使用selection.getSelectedCreator()也应该是可以获取到的。
FormSelectionUtils.paste2Container(designer, designer.getRootComponent(),
CLIP_BOARD,
DELTA_X_Y,
DELTA_X_Y);
}
} else {
//获取到编辑器的表层容器(已选的组件的父容器就是表层容器)
parent = XCreatorUtils.getParentXLayoutContainer(selection.getSelectedCreator());
if (parent != null) {
Rectangle rec = selection.getSelctionBounds();
FormSelectionUtils.paste2Container(designer, parent, CLIP_BOARD, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y);
}
}
} else {
Toolkit.getDefaultToolkit().beep();
}
return false;
}
public FormSelection getSelection() {
return selection;
}
/** /**
* 删除当前所有选择的组件 * 删除当前所有选择的组件
*/ */
public void deleteSelection() { public void deleteSelection() {
XCreator[] roots = selection.getSelectedCreators(); XCreator[] roots = selection.getSelectedCreators();
if (roots.length > 0) { if (roots.length > 0) {
for (XCreator creator : roots) { for (XCreator creator : roots) {
if(creator.acceptType(XWParameterLayout.class)){ if (creator.acceptType(XWParameterLayout.class)) {
designer.removeParaComponent(); designer.removeParaComponent();
} }
removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight()); removeCreatorFromContainer(creator, creator.getWidth(), creator.getHeight());
creator.removeAll(); creator.removeAll();
// 清除被选中的组件 // 清除被选中的组件
selection.reset(); selection.reset();
} }
setSelectedCreator(designer.getRootComponent()); setSelectedCreator(designer.getRootComponent());
// 触发事件 // 触发事件
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED); designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_DELETED);
designer.repaint(); designer.repaint();
} }
} }
/** /**
* 从选择组件中删除某组件 * 从选择组件中删除某组件
* *
* @param creator 组件 * @param creator 组件
* @param creatorWidth 组件之前宽度 * @param creatorWidth 组件之前宽度
* @param creatorHeight 组件之前高度 * @param creatorHeight 组件之前高度
*/ */
public void removeCreator(XCreator creator, int creatorWidth, int creatorHeight) { public void removeCreator(XCreator creator, int creatorWidth, int creatorHeight) {
selection.removeCreator(creator); selection.removeCreator(creator);
removeCreatorFromContainer(creator, creatorWidth, creatorHeight); removeCreatorFromContainer(creator, creatorWidth, creatorHeight);
designer.repaint(); designer.repaint();
} }
/** /**
* 设置选择区域 * 设置选择区域
*/ */
public void setHotspotBounds(Rectangle rect) { public void setHotspotBounds(Rectangle rect) {
hotspot_bounds = rect; hotspot_bounds = rect;
} }
/** /**
* 获得当前选择区域 * 获得当前选择区域
*/ */
public Rectangle getHotspotBounds() { public Rectangle getHotspotBounds() {
return hotspot_bounds; return hotspot_bounds;
} }
private void removeCreatorFromContainer(XCreator creator, int creatorWidth, int creatorHeight) { private void removeCreatorFromContainer(XCreator creator, int creatorWidth, int creatorHeight) {
XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(creator); XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(creator);
if (parent == null) { if (parent == null) {
return; return;
} }
boolean changeCreator = creator.shouldScaleCreator() || creator.hasTitleStyle(); boolean changeCreator = creator.shouldScaleCreator() || creator.hasTitleStyle();
if (parent.acceptType(XWFitLayout.class) && changeCreator) { if (parent.acceptType(XWFitLayout.class) && changeCreator) {
creator = (XCreator) creator.getParent(); creator = (XCreator) creator.getParent();
} }
parent.getLayoutAdapter().removeBean(creator, creatorWidth, creatorHeight); parent.getLayoutAdapter().removeBean(creator, creatorWidth, creatorHeight);
// 删除其根组件,同时就删除了同时被选择的叶子组件 // 删除其根组件,同时就删除了同时被选择的叶子组件
parent.remove(creator); parent.remove(creator);
LayoutManager layout = parent.getLayout(); LayoutManager layout = parent.getLayout();
if (layout != null) { if (layout != null) {
// 刷新组件容器的布局 // 刷新组件容器的布局
LayoutUtils.layoutContainer(parent); LayoutUtils.layoutContainer(parent);
} }
} }
/** /**
* 是否有组件被选择如果所选组件是最底层容器也视为无选择 * 是否有组件被选择如果所选组件是最底层容器也视为无选择
* @return 是则返回true *
*/ * @return 是则返回true
public boolean hasSelectionComponent() { * yaoh.wu 不应该通过判断是否是最底层容器来判断是否选择了组件
return !selection.isEmpty() && selection.getSelectedCreator().getParent() != null; * 而是应该判断选择的容器是否是编辑器的最表层容器,也就是点击空白地方选择的容器
} * 但是直接判断选择的容器是否是编辑器最表层类型又会引发拖动时选不上的情况
* 因此通过判断父容器来实现
* <p>
* 举例frm组件复用 绝对布局情况下不选择时有三层容器
* 底层@see {@link com.fr.design.designer.creator.XWBorderLayout}
* 中层@see {@link XWFitLayout}
* 表层@see {@link com.fr.design.designer.creator.XWAbsoluteBodyLayout}
* <p>
* 但是编辑窗口的最外层其实是表层@see {@link com.fr.design.designer.creator.XWAbsoluteBodyLayout},
* 其他两层不是靠添加组件就可以编辑的
*/
public boolean hasSelectionComponent() {
if (designer.getClass().equals(FormDesigner.class)) {
//frm组件复用选择
return selection.getSelectedCreator() != null && !(selection.getSelectedCreator().getParent() instanceof
XWFitLayout);
} else {
//cpt本地组件复用
return selection.getSelectedCreator() != null && selection.getSelectedCreator().getParent() != null;
}
}
/** /**
* 移动组件至指定位置 * 移动组件至指定位置
* @param x 坐标x *
* @param y 坐标y * @param x 坐标x
*/ * @param y 坐标y
public void move(int x, int y) { */
for (XCreator creator : selection.getSelectedCreators()) { public void move(int x, int y) {
creator.setLocation(creator.getX() + x, creator.getY() + y); for (XCreator creator : selection.getSelectedCreators()) {
LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(designer, creator); creator.setLocation(creator.getX() + x, creator.getY() + y);
if (layoutAdapter != null) { LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(designer, creator);
layoutAdapter.fix(creator); if (layoutAdapter != null) {
} layoutAdapter.fix(creator);
} }
designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(), }
DesignerEvent.CREATOR_SELECTED); designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(),
} DesignerEvent.CREATOR_SELECTED);
}
/** /**
* 释放捕获 * 释放捕获
*/ */
public void releaseDragging() { public void releaseDragging() {
designer.setPainter(null); designer.setPainter(null);
selection.fixCreator(designer); selection.fixCreator(designer);
designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(), designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(),
DesignerEvent.CREATOR_RESIZED); DesignerEvent.CREATOR_RESIZED);
} }
public Direction getDirectionAt(MouseEvent e) { public Direction getDirectionAt(MouseEvent e) {
Direction dir; Direction dir;
if (e.isControlDown() || e.isShiftDown()) { if (e.isControlDown() || e.isShiftDown()) {
XCreator creator = designer.getComponentAt(e.getX(), e.getY(), selection.getSelectedCreators()); XCreator creator = designer.getComponentAt(e.getX(), e.getY(), selection.getSelectedCreators());
if (creator != designer.getRootComponent() && selection.addedable(creator)) { if (creator != designer.getRootComponent() && selection.addedable(creator)) {
return Location.add; return Location.add;
} }
} }
if (hasSelectionComponent()) { if (hasSelectionComponent()) {
int x = e.getX() + designer.getArea().getHorizontalValue(); int x = e.getX() + designer.getArea().getHorizontalValue();
int y = e.getY() + designer.getArea().getVerticalValue(); int y = e.getY() + designer.getArea().getVerticalValue();
dir = getDirection(selection.getRelativeBounds(), x, y); dir = getDirection(selection.getRelativeBounds(), x, y);
if (selection.size() == 1) { if (selection.size() == 1) {
if (!ArrayUtils.contains(selection.getSelectedCreator().getDirections(), dir.getActual())) { if (!ArrayUtils.contains(selection.getSelectedCreator().getDirections(), dir.getActual())) {
dir = Location.outer; dir = Location.outer;
} }
} }
} else { } else {
dir = Location.outer; dir = Location.outer;
} }
if (designer.getDesignerMode().isFormParameterEditor() && dir == Location.outer) { if (designer.getDesignerMode().isFormParameterEditor() && dir == Location.outer) {
dir = designer.getLoc2Root(e); dir = designer.getLoc2Root(e);
} }
return dir; return dir;
} }
private Direction getDirection(Rectangle bounds, int x, int y) { private Direction getDirection(Rectangle bounds, int x, int y) {
if (x < (bounds.x - XCreatorConstants.RESIZE_BOX_SIZ)) { if (x < (bounds.x - XCreatorConstants.RESIZE_BOX_SIZ)) {
return Location.outer; return Location.outer;
} else if ((x >= (bounds.x - XCreatorConstants.RESIZE_BOX_SIZ)) && (x <= bounds.x)) { } else if ((x >= (bounds.x - XCreatorConstants.RESIZE_BOX_SIZ)) && (x <= bounds.x)) {
if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) { if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) {
return Location.outer; return Location.outer;
} else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) { } else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) {
return Location.left_top; return Location.left_top;
} else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) { } else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) {
return Location.left; return Location.left;
} else if ((y >= (bounds.y + bounds.height)) } else if ((y >= (bounds.y + bounds.height))
&& (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) { && (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) {
return Location.left_bottom; return Location.left_bottom;
} else { } else {
return Location.outer; return Location.outer;
} }
} else if ((x > bounds.x) && (x < (bounds.x + bounds.width))) { } else if ((x > bounds.x) && (x < (bounds.x + bounds.width))) {
if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) { if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) {
return Location.outer; return Location.outer;
} else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) { } else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) {
return Location.top; return Location.top;
} else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) { } else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) {
return Location.inner; return Location.inner;
} else if ((y >= (bounds.y + bounds.height)) } else if ((y >= (bounds.y + bounds.height))
&& (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) { && (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) {
return Location.bottom; return Location.bottom;
} else { } else {
return Location.outer; return Location.outer;
} }
} else if ((x >= (bounds.x + bounds.width)) } else if ((x >= (bounds.x + bounds.width))
&& (x <= (bounds.x + bounds.width + XCreatorConstants.RESIZE_BOX_SIZ))) { && (x <= (bounds.x + bounds.width + XCreatorConstants.RESIZE_BOX_SIZ))) {
if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) { if (y < (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) {
return Location.outer; return Location.outer;
} else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) { } else if ((y >= (bounds.y - XCreatorConstants.RESIZE_BOX_SIZ)) && (y <= bounds.y)) {
return Location.right_top; return Location.right_top;
} else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) { } else if ((y > bounds.y) && (y < (bounds.y + bounds.height))) {
return Location.right; return Location.right;
} else if ((y >= (bounds.y + bounds.height)) } else if ((y >= (bounds.y + bounds.height))
&& (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) { && (y <= (bounds.y + bounds.height + XCreatorConstants.RESIZE_BOX_SIZ))) {
return Location.right_bottom; return Location.right_bottom;
} else { } else {
return Location.outer; return Location.outer;
} }
} else { } else {
return Location.outer; return Location.outer;
} }
} }
private void fireCreatorSelected() { private void fireCreatorSelected() {
designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(), designer.getEditListenerTable().fireCreatorModified(selection.getSelectedCreator(),
DesignerEvent.CREATOR_SELECTED); DesignerEvent.CREATOR_SELECTED);
} }
public void setSelectedCreator(XCreator rootComponent) { public void setSelectedCreator(XCreator rootComponent) {
selection.setSelectedCreator(rootComponent); selection.setSelectedCreator(rootComponent);
fireCreatorSelected(); fireCreatorSelected();
} }
public void setSelectedCreators(ArrayList<XCreator> rebuildSelection) { public void setSelectedCreators(ArrayList<XCreator> rebuildSelection) {
selection.setSelectedCreators(rebuildSelection); selection.setSelectedCreators(rebuildSelection);
fireCreatorSelected(); fireCreatorSelected();
} }
} }

1242
designer_form/src/com/fr/design/form/parameter/FormParaDesigner.java

File diff suppressed because it is too large Load Diff

2
designer_form/src/com/fr/design/mainframe/EditingMouseListener.java

@ -202,7 +202,7 @@ public class EditingMouseListener extends MouseInputAdapter {
XCreator selectionXCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator selectionXCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
if(selectionXCreator != null){ if(selectionXCreator != null){
selectionXCreator.setBounds(dragBackupBounds.x, dragBackupBounds.y, dragBackupBounds.width, dragBackupBounds.height); selectionXCreator.setBounds(dragBackupBounds.x, dragBackupBounds.y, dragBackupBounds.width, dragBackupBounds.height);
MoveUtils.hideForbidWindow(); // MoveUtils.hideForbidWindow();
} }
} }
dragBackupBounds = null; dragBackupBounds = null;

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

@ -6,7 +6,10 @@ import com.fr.design.DesignState;
import com.fr.design.designer.TargetComponent; import com.fr.design.designer.TargetComponent;
import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.Painter; import com.fr.design.designer.beans.Painter;
import com.fr.design.designer.beans.actions.CopyAction;
import com.fr.design.designer.beans.actions.CutAction;
import com.fr.design.designer.beans.actions.FormDeleteAction; import com.fr.design.designer.beans.actions.FormDeleteAction;
import com.fr.design.designer.beans.actions.PasteAction;
import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter; import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter;
import com.fr.design.designer.beans.events.CreatorEventListenerTable; import com.fr.design.designer.beans.events.CreatorEventListenerTable;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
@ -65,7 +68,7 @@ import java.util.List;
/** /**
* 设计界面组件该组件是界面设计工具的核心主要负责的是被设计界面的显示界面设计操作状态的 显示编辑状态的显示等等 * 设计界面组件该组件是界面设计工具的核心主要负责的是被设计界面的显示界面设计操作状态的 显示编辑状态的显示等等
*/ */
public class FormDesigner extends TargetComponent<Form> implements TreeSelectionListener, InvocationHandler, BaseFormDesigner ,ParaDefinitePane{ public class FormDesigner extends TargetComponent<Form> implements TreeSelectionListener, InvocationHandler, BaseFormDesigner, ParaDefinitePane {
protected static final ArrayList<String> NAME_ARRAY_LIST = new ArrayList<String>( protected static final ArrayList<String> NAME_ARRAY_LIST = new ArrayList<String>(
Arrays.asList(new String[]{Inter.getLocText("M_Edit-Cut"), Inter.getLocText("M_Edit-Copy"), Inter.getLocText("M_Edit-Delete")}) Arrays.asList(new String[]{Inter.getLocText("M_Edit-Cut"), Inter.getLocText("M_Edit-Copy"), Inter.getLocText("M_Edit-Delete")})
); );
@ -159,7 +162,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
ParameterPropertyPane.getInstance().populateBean(this); ParameterPropertyPane.getInstance().populateBean(this);
} }
public Parameter[] getNoRepeatParas(Parameter[] paras){ public Parameter[] getNoRepeatParas(Parameter[] paras) {
List<Parameter> paraList = new ArrayList<Parameter>(); List<Parameter> paraList = new ArrayList<Parameter>();
java.util.Set set = new java.util.HashSet(); java.util.Set set = new java.util.HashSet();
for (Parameter p : paras) { for (Parameter p : paras) {
@ -171,23 +174,23 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return paraList.toArray(new Parameter[paraList.size()]); return paraList.toArray(new Parameter[paraList.size()]);
} }
public void setParameterArray(Parameter[] ps){ public void setParameterArray(Parameter[] ps) {
parameterArray = ps; parameterArray = ps;
} }
public Parameter[] getParameterArray(){ public Parameter[] getParameterArray() {
return parameterArray; return parameterArray;
} }
/** /**
* 刷新参数 * 刷新参数
*/ */
public void refreshParameter(){ public void refreshParameter() {
XLayoutContainer rootContainer = this.getParaComponent(); XLayoutContainer rootContainer = this.getParaComponent();
if (rootContainer != null){ if (rootContainer != null) {
java.util.List<String> namelist = new ArrayList<String>(); java.util.List<String> namelist = new ArrayList<String>();
rootContainer.getAllXCreatorNameList(rootContainer,namelist); rootContainer.getAllXCreatorNameList(rootContainer, namelist);
// parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名 // parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名
// 与已有的参数列表比较 如果已经存在 就除去 // 与已有的参数列表比较 如果已经存在 就除去
Parameter[] ps = getParameterArray(); Parameter[] ps = getParameterArray();
@ -201,7 +204,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height); EastRegionContainerPane.getInstance().setParameterHeight(ParameterPropertyPane.getInstance(this).getPreferredSize().height);
} }
private void removeSame(Parameter[] parameters, List<String> namelist){ private void removeSame(Parameter[] parameters, List<String> namelist) {
for (Parameter parameter : parameters) { for (Parameter parameter : parameters) {
for (String name : namelist) { for (String name : namelist) {
if (name.equalsIgnoreCase(parameter.getName())) { if (name.equalsIgnoreCase(parameter.getName())) {
@ -214,20 +217,22 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否有查询按钮 * 是否有查询按钮
* @return 有无查询按钮 *
* @return 有无查询按钮
*/ */
public boolean isWithQueryButton(){ public boolean isWithQueryButton() {
XLayoutContainer rootContainer = this.getParaComponent(); XLayoutContainer rootContainer = this.getParaComponent();
return rootContainer != null && rootContainer.SearchQueryCreators(rootContainer); return rootContainer != null && rootContainer.SearchQueryCreators(rootContainer);
} }
/** /**
* 加入参数到参数面板 * 加入参数到参数面板
*
* @param parameter 参数 * @param parameter 参数
* @return 是否加入 * @return 是否加入
*/ */
public void addingParameter2Editor(Parameter parameter){ public void addingParameter2Editor(Parameter parameter) {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -242,11 +247,11 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
if (!(this.autoAddComponent(xLabel, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) if (!(this.autoAddComponent(xLabel, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE)
+ FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE) if (!(this.autoAddComponent(xCreator, H_COMPONENT_GAP * (currentIndex % NUM_IN_A_LINE)
+ SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) { + SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
currentIndex++; currentIndex++;
parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter); parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter);
@ -256,11 +261,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 加入参数到参数面板有查询按钮 * 加入参数到参数面板有查询按钮
*
* @param parameter 参数 * @param parameter 参数
* @return 是否加入 * @return 是否加入
*/ */
public void addingParameter2EditorWithQueryButton(Parameter parameter){ public void addingParameter2EditorWithQueryButton(Parameter parameter) {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -276,12 +282,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
if (!(this.autoAddComponent(xLabel, FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xLabel, FIRST_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
if (!(this.autoAddComponent(xCreator, SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xCreator, SECOND_H_LOCATION, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
FormSubmitButton formSubmitButton = new FormSubmitButton(); FormSubmitButton formSubmitButton = new FormSubmitButton();
formSubmitButton.setWidgetName("Search"); formSubmitButton.setWidgetName("Search");
@ -289,7 +295,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
xCreator = XCreatorUtils.createXCreator(formSubmitButton); xCreator = XCreatorUtils.createXCreator(formSubmitButton);
if (!(this.autoAddComponent(xCreator, 270, FIRST_V_LOCATION + V_COMPONENT_GAP if (!(this.autoAddComponent(xCreator, 270, FIRST_V_LOCATION + V_COMPONENT_GAP
* (currentIndex / NUM_IN_A_LINE)))) { * (currentIndex / NUM_IN_A_LINE)))) {
return ; return;
} }
currentIndex = currentIndex + NUM_IN_A_LINE - currentIndex % NUM_IN_A_LINE; currentIndex = currentIndex + NUM_IN_A_LINE - currentIndex % NUM_IN_A_LINE;
parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter); parameterArray = (Parameter[]) ArrayUtils.removeElement(parameterArray, parameter);
@ -300,8 +306,8 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 一键添加所有参数 * 一键添加所有参数
*/ */
public void addingAllParameter2Editor(){ public void addingAllParameter2Editor() {
if(getParaComponent() == null){ if (getParaComponent() == null) {
addParaPaneTooltips(); addParaPaneTooltips();
return; return;
} }
@ -350,16 +356,17 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
EastRegionContainerPane.getInstance().refreshDownPane(); EastRegionContainerPane.getInstance().refreshDownPane();
} }
private void addParaPaneTooltips(){ private void addParaPaneTooltips() {
JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(),Inter.getLocText("FR-Designer-Form-Please_Drag_ParaPane"), JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer-Form-Please_Drag_ParaPane"),
Inter.getLocText("FR-Designer_Tooltips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE); Inter.getLocText("FR-Designer_Tooltips"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);
} }
/** /**
* 自动添加组件 * 自动添加组件
* @param xCreator 组件 *
* @param x 横坐标 * @param xCreator 组件
* @param y 纵坐标 * @param x 横坐标
* @param y 纵坐标
* @return 是否添加成功 * @return 是否添加成功
*/ */
public boolean autoAddComponent(XCreator xCreator, int x, int y) { public boolean autoAddComponent(XCreator xCreator, int x, int y) {
@ -375,10 +382,11 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 在参数很多时全部添加的时候可以向下一次排版若去掉就会在参数面板堆到一起 * 在参数很多时全部添加的时候可以向下一次排版若去掉就会在参数面板堆到一起
*
* @param creator 组件 * @param creator 组件
* @param x 长度 * @param x 长度
* @param y 长度 * @param y 长度
* @param layout 布局 * @param layout 布局
* @return 是否扩展 * @return 是否扩展
*/ */
public boolean prepareForAdd(XCreator creator, int x, int y, XWParameterLayout layout) { public boolean prepareForAdd(XCreator creator, int x, int y, XWParameterLayout layout) {
@ -404,9 +412,9 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 加入参数面板 * 加入参数面板
*/ */
public void addParaComponent(){ public void addParaComponent() {
if (paraComponent != null) { if (paraComponent != null) {
return ; return;
} }
paraHeight = WBorderLayout.DEFAULT_SIZE; paraHeight = WBorderLayout.DEFAULT_SIZE;
paraComponent = new XWParameterLayout(); paraComponent = new XWParameterLayout();
@ -414,7 +422,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
paraComponent.setSize(paraComponent.initEditorSize()); paraComponent.setSize(paraComponent.initEditorSize());
XWBorderLayout formLayoutContainer = (XWBorderLayout) rootComponent.getParent(); XWBorderLayout formLayoutContainer = (XWBorderLayout) rootComponent.getParent();
formLayoutContainer.toData().setNorthSize(paraHeight); formLayoutContainer.toData().setNorthSize(paraHeight);
formLayoutContainer.add(paraComponent,WBorderLayout.NORTH); formLayoutContainer.add(paraComponent, WBorderLayout.NORTH);
//设下northSize,增加para后,重置border大小,这时候para和root的大小会自适应调整 //设下northSize,增加para后,重置border大小,这时候para和root的大小会自适应调整
formLayoutContainer.setSize(formLayoutContainer.getWidth(), formLayoutContainer.getHeight() + paraHeight); formLayoutContainer.setSize(formLayoutContainer.getWidth(), formLayoutContainer.getHeight() + paraHeight);
selectionModel.reset(); selectionModel.reset();
@ -424,30 +432,33 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 返回根节点父容器 * 返回根节点父容器
* @return 父容器 *
* @return 父容器
*/ */
public Component getTopContainer(){ public Component getTopContainer() {
if(rootComponent != null){ if (rootComponent != null) {
// 返回root所在的父容器,非designer // 返回root所在的父容器,非designer
return LayoutUtils.getTopContainer(rootComponent); return LayoutUtils.getTopContainer(rootComponent);
} }
return XCreatorUtils.createXCreator(this.getTarget().getContainer()); return XCreatorUtils.createXCreator(this.getTarget().getContainer());
} }
/** /**
* 返回参数界面高度 * 返回参数界面高度
* @return para高度 *
* @return para高度
*/ */
public int getParaHeight(){ public int getParaHeight() {
return paraHeight; return paraHeight;
} }
/** /**
* 重置para的高度 * 重置para的高度
* @param height 高度 *
* @param height 高度
*/ */
public void setParaHeight(int height){ public void setParaHeight(int height) {
XWBorderLayout container = (XWBorderLayout) getTopContainer(); XWBorderLayout container = (XWBorderLayout) getTopContainer();
container.toData().setNorthSize(height); container.toData().setNorthSize(height);
container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight()); container.setSize(container.getWidth(), container.getHeight() + height - getParaHeight());
@ -457,7 +468,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 删除参数界面 * 删除参数界面
*/ */
public void removeParaComponent(){ public void removeParaComponent() {
XWBorderLayout formLayoutContainer = (XWBorderLayout) getTopContainer(); XWBorderLayout formLayoutContainer = (XWBorderLayout) getTopContainer();
formLayoutContainer.toData().removeWidget(paraComponent.toData()); formLayoutContainer.toData().removeWidget(paraComponent.toData());
paraHeight = 0; paraHeight = 0;
@ -472,41 +483,42 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 切换 * 切换
* @param elementCaseContainer 容器 *
* @param elementCaseContainer 容器
*/ */
public void switchTab(FormElementCaseContainerProvider elementCaseContainer){ public void switchTab(FormElementCaseContainerProvider elementCaseContainer) {
if(this.switchAction == null){ if (this.switchAction == null) {
return; return;
} }
this.elementCaseContainer = elementCaseContainer; this.elementCaseContainer = elementCaseContainer;
this.switchAction.actionPerformed(null); this.switchAction.actionPerformed(null);
} }
public void setElementCaseContainer(FormElementCaseContainerProvider elementCaseContainer){ public void setElementCaseContainer(FormElementCaseContainerProvider elementCaseContainer) {
this.elementCaseContainer = elementCaseContainer; this.elementCaseContainer = elementCaseContainer;
} }
public FormElementCaseProvider getElementCase(){ public FormElementCaseProvider getElementCase() {
return this.elementCaseContainer.getElementCase(); return this.elementCaseContainer.getElementCase();
} }
public String getElementCaseContainerName(){ public String getElementCaseContainerName() {
return this.elementCaseContainer.getElementCaseContainerName(); return this.elementCaseContainer.getElementCaseContainerName();
} }
public void setElementCase(FormElementCaseProvider elementCase){ public void setElementCase(FormElementCaseProvider elementCase) {
this.elementCaseContainer.setElementCase(elementCase); this.elementCaseContainer.setElementCase(elementCase);
} }
public void setElementCaseBackground(BufferedImage image){ public void setElementCaseBackground(BufferedImage image) {
this.elementCaseContainer.setBackground(image); this.elementCaseContainer.setBackground(image);
} }
public Dimension getElementCaseContainerSize(){ public Dimension getElementCaseContainerSize() {
return this.elementCaseContainer.getSize(); return this.elementCaseContainer.getSize();
} }
public FormElementCaseContainerProvider getElementCaseContainer(){ public FormElementCaseContainerProvider getElementCaseContainer() {
return this.elementCaseContainer; return this.elementCaseContainer;
} }
@ -524,6 +536,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 增加监听事件 * 增加监听事件
*
* @param listener 界面组件编辑事件 * @param listener 界面组件编辑事件
*/ */
public void addDesignerEditListener(DesignerEditListener listener) { public void addDesignerEditListener(DesignerEditListener listener) {
@ -539,15 +552,15 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 表单则判断参数面板是否为绝对布局 * 表单则判断参数面板是否为绝对布局
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean hasWAbsoluteLayout() { public boolean hasWAbsoluteLayout() {
if (paraComponent != null && paraComponent.acceptType(XWParameterLayout.class)){ if (paraComponent != null && paraComponent.acceptType(XWParameterLayout.class)) {
return true; return true;
} } else {
else{
if (this.getSelectionModel().getSelection().getSelectedCreator().getParent() != null if (this.getSelectionModel().getSelection().getSelectedCreator().getParent() != null
&& ((XLayoutContainer)this.getSelectionModel().getSelection().getSelectedCreator().getParent()).acceptType(XWAbsoluteLayout.class)){ && ((XLayoutContainer) this.getSelectionModel().getSelection().getSelectedCreator().getParent()).acceptType(XWAbsoluteLayout.class)) {
return true; return true;
} }
} }
@ -555,7 +568,8 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 设置是否为报表块编辑 * 设置是否为报表块编辑
*
* @param isEditing 是否为报表块编辑 * @param isEditing 是否为报表块编辑
*/ */
public void setReportBlockEditing(boolean isEditing) { public void setReportBlockEditing(boolean isEditing) {
@ -564,25 +578,27 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否为报表块编辑 * 是否为报表块编辑
*
* @return 是否为报表块编辑 * @return 是否为报表块编辑
*/ */
public boolean isReportBlockEditing() { public boolean isReportBlockEditing() {
return this.isReportBlockEditing; return this.isReportBlockEditing;
} }
public void setWidgetsIntersect(boolean isWidgetsIntersect){ public void setWidgetsIntersect(boolean isWidgetsIntersect) {
this.isWidgetsIntersect = isWidgetsIntersect; this.isWidgetsIntersect = isWidgetsIntersect;
} }
public boolean isWidgetsIntersect(){ public boolean isWidgetsIntersect() {
return this.isWidgetsIntersect; return this.isWidgetsIntersect;
} }
/** /**
* 是否重命名控件 * 是否重命名控件
*
* @param creator 组件 * @param creator 组件
* @param newName 新的组件名 * @param newName 新的组件名
* @return 组件名有变化且不和其他一样返回true * @return 组件名有变化且不和其他一样返回true
*/ */
public boolean renameCreator(XCreator creator, String newName) { public boolean renameCreator(XCreator creator, String newName) {
if (ComparatorUtils.equals(creator.toData().getWidgetName(), newName)) { if (ComparatorUtils.equals(creator.toData().getWidgetName(), newName)) {
@ -609,16 +625,17 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 更新界面布局重绘 * 更新界面布局重绘
* @param proxy 动态代理类 *
* @param proxy 动态代理类
* @param method 接口方法 * @param method 接口方法
* @param args 参数 * @param args 参数
* @return 不返回任何对象 * @return 不返回任何对象
*/ */
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(rootComponent != null){ if (rootComponent != null) {
LayoutUtils.layoutRootContainer(rootComponent); LayoutUtils.layoutRootContainer(rootComponent);
} }
if(paraComponent != null){ if (paraComponent != null) {
LayoutUtils.layoutRootContainer(paraComponent); LayoutUtils.layoutRootContainer(paraComponent);
} }
repaint(); repaint();
@ -654,6 +671,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 增加组件事件 * 增加组件事件
*
* @param h 动态代理 * @param h 动态代理
*/ */
public void addInvocationHandler(InvocationHandler h) { public void addInvocationHandler(InvocationHandler h) {
@ -678,7 +696,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 设置其UI类为DesignerUI负责渲染 * 设置其UI类为DesignerUI负责渲染
*/ */
@Override @Override
public void updateUI() { public void updateUI() {
@ -741,6 +759,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 更新边框线状态 * 更新边框线状态
*
* @param e 鼠标事件 * @param e 鼠标事件
*/ */
public void updateDrawLineMode(MouseEvent e) { public void updateDrawLineMode(MouseEvent e) {
@ -761,7 +780,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
// 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取 // 撤销恢复操作都会refreshRoot,这时候的target.getContainer里的widget会和之前不一样,所以不用root判断来取
XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer()); XLayoutContainer formLayoutContainer = (XLayoutContainer) XCreatorUtils.createXCreator(this.getTarget().getContainer());
// 布局默认都是1,底层的border改为0,不然没意义 // 布局默认都是1,底层的border改为0,不然没意义
this.getTarget().getContainer().setMargin(new PaddingMargin(0,0,0,0)); this.getTarget().getContainer().setMargin(new PaddingMargin(0, 0, 0, 0));
formLayoutContainer.setBorder(null); formLayoutContainer.setBorder(null);
if (formLayoutContainer.acceptType(XWBorderLayout.class)) { if (formLayoutContainer.acceptType(XWBorderLayout.class)) {
WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData(); WBorderLayout borderLayout = (WBorderLayout) formLayoutContainer.toData();
@ -774,7 +793,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
refreshNorth(northWidget, formLayoutContainer); refreshNorth(northWidget, formLayoutContainer);
refreshCenter(centerWidget, formLayoutContainer); refreshCenter(centerWidget, formLayoutContainer);
} else { } else {
formLayoutContainer.setSize(LARGE_PREFERRED_SIZE); formLayoutContainer.setSize(LARGE_PREFERRED_SIZE);
setRootComponent(formLayoutContainer); setRootComponent(formLayoutContainer);
} }
@ -790,9 +809,9 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget); XLayoutContainer northContainer = (XLayoutContainer) XCreatorUtils.createXCreator(northWidget);
paraHeight = ((XWBorderLayout)formLayoutContainer).toData().getNorthSize(); paraHeight = ((XWBorderLayout) formLayoutContainer).toData().getNorthSize();
paraComponent = northContainer; paraComponent = northContainer;
northContainer.setSize(0,paraHeight); northContainer.setSize(0, paraHeight);
formLayoutContainer.add(northContainer, WBorderLayout.NORTH); formLayoutContainer.add(northContainer, WBorderLayout.NORTH);
} }
@ -841,14 +860,16 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否是报表的参数面板 * 是否是报表的参数面板
* @return (表单的) *
* @return (表单的)
*/ */
public boolean isFormParaDesigner(){ public boolean isFormParaDesigner() {
return false; return false;
} }
/** /**
* 是否为底层容器 * 是否为底层容器
*
* @param comp 组件 * @param comp 组件
* @return 是则返回true * @return 是则返回true
*/ */
@ -923,10 +944,10 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
public SelectionModel getSelectionModel() { public SelectionModel getSelectionModel() {
if (paraComponent!=null){ if (paraComponent != null) {
paraComponent.setSize(paraComponent.getWidth(),getParaHeight()); paraComponent.setSize(paraComponent.getWidth(), getParaHeight());
Rectangle rec = rootComponent.getBounds(); Rectangle rec = rootComponent.getBounds();
rootComponent.setBounds(rec.x,getParaHeight(),rec.width,rec.height); rootComponent.setBounds(rec.x, getParaHeight(), rec.width, rec.height);
} }
return selectionModel; return selectionModel;
} }
@ -941,6 +962,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 拖拽准备 * 拖拽准备
*
* @param xCreator 组件 * @param xCreator 组件
*/ */
public void startDraggingBean(XCreator xCreator) { public void startDraggingBean(XCreator xCreator) {
@ -953,11 +975,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 拖拽时相关处理 * 拖拽时相关处理
* @param xCreator 组件 *
* @param xCreator 组件
* @param lastPressEvent 鼠标事件 * @param lastPressEvent 鼠标事件
* @param x 坐标x * @param x 坐标x
* @param y 坐标y * @param y 坐标y
*/ */
public void startDraggingComponent(XCreator xCreator, MouseEvent lastPressEvent, int x, int y) { public void startDraggingComponent(XCreator xCreator, MouseEvent lastPressEvent, int x, int y) {
// 根据所选择的组件的BeanInfo生成相应的AddingModel // 根据所选择的组件的BeanInfo生成相应的AddingModel
@ -978,6 +1001,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 改变组件值 * 改变组件值
*
* @param e 组件选择事件 * @param e 组件选择事件
*/ */
@Override @Override
@ -1024,6 +1048,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 是否支持权限编辑 * 是否支持权限编辑
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isSupportAuthority() { public boolean isSupportAuthority() {
@ -1048,7 +1073,8 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 是否含有action名 * 是否含有action名
*
* @param name action名 * @param name action名
* @return 有则返回true * @return 有则返回true
*/ */
@ -1058,6 +1084,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 显示组件 * 显示组件
*
* @param comp 组件 * @param comp 组件
*/ */
public void makeVisible(XCreator comp) { public void makeVisible(XCreator comp) {
@ -1088,14 +1115,14 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回复制粘贴删除等动作 * 返回复制粘贴删除等动作
* 鼠标右键菜单
*
* @return 同上 * @return 同上
*/ */
public Action[] getActions() { public Action[] getActions() {
if (designer_actions == null) { if (designer_actions == null) {
//先把复制粘贴按钮去掉,只留下删除 designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
// designer_actions = new Action[]{new CutAction(this), new CopyAction(this), new PasteAction(this), new FormDeleteAction(this)};
// new FormDeleteAction(this)};
designer_actions = new Action[]{new FormDeleteAction(this)};
} }
return designer_actions; return designer_actions;
} }
@ -1120,6 +1147,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回表单区域 * 返回表单区域
*
* @return 表单区域 * @return 表单区域
*/ */
public FormArea getArea() { public FormArea getArea() {
@ -1128,6 +1156,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 设置上层区域 * 设置上层区域
*
* @param formArea 表单区域 * @param formArea 表单区域
*/ */
public void setParent(FormArea formArea) { public void setParent(FormArea formArea) {
@ -1136,14 +1165,15 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 绘制组件根节点 * 绘制组件根节点
*
* @param clipg 图形 * @param clipg 图形
*/ */
public void paintContent(Graphics clipg) { public void paintContent(Graphics clipg) {
rootComponent.paint(clipg); rootComponent.paint(clipg);
} }
public void paintPara(Graphics clipg){ public void paintPara(Graphics clipg) {
if(paraComponent != null){ if (paraComponent != null) {
paraComponent.paint(clipg); paraComponent.paint(clipg);
} }
} }
@ -1157,6 +1187,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回连线类 * 返回连线类
*
* @return ConnectorHelper类 * @return ConnectorHelper类
*/ */
public ConnectorHelper getDrawLineHelper() { public ConnectorHelper getDrawLineHelper() {
@ -1164,7 +1195,8 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
} }
/** /**
* 是否画线模式 * 是否画线模式
*
* @return 是则返回true * @return 是则返回true
*/ */
public boolean isDrawLineMode() { public boolean isDrawLineMode() {
@ -1173,6 +1205,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 设置DrawLineMode * 设置DrawLineMode
*
* @param mode 是or或 * @param mode 是or或
*/ */
public void setDrawLineMode(boolean mode) { public void setDrawLineMode(boolean mode) {
@ -1199,6 +1232,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回表单控件权限编辑pane * 返回表单控件权限编辑pane
*
* @return 同上 * @return 同上
*/ */
public AuthorityEditPane createAuthorityEditPane() { public AuthorityEditPane createAuthorityEditPane() {
@ -1249,6 +1283,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 粘贴 * 粘贴
*
* @return * @return
*/ */
@Override @Override
@ -1259,6 +1294,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 剪切 * 剪切
*
* @return * @return
*/ */
@Override @Override
@ -1273,6 +1309,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 工具栏菜单 * 工具栏菜单
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1286,6 +1323,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 模版菜单 * 模版菜单
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1295,6 +1333,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 权限菜单 * 权限菜单
*
* @return 同上 * @return 同上
*/ */
public ShortCut[] shortCuts4Authority() { public ShortCut[] shortCuts4Authority() {
@ -1304,6 +1343,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回ToolBarDef * 返回ToolBarDef
*
* @return 同上 * @return 同上
*/ */
@Override @Override
@ -1313,10 +1353,12 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
/** /**
* 返回工具栏按钮组件 * 返回工具栏按钮组件
*
* @return 同上 * @return 同上
*/ */
public JComponent[] toolBarButton4Form() { public JComponent[] toolBarButton4Form() {
return new JComponent[0]; return new JComponent[]{new CutAction(this).createToolBarComponent(), new CopyAction(this).createToolBarComponent(), new PasteAction(this).createToolBarComponent(),
new FormDeleteAction(this).createToolBarComponent()};
} }

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

@ -1,13 +1,13 @@
package com.fr.design.mainframe; package com.fr.design.mainframe;
import java.awt.Component; import java.awt.*;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import com.fr.base.FRContext; import com.fr.base.FRContext;
import com.fr.design.designer.beans.adapters.layout.AbstractLayoutAdapter;
import com.fr.form.ui.container.WLayout;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.design.designer.beans.LayoutAdapter; import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
@ -15,112 +15,199 @@ import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.form.main.ClonedWidgetCreator;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
public class FormSelectionUtils { public class FormSelectionUtils {
public static void paste2Container(FormDesigner designer, XLayoutContainer parent, FormSelection selection, int x, //组件复制时坐标偏移
int y) { private static final int DELAY_X = 20;
LayoutAdapter adapter = parent.getLayoutAdapter(); private static final int DELAY_Y = 20;
if (selection.size() == 1) {
try { //组件复制时是否已经向左上偏移
XCreator creator = selection.getSelectedCreator(); private static boolean BACK_OFFSET = false;
Widget cloned = new ClonedWidgetCreator(designer.getTarget()).clonedWidgetWithNoRepeatName(creator
.toData()); //组件重命名后缀
XCreator clondCreator = XCreatorUtils.createXCreator(cloned, creator.getSize()); private static final String postfix = "_c";
if (adapter.addBean(clondCreator, x + clondCreator.getWidth() / 2, y + clondCreator.getHeight() / 2)) {
designer.getSelectionModel().getSelection().setSelectedCreator(clondCreator); /**
designer.getEditListenerTable().fireCreatorModified(clondCreator, DesignerEvent.CREATOR_PASTED); * @param designer 编辑器
return; * @param parent 粘贴依据的组件
} * @param clipBoard 剪贴板内容
} catch (CloneNotSupportedException e) { * @param x x
FRContext.getLogger().error(e.getMessage(), e); * @param y y
} */
} else if (selection.size() > 1) { public static void paste2Container(FormDesigner designer, XLayoutContainer parent, FormSelection clipBoard, int x,
if (parent instanceof XWAbsoluteLayout) { int y) {
designer.getSelectionModel().getSelection().reset(); LayoutAdapter adapter = parent.getLayoutAdapter();
Rectangle rec = selection.getSelctionBounds(); if (parent instanceof XWAbsoluteLayout) {
for (XCreator creator : selection.getSelectedCreators()) { designer.getSelectionModel().getSelection().reset();
try { Rectangle rec = clipBoard.getSelctionBounds();
Widget cloned = new ClonedWidgetCreator(designer.getTarget()) for (XCreator creator : clipBoard.getSelectedCreators()) {
.clonedWidgetWithNoRepeatName(creator.toData()); try {
XCreator clondCreator = XCreatorUtils.createXCreator(cloned, creator.getSize()); Widget copied = copyWidget(designer, creator.toData());
// 设置位置,移动20x20,防止被粘帖的组件重叠,照顾表单布局情况下 XCreator copiedCreator = XCreatorUtils.createXCreator(copied, creator.getSize());
adapter.addBean(clondCreator, x + creator.getX() - rec.x + clondCreator.getWidth() / 2, y // 获取位置
+ creator.getY() - rec.y + clondCreator.getHeight() / 2); Point point = getPasteLocation((AbstractLayoutAdapter) adapter,
designer.getSelectionModel().getSelection().addSelectedCreator(clondCreator); copiedCreator,
} catch (CloneNotSupportedException e) { x + creator.getX() - rec.x + copiedCreator.getWidth() / 2,
FRContext.getLogger().error(e.getMessage(), e); y + creator.getY() - rec.y + copiedCreator.getHeight() / 2);
} boolean addSuccess = adapter.addBean(copiedCreator, point.x, point.y);
}
designer.getEditListenerTable().fireCreatorModified( if (addSuccess) {
designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_PASTED); designer.getSelectionModel().getSelection().addSelectedCreator(copiedCreator);
return; }
}
} } catch (CloneNotSupportedException e) {
Toolkit.getDefaultToolkit().beep(); FRContext.getLogger().error(e.getMessage(), e);
} }
}
public static void rebuildSelection(FormDesigner designer) { rebuildSelection(designer);
ArrayList<XCreator> newSelection = new ArrayList<XCreator>(); designer.getEditListenerTable().fireCreatorModified(
List<Widget> widgetList = new ArrayList<Widget>(); designer.getSelectionModel().getSelection().getSelectedCreator(), DesignerEvent.CREATOR_PASTED);
for (XCreator comp : designer.getSelectionModel().getSelection().getSelectedCreators()) { return;
widgetList.add(comp.toData()); }
} Toolkit.getDefaultToolkit().beep();
designer.getSelectionModel().setSelectedCreators( }
rebuildSelection(designer.getRootComponent(), widgetList, newSelection));
} /**
* 组件复用绝对布局获取粘贴组件位置
public static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, Widget[] selectWidgets) { *
List<Widget> selectionWidget = new ArrayList<Widget>(); * @param layoutAdapter 绝对布局容器AbstractLayoutAdapter
if(selectWidgets != null){ * @param copiedCreator 复制的组件
selectionWidget.addAll(Arrays.asList(selectWidgets)); * @param x x=组件x + clonedCreator.getWidth() / 2
} * @param y y=组件y + clonedCreator.getHeight() / 2
return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<XCreator>()); * 除2的步骤会导致当宽度或者高度为奇数是中心点向左上各偏移一个像素
} * 由于中心点向左上各偏移一个像素依赖中心点计算的右下点就会相应的想做上偏移一个像素导致结果不准确
* @return 新位置坐标
private static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, List<Widget> selectionWidget, */
ArrayList<XCreator> newSelection) { private static Point getPasteLocation(AbstractLayoutAdapter layoutAdapter, XCreator copiedCreator, int x, int y) {
FormSelectionUtils._rebuild(rootComponent, selectionWidget, newSelection); //当宽度为奇数时 设置偏移
if (newSelection.isEmpty()) { int x_offset = (copiedCreator.getWidth() & 1) == 1 ? 1 : 0;
newSelection.add(rootComponent); //当高度为奇数时 设置偏移
} int y_offset = (copiedCreator.getHeight() & 1) == 1 ? 1 : 0;
return newSelection;
} if (!layoutAdapter.accept(copiedCreator, x, y)) {
XLayoutContainer container = layoutAdapter.getContainer();
private static void _rebuild(XCreator root, List<Widget> selectionWidget, List<XCreator> newSelection) { boolean xOut = x < 0 || x + copiedCreator.getWidth() / 2 + x_offset > container.getWidth();
if (selectionWidget.isEmpty()) { boolean yOut = y < 0 || y + copiedCreator.getHeight() / 2 + y_offset > container.getHeight();
return; /*
} * 组件原始位置位于布局的右下角
for (Widget x : selectionWidget) { * 和布局右下边界线紧挨
if (ComparatorUtils.equals(x, root.toData())) { * 粘贴时组件在原始位置向左错开20像素
if (!newSelection.contains(root)) { * x,y同时越界
newSelection.add(root); */
selectionWidget.remove(x); if (xOut && yOut) {
} x = BACK_OFFSET ? container.getWidth() - copiedCreator.getWidth() / 2 - x_offset
break; : container.getWidth() - copiedCreator.getWidth() / 2 - DELAY_X - x_offset;
} y = BACK_OFFSET ?
} container.getHeight() - copiedCreator.getHeight() / 2 - y_offset
: container.getHeight() - copiedCreator.getHeight() / 2 - DELAY_Y - y_offset;
int count = root.getComponentCount(); BACK_OFFSET = !BACK_OFFSET;
for (int i = 0; i < count && !selectionWidget.isEmpty(); i++) { return new Point(x, y);
Component c = root.getComponent(i); }
if (c instanceof XCreator) { /*
XCreator creator = (XCreator) c; * 组件原始位置与布局边界距离小于20像素下边界&右边界同时小于或者任意一个边界小于
for (Widget x : selectionWidget) { * 则粘贴时距离小于20像素一侧直接贴近布局边界
if (ComparatorUtils.equals(x, creator.toData())) { * 距离大于20像素的一侧正常错开
newSelection.add(creator); * x,y中只有一个越界
selectionWidget.remove(x); */
break; else if ((xOut || yOut)) {
} x = xOut ? container.getWidth() - copiedCreator.getWidth() / 2 - x_offset : x;
} y = yOut ? container.getHeight() - copiedCreator.getHeight() / 2 - y_offset : y;
if (c instanceof XLayoutContainer) { return new Point(x, y);
_rebuild((XLayoutContainer) c, selectionWidget, newSelection); }
} else { }
continue; return new Point(x, y);
} }
}
}
} private static Widget copyWidget(FormDesigner formDesigner, Widget widget) throws
CloneNotSupportedException {
ArrayList<String> clonedNameList = new ArrayList<String>();
Widget copied = (Widget) widget.clone();
//重命名拷贝的组件
setCopiedName(formDesigner, copied, clonedNameList);
if (copied instanceof WLayout) {
for (int i = 0; i < ((WLayout) copied).getWidgetCount(); i++) {
setCopiedName(formDesigner, ((WLayout) copied).getWidget(i), clonedNameList);
}
}
return copied;
}
/**
* 组件拷贝命名规则
*
* @param formDesigner
* @param copied
* @param clonedNameList
*/
private static void setCopiedName(FormDesigner formDesigner, Widget copied, ArrayList<String> clonedNameList) {
String name = copied.getWidgetName();
do {
name += postfix;
} while (formDesigner.getTarget().isNameExist(name) || clonedNameList.contains(name));
copied.setWidgetName(name);
clonedNameList.add(name);
}
public static void rebuildSelection(FormDesigner designer) {
ArrayList<XCreator> newSelection = new ArrayList<XCreator>();
List<Widget> widgetList = new ArrayList<Widget>();
for (XCreator comp : designer.getSelectionModel().getSelection().getSelectedCreators()) {
widgetList.add(comp.toData());
}
designer.getSelectionModel().setSelectedCreators(
rebuildSelection(designer.getRootComponent(), widgetList, newSelection));
}
public static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, Widget[] selectWidgets) {
List<Widget> selectionWidget = new ArrayList<Widget>();
if (selectWidgets != null) {
selectionWidget.addAll(Arrays.asList(selectWidgets));
}
return FormSelectionUtils.rebuildSelection(rootComponent, selectionWidget, new ArrayList<XCreator>());
}
private static ArrayList<XCreator> rebuildSelection(XCreator rootComponent, List<Widget> selectionWidget,
ArrayList<XCreator> newSelection) {
FormSelectionUtils._rebuild(rootComponent, selectionWidget, newSelection);
if (newSelection.isEmpty()) {
newSelection.add(rootComponent);
}
return newSelection;
}
private static void _rebuild(XCreator root, List<Widget> selectionWidget, List<XCreator> newSelection) {
if (selectionWidget.isEmpty()) {
return;
}
for (Widget x : selectionWidget) {
if (ComparatorUtils.equals(x, root.toData())) {
if (!newSelection.contains(root)) {
newSelection.add(root);
selectionWidget.remove(x);
}
break;
}
}
int count = root.getComponentCount();
for (int i = 0; i < count && !selectionWidget.isEmpty(); i++) {
Component c = root.getComponent(i);
if (c instanceof XCreator) {
XCreator creator = (XCreator) c;
for (Widget x : selectionWidget) {
if (ComparatorUtils.equals(x, creator.toData())) {
newSelection.add(creator);
selectionWidget.remove(x);
break;
}
}
if (c instanceof XLayoutContainer) {
_rebuild((XLayoutContainer) c, selectionWidget, newSelection);
}
}
}
}
} }

66
designer_form/src/com/fr/design/mainframe/JForm.java

@ -4,10 +4,12 @@ import com.fr.base.BaseUtils;
import com.fr.design.DesignState; import com.fr.design.DesignState;
import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.actions.core.WorkBookSupportable;
import com.fr.design.actions.file.WebPreviewUtils; import com.fr.design.actions.file.WebPreviewUtils;
import com.fr.design.mainframe.actions.FormMobileAttrAction;
import com.fr.design.cell.FloatElementsProvider; import com.fr.design.cell.FloatElementsProvider;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.designer.beans.actions.CopyAction;
import com.fr.design.designer.beans.actions.CutAction;
import com.fr.design.designer.beans.actions.FormDeleteAction; import com.fr.design.designer.beans.actions.FormDeleteAction;
import com.fr.design.designer.beans.actions.PasteAction;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.*;
@ -20,6 +22,7 @@ import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.gui.xpane.FormHyperlinkGroupPane; import com.fr.design.gui.xpane.FormHyperlinkGroupPane;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.actions.EmbeddedFormExportExportAction; import com.fr.design.mainframe.actions.EmbeddedFormExportExportAction;
import com.fr.design.mainframe.actions.FormMobileAttrAction;
import com.fr.design.mainframe.actions.TemplateParameterAction; import com.fr.design.mainframe.actions.TemplateParameterAction;
import com.fr.design.mainframe.form.FormECCompositeProvider; import com.fr.design.mainframe.form.FormECCompositeProvider;
import com.fr.design.mainframe.form.FormECDesignerProvider; import com.fr.design.mainframe.form.FormECDesignerProvider;
@ -264,10 +267,10 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override
/** /**
*焦点放到JForm * 焦点放到JForm
*/ */
@Override
public void requestFocus() { public void requestFocus() {
super.requestFocus(); super.requestFocus();
formDesign.requestFocus(); formDesign.requestFocus();
@ -281,12 +284,12 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
formDesign.requestFocus(); formDesign.requestFocus();
} }
@Override
/** /**
* 保存文件的后缀名 * 保存文件的后缀名
* *
* @return 返回后缀名 * @return 返回后缀名
*/ */
@Override
public String suffix() { public String suffix() {
// daniel改成三个字 // daniel改成三个字
return ".frm"; return ".frm";
@ -319,30 +322,33 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
formDesign.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_SELECTED); formDesign.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_SELECTED);
} }
@Override
/** /**
*复制 f * 复制
*/ */
@Override
public void copy() { public void copy() {
this.formDesign.copy(); this.formDesign.copy();
} }
@Override
/** /**
*
* 粘贴 * 粘贴
*
* @return 是否成功 * @return 是否成功
*/ */
@Override
public boolean paste() { public boolean paste() {
return this.formDesign.paste(); return this.formDesign.paste();
} }
@Override
/** /**
*
* 剪切 * 剪切
*
* @return 是否成功 * @return 是否成功
*/ */
@Override
public boolean cut() { public boolean cut() {
return this.formDesign.cut(); return this.formDesign.cut();
} }
@ -352,36 +358,38 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
// //////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////
@Override
/** /**
* 目标菜单 * 目标菜单
* *
* @return 菜单 * @return 菜单
*/ */
@Override
public MenuDef[] menus4Target() { public MenuDef[] menus4Target() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
(MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.formDesign.menus4Target()) : (MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.formDesign.menus4Target()) :
(MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.elementCaseDesign.menus4Target()); (MenuDef[]) ArrayUtils.addAll(super.menus4Target(), this.elementCaseDesign.menus4Target());
} }
@Override
/** /**
* 模板的工具 * 模板的工具
* *
* @return 工具 * @return 工具
*/ */
@Override
public ToolBarDef[] toolbars4Target() { public ToolBarDef[] toolbars4Target() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
this.formDesign.toolbars4Target() : this.formDesign.toolbars4Target() :
this.elementCaseDesign.toolbars4Target(); this.elementCaseDesign.toolbars4Target();
} }
@Override
/** /**
* 模板菜单 * 模板菜单
* *
* @return 返回菜单 * @return 返回菜单
*/ */
@Override
public ShortCut[] shortcut4TemplateMenu() { public ShortCut[] shortcut4TemplateMenu() {
if (this.index == FORM_TAB) { if (this.index == FORM_TAB) {
return (ShortCut[]) ArrayUtils.addAll(new ShortCut[]{ return (ShortCut[]) ArrayUtils.addAll(new ShortCut[]{
@ -407,11 +415,6 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override @Override
/**
* undo的表单state
*
* @return 表单State
*/
protected FormUndoState createUndoState() { protected FormUndoState createUndoState() {
FormUndoState cur = new FormUndoState(this, this.formDesign.getArea()); FormUndoState cur = new FormUndoState(this, this.formDesign.getArea());
if (this.formDesign.isReportBlockEditing()) { if (this.formDesign.isReportBlockEditing()) {
@ -445,17 +448,15 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
// 假如当前body是绝对布局的话就返回绝对布局body // 假如当前body是绝对布局的话就返回绝对布局body
private XLayoutContainer selectedBodyLayout() { private XLayoutContainer selectedBodyLayout() {
XLayoutContainer rootLayout = formDesign.getRootComponent(); XLayoutContainer rootLayout = formDesign.getRootComponent();
for (int i = 0; i < rootLayout.getComponentCount(); i++){ for (int i = 0; i < rootLayout.getComponentCount(); i++) {
if (rootLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)){ if (rootLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)) {
rootLayout = (XWAbsoluteBodyLayout)rootLayout.getXCreator(i); rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(i);
} }
} }
return rootLayout; return rootLayout;
} }
@Override @Override
/**
* 应用undoState的表单数据
*/
protected void applyUndoState(FormUndoState u) { protected void applyUndoState(FormUndoState u) {
try { try {
//JForm的target重置 //JForm的target重置
@ -487,19 +488,11 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
} }
@Override @Override
/**
*
*/
protected FormModelAdapter createDesignModel() { protected FormModelAdapter createDesignModel() {
return new FormModelAdapter(this); return new FormModelAdapter(this);
} }
@Override @Override
/**
* 表单的工具栏
*
* @return 表单工具栏
*/
public JPanel[] toolbarPanes4Form() { public JPanel[] toolbarPanes4Form() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
new JPanel[]{FormParaWidgetPane.getInstance(formDesign)} : new JPanel[]{FormParaWidgetPane.getInstance(formDesign)} :
@ -514,10 +507,9 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm {
public JComponent[] toolBarButton4Form() { public JComponent[] toolBarButton4Form() {
return this.index == FORM_TAB ? return this.index == FORM_TAB ?
new JComponent[]{ new JComponent[]{
//自适应布局里的复制粘贴意义不大, 先屏蔽掉 new CutAction(formDesign).createToolBarComponent(),
// new CutAction(formDesign).createToolBarComponent(), new CopyAction(formDesign).createToolBarComponent(),
// new CopyAction(formDesign).createToolBarComponent(), new PasteAction(formDesign).createToolBarComponent(),
// new PasteAction(formDesign).createToolBarComponent(),
new FormDeleteAction(formDesign).createToolBarComponent()} : new FormDeleteAction(formDesign).createToolBarComponent()} :
elementCaseDesign.toolBarButton4Form(); elementCaseDesign.toolBarButton4Form();
} }

3
designer_form/src/com/fr/design/mainframe/MobileWidgetTable.java

@ -251,7 +251,8 @@ public class MobileWidgetTable extends JTable {
} }
//选择的控件 //选择的控件
Widget selectedModel = designer.getSelectionModel().getSelection().getSelectedCreator().toData(); XCreator selectedCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
Widget selectedModel = selectedCreator != null ? selectedCreator.toData() : null;
if(selectedModel == null){ if(selectedModel == null){
return new String[0][0]; return new String[0][0];

31
designer_form/src/com/fr/design/mainframe/WidgetPropertyPane.java

@ -155,11 +155,11 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
//只有放到JScrollPanel中去表头才能正常显示,这就是MobileWidgetTable中定义了表头却没有显示的原因! //只有放到JScrollPanel中去表头才能正常显示,这就是MobileWidgetTable中定义了表头却没有显示的原因!
//解决方案:MobileWidgetTable实在无法直接放到JScrollPanel中去的时候,应该把表头get出来单独作为一个组件显示 //解决方案:MobileWidgetTable实在无法直接放到JScrollPanel中去的时候,应该把表头get出来单独作为一个组件显示
if(hasSelectParaPane(designer)){ if (hasSelectParaPane(designer)) {
cardLayout.show(centerPane,PARA); cardLayout.show(centerPane, PARA);
header = mobileParaWidgetTable.getTableHeader(); header = mobileParaWidgetTable.getTableHeader();
} else { } else {
cardLayout.show(centerPane,BODY); cardLayout.show(centerPane, BODY);
header = mobileWidgetTable.getTableHeader(); header = mobileWidgetTable.getTableHeader();
} }
downPanel = new UIScrollPane(centerPane); downPanel = new UIScrollPane(centerPane);
@ -200,6 +200,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
/** /**
* 判断是将拓展的tab放入属性表还是将原来的tab放入属性表 * 判断是将拓展的tab放入属性表还是将原来的tab放入属性表
*
* @param widgetAttrProviders 拓展的tab * @param widgetAttrProviders 拓展的tab
*/ */
private void addWidgetAttr(WidgetPropertyUIProvider[] widgetAttrProviders) { private void addWidgetAttr(WidgetPropertyUIProvider[] widgetAttrProviders) {
@ -219,6 +220,7 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
/** /**
* 如果是body的拓展属性表那么要额外加上一张控件顺序表 * 如果是body的拓展属性表那么要额外加上一张控件顺序表
*
* @return * @return
*/ */
private Component getExtraBodyTable(AbstractPropertyTable abstractPropertyTable) { private Component getExtraBodyTable(AbstractPropertyTable abstractPropertyTable) {
@ -243,18 +245,20 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), wsp); tabbedPane.addTab(Inter.getLocText("FR-Widget_Mobile_Terminal"), wsp);
} }
//
/** /**
* 选中的组件是否在参数面板里 * 选中的组件是否在参数面板里
* @param designer 设计器 *
* @return 是则返回true * @param designer 设计器
* @return 是则返回true
*/ */
public boolean hasSelectParaPane(FormDesigner designer){ public boolean hasSelectParaPane(FormDesigner designer) {
XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator(); XCreator xCreator = designer.getSelectionModel().getSelection().getSelectedCreator();
if(xCreator == null){ if (xCreator == null) {
xCreator = designer.getRootComponent(); xCreator = designer.getRootComponent();
} }
XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator); XLayoutContainer container = XCreatorUtils.getHotspotContainer(xCreator);
//TODO container可能为空,引发空指针异常
return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class); return xCreator.acceptType(XWParameterLayout.class) || container.acceptType(XWParameterLayout.class);
} }
@ -334,8 +338,9 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
} }
/** /**
* 响应界面改变事件 * 响应界面改变事件
* @param evt 事件 *
* @param evt 事件
*/ */
public void fireCreatorModified(DesignerEvent evt) { public void fireCreatorModified(DesignerEvent evt) {
if (evt.getCreatorEventID() == DesignerEvent.CREATOR_RESIZED if (evt.getCreatorEventID() == DesignerEvent.CREATOR_RESIZED
@ -343,11 +348,11 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
|| evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED || evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED
|| evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) { || evt.getCreatorEventID() == DesignerEvent.CREATOR_ADDED) {
int value = downPanel.getVerticalScrollBar().getValue(); int value = downPanel.getVerticalScrollBar().getValue();
if(hasSelectParaPane(getEditingFormDesigner())){ if (hasSelectParaPane(getEditingFormDesigner())) {
cardLayout.show(centerPane,PARA); cardLayout.show(centerPane, PARA);
mobileParaWidgetTable.refreshData(); mobileParaWidgetTable.refreshData();
} else { } else {
cardLayout.show(centerPane,BODY); cardLayout.show(centerPane, BODY);
mobileWidgetTable.refreshData(); mobileWidgetTable.refreshData();
} }
//出现滚动条 //出现滚动条

Loading…
Cancel
Save