Browse Source

Merge pull request #865 in DESIGN/design from ~NEIL/design:feature/10.0 to feature/10.0

* commit '0607a3a28becedb39f18d73b3ac11fc5aeaef727': (81 commits)
  REPORT-16527 @xiaoxia 通过直接预览触发的模版保存,该模版不会保存新版本
  REPORT-16559 @xiaoxia 远程设计,开启模版版本保存,修改模版保存不会产生新版本
  REPORT-16527 @xiaoxia 通过直接预览触发的模版保存,该模版不会保存新版本
  REPORT-16550 模板搜索问题
  REPORT-16520 @xiaoxia 设计器内打开多模版,进入模版版本管理会“卡住”
  REPORT-16568 @xiaoxia 多人远程设计时,第一个用户未打开模板,直接进入版本控制,模版不会上锁且能正常进入版本管理
  get&set
  DEC-7537 设计器平台url的问题
  import
  移包
  无JIRA任务,build failed, 错误的import
  ct
  c
  ct
  ct
  ct
  ct
  ct
  ct
  代码质量
  ...
research/10.0
neil 5 years ago
parent
commit
6cecdc3694
  1. 2
      designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
  2. 20
      designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java
  3. 15
      designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java
  4. 67
      designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java
  5. 14
      designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java
  6. 17
      designer-base/src/main/java/com/fr/design/bridge/exec/JSBridge.java
  7. 18
      designer-base/src/main/java/com/fr/design/bridge/exec/JSCallback.java
  8. 2
      designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java
  9. 58
      designer-base/src/main/java/com/fr/design/bridge/exec/JSUtils.java
  10. 1
      designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java
  11. 27
      designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java
  12. 6
      designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java
  13. 26
      designer-base/src/main/java/com/fr/design/dialog/BasicPane.java
  14. 42
      designer-base/src/main/java/com/fr/design/extra/PluginJavaFxExecutor.java
  15. 2
      designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java
  16. 20
      designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java
  17. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java
  18. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java
  19. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java
  20. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java
  21. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java
  22. 1
      designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java
  23. 7
      designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
  24. 38
      designer-base/src/main/java/com/fr/design/fun/OemProcessor.java
  25. 25
      designer-base/src/main/java/com/fr/design/fun/impl/AbstractOemProcessor.java
  26. 3
      designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java
  27. 32
      designer-base/src/main/java/com/fr/design/javascript/beautify/JavaScriptFormatHelper.java
  28. 11
      designer-base/src/main/java/com/fr/design/mainframe/DesignAuthorityEventType.java
  29. 19
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
  30. 8
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
  31. 9
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  32. 24
      designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java
  33. 12
      designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java
  34. 1
      designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java
  35. 4
      designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java
  36. 28
      designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java
  37. 1
      designer-base/src/main/java/com/fr/design/ui/Assistant.java
  38. 34
      designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java
  39. 82
      designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java
  40. 6
      designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java
  41. 7
      designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java
  42. 406
      designer-base/src/main/java/com/fr/design/upm/UpmBridge.java
  43. 68
      designer-base/src/main/java/com/fr/design/upm/UpmFinder.java
  44. 34
      designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java
  45. 63
      designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java
  46. 21
      designer-base/src/main/java/com/fr/design/upm/UpmUtils.java
  47. 33
      designer-base/src/main/java/com/fr/design/upm/WarnComponent.java
  48. 12
      designer-base/src/main/java/com/fr/design/upm/event/CertificateEvent.java
  49. 13
      designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java
  50. 30
      designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java
  51. 27
      designer-base/src/main/java/com/fr/design/upm/loader/UpmDesignResourceLoader.java
  52. 52
      designer-base/src/main/java/com/fr/design/upm/task/UpmTaskWorker.java
  53. 203
      designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
  54. 26
      designer-base/src/main/java/com/fr/design/utils/DesignerPort.java
  55. 14
      designer-base/src/main/java/com/fr/design/utils/gui/UIComponentUtils.java
  56. 2
      designer-base/src/main/java/com/fr/design/web/CustomIconPane.java
  57. 93
      designer-base/src/main/java/com/fr/file/AbstractFILE.java
  58. 2
      designer-base/src/main/java/com/fr/file/FileFILE.java
  59. 26
      designer-base/src/main/java/com/fr/file/FileNodeFILE.java
  60. 102
      designer-base/src/main/java/com/fr/file/RenameExportFILE.java
  61. 34
      designer-base/src/main/java/com/fr/file/StashedFILE.java
  62. 14
      designer-base/src/main/java/com/fr/start/OemHandler.java
  63. 3
      designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java
  64. 6
      designer-base/src/main/resources/com/fr/design/ui/InitNameSpace.js
  65. 61
      designer-base/src/main/resources/com/fr/design/upm/warn.js
  66. 6
      designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java
  67. 9
      designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java
  68. 40
      designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamComponent.java
  69. 29
      designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamDemo.java
  70. 40
      designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingComponent.java
  71. 28
      designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java
  72. 6
      designer-base/src/test/resources/com/fr/design/ui/demo.html
  73. 12
      designer-base/src/test/resources/com/fr/design/ui/script/css/js/common/settingtab/settingtab.css
  74. 0
      designer-base/src/test/resources/com/fr/design/ui/script/css/js/index.css
  75. 41
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/bar.container.js
  76. 89
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/edit.list.js
  77. 33
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/form.rowbackground.setting.js
  78. 54
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/globalsingle.combo.js
  79. 53
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/leavesetting.js
  80. 53
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/reportshow.location.js
  81. 59
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/settingtab/settingtab.js
  82. 17
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/settingtab/settingtab.less
  83. 53
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/sheetlabel.position.js
  84. 126
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/toobar/toobar.js
  85. 42
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/toobar/toolbar.region.js
  86. 67
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/toolbarHeight.select.js
  87. 47
      designer-base/src/test/resources/com/fr/design/ui/script/js/common/usetoolbar.js
  88. 30
      designer-base/src/test/resources/com/fr/design/ui/script/js/enum.js
  89. 53
      designer-base/src/test/resources/com/fr/design/ui/script/js/i18n.js
  90. 1
      designer-base/src/test/resources/com/fr/design/ui/script/js/index.less
  91. 59
      designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/data.analysis.js
  92. 69
      designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/form.page.js
  93. 66
      designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/page.preview.js
  94. 33
      designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/reportserver.constants.js
  95. 50
      designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/reportserver.js
  96. 64
      designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/card/form.page.js
  97. 73
      designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/card/page.preview.js
  98. 69
      designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/templateweb.constants.js
  99. 48
      designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/templateweb.js
  100. 12
      designer-base/src/test/resources/com/fr/design/ui/script/report.css
  101. Some files were not shown because too many files have changed in this diff Show More

2
designer-base/src/main/java/com/fr/design/DesignerEnvManager.java

@ -182,6 +182,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
public static DesignerEnvManager getEnvManager(boolean needCheckEnv) {
if (designerEnvManager == null) {
designerEnvManager = new DesignerEnvManager();
//REPORT-15332有一个国际化调用比较早,需要在这边就设置好locale,由于后台GeneralContext默认是China
GeneralContext.setLocale(designerEnvManager.getLanguage());
try {
XMLTools.readFileXML(designerEnvManager, designerEnvManager.getDesignerEnvFile());
} catch (Exception e) {

20
designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java

@ -2,6 +2,7 @@ package com.fr.design.actions.file;
import com.fr.base.BaseUtils;
import com.fr.config.Configuration;
import com.fr.config.ServerPreferenceConfig;
import com.fr.design.DesignerEnvManager;
import com.fr.design.RestartHelper;
import com.fr.design.dialog.BasicDialog;
@ -136,6 +137,7 @@ public class PreferencePane extends BasicPane {
private UICheckBox oracleSpace;
private UISpinner cachingTemplateSpinner;
private UICheckBox openDebugComboBox;
private UICheckBox useOptimizedUPMCheckbox;
private UICheckBox joinProductImproveCheckBox;
private UICheckBox autoPushUpdateCheckBox;
@ -190,6 +192,11 @@ public class PreferencePane extends BasicPane {
debuggerPane.add(openDebugComboBox, BorderLayout.CENTER);
advancePane.add(debuggerPane);
JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager"));
useOptimizedUPMCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager"));
upmSelectorPane.add(useOptimizedUPMCheckbox);
advancePane.add(upmSelectorPane);
JPanel improvePane = FRGUIPaneFactory.createVerticalTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Product_Improve"));
joinProductImproveCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Join_Product_Improve"));
improvePane.add(joinProductImproveCheckBox);
@ -630,6 +637,7 @@ public class PreferencePane extends BasicPane {
this.portEditor.setValue(new Integer(designerEnvManager.getEmbedServerPort()));
openDebugComboBox.setSelected(designerEnvManager.isOpenDebug());
useOptimizedUPMCheckbox.setSelected(ServerPreferenceConfig.getInstance().isUseOptimizedUPM());
this.oracleSpace.setSelected(designerEnvManager.isOracleSystemSpace());
this.cachingTemplateSpinner.setValue(designerEnvManager.getCachingTemplateLimit());
@ -725,6 +733,18 @@ public class PreferencePane extends BasicPane {
}
});
Configurations.update(new Worker() {
@Override
public void run() {
ServerPreferenceConfig.getInstance().setUseOptimizedUPM(useOptimizedUPMCheckbox.isSelected());
}
@Override
public Class<? extends Configuration>[] targets() {
return new Class[] {ServerPreferenceConfig.class};
}
});
}

15
designer-base/src/main/java/com/fr/design/actions/file/export/AbstractExportAction.java

@ -1,7 +1,7 @@
package com.fr.design.actions.file.export;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.actions.JTemplateAction;
import com.fr.design.base.mode.DesignModeContext;
import com.fr.design.gui.iprogressbar.FRProgressBar;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
@ -9,6 +9,7 @@ import com.fr.design.mainframe.JTemplate;
import com.fr.exception.RemoteDesignPermissionDeniedException;
import com.fr.file.FILE;
import com.fr.file.FILEChooserPane;
import com.fr.file.RenameExportFILE;
import com.fr.file.filter.ChooseFileFilter;
import com.fr.io.exporter.DesignExportType;
import com.fr.io.exporter.ExporterKey;
@ -92,12 +93,17 @@ public abstract class AbstractExportAction<E extends JTemplate<?, ?>> extends JT
int saveValue = fileChooserPane.showSaveDialog(DesignerContext.getDesignerFrame(), "." + this.getDefaultExtension());
if (saveValue == FILEChooserPane.JOPTIONPANE_OK_OPTION || saveValue == FILEChooserPane.OK_OPTION) {
FILE target = fileChooserPane.getSelectedFILE();
//rename 方式导出
target = RenameExportFILE.create(target);
try {
target.mkfile();
} catch (Exception exp) {
FineLoggerFactory.getLogger().error("Error In Make New File", exp);
}
FineLoggerFactory.getLogger().info("\"" + target.getName() + "\"" + Toolkit.i18nText("Fine-Design_Report_Prepare_Export") + "!");
FineLoggerFactory.getLogger().info(
"\"" + RenameExportFILE.recoverFileName(target.getName()) + "\"" +
Toolkit.i18nText("Fine-Design_Report_Prepare_Export") + "!"
);
progressbar = new FRProgressBar(
createExportWork(getSource(), target, para),
@ -124,7 +130,7 @@ public abstract class AbstractExportAction<E extends JTemplate<?, ?>> extends JT
private boolean processNotSaved() {
//当前编辑的模板
E e = getEditingComponent();
if (!e.isALLSaved() && !DesignerMode.isVcsMode()) {
if (!e.isALLSaved() && !DesignModeContext.isVcsMode()) {
e.stopEditing();
int returnVal = JOptionPane.showConfirmDialog(
DesignerContext.getDesignerFrame(),
@ -149,7 +155,7 @@ public abstract class AbstractExportAction<E extends JTemplate<?, ?>> extends JT
private SwingWorker createExportWork(final FILE source, final FILE target, final Map<String, Object> parameterMap) {
final String path = source.getPath();
final String name = target.getName();
final String name = RenameExportFILE.recoverFileName(target.getName());
return new SwingWorker<Void, Void>() {
@ -162,7 +168,6 @@ public abstract class AbstractExportAction<E extends JTemplate<?, ?>> extends JT
dealExporter(outputStream, path, parameterMap);
this.setProgress(80);
outputStream.flush();
outputStream.close();
this.setProgress(100);
FineLoggerFactory.getLogger().info("\"" + name + "\"" + Toolkit.i18nText("Fine-Design_Report_Finish_Export") + "!");

67
designer-base/src/main/java/com/fr/design/actions/help/FineUIAction.java

@ -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);
}
}
}

14
designer-base/src/main/java/com/fr/design/actions/server/PluginManagerAction.java

@ -1,10 +1,11 @@
package com.fr.design.actions.server;
import com.fr.base.BaseUtils;
import com.fr.config.ServerPreferenceConfig;
import com.fr.design.actions.UpdateAction;
import com.fr.design.extra.WebViewDlgHelper;
import com.fr.design.menu.MenuKeySet;
import com.fr.design.upm.UpmFinder;
import com.fr.general.IOUtils;
import javax.swing.*;
import java.awt.event.ActionEvent;
@ -20,12 +21,17 @@ public class PluginManagerAction extends UpdateAction {
this.setMenuKeySet(PLUGIN_MANAGER);
this.setName(getMenuKeySet().getMenuKeySetName());
this.setMnemonic(getMenuKeySet().getMnemonic());
this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/server/plugin.png"));
this.setSmallIcon(IOUtils.readIcon("/com/fr/design/images/server/plugin.png"));
}
@Override
public void actionPerformed(ActionEvent e) {
WebViewDlgHelper.createPluginDialog();
// 可以启用新版本的插件商店(使用JxBrowser作为容器)
if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM()) {
UpmFinder.showUPMDialog();
} else {
WebViewDlgHelper.createPluginDialog();
}
}
public static final MenuKeySet PLUGIN_MANAGER = new MenuKeySet() {

17
designer-base/src/main/java/com/fr/design/bridge/exec/JSBridge.java

@ -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 {
}

18
designer-base/src/main/java/com/fr/design/bridge/exec/JSCallback.java

@ -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);
}
}

2
designer-base/src/main/java/com/fr/design/extra/exe/callback/JSExecutor.java → designer-base/src/main/java/com/fr/design/bridge/exec/JSExecutor.java

@ -1,4 +1,4 @@
package com.fr.design.extra.exe.callback;
package com.fr.design.bridge.exec;
/**
* Created by ibm on 2017/6/21.

58
designer-base/src/main/java/com/fr/design/extra/exe/callback/JSCallback.java → designer-base/src/main/java/com/fr/design/bridge/exec/JSUtils.java

@ -1,46 +1,20 @@
package com.fr.design.extra.exe.callback;
package com.fr.design.bridge.exec;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import javafx.application.Platform;
import javafx.scene.web.WebEngine;
import netscape.javascript.JSObject;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by ibm on 2017/5/27.
* @author richie
* @version 10.0
* Created by richie on 2019-04-18
*/
public class JSCallback {
private JSExecutor executeScript;
public JSCallback(final WebEngine webEngine, final JSObject callback) {
init(webEngine, callback);
}
public void init(final WebEngine webEngine, final JSObject callback){
executeScript = new JSExecutor() {
@Override
public void executor(final String newValue) {
Platform.runLater(new Runnable() {
@Override
public void run() {
String fun = "(" + callback + ")(\"" + trimText(newValue) + "\")";
try {
webEngine.executeScript(fun);
} catch (Exception e) {
webEngine.executeScript("alert(\"" + e.getMessage() + "\")");
}
}
});
}
};
}
public void execute(String newValue) {
executeScript.executor(newValue);
}
public class JSUtils {
/**
@ -60,7 +34,7 @@ public class JSCallback {
* @param old 原始字符串
* @return 处理之后的字符串
*/
private String trimText(String old) {
public static String trimText(String old) {
if (StringUtils.isNotBlank(old)) {
String b = filterHtmlTag(old);
return b.replaceAll("\\\\n", StringUtils.EMPTY).replaceAll("\\\\t", StringUtils.EMPTY).replaceAll("\"", "\\\\\"").replaceAll("\'", "\\\\\'").replaceAll("\\\\\\\\", "\\\\\\\\\\\\");
@ -73,7 +47,7 @@ public class JSCallback {
* @param origin 原始字符串
* @return 处理之后的字符串
*/
private String filterHtmlTag(String origin) {
public static String filterHtmlTag(String origin) {
String regHtml = "<[^>]+>";
Pattern patternHtml = Pattern.compile(regHtml, Pattern.CASE_INSENSITIVE);
Matcher matchHtml = patternHtml.matcher(origin);
@ -81,5 +55,15 @@ public class JSCallback {
return origin;
}
public String[] jsObjectToStringArray(JSObject obj) {
if (obj == null) {
return ArrayUtils.EMPTY_STRING_ARRAY;
}
int len = (int) obj.getMember("length");
List<String> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
list.add(obj.getSlot(i).toString());
}
return list.toArray(new String[len]);
}
}

1
designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java

@ -147,6 +147,7 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp
private boolean isIncludeUnderline(String name) {
return ComparatorUtils.equals(name.indexOf(StoreProcedureAssist.GROUP_MARKER), -1) ? false : true;
}
public abstract void addDataPane(final AbstractTableDataPane<?> uPanel, String paneName);
public abstract TableDataTree getDataTree();

27
designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java

@ -324,4 +324,31 @@ public class TableDataTreePane extends BasicTableDataTreePane {
dataTree.refresh();
return Collections.unmodifiableMap(tdNameMap);
}
public void addDataPane(final AbstractTableDataPane<?> uPanel, String paneName) {
final NamePane nPanel = uPanel.asNamePane();
nPanel.setObjectName(paneName);
final String oldName = paneName;
allDSNames = DesignTableDataManager.getAllDSNames(tc.getBook());
DesignTableDataManager.setThreadLocal(DesignTableDataManager.NO_PARAMETER);
tc.renameTableData(oldName, nPanel.getObjectName(), false);
TableDataSource tds = tc.getBook();
TableData td = uPanel.updateBean();
if (td instanceof TableDataSourceDependent) {
((TableDataSourceDependent) td).setTableDataSource(tds);
}
String tdName = nPanel.getObjectName();
tds.putTableData(tdName, td);
Map<String, String> map = new HashMap<String, String>();
if (!ComparatorUtils.equals(oldName, tdName)) {
map.put(oldName, tdName);
}
fireDSChanged(map);
tc.fireTargetModified();
tc.parameterChanged();
int[] rows = dataTree.getSelectionRows();
dataTree.refreshChildByName(tdName);
dataTree.setSelectionRows(rows);
}
}

6
designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java

@ -29,6 +29,7 @@ import com.fr.design.gui.itableeditorpane.UITableEditorPane;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.gui.syntax.ui.rsyntaxtextarea.SyntaxConstants;
import com.fr.design.gui.syntax.ui.rtextarea.RTextScrollPane;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.menu.SeparatorDef;
import com.fr.design.menu.ToolBarDef;
@ -211,10 +212,13 @@ public class DBTableDataPane extends AbstractTableDataPane<DBTableData> {
isShareCheckBox.setBackground(Color.WHITE);
maxPanel = new MaxMemRowCountPanel();
maxPanel.setBorder(null);
JPanel wrapMaxPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
wrapMaxPanel.add(maxPanel);
wrapMaxPanel.setPreferredSize(new Dimension(250, 20));
UIToolbar editToolBar = ToolBarDef.createJToolBar();
toolBarDef.updateToolBar(editToolBar);
editToolBar.add(isShareCheckBox);
editToolBar.add(maxPanel);
editToolBar.add(wrapMaxPanel);
return editToolBar;
}

26
designer-base/src/main/java/com/fr/design/dialog/BasicPane.java

@ -2,13 +2,18 @@ package com.fr.design.dialog;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextfield.UITextField;
import com.fr.stable.core.PropertyChangeAdapter;
import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.core.PropertyChangeAdapter;
import javax.swing.*;
import javax.swing.JPanel;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Window;
/*
* _denny: 这里的BasicPane通常会有populate & update方法
@ -298,18 +303,20 @@ public abstract class BasicPane extends JPanel {
public void checkValid() throws Exception {
}
public static final class NamePane extends BasicPane {
public static class NamePane extends BasicPane {
private UITextField nameTextField;
private UILabel Name;
private BasicPane centerPane;
private UILabel showfield;
private PropertyChangeAdapter changeListener;
private NamePane(BasicPane bPane) {
public NamePane(BasicPane bPane) {
this.setLayout(new BorderLayout(4, 4));
nameTextField = new UITextField(30);
Name = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Name") + ":");
JPanel northPane = new JPanel(new BorderLayout(4, 4));
northPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Name") + ":"), BorderLayout.WEST);
northPane.add(Name, BorderLayout.WEST);
northPane.add(nameTextField, BorderLayout.CENTER);
northPane.add(showfield = new UILabel(" "), BorderLayout.EAST);
showfield.setForeground(new Color(204, 0, 1));
@ -343,6 +350,11 @@ public abstract class BasicPane extends JPanel {
}
}
public void setVisible(boolean isVisible) {
this.nameTextField.setVisible(isVisible);
this.Name.setVisible(isVisible);
}
public String getObjectName() {
return this.nameTextField.getText().trim();
}

42
designer-base/src/main/java/com/fr/design/extra/PluginJavaFxExecutor.java

@ -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() + "\")");
}
}
});
}
}

2
designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java

@ -3,7 +3,7 @@ package com.fr.design.extra;
import com.fr.config.MarketConfig;
import com.fr.design.extra.exe.callback.InstallFromDiskCallback;
import com.fr.design.extra.exe.callback.InstallOnlineCallback;
import com.fr.design.extra.exe.callback.JSCallback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.exe.callback.ModifyStatusCallback;
import com.fr.design.extra.exe.callback.UninstallPluginCallback;
import com.fr.design.extra.exe.callback.UpdateFromDiskCallback;

20
designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java

@ -3,6 +3,7 @@ package com.fr.design.extra;
import com.fr.base.passport.FinePassportManager;
import com.fr.config.MarketConfig;
import com.fr.design.RestartHelper;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.dialog.UIDialog;
import com.fr.design.extra.exe.GetInstalledPluginsExecutor;
import com.fr.design.extra.exe.GetPluginCategoriesExecutor;
@ -11,12 +12,9 @@ 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.extra.exe.callback.JSCallback;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.utils.concurrent.ThreadFactoryBuilder;
import com.fr.general.CloudCenter;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
@ -172,7 +170,7 @@ public class PluginWebBridge {
* @param callback 回调函数
*/
public void installPluginOnline(final String pluginInfo, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo);
PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback);
}
@ -183,7 +181,7 @@ public class PluginWebBridge {
* @param filePath 插件包的路径
*/
public void installPluginFromDisk(final String filePath, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
File file = new File(filePath);
PluginOperateUtils.installPluginFromDisk(file, jsCallback);
}
@ -194,7 +192,7 @@ public class PluginWebBridge {
* @param pluginInfo 插件信息
*/
public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback);
}
@ -204,7 +202,7 @@ public class PluginWebBridge {
* @param pluginIDs 插件集合
*/
public void updatePluginOnline(JSObject pluginIDs, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
String[] pluginInfos = jsObjectToStringArray(pluginIDs);
List<PluginMarker> pluginMarkerList = new ArrayList<PluginMarker>();
for (int i = 0; i < pluginInfos.length; i++) {
@ -219,7 +217,7 @@ public class PluginWebBridge {
* @param filePath 插件包的路径
*/
public void updatePluginFromDisk(String filePath, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
File file = new File(filePath);
PluginOperateUtils.updatePluginFromDisk(file, jsCallback);
}
@ -230,7 +228,7 @@ public class PluginWebBridge {
* @param pluginID 插件ID
*/
public void setPluginActive(String pluginID, final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
PluginOperateUtils.setPluginActive(pluginID, jsCallback);
}
@ -427,7 +425,7 @@ public class PluginWebBridge {
* @param callback
*/
public void registerLoginInfo(final JSObject callback) {
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
PluginOperateUtils.getLoginInfo(jsCallback, uiLabel);
}
@ -559,7 +557,7 @@ public class PluginWebBridge {
}
public void getPackInfo(final JSObject callback){
JSCallback jsCallback = new JSCallback(webEngine, callback);
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback));
jsCallback.execute(StringUtils.EMPTY);
}

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallFromDiskCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.extra.PluginUtils;

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/InstallOnlineCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.log.FineLoggerFactory;

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/ModifyStatusCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginUtils;
import com.fr.plugin.manage.control.PluginTaskCallback;

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/UninstallPluginCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginUtils;
import com.fr.log.FineLoggerFactory;

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateFromDiskCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.design.extra.PluginUtils;

1
designer-base/src/main/java/com/fr/design/extra/exe/callback/UpdateOnlineCallback.java

@ -1,5 +1,6 @@
package com.fr.design.extra.exe.callback;
import com.fr.design.bridge.exec.JSCallback;
import com.fr.design.extra.PluginOperateUtils;
import com.fr.log.FineLoggerFactory;

7
designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java

@ -751,8 +751,11 @@ public class MutilTempalteTabPane extends JComponent {
JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
selectedIndex = HistoryTemplateListCache.getInstance().contains(template);
}
//如果是已后台关闭的模板,则重新打开文件
openedTemplate.get(selectedIndex).activeOldJTemplate();
if (selectedIndex < openedTemplate.size()) {
//如果是已后台关闭的模板,则重新打开文件
openedTemplate.get(selectedIndex).activeOldJTemplate();
}
}
}

38
designer-base/src/main/java/com/fr/design/fun/OemProcessor.java

@ -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);
}

25
designer-base/src/main/java/com/fr/design/fun/impl/AbstractOemProcessor.java

@ -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;
}
}

3
designer-base/src/main/java/com/fr/design/gui/controlpane/JControlUpdatePane.java

@ -60,7 +60,8 @@ class JControlUpdatePane extends JPanel {
elEditing = el;
NameableCreator[] creators = listControlPane.creators();
for (int i = 0, len = updatePanes.length; i < len; i++) {
//倒序的原因是为了让一些继承内置连接类的插件实现能够生效REPORT-15409
for (int i = updatePanes.length - 1; i > -1; i--) {
Object ob2Populate = creators[i].acceptObject2Populate(el.wrapper);
if (ob2Populate != null) {
if (updatePanes[i] == null) {

32
designer-base/src/main/java/com/fr/design/javascript/beautify/JavaScriptFormatHelper.java

@ -1,16 +1,16 @@
package com.fr.design.javascript.beautify;
import com.fr.log.FineLoggerFactory;
import com.eclipsesource.v8.V8;
import com.eclipsesource.v8.V8Array;
import com.eclipsesource.v8.V8Object;
import com.eclipsesource.v8.utils.V8ObjectUtils;
import com.fr.general.IOUtils;
import com.fr.script.ScriptFactory;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.EncodeConstants;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
public class JavaScriptFormatHelper {
@ -34,15 +34,21 @@ public class JavaScriptFormatHelper {
*/
public static String beautify(String jsCode, BeautifyOption option) {
InputStream resourceAsStream = IOUtils.readResource("com/fr/design/javascript/beautify/beautify.js");
ScriptEngine scriptEngine = ScriptFactory.newScriptEngine();
String result = jsCode;
V8 v8 = V8.createV8Runtime();
try {
Reader reader = new InputStreamReader(resourceAsStream);
scriptEngine.eval(reader);
Invocable invocable = (Invocable) scriptEngine;
result = (String) invocable.invokeFunction("js_beautify_global", jsCode, option.toFormatArgument());
} catch (ScriptException | NoSuchMethodException e) {
v8.executeVoidScript(IOUtils.inputStream2String(resourceAsStream, EncodeConstants.ENCODING_UTF_8));
V8Array parameters = new V8Array(v8);
parameters.push(jsCode);
V8Object arg = V8ObjectUtils.toV8Object(v8, option.toFormatArgument());
parameters.push(arg);
result = v8.executeStringFunction("js_beautify_global", parameters);
parameters.release();
arg.release();
} catch (UnsupportedEncodingException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} finally {
v8.release(true);
}
return result;
}

11
designer-base/src/main/java/com/fr/design/mainframe/DesignAuthorityEventType.java

@ -0,0 +1,11 @@
package com.fr.design.mainframe;
import com.fr.event.Event;
public enum DesignAuthorityEventType implements Event<DesignerFrame> {
// 退出权限编辑
StartEdit,
// 进入权限编辑
StopEdit;
}

19
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java

@ -24,6 +24,7 @@ import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.file.NewTemplatePane;
import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.OemProcessor;
import com.fr.design.fun.TitlePlaceProcessor;
import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider;
import com.fr.design.gui.ibutton.UIButton;
@ -39,6 +40,7 @@ import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.menu.MenuManager;
import com.fr.design.menu.ShortCut;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.event.EventDispatcher;
import com.fr.exception.DecryptTemplateException;
import com.fr.file.FILE;
import com.fr.file.FILEFactory;
@ -56,6 +58,7 @@ import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.image4j.codec.ico.ICODecoder;
import com.fr.stable.project.ProjectConstants;
import com.fr.start.OemHandler;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
@ -333,6 +336,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
needToAddAuhtorityPaint();
refreshDottedLine();
fireAuthorityStateToNomal();
EventDispatcher.fire(DesignAuthorityEventType.StopEdit, DesignerFrame.this);
}
/**
@ -456,8 +460,19 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
try {
@SuppressWarnings("unchecked")
List<BufferedImage> image = ICODecoder.read(DesignerFrame.class
.getResourceAsStream("/com/fr/base/images/oem/logo.ico"));
OemProcessor oemProcessor = OemHandler.findOem();
List<BufferedImage> image = null;
if (oemProcessor != null) {
try {
image = oemProcessor.createTitleIcon();
} catch (Throwable e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
if (image == null) {
image = ICODecoder.read(DesignerFrame.class
.getResourceAsStream("/com/fr/base/images/oem/logo.ico"));
}
this.setIconImages(image);
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);

8
designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java

@ -321,13 +321,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
}
private void saveCurrentEditingTemplate() {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
jt.stopEditing();
jt.saveTemplate();
jt.requestFocus();
}
private boolean isCurrentEditing(String path) {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
String editing = jt.getEditingFILE().getPath();
@ -431,6 +424,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
}
selectedOperation.deleteFile();
stateChange();
DesignerContext.getDesignerFrame().setTitle();
}
}

9
designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java

@ -603,7 +603,11 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
editingFILE = fileChooser.getSelectedFILE();
}
boolean lockedTarget = WorkContext.getCurrent().get(TplOperator.class).saveAs(editingFILE.getPath());
boolean lockedTarget =
// 目标本地文件
!editingFILE.isEnvFile() ||
// 目标远程文件
WorkContext.getCurrent().get(TplOperator.class).saveAs(editingFILE.getPath());
if (lockedTarget) {
boolean saved = saveNewFile(editingFILE, oldName);
// 目标文件保存成功并且源文件不一致的情况下,把源文件锁释放掉
@ -683,7 +687,10 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
this.saved = true;
this.authoritySaved = true;
DesignerContext.getDesignerFrame().setTitle();
if (DesignerEnvManager.getEnvManager().getVcsConfigManager().isVcsEnable()) {
VcsHelper.dealWithVcs(this);
}
this.fireJTemplateSaved();
return true;
}

24
designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java

@ -6,6 +6,7 @@ package com.fr.design.mainframe.toolbar;
import com.fr.base.FRContext;
import com.fr.base.vcs.DesignerMode;
import com.fr.design.DesignState;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.UpdateAction;
import com.fr.design.actions.community.BBSAction;
@ -24,6 +25,7 @@ import com.fr.design.actions.file.OpenTemplateAction;
import com.fr.design.actions.file.PreferenceAction;
import com.fr.design.actions.file.SwitchExistEnv;
import com.fr.design.actions.help.AboutAction;
import com.fr.design.actions.help.FineUIAction;
import com.fr.design.actions.help.TutorialAction;
import com.fr.design.actions.help.WebDemoAction;
import com.fr.design.actions.help.alphafine.AlphaFineAction;
@ -36,6 +38,7 @@ import com.fr.design.actions.server.PlatformManagerAction;
import com.fr.design.actions.server.PluginManagerAction;
import com.fr.design.file.NewTemplatePane;
import com.fr.design.fun.MenuHandler;
import com.fr.design.fun.OemProcessor;
import com.fr.design.fun.TableDataPaneProcessor;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
@ -54,6 +57,7 @@ import com.fr.design.remote.action.RemoteDesignAuthManagerAction;
import com.fr.design.utils.ThemeUtils;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.context.PluginRuntime;
import com.fr.plugin.manage.PluginFilter;
@ -62,6 +66,7 @@ import com.fr.plugin.observer.PluginEventListener;
import com.fr.plugin.observer.PluginEventType;
import com.fr.stable.ArrayUtils;
import com.fr.stable.StringUtils;
import com.fr.start.OemHandler;
import com.fr.workspace.WorkContext;
import javax.swing.JComponent;
@ -198,6 +203,18 @@ public abstract class ToolBarMenuDock {
};
this.menus = menus(plus);
try {
OemProcessor oemProcessor = OemHandler.findOem();
if (oemProcessor != null) {
this.menus = oemProcessor.dealWithMenuDef(this.menus);
if (this.menus == null) {
this.menus = menus(plus);
}
}
} catch (Throwable e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
this.menus = menus(plus);
}
for (int i = 0; i < menus.length; i++) {
menus[i].setHasRecMenu(true);
UIMenu subMenu = menus[i].createJMenu();
@ -499,9 +516,14 @@ public abstract class ToolBarMenuDock {
if (AlphaFineConfigManager.isALPHALicAvailable()) {
shortCuts.add(new AlphaFineAction());
}
shortCuts.add(SeparatorDef.DEFAULT);
if (DesignerEnvManager.getEnvManager().isOpenDebug()) {
shortCuts.add(new FineUIAction());
}
shortCuts.add(new AboutAction());
return shortCuts.toArray(new ShortCut[shortCuts.size()]);
return shortCuts.toArray(new ShortCut[0]);
}
/**

12
designer-base/src/main/java/com/fr/design/mainframe/vcs/common/VcsCacheFileNodeFile.java

@ -6,9 +6,10 @@ import com.fr.file.filetree.FileNode;
import com.fr.general.ComparatorUtils;
import com.fr.stable.StableUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.resource.WorkResource;
import com.fr.workspace.resource.WorkResourceOutputStream;
import com.fr.workspace.server.lock.TplOperator;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
@ -29,7 +30,7 @@ public class VcsCacheFileNodeFile extends FileNodeFILE {
* @throws Exception
*/
@Override
public InputStream asInputStream() {
public InputStream asInputStream() throws Exception {
if (node == null) {
return null;
}
@ -40,8 +41,11 @@ public class VcsCacheFileNodeFile extends FileNodeFILE {
return null;
}
InputStream in = WorkContext.getCurrent().get(WorkResource.class)
.openStream(StableUtils.pathJoin(VcsHelper.VCS_CACHE_DIR, envPath.substring(VcsHelper.VCS_CACHE_DIR.length() + 1)));
InputStream in = new ByteArrayInputStream(
WorkContext.getCurrent().get(TplOperator.class).readAndLockFile(
StableUtils.pathJoin(VcsHelper.VCS_CACHE_DIR, envPath.substring(VcsHelper.VCS_CACHE_DIR.length() + 1))
)
);
return envPath.endsWith(".cpt") || envPath.endsWith(".frm")
? XMLEncryptUtils.decodeInputStream(in) : in;

1
designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionRowPanel.java

@ -63,6 +63,7 @@ public class FileVersionRowPanel extends JPanel {
public void actionPerformed(ActionEvent evt) {
if (JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Vcs_Version_Revert_Confirm"), Toolkit.i18nText("Fine-Design_Vcs_Version_Revert_Title"),
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
vcsEntity.setUsername(VcsHelper.getCurrentUsername());
WorkContext.getCurrent().get(VcsOperator.class).rollbackTo(vcsEntity);
FileVersionsPanel.getInstance().exitVcs(vcsEntity.getFilename());
}

4
designer-base/src/main/java/com/fr/design/mainframe/vcs/ui/FileVersionsPanel.java

@ -19,7 +19,6 @@ import com.fr.design.mainframe.vcs.common.VcsHelper;
import com.fr.design.menu.ToolBarDef;
import com.fr.file.FileNodeFILE;
import com.fr.file.filetree.FileNode;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StableUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
@ -101,7 +100,8 @@ public class FileVersionsPanel extends BasicPane {
}
private void showFilterPane() {
versionDialog = new FileVersionDialog(DesignerContext.getDesignerFrame(), templatePath);
String savePath = templatePath.startsWith("/") ? templatePath.substring(1) : templatePath;
versionDialog = new FileVersionDialog(DesignerContext.getDesignerFrame(), savePath);
versionDialog.setVisible(true);
}

28
designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java

@ -11,18 +11,29 @@ import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignAuthorityEventType;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrame;
import com.fr.design.mainframe.DockingView;
import com.fr.design.menu.ToolBarDef;
import javax.swing.*;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.tree.DefaultTreeSelectionModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
@ -40,6 +51,15 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo
private static ReportAndFSManagePane singleton = new ReportAndFSManagePane();
private static RoleTree roleTree;
static {
EventDispatcher.listen(DesignAuthorityEventType.StopEdit, new Listener<DesignerFrame>() {
public void on(Event event, DesignerFrame param) {
DefaultTreeSelectionModel model = roleTree.getCheckBoxTreeSelectionModel();
model.removeSelectionPaths(model.getSelectionPaths());
}
});
}
private RefreshAction refreshAction = new RefreshAction();
private UIHeadGroup buttonGroup;
private RoleSourceOP op;

1
designer-base/src/main/java/com/fr/design/ui/Assistant.java

@ -49,5 +49,6 @@ public class Assistant {
ProtocolService protocolService = browserContext.getProtocolService();
// 支持读取jar包中文件的自定义协议————emb:/com/fr/design/images/bbs.png
protocolService.setProtocolHandler("emb", handler);
//protocolService.setProtocolHandler("file", handler);
}
}

34
designer-base/src/main/java/com/fr/design/ui/EmbProtocolHandler.java

@ -1,7 +1,11 @@
package com.fr.design.ui;
import com.fr.base.TemplateUtils;
import com.fr.general.IOUtils;
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;
@ -11,7 +15,12 @@ import com.teamdev.jxbrowser.chromium.ProtocolHandler;
import com.teamdev.jxbrowser.chromium.URLRequest;
import com.teamdev.jxbrowser.chromium.URLResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URI;
import java.util.Map;
/**
* @author richie
@ -21,6 +30,7 @@ import java.io.InputStream;
public class EmbProtocolHandler implements ProtocolHandler {
private AssembleComponent component;
private Map<String, String> map;
public EmbProtocolHandler() {
@ -30,17 +40,35 @@ public class EmbProtocolHandler implements ProtocolHandler {
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) {
try {
String path = req.getURL();
if (path.startsWith("emb:dynamic")) {
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 inputStream = new FileInputStream(file);
if (path.endsWith(".svg")) {
System.out.println(path);
}
return Assistant.inputStream2Response(inputStream, "file:///" + file.getAbsolutePath());
}
else if (path.startsWith("emb:dynamic")) {
URLResponse response = new URLResponse();
response.setData(htmlText().getBytes());
response.getHeaders().setHeader("Content-Type", "text/html");
return response;
} else {
} else {
int index = path.indexOf("=");
if (index > 0) {
path = path.substring(index + 1);
@ -51,7 +79,7 @@ public class EmbProtocolHandler implements ProtocolHandler {
return Assistant.inputStream2Response(inputStream, path);
}
} catch (Exception ignore) {
ignore.printStackTrace();
}
return null;
}

82
designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java

@ -2,6 +2,10 @@ 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.utils.gui.GUICoreUtils;
import com.fr.web.struct.AssembleComponent;
import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserPreferences;
@ -14,8 +18,11 @@ import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent;
import com.teamdev.jxbrowser.chromium.events.ScriptContextListener;
import com.teamdev.jxbrowser.chromium.swing.BrowserView;
import javax.swing.JSplitPane;
import java.awt.BorderLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Map;
/**
* @author richie
@ -39,17 +46,29 @@ public class ModernUIPane<T> extends BasicPane {
setLayout(new BorderLayout());
BrowserPreferences.setChromiumSwitches("--disable-google-traffic");
if (DesignerEnvManager.getEnvManager().isOpenDebug()) {
JSplitPane splitPane = new JSplitPane();
add(splitPane, BorderLayout.CENTER);
splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
splitPane.setDividerLocation(500);
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);
openDebugButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showDebuggerDialog();
}
});
reloadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
browser.reloadIgnoringCache();
}
});
BrowserPreferences.setChromiumSwitches("--remote-debugging-port=9222");
initializeBrowser();
splitPane.setLeftComponent(new BrowserView(browser));
Browser debugger = new Browser();
debugger.loadURL(browser.getRemoteDebuggingURL());
BrowserView debuggerView = new BrowserView(debugger);
splitPane.setRightComponent(debuggerView);
add(new BrowserView(browser), BorderLayout.CENTER);
} else {
initializeBrowser();
add(new BrowserView(browser), BorderLayout.CENTER);
@ -57,6 +76,18 @@ public class ModernUIPane<T> extends BasicPane {
}
}
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() {
browser = new Browser();
// 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的
@ -68,6 +99,14 @@ public class ModernUIPane<T> extends BasicPane {
});
}
/**
* 转向一个新的地址相当于重新加载
* @param url 新的地址
*/
public void redirect(String url) {
browser.loadURL(url);
}
@Override
protected String title4PopupWindow() {
return "Modern";
@ -126,6 +165,16 @@ public class ModernUIPane<T> extends BasicPane {
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组件
@ -136,6 +185,17 @@ public class ModernUIPane<T> extends BasicPane {
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文本内容

6
designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java

@ -1,6 +1,5 @@
package com.fr.design.update.ui.dialog;
import com.fr.base.FRContext;
import com.fr.design.RestartHelper;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel;
@ -8,6 +7,7 @@ import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.update.domain.UpdateConstants;
import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.ComparatorUtils;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.project.ProjectConstants;
@ -175,8 +175,8 @@ public class RestoreResultDialog extends JDialog {
String backupDir = UpdateConstants.DESIGNER_BACKUP_DIR;
for (String file : files) {
map.put(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, file),
StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
}
}
}

7
designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java

@ -1,6 +1,5 @@
package com.fr.design.update.ui.dialog;
import com.fr.base.FRContext;
import com.fr.design.RestartHelper;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.dialog.UIDialog;
@ -707,7 +706,7 @@ public class UpdateMainDialog extends UIDialog {
for (String file : files) {
try {
IOUtils.copy(
new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)),
new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)),
new File(StableUtils.pathJoin(todayBackupDir)));
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage());
@ -748,8 +747,8 @@ public class UpdateMainDialog extends UIDialog {
private void putNewFilesToInstallEnv(String installHome, String[] files, Map<String, String> map, java.util.List<String> list) {
for (String file : files) {
map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file),
StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file));
}
}

406
designer-base/src/main/java/com/fr/design/upm/UpmBridge.java

@ -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());
}
}
}

68
designer-base/src/main/java/com/fr/design/upm/UpmFinder.java

@ -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;
}
}
}

34
designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java

@ -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 {
}
}

63
designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java

@ -0,0 +1,63 @@
package com.fr.design.upm;
import com.fr.design.dialog.BasicPane;
import com.fr.design.ui.ModernUIPane;
import com.fr.design.upm.event.DownloadEvent;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.teamdev.jxbrowser.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-04-12
* Update Plugin Manager容器
*/
public class UpmShowPane extends BasicPane {
private ModernUIPane<Object> modernUIPane;
@Override
protected String title4PopupWindow() {
return "UPM";
}
public UpmShowPane() {
setLayout(new BorderLayout());
if (UpmFinder.checkUPMResourcesExist()) {
modernUIPane = new ModernUIPane.Builder<>()
.prepare(new ScriptContextAdapter() {
@Override
public void onScriptContextCreated(ScriptContextEvent event) {
JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser()));
}
})
.withURL(UpmFinder.getMainResourcePath())
.build();
} else {
modernUIPane = new ModernUIPane.Builder<>()
.withComponent(WarnComponent.KEY)
.prepare(new ScriptContextAdapter() {
@Override
public void onScriptContextCreated(ScriptContextEvent event) {
JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window");
window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser()));
}
}).build();
EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener<String>() {
@Override
public void on(Event event, String param) {
modernUIPane.redirect(UpmFinder.getMainResourcePath());
}
});
}
add(modernUIPane, BorderLayout.CENTER);
}
}

21
designer-base/src/main/java/com/fr/design/upm/UpmUtils.java

@ -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]);
}
}

33
designer-base/src/main/java/com/fr/design/upm/WarnComponent.java

@ -0,0 +1,33 @@
package com.fr.design.upm;
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;
/**
* @author richie
* @version 10.0
* Created by richie on 2019-04-12
*/
public class WarnComponent extends AssembleComponent {
public static final WarnComponent KEY = new WarnComponent();
private WarnComponent() {
}
@Override
public ScriptPath script(RequestClient req) {
return ScriptPath.build("com/fr/design/upm/warn.js");
}
@Override
public Atom[] refer() {
return new Atom[]{
FineUI.KEY
};
}
}

12
designer-base/src/main/java/com/fr/design/upm/event/CertificateEvent.java

@ -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
}

13
designer-base/src/main/java/com/fr/design/upm/event/DownloadEvent.java

@ -0,0 +1,13 @@
package com.fr.design.upm.event;
import com.fr.event.Event;
/**
* @author richie
* @version 10.0
* Created by richie on 2019-04-12
*/
public enum DownloadEvent implements Event<String> {
SUCCESS, ERROR
}

30
designer-base/src/main/java/com/fr/design/upm/exec/UpmBrowserExecutor.java

@ -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);
}
}

27
designer-base/src/main/java/com/fr/design/upm/loader/UpmDesignResourceLoader.java

@ -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";
}
}

52
designer-base/src/main/java/com/fr/design/upm/task/UpmTaskWorker.java

@ -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);
}
}

203
designer-base/src/main/java/com/fr/design/utils/DesignUtils.java

@ -1,6 +1,5 @@
package com.fr.design.utils;
import com.fr.base.BaseUtils;
import com.fr.base.FeedBackInfo;
import com.fr.base.ServerConfig;
import com.fr.design.DesignerEnvManager;
@ -14,8 +13,7 @@ import com.fr.general.FRFont;
import com.fr.general.GeneralContext;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.ArrayUtils;
import com.fr.stable.CodeUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.CommonCodeUtils;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.start.ServerStarter;
@ -33,32 +31,33 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Some util method of Designer
*/
public class DesignUtils {
private static final int MESSAGEPORT = 51462;
private static final int TIME_OUT = 20 * 1000;
private static int port = DesignerPort.MESSAGE_PORT;
public synchronized static void setPort(int port) {
DesignUtils.port = port;
private DesignUtils() {
}
private static int port = MESSAGEPORT;
private DesignUtils() {
public synchronized static void setPort(int port) {
DesignUtils.port = port;
}
public static int getPort() {
return port;
}
/**
* 通过端口是否被占用判断设计器有没有启动
@ -70,8 +69,7 @@ public class DesignUtils {
try {
new Socket("localhost", port);
return true;
} catch (Exception exp) {
} catch (Exception ignored) {
}
return false;
}
@ -82,7 +80,7 @@ public class DesignUtils {
* @param lines 命令行
*/
public static void clientSend(String[] lines) {
if (lines != null && lines.length <= 0) {
if (lines == null || lines.length == 0) {
return;
}
Socket socket = null;
@ -90,18 +88,21 @@ public class DesignUtils {
try {
socket = new Socket("localhost", port);
writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), EncodeConstants.ENCODING_UTF_8)));
writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)));
for (int i = 0; i < lines.length; i++) {
writer.println(lines[i]);
}
writer.flush();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} finally {
try {
writer.close();
socket.close();
if (writer != null) {
writer.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
@ -114,47 +115,52 @@ public class DesignUtils {
* @param startPort 端口
* @param suffixs 文件后缀
*/
public static void creatListeningServer(final int startPort, final String[] suffixs) {
Thread serverSocketThread = new Thread() {
public static void createListeningServer(final int startPort, final String[] suffixs) {
ExecutorService service = Executors.newSingleThreadExecutor();
service.execute(new Runnable() {
@Override
public void run() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(startPort);
} catch (IOException e1) {
FineLoggerFactory.getLogger().error("Cannot create server socket on" + port);
FineLoggerFactory.getLogger().error("Cannot create server socket on " + port);
}
while (true) {
try {
Socket socket = serverSocket.accept(); // 接收客户连接
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), EncodeConstants.ENCODING_UTF_8));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.startsWith("demo")) {
DesignerEnvManager.getEnvManager().setCurrentEnv2Default();
ServerStarter.browserDemoURL();
} else if (StringUtils.isNotEmpty(line)) {
File f = new File(line);
String path = f.getAbsolutePath();
boolean isMatch = false;
for (int i = 0; i < suffixs.length; i++) {
isMatch = isMatch || path.endsWith(suffixs[i]);
}
if (isMatch) {
DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f));
if (serverSocket != null) {
Socket socket = serverSocket.accept(); // 接收客户连接
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
String line;
while ((line = reader.readLine()) != null) {
if (line.startsWith("demo")) {
DesignerEnvManager.getEnvManager().setCurrentEnv2Default();
ServerStarter.browserDemoURL();
} else if (StringUtils.isNotEmpty(line)) {
File f = new File(line);
String path = f.getAbsolutePath();
boolean isMatch = false;
for (int i = 0; i < suffixs.length; i++) {
isMatch = isMatch || path.endsWith(suffixs[i]);
}
if (isMatch) {
DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f));
}
}
}
reader.close();
socket.close();
} else {
FineLoggerFactory.getLogger().error("Cannot create server socket on " + port);
break;
}
reader.close();
socket.close();
} catch (IOException e) {
} catch (IOException ignored) {
}
}
}
};
serverSocketThread.start();
});
}
/**
@ -278,19 +284,18 @@ public class DesignUtils {
*/
public static void visitEnvServerByParameters(String baseRoute, String[] names, String[] values) {
int len = Math.min(ArrayUtils.getLength(names), ArrayUtils.getLength(values));
String[] segs = new String[len];
String[] nameValuePairs = new String[len];
for (int i = 0; i < len; i++) {
try {
//设计器里面据说为了改什么界面统一, 把分隔符统一用File.separator, 意味着在windows里面报表路径变成了\
//以前的超链, 以及预览url什么的都是/, 产品组的意思就是用到的地方替换下, 真恶心.
String value = values[i].replaceAll("\\\\", "/");
segs[i] = URLEncoder.encode(CodeUtils.cjkEncode(names[i]), EncodeConstants.ENCODING_UTF_8) + "=" + URLEncoder.encode(CodeUtils.cjkEncode(value), "UTF-8");
} catch (UnsupportedEncodingException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
//设计器里面据说为了改什么界面统一, 把分隔符统一用File.separator, 意味着在windows里面报表路径变成了\
//以前的超链, 以及预览url什么的都是/, 产品组的意思就是用到的地方替换下, 真恶心.
String value = values[i].replaceAll("\\\\", "/");
// 两次 encode 支持中文和特殊符号,避免跳转登录后预览400报错
nameValuePairs[i] =
CommonCodeUtils.encodeURIComponent(CommonCodeUtils.encodeURIComponent(names[i])) +
"=" + CommonCodeUtils.encodeURIComponent(CommonCodeUtils.encodeURIComponent(value));
}
String postfixOfUri = (segs.length > 0 ? "?" + StableUtils.join(segs, "&") : StringUtils.EMPTY);
String postfixOfUri = (nameValuePairs.length > 0 ? "?" + StableUtils.join(nameValuePairs, "&") : StringUtils.EMPTY);
if (!WorkContext.getCurrent().isLocal()) {
try {
String urlPath = getWebBrowserPath();
@ -305,8 +310,7 @@ public class DesignUtils {
+ "/" + web + "/" + ServerConfig.getInstance().getServletName() + baseRoute
+ postfixOfUri;
ServerStarter.browserURLWithLocalEnv(url);
} catch (Throwable e) {
//
} catch (Throwable ignored) {
}
}
}
@ -321,87 +325,6 @@ public class DesignUtils {
return urlPath;
}
//TODO:august:下个版本,要把下面的图片都放在一个preload文件夹下,表示可以预先加载。然后遍历一下就可以了,不用这么一个一个的写了
/**
* 预加载
*/
public static void preLoadingImages() {
BaseUtils.readIcon("com/fr/design/images/custombtn/baobiaozhuti.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/baobiaozhuti_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/baobiaozhuti_click.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/canshujiemian.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/canshujiemian_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/canshujiemian_click.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/setting.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/setting_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/setting_click.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/page.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/page_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/page_click.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/form.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/form_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/form_click.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/edit.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/edit_hover.png");
BaseUtils.readIcon("com/fr/design/images/custombtn/edit_click.png");
BaseUtils.readIcon("com/fr/base/images/oem/addworksheet.png");
BaseUtils.readIcon("com/fr/design/images/sheet/addpolysheet.png");
BaseUtils.readIcon("com/fr/base/images/oem/worksheet.png");
BaseUtils.readIcon("com/fr/design/images/sheet/polysheet.png");
BaseUtils.readIcon("com/fr/design/images/sheet/left_right_btn.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/cellPop.png");
BaseUtils.readIcon("/com/fr/design/images/docking/right.gif");
BaseUtils.readIcon("/com/fr/design/images/docking/left.gif");
BaseUtils.readIcon("/com/fr/design/images/m_file/save.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/excel.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/pdf.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/word.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/svg.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/csv.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/text.png");
BaseUtils.readIcon("/com/fr/design/images/m_web/datasource.png");
BaseUtils.readIcon("/com/fr/design/images/m_report/webreportattribute.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/pageSetup.png");
BaseUtils.readIcon("/com/fr/design/images/m_report/header.png");
BaseUtils.readIcon("/com/fr/design/images/m_report/footer.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/saveAs.png");
BaseUtils.readIcon("/com/fr/design/images/m_report/background.png");
loadOtherImages();
}
private static void loadOtherImages() {
BaseUtils.readIcon("/com/fr/design/images/m_report/reportWriteAttr.png");
BaseUtils.readIcon("/com/fr/design/images/m_report/linearAttr.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/bindColumn.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/text.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/chart.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/image.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/bias.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/subReport.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/insertRow.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/insertColumn.png");
BaseUtils.readIcon("/com/fr/design/images/m_format/highlight.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/hyperLink.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/merge.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/unmerge.png");
BaseUtils.readIcon("/com/fr/design/images/m_file/export.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/cell.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/float.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/undo.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/redo.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/cut.png");
BaseUtils.readIcon("/com/fr/design/images/m_edit/paste.png");
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/leftAlignment.png");
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/centerAlignment.png");
BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/rightAlignment.png");
BaseUtils.readIcon("/com/fr/design/images/m_format/noboder.png");
BaseUtils.readIcon("/com/fr/design/images/gui/color/background.png");
BaseUtils.readIcon("/com/fr/design/images/m_insert/floatPop.png");
}
/**
* 将用户反馈发送至服务器
*

26
designer-base/src/main/java/com/fr/design/utils/DesignerPort.java

@ -0,0 +1,26 @@
package com.fr.design.utils;
/**
* 为的就是能替换 DesignPort.class 实现多开,因此避免编译器常量编译展开优化
*/
public class DesignerPort {
private DesignerPort() {
}
/**
* 设计器端口避免编译期常量优化展开
*/
public static final int MESSAGE_PORT = getMessagePort();
/**
* 设计器端口避免编译期常量优化展开
*/
public static final int DEBUG_MESSAGE_PORT = getDebugMessagePort();
private static int getMessagePort() {
return 51462;
}
private static int getDebugMessagePort() {
return 51463;
}
}

14
designer-base/src/main/java/com/fr/design/utils/gui/UIComponentUtils.java

@ -2,6 +2,8 @@ package com.fr.design.utils.gui;
import com.fr.design.gui.core.UITextComponent;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.stable.StringUtils;
import javax.swing.JComponent;
@ -9,6 +11,7 @@ import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.util.Locale;
/**
* 包含 UI 组件相关的工具方法
@ -45,15 +48,18 @@ public class UIComponentUtils {
}
private static void insertPrefixToText(UITextComponent comp, String prefix) {
if (comp == null) {
if (comp == null || ComparatorUtils.equals(Locale.CHINA, GeneralContext.getLocale())) {
// 最初是为了解决日文国际化显示不全,而增加的换行功能。中文不需要换行。
// windows 下,字体为宋体时,对于 JLabel、JCheckBox、JButton 等控件,使用<html>换行后,文字会下移,可能导致文字下半部分被截断。
// 因此中文直接返回,不加换行逻辑。
return;
}
String text = comp.getText();
if (StringUtils.isEmpty(comp.getText()) || text.startsWith(HTML_TAG)) {
String text = comp.getText();
if (StringUtils.isEmpty(text) || text.startsWith(HTML_TAG)) {
return;
}
comp.setText(prefix + comp.getText());
comp.setText(prefix + text);
}
/**

2
designer-base/src/main/java/com/fr/design/web/CustomIconPane.java

@ -291,7 +291,7 @@ public class CustomIconPane extends BasicPane {
Configurations.update(new WorkerFacade(WidgetInfoConfig.class) {
@Override
public void run() {
WidgetInfoConfig.getInstance().setIconManager(IconManager.getIconManager());
WidgetInfoConfig.getInstance().setIconManager(iconManager);
}
});

93
designer-base/src/main/java/com/fr/file/AbstractFILE.java

@ -0,0 +1,93 @@
package com.fr.file;
import javax.swing.Icon;
import java.io.InputStream;
import java.io.OutputStream;
public abstract class AbstractFILE implements FILE {
@Override
public String prefix() {
throw new UnsupportedOperationException();
}
@Override
public boolean isDirectory() {
throw new UnsupportedOperationException();
}
@Override
public String getName() {
throw new UnsupportedOperationException();
}
@Override
public Icon getIcon() {
throw new UnsupportedOperationException();
}
@Override
public String getPath() {
throw new UnsupportedOperationException();
}
@Override
public void setPath(String path) {
throw new UnsupportedOperationException();
}
@Override
public FILE getParent() {
throw new UnsupportedOperationException();
}
@Override
public FILE[] listFiles() {
throw new UnsupportedOperationException();
}
@Override
public boolean createFolder(String name) {
throw new UnsupportedOperationException();
}
@Override
public boolean mkfile() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public boolean exists() {
throw new UnsupportedOperationException();
}
@Override
public void closeTemplate() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public InputStream asInputStream() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public OutputStream asOutputStream() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public String getEnvFullName() {
throw new UnsupportedOperationException();
}
@Override
public boolean isMemFile() {
throw new UnsupportedOperationException();
}
@Override
public boolean isEnvFile() {
throw new UnsupportedOperationException();
}
}

2
designer-base/src/main/java/com/fr/file/FileFILE.java

@ -201,7 +201,7 @@ public class FileFILE implements FILE {
OutputStream out;
try {
StableUtils.makesureFileExist(file);
out = new FileOutputStream(file, true);
out = new FileOutputStream(file, false);
} catch (Exception e) {
throw SessionLocalManager.createLogPackedException(e);
}

26
designer-base/src/main/java/com/fr/file/FileNodeFILE.java

@ -7,6 +7,9 @@ import com.fr.design.file.NodeAuthProcessor;
import com.fr.design.gui.itree.filetree.FileNodeComparator;
import com.fr.design.gui.itree.filetree.FileTreeIcon;
import com.fr.design.i18n.Toolkit;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.file.filetree.FileNode;
import com.fr.general.ComparatorUtils;
import com.fr.io.EncryptUtils;
@ -15,6 +18,8 @@ import com.fr.stable.CoreConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.resource.WorkResourceTempRenameStream;
import com.fr.workspace.server.lock.TplOperator;
@ -26,6 +31,21 @@ import java.util.Arrays;
public class FileNodeFILE implements FILE {
private static String webRootPath = FRContext.getCommonOperator().getWebRootPath();
private static String[] supportTypes = FRContext.getFileNodes().getSupportedTypes();
static {
EventDispatcher.listen(WorkspaceEvent.AfterSwitch, new Listener<Workspace>() {
@Override
public void on(Event event, Workspace workspace) {
webRootPath = FRContext.getCommonOperator().getWebRootPath();
supportTypes = FRContext.getFileNodes().getSupportedTypes();
}
});
}
private FileNode node;
//记录下FILE对应的运行环境,每次创建都设置下当前的运行环境
@ -95,7 +115,7 @@ public class FileNodeFILE implements FILE {
@Override
public String prefix() {
if (ComparatorUtils.equals(getEnvPath(), FRContext.getCommonOperator().getWebRootPath())) {
if (ComparatorUtils.equals(getEnvPath(), webRootPath)) {
return FILEFactory.WEBREPORT_PREFIX;
}
return FILEFactory.ENV_PREFIX;
@ -212,7 +232,7 @@ public class FileNodeFILE implements FILE {
try {
FileNode[] nodeArray;
nodeArray = listFile(node.getEnvPath());
Arrays.sort(nodeArray, new FileNodeComparator(FRContext.getFileNodes().getSupportedTypes()));
Arrays.sort(nodeArray, new FileNodeComparator(supportTypes));
return fileNodeArray2FILEArray(nodeArray, envPath);
} catch (Exception e) {
@ -235,7 +255,7 @@ public class FileNodeFILE implements FILE {
private FileNode[] listFile(String rootFilePath) {
try {
if (ComparatorUtils.equals(envPath, FRContext.getCommonOperator().getWebRootPath())) {
if (ComparatorUtils.equals(envPath, webRootPath)) {
return FRContext.getFileNodes().listWebRootFile(rootFilePath);
} else {
return FRContext.getFileNodes().list(rootFilePath);

102
designer-base/src/main/java/com/fr/file/RenameExportFILE.java

@ -0,0 +1,102 @@
package com.fr.file;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.io.FileUtils;
import com.fr.web.session.SessionLocalManager;
import javax.swing.Icon;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class RenameExportFILE extends AbstractFILE {
private static final String EXPORT_SUFFIX = ".FRExportTmp";
private FILE file;
private RenameExportFILE(FILE file) {
this.file = new FileFILE(new File(file.getPath() + EXPORT_SUFFIX));
}
public static RenameExportFILE create(FILE file) {
return new RenameExportFILE(file);
}
public static String recoverFileName(String fileName) {
if (StringUtils.isEmpty(fileName) || !fileName.endsWith(EXPORT_SUFFIX)) {
return fileName;
}
return fileName.substring(0, fileName.lastIndexOf(EXPORT_SUFFIX));
}
@Override
public String prefix() {
return file.prefix();
}
@Override
public boolean isDirectory() {
return false;
}
@Override
public String getName() {
return file.getName();
}
@Override
public Icon getIcon() {
return null;
}
@Override
public String getPath() {
return file.getPath();
}
@Override
public FILE getParent() {
return file.getParent();
}
@Override
public boolean mkfile() throws Exception {
return file.mkfile();
}
@Override
public boolean exists() {
return file.exists();
}
@Override
public OutputStream asOutputStream() throws Exception {
final File localeFile = new File(file.getPath());
OutputStream out;
try {
StableUtils.makesureFileExist(localeFile);
out = new FileOutputStream(localeFile, false) {
@Override
public void close() throws IOException {
super.close();
String path = file.getPath();
if (localeFile.exists()) {
FileUtils.copyFile(localeFile, new File(recoverFileName(path)));
if (localeFile.getPath().endsWith(EXPORT_SUFFIX)) {
FileUtils.forceDelete(localeFile);
}
}
}
};
} catch (Exception e) {
throw SessionLocalManager.createLogPackedException(e);
}
return out;
}
}

34
designer-base/src/main/java/com/fr/file/StashedFILE.java

@ -1,15 +1,13 @@
package com.fr.file;
import javax.swing.Icon;
import javax.transaction.NotSupportedException;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 切换环境用于暂存的文件类型
*/
public class StashedFILE implements FILE {
public class StashedFILE extends AbstractFILE {
private FILE file;
private byte[] content;
@ -44,31 +42,6 @@ public class StashedFILE implements FILE {
return file.getPath();
}
@Override
public void setPath(String path) {
throw new UnsupportedOperationException();
}
@Override
public FILE getParent() {
throw new UnsupportedOperationException();
}
@Override
public FILE[] listFiles() {
throw new UnsupportedOperationException();
}
@Override
public boolean createFolder(String name) {
throw new UnsupportedOperationException();
}
@Override
public boolean mkfile() throws Exception {
throw new UnsupportedOperationException();
}
@Override
public boolean exists() {
return false;
@ -84,11 +57,6 @@ public class StashedFILE implements FILE {
return new ByteArrayInputStream(content);
}
@Override
public OutputStream asOutputStream() throws Exception {
throw new NotSupportedException();
}
@Override
public String getEnvFullName() {
return file.getEnvFullName();

14
designer-base/src/main/java/com/fr/start/OemHandler.java

@ -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);
}
}

3
designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java

@ -6,6 +6,7 @@ import com.fr.log.FineLoggerFactory;
import com.fr.module.Activator;
import com.fr.module.ModuleRole;
import com.fr.stable.EncodeConstants;
import com.fr.stable.ProductConstants;
import com.fr.startup.FineWebApplicationInitializer;
import com.fr.third.springframework.web.SpringServletContainerInitializer;
import com.fr.third.springframework.web.context.support.AnnotationConfigWebApplicationContext;
@ -62,6 +63,8 @@ public class FineEmbedServerActivator extends Activator {
// 设置解码uri使用的字符编码
tomcat.getConnector().setURIEncoding(EncodeConstants.ENCODING_UTF_8);
String docBase = new File(WorkContext.getCurrent().getPath()).getParent();
//内置的上下文是自己定的,这里把WEB_APP_NAME一并设置了,否则下面appName是/null
ProductConstants.setWebAppName(ProductConstants.getAppFolderName());
String appName = "/" + FRContext.getCommonOperator().getAppName();
Context context = tomcat.addContext(appName, docBase);
Tomcat.initWebappDefaults(context);

6
designer-base/src/main/resources/com/fr/design/ui/InitNameSpace.js

@ -1,6 +1,6 @@
var arr ="%s".split(".").reverse();
var create = function (obj, names) {
var name = names.pop();
let arr ="%s".split(".").reverse();
let create = function (obj, names) {
let name = names.pop();
if (!name) {
return;
}

61
designer-base/src/main/resources/com/fr/design/upm/warn.js

@ -0,0 +1,61 @@
window.onload = function () {
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",
text: PluginHelper.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download"),
level: 'common',
height: 30,
handler: function () {
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({
type: "bi.absolute",
element: "body",
items: [
{
el: label,
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
}
]
});
};

6
designer-base/src/test/java/com/fr/design/ui/FineUIDemo.java

@ -2,10 +2,8 @@ package com.fr.design.ui;
import com.fr.design.DesignerEnvManager;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import javax.swing.*;
import java.awt.*;
/**
* @author richie

9
designer-base/src/test/java/com/fr/design/ui/ModernUIPaneTest.java

@ -2,13 +2,8 @@ package com.fr.design.ui;
import com.fr.design.DesignerEnvManager;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

40
designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamComponent.java

@ -0,0 +1,40 @@
package com.fr.design.ui.report;
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.ParserType;
import com.fr.web.struct.category.ScriptPath;
import com.fr.web.struct.category.StylePath;
import com.fr.web.struct.impl.FineUI;
/**
* Created by windy on 2019/3/25.
* 报表服务器参数demo使用
*/
public class ReportServerParamComponent extends AssembleComponent {
public static final ReportServerParamComponent KEY = new ReportServerParamComponent();
private ReportServerParamComponent() {
}
@Override
public Atom[] refer() {
return new Atom[] {
FineUI.KEY
};
}
@Override
public ScriptPath script(RequestClient req) {
return ScriptPath.build("/com/fr/design/ui/script/report.js");
}
@Override
public StylePath style() {
return StylePath.build("/com/fr/design/ui/script/report.css", ParserType.DYNAMIC);
}
}

29
designer-base/src/test/java/com/fr/design/ui/report/ReportServerParamDemo.java

@ -0,0 +1,29 @@
package com.fr.design.ui.report;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ui.ModernUIPane;
import com.fr.design.ui.ModernUIPaneTest;
import javax.swing.*;
import java.awt.*;
/**
* Created by windy on 2019/3/25.
* 报表服务器参数demo
*/
public class ReportServerParamDemo {
public static void main(String... args) {
final JFrame frame = new JFrame();
frame.setSize(660, 600);
JPanel contentPane = (JPanel) frame.getContentPane();
// 是否需要开启调试窗口
DesignerEnvManager.getEnvManager().setOpenDebug(true);
final ModernUIPane<ModernUIPaneTest.Model> pane = new ModernUIPane.Builder<ModernUIPaneTest.Model>()
.withComponent(ReportServerParamComponent.KEY).build();
contentPane.add(pane, BorderLayout.CENTER);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}

40
designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingComponent.java

@ -0,0 +1,40 @@
package com.fr.design.ui.report;
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.ParserType;
import com.fr.web.struct.category.ScriptPath;
import com.fr.web.struct.category.StylePath;
import com.fr.web.struct.impl.FineUI;
/**
* Created by windy on 2019/3/26.
* 模板Web属性demo使用
*/
public class TemplateWebSettingComponent extends AssembleComponent {
public static final TemplateWebSettingComponent KEY = new TemplateWebSettingComponent();
private TemplateWebSettingComponent() {
}
@Override
public Atom[] refer() {
return new Atom[] {
FineUI.KEY
};
}
@Override
public ScriptPath script(RequestClient req) {
return ScriptPath.build("/com/fr/design/ui/script/template.js");
}
@Override
public StylePath style() {
return StylePath.build("/com/fr/design/ui/script/template.css", ParserType.DYNAMIC);
}
}

28
designer-base/src/test/java/com/fr/design/ui/report/TemplateWebSettingDemo.java

@ -0,0 +1,28 @@
package com.fr.design.ui.report;
import com.fr.design.DesignerEnvManager;
import com.fr.design.ui.ModernUIPane;
import com.fr.design.ui.ModernUIPaneTest;
import javax.swing.*;
import java.awt.*;
/**
* Created by windy on 2019/3/26.
* 模板Web属性demo
*/
public class TemplateWebSettingDemo {
public static void main(String... args) {
final JFrame frame = new JFrame();
frame.setSize(660, 600);
JPanel contentPane = (JPanel) frame.getContentPane();
// 是否需要开启调试窗口
DesignerEnvManager.getEnvManager().setOpenDebug(true);
final ModernUIPane<ModernUIPaneTest.Model> pane = new ModernUIPane.Builder<ModernUIPaneTest.Model>()
.withComponent(TemplateWebSettingComponent.KEY).build();
contentPane.add(pane, BorderLayout.CENTER);
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
}

6
designer-base/src/test/resources/com/fr/design/ui/demo.html

@ -10,6 +10,12 @@
return Pool.data;
};
</script>
<script type="text/javascript">
window.onload = function () {
document.getElementById("name").value = Pool.data.getName();
document.getElementById("age").value = Pool.data.getAge();
};
</script>
</head>
<body>
<div>测试页面,请点击最下面的按钮</div>

12
designer-base/src/test/resources/com/fr/design/ui/script/css/js/common/settingtab/settingtab.css

@ -0,0 +1,12 @@
.bi-setting-tab .tab-group {
background-color: #F2F4F7;
font-size: 12px;
}
.bi-setting-tab .tab-group .tab-item:hover {
color: #3685f2;
}
.bi-setting-tab .tab-group .tab-item.active {
background-color: #ffffff;
color: #3685f2;
border-top: 3px solid #3685f2;
}

0
designer-base/src/test/resources/com/fr/design/ui/script/css/js/index.css

41
designer-base/src/test/resources/com/fr/design/ui/script/js/common/bar.container.js

@ -0,0 +1,41 @@
!(function(){
/**
* 带确定取消的通用控件
*/
var Bar = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-settings-bar-container",
el: {
}
},
render: function() {
return {
type: "bi.vtape",
items: [this.options.el, {
type: "bi.right_vertical_adapt",
height: 24,
rgap: 10,
vgap: 10,
items: [{
type: "bi.button",
level: "ignore",
text: BI.i18nText("Fine-Design_Report_OK"),
handler: function() {
}
}, {
type: "bi.button",
level: "ignore",
text: BI.i18nText("Fine-Design_Basic_Engine_Cancel"),
handler: function() {
}
}]
}]
}
}
})
BI.shortcut("bi.settings.bar_container", Bar)
})();

89
designer-base/src/test/resources/com/fr/design/ui/script/js/common/edit.list.js

@ -0,0 +1,89 @@
!(function () {
/**
* 事件设置
*/
var List = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-edit-list"
},
render: function () {
var self = this;
return {
type: "bi.vtape",
vgap: 5,
items: [{
type: "bi.vertical_adapt",
height: 24,
items: [{
type: "bi.icon_button",
cls: "text-add-tip-font",
width: 24,
height: 24,
handler: function() {
self.group.addItems([self._createItem()])
}
}, {
type: "bi.icon_button",
cls: "close-font",
width: 24,
height: 24,
handler: function() {
self.group.removeItemAt();
}
}, {
type: "bi.icon_button",
cls: "close-font",
width: 24,
height: 24,
handler: function() {
self.removeItemAt(self._getIndexOfItemValue(self.group.getValue()))
}
}]
}, {
type: "bi.button_group",
cls: "bi-border bi-card",
ref: function(_ref) {
self.group = _ref;
},
items: []
}]
};
},
_getIndexOfItemValue: function(values) {
values = BI.isArray(values) ? values : [values];
var indexes = [];
BI.each(this.group.getAllButtons(), function(idx, button){
if(BI.contains(values, button.getValue())) {
indexes.push(idx);
}
});
return indexes;
},
_createItem: function() {
return {
type: "bi.text_button",
textAlign: "left",
hgap: 10,
text: "选项" + this.group.getAllButtons().length,
cls: "bi-list-item-select",
value: BI.UUID()
};
},
populate: function(items) {
this.group.populate(items);
},
addItems: function(items) {
},
removeItemAt: function(indexes) {
this.group.removeItemAt(indexes);
}
});
BI.shortcut("bi.report.server.param_setting.edit_list", List);
})();

33
designer-base/src/test/resources/com/fr/design/ui/script/js/common/form.rowbackground.setting.js

@ -0,0 +1,33 @@
!(function () {
/**
* 填报当前编辑行背景设置相关
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-form-background-setting"
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical_adapt",
items: [{
type: "bi.multi_select_item",
logic: {
dynamic: true
},
iconWrapperWidth: 16,
text: BI.i18nText("Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background")
}, {
el: {
type: "bi.color_chooser",
width: 24,
height: 24
},
lgap: 10
}]
};
}
});
BI.shortcut("bi.report.form_background_setting", Analysis);
})();

54
designer-base/src/test/resources/com/fr/design/ui/script/js/common/globalsingle.combo.js

@ -0,0 +1,54 @@
!(function () {
/**
*
* 为模板单独设置的相关项
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-global-or-single-combo",
value: 1
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical_adapt",
rgap: 10,
height: 24,
items: [{
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_Blow_Set")
}, {
type: "bi.text_value_combo",
width: 200,
ref: function(_ref) {
self.combo = _ref;
},
value: o.value,
items: [{
text: BI.i18nText("Fine-Design_Report_I_Want_To_Set_Single"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Form_Using_Server_Report_View_Settings"),
value: 2
}],
listerners: [{
eventName: "EVENT_CHANGE",
action: function() {
}
}]
}]
};
},
getValue: function() {
return self.combo.getValue();
},
setValue: function(v) {
this.combo.setValue(v);
}
});
BI.shortcut("bi.report.global_or_single_combo", Analysis);
})();

53
designer-base/src/test/resources/com/fr/design/ui/script/js/common/leavesetting.js

@ -0,0 +1,53 @@
!(function () {
/**
* 离开提示/直接显示控件/自动暂存相关
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-leave-setting",
value: [1]
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.button_group",
value: o.value,
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_Unload_Check"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Basic_Engine_Event_Show_Widgets"),
value: 2
}, {
text: BI.i18nText("Fine-Design_Report_Write_Auto_Stash"),
value: 3
}], {
type: "bi.multi_select_item",
hgap: 5,
logic: {
dynamic: true
},
iconWrapperWidth: 16
}),
chooseType: BI.Selection.Multi,
layouts: [{
type: "bi.vertical_adapt",
rgap: 5
}],
ref: function(_ref) {
self.group = _ref;
}
};
},
getValue: function() {
return self.group.getValue();
},
setValue: function(v) {
this.group.setValue(v);
}
});
BI.shortcut("bi.report.leave_setting", Analysis);
})();

53
designer-base/src/test/resources/com/fr/design/ui/script/js/common/reportshow.location.js

@ -0,0 +1,53 @@
!(function () {
/**
* 报表显示位置相关
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-report-show-location"
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical_adapt",
height: 24,
items: [{
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_Show_Location")
}, {
type: "bi.button_group",
ref: function(_ref) {
self.group = _ref;
},
value: 2,
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_Center_Display"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Report_Left_Display"),
value: 2
}], {
type: "bi.single_select_radio_item",
logic: {
dynamic: true
}
}),
layouts: [{
type: "bi.left",
lgap: 10
}]
}]
};
},
getValue: function() {
return self.group.getValue();
},
setValue: function(v) {
this.group.setValue(v);
}
});
BI.shortcut("bi.report.server.param_setting.report_show_location", Analysis);
})();

59
designer-base/src/test/resources/com/fr/design/ui/script/js/common/settingtab/settingtab.js

@ -0,0 +1,59 @@
!(function () {
var Tab = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-setting-tab",
value: "",
tabItems: [],
cardCreator: BI.emptyFn
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vtape",
items: [{
type: "bi.vertical_adapt",
cls: "tab-group",
items: [{
type: "bi.button_group",
layouts: [{
type: "bi.left"
}],
value: o.value,
items: BI.map(o.tabItems, function(idx, item){
return {
el: BI.extend({
type: "bi.text_button",
hgap: 10,
height: 24
}, item)
};
}),
listeners: [{
eventName: BI.ButtonGroup.EVENT_CHANGE,
action: function (v) {
self.tableTab.setSelect(v);
}
}],
ref: function (_ref) {
// self.buttons = _ref;
}
}],
height: 24
}, {
type: "bi.tab",
cls: "bi-card",
showIndex: o.value,
cardCreator: this.options.cardCreator,
ref: function (ref) {
self.tableTab = ref;
}
}]
};
}
});
BI.shortcut("bi.setting.tab", Tab);
})();

17
designer-base/src/test/resources/com/fr/design/ui/script/js/common/settingtab/settingtab.less

@ -0,0 +1,17 @@
@import "../../index.less";
.bi-setting-tab {
& .tab-group {
background-color: @color-bi-background-light-gray;
font-size: @font-size-12;
& .tab-item {
&:hover {
color: @color-bi-text-highlight;
}
&.active {
background-color: @color-bi-background-default;
color: @color-bi-text-highlight;
border-top: 3px solid @color-bi-text-highlight;
}
}
}
}

53
designer-base/src/test/resources/com/fr/design/ui/script/js/common/sheetlabel.position.js

@ -0,0 +1,53 @@
!(function () {
/**
* sheet标签页显示位置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-report-show-location"
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical_adapt",
height: 24,
items: [{
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_Sheet_Label_Page_Display_Position")
}, {
type: "bi.button_group",
ref: function(_ref) {
self.group = _ref;
},
value: 2,
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Form_Base_Top"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Report_Bottom"),
value: 2
}], {
type: "bi.single_select_radio_item",
logic: {
dynamic: true
}
}),
layouts: [{
type: "bi.left",
lgap: 10
}]
}]
};
},
getValue: function() {
return self.group.getValue();
},
setValue: function(v) {
this.group.setValue(v);
}
});
BI.shortcut("bi.report.sheet_label_location", Analysis);
})();

126
designer-base/src/test/resources/com/fr/design/ui/script/js/common/toobar/toobar.js

@ -0,0 +1,126 @@
!(function(){
var ToolBar = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-settings-tool-bar",
value: [1]
},
render: function() {
var self = this, o = this.options;
return {
type: "bi.vertical",
items: [{
type: "bi.left_right_vertical_adapt",
height: 24,
bgap: 15,
rhgap: 10,
items: {
left: [{
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_Mobile_ToolBar"),
width: 70,
textAlign: "left"
}, {
type: "bi.button_group",
value: o.value,
chooseType: BI.Selection.Multi,
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_ToolBar_Top"),
value: 1,
listeners: [{
eventName: "EVENT_CHANGE",
action: function() {
if(this.isSelected()) {
self._populateDefault();
} else {
self.topRegion.populate();
}
}
}]
}, {
text: BI.i18nText("Fine-Design_Report_ToolBar_Bottom"),
value: 2
}], {
type: "bi.multi_select_item",
hgap: 5,
logic: {
dynamic: true
},
iconWrapperWidth: 16
}),
ref: function(_ref) {
self.group = _ref;
},
layouts: [{
type: "bi.left"
}],
listeners: [{
eventName: "EVENT_CHANGE",
action: function() {
}
}]
}],
right: [{
el: {
type: "bi.text_button",
cls: "bi-border",
text: BI.i18nText("Fine-Design_Basic_Scale_Custom_Button"),
handler: function() {
},
hgap: 5
}
}, {
el: {
type: "bi.text_button",
cls: "bi-border",
text: BI.i18nText("Fine-Design_Report_Restore_Default"),
handler: function() {
},
hgap: 5
}
}]
}
}, {
el: {
type: "bi.settings.tool_bar.region",
height: 56,
title: BI.i18nText("Fine-Design_Report_ToolBar_Top"),
ref: function(_ref) {
self.topRegion = _ref;
},
items: BI.contains(o.value, 1) ? this._createDefaultItems() : []
},
bgap: 20
}, {
type: "bi.settings.tool_bar.region",
height: 56,
title: BI.i18nText("Fine-Design_Report_ToolBar_Bottom"),
ref: function(_ref) {
self.bottomRegion = _ref;
}
}]
}
},
_createDefaultItems: function() {
return BI.createItems(BI.Constants.getConstant("bi.constant.report.template.web_setting.tools"), {
type: "bi.icon_text_item",
height: 24,
extraCls: "bi-background bi-list-item-select bi-border-radius",
logic: {
dynamic: true
},
textHgap: 10,
value: BI.UUID()
})
},
_populateDefault: function() {
this.topRegion.populate(this._createDefaultItems());
}
})
BI.shortcut("bi.settings.tool_bar", ToolBar)
})();

42
designer-base/src/test/resources/com/fr/design/ui/script/js/common/toobar/toolbar.region.js

@ -0,0 +1,42 @@
!(function(){
var Region = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-settings-tool-bar-region",
title: ""
},
render: function() {
var self = this, o = this.options;
return [{
type: "bi.button_group",
cls: "bi-border",
items: o.items,
chooseType: BI.Selection.Multi,
layouts: [{
type: "bi.vertical_adapt",
hgap: 10
}],
ref: function(_ref) {
self.group = _ref;
}
}, {
type: "bi.absolute",
items: [{
el: {
type: "bi.label",
cls: "bi-background",
text: o.title
},
top: -10,
left: 10
}]
}]
},
populate: function(items) {
this.group.populate(items);
}
})
BI.shortcut("bi.settings.tool_bar.region", Region);
})();

67
designer-base/src/test/resources/com/fr/design/ui/script/js/common/toolbarHeight.select.js

@ -0,0 +1,67 @@
!(function () {
/**
* 工具栏高度相关
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-tool-bar-height-select",
height: 24,
value: 2
},
render: function () {
var self = this, o = this.options;
return {
type: "bi.vertical_adapt",
height: 24,
items: [{
el: {
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_Mobile_ToolBar_Height")
},
rgap: 10
}, {
type: "bi.button_group",
value: o.value,
ref: function(_ref) {
self.group = _ref;
},
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_Tool_Bar_High"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Report_Tool_Bar_Middle"),
value: 2
}, {
text: BI.i18nText("Fine-Design_Report_Tool_Bar_Low"),
value: 3
}], {
type: "bi.single_select_radio_item",
logic: {
dynamic: true
}
}),
layouts: [{
type: "bi.vertical_adapt"
}],
listeners: [{
eventName: "EVENT_CHANGE",
action: function() {
}
}]
}]
};
},
getValue: function() {
return self.group.getValue();
},
setValue: function(v) {
this.group.setValue(v);
}
});
BI.shortcut("bi.report.server.param_setting.tool_bar_height_select", Analysis);
})();

47
designer-base/src/test/resources/com/fr/design/ui/script/js/common/usetoolbar.js

@ -0,0 +1,47 @@
!(function () {
/**
* 使用工具栏相关
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-use-tool-bar"
},
render: function () {
var self = this;
return {
type: "bi.vertical_adapt",
height: 24,
items: [{
el: {
type: "bi.multi_select_item",
ref: function(_ref) {
self.multiSelect = _ref;
},
hgap: 5,
selected: true,
text: BI.i18nText("Fine-Design_Report_Use_ToolBar"),
logic: {
dynamic: true
},
iconWrapperWidth: 16
}
}, {
type: "bi.text_button",
cls: "bi-card bi-border",
text: BI.i18nText("Fine-Design_Report_Edit"),
hgap: 10
}]
};
},
getValue: function() {
return self.multiSelect.getSelected();
},
setValue: function(v) {
this.multiSelect.setSelected(v);
}
});
BI.shortcut("bi.report.server.param_setting.use_tool_bar", Analysis);
})();

30
designer-base/src/test/resources/com/fr/design/ui/script/js/enum.js

@ -0,0 +1,30 @@
window.BICst = window.BICst || {};
BICst.REPORT_SERVER_PARAM = {
SPLIT_PAGE_PREVIEW_SETTING: 1,
FORM_PAGE_SETTING: 2,
DATA_ANALYSIS_SETTING: 3,
IMPORT_CSS: 4,
IMPORT_JS: 5,
ERROR_TEMPLATE_DEFINE: 6,
PRINT_SETTING: 7
};
BICst.REPORT_TEMPLATE_WEB_SETTING = {
BASE: 1,
PRINT: 2,
SPLIT_PAGE_PREVIEW_SETTING: 3,
FORM_PAGE_SETTING: 4,
DATA_ANALYSIS_SETTING: 5,
BROWSER: 6,
IMPORT_CSS: 7,
IMPORT_JS: 8
};
BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS = {
FIRST_PAGE: 1,
PRE_PAGE: 2,
NEXT_PAGE: 3,
LAST_PAGE: 4,
PRINT: 5,
EXPORT: 6,
EMAIL: 7
};

53
designer-base/src/test/resources/com/fr/design/ui/script/js/i18n.js

@ -0,0 +1,53 @@
BI.addI18n({
"Fine-Design_Report_WEB_Pagination_Setting": "分页预览设置",
"Fine-Design_Report_WEB_Write_Setting": "填报页面设置",
"Fine-Design_Report_Data_Analysis_Settings": "数据分析设置",
"Fine-Design_Report_ReportServerP_Import_Css": "引用Css",
"Fine-Design_Report_ReportServerP_Import_JavaScript": "引用JavaScript",
"Fine-Design_Report_Error_Handler_Template": "出错模板定义",
"Fine-Design_Report_Print_Setting": "打印设置",
"Fine-Design_Report_Mobile_ToolBar": "工具栏",
"Fine-Design_Report_Tool_Bar_High": "高",
"Fine-Design_Report_Tool_Bar_Middle": "中",
"Fine-Design_Report_Tool_Bar_Low": "低",
"Fine-Design_Report_Mobile_ToolBar_Height": "工具栏高度",
"Fine-Design_Report_Is_Paint_Page": "以图片方式显示",
"Fine-Design_Report_IS_Auto_Scale": "iframe嵌入时自动缩放",
"Fine-Design_Report_IS_TD_HEAVY_EXPORT": "重方式输出格子",
"Fine-Design_Report_Use_ToolBar": "使用工具栏",
"Fine-Design_Report_Show_Location": "报表显示位置",
"Fine-Design_Report_Center_Display": "居中展示",
"Fine-Design_Report_Left_Display": "左展示",
"Fine-Design_Report_Editing_Listeners": "事件编辑",
"Fine-Design_Report_Edit": "编辑",
"Fine-Design_Report_Sheet_Label_Page_Display_Position": "sheet标签页显示位置:",
"Fine-Design_Form_Base_Top": "上",
"Fine-Design_Report_Bottom": "下",
"Fine-Design_Report_Set_Face_Write_Current_Edit_Row_Background": "当前编辑行背景设置",
"Fine-Design_Report_Unload_Check": "未提交离开提示",
"Fine-Design_Basic_Engine_Event_Show_Widgets": "直接显示控件",
"Fine-Design_Report_Write_Auto_Stash": "自动暂存",
"Fine-Design_Report_Engine_Sort_Sort": "排序",
"Fine-Design_Report_Engine_Selection_Filter": "条件筛选",
"Fine-Design_Report_Engine_List_Filter": "列表筛选",
"Fine-Design_Basic_Engine_Cancel": "取消",
"Fine-Design_Report_OK": "确定",
"Fine-Design_Report_Basic": "基本",
"Fine-Design_Report_Printer(Server)": "打印机(服务器)",
"Fine-Design_Report_Browser_Background": "浏览器背景",
"Fine-Design_Report_I_Want_To_Set_Single": "为该模板单独设置",
"Fine-Design_Form_Using_Server_Report_View_Settings": "采用服务器设置",
"Fine-Design_Report_Blow_Set": "以下设置:",
"Fine-Design_Report_PageSetup_Page": "页面",
"Fine-Design_Report_ToolBar_Top": "顶部工具栏",
"Fine-Design_Report_ToolBar_Bottom": "底部工具栏",
"Fine-Design_Basic_Scale_Custom_Button": "自定义",
"Fine-Design_Report_Restore_Default": "恢复默认",
"Fine-Design_Report_Engine_ReportServerP_First": "首页",
"Fine-Design_Report_Engine_ReportServerP_Previous": "上一页",
"Fine-Design_Report_Engine_ReportServerP_Next": "下一页",
"Fine-Design_Report_Engine_ReportServerP_Last": "末页",
"Fine-Design_Report_Engine_Print": "打印",
"Fine-Design_Report_Engine_Export": "导出",
"Fine-Design_Report_Engine_Email": "邮件"
});

1
designer-base/src/test/resources/com/fr/design/ui/script/js/index.less

@ -0,0 +1 @@
@import "../../fineui/src/less/index.less";

59
designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/data.analysis.js

@ -0,0 +1,59 @@
!(function () {
/**
* 服务器 数据分析设置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-data-analysis"
},
render: function () {
return {
type: "bi.vtape",
vgap: 10,
hgap: 10,
items: [{
type: "bi.button_group",
height: 24,
value: [1,2,3],
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_Engine_Sort_Sort"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Report_Engine_Selection_Filter"),
value: 2
}, {
text: BI.i18nText("Fine-Design_Report_Engine_List_Filter"),
value: 2
}], {
type: "bi.multi_select_item",
logic: {
dynamic: true
},
iconWrapperWidth: 16,
hgap: 5
}),
chooseType: BI.Selection.Multi,
layouts: [{
type: "bi.vertical_adapt"
}]
}, {
type: "bi.report.server.param_setting.use_tool_bar",
height: 24,
value: true
}, {
type: "bi.report.server.param_setting.tool_bar_height_select",
height: 24
}, {
type: "bi.label",
height: 24,
textAlign: "left",
text: BI.i18nText("Fine-Design_Report_Editing_Listeners") + ":",
}, {
type: "bi.report.server.param_setting.edit_list"
}]
};
}
});
BI.shortcut("bi.report.server.param_setting.data_analysis", Analysis);
})();

69
designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/form.page.js

@ -0,0 +1,69 @@
!(function () {
/**
* 服务器 填报预览设置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-form-page"
},
render: function () {
return {
type: "bi.vtape",
vgap: 10,
hgap: 10,
items: [{
type: "bi.grid",
height: 78,
columns: 2,
rows: 2,
items: [{
column: 0,
row: 0,
el: {
type: "bi.report.sheet_label_location",
height: 24
}
}, {
column: 1,
row: 0,
el: {
type: "bi.report.server.param_setting.report_show_location",
height: 24
}
}, {
column: 0,
row: 1,
el: {
type: "bi.report.form_background_setting",
height: 24
}
}, {
column: 1,
row: 1,
el: {
type: "bi.report.leave_setting",
height: 24
}
}]
}, {
type: "bi.report.server.param_setting.use_tool_bar",
height: 24,
value: true
}, {
type: "bi.report.server.param_setting.tool_bar_height_select",
height: 24
}, {
type: "bi.label",
height: 24,
textAlign: "left",
text: BI.i18nText("Fine-Design_Report_Editing_Listeners") + ":",
}, {
type: "bi.report.server.param_setting.edit_list"
}]
};
}
});
BI.shortcut("bi.report.server.param_setting.form_page", Analysis);
})();

66
designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/card/page.preview.js

@ -0,0 +1,66 @@
!(function () {
/**
* 服务器 分页预览设置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-page-preview"
},
render: function () {
return {
type: "bi.vtape",
vgap: 10,
hgap: 10,
items: [{
type: "bi.report.server.param_setting.report_show_location",
height: 24
}, {
type: "bi.button_group",
height: 92,
chooseType: BI.Selection.Multi,
items: BI.createItems([{
el: {
text: BI.i18nText("Fine-Design_Report_Is_Paint_Page"),
value: 1
},
bgap: 10
}, {
el: {
text: BI.i18nText("Fine-Design_Report_IS_Auto_Scale"),
value: 2
},
bgap: 10
}, {
text: BI.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"),
value: 3
}], {
type: "bi.multi_select_item",
hgap: 5,
logic: {
dynamic: true
},
iconWrapperWidth: 16
}),
layouts: [{
type: "bi.vertical"
}]
}, {
type: "bi.report.server.param_setting.use_tool_bar",
height: 24
}, {
type: "bi.report.server.param_setting.tool_bar_height_select",
height: 24
}, {
type: "bi.label",
height: 24,
textAlign: "left",
text: BI.i18nText("Fine-Design_Report_Editing_Listeners") + ":",
}, {
type: "bi.report.server.param_setting.edit_list"
}]
};
}
});
BI.shortcut("bi.report.server.param_setting.page_preview", Analysis);
})();

33
designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/reportserver.constants.js

@ -0,0 +1,33 @@
!(function () {
BI.constant("bi.constant.report.server.param_setting", [
{
text: BI.i18nText("Fine-Design_Report_WEB_Pagination_Setting"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.SPLIT_PAGE_PREVIEW_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_WEB_Write_Setting"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.FORM_PAGE_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_Data_Analysis_Settings"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.DATA_ANALYSIS_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_ReportServerP_Import_Css"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.IMPORT_CSS
}, {
text: BI.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.IMPORT_JS
}, {
text: BI.i18nText("Fine-Design_Report_Error_Handler_Template"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.ERROR_TEMPLATE_DEFINE
}, {
text: BI.i18nText("Fine-Design_Report_Print_Setting"),
cls: "tab-item",
value: BICst.REPORT_SERVER_PARAM.PRINT_SETTING
}]
);
})();

50
designer-base/src/test/resources/com/fr/design/ui/script/js/reportserverparam/reportserver.js

@ -0,0 +1,50 @@
!(function () {
/**
* 报表服务器参数面板
*/
var Tab = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting"
},
render: function () {
return {
type: "bi.setting.tab",
value: BICst.REPORT_SERVER_PARAM.SPLIT_PAGE_PREVIEW_SETTING,
tabItems: BI.Constants.getConstant("bi.constant.report.server.param_setting"),
cardCreator: BI.bind(this._createCard, this)
};
},
_createCard: function (v) {
switch (v) {
case BICst.REPORT_SERVER_PARAM.SPLIT_PAGE_PREVIEW_SETTING:
return {
type: "bi.report.server.param_setting.page_preview"
};
case BICst.REPORT_SERVER_PARAM.FORM_PAGE_SETTING:
return {
type: "bi.report.server.param_setting.form_page"
};
case BICst.REPORT_SERVER_PARAM.DATA_ANALYSIS_SETTING:
return {
type: "bi.report.server.param_setting.data_analysis"
}
case BICst.REPORT_SERVER_PARAM.IMPORT_CSS:
case BICst.REPORT_SERVER_PARAM.IMPORT_JS:
case BICst.REPORT_SERVER_PARAM.ERROR_TEMPLATE_DEFINE:
case BICst.REPORT_SERVER_PARAM.PRINT_SETTING:
default:
return {
type: "bi.label",
text: "1"
};
}
}
});
BI.shortcut("bi.report.server.param_setting", Tab);
})();

64
designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/card/form.page.js

@ -0,0 +1,64 @@
!(function () {
/**
* 填报页面设置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-form-page"
},
render: function () {
return {
type: "bi.vtape",
vgap: 10,
hgap: 10,
items: [{
type: "bi.report.global_or_single_combo",
height: 24
}, {
type: "bi.grid",
height: 78,
columns: 2,
rows: 2,
items: [{
column: 0,
row: 0,
el: {
type: "bi.report.sheet_label_location"
}
}, {
column: 1,
row: 0,
el: {
type: "bi.report.server.param_setting.report_show_location",
height: 24
}
}, {
column: 0,
row: 1,
el: {
type: "bi.report.form_background_setting"
}
}, {
column: 1,
row: 1,
el: {
type: "bi.report.leave_setting"
}
}]
}, {
type: "bi.settings.tool_bar",
height: 180
}, {
type: "bi.label",
height: 24,
textAlign: "left",
text: BI.i18nText("Fine-Design_Report_Editing_Listeners") + ":",
}, {
type: "bi.report.server.param_setting.edit_list"
}]
};
}
});
BI.shortcut("bi.report.template.web_setting.form_page", Analysis);
})();

73
designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/card/page.preview.js

@ -0,0 +1,73 @@
!(function () {
/**
* 分页预览设置
*/
var Analysis = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-server-param-setting-page-preview"
},
render: function () {
return {
type: "bi.vtape",
vgap: 10,
hgap: 10,
items: [{
type: "bi.report.global_or_single_combo",
height: 24
}, {
type: "bi.report.server.param_setting.report_show_location",
height: 24
}, {
type: "bi.vertical_adapt",
height: 24,
items: [{
type: "bi.label",
text: BI.i18nText("Fine-Design_Report_PageSetup_Page"),
textAlign: "right",
width: 70
}, {
el: {
type: "bi.button_group",
height: 24,
chooseType: BI.Selection.Multi,
items: BI.createItems([{
text: BI.i18nText("Fine-Design_Report_Is_Paint_Page"),
value: 1
}, {
text: BI.i18nText("Fine-Design_Report_IS_Auto_Scale"),
value: 2
}, {
text: BI.i18nText("Fine-Design_Report_IS_TD_HEAVY_EXPORT"),
value: 3
}], {
type: "bi.multi_select_item",
hgap: 5,
logic: {
dynamic: true
},
iconWrapperWidth: 16
}),
layouts: [{
type: "bi.left",
lgap: 5
}]
},
lgap: 10
}]
}, {
type: "bi.settings.tool_bar",
height: 180
}, {
type: "bi.label",
height: 24,
textAlign: "left",
text: BI.i18nText("Fine-Design_Report_Editing_Listeners") + ":",
}, {
type: "bi.report.server.param_setting.edit_list"
}]
};
}
});
BI.shortcut("bi.report.template.web_setting.page_preview", Analysis);
})();

69
designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/templateweb.constants.js

@ -0,0 +1,69 @@
!(function () {
BI.constant("bi.constant.report.template.web_setting", [
{
text: BI.i18nText("Fine-Design_Report_Basic"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.BASE
}, {
text: BI.i18nText("Fine-Design_Report_Printer(Server)"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.PRINT
}, {
text: BI.i18nText("Fine-Design_Report_WEB_Pagination_Setting"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.SPLIT_PAGE_PREVIEW_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_WEB_Write_Setting"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.FORM_PAGE_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_Data_Analysis_Settings"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.DATA_ANALYSIS_SETTING
}, {
text: BI.i18nText("Fine-Design_Report_Browser_Background"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.BROWSER
}, {
text: BI.i18nText("Fine-Design_Report_ReportServerP_Import_Css"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.IMPORT_CSS
}, {
text: BI.i18nText("Fine-Design_Report_ReportServerP_Import_JavaScript"),
cls: "tab-item",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.IMPORT_JS
}]
);
BI.constant("bi.constant.report.template.web_setting.tools", [
{
text: BI.i18nText("Fine-Design_Report_Engine_ReportServerP_First"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.FIRST_PAGE
}, {
text: BI.i18nText("Fine-Design_Report_Engine_ReportServerP_Previous"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.PRE_PAGE
}, {
text: BI.i18nText("Fine-Design_Report_Engine_ReportServerP_Next"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.NEXT_PAGE
}, {
text: BI.i18nText("Fine-Design_Report_Engine_ReportServerP_Last"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.LAST_PAGE
}, {
text: BI.i18nText("Fine-Design_Report_Engine_Print"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.PRINT
}, {
text: BI.i18nText("Fine-Design_Report_Engine_Export"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.EXPORT
}, {
text: BI.i18nText("Fine-Design_Report_Engine_Email"),
cls: "close-font",
value: BICst.REPORT_TEMPLATE_WEB_SETTING_TOOLS.EMAIL
}]
);
})();

48
designer-base/src/test/resources/com/fr/design/ui/script/js/templatewebproperties/templateweb.js

@ -0,0 +1,48 @@
!(function () {
/**
* 模板Web属性面板
*/
var Tab = BI.inherit(BI.Widget, {
props: {
baseCls: "bi-report-template-web-setting"
},
render: function () {
return {
type: "bi.setting.tab",
value: BICst.REPORT_TEMPLATE_WEB_SETTING.SPLIT_PAGE_PREVIEW_SETTING,
tabItems: BI.Constants.getConstant("bi.constant.report.template.web_setting"),
cardCreator: BI.bind(this._createCard, this)
};
},
_createCard: function (v) {
switch (v) {
case BICst.REPORT_TEMPLATE_WEB_SETTING.SPLIT_PAGE_PREVIEW_SETTING:
return {
type: "bi.report.template.web_setting.page_preview"
}
case BICst.REPORT_TEMPLATE_WEB_SETTING.FORM_PAGE_SETTING:
return {
type: "bi.report.template.web_setting.form_page"
}
case BICst.REPORT_TEMPLATE_WEB_SETTING.DATA_ANALYSIS_SETTING:
case BICst.REPORT_TEMPLATE_WEB_SETTING.BASE:
case BICst.REPORT_TEMPLATE_WEB_SETTING.PRINT:
case BICst.REPORT_TEMPLATE_WEB_SETTING.BROWSER:
case BICst.REPORT_TEMPLATE_WEB_SETTING.IMPORT_CSS:
case BICst.REPORT_TEMPLATE_WEB_SETTING.IMPORT_JS:
default:
return {
type: "bi.label",
text: "1"
};
}
}
});
BI.shortcut("bi.report.template.web_setting", Tab);
})();

12
designer-base/src/test/resources/com/fr/design/ui/script/report.css

@ -0,0 +1,12 @@
.bi-setting-tab .tab-group {
background-color: #F2F4F7;
font-size: 12px;
}
.bi-setting-tab .tab-group .tab-item:hover {
color: #3685f2;
}
.bi-setting-tab .tab-group .tab-item.active {
background-color: #ffffff;
color: #3685f2;
border-top: 3px solid #3685f2;
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save