consumingMap = Reflect.on(templateInfo).field("consumingMap").get();
+ assertEquals(templateID, consumingMap.get("templateID"));
+ assertEquals(originTime, consumingMap.get("originTime"));
+ assertEquals(originID, consumingMap.get("originID"));
+ assertEquals(originTime, consumingMap.get("time_consume"));
+ assertEquals("不是安装版本", consumingMap.get("jar_time"));
+ assertEquals("plough", consumingMap.get("username"));
+ assertEquals("10.0", consumingMap.get("version"));
+ }
+
+ @Test
+ public void testGetTemplateID() {
+ assertEquals("16a988ce-8529-42f5-b17c-2ee849355071", templateInfo.getTemplateID());
+ assertEquals("49avd2c4-1104-92j2-wx24-3dd0k2136080", templateInfoSaveAs.getTemplateID());
+ }
+
+ @Test
+ public void testGetConsumingMapJsonString() {
+ assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\",\"jar_time\":\"不是安装版本\"," +
+ "\"create_time\":\"2019-03-26 16:13\",\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\",\"originID\":\"\"," +
+ "\"uuid\":\"476ca2cc-f789-4c5d-8e89-ef146580775c\",\"time_consume\":129,\"originTime\":0,\"version\":\"10.0\"," +
+ "\"username\":\"plough\"}", templateInfo.getConsumingMapJsonString());
+
+ assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\",\"jar_time\":\"不是安装版本\"," +
+ "\"create_time\":\"2019-03-26 16:13\",\"templateID\":\"49avd2c4-1104-92j2-wx24-3dd0k2136080\",\"originID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"," +
+ "\"uuid\":\"476ca2cc-f789-4c5d-8e89-ef146580775c\",\"time_consume\":429,\"originTime\":129,\"version\":\"10.0\"," +
+ "\"username\":\"plough\"}", templateInfoSaveAs.getConsumingMapJsonString());
+ }
+
+ @Test
+ public void testGetProcessMapJsonString() {
+ assertJsonStringEquals("{\"process\":\"\",\"float_count\":0,\"widget_count\":0,\"cell_count\":1," +
+ "\"block_count\":0,\"report_type\":0,\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"}", templateInfo.getProcessMapJsonString());
+ assertJsonStringEquals("{\"process\":\"\",\"float_count\":0,\"widget_count\":0,\"cell_count\":1," +
+ "\"block_count\":0,\"report_type\":0,\"templateID\":\"49avd2c4-1104-92j2-wx24-3dd0k2136080\"}", templateInfoSaveAs.getProcessMapJsonString());
+ }
+
+ private TemplateInfo createTemplateInfo(String xmlContent) throws XMLStreamException {
+ StringReader sr = new StringReader(xmlContent);
+ XMLableReader xmlReader = XMLableReader.createXMLableReader(sr);
+ return TemplateInfo.newInstanceByRead(xmlReader);
+ }
+}
diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java
new file mode 100644
index 000000000..be2b58989
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java
@@ -0,0 +1,49 @@
+package com.fr.design.mainframe.template.info;
+
+import com.fr.config.MarketConfig;
+import com.fr.general.ComparatorUtils;
+import com.fr.general.GeneralUtils;
+import com.fr.json.JSONObject;
+import com.fr.stable.ProductConstants;
+import org.easymock.EasyMock;
+import org.powermock.api.easymock.PowerMock;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Created by plough on 2019/4/19.
+ */
+class TemplateInfoTestHelper {
+ static void assertJsonStringEquals(String jo1, String jo2) {
+ // HashMap 是无序的,所以不能直接比较它生成的 json 字符串
+ assertTrue(ComparatorUtils.equals(new JSONObject(jo1), new JSONObject(jo2)));
+ }
+
+ private static void setFinalStatic(Field field, Object newValue) throws Exception {
+ field.setAccessible(true);
+ // remove final modifier from field
+ Field modifiersField = Field.class.getDeclaredField("modifiers");
+ modifiersField.setAccessible(true);
+ modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
+ field.set(null, newValue);
+ }
+
+ static void setUpMockForNewInstance() throws Exception {
+ MarketConfig mockMarketConfig = EasyMock.mock(MarketConfig.class);
+ EasyMock.expect(mockMarketConfig.getBbsUsername()).andReturn("plough").anyTimes();
+
+ PowerMock.mockStatic(MarketConfig.class);
+ EasyMock.expect(MarketConfig.getInstance()).andReturn(mockMarketConfig).anyTimes();
+
+ PowerMock.mockStatic(GeneralUtils.class);
+ EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes();
+
+ setFinalStatic(ProductConstants.class.getDeclaredField("VERSION"), "10.0");
+
+ EasyMock.replay(mockMarketConfig);
+ PowerMock.replayAll();
+ }
+}
diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TimeConsumeTimerTest.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TimeConsumeTimerTest.java
new file mode 100644
index 000000000..5dcf60e7f
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TimeConsumeTimerTest.java
@@ -0,0 +1,62 @@
+package com.fr.design.mainframe.template.info;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Created by plough on 2019/4/19.
+ */
+public class TimeConsumeTimerTest {
+
+ @Test
+ public void testNotEnabled() throws InterruptedException {
+ TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
+ consumeTimer.start();
+ Thread.sleep(1100);
+ consumeTimer.stop();
+ assertEquals(0, consumeTimer.popTime());
+ }
+
+ @Test
+ public void testEnabled() throws InterruptedException {
+ TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
+ consumeTimer.setEnabled(true);
+ consumeTimer.start();
+ Thread.sleep(1100);
+ consumeTimer.stop();
+ assertEquals(1, consumeTimer.popTime());
+ assertEquals(0, consumeTimer.popTime());
+ }
+
+ @Test
+ public void testMultiTimes() throws InterruptedException {
+ TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
+ consumeTimer.setEnabled(true);
+
+ consumeTimer.start();
+ Thread.sleep(1010);
+ consumeTimer.stop();
+
+ Thread.sleep(2000);
+
+ consumeTimer.start();
+ Thread.sleep(1010);
+ assertEquals(2, consumeTimer.popTime());
+ }
+
+ @Test
+ public void testStartMultiTime() throws InterruptedException {
+ TimeConsumeTimer consumeTimer = new TimeConsumeTimer();
+ consumeTimer.setEnabled(true);
+
+ consumeTimer.start();
+ Thread.sleep(1010);
+ consumeTimer.start();
+ Thread.sleep(1010);
+ consumeTimer.start();
+ Thread.sleep(1010);
+
+ assertEquals(3, consumeTimer.popTime());
+ }
+}
diff --git a/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateConfigManagerTest.java b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateConfigManagerTest.java
new file mode 100644
index 000000000..17831b0b7
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateConfigManagerTest.java
@@ -0,0 +1,72 @@
+package com.fr.design.update.push;
+
+import com.fr.stable.StringUtils;
+import com.fr.stable.xml.XMLPrintWriter;
+import com.fr.stable.xml.XMLableReader;
+import com.fr.third.javax.xml.stream.XMLStreamException;
+import org.junit.Test;
+
+import java.io.PrintWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * Created by plough on 2019/4/8.
+ */
+public class DesignerPushUpdateConfigManagerTest {
+
+ @Test
+ public void testSingleton() {
+ DesignerPushUpdateConfigManager m1 = DesignerPushUpdateConfigManager.getInstance();
+ DesignerPushUpdateConfigManager m2 = DesignerPushUpdateConfigManager.getInstance();
+ assertSame(m1, m2);
+ }
+
+ @Test
+ public void testDefaultValue() throws XMLStreamException {
+ DesignerPushUpdateConfigManager configManager = DesignerPushUpdateConfigManager.getInstance();
+ XMLableReader xmlReader = XMLableReader.createXMLableReader(new StringReader(""));
+ xmlReader.readXMLObject(configManager);
+
+ assertEquals(StringUtils.EMPTY, configManager.getLastIgnoredVersion());
+ assertTrue(configManager.isAutoPushUpdateEnabled());
+ }
+
+ @Test
+ public void testReadAndWrite() throws XMLStreamException {
+ final String initLastIngnoredVersion = "1.1.2";
+ final boolean initAutoPushEnabled = false;
+
+ DesignerPushUpdateConfigManager configManager = DesignerPushUpdateConfigManager.getInstance();
+
+ configManager.setLastIgnoredVersion(initLastIngnoredVersion);
+ configManager.setAutoPushUpdateEnabled(initAutoPushEnabled);
+
+ // 写入 xml
+ StringWriter sw = new StringWriter();
+ XMLPrintWriter writer = XMLPrintWriter.create(new PrintWriter(sw));
+ configManager.writeXML(writer);
+ writer.flush();
+ writer.close();
+
+ String xml_str = sw.getBuffer().toString();
+
+ // 临时修改配置
+ configManager.setAutoPushUpdateEnabled(true);
+ configManager.setLastIgnoredVersion("0.20.1");
+
+ // 从 xml 中读取
+ StringReader sr = new StringReader(xml_str);
+ XMLableReader xmlReader = XMLableReader.createXMLableReader(sr);
+ xmlReader.readXMLObject(configManager);
+
+ // 验证:与写入时的配置一致
+ assertEquals(initLastIngnoredVersion, configManager.getLastIgnoredVersion());
+ assertEquals(initAutoPushEnabled, configManager.isAutoPushUpdateEnabled());
+ }
+}
diff --git a/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateDialogTest.java b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateDialogTest.java
new file mode 100644
index 000000000..bc194fe06
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateDialogTest.java
@@ -0,0 +1,23 @@
+package com.fr.design.update.push;
+
+import com.fr.design.DesignerEnvManager;
+import com.fr.json.JSONObject;
+
+/**
+ * Created by plough on 2019/4/10.
+ */
+public class DesignerPushUpdateDialogTest {
+
+ public static void main(String[] args) {
+ DesignerEnvManager.getEnvManager().setOpenDebug(true);
+
+ JSONObject jo = JSONObject.create();
+ jo.put("version", "2019.03.06.04.02.43.6");
+ jo.put("content", "设计器改进:去除右击弹框,让操作过程更流畅;增加报表块缩放功能,利于从全局角度整体设计报表\n插件重构:插件支持热部署,即装即用,不再需要重启服务器;\nsapbw:可用于bwcube和bwquery;\n私有云认证:可在客户本地部署私有云认证服务器,业务服务器可到此服务器进行认证;\n开放:打通简道云,可以在简道云里创建项目,并将数据同步到客户的私有库\nshould not display");
+ jo.put("more", "http://baidu.com");
+ jo.put("background", "http://updateten.finereport.com/fr.png");
+ DesignerUpdateInfo mockUpdateInfo = new DesignerUpdateInfo("111.22.11", "2211.231.1", "11.23.1", jo);
+
+ DesignerPushUpdateDialog.createAndShow(null, mockUpdateInfo);
+ }
+}
diff --git a/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateManagerTest.java b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateManagerTest.java
new file mode 100644
index 000000000..333580f1a
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/update/push/DesignerPushUpdateManagerTest.java
@@ -0,0 +1,76 @@
+package com.fr.design.update.push;
+
+import com.fr.design.event.DesignerOpenedListener;
+import com.fr.design.mainframe.DesignerContext;
+import com.fr.design.mainframe.DesignerFrame;
+import com.fr.invoke.Reflect;
+import com.fr.stable.StringUtils;
+import org.easymock.EasyMock;
+import org.junit.BeforeClass;
+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;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+/**
+ * Created by plough on 2019/4/8.
+ */
+@RunWith(value = PowerMockRunner.class)
+@PrepareForTest(DesignerContext.class)
+public class DesignerPushUpdateManagerTest {
+
+ @BeforeClass
+ public static void setUp() {
+ DesignerFrame mockFrame = EasyMock.mock(DesignerFrame.class);
+ mockFrame.addDesignerOpenedListener(EasyMock.anyObject(DesignerOpenedListener.class));
+ EasyMock.replay(mockFrame);
+
+ PowerMock.mockStatic(DesignerContext.class);
+ EasyMock.expect(DesignerContext.getDesignerFrame()).andReturn(mockFrame).anyTimes();
+ PowerMock.replayAll();
+ }
+
+ @Test
+ public void testSingleton() {
+ DesignerPushUpdateManager m1 = DesignerPushUpdateManager.getInstance();
+ DesignerPushUpdateManager m2 = DesignerPushUpdateManager.getInstance();
+ assertSame(m1, m2);
+ }
+
+ @Test
+ public void testIsAutoPushUpdateSupported() {
+ // 中文环境 + 本地设计 -> true
+ DesignerPushUpdateManager pushUpdateManager = DesignerPushUpdateManager.getInstance();
+ assertEquals(true, Reflect.on(pushUpdateManager).call("isAutoPushUpdateSupported", true, true).get());
+
+ // 非中文环境 || 远程设计 -> false
+ assertEquals(false, Reflect.on(pushUpdateManager).call("isAutoPushUpdateSupported", false, true).get());
+ assertEquals(false, Reflect.on(pushUpdateManager).call("isAutoPushUpdateSupported", true, false).get());
+ assertEquals(false, Reflect.on(pushUpdateManager).call("isAutoPushUpdateSupported", false, false).get());
+ }
+
+ @Test
+ public void testSkipCurrentPushVersion() {
+ DesignerPushUpdateManager pushUpdateManager = DesignerPushUpdateManager.getInstance();
+
+ // 1. updateInfo 为 null 的情况
+ pushUpdateManager.skipCurrentPushVersion();
+ assertEquals(StringUtils.EMPTY, DesignerPushUpdateConfigManager.getInstance().getLastIgnoredVersion());
+
+
+ // 2. updateInfo 有值的情况
+ final String PUSH_VERSION = "stable-2019.02.03.12.44.22";
+ DesignerUpdateInfo mockInfo = EasyMock.mock(DesignerUpdateInfo.class);
+ EasyMock.expect(mockInfo.getPushVersion()).andReturn(PUSH_VERSION).anyTimes();
+ Reflect.on(pushUpdateManager).set("updateInfo", mockInfo);
+ EasyMock.replay(mockInfo);
+
+ pushUpdateManager.skipCurrentPushVersion();
+ assertEquals(PUSH_VERSION, DesignerPushUpdateConfigManager.getInstance().getLastIgnoredVersion());
+ }
+
+}
diff --git a/designer-base/src/test/java/com/fr/design/update/push/DesignerUpdateInfoTest.java b/designer-base/src/test/java/com/fr/design/update/push/DesignerUpdateInfoTest.java
new file mode 100644
index 000000000..14f986e8e
--- /dev/null
+++ b/designer-base/src/test/java/com/fr/design/update/push/DesignerUpdateInfoTest.java
@@ -0,0 +1,97 @@
+package com.fr.design.update.push;
+
+import com.fr.json.JSONObject;
+import com.fr.stable.StringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.security.InvalidParameterException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Created by plough on 2019/4/9.
+ */
+public class DesignerUpdateInfoTest {
+ private static final String CURRENT_VERSION = "2018.09.03.xx";
+ private static final String LATEST_VERSION = "2019.04.03.yy";
+ private static final String LAST_IGNORED_VERSION = "2019.02.03.yy";
+ private static final String PUSH_VERSION = "2019.01.03.21.11";
+ private static final String PUSH_CONTENT = "the update desc content";
+ private static final String PUSH_BACKGROUND = "http://image.fr.com/123.jpg";
+ private static final String PUSH_MORE = "http://help.finereport.com/xxx";
+ private DesignerUpdateInfo updateInfo;
+
+ @Before
+ public void setUp() {
+ JSONObject pushData = JSONObject.create();
+
+ pushData.put("version", PUSH_VERSION);
+ pushData.put("content", PUSH_CONTENT);
+ pushData.put("background", PUSH_BACKGROUND);
+ pushData.put("more", PUSH_MORE);
+
+ updateInfo = new DesignerUpdateInfo(CURRENT_VERSION, LATEST_VERSION, LAST_IGNORED_VERSION, pushData);
+ }
+
+ @Test
+ public void testGetters() {
+ assertEquals(CURRENT_VERSION, updateInfo.getCurrentVersion());
+ assertEquals(LATEST_VERSION, updateInfo.getLatestVersion());
+ assertEquals(LAST_IGNORED_VERSION, updateInfo.getLastIgnoredVersion());
+ assertEquals(PUSH_VERSION, updateInfo.getPushVersion());
+ assertEquals(PUSH_CONTENT, updateInfo.getPushContent());
+ assertEquals(PUSH_BACKGROUND, updateInfo.getBackgroundUrl());
+ assertEquals(PUSH_MORE, updateInfo.getMoreInfoUrl());
+ }
+
+ @Test
+ public void testHasNewPushVersion() {
+ // (1)最近被跳过的维护版本号 X0;
+ // (2)本地版本号 Y;
+ // (3)最新的推送版本号 X;
+ // (4)最新的版本号 Z
+ // 必须满足:Y < X <= Z && X > X0,才返回 true
+
+ // 1 true
+ assertTrue(hasNewVersion("2019.01.03.xx", "2018.05.03.xx", "2019.04.03.yy", "2018.05.03.xx"));
+ assertTrue(hasNewVersion("2019.01.03.xx", "2018.05.03.xx", "2019.04.03.yy", null));
+ assertTrue(hasNewVersion("2019.01.03.xx", "2018.05.03.xx", "2019.04.03.yy", StringUtils.EMPTY));
+
+ // 2 false
+ // 2.1 X <= Y && X > X0
+ assertFalse(hasNewVersion("2019.01.03.xx", "2019.03.03.xx", "2019.04.03.yy", "2018.05.03.xx"));
+ assertFalse(hasNewVersion("2019.03.03.xx", "2019.03.03.xx", "2019.04.03.yy", "2018.05.03.xx"));
+
+ // 2.2 X > Z && X > X0
+ assertFalse(hasNewVersion("2020.01.03.xx", "2019.03.03.xx", "2019.04.03.yy", "2018.05.03.xx"));
+
+ // 2.3 Y < X <= Z && X <= X0
+ assertFalse(hasNewVersion("2019.01.03.xx", "2018.05.03.xx", "2019.04.03.yy", "2019.02.03.xx"));
+ assertFalse(hasNewVersion("2019.01.03.xx", "2018.05.03.xx", "2019.04.03.yy", "2019.01.03.xx"));
+ }
+
+
+ private boolean hasNewVersion(String X, String Y, String Z, String X0) {
+ JSONObject pushData = JSONObject.create();
+ pushData.put("version", X);
+ pushData.put("content", PUSH_CONTENT);
+ pushData.put("background", PUSH_BACKGROUND);
+ pushData.put("more", PUSH_MORE);
+ DesignerUpdateInfo updateInfo = new DesignerUpdateInfo(Y, Z, X0, pushData);
+ return updateInfo.hasNewPushVersion();
+ }
+
+ @Test
+ public void testParameterValidation() {
+ try {
+ DesignerUpdateInfo updateInfo = new DesignerUpdateInfo(null, null, null, new JSONObject());
+ Assert.fail("should not reach here!");
+ } catch (InvalidParameterException e) {
+ // do nothing
+ }
+ }
+}
diff --git a/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info b/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info
new file mode 100644
index 000000000..eae77630f
--- /dev/null
+++ b/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj b/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj
index 89ed91033..a2d2fb7b4 100644
--- a/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj
+++ b/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj
@@ -4,13 +4,10 @@ package com.fr.aspectj.designerchart;
* Created by plough on 2017/3/3.
*/
import com.fr.chart.chartattr.Chart;
-import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
import org.aspectj.lang.reflect.SourceLocation;
-import javax.swing.event.ListSelectionEvent;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
-import java.util.Date;
public aspect TemplateProcessTracker {
//声明一个pointcut,匹配你需要的方法
diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
index c9b55b298..8d3d75a35 100644
--- a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
+++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java
@@ -1,15 +1,5 @@
package com.fr.design.designer.creator;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.event.ContainerEvent;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
import com.fr.design.designer.beans.LayoutAdapter;
import com.fr.design.designer.beans.adapters.layout.FRFitLayoutAdapter;
import com.fr.design.designer.beans.location.Direction;
@@ -24,17 +14,25 @@ import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.PaddingMargin;
import com.fr.form.ui.Widget;
+import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
import com.fr.form.ui.container.WBodyLayoutType;
import com.fr.form.ui.container.WFitLayout;
import com.fr.form.ui.container.WLayout;
import com.fr.general.FRLogger;
import com.fr.general.FRScreen;
-import com.fr.form.ui.container.WAbsoluteLayout.BoundsWidget;
-
import com.fr.stable.ArrayUtils;
import edu.emory.mathcs.backport.java.util.Arrays;
import javax.swing.JOptionPane;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.event.ContainerEvent;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
/**
diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java
index 5175b30dc..401f7d2f2 100644
--- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java
+++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyMobilePropertyUI.java
@@ -1,8 +1,7 @@
package com.fr.design.designer.properties.mobile;
import com.fr.design.designer.creator.XCreator;
-import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
-import com.fr.design.designer.creator.XWFitLayout;
+import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider;
import com.fr.design.gui.itable.AbstractPropertyTable;
@@ -16,19 +15,19 @@ public class BodyMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
private XCreator xCreator;
- public BodyMobilePropertyUI(XWFitLayout xwFitLayout) {
+ public BodyMobilePropertyUI(XLayoutContainer xwFitLayout) {
this.xCreator = xwFitLayout;
}
- public BodyMobilePropertyUI(XWAbsoluteBodyLayout xwAbsoluteBodyLayout) {
- this.xCreator = xwAbsoluteBodyLayout;
- }
-
@Override
public AbstractPropertyTable createWidgetAttrTable() {
return null;
}
+ public XCreator getxCreator() {
+ return xCreator;
+ }
+
@Override
public BasicPane createWidgetAttrPane() {
return new BodyMobileDefinePane(xCreator);
diff --git a/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java
new file mode 100644
index 000000000..d976816f5
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java
@@ -0,0 +1,28 @@
+package com.fr.design.form.util;
+
+import com.fr.design.mainframe.FormDesigner;
+import com.fr.form.ui.container.WFitLayout;
+
+public class FormDesignerUtils {
+ /**
+ * body布局是否设置了手机重布局
+ *
+ * @param designer
+ * @return
+ */
+ public static boolean isAppRelayout(FormDesigner designer) {
+ return ((WFitLayout) designer.getRootComponent().toData()).isAppRelayout();
+ }
+
+ /**
+ * body布局是否设置了绝对布局
+ *
+ * @param designer
+ * @return
+ */
+ public static boolean isBodyAbsolute(FormDesigner designer) {
+ WFitLayout root = ((WFitLayout) designer.getRootComponent().toData());
+ return root.getBodyLayoutType() == com.fr.form.ui.container.WBodyLayoutType.ABSOLUTE;
+ }
+
+}
\ No newline at end of file
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
index d25ba6fee..bcf761fac 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java
@@ -37,8 +37,8 @@ import com.fr.design.gui.xpane.FormHyperlinkGroupPaneNoPop;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.form.FormECCompositeProvider;
import com.fr.design.mainframe.form.FormECDesignerProvider;
-import com.fr.design.mainframe.templateinfo.JFormProcessInfo;
-import com.fr.design.mainframe.templateinfo.TemplateProcessInfo;
+import com.fr.design.mainframe.template.info.JFormProcessInfo;
+import com.fr.design.mainframe.template.info.TemplateProcessInfo;
import com.fr.design.mainframe.toolbar.ToolBarMenuDock;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.KeySetUtils;
diff --git a/designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
similarity index 95%
rename from designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java
rename to designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
index 15f501b13..fce5ab809 100644
--- a/designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java
+++ b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java
@@ -1,4 +1,4 @@
-package com.fr.design.mainframe.templateinfo;
+package com.fr.design.mainframe.template.info;
import com.fr.form.main.Form;
import com.fr.form.ui.container.WLayout;
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/XmlRelationedBasicPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/XmlRelationedBasicPane.java
new file mode 100644
index 000000000..1f9b13693
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/XmlRelationedBasicPane.java
@@ -0,0 +1,18 @@
+package com.fr.design.widget.ui.designer;
+
+import com.fr.design.dialog.BasicPane;
+
+/**
+ * 有些控件在不同终端需要对相同的属性分别进行设置,基础设置面板是一样的但是映射到控件上的属性又是不一样的,为了重用面板,这边加上xmltag做区分
+ */
+public abstract class XmlRelationedBasicPane extends BasicPane{
+ private String xmlTag;
+
+ public XmlRelationedBasicPane(String xmlTag) {
+ this.xmlTag = xmlTag;
+ }
+
+ public String getXmlTag() {
+ return xmlTag;
+ }
+}
\ No newline at end of file
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java
index 9b4a432a2..856ff6a0c 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/component/PaddingBoundPane.java
@@ -21,22 +21,26 @@ import java.awt.Component;
/**
* Created by ibm on 2017/8/3.
*/
-public class PaddingBoundPane extends BasicPane{
+public class PaddingBoundPane extends BasicPane {
protected UISpinner top;
protected UISpinner bottom;
protected UISpinner left;
protected UISpinner right;
public PaddingBoundPane() {
- initBoundPane();
+ initBoundPane(0, 0, 0, 0);
}
- public void initBoundPane() {
+ public PaddingBoundPane(int top, int bottom, int left, int right) {
+ initBoundPane(top, bottom, left, right);
+ }
+
+ public void initBoundPane(int t, int b, int l, int r) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
- top = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
- bottom = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
- left = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
- right = new UISpinner(0, Integer.MAX_VALUE, 1, 0);
+ 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.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"));
@@ -45,12 +49,12 @@ public class PaddingBoundPane extends BasicPane{
label.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, 0, 0));
label.setVerticalAlignment(SwingConstants.TOP);
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{
- new Component[]{label, createRightPane()}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1 );
+ new Component[]{label, createRightPane()}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W2, IntervalConstants.INTERVAL_L1);
this.add(panel);
}
- public JPanel createRightPane(){
+ public JPanel createRightPane() {
double f = TableLayout.FILL;
double p = TableLayout.PREFERRED;
double[] rowSize = {p, p};
@@ -67,7 +71,7 @@ public class PaddingBoundPane extends BasicPane{
JPanel northPanel = TableLayoutHelper.createGapTableLayoutPane(components1, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L6);
northPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, IntervalConstants.INTERVAL_L1, 0));
JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components2, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_L6, IntervalConstants.INTERVAL_L6);
- JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane();
panel.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, 0, IntervalConstants.INTERVAL_L1, 0));
panel.add(northPanel, BorderLayout.NORTH);
panel.add(centerPanel, BorderLayout.CENTER);
@@ -75,20 +79,26 @@ public class PaddingBoundPane extends BasicPane{
}
public void update(RichStyleWidgetProvider marginWidget) {
- marginWidget.setMargin(new PaddingMargin((int)top.getValue(), (int)left.getValue(), (int)bottom.getValue(), (int)right.getValue() ));
+ marginWidget.setMargin(updateBean());
+ }
+
+ public PaddingMargin updateBean() {
+ return new PaddingMargin((int) top.getValue(), (int) left.getValue(), (int) bottom.getValue(), (int) right.getValue());
}
+ @Override
protected String title4PopupWindow() {
return "PaddingBoundPane";
}
public void populate(RichStyleWidgetProvider marginWidget) {
- PaddingMargin paddingMargin = marginWidget.getMargin();
- top.setValue(paddingMargin.getTop());
- bottom.setValue(paddingMargin.getBottom());
- left.setValue(paddingMargin.getLeft());
- right.setValue(paddingMargin.getRight());
+ populateBean(marginWidget.getMargin());
}
-
+ public void populateBean(PaddingMargin paddingMargin) {
+ top.setValueWithoutEvent(paddingMargin.getTop());
+ bottom.setValueWithoutEvent(paddingMargin.getBottom());
+ left.setValueWithoutEvent(paddingMargin.getLeft());
+ right.setValueWithoutEvent(paddingMargin.getRight());
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java
index 11c5023ef..b91e1d7b6 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BodyMobileDefinePane.java
@@ -1,21 +1,25 @@
package com.fr.design.widget.ui.designer.mobile;
+import com.fr.base.iofile.attr.FormBodyPaddingAttrMark;
import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.foldablepane.UIExpandablePane;
+import com.fr.design.form.util.FormDesignerUtils;
import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.MobileWidgetListPane;
import com.fr.design.mainframe.WidgetPropertyPane;
+import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane;
+import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane;
+import com.fr.form.ui.RichStyleWidgetProvider;
+import com.fr.form.ui.container.WFitLayout;
import com.fr.form.ui.container.WSortLayout;
-
import javax.swing.BorderFactory;
import javax.swing.JPanel;
import java.awt.BorderLayout;
-import java.lang.reflect.Method;
/**
* Created by plough on 2018/2/1.
@@ -26,22 +30,40 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane {
private AttributeChangeListener changeListener;
private UICheckBox appRelayoutCheck;
private MobileWidgetListPane mobileWidgetListPane;
+ private MobileComponentAdvancePane advancePane;
+ private MobileComponentLayoutIntervalPane intervalPane;
public BodyMobileDefinePane(XCreator xCreator) {
this.bodyCreator = xCreator;
}
+ public XCreator getBodyCreator() {
+ return bodyCreator;
+ }
+
+ public void setBodyCreator(XCreator bodyCreator) {
+ this.bodyCreator = bodyCreator;
+ }
+
+ public FormDesigner getDesigner() {
+ return designer;
+ }
+
+ public void setDesigner(FormDesigner designer) {
+ this.designer = designer;
+ }
+
@Override
public void initPropertyGroups(Object source) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner();
- this.add(getMobilePropertyPane(), BorderLayout.NORTH);
+ this.add(createNorthPane(), BorderLayout.NORTH);
this.add(getMobileWidgetListPane(), BorderLayout.CENTER);
this.repaint();
}
// 手机属性
- private UIExpandablePane getMobilePropertyPane() {
+ public UIExpandablePane getMobilePropertyPane() {
JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane();
appRelayoutCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_App_ReLayout"), true);
appRelayoutCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0));
@@ -55,7 +77,7 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane {
}
// 控件顺序
- private UIExpandablePane getMobileWidgetListPane() {
+ public UIExpandablePane getMobileWidgetListPane() {
mobileWidgetListPane = new MobileWidgetListPane(designer, (WSortLayout) bodyCreator.toData());
mobileWidgetListPane.setBorder(BorderFactory.createEmptyBorder(10, 0, 5, 0));
JPanel panelWrapper = FRGUIPaneFactory.createBorderLayout_S_Pane();
@@ -64,6 +86,24 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane {
return new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Order"), 280, 20, panelWrapper);
}
+ private JPanel createNorthPane() {
+ JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ holder.add(getMobilePropertyPane(), BorderLayout.NORTH);
+
+ advancePane = new MobileComponentAdvancePane(FormBodyPaddingAttrMark.XML_TAG);
+ intervalPane = new MobileComponentLayoutIntervalPane(FormBodyPaddingAttrMark.XML_TAG);
+ //高级
+ holder.add(advancePane, BorderLayout.CENTER);
+ //布局
+ holder.add(intervalPane, BorderLayout.SOUTH);
+
+ advancePane.setVisible(!shouldHidePadding(designer));
+ intervalPane.setVisible(!shouldHidePadding(designer));
+
+ return holder;
+ }
+
+
private void bindListeners2Widgets() {
reInitAllListeners();
this.changeListener = new AttributeChangeListener() {
@@ -81,25 +121,13 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane {
initListener(this);
}
- // body是否开启手机重布局
- private boolean isAppRelayout() {
- boolean result = false;
- try {
- Method m = bodyCreator.toData().getClass().getMethod("isAppRelayout");
- result = (boolean)m.invoke(bodyCreator.toData());
- } catch (Exception e) {
- // do nothing
- }
- return result;
- }
private void setAppRelayout(boolean appRelayoutSeleted) {
- if (appRelayoutSeleted == isAppRelayout()) {
+ if (appRelayoutSeleted == FormDesignerUtils.isAppRelayout(designer)) {
return;
}
try {
- Method m = bodyCreator.toData().getClass().getMethod("setAppRelayout", boolean.class);
- m.invoke(bodyCreator.toData(), appRelayoutSeleted);
+ ((WFitLayout) designer.getRootComponent().toData()).setAppRelayout(appRelayoutSeleted);
} catch (Exception e) {
// do nothing
}
@@ -108,17 +136,31 @@ public class BodyMobileDefinePane extends MobileWidgetDefinePane {
@Override
public void populate(FormDesigner designer) {
this.designer = designer;
- appRelayoutCheck.setSelected(isAppRelayout());
+ appRelayoutCheck.setSelected(FormDesignerUtils.isAppRelayout(designer));
// 数据 populate 完成后,再设置监听
this.bindListeners2Widgets();
this.addAttributeChangeListener(changeListener);
+
+ advancePane.populate((RichStyleWidgetProvider) getBodyCreator().toData());
+ intervalPane.populate((RichStyleWidgetProvider) getBodyCreator().toData());
}
@Override
public void update() {
+ boolean appRelayout = appRelayoutCheck.isSelected();
setAppRelayout(appRelayoutCheck.isSelected());
+ boolean appPaddingVisible = appRelayout || !FormDesignerUtils.isBodyAbsolute(designer);
+ advancePane.setVisible(appPaddingVisible);
+ intervalPane.setVisible(appPaddingVisible);
mobileWidgetListPane.updateToDesigner();
designer.getEditListenerTable().fireCreatorModified(DesignerEvent.CREATOR_EDITED);
+
+ if (advancePane.isVisible()) {
+ advancePane.update((RichStyleWidgetProvider) getBodyCreator().toData());
+ }
+ if (intervalPane.isVisible()) {
+ intervalPane.update((RichStyleWidgetProvider) getBodyCreator().toData());
+ }
}
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java
index 86df38abc..b9ae12e20 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ChartEditorDefinePane.java
@@ -9,6 +9,7 @@ import com.fr.design.designer.creator.XWAbsoluteBodyLayout;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.designer.properties.items.Item;
import com.fr.design.foldablepane.UIExpandablePane;
+import com.fr.design.form.util.FormDesignerUtils;
import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.icombobox.UIComboBox;
@@ -20,11 +21,14 @@ import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.form.ui.BaseChartEditor;
-import com.fr.form.ui.container.WFitLayout;
-
-import javax.swing.*;
-import java.awt.*;
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
@@ -56,7 +60,7 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane {
JPanel mobileSettingsPane;
if (isInAbsoluteLayout()) {
mobileSettingsPane = getUnavailableTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tip_Chart_Adaptivity_Unavailable_In_Absolute_Layout"));
- } else if (!isAppRelayout()) {
+ } else if (!FormDesignerUtils.isAppRelayout(designer)) {
mobileSettingsPane = getUnavailableTipPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tip_Chart_Adaptivity_Unavailable"));
} else {
mobileSettingsPane = getMobileSettingsPane();
@@ -76,11 +80,6 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane {
return false;
}
- // body是否开启手机重布局
- private boolean isAppRelayout() {
- return ((WFitLayout)designer.getRootComponent().toData()).isAppRelayout();
- }
-
private JPanel getUnavailableTipPane(String tipText) {
JPanel panel = new JPanel(new BorderLayout());
UILabel unavailableTipLabel = new UILabel();
@@ -158,7 +157,7 @@ public class ChartEditorDefinePane extends MobileWidgetDefinePane {
this.bindListeners2Widgets();
this.addAttributeChangeListener(changeListener);
- if (!isAppRelayout() || isInAbsoluteLayout()) {
+ if (!FormDesignerUtils.isAppRelayout(designer) || isInAbsoluteLayout()) {
return;
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java
index ac4de096a..d44707181 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/MobileWidgetDefinePane.java
@@ -1,5 +1,6 @@
package com.fr.design.widget.ui.designer.mobile;
+import com.fr.design.form.util.FormDesignerUtils;
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane;
import com.fr.design.mainframe.FormDesigner;
@@ -7,10 +8,10 @@ import javax.swing.*;
/**
* 所有移动端需要拓展的属性面板均继承此类
- *
+ *
* Created by fanglei on 2017/8/8.
*/
-public abstract class MobileWidgetDefinePane extends AbstractAttrNoScrollPane{
+public abstract class MobileWidgetDefinePane extends AbstractAttrNoScrollPane {
//初始化panel数据再repaint
public abstract void initPropertyGroups(Object source);
@@ -28,11 +29,21 @@ public abstract class MobileWidgetDefinePane extends AbstractAttrNoScrollPane{
// 暂不需要此方法
@Override
- protected void initContentPane() {}
+ protected void initContentPane() {
+ }
// 暂不需要此方法
@Override
protected JPanel createContentPane() {
return new JPanel();
}
+
+ /**
+ * 绝对布局且不勾选手机重布局 的时候不支持边距设置
+ *
+ * @return
+ */
+ public boolean shouldHidePadding(FormDesigner designer) {
+ return !FormDesignerUtils.isAppRelayout(designer) && FormDesignerUtils.isBodyAbsolute(designer);
+ }
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java
index f6d94da06..8a795b887 100644
--- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TabMobileWidgetDefinePane.java
@@ -1,5 +1,6 @@
package com.fr.design.widget.ui.designer.mobile;
+import com.fr.base.iofile.attr.FormTabPaddingAttrMark;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.designer.IntervalConstants;
import com.fr.design.designer.creator.XCreator;
@@ -9,8 +10,11 @@ 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.AccessibleTemplateStyleEditor;
import com.fr.design.mainframe.widget.accessibles.MobileTemplateStylePane;
+import com.fr.design.widget.ui.designer.mobile.component.MobileComponentAdvancePane;
+import com.fr.design.widget.ui.designer.mobile.component.MobileComponentLayoutIntervalPane;
import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.general.cardtag.mobile.MobileTemplateStyle;
@@ -20,8 +24,11 @@ import java.awt.Component;
public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane {
private XCreator xCreator;
+ private FormDesigner designer; // 当前设计器
private AccessibleTemplateStyleEditor templateStyleEditor;
private AttributeChangeListener changeListener;
+ private MobileComponentAdvancePane advancePane;
+ private MobileComponentLayoutIntervalPane intervalPane;
public TabMobileWidgetDefinePane(XCreator xCreator) {
this.xCreator = xCreator;
@@ -36,6 +43,7 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane {
}
};
}
+
/**
* 后台初始化所有事件.
*/
@@ -46,24 +54,47 @@ public class TabMobileWidgetDefinePane extends MobileWidgetDefinePane {
@Override
public void initPropertyGroups(Object source) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ this.designer = WidgetPropertyPane.getInstance().getEditingFormDesigner();
UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Tab_Style_Template"));
templateStyleEditor = new AccessibleTemplateStyleEditor(new MobileTemplateStylePane((WCardTagLayout) xCreator.toData()));
- JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{label, templateStyleEditor}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_MEDIUM);
- this.add(jPanel, BorderLayout.CENTER);
+ JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{label, templateStyleEditor}, {new UILabel()}}, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_L1, LayoutConstants.VGAP_LARGE);
+ JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ holder.add(jPanel, BorderLayout.NORTH);
+ if (!shouldHidePadding(designer)) {
+ advancePane = new MobileComponentAdvancePane(FormTabPaddingAttrMark.XML_TAG);
+ intervalPane = new MobileComponentLayoutIntervalPane(FormTabPaddingAttrMark.XML_TAG);
+ //高级
+ holder.add(advancePane, BorderLayout.CENTER);
+ //布局
+ holder.add(intervalPane, BorderLayout.SOUTH);
+ }
+
+ this.add(holder, BorderLayout.NORTH);
}
@Override
public void populate(FormDesigner designer) {
- templateStyleEditor.setValue(((WCardTagLayout)xCreator.toData()).getMobileTemplateStyle());
+ templateStyleEditor.setValue(((WCardTagLayout) xCreator.toData()).getMobileTemplateStyle());
// 数据 populate 完成后,再设置监听
this.bindListeners2Widgets();
this.addAttributeChangeListener(changeListener);
+ if (advancePane != null) {//业务层面可以写成shouldHidePadding但是这样写应该性能差点
+ advancePane.populate((WCardTagLayout) xCreator.toData());
+ }
+ if (intervalPane != null) {
+ intervalPane.populate((WCardTagLayout) xCreator.toData());
+ }
}
@Override
public void update() {
- ((WCardTagLayout)xCreator.toData()).setMobileTemplateStyle((MobileTemplateStyle) templateStyleEditor.getValue());
+ ((WCardTagLayout) xCreator.toData()).setMobileTemplateStyle((MobileTemplateStyle) templateStyleEditor.getValue());
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); // 触发设计器保存按钮亮起来
-
+ if (advancePane != null) {
+ advancePane.update((WCardTagLayout) xCreator.toData());
+ }
+ if (intervalPane != null) {
+ intervalPane.update((WCardTagLayout) xCreator.toData());
+ }
}
}
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java
new file mode 100644
index 000000000..f94d57907
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentAdvancePane.java
@@ -0,0 +1,45 @@
+package com.fr.design.widget.ui.designer.mobile.component;
+
+import com.fr.base.iofile.attr.AttrMarkFactory;
+import com.fr.base.iofile.attr.FormBodyPaddingAttrMark;
+import com.fr.design.foldablepane.UIExpandablePane;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.widget.ui.designer.XmlRelationedBasicPane;
+import com.fr.design.widget.ui.designer.component.PaddingBoundPane;
+import com.fr.form.ui.RichStyleWidgetProvider;
+
+import java.awt.BorderLayout;
+
+/**
+ * 只有内边距设置的高级设置
+ */
+public class MobileComponentAdvancePane extends XmlRelationedBasicPane {
+ private PaddingBoundPane paddingBound;
+
+ public MobileComponentAdvancePane(String xmlTag) {
+ super(xmlTag);
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ paddingBound = new PaddingBoundPane(FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE, FormBodyPaddingAttrMark.DEFAULT_SIZE);
+ UIExpandablePane advanceExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, paddingBound);
+ this.add(advanceExpandablePane, BorderLayout.NORTH);
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return "ComponentAdvancePane";
+ }
+
+ public void update(RichStyleWidgetProvider marginWidget) {
+ FormBodyPaddingAttrMark attrMark = marginWidget.getWidgetAttrMark(getXmlTag());
+ attrMark = attrMark == null ? (FormBodyPaddingAttrMark) AttrMarkFactory.createAttrMark(getXmlTag()) : attrMark;
+ attrMark.setPaddingMargin(paddingBound.updateBean());
+ marginWidget.addWidgetAttrMark(attrMark);
+ }
+
+ public void populate(RichStyleWidgetProvider marginWidget) {
+ FormBodyPaddingAttrMark attrMark = marginWidget.getWidgetAttrMark(getXmlTag());
+ if (attrMark != null) {
+ paddingBound.populateBean(attrMark.getPaddingMargin());
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java
new file mode 100644
index 000000000..5a565373d
--- /dev/null
+++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileComponentLayoutIntervalPane.java
@@ -0,0 +1,71 @@
+package com.fr.design.widget.ui.designer.mobile.component;
+
+import com.fr.base.iofile.attr.AttrMarkFactory;
+import com.fr.base.iofile.attr.FormBodyPaddingAttrMark;
+import com.fr.design.designer.IntervalConstants;
+import com.fr.design.foldablepane.UIExpandablePane;
+import com.fr.design.gui.ilable.UILabel;
+import com.fr.design.gui.ispinner.UISpinner;
+import com.fr.design.layout.FRGUIPaneFactory;
+import com.fr.design.layout.TableLayout;
+import com.fr.design.layout.TableLayoutHelper;
+import com.fr.design.utils.gui.UIComponentUtils;
+import com.fr.design.widget.FRWidgetFactory;
+import com.fr.design.widget.ui.designer.XmlRelationedBasicPane;
+import com.fr.form.ui.RichStyleWidgetProvider;
+
+import javax.swing.BorderFactory;
+import javax.swing.JPanel;
+import java.awt.BorderLayout;
+import java.awt.Component;
+
+/**
+ * 只有组件间隔的布局设置
+ */
+public class MobileComponentLayoutIntervalPane extends XmlRelationedBasicPane {
+ private UISpinner componentIntervel;
+
+ public MobileComponentLayoutIntervalPane(String xmlTag) {
+ super(xmlTag);
+ this.setLayout(FRGUIPaneFactory.createBorderLayout());
+ UILabel intervalLabel = FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Component_Interval"));
+
+ double f = TableLayout.FILL;
+ double p = TableLayout.PREFERRED;
+ double[] rowSize = {p, p};
+ double[] columnSize = {p, f};
+ int[][] rowCount = {{1, 1}, {1, 1}};
+ componentIntervel = new UISpinner(0, Integer.MAX_VALUE, 1, FormBodyPaddingAttrMark.DEFAULT_SIZE);
+ JPanel componentIntervelPane = UIComponentUtils.wrapWithBorderLayoutPane(componentIntervel);
+
+ Component[][] components = new Component[][]{
+ new Component[]{intervalLabel, componentIntervelPane}
+ };
+ JPanel centerPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, IntervalConstants.INTERVAL_W1, IntervalConstants.INTERVAL_L1);
+ centerPane.setBorder(BorderFactory.createEmptyBorder(IntervalConstants.INTERVAL_L1, IntervalConstants.INTERVAL_L5, 0, 0));
+ JPanel holder = FRGUIPaneFactory.createBorderLayout_S_Pane();
+ holder.add(centerPane, BorderLayout.NORTH);
+ UIExpandablePane layoutExpandablePane = new UIExpandablePane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout"), 280, 20, holder);
+ this.add(layoutExpandablePane, BorderLayout.NORTH);
+ }
+
+ @Override
+ protected String title4PopupWindow() {
+ return "ComponentIntervelPane";
+ }
+
+ public void update(RichStyleWidgetProvider marginWidget) {
+
+ FormBodyPaddingAttrMark attrMark = marginWidget.getWidgetAttrMark(getXmlTag());
+ attrMark = attrMark == null ? (FormBodyPaddingAttrMark) AttrMarkFactory.createAttrMark(getXmlTag()) : attrMark;
+ attrMark.setInterval((int) componentIntervel.getValue());
+ marginWidget.addWidgetAttrMark(attrMark);
+ }
+
+ public void populate(RichStyleWidgetProvider marginWidget) {
+ FormBodyPaddingAttrMark attrMark = marginWidget.getWidgetAttrMark(getXmlTag());
+ if (attrMark != null) {
+ componentIntervel.setValueWithoutEvent(attrMark.getInterval());
+ }
+ }
+}
\ No newline at end of file
diff --git a/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj b/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj
index 3be1a77fa..9daec5009 100644
--- a/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj
+++ b/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj
@@ -3,12 +3,10 @@ package com.fr.aspectj.designerform;
/**
* Created by plough on 2017/3/3.
*/
-import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
import org.aspectj.lang.reflect.SourceLocation;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
-import java.util.Date;
public aspect TemplateProcessTracker {
//声明一个pointcut,匹配你需要的方法
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java
index 8a3f4bb25..775f402d8 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java
@@ -7,7 +7,8 @@ import com.fr.base.FRContext;
import com.fr.config.MarketConfig;
import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.errorinfo.ErrorInfoUploader;
-import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
+import com.fr.design.mainframe.messagecollect.impl.FocusPointMessageUploader;
+import com.fr.design.mainframe.template.info.TemplateInfoCollector;
import com.fr.general.CloudCenter;
import com.fr.general.ComparatorUtils;
import com.fr.general.DateUtils;
@@ -15,20 +16,13 @@ import com.fr.general.DesUtils;
import com.fr.general.GeneralUtils;
import com.fr.general.IOUtils;
import com.fr.general.http.HttpToolbox;
-import com.fr.intelli.record.FocusPoint;
-import com.fr.intelli.record.MetricRegistry;
import com.fr.json.JSONArray;
-import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.EncodeConstants;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
-import com.fr.stable.query.QueryFactory;
-import com.fr.stable.query.condition.QueryCondition;
-import com.fr.stable.query.data.DataList;
-import com.fr.stable.query.restriction.RestrictionFactory;
import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLReadable;
import com.fr.stable.xml.XMLTools;
@@ -53,7 +47,6 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -81,24 +74,6 @@ public class InformationCollector implements XMLReadable, XMLWriter {
private static final String XML_KEY = "ActiveKey";
private static final String XML_OS = "OS";
- public static final String TABLE_NAME = "fr_functionrecord";
- public static final String FUNC_COLUMNNAME = "func";
- public static final String COLUMN_TIME = "time";
- public static final String TABLE_FUNCTION_RECORD = "function.record";
- private static final String ATTR_ID = "id";
- private static final String ATTR_TEXT = "text";
- private static final String ATTR_SOURCE = "source";
- private static final String ATTR_TIME = "time";
- private static final String ATTR_TIMES = "times";
- private static final String ATTR_TITLE = "title";
- private static final String ATTR_USER_NAME = "username";
- private static final String ATTR_UUID = "uuid";
- private static final String ATTR_ITEMS = "items";
- private static final String ATTR_FUNCTION_ARRAY = "functionArray";
- private static final int MAX_EACH_REQUEST_RECORD_COUNT = 200;
- private static final int PAGE_SIZE = 200;
- private long totalCount = -1;
-
private static InformationCollector collector;
//启动时间与关闭时间列表
@@ -184,6 +159,12 @@ public class InformationCollector implements XMLReadable, XMLWriter {
}
private void sendUserInfo(){
+ long currentTime = new Date().getTime();
+ long lastTime = getLastTimeMillis();
+
+ if (currentTime - lastTime <= DELTA) {
+ return;
+ }
JSONObject content = getJSONContentAsByte();
String url = CloudCenter.getInstance().acquireUrlByKind("user.info.v10");
boolean success = false;
@@ -201,135 +182,9 @@ public class InformationCollector implements XMLReadable, XMLWriter {
}
}
- private void sendFunctionsInfo(long currentTime, long lastTime){
- FineLoggerFactory.getLogger().info("Start sent function records to the cloud center...");
- queryAndSendOnePageFunctionContent(currentTime, lastTime, 0);
- long page = (totalCount/PAGE_SIZE) + 1;
- for(int i=1; i focusPoints = MetricRegistry.getMetric().find(FocusPoint.class,condition);
- //第一次查询获取总记录数
- if(page == 0){
- totalCount = focusPoints.getTotalCount();
- }
- sendThisPageFunctionContent(focusPoints);
- } catch (Exception e) {
- FineLoggerFactory.getLogger().error(e.getMessage(), e);
- }
- }
-
- private void sendThisPageFunctionContent(DataList focusPoints) {
- String url = CloudCenter.getInstance().acquireUrlByKind(TABLE_FUNCTION_RECORD);
- try {
- JSONObject jsonObject = dealWithSendFunctionContent(focusPoints);
- sendFunctionRecord(url, jsonObject);
- } catch (JSONException e) {
- FineLoggerFactory.getLogger().error(e.getMessage(), e);
- }
- }
-
- private JSONObject dealWithSendFunctionContent(DataList focusPoints) throws JSONException {
- JSONObject jsonObject = new JSONObject();
- Map map = new HashMap<>();
- if(!focusPoints.isEmpty()){
- DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
- String bbsUserName = MarketConfig.getInstance().getBbsUsername();
- String uuid = envManager.getUUID();
- jsonObject.put(ATTR_UUID, uuid);
- jsonObject.put(ATTR_USER_NAME, bbsUserName);
- for(FocusPoint focusPoint : focusPoints.getList()) {
- FunctionRecord functionRecord = getOneRecord(focusPoint);
- if (map.containsKey(focusPoint.getId())) {
- int times = ((FunctionRecord)map.get(focusPoint.getId())).getTimes() + 1;
- functionRecord.setTimes(times);
- map.put(focusPoint.getId(), functionRecord);
- } else {
- map.put(focusPoint.getId(), functionRecord);
- }
- }
- jsonObject.put(ATTR_ITEMS, mapToJSONArray(map));
- }
- return jsonObject;
- }
-
- private JSONArray mapToJSONArray(Map map) throws JSONException {
- JSONArray jsonArray = new JSONArray();
- for(String keys : map.keySet()){
- FunctionRecord functionRecord = (FunctionRecord)map.get(keys);
- JSONObject jo = new JSONObject();
- jo.put(ATTR_ID, functionRecord.getId());
- jo.put(ATTR_TEXT, functionRecord.getText());
- jo.put(ATTR_SOURCE, functionRecord.getSource());
- jo.put(ATTR_TIME, functionRecord.getTime());
- jo.put(ATTR_TITLE, functionRecord.getTitle());
- jo.put(ATTR_TIMES, functionRecord.getTimes());
- jsonArray.put(jo);
- }
- return jsonArray;
- }
-
- private void sendFunctionRecord(String url, JSONObject record) {
- boolean success = false;
- try {
- HashMap para = new HashMap<>();
- para.put("token", SiteCenterToken.generateToken());
- para.put("content", record);
- String res = HttpToolbox.post(url, para);
- success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success");
- if (success) {
- this.lastTime = dateToString();
- } else {
- FineLoggerFactory.getLogger().error("Error occured when sent function records to the cloud center.");
- }
- } catch (Exception e) {
- FineLoggerFactory.getLogger().error(e.getMessage(), e);
- }
- }
-
- private FunctionRecord getOneRecord(FocusPoint focusPoint) {
- FunctionRecord functionRecord = new FunctionRecord();
- functionRecord.setId(focusPoint.getId() == null?StringUtils.EMPTY : focusPoint.getId());
- functionRecord.setText(focusPoint.getText() == null?StringUtils.EMPTY : focusPoint.getText());
- functionRecord.setSource(focusPoint.getSource());
- functionRecord.setTime(focusPoint.getTime().getTime());
- functionRecord.setTitle(focusPoint.getTitle() == null?StringUtils.EMPTY : focusPoint.getTitle());
- functionRecord.setUsername(MarketConfig.getInstance().getBbsUsername() == null?StringUtils.EMPTY : MarketConfig.getInstance().getBbsUsername());
- functionRecord.setUuid(DesignerEnvManager.getEnvManager().getUUID() == null?StringUtils.EMPTY : DesignerEnvManager.getEnvManager().getUUID());
- return functionRecord;
- }
-
- /**
- * 收集开始使用时间,发送信息
- */
+ /**
+ * 收集开始使用时间,发送信息
+ */
public void collectStartTime(){
this.current.setStartDate(dateToString());
@@ -345,18 +200,12 @@ public class InformationCollector implements XMLReadable, XMLWriter {
service.schedule(new Runnable() {
@Override
public void run() {
- long currentTime = new Date().getTime();
- long lastTime = getLastTimeMillis();
- if (currentTime - lastTime > DELTA) {
- sendUserInfo();
- sendFunctionsInfo(currentTime, lastTime);
- }
-
+ sendUserInfo();
+ FocusPointMessageUploader.getInstance().sendToCloudCenter();
TemplateInfoCollector.getInstance().sendTemplateInfo();
ErrorInfoUploader.getInstance().sendErrorInfo();
}
}, SEND_DELAY, TimeUnit.SECONDS);
-
}
/**
@@ -524,94 +373,4 @@ public class InformationCollector implements XMLReadable, XMLWriter {
}
}
-
- private class FunctionRecord implements Comparable{
- private String id;
- private String text;
- private int source;
- private long time;
- private int times = 1;
- private String title;
- private String username;
- private String uuid;
-
- public FunctionRecord(){
-
- }
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public int getTimes() {
- return times;
- }
-
- public void setTimes(int times) {
- this.times = times;
- }
-
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-
- public int getSource() {
- return source;
- }
-
- public void setSource(int source) {
- this.source = source;
- }
-
- public long getTime() {
- return time;
- }
-
- public void setTime(long time) {
- this.time = time;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getUsername() {
- return username;
- }
-
- public void setUsername(String username) {
- this.username = username;
- }
-
- public String getUuid() {
- return uuid;
- }
-
- public void setUuid(String uuid) {
- this.uuid = uuid;
- }
-
- @Override
- public int compareTo(Object o) {
- FunctionRecord functionRecord = (FunctionRecord) o;
- if(this.getId().equals((functionRecord.getId())) && this.getText().equals(functionRecord.getText())
- && this.getSource() == functionRecord.getSource() && this.getTime() == functionRecord.getTime()
- && this.getTitle().equals(functionRecord.getTitle()) && this.getUsername().equals(functionRecord.getUsername())
- && this.getUuid().equals(functionRecord.getUuid())){
- return 0;
- }
- return 1;
- }
- }
}
\ No newline at end of file
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java
index 44becbd9c..07136bc1e 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java
@@ -41,8 +41,8 @@ import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icontainer.UIModeControlContainer;
import com.fr.design.gui.imenu.UIMenuItem;
import com.fr.design.mainframe.cell.QuickEditorRegion;
-import com.fr.design.mainframe.templateinfo.JWorkBookProcessInfo;
-import com.fr.design.mainframe.templateinfo.TemplateProcessInfo;
+import com.fr.design.mainframe.template.info.JWorkBookProcessInfo;
+import com.fr.design.mainframe.template.info.TemplateProcessInfo;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.KeySetUtils;
import com.fr.design.menu.MenuDef;
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java
index c8ecd9303..044a484b1 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java
@@ -33,15 +33,12 @@ import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager
import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager;
import com.fr.design.mainframe.alphafine.search.manager.impl.SegmentationManager;
import com.fr.design.mainframe.alphafine.search.manager.impl.SimilarSearchManager;
-import com.fr.design.mainframe.errorinfo.ErrorInfoUploader;
-import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
import com.fr.form.main.Form;
import com.fr.form.main.FormIO;
import com.fr.general.ComparatorUtils;
import com.fr.general.http.HttpClient;
import com.fr.io.TemplateWorkBookIO;
import com.fr.io.exporter.ImageExporter;
-import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.main.impl.WorkBook;
@@ -958,8 +955,6 @@ public class AlphaFineDialog extends UIDialog {
RecentSearchManager searchManager = RecentSearchManager.getInstance();
searchManager.addModel(storeText, cellModel);
sendDataToServer(storeText, cellModel);
- TemplateInfoCollector.getInstance().sendTemplateInfo();
- ErrorInfoUploader.getInstance().sendErrorInfo();
}
}
});
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java
index 052aaef9f..d22bcf75b 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfo.java
@@ -25,6 +25,7 @@ public class ErrorInfo {
private String templateid;
private String logid;
private String log;
+ private String stackTrace;
public ErrorInfo(String username, String uuid, String activekey) {
this.username = username;
@@ -89,6 +90,14 @@ public class ErrorInfo {
this.log = log;
}
+ public String getStackTrace() {
+ return stackTrace;
+ }
+
+ public void setStackTrace(String stackTrace) {
+ this.stackTrace = stackTrace;
+ }
+
private String dateToString(){
DateFormat df = FRContext.getDefaultValues().getDateTimeFormat();
return df.format(new Date());
@@ -107,6 +116,7 @@ public class ErrorInfo {
jo.put("uploadtime", uploadtime);
jo.put("logid", logid);
jo.put("log", log);
+ jo.put("stacktrace", stackTrace);
saveFileToCache(jo);
}
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java
index 8d4970a86..bcdea3e5a 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java
@@ -30,6 +30,7 @@ import java.io.InputStream;
public class ErrorInfoLogAppender extends AppenderSkeleton {
private static final int ERROR_LEN = 8;
+ private static final int ERROR_STACK_TRACE = 15;
// 缓存下不变的, 没必要频繁取.
private String username;
@@ -73,10 +74,23 @@ public class ErrorInfoLogAppender extends AppenderSkeleton {
errorInfo.setTemplateid(templateid);
errorInfo.setLog(msg);
errorInfo.setLogid(logid);
+ errorInfo.setStackTrace(readStackTrace(event));
errorInfo.saveAsJSON();
}
}
+ private String readStackTrace(LoggingEvent event) {
+ String[] s = event.getThrowableStrRep();
+ StringBuilder sb = new StringBuilder();
+ if (s != null) {
+ int len = Math.min(s.length, ERROR_STACK_TRACE);
+ for (int i = 0; i < len; i++) {
+ sb.append(s[i]).append("\n");
+ }
+ }
+ return sb.toString();
+ }
+
private String readLogID(String log) {
String errorCode = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_ErrorCode_Prefix");
// 报错信息国际化不规范, 有些是中文分号, 有些是英文
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java
new file mode 100644
index 000000000..2555a2632
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/entity/FileEntityBuilder.java
@@ -0,0 +1,152 @@
+package com.fr.design.mainframe.messagecollect.entity;
+
+import com.fr.general.CloudCenter;
+import com.fr.general.IOUtils;
+import com.fr.general.http.HttpToolbox;
+import com.fr.json.JSONArray;
+import com.fr.json.JSONException;
+import com.fr.json.JSONObject;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.CommonUtils;
+import com.fr.stable.EncodeConstants;
+import com.fr.stable.StableUtils;
+import com.fr.stable.StringUtils;
+import com.fr.third.jodd.datetime.JDateTime;
+import com.fr.third.org.apache.http.HttpEntity;
+import com.fr.third.org.apache.http.HttpResponse;
+import com.fr.third.org.apache.http.client.HttpClient;
+import com.fr.third.org.apache.http.client.methods.HttpPut;
+import com.fr.third.org.apache.http.entity.FileEntity;
+import com.fr.third.org.apache.http.impl.client.DefaultHttpClient;
+import com.fr.third.org.apache.http.util.EntityUtils;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import static com.fr.third.org.apache.http.HttpStatus.SC_OK;
+
+/**
+ * @author alex sung
+ * @date 2019/4/8
+ */
+public class FileEntityBuilder {
+
+ private static final String INTELLI_OPERATION_URL = "intelli.operation.url";
+ private static final String OPERATION_URL = "https://cloud.fanruan.com/config/protect/operation";
+ private static final String ATTR_SIGNATURE = "signature";
+ private static final String ATTR_KEY = "key";
+ private static final String FOCUS_POINT_FILE_ROOT_PATH = "FocusPoint";
+
+ /**
+ * 文件夹路径
+ */
+ private String folderName;
+
+ public FileEntityBuilder(String folderName) {
+ this.folderName = folderName;
+ }
+
+ public String getFolderName() {
+ return folderName;
+ }
+
+ public void setFolderName(String folderName) {
+ this.folderName = folderName;
+ }
+
+ public File generateZipFile(String pathName) {
+ File zipFile = null;
+ try {
+ zipFile = new File(pathName + ".zip");
+ java.util.zip.ZipOutputStream zipOut = new java.util.zip.ZipOutputStream(new FileOutputStream(zipFile));
+ IOUtils.zip(zipOut, new File(pathName));
+ zipOut.close();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ return zipFile;
+ }
+
+ public void generateFile(JSONArray jsonArray, String folderName) {
+ if (jsonArray.size() == 0) {
+ return;
+ }
+ try {
+ String content = jsonArray.toString();
+ String fileName = String.valueOf(UUID.randomUUID());
+ File file = new File(folderName + File.separator + fileName + ".json");
+ StableUtils.makesureFileExist(file);
+ FileOutputStream out = new FileOutputStream(file);
+ InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8));
+ IOUtils.copyBinaryTo(in, out);
+ in.close();
+ out.close();
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+
+ public void deleteFileAndZipFile(File zipFile, String pathName) {
+ File file = new File(pathName);
+ CommonUtils.deleteFile(file);
+ CommonUtils.deleteFile(zipFile);
+ }
+
+ /**
+ * 上传文件到云中心
+ * @param file 待上传文件
+ * @param keyFileName 目标文件
+ * @throws IOException
+ */
+ public static void uploadFile(File file, String keyFileName) throws IOException {
+ String today = new JDateTime().toString("YYYY-MM-DD");
+ HttpClient httpclient = new DefaultHttpClient();
+ try {
+ String signedUrl = generateSignedUploadUrl(FOCUS_POINT_FILE_ROOT_PATH + File.separator + today + File.separator +keyFileName);
+ if(StringUtils.isEmpty(signedUrl)){
+ FineLoggerFactory.getLogger().error("signedUrl is null.");
+ return;
+ }
+ HttpPut httpPost = new HttpPut(signedUrl);
+ httpPost.addHeader("Content-Type","application/octet-stream");
+ FileEntity fileEntity = new FileEntity(file);
+ httpPost.setEntity(fileEntity);
+ HttpResponse response = httpclient.execute(httpPost);
+
+ int statusCode = response.getStatusLine().getStatusCode();
+ if (statusCode == SC_OK) {
+ HttpEntity resEntity = response.getEntity();
+ EntityUtils.consume(resEntity);
+ } else {
+ HttpEntity entity = response.getEntity();
+ String result = EntityUtils.toString(entity, "utf-8");
+ FineLoggerFactory.getLogger().info("upload file result:" + result);
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+
+ private static String generateSignedUploadUrl(String fileKeyName) throws IOException {
+ String url = CloudCenter.getInstance().acquireUrlByKind(INTELLI_OPERATION_URL, OPERATION_URL);
+ Map parameters = new HashMap();
+ parameters.put(ATTR_KEY, fileKeyName);
+ parameters.put(ATTR_SIGNATURE, String.valueOf(CommonUtils.signature()));
+ String responseText = HttpToolbox.get(url, parameters);
+ try {
+ JSONObject data = new JSONObject(responseText);
+ if ("success".equals(data.optString("status"))) {
+ return data.optString("url");
+ }
+ } catch (JSONException e) {
+ FineLoggerFactory.getLogger().error("Illegal response text."+e, e.getMessage());
+ }
+ return null;
+ }
+}
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java
new file mode 100644
index 000000000..da98e4778
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/AbstractSendDataToCloud.java
@@ -0,0 +1,133 @@
+package com.fr.design.mainframe.messagecollect.impl;
+
+import com.fr.design.mainframe.messagecollect.entity.FileEntityBuilder;
+import com.fr.design.mainframe.messagecollect.utils.MessageCollectUtils;
+import com.fr.intelli.record.MetricRegistry;
+import com.fr.json.JSONArray;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.ProductConstants;
+import com.fr.stable.StableUtils;
+import com.fr.stable.query.QueryFactory;
+import com.fr.stable.query.condition.QueryCondition;
+import com.fr.stable.query.data.DataList;
+import com.fr.stable.query.restriction.RestrictionFactory;
+import com.fr.stable.xml.XMLTools;
+import com.fr.stable.xml.XMLable;
+
+import java.io.File;
+import java.io.FileOutputStream;
+
+/**
+ * @author alex sung
+ * @date 2019/3/22
+ */
+public abstract class AbstractSendDataToCloud implements XMLable {
+ private static final String FILE_NAME = "messagecollect.info";
+ private static final String COLUMN_TIME = "time";
+
+ protected String lastTime;
+ private static final int PAGE_SIZE = 10000;
+ private long totalCount = -1;
+ private FileEntityBuilder fileEntityBuilder;
+
+ public FileEntityBuilder getFileEntityBuilder() {
+ return fileEntityBuilder;
+ }
+
+ public void setFileEntityBuilder(FileEntityBuilder fileEntityBuilder) {
+ this.fileEntityBuilder = fileEntityBuilder;
+ }
+
+ public String getLastTime() {
+ return lastTime;
+ }
+
+ public void setLastTime(String lastTime) {
+ this.lastTime = lastTime;
+ }
+
+ public void saveLastTime() {
+ setLastTime(MessageCollectUtils.dateToString());
+ try {
+ FileOutputStream out = new FileOutputStream(getLastTimeFile());
+ XMLTools.writeOutputStreamXML(this, out);
+ } catch (Exception ex) {
+ FineLoggerFactory.getLogger().error(ex.getMessage());
+ }
+ }
+
+ public static File getLastTimeFile() {
+ return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME));
+ }
+
+ public void queryData(long currentTime, long lastTime, Class tClass) {
+ queryAndSendOnePageFunctionContent(currentTime, lastTime, 0, tClass);
+ long page = (totalCount / PAGE_SIZE) + 1;
+ for (int i = 1; i < page; i++) {
+ queryAndSendOnePageFunctionContent(currentTime, lastTime, i, tClass);
+ }
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+
+ private void queryAndSendOnePageFunctionContent(long current, long last, int page, Class tClass) {
+ QueryCondition condition = QueryFactory.create()
+ .skip(page * PAGE_SIZE)
+ .count(PAGE_SIZE)
+ .addSort(COLUMN_TIME, true)
+ .addRestriction(RestrictionFactory.lte(COLUMN_TIME, current))
+ .addRestriction(RestrictionFactory.gte(COLUMN_TIME, last));
+ try {
+ DataList points = MetricRegistry.getMetric().find(tClass, condition);
+ //第一次查询获取总记录数
+ if (page == 0) {
+ totalCount = points.getTotalCount();
+ }
+ dealWithData(points);
+
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+
+ public void dealWithData(DataList tDataList) throws Exception {
+ generateThisPageFile(tDataList);
+ }
+
+ private void generateThisPageFile(DataList points) {
+ File file = null;
+ try {
+ JSONArray jsonArray = dealWithSendFunctionContent(points);
+ //生成json文件
+ fileEntityBuilder.generateFile(jsonArray, getFileEntityBuilder().getFolderName());
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+
+ public abstract JSONArray dealWithSendFunctionContent(DataList focusPoints);
+
+ /**
+ * 生成zip并发送zip文件
+ * @param pathName zip文件路径
+ */
+ protected void sendZipFile(String pathName) {
+
+ File file = null;
+ try {
+ file = fileEntityBuilder.generateZipFile(pathName);
+ if (file != null) {
+ fileEntityBuilder.uploadFile(file, file.getName());
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ return;
+ }
+ fileEntityBuilder.deleteFileAndZipFile(file, pathName);
+ }
+
+
+}
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java
new file mode 100644
index 000000000..33adf8e2d
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/impl/FocusPointMessageUploader.java
@@ -0,0 +1,107 @@
+package com.fr.design.mainframe.messagecollect.impl;
+
+import com.fr.config.MarketConfig;
+import com.fr.design.DesignerEnvManager;
+import com.fr.design.mainframe.messagecollect.entity.FileEntityBuilder;
+import com.fr.design.mainframe.messagecollect.utils.MessageCollectUtils;
+import com.fr.intelli.record.FocusPoint;
+import com.fr.json.JSONArray;
+import com.fr.json.JSONObject;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.ProductConstants;
+import com.fr.stable.StableUtils;
+import com.fr.stable.query.data.DataList;
+import com.fr.stable.xml.XMLPrintWriter;
+import com.fr.stable.xml.XMLableReader;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * @author alex sung
+ * @date 2019/3/22
+ */
+public class FocusPointMessageUploader extends AbstractSendDataToCloud {
+
+ private static final String TAG = "FocusPointMessageTag";
+ private static final String SEPARATOR = "_";
+ private static final String FOCUS_POINT = "FocusPoint";
+ private static final long DELTA = 24 * 3600 * 1000L;
+ private static volatile FocusPointMessageUploader instance;
+
+ public static FocusPointMessageUploader getInstance() {
+ if (instance == null) {
+ synchronized (FocusPointMessageUploader.class) {
+ if (instance == null) {
+ instance = new FocusPointMessageUploader();
+ }
+ }
+ }
+ return instance;
+ }
+
+ @Override
+ public JSONArray dealWithSendFunctionContent(DataList focusPoints) {
+ JSONArray ja = new JSONArray();
+ for(T t:focusPoints.getList()){
+ FocusPoint focusPoint = (FocusPoint)t;
+ JSONObject jo = new JSONObject();
+ jo.put("id",focusPoint.getId());
+ jo.put("text",focusPoint.getText());
+ jo.put("source",focusPoint.getSource());
+ jo.put("time",focusPoint.getTime());
+ jo.put("username",focusPoint.getUsername());
+ jo.put("ip",focusPoint.getIp());
+ jo.put("title",focusPoint.getTitle());
+ jo.put("body",focusPoint.getBody());
+ ja.put(jo);
+ }
+ return ja;
+ }
+
+ public void sendToCloudCenter() {
+ MessageCollectUtils.readXMLFile(instance, getLastTimeFile());
+ long currentTime = new Date().getTime();
+ long lastTime = MessageCollectUtils.getLastTimeMillis(this.lastTime);
+ if (currentTime - lastTime <= DELTA) {
+ return;
+ }
+ try {
+ generatePath();
+ queryData(currentTime, lastTime, FocusPoint.class);
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error(e.getMessage());
+ }
+ sendZipFile(getFileEntityBuilder().getFolderName());
+ saveLastTime();
+ }
+
+ @Override
+ public void readXML(XMLableReader reader) {
+ if (reader.isAttr()) {
+ this.setLastTime(reader.getAttrAsString("focusPointLastTime", null));
+ }
+ }
+
+ @Override
+ public void writeXML(XMLPrintWriter writer) {
+ writer.startTAG(TAG);
+ writer.attr("focusPointLastTime", lastTime);
+ writer.end();
+ }
+
+ private void generatePath() {
+ DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
+ String bbsUserName = MarketConfig.getInstance().getBbsUsername();
+ String uuid = envManager.getUUID();
+ //文件夹名称的格式是: "FocusPoint" + 大版本号 + 小版本号 + uuid + bbsUserName + randomUuid,均以下划线分隔
+ StringBuilder sb = new StringBuilder();
+ sb.append(FOCUS_POINT).append(SEPARATOR).
+ append(ProductConstants.MAIN_VERSION).append(SEPARATOR).
+ append(ProductConstants.MINOR_VERSION).append(SEPARATOR).
+ append(uuid).append(SEPARATOR).append(bbsUserName).append(SEPARATOR).
+ append(UUID.randomUUID());
+ String folderName = StableUtils.pathJoin(ProductConstants.getEnvHome(), sb.toString());
+ setFileEntityBuilder(new FileEntityBuilder(folderName));
+ }
+}
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/utils/MessageCollectUtils.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/utils/MessageCollectUtils.java
new file mode 100644
index 000000000..738942208
--- /dev/null
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/utils/MessageCollectUtils.java
@@ -0,0 +1,63 @@
+package com.fr.design.mainframe.messagecollect.utils;
+
+import com.fr.base.FRContext;
+import com.fr.general.DateUtils;
+import com.fr.general.IOUtils;
+import com.fr.log.FineLoggerFactory;
+import com.fr.stable.EncodeConstants;
+import com.fr.stable.StringUtils;
+import com.fr.stable.xml.XMLReadable;
+import com.fr.stable.xml.XMLableReader;
+import com.fr.third.javax.xml.stream.XMLStreamException;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.text.DateFormat;
+import java.util.Date;
+
+/**
+ * @author alex sung
+ * @date 2019/3/26
+ */
+public class MessageCollectUtils {
+
+ public static void readXMLFile(XMLReadable xmlReadable, File xmlFile) {
+ if (xmlFile == null || !xmlFile.exists()) {
+ return;
+ }
+ String charset = EncodeConstants.ENCODING_UTF_8;
+ try {
+ InputStream is = new FileInputStream(xmlFile);
+ String fileContent = IOUtils.inputStream2String(is);
+ InputStream xmlInputStream = new ByteArrayInputStream(fileContent.getBytes(charset));
+ InputStreamReader inputStreamReader = new InputStreamReader(xmlInputStream, charset);
+ XMLableReader xmlReader = XMLableReader.createXMLableReader(inputStreamReader);
+ if (xmlReader != null) {
+ xmlReader.readXMLObject(xmlReadable);
+ }
+ xmlInputStream.close();
+ } catch (IOException | XMLStreamException e) {
+ FineLoggerFactory.getLogger().error(e.getMessage(), e);
+ }
+ }
+
+ public static long getLastTimeMillis(String lastTime) {
+ if (StringUtils.isEmpty(lastTime)) {
+ return 0;
+ }
+ try {
+ return DateUtils.string2Date(lastTime, true).getTime();
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ public static String dateToString(){
+ DateFormat df = FRContext.getDefaultValues().getDateTimeFormat();
+ return df.format(new Date());
+ }
+}
diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java b/designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java
similarity index 98%
rename from designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java
rename to designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java
index 306c6b0d1..eec777328 100644
--- a/designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java
+++ b/designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java
@@ -1,4 +1,4 @@
-package com.fr.design.mainframe.templateinfo;
+package com.fr.design.mainframe.template.info;
import com.fr.base.parameter.ParameterUI;
import com.fr.main.impl.WorkBook;
diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java
index bd872e41a..1d207d330 100644
--- a/designer-realize/src/main/java/com/fr/start/Designer.java
+++ b/designer-realize/src/main/java/com/fr/start/Designer.java
@@ -11,6 +11,7 @@ import com.fr.design.actions.server.ServerConfigManagerAction;
import com.fr.design.actions.server.StyleListAction;
import com.fr.design.actions.server.WidgetManagerAction;
import com.fr.design.constants.UIConstants;
+import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.fun.MenuHandler;
@@ -80,6 +81,10 @@ public class Designer extends BaseDesigner {
private UIButton redo;
private UIPreviewButton run;
+ public Designer(String[] args) {
+ super(args);
+ }
+
/**
* 设计器启动的Main方法
*
@@ -108,11 +113,6 @@ public class Designer extends BaseDesigner {
}
- public Designer(String[] args) {
- super(args);
- }
-
-
/**
* 创建新建文件的快捷方式数组。
*
@@ -215,7 +215,7 @@ public class Designer extends BaseDesigner {
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
- JTemplate, ?> jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
+ JTemplate, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
jt.stopEditing();
jt.saveTemplate();
jt.requestFocus();
@@ -224,6 +224,7 @@ public class Designer extends BaseDesigner {
return saveButton;
}
+
private UIButton createUndoButton() {
undo = new UIButton(BaseUtils.readIcon("/com/fr/design/images/buttonicon/undo.png"));
undo.setToolTipText(KeySetUtils.UNDO.getMenuKeySetName());
diff --git a/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj
index 8e4eeb716..2c5433818 100644
--- a/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj
+++ b/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj
@@ -5,13 +5,11 @@ package com.fr.aspectj.designer;
* Created by plough on 2017/3/3.
*/
-import com.fr.design.mainframe.templateinfo.TemplateInfoCollector;
import com.fr.grid.Grid;
import org.aspectj.lang.reflect.SourceLocation;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
-import java.util.Date;
public aspect TemplateProcessTracker {
//声明一个pointcut,匹配你需要的方法