forked from fanruan/design
Browse Source
Merge in DESIGN/design from ~FANGLEI/design:feature/x to feature/x * commit 'ab0f9b090efe83c982d99f9b8467b0498b8b9153': REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 CHART-22529 切换控件标题自定义—设计器面板 REPORT-64149 REPORT-64149 REPORT-64149 REPORT-64149 重构拖拽相关代码feature/x
fanglei
3 years ago
28 changed files with 877 additions and 757 deletions
@ -0,0 +1,4 @@
|
||||
package com.fr.van.chart.designer.component; |
||||
|
||||
public class VanChartGuideLinesPane { |
||||
} |
@ -0,0 +1,9 @@
|
||||
package com.fr.design.designer.beans.events; |
||||
|
||||
import java.util.EventListener; |
||||
|
||||
public interface AddingWidgetListener extends EventListener { |
||||
void beforeAdded(); |
||||
|
||||
void afterAdded(boolean addResult); |
||||
} |
@ -0,0 +1,54 @@
|
||||
package com.fr.design.designer.beans.events; |
||||
|
||||
import com.fr.general.ComparatorUtils; |
||||
|
||||
import javax.swing.SwingUtilities; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class AddingWidgetListenerTable { |
||||
protected List<AddingWidgetListener> listeners = new ArrayList<>(); |
||||
|
||||
public AddingWidgetListenerTable() { |
||||
|
||||
} |
||||
|
||||
public void addListener(AddingWidgetListener listener) { |
||||
if (listener == null) { |
||||
return; |
||||
} |
||||
for (int i = 0; i < listeners.size(); i++) { |
||||
if (ComparatorUtils.equals(listener, listeners.get(i))) { |
||||
listeners.set(i, listener); |
||||
return; |
||||
} |
||||
} |
||||
listeners.add(listener); |
||||
} |
||||
|
||||
public void beforeAdded() { |
||||
for (final AddingWidgetListener listener : listeners) { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
listener.beforeAdded(); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
public void afterAdded(boolean addResult) { |
||||
for (final AddingWidgetListener listener : listeners) { |
||||
SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
listener.afterAdded(addResult); |
||||
} |
||||
}); |
||||
} |
||||
} |
||||
|
||||
public void clearListeners() { |
||||
listeners.clear(); |
||||
} |
||||
} |
@ -0,0 +1,98 @@
|
||||
package com.fr.design.designer.beans.models; |
||||
|
||||
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.mainframe.FormDesigner; |
||||
|
||||
import java.awt.event.MouseEvent; |
||||
|
||||
public class DraggingModel { |
||||
private FormDesigner designer; |
||||
private XCreator creator; |
||||
private MouseEvent startDragEvent; |
||||
private MouseEvent currentDragEvent; |
||||
private int creatorLeftTopX = -999; // 隐藏
|
||||
private int creatorLeftTopY = -999; // 隐藏
|
||||
private boolean dragNewWidget; // 是否正在拖拽一个新的组件下来
|
||||
|
||||
public DraggingModel() { |
||||
|
||||
} |
||||
|
||||
public DraggingModel designer(FormDesigner designer) { |
||||
this.designer = designer; |
||||
return this; |
||||
} |
||||
|
||||
public DraggingModel startDragEvent(MouseEvent startDragEvent) { |
||||
this.startDragEvent = startDragEvent; |
||||
return this; |
||||
} |
||||
|
||||
public DraggingModel currentDragEvent(MouseEvent dragEvent) { |
||||
this.currentDragEvent = dragEvent; |
||||
return this; |
||||
} |
||||
|
||||
public DraggingModel creator(XCreator creator) { |
||||
this.creator = creator; |
||||
return this; |
||||
} |
||||
|
||||
public DraggingModel dragNewWidget(boolean dragNewWidget) { |
||||
this.dragNewWidget = dragNewWidget; |
||||
return this; |
||||
} |
||||
|
||||
public FormDesigner getDesigner() { |
||||
return designer; |
||||
} |
||||
|
||||
public MouseEvent getStartDragEvent() { |
||||
return startDragEvent; |
||||
} |
||||
|
||||
public MouseEvent getCurrentDragEvent() { |
||||
return currentDragEvent; |
||||
} |
||||
|
||||
public XCreator getCreator() { |
||||
return creator; |
||||
} |
||||
|
||||
/** |
||||
* 获取被拖拽组件当前随着鼠标移动时应当所在的左上角横坐标 |
||||
* |
||||
* @return |
||||
*/ |
||||
public int getCreatorLeftTopX() { |
||||
return creatorLeftTopX; |
||||
} |
||||
|
||||
/** |
||||
* 获取被拖拽组件当前随着鼠标移动时应当所在的左上角纵坐标 |
||||
* |
||||
* @return |
||||
*/ |
||||
public int getCreatorLeftTopY() { |
||||
return creatorLeftTopY; |
||||
} |
||||
|
||||
public boolean isDragNewWidget() { |
||||
return dragNewWidget; |
||||
} |
||||
|
||||
public void moveTo(int x, int y) { |
||||
XLayoutContainer container = designer.getDraggingHotspotLayout(); |
||||
LayoutAdapter adapter = container.getLayoutAdapter(); |
||||
|
||||
creatorLeftTopX = x - adapter.getDragSize(creator).width / 2; |
||||
creatorLeftTopY = y - adapter.getDragSize(creator).height / 2; |
||||
} |
||||
|
||||
public void reset() { |
||||
creatorLeftTopX = -creator.getWidth(); |
||||
creatorLeftTopY = -creator.getHeight(); |
||||
} |
||||
} |
@ -1,33 +0,0 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.design.designer.beans.models.AddingModel; |
||||
import com.fr.design.file.HistoryTemplateListPane; |
||||
|
||||
import javax.swing.JComponent; |
||||
import javax.swing.TransferHandler; |
||||
import java.awt.datatransfer.Transferable; |
||||
|
||||
public class DesignerTransferHandler extends TransferHandler { |
||||
|
||||
private FormDesigner designer; |
||||
private AddingModel addingModel; |
||||
|
||||
public DesignerTransferHandler(FormDesigner designer, AddingModel addingModel) { |
||||
super("rootComponent"); |
||||
this.designer = designer; |
||||
this.addingModel = addingModel; |
||||
} |
||||
|
||||
protected void exportDone(JComponent source, Transferable data, int action) { |
||||
if (!addingModel.isCreatorAdded()) { |
||||
undoWhenAddingFailed(); |
||||
} |
||||
} |
||||
|
||||
private void undoWhenAddingFailed() { |
||||
JTemplate<?, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); |
||||
if (jt != null) { |
||||
jt.undoToCurrent(); |
||||
} |
||||
} |
||||
} |
@ -1,210 +0,0 @@
|
||||
package com.fr.design.designer.beans.models; |
||||
|
||||
import com.fr.base.chart.BaseChartCollection; |
||||
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.XChartEditor; |
||||
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.gui.chart.MiddleChartComponent; |
||||
import com.fr.design.mainframe.FormDesigner; |
||||
import com.fr.design.module.DesignModuleFactory; |
||||
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 com.fr.stable.core.PropertyChangeListener; |
||||
import org.easymock.EasyMock; |
||||
import org.junit.After; |
||||
import org.junit.Assert; |
||||
import org.junit.Before; |
||||
import org.junit.Test; |
||||
import org.junit.runner.RunWith; |
||||
import org.powermock.api.easymock.PowerMock; |
||||
import org.powermock.core.classloader.annotations.PowerMockIgnore; |
||||
import org.powermock.core.classloader.annotations.PrepareForTest; |
||||
import org.powermock.modules.junit4.PowerMockRunner; |
||||
|
||||
import javax.swing.JComponent; |
||||
import java.awt.Dimension; |
||||
import java.awt.Rectangle; |
||||
import java.beans.IntrospectionException; |
||||
|
||||
@PrepareForTest({DesignModuleFactory.class}) |
||||
@PowerMockIgnore({"com.sun.*", "javax.*", "com.fr.jvm.assist.*"}) |
||||
@RunWith(PowerMockRunner.class) |
||||
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); |
||||
} |
||||
|
||||
/** |
||||
* 默认名字 + i |
||||
*/ |
||||
@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("test0")).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("test1", xCreator1.toData().getWidgetName()); |
||||
//直接返回
|
||||
Assert.assertEquals("test020", 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("cardlayout0")).andReturn(true).once(); |
||||
EasyMock.expect(form.isNameExist("cardlayout1")).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("cardlayout2", xwCardLayout.toData().getWidgetName()); |
||||
|
||||
//依赖于 cardlayout 创建 container
|
||||
XLayoutContainer parentLayOut = xwCardLayout.initCreatorWrapper(80); |
||||
//组件默认名 tablelayout2
|
||||
AddingModel parentModel = new AddingModel(mock, parentLayOut); |
||||
//经过处理 tablayout20
|
||||
Assert.assertEquals("tablayout20", parentLayOut.toData().getWidgetName()); |
||||
Assert.assertEquals("tabpane20", ((XCreator) (parentLayOut.getComponent(0))).getXCreator().toData().getWidgetName()); |
||||
Assert.assertEquals("cardlayout20", xwCardLayout.toData().getWidgetName()); |
||||
|
||||
} |
||||
|
||||
@Test |
||||
public void testInstantiateCreator_containsNotXCreator() throws Exception { |
||||
|
||||
Form form = EasyMock.mock(Form.class); |
||||
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); |
||||
|
||||
PowerMock.mockStaticPartial(DesignModuleFactory.class, "getChartComponent"); |
||||
EasyMock.expect(DesignModuleFactory.getChartComponent(EasyMock.anyObject(BaseChartCollection.class))).andReturn(new MiddleChartComponent() { |
||||
@Override |
||||
public void populate(BaseChartCollection cc) { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public BaseChartCollection update() { |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void addStopEditingListener(PropertyChangeListener list) { |
||||
|
||||
} |
||||
}).anyTimes(); |
||||
PowerMock.replayAll(); |
||||
|
||||
Dimension dimension = new Dimension(20, 20); |
||||
|
||||
ChartEditor chartEditor1 = new ChartEditor(); |
||||
XCreator xCreator1 = new XChartEditor(chartEditor1, dimension); |
||||
|
||||
|
||||
AddingModel chartModel = new AddingModel(mock, xCreator1); |
||||
Assert.assertEquals("chart0", xCreator1.toData().getWidgetName()); |
||||
} |
||||
|
||||
private static class DemoCreator extends XCreator { |
||||
|
||||
private String widgetName; |
||||
|
||||
public DemoCreator(Widget ob, Dimension initSize, String defaultName) { |
||||
super(ob, initSize); |
||||
this.widgetName = defaultName; |
||||
} |
||||
|
||||
@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