forked from fanruan/design
zheng
6 years ago
40 changed files with 969 additions and 134 deletions
@ -0,0 +1,17 @@ |
|||||||
|
package com.fr.design.bridge.exec; |
||||||
|
|
||||||
|
import java.lang.annotation.ElementType; |
||||||
|
import java.lang.annotation.Retention; |
||||||
|
import java.lang.annotation.RetentionPolicy; |
||||||
|
import java.lang.annotation.Target; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-18 |
||||||
|
* 用于标记一个方法是用于和JS做桥接的,避免被误删除 |
||||||
|
*/ |
||||||
|
@Target(ElementType.METHOD) |
||||||
|
@Retention(RetentionPolicy.SOURCE) |
||||||
|
public @interface JSBridge { |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.fr.design.bridge.exec; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by ibm on 2017/5/27. |
||||||
|
*/ |
||||||
|
public class JSCallback { |
||||||
|
|
||||||
|
private JSExecutor executeScript; |
||||||
|
|
||||||
|
public JSCallback(JSExecutor jsExecutor) { |
||||||
|
this.executeScript = jsExecutor; |
||||||
|
} |
||||||
|
|
||||||
|
public void execute(String newValue) { |
||||||
|
executeScript.executor(newValue); |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -1,4 +1,4 @@ |
|||||||
package com.fr.design.extra.exe.callback; |
package com.fr.design.bridge.exec; |
||||||
|
|
||||||
/** |
/** |
||||||
* Created by ibm on 2017/6/21. |
* Created by ibm on 2017/6/21. |
@ -0,0 +1,42 @@ |
|||||||
|
package com.fr.design.extra; |
||||||
|
|
||||||
|
import com.fr.design.bridge.exec.JSExecutor; |
||||||
|
import com.fr.design.bridge.exec.JSUtils; |
||||||
|
import javafx.application.Platform; |
||||||
|
import javafx.scene.web.WebEngine; |
||||||
|
import netscape.javascript.JSObject; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-18 |
||||||
|
*/ |
||||||
|
public class PluginJavaFxExecutor implements JSExecutor { |
||||||
|
|
||||||
|
public static PluginJavaFxExecutor create(WebEngine webEngine, JSObject callback) { |
||||||
|
return new PluginJavaFxExecutor(webEngine, callback); |
||||||
|
} |
||||||
|
|
||||||
|
private WebEngine webEngine; |
||||||
|
private JSObject callback; |
||||||
|
|
||||||
|
private PluginJavaFxExecutor(WebEngine webEngine, JSObject callback) { |
||||||
|
this.webEngine = webEngine; |
||||||
|
this.callback = callback; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void executor(final String newValue) { |
||||||
|
Platform.runLater(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
String fun = "(" + callback + ")(\"" + JSUtils.trimText(newValue) + "\")"; |
||||||
|
try { |
||||||
|
webEngine.executeScript(fun); |
||||||
|
} catch (Exception e) { |
||||||
|
webEngine.executeScript("alert(\"" + e.getMessage() + "\")"); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package com.fr.design.fun; |
||||||
|
|
||||||
|
import com.fr.design.menu.MenuDef; |
||||||
|
import com.fr.start.SplashStrategy; |
||||||
|
|
||||||
|
import java.awt.image.BufferedImage; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 设计器Oem接口 |
||||||
|
*/ |
||||||
|
public interface OemProcessor { |
||||||
|
public static final String MARK_STRING = "OemProcessor"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 启动动画,如果不替换则返回null |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
SplashStrategy createSplashStrategy(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 替换标题图标--DesignerFrame.initTitleIcon |
||||||
|
* 如果不替换则返回null |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
List<BufferedImage> createTitleIcon(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 处理设计器菜单(增删改) |
||||||
|
* |
||||||
|
* @param menuDefs 已加载的菜单 |
||||||
|
* @return 新的菜单数组 |
||||||
|
*/ |
||||||
|
MenuDef[] dealWithMenuDef(MenuDef[] menuDefs); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package com.fr.design.fun.impl; |
||||||
|
|
||||||
|
import com.fr.design.fun.OemProcessor; |
||||||
|
import com.fr.design.menu.MenuDef; |
||||||
|
import com.fr.start.SplashStrategy; |
||||||
|
|
||||||
|
import java.awt.image.BufferedImage; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public abstract class AbstractOemProcessor implements OemProcessor{ |
||||||
|
@Override |
||||||
|
public MenuDef[] dealWithMenuDef(MenuDef[] menuDefs) { |
||||||
|
return menuDefs; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<BufferedImage> createTitleIcon() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public SplashStrategy createSplashStrategy() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
@ -1,31 +0,0 @@ |
|||||||
package com.fr.design.upm; |
|
||||||
|
|
||||||
import com.fr.design.upm.event.DownloadEvent; |
|
||||||
import com.fr.event.EventDispatcher; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-04-12 |
|
||||||
* 桥接Java和JavaScript的类 |
|
||||||
*/ |
|
||||||
public class UPMBridge { |
|
||||||
|
|
||||||
private static UPMBridge bridge = new UPMBridge(); |
|
||||||
|
|
||||||
public static UPMBridge getBridge() { |
|
||||||
return bridge; |
|
||||||
} |
|
||||||
|
|
||||||
public void startDownload() { |
|
||||||
// do something.....
|
|
||||||
EventDispatcher.fire(DownloadEvent.FINISH, "start"); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void closeWindow() { |
|
||||||
UPM.closeWindow(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,406 @@ |
|||||||
|
package com.fr.design.upm; |
||||||
|
|
||||||
|
import com.fr.base.passport.FinePassportManager; |
||||||
|
import com.fr.config.MarketConfig; |
||||||
|
import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; |
||||||
|
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.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.UpmBrowserExecutor; |
||||||
|
import com.fr.design.upm.task.UpmTaskWorker; |
||||||
|
import com.fr.event.EventDispatcher; |
||||||
|
import com.fr.general.CloudCenter; |
||||||
|
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.chromium.Browser; |
||||||
|
import com.teamdev.jxbrowser.chromium.JSArray; |
||||||
|
import com.teamdev.jxbrowser.chromium.JSFunction; |
||||||
|
import com.teamdev.jxbrowser.chromium.JSObject; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.filechooser.FileNameExtensionFilter; |
||||||
|
import java.awt.*; |
||||||
|
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的类 |
||||||
|
*/ |
||||||
|
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(); |
||||||
|
} |
||||||
|
|
||||||
|
public void startDownload(final JSFunction callback) { |
||||||
|
|
||||||
|
new SwingWorker<Void, Void>(){ |
||||||
|
@Override |
||||||
|
protected Void doInBackground() throws Exception { |
||||||
|
callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
||||||
|
UpmResourceLoader.INSTANCE.download(); |
||||||
|
UpmResourceLoader.INSTANCE.install(); |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void done() { |
||||||
|
try { |
||||||
|
get(); |
||||||
|
callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
||||||
|
EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); |
||||||
|
} catch (Exception e) { |
||||||
|
callback.invoke(window, Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
EventDispatcher.fire(DownloadEvent.ERROR, "error"); |
||||||
|
} |
||||||
|
} |
||||||
|
}.execute(); |
||||||
|
} |
||||||
|
|
||||||
|
@JSBridge |
||||||
|
public String i18nText(String key) { |
||||||
|
return Toolkit.i18nText(key); |
||||||
|
} |
||||||
|
|
||||||
|
@JSBridge |
||||||
|
public void closeWindow() { |
||||||
|
UpmFinder.closeWindow(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@JSBridge |
||||||
|
public boolean isDesigner() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@JSBridge |
||||||
|
public void getPackInfo(final JSFunction callback) { |
||||||
|
callback.invoke(window, StringUtils.EMPTY); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 在线获取插件分类 |
||||||
|
* |
||||||
|
* @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); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 选择文件对话框 |
||||||
|
* |
||||||
|
* @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() { |
||||||
|
JFileChooser fileChooser = new JFileChooser(); |
||||||
|
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); |
||||||
|
|
||||||
|
if (StringUtils.isNotEmpty(filter)) { |
||||||
|
fileChooser.setFileFilter(new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(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 |
||||||
|
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 MarketConfig.getInstance().getBbsUsername(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统登录注册 |
||||||
|
* |
||||||
|
* @param callback 回调函数 |
||||||
|
*/ |
||||||
|
@JSBridge |
||||||
|
public void registerLoginInfo(final JSFunction callback) { |
||||||
|
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
||||||
|
String username = MarketConfig.getInstance().getBbsUsername(); |
||||||
|
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 |
||||||
|
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(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 清除用户信息 |
||||||
|
*/ |
||||||
|
public void clearUserInfo() { |
||||||
|
MarketConfig.getInstance().setInShowBBsName(StringUtils.EMPTY); |
||||||
|
FinePassportManager.getInstance().logout(); |
||||||
|
EventDispatcher.fire(CertificateEvent.LOGOUT, StringUtils.EMPTY); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 打开论坛消息界面 |
||||||
|
*/ |
||||||
|
@JSBridge |
||||||
|
public void getPriviteMessage() { |
||||||
|
try { |
||||||
|
String loginUrl = CloudCenter.getInstance().acquireUrlByKind("bbs.default"); |
||||||
|
Desktop.getDesktop().browse(new URI(loginUrl)); |
||||||
|
} catch (Exception exp) { |
||||||
|
FineLoggerFactory.getLogger().info(exp.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 忘记密码 |
||||||
|
*/ |
||||||
|
@JSBridge |
||||||
|
public void forgetHref() { |
||||||
|
try { |
||||||
|
Desktop.getDesktop().browse(new URI(CloudCenter.getInstance().acquireUrlByKind("bbs.reset"))); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().info(e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
package com.fr.design.upm; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-18 |
||||||
|
*/ |
||||||
|
public class UpmUtils { |
||||||
|
|
||||||
|
public static String[] findMatchedExtension(String... extensions) { |
||||||
|
List<String> list = new ArrayList<>(); |
||||||
|
for (String ext : extensions) { |
||||||
|
String[] arr = ext.split("\\."); |
||||||
|
list.add(arr[arr.length - 1]); |
||||||
|
} |
||||||
|
return list.toArray(new String[0]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
package com.fr.design.upm.event; |
||||||
|
|
||||||
|
import com.fr.event.Event; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-18 |
||||||
|
*/ |
||||||
|
public enum CertificateEvent implements Event<String> { |
||||||
|
LOGIN,LOGOUT |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
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); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.fr.design.upm.loader; |
||||||
|
|
||||||
|
import com.fr.decision.webservice.bean.plugin.store.ProjectInfoBean; |
||||||
|
import com.fr.decision.webservice.v10.plugin.helper.category.impl.BaseResourceLoader; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-18 |
||||||
|
*/ |
||||||
|
public class UpmDesignResourceLoader extends BaseResourceLoader { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPluginPath() { |
||||||
|
return "upm/plugin_design.html"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void checkResourceExist(ProjectInfoBean projectInfoBean) throws Exception { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getDownloadPath() throws Exception { |
||||||
|
return "http://fanruan-market.oss-cn-shanghai.aliyuncs.com/upm/1.0/upm-10.0.zip"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package com.fr.design.upm.task; |
||||||
|
|
||||||
|
import com.fr.design.bridge.exec.JSCallback; |
||||||
|
import com.fr.design.bridge.exec.JSUtils; |
||||||
|
import com.fr.design.extra.Process; |
||||||
|
import com.fr.design.extra.exe.Command; |
||||||
|
import com.fr.design.extra.exe.Executor; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author richie |
||||||
|
* @version 10.0 |
||||||
|
* Created by richie on 2019-04-17 |
||||||
|
*/ |
||||||
|
public class UpmTaskWorker<V> extends SwingWorker<V, String> { |
||||||
|
|
||||||
|
private Executor executor; |
||||||
|
private JSCallback callback; |
||||||
|
|
||||||
|
public UpmTaskWorker(final JSCallback callback, final Executor executor) { |
||||||
|
this.executor = executor; |
||||||
|
this.callback = callback; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected V doInBackground() throws Exception { |
||||||
|
Command[] commands = executor.getCommands(); |
||||||
|
for (Command command : commands) { |
||||||
|
String message = command.getExecuteMessage(); |
||||||
|
if (StringUtils.isNotBlank(message)) { |
||||||
|
publish(message); |
||||||
|
} |
||||||
|
command.run(new Process<String>() { |
||||||
|
@Override |
||||||
|
public void process(String s) { |
||||||
|
if (StringUtils.isNotBlank(s)) { |
||||||
|
publish(JSUtils.trimText(s)); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void done() { |
||||||
|
String result = executor.getTaskFinishMessage(); |
||||||
|
callback.execute(result); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
package com.fr.start; |
||||||
|
|
||||||
|
import com.fr.design.fun.OemProcessor; |
||||||
|
import com.fr.stable.bridge.StableFactory; |
||||||
|
|
||||||
|
/** |
||||||
|
* OEM处理中心 |
||||||
|
*/ |
||||||
|
public class OemHandler { |
||||||
|
|
||||||
|
public static OemProcessor findOem() { |
||||||
|
return StableFactory.getMarkedInstanceObjectFromClass(OemProcessor.MARK_STRING, OemProcessor.class); |
||||||
|
} |
||||||
|
} |
@ -1,20 +1,61 @@ |
|||||||
window.onload = function () { |
window.onload = function () { |
||||||
let button = BI.createWidget({ |
let label = BI.createWidget({ |
||||||
|
type: "bi.label", |
||||||
|
text: PluginHelper.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Resource_Warn"), |
||||||
|
height: 30 |
||||||
|
}); |
||||||
|
let callback = function(text) { |
||||||
|
download.setValue(text); |
||||||
|
}; |
||||||
|
let buttonOK = BI.createWidget({ |
||||||
type: "bi.button", |
type: "bi.button", |
||||||
text : "点击我跳转到插件商店", |
text: PluginHelper.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download"), |
||||||
level: 'common', |
level: 'common', |
||||||
height: 30, |
height: 30, |
||||||
handler: function () { |
handler: function () { |
||||||
PluginBridgeTest.startDownload(); |
PluginHelper.startDownload(callback); |
||||||
} |
} |
||||||
}); |
}); |
||||||
|
let buttonClose = BI.createWidget({ |
||||||
|
type: "bi.button", |
||||||
|
text: PluginHelper.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Close"), |
||||||
|
level: 'warning', |
||||||
|
height: 30, |
||||||
|
handler: function () { |
||||||
|
PluginHelper.closeWindow(); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
let download = BI.createWidget({ |
||||||
|
type: "bi.label", |
||||||
|
height: 30 |
||||||
|
}); |
||||||
|
let left = 300; |
||||||
|
let top = 200; |
||||||
BI.createWidget({ |
BI.createWidget({ |
||||||
type: "bi.absolute", |
type: "bi.absolute", |
||||||
element: "body", |
element: "body", |
||||||
items: [{ |
items: [ |
||||||
el: button, |
{ |
||||||
left: 100, |
el: label, |
||||||
top: 100 |
left: left, |
||||||
}] |
top: top |
||||||
|
}, |
||||||
|
{ |
||||||
|
el : buttonOK, |
||||||
|
left : left, |
||||||
|
top : top + 40 |
||||||
|
}, |
||||||
|
{ |
||||||
|
el : buttonClose, |
||||||
|
left : left + 100, |
||||||
|
top : top + 40 |
||||||
|
}, |
||||||
|
{ |
||||||
|
el : download, |
||||||
|
left : left, |
||||||
|
top : top + 80 |
||||||
|
} |
||||||
|
] |
||||||
}); |
}); |
||||||
}; |
}; |
Loading…
Reference in new issue