From b21a12482a49c4330af93eb76abd2771b4581828 Mon Sep 17 00:00:00 2001 From: richie Date: Tue, 5 Mar 2019 22:18:42 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E9=80=9A=E7=94=A8=E7=9A=84web?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=EF=BC=8C=E5=85=B6=E4=BB=96=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E7=94=A8=E4=B8=8D=E5=88=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 33 ++++- .../design/actions/file/PreferencePane.java | 12 ++ .../main/java/com/fr/design/ui/ModernUI.java | 18 +++ .../java/com/fr/design/ui/ModernUIPane.java | 119 ++++++++++++++++++ .../com/fr/design/ui/ModernUIPaneTest.java | 76 +++++++++++ .../test/resources/com/fr/design/ui/demo.html | 17 +++ 6 files changed, 272 insertions(+), 3 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/ui/ModernUI.java create mode 100644 designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java create mode 100644 designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java create mode 100644 designer-base/src/test/resources/com/fr/design/ui/demo.html diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index dba3141b7..de108c388 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -164,6 +164,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private static List mapWorkerList = new ArrayList(); private boolean imageCompress = false;//图片压缩 + // 开启内嵌web页面的调试窗口 + private boolean openDebug = false; /** * DesignerEnvManager. @@ -1383,6 +1385,13 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { reader.readXMLObject(this.configManager); } + private void readOpenDebug(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.openDebug = Boolean.parseBoolean(tmpVal); + } + } + public String getUUID() { return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; } @@ -1411,6 +1420,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.imageCompress = imageCompress; } + public boolean isOpenDebug() { + return openDebug; + } + + public void setOpenDebug(boolean openDebug) { + this.openDebug = openDebug; + } + /** * Read XML.
* The method will be invoked when read data from XML file.
@@ -1458,12 +1475,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { readUUID(reader); } else if ("status".equals(name)) { readActiveStatus(reader); - } else if (ComparatorUtils.equals(CAS_PARAS, name)) { + } else if (CAS_PARAS.equals(name)) { readHttpsParas(reader); - } else if (name.equals("AlphaFineConfigManager")) { + } else if ("AlphaFineConfigManager".equals(name)) { readAlphaFineAttr(reader); - } else if (name.equals("RecentColors")) { + } else if ("RecentColors".equals(name)) { readRecentColor(reader); + } else if ("OpenDebug".equals(name)) { + readOpenDebug(reader); } else { readLayout(reader, name); } @@ -1683,6 +1702,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } } + private void writeOpenDebug(XMLPrintWriter writer) { + if (this.openDebug) { + writer.startTAG("OpenDebug"); + writer.textNode(String.valueOf(openDebug)); + writer.end(); + } + } + //写入uuid private void writeUUID(XMLPrintWriter writer) { diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 9e4b7c2c0..4edf71c3b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -18,6 +18,7 @@ import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -131,6 +132,7 @@ public class PreferencePane extends BasicPane { private UITextField jdkHomeTextField; private UICheckBox oracleSpace; private UISpinner cachingTemplateSpinner; + private UICheckBox openDebugComboBox; private UICheckBox joinProductImprove; public PreferencePane() { @@ -171,6 +173,12 @@ public class PreferencePane extends BasicPane { oracleSpace = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); oraclePane.add(oracleSpace); + JPanel debuggerPane = FRGUIPaneFactory.createTitledBorderPane(Toolkit.i18nText("Fine-Design_Basic_Develop_Tools")); + openDebugComboBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); + debuggerPane.add(openDebugComboBox, BorderLayout.CENTER); + advancePane.add(debuggerPane); + + JPanel improvePane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Product_Improve")); joinProductImprove = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Join_Product_Improve")); improvePane.add(joinProductImprove); @@ -550,6 +558,8 @@ public class PreferencePane extends BasicPane { this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort())); + openDebugComboBox.setSelected(designerEnvManager.isOpenDebug()); + this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace()); this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit()); this.joinProductImprove.setSelected(designerEnvManager.isJoinProductImprove()); @@ -609,6 +619,8 @@ public class PreferencePane extends BasicPane { designerEnvManager.setJettyServerPort(portEditor.getValue().intValue()); + designerEnvManager.setOpenDebug(openDebugComboBox.isSelected()); + designerEnvManager.setOracleSystemSpace(this.oracleSpace.isSelected()); designerEnvManager.setCachingTemplateLimit((int) this.cachingTemplateSpinner.getValue()); designerEnvManager.setJoinProductImprove(this.joinProductImprove.isSelected()); diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUI.java b/designer-base/src/main/java/com/fr/design/ui/ModernUI.java new file mode 100644 index 000000000..ab829f4e9 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUI.java @@ -0,0 +1,18 @@ +package com.fr.design.ui; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-03-05 + */ +class ModernUI { + + static final String SCRIPT_STRING = "var arr = \"%s\".split(\".\").reverse();\n" + + "var create = function(obj, names) {\n" + + "var name = names.pop();\n" + + "if (!name) {return;}\n" + + "if (!obj[name]) {obj[name] = {};}\n" + + " create(obj[name], names);\n" + + "}\n" + + "create(window, arr);"; +} diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java new file mode 100644 index 000000000..4df38d111 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java @@ -0,0 +1,119 @@ +package com.fr.design.ui; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.dialog.BasicPane; +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.BrowserPreferences; +import com.teamdev.jxbrowser.chromium.JSValue; +import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; +import com.teamdev.jxbrowser.chromium.events.LoadAdapter; +import com.teamdev.jxbrowser.chromium.swing.BrowserView; + +import javax.swing.*; +import java.awt.*; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-03-04 + * 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest + */ +public class ModernUIPane extends BasicPane { + + private Browser browser; + private String namespace = "NS"; + private String variable = "data"; + private String expression = "update()"; + + private ModernUIPane() { + initialize(); + } + + private void initialize() { + if (browser == null) { + setLayout(new BorderLayout()); + BrowserPreferences.setChromiumSwitches("--disable-google-traffic"); + if (DesignerEnvManager.getEnvManager().isOpenDebug()) { + JSplitPane splitPane = new JSplitPane(); + add(splitPane, BorderLayout.CENTER); + splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT); + splitPane.setDividerLocation(500); + BrowserPreferences.setChromiumSwitches("--remote-debugging-port=9222"); + initializeBrowser(); + splitPane.setLeftComponent(new BrowserView(browser)); + Browser debugger = new Browser(); + debugger.loadURL(browser.getRemoteDebuggingURL()); + BrowserView debuggerView = new BrowserView(debugger); + splitPane.setRightComponent(debuggerView); + } else { + initializeBrowser(); + add(new BrowserView(browser), BorderLayout.CENTER); + } + } + } + + private void initializeBrowser() { + browser = new Browser(); + } + + @Override + protected String title4PopupWindow() { + return "Modern"; + } + + + public void populate(final T t) { + browser.addLoadListener(new LoadAdapter() { + @Override + public void onFinishLoadingFrame(FinishLoadingEvent event) { + if (event.isMainFrame()) { + event.getBrowser().executeJavaScript(String.format(ModernUI.SCRIPT_STRING, namespace)); + JSValue ns = event.getBrowser().executeJavaScriptAndReturnValue("window." + namespace); + ns.asObject().setProperty(variable, t); + } + } + }); + } + + public T update() { + JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression); + if (jsValue.isObject()) { + return (T)jsValue.asJavaObject(); + } + return null; + } + + public static class Builder { + + private ModernUIPane pane = new ModernUIPane<>(); + + public Builder withURL(String url) { + pane.browser.loadURL(url); + return this; + } + + public Builder withHTML(String html) { + pane.browser.loadHTML(html); + return this; + } + + public Builder namespace(String namespace) { + pane.namespace = namespace; + return this; + } + + public Builder variable(String name) { + pane.variable = name; + return this; + } + + public Builder expression(String expression) { + pane.expression = expression; + return this; + } + + public ModernUIPane build() { + return pane; + } + } +} diff --git a/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java b/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java new file mode 100644 index 000000000..c0472a8e8 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java @@ -0,0 +1,76 @@ +package com.fr.design.ui; + +import com.fr.design.DesignerEnvManager; +import com.fr.general.IOUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * @author richie + * @version 10.0 + * Created by richie on 2019-03-05 + */ +public class ModernUIPaneTest { + + public static void main(String... args) { + JFrame frame = new JFrame(); + frame.setSize(1200, 800); + JPanel contentPane = (JPanel) frame.getContentPane(); + // 是否需要开启调试窗口 + DesignerEnvManager.getEnvManager().setOpenDebug(true); + final ModernUIPane pane = new ModernUIPane.Builder() + .withHTML(IOUtils.readResourceAsString("/com/fr/design/ui/demo.html")).namespace("MyNS").build(); + contentPane.add(pane, BorderLayout.CENTER); + + Model model = new Model(); + model.setAge(20); + model.setName("Pick"); + pane.populate(model); + + JPanel panel = new JPanel(new FlowLayout()); + contentPane.add(panel, BorderLayout.SOUTH); + JButton button = new JButton("点击我可以看到JAVA控制台输出的新值:99"); + panel.add(button); + button.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Model returnValue = pane.update(); + if (returnValue != null) { + System.out.println(returnValue.getAge()); + } + } + }); + frame.setVisible(true); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + } + + public static class Model { + private String name; + private int age; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public void print(String message) { + System.out.println(message); + } + + } + +} \ No newline at end of file diff --git a/designer-base/src/test/resources/com/fr/design/ui/demo.html b/designer-base/src/test/resources/com/fr/design/ui/demo.html new file mode 100644 index 000000000..10fbdc3ca --- /dev/null +++ b/designer-base/src/test/resources/com/fr/design/ui/demo.html @@ -0,0 +1,17 @@ + + + + + Title + + + +
测试页面,请点击最下面的按钮
+ + \ No newline at end of file From 227b967edeb82699ca8858ef3c1df2521d3e6fc5 Mon Sep 17 00:00:00 2001 From: richie Date: Wed, 6 Mar 2019 10:06:23 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/ui/ModernUIPane.java | 12 ++++++++++-- .../test/java/com/fr/design/ui/ModernUIPaneTest.java | 8 ++++---- .../src/test/resources/com/fr/design/ui/demo.html | 10 ++++++---- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java index 4df38d111..ac5e4922d 100644 --- a/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java @@ -7,6 +7,8 @@ import com.teamdev.jxbrowser.chromium.BrowserPreferences; import com.teamdev.jxbrowser.chromium.JSValue; import com.teamdev.jxbrowser.chromium.events.FinishLoadingEvent; import com.teamdev.jxbrowser.chromium.events.LoadAdapter; +import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; +import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; import com.teamdev.jxbrowser.chromium.swing.BrowserView; import javax.swing.*; @@ -21,7 +23,7 @@ import java.awt.*; public class ModernUIPane extends BasicPane { private Browser browser; - private String namespace = "NS"; + private String namespace = "Pool"; private String variable = "data"; private String expression = "update()"; @@ -54,6 +56,13 @@ public class ModernUIPane extends BasicPane { private void initializeBrowser() { browser = new Browser(); + // 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的 + browser.addScriptContextListener(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + event.getBrowser().executeJavaScript(String.format(ModernUI.SCRIPT_STRING, namespace)); + } + }); } @Override @@ -67,7 +76,6 @@ public class ModernUIPane extends BasicPane { @Override public void onFinishLoadingFrame(FinishLoadingEvent event) { if (event.isMainFrame()) { - event.getBrowser().executeJavaScript(String.format(ModernUI.SCRIPT_STRING, namespace)); JSValue ns = event.getBrowser().executeJavaScriptAndReturnValue("window." + namespace); ns.asObject().setProperty(variable, t); } diff --git a/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java b/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java index c0472a8e8..1489cf226 100644 --- a/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java +++ b/designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java @@ -16,13 +16,13 @@ import java.awt.event.ActionListener; public class ModernUIPaneTest { public static void main(String... args) { - JFrame frame = new JFrame(); + final JFrame frame = new JFrame(); frame.setSize(1200, 800); JPanel contentPane = (JPanel) frame.getContentPane(); // 是否需要开启调试窗口 DesignerEnvManager.getEnvManager().setOpenDebug(true); final ModernUIPane pane = new ModernUIPane.Builder() - .withHTML(IOUtils.readResourceAsString("/com/fr/design/ui/demo.html")).namespace("MyNS").build(); + .withHTML(IOUtils.readResourceAsString("/com/fr/design/ui/demo.html")).namespace("Pool").build(); contentPane.add(pane, BorderLayout.CENTER); Model model = new Model(); @@ -32,14 +32,14 @@ public class ModernUIPaneTest { JPanel panel = new JPanel(new FlowLayout()); contentPane.add(panel, BorderLayout.SOUTH); - JButton button = new JButton("点击我可以看到JAVA控制台输出的新值:99"); + JButton button = new JButton("点击我可以看到Swing的弹框,输出填写的信息"); panel.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { Model returnValue = pane.update(); if (returnValue != null) { - System.out.println(returnValue.getAge()); + JOptionPane.showMessageDialog(frame, String.format("姓名为:%s,年龄为:%d", returnValue.getName(), returnValue.getAge())); } } }); diff --git a/designer-base/src/test/resources/com/fr/design/ui/demo.html b/designer-base/src/test/resources/com/fr/design/ui/demo.html index 10fbdc3ca..144c8661e 100644 --- a/designer-base/src/test/resources/com/fr/design/ui/demo.html +++ b/designer-base/src/test/resources/com/fr/design/ui/demo.html @@ -4,14 +4,16 @@ Title
测试页面,请点击最下面的按钮
+ + \ No newline at end of file