Browse Source
* commit '85e914f0c2796528440029b842e83cb9468b6187': (27 commits) CHART-19757 图表块增加名称检测 REPORT-54998 去除多余的常量 REPORT-54998 进一步优化代码,去除具体的方向判断,只留水平或者垂直。 REPORT-54998 完善代码逻辑 KERNEL-7634 mac和win使用不同版本的jxbrowser fix 登录名获取方式 REPORT-54998 完善代码逻辑 REPORT-54410: 决策报表,模板中其他组件的宽高修改会影响绝对画布块中组件的宽高和位置 KERNEL-7634 mac和win使用不同版本的jxbrowser REPORT-55034 聚合报表,单元格属性设置面板,在切换参数面板编辑后,面板未刷新 REPORT-55149【组件背景分离】组件复用-图表块没看到内边距设置项 REPORT-55150 【组件背景分离】组件复用-标题设置下划线,选择下划线样式,目前web预览,不管选的什么下划线样式都显示的是单横线效果 REPORT-55121 【组件背景分离】组件复用-点九图填充设置弹窗的关闭按钮和取消按钮,其实还是确认&保存修改的效果 REPORT-53175 【10.0.18】组件背景分离为标题/背景/边框 REPORT-53175【10.0.18】组件背景分离为标题/背景/边框 REPORT-55070【组件背景分离】 组件复用-tab块点击右侧添加标签按钮,没生效 REPORT-54853 fetchsize为空时,数据连接点击确定无效 REPORT-54998 修正一下命名 REPORT-54998 完善一下这边的判断逻辑,使其更加清晰 CHART-19871 大数据判断 REPORT-55089 组件背景分离】组件复用-标题图案的图片预览图,和交互文档里定的悬浮时出现删除按钮和不透明遮罩预期效果不同 ...feature/big-screen
superman
3 years ago
34 changed files with 1431 additions and 274 deletions
@ -0,0 +1,24 @@
|
||||
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; |
||||
|
||||
/** |
||||
* 封装jxbrwoser v6/v7的构建方式的差异 |
||||
* |
||||
* @author hades |
||||
* @version 10.0 |
||||
* Created by hades on 2021/6/13 |
||||
*/ |
||||
public interface BuilderDiff<T> { |
||||
|
||||
ModernUIPane.Builder<T> prepareForV6(ScriptContextListener contextListener); |
||||
|
||||
ModernUIPane.Builder<T> prepareForV6(LoadListener loadListener); |
||||
|
||||
ModernUIPane.Builder<T> prepareForV7(InjectJsCallback callback); |
||||
|
||||
|
||||
} |
@ -0,0 +1,20 @@
|
||||
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 <T> ModernUIPane.Builder<T> modernUIPaneBuilder() { |
||||
if (OperatingSystem.isWindows()) { |
||||
return new NewModernUIPane.Builder<>(); |
||||
} else { |
||||
return new ModernUIPane.Builder<>(); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,301 @@
|
||||
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.js.JsObject; |
||||
import com.teamdev.jxbrowser.net.Network; |
||||
import com.teamdev.jxbrowser.net.callback.InterceptRequestCallback; |
||||
import com.teamdev.jxbrowser.view.swing.BrowserView; |
||||
|
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.util.Map; |
||||
import java.util.Optional; |
||||
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<T> extends ModernUIPane<T> { |
||||
|
||||
private Browser browser; |
||||
private String namespace = "Pool"; |
||||
private String variable = "data"; |
||||
private String expression = "update()"; |
||||
|
||||
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)); |
||||
Engine engine = Engine.newInstance( |
||||
EngineOptions.newBuilder(RenderingMode.HARDWARE_ACCELERATED) |
||||
.addSwitch("--disable-google-traffic") |
||||
.remoteDebuggingPort(9222).build()); |
||||
Browser debugger = 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() { |
||||
Engine engine = Engine.newInstance(EngineOptions.newBuilder(RenderingMode.HARDWARE_ACCELERATED).addSwitch("--disable-google-traffic").build()); |
||||
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<String, String> map) { |
||||
Network network = browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxInterceptRequestCallback(network, 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 static class Builder<T> extends ModernUIPane.Builder<T> { |
||||
|
||||
private NewModernUIPane<T> pane = new NewModernUIPane<>(); |
||||
|
||||
public NewModernUIPane.Builder<T> prepare(InjectJsCallback callback) { |
||||
pane.browser.set(InjectJsCallback.class, callback); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载jar包中的资源 |
||||
* |
||||
* @param path 资源路径 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withEMB(final String path) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxComplexInterceptRequestCallback(network, null)); |
||||
pane.browser.navigation().loadUrl("emb:" + path); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载url指向的资源 |
||||
* |
||||
* @param url 文件的地址 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withURL(final String url) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxInterceptRequestCallback(network)); |
||||
pane.browser.navigation().loadUrl(url); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载url指向的资源 |
||||
* |
||||
* @param url 文件的地址 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withURL(final String url, Map<String, String> map) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxInterceptRequestCallback(network, map)); |
||||
pane.browser.navigation().loadUrl(url); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载Atom组件 |
||||
* |
||||
* @param component Atom组件 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withComponent(AssembleComponent component) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxComplexInterceptRequestCallback(network, component)); |
||||
pane.browser.navigation().loadUrl("emb:dynamic"); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载Atom组件 |
||||
* |
||||
* @param component Atom组件 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withComponent(AssembleComponent component, Map<String, String> map) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxComplexInterceptRequestCallback(network, component, map)); |
||||
pane.browser.navigation().loadUrl("emb:dynamic"); |
||||
return this; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 加载html文本内容 |
||||
* |
||||
* @param html 要加载html文本内容 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> withHTML(String html) { |
||||
Network network = pane.browser.engine().network(); |
||||
network.set(InterceptRequestCallback.class, new NxInterceptRequestCallback(network)); |
||||
pane.browser.mainFrame().ifPresent(frame -> { |
||||
frame.loadHtml(html); |
||||
}); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置该前端页面做数据交换所使用的对象 |
||||
* |
||||
* @param namespace 对象名 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> namespace(String namespace) { |
||||
pane.namespace = namespace; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* java端往js端传数据时使用的变量名字 |
||||
* |
||||
* @param name 变量的名字 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> variable(String name) { |
||||
pane.variable = name; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* js端往java端传数据时执行的函数表达式 |
||||
* |
||||
* @param expression 函数表达式 |
||||
*/ |
||||
@Override |
||||
public NewModernUIPane.Builder<T> expression(String expression) { |
||||
pane.expression = expression; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public NewModernUIPane.Builder<T> prepareForV6(ScriptContextListener contextListener) { |
||||
// do nothing
|
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public NewModernUIPane.Builder<T> prepareForV6(LoadListener loadListener) { |
||||
// do nothing
|
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public NewModernUIPane.Builder<T> prepareForV7(InjectJsCallback callback) { |
||||
return prepare(callback); |
||||
} |
||||
|
||||
@Override |
||||
public NewModernUIPane<T> build() { |
||||
return pane; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,502 @@
|
||||
package com.fr.design.upm; |
||||
|
||||
import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.bridge.exec.JSBridge; |
||||
import com.fr.design.bridge.exec.JSCallback; |
||||
import com.fr.design.extra.PluginOperateUtils; |
||||
import com.fr.design.extra.PluginUtils; |
||||
import com.fr.design.extra.exe.GetInstalledPluginsExecutor; |
||||
import com.fr.design.extra.exe.GetPluginCategoriesExecutor; |
||||
import com.fr.design.extra.exe.GetPluginFromStoreExecutor; |
||||
import com.fr.design.extra.exe.GetPluginPrefixExecutor; |
||||
import com.fr.design.extra.exe.PluginLoginExecutor; |
||||
import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; |
||||
import com.fr.design.extra.exe.SearchOnlineExecutor; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.upm.event.CertificateEvent; |
||||
import com.fr.design.upm.event.DownloadEvent; |
||||
import com.fr.design.upm.exec.NewUpmBrowserExecutor; |
||||
import com.fr.design.upm.task.UpmTaskWorker; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.context.PluginMarker; |
||||
import com.fr.stable.ArrayUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.teamdev.jxbrowser.js.JsAccessible; |
||||
import com.teamdev.jxbrowser.js.JsFunction; |
||||
import com.teamdev.jxbrowser.js.JsObject; |
||||
|
||||
import javax.swing.JFileChooser; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.SwingWorker; |
||||
import javax.swing.filechooser.FileNameExtensionFilter; |
||||
import java.io.File; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.concurrent.FutureTask; |
||||
import java.util.concurrent.RunnableFuture; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-12 |
||||
* 桥接Java和JavaScript的类 |
||||
*/ |
||||
public class NewUpmBridge extends UpmBridge { |
||||
|
||||
public static NewUpmBridge getBridge(JsObject jsObject) { |
||||
return new NewUpmBridge(jsObject); |
||||
} |
||||
|
||||
private JsObject jsObject; |
||||
|
||||
private NewUpmBridge(JsObject jsObject) { |
||||
this.jsObject = jsObject; |
||||
} |
||||
|
||||
/** |
||||
* 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) |
||||
* |
||||
* @param callback 安装完成后的回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void update(final JsFunction callback) { |
||||
callback.invoke(jsObject, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
||||
try { |
||||
UpmResourceLoader.INSTANCE.download(); |
||||
UpmResourceLoader.INSTANCE.install(); |
||||
callback.invoke(jsObject, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
||||
EventDispatcher.fire(DownloadEvent.UPDATE, "success"); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
callback.invoke(jsObject, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 下载并安装插件管理中心的资源文件 |
||||
* |
||||
* @param callback 安装完成后的回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void startDownload(final JsFunction callback) { |
||||
callback.invoke(jsObject, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
||||
new SwingWorker<Void, Void>() { |
||||
@Override |
||||
protected Void doInBackground() throws Exception { |
||||
UpmResourceLoader.INSTANCE.download(); |
||||
UpmResourceLoader.INSTANCE.install(); |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected void done() { |
||||
try { |
||||
get(); |
||||
callback.invoke(jsObject, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
||||
EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); |
||||
} catch (Exception e) { |
||||
callback.invoke(jsObject, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
EventDispatcher.fire(DownloadEvent.ERROR, "error"); |
||||
} |
||||
} |
||||
}.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 获取upm的版本信息 |
||||
* |
||||
* @return 版本信息 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public String getVersion() { |
||||
return super.getVersion(); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public String i18nText(String key) { |
||||
return super.i18nText(key); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public void closeWindow() { |
||||
super.closeWindow(); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public boolean isDesigner() { |
||||
return super.isDesigner(); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
public void getPackInfo(final JsFunction callback) { |
||||
callback.invoke(jsObject, StringUtils.EMPTY); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
public void getPluginPrefix(final JsFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new GetPluginPrefixExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 在线获取插件分类 |
||||
* |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void getPluginCategories(final JsFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new GetPluginCategoriesExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 根据条件获取在线插件 |
||||
* |
||||
* @param info 插件信息 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void getPluginFromStoreNew(String info, final JsFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new GetPluginFromStoreExecutor(new JSONObject(info))); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 已安装插件检查更新 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void readUpdateOnline(final JsFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new ReadUpdateOnlineExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 获取已经安装的插件的数组 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void getInstalledPlugins(final JsFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new GetInstalledPluginsExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 从插件服务器上更新选中的插件 |
||||
* |
||||
* @param pluginIDs 插件集合 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void updatePluginOnline(JsObject pluginIDs, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
List<PluginMarker> pluginMarkerList = new ArrayList<>(); |
||||
for (String key : pluginIDs.propertyNames()) { |
||||
pluginIDs.property(key).ifPresent(v -> { |
||||
pluginMarkerList.add(PluginUtils.createPluginMarker(GeneralUtils.objectToString(v))); |
||||
}); |
||||
} |
||||
PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); |
||||
} |
||||
|
||||
@JSBridge |
||||
@JsAccessible |
||||
public void updatePluginOnline(String pluginID, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
List<PluginMarker> pluginMarkerList = new ArrayList<>(); |
||||
pluginMarkerList.add(PluginUtils.createPluginMarker(pluginID)); |
||||
PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 搜索在线插件 |
||||
* |
||||
* @param keyword 关键字 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void searchPlugin(String keyword, final JsFunction callback) { |
||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new SearchOnlineExecutor(keyword)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 从磁盘上选择插件安装包进行安装 |
||||
* |
||||
* @param filePath 插件包的路径 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void installPluginFromDisk(final String filePath, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
File file = new File(filePath); |
||||
PluginOperateUtils.installPluginFromDisk(file, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 卸载当前选中的插件 |
||||
* |
||||
* @param pluginInfo 插件信息 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 从插件服务器上安装插件 |
||||
* |
||||
* @param pluginInfo 插件的ID |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void installPluginOnline(final String pluginInfo, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); |
||||
PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 从磁盘上选择插件安装包进行插件升级 |
||||
* |
||||
* @param filePath 插件包的路径 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void updatePluginFromDisk(String filePath, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
File file = new File(filePath); |
||||
PluginOperateUtils.updatePluginFromDisk(file, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 修改选中的插件的活跃状态 |
||||
* |
||||
* @param pluginID 插件ID |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void setPluginActive(String pluginID, final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
PluginOperateUtils.setPluginActive(pluginID, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @return 选择的文件的路径 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public String showFileChooser() { |
||||
return super.showFileChooser(); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @param des 过滤文件描述 |
||||
* @param filter 文件的后缀 |
||||
* @return 选择的文件的路径 |
||||
* 这里换用JFileChooser会卡死,不知道为什么 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public String showFileChooserWithFilter(final String des, final String filter) { |
||||
return super.showFileChooserWithFilter(des, filter); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @param des 过滤文件描述 |
||||
* @param args 文件的后缀 |
||||
* @return 选择的文件的路径 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public String showFileChooserWithFilters(final String des, final String args) { |
||||
RunnableFuture<String> future = new FutureTask<>(() -> { |
||||
JFileChooser fileChooser = new JFileChooser(); |
||||
List<String> filterList = new ArrayList<>(); |
||||
filterList.add(args); |
||||
String[] filters = filterList.toArray(new String[0]); |
||||
if (ArrayUtils.isNotEmpty(filters)) { |
||||
FileNameExtensionFilter filter = new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(filters)); |
||||
fileChooser.setFileFilter(filter); |
||||
} |
||||
int result = fileChooser.showOpenDialog(UpmFinder.getDialog()); |
||||
if (result == JFileChooser.APPROVE_OPTION) { |
||||
return fileChooser.getSelectedFile().getAbsolutePath(); |
||||
} |
||||
return null; |
||||
}); |
||||
SwingUtilities.invokeLater(future); |
||||
try { |
||||
return future.get(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @param des 过滤文件描述 |
||||
* @param args 文件的后缀 |
||||
* @return 选择的文件的路径 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public String showFileChooserWithFilters(final String des, final JsObject args) { |
||||
RunnableFuture<String> future = new FutureTask<>(() -> { |
||||
JFileChooser fileChooser = new JFileChooser(); |
||||
List<String> filterList = new ArrayList<>(); |
||||
for (String key : args.propertyNames()) { |
||||
args.property(key).ifPresent(v -> { |
||||
filterList.add(GeneralUtils.objectToString(v)); |
||||
}); |
||||
} |
||||
String[] filters = filterList.toArray(new String[0]); |
||||
if (ArrayUtils.isNotEmpty(filters)) { |
||||
FileNameExtensionFilter filter = new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(filters)); |
||||
fileChooser.setFileFilter(filter); |
||||
} |
||||
int result = fileChooser.showOpenDialog(UpmFinder.getDialog()); |
||||
if (result == JFileChooser.APPROVE_OPTION) { |
||||
return fileChooser.getSelectedFile().getAbsolutePath(); |
||||
} |
||||
return null; |
||||
}); |
||||
SwingUtilities.invokeLater(future); |
||||
try { |
||||
return future.get(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
////////登录相关///////
|
||||
|
||||
/** |
||||
* 获取系统登录的用户名 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public String getLoginInfo(final JsFunction callback) { |
||||
registerLoginInfo(callback); |
||||
return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
||||
} |
||||
|
||||
/** |
||||
* 系统登录注册 |
||||
* |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void registerLoginInfo(final JsFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)); |
||||
String username = DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
||||
if (StringUtils.isEmpty(username)) { |
||||
jsCallback.execute(StringUtils.EMPTY); |
||||
EventDispatcher.fire(CertificateEvent.LOGOUT, StringUtils.EMPTY); |
||||
} else { |
||||
jsCallback.execute(username); |
||||
EventDispatcher.fire(CertificateEvent.LOGIN, username); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 设计器端的用户登录 |
||||
* |
||||
* @param username 用户名 |
||||
* @param password 密码 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
public void defaultLogin(String username, String password, final JsFunction callback) { |
||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(NewUpmBrowserExecutor.create(jsObject, callback)), new PluginLoginExecutor(username, password)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 清除用户信息 |
||||
*/ |
||||
@JsAccessible |
||||
@JSBridge |
||||
@Override |
||||
public void clearUserInfo() { |
||||
super.clearUserInfo(); |
||||
} |
||||
|
||||
/** |
||||
* 打开论坛消息界面 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public void getPriviteMessage() { |
||||
super.getPriviteMessage(); |
||||
} |
||||
|
||||
/** |
||||
* 忘记密码 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public void forgetHref() { |
||||
super.forgetHref(); |
||||
} |
||||
|
||||
/** |
||||
* 立即注册 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public void registerHref() { |
||||
super.registerHref(); |
||||
} |
||||
|
||||
/** |
||||
* 使用系统浏览器打开网页 |
||||
* |
||||
* @param url 要打开的网页 |
||||
*/ |
||||
@JSBridge |
||||
@JsAccessible |
||||
@Override |
||||
public void openShopUrlAtWebBrowser(String url) { |
||||
super.openShopUrlAtWebBrowser(url); |
||||
} |
||||
} |
@ -0,0 +1,30 @@
|
||||
package com.fr.design.upm.exec; |
||||
|
||||
import com.fr.design.bridge.exec.JSExecutor; |
||||
import com.teamdev.jxbrowser.js.JsFunction; |
||||
import com.teamdev.jxbrowser.js.JsObject; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-18 |
||||
*/ |
||||
public class NewUpmBrowserExecutor implements JSExecutor { |
||||
|
||||
public static NewUpmBrowserExecutor create(JsObject window, JsFunction callback) { |
||||
return new NewUpmBrowserExecutor(window, callback); |
||||
} |
||||
|
||||
private final JsFunction callback; |
||||
private final JsObject window; |
||||
|
||||
private NewUpmBrowserExecutor(JsObject window, JsFunction callback) { |
||||
this.window = window; |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public void executor(String newValue) { |
||||
callback.invoke(window, newValue); |
||||
} |
||||
} |
@ -0,0 +1,57 @@
|
||||
package com.fr.design.widget.ui.designer.layout; |
||||
|
||||
import com.fr.design.designer.IntervalConstants; |
||||
import com.fr.design.designer.creator.CRPropertyDescriptor; |
||||
import com.fr.design.designer.creator.PropertyGroupPane; |
||||
import com.fr.design.designer.creator.XCreator; |
||||
import com.fr.design.designer.creator.XElementCase; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.widget.accessibles.AccessibleElementCaseToolBarEditor; |
||||
import com.fr.design.widget.ui.designer.component.PaddingBoundPane; |
||||
import com.fr.form.ui.ChartEditor; |
||||
import com.fr.form.ui.ElementCaseEditor; |
||||
import com.fr.form.web.FormToolBarManager; |
||||
import com.fr.general.ComparatorUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* Created by ibm on 2017/8/7. |
||||
*/ |
||||
public class ChartEditorDefinePane extends WTitleLayoutDefinePane<ChartEditor> { |
||||
private PaddingBoundPane paddingBoundPane; |
||||
|
||||
public ChartEditorDefinePane(XCreator xCreator) { |
||||
super(xCreator); |
||||
|
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); |
||||
paddingBoundPane = new PaddingBoundPane(); |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{paddingBoundPane, null}, |
||||
}; |
||||
JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, TableLayoutHelper.FILL_LASTCOLUMN, IntervalConstants.INTERVAL_W0, IntervalConstants.INTERVAL_L1); |
||||
panel.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0)); |
||||
centerPane.add(panel, BorderLayout.NORTH); |
||||
return centerPane; |
||||
} |
||||
|
||||
protected ChartEditor updateSubBean() { |
||||
ChartEditor chartEditor = (ChartEditor) creator.toData(); |
||||
if (ComparatorUtils.equals(getGlobalName(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout_Padding_Duplicate"))) { |
||||
paddingBoundPane.update(chartEditor); |
||||
} |
||||
|
||||
return chartEditor; |
||||
} |
||||
|
||||
protected void populateSubBean(ChartEditor ob) { |
||||
paddingBoundPane.populate(ob); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue