From 06cb403feb8434502c3d4ad6edae0af2e9119476 Mon Sep 17 00:00:00 2001 From: Maksim Date: Mon, 9 Dec 2019 16:51:15 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=88=9B=E5=BB=BAsocket=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/socketio/DesignerSocketIO.java | 167 +++++++++++------- 1 file changed, 104 insertions(+), 63 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index e2b13b1ad..63bc3d999 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -13,7 +13,6 @@ import com.fr.report.RemoteDesignConstants; import com.fr.serialization.SerializerHelper; import com.fr.stable.ArrayUtils; import com.fr.third.apache.log4j.spi.LoggingEvent; -import com.fr.third.guava.base.Optional; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.base.WorkspaceConstants; @@ -36,28 +35,19 @@ public class DesignerSocketIO { Disconnecting } - private static Optional socketIO = Optional.absent(); + private static Socket socket = null; private static Status status = Status.Disconnected; + //维护一个当前工作环境的uri列表 + private static String[] uri; + //维护一个关于uri列表的计数器 + private static int count; - private static final Emitter.Listener printLog = new Emitter.Listener() { - @Override - public void call(Object... objects) { - if (ArrayUtils.isNotEmpty(objects)) { - try { - LoggingEvent event = SerializerHelper.deserialize((byte[]) objects[0]); - DesignerLogger.log(event); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - } - }; public static void close() { - if (socketIO.isPresent()) { + if (socket != null) { status = Status.Disconnecting; - socketIO.get().close(); - socketIO = Optional.absent(); + socket.close(); + socket = null; } } @@ -66,57 +56,42 @@ public class DesignerSocketIO { if (current.isLocal()) { return; } + //每当更换工作环境,更新uri列表,同时更新计数器count try { - String[] uri = getSocketUri(current); - socketIO = Optional.of(IO.socket(new URI(uri[0]))); - socketIO.get().on(WorkspaceConstants.WS_LOGRECORD, printLog); - socketIO.get().on(WorkspaceConstants.CONFIG_MODIFY, new Emitter.Listener() { - @Override - public void call(Object... objects) { - assert objects != null && objects.length == 1; - String param = (String) objects[0]; - EventDispatcher.fire(RemoteConfigEvent.EDIT, param); - } - }); - socketIO.get().on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { - @Override - public void call(Object... objects) { - /* - * todo 远程心跳断开不一定 socketio 断开 和远程紧密相关的业务都绑定在心跳上,切换成心跳断开之后进行提醒, - * socketio 只用推日志和通知配置变更 - */ - if (status != Status.Disconnecting) { - try { - UIUtil.invokeAndWaitIfNeeded(new Runnable() { - @Override - public void run() { - JOptionPane.showMessageDialog( - DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), - UIManager.getString("OptionPane.messageDialogTitle"), - JOptionPane.ERROR_MESSAGE, - UIManager.getIcon("OptionPane.errorIcon")); - EnvChangeEntrance.getInstance().chooseEnv(); - } - }); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - status = Status.Disconnected; - } - }); - socketIO.get().connect(); - status = Status.Connected; + uri = getSocketUri(); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + count = 0; + //建立socket并注册监听 + createSocket(); + } + + private static void createSocket(){ + //根据uri和计数器建立连接,并注册监听 + try { + if(count Date: Mon, 9 Dec 2019 20:12:37 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../socketio/DesignerSocketIOTest.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java diff --git a/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java b/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java new file mode 100644 index 000000000..b775f56e9 --- /dev/null +++ b/designer-realize/src/test/java/com/fr/design/mainframe/socketio/DesignerSocketIOTest.java @@ -0,0 +1,60 @@ +package com.fr.design.mainframe.socketio; + +import com.fr.invoke.Reflect; +import com.fr.workspace.WorkContext; +import com.fr.workspace.Workspace; +import io.socket.client.IO; +import io.socket.client.Socket; + +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + + +/** + * @author: Maksim + * @Date: Created in 2019/12/9 + * @Description: + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({WorkContext.class,DesignerSocketIO.class, IO.class}) +public class DesignerSocketIOTest { + + @Test + public void close() throws Exception { + this.update(); + DesignerSocketIO.close(); + DesignerSocketIO.Status status = Reflect.on(DesignerSocketIO.class).field("status").get(); + Socket socket = Reflect.on(DesignerSocketIO.class).field("socket").get(); + + Assert.assertEquals(DesignerSocketIO.Status.Disconnecting,status); + Assert.assertNull(socket); + } + + @Test + public void update() throws Exception { + Workspace current = EasyMock.mock(Workspace.class); + EasyMock.expect(current.isLocal()).andReturn(false); + + PowerMock.mockStatic(WorkContext.class); + EasyMock.expect(WorkContext.getCurrent()).andReturn(current); + + String[] uri = {"http://127.0.0.1:8888/workspace","http://127.0.0.1:9999/workspace"}; + PowerMock.mockStaticPartial(DesignerSocketIO.class,"getSocketUri"); + PowerMock.expectPrivate(DesignerSocketIO.class,"getSocketUri").andReturn(uri); + + EasyMock.replay(current); + PowerMock.replayAll(); + + DesignerSocketIO.update(); + DesignerSocketIO.Status status = Reflect.on(DesignerSocketIO.class).field("status").get(); + Socket socket = Reflect.on(DesignerSocketIO.class).field("socket").get(); + + Assert.assertEquals(DesignerSocketIO.Status.Connected,status); + Assert.assertNotNull(socket); + } +} \ No newline at end of file From b291054cc2abdb49e55f9ec07519178e10ef9730 Mon Sep 17 00:00:00 2001 From: pengda Date: Tue, 10 Dec 2019 09:24:46 +0800 Subject: [PATCH 3/6] =?UTF-8?q?REPORT-24997=20=E5=8D=87=E7=BA=A712.08jar?= =?UTF-8?q?=E5=8C=85=E4=BB=A5=E5=90=8E=E5=86=B3=E7=AD=96=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E4=B8=AD=E6=8F=92=E5=85=A5=E7=9A=84=E5=9C=B0=E5=9B=BE=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/gui/controlpane/UIControlPane.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java index d47805de9..27934efb7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/UIControlPane.java @@ -14,6 +14,7 @@ import com.fr.design.widget.FRWidgetFactory; import com.fr.stable.ArrayUtils; import com.fr.stable.StringUtils; +import com.fr.stable.os.OperatingSystem; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JDialog; @@ -268,6 +269,9 @@ abstract class UIControlPane extends JControlPane { addWindowFocusListener(new WindowAdapter() { @Override public void windowLostFocus(WindowEvent e) { + if (OperatingSystem.isLinux()) { + requestFocus(); + } hideDialog(); } }); From c58b21eb637339e06106d75b731f2bf2a3a790b4 Mon Sep 17 00:00:00 2001 From: kerry Date: Tue, 10 Dec 2019 10:22:41 +0800 Subject: [PATCH 4/6] =?UTF-8?q?REPORT-24957=20frm=E6=89=93=E4=B8=8D?= =?UTF-8?q?=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../layout/FRWCardTagLayoutAdapter.java | 39 +++++++++++++++++++ .../creator/cardlayout/XWCardTagLayout.java | 12 ++---- .../layout/FRWCardTagLayoutAdapterTest.java | 23 +++++++++++ .../cardlayout/XWCardTagLayoutTest.java | 18 +++++++++ 4 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapter.java create mode 100644 designer-form/src/test/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapterTest.java create mode 100644 designer-form/src/test/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayoutTest.java diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapter.java b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapter.java new file mode 100644 index 000000000..e5331edd0 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapter.java @@ -0,0 +1,39 @@ +package com.fr.design.designer.beans.adapters.layout; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XLayoutContainer; + +/** + * 针对tabpane的布局适配器 + * Created by kerry on 2019-12-10 + */ +public class FRWCardTagLayoutAdapter extends AbstractLayoutAdapter { + public FRWCardTagLayoutAdapter(XLayoutContainer container) { + super(container); + } + + /** + * 对于这种布局方式,不允许其他组件添加 + * + * @param creator + * @param x + * @param y + */ + @Override + protected void addComp(XCreator creator, int x, int y) { + + } + + /** + * 对于这种布局方式,不允许其他组件添加 + * + * @param creator 组件 + * @param x 添加的位置x,该位置是相对于container的 + * @param y 添加的位置y,该位置是相对于container的 + * @return + */ + @Override + public boolean accept(XCreator creator, int x, int y) { + return false; + } +} diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index 77282f63f..dc8bb9080 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -8,8 +8,7 @@ import com.fr.base.ScreenResolution; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.ComponentAdapter; import com.fr.design.designer.beans.LayoutAdapter; -import com.fr.design.designer.beans.adapters.layout.FRHorizontalLayoutAdapter; -import com.fr.design.designer.beans.adapters.layout.FRVerticalLayoutAdapter; +import com.fr.design.designer.beans.adapters.layout.FRWCardTagLayoutAdapter; import com.fr.design.designer.beans.models.SelectionModel; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; @@ -311,12 +310,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { @Override public LayoutAdapter getLayoutAdapter() { - if (isHori()) { - return new FRHorizontalLayoutAdapter(this); - }else{ - return new FRVerticalLayoutAdapter(this); - } - + return new FRWCardTagLayoutAdapter(this); } private boolean isHori(){ @@ -452,4 +446,4 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { } } -} \ No newline at end of file +} diff --git a/designer-form/src/test/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapterTest.java b/designer-form/src/test/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapterTest.java new file mode 100644 index 000000000..0ff3ec0cc --- /dev/null +++ b/designer-form/src/test/java/com/fr/design/designer/beans/adapters/layout/FRWCardTagLayoutAdapterTest.java @@ -0,0 +1,23 @@ +package com.fr.design.designer.beans.adapters.layout; + +import com.fr.design.designer.creator.XElementCase; +import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; +import com.fr.form.ui.ElementCaseEditor; +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import org.junit.Assert; +import org.junit.Test; + +import java.awt.Dimension; + +/** + * Created by kerry on 2019-12-10 + */ +public class FRWCardTagLayoutAdapterTest { + @Test + public void testAccept() { + FRWCardTagLayoutAdapter adapter = new FRWCardTagLayoutAdapter( + new XWCardTagLayout(new WCardTagLayout(), new Dimension(100, 100))); + Assert.assertFalse(adapter.accept(new XElementCase( + new ElementCaseEditor(), new Dimension(100, 100)), 1, 1)); + } +} diff --git a/designer-form/src/test/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayoutTest.java b/designer-form/src/test/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayoutTest.java new file mode 100644 index 000000000..2b5ec78f2 --- /dev/null +++ b/designer-form/src/test/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayoutTest.java @@ -0,0 +1,18 @@ +package com.fr.design.designer.creator.cardlayout; + +import com.fr.form.ui.container.cardlayout.WCardTagLayout; +import org.junit.Assert; +import org.junit.Test; + +import java.awt.Dimension; + +/** + * Created by kerry on 2019-12-10 + */ +public class XWCardTagLayoutTest { + @Test + public void testGetLayoutAdapter() { + XWCardTagLayout tagLayout = new XWCardTagLayout(new WCardTagLayout(), new Dimension(100, 100)); + Assert.assertEquals("com.fr.design.designer.beans.adapters.layout.FRWCardTagLayoutAdapter", tagLayout.getLayoutAdapter().getClass().getName()); + } +} From 4f24288c06c345e9e9eaa70d458b7de2544839bf Mon Sep 17 00:00:00 2001 From: kerry Date: Thu, 12 Dec 2019 15:31:50 +0800 Subject: [PATCH 5/6] =?UTF-8?q?REPORT-24117=20=E8=BF=99=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9B=9E=E9=80=80=EF=BC=8C=E5=BD=93=E6=97=B6?= =?UTF-8?q?=E7=9A=84bug=20REPORT-21202=E4=BF=AE=E6=94=B9FormSelection?= =?UTF-8?q?=E5=B0=B1=E5=8F=AF=E4=BB=A5=E9=81=BF=E5=85=8Dtab=E7=9A=84?= =?UTF-8?q?=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/beans/models/SelectionModel.java | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index 76eb60230..052ae0539 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -18,9 +18,7 @@ import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.LayoutUtils; import com.fr.stable.ArrayUtils; -import java.awt.LayoutManager; -import java.awt.Rectangle; -import java.awt.Toolkit; +import java.awt.*; import java.awt.event.MouseEvent; import java.util.ArrayList; @@ -177,19 +175,36 @@ public class SelectionModel { } private void pasteXWFitLayout() { - //自适应布局编辑器内部左上角第一个坐标点 - int leftUpX = designer.getRootComponent().toData().getMargin().getLeft() + 1; - int leftUpY = designer.getRootComponent().toData().getMargin().getTop() + 1; - //选中第一个坐标点坐在的组件 - selection.setSelectedCreator((XCreator) designer.getRootComponent().getComponentAt(leftUpX, leftUpY)); - Rectangle rectangle = selection.getRelativeBounds(); - if (hasSelectedPasteSource()) { - selectedPaste(); + if (selection.getSelectedCreator().getClass().equals(XWTabFitLayout.class)) { + XLayoutContainer container = (XLayoutContainer) selection.getSelectedCreator(); + //tab布局编辑器内部左上角第一个坐标点 + int leftUpX = container.toData().getMargin().getLeft() + 1; + int leftUpY = container.toData().getMargin().getTop() + 1; + //选中第一个坐标点坐在的组件 + selection.setSelectedCreator((XCreator) container.getComponentAt(leftUpX, leftUpY)); + Rectangle rectangle = selection.getRelativeBounds(); + if (hasSelectedPasteSource()) { + selectedPaste(); + } else { + FormSelectionUtils.paste2Container(designer, container, clipboard, + rectangle.x + rectangle.width / 2, + rectangle.y + DELTA_X_Y); + } } else { - FormSelectionUtils.paste2Container(designer, designer.getRootComponent(), - clipboard, - rectangle.x + rectangle.width / 2, - rectangle.y + DELTA_X_Y); + //自适应布局编辑器内部左上角第一个坐标点 + int leftUpX = designer.getRootComponent().toData().getMargin().getLeft() + 1; + int leftUpY = designer.getRootComponent().toData().getMargin().getTop() + 1; + //选中第一个坐标点坐在的组件 + selection.setSelectedCreator((XCreator) designer.getRootComponent().getComponentAt(leftUpX, leftUpY)); + Rectangle rectangle = selection.getRelativeBounds(); + if (hasSelectedPasteSource()) { + selectedPaste(); + } else { + FormSelectionUtils.paste2Container(designer, designer.getRootComponent(), + clipboard, + rectangle.x + rectangle.width / 2, + rectangle.y + DELTA_X_Y); + } } } From 1823a7bcbdb1a731071f67352c4667dc19f7a646 Mon Sep 17 00:00:00 2001 From: hades Date: Fri, 13 Dec 2019 09:55:43 +0800 Subject: [PATCH 6/6] =?UTF-8?q?REPORT-24294=20=E5=AE=89=E8=A3=8510?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=90=AF=E5=8A=A8=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E6=93=8D=E4=BD=9C=E5=BC=82=E5=B8=B8=E7=BC=93=E6=85=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/EastRegionContainerPane.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 97ce22814..07191d536 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -458,9 +458,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } private void refreshContainer() { - validate(); - repaint(); - revalidate(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + validate(); + repaint(); + revalidate(); + } + }); } public int getToolPaneY() {