forked from fanruan/design
Browse Source
Merge in DESIGN/design from ~HARRISON/design:release/10.0 to release/10.0 * commit '628727d69e9770c4a10571f43303e23298d1f160': REPORT-32149【组件加密】@harrison两个组件进行拖入,模板预览很奇怪 将逻辑分散到各个组件中。 减少同一个方法中的耦合 REPORT-32149【组件加密】@harrison两个组件进行拖入,模板预览很奇怪 考虑专属容器 + cardLayout REPORT-32149【组件加密】@harrison两个组件进行拖入,模板预览很奇怪 [关联场景] https://kms.fineres.com/pages/viewpage.action?pageId=116725800 [处理方案] 1、获取目标 creator 2、对 creator 的名字进行处理。 3、存在 widgetname , 说明已经初始化了, 直接通过 widgetname 处理 4、不存在, 则需要赋予一个默认的 widgetnamefeature/big-screen
6 changed files with 249 additions and 19 deletions
@ -0,0 +1,55 @@ |
|||||||
|
package com.fr.design.designer.beans.models; |
||||||
|
|
||||||
|
import com.fr.design.designer.creator.XCreator; |
||||||
|
import com.fr.design.designer.creator.XWParameterLayout; |
||||||
|
import com.fr.form.main.Form; |
||||||
|
import com.fr.form.ui.Widget; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
/** |
||||||
|
* created by Harrison on 2020/06/05 |
||||||
|
**/ |
||||||
|
abstract class ModelUtil { |
||||||
|
|
||||||
|
public static void renameWidgetName(Form form, XCreator xCreator) { |
||||||
|
|
||||||
|
Set<String> duplicated = new HashSet<>(); |
||||||
|
recursiveRenameWidgetName(form, xCreator, duplicated); |
||||||
|
} |
||||||
|
|
||||||
|
private static void recursiveRenameWidgetName(Form form, XCreator xCreator, Set<String> duplicated) { |
||||||
|
|
||||||
|
Set<XCreator> nameRelatedCreators = new HashSet<>(); |
||||||
|
//直接遍历出来目标值,然后按需处理
|
||||||
|
xCreator.traversalNameRelatedXCreators(nameRelatedCreators); |
||||||
|
for (XCreator target : nameRelatedCreators) { |
||||||
|
String uniqueName = uniqueName(form, target, duplicated); |
||||||
|
target.resetCreatorName(uniqueName); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static String uniqueName(Form form, XCreator xCreator, Set<String> duplicated) { |
||||||
|
|
||||||
|
if (xCreator.acceptType(XWParameterLayout.class)) { |
||||||
|
return xCreator.createDefaultName(); |
||||||
|
} |
||||||
|
Widget widget = xCreator.toData(); |
||||||
|
String widgetName = widget.getWidgetName(); |
||||||
|
if (StringUtils.isEmpty(widgetName)) { |
||||||
|
widgetName = xCreator.createDefaultName(); |
||||||
|
} |
||||||
|
String raw = widgetName; |
||||||
|
int i = 0; |
||||||
|
while (form.isNameExist(widgetName) || duplicated.contains(widgetName)) { |
||||||
|
widgetName = raw + i; |
||||||
|
i++; |
||||||
|
} |
||||||
|
//将名字加入重复集合中
|
||||||
|
duplicated.add(widgetName); |
||||||
|
return widgetName; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,146 @@ |
|||||||
|
package com.fr.design.designer.beans.models; |
||||||
|
|
||||||
|
import com.fr.config.dao.DaoContext; |
||||||
|
import com.fr.config.dao.impl.LocalClassHelperDao; |
||||||
|
import com.fr.config.dao.impl.LocalEntityDao; |
||||||
|
import com.fr.config.dao.impl.LocalXmlEntityDao; |
||||||
|
import com.fr.design.designer.creator.CRPropertyDescriptor; |
||||||
|
import com.fr.design.designer.creator.XCreator; |
||||||
|
import com.fr.design.designer.creator.XLayoutContainer; |
||||||
|
import com.fr.design.designer.creator.XWTitleLayout; |
||||||
|
import com.fr.design.designer.creator.cardlayout.XWCardLayout; |
||||||
|
import com.fr.design.mainframe.FormDesigner; |
||||||
|
import com.fr.form.main.Form; |
||||||
|
import com.fr.form.ui.ChartEditor; |
||||||
|
import com.fr.form.ui.Widget; |
||||||
|
import com.fr.form.ui.container.WAbsoluteLayout; |
||||||
|
import com.fr.form.ui.container.WCardLayout; |
||||||
|
import com.fr.form.ui.container.WTitleLayout; |
||||||
|
import org.easymock.EasyMock; |
||||||
|
import org.junit.After; |
||||||
|
import org.junit.Assert; |
||||||
|
import org.junit.Before; |
||||||
|
import org.junit.Test; |
||||||
|
|
||||||
|
import javax.swing.JComponent; |
||||||
|
import java.awt.Dimension; |
||||||
|
import java.awt.Rectangle; |
||||||
|
import java.beans.IntrospectionException; |
||||||
|
|
||||||
|
public class AddingModelTest { |
||||||
|
|
||||||
|
@Before |
||||||
|
public void setUp() { |
||||||
|
DaoContext.setXmlEntityDao(new LocalXmlEntityDao()); |
||||||
|
DaoContext.setClassHelperDao(new LocalClassHelperDao()); |
||||||
|
DaoContext.setEntityDao(new LocalEntityDao()); |
||||||
|
} |
||||||
|
|
||||||
|
@After |
||||||
|
public void tearDown() { |
||||||
|
DaoContext.setXmlEntityDao(null); |
||||||
|
DaoContext.setClassHelperDao(null); |
||||||
|
DaoContext.setEntityDao(null); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testInstantiateCreator() throws Exception { |
||||||
|
|
||||||
|
Dimension dimension = new Dimension(20, 20); |
||||||
|
|
||||||
|
ChartEditor chartEditor1 = new ChartEditor(); |
||||||
|
XCreator xCreator1 = new DemoCreator(chartEditor1, dimension, "test"); |
||||||
|
|
||||||
|
ChartEditor chartEditor2 = new ChartEditor(); |
||||||
|
chartEditor2.setWidgetName("test02"); |
||||||
|
XCreator xCreator2 = new DemoCreator(chartEditor2, dimension, "test02"); |
||||||
|
xCreator1.add(xCreator2); |
||||||
|
|
||||||
|
ChartEditor chartEditor3 = new ChartEditor(); |
||||||
|
chartEditor3.setWidgetName("test03"); |
||||||
|
WAbsoluteLayout.BoundsWidget boundsWidget = new WAbsoluteLayout.BoundsWidget(chartEditor3, new Rectangle(dimension)); |
||||||
|
WTitleLayout wTitleLayout03 = new WTitleLayout(); |
||||||
|
wTitleLayout03.addWidget(boundsWidget); |
||||||
|
//需要和内部的 widget 一样
|
||||||
|
wTitleLayout03.setWidgetName("test03"); |
||||||
|
XWTitleLayout xCreator3 = new XWTitleLayout(wTitleLayout03, dimension); |
||||||
|
xCreator1.add(xCreator3); |
||||||
|
|
||||||
|
AddingModel addingModel = new AddingModel(xCreator1, 20, 20); |
||||||
|
|
||||||
|
Form form = EasyMock.mock(Form.class); |
||||||
|
EasyMock.expect(form.isNameExist("test")).andReturn(true).once(); |
||||||
|
EasyMock.expect(form.isNameExist("test03")).andReturn(true).once(); |
||||||
|
EasyMock.expect(form.isNameExist(EasyMock.anyString())).andReturn(false).anyTimes(); |
||||||
|
EasyMock.replay(form); |
||||||
|
|
||||||
|
FormDesigner mock = EasyMock.mock(FormDesigner.class); |
||||||
|
EasyMock.expect(mock.getTarget()).andReturn(form).anyTimes(); |
||||||
|
EasyMock.replay(mock); |
||||||
|
|
||||||
|
addingModel.instantiateCreator(mock); |
||||||
|
//没有默认参数, 但已经存在 test
|
||||||
|
Assert.assertEquals("test0", xCreator1.toData().getWidgetName()); |
||||||
|
//直接返回
|
||||||
|
Assert.assertEquals("test02", xCreator2.toData().getWidgetName()); |
||||||
|
//已经存在,后接0
|
||||||
|
Assert.assertEquals("test030", xCreator3.toData().getWidgetName()); |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void testInstantiateCreator_cardLayout() throws Exception { |
||||||
|
|
||||||
|
Form form = EasyMock.mock(Form.class); |
||||||
|
EasyMock.expect(form.isNameExist("cardlayout")).andReturn(true).once(); |
||||||
|
EasyMock.expect(form.isNameExist("cardlayout0")).andReturn(true).once(); |
||||||
|
EasyMock.expect(form.isNameExist(EasyMock.anyString())).andReturn(false).anyTimes(); |
||||||
|
EasyMock.replay(form); |
||||||
|
|
||||||
|
FormDesigner mock = EasyMock.mock(FormDesigner.class); |
||||||
|
EasyMock.expect(mock.getTarget()).andReturn(form).anyTimes(); |
||||||
|
EasyMock.replay(mock); |
||||||
|
|
||||||
|
WCardLayout wCardLayout = new WCardLayout(20, 20); |
||||||
|
XWCardLayout xwCardLayout = new XWCardLayout(wCardLayout, new Dimension(40, 40)); |
||||||
|
AddingModel addingModel = new AddingModel(mock, xwCardLayout); |
||||||
|
Assert.assertEquals("cardlayout1", xwCardLayout.toData().getWidgetName()); |
||||||
|
|
||||||
|
//依赖于 cardlayout 创建 container
|
||||||
|
XLayoutContainer parentLayOut = xwCardLayout.initCreatorWrapper(80); |
||||||
|
AddingModel parentModel = new AddingModel(mock, parentLayOut); |
||||||
|
Assert.assertEquals("tablayout1", parentLayOut.toData().getWidgetName()); |
||||||
|
Assert.assertEquals("tabpane1", ((XCreator) (parentLayOut.getComponent(0))).getXCreator().toData().getWidgetName()); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private static class DemoCreator extends XCreator { |
||||||
|
|
||||||
|
private String widgetName; |
||||||
|
|
||||||
|
public DemoCreator(Widget ob, Dimension initSize, String widgetName) { |
||||||
|
super(ob, initSize); |
||||||
|
this.widgetName = widgetName; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public CRPropertyDescriptor[] supportedDescriptor() throws IntrospectionException { |
||||||
|
return new CRPropertyDescriptor[0]; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected JComponent initEditor() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void initXCreatorProperties() { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String createDefaultName() { |
||||||
|
return this.widgetName; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue