Browse Source

REPORT-57810 - 固定布局-原布局推荐4.1

research/11.0
kerry 3 years ago
parent
commit
163f00790a
  1. 11
      designer-base/src/main/java/com/fr/design/actions/UpdateAction.java
  2. 6
      designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java
  3. 41
      designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java
  4. 1
      designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java
  5. 9
      designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java
  6. 16
      designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/PasteEnable.java
  7. 15
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/component/CompositeComponentAdapter.java
  8. 8
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java
  9. 23
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/DefaultDesignerBaseOperate.java
  10. 33
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/DesignerBaseOperate.java
  11. 71
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java
  12. 133
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java
  13. 130
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutPainter.java
  14. 116
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java
  15. 69
      designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FROccupiedLayoutAdapter.java
  16. 9
      designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java
  17. 2
      designer-form/src/main/java/com/fr/design/designer/beans/models/ModelUtil.java
  18. 56
      designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java
  19. 36
      designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java
  20. 2
      designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java
  21. 10
      designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java
  22. 81
      designer-form/src/main/java/com/fr/design/designer/creator/XOccupiedLayout.java
  23. 13
      designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
  24. 4
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java
  25. 29
      designer-form/src/main/java/com/fr/design/designer/creator/componenttree/DefaultXCreatorBaseOperate.java
  26. 15
      designer-form/src/main/java/com/fr/design/designer/creator/componenttree/XCreatorBaseOperate.java
  27. 11
      designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java
  28. 29
      designer-form/src/main/java/com/fr/design/designer/treeview/DefaultXCreatorTreeCellRender.java
  29. 8
      designer-form/src/main/java/com/fr/design/designer/treeview/XCreatorTreeCellRender.java
  30. 114
      designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java
  31. 27
      designer-form/src/main/java/com/fr/design/fit/attrpane/FRAbsoluteLayoutExtendDefinePane.java
  32. 282
      designer-form/src/main/java/com/fr/design/fit/attrpane/FRFitLayoutExtendDefinePane.java
  33. 303
      designer-form/src/main/java/com/fr/design/fit/attrpane/RootDesignExtendDefinePane.java
  34. 35
      designer-form/src/main/java/com/fr/design/fit/common/AdaptiveSwitchUtil.java
  35. 19
      designer-form/src/main/java/com/fr/design/form/util/XCreatorConstants.java
  36. 14
      designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java
  37. 2
      designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java
  38. 96
      designer-form/src/main/java/com/fr/design/mainframe/FormArea.java
  39. 1
      designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java
  40. 89
      designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java
  41. 6
      designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java
  42. 6
      designer-form/src/main/java/com/fr/design/mainframe/JForm.java
  43. 3
      designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java
  44. 147
      designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java
  45. 30
      designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java
  46. 38
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/ElementEditorDefinePane.java
  47. 52
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java
  48. 5
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteLayoutDefinePane.java
  49. 68
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java
  50. BIN
      designer-form/src/main/resources/com/fr/design/form/images/fix_layout_icon.png
  51. BIN
      designer-form/src/main/resources/com/fr/design/form/images/no_fix_layout_icon.png
  52. BIN
      designer-form/src/main/resources/com/fr/design/form/images/occupied_layout.png

11
designer-base/src/main/java/com/fr/design/actions/UpdateAction.java

@ -345,6 +345,17 @@ public abstract class UpdateAction extends ShortCut implements Action {
return (JComponent) object;
}
public JComponent createToolBarComponentByName(String componentName) {
Object object = this.getValue(componentName);
if (!(object instanceof AbstractButton)) {
UIButton button = null;
button = new UIButton();
object = initButton(button, componentName);
}
return (JComponent) object;
}
protected JComponent initButton(UIButton button, String name) {
// 添加一个名字作为自动化测试用
button.setName(getName());

6
designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java

@ -73,6 +73,12 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver
textField.setValue(defaultValue);
}
public UISpinner(double minValue, double maxValue, double dierta, double defaultValue, boolean fillNegativeNumber) {
init(minValue, maxValue, dierta);
textField.setValue(defaultValue);
textField.canFillNegativeNumber(fillNegativeNumber);
}
protected void init(double minValue, double maxValue, double dierta) {
this.minValue = minValue;
this.maxValue = maxValue;

41
designer-form/src/main/java/com/fr/design/designer/beans/LayoutAdapter.java

@ -1,7 +1,12 @@
package com.fr.design.designer.beans;
import com.fr.design.beans.GroupModel;
import com.fr.design.designer.beans.adapters.layout.DefaultDesignerBaseOperate;
import com.fr.design.designer.beans.adapters.layout.DesignerBaseOperate;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender;
import com.fr.design.designer.treeview.XCreatorTreeCellRender;
/**
* 该接口是LayoutManager的BeanInfo类标准Java平台没有提供布局管理器的BeanInfo类
@ -50,11 +55,11 @@ public interface LayoutAdapter {
* @param creator 被添加的新组件
* @param x 添加的位置x该位置是相对于container的
* @param y 添加的位置y该位置是相对于container的
* @param accept 是否添加新组件
* @param accept 是否添加新组件
* @return 是否添加成功成功返回true否则false
*/
boolean addBean(XCreator creator, int x, int y, boolean accept);
/**
* 返回该布局管理适配器的Painter为容器提供放置位置的标识
*/
@ -104,4 +109,36 @@ public interface LayoutAdapter {
* @param initHeight 组件之前高度
*/
void removeBean(XCreator creator, int initWidth, int initHeight);
/**
* 获取布局下控件树render
* @param creator
* @return
*/
default XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator) {
return new DefaultXCreatorTreeCellRender(creator);
}
/**
* 获取布局下支持的设计器基本操作
* @return
*/
default DesignerBaseOperate getDesignerBaseOperate() {
return new DefaultDesignerBaseOperate();
}
/**
* 是否支持修改间距
* @return
*/
default boolean supportModifyInsert() {
return true;
}
void dragStart(XCreator xCreator, SelectionModel selectionModel);
default void dragOver(XCreator xCreator, SelectionModel selectionModel, int x, int y) {
};
}

1
designer-form/src/main/java/com/fr/design/designer/beans/actions/CutAction.java

@ -2,7 +2,6 @@ package com.fr.design.designer.beans.actions;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.beans.actions.behavior.ComponentEnable;
import com.fr.design.designer.beans.actions.behavior.CutableEnable;
import com.fr.design.mainframe.FormDesigner;

9
designer-form/src/main/java/com/fr/design/designer/beans/actions/PasteAction.java

@ -1,6 +1,7 @@
package com.fr.design.designer.beans.actions;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.designer.beans.actions.behavior.PasteEnable;
import com.fr.design.mainframe.FormDesigner;
import javax.swing.KeyStroke;
@ -15,6 +16,7 @@ public class PasteAction extends FormWidgetEditAction {
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Edit_Paste"));
this.setMnemonic('P');
this.setSmallIcon("/com/fr/design/images/m_edit/paste");
this.setUpdateBehavior(new PasteEnable());
this.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DEFAULT_MODIFIER));
}
@ -22,10 +24,5 @@ public class PasteAction extends FormWidgetEditAction {
public boolean executeActionReturnUndoRecordNeeded() {
return DesignModeContext.doPaste(getEditingComponent());
}
@Override
public void update() {
this.setEnabled(true);
}
}

16
designer-form/src/main/java/com/fr/design/designer/beans/actions/behavior/PasteEnable.java

@ -0,0 +1,16 @@
package com.fr.design.designer.beans.actions.behavior;
import com.fr.design.designer.beans.actions.FormWidgetEditAction;
import com.fr.design.mainframe.FormDesigner;
public class PasteEnable implements UpdateBehavior<FormWidgetEditAction> {
@Override
public void doUpdate(FormWidgetEditAction action) {
FormDesigner designer = action.getEditingComponent();
if (designer == null) {
action.setEnabled(false);
return;
}
action.setEnabled(designer.isCurrentComponentPastable());
}
}

15
designer-form/src/main/java/com/fr/design/designer/beans/adapters/component/CompositeComponentAdapter.java

@ -29,6 +29,7 @@ import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.beans.IntrospectionException;
import java.util.ArrayList;
import java.util.Collections;
@ -64,13 +65,15 @@ public class CompositeComponentAdapter implements ComponentAdapter {
@Override
public void paintComponentMascot(Graphics g) {
//自适应交叉点渲染有点问题,拖拽的控件设置成半透明
Graphics2D g2d = (Graphics2D) g;
AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER,.5f);
g2d.setComposite(composite);
xCreator.paint(g2d);
//自适应交叉点渲染有点问题,拖拽的控件设置成半透明
Graphics2D g2d = (Graphics2D) g;
AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .5f);
g2d.setComposite(composite);
BufferedImage im = new BufferedImage(xCreator.getWidth(), xCreator.getHeight(), BufferedImage.TYPE_INT_ARGB);
xCreator.paint(im.getGraphics());
g.drawImage(im, 0, 0, xCreator.initEditorSize().width - 1, xCreator.initEditorSize().height - 1, null);
g.setColor(XCreatorConstants.RESIZE_BOX_BORDER_COLOR);
g.drawRect(0, 0, xCreator.getWidth() - 1, xCreator.getHeight() - 1);
g.drawRect(0, 0, xCreator.initEditorSize().width - 1, xCreator.initEditorSize().height - 1);
}
@Override

8
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/AbstractLayoutAdapter.java

@ -4,6 +4,7 @@ import com.fr.design.beans.GroupModel;
import com.fr.design.designer.beans.ConstraintsGroupModel;
import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.beans.painters.NullPainter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
@ -203,4 +204,11 @@ public abstract class AbstractLayoutAdapter implements LayoutAdapter {
public XLayoutContainer getContainer() {
return this.container;
}
public void dragStart(XCreator xCreator, SelectionModel selectionModel){
selectionModel.removeCreator(xCreator, xCreator.getWidth(), xCreator.getHeight());
selectionModel.setSelectedCreator(container);
}
}

23
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/DefaultDesignerBaseOperate.java

@ -0,0 +1,23 @@
package com.fr.design.designer.beans.adapters.layout;
public class DefaultDesignerBaseOperate implements DesignerBaseOperate{
@Override
public boolean supportCopyAction() {
return true;
}
@Override
public boolean supportCutAction() {
return true;
}
@Override
public boolean supportPasteAction() {
return true;
}
@Override
public boolean supportDeleteAction() {
return true;
}
}

33
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/DesignerBaseOperate.java

@ -0,0 +1,33 @@
package com.fr.design.designer.beans.adapters.layout;
public interface DesignerBaseOperate {
/**
* 是否支持复制
*
* @return boolean
*/
boolean supportCopyAction();
/**
* 是否支持剪切
*
* @return boolean
*/
boolean supportCutAction();
/**
* 是否支持粘贴
*
* @return boolean
*/
boolean supportPasteAction();
/**
* 是否支持删除
*
* @return boolean
*/
boolean supportDeleteAction();
}

71
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFitLayoutAdapter.java

@ -7,7 +7,8 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.beans.GroupModel;
import com.fr.design.designer.beans.ConstraintsGroupModel;
import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.painters.FRFitLayoutPainter;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.designer.creator.XLayoutContainer;
@ -19,6 +20,7 @@ import com.fr.design.designer.creator.cardlayout.XWCardTitleLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import com.fr.design.designer.properties.FRFitLayoutConstraints;
import com.fr.design.designer.properties.FRFitLayoutPropertiesGroupModel;
import com.fr.design.designer.treeview.XCreatorTreeCellRender;
import com.fr.design.fun.FormWidgetOptionProvider;
import com.fr.design.utils.ComponentUtils;
import com.fr.form.ui.LayoutBorderStyle;
@ -43,8 +45,6 @@ import java.util.Set;
* @date 2014-6-24
*/
public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
public static final String WIDGETPANEICONPATH = "/com/fr/web/images/form/resources/layout_absolute.png";
private static final int DEPENDING_SCOPE = 3;
private HoverPainter painter;
//区分拖拽和编辑宽高
@ -58,6 +58,8 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
isEdit = edit;
}
private LayoutAdapter frLayoutState;
/**
* 构造函数
*
@ -65,10 +67,18 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
*/
public FRFitLayoutAdapter(XLayoutContainer container) {
super(container);
painter = new FRFitLayoutPainter(container);
initMinSize();
this.frLayoutState = new FRNoFixLayoutAdapter(this, container, minHeight);
painter = this.frLayoutState.getPainter();
}
public void setFrLayoutState(LayoutAdapter frLayoutState){
this.frLayoutState = frLayoutState;
painter = this.frLayoutState.getPainter();
}
private void initMinSize() {
XWFitLayout layout = (XWFitLayout) container;
minWidth = layout.getActualMinWidth();
@ -100,16 +110,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
*/
@Override
public void addComp(XCreator child, int x, int y) {
fix(child, x, y);
if (child.shouldScaleCreator() || child.hasTitleStyle()) {
addParentCreator(child);
} else {
container.add(child, child.toData().getWidgetName());
}
XWFitLayout layout = (XWFitLayout) container;
// 更新对应的BoundsWidget
layout.updateBoundsWidget();
updateCreatorBackBound();
frLayoutState.addBean(child, x, y);
}
public void updateCreatorBackBound() {
@ -130,11 +131,6 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
}
private void addParentCreator(XCreator child) {
XLayoutContainer parentPanel = child.initCreatorWrapper(minHeight);
container.add(parentPanel, child.toData().getWidgetName());
}
/**
* 能否对应位置放置当前组件
*
@ -206,7 +202,7 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
* @param y 纵坐标
* @return 是否在组件边缘
*/
public boolean matchEdge(int x, int y) {
private boolean matchEdge(int x, int y) {
if (intersectsEdge(x, y, container)) {
//寻找最近的fit, 在边缘地段添加的控件, 将其送给该fit
XLayoutContainer parent = container.findNearestFit();
@ -760,15 +756,9 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
super.fixTrisect(currentComp, child, x, y);
}
/**
* 删除组件或者重新拖动时其它组件重新计算位置大小
*/
protected void delete(XCreator creator, int creatorWidth, int creatorHeight) {
int x = creator.getX();
int y = creator.getY();
recalculateChildrenSize(x, y, creatorWidth, creatorHeight, true);
public void removeBean(XCreator creator, int creatorWidth, int creatorHeight) {
frLayoutState.removeBean(creator, creatorWidth, creatorHeight);
}
/**
* 重新计算内部组件大小
*
@ -1216,11 +1206,11 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
/**
* 删除或拉伸上边框 调整上方的组件位置大小
*/
protected boolean calculateUpRelatComponent(int objHeight) {
private boolean calculateUpRelatComponent(int objHeight) {
return calculateUpRelatComponent(objHeight, false);
}
protected boolean calculateUpRelatComponent(int objHeight, boolean isDel) {
private boolean calculateUpRelatComponent(int objHeight, boolean isDel) {
if (!isDel && isBeyondAdjustHeightScope(objHeight)) {
return false;
}
@ -1248,4 +1238,25 @@ public class FRFitLayoutAdapter extends FRBodyLayoutAdapter {
public ConstraintsGroupModel getLayoutConstraints(XCreator creator) {
return new FRFitLayoutConstraints((XWFitLayout) container, creator);
}
public XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator){
return frLayoutState.getLayoutTreeCellRender(creator);
}
@Override
public DesignerBaseOperate getDesignerBaseOperate() {
return frLayoutState.getDesignerBaseOperate();
}
public boolean supportModifyInsert() {
return frLayoutState.supportModifyInsert();
}
public void dragStart(XCreator xCreator, SelectionModel selectionModel){
frLayoutState.dragStart(xCreator, selectionModel);
}
public void dragOver(XCreator xCreator, SelectionModel selectionModel,int x, int y) {
frLayoutState.dragOver(xCreator, selectionModel,x,y);
};
}

133
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutAdapter.java

@ -0,0 +1,133 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.base.svg.IconUtils;
import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.models.ModelUtil;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XOccupiedLayout;
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender;
import com.fr.design.designer.treeview.XCreatorTreeCellRender;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.form.ui.container.OccupiedLayout;
import javax.swing.Icon;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
public class FRFixLayoutAdapter extends AbstractLayoutAdapter {
private static final Icon OCCUPIED_ICON = IconUtils.readIcon("/com/fr/design/form/images/occupied_layout.png");
public FRFixLayoutAdapter(XLayoutContainer container) {
super(container);
}
public void addComp(XCreator child, int x, int y) {
Component component = container.getComponentAt(x, y);
if (component == container) {
return;
}
child.setLocation(component.getX(), component.getY());
child.setSize(component.getWidth(), component.getHeight());
container.remove(component);
if (child.shouldScaleCreator() || child.hasTitleStyle()) {
XLayoutContainer parentPanel = child.initCreatorWrapper(21);
container.add(parentPanel, child.toData().getWidgetName());
} else {
container.add(child, child.toData().getWidgetName());
}
if (child.getBackupRectangle() != null && child.getParent() == container) {
Component origin = container.getComponentAt(child.getBackupRectangle().x + 5, child.getBackupRectangle().y + 5);
if (origin == container) {
return;
}
if (origin instanceof XOccupiedLayout) {
((XOccupiedLayout) origin).getLayoutAdapter().addBean((XCreator) component, child.getBackupRectangle().x + 5, child.getBackupRectangle().y + 5);
}
}
}
@Override
public void delete(XCreator creator, int creatorWidth, int creatorHeight) {
OccupiedLayout occupiedLayout = new OccupiedLayout();
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
XOccupiedLayout xoccupiedLayout = new XOccupiedLayout(occupiedLayout, new Dimension());
ModelUtil.renameWidgetName(formDesigner.getTarget(), xoccupiedLayout);
xoccupiedLayout.setLocation(creator.getX(), creator.getY());
xoccupiedLayout.setSize(creatorWidth, creatorHeight);
container.add(xoccupiedLayout);
}
@Override
public XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator) {
return new DefaultXCreatorTreeCellRender(creator) {
@Override
public void paint(Graphics g, Component c) {
if (!getxCreator().acceptType(XOccupiedLayout.class)) {
OCCUPIED_ICON.paintIcon(c, g, 0, 0);
}
super.paint(g, c);
}
};
}
@Override
public boolean supportModifyInsert() {
return false;
}
@Override
public DesignerBaseOperate getDesignerBaseOperate() {
return new DesignerBaseOperate() {
@Override
public boolean supportCopyAction() {
return false;
}
@Override
public boolean supportCutAction() {
return false;
}
@Override
public boolean supportPasteAction() {
return false;
}
@Override
public boolean supportDeleteAction() {
return true;
}
};
}
@Override
public boolean accept(XCreator creator, int x, int y) {
return true;
}
@Override
public HoverPainter getPainter() {
return new FRFixLayoutPainter(container);
}
@Override
public void dragStart(XCreator xCreator, SelectionModel selectionModel) {
//do nothing
}
public void dragOver(XCreator xCreator, SelectionModel selectionModel, int x, int y) {
//当鼠标移出被拖拽的组件时,才将组件从selectionmodel 中移出
if (xCreator.getBackupRectangle()!= null && !xCreator.getBackupRectangle().contains(x, y)
&& selectionModel.getSelection().contains(xCreator.toData())) {
selectionModel.removeCreator(xCreator, xCreator.getWidth(), xCreator.getHeight());
selectionModel.setSelectedCreator(container);
}
}
;
}

130
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRFixLayoutPainter.java

@ -0,0 +1,130 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.designer.beans.painters.AbstractPainter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XOccupiedLayout;
import com.fr.design.form.util.XCreatorConstants;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke;
public class FRFixLayoutPainter extends AbstractPainter {
/**
* 构造函数
*
* @param container
*/
public FRFixLayoutPainter(XLayoutContainer container) {
super(container);
}
/**
* 组件渲染
*
* @param g 画图类
* @param startX 开始位置x
* @param startY 开始位置y
*/
@Override
public void paint(Graphics g, int startX, int startY) {
super.paint(g, startX, startY);
int x = hotspot.x - hotspot_bounds.x;
int y = hotspot.y - hotspot_bounds.y;
Component currentComp = container.getComponentAt(x, y);
if (currentComp == null) {
return;
}
boolean accept = currentComp != container;
if (accept) {
OperateState state = OperateState.DEFAULT;
if (currentComp == creator) {
state = OperateState.COMPONENT_DRAG_OUT;
} else if (!((XCreator) currentComp).acceptType(XOccupiedLayout.class)) {
state = OperateState.COMPONENT_REPLACE;
}
state.paint(g, creator.getBackupRectangle(), currentComp.getBounds(), new Rectangle(x, y, creator.initEditorSize().width, ((XCreator) currentComp).initEditorSize().height));
} else {
Color bColor = XCreatorConstants.LAYOUT_FORBIDDEN_COLOR;
int[] hot_rec = new int[]{x, y, 0, 0};
drawHotspot(g, x, y, hot_rec[2], hot_rec[3], bColor, false, false);
}
}
enum OperateState {
COMPONENT_REPLACE {
@Override
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) {
Graphics2D g2d = (Graphics2D) g;
Color color = g2d.getColor();
Stroke backup = g2d.getStroke();
Composite backupComp = g2d.getComposite();
g2d.setColor(XCreatorConstants.REPLACE_OCCUPIED_LAYOUT_COLOR);
g2d.setStroke(XCreatorConstants.DASH_STROKE);
//绘制当前组件的边框
g2d.drawRect(currentRectangle.x, currentRectangle.y, currentRectangle.width, currentRectangle.height);
//底色透明度0.2
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
//绘制进行替换的时候,被替换的组件的底色
g2d.fillRect(currentRectangle.x, currentRectangle.y, currentRectangle.width, currentRectangle.height);
//绘制原组件位置处的占位块
if (oriRectangle != null) {
g2d.setColor(XCreatorConstants.DRAG_OUT_OCCUPIED_LAYOUT_COLOR);
//如果是从其他占位块上拖过来的,绘制下其他占位块的状态
g2d.drawRect(oriRectangle.x + 1, oriRectangle.y + 1, oriRectangle.width - 2, oriRectangle.height - 2);
//底色透明度0.2
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
//绘制进行替换的时候,被替换的组件的底色
g2d.fillRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height);
}
//还原
g2d.setComposite(backupComp);
g2d.setStroke(backup);
g2d.setColor(color);
}
},
COMPONENT_DRAG_OUT {
@Override
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) {
Graphics2D g2d = (Graphics2D) g;
Color color = g2d.getColor();
Stroke backup = g2d.getStroke();
Composite backupComp = g2d.getComposite();
// 设置线条的样式
g2d.setStroke(XCreatorConstants.DASH_STROKE);
g2d.setColor(XCreatorConstants.DRAG_OUT_OCCUPIED_LAYOUT_COLOR);
//如果是从其他占位块上拖过来的,绘制下其他占位块的状态
g2d.drawRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height);
//底色透明度0.2
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
//绘制进行替换的时候,被替换的组件的底色
g2d.fillRect(oriRectangle.x, oriRectangle.y, oriRectangle.width, oriRectangle.height);
g2d.setComposite(backupComp);
g2d.setStroke(backup);
g2d.setColor(color);
}
},
DEFAULT {
@Override
void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds) {
}
};
abstract void paint(Graphics g, Rectangle oriRectangle, Rectangle currentRectangle, Rectangle hotspot_bounds);
}
}

116
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRNoFixLayoutAdapter.java

@ -0,0 +1,116 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.beans.painters.AbstractPainter;
import com.fr.design.designer.beans.painters.FRFitLayoutPainter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
import java.awt.Component;
import java.util.ArrayList;
public class FRNoFixLayoutAdapter extends AbstractLayoutAdapter {
private int minHeight;
private FRBodyLayoutAdapter parentLayoutAdapter;
public FRNoFixLayoutAdapter(FRBodyLayoutAdapter parentLayoutAdapter, XLayoutContainer container, int minHeight) {
super(container);
this.parentLayoutAdapter = parentLayoutAdapter;
this.minHeight = minHeight;
}
@Override
public void addComp(XCreator child, int x, int y) {
fix(child, x, y);
if (child.shouldScaleCreator() || child.hasTitleStyle()) {
addParentCreator(child);
} else {
container.add(child, child.toData().getWidgetName());
}
XWFitLayout layout = (XWFitLayout) container;
// 更新对应的BoundsWidget
layout.updateBoundsWidget();
updateCreatorBackBound();
}
private void updateCreatorBackBound() {
for (int i = 0, size = container.getComponentCount(); i < size; i++) {
XCreator creator = (XCreator) container.getComponent(i);
creator.updateChildBound(minHeight);
creator.setBackupBound(creator.getBounds());
//tab布局用到
ArrayList<?> childrenList = creator.getTargetChildrenList();
for (int j = 0; j < childrenList.size(); j++) {
XWTabFitLayout tabLayout = (XWTabFitLayout) childrenList.get(j);
for (int m = 0; m < tabLayout.getComponentCount(); m++) {
XCreator childCreator = tabLayout.getXCreator(m);
childCreator.setBackupBound(childCreator.getBounds());
}
}
}
}
private void addParentCreator(XCreator child) {
XLayoutContainer parentPanel = child.initCreatorWrapper(minHeight);
container.add(parentPanel, child.toData().getWidgetName());
}
private void fix(XCreator child, int x, int y) {
Component parentComp = container.getComponentAt(x, y);
if (container.getComponentCount() == 0) {
child.setLocation(0, 0);
child.setSize(parentComp.getWidth(), parentComp.getHeight());
} else if (parentLayoutAdapter.isCrossPointArea(parentComp, x, y)) {
//交叉区域插入组件时,根据具体位置进行上下或者左右或者相邻三个组件的位置大小插入
parentLayoutAdapter.fixCrossPointArea(parentComp, child, x, y);
return;
} else if (parentLayoutAdapter.isTrisectionArea(parentComp, x, y)) {
// 在边界三等分区域,就不再和组件二等分了
parentLayoutAdapter.fixTrisect(parentComp, child, x, y);
return;
} else {
parentLayoutAdapter.fixHalve(parentComp, child, x, y);
}
}
@Override
public void delete(XCreator creator, int creatorWidth, int creatorHeight) {
int x = creator.getX();
int y = creator.getY();
((FRFitLayoutAdapter)parentLayoutAdapter).recalculateChildrenSize(x, y, creatorWidth, creatorHeight, true);
}
@Override
public boolean supportModifyInsert() {
return true;
}
@Override
public DesignerBaseOperate getDesignerBaseOperate() {
return new DefaultDesignerBaseOperate() {
@Override
public boolean supportCutAction() {
return container.getComponentCount() > 1;
}
};
}
@Override
public boolean accept(XCreator creator, int x, int y) {
return true;
}
@Override
public AbstractPainter getPainter() {
return new FRFitLayoutPainter(container);
}
@Override
public void dragStart(XCreator xCreator, SelectionModel selectionModel) {
selectionModel.removeCreator(xCreator, xCreator.getWidth(), xCreator.getHeight());
selectionModel.setSelectedCreator(container);
}
}

69
designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FROccupiedLayoutAdapter.java

@ -0,0 +1,69 @@
package com.fr.design.designer.beans.adapters.layout;
import com.fr.design.designer.beans.HoverPainter;
import com.fr.design.designer.beans.painters.FROccupiedLayoutPainter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender;
import com.fr.design.designer.treeview.XCreatorTreeCellRender;
import com.fr.design.utils.gui.LayoutUtils;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
public class FROccupiedLayoutAdapter extends AbstractLayoutAdapter {
public FROccupiedLayoutAdapter(XLayoutContainer container) {
super(container);
painter = new FROccupiedLayoutPainter(container);
}
private HoverPainter painter;
@Override
protected void addComp(XCreator creator, int x, int y) {
if (container.getComponentCount() == 0) {
creator.setLocation(container.getLocation().x, container.getLocation().y);
creator.setSize(container.getWidth(), container.getHeight());
//将 xcreator 添加到其父容器中,并删除此
Container parent = container.getParent();
parent.remove(container);
if (creator.shouldScaleCreator() || creator.hasTitleStyle()) {
XLayoutContainer parentPanel = creator.initCreatorWrapper(21);
parent.add(parentPanel, creator.toData().getWidgetName());
} else {
parent.add(creator, creator.toData().getWidgetName());
}
LayoutUtils.layoutContainer(parent);
}
}
@Override
public HoverPainter getPainter() {
return painter;
}
@Override
public boolean accept(XCreator creator, int x, int y) {
return container.getComponentCount() == 0;
}
public XCreatorTreeCellRender getLayoutTreeCellRender(XCreator creator) {
return new DefaultXCreatorTreeCellRender(creator) {
@Override
public void paint(Graphics g, Component c) {
super.paint(g, c);
Color oldColor = g.getColor();
g.setColor(Color.RED);
g.drawRect(0, 0, 16, 16);
g.setColor(oldColor);
}
};
}
}

9
designer-form/src/main/java/com/fr/design/designer/beans/models/AddingModel.java

@ -51,9 +51,8 @@ public class AddingModel {
this.creator = xCreator;
this.creator.backupCurrentSize();
this.creator.backupParent();
this.creator.setSize(xCreator.initEditorSize());
currentX = x - (xCreator.getWidth() / 2);
currentY = y - (xCreator.getHeight() / 2);
currentX = x - (xCreator.initEditorSize().width / 2);
currentY = y - (xCreator.initEditorSize().height / 2);
}
/**
@ -93,8 +92,8 @@ public class AddingModel {
* @param y 坐标
*/
public void moveTo(int x, int y) {
currentX = x - (this.creator.getWidth() / 2);
currentY = y - (this.creator.getHeight() / 2);
currentX = x - (this.creator.initEditorSize().width / 2);
currentY = y - (this.creator.initEditorSize().height / 2);
}
public XCreator getXCreator() {

2
designer-form/src/main/java/com/fr/design/designer/beans/models/ModelUtil.java

@ -18,7 +18,7 @@ import java.util.Set;
/**
* created by Harrison on 2020/06/05
**/
abstract class ModelUtil {
public abstract class ModelUtil {
public static void renameWidgetName(Form form, XCreator xCreator) {

56
designer-form/src/main/java/com/fr/design/designer/beans/painters/FROccupiedLayoutPainter.java

@ -0,0 +1,56 @@
package com.fr.design.designer.beans.painters;
import com.fr.design.designer.beans.adapters.layout.FROccupiedLayoutAdapter;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.form.util.XCreatorConstants;
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Component;
import java.awt.Composite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
public class FROccupiedLayoutPainter extends AbstractPainter {
/**
* 构造函数
*
* @param container 容器
*/
public FROccupiedLayoutPainter(XLayoutContainer container) {
super(container);
}
@Override
public void paint(Graphics g, int startX, int startY) {
int x = hotspot.x - hotspot_bounds.x;
int y = hotspot.y - hotspot_bounds.y;
FROccupiedLayoutAdapter adapter = (FROccupiedLayoutAdapter) container.getLayoutAdapter();
Component currentComp = container.getComponentAt(x, y);
if (currentComp == null) {
return;
}
boolean accept = adapter.accept(creator, x, y);
if (accept) {
Color backupColor = g.getColor();
Graphics2D g2d = (Graphics2D) g;
Stroke backupStroke = g2d.getStroke();
Composite backupComposite = g2d.getComposite();
g2d.setColor(XCreatorConstants.DRAG_IN_OCCUPIED_LAYOUT_COLOR);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.05f));
g2d.fillRect(container.getX(), container.getY(), container.getWidth(), container.getHeight());
g2d.setStroke(XCreatorConstants.DASH_STROKE);
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.2f));
g2d.drawRect(container.getX() + 1, container.getY() + 1, container.getWidth() - 2, container.getHeight() - 2);
g2d.setStroke(backupStroke);
g2d.setComposite(backupComposite);
g2d.setColor(backupColor);
}
}
}

36
designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java

@ -9,6 +9,10 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.UpdateAction;
import com.fr.design.designer.beans.events.DesignerEditor;
import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.componenttree.XCreatorBaseOperate;
import com.fr.design.designer.creator.componenttree.DefaultXCreatorBaseOperate;
import com.fr.design.designer.treeview.DefaultXCreatorTreeCellRender;
import com.fr.design.designer.treeview.XCreatorTreeCellRender;
import com.fr.design.designer.ui.SelectedPopupDialog;
import com.fr.design.fun.ShareWidgetUIProcessor;
import com.fr.design.fun.WidgetPropertyUIProvider;
@ -62,7 +66,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
protected static final Dimension MIDDLE_PREFERRED_SIZE = new Dimension(80, 50);
protected static final Dimension BIG_PREFERRED_SIZE = new Dimension(80, 80);
// barry: 拖拽控件时,控件要恢复原始大小,就先把控件当前大小备份到这里。
protected Dimension backupSize;
protected Rectangle backupRectangle;
protected XLayoutContainer backupParent;
protected Widget data;
@ -107,11 +111,15 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
* 应用备份的大小
*/
public void useBackupSize() {
if (this.backupSize != null) {
setSize(this.backupSize);
if (this.backupRectangle != null) {
setSize(new Dimension(this.backupRectangle.width, this.backupRectangle.height));
}
}
public Rectangle getBackupRectangle(){
return this.backupRectangle;
}
/**
* 初始化组件大小
*/
@ -128,7 +136,7 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
* 备份当前大小
*/
public void backupCurrentSize() {
this.backupSize = getSize();
this.backupRectangle = getBounds();
}
public XLayoutContainer getBackupParent() {
@ -904,4 +912,24 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo
}
return ((XCreator) this.getParent()).getLevel() + 1;
}
/**
* 获取组件在组件树中的显示方式
* @return
*/
public XCreatorTreeCellRender getComponentTreeCellRender(){
if (this.getBackupParent()!= null){
return this.getBackupParent().getLayoutAdapter().getLayoutTreeCellRender(this);
}
return new DefaultXCreatorTreeCellRender(this);
}
/**
* 获取组件支持的基本操作
* @return
*/
public XCreatorBaseOperate getXCreatorBaseOperate() {
return new DefaultXCreatorBaseOperate();
}
}

2
designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java

@ -55,6 +55,7 @@ import com.fr.form.ui.TreeComboBoxEditor;
import com.fr.form.ui.TreeEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.WidgetErrorMarker;
import com.fr.form.ui.container.OccupiedLayout;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBorderLayout;
@ -138,6 +139,7 @@ public class XCreatorUtils {
xLayoutMap.put(WBorderLayout.class, XWBorderLayout.class);
xLayoutMap.put(WCardLayout.class, XWCardLayout.class);
xLayoutMap.put(WVerticalBoxLayout.class, XWVerticalBoxLayout.class);
xLayoutMap.put(OccupiedLayout.class, XOccupiedLayout.class);
xLayoutMap.put(WFitLayout.class, XWFitLayout.class);
xLayoutMap.put(WScaleLayout.class, XWScaleLayout.class);

10
designer-form/src/main/java/com/fr/design/designer/creator/XLayoutContainer.java

@ -52,6 +52,8 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
private volatile boolean dragInAble;
protected boolean isFixLayout = false;
public void setMouseEnter(boolean mouseEnter) {
isMouseEnter = mouseEnter;
}
@ -61,6 +63,10 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
this.addContainerListener(this);
}
public void setFixLayout(boolean isFixLayout){
this.isFixLayout = isFixLayout;
}
/**
* 得到属性名
*
@ -598,4 +604,8 @@ public abstract class XLayoutContainer extends XBorderStyleWidgetCreator impleme
editingMouseListener.refreshTopXCreator(editing);
designer.repaint();
}
public boolean supportFixLayout(){
return false;
}
}

81
designer-form/src/main/java/com/fr/design/designer/creator/XOccupiedLayout.java

@ -0,0 +1,81 @@
package com.fr.design.designer.creator;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FROccupiedLayoutAdapter;
import com.fr.design.designer.creator.componenttree.DefaultXCreatorBaseOperate;
import com.fr.design.designer.creator.componenttree.XCreatorBaseOperate;
import com.fr.design.form.layout.FRFitLayout;
import com.fr.design.form.util.XCreatorConstants;
import com.fr.form.ui.container.OccupiedLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Stroke;
public class XOccupiedLayout extends XLayoutContainer {
public XOccupiedLayout() {
this(new OccupiedLayout(), new Dimension());
}
public XOccupiedLayout(OccupiedLayout widget, Dimension initSize) {
super(widget, initSize);
initLayoutManager();
}
public String createDefaultName() {
return "box";
}
@Override
protected void initLayoutManager() {
this.setLayout(new FRFitLayout());
}
@Override
public LayoutAdapter getLayoutAdapter() {
return new FROccupiedLayoutAdapter(this);
}
public String getIconPath() {
return "/com/fr/design/form/images/occupied_layout.png";
}
@Override
public boolean isComponentTreeLeaf() {
//在控件树上表现为叶子节点(组件放置到占位块中的时候,会删除占位块,只展示组件)
return true;
}
public XCreatorBaseOperate getXCreatorBaseOperate() {
return new DefaultXCreatorBaseOperate() {
@Override
public boolean supportSelected() {
return false;
}
};
}
@Override
public void paint(Graphics g) {
drawOccupiedComponentBounds(g);
}
private void drawOccupiedComponentBounds(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Color color = g2d.getColor();
Stroke backup = g2d.getStroke();
// 设置线条的样式
g2d.setStroke(XCreatorConstants.DASH_STROKE);
g2d.setColor(XCreatorConstants.EMPTY_OCCUPIED_LAYOUT_COLOR);
g2d.drawRect(1, 1, this.getWidth() - 2, this.getHeight() - 2);
g2d.setStroke(backup);
g2d.setColor(color);
}
}

13
designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java

@ -2,6 +2,7 @@ package com.fr.design.designer.creator;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRFitLayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRFixLayoutAdapter;
import com.fr.design.designer.beans.location.Direction;
import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.creator.cardlayout.XWTabFitLayout;
@ -80,7 +81,11 @@ public class XWFitLayout extends XLayoutContainer {
@Override
public LayoutAdapter getLayoutAdapter() {
return new FRFitLayoutAdapter(this);
FRFitLayoutAdapter layoutAdapter = new FRFitLayoutAdapter(this);
if (isFixLayout) {
layoutAdapter.setFrLayoutState(new FRFixLayoutAdapter(this));
}
return layoutAdapter;
}
@Override
@ -1005,7 +1010,7 @@ public class XWFitLayout extends XLayoutContainer {
* @return 默认返回true
*/
public boolean canAddInterval(int interval) {
int val = interval/2;
int val = (interval - this.toData().getCompInterval())/2;
for (int i=0, len=this.getComponentCount(); i<len; i++) {
XCreator comp = (XCreator) this.getComponent(i);
Rectangle rec = comp.getBounds();
@ -1293,6 +1298,7 @@ public class XWFitLayout extends XLayoutContainer {
xfl.toData().setLayoutType(WBodyLayoutType.FIT);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreator(xfl);
formDesigner.switchBodyLayout(this);
return true;
} catch (Exception e) {
FRLogger.getLogger().error(e.getMessage());
@ -1367,4 +1373,7 @@ public class XWFitLayout extends XLayoutContainer {
}
}
public boolean supportFixLayout(){
return true;
}
}

4
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java

@ -639,4 +639,8 @@ public class XWTabFitLayout extends XWFitLayout {
public boolean isTopable() {
return true;
}
public boolean supportFixLayout(){
return false;
}
}

29
designer-form/src/main/java/com/fr/design/designer/creator/componenttree/DefaultXCreatorBaseOperate.java

@ -0,0 +1,29 @@
package com.fr.design.designer.creator.componenttree;
public class DefaultXCreatorBaseOperate implements XCreatorBaseOperate {
@Override
public boolean supportSelected() {
return true;
}
@Override
public boolean supportCopyAction() {
return true;
}
@Override
public boolean supportCutAction() {
return true;
}
@Override
public boolean supportPasteAction() {
return true;
}
@Override
public boolean supportDeleteAction() {
return true;
}
}

15
designer-form/src/main/java/com/fr/design/designer/creator/componenttree/XCreatorBaseOperate.java

@ -0,0 +1,15 @@
package com.fr.design.designer.creator.componenttree;
import com.fr.design.designer.beans.adapters.layout.DesignerBaseOperate;
public interface XCreatorBaseOperate extends DesignerBaseOperate {
/**
* 是否支持选中
*
* @return boolean
*/
boolean supportSelected();
}

11
designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java

@ -4,7 +4,6 @@ import com.fr.base.BaseUtils;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.mainframe.share.util.ShareComponentUtils;
import com.fr.log.FineLoggerFactory;
import javax.swing.BorderFactory;
@ -15,8 +14,7 @@ import java.awt.Component;
import java.awt.Graphics;
public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
private boolean needAddShareIcon = false;
private static final Icon SHARE_ICON = BaseUtils.readIcon("/com/fr/design/images/toast/reuse_icon.png");
private XCreatorTreeCellRender treeCellRender;
public ComponentTreeCellRenderer() {
}
@ -36,9 +34,8 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
}
if (icon != null) {
setIcon(icon);
this.needAddShareIcon = ShareComponentUtils.isShareWidgetWithChild((XCreator) value);
}
this.treeCellRender = ((XCreator) value).getComponentTreeCellRender();
}
this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0));
this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND);
@ -48,9 +45,7 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
public void paint(Graphics g) {
super.paint(g);
if (needAddShareIcon) {
SHARE_ICON.paintIcon(this, g, 10, 0);
}
treeCellRender.paint(g, this);
}
@Override

29
designer-form/src/main/java/com/fr/design/designer/treeview/DefaultXCreatorTreeCellRender.java

@ -0,0 +1,29 @@
package com.fr.design.designer.treeview;
import com.fr.base.BaseUtils;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.mainframe.share.util.ShareComponentUtils;
import javax.swing.Icon;
import java.awt.Component;
import java.awt.Graphics;
public class DefaultXCreatorTreeCellRender implements XCreatorTreeCellRender {
private static final Icon SHARE_ICON = BaseUtils.readIcon("/com/fr/design/images/toast/reuse_icon.png");
private XCreator xCreator;
public DefaultXCreatorTreeCellRender(XCreator creator) {
this.xCreator = creator;
}
public XCreator getxCreator(){
return xCreator;
}
@Override
public void paint(Graphics g, Component c) {
if (ShareComponentUtils.isShareWidgetWithChild( xCreator)) {
SHARE_ICON.paintIcon(c, g, 10, 0);
}
}
}

8
designer-form/src/main/java/com/fr/design/designer/treeview/XCreatorTreeCellRender.java

@ -0,0 +1,8 @@
package com.fr.design.designer.treeview;
import java.awt.Component;
import java.awt.Graphics;
public interface XCreatorTreeCellRender {
void paint(Graphics g, Component c);
}

114
designer-form/src/main/java/com/fr/design/fit/attrpane/ElementEditorExtendDefinePane.java

@ -1,114 +0,0 @@
package com.fr.design.fit.attrpane;
import com.fr.base.theme.FormTheme;
import com.fr.base.theme.TemplateTheme;
import com.fr.base.theme.settings.ThemedComponentStyle;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.CRPropertyDescriptor;
import com.fr.design.designer.creator.PropertyGroupPane;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XElementCase;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.style.FollowingThemePane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.widget.accessibles.AccessibleElementCaseToolBarEditor;
import com.fr.design.widget.ui.designer.component.PaddingBoundPane;
import com.fr.design.widget.ui.designer.layout.WTitleLayoutDefinePane;
import com.fr.form.main.Form;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.PaddingMargin;
import com.fr.form.web.FormToolBarManager;
import com.fr.general.ComparatorUtils;
import com.fr.report.fit.ReportFitAttr;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
/**
* Created by kerry on 2020-04-09
*/
public class ElementEditorExtendDefinePane extends WTitleLayoutDefinePane<ElementCaseEditor> {
private final PaddingBoundPane paddingBoundPane;
private AccessibleElementCaseToolBarEditor elementCaseToolBarEditor;
private PropertyGroupPane extraPropertyGroupPane;
private PcFitExpandablePane pcFitExpandablePane;
private static final String FIT_STATE_PC = "fitStateInPC";
public ElementEditorExtendDefinePane(XCreator xCreator) {
super(xCreator);
paddingBoundPane = new PaddingBoundPane();
themePane.addFollowThemePane(paddingBoundPane, new FollowingThemePane.FollowingThemeActionChangeListener() {
@Override
public void onFollowingTheme(boolean following) {
paddingBoundPane.setVisible(!following);
if (following) {
TemplateTheme theme = themePane.getUsingTheme();
if (theme instanceof FormTheme) {
ThemedComponentStyle style = ((FormTheme) theme).getComponentStyle();
int top = style.getPaddingTop();
int bottom = style.getPaddingBottom();
int left = style.getPaddingLeft();
int right = style.getPaddingRight();
paddingBoundPane.populateBean(new PaddingMargin(top, left, bottom, right));
}
}
}
});
}
protected JPanel createCenterPane() {
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
elementCaseToolBarEditor = new AccessibleElementCaseToolBarEditor();
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_EC_Toolbar")), elementCaseToolBarEditor},
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1);
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0));
CRPropertyDescriptor[] extraTableEditor = removeOldFitEditor(((XElementCase) creator).getExtraTableEditor());
extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, creator);
centerPane.add(panel, BorderLayout.NORTH);
if (extraTableEditor.length > 0) {
centerPane.add(extraPropertyGroupPane, BorderLayout.CENTER);
}
pcFitExpandablePane = new PcFitExpandablePane(this);
centerPane.add(pcFitExpandablePane, BorderLayout.SOUTH);
return centerPane;
}
private CRPropertyDescriptor[] removeOldFitEditor(CRPropertyDescriptor[] extraTableEditor) {
List<CRPropertyDescriptor> list = new ArrayList<CRPropertyDescriptor>();
for (CRPropertyDescriptor crPropertyDescriptor : extraTableEditor) {
if (!ComparatorUtils.equals(FIT_STATE_PC, crPropertyDescriptor.getName())) {
list.add(crPropertyDescriptor);
}
}
return list.toArray(new CRPropertyDescriptor[list.size()]);
}
protected ElementCaseEditor updateSubBean() {
ElementCaseEditor elementCaseEditor = (ElementCaseEditor) creator.toData();
if (themePane.isFollowingTheme() || ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) {
paddingBoundPane.update(elementCaseEditor);
}
elementCaseEditor.setToolBars((FormToolBarManager[]) elementCaseToolBarEditor.getValue());
ReportFitAttr fitAttr = pcFitExpandablePane.update();
elementCaseEditor.setReportFitAttr(fitAttr);
return elementCaseEditor;
}
protected void populateSubBean(ElementCaseEditor ob) {
paddingBoundPane.populate(ob);
elementCaseToolBarEditor.setValue(ob.getToolBars());
extraPropertyGroupPane.populate(ob);
pcFitExpandablePane.populate(ob.getReportFitAttr());
}
}

27
designer-form/src/main/java/com/fr/design/fit/attrpane/FRAbsoluteLayoutExtendDefinePane.java

@ -1,27 +0,0 @@
package com.fr.design.fit.attrpane;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.ui.designer.layout.AbstractFRLayoutDefinePane;
import com.fr.form.ui.container.WAbsoluteLayout;
/**
* Created by kerry on 2020-04-22
*/
public class FRAbsoluteLayoutExtendDefinePane extends AbstractFRLayoutDefinePane<WAbsoluteLayout> {
public FRAbsoluteLayoutExtendDefinePane(XCreator xCreator) {
super(xCreator);
this.setLayout(FRGUIPaneFactory.createBorderLayout());
}
@Override
public void populateBean(WAbsoluteLayout ob) {
}
@Override
public WAbsoluteLayout updateBean() {
WAbsoluteLayout wAbsoluteLayout = (WAbsoluteLayout) creator.toData();
return wAbsoluteLayout;
}
}

282
designer-form/src/main/java/com/fr/design/fit/attrpane/FRFitLayoutExtendDefinePane.java

@ -1,282 +0,0 @@
package com.fr.design.fit.attrpane;
import com.fr.base.io.IOFile;
import com.fr.base.iofile.attr.WatermarkAttr;
import com.fr.base.theme.FormTheme;
import com.fr.base.theme.TemplateTheme;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.XWScaleLayout;
import com.fr.design.designer.properties.items.FRLayoutTypeItems;
import com.fr.design.designer.properties.items.Item;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.style.FollowingThemePane;
import com.fr.design.gui.xpane.LayoutStylePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.accessibles.AccessibleBodyWatermarkEditor;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.design.widget.ui.designer.component.PaddingBoundPane;
import com.fr.design.widget.ui.designer.layout.AbstractFRLayoutDefinePane;
import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.form.ui.container.WFitLayout;
import com.fr.general.ComparatorUtils;
import com.fr.general.act.BorderPacker;
import com.fr.log.FineLoggerFactory;
import com.fr.report.core.ReportUtils;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
/**
* Created by kerry on 2020-04-22
*/
public class FRFitLayoutExtendDefinePane extends AbstractFRLayoutDefinePane<WFitLayout> {
private static final int ADAPT_LABEL_MAX_WIDTH = 80;
private XWFitLayout xWFitLayout;
private WFitLayout wFitLayout;
private UIComboBox layoutComboBox;
private UISpinner componentIntervel;
private PaddingBoundPane paddingBound;
private FollowingThemePane themePane;
private LayoutStylePane stylePane;
private AccessibleBodyWatermarkEditor watermarkEditor;
public FRFitLayoutExtendDefinePane(XCreator xCreator) {
super(xCreator);
this.xWFitLayout = (XWFitLayout) xCreator;
wFitLayout = xWFitLayout.toData();
initComponent();
}
public void initComponent() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
UIExpandablePane layoutExpandablePane = new UIExpandablePane(
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"),
280, 20,
createLayoutPane()
);
this.add(layoutExpandablePane, BorderLayout.NORTH);
JPanel advancePane = createAdvancePane();
UIExpandablePane advanceExpandablePane = new UIExpandablePane(
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"),
280, 20,
advancePane
);
this.add(advanceExpandablePane, BorderLayout.CENTER);
}
public JPanel createAdvancePane() {
JPanel contentPane0 = FRGUIPaneFactory.createBorderLayout_S_Pane();
themePane = new FollowingThemePane(Toolkit.i18nText("Fine-Design_Form_Body_Style_Setting"));
stylePane = new LayoutStylePane();
themePane.addFollowThemePane(stylePane, new FollowingThemePane.FollowingThemeActionChangeListener() {
@Override
public void onFollowingTheme(boolean following) {
stylePane.supportBodyStyle(!following);
BorderPacker style = stylePane.updateBean();
if (following) {
TemplateTheme theme = themePane.getUsingTheme();
if (theme instanceof FormTheme) {
style = ((FormTheme) theme).getBodyStyle().merge(style);
}
}
stylePane.populateBean((LayoutBorderStyle) style);
}
});
contentPane0.add(themePane, BorderLayout.NORTH);
JPanel contentPane1 = FRGUIPaneFactory.createBorderLayout_S_Pane();
contentPane0.add(contentPane1, BorderLayout.CENTER);
watermarkEditor = new AccessibleBodyWatermarkEditor();
JPanel waterMarkPane = TableLayoutHelper.createGapTableLayoutPane(
new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark")), watermarkEditor}
}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W3, IntervalConstants.INTERVAL_L1);
waterMarkPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0));
contentPane1.add(waterMarkPane, BorderLayout.NORTH);
paddingBound = new PaddingBoundPane();
contentPane1.add(paddingBound, BorderLayout.CENTER);
return contentPane0;
}
public JPanel createLayoutPane() {
JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
layoutComboBox = initUIComboBox(FRLayoutTypeItems.ITEMS);
componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel);
UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval"));
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(
new Component[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")), layoutComboBox},
{intervalLabel, componentIntervelPane}
},
TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
containerPane.add(contentPane, BorderLayout.CENTER);
return containerPane;
}
public UIComboBox initUIComboBox(Item[] items) {
DefaultComboBoxModel model = new DefaultComboBoxModel();
for (Item item : items) {
model.addElement(item);
}
return new UIComboBox(model);
}
@Override
public String title4PopupWindow() {
return "fitLayout";
}
@Override
public void populateBean(WFitLayout ob) {
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
XLayoutContainer rootLayout = selectedBodyLayout(formDesigner);
if (rootLayout != formDesigner.getRootComponent()
&& formDesigner.getSelectionModel().getSelection().getSelectedCreator() == formDesigner.getRootComponent()) {
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{selectedBodyLayout(formDesigner).toData()}));
}
paddingBound.populate(ob);
layoutComboBox.setSelectedIndex(ob.getBodyLayoutType().getTypeValue());
componentIntervel.setValue(ob.getCompInterval());
themePane.supportFollowingTheme(ob.supportThemed());
themePane.setFollowingTheme(ob.isBorderStyleFollowingTheme());
stylePane.populateBean((LayoutBorderStyle) ob.getBorderStyle());
watermarkEditor.setValue(ReportUtils.getWatermarkAttrFromTemplate(getCurrentIOFile()));
}
private XLayoutContainer selectedBodyLayout(FormDesigner formDesigner) {
XLayoutContainer rootLayout = formDesigner.getRootComponent();
if (rootLayout.getComponentCount() == 1 && rootLayout.getXCreator(0).acceptType(XWAbsoluteBodyLayout.class)) {
rootLayout = (XWAbsoluteBodyLayout) rootLayout.getXCreator(0);
}
return rootLayout;
}
@Override
public WFitLayout updateBean() {
WFitLayout layout = (WFitLayout) creator.toData();
if (ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) {
paddingBound.update(layout);
}
layout.setBorderStyleFollowingTheme(themePane.isFollowingTheme());
LayoutBorderStyle borderStyle = stylePane.updateBean();
if (borderStyle != null) {
layout.setBorderStyle(borderStyle);
}
updateWatermark();
Item item = (Item) layoutComboBox.getSelectedItem();
Object value = item.getValue();
int state = 0;
if (value instanceof Integer) {
state = (Integer) value;
}
//todo 验证下
layout.setLayoutType(WBodyLayoutType.parse(state));
try {
if (state == WBodyLayoutType.ABSOLUTE.getTypeValue()) {
WAbsoluteBodyLayout wAbsoluteBodyLayout = new WAbsoluteBodyLayout("body");
wAbsoluteBodyLayout.setCompState(WAbsoluteLayout.STATE_FIXED);
Component[] components = xWFitLayout.getComponents();
xWFitLayout.removeAll();
layout.resetStyle();
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = xWFitLayout.getBackupParent() == null ? new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0, 0)) : (XWAbsoluteBodyLayout) xWFitLayout.getBackupParent();
xWFitLayout.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0);
for (Component component : components) {
XCreator xCreator = (XCreator) component;
//部分控件被ScaleLayout包裹着,绝对布局里面要放出来
if (xCreator.acceptType(XWScaleLayout.class)) {
if (xCreator.getComponentCount() > 0 && ((XCreator) xCreator.getComponent(0)).shouldScaleCreator()) {
component = xCreator.getComponent(0);
component.setBounds(xCreator.getBounds());
}
}
xwAbsoluteBodyLayout.add(component);
}
copyLayoutAttr(wFitLayout, wAbsoluteBodyLayout);
xWFitLayout.setBackupParent(xwAbsoluteBodyLayout);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{wAbsoluteBodyLayout}));
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
int intervelValue = (int) componentIntervel.getValue();
if (xWFitLayout.canAddInterval(intervelValue)) {
// 设置完间隔后,要同步处理界面组件,容器刷新后显示出对应效果
setLayoutGap(intervelValue);
}
return layout;
}
private void updateWatermark() {
WatermarkAttr watermark = (WatermarkAttr) watermarkEditor.getValue();
if (watermark != null) {
IOFile ioFile = getCurrentIOFile();
ioFile.addAttrMark(watermark);
}
}
private IOFile getCurrentIOFile() {
return WidgetPropertyPane.getInstance().getEditingFormDesigner().getTarget();
}
private void setLayoutGap(int value) {
int interval = wFitLayout.getCompInterval();
if (value != interval) {
xWFitLayout.moveContainerMargin();
xWFitLayout.moveCompInterval(xWFitLayout.getAcualInterval());
wFitLayout.setCompInterval(value);
xWFitLayout.addCompInterval(xWFitLayout.getAcualInterval());
}
}
@Override
public DataCreatorUI dataUI() {
return null;
}
}

303
designer-form/src/main/java/com/fr/design/fit/attrpane/RootDesignExtendDefinePane.java

@ -1,303 +0,0 @@
package com.fr.design.fit.attrpane;
import com.fr.base.BaseUtils;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.CRPropertyDescriptor;
import com.fr.design.designer.creator.PropertyGroupPane;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.properties.PropertyTab;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.fit.common.TemplateTool;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.fun.ParameterExpandablePaneUIProvider;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.ui.designer.AbstractDataModify;
import com.fr.design.widget.ui.designer.component.UIBoundSpinner;
import com.fr.form.ui.container.WParameterLayout;
import com.fr.general.Background;
import com.fr.report.stable.FormConstants;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Rectangle;
import java.util.Set;
public class RootDesignExtendDefinePane extends AbstractDataModify<WParameterLayout> {
private XWParameterLayout root;
private UISpinner designerWidth;
private UISpinner paraHeight;
private UICheckBox displayReport;
private UICheckBox useParamsTemplate;
private AccessibleBackgroundEditor background;
private UIButtonGroup hAlignmentPane;
private UITextField labelNameTextField;
//是否是新设计模式下决策报表
private boolean newForm;
private PropertyGroupPane extraPropertyGroupPane;
public RootDesignExtendDefinePane(XCreator xCreator) {
super(xCreator);
newForm = TemplateTool.getCurrentEditingNewJForm() != null && DesignerUIModeConfig.getInstance().newUIMode();
this.root = (XWParameterLayout) xCreator;
initComponent();
}
public void initComponent() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
if (newForm) {
paraHeight = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0);
} else {
designerWidth = new UIBoundSpinner(1, Integer.MAX_VALUE, 1);
}
JPanel advancePane = createAdvancePane();
UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, advancePane);
this.add(advanceExpandablePane, BorderLayout.NORTH);
JPanel layoutPane = createBoundsPane();
UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Size"), 280, 20, layoutPane);
this.add(layoutExpandablePane, BorderLayout.CENTER);
this.addExtraUIExpandablePaneFromPlugin();
}
private void addExtraUIExpandablePaneFromPlugin() {
Set<ParameterExpandablePaneUIProvider> pluginCreators = ExtraDesignClassManager.getInstance().getArray(ParameterExpandablePaneUIProvider.XML_TAG);
JPanel panel = FRGUIPaneFactory.createYBoxEmptyBorderPane();
for (ParameterExpandablePaneUIProvider provider : pluginCreators) {
UIExpandablePane uiExpandablePane = provider.createUIExpandablePane();
PropertyTab propertyTab = provider.addToWhichPropertyTab();
if (uiExpandablePane != null && propertyTab == PropertyTab.ATTR) {
panel.add(uiExpandablePane);
}
}
this.add(panel, BorderLayout.SOUTH);
}
public JPanel createBoundsPane() {
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double[] rowSize = {p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}};
Component[] component = newForm ? new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_Design_Height")), paraHeight} :
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width")), designerWidth};
Component[][] components = new Component[][]{component};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
jPanel.add(panel);
return jPanel;
}
public JPanel createAdvancePane() {
if (newForm) {
return getNewFormAdvancePane();
} else {
return getTemplateAdvancePane();
}
}
/**
* @Description: 获取的非新决策报表AdvancePane
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private JPanel getTemplateAdvancePane() {
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
labelNameTextField = new UITextField();
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query"));
UIComponentUtils.setLineWrap(displayReport);
useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template"));
background = new AccessibleBackgroundEditor();
Icon[] hAlignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"),
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"),
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png"),};
Integer[] hAlignment = new Integer[]{FormConstants.LEFTPOSITION, FormConstants.CENTERPOSITION, FormConstants.RIGHTPOSITION};
hAlignmentPane = new UIButtonGroup<Integer>(hAlignmentIconArray, hAlignment);
hAlignmentPane.setAllToolTips(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Left")
, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Center"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_StyleAlignment_Right")});
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p, p, p, p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}, {1, 1}};
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), background},
new Component[]{displayReport, null},
new Component[]{useParamsTemplate, null},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Display_Position")), hAlignmentPane}
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1);
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
CRPropertyDescriptor[] extraTableEditor = new CRPropertyDescriptor[0];
extraTableEditor = root.getExtraTableEditor();
extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, root);
jPanel.add(panel, BorderLayout.NORTH);
jPanel.add(extraPropertyGroupPane, BorderLayout.CENTER);
return jPanel;
}
/**
* @Description: 获取新决策报表的AdvancePane
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private JPanel getNewFormAdvancePane() {
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
labelNameTextField = new UITextField();
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query"));
UIComponentUtils.setLineWrap(displayReport);
useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template"));
background = new AccessibleBackgroundEditor();
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p, p, p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}};
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), background},
new Component[]{displayReport, null},
new Component[]{useParamsTemplate, null}
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1);
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
jPanel.add(panel, BorderLayout.NORTH);
return jPanel;
}
@Override
public String title4PopupWindow() {
return "parameter";
}
@Override
public void populateBean(WParameterLayout ob) {
labelNameTextField.setText(ob.getLabelName());
background.setValue(ob.getBackground());
displayReport.setSelected(ob.isDelayDisplayContent());
useParamsTemplate.setSelected(ob.isUseParamsTemplate());
if (newForm) {
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign();
paraHeight.setValue(designer.getParaHeight());
} else {
designerWidth.setValue(ob.getDesignWidth());
hAlignmentPane.setSelectedItem(ob.getPosition());
if (extraPropertyGroupPane != null) {
extraPropertyGroupPane.populate(ob);
}
}
}
@Override
public WParameterLayout updateBean() {
if (newForm) {
return updateNewFormBean();
} else {
return updateTemplateBean();
}
}
/**
* @Description: 更新非新决策报表的bean
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private WParameterLayout updateTemplateBean() {
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData();
wParameterLayout.setLabelName(labelNameTextField.getText());
if (isCompsOutOfDesignerWidth((int) designerWidth.getValue())) {
designerWidth.setValue(wParameterLayout.getDesignWidth());
} else {
wParameterLayout.setDesignWidth((int) designerWidth.getValue());
}
wParameterLayout.setDelayDisplayContent(displayReport.isSelected());
wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected());
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected());
wParameterLayout.setBackground((Background) background.getValue());
wParameterLayout.setPosition((Integer) hAlignmentPane.getSelectedItem());
return wParameterLayout;
}
/**
* @Description: 更新新决策报表的bean
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private WParameterLayout updateNewFormBean() {
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData();
wParameterLayout.setLabelName(labelNameTextField.getText());
wParameterLayout.setDelayDisplayContent(displayReport.isSelected());
wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected());
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected());
wParameterLayout.setBackground((Background) background.getValue());
//设置参数模板面板的高度
int height = (int) paraHeight.getTextField().getValue();
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign();
FormSelection selection = designer.getSelectionModel().getSelection();
XCreator creator = designer.getParaComponent();
Rectangle rectangle = creator.getBounds();
Rectangle newRectangle = new Rectangle(rectangle.x, rectangle.y, rectangle.width, height);
creator.setBounds(newRectangle);
if (paraHeight.getValue() != newRectangle.height)
paraHeight.setValue(newRectangle.height);
designer.setParaHeight(newRectangle.height);
designer.getArea().doLayout();
LayoutUtils.layoutContainer(creator);
selection.fixCreator(designer);
designer.repaint();
return wParameterLayout;
}
private boolean isCompsOutOfDesignerWidth(int designerWidth) {
for (int i = 0; i < root.getComponentCount(); i++) {
Component comp = root.getComponent(i);
if (comp.getX() + comp.getWidth() > designerWidth) {
return true;
}
}
return false;
}
@Override
public DataCreatorUI dataUI() {
return null;
}
}

35
designer-form/src/main/java/com/fr/design/fit/common/AdaptiveSwitchUtil.java

@ -3,39 +3,24 @@ package com.fr.design.fit.common;
import com.fr.design.data.DesignTableDataManager;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.fit.NewJForm;
import com.fr.design.fit.attrpane.ElementEditorExtendDefinePane;
import com.fr.design.fit.attrpane.FRAbsoluteBodyLayoutExtendDefinePane;
import com.fr.design.fit.attrpane.FRAbsoluteLayoutExtendDefinePane;
import com.fr.design.fit.attrpane.FRFitLayoutExtendDefinePane;
import com.fr.design.fit.attrpane.RootDesignExtendDefinePane;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JForm;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.parameter.RootDesignDefinePane;
import com.fr.design.preview.FormAdaptivePreview;
import com.fr.design.preview.FormPreview;
import com.fr.design.widget.Appearance;
import com.fr.design.widget.FormWidgetDefinePaneFactoryBase;
import com.fr.design.widget.ui.designer.layout.ElementEditorDefinePane;
import com.fr.design.widget.ui.designer.layout.FRAbsoluteBodyLayoutDefinePane;
import com.fr.design.widget.ui.designer.layout.FRAbsoluteLayoutDefinePane;
import com.fr.design.widget.ui.designer.layout.FRFitLayoutDefinePane;
import com.fr.file.FILE;
import com.fr.file.MemFILE;
import com.fr.form.main.Form;
import com.fr.form.main.WidgetGather;
import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WAbsoluteBodyLayout;
import com.fr.form.ui.container.WAbsoluteLayout;
import com.fr.form.ui.container.WFitLayout;
import com.fr.form.ui.container.WParameterLayout;
import com.fr.form.ui.widget.CRBoundsWidget;
import com.fr.log.FineLoggerFactory;
import com.fr.report.fit.ReportFitAttr;
import javax.swing.SwingUtilities;
import java.util.Set;
/**
* Created by kerry on 2020-06-02
@ -55,16 +40,6 @@ public class AdaptiveSwitchUtil {
public static void switch2NewUIMode() {
DesignerUIModeConfig.getInstance().setNewUIMode();
FormWidgetDefinePaneFactoryBase.registerDefinePane(ElementCaseEditor.class,
new Appearance(ElementEditorExtendDefinePane.class, "elementCaseEditor"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WFitLayout.class,
new Appearance(FRFitLayoutExtendDefinePane.class, "wFitLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WAbsoluteBodyLayout.class,
new Appearance(FRAbsoluteBodyLayoutExtendDefinePane.class, "wAbsoluteBodyLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WAbsoluteLayout.class,
new Appearance(FRAbsoluteLayoutExtendDefinePane.class, "wAbsoluteLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WParameterLayout.class,
new Appearance(RootDesignExtendDefinePane.class, "wParameterLayout"));
}
public static void switch2OldUI() {
@ -74,16 +49,6 @@ public class AdaptiveSwitchUtil {
public static void switch2OldUIMode() {
DesignerUIModeConfig.getInstance().setOldUIMode();
FormWidgetDefinePaneFactoryBase.registerDefinePane(WAbsoluteLayout.class,
new Appearance(FRAbsoluteLayoutDefinePane.class, "wAbsoluteLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(ElementCaseEditor.class,
new Appearance(ElementEditorDefinePane.class, "elementCaseEditor"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WAbsoluteBodyLayout.class,
new Appearance(FRAbsoluteBodyLayoutDefinePane.class, "wAbsoluteBodyLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WFitLayout.class,
new Appearance(FRFitLayoutDefinePane.class, "wFitLayout"));
FormWidgetDefinePaneFactoryBase.registerDefinePane(WParameterLayout.class,
new Appearance(RootDesignDefinePane.class, "wParameterLayout"));
}
public static void reload() {

19
designer-form/src/main/java/com/fr/design/form/util/XCreatorConstants.java

@ -3,10 +3,14 @@
*/
package com.fr.design.form.util;
import com.fr.base.GraphHelper;
import com.fr.stable.Constants;
import javax.swing.BorderFactory;
import javax.swing.border.Border;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Stroke;
/**
* @author richer
@ -52,4 +56,19 @@ public class XCreatorConstants {
// 不同粗细的线
public static final BasicStroke STROKE = new BasicStroke(2);
public static final Stroke DASH_STROKE = GraphHelper.getStroke(Constants.LINE_MEDIUM_DASH);
//空占位块
public static final Color EMPTY_OCCUPIED_LAYOUT_COLOR = new Color(217, 218, 221);
//添加组件/未释放
public static final Color DRAG_IN_OCCUPIED_LAYOUT_COLOR = new Color(65, 155, 249);
//固定布局中从占位块中拖出
public static final Color DRAG_OUT_OCCUPIED_LAYOUT_COLOR = new Color(155, 172, 245);
//从占位块中替换
public static final Color REPLACE_OCCUPIED_LAYOUT_COLOR = new Color(247, 181, 0);
}

14
designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java

@ -14,7 +14,6 @@ import com.fr.design.gui.itree.UITreeUI;
import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.StringUtils;
import java.awt.Rectangle;
import java.util.Stack;
import java.util.function.Consumer;
@ -96,6 +95,10 @@ public class ComponentTree extends JTree {
public void setSelectionPath(TreePath path) {
// 不管点击哪一项,都要先退出编辑状态(图表、报表块、绝对布局、tab块)
Object widget = path.getLastPathComponent();
if(widget == null ||!((XCreator)widget).getXCreatorBaseOperate().supportSelected()){
return;
}
designer.stopEditing(path);
super.setSelectionPath(path);
}
@ -368,7 +371,9 @@ public class ComponentTree extends JTree {
Point point = tree.getPathBounds(path).getLocation();
SwingUtilities.convertPointToScreen(point, tree);
XCreator comp = (XCreator) path.getLastPathComponent();
popupPreviewPane(point.y, comp);
if (comp.getXCreatorBaseOperate().supportSelected()){
popupPreviewPane(point.y, comp);
}
} else {
hidePreviewPane();
}
@ -384,7 +389,8 @@ public class ComponentTree extends JTree {
onMouseEvent(e, new Consumer<XCreator>() {
@Override
public void accept(XCreator creator) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1 && !designer.isFormParaDesigner()) {
if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1 && !designer.isFormParaDesigner()
&&creator.getXCreatorBaseOperate().supportSelected()) {
startEditing(creator);
}
}
@ -397,7 +403,7 @@ public class ComponentTree extends JTree {
onMouseEvent(e, new Consumer<XCreator>() {
@Override
public void accept(XCreator creator) {
if (e.getButton() == MouseEvent.BUTTON1) {
if (e.getButton() == MouseEvent.BUTTON1 && creator.getXCreatorBaseOperate().supportSelected()) {
selectedCreator = creator;
}
}

2
designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java

@ -636,7 +636,7 @@ public class EditingMouseListener extends MouseInputAdapter {
XCreator oldCreator = creator;
creator = processTopLayoutMouseClick(creator);
if (creator != null) {
if (creator != null && creator.getXCreatorBaseOperate().supportSelected()) {
// tab块处于未编辑状态
boolean uneditedTab = designer.getCursor().getType() != Cursor.HAND_CURSOR && creator.acceptType(XWCardMainBorderLayout.class) && !((XWCardMainBorderLayout) creator).isEditable();
// 点击不在tab块的button中

96
designer-form/src/main/java/com/fr/design/mainframe/FormArea.java

@ -1,12 +1,21 @@
package com.fr.design.mainframe;
import com.fr.common.inputevent.InputEventBaseOnOS;
import com.fr.design.actions.UpdateAction;
import com.fr.design.constants.UIConstants;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWBorderLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ibutton.UIButtonUI;
import com.fr.design.gui.imenu.UIPopupMenu;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.share.ui.base.PopupMenuItem;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.utils.gui.GUIPaintUtils;
import com.fr.form.fit.NewFormMarkAttr;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UINumberField;
@ -21,14 +30,17 @@ import com.fr.design.utils.ComponentUtils;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.main.mobile.FormMobileAttr;
import com.fr.form.ui.container.WBorderLayout;
import com.fr.general.FRScreen;
import com.fr.general.IOUtils;
import com.fr.stable.AssistUtils;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
@ -38,6 +50,8 @@ import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Rectangle;
@ -80,6 +94,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
// 初始时滑块值为100,托动后的值设为START_VALUE;
private double START_VALUE = DEFAULT_SLIDER;
private double screenValue;
private UIButton fixLayoutSwitchButton;
public FormScrollBar getHorScrollBar() {
@ -164,6 +179,38 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
}
};
private UIButton createFixLayoutSwitchButton(){
UIButton button = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_No_Fix_Layout"));
button.setIcon(IOUtils.readIcon("/com/fr/base/images/share/filter_combo.png"));
button.setUI(new UIButtonUI(){
@Override
protected void paintBorder(Graphics g, UIButton b) {
}
protected void doExtraPainting(UIButton b, Graphics2D g2d, int w, int h, String selectedRoles) {
if (isPressed(b) && b.isPressedPainted()) {
GUIPaintUtils.fillPressed(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles));
} else if (isRollOver(b)) {
GUIPaintUtils.fillRollOver(g2d, 0, 0, w, h, b.isRoundBorder(), b.getRectDirection(), b.isDoneAuthorityEdited(selectedRoles), b.isPressedPainted());
}
}
});
button.setHorizontalTextPosition(SwingConstants.LEFT);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
UIPopupMenu popupMenu = new UIPopupMenu();
popupMenu.setPreferredSize(new Dimension(180, 59));
popupMenu.setOnlyText(true);
popupMenu.setBackground(UIConstants.DEFAULT_BG_RULER);
popupMenu.add(new PopupMenuItem(new Switch2NoFixLayoutAction()));
popupMenu.add(new PopupMenuItem(new Switch2FixLayoutAction()));
GUICoreUtils.showPopupMenu(popupMenu, fixLayoutSwitchButton, 0, -59);
}
});
return button;
}
/**
@ -175,6 +222,11 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
double[] rowSize = {f};
double[] columnSize = {p, f, p, p, p, p, p, f, p};
UILabel tipsPane = new UILabel("form");
fixLayoutSwitchButton = createFixLayoutSwitchButton();
JPanel layoutSwitchPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane();
layoutSwitchPane.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0));
layoutSwitchPane.add(fixLayoutSwitchButton);
widthPane = new UINumberField();
widthPane.setPreferredSize(new Dimension(60, 0));
heightPane = new UINumberField();
@ -183,7 +235,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
slidePane = JFormSliderPane.getInstance();
JPanel resizePane = TableLayoutHelper.createCommonTableLayoutPane(
new JComponent[][]{{tipsPane, new UILabel(), widthPane,
new JComponent[][]{{tipsPane, layoutSwitchPane, widthPane,
new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Indent_Pixel")),
new UILabel("x"), heightPane,
new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Indent_Pixel")),
@ -198,6 +250,11 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
slidePane.addValueChangeListener(showValSpinnerChangeListener);
}
public void switchBodyLayout(XLayoutContainer xLayoutContainer) {
this.fixLayoutSwitchButton.setVisible(xLayoutContainer.supportFixLayout());
this.fixLayoutSwitchButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_No_Fix_Layout"));
}
private void setWidgetsConfig() {
widthPane.setHorizontalAlignment(widthPane.CENTER);
@ -817,7 +874,7 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
}
this.slidePane.setShowValue((int) slide);
}
}
/**
@ -899,4 +956,37 @@ public class FormArea extends JComponent implements ScrollRulerComponent {
}
class Switch2NoFixLayoutAction extends UpdateAction{
public Switch2NoFixLayoutAction(){
this.putValue(Action.SMALL_ICON, null);
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_No_Fix_Layout"));
this.setSmallIcon("/com/fr/design/form/images/no_fix_layout_icon.png");
}
@Override
public void actionPerformed(ActionEvent e) {
getFormEditor().getRootComponent().setFixLayout(false);
fixLayoutSwitchButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_No_Fix_Layout"));
DesignerContext.getDesignerFrame().refresh();
}
}
class Switch2FixLayoutAction extends UpdateAction{
public Switch2FixLayoutAction(){
this.putValue(Action.SMALL_ICON, null);
this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Fix_Layout"));
this.setSmallIcon("/com/fr/design/form/images/fix_layout_icon.png");
}
@Override
public void actionPerformed(ActionEvent e) {
getFormEditor().getRootComponent().setFixLayout(true);
fixLayoutSwitchButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Fix_Layout"));
DesignerContext.getDesignerFrame().refresh();
}
}
}

1
designer-form/src/main/java/com/fr/design/mainframe/FormCreatorDropTarget.java

@ -288,6 +288,7 @@ public class FormCreatorDropTarget extends DropTarget {
int y = designer.getRelativeY(loc.y);
hovering(x, y);
tabDragInner.canDragIn(designer.getComponentAt(x, y), x, y);
designer.draggingComponent(x, y);
}
/**

89
designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java

@ -1,10 +1,6 @@
package com.fr.design.mainframe;
import com.fr.base.Parameter;
import com.fr.base.ScreenResolution;
import com.fr.base.theme.FormTheme;
import com.fr.base.theme.TemplateTheme;
import com.fr.base.theme.TemplateThemeCompatible;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.DesignModelAdapter;
import com.fr.design.DesignState;
@ -22,7 +18,9 @@ import com.fr.design.designer.beans.actions.MoveToBottomAction;
import com.fr.design.designer.beans.actions.MoveToTopAction;
import com.fr.design.designer.beans.actions.MoveUpAction;
import com.fr.design.designer.beans.actions.PasteAction;
import com.fr.design.designer.beans.adapters.layout.DefaultDesignerBaseOperate;
import com.fr.design.designer.beans.adapters.layout.FRParameterLayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.DesignerBaseOperate;
import com.fr.design.designer.beans.events.CreatorEventListenerTable;
import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent;
@ -44,7 +42,6 @@ import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout;
import com.fr.design.designer.properties.FormWidgetAuthorityEditPane;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.event.DesignerOpenedListener;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.form.util.XCreatorConstants;
@ -61,9 +58,7 @@ import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.FormElementCaseContainerProvider;
import com.fr.form.FormElementCaseProvider;
import com.fr.form.main.Form;
import com.fr.form.main.WidgetGather;
import com.fr.form.parameter.FormSubmitButton;
import com.fr.form.ui.AbstractBorderStyleWidget;
import com.fr.form.ui.EditorHolder;
import com.fr.form.ui.PaddingMargin;
import com.fr.form.ui.Widget;
@ -160,6 +155,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
// 编辑状态的事件表
private CreatorEventListenerTable edit;
protected List<UpdateAction> designerActions;
protected List<UpdateAction> basicActions;
private FormDesignerModeForSpecial<?> desigerMode;
private Action switchAction;
private FormElementCaseContainerProvider elementCaseContainer;
@ -227,7 +223,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
public Parameter[] getNoRepeatParas(Parameter[] paras) {
List<Parameter> paraList = new ArrayList<Parameter>();
java.util.Set set = new java.util.HashSet();
Set set = new java.util.HashSet();
for (Parameter p : paras) {
if (!set.contains(p.getName().toLowerCase())) {
paraList.add(p);
@ -252,7 +248,7 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
public void refreshParameter() {
XLayoutContainer rootContainer = this.getParaComponent();
if (rootContainer != null) {
java.util.List<String> namelist = new ArrayList<String>();
List<String> namelist = new ArrayList<String>();
rootContainer.getAllXCreatorNameList(rootContainer, namelist);
// parameterArray是报表的所有参数, nameList是已经在参数面板添加过控件的参数名
// 与已有的参数列表比较 如果已经存在 就除去
@ -1214,20 +1210,28 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
public void startDraggingComponent(XCreator xCreator, MouseEvent lastPressEvent, int x, int y) {
// 根据所选择的组件的BeanInfo生成相应的AddingModel
// AddingModel和StateModel不一样,适合当前选择的组件相关的
int creatorWidth = xCreator.getWidth();
int creatorHeight = xCreator.getHeight();
this.addingModel = new AddingModel(xCreator, x, y);
TransferHandler handler = new DesignerTransferHandler(this, addingModel);
setTransferHandler(handler);
handler.exportAsDrag(this, lastPressEvent, TransferHandler.COPY);
XCreator parent = XCreatorUtils.getParentXLayoutContainer(xCreator);
selectionModel.removeCreator(xCreator, creatorWidth, creatorHeight);
selectionModel.setSelectedCreator(parent);
XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(xCreator);
parent.getLayoutAdapter().dragStart(xCreator, selectionModel);
this.setDropTarget(new FormCreatorDropTarget(this));
// 触发状态添加模式事件
repaint();
}
public void draggingComponent(int x, int y){
XCreator xCreator = this.addingModel.getXCreator();
XLayoutContainer parent = XCreatorUtils.getParentXLayoutContainer(xCreator);
if (parent!= null && parent.getLayoutAdapter()!=null){
parent.getLayoutAdapter().dragOver(xCreator, selectionModel, x, y);
}
// 触发状态添加模式事件
repaint();
}
/**
* 改变组件值
*
@ -1378,14 +1382,37 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
*/
public UpdateAction[] getActions() {
if (designerActions == null) {
designerActions = new ArrayList<UpdateAction>(Arrays.asList(new UpdateAction[]{new CutAction(this), new CopyAction(this), new PasteAction(this),
new FormDeleteAction(this), new MoveToTopAction(this), new MoveToBottomAction(this),
new MoveUpAction(this), new MoveDownAction(this)}));
designerActions = new ArrayList<UpdateAction>(getBasicActions());
designerActions.add(new MoveToTopAction(this));
designerActions.add(new MoveToBottomAction(this));
designerActions.add(new MoveUpAction(this));
designerActions.add(new MoveDownAction(this));
dmlActions(designerActions);
}
return designerActions.toArray(new UpdateAction[designerActions.size()]);
}
private List<UpdateAction> getBasicActions(){
if (basicActions == null) {
basicActions = new ArrayList<UpdateAction>();
basicActions.add(new CutAction(this));
basicActions.add(new CopyAction(this));
basicActions.add(new PasteAction(this));
basicActions.add(new FormDeleteAction(this));
}
return basicActions;
}
public JComponent[] getBasicActionComponent() {
List<UpdateAction> actions = getBasicActions();
int size = actions.size();
JComponent[] jComponents = new JComponent[size];
for (int i = 0; i < size; i++) {
jComponents[i] = actions.get(i).createToolBarComponentByName("Global_Toolbar");
}
return jComponents;
}
/**
* 扩展菜单项
*
@ -1404,16 +1431,34 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
}
}
private DesignerBaseOperate getLayoutBaseOperate(){
FormSelection selection = this.getSelectionModel().getSelection();
XCreator creator = selection.getSelectedCreator();
XLayoutContainer container = (XLayoutContainer) creator.getParent();
if (container == null) {
return new DefaultDesignerBaseOperate();
}
return container.getLayoutAdapter().getDesignerBaseOperate();
}
public boolean isCurrentComponentCutable() {
return !(isRootSelected() || isParameterSelected());
DesignerBaseOperate designerBaseOperate = getLayoutBaseOperate();
return !(isRootSelected() || isParameterSelected()) && designerBaseOperate.supportCutAction();
}
public boolean isCurrentComponentCopyable() {
return !(isRootSelected() || isParameterSelected());
DesignerBaseOperate designerBaseOperate = getLayoutBaseOperate();
return !(isRootSelected() || isParameterSelected()) && designerBaseOperate.supportCopyAction();
}
public boolean isCurrentComponentDeletable() {
return !isRootSelected();
DesignerBaseOperate designerBaseOperate = getLayoutBaseOperate();
return !isRootSelected() && designerBaseOperate.supportDeleteAction();
}
public boolean isCurrentComponentPastable() {
DesignerBaseOperate designerBaseOperate = getLayoutBaseOperate();
return designerBaseOperate.supportPasteAction();
}
// 当前选中控件可以上移一层吗?
@ -1469,6 +1514,10 @@ public class FormDesigner extends TargetComponent<Form> implements TreeSelection
return formArea;
}
public void switchBodyLayout(XLayoutContainer xLayoutContainer){
formArea.switchBodyLayout(xLayoutContainer);
}
/**
* 设置上层区域
*

6
designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java

@ -210,10 +210,10 @@ public class FormDesignerUI extends ComponentUI {
}
XCreator bean = addingModel.getXCreator();
int x = addingModel.getCurrentX();
int y = addingModel.getCurrentY();
int y = addingModel.getCurrentY() ;
int width = bean.getWidth();
int height = bean.getHeight();
int width = bean.initEditorSize().width;
int height = bean.initEditorSize().height;
Graphics clipg = g.create(x, y, width, height);
ArrayList<JComponent> dbcomponents = new ArrayList<JComponent>();
// 禁止双缓冲行为

6
designer-form/src/main/java/com/fr/design/mainframe/JForm.java

@ -749,11 +749,7 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm<F
*/
public JComponent[] toolBarButton4Form() {
return this.index == FORM_TAB ?
new JComponent[]{
new CutAction(formDesign).createToolBarComponent(),
new CopyAction(formDesign).createToolBarComponent(),
new PasteAction(formDesign).createToolBarComponent(),
new FormDeleteAction(formDesign).createToolBarComponent()} :
formDesign.getBasicActionComponent():
elementCaseDesign.toolBarButton4Form();
}

3
designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java

@ -58,6 +58,9 @@ public class TopXCreator extends JComponent {
@Override
public void paint(Graphics g) {
super.paint(g);
if (creator == null || creator.getParent() == null){
return;
}
ArrayList<JComponent> dbcomponents = new ArrayList<JComponent>();
// 禁止双缓冲
ComponentUtils.disableBuffer(creator, dbcomponents);

147
designer-form/src/main/java/com/fr/design/parameter/RootDesignDefinePane.java

@ -10,6 +10,8 @@ import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XWParameterLayout;
import com.fr.design.designer.properties.PropertyTab;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.fit.common.TemplateTool;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.fun.ParameterExpandablePaneUIProvider;
import com.fr.design.gui.ibutton.UIButtonGroup;
@ -20,8 +22,11 @@ import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelection;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.widget.accessibles.AccessibleBackgroundEditor;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.ui.designer.AbstractDataModify;
import com.fr.design.widget.ui.designer.component.UIBoundSpinner;
@ -35,6 +40,7 @@ import javax.swing.Icon;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Rectangle;
import java.util.Set;
/**
@ -43,18 +49,19 @@ import java.util.Set;
public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
private XWParameterLayout root;
private UISpinner designerWidth;
private UISpinner paraHeight;
private UICheckBox displayReport;
private UICheckBox useParamsTemplate;
private AccessibleBackgroundEditor background;
private UIButtonGroup hAlignmentPane;
private UITextField labelNameTextField;
/**
* 插件带来的额外属性
*/
//是否是新设计模式下决策报表
private boolean newForm;
private PropertyGroupPane extraPropertyGroupPane;
public RootDesignDefinePane(XCreator xCreator) {
super(xCreator);
newForm = TemplateTool.getCurrentEditingNewJForm() != null && DesignerUIModeConfig.getInstance().newUIMode();
this.root = (XWParameterLayout) xCreator;
initComponent();
}
@ -62,7 +69,11 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
public void initComponent() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
designerWidth = new UIBoundSpinner(1, Integer.MAX_VALUE, 1);
if (newForm) {
paraHeight = new UIBoundSpinner(0, Integer.MAX_VALUE, 1, 0);
} else {
designerWidth = new UIBoundSpinner(1, Integer.MAX_VALUE, 1);
}
JPanel advancePane = createAdvancePane();
UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, advancePane);
this.add(advanceExpandablePane, BorderLayout.NORTH);
@ -70,7 +81,6 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Size"), 280, 20, layoutPane);
this.add(layoutExpandablePane, BorderLayout.CENTER);
this.addExtraUIExpandablePaneFromPlugin();
}
private void addExtraUIExpandablePaneFromPlugin() {
@ -92,9 +102,9 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
double[] rowSize = {p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}};
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width")), designerWidth},
};
Component[] component = newForm ? new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Fit_Design_Height")), paraHeight} :
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Desin_Width")), designerWidth};
Component[][] components = new Component[][]{component};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
@ -103,6 +113,21 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
}
public JPanel createAdvancePane() {
if (newForm) {
return getNewFormAdvancePane();
} else {
return getTemplateAdvancePane();
}
}
/**
* @Description: 获取的非新决策报表AdvancePane
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private JPanel getTemplateAdvancePane() {
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
labelNameTextField = new UITextField();
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query"));
@ -139,6 +164,40 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
return jPanel;
}
/**
* @Description: 获取新决策报表的AdvancePane
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private JPanel getNewFormAdvancePane() {
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
labelNameTextField = new UITextField();
displayReport = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Display_Nothing_Before_Query"));
UIComponentUtils.setLineWrap(displayReport);
useParamsTemplate = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Use_Params_Template"));
background = new AccessibleBackgroundEditor();
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p, p, p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}};
Component[][] components = new Component[][]{
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Label_Name")), labelNameTextField},
new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Base_Background")), background},
new Component[]{displayReport, null},
new Component[]{useParamsTemplate, null}
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1);
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
jPanel.add(panel, BorderLayout.NORTH);
return jPanel;
}
@Override
public String title4PopupWindow() {
return "parameter";
@ -150,17 +209,37 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
background.setValue(ob.getBackground());
displayReport.setSelected(ob.isDelayDisplayContent());
useParamsTemplate.setSelected(ob.isUseParamsTemplate());
designerWidth.setValue(ob.getDesignWidth());
hAlignmentPane.setSelectedItem(ob.getPosition());
if (newForm) {
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign();
paraHeight.setValue(designer.getParaHeight());
} else {
designerWidth.setValue(ob.getDesignWidth());
hAlignmentPane.setSelectedItem(ob.getPosition());
if (extraPropertyGroupPane != null) {
extraPropertyGroupPane.populate(ob);
if (extraPropertyGroupPane != null) {
extraPropertyGroupPane.populate(ob);
}
}
}
@Override
public WParameterLayout updateBean() {
if (newForm) {
return updateNewFormBean();
} else {
return updateTemplateBean();
}
}
/**
* @Description: 更新非新决策报表的bean
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private WParameterLayout updateTemplateBean() {
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData();
wParameterLayout.setLabelName(labelNameTextField.getText());
if (isCompsOutOfDesignerWidth((int) designerWidth.getValue())) {
@ -173,22 +252,56 @@ public class RootDesignDefinePane extends AbstractDataModify<WParameterLayout> {
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected());
wParameterLayout.setBackground((Background) background.getValue());
wParameterLayout.setPosition((int) hAlignmentPane.getSelectedItem());
wParameterLayout.setPosition((Integer) hAlignmentPane.getSelectedItem());
return wParameterLayout;
}
private boolean isCompsOutOfDesignerWidth(int designerWidth){
for(int i=0; i<root.getComponentCount(); i++){
/**
* @Description: 更新新决策报表的bean
* @param
* @return:
* @Author: Henry.Wang
* @date: 2020/11/05 15:36
*/
private WParameterLayout updateNewFormBean() {
WParameterLayout wParameterLayout = (WParameterLayout) creator.toData();
wParameterLayout.setLabelName(labelNameTextField.getText());
wParameterLayout.setDelayDisplayContent(displayReport.isSelected());
wParameterLayout.setUseParamsTemplate(useParamsTemplate.isSelected());
JTemplate jTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
jTemplate.needAddTemplateIdAttr(useParamsTemplate.isSelected());
wParameterLayout.setBackground((Background) background.getValue());
//设置参数模板面板的高度
int height = (int) paraHeight.getTextField().getValue();
FormDesigner designer = TemplateTool.getCurrentEditingNewJForm().getFormDesign();
FormSelection selection = designer.getSelectionModel().getSelection();
XCreator creator = designer.getParaComponent();
Rectangle rectangle = creator.getBounds();
Rectangle newRectangle = new Rectangle(rectangle.x, rectangle.y, rectangle.width, height);
creator.setBounds(newRectangle);
if (paraHeight.getValue() != newRectangle.height)
paraHeight.setValue(newRectangle.height);
designer.setParaHeight(newRectangle.height);
designer.getArea().doLayout();
LayoutUtils.layoutContainer(creator);
selection.fixCreator(designer);
designer.repaint();
return wParameterLayout;
}
private boolean isCompsOutOfDesignerWidth(int designerWidth) {
for (int i = 0; i < root.getComponentCount(); i++) {
Component comp = root.getComponent(i);
if(comp.getX() + comp.getWidth() > designerWidth){
if (comp.getX() + comp.getWidth() > designerWidth) {
return true;
}
}
return false;
}
@Override
public DataCreatorUI dataUI() {
return null;
}
}

30
designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java

@ -14,6 +14,7 @@ import com.fr.form.ui.RichStyleWidgetProvider;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.Component;
@ -37,10 +38,10 @@ public class PaddingBoundPane extends BasicPane {
public void initBoundPane(int t, int b, int l, int r) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
top = new UISpinner(0, Integer.MAX_VALUE, 1, t);
bottom = new UISpinner(0, Integer.MAX_VALUE, 1, b);
left = new UISpinner(0, Integer.MAX_VALUE, 1, l);
right = new UISpinner(0, Integer.MAX_VALUE, 1, r);
top = new UISpinner(0, Integer.MAX_VALUE, 1, t, false);
bottom = new UISpinner(0, Integer.MAX_VALUE, 1, b, false);
left = new UISpinner(0, Integer.MAX_VALUE, 1, l, false);
right = new UISpinner(0, Integer.MAX_VALUE, 1, r, false);
top.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
bottom.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
left.setGlobalName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"));
@ -79,13 +80,32 @@ public class PaddingBoundPane extends BasicPane {
}
public void update(RichStyleWidgetProvider marginWidget) {
marginWidget.setMargin(updateBean());
try {
marginWidget.setMargin(updateBean());
} catch (UnsupportedOperationException e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
populateBean(marginWidget.getMargin());
}
});
}
}
public PaddingMargin updateBean() {
return new PaddingMargin((int) top.getValue(), (int) left.getValue(), (int) bottom.getValue(), (int) right.getValue());
}
@Override
public void setEnabled(boolean enabled) {
this.top.setEnabled(enabled);
this.left.setEnabled(enabled);
this.bottom.setEnabled(enabled);
this.right.setEnabled(enabled);
}
@Override
protected String title4PopupWindow() {
return "PaddingBoundPane";

38
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/ElementEditorDefinePane.java

@ -5,6 +5,8 @@ import com.fr.base.theme.TemplateTheme;
import com.fr.base.theme.settings.ThemedComponentStyle;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.*;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.fit.attrpane.PcFitExpandablePane;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.style.FollowingThemePane;
import com.fr.design.layout.FRGUIPaneFactory;
@ -15,12 +17,15 @@ import com.fr.form.ui.ElementCaseEditor;
import com.fr.form.ui.PaddingMargin;
import com.fr.form.web.FormToolBarManager;
import com.fr.general.ComparatorUtils;
import com.fr.report.fit.ReportFitAttr;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
/**
* Created by ibm on 2017/8/7.
@ -29,6 +34,9 @@ public class ElementEditorDefinePane extends WTitleLayoutDefinePane<ElementCaseE
private final PaddingBoundPane paddingBoundPane;
private AccessibleElementCaseToolBarEditor elementCaseToolBarEditor;
private PropertyGroupPane extraPropertyGroupPane;
private PcFitExpandablePane pcFitExpandablePane;
private static final String FIT_STATE_PC = "fitStateInPC";
public ElementEditorDefinePane(XCreator xCreator) {
super(xCreator);
@ -61,27 +69,49 @@ public class ElementEditorDefinePane extends WTitleLayoutDefinePane<ElementCaseE
};
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1);
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0));
CRPropertyDescriptor[] extraTableEditor = ((XElementCase) creator).getExtraTableEditor();
CRPropertyDescriptor[] extraTableEditor = removeOldFitEditor(((XElementCase) creator).getExtraTableEditor());
extraPropertyGroupPane = new PropertyGroupPane(extraTableEditor, creator);
centerPane.add(panel, BorderLayout.NORTH);
centerPane.add(extraPropertyGroupPane, BorderLayout.CENTER);
if (extraTableEditor.length > 0) {
centerPane.add(extraPropertyGroupPane, BorderLayout.CENTER);
}
pcFitExpandablePane = new PcFitExpandablePane(this);
if (DesignerUIModeConfig.getInstance().newUIMode()) {
centerPane.add(pcFitExpandablePane, BorderLayout.SOUTH);
}
return centerPane;
}
private CRPropertyDescriptor[] removeOldFitEditor(CRPropertyDescriptor[] extraTableEditor) {
if (!DesignerUIModeConfig.getInstance().newUIMode()) {
return extraTableEditor;
}
List<CRPropertyDescriptor> list = new ArrayList<CRPropertyDescriptor>();
for (CRPropertyDescriptor crPropertyDescriptor : extraTableEditor) {
if (!ComparatorUtils.equals(FIT_STATE_PC, crPropertyDescriptor.getName())) {
list.add(crPropertyDescriptor);
}
}
return list.toArray(new CRPropertyDescriptor[list.size()]);
}
protected ElementCaseEditor updateSubBean() {
ElementCaseEditor elementCaseEditor = (ElementCaseEditor) creator.toData();
if (themePane.isFollowingTheme() || ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) {
paddingBoundPane.update(elementCaseEditor);
}
elementCaseEditor.setToolBars((FormToolBarManager[]) elementCaseToolBarEditor.getValue());
ReportFitAttr fitAttr = pcFitExpandablePane.update();
elementCaseEditor.setReportFitAttr(fitAttr);
return elementCaseEditor;
}
protected void populateSubBean(ElementCaseEditor ob) {
paddingBoundPane.populate(ob);
elementCaseToolBarEditor.setValue(ob.getToolBars());
extraPropertyGroupPane.populate(ob);
pcFitExpandablePane.populate(ob.getReportFitAttr());
}
}

52
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java

@ -11,6 +11,8 @@ import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.properties.items.FRLayoutTypeItems;
import com.fr.design.designer.properties.items.Item;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
@ -19,6 +21,8 @@ import com.fr.design.gui.xpane.LayoutStylePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.accessibles.AccessibleBodyWatermarkEditor;
import com.fr.design.widget.FRWidgetFactory;
@ -36,6 +40,12 @@ import javax.swing.DefaultComboBoxModel;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import static javax.swing.JOptionPane.OK_CANCEL_OPTION;
import static javax.swing.JOptionPane.OK_OPTION;
import static javax.swing.JOptionPane.WARNING_MESSAGE;
/**
* Created by ibm on 2017/8/2.
@ -60,8 +70,9 @@ public class FRAbsoluteBodyLayoutDefinePane extends FRAbsoluteLayoutDefinePane {
initUIComboBox();
this.setLayout(FRGUIPaneFactory.createBorderLayout());
boundPane = new WidgetBoundPane(creator);
this.add(boundPane, BorderLayout.NORTH);
if (!DesignerUIModeConfig.getInstance().newUIMode()){
this.add(boundPane, BorderLayout.NORTH);
}
JPanel panel1 = FRGUIPaneFactory.createBorderLayout_S_Pane();
this.add(panel1, BorderLayout.CENTER);
@ -118,12 +129,13 @@ public class FRAbsoluteBodyLayoutDefinePane extends FRAbsoluteLayoutDefinePane {
UILabel layoutTypeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type"));
UILabel scaleModeLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Scaling_Mode"));
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(
new Component[][]{
{layoutTypeLabel, layoutCombox},
{scaleModeLabel, comboBox}
},
Component[][] components = DesignerUIModeConfig.getInstance().newUIMode() ? new Component[][]{
{layoutTypeLabel, layoutCombox}
} : new Component[][]{
{layoutTypeLabel, layoutCombox},
{scaleModeLabel, comboBox}
};
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(components,
TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
contentPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
@ -173,12 +185,24 @@ public class FRAbsoluteBodyLayoutDefinePane extends FRAbsoluteLayoutDefinePane {
((XWFitLayout) creator.getBackupParent()).toData().resetStyle();
if (state == WBodyLayoutType.FIT.getTypeValue()) {
XWFitLayout xwFitLayout = ((XWFitLayout)creator.getBackupParent());
xwFitLayout.switch2FitBodyLayout(creator);
WFitLayout wFitLayout = xwFitLayout.toData();
// 切换布局类型时,保留body背景样式
if (wFitLayout != null) {
wFitLayout.setBorderStyleFollowingTheme(layout.isBorderStyleFollowingTheme());
wFitLayout.setBorderStyle(layout.getBorderStyle());
int selVal = FineJOptionPane.showConfirmDialog(
DesignerContext.getDesignerFrame(),
Toolkit.i18nText("切换后所有组件的位置都会改变且无法恢复,确认切换吗?"),
Toolkit.i18nText("Fine-Design_Basic_Alert"),
OK_CANCEL_OPTION,
WARNING_MESSAGE
);
if(OK_OPTION == selVal){
xwFitLayout.switch2FitBodyLayout(creator);
WFitLayout wFitLayout = xwFitLayout.toData();
// 切换布局类型时,保留body背景样式
if (wFitLayout != null) {
wFitLayout.setBorderStyleFollowingTheme(layout.isBorderStyleFollowingTheme());
wFitLayout.setBorderStyle(layout.getBorderStyle());
}
copyLayoutAttr(layout, xwFitLayout.toData());
}else {
this.layoutCombox.setSelectedIndex(1);
}
copyLayoutAttr(layout, xwFitLayout.toData());
xwFitLayout.refreshStylePreviewEffect();

5
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteLayoutDefinePane.java

@ -5,6 +5,7 @@ import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.properties.items.FRAbsoluteConstraintsItems;
import com.fr.design.designer.properties.items.Item;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
@ -39,7 +40,9 @@ public class FRAbsoluteLayoutDefinePane extends AbstractFRLayoutDefinePane<WAbso
jPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
thirdPane.add(jPanel, BorderLayout.CENTER);
UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Area_Scaling"), 280, 20, thirdPane);
this.add(layoutExpandablePane, BorderLayout.CENTER);
if (!DesignerUIModeConfig.getInstance().newUIMode()){
this.add(layoutExpandablePane, BorderLayout.CENTER);
}
}
public JPanel createThirdPane() {

68
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java

@ -6,14 +6,17 @@ import com.fr.base.theme.FormTheme;
import com.fr.base.theme.TemplateTheme;
import com.fr.design.data.DataCreatorUI;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XOccupiedLayout;
import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWFitLayout;
import com.fr.design.designer.creator.XWScaleLayout;
import com.fr.design.designer.properties.items.FRFitConstraintsItems;
import com.fr.design.designer.properties.items.FRLayoutTypeItems;
import com.fr.design.designer.properties.items.Item;
import com.fr.design.fit.DesignerUIModeConfig;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.UILabel;
@ -27,6 +30,7 @@ import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormSelectionUtils;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.mainframe.widget.accessibles.AccessibleBodyWatermarkEditor;
import com.fr.design.ui.util.UIUtil;
import com.fr.design.utils.gui.UIComponentUtils;
import com.fr.design.widget.FRWidgetFactory;
import com.fr.design.widget.ui.designer.component.PaddingBoundPane;
@ -44,6 +48,8 @@ import com.fr.report.core.ReportUtils;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
/**
* Created by ibm on 2017/8/2.
@ -125,24 +131,37 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane<WFitLayout
return contentPane0;
}
private boolean supportModifyInterval(){
LayoutAdapter layoutAdapter = this.xWFitLayout.getLayoutAdapter();
if (layoutAdapter == null){
return true;
}
return layoutAdapter.supportModifyInsert();
}
public JPanel createLayoutPane() {
JPanel containerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
layoutComboBox = initUIComboBox(FRLayoutTypeItems.ITEMS);
adaptComboBox = initUIComboBox(FRFitConstraintsItems.ITEMS);
JPanel adaptComboBoxPane = UIComponentUtils.wrapWithBorderLayoutPane(adaptComboBox);
componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, 0, false);
JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel);
UILabel adaptLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Scale"));
UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval"));
Component[][] components = DesignerUIModeConfig.getInstance().newUIMode() ? new Component[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")), layoutComboBox},
{intervalLabel, componentIntervelPane}
} : new Component[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")), layoutComboBox},
{adaptLabel, adaptComboBoxPane},
{intervalLabel, componentIntervelPane}
};
JPanel contentPane = TableLayoutHelper.createGapTableLayoutPane(
new Component[][]{
{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Attr_Layout_Type")), layoutComboBox},
{adaptLabel, adaptComboBoxPane},
{intervalLabel, componentIntervelPane}
},
components,
TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
contentPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0));
containerPane.add(contentPane, BorderLayout.CENTER);
@ -176,9 +195,12 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane<WFitLayout
}
paddingBound.populate(ob);
paddingBound.setEnabled(supportModifyInterval());
layoutComboBox.setSelectedIndex(ob.getBodyLayoutType().getTypeValue());
adaptComboBox.setSelectedIndex(ob.getCompState());
componentIntervel.setValue(ob.getCompInterval());
componentIntervel.setEnabled(supportModifyInterval());
themePane.supportFollowingTheme(ob.supportThemed());
themePane.setFollowingTheme(ob.isBorderStyleFollowingTheme());
stylePane.populateBean((LayoutBorderStyle) ob.getBorderStyle());
@ -224,27 +246,32 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane<WFitLayout
wAbsoluteBodyLayout.setBorderStyleFollowingTheme(layout.isBorderStyleFollowingTheme());
wAbsoluteBodyLayout.setBorderStyle((BorderPacker) (layout.getBorderStyle().clone()));
Component[] components = xWFitLayout.getComponents();
Rectangle[] backupBounds = getBackupBoundsFromFitLayout();
xWFitLayout.removeAll();
layout.resetStyle();
XWAbsoluteBodyLayout xwAbsoluteBodyLayout = xWFitLayout.getBackupParent() == null ? new XWAbsoluteBodyLayout(wAbsoluteBodyLayout, new Dimension(0, 0)) : (XWAbsoluteBodyLayout) xWFitLayout.getBackupParent();
xWFitLayout.setFixLayout(false);
xWFitLayout.getLayoutAdapter().addBean(xwAbsoluteBodyLayout, 0, 0);
for (Component component : components) {
XCreator xCreator = (XCreator) component;
for (int i = 0; i < components.length; i++) {
XCreator xCreator = (XCreator) components[i];
xCreator.setBounds(backupBounds[i]);
//部分控件被ScaleLayout包裹着,绝对布局里面要放出来
if (xCreator.acceptType(XWScaleLayout.class)) {
if (xCreator.getComponentCount() > 0 && ((XCreator) xCreator.getComponent(0)).shouldScaleCreator()) {
component = xCreator.getComponent(0);
Component component = xCreator.getComponent(0);
component.setBounds(xCreator.getBounds());
}
}
xwAbsoluteBodyLayout.add(component);
if (!xCreator.acceptType(XOccupiedLayout.class)){
xwAbsoluteBodyLayout.add(xCreator);
}
}
copyLayoutAttr(wFitLayout, xwAbsoluteBodyLayout.toData());
xWFitLayout.setBackupParent(xwAbsoluteBodyLayout);
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
formDesigner.getSelectionModel().setSelectedCreators(
FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{wAbsoluteBodyLayout}));
if (xwAbsoluteBodyLayout.toData() != null) {
xwAbsoluteBodyLayout.toData().setBorderStyleFollowingTheme(wAbsoluteBodyLayout.isBorderStyleFollowingTheme());
xwAbsoluteBodyLayout.toData().setBorderStyle(wAbsoluteBodyLayout.getBorderStyle());
@ -254,6 +281,8 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane<WFitLayout
xWFitLayout.toData().resetStyle();
}
xWFitLayout.refreshStylePreviewEffect();
formDesigner.switchBodyLayout(xwAbsoluteBodyLayout);
return layout;
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
@ -264,11 +293,28 @@ public class FRFitLayoutDefinePane extends AbstractFRLayoutDefinePane<WFitLayout
if (xWFitLayout.canAddInterval(intervelValue)) {
// 设置完间隔后,要同步处理界面组件,容器刷新后显示出对应效果
setLayoutGap(intervelValue);
} else{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
componentIntervel.setValue(wFitLayout.getCompInterval(), false);
}
});
}
return layout;
}
private Rectangle[] getBackupBoundsFromFitLayout() {
int count = xWFitLayout.getComponentCount();
Rectangle[] rectangles = new Rectangle[count];
for (int i = 0; i < count; i++) {
rectangles[i] = xWFitLayout.getComponent(i).getBounds();
}
return rectangles;
}
private void updateWatermark() {
WatermarkAttr watermark = (WatermarkAttr) watermarkEditor.getValue();
if (watermark != null) {

BIN
designer-form/src/main/resources/com/fr/design/form/images/fix_layout_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

BIN
designer-form/src/main/resources/com/fr/design/form/images/no_fix_layout_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 B

BIN
designer-form/src/main/resources/com/fr/design/form/images/occupied_layout.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Loading…
Cancel
Save