vito
5 months ago
18 changed files with 118 additions and 1380 deletions
@ -1,30 +0,0 @@
|
||||
package com.fr.design.login.executor; |
||||
|
||||
import com.fr.design.bridge.exec.JSExecutor; |
||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-18 |
||||
*/ |
||||
public class DesignerLoginBrowserExecutor implements JSExecutor { |
||||
|
||||
public static DesignerLoginBrowserExecutor create(JSObject window, JSFunction callback) { |
||||
return new DesignerLoginBrowserExecutor(window, callback); |
||||
} |
||||
|
||||
private JSObject window; |
||||
private JSFunction callback; |
||||
|
||||
private DesignerLoginBrowserExecutor(JSObject window, JSFunction callback) { |
||||
this.window = window; |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public void executor(String newValue) { |
||||
callback.invoke(window, newValue); |
||||
} |
||||
} |
@ -1,91 +0,0 @@
|
||||
package com.fr.design.ui; |
||||
|
||||
import com.fr.stable.StringUtils; |
||||
import com.teamdev.jxbrowser.chromium.Browser; |
||||
import com.teamdev.jxbrowser.chromium.BrowserContext; |
||||
import com.teamdev.jxbrowser.chromium.BrowserPreferences; |
||||
import com.teamdev.jxbrowser.chromium.ProtocolService; |
||||
import com.teamdev.jxbrowser.chromium.URLResponse; |
||||
|
||||
import java.io.DataInputStream; |
||||
import java.io.File; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.nio.file.Files; |
||||
import java.nio.file.Path; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-03-07 |
||||
*/ |
||||
public class Assistant { |
||||
|
||||
public static void addChromiumSwitches(String... switches) { |
||||
|
||||
List<String> list = BrowserPreferences.getChromiumSwitches(); |
||||
Collections.addAll(list, switches); |
||||
|
||||
BrowserPreferences.setChromiumSwitches((list.toArray(new String[0]))); |
||||
} |
||||
|
||||
public static URLResponse inputStream2Response(InputStream inputStream, String filePath) throws Exception { |
||||
URLResponse response = new URLResponse(); |
||||
DataInputStream stream = new DataInputStream(inputStream); |
||||
byte[] data = new byte[stream.available()]; |
||||
stream.readFully(data); |
||||
response.setData(data); |
||||
String mimeType = getMimeType(filePath); |
||||
response.getHeaders().setHeader("Content-Type", mimeType); |
||||
return response; |
||||
} |
||||
|
||||
|
||||
private static String getMimeType(String path) { |
||||
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"; |
||||
} |
||||
// upm 文件夹中的图片如果返回 Content-type 为 image/png 时会显示异常
|
||||
if (path.endsWith(".png") && !path.contains("/upm")) { |
||||
return "image/png"; |
||||
} |
||||
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 static void setEmbProtocolHandler(Browser browser, EmbProtocolHandler handler) { |
||||
BrowserContext browserContext = browser.getContext(); |
||||
ProtocolService protocolService = browserContext.getProtocolService(); |
||||
// 支持读取jar包中文件的自定义协议————emb:/com/fr/design/images/bbs.png
|
||||
protocolService.setProtocolHandler("emb", handler); |
||||
protocolService.setProtocolHandler("file", handler); |
||||
} |
||||
} |
@ -1,135 +0,0 @@
|
||||
package com.fr.design.ui; |
||||
|
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.general.IOUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.EncodeConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.commons.codec.net.URLCodec; |
||||
import com.fr.third.org.apache.commons.io.FileUtils; |
||||
import com.fr.third.org.apache.commons.io.FilenameUtils; |
||||
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.chromium.ProtocolHandler; |
||||
import com.teamdev.jxbrowser.chromium.URLRequest; |
||||
import com.teamdev.jxbrowser.chromium.URLResponse; |
||||
|
||||
import java.io.ByteArrayInputStream; |
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.StringReader; |
||||
import java.net.URI; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-03-07 |
||||
*/ |
||||
public class EmbProtocolHandler implements ProtocolHandler { |
||||
|
||||
private AssembleComponent component; |
||||
private Map<String, String> map; |
||||
|
||||
public EmbProtocolHandler() { |
||||
|
||||
} |
||||
|
||||
public EmbProtocolHandler(AssembleComponent component) { |
||||
this.component = component; |
||||
} |
||||
|
||||
public EmbProtocolHandler(AssembleComponent component, Map<String, String> map) { |
||||
this.component = component; |
||||
this.map = map; |
||||
} |
||||
|
||||
public EmbProtocolHandler(Map<String, String> map) { |
||||
this.map = map; |
||||
} |
||||
|
||||
@Override |
||||
public URLResponse onRequest(URLRequest req) { |
||||
InputStream inputStream = null; |
||||
try { |
||||
String path = req.getURL(); |
||||
if (path.startsWith("file:")) { |
||||
String url = new URLCodec().decode(path); |
||||
String filePath = TemplateUtils.renderParameter4Tpl(url, map); |
||||
File file = new File(URI.create(filePath).getPath()); |
||||
inputStream = IOUtils.readResource(file.getAbsolutePath()); |
||||
String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
||||
text = TemplateUtils.renderParameter4Tpl(text, map); |
||||
return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); |
||||
} else if (path.startsWith("emb:dynamic")) { |
||||
URLResponse response = new URLResponse(); |
||||
response.setData(htmlText(map).getBytes()); |
||||
response.getHeaders().setHeader("Content-Type", "text/html"); |
||||
return response; |
||||
} else { |
||||
int index = path.indexOf("="); |
||||
if (index > 0) { |
||||
path = path.substring(index + 1); |
||||
} else { |
||||
path = path.substring(4); |
||||
} |
||||
inputStream = IOUtils.readResource(path); |
||||
if (path.endsWith(".html")) { |
||||
String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
||||
text = TemplateUtils.renderParameter4Tpl(text, map); |
||||
return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); |
||||
} |
||||
return Assistant.inputStream2Response(inputStream, path); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} finally { |
||||
if (inputStream != null) { |
||||
try { |
||||
inputStream.close(); |
||||
} catch (IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
private String htmlText(Map<String, String> 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("<link rel=\"stylesheet\" href=\"emb:"); |
||||
styleText.append(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("<script src=\"emb:"); |
||||
scriptText.append(path.toFilePath()); |
||||
scriptText.append("\"></script>"); |
||||
} |
||||
} |
||||
result = result.replaceAll("##script##", scriptText.toString()); |
||||
if (map != null) { |
||||
for (Map.Entry<String, String> entry : map.entrySet()) { |
||||
String key = entry.getKey(); |
||||
String value = entry.getValue(); |
||||
result = result.replaceAll("\\$\\{" + key + "}", value); |
||||
} |
||||
} |
||||
return result; |
||||
} |
||||
} |
@ -1,364 +0,0 @@
|
||||
package com.fr.design.ui; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
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; |
||||
import com.teamdev.jxbrowser.chromium.events.LoadListener; |
||||
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; |
||||
import javax.swing.WindowConstants; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.io.File; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-03-04 |
||||
* 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest |
||||
* @see {@link com.fr.design.jxbrowser.JxUIPane} |
||||
* @deprecated 主要用于jxbrowser6,将在下个版本删除 |
||||
*/ |
||||
@Deprecated |
||||
public class ModernUIPane<T> extends BasicPane { |
||||
|
||||
private Browser browser; |
||||
private String namespace = "Pool"; |
||||
private String variable = "data"; |
||||
private String expression = "update()"; |
||||
|
||||
private ModernUIPane(BrowserType browserType) { |
||||
initialize(browserType); |
||||
} |
||||
|
||||
protected ModernUIPane() { |
||||
|
||||
} |
||||
|
||||
private void initialize(BrowserType browserType) { |
||||
if (browser == null) { |
||||
setLayout(new BorderLayout()); |
||||
Assistant.addChromiumSwitches("--disable-google-traffic"); |
||||
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(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
showDebuggerDialog(); |
||||
} |
||||
}); |
||||
|
||||
reloadButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
browser.reloadIgnoringCache(); |
||||
} |
||||
}); |
||||
|
||||
closeButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
SwingUtilities.getWindowAncestor(ModernUIPane.this).setVisible(false); |
||||
} |
||||
}); |
||||
Assistant.addChromiumSwitches("--remote-debugging-port=9222"); |
||||
initializeBrowser(browserType); |
||||
add(new BrowserView(browser), BorderLayout.CENTER); |
||||
} else { |
||||
initializeBrowser(browserType); |
||||
add(new BrowserView(browser), BorderLayout.CENTER); |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void showDebuggerDialog() { |
||||
JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this)); |
||||
Browser debugger = new Browser(); |
||||
BrowserView debuggerView = new BrowserView(debugger); |
||||
dialog.add(debuggerView, BorderLayout.CENTER); |
||||
dialog.setSize(new Dimension(800, 400)); |
||||
GUICoreUtils.centerWindow(dialog); |
||||
dialog.setVisible(true); |
||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||
debugger.loadURL(browser.getRemoteDebuggingURL()); |
||||
} |
||||
|
||||
private void initializeBrowser(BrowserType browserType) { |
||||
browser = new Browser(browserType); |
||||
// 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的
|
||||
browser.addScriptContextListener(new ScriptContextAdapter() { |
||||
@Override |
||||
public void onScriptContextCreated(ScriptContextEvent event) { |
||||
event.getBrowser().executeJavaScript(String.format(ModernUIConstants.SCRIPT_INIT_NAME_SPACE, namespace)); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 转向一个新的地址,相当于重新加载 |
||||
* |
||||
* @param url 新的地址 |
||||
*/ |
||||
public void redirect(String url) { |
||||
browser.loadURL(url); |
||||
} |
||||
|
||||
/** |
||||
* 转向一个新的地址,相当于重新加载 |
||||
* |
||||
* @param url 新的地址 |
||||
* @param map 初始化参数 |
||||
*/ |
||||
public void redirect(String url, Map<String, String> map) { |
||||
Assistant.setEmbProtocolHandler(browser, new EmbProtocolHandler(map)); |
||||
browser.loadURL(url); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "Modern"; |
||||
} |
||||
|
||||
|
||||
public void populate(final T t) { |
||||
browser.addScriptContextListener(new ScriptContextAdapter() { |
||||
@Override |
||||
public void onScriptContextCreated(ScriptContextEvent event) { |
||||
JSValue ns = event.getBrowser().executeJavaScriptAndReturnValue("window." + namespace); |
||||
ns.asObject().setProperty(variable, t); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public T update() { |
||||
JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression); |
||||
if (jsValue.isObject()) { |
||||
return (T) jsValue.asJavaObject(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public void disposeBrowser() { |
||||
|
||||
if (browser != null) { |
||||
browser.dispose(); |
||||
browser = null; |
||||
} |
||||
|
||||
} |
||||
|
||||
public void clearCache() { |
||||
if (browser != null) { |
||||
browser.getCacheStorage().clearCache(); |
||||
File file = new File(browser.getContext().getCacheDir()); |
||||
if (file.exists()) { |
||||
file.delete(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void executeJavaScript(String javaScript) { |
||||
if (browser != null) { |
||||
browser.executeJavaScript(javaScript); |
||||
} |
||||
} |
||||
|
||||
public JSValue executeJavaScriptAndReturnValue(String javaScript) { |
||||
if (browser != null) { |
||||
return browser.executeJavaScriptAndReturnValue(javaScript); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* ModernUIPane 建造者 |
||||
* |
||||
* @param <T> |
||||
*/ |
||||
public static class Builder<T> implements BuilderDiff<T> { |
||||
|
||||
private ModernUIPane<T> pane; |
||||
|
||||
public Builder() { |
||||
this(BrowserType.HEAVYWEIGHT); |
||||
} |
||||
|
||||
public Builder(BrowserType browserType) { |
||||
this.pane = new ModernUIPane<>(browserType); |
||||
} |
||||
|
||||
public Builder(ModernUIPane<T> pane) { |
||||
this.pane = pane; |
||||
} |
||||
|
||||
public Builder<T> prepare(ScriptContextListener contextListener) { |
||||
pane.browser.addScriptContextListener(contextListener); |
||||
return this; |
||||
} |
||||
|
||||
public Builder<T> prepare(LoadListener loadListener) { |
||||
pane.browser.addLoadListener(loadListener); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载jar包中的资源 |
||||
* |
||||
* @param path 资源路径 |
||||
*/ |
||||
public Builder<T> withEMB(final String path) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
||||
pane.browser.loadURL("emb:" + path); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载jar包中的资源 |
||||
* |
||||
* @param path 资源路径 |
||||
*/ |
||||
public Builder<T> withEMB(final String path, Map<String, String> map) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); |
||||
pane.browser.loadURL("emb:" + path); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载url指向的资源 |
||||
* |
||||
* @param url 文件的地址 |
||||
*/ |
||||
public Builder<T> withURL(final String url) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
||||
pane.browser.loadURL(url); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载url指向的资源 |
||||
* |
||||
* @param url 文件的地址 |
||||
*/ |
||||
public Builder<T> withURL(final String url, Map<String, String> map) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); |
||||
pane.browser.loadURL(url); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载Atom组件 |
||||
* |
||||
* @param component Atom组件 |
||||
*/ |
||||
public Builder<T> withComponent(AssembleComponent component) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component)); |
||||
pane.browser.loadURL("emb:dynamic"); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载Atom组件 |
||||
* |
||||
* @param component Atom组件 |
||||
*/ |
||||
public Builder<T> withComponent(AssembleComponent component, Map<String, String> map) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component, map)); |
||||
pane.browser.loadURL("emb:dynamic"); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 加载html文本内容 |
||||
* |
||||
* @param html 要加载html文本内容 |
||||
*/ |
||||
public Builder<T> withHTML(String html) { |
||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
||||
pane.browser.loadHTML(html); |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* 设置该前端页面做数据交换所使用的对象 |
||||
* |
||||
* @param namespace 对象名 |
||||
*/ |
||||
public Builder<T> namespace(String namespace) { |
||||
pane.namespace = namespace; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* java端往js端传数据时使用的变量名字 |
||||
* |
||||
* @param name 变量的名字 |
||||
*/ |
||||
public Builder<T> variable(String name) { |
||||
pane.variable = name; |
||||
return this; |
||||
} |
||||
|
||||
/** |
||||
* js端往java端传数据时执行的函数表达式 |
||||
* |
||||
* @param expression 函数表达式 |
||||
*/ |
||||
public Builder<T> expression(String expression) { |
||||
pane.expression = expression; |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder<T> prepareForV6(ScriptContextListener contextListener) { |
||||
return prepare(contextListener); |
||||
} |
||||
|
||||
@Override |
||||
public Builder<T> prepareForV6(LoadListener loadListener) { |
||||
return prepare(loadListener); |
||||
} |
||||
|
||||
@Override |
||||
public Builder<T> prepareForV7(InjectJsCallback callback) { |
||||
// do nothing
|
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public Builder<T> prepareForV7(Class event, Observer listener) { |
||||
// do nothing
|
||||
return this; |
||||
} |
||||
|
||||
public ModernUIPane<T> build() { |
||||
return pane; |
||||
} |
||||
} |
||||
} |
@ -1,55 +0,0 @@
|
||||
package com.fr.design.ui.compatible; |
||||
|
||||
import com.fr.design.jxbrowser.JxUIPane; |
||||
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 |
||||
* @see {@link JxUIPane} |
||||
* @since 10.0 |
||||
* Created on 2021/6/13 |
||||
* @deprecated 6在下个版本弃用 |
||||
*/ |
||||
@Deprecated |
||||
public interface BuilderDiff<T> { |
||||
|
||||
/** |
||||
* v6准备工作 |
||||
* |
||||
* @param contextListener 上下文监听器 |
||||
* @return 构造器 |
||||
*/ |
||||
ModernUIPane.Builder<T> prepareForV6(ScriptContextListener contextListener); |
||||
|
||||
/** |
||||
* v6准备工作 |
||||
* |
||||
* @param loadListener 加载监听器 |
||||
* @return 构造器 |
||||
*/ |
||||
ModernUIPane.Builder<T> prepareForV6(LoadListener loadListener); |
||||
|
||||
/** |
||||
* v7准备工作 |
||||
* |
||||
* @param callback 注入js回调器 |
||||
* @return 构造器 |
||||
*/ |
||||
ModernUIPane.Builder<T> prepareForV7(InjectJsCallback callback); |
||||
|
||||
/** |
||||
* v7准备工作 |
||||
* |
||||
* @param event 事件 |
||||
* @param listener 监听器 |
||||
* @return 构造器 |
||||
*/ |
||||
ModernUIPane.Builder<T> prepareForV7(Class event, Observer listener); |
||||
|
||||
} |
@ -1,45 +0,0 @@
|
||||
package com.fr.design.ui.compatible; |
||||
|
||||
import com.fr.design.jxbrowser.JxUIPane; |
||||
import com.fr.design.ui.ModernUIPane; |
||||
|
||||
/** |
||||
* 根据版本选择构造器 |
||||
* |
||||
* @author hades |
||||
* @see {@link JxUIPane} |
||||
* @since 10.0 |
||||
* Created on 2021/6/13 |
||||
* @deprecated 6在下个版本弃用 |
||||
*/ |
||||
public class ModernUIPaneFactory { |
||||
|
||||
/** |
||||
* 获取一个 JxBrowser pane 的构造器 |
||||
* |
||||
* @param <T> 参数 |
||||
* @return 构造器 |
||||
*/ |
||||
public static <T> ModernUIPane.Builder<T> modernUIPaneBuilder() { |
||||
if (isV7()) { |
||||
return new JxUIPane.Builder<>(); |
||||
} else { |
||||
return new ModernUIPane.Builder<>(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 判断 JxBrowser 版本是否在7或之上 |
||||
* |
||||
* @return 是否7或之上 |
||||
*/ |
||||
public static boolean isV7() { |
||||
boolean jxBrowserV7 = true; |
||||
try { |
||||
Class.forName("com.teamdev.jxbrowser.net.Scheme"); |
||||
} catch (ClassNotFoundException e) { |
||||
jxBrowserV7 = false; |
||||
} |
||||
return jxBrowserV7; |
||||
} |
||||
} |
@ -1,515 +0,0 @@
|
||||
package com.fr.design.upm; |
||||
|
||||
import com.fr.config.ServerPreferenceConfig; |
||||
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.gui.ifilechooser.FileChooserArgs; |
||||
import com.fr.design.gui.ifilechooser.FileChooserFactory; |
||||
import com.fr.design.gui.ifilechooser.FileChooserProvider; |
||||
import com.fr.design.gui.ifilechooser.FileSelectionMode; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.locale.impl.BbsRegisterMark; |
||||
import com.fr.design.locale.impl.BbsResetMark; |
||||
import com.fr.design.locale.impl.BbsSpaceMark; |
||||
import com.fr.design.login.utils.DesignerLoginUtils; |
||||
import com.fr.design.ui.util.UIUtil; |
||||
import com.fr.design.upm.event.DownloadEvent; |
||||
import com.fr.design.upm.exec.UpmBrowserExecutor; |
||||
import com.fr.design.upm.task.UpmTaskWorker; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.general.locale.LocaleCenter; |
||||
import com.fr.general.locale.LocaleMark; |
||||
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.chromium.Browser; |
||||
import com.teamdev.jxbrowser.chromium.JSArray; |
||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
|
||||
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; |
||||
import java.util.List; |
||||
import java.util.concurrent.Callable; |
||||
import java.util.concurrent.FutureTask; |
||||
import java.util.concurrent.RunnableFuture; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-12 |
||||
* 桥接Java和JavaScript的类 |
||||
* @deprecated 用于jxbrowser6,下版本删除 |
||||
*/ |
||||
@Deprecated |
||||
public class UpmBridge { |
||||
|
||||
public static UpmBridge getBridge(Browser browser) { |
||||
return new UpmBridge(browser); |
||||
} |
||||
|
||||
private JSObject window; |
||||
|
||||
private UpmBridge(Browser browser) { |
||||
this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); |
||||
} |
||||
|
||||
protected UpmBridge() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) |
||||
* |
||||
* @param callback 安装完成后的回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void update(final JSFunction callback) { |
||||
callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
||||
try { |
||||
UpmResourceLoader.INSTANCE.download(); |
||||
UpmResourceLoader.INSTANCE.install(); |
||||
callback.invoke(window, "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(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 下载并安装插件管理中心的资源文件 |
||||
* |
||||
* @param callback 安装完成后的回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void startDownload(final JSFunction callback) { |
||||
callback.invoke(window, "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(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
||||
EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); |
||||
} catch (Exception e) { |
||||
callback.invoke(window, "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 |
||||
public String getVersion() { |
||||
return ServerPreferenceConfig.getInstance().getOptimizedUPMVersion(); |
||||
} |
||||
|
||||
@JSBridge |
||||
public String i18nText(String key) { |
||||
return Toolkit.i18nText(key); |
||||
} |
||||
|
||||
@JSBridge |
||||
public void closeWindow() { |
||||
UIUtil.invokeLaterIfNeeded(UpmFinder::closeWindow); |
||||
} |
||||
|
||||
|
||||
@JSBridge |
||||
public boolean isDesigner() { |
||||
return true; |
||||
} |
||||
|
||||
@JSBridge |
||||
public void getPackInfo(final JSFunction callback) { |
||||
callback.invoke(window, StringUtils.EMPTY); |
||||
} |
||||
|
||||
@JSBridge |
||||
public void getPluginPrefix(final JSFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginPrefixExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 在线获取插件分类 |
||||
* |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void getPluginCategories(final JSFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginCategoriesExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 根据条件获取在线插件 |
||||
* |
||||
* @param info 插件信息 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void getPluginFromStoreNew(String info, final JSFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginFromStoreExecutor(new JSONObject(info))); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 已安装插件检查更新 |
||||
*/ |
||||
@JSBridge |
||||
public void readUpdateOnline(final JSFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new ReadUpdateOnlineExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 获取已经安装的插件的数组 |
||||
*/ |
||||
@JSBridge |
||||
public void getInstalledPlugins(final JSFunction callback) { |
||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetInstalledPluginsExecutor()); |
||||
task.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 从插件服务器上更新选中的插件 |
||||
* |
||||
* @param pluginIDs 插件集合 |
||||
*/ |
||||
@JSBridge |
||||
public void updatePluginOnline(Object pluginIDs, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
List<PluginMarker> pluginMarkerList = new ArrayList<>(); |
||||
if (pluginIDs instanceof String) { |
||||
pluginMarkerList.add(PluginUtils.createPluginMarker(pluginIDs.toString())); |
||||
} else if (pluginIDs instanceof JSArray) { |
||||
JSArray pluginInfos = (JSArray) pluginIDs; |
||||
for (int i = 0, len = pluginInfos.length(); i < len; i++) { |
||||
String value = pluginInfos.get(i).asString().getValue(); |
||||
pluginMarkerList.add(PluginUtils.createPluginMarker(value)); |
||||
} |
||||
} |
||||
PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 搜索在线插件 |
||||
* |
||||
* @param keyword 关键字 |
||||
*/ |
||||
@JSBridge |
||||
public void searchPlugin(String keyword, final JSFunction callback) { |
||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new SearchOnlineExecutor(keyword)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 从磁盘上选择插件安装包进行安装 |
||||
* |
||||
* @param filePath 插件包的路径 |
||||
*/ |
||||
@JSBridge |
||||
public void installPluginFromDisk(final String filePath, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
File file = new File(filePath); |
||||
PluginOperateUtils.installPluginFromDisk(file, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 卸载当前选中的插件 |
||||
* |
||||
* @param pluginInfo 插件信息 |
||||
*/ |
||||
@JSBridge |
||||
public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 从插件服务器上安装插件 |
||||
* |
||||
* @param pluginInfo 插件的ID |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void installPluginOnline(final String pluginInfo, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); |
||||
PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 从磁盘上选择插件安装包进行插件升级 |
||||
* |
||||
* @param filePath 插件包的路径 |
||||
*/ |
||||
public void updatePluginFromDisk(String filePath, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
File file = new File(filePath); |
||||
PluginOperateUtils.updatePluginFromDisk(file, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 修改选中的插件的活跃状态 |
||||
* |
||||
* @param pluginID 插件ID |
||||
*/ |
||||
@JSBridge |
||||
public void setPluginActive(String pluginID, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
PluginOperateUtils.setPluginActive(pluginID, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 批量修改选中的插件的活跃状态 |
||||
* |
||||
* @param pluginIDs 要处理的插件ID |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void setAllPluginActive(JSArray pluginIDs, final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
List<String> list = new ArrayList<>(); |
||||
int len = pluginIDs.length(); |
||||
for (int i = 0; i < len; i++) { |
||||
list.add(pluginIDs.get(i).asString().getValue()); |
||||
} |
||||
PluginOperateUtils.setPluginActive(list, jsCallback); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @return 选择的文件的路径 |
||||
*/ |
||||
@JSBridge |
||||
public String showFileChooser() { |
||||
return showFileChooserWithFilter(StringUtils.EMPTY, StringUtils.EMPTY); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @param des 过滤文件描述 |
||||
* @param filter 文件的后缀 |
||||
* @return 选择的文件的路径 |
||||
* 这里换用JFileChooser会卡死,不知道为什么 |
||||
*/ |
||||
@JSBridge |
||||
public String showFileChooserWithFilter(final String des, final String filter) { |
||||
RunnableFuture<String> future = new FutureTask<>(new Callable<String>() { |
||||
@Override |
||||
public String call() { |
||||
FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( |
||||
FileChooserArgs.newBuilder(). |
||||
setFileSelectionMode(FileSelectionMode.FILE). |
||||
setFilter(des, filter).build()); |
||||
int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); |
||||
if (result == JFileChooser.APPROVE_OPTION) { |
||||
return fileChooserProvider.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 |
||||
public String showFileChooserWithFilters(final String des, final Object args) { |
||||
RunnableFuture<String> future = new FutureTask<>(new Callable<String>() { |
||||
@Override |
||||
public String call() { |
||||
JFileChooser fileChooser = new JFileChooser(); |
||||
List<String> filterList = new ArrayList<>(); |
||||
if (args instanceof String) { |
||||
filterList.add(GeneralUtils.objectToString(args)); |
||||
} else if (args instanceof JSArray) { |
||||
JSArray array = (JSArray) args; |
||||
for (int i = 0, len = array.length(); i < len; i++) { |
||||
filterList.add(array.get(i).getStringValue()); |
||||
} |
||||
} |
||||
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 |
||||
public String getLoginInfo(final JSFunction callback) { |
||||
registerLoginInfo(callback); |
||||
return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
||||
} |
||||
|
||||
/** |
||||
* 系统登录注册 |
||||
* |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void registerLoginInfo(final JSFunction callback) { |
||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||
String username = DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
||||
if (StringUtils.isEmpty(username)) { |
||||
jsCallback.execute(StringUtils.EMPTY); |
||||
} else { |
||||
jsCallback.execute(username); |
||||
} |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 设计器端的用户登录 |
||||
* |
||||
* @param username 用户名 |
||||
* @param password 密码 |
||||
* @param callback 回调函数 |
||||
*/ |
||||
@JSBridge |
||||
public void defaultLogin(String username, String password, final JSFunction callback) { |
||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new PluginLoginExecutor(username, password)); |
||||
worker.execute(); |
||||
} |
||||
|
||||
/** |
||||
* 清除用户信息 |
||||
*/ |
||||
@JSBridge |
||||
public void clearUserInfo() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 打开论坛消息界面 |
||||
*/ |
||||
@JSBridge |
||||
public void getPriviteMessage() { |
||||
try { |
||||
LocaleMark<String> spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); |
||||
String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(spaceMark.getValue()); |
||||
BrowseUtils.browser(ssoUrl); |
||||
} catch (Exception exp) { |
||||
FineLoggerFactory.getLogger().info(exp.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 忘记密码 |
||||
*/ |
||||
@JSBridge |
||||
public void forgetHref() { |
||||
try { |
||||
LocaleMark<String> resetMark = LocaleCenter.getMark(BbsResetMark.class); |
||||
Desktop.getDesktop().browse(new URI(resetMark.getValue())); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 立即注册 |
||||
*/ |
||||
@JSBridge |
||||
public void registerHref() { |
||||
try { |
||||
LocaleMark<String> registerMark = LocaleCenter.getMark(BbsRegisterMark.class); |
||||
Desktop.getDesktop().browse(new URI(registerMark.getValue())); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 使用系统浏览器打开网页 |
||||
* |
||||
* @param url 要打开的网页 |
||||
*/ |
||||
@JSBridge |
||||
public void openShopUrlAtWebBrowser(String url) { |
||||
if (Desktop.isDesktopSupported()) { |
||||
try { |
||||
//创建一个URI实例,注意不是URL
|
||||
URI uri = URI.create(url); |
||||
//获取当前系统桌面扩展
|
||||
Desktop desktop = Desktop.getDesktop(); |
||||
//判断系统桌面是否支持要执行的功能
|
||||
if (desktop.isSupported(Desktop.Action.BROWSE)) { |
||||
//获取系统默认浏览器打开链接
|
||||
desktop.browse(uri); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -1,30 +0,0 @@
|
||||
package com.fr.design.upm.exec; |
||||
|
||||
import com.fr.design.bridge.exec.JSExecutor; |
||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-18 |
||||
*/ |
||||
public class UpmBrowserExecutor implements JSExecutor { |
||||
|
||||
public static UpmBrowserExecutor create(JSObject window, JSFunction callback) { |
||||
return new UpmBrowserExecutor(window, callback); |
||||
} |
||||
|
||||
private JSObject window; |
||||
private JSFunction callback; |
||||
|
||||
private UpmBrowserExecutor(JSObject window, JSFunction callback) { |
||||
this.window = window; |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public void executor(String newValue) { |
||||
callback.invoke(window, newValue); |
||||
} |
||||
} |
Loading…
Reference in new issue