alex.sung
5 years ago
326 changed files with 12538 additions and 3109 deletions
@ -0,0 +1,41 @@
|
||||
package com.fr.design.actions.community; |
||||
|
||||
import com.fr.design.menu.MenuKeySet; |
||||
import com.fr.design.utils.BrowseUtils; |
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.IOUtils; |
||||
|
||||
import javax.swing.KeyStroke; |
||||
import java.awt.event.ActionEvent; |
||||
|
||||
public class FacebookFansAction extends UpAction { |
||||
|
||||
public FacebookFansAction() { |
||||
this.setMenuKeySet(FACEBOOKFANS); |
||||
this.setName(getMenuKeySet().getMenuName()); |
||||
this.setMnemonic(getMenuKeySet().getMnemonic()); |
||||
this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/bbs/facebook.png")); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(ActionEvent arg0) { |
||||
BrowseUtils.browser(CloudCenter.getInstance().acquireUrlByKind("facebook.fans.tw")); |
||||
} |
||||
|
||||
public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { |
||||
@Override |
||||
public char getMnemonic() { |
||||
return 'F'; |
||||
} |
||||
|
||||
@Override |
||||
public String getMenuName() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community_FaceBook_Fans"); |
||||
} |
||||
|
||||
@Override |
||||
public KeyStroke getKeyStroke() { |
||||
return null; |
||||
} |
||||
}; |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.fr.design.actions.help; |
||||
|
||||
import com.fr.design.actions.UpdateAction; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.design.ui.ModernUIPane; |
||||
import com.fr.locale.InterProviderFactory; |
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.impl.FineUI; |
||||
|
||||
import java.awt.event.ActionEvent; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-03-08 |
||||
*/ |
||||
public class FineUIAction extends UpdateAction { |
||||
|
||||
public FineUIAction() { |
||||
setName("FineUI"); |
||||
} |
||||
|
||||
@Override |
||||
public void actionPerformed(final ActionEvent e) { |
||||
ModernUIPane<?> pane = new ModernUIPane.Builder<>() |
||||
// .prepare(new ScriptContextAdapter() {
|
||||
// @Override
|
||||
// public void onScriptContextCreated(ScriptContextEvent event) {
|
||||
// JSValue pool = event.getBrowser().executeJavaScriptAndReturnValue("window.Pool");
|
||||
// pool.asObject().setProperty("i18n", new I18n());
|
||||
// }
|
||||
// })
|
||||
.withComponent(new AssembleComponent() { |
||||
|
||||
@Override |
||||
public ScriptPath script(RequestClient req) { |
||||
return ScriptPath.build("/com/fr/design/ui/help/demo.js"); |
||||
} |
||||
|
||||
@Override |
||||
public Atom[] refer() { |
||||
return new Atom[] {FineUI.KEY}; |
||||
} |
||||
}) |
||||
.build(); |
||||
BasicDialog dialog = pane.showLargeWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||
@Override |
||||
public void doOk() { |
||||
|
||||
} |
||||
}); |
||||
dialog.setVisible(true); |
||||
|
||||
} |
||||
|
||||
public static class I18n { |
||||
|
||||
public String i18nText(String key) { |
||||
return InterProviderFactory.getProvider().getLocText(key); |
||||
} |
||||
} |
||||
} |
@ -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. |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.constants; |
||||
|
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Null; |
||||
|
||||
/** |
||||
* 设计器启动事件类型 |
||||
* |
||||
* @author vito |
||||
* @date 2019-06-18 |
||||
*/ |
||||
public enum DesignerLaunchStatus implements Event<Null> { |
||||
/** |
||||
* 初始化环境完成 |
||||
*/ |
||||
WORKSPACE_INIT_COMPLETE, |
||||
|
||||
/** |
||||
* 设计器模块启动完成 |
||||
*/ |
||||
DESIGNER_INIT_COMPLETE, |
||||
|
||||
/** |
||||
* 启动完成 |
||||
*/ |
||||
OPEN_LAST_FILE_COMPLETE; |
||||
|
||||
private static DesignerLaunchStatus status; |
||||
|
||||
public static DesignerLaunchStatus getStatus() { |
||||
return status; |
||||
} |
||||
|
||||
public static void setStatus(DesignerLaunchStatus state) { |
||||
status = state; |
||||
EventDispatcher.asyncFire(DesignerLaunchStatus.getStatus()); |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.dcm; |
||||
|
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
import com.fr.web.struct.impl.FineUI; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-05-16 |
||||
*/ |
||||
public class UniversalDatabaseComponent extends AssembleComponent { |
||||
|
||||
public static final UniversalDatabaseComponent KEY = new UniversalDatabaseComponent(); |
||||
|
||||
private UniversalDatabaseComponent() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public ScriptPath script(RequestClient req) { |
||||
return ScriptPath.build("/com/fr/design/dcm/index.js"); |
||||
} |
||||
|
||||
@Override |
||||
public StylePath style(RequestClient req) { |
||||
return StylePath.build("/com/fr/design/dcm/style.css"); |
||||
} |
||||
|
||||
@Override |
||||
public Atom[] refer() { |
||||
return new Atom[]{ |
||||
FineUI.KEY |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.design.dcm; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-05-16 |
||||
*/ |
||||
public class UniversalDatabaseDialog extends UIDialog { |
||||
|
||||
public UniversalDatabaseDialog(Frame frame, BasicPane pane) { |
||||
super(frame); |
||||
setUndecorated(true); |
||||
JPanel panel = (JPanel) getContentPane(); |
||||
panel.setLayout(new BorderLayout()); |
||||
add(pane, BorderLayout.CENTER); |
||||
setSize(new Dimension(1000, 600)); |
||||
GUICoreUtils.centerWindow(this); |
||||
setResizable(false); |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
|
||||
} |
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.dcm; |
||||
|
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
|
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-05-16 |
||||
*/ |
||||
public class UniversalDatabaseOpener { |
||||
|
||||
private static UIDialog dialog = null; |
||||
|
||||
public static UIDialog getDialog() { |
||||
return dialog; |
||||
} |
||||
|
||||
public static void showUniverseDatabaseDialog() { |
||||
UniversalDatabasePane upmPane = new UniversalDatabasePane(); |
||||
if (dialog == null) { |
||||
dialog = new UniversalDatabaseDialog(DesignerContext.getDesignerFrame(), upmPane); |
||||
} |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
public static void closeWindow() { |
||||
if (dialog != null) { |
||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||
dialog.setVisible(false); |
||||
dialog = null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.dcm; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.ui.ModernUIPane; |
||||
import com.teamdev.jxbrowser.chromium.JSValue; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; |
||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; |
||||
|
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-05-16 |
||||
*/ |
||||
public class UniversalDatabasePane extends BasicPane { |
||||
|
||||
private ModernUIPane<Object> modernUIPane; |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "Database"; |
||||
} |
||||
|
||||
public UniversalDatabasePane() { |
||||
setLayout(new BorderLayout()); |
||||
modernUIPane = new ModernUIPane.Builder<>() |
||||
.withComponent(UniversalDatabaseComponent.KEY) |
||||
.prepare(new ScriptContextAdapter() { |
||||
@Override |
||||
public void onScriptContextCreated(ScriptContextEvent event) { |
||||
JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); |
||||
window.asObject().setProperty("DcmHelper", UniversalDcmBridge.getBridge(event.getBrowser())); |
||||
} |
||||
}) |
||||
.build(); |
||||
add(modernUIPane, BorderLayout.CENTER); |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fr.design.dcm; |
||||
|
||||
import com.fr.decision.webservice.bean.BaseBean; |
||||
import com.fr.design.bridge.exec.JSBridge; |
||||
import com.teamdev.jxbrowser.chromium.Browser; |
||||
import com.teamdev.jxbrowser.chromium.JSObject; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-05-17 |
||||
* 桥接Java和JavaScript的类 |
||||
*/ |
||||
public class UniversalDcmBridge { |
||||
|
||||
public static UniversalDcmBridge getBridge(Browser browser) { |
||||
return new UniversalDcmBridge(browser); |
||||
} |
||||
|
||||
private JSObject window; |
||||
|
||||
private UniversalDcmBridge(Browser browser) { |
||||
this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); |
||||
} |
||||
|
||||
/** |
||||
* 获取所有的数据连接 |
||||
* @return 数据连接集合 |
||||
*/ |
||||
@JSBridge |
||||
public BaseBean getConnections() { |
||||
return null; |
||||
} |
||||
} |
@ -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; |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.locale.impl; |
||||
|
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.locale.LocaleMark; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Hades |
||||
* @date 2019/6/24 |
||||
*/ |
||||
public class ProductImproveMark implements LocaleMark<Boolean> { |
||||
|
||||
private Map<Locale, Boolean> map = new HashMap<>(); |
||||
|
||||
public ProductImproveMark() { |
||||
map.put(Locale.CHINA, true); |
||||
map.put(Locale.TAIWAN, false); |
||||
map.put(Locale.US, false); |
||||
map.put(Locale.KOREA, false); |
||||
map.put(Locale.JAPAN, false); |
||||
} |
||||
|
||||
@Override |
||||
public Boolean getValue() { |
||||
Boolean result = map.get(GeneralContext.getLocale()); |
||||
return result == null ? false : result; |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.locale.impl; |
||||
|
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.locale.LocaleMark; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Hades |
||||
* @date 2019/6/24 |
||||
*/ |
||||
public class SplashMark implements LocaleMark<String> { |
||||
|
||||
private Map<Locale, String> map = new HashMap<Locale, String>(); |
||||
private static final String SPLASH_PATH = "/com/fr/design/images/splash_10.gif"; |
||||
private static final String SPLASH_EN_PATH = "/com/fr/design/images/splash_10_en.gif"; |
||||
private static final String SPLASH_JP_PATH = "/com/fr/design/images/splash_10_jp.gif"; |
||||
|
||||
public SplashMark() { |
||||
map.put(Locale.CHINA, SPLASH_PATH); |
||||
map.put(Locale.KOREA, SPLASH_EN_PATH); |
||||
map.put(Locale.JAPAN, SPLASH_JP_PATH); |
||||
map.put(Locale.US, SPLASH_EN_PATH); |
||||
map.put(Locale.TAIWAN, SPLASH_EN_PATH); |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() { |
||||
String result = map.get(DesignerEnvManager.getEnvManager().getLanguage()); |
||||
return result == null ? SPLASH_EN_PATH : result; |
||||
} |
||||
} |
@ -0,0 +1,44 @@
|
||||
package com.fr.design.locale.impl; |
||||
|
||||
import com.fr.general.locale.SupportLocale; |
||||
|
||||
import java.util.HashSet; |
||||
import java.util.Locale; |
||||
import java.util.Set; |
||||
|
||||
/** |
||||
* 某些国际化环境支持的操作 |
||||
* 需要增加/删除支持的语言 统一在这里修改 无须改动业务代码 |
||||
* 后续有新的不同语言下的差异操作 添加新的枚举 |
||||
* @author Hades |
||||
* @date 2019/6/24 |
||||
*/ |
||||
public enum SupportLocaleImpl implements SupportLocale { |
||||
|
||||
/** |
||||
* 社区菜单支持的国际化环境 |
||||
*/ |
||||
COMMUNITY { |
||||
@Override |
||||
public Set<Locale> support() { |
||||
Set<Locale> set = new HashSet<Locale>(); |
||||
set.add(Locale.CHINA); |
||||
set.add(Locale.TAIWAN); |
||||
return set; |
||||
} |
||||
}, |
||||
|
||||
/** |
||||
* Facebook支持的国际化环境 |
||||
*/ |
||||
FACEBOOK { |
||||
@Override |
||||
public Set<Locale> support() { |
||||
Set<Locale> set = new HashSet<Locale>(); |
||||
set.add(Locale.TAIWAN); |
||||
return set; |
||||
} |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,36 @@
|
||||
package com.fr.design.locale.impl; |
||||
|
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.locale.LocaleMark; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Hades |
||||
* @date 2019/6/24 |
||||
*/ |
||||
public class UserInfoMark implements LocaleMark<String> { |
||||
|
||||
private Map<Locale, String> map = new HashMap<>(); |
||||
private static final String CN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.cn"); |
||||
private static final String EN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.en"); |
||||
private static final String TW_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.tw"); |
||||
private static final String JP_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.jp"); |
||||
|
||||
public UserInfoMark() { |
||||
map.put(Locale.CHINA, CN_LOGIN_HTML); |
||||
map.put(Locale.KOREA, EN_LOGIN_HTML); |
||||
map.put(Locale.JAPAN, JP_LOGIN_HTML); |
||||
map.put(Locale.US, EN_LOGIN_HTML); |
||||
map.put(Locale.TAIWAN, TW_LOGIN_HTML); |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() { |
||||
String result = map.get(GeneralContext.getLocale()); |
||||
return result == null ? EN_LOGIN_HTML : result; |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.locale.impl; |
||||
|
||||
import com.fr.general.CloudCenter; |
||||
import com.fr.general.GeneralContext; |
||||
import com.fr.general.locale.LocaleMark; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Hades |
||||
* @date 2019/6/24 |
||||
*/ |
||||
public class VideoMark implements LocaleMark<String> { |
||||
|
||||
private Map<Locale, String> map = new HashMap<>(); |
||||
private static final String VIDEO_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.en"); |
||||
private static final String VIDEO_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.video"); |
||||
private static final String VIDEO_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.video.tw"); |
||||
|
||||
public VideoMark() { |
||||
map.put(Locale.CHINA, VIDEO_CN); |
||||
map.put(Locale.KOREA, VIDEO_EN); |
||||
map.put(Locale.JAPAN, VIDEO_EN); |
||||
map.put(Locale.US, VIDEO_EN); |
||||
map.put(Locale.TAIWAN, VIDEO_TW); |
||||
} |
||||
|
||||
@Override |
||||
public String getValue() { |
||||
String result = map.get(GeneralContext.getLocale()); |
||||
return result == null ? VIDEO_EN : result; |
||||
} |
||||
} |
@ -0,0 +1,11 @@
|
||||
package com.fr.design.mainframe; |
||||
|
||||
import com.fr.event.Event; |
||||
|
||||
public enum DesignAuthorityEventType implements Event<DesignerFrame> { |
||||
|
||||
// 退出权限编辑
|
||||
StartEdit, |
||||
// 进入权限编辑
|
||||
StopEdit; |
||||
} |
@ -0,0 +1,82 @@
|
||||
package com.fr.design.mainframe.loghandler; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.third.apache.log4j.Level; |
||||
import com.fr.third.apache.log4j.spi.LoggingEvent; |
||||
import com.fr.third.apache.log4j.spi.ThrowableInformation; |
||||
|
||||
/** |
||||
* 设计器日志记录 |
||||
*/ |
||||
public class DesignerLogger { |
||||
public static final int INFO_INT = Level.INFO.toInt(); |
||||
|
||||
public static final int ERROR_INT = Level.ERROR.toInt(); |
||||
|
||||
public static final int WARN_INT = Level.WARN.toInt(); |
||||
|
||||
/** |
||||
* 记录LoggingEvent对象 |
||||
* |
||||
* @param event |
||||
*/ |
||||
public static void log(LoggingEvent event) { |
||||
if (event == null) { |
||||
return; |
||||
} |
||||
LogParser.parse(event).log(event); |
||||
} |
||||
|
||||
public enum LogParser { |
||||
DEFAULT(-1) { |
||||
@Override |
||||
public void log(LoggingEvent event) { |
||||
|
||||
} |
||||
}, |
||||
INFO(Level.INFO.toInt()) { |
||||
@Override |
||||
public void log(LoggingEvent event) { |
||||
FineLoggerFactory.getLogger().info(event.getRenderedMessage()); |
||||
} |
||||
}, |
||||
WARN(Level.WARN.toInt()) { |
||||
@Override |
||||
public void log(LoggingEvent event) { |
||||
ThrowableInformation information = event.getThrowableInformation(); |
||||
FineLoggerFactory.getLogger().warn(event.getRenderedMessage(), information == null ? null : information.getThrowable()); |
||||
} |
||||
}, |
||||
|
||||
ERROR(Level.ERROR.toInt()) { |
||||
@Override |
||||
public void log(LoggingEvent event) { |
||||
ThrowableInformation information = event.getThrowableInformation(); |
||||
FineLoggerFactory.getLogger().error(event.getRenderedMessage(), information == null ? null : information.getThrowable()); |
||||
} |
||||
}; |
||||
private int level; |
||||
|
||||
LogParser(int level) { |
||||
this.level = level; |
||||
} |
||||
|
||||
public int getLevel() { |
||||
return level; |
||||
} |
||||
|
||||
public static LogParser parse(LoggingEvent event) { |
||||
int intLevel = event.getLevel().toInt(); |
||||
for (LogParser logParser : values()) { |
||||
if (logParser.getLevel() == intLevel) { |
||||
return logParser; |
||||
} |
||||
} |
||||
return DEFAULT; |
||||
|
||||
} |
||||
|
||||
public void log(LoggingEvent event) { |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.fr.design.mainframe.vcs.ui; |
||||
|
||||
import com.fr.design.editor.editor.DateEditor; |
||||
import com.fr.log.FineLoggerFactory; |
||||
|
||||
import java.text.ParseException; |
||||
import java.util.Date; |
||||
|
||||
/** |
||||
* Created by XiaXiang on 2019/5/14. |
||||
*/ |
||||
public class VcsDateEditor extends DateEditor { |
||||
private Date tempValue; |
||||
|
||||
public VcsDateEditor(Date value, boolean format, String name, int dateFormat) { |
||||
super(value, format, name, dateFormat); |
||||
this.tempValue = value; |
||||
} |
||||
|
||||
@Override |
||||
public Date getValue() { |
||||
if (tempValue == null) { |
||||
return null; |
||||
} |
||||
return super.getValue(); |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(Date value) { |
||||
this.tempValue = value; |
||||
try { |
||||
getUiDatePicker().setSelectedDate(value); |
||||
} catch (ParseException parseException) { |
||||
FineLoggerFactory.getLogger().error(parseException.getMessage(), parseException); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@
|
||||
package com.fr.design.mainframe.vcs.ui; |
||||
|
||||
|
||||
import com.fr.design.gui.ilable.ActionLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Graphics; |
||||
|
||||
/** |
||||
* Created by XiaXiang on 2019/5/15. |
||||
*/ |
||||
public class VcsLabel extends ActionLabel { |
||||
|
||||
|
||||
public VcsLabel(String text, Color color) { |
||||
super(text); |
||||
this.setForeground(color); |
||||
} |
||||
|
||||
public void paintComponent(Graphics g) { |
||||
if (ui != null) { |
||||
Graphics scratchGraphics = (g == null) ? null : g.create(); |
||||
try { |
||||
ui.update(scratchGraphics, this); |
||||
} |
||||
finally { |
||||
scratchGraphics.dispose(); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,468 @@
|
||||
package com.fr.design.upm; |
||||
|
||||
import com.fr.base.passport.FinePassportManager; |
||||
import com.fr.config.MarketConfig; |
||||
import com.fr.config.ServerPreferenceConfig; |
||||
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.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.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(); |
||||
} |
||||
|
||||
/** |
||||
* 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) |
||||
* @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() { |
||||
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); |
||||
} |
||||
|
||||
/** |
||||
* 选择文件对话框 |
||||
* |
||||
* @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()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 使用系统浏览器打开网页 |
||||
* @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); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,68 @@
|
||||
package com.fr.design.upm; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.mainframe.DesignerContext; |
||||
import com.fr.event.Event; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.event.Listener; |
||||
import com.fr.stable.StableUtils; |
||||
import com.fr.workspace.Workspace; |
||||
import com.fr.workspace.WorkspaceEvent; |
||||
|
||||
import javax.swing.*; |
||||
import java.io.File; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-12 |
||||
*/ |
||||
public class UpmFinder { |
||||
|
||||
private static final String UPM_DIR = "/upm"; |
||||
private static final String MAIN_RESOURCE_PATH = UPM_DIR + "/plugin_design.html"; |
||||
|
||||
public static String installHome = FRContext.getCommonOperator().getWebRootPath(); |
||||
|
||||
private static UIDialog dialog = null; |
||||
|
||||
static { |
||||
EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener<Workspace>() { |
||||
@Override |
||||
public void on(Event event, Workspace param) { |
||||
installHome = FRContext.getCommonOperator().getWebRootPath(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public static boolean checkUPMResourcesExist() { |
||||
String mainJsPath = StableUtils.pathJoin(installHome, MAIN_RESOURCE_PATH); |
||||
File file = new File(mainJsPath); |
||||
return file.exists(); |
||||
} |
||||
|
||||
public static String getMainResourcePath() { |
||||
return "file:///" + StableUtils.pathJoin(installHome, MAIN_RESOURCE_PATH); |
||||
} |
||||
|
||||
public static UIDialog getDialog() { |
||||
return dialog; |
||||
} |
||||
|
||||
public static void showUPMDialog() { |
||||
UpmShowPane upmPane = new UpmShowPane(); |
||||
if (dialog == null) { |
||||
dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); |
||||
} |
||||
dialog.setVisible(true); |
||||
} |
||||
|
||||
public static void closeWindow() { |
||||
if (dialog != null) { |
||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
||||
dialog.setVisible(false); |
||||
dialog = null; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.fr.design.upm; |
||||
|
||||
import com.fr.design.dialog.BasicPane; |
||||
import com.fr.design.dialog.UIDialog; |
||||
import com.fr.design.utils.gui.GUICoreUtils; |
||||
import com.fr.stable.StableUtils; |
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* @author richie |
||||
* @version 10.0 |
||||
* Created by richie on 2019-04-12 |
||||
*/ |
||||
public class UpmShowDialog extends UIDialog { |
||||
|
||||
private static final Dimension DEFAULT_SHOP = new Dimension(900, 700); |
||||
|
||||
public UpmShowDialog(Frame frame, BasicPane pane) { |
||||
super(frame); |
||||
setUndecorated(true); |
||||
JPanel panel = (JPanel) getContentPane(); |
||||
panel.setLayout(new BorderLayout()); |
||||
add(pane, BorderLayout.CENTER); |
||||
setSize(DEFAULT_SHOP); |
||||
GUICoreUtils.centerWindow(this); |
||||
setResizable(false); |
||||
} |
||||
|
||||
@Override |
||||
public void checkValid() throws Exception { |
||||
} |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue