From 272ca3fd86daf5c13630b5129c66a055ed489649 Mon Sep 17 00:00:00 2001 From: vito Date: Wed, 14 Jun 2023 15:10:57 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-93559=20JxUIPane=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=94=AF=E6=8C=81Jxbrowser7=E6=9B=BF=E6=8D=A2ModernUIPane?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/help/FineUIAction.java | 21 +- .../fr/design/dcm/UniversalDatabasePane.java | 19 +- .../com/fr/design/dcm/UniversalDcmBridge.java | 22 +- .../fr/design/jxbrowser/BrowserExecutor.java | 40 ++ .../com/fr/design/jxbrowser/JxEngine.java | 125 +++++ .../com/fr/design/jxbrowser/JxUIPane.java | 456 ++++++++++++++++++ .../com/fr/design/jxbrowser/MimeType.java | 113 +++++ .../jxbrowser/NxInterceptRequestCallback.java | 171 +++++++ .../fr/design/jxbrowser/PropertyBuild.java | 20 + .../fr/design/login/DesignerLoginBridge.java | 54 +-- .../fr/design/login/DesignerLoginPane.java | 20 +- .../login/guide/DesignerGuideBridge.java | 68 +-- .../login/guide/DesignerGuideHelper.java | 3 + .../design/login/guide/DesignerGuidePane.java | 20 +- .../com/fr/design/ui/ModernUIConstants.java | 16 + .../java/com/fr/design/ui/ModernUIPane.java | 43 +- .../fr/design/ui/compatible/BuilderDiff.java | 26 - .../ui/compatible/ModernUIPaneFactory.java | 36 -- .../design/ui/compatible/NewModernUIPane.java | 362 -------------- .../NxComplexInterceptRequestCallback.java | 86 ---- .../NxInterceptRequestCallback.java | 148 ------ .../update/push/DesignerPushUpdateDialog.java | 42 +- .../update/push/DesignerUpdateInfo.java | 10 +- .../java/com/fr/design/upm/UpmBridge.java | 10 +- .../{NewUpmBridge.java => UpmBridgeV7.java} | 9 +- .../java/com/fr/design/upm/UpmFinder.java | 4 +- .../java/com/fr/design/upm/UpmShowPane.java | 30 +- .../com/fr/design/jxbrowser/JxUIPaneTest.java | 72 +++ .../com/fr/design/jxbrowser/MimeTypeTest.java | 21 + .../java/com/fr/design/ui/FineUIDemo.java | 3 +- .../ui/report/TemplateWebSettingDemo.java | 10 +- ...ChartBoxRichTextDetailedFieldListPane.java | 4 +- ...anChartBoxRichTextResultFieldListPane.java | 4 +- .../box/VanChartBoxTooltipContentPane.java | 6 +- .../component/VanChartTooltipContentPane.java | 6 +- .../richText/VanChartFieldListPane.java | 6 +- .../richText/VanChartRichEditorModel.java | 2 + .../richText/VanChartRichEditorPane.java | 85 ++-- .../richText/VanChartRichTextPane.java | 6 +- .../TooltipContentPaneWithOutSeries.java | 6 +- .../VanChartFieldListPaneWithOutSeries.java | 4 +- .../style/VanChartFunnelLabelContentPane.java | 6 +- .../VanChartFunnelRichTextFieldListPane.java | 4 +- .../VanChartFunnelTooltipContentPane.java | 6 +- .../VanChartGanttRichTextFieldListPane.java | 4 +- .../VanChartGanttTooltipContentPane.java | 6 +- .../VanChartMapRichTextFieldListPane.java | 4 +- .../label/VanChartMapLabelContentPane.java | 6 +- .../VanChartMapTooltipContentPane.java | 6 +- .../VanChartLineMapRichTextFieldListPane.java | 4 +- .../VanChartLineMapTooltipContentPane.java | 6 +- .../VanChartMultiPieLabelContentPane.java | 6 +- ...VanChartMultiPieRichTextFieldListPane.java | 4 +- .../VanChartMultiPieTooltipContentPane.java | 6 +- .../VanChartPieCategoryLabelContentPane.java | 6 +- ...ChartPieCategoryRichTextFieldListPane.java | 4 +- .../VanChartPieValueLabelContentPane.java | 6 +- ...VanChartPieValueRichTextFieldListPane.java | 4 +- .../VanChartScatterRichTextFieldListPane.java | 4 +- .../VanChartScatterTooltipContentPane.java | 6 +- ...anChartStructureRichTextFieldListPane.java | 4 +- .../VanChartStructureTooltipContentPane.java | 6 +- ...anChartWordCloudRichTextFieldListPane.java | 4 +- .../VanChartWordCloudTooltipContentPane.java | 6 +- .../com/fr/design/editor/rich_editor.html | 4 +- .../ui/online/mini/MiniComponentShopPane.java | 35 +- 66 files changed, 1364 insertions(+), 1002 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/BrowserExecutor.java create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/JxEngine.java create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java create mode 100644 designer-base/src/main/java/com/fr/design/jxbrowser/PropertyBuild.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/NewModernUIPane.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/NxComplexInterceptRequestCallback.java delete mode 100644 designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java rename designer-base/src/main/java/com/fr/design/upm/{NewUpmBridge.java => UpmBridgeV7.java} (98%) create mode 100644 designer-base/src/test/java/com/fr/design/jxbrowser/JxUIPaneTest.java create mode 100644 designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java diff --git a/designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java b/designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java index 0839c14767..4436154739 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java @@ -3,14 +3,15 @@ package com.fr.design.actions.help; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.ui.ModernUIPane; import com.fr.locale.InterProviderFactory; import com.fr.web.struct.AssembleComponent; import com.fr.web.struct.Atom; import com.fr.web.struct.browser.RequestClient; import com.fr.web.struct.category.ScriptPath; import com.fr.web.struct.impl.FineUI; +import com.teamdev.jxbrowser.js.JsAccessible; import java.awt.event.ActionEvent; @@ -27,14 +28,9 @@ public class FineUIAction extends UpdateAction { @Override public void actionPerformed(final ActionEvent e) { - ModernUIPane pane = new ModernUIPane.Builder<>() -// .prepare(new ScriptContextAdapter() { -// @Override -// public void onScriptContextCreated(ScriptContextEvent event) { -// JSValue pool = event.getBrowser().executeJavaScriptAndReturnValue("window.Pool"); -// pool.asObject().setProperty("i18n", new I18n()); -// } -// }) + JxUIPane pane = new JxUIPane.Builder<>() + .variable("i18n") + .property(new I18n()) .withComponent(new AssembleComponent() { @Override @@ -44,20 +40,21 @@ public class FineUIAction extends UpdateAction { @Override public Atom[] refer() { - return new Atom[] {FineUI.KEY}; + return new Atom[]{FineUI.KEY}; } }) .build(); - BasicDialog dialog = pane.showLargeWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + BasicDialog dialog = pane.showLargeWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @Override public void doOk() { // Do nothing } }); - dialog.setVisible(true); + dialog.setVisible(true); } + @JsAccessible public static class I18n { public String i18nText(String key) { diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java index e29a9f6698..84c5c2f7b3 100644 --- a/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDatabasePane.java @@ -1,12 +1,9 @@ package com.fr.design.dcm; import com.fr.design.dialog.BasicPane; -import com.fr.design.ui.ModernUIPane; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; +import com.fr.design.jxbrowser.JxUIPane; -import java.awt.*; +import java.awt.BorderLayout; /** * @author richie @@ -15,8 +12,6 @@ import java.awt.*; */ public class UniversalDatabasePane extends BasicPane { - private ModernUIPane modernUIPane; - @Override protected String title4PopupWindow() { return "Database"; @@ -24,15 +19,9 @@ public class UniversalDatabasePane extends BasicPane { public UniversalDatabasePane() { setLayout(new BorderLayout()); - modernUIPane = new ModernUIPane.Builder<>() + JxUIPane modernUIPane = new JxUIPane.Builder<>() .withComponent(UniversalDatabaseComponent.KEY) - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("DcmHelper", UniversalDcmBridge.getBridge(event.getBrowser())); - } - }) + .buildProperty("DcmHelper", UniversalDcmBridge::getBridge) .build(); add(modernUIPane, BorderLayout.CENTER); } diff --git a/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java b/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java index 577acada97..3d569ea2c9 100644 --- a/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java +++ b/designer-base/src/main/java/com/fr/design/dcm/UniversalDcmBridge.java @@ -2,8 +2,8 @@ package com.fr.design.dcm; import com.fr.decision.webservice.bean.BaseBean; import com.fr.design.bridge.exec.JSBridge; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.JSObject; +import com.teamdev.jxbrowser.js.JsAccessible; +import com.teamdev.jxbrowser.js.JsObject; /** * @author richie @@ -11,20 +11,28 @@ import com.teamdev.jxbrowser.chromium.JSObject; * Created by richie on 2019-05-17 * 桥接Java和JavaScript的类 */ +@JsAccessible public class UniversalDcmBridge { - public static UniversalDcmBridge getBridge(Browser browser) { - return new UniversalDcmBridge(browser); + /** + * 获取 js-java bridge + * + * @param window 全局环境 + * @return bridge + */ + public static UniversalDcmBridge getBridge(JsObject window) { + return new UniversalDcmBridge(window); } - private JSObject window; + private JsObject window; - private UniversalDcmBridge(Browser browser) { - this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); + private UniversalDcmBridge(JsObject window) { + this.window = window; } /** * 获取所有的数据连接 + * * @return 数据连接集合 */ @JSBridge diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/BrowserExecutor.java b/designer-base/src/main/java/com/fr/design/jxbrowser/BrowserExecutor.java new file mode 100644 index 0000000000..f21609ef6b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/BrowserExecutor.java @@ -0,0 +1,40 @@ +package com.fr.design.jxbrowser; + +import com.fr.design.bridge.exec.JSExecutor; +import com.teamdev.jxbrowser.js.JsFunction; +import com.teamdev.jxbrowser.js.JsObject; + +/** + * 用于 jxbrowser 执行后的回调执行器 + * 适配7.15之后 + * + * @author vito + * @since 11.0 + * Created on 2023/6/8 + */ +public class BrowserExecutor implements JSExecutor { + + /** + * 创建一个回调执行器 + * + * @param window js环境的window对象 + * @param callback 回调 + * @return 执行器 + */ + public static BrowserExecutor create(JsObject window, JsFunction callback) { + return new BrowserExecutor(window, callback); + } + + private final JsObject window; + private final JsFunction callback; + + private BrowserExecutor(JsObject window, JsFunction callback) { + this.window = window; + this.callback = callback; + } + + @Override + public void executor(String newValue) { + callback.invoke(window, newValue); + } +} diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxEngine.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxEngine.java new file mode 100644 index 0000000000..c207b660e5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxEngine.java @@ -0,0 +1,125 @@ +package com.fr.design.jxbrowser; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.ui.ModernUIConstants; +import com.fr.log.FineLoggerFactory; +import com.fr.value.ClearableLazyValue; +import com.fr.web.struct.AssembleComponent; +import com.teamdev.jxbrowser.engine.Engine; +import com.teamdev.jxbrowser.engine.EngineOptions; +import com.teamdev.jxbrowser.engine.RenderingMode; +import com.teamdev.jxbrowser.engine.event.EngineCrashed; +import com.teamdev.jxbrowser.net.Network; +import com.teamdev.jxbrowser.net.Scheme; +import com.teamdev.jxbrowser.net.callback.VerifyCertificateCallback; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.Map; + +/** + * 可重复启动的 Jxbrowser 引擎 + * 手动创建的引擎,应当自己负责管理声明周期 {@link #newInstance()} + * 单例的引擎,由系统管理生命周期,使用后仅需清理browser和map等数据 + * {@link #getEngine()} 和 {@link #getPublicEngineInstance()} + * + * @author vito + * @since 11.0 + * Created on 2023/6/8 + */ +public class JxEngine { + + private static final JxEngine INSTANCE = new JxEngine(); + + private AssembleComponent component; + private Map parameterMap = Collections.emptyMap(); + + + private final ClearableLazyValue ENGINE = ClearableLazyValue.create(() -> { + EngineOptions.Builder builder = EngineOptions + .newBuilder(RenderingMode.HARDWARE_ACCELERATED) + .addSwitch("--disable-google-traffic") + .addScheme(Scheme.of(ModernUIConstants.EMB_TAG), + new NxInterceptRequestCallback(this::getComponent, this::getParameterMap)); + Engine engine = Engine.newInstance(builder.build()); + engine.on(EngineCrashed.class, (event) -> { + FineLoggerFactory.getLogger().error("jxBrowser engine crashed with exitCode: {}", event.exitCode()); + event.engine().close(); + }); + if (DesignerEnvManager.getEnvManager().isOpenDebug()) { + // 调试模式下,禁止HTTPS证书验证,使得可以正常访问商城测试服务器等 + Network network = engine.network(); + network.set(VerifyCertificateCallback.class, params -> VerifyCertificateCallback.Response.valid()); + } + return engine; + }); + + public Map getParameterMap() { + return Collections.unmodifiableMap(parameterMap); + } + + public void setMap(Map parameterMap) { + if (parameterMap == null) { + return; + } + this.parameterMap = parameterMap; + } + + public void clearMap() { + this.parameterMap = Collections.emptyMap(); + } + + public AssembleComponent getComponent() { + return component; + } + + public void setComponent(AssembleComponent component) { + this.component = component; + } + + public void clearComponent() { + this.component = null; + } + + /** + * 获取单例引擎包装,能够更新渲染 + * 从单例获取的引擎不用负责关闭, + * 应用系统管理声明周期 + * + * @return jxbrowser 引擎包装类 + */ + public static JxEngine getInstance() { + return INSTANCE; + } + + @NotNull + public Engine getEngine() { + return ENGINE.getValue(); + } + + public void close() { + ENGINE.getValue().close(); + ENGINE.drop(); + } + + + /** + * 获取公共引擎,公共引擎使用后不用关闭引擎,但需要自己管理 browser。 + * 应用系统管理引擎生命周期 + * + * @return 引擎 + */ + public static Engine getPublicEngineInstance() { + return getInstance().ENGINE.getValue(); + } + + /** + * 创建一个新的引擎,创建引擎使用后需负责关闭引擎 + * 但可以独立使用 map 和 component + * + * @return 引擎 + */ + public static JxEngine newInstance() { + return new JxEngine(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java new file mode 100644 index 0000000000..68dbc9362c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/JxUIPane.java @@ -0,0 +1,456 @@ +package com.fr.design.jxbrowser; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.i18n.Toolkit; +import com.fr.design.ui.ModernUIConstants; +import com.fr.design.ui.ModernUIPane; +import com.fr.stable.StringUtils; +import com.fr.web.struct.AssembleComponent; +import com.teamdev.jxbrowser.browser.Browser; +import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; +import com.teamdev.jxbrowser.frame.Frame; +import com.teamdev.jxbrowser.js.JsObject; +import com.teamdev.jxbrowser.view.swing.BrowserView; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG; +import static com.fr.design.ui.ModernUIConstants.DEFAULT_EXPRESSION; +import static com.fr.design.ui.ModernUIConstants.DEFAULT_NAMESPACE; +import static com.fr.design.ui.ModernUIConstants.DEFAULT_VARIABLE; +import static com.fr.design.ui.ModernUIConstants.DOT; +import static com.fr.design.ui.ModernUIConstants.EMB_TAG; +import static com.fr.design.ui.ModernUIConstants.SCHEME_HEADER; +import static com.fr.design.ui.ModernUIConstants.WINDOW; + +/** + * 基于v7 jxbrowser 实现 + * 用于加载 html5 的Swing容器,可以在设计选项设置中打开调试窗口, + * 示例可查看:com.fr.design.ui.JxUIPaneTest + * + * @author vito + * @since 11.0 + * Created on 2023-06-12 + */ +public class JxUIPane extends ModernUIPane { + + private Browser browser; + private String namespace = "Pool"; + private String variable = "data"; + private String expression = "update()"; + + private JxUIPane() { + super(); + } + + private void initialize() { + setLayout(new BorderLayout()); + if (browser != null) { + return; + } + initDebugIfNeeded(); + // 使用公共引擎创建浏览器 + browser = JxEngine.getPublicEngineInstance().newBrowser(); + add(BrowserView.newInstance(browser), BorderLayout.CENTER); + } + + /** + * 按需初始化debug界面UI + */ + private void initDebugIfNeeded() { + if (DesignerEnvManager.getEnvManager().isOpenDebug()) { + UIToolbar toolbar = new UIToolbar(); + add(toolbar, BorderLayout.NORTH); + UIButton openDebugButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); + openDebugButton.addActionListener(e -> browser.devTools().show()); + toolbar.add(openDebugButton); + UIButton reloadButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Reload")); + reloadButton.addActionListener(e -> browser.navigation().reloadIgnoringCache()); + toolbar.add(reloadButton); + UIButton closeButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Close_Window")); + closeButton.addActionListener(e -> SwingUtilities.getWindowAncestor(JxUIPane.this).setVisible(false)); + toolbar.add(closeButton); + } + } + + /** + * 在初始化时进行注入JS的方法,只被build调用 + * + * @param injectJsCallback 回调 + */ + private void initInjectJs(InjectJsCallback injectJsCallback) { + browser.set(InjectJsCallback.class, params -> { + // 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的 + params.frame().executeJavaScript(String.format(ModernUIConstants.SCRIPT_INIT_NAME_SPACE, namespace)); + return injectJsCallback.on(params); + }); + } + + /** + * 设置 InjectJsCallback。 + * 这个方法解决重复InjectJsCallback被覆盖的问题。 + * 用于本类内部方法使用,如{@link #populate(Object)} + * + * @param injectJsCallback 回调 + */ + private void setInjectJsCallback(InjectJsCallback injectJsCallback) { + Optional callback = browser.get(InjectJsCallback.class); + if (callback.isPresent()) { + browser.set(InjectJsCallback.class, params -> { + callback.get().on(params); + return injectJsCallback.on(params); + }); + } else { + browser.set(InjectJsCallback.class, injectJsCallback); + } + } + + + /** + * 转向一个新的地址,相当于重新加载 + * + * @param url 新的地址 + */ + @Override + public void redirect(String url) { + browser.navigation().loadUrl(url); + } + + /** + * 转向一个新的地址,相当于重新加载 + * + * @param url 新的地址 + * @param map 初始化参数 + */ + @Override + public void redirect(String url, Map map) { + setMap(map); + browser.navigation().loadUrl(url); + } + + private void setMap(Map map) { + JxEngine.getInstance().setMap(map); + } + + private void setComponent(AssembleComponent component) { + JxEngine.getInstance().setComponent(component); + } + + @Override + protected String title4PopupWindow() { + return "ModernUI7"; + } + + + @Override + public void populate(final T t) { + setInjectJsCallback(params -> { + executeJsObject(params.frame(), WINDOW + DOT + namespace) + .ifPresent(ns -> ns.putProperty(variable, t)); + return InjectJsCallback.Response.proceed(); + }); + } + + @Override + @Nullable + public T update() { + if (browser.mainFrame().isPresent()) { + return browser.mainFrame().get().executeJavaScript("window." + namespace + "." + expression); + } + return null; + } + + /** + * 关闭浏览器 + */ + public void disposeBrowser() { + if (browser != null) { + browser.close(); + browser = null; + JxEngine.getInstance().clearMap(); + JxEngine.getInstance().clearComponent(); + } + + } + + /** + * 清理浏览器缓存 + */ + public void clearCache() { + if (browser != null) { + browser.engine().httpCache().clear(); + } + } + + /** + * 执行一段js + * + * @param javaScript 待执行的js脚本 + */ + public void executeJavaScript(String javaScript) { + if (browser != null) { + browser.mainFrame().ifPresent(frame -> { + frame.executeJavaScript(javaScript); + }); + } + } + + /** + * 获取js对象 + * 注意:类内部使用,用于简化编码,提供 Optional 包装 + * + * @param frame 页面frame对象 + * @param name 变量命名 + * @return js对象 + */ + private static Optional executeJsObject(Frame frame, String name) { + return Optional.ofNullable(frame.executeJavaScript(name)); + } + + /** + * JxUIPane 的建造者 + * + * @param 参数 + */ + public static class Builder { + private String namespace; + private String variable; + private String expression; + private InjectJsCallback callback; + private final Map propertyMap; + private final Map buildPropertyMap; + private Object variableProperty; + private Map parameterMap; + private AssembleComponent component; + private String url; + private String html; + + public Builder() { + this.namespace = DEFAULT_NAMESPACE; + this.variable = DEFAULT_VARIABLE; + this.expression = DEFAULT_EXPRESSION; + this.callback = null; + this.propertyMap = new HashMap<>(); + this.buildPropertyMap = new HashMap<>(); + this.variableProperty = null; + this.parameterMap = null; + this.component = null; + this.url = StringUtils.EMPTY; + this.html = StringUtils.EMPTY; + } + + /** + * 注入一个回调,回调的js会在初始化进行执行 + * + * @param callback 回调 + * @return builder + */ + public JxUIPane.Builder prepare(InjectJsCallback callback) { + this.callback = callback; + return this; + } + + /** + * 加载jar包中的资源 + * + * @param path 资源路径 + */ + public JxUIPane.Builder withEMB(final String path) { + this.url = EMB_TAG + SCHEME_HEADER + path; + return this; + } + + /** + * 加载jar包中的资源 + * + * @param path 资源路径 + */ + public JxUIPane.Builder withEMB(final String path, Map map) { + this.parameterMap = map; + this.url = EMB_TAG + SCHEME_HEADER + path; + return this; + } + + /** + * 加载url指向的资源 + * + * @param url 文件的地址 + */ + public JxUIPane.Builder withURL(final String url) { + this.url = url; + return this; + } + + /** + * 加载url指向的资源 + * + * @param url 文件的地址 + */ + public JxUIPane.Builder withURL(final String url, Map map) { + this.parameterMap = map; + this.url = url; + return this; + } + + /** + * 加载Atom组件 + * + * @param component Atom组件 + */ + public JxUIPane.Builder withComponent(AssembleComponent component) { + return withComponent(component, null); + } + + /** + * 加载Atom组件 + * + * @param component Atom组件 + */ + public JxUIPane.Builder withComponent(AssembleComponent component, Map map) { + this.parameterMap = map; + this.component = component; + this.url = COMPONENT_TAG; + return this; + } + + + /** + * 加载html文本内容 + * + * @param html 要加载html文本内容 + */ + public JxUIPane.Builder withHTML(String html) { + this.html = html; + return this; + } + + /** + * 设置该前端页面做数据交换所使用的对象 + * + * @param namespace 对象名 + */ + public JxUIPane.Builder namespace(String namespace) { + this.namespace = namespace; + return this; + } + + /** + * java端往js端传数据时使用的变量名字 + * 默认值为 data + * + * @param name 变量的名字 + */ + public JxUIPane.Builder variable(String name) { + this.variable = name; + return this; + } + + /** + * js端往java端传数据时执行的函数表达式 + * + * @param expression 函数表达式 + */ + public JxUIPane.Builder expression(String expression) { + this.expression = expression; + return this; + } + + /** + * 注入一个java对象到js中,绑定在全局变量 window的 + * property指定的变量。这个方法仅在在加载的网页上执 + * 行 JavaScript 之前注入 + * + * @param property 属性 + * @param obj java对象 + * @return 链式对象 + */ + public JxUIPane.Builder property(String property, @Nullable Object obj) { + this.propertyMap.put(property, obj); + return this; + } + + /** + * 注入一个java对象到js中,绑定在全局变量window的指定变量variable。 + * variable 可由 {@link #variable(String)} 设置,默认值为 data + * 这个方法仅在在加载的网页上执行 JavaScript 之前注入 + * + * @param obj java对象 + * @return 链式对象 + */ + public JxUIPane.Builder property(@NotNull Object obj) { + this.variableProperty = obj; + return this; + } + + /** + * 注入一个java对象到js中。绑定在全局变量 window的property指定的变量。 + * PropertyBuild用于动态生成绑定属性。个方法仅在在加载的网页上执行 + * JavaScript 之前注入 + * + * @param property 属性构建器 + * @param obj java对象 + * @return 链式对象 + */ + public JxUIPane.Builder buildProperty(String property, PropertyBuild obj) { + buildPropertyMap.put(property, obj); + return this; + } + + /** + * 构建 + */ + public JxUIPane build() { + JxUIPane pane = new JxUIPane<>(); + pane.namespace = namespace; + pane.variable = variable; + pane.expression = expression; + pane.setMap(parameterMap); + pane.setComponent(component); + pane.initialize(); + injectJs(pane); + if (StringUtils.isNotEmpty(this.url)) { + pane.browser.navigation().loadUrl(this.url); + } else if (StringUtils.isNotEmpty(this.html)) { + pane.browser.mainFrame().ifPresent(f -> f.loadHtml(html)); + } + return pane; + } + + /** + * 由于 InjectJsCallback 的回调机制,在初始化期间,只有 + * 在 InjectJsCallback 中 putProperty 才能生效。 + * 因此,嵌套回调分别做默认初始化、putProperty、外置初始化 + */ + private void injectJs(JxUIPane pane) { + pane.initInjectJs(params -> { + Frame frame = params.frame(); + if (!propertyMap.isEmpty()) { + propertyMap.forEach((key, value) -> + executeJsObject(frame, WINDOW) + .ifPresent(window -> window.putProperty(key, value))); + } + if (!buildPropertyMap.isEmpty()) { + buildPropertyMap.forEach((key, value) -> + executeJsObject(frame, WINDOW) + .ifPresent(window -> window.putProperty(key, value.build(window)))); + } + if (variableProperty != null) { + executeJsObject(frame, WINDOW + DOT + namespace) + .ifPresent(pool -> pool.putProperty(variable, variableProperty)); + } + if (callback != null) { + return callback.on(params); + } + return InjectJsCallback.Response.proceed(); + }); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java b/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java new file mode 100644 index 0000000000..583340ccf4 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/MimeType.java @@ -0,0 +1,113 @@ +package com.fr.design.jxbrowser; + +import com.fr.stable.StringUtils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Optional; + +/** + * jxbrowser 使用的一些媒体类型 + * + * @author vito + * @since 11.0 + * Created on 2023/6/13 + */ +public enum MimeType { + /** + * html 格式 + */ + HTML(".html", "text/html"), + /** + * CSS 格式 + */ + CSS(".css", "text/css"), + /** + * js 格式 + */ + JS(".js", "text/css"), + /** + * svg 格式 + */ + SVG(".svg", "text/javascript"), + /** + * png 格式 + */ + PNG(".png", "image/png"), + + /** + * jpg 格式 + */ + JPG(".jpg", "image/jpeg"), + + /** + * jpeg 格式 + */ + JPEG(".jpeg", "image/jpeg"), + + /** + * gif 格式 + */ + GIF(".gif", "image/gif"), + /** + * woff 字体格式 + */ + WOFF(".woff", "font/woff"), + /** + * ttf 字体格式 + */ + TTF(".ttf", "truetype"), + + /** + * MS 嵌入式开放字体 + */ + EOT(".eot", "embedded-opentype"); + + private final String suffix; + private final String mimeType; + + MimeType(String suffix, String mimeType) { + this.suffix = suffix; + this.mimeType = mimeType; + } + + public String parseMimeType() { + return mimeType; + } + + /** + * 获取指定路径对应的 mimetype,优先匹配常量中的类型 + * 如果没有,尝试使用 Files.probeContentType 检测 + * 如果没有,默认返回 text/html + * + * @param url url路径 + * @return MimeType + */ + public static String parseMimeType(String url) { + if (StringUtils.isBlank(url)) { + return HTML.mimeType; + } + String finalPath = url.split("\\?")[0]; + Optional mimeType = Arrays.stream(values()) + .filter(type -> finalPath.endsWith(type.suffix)) + .findFirst(); + if (mimeType.isPresent()) { + return mimeType.get().mimeType; + } else { + return getFileMimeType(finalPath); + } + } + + private static String getFileMimeType(String finalPath) { + Path file = new File(finalPath).toPath(); + try { + String s = Files.probeContentType(file); + return StringUtils.isEmpty(s) ? HTML.mimeType : s; + } catch (IOException e) { + return HTML.mimeType; + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java new file mode 100644 index 0000000000..014c52ff2d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/NxInterceptRequestCallback.java @@ -0,0 +1,171 @@ +package com.fr.design.jxbrowser; + +import com.fr.base.TemplateUtils; +import com.fr.design.ui.ModernRequestClient; +import com.fr.design.ui.ModernUIConstants; +import com.fr.general.IOUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.EncodeConstants; +import com.fr.stable.StringUtils; +import com.fr.web.struct.AssembleComponent; +import com.fr.web.struct.AtomBuilder; +import com.fr.web.struct.PathGroup; +import com.fr.web.struct.category.ScriptPath; +import com.fr.web.struct.category.StylePath; +import com.teamdev.jxbrowser.net.HttpHeader; +import com.teamdev.jxbrowser.net.HttpStatus; +import com.teamdev.jxbrowser.net.UrlRequest; +import com.teamdev.jxbrowser.net.UrlRequestJob; +import com.teamdev.jxbrowser.net.callback.InterceptUrlRequestCallback; +import org.jetbrains.annotations.NotNull; + +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +import static com.fr.design.ui.ModernUIConstants.COMPONENT_TAG; + +/** + * jxbrowser7 自定义 scheme 处理回调 + * + * @author vito + * @since 11.0 + * Created on 2023/6/8 + */ +public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { + + private Supplier component; + + private Supplier> renderParameterBuild; + + public NxInterceptRequestCallback(Supplier> renderParameterBuild) { + this.renderParameterBuild = renderParameterBuild; + } + + public NxInterceptRequestCallback(Supplier component, + Supplier> renderParameterBuild) { + this.component = component; + this.renderParameterBuild = renderParameterBuild; + } + + /** + * 主要包括 atom 和 emb协议的文件链接处理, + * 去掉file文件协议的支持,因此jxbrowser 7之后不支持覆盖内置协议,详细见 + * {@link com.teamdev.jxbrowser.net.internal.NonInterceptableScheme} + * + * @param params 参数 + * @return 响应 + */ + @Override + public Response on(Params params) { + UrlRequest urlRequest = params.urlRequest(); + String path = urlRequest.url(); + Optional urlRequestJobOptional; + if (path.startsWith(COMPONENT_TAG)) { + String text = htmlText(renderParameterBuild.get()); + urlRequestJobOptional = generateBasicUrlRequestJob(params, + "text/html", text.getBytes(StandardCharsets.UTF_8)); + } else { + urlRequestJobOptional = generateFileProtocolUrlRequestJob(params, path); + } + return urlRequestJobOptional + .map(Response::intercept) + .orElseGet(Response::proceed); + } + + protected Optional generateFileProtocolUrlRequestJob(Params params, String path) { + try { + InputStream inputStream = getResourceStream(path); + String mimeType = MimeType.parseMimeType(path); + byte[] bytes; + if (isHtml(mimeType)) { + String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); + text = TemplateUtils.renderParameter4Tpl(text, renderParameterBuild.get()); + bytes = text.getBytes(StandardCharsets.UTF_8); + } else { + bytes = IOUtils.inputStream2Bytes(inputStream); + } + return generateBasicUrlRequestJob(params, mimeType, bytes); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return Optional.empty(); + } + + /** + * 获取资源文件流 + * + * @param path 文件路径 + * @return 输入流 + * @throws Exception IO异常 + */ + private InputStream getResourceStream(String path) throws Exception { + int index = path.indexOf("="); + if (index > 0) { + path = path.substring(index + 1); + } else { + // jxbrowser 7之后,协议会自动补齐双斜杠// + path = path.split(":/")[1]; + } + return IOUtils.readResource(path); + } + + private boolean isHtml(String mimeType) { + return MimeType.HTML.parseMimeType().equals(mimeType); + } + + private Optional generateBasicUrlRequestJob(Params params, String mimeType, byte[] bytes) { + if (StringUtils.isEmpty(mimeType)) { + return Optional.empty(); + } + UrlRequestJob.Options options = UrlRequestJob.Options + .newBuilder(HttpStatus.OK) + .addHttpHeader(HttpHeader.of("Content-Type", mimeType)) + .build(); + UrlRequestJob urlRequestJob = params.newUrlRequestJob(options); + urlRequestJob.write(bytes); + urlRequestJob.complete(); + return Optional.of(urlRequestJob); + } + + private String htmlText(Map map) { + return component.get() == null ? + StringUtils.EMPTY : + parseComponent(component.get(), map); + } + + @NotNull + private static String parseComponent(AssembleComponent component, Map map) { + PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); + StylePath[] stylePaths = pathGroup.toStylePathGroup(); + StringBuilder styleText = new StringBuilder(); + for (StylePath path : stylePaths) { + if (StringUtils.isNotBlank(path.toFilePath())) { + styleText.append(""); + } + } + String result = ModernUIConstants.HTML_TPL.replaceAll("##style##", styleText.toString()); + ScriptPath[] scriptPaths = pathGroup.toScriptPathGroup(); + StringBuilder scriptText = new StringBuilder(); + for (ScriptPath path : scriptPaths) { + if (StringUtils.isNotBlank(path.toFilePath())) { + scriptText.append(""); + } + } + result = result.replaceAll("##script##", scriptText.toString()); + if (map != null) { + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + result = result.replaceAll("\\$\\{" + key + "}", value); + } + } + return result; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/jxbrowser/PropertyBuild.java b/designer-base/src/main/java/com/fr/design/jxbrowser/PropertyBuild.java new file mode 100644 index 0000000000..ca82ca2475 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jxbrowser/PropertyBuild.java @@ -0,0 +1,20 @@ +package com.fr.design.jxbrowser; + +import com.teamdev.jxbrowser.js.JsObject; + +/** + * 属性构建器 + * + * @author vito + * @since 11.0 + * Created on 2023/6/8 + */ +public interface PropertyBuild { + /** + * 构建属性 + * + * @param window js环境的window对象 + * @return 待注入java对象 + */ + Object build(JsObject window); +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java index 4789cc4f9b..1b196bedd1 100644 --- a/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java +++ b/designer-base/src/main/java/com/fr/design/login/DesignerLoginBridge.java @@ -7,9 +7,9 @@ import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.LocaleLinkProvider; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.BrowserExecutor; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.locale.impl.BbsResetMark; -import com.fr.design.login.executor.DesignerLoginBrowserExecutor; import com.fr.design.login.executor.DesignerLoginExecutor; import com.fr.design.login.executor.DesignerSendCaptchaExecutor; import com.fr.design.login.executor.DesignerSmsLoginExecutor; @@ -21,25 +21,26 @@ import com.fr.general.CloudCenter; import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.LocaleMark; import com.fr.log.FineLoggerFactory; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.JSFunction; -import com.teamdev.jxbrowser.chromium.JSObject; +import com.teamdev.jxbrowser.js.JsAccessible; +import com.teamdev.jxbrowser.js.JsFunction; +import com.teamdev.jxbrowser.js.JsObject; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.awt.Desktop; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.net.URI; import java.util.Map; import java.util.Set; /** + * 设计器登录通行证js-java桥 + * * @author Lanlan * @version 10.0 * Created by Lanlan on 2021/5/21 */ +@JsAccessible public class DesignerLoginBridge { /** @@ -52,20 +53,20 @@ public class DesignerLoginBridge { */ private static final String PROPS_LINK_KEY_DEFAULT = "Fine-Design-CloudCenter_Market_Template_Default"; - private Map params; + private final Map params; - public static DesignerLoginBridge getBridge(Browser browser, Map params) { - return new DesignerLoginBridge(browser, params); + public static DesignerLoginBridge getBridge(JsObject window, Map params) { + return new DesignerLoginBridge(window, params); } - private JSObject window; + private final JsObject window; - private DesignerLoginBridge(Browser browser, Map params) { + private DesignerLoginBridge(JsObject window, Map params) { this.params = params; - this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); + this.window = window; Set> entries = params.entrySet(); for (Map.Entry entry : entries) { - this.window.setProperty(entry.getKey(), entry.getValue()); + this.window.putProperty(entry.getKey(), entry.getValue()); } } @@ -183,9 +184,9 @@ public class DesignerLoginBridge { * @param callback 回调函数 */ @JSBridge - public void normalLogin(String username, String password, final JSFunction callback) { + public void normalLogin(String username, String password, final JsFunction callback) { DesignerLoginTaskWorker worker = new DesignerLoginTaskWorker<>( - new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), + new JSCallback(BrowserExecutor.create(window, callback)), new DesignerLoginExecutor(username, password)); worker.execute(); } @@ -198,9 +199,9 @@ public class DesignerLoginBridge { * @param callback 回调函数 */ @JSBridge - public void sendCaptcha(String regionCode, String phone, final JSFunction callback) { + public void sendCaptcha(String regionCode, String phone, final JsFunction callback) { DesignerLoginTaskWorker worker = new DesignerLoginTaskWorker<>( - new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), + new JSCallback(BrowserExecutor.create(window, callback)), new DesignerSendCaptchaExecutor(regionCode, phone)); worker.execute(); } @@ -214,9 +215,9 @@ public class DesignerLoginBridge { * @param callback 回调函数 */ @JSBridge - public void smsLogin(String regionCode, String phone, String code, final JSFunction callback) { + public void smsLogin(String regionCode, String phone, String code, final JsFunction callback) { DesignerLoginTaskWorker worker = new DesignerLoginTaskWorker<>( - new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), + new JSCallback(BrowserExecutor.create(window, callback)), new DesignerSmsLoginExecutor(regionCode, phone, code)); worker.execute(); } @@ -231,9 +232,9 @@ public class DesignerLoginBridge { * @param callback 回调函数 */ @JSBridge - public void smsRegister(String regionCode, String phone, String password, String regToken, final JSFunction callback) { + public void smsRegister(String regionCode, String phone, String password, String regToken, final JsFunction callback) { DesignerLoginTaskWorker worker = new DesignerLoginTaskWorker<>( - new JSCallback(DesignerLoginBrowserExecutor.create(window, callback)), + new JSCallback(BrowserExecutor.create(window, callback)), new DesignerSmsRegisterExecutor(regionCode, phone, password, regToken)); worker.execute(); } @@ -275,13 +276,10 @@ public class DesignerLoginBridge { private JPanel getHyperlinkPane(String title, String hyperlinkText, String hyperlink) { ActionLabel actionLabel = new ActionLabel(hyperlinkText); - actionLabel.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - try { - Desktop.getDesktop().browse(new URI(hyperlink)); - } catch (Exception ignore) { - } + actionLabel.addActionListener(e -> { + try { + Desktop.getDesktop().browse(new URI(hyperlink)); + } catch (Exception ignore) { } }); JPanel panel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); diff --git a/designer-base/src/main/java/com/fr/design/login/DesignerLoginPane.java b/designer-base/src/main/java/com/fr/design/login/DesignerLoginPane.java index be5df3a84d..830a0a1023 100644 --- a/designer-base/src/main/java/com/fr/design/login/DesignerLoginPane.java +++ b/designer-base/src/main/java/com/fr/design/login/DesignerLoginPane.java @@ -2,21 +2,23 @@ package com.fr.design.login; import com.fr.design.DesignerEnvManager; import com.fr.design.dialog.BasicPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.login.utils.DesignerLoginUtils; -import com.fr.design.ui.ModernUIPane; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; + import java.awt.BorderLayout; import java.util.Map; /** + * 设计器登录通行证面板 + * * @author Lanlan * @version 10.0 * Created by Lanlan on 2021/5/21 */ public class DesignerLoginPane extends BasicPane { + private static final String DESIGNER_LOGIN_HELPER = "DesignerLoginHelper"; + @Override protected String title4PopupWindow() { return "DESIGNER_LOGIN"; @@ -27,14 +29,8 @@ public class DesignerLoginPane extends BasicPane { params.put("lastLoginType", String.valueOf(DesignerEnvManager.getEnvManager().getLastLoginType().getType())); params.put("lastLoginAccount", DesignerEnvManager.getEnvManager().getLastLoginAccount()); setLayout(new BorderLayout()); - ModernUIPane modernUIPane = new ModernUIPane.Builder<>() - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("DesignerLoginHelper", DesignerLoginBridge.getBridge(event.getBrowser(), params)); - } - }) + JxUIPane modernUIPane = new JxUIPane.Builder<>() + .buildProperty(DESIGNER_LOGIN_HELPER, window -> DesignerLoginBridge.getBridge(window, params)) .withEMB(DesignerLoginHelper.getMainResourcePath(), DesignerLoginUtils.renderMap()) .build(); add(modernUIPane, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideBridge.java b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideBridge.java index 9b9c561e7c..e45323a0ed 100644 --- a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideBridge.java +++ b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideBridge.java @@ -6,26 +6,31 @@ import com.fr.design.dialog.FineJOptionPane; import com.fr.design.i18n.Toolkit; import com.fr.design.login.DesignerLoginHelper; import com.fr.design.login.DesignerLoginSource; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.JSObject; +import com.teamdev.jxbrowser.js.JsAccessible; + import javax.swing.JOptionPane; import javax.swing.SwingUtilities; /** + * 设计器登录指南面板的js-java桥 + * * @author Lanlan * @version 10.0 * Created by Lanlan on 2021/5/21 */ +@JsAccessible public class DesignerGuideBridge { - public static DesignerGuideBridge getBridge(Browser browser) { - return new DesignerGuideBridge(browser); + /** + * 获取 js-java bridge + * + * @return bridge + */ + public static DesignerGuideBridge getBridge() { + return new DesignerGuideBridge(); } - private JSObject window; - - private DesignerGuideBridge(Browser browser) { - this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); + private DesignerGuideBridge() { } @JSBridge @@ -40,31 +45,28 @@ public class DesignerGuideBridge { DesignerLoginHelper.showLoginDialog(DesignerLoginSource.GUIDE); checkDoNotRemind(doNotRemind); } else { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - String[] options = new String[]{ - com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Return_Login") - }; - int rv = FineJOptionPane.showConfirmDialog( - DesignerGuideHelper.getDialog(), - com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Login_Quit_Tip"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), - JOptionPane.YES_NO_OPTION, - JOptionPane.WARNING_MESSAGE, - null, - options, - options[1] - ); - if (rv == JOptionPane.YES_OPTION) { - DesignerGuideHelper.closeWindow(); - checkDoNotRemind(doNotRemind); - } else if (rv == JOptionPane.NO_OPTION) { - DesignerLoginHelper.showLoginDialog(DesignerLoginSource.GUIDE); - DesignerGuideHelper.closeWindow(); - checkDoNotRemind(doNotRemind); - } + SwingUtilities.invokeLater(() -> { + String[] options = new String[]{ + Toolkit.i18nText("Fine-Designer_Login_Quit"), + Toolkit.i18nText("Fine-Designer_Login_Return_Login") + }; + int rv = FineJOptionPane.showConfirmDialog( + DesignerGuideHelper.getDialog(), + Toolkit.i18nText("Fine-Designer_Login_Quit_Tip"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE, + null, + options, + options[1] + ); + if (rv == JOptionPane.YES_OPTION) { + DesignerGuideHelper.closeWindow(); + checkDoNotRemind(doNotRemind); + } else if (rv == JOptionPane.NO_OPTION) { + DesignerLoginHelper.showLoginDialog(DesignerLoginSource.GUIDE); + DesignerGuideHelper.closeWindow(); + checkDoNotRemind(doNotRemind); } }); } diff --git a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java index 3e4c0dae51..05956da7c3 100644 --- a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java +++ b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java @@ -10,9 +10,12 @@ import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.update.push.DesignerPushUpdateManager; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; + import javax.swing.WindowConstants; /** + * 设计器登录指南帮助类 + * * @author Lanlan * @version 10.0 * Created by Lanlan on 2021/5/21 diff --git a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuidePane.java b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuidePane.java index 64bd316ef5..9157b616a7 100644 --- a/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuidePane.java +++ b/designer-base/src/main/java/com/fr/design/login/guide/DesignerGuidePane.java @@ -1,20 +1,22 @@ package com.fr.design.login.guide; import com.fr.design.dialog.BasicPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.login.guide.utils.DesignerGuideUtils; -import com.fr.design.ui.ModernUIPane; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; + import java.awt.BorderLayout; /** + * 设计器登录帆软通行证的指南面板 + * * @author Lanlan * @version 10.0 * Created by Lanlan on 2021/5/21 */ public class DesignerGuidePane extends BasicPane { + private static final String DESIGNER_GUIDE_HELPER = "DesignerGuideHelper"; + @Override protected String title4PopupWindow() { return "DESIGNER_GUIDE"; @@ -22,14 +24,8 @@ public class DesignerGuidePane extends BasicPane { public DesignerGuidePane() { setLayout(new BorderLayout()); - ModernUIPane modernUIPane = new ModernUIPane.Builder<>() - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("DesignerGuideHelper", DesignerGuideBridge.getBridge(event.getBrowser())); - } - }) + JxUIPane modernUIPane = new JxUIPane.Builder<>() + .buildProperty(DESIGNER_GUIDE_HELPER, w -> DesignerGuideBridge.getBridge()) .withEMB(DesignerGuideHelper.getMainResourcePath(), DesignerGuideUtils.renderMap()) .build(); add(modernUIPane, BorderLayout.CENTER); diff --git a/designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java b/designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java index 8f7bf07034..9edd5bd57c 100644 --- a/designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java +++ b/designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java @@ -3,12 +3,28 @@ package com.fr.design.ui; import com.fr.general.IOUtils; /** + * 新式面板常量 + * * @author richie * @version 10.0 * Created by richie on 2019-03-05 */ public class ModernUIConstants { + public static final String WINDOW = "window"; + public static final String DOT = "."; + public static final String EMB_TAG = "emb"; + /** + * 从emb:dynamic 改为 emb://dynamic + * 7之后协议会自动在":"后加上斜杠,导致识别错误 + */ + public static final String COMPONENT_TAG = "emb://dynamic"; + + public static final String SCHEME_HEADER = "://"; + + public static final String DEFAULT_NAMESPACE = "Pool"; + public static final String DEFAULT_VARIABLE = "data"; + public static final String DEFAULT_EXPRESSION = "update()"; public static final String SCRIPT_INIT_NAME_SPACE = IOUtils.readResourceAsString("/com/fr/design/ui/InitNameSpace.js"); public static final String HTML_TPL = IOUtils.readResourceAsString("/com/fr/design/ui/tpl.html"); 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 5a0ead41e7..69c7a81ab3 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 @@ -5,10 +5,8 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.compatible.BuilderDiff; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.web.struct.AssembleComponent; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.BrowserType; import com.teamdev.jxbrowser.chromium.JSValue; @@ -17,7 +15,6 @@ import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; import com.teamdev.jxbrowser.chromium.swing.BrowserView; -import com.teamdev.jxbrowser.event.Observer; import javax.swing.JDialog; import javax.swing.SwingUtilities; @@ -34,7 +31,10 @@ import java.util.Map; * @version 10.0 * Created by richie on 2019-03-04 * 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest + * @see com.fr.design.jxbrowser.JxUIPane + * @deprecated 主要用于jxbrowser6,将在下个版本删除 */ +@Deprecated public class ModernUIPane extends BasicPane { private Browser browser; @@ -119,6 +119,7 @@ public class ModernUIPane extends BasicPane { /** * 转向一个新的地址,相当于重新加载 + * * @param url 新的地址 */ public void redirect(String url) { @@ -127,6 +128,7 @@ public class ModernUIPane extends BasicPane { /** * 转向一个新的地址,相当于重新加载 + * * @param url 新的地址 * @param map 初始化参数 */ @@ -161,7 +163,7 @@ public class ModernUIPane extends BasicPane { public void disposeBrowser() { - if(browser != null) { + if (browser != null) { browser.dispose(); browser = null; } @@ -191,7 +193,13 @@ public class ModernUIPane extends BasicPane { return null; } - public static class Builder implements BuilderDiff { + + /** + * ModernUIPane 建造者 + * + * @param + */ + public static class Builder { private ModernUIPane pane; @@ -219,6 +227,7 @@ public class ModernUIPane extends BasicPane { /** * 加载jar包中的资源 + * * @param path 资源路径 */ public Builder withEMB(final String path) { @@ -229,6 +238,7 @@ public class ModernUIPane extends BasicPane { /** * 加载jar包中的资源 + * * @param path 资源路径 */ public Builder withEMB(final String path, Map map) { @@ -239,6 +249,7 @@ public class ModernUIPane extends BasicPane { /** * 加载url指向的资源 + * * @param url 文件的地址 */ public Builder withURL(final String url) { @@ -249,6 +260,7 @@ public class ModernUIPane extends BasicPane { /** * 加载url指向的资源 + * * @param url 文件的地址 */ public Builder withURL(final String url, Map map) { @@ -259,6 +271,7 @@ public class ModernUIPane extends BasicPane { /** * 加载Atom组件 + * * @param component Atom组件 */ public Builder withComponent(AssembleComponent component) { @@ -269,6 +282,7 @@ public class ModernUIPane extends BasicPane { /** * 加载Atom组件 + * * @param component Atom组件 */ public Builder withComponent(AssembleComponent component, Map map) { @@ -277,9 +291,9 @@ public class ModernUIPane extends BasicPane { return this; } - /** * 加载html文本内容 + * * @param html 要加载html文本内容 */ public Builder withHTML(String html) { @@ -290,6 +304,7 @@ public class ModernUIPane extends BasicPane { /** * 设置该前端页面做数据交换所使用的对象 + * * @param namespace 对象名 */ public Builder namespace(String namespace) { @@ -299,6 +314,7 @@ public class ModernUIPane extends BasicPane { /** * java端往js端传数据时使用的变量名字 + * * @param name 变量的名字 */ public Builder variable(String name) { @@ -308,6 +324,7 @@ public class ModernUIPane extends BasicPane { /** * js端往java端传数据时执行的函数表达式 + * * @param expression 函数表达式 */ public Builder expression(String expression) { @@ -315,28 +332,14 @@ public class ModernUIPane extends BasicPane { return this; } - @Override public Builder prepareForV6(ScriptContextListener contextListener) { return prepare(contextListener); } - @Override public Builder prepareForV6(LoadListener loadListener) { return prepare(loadListener); } - @Override - public Builder prepareForV7(InjectJsCallback callback) { - // do nothing - return this; - } - - @Override - public Builder prepareForV7(Class event, Observer listener) { - // do nothing - return this; - } - public ModernUIPane build() { return pane; } diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java b/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java deleted file mode 100644 index 9e6168514f..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/BuilderDiff.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.ui.ModernUIPane; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.events.LoadListener; -import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; -import com.teamdev.jxbrowser.event.Observer; - -/** - * 封装jxbrwoser v6/v7的构建方式的差异 - * - * @author hades - * @version 10.0 - * Created by hades on 2021/6/13 - */ -public interface BuilderDiff { - - ModernUIPane.Builder prepareForV6(ScriptContextListener contextListener); - - ModernUIPane.Builder prepareForV6(LoadListener loadListener); - - ModernUIPane.Builder prepareForV7(InjectJsCallback callback); - - ModernUIPane.Builder prepareForV7(Class event, Observer listener); - -} diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java b/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java deleted file mode 100644 index 68b8950f7c..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/ModernUIPaneFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.ui.ModernUIPane; -import com.fr.stable.os.OperatingSystem; - -/** - * @author hades - * @version 10.0 - * Created by hades on 2021/6/13 - */ -public class ModernUIPaneFactory { - - public static ModernUIPane.Builder modernUIPaneBuilder() { - - if (isV7()) { - return new NewModernUIPane.Builder<>(); - } else { - return new ModernUIPane.Builder<>(); - } - - } - - public static boolean isV7() { - - // 7.15的class不存在时 走老版本 - boolean hasJxBrowserV7_15 = true; - try { - Class.forName("com.teamdev.jxbrowser.net.Scheme"); - } catch (ClassNotFoundException e) { - hasJxBrowserV7_15 = false; - } - - return OperatingSystem.isWindows() && hasJxBrowserV7_15; - - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/NewModernUIPane.java b/designer-base/src/main/java/com/fr/design/ui/compatible/NewModernUIPane.java deleted file mode 100644 index 59df782cde..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/NewModernUIPane.java +++ /dev/null @@ -1,362 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.DesignerEnvManager; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIConstants; -import com.fr.design.ui.ModernUIPane; -import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.web.struct.AssembleComponent; -import com.teamdev.jxbrowser.browser.Browser; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.events.LoadListener; -import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; -import com.teamdev.jxbrowser.engine.Engine; -import com.teamdev.jxbrowser.engine.EngineOptions; -import com.teamdev.jxbrowser.engine.RenderingMode; -import com.teamdev.jxbrowser.event.Observer; -import com.teamdev.jxbrowser.js.JsObject; -import com.teamdev.jxbrowser.net.Network; -import com.teamdev.jxbrowser.net.Scheme; -import com.teamdev.jxbrowser.net.callback.VerifyCertificateCallback; -import com.teamdev.jxbrowser.view.swing.BrowserView; -import org.jetbrains.annotations.Nullable; - - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.util.Map; - -import javax.swing.JDialog; -import javax.swing.SwingUtilities; -import javax.swing.WindowConstants; - -/** - * 基于v7 jxbrowser实现 - * - * @author richie - * @version 10.0 - * Created by richie on 2019-03-04 - * 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest - */ -public class NewModernUIPane extends ModernUIPane { - - private Browser browser; - private String namespace = "Pool"; - private String variable = "data"; - private String expression = "update()"; - private Scheme scheme; - private NxInterceptRequestCallback requestCallback; - - private NewModernUIPane() { - super(); - initialize(); - } - - private void initialize() { - setLayout(new BorderLayout()); - if (browser == null) { - if (DesignerEnvManager.getEnvManager().isOpenDebug()) { - UIToolbar toolbar = new UIToolbar(); - add(toolbar, BorderLayout.NORTH); - UIButton openDebugButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); - toolbar.add(openDebugButton); - UIButton reloadButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Reload")); - toolbar.add(reloadButton); - UIButton closeButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Close_Window")); - toolbar.add(closeButton); - - openDebugButton.addActionListener(e -> showDebuggerDialog()); - - reloadButton.addActionListener(e -> browser.navigation().reloadIgnoringCache()); - - closeButton.addActionListener(e -> SwingUtilities.getWindowAncestor( - NewModernUIPane.this).setVisible(false)); - initializeBrowser(); - add(BrowserView.newInstance(browser), BorderLayout.CENTER); - } else { - initializeBrowser(); - add(BrowserView.newInstance(browser), BorderLayout.CENTER); - } - } - } - - private void showDebuggerDialog() { - JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this)); - - Browser debugger = browser.engine().newBrowser(); - BrowserView debuggerView = BrowserView.newInstance(debugger); - dialog.add(debuggerView, BorderLayout.CENTER); - dialog.setSize(new Dimension(800, 400)); - GUICoreUtils.centerWindow(dialog); - dialog.setVisible(true); - dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - - browser.devTools().remoteDebuggingUrl().ifPresent(url -> { - debugger.navigation().loadUrl(url); - }); - } - - private void initializeBrowser() { - EngineOptions.Builder builder; - if (scheme != null && requestCallback != null) { - builder = EngineOptions.newBuilder(RenderingMode.HARDWARE_ACCELERATED).addSwitch("--disable-google-traffic").addScheme(scheme, requestCallback); - } else { - builder = EngineOptions.newBuilder(RenderingMode.HARDWARE_ACCELERATED).addSwitch("--disable-google-traffic"); - } - - if (DesignerEnvManager.getEnvManager().isOpenDebug()) { - builder.remoteDebuggingPort(9222); - } - - Engine engine = Engine.newInstance(builder.build()); - if (DesignerEnvManager.getEnvManager().isOpenDebug()) { - // 调试模式下,禁止HTTPS证书验证,使得可以正常访问商城测试服务器等 - Network network = engine.network(); - network.set(VerifyCertificateCallback.class, new VerifyCertificateCallback() { - @Nullable - @Override - public Response on(Params params) { - return VerifyCertificateCallback.Response.valid(); - } - }); - } - browser = engine.newBrowser(); - - // 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的 - browser.set(InjectJsCallback.class, params -> { - params.frame().executeJavaScript(String.format(ModernUIConstants.SCRIPT_INIT_NAME_SPACE, namespace)); - return InjectJsCallback.Response.proceed(); - }); - } - - /** - * 转向一个新的地址,相当于重新加载 - * - * @param url 新的地址 - */ - @Override - public void redirect(String url) { - browser.navigation().loadUrl(url); - } - - /** - * 转向一个新的地址,相当于重新加载 - * - * @param url 新的地址 - * @param map 初始化参数 - */ - @Override - public void redirect(String url, Map map) { - if (requestCallback != null) { - requestCallback.setMap(map); - } - browser.navigation().loadUrl(url); - } - - @Override - protected String title4PopupWindow() { - return "Modern"; - } - - @Override - public void populate(final T t) { - browser.set(InjectJsCallback.class, params -> { - JsObject ns = params.frame().executeJavaScript("window." + namespace); - if (ns != null) { - ns.putProperty(variable, t); - } - return InjectJsCallback.Response.proceed(); - }); - } - - @Override - public T update() { - if (browser.mainFrame().isPresent()) { - return browser.mainFrame().get().executeJavaScript("window." + namespace + "." + expression); - } - return null; - } - - public void disposeBrowser() { - - if (browser != null) { - browser.engine().close(); - browser = null; - } - - } - - public void clearCache() { - if (browser != null) { - browser.engine().httpCache().clear(); - } - } - - public void executeJavaScript(String javaScript) { - if (browser != null) { - browser.mainFrame().ifPresent(frame -> { - frame.executeJavaScript(javaScript); - }); - } - } - - public static class Builder extends ModernUIPane.Builder { - - private NewModernUIPane pane = new NewModernUIPane<>(); - - public Builder() { - super((ModernUIPane)null); - } - - public NewModernUIPane.Builder prepare(InjectJsCallback callback) { - pane.browser.set(InjectJsCallback.class, callback); - return this; - } - - /** - * 加载jar包中的资源 - * - * @param path 资源路径 - */ - @Override - public NewModernUIPane.Builder withEMB(final String path) { - pane.scheme = Scheme.of("emb"); - pane.requestCallback = new NxComplexInterceptRequestCallback(null); - pane.browser.navigation().loadUrl("emb:" + path); - return this; - } - - /** - * 加载url指向的资源 - * - * @param url 文件的地址 - */ - @Override - public NewModernUIPane.Builder withURL(final String url) { - pane.scheme = Scheme.of("file"); - pane.requestCallback = new NxComplexInterceptRequestCallback(null); - pane.browser.navigation().loadUrl(url); - return this; - } - - /** - * 加载url指向的资源 - * - * @param url 文件的地址 - */ - @Override - public NewModernUIPane.Builder withURL(final String url, Map map) { - pane.scheme = Scheme.of("file"); - pane.requestCallback = new NxInterceptRequestCallback(map); - pane.browser.navigation().loadUrl(url); - return this; - } - - /** - * 加载Atom组件 - * - * @param component Atom组件 - */ - @Override - public NewModernUIPane.Builder withComponent(AssembleComponent component) { - pane.scheme = Scheme.of("emb"); - pane.requestCallback = new NxComplexInterceptRequestCallback(component); - pane.browser.navigation().loadUrl("emb:dynamic"); - return this; - } - - /** - * 加载Atom组件 - * - * @param component Atom组件 - */ - @Override - public NewModernUIPane.Builder withComponent(AssembleComponent component, Map map) { - pane.scheme = Scheme.of("emb"); - pane.requestCallback = new NxComplexInterceptRequestCallback(component, map); - pane.browser.navigation().loadUrl("emb:dynamic"); - return this; - } - - - /** - * 加载html文本内容 - * - * @param html 要加载html文本内容 - */ - @Override - public NewModernUIPane.Builder withHTML(String html) { - pane.scheme = Scheme.of("html"); - pane.requestCallback = new NxInterceptRequestCallback(); - pane.browser.mainFrame().ifPresent(frame -> { - frame.loadHtml(html); - }); - return this; - } - - /** - * 设置该前端页面做数据交换所使用的对象 - * - * @param namespace 对象名 - */ - @Override - public NewModernUIPane.Builder namespace(String namespace) { - pane.namespace = namespace; - return this; - } - - /** - * java端往js端传数据时使用的变量名字 - * - * @param name 变量的名字 - */ - @Override - public NewModernUIPane.Builder variable(String name) { - pane.variable = name; - return this; - } - - /** - * js端往java端传数据时执行的函数表达式 - * - * @param expression 函数表达式 - */ - @Override - public NewModernUIPane.Builder expression(String expression) { - pane.expression = expression; - return this; - } - - @Override - public NewModernUIPane.Builder prepareForV6(ScriptContextListener contextListener) { - // do nothing - return this; - } - - @Override - public NewModernUIPane.Builder prepareForV6(LoadListener loadListener) { - // do nothing - return this; - } - - @Override - public NewModernUIPane.Builder prepareForV7(InjectJsCallback callback) { - return prepare(callback); - } - - @Override - public ModernUIPane.Builder prepareForV7(Class event, Observer listener) { - - pane.browser.navigation().on(event, listener); - - return this; - } - - @Override - public NewModernUIPane build() { - return pane; - } - } -} diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/NxComplexInterceptRequestCallback.java b/designer-base/src/main/java/com/fr/design/ui/compatible/NxComplexInterceptRequestCallback.java deleted file mode 100644 index eb85495d40..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/NxComplexInterceptRequestCallback.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.design.ui.ModernRequestClient; -import com.fr.design.ui.ModernUIConstants; -import com.fr.general.IOUtils; -import com.fr.stable.StringUtils; -import com.fr.web.struct.AssembleComponent; -import com.fr.web.struct.AtomBuilder; -import com.fr.web.struct.PathGroup; -import com.fr.web.struct.category.ScriptPath; -import com.fr.web.struct.category.StylePath; - -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.Map; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2020/3/25 - */ -public class NxComplexInterceptRequestCallback extends NxInterceptRequestCallback { - - private AssembleComponent component; - - public NxComplexInterceptRequestCallback(AssembleComponent component) { - this.component = component; - } - - public NxComplexInterceptRequestCallback(AssembleComponent component, Map map) { - super(map); - this.component = component; - } - - @Override - protected Response next(Params params, String path) { - if (path.startsWith("emb:dynamic")) { - String text = htmlText(map); - return Response.intercept(generateBasicUrlRequestJob(params, "text/html", text.getBytes(StandardCharsets.UTF_8))); - } else { - int index = path.indexOf("="); - if (index > 0) { - path = path.substring(index + 1); - } else { - path = path.substring(4); - } - InputStream inputStream = IOUtils.readResource(path); - if (inputStream == null) { - return Response.proceed(); - } - return Response.intercept(generateBasicUrlRequestJob(params, getMimeType(path), IOUtils.inputStream2Bytes(inputStream))); - } - } - - private String htmlText(Map map) { - PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); - StylePath[] stylePaths = pathGroup.toStylePathGroup(); - StringBuilder styleText = new StringBuilder(); - for (StylePath path : stylePaths) { - if (StringUtils.isNotBlank(path.toFilePath())) { - styleText.append(""); - } - } - String result = ModernUIConstants.HTML_TPL.replaceAll("##style##", styleText.toString()); - ScriptPath[] scriptPaths = pathGroup.toScriptPathGroup(); - StringBuilder scriptText = new StringBuilder(); - for (ScriptPath path : scriptPaths) { - if (StringUtils.isNotBlank(path.toFilePath())) { - scriptText.append(""); - } - } - result = result.replaceAll("##script##", scriptText.toString()); - if (map != null) { - for (Map.Entry entry : map.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - result = result.replaceAll("\\$\\{" + key + "}", value); - } - } - return result; - } -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java b/designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java deleted file mode 100644 index 32a8f8b610..0000000000 --- a/designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.fr.design.ui.compatible; - -import com.fr.base.TemplateUtils; -import com.fr.general.IOUtils; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.ArrayUtils; -import com.fr.stable.EncodeConstants; -import com.fr.stable.StringUtils; -import com.fr.third.org.apache.commons.codec.net.URLCodec; -import com.teamdev.jxbrowser.net.HttpHeader; -import com.teamdev.jxbrowser.net.HttpStatus; -import com.teamdev.jxbrowser.net.UrlRequest; -import com.teamdev.jxbrowser.net.UrlRequestJob; - -import com.teamdev.jxbrowser.net.callback.InterceptUrlRequestCallback; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Map; -import java.util.Optional; - -/** - * @author richie - * @version 10.0 - * Created by richie on 2020/3/25 - */ -public class NxInterceptRequestCallback implements InterceptUrlRequestCallback { - - Map map; - - public NxInterceptRequestCallback() { - } - - public NxInterceptRequestCallback(Map map) { - this.map = map; - } - - @Override - public Response on(Params params) { - UrlRequest urlRequest = params.urlRequest(); - String path = urlRequest.url(); - if (path.startsWith("file:")) { - Optional optional = generateFileProtocolUrlRequestJob(params, path); - if (optional.isPresent()) { - return Response.intercept(optional.get()); - } - } else { - return next(params, path); - } - return Response.proceed(); - } - - Response next(Params params, String path) { - return Response.proceed(); - } - - private Optional generateFileProtocolUrlRequestJob(Params params, String path) { - try { - String url = new URLCodec().decode(path); - String filePath = TemplateUtils.renderParameter4Tpl(url, map); - File file = new File(URI.create(filePath).getPath()); - InputStream inputStream = IOUtils.readResource(file.getAbsolutePath()); - String mimeType = getMimeType(path); - byte[] bytes; - if (isPlainText(mimeType)) { - String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); - text = TemplateUtils.renderParameter4Tpl(text, map); - bytes = text.getBytes(StandardCharsets.UTF_8); - } else { - bytes = IOUtils.inputStream2Bytes(inputStream); - } - return Optional.of(generateBasicUrlRequestJob(params, mimeType, bytes)); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - return Optional.empty(); - } - - private boolean isPlainText(String mimeType) { - return ArrayUtils.contains(new String[]{"text/html", "text/javascript", "text/css"}, mimeType); - } - - UrlRequestJob generateBasicUrlRequestJob(Params params, String mimeType, byte[] bytes) { - UrlRequestJob.Options options = UrlRequestJob.Options - .newBuilder(HttpStatus.OK) - .addHttpHeader(HttpHeader.of("Content-Type", mimeType)) - .build(); - UrlRequestJob urlRequestJob = params.newUrlRequestJob(options); - urlRequestJob.write(bytes); - urlRequestJob.complete(); - return urlRequestJob; - } - - String getMimeType(String path) { - // 去除 xxx?xxx 后面部分 - int index = path.indexOf("?"); - if (index != -1) { - path = path.substring(0, path.indexOf("?")); - } - if (StringUtils.isBlank(path)) { - return "text/html"; - } - if (path.endsWith(".html")) { - return "text/html"; - } - if (path.endsWith(".css")) { - return "text/css"; - } - if (path.endsWith(".js")) { - return "text/javascript"; - } - if (path.endsWith(".svg")) { - return "image/svg+xml"; - } - if (path.endsWith(".png")) { - return "image/png"; - } - if (path.endsWith(".jpeg")) { - return "image/jpeg"; - } - if (path.endsWith(".gif")) { - return "image/gif"; - } - if (path.endsWith(".woff")) { - return "font/woff"; - } - if (path.endsWith(".ttf")) { - return "truetype"; - } - if (path.endsWith(".eot")) { - return "embedded-opentype"; - } - Path file = new File(path).toPath(); - try { - return Files.probeContentType(file); - } catch (IOException e) { - return "text/html"; - } - } - - public void setMap(Map map) { - this.map = map; - } -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java index e37877a4bb..1db0832c65 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateDialog.java @@ -1,7 +1,7 @@ package com.fr.design.update.push; import com.fr.design.dialog.UIDialog; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.intelli.record.FocusPoint; @@ -14,20 +14,24 @@ import com.fr.web.struct.browser.RequestClient; import com.fr.web.struct.category.ScriptPath; import com.fr.web.struct.category.StylePath; import com.fr.web.struct.impl.FineUI; +import com.teamdev.jxbrowser.js.JsAccessible; import javax.swing.JPanel; -import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Frame; /** - * Created by plough on 2019/4/10. + * 设计器推送更新对话框 + * + * @author plough + * @since 10.0 + * Created on 2019/4/10. */ -class DesignerPushUpdateDialog extends UIDialog { +public class DesignerPushUpdateDialog extends UIDialog { public static final Dimension DEFAULT = new Dimension(640, 360); - private ModernUIPane jsPane; + private JxUIPane jsPane; private DesignerPushUpdateDialog(Frame parent) { super(parent); @@ -35,23 +39,23 @@ class DesignerPushUpdateDialog extends UIDialog { initComponents(); } - static void createAndShow(final Frame parent, final DesignerUpdateInfo updateInfo) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - DesignerPushUpdateDialog dialog = new DesignerPushUpdateDialog(parent); - dialog.populate(updateInfo); - dialog.showDialog(); - } - }); - + /** + * 创建并展示窗口 + * + * @param parent 父窗体 + * @param updateInfo 要展示的更新数据 + */ + public static void createAndShow(final Frame parent, final DesignerUpdateInfo updateInfo) { + DesignerPushUpdateDialog dialog = new DesignerPushUpdateDialog(parent); + dialog.populate(updateInfo); + dialog.showDialog(); } private void initComponents() { JPanel contentPane = (JPanel) getContentPane(); contentPane.setLayout(new BorderLayout()); - jsPane = new ModernUIPane.Builder() + jsPane = new JxUIPane.Builder() .withComponent(new AssembleComponent() { @Override public ScriptPath script(RequestClient req) { @@ -67,7 +71,7 @@ class DesignerPushUpdateDialog extends UIDialog { public Atom[] refer() { return new Atom[]{FineUI.KEY}; } - }).namespace("Pool").build(); + }).build(); contentPane.add(jsPane); } @@ -101,6 +105,7 @@ class DesignerPushUpdateDialog extends UIDialog { setVisible(true); } + @JsAccessible public class Model { private String version; private String content; @@ -163,6 +168,7 @@ class DesignerPushUpdateDialog extends UIDialog { exit(); } + @JsAccessible public String i18nText(String key) { return com.fr.design.i18n.Toolkit.i18nText(key); } @@ -180,9 +186,11 @@ class DesignerPushUpdateDialog extends UIDialog { private enum OperateType { CLOSE_WINDOW(0), UPDATE(1), REMIND_NEXT_TIME(2), SKIP(3); private int index; + OperateType(int index) { this.index = index; } + private String toText() { return String.valueOf(this.index); } diff --git a/designer-base/src/main/java/com/fr/design/update/push/DesignerUpdateInfo.java b/designer-base/src/main/java/com/fr/design/update/push/DesignerUpdateInfo.java index 3f7c23cd30..47fbca1716 100644 --- a/designer-base/src/main/java/com/fr/design/update/push/DesignerUpdateInfo.java +++ b/designer-base/src/main/java/com/fr/design/update/push/DesignerUpdateInfo.java @@ -12,9 +12,13 @@ import com.fr.stable.StringUtils; import java.security.InvalidParameterException; /** - * Created by plough on 2019/4/8. + * 设计器更新信息bean + * + * @author plough + * @since 10.0 + * Created on 2019/4/8. */ -class DesignerUpdateInfo { +public class DesignerUpdateInfo { private static final String KEY_VERSION = "version"; private static final String KEY_CONTENT = "content"; private static final String KEY_BACKGROUND_URL = "background"; @@ -32,7 +36,7 @@ class DesignerUpdateInfo { private final String backgroundUrl; // 推送背景图片 url private final String moreInfoUrl; // 更多新特性 - DesignerUpdateInfo(String currentVersion, String latestVersion, String lastIgnoredVersion, JSONObject pushData) { + public DesignerUpdateInfo(String currentVersion, String latestVersion, String lastIgnoredVersion, JSONObject pushData) { this.currentVersion = currentVersion; this.latestVersion = latestVersion; this.latestFullVersion = initLatestFullVersion(); diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java index 01369116d7..4eb154e2d1 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridge.java @@ -41,11 +41,11 @@ import com.teamdev.jxbrowser.chromium.JSArray; import com.teamdev.jxbrowser.chromium.JSFunction; import com.teamdev.jxbrowser.chromium.JSObject; -import java.awt.Desktop; import javax.swing.JFileChooser; import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.Desktop; import java.io.File; import java.net.URI; import java.util.ArrayList; @@ -59,7 +59,9 @@ import java.util.concurrent.RunnableFuture; * @version 10.0 * Created by richie on 2019-04-12 * 桥接Java和JavaScript的类 + * @deprecated 用于jxbrowser6,下版本删除 */ +@Deprecated public class UpmBridge { public static UpmBridge getBridge(Browser browser) { @@ -78,6 +80,7 @@ public class UpmBridge { /** * 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) + * * @param callback 安装完成后的回调函数 */ @JSBridge @@ -96,6 +99,7 @@ public class UpmBridge { /** * 下载并安装插件管理中心的资源文件 + * * @param callback 安装完成后的回调函数 */ @JSBridge @@ -126,6 +130,7 @@ public class UpmBridge { /** * 获取upm的版本信息 + * * @return 版本信息 */ @JSBridge @@ -315,7 +320,7 @@ public class UpmBridge { @Override public String call() { FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( - FileChooserArgs.newBuilder(). + FileChooserArgs.newBuilder(). setFileSelectionMode(FileSelectionMode.FILE). setFilter(des, filter).build()); int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); @@ -468,6 +473,7 @@ public class UpmBridge { /** * 使用系统浏览器打开网页 + * * @param url 要打开的网页 */ @JSBridge diff --git a/designer-base/src/main/java/com/fr/design/upm/NewUpmBridge.java b/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java similarity index 98% rename from designer-base/src/main/java/com/fr/design/upm/NewUpmBridge.java rename to designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java index 6b9f1f85fc..a7714621b7 100644 --- a/designer-base/src/main/java/com/fr/design/upm/NewUpmBridge.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmBridgeV7.java @@ -45,15 +45,16 @@ import java.util.concurrent.RunnableFuture; * Created by richie on 2019-04-12 * 桥接Java和JavaScript的类 */ -public class NewUpmBridge extends UpmBridge { +@JsAccessible +public class UpmBridgeV7 extends UpmBridge { - public static NewUpmBridge getBridge(JsObject jsObject) { - return new NewUpmBridge(jsObject); + public static UpmBridgeV7 getBridge(JsObject jsObject) { + return new UpmBridgeV7(jsObject); } private JsObject jsObject; - private NewUpmBridge(JsObject jsObject) { + private UpmBridgeV7(JsObject jsObject) { this.jsObject = jsObject; } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 576c5a9b96..ede9b45d81 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -8,6 +8,7 @@ import com.fr.design.i18n.Toolkit; import com.fr.design.login.utils.DesignerLoginUtils; import com.fr.design.mainframe.DesignerContext; import com.fr.design.plugin.DesignerPluginContext; +import com.fr.design.ui.ModernUIConstants; import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; @@ -57,7 +58,8 @@ public class UpmFinder { } public static String getMainResourcePath() { - return "file:///" + StableUtils.pathJoin(installHome, MAIN_RESOURCE_PATH); + return ModernUIConstants.EMB_TAG + ModernUIConstants.SCHEME_HEADER + + StableUtils.pathJoin(installHome, MAIN_RESOURCE_PATH); } public static UIDialog getDialog() { diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java index 23a712508e..83de627c4e 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java @@ -1,19 +1,13 @@ package com.fr.design.upm; import com.fr.design.dialog.BasicPane; -import com.fr.design.ui.ModernUIPane; -import com.fr.design.ui.compatible.ModernUIPaneFactory; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.upm.event.DownloadEvent; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; -import com.teamdev.jxbrowser.js.JsObject; -import java.awt.*; +import java.awt.BorderLayout; /** * @author richie @@ -23,7 +17,9 @@ import java.awt.*; */ public class UpmShowPane extends BasicPane { - private ModernUIPane modernUIPane; + public static final String PLUGIN_HELPER = "PluginHelper"; + + private final JxUIPane jxUIPane; @Override protected String title4PopupWindow() { @@ -32,28 +28,22 @@ public class UpmShowPane extends BasicPane { UpmShowPane() { setLayout(new BorderLayout()); - modernUIPane = new ModernUIPane.Builder<>() - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); - } - }) + jxUIPane = new JxUIPane.Builder<>() + .buildProperty(PLUGIN_HELPER, UpmBridgeV7::getBridge) .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) .build(); EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { @Override public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + jxUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); } }); EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { @Override public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + jxUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); } }); - add(modernUIPane, BorderLayout.CENTER); + add(jxUIPane, BorderLayout.CENTER); } } diff --git a/designer-base/src/test/java/com/fr/design/jxbrowser/JxUIPaneTest.java b/designer-base/src/test/java/com/fr/design/jxbrowser/JxUIPaneTest.java new file mode 100644 index 0000000000..0b4bea61c5 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/jxbrowser/JxUIPaneTest.java @@ -0,0 +1,72 @@ +package com.fr.design.jxbrowser; + +import com.fr.design.DesignerEnvManager; +import com.teamdev.jxbrowser.js.JsAccessible; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.WindowConstants; +import java.awt.BorderLayout; +import java.awt.FlowLayout; + +public class JxUIPaneTest { + + public static void main(String... args) { + final JFrame frame = new JFrame(); + frame.setSize(1200, 800); + JPanel contentPane = (JPanel) frame.getContentPane(); + // 是否需要开启调试窗口 + DesignerEnvManager.getEnvManager().setOpenDebug(true); + final JxUIPane pane = new JxUIPane.Builder() + .withEMB("/com/fr/design/ui/demo.html").namespace("Pool").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("点击我可以看到Swing的弹框,输出填写的信息"); + panel.add(button); + button.addActionListener(e -> { + Model returnValue = pane.update(); + if (returnValue != null) { + JOptionPane.showMessageDialog(frame, String.format("姓名为:%s,年龄为:%d", returnValue.getName(), returnValue.getAge())); + } + }); + frame.setVisible(true); + frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + } + + @JsAccessible + 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/java/com/fr/design/jxbrowser/MimeTypeTest.java b/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java new file mode 100644 index 0000000000..6a5fcf7f42 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/jxbrowser/MimeTypeTest.java @@ -0,0 +1,21 @@ +package com.fr.design.jxbrowser; + +import org.junit.Assert; +import org.junit.Test; + +/** + * @author vito + * @since 11.0 + * Created on 2023/6/13 + */ +public class MimeTypeTest { + + @Test + public void getMimeType() { + Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.html")); + Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.html?a=ji")); + Assert.assertEquals("text/html", MimeType.parseMimeType("http://a.xml?a=ji")); + Assert.assertEquals("image/jpeg", MimeType.parseMimeType("http://a.jpg?a=ji")); + Assert.assertEquals("image/jpeg", MimeType.parseMimeType("http://a.jpeg?a=ji")); + } +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java b/designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java index c7dd4b6821..23ac04a05c 100644 --- a/designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java +++ b/designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java @@ -1,6 +1,7 @@ package com.fr.design.ui; import com.fr.design.DesignerEnvManager; +import com.fr.design.jxbrowser.JxUIPane; import javax.swing.*; import java.awt.*; @@ -19,7 +20,7 @@ public class FineUIDemo { // 是否需要开启调试窗口 DesignerEnvManager.getEnvManager().setOpenDebug(true); - final ModernUIPane pane = new ModernUIPane.Builder() + final JxUIPane pane = new JxUIPane.Builder() .withComponent(StartComponent.KEY).build(); contentPane.add(pane, BorderLayout.CENTER); frame.setVisible(true); diff --git a/designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java b/designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java index b267b1346a..d1067c4e79 100644 --- a/designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java +++ b/designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java @@ -1,11 +1,13 @@ package com.fr.design.ui.report; import com.fr.design.DesignerEnvManager; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.ui.ModernUIPaneTest; -import javax.swing.*; -import java.awt.*; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.WindowConstants; +import java.awt.BorderLayout; /** * Created by windy on 2019/3/26. @@ -19,7 +21,7 @@ public class TemplateWebSettingDemo { // 是否需要开启调试窗口 DesignerEnvManager.getEnvManager().setOpenDebug(true); - final ModernUIPane pane = new ModernUIPane.Builder() + final JxUIPane pane = new JxUIPane.Builder() .withComponent(TemplateWebSettingComponent.KEY).build(); contentPane.add(pane, BorderLayout.CENTER); frame.setVisible(true); diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextDetailedFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextDetailedFieldListPane.java index d780a44eb1..011551108f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextDetailedFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextDetailedFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.box; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipDataMaxFormat; @@ -33,7 +33,7 @@ public class VanChartBoxRichTextDetailedFieldListPane extends VanChartFieldListP private VanChartFieldButton richTextMin; private VanChartFieldButton richTextOutlier; - public VanChartBoxRichTextDetailedFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartBoxRichTextDetailedFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextResultFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextResultFieldListPane.java index 9816967ff0..cb62787c21 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextResultFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxRichTextResultFieldListPane.java @@ -1,6 +1,6 @@ package com.fr.van.chart.box; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.van.chart.designer.component.richText.VanChartFieldAttrPane; import com.fr.van.chart.designer.component.richText.VanChartFieldButton; import com.fr.van.chart.designer.component.richText.VanChartRichEditorModel; @@ -11,7 +11,7 @@ import java.util.List; public class VanChartBoxRichTextResultFieldListPane extends VanChartBoxRichTextDetailedFieldListPane { - public VanChartBoxRichTextResultFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartBoxRichTextResultFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java index 4e7a657d6b..1a76f548b1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java @@ -2,9 +2,9 @@ package com.fr.van.chart.box; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.ui.ModernUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipDataMaxFormat; @@ -103,11 +103,11 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { return commonPanel; } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { if (detailed) { return new VanChartBoxRichTextDetailedFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java index ab84b88b89..d89a7d31e5 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java @@ -7,11 +7,11 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; -import com.fr.design.ui.ModernUIPane; import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.AttrTooltipRichText; @@ -390,7 +390,7 @@ public class VanChartTooltipContentPane extends BasicBeanPane richEditorPane = VanChartRichEditorPane.createRichEditorPane(richText); + JxUIPane richEditorPane = VanChartRichEditorPane.createRichEditorPane(richText); VanChartRichTextPane richTextPane = this.createRichTextPane(richEditorPane); BasicDialog richTextDialog = new VanChartRichTextDialog(DesignerContext.getDesignerFrame(), richTextPane); @@ -431,7 +431,7 @@ public class VanChartTooltipContentPane extends BasicBeanPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartFieldListPane.java index 02a62de3b6..891bf9bdaa 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartFieldListPane.java @@ -4,7 +4,7 @@ import com.fr.data.util.function.AbstractDataFunction; import com.fr.data.util.function.DataFunction; import com.fr.design.event.UIObserverListener; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.base.AttrTooltipContent; @@ -43,14 +43,14 @@ public class VanChartFieldListPane extends JPanel { private VanChartFieldButton percentButton; private VanChartFieldAttrPane fieldAttrPane; - private ModernUIPane richEditorPane; + private JxUIPane richEditorPane; private List tableFieldNameList; private List tableFieldButtonList = new ArrayList<>(); private TableFieldCollection tableFieldCollection = new TableFieldCollection(); private VanChartFieldListener fieldListener; - public VanChartFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { List richEditorFieldNames = VanChartRichEditorPane.getFieldNames(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorModel.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorModel.java index 83df27c0fb..77abd347de 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorModel.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorModel.java @@ -2,7 +2,9 @@ package com.fr.van.chart.designer.component.richText; import com.fr.plugin.chart.type.TextAlign; import com.fr.stable.StringUtils; +import com.teamdev.jxbrowser.js.JsAccessible; +@JsAccessible public class VanChartRichEditorModel { private String content = StringUtils.EMPTY; diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java index d36ef487c7..de141f8638 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java @@ -11,7 +11,7 @@ import com.fr.data.impl.NameTableData; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; import com.fr.design.data.DesignTableDataManager; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.plugin.chart.base.AttrTooltipRichText; @@ -21,11 +21,9 @@ import com.fr.plugin.chart.type.TextAlign; import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.lang3.SystemUtils; import com.fr.van.chart.designer.PlotFactory; -import com.teamdev.jxbrowser.chromium.Browser; -import com.teamdev.jxbrowser.chromium.BrowserType; -import com.teamdev.jxbrowser.chromium.JSValue; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; +import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; +import com.teamdev.jxbrowser.frame.Frame; +import com.teamdev.jxbrowser.js.JsObject; import java.util.ArrayList; import java.util.Arrays; @@ -45,8 +43,8 @@ public class VanChartRichEditorPane { private static final String REFRESH = "refresh()"; private static final String ADD_FIELD = "addField()"; - private static ModernUIPane richEditorPane; - private static Browser browser; + private static JxUIPane richEditorPane; + private static Frame frame; private static List fieldNames; private static final boolean USE_LIGHT_WEIGHT = SystemUtils.IS_OS_WINDOWS_10; @@ -123,12 +121,12 @@ public class VanChartRichEditorPane { fieldNames.addAll(Arrays.asList(columnNames)); } - public static ModernUIPane createRichEditorPane(AttrTooltipRichText richEditor) { + public static JxUIPane createRichEditorPane(AttrTooltipRichText richEditor) { VanChartRichEditorModel model = getRichEditorModel(richEditor); return createRichEditorPane(model); } - public static ModernUIPane createRichEditorPane(VanChartRichEditorModel model) { + public static JxUIPane createRichEditorPane(VanChartRichEditorModel model) { if (richEditorPane == null) { richEditorPane = initPane(model); } else { @@ -139,50 +137,57 @@ public class VanChartRichEditorPane { } public static void richEditorRefresh(VanChartRichEditorModel model) { - if (richEditorPane != null && browser != null) { - refresh(browser, model); + if (richEditorPane != null && frame != null) { + refresh(frame, model); } } public static void richEditorAddField(VanChartRichEditorModel model) { - if (richEditorPane != null && browser != null) { - addField(browser, model); + if (richEditorPane != null && frame != null) { + addField(frame, model); } } - public static ModernUIPane initPane(VanChartRichEditorModel model) { - BrowserType type = USE_LIGHT_WEIGHT ? BrowserType.LIGHTWEIGHT : BrowserType.HEAVYWEIGHT; - return new ModernUIPane.Builder(type) - .prepare(new ScriptContextAdapter() { - public void onScriptContextCreated(ScriptContextEvent event) { - browser = event.getBrowser(); - browser.getCacheStorage().clearCache(); - - browser.executeJavaScript(IOUtils.readResourceAsString("/com/fr/web/ui/fineui.min.js")); - browser.executeJavaScript(IOUtils.readResourceAsString("/com/fr/design/editor/script/i18n.js")); - browser.executeJavaScript(generateTransformI18nJS()); - browser.executeJavaScript(IOUtils.readResourceAsString("/com/fr/web/ui/materials.min.js")); - - JSValue ns = browser.executeJavaScriptAndReturnValue("window." + NAME_SPACE); - ns.asObject().setProperty(VARIABLE, model); + /** + * 初始化富文本编辑器 + * + * @param model 模型 + * @return pane + */ + public static JxUIPane initPane(VanChartRichEditorModel model) { + return new JxUIPane.Builder() + .prepare(params -> { + frame = params.frame(); + frame.browser().engine().httpCache().clear(); + frame.executeJavaScript(IOUtils.readResourceAsString("/com/fr/web/ui/fineui.min.js")); + frame.executeJavaScript(IOUtils.readResourceAsString("/com/fr/design/editor/script/i18n.js")); + frame.executeJavaScript(generateTransformI18nJS()); + frame.executeJavaScript(IOUtils.readResourceAsString("/com/fr/web/ui/materials.min.js")); + + JsObject ns = frame.executeJavaScript("window." + NAME_SPACE); + if (ns != null) { + ns.putProperty(VARIABLE, model); } + return InjectJsCallback.Response.proceed(); }) .withEMB(RICH_EDITOR_HTML) .namespace(NAME_SPACE).build(); } - public static void refresh(Browser browser, VanChartRichEditorModel model) { - stateChange(browser, model, REFRESH); + private static void refresh(Frame frame, VanChartRichEditorModel model) { + stateChange(frame, model, REFRESH); } - public static void addField(Browser browser, VanChartRichEditorModel model) { - stateChange(browser, model, ADD_FIELD); + private static void addField(Frame frame, VanChartRichEditorModel model) { + stateChange(frame, model, ADD_FIELD); } - public static void stateChange(Browser browser, VanChartRichEditorModel model, String trigger) { - JSValue ns = browser.executeJavaScriptAndReturnValue("window." + NAME_SPACE); - ns.asObject().setProperty(VARIABLE, model); - browser.executeJavaScript("window." + NAME_SPACE + "." + trigger); + private static void stateChange(Frame frame, VanChartRichEditorModel model, String trigger) { + JsObject ns = frame.executeJavaScript("window." + NAME_SPACE); + if (ns != null) { + ns.putProperty(VARIABLE, model); + frame.executeJavaScript("window." + NAME_SPACE + "." + trigger); + } } public static VanChartRichEditorModel getRichEditorModel(AttrTooltipRichText richText) { @@ -231,9 +236,7 @@ public class VanChartRichEditorPane { } public static void checkDispose() { - if (USE_LIGHT_WEIGHT) { - browser.dispose(); - richEditorPane = null; - } + frame.browser().close(); + richEditorPane = null; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java index 8b3d063960..e4e4745d30 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java @@ -2,8 +2,8 @@ package com.fr.van.chart.designer.component.richText; import com.fr.design.beans.BasicBeanPane; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.ui.ModernUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.stable.StringUtils; @@ -25,7 +25,7 @@ public class VanChartRichTextPane extends BasicBeanPane { private VanChartFieldListPane fieldListPane; private VanChartFieldAttrPane fieldAttrPane; - public VanChartRichTextPane(ModernUIPane richEditor) { + public VanChartRichTextPane(JxUIPane richEditor) { fieldAttrPane = new VanChartFieldAttrPane(); fieldListPane = createFieldListPane(fieldAttrPane, richEditor); @@ -63,7 +63,7 @@ public class VanChartRichTextPane extends BasicBeanPane { return fieldPane; } - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java index 9c7ea0eb7a..6788063310 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java @@ -1,7 +1,7 @@ package com.fr.van.chart.designer.component.tooltip; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -63,11 +63,11 @@ public class TooltipContentPaneWithOutSeries extends VanChartTooltipContentPane }; } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartFieldListPaneWithOutSeries(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/VanChartFieldListPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/VanChartFieldListPaneWithOutSeries.java index 7e67886acb..39a4fb9168 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/VanChartFieldListPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/VanChartFieldListPaneWithOutSeries.java @@ -1,7 +1,7 @@ package com.fr.van.chart.designer.component.tooltip; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipTargetValueFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; @@ -20,7 +20,7 @@ public class VanChartFieldListPaneWithOutSeries extends VanChartFieldListPane { private VanChartFieldButton targetValueButton; - public VanChartFieldListPaneWithOutSeries(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartFieldListPaneWithOutSeries(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java index 55c3e3e78e..3bf8ac7a36 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; @@ -49,11 +49,11 @@ public class VanChartFunnelLabelContentPane extends VanChartLabelContentPane { setPercentFormatPane(new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartFunnelRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRichTextFieldListPane.java index c63f112a7c..8ce2521869 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -18,7 +18,7 @@ import java.util.List; public class VanChartFunnelRichTextFieldListPane extends VanChartFieldListPane { - public VanChartFunnelRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartFunnelRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java index e8c741b14c..d23d6ed0d0 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; @@ -48,11 +48,11 @@ public class VanChartFunnelTooltipContentPane extends VanChartTooltipContentPane setPercentFormatPane(new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartFunnelRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttRichTextFieldListPane.java index 6332c6757a..520250cfd3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.gantt.designer.style.tooltip; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipDurationFormat; import com.fr.plugin.chart.base.format.AttrTooltipEndTimeFormat; @@ -28,7 +28,7 @@ public class VanChartGanttRichTextFieldListPane extends VanChartFieldListPane { private VanChartFieldButton richTextDurationFormatPane; private VanChartFieldButton richTextProgressFormatPane; - public VanChartGanttRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartGanttRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java index 6868a0c879..267bbcd79a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.gantt.designer.style.tooltip; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipDurationFormat; import com.fr.plugin.chart.base.format.AttrTooltipEndTimeFormat; @@ -66,11 +66,11 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane }; } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartGanttRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/VanChartMapRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/VanChartMapRichTextFieldListPane.java index 91e1817ef5..1e4666d473 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/VanChartMapRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/VanChartMapRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.map.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; @@ -14,7 +14,7 @@ import com.fr.van.chart.designer.component.richText.VanChartRichEditorModel; public class VanChartMapRichTextFieldListPane extends VanChartFieldListPane { - public VanChartMapRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartMapRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java index 680a7e4f24..1afffc8964 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java @@ -3,8 +3,8 @@ package com.fr.van.chart.map.designer.style.label; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.layout.TableLayout; -import com.fr.design.ui.ModernUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -50,11 +50,11 @@ public class VanChartMapLabelContentPane extends VanChartLabelContentPane { setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartMapRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java index 718cfc3584..25f0c6acc4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.map.designer.style.tooltip; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -39,11 +39,11 @@ public class VanChartMapTooltipContentPane extends VanChartTooltipContentPane { setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartMapRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapRichTextFieldListPane.java index 0a1e2bbb6b..cdf3da0d2d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.map.line; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.base.format.AttrTooltipStartAndEndNameFormat; @@ -14,7 +14,7 @@ import com.fr.van.chart.designer.component.richText.VanChartRichEditorModel; public class VanChartLineMapRichTextFieldListPane extends VanChartFieldListPane { - public VanChartLineMapRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartLineMapRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java index 04ab53b6a8..1a6b2f8db0 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.map.line; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -36,11 +36,11 @@ public class VanChartLineMapTooltipContentPane extends VanChartTooltipContentPan setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartLineMapRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java index b62655a263..e3ae145f29 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.multilayer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -36,10 +36,10 @@ public class VanChartMultiPieLabelContentPane extends VanChartLabelContentPane { setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartMultiPieRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieRichTextFieldListPane.java index 2a0aea8194..07b28c77f7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.multilayer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; @@ -14,7 +14,7 @@ import com.fr.van.chart.designer.component.richText.VanChartRichEditorModel; public class VanChartMultiPieRichTextFieldListPane extends VanChartFieldListPane { - public VanChartMultiPieRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartMultiPieRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java index 76d536d5bc..dd0f9a891d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.multilayer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -35,10 +35,10 @@ public class VanChartMultiPieTooltipContentPane extends VanChartTooltipContentPa setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartMultiPieRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java index 5039f53881..d347b40718 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryLabelContentPane.java @@ -1,8 +1,8 @@ package com.fr.van.chart.pie.style; import com.fr.design.i18n.Toolkit; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithAuto; -import com.fr.design.ui.ModernUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -45,11 +45,11 @@ public class VanChartPieCategoryLabelContentPane extends VanChartLabelContentPan summaryValueFormatPane = new SummaryValueFormatPaneWithCheckBox(parent, showOnPane); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartPieCategoryRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryRichTextFieldListPane.java index 15361b490e..ea3e6ffeed 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieCategoryRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.pie.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipSummaryValueFormat; import com.fr.plugin.chart.pie.attr.PieCategoryLabelContent; @@ -19,7 +19,7 @@ public class VanChartPieCategoryRichTextFieldListPane extends VanChartFieldListP private VanChartFieldButton summaryValueButton; - public VanChartPieCategoryRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartPieCategoryRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java index f8c094aa5c..018b86a441 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueLabelContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.pie.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -43,11 +43,11 @@ public class VanChartPieValueLabelContentPane extends VanChartLabelContentPane { setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartPieValueRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueRichTextFieldListPane.java index 072b3a8012..daa2f73ed4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/style/VanChartPieValueRichTextFieldListPane.java @@ -1,6 +1,6 @@ package com.fr.van.chart.pie.style; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.van.chart.designer.component.richText.VanChartFieldAttrPane; import com.fr.van.chart.designer.component.richText.VanChartFieldButton; import com.fr.van.chart.designer.component.richText.VanChartFieldListPane; @@ -12,7 +12,7 @@ import java.util.List; public class VanChartPieValueRichTextFieldListPane extends VanChartFieldListPane { - public VanChartPieValueRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartPieValueRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRichTextFieldListPane.java index 776d5397d8..62ec1a430e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.scatter; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipSizeFormat; import com.fr.plugin.chart.base.format.AttrTooltipXFormat; @@ -23,7 +23,7 @@ public class VanChartScatterRichTextFieldListPane extends VanChartFieldListPane private VanChartFieldButton richTextYFormatPane; private VanChartFieldButton richTextSizeFormatPane; - public VanChartScatterRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartScatterRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java index 396edc6fe1..7f1eba4c4f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.scatter; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; @@ -60,11 +60,11 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa sizeFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartScatterRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRichTextFieldListPane.java index 49f81968cf..3586e52f45 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.structure.desinger.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; @@ -18,7 +18,7 @@ import java.util.List; public class VanChartStructureRichTextFieldListPane extends VanChartFieldListPane { - public VanChartStructureRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartStructureRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java index a2cb16308f..c5e1637c08 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java @@ -2,7 +2,7 @@ package com.fr.van.chart.structure.desinger.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; @@ -62,11 +62,11 @@ public class VanChartStructureTooltipContentPane extends VanChartTooltipContentP setPercentFormatPane(percentFormatPane); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartStructureRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRichTextFieldListPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRichTextFieldListPane.java index 3394e6f05b..156b0bddbd 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRichTextFieldListPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRichTextFieldListPane.java @@ -1,7 +1,7 @@ package com.fr.van.chart.wordcloud.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipPercentFormat; @@ -14,7 +14,7 @@ import com.fr.van.chart.designer.component.richText.VanChartRichEditorModel; public class VanChartWordCloudRichTextFieldListPane extends VanChartFieldListPane { - public VanChartWordCloudRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditorPane) { + public VanChartWordCloudRichTextFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditorPane) { super(fieldAttrPane, richEditorPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java index 0abd60ac1b..7df1b4acc4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java @@ -2,7 +2,7 @@ package com.fr.van.chart.wordcloud.designer.style; import com.fr.design.i18n.Toolkit; -import com.fr.design.ui.ModernUIPane; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; import com.fr.plugin.chart.base.format.AttrTooltipFormat; @@ -58,10 +58,10 @@ public class VanChartWordCloudTooltipContentPane extends VanChartTooltipContentP setPercentFormatPane(percentFormatPane); } - protected VanChartRichTextPane createRichTextPane(ModernUIPane richEditorPane) { + protected VanChartRichTextPane createRichTextPane(JxUIPane richEditorPane) { return new VanChartRichTextPane(richEditorPane) { - protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, ModernUIPane richEditor) { + protected VanChartFieldListPane createFieldListPane(VanChartFieldAttrPane fieldAttrPane, JxUIPane richEditor) { return new VanChartWordCloudRichTextFieldListPane(fieldAttrPane, richEditor); } diff --git a/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html index da8dd5bed1..afbd858e81 100644 --- a/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html +++ b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html @@ -3,8 +3,8 @@ - - + + diff --git a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopPane.java b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopPane.java index f9d3849f78..2e8e7ce495 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/MiniComponentShopPane.java @@ -1,19 +1,12 @@ package com.fr.design.mainframe.share.ui.online.mini; +import com.fr.design.jxbrowser.JxUIPane; import com.fr.design.mainframe.share.ui.online.mini.bridge.ComposedNativeBridges; import com.fr.design.mainframe.share.util.OnlineShopUtils; -import com.fr.design.ui.ModernUIPane; -import com.fr.design.ui.compatible.ModernUIPaneFactory; import com.fr.design.upm.event.CertificateEvent; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; -import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; -import com.teamdev.jxbrowser.chromium.JSObject; -import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; -import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; -import com.teamdev.jxbrowser.js.JsObject; -import org.jetbrains.annotations.Nullable; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -24,34 +17,16 @@ import java.awt.BorderLayout; * Created by Starryi on 2021/12/20 */ public class MiniComponentShopPane extends JPanel { - private final ModernUIPane modernUIPane; + private static final String SHOP_HELPER = "ShopHelper"; + private final JxUIPane modernUIPane; private final Listener loginListener; private final Listener logoutListener; public MiniComponentShopPane() { setLayout(new BorderLayout()); - modernUIPane = ModernUIPaneFactory.modernUIPaneBuilder() + modernUIPane = new JxUIPane.Builder<>() .withURL(OnlineShopUtils.getWebMiniShopPath()) - .prepareForV6(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - super.onScriptContextCreated(event); - JSObject window = event.getBrowser().executeJavaScriptAndReturnValue("window").asObject(); - window.setProperty("ShopHelper", new ComposedNativeBridges(window)); - } - }) - .prepareForV7(new InjectJsCallback() { - @Nullable - @Override - public Response on(Params params) { - // 7.x - JsObject window = params.frame().executeJavaScript("window"); - if (window != null) { - window.putProperty("ShopHelper", new ComposedNativeBridges(window)); - } - return InjectJsCallback.Response.proceed(); - } - }) + .buildProperty(SHOP_HELPER, ComposedNativeBridges::new) .build(); add(modernUIPane, BorderLayout.CENTER);