Browse Source

Merge branch 'feature/big-screen' of ssh://code.fineres.com:7999/~zheng/C-design into feature/big-screen

feature/big-screen
shine 3 years ago
parent
commit
9e8b3d3ea7
  1. 29
      build.gradle
  2. 5
      designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
  3. 2
      designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java
  4. 2
      designer-base/src/main/java/com/fr/design/actions/community/BugAction.java
  5. 2
      designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java
  6. 2
      designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java
  7. 2
      designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java
  8. 2
      designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java
  9. 2
      designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java
  10. 2
      designer-base/src/main/java/com/fr/design/actions/community/SignAction.java
  11. 2
      designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java
  12. 2
      designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java
  13. 2
      designer-base/src/main/java/com/fr/design/actions/community/UpAction.java
  14. 2
      designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java
  15. 6
      designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java
  16. 23
      designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java
  17. 87
      designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java
  18. 240
      designer-base/src/main/java/com/fr/design/dialog/NotificationDialog.java
  19. 8
      designer-base/src/main/java/com/fr/design/dialog/NotificationDialogAction.java
  20. 29
      designer-base/src/main/java/com/fr/design/dialog/UIExpandDialog.java
  21. 17
      designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java
  22. 3
      designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java
  23. 5
      designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java
  24. 3
      designer-base/src/main/java/com/fr/design/extra/PluginUpdatePane.java
  25. 2
      designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java
  26. 5
      designer-base/src/main/java/com/fr/design/file/Releasable.java
  27. 4
      designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java
  28. 64
      designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java
  29. 35
      designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java
  30. 10
      designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java
  31. 10
      designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java
  32. 10
      designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java
  33. 2
      designer-base/src/main/java/com/fr/design/locale/impl/BugNeedMark.java
  34. 4
      designer-base/src/main/java/com/fr/design/locale/impl/TechSupportMark.java
  35. 10
      designer-base/src/main/java/com/fr/design/locale/impl/UserInfoMark.java
  36. 6
      designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java
  37. 60
      designer-base/src/main/java/com/fr/design/login/AbstractDesignerSSO.java
  38. 5
      designer-base/src/main/java/com/fr/design/login/DesignerLoginHelper.java
  39. 13
      designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java
  40. 112
      designer-base/src/main/java/com/fr/design/login/message/DesignerMessageHelper.java
  41. 92
      designer-base/src/main/java/com/fr/design/login/message/NotificationActionType.java
  42. 31
      designer-base/src/main/java/com/fr/design/login/message/NotificationJumpType.java
  43. 52
      designer-base/src/main/java/com/fr/design/login/utils/DesignerLoginUtils.java
  44. 340
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java
  45. 16
      designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java
  46. 6
      designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java
  47. 2
      designer-base/src/main/java/com/fr/design/mainframe/reuse/ReuseGuideDialog.java
  48. 4
      designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java
  49. 32
      designer-base/src/main/java/com/fr/design/mod/ContentObjectManager.java
  50. 7
      designer-base/src/main/java/com/fr/design/mod/ContentReplaceUtil.java
  51. 5
      designer-base/src/main/java/com/fr/design/mod/ContentReplacer.java
  52. 21
      designer-base/src/main/java/com/fr/design/mod/ContentReplacerCenter.java
  53. 4
      designer-base/src/main/java/com/fr/design/mod/impl/repalce/JavaScriptContentReplacer.java
  54. 5
      designer-base/src/main/java/com/fr/design/mod/impl/repalce/VanChartHtmlLabelContentReplacer.java
  55. 53
      designer-base/src/main/java/com/fr/design/notification/Notification.java
  56. 42
      designer-base/src/main/java/com/fr/design/notification/NotificationCenter.java
  57. 133
      designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterDialog.java
  58. 52
      designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java
  59. 148
      designer-base/src/main/java/com/fr/design/notification/ui/NotificationPane.java
  60. 6
      designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java
  61. 29
      designer-base/src/main/java/com/fr/design/ui/ModernUIPane.java
  62. 2
      designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java
  63. 32
      designer-base/src/main/java/com/fr/design/update/actions/SyncFileProcess.java
  64. 15
      designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java
  65. 5
      designer-base/src/main/java/com/fr/design/upm/UpmBridge.java
  66. 57
      designer-base/src/main/java/com/fr/design/versioncheck/VersionCheckUtils.java
  67. 125
      designer-base/src/main/java/com/fr/env/CheckServiceDialog.java
  68. 55
      designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java
  69. 2
      designer-base/src/main/java/com/fr/env/VersionCheckMessageDialog.java
  70. BIN
      designer-base/src/main/resources/com/fr/design/images/dashboard/guide.png
  71. BIN
      designer-base/src/main/resources/com/fr/design/images/lookandfeel/circularErrorIcon.png
  72. BIN
      designer-base/src/main/resources/com/fr/design/images/lookandfeel/circularWarningIcon.png
  73. BIN
      designer-base/src/main/resources/com/fr/design/images/lookandfeel/deleteIcon.png
  74. BIN
      designer-base/src/main/resources/com/fr/design/images/lookandfeel/newMessageIcon.png
  75. 11
      designer-base/src/main/resources/com/fr/design/login/guide.css
  76. 13
      designer-base/src/main/resources/com/fr/design/login/guide.html
  77. 2
      designer-base/src/main/resources/com/fr/design/login/guide.js
  78. BIN
      designer-base/src/main/resources/com/fr/design/login/img/icon_close_normal.png
  79. BIN
      designer-base/src/main/resources/com/fr/design/login/img/icon_install_normal.png
  80. 54
      designer-base/src/main/resources/com/fr/design/login/lib/locale/login_en_US.js
  81. 54
      designer-base/src/main/resources/com/fr/design/login/lib/locale/login_ja_JP.js
  82. 54
      designer-base/src/main/resources/com/fr/design/login/lib/locale/login_ko_KR.js
  83. 54
      designer-base/src/main/resources/com/fr/design/login/lib/locale/login_zh_TW.js
  84. 44
      designer-base/src/main/resources/com/fr/design/login/login.css
  85. 13
      designer-base/src/main/resources/com/fr/design/login/login.html
  86. 2
      designer-base/src/main/resources/com/fr/design/login/login.js
  87. BIN
      designer-base/src/main/resources/com/fr/design/notification/ui/notificationCenter.png
  88. BIN
      designer-base/src/main/resources/com/fr/design/notification/ui/notificationCenterDot.png
  89. 10
      designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java
  90. 14
      designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java
  91. 4
      designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextDialog.java
  92. 2
      designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java
  93. 8
      designer-form/src/main/java/com/fr/design/designer/beans/models/ModelUtil.java
  94. 17
      designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java
  95. 14
      designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java
  96. 12
      designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java
  97. 12
      designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java
  98. 8
      designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java
  99. 19
      designer-form/src/main/java/com/fr/design/mainframe/JForm.java
  100. 28
      designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java
  101. Some files were not shown because too many files have changed in this diff Show More

29
build.gradle

@ -28,17 +28,6 @@ dependencies {
api project(':designer-realize') api project(':designer-realize')
} }
configurations.all {
resolutionStrategy {
force 'com.fr.third:jxbrowser:6.23'
force 'com.fr.third:jxbrowser-mac:6.23'
force 'com.fr.third:jxbrowser-win64:6.23'
force 'com.fr.third:jxbrowser:7.5'
force 'com.fr.third:jxbrowser-mac:7.5'
force 'com.fr.third:jxbrowser-win64:7.5'
}
}
allprojects { allprojects {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'java-library' apply plugin: 'java-library'
@ -68,18 +57,12 @@ allprojects {
} }
dependencies { dependencies {
implementation ('com.fr.third:jxbrowser:6.23') { implementation 'com.fr.third:jxbrowser:6.23'
force = true implementation 'com.fr.third:jxbrowser-mac:6.23'
} implementation 'com.fr.third:jxbrowser-win64:6.23'
implementation ('com.fr.third:jxbrowser-mac:6.23') { implementation 'com.fr.third:jxbrowser-v7:7.5'
force = true implementation 'com.fr.third:jxbrowser-mac-v7:7.5'
} implementation 'com.fr.third:jxbrowser-win64-v7:7.5'
implementation ('com.fr.third:jxbrowser-win64:6.23') {
force = true
}
implementation 'com.fr.third:jxbrowser:7.5'
implementation 'com.fr.third:jxbrowser-mac:7.5'
implementation 'com.fr.third:jxbrowser-win64:7.5'
implementation 'com.fr.third:jxbrowser-swing:7.5' implementation 'com.fr.third:jxbrowser-swing:7.5'
implementation 'com.fr.third.server:servlet-api:3.0' implementation 'com.fr.third.server:servlet-api:3.0'
implementation 'org.swingexplorer:swexpl:2.0.1' implementation 'org.swingexplorer:swexpl:2.0.1'

5
designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java

@ -17,12 +17,12 @@ import com.fr.design.file.TemplateTreePane;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.design.notification.NotificationCenter;
import com.fr.design.utils.DesignUtils; import com.fr.design.utils.DesignUtils;
import com.fr.env.CheckServiceDialog; import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.env.EnvListPane; import com.fr.env.EnvListPane;
import com.fr.env.RemoteWorkspaceURL; import com.fr.env.RemoteWorkspaceURL;
import com.fr.env.TestConnectionResult; import com.fr.env.TestConnectionResult;
import com.fr.env.VersionCheckMessageDialog;
import com.fr.exit.DesignerExiter; import com.fr.exit.DesignerExiter;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralUtils; import com.fr.general.GeneralUtils;
@ -183,6 +183,7 @@ public class EnvChangeEntrance {
if (model != null) { if (model != null) {
model.envChanged(); model.envChanged();
} }
NotificationCenter.getInstance().clearAllNotifications();
return true; return true;
} }

2
designer-base/src/main/java/com/fr/design/actions/community/BBSAction.java

@ -20,7 +20,7 @@ public class BBSAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs"); return CloudCenter.getInstance().acquireUrlByKind("bbs", "http://bbs.fanruan.com/");
} }
public static final MenuKeySet BBS = new MenuKeySet() { public static final MenuKeySet BBS = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/BugAction.java

@ -17,7 +17,7 @@ public class BugAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.bugs"); return CloudCenter.getInstance().acquireUrlByKind("bbs.bugs", "http://bbs.fanruan.com/forum-156-1.html");
} }
public static final MenuKeySet BUG = new MenuKeySet() { public static final MenuKeySet BUG = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/CenterAction.java

@ -18,7 +18,7 @@ public class CenterAction extends UpAction {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.center"); return CloudCenter.getInstance().acquireUrlByKind("bbs.center", "http://bbs.fanruan.com/events/");
} }
public static final MenuKeySet CENTER = new MenuKeySet() { public static final MenuKeySet CENTER = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/CusDemandAction.java

@ -25,7 +25,7 @@ public class CusDemandAction extends UpAction{
@Override @Override
public void actionPerformed(ActionEvent arg0) public void actionPerformed(ActionEvent arg0)
{ {
String url = CloudCenter.getInstance().acquireUrlByKind("bbs.demand"); String url = CloudCenter.getInstance().acquireUrlByKind("bbs.demand", "https://market.fanruan.com/demand");
BrowseUtils.browser(url); BrowseUtils.browser(url);
} }

2
designer-base/src/main/java/com/fr/design/actions/community/FacebookFansAction.java

@ -18,7 +18,7 @@ public class FacebookFansAction extends UpAction {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
BrowseUtils.browser(CloudCenter.getInstance().acquireUrlByKind("facebook.fans.tw")); BrowseUtils.browser(CloudCenter.getInstance().acquireUrlByKind("facebook.fans.tw", "https://www.facebook.com/twfinereport"));
} }
public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() { public static final MenuKeySet FACEBOOKFANS = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/NeedAction.java

@ -18,7 +18,7 @@ public class NeedAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.needs"); return CloudCenter.getInstance().acquireUrlByKind("bbs.needs", "http://bbs.fanruan.com/forum-56-1.html");
} }
public static final MenuKeySet NEED = new MenuKeySet() { public static final MenuKeySet NEED = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/QuestionAction.java

@ -18,7 +18,7 @@ public class QuestionAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.questions"); return CloudCenter.getInstance().acquireUrlByKind("bbs.questions", "http://bbs.fanruan.com/wenda");
} }
public static final MenuKeySet QUESTIONS = new MenuKeySet() { public static final MenuKeySet QUESTIONS = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/SignAction.java

@ -18,7 +18,7 @@ public class SignAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.aut"); return CloudCenter.getInstance().acquireUrlByKind("bbs.aut", "https://bbs.fanruan.com/certification/");
} }
public static final MenuKeySet SIGN = new MenuKeySet() { public static final MenuKeySet SIGN = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/TechSolutionAction.java

@ -20,7 +20,7 @@ public class TechSolutionAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.solution"); return CloudCenter.getInstance().acquireUrlByKind("bbs.solution", "http://bbs.fanruan.com/forum-113-1.html");
} }
public static final MenuKeySet TSO = new MenuKeySet() { public static final MenuKeySet TSO = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/TemplateStoreAction.java

@ -46,7 +46,7 @@ public class TemplateStoreAction extends UpdateAction {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
ComponentCollector.getInstance().collectTepMenuEnterClick(); ComponentCollector.getInstance().collectTepMenuEnterClick();
String url = CloudCenter.getInstance().acquireUrlByKind("design.market.template"); String url = CloudCenter.getInstance().acquireUrlByKind("design.market.template", "https://market.fanruan.com/template");
BrowseUtils.browser(url); BrowseUtils.browser(url);
} }
} }

2
designer-base/src/main/java/com/fr/design/actions/community/UpAction.java

@ -18,7 +18,7 @@ public class UpAction extends AbstractDesignerSSO {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.update"); return CloudCenter.getInstance().acquireUrlByKind("bbs.update", "http://bbs.fanruan.com/forum.php?mod=collection&action=view&ctid=10");
} }
public static final MenuKeySet UPDATE = new MenuKeySet() { public static final MenuKeySet UPDATE = new MenuKeySet() {

2
designer-base/src/main/java/com/fr/design/actions/community/WorkOrderCenterAction.java

@ -16,6 +16,6 @@ public class WorkOrderCenterAction extends UpAction {
@Override @Override
public String getJumpUrl() { public String getJumpUrl() {
return CloudCenter.getInstance().acquireUrlByKind("bbs.work.order.center"); return CloudCenter.getInstance().acquireUrlByKind("bbs.work.order.center", "https://service.fanruan.com/ticket");
} }
} }

6
designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java

@ -76,7 +76,7 @@ public final class WebPreviewUtils {
browserTemplate(jt, baseRoute, map, actionType); browserTemplate(jt, baseRoute, map, actionType);
} }
}); });
worker.start(jt.getTarget().getTemplateID()); worker.start(jt.getRuntimeId());
return; return;
} }
browserTemplate(jt, baseRoute, map, actionType); browserTemplate(jt, baseRoute, map, actionType);
@ -97,7 +97,7 @@ public final class WebPreviewUtils {
); );
if (OK_OPTION == selVal) { if (OK_OPTION == selVal) {
CallbackSaveWorker worker = jt.saveAs(); CallbackSaveWorker worker = jt.saveAs();
worker.start(jt.getTarget().getTemplateID()); worker.start(jt.getRuntimeId());
worker.addSuccessCallback(new Runnable() { worker.addSuccessCallback(new Runnable() {
@Override @Override
public void run() { public void run() {
@ -125,7 +125,7 @@ public final class WebPreviewUtils {
browseUrl(jt.getEditingFILE(), baseRoute, map, actionType, jt); browseUrl(jt.getEditingFILE(), baseRoute, map, actionType, jt);
} }
}); });
worker.start(jt.getTarget().getTemplateID()); worker.start(jt.getRuntimeId());
} }
} }
} }

23
designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java

@ -5,10 +5,10 @@ import com.fr.data.impl.JDBCDatabaseConnection;
import com.fr.design.border.UITitledBorder; import com.fr.design.border.UITitledBorder;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBox;
import com.fr.design.gui.ilable.ActionLabel;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength;
import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itextfield.UITextField;
import com.fr.design.gui.ilable.ActionLabel;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayout;
@ -21,17 +21,13 @@ import com.fr.general.ComparatorUtils;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants; import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JFileChooser; import javax.swing.JFileChooser;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JPasswordField; import javax.swing.JPasswordField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Component; import java.awt.Component;
@ -39,13 +35,18 @@ import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.InputMethodEvent;
import java.awt.event.InputMethodListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File; import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import javax.swing.event.DocumentEvent; import java.util.regex.Matcher;
import javax.swing.event.DocumentListener; import java.util.regex.Pattern;
public class JDBCDefPane extends JPanel { public class JDBCDefPane extends JPanel {
public static final String DRIVER_TYPE = "driver_type"; public static final String DRIVER_TYPE = "driver_type";
@ -291,7 +292,7 @@ public class JDBCDefPane extends JPanel {
jdbcDatabase = new JDBCDatabaseConnection(); jdbcDatabase = new JDBCDatabaseConnection();
} }
Object driveItem = this.driverComboBox.getSelectedItem(); Object driveItem = this.driverComboBox.getSelectedItem();
jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString().trim());
jdbcDatabase.setURL(this.urlTextField.getText().trim()); jdbcDatabase.setURL(this.urlTextField.getText().trim());
jdbcDatabase.setUser(this.userNameTextField.getText().trim()); jdbcDatabase.setUser(this.userNameTextField.getText().trim());
jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim());

87
designer-base/src/main/java/com/fr/design/data/datapane/preview/sql/PreviewPerformedSqlPane.java

@ -46,6 +46,8 @@ import java.awt.Frame;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
@ -107,11 +109,11 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener {
topPanel.add(imagePanel, BorderLayout.WEST); topPanel.add(imagePanel, BorderLayout.WEST);
topPanel.add(messagePanel, BorderLayout.CENTER); topPanel.add(messagePanel, BorderLayout.CENTER);
topPanel.setBorder(BorderFactory.createEmptyBorder(10,10,0,10)); topPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
//中间的SQL面板 //中间的SQL面板
centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
centerPanel.setBorder(BorderFactory.createEmptyBorder(0,10,10,10)); centerPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
JScrollPane scrollPane = new JScrollPane(); JScrollPane scrollPane = new JScrollPane();
JTextArea checkArea = new JTextArea(sql); JTextArea checkArea = new JTextArea(sql);
checkArea.setEditable(false); checkArea.setEditable(false);
@ -135,7 +137,7 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener {
UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK")); UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Report_OK"));
okButton.addActionListener(this); okButton.addActionListener(this);
bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane(); bottomPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
bottomPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); bottomPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
bottomPanel.add(okButton, BorderLayout.EAST); bottomPanel.add(okButton, BorderLayout.EAST);
this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql")); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Preview_Performed_Sql"));
@ -144,6 +146,12 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener {
this.add(centerPanel, BorderLayout.CENTER); this.add(centerPanel, BorderLayout.CENTER);
this.add(bottomPanel, BorderLayout.SOUTH); this.add(bottomPanel, BorderLayout.SOUTH);
this.setSize(600, 400); this.setSize(600, 400);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
close();
}
});
GUICoreUtils.centerWindow(this); GUICoreUtils.centerWindow(this);
} }
@ -167,56 +175,65 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener {
parameterMap.put(parameter.getName(), parameter.getValue()); parameterMap.put(parameter.getName(), parameter.getValue());
} }
} }
boolean showOriginSql = true;
for (ParameterProvider parameter : DataOperator.getInstance().getTableDataParameters(tableData)) { for (ParameterProvider parameter : DataOperator.getInstance().getTableDataParameters(tableData)) {
if (parameterMap.containsKey(parameter.getName())) { if (parameterMap.containsKey(parameter.getName())) {
Object value = parameterMap.get(parameter.getName()); parameter.setValue(parameterMap.get(parameter.getName()));
if (value != null && !StringUtils.EMPTY.equals(value)) {
showOriginSql = false;
}
parameter.setValue(value);
} }
} }
String sql; String sql;
// 计算高亮文本位置 // 计算高亮文本位置
List<int[]> specialCharParamIndex = null; List<int[]> specialCharParamIndex = null;
boolean highlight = true; boolean highlight = true;
if (showOriginSql) { NameSpace ns = ParameterMapNameSpace.create(parameterMap);
sql = tableData.getQuery(); calculator.pushNameSpace(ns);
} else { Parameter[] paras = processParameters(tableData, calculator);
NameSpace ns = ParameterMapNameSpace.create(parameterMap); // 所有被转义参数的集合
calculator.pushNameSpace(ns); refreshEscapeSqlHelper();
Parameter[] paras = processParameters(tableData, calculator); Set<String> specialCharParam = EscapeSqlHelper.getInstance().getSpecialCharParam(paras);
// 所有被转义参数的集合 // 将参数转义等
Set<String> specialCharParam = EscapeSqlHelper.getInstance().getSpecialCharParam(paras); Set<TableDataProvider> tableDataProviders = getTableDataProviders();
// 将参数转义等 for (TableDataProvider provider : tableDataProviders) {
Set<TableDataProvider> tableDataProviders = getTableDataProviders(); provider.processParametersBeforeAnalyzeSQL(paras, calculator);
for (TableDataProvider provider : tableDataProviders) { }
provider.processParametersBeforeAnalyzeSQL(paras, calculator);
}
if (!specialCharParam.isEmpty()) { if (!specialCharParam.isEmpty()) {
specialCharParamIndex = ParameterHelper.analyzeCurrentContextTableData4Template(tableData.getQuery(), paras, specialCharParam); specialCharParamIndex = ParameterHelper.analyzeCurrentContextTableData4Template(tableData.getQuery(), paras, specialCharParam);
} }
String oldSql = ParameterHelper.analyzeCurrentContextTableData4Templatee(tableData.getQuery(), paras); String oldSql = ParameterHelper.analyzeCurrentContextTableData4Templatee(tableData.getQuery(), paras);
sql = processExtraSQL(paras, oldSql, calculator, tableDataProviders); sql = processExtraSQL(paras, oldSql, calculator, tableDataProviders);
if (!StringUtils.equals(oldSql, sql)) { if (!StringUtils.equals(oldSql, sql)) {
highlight = false; highlight = false;
}
} }
// sql内容复制到剪切板 // sql内容复制到剪切板
StringSelection selection = new StringSelection(sql); StringSelection selection = new StringSelection(sql);
java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection); java.awt.Toolkit.getDefaultToolkit().getSystemClipboard().setContents(selection, selection);
// 弹窗 // 弹窗
PreviewPerformedSqlPane pane;
if (isShowSpecialCharSqlPane(specialCharParamIndex)) { if (isShowSpecialCharSqlPane(specialCharParamIndex)) {
pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql, specialCharParamIndex, ConfigService.getInstance().getPSIConfig().getSelectedSpecialChar(), highlight); showSpecialCharSqlPane(sql, specialCharParamIndex, highlight);
} else { } else {
pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql); showNormalPreviewPane(sql);
} }
}
// 埋点方法
private static void showNormalPreviewPane(String sql) {
PreviewPerformedSqlPane pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql);
pane.setVisible(true);
}
// 埋点方法
private static void showSpecialCharSqlPane(String sql, List<int[]> specialCharParamIndex, boolean highlight) {
PreviewPerformedSqlPane pane = new PreviewPerformedSqlPane(DesignerContext.getDesignerFrame(), sql, specialCharParamIndex, ConfigService.getInstance().getPSIConfig().getSelectedSpecialChar(), highlight);
pane.setVisible(true); pane.setVisible(true);
} }
private static void refreshEscapeSqlHelper() {
EscapeSqlHelper.getInstance().setUseForbidWord(ConfigService.getInstance().getPSIConfig().isUseForbidWord());
EscapeSqlHelper.getInstance().setSelectedForbidWord(ConfigService.getInstance().getPSIConfig().getSelectedForbidWord());
EscapeSqlHelper.getInstance().setUseEscapeSpecialChar(ConfigService.getInstance().getPSIConfig().isUseEscapeSpecialChar());
EscapeSqlHelper.getInstance().setSelectedSpecialChar(ConfigService.getInstance().getPSIConfig().getSelectedSpecialChar());
}
private static boolean isShowSpecialCharSqlPane(List<int[]> specialCharParamIndex) { private static boolean isShowSpecialCharSqlPane(List<int[]> specialCharParamIndex) {
return specialCharParamIndex != null && !specialCharParamIndex.isEmpty(); return specialCharParamIndex != null && !specialCharParamIndex.isEmpty();
} }
@ -274,4 +291,8 @@ public class PreviewPerformedSqlPane extends JDialog implements ActionListener {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
this.dispose(); this.dispose();
} }
private void close() {
this.dispose();
}
} }

240
designer-base/src/main/java/com/fr/design/dialog/NotificationDialog.java

@ -0,0 +1,240 @@
package com.fr.design.dialog;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.notification.Notification;
import com.fr.design.notification.NotificationCenter;
import com.fr.module.ModuleContext;
import com.fr.stable.StringUtils;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.UIManager;
/**
* 带查看详情的简要通知框
*/
public class NotificationDialog extends JDialog {
public static final int ERROR_MESSAGE = 0;
public static final int NEW_MESSAGE = 1;
public static final int WARNING_MESSAGE = 2;
public static final String HTML_TAG_1 = "<html>";
public static final String HTML_TAG_2 = "</html>";
private static final String HIDE_MSG = "HIDE_MSG_TIMER";
private UILabel messageText;
private NotificationDialogAction notificationDialogAction;
private ScheduledExecutorService TIMER;
public NotificationDialog(Frame owner, String title, boolean isModal, int messageType, String message, NotificationDialogAction action) {
super(owner);
setTitle(title);
initComponents(StringUtils.EMPTY, messageType, message, isModal, action);
}
public NotificationDialog(Builder builder) {
super(builder.owner);
setTitle(builder.title);
initComponents(builder.messageId, builder.messageType, builder.message, builder.modal, builder.action);
}
public void initComponents(String messageId, int messageType, String message, boolean isModal, NotificationDialogAction action) {
NotificationCenter.getInstance().addNotification(new Notification(messageId, messageType, message, action));
notificationDialogAction = action;
setModal(isModal);
setFocusable(false);
setAutoRequestFocus(false);
setResizable(false);
JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane();
body.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
//消息内容
UILabel icon = new UILabel(getIconForType(messageType));
JPanel iconPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
iconPanel.setBorder(BorderFactory.createEmptyBorder(0, 5, 10, 8));
iconPanel.add(icon);
body.add(iconPanel, BorderLayout.WEST);
messageText = new UILabel(HTML_TAG_1 + message + HTML_TAG_2);
messageText.setForeground(new Color(51, 51, 52));
JPanel centerPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
centerPanel.setBorder(BorderFactory.createEmptyBorder(8, 0, 5, 20));
JScrollPane jScrollPane = new JScrollPane(messageText, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jScrollPane.setBorder(BorderFactory.createEmptyBorder());
centerPanel.add(jScrollPane, BorderLayout.CENTER);
centerPanel.setPreferredSize(new Dimension(230, 95));
body.add(centerPanel, BorderLayout.CENTER);
//查看详情
UILabel detailLabel = new UILabel();
detailLabel.setText(Toolkit.i18nText("Fine_Designer_Look_Detail"));
detailLabel.setForeground(Color.BLUE);
JPanel detailPanel = FRGUIPaneFactory.createBorderLayout_L_Pane();
detailPanel.add(detailLabel, BorderLayout.EAST);
body.add(detailPanel, BorderLayout.SOUTH);
detailLabel.addMouseListener(detailClickListener);
messageText.addMouseListener(detailClickListener);
addMouseListener(bodyMouseListener);
add(body);
Dimension dimension = body.getPreferredSize();
setSize(dimension.width, dimension.height);
setLocation((DesignerContext.getDesignerFrame().getWidth() - dimension.width - 30 + DesignerContext.getDesignerFrame().getX()),
DesignerContext.getDesignerFrame().getY() + DesignerContext.getDesignerFrame().getHeight() - dimension.height - 30);
disappear();
}
private MouseListener detailClickListener = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (notificationDialogAction != null) {
hideDialog();
notificationDialogAction.doClick();
}
}
};
private MouseListener bodyMouseListener = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
if (TIMER != null) {
TIMER.shutdownNow();
}
}
@Override
public void mouseExited(MouseEvent e) {
disappear();
}
};
public void disappear() {
TIMER = createScheduleExecutorService();
TIMER.schedule(new Runnable() {
@Override
public void run() {
hideDialog();
}
}, 10000, TimeUnit.MILLISECONDS);
}
private ScheduledExecutorService createScheduleExecutorService() {
return ModuleContext.getExecutor().newSingleThreadScheduledExecutor(new NamedThreadFactory(HIDE_MSG));
}
/**
* 设置通知消息
*/
public void setMessage(String message) {
messageText.setText(HTML_TAG_1 + message + HTML_TAG_2);
}
private void hideDialog() {
this.setVisible(false);
this.dispose();
}
protected Icon getIconForType(int messageType) {
String propertyName;
switch (messageType) {
case 0:
propertyName = "OptionPane.circularErrorIcon";
break;
case 1:
propertyName = "OptionPane.newMessageIcon";
break;
case 2:
propertyName = "OptionPane.circularWarningIcon";
break;
default:
return null;
}
return UIManager.getIcon(propertyName);
}
public static Builder Builder() {
return new NotificationDialog.Builder();
}
public static final class Builder {
public int messageType = WARNING_MESSAGE;
public String messageId;
public String message;
public boolean modal = true;
public Frame owner = null;
public String title;
public NotificationDialogAction action;
private Builder() {
}
public NotificationDialog build() {
return new NotificationDialog(this);
}
public Builder messageId(String messageId) {
this.messageId = messageId;
return this;
}
public Builder owner(Frame owner) {
this.owner = owner;
return this;
}
public Builder messageType(int messageType) {
this.messageType = messageType;
return this;
}
public Builder message(String message) {
this.message = message;
return this;
}
public Builder modal(boolean modal) {
this.modal = modal;
return this;
}
public Builder title(String title) {
this.title = title;
return this;
}
public Builder notificationDialogAction(NotificationDialogAction action) {
this.action = action;
return this;
}
}
public static void defaultPopup(String messageId, String title, String body, NotificationDialogAction action) {
NotificationDialog.Builder()
.messageId(messageId)
.owner(DesignerContext.getDesignerFrame())
.title(title)
.modal(false)
.messageType(NotificationDialog.NEW_MESSAGE)
.message(body)
.notificationDialogAction(action)
.build()
.setVisible(true);
}
}

8
designer-base/src/main/java/com/fr/design/dialog/NotificationDialogAction.java

@ -0,0 +1,8 @@
package com.fr.design.dialog;
public interface NotificationDialogAction {
String name();
void doClick();
}

29
designer-base/src/main/java/com/fr/design/dialog/UIExpandDialog.java

@ -6,6 +6,7 @@ import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.gui.itextarea.UITextArea;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.stable.StringUtils;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Icon; import javax.swing.Icon;
@ -64,7 +65,7 @@ public class UIExpandDialog extends UIDialog {
private final UILabel narrow = new UILabel(); private final UILabel narrow = new UILabel();
private final UILabel narrowHit = new UILabel(); private final UILabel narrowHit = new UILabel();
private final UIButton buttonOK; private final UIButton buttonOK;
private final UIButton buttonCancel; private UIButton buttonCancel = null;
private JLabel msg; private JLabel msg;
private final UITextArea textArea = new UITextArea(); private final UITextArea textArea = new UITextArea();
@ -73,7 +74,9 @@ public class UIExpandDialog extends UIDialog {
String okText, String cancelText, boolean isExpand) { String okText, String cancelText, boolean isExpand) {
super(owner); super(owner);
buttonOK = new UIButton(okText); buttonOK = new UIButton(okText);
buttonCancel = new UIButton(cancelText); if (!StringUtils.isEmpty(cancelText)) {
buttonCancel = new UIButton(cancelText);
}
setTitle(title); setTitle(title);
setModal(isModal); setModal(isModal);
initComponents(messageType, message, detail, isModal, isExpand, null); initComponents(messageType, message, detail, isModal, isExpand, null);
@ -82,7 +85,9 @@ public class UIExpandDialog extends UIDialog {
public UIExpandDialog(Builder builder) { public UIExpandDialog(Builder builder) {
super(builder.owner); super(builder.owner);
buttonOK = new UIButton(builder.okText); buttonOK = new UIButton(builder.okText);
buttonCancel = new UIButton(builder.cancelText); if (!StringUtils.isEmpty(builder.cancelText)) {
buttonCancel = new UIButton(builder.cancelText);
}
setTitle(builder.title); setTitle(builder.title);
setModal(builder.modal); setModal(builder.modal);
initComponents(builder.messageType, builder.message, builder.detail, initComponents(builder.messageType, builder.message, builder.detail,
@ -91,7 +96,7 @@ public class UIExpandDialog extends UIDialog {
public void initComponents(int messageType, String message, String detail, public void initComponents(int messageType, String message, String detail,
boolean isModal, boolean isExpand, DialogActionListener l) { boolean isModal, boolean isExpand, DialogActionListener l) {
applyClosingAction();
setLayout(new BorderLayout(GAP, GAP)); setLayout(new BorderLayout(GAP, GAP));
setResizable(false); setResizable(false);
setModal(isModal); setModal(isModal);
@ -133,7 +138,9 @@ public class UIExpandDialog extends UIDialog {
// 操作面板 // 操作面板
JPanel actionPanel = new JPanel(); JPanel actionPanel = new JPanel();
actionPanel.setLayout(new FlowLayout(FlowLayout.CENTER, MARGIN, MARGIN)); actionPanel.setLayout(new FlowLayout(FlowLayout.CENTER, MARGIN, MARGIN));
actionPanel.add(buttonCancel); if (buttonCancel != null) {
actionPanel.add(buttonCancel);
}
actionPanel.add(buttonOK); actionPanel.add(buttonOK);
add(actionPanel, BorderLayout.SOUTH); add(actionPanel, BorderLayout.SOUTH);
@ -185,11 +192,13 @@ public class UIExpandDialog extends UIDialog {
} }
}); });
buttonCancel.addActionListener(new ActionListener() { if (buttonCancel != null) {
public void actionPerformed(ActionEvent e) { buttonCancel.addActionListener(new ActionListener() {
doCancel(); public void actionPerformed(ActionEvent e) {
} doCancel();
}); }
});
}
} }
protected Icon getIconForType(int messageType) { protected Icon getIconForType(int messageType) {

17
designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java vendored

@ -34,11 +34,20 @@ public class RemoteWorkspace implements Workspace {
private volatile Boolean warDeploy; private volatile Boolean warDeploy;
private final SwingWorker<Void,Void> swingWorker;
RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) { RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) {
this.client = client; this.client = client;
this.address = connection.getUrl(); this.address = connection.getUrl();
this.connection = connection; this.connection = connection;
this.swingWorker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
client.close();
return null;
}
};
} }
@Override @Override
@ -125,13 +134,7 @@ public class RemoteWorkspace implements Workspace {
@Override @Override
public void close() { public void close() {
new SwingWorker<Void, Void>() { swingWorker.execute();
@Override
protected Void doInBackground() throws Exception {
client.close();
return null;
}
}.execute();
} }
@Override @Override

3
designer-base/src/main/java/com/fr/design/extra/PluginFromStorePane.java

@ -9,6 +9,7 @@ import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker; import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginExtraInfo;
import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.manage.control.PluginTaskResult;
import com.fr.plugin.manage.control.ProgressCallback; import com.fr.plugin.manage.control.ProgressCallback;
import com.fr.plugin.view.PluginView; import com.fr.plugin.view.PluginView;
@ -206,7 +207,7 @@ public class PluginFromStorePane extends PluginAbstractLoadingViewPane<List<Plug
JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(id); JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(id);
String latestPluginVersion = (String) latestPluginInfo.get("version"); String latestPluginVersion = (String) latestPluginInfo.get("version");
PluginMarker toPluginMarker = PluginMarker.create(id, latestPluginVersion); PluginMarker toPluginMarker = PluginMarker.create(id, latestPluginVersion);
PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane)); PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane), PluginExtraInfo.newBuilder().username(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()).build());
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
} }

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

@ -20,6 +20,7 @@ import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.context.PluginMarkerAdapter; import com.fr.plugin.context.PluginMarkerAdapter;
import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginControllerHelper; import com.fr.plugin.manage.control.PluginControllerHelper;
import com.fr.plugin.manage.control.PluginExtraInfo;
import com.fr.plugin.manage.control.PluginTask; import com.fr.plugin.manage.control.PluginTask;
import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskCallback;
import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.manage.control.PluginTaskResult;
@ -42,7 +43,7 @@ public class PluginOperateUtils {
PluginMarker marker = updateMarker2Online(pluginMarker); PluginMarker marker = updateMarker2Online(pluginMarker);
//下载插件 //下载插件
PluginTask pluginTask = PluginTask.installTask(marker); PluginTask pluginTask = PluginTask.installTask(marker);
PluginControllerHelper.installOnline(pluginMarker, new InstallOnlineCallback(pluginTask, jsCallback)); PluginControllerHelper.installOnline(pluginMarker, new InstallOnlineCallback(pluginTask, jsCallback), PluginExtraInfo.newBuilder().username(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()).build());
} }
public static PluginMarker updateMarker2Online(PluginMarker pluginMarker) { public static PluginMarker updateMarker2Online(PluginMarker pluginMarker) {
@ -76,7 +77,7 @@ public class PluginOperateUtils {
//当前已经安装的相同ID插件marker //当前已经安装的相同ID插件marker
PluginMarker currentMarker = PluginMarkerAdapter.create(PluginUtils.getInstalledPluginMarkerByID(pluginMarker.getPluginID()), pluginName); PluginMarker currentMarker = PluginMarkerAdapter.create(PluginUtils.getInstalledPluginMarkerByID(pluginMarker.getPluginID()), pluginName);
PluginTask pluginTask = PluginTask.updateTask(currentMarker, toPluginMarker); PluginTask pluginTask = PluginTask.updateTask(currentMarker, toPluginMarker);
PluginControllerHelper.updateOnline(currentMarker, toPluginMarker, new UpdateOnlineCallback(pluginTask, jsCallback)); PluginControllerHelper.updateOnline(currentMarker, toPluginMarker, new UpdateOnlineCallback(pluginTask, jsCallback), PluginExtraInfo.newBuilder().username(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()).build());
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
} }

3
designer-base/src/main/java/com/fr/design/extra/PluginUpdatePane.java

@ -9,6 +9,7 @@ import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker; import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginExtraInfo;
import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.manage.control.PluginTaskResult;
import com.fr.plugin.manage.control.ProgressCallback; import com.fr.plugin.manage.control.ProgressCallback;
import com.fr.plugin.view.PluginView; import com.fr.plugin.view.PluginView;
@ -180,7 +181,7 @@ public class PluginUpdatePane extends PluginAbstractLoadingViewPane<List<PluginV
JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarker.getPluginID()); JSONObject latestPluginInfo = PluginUtils.getLatestPluginInfo(pluginMarker.getPluginID());
String latestPluginVersion = (String) latestPluginInfo.get("version"); String latestPluginVersion = (String) latestPluginInfo.get("version");
PluginMarker toPluginMarker = PluginMarker.create(pluginMarker.getPluginID(), latestPluginVersion); PluginMarker toPluginMarker = PluginMarker.create(pluginMarker.getPluginID(), latestPluginVersion);
PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane)); PluginManager.getController().download(pluginMarker, new UpdateOnlineCallback(pluginMarker, toPluginMarker, pane), PluginExtraInfo.newBuilder().username(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()).build());
} catch (Exception e) { } catch (Exception e) {
} }

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

@ -706,7 +706,7 @@ public class MutilTempalteTabPane extends JComponent {
closeTpl(specifiedTemplate); closeTpl(specifiedTemplate);
} }
}); });
worker.start(specifiedTemplate.getTarget().getTemplateID()); worker.start(specifiedTemplate.getRuntimeId());
} else if (returnVal == JOptionPane.NO_OPTION) { } else if (returnVal == JOptionPane.NO_OPTION) {
closeTpl(specifiedTemplate); closeTpl(specifiedTemplate);
} }

5
designer-base/src/main/java/com/fr/design/file/Releasable.java

@ -0,0 +1,5 @@
package com.fr.design.file;
public interface Releasable {
void releaseResources();
}

4
designer-base/src/main/java/com/fr/design/gui/UILookAndFeel.java

@ -176,6 +176,10 @@ public class UILookAndFeel extends MetalLookAndFeel {
table.put("OptionPane.narrow.right", loadIcon("Icon_Narrow_Right_16x16.png", this)); table.put("OptionPane.narrow.right", loadIcon("Icon_Narrow_Right_16x16.png", this));
table.put("OptionPane.narrow.down", loadIcon("Icon_Narrow_Down_16x16.png", this)); table.put("OptionPane.narrow.down", loadIcon("Icon_Narrow_Down_16x16.png", this));
table.put("OptionPane.warningIcon", loadIcon("WarningIcon.png", this)); table.put("OptionPane.warningIcon", loadIcon("WarningIcon.png", this));
table.put("OptionPane.circularWarningIcon", loadIcon("circularWarningIcon.png", this));
table.put("OptionPane.newMessageIcon", loadIcon("newMessageIcon.png", this));
table.put("OptionPane.circularErrorIcon", loadIcon("circularErrorIcon.png", this));
table.put("OptionPane.deleteIcon", loadIcon("deleteIcon.png", this));
table.put("OptionPane.questionIcon", loadIcon("QuestionIcon.png", this)); table.put("OptionPane.questionIcon", loadIcon("QuestionIcon.png", this));
table.put("OptionPane.tipIcon", loadIcon("TipIcon.png", this)); table.put("OptionPane.tipIcon", loadIcon("TipIcon.png", this));
table.put("ScrollPane.border", new UIScrollPaneBorder()); table.put("ScrollPane.border", new UIScrollPaneBorder());

64
designer-base/src/main/java/com/fr/design/gui/controlpane/UIListGroupControlPane.java

@ -7,12 +7,12 @@ import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ilist.JNameEdList; import com.fr.design.gui.ilist.JNameEdList;
import com.fr.design.gui.ilist.ListModelElement; import com.fr.design.gui.ilist.ListModelElement;
import com.fr.design.gui.ilist.ModNameActionListener; import com.fr.design.gui.ilist.ModNameActionListener;
import com.fr.design.gui.ilist.UIList;
import com.fr.design.gui.ilist.UINameEdList; import com.fr.design.gui.ilist.UINameEdList;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.EventCreator; import com.fr.design.widget.EventCreator;
import com.fr.form.event.Listener; import com.fr.form.event.Listener;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.general.FRFont;
import com.fr.general.NameObject; import com.fr.general.NameObject;
import com.fr.report.web.util.ReportEngineEventMapping; import com.fr.report.web.util.ReportEngineEventMapping;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
@ -22,6 +22,7 @@ import com.fr.stable.StringUtils;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.DefaultListModel; import javax.swing.DefaultListModel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.ListModel;
import javax.swing.ListSelectionModel; import javax.swing.ListSelectionModel;
import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener; import javax.swing.event.ListDataListener;
@ -32,6 +33,7 @@ import java.awt.BorderLayout;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
@ -47,7 +49,7 @@ import java.util.Map;
/** /**
* Created by kerry on 5/31/21 * Created by kerry on 5/31/21
*/ */
public abstract class UIListGroupControlPane extends UIControlPane implements ListControlPaneProvider { public abstract class UIListGroupControlPane extends UIControlPane implements ListControlPaneProvider {
private boolean isPopulating = false; private boolean isPopulating = false;
private UINameEdList selectNameEdList; private UINameEdList selectNameEdList;
@ -107,6 +109,15 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
contentPane.add(wrapperPane); contentPane.add(wrapperPane);
nameEdListMap.put(event, wrapperPane); nameEdListMap.put(event, wrapperPane);
} }
contentPane.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
super.mousePressed(e);
if (selectNameEdList != null) {
selectNameEdList.stopEditing();
}
}
});
} }
protected void populateNameObjects(Widget widget) { protected void populateNameObjects(Widget widget) {
@ -133,6 +144,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
} }
this.checkButtonEnabled(); this.checkButtonEnabled();
refreshEventListWrapperPane(); refreshEventListWrapperPane();
this.checkGroupPaneSize();
isPopulating = false; isPopulating = false;
} }
@ -200,6 +212,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
nameEdList.addModNameActionListener(new ModNameActionListener() { nameEdList.addModNameActionListener(new ModNameActionListener() {
@Override @Override
public void nameModed(int index, String oldName, String newName) { public void nameModed(int index, String oldName, String newName) {
checkGroupPaneSize();
saveSettings(); saveSettings();
} }
}); });
@ -253,7 +266,6 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
} }
private String switchLang(String eventName) { private String switchLang(String eventName) {
// 在 properties 文件中找到相应的 key 值 // 在 properties 文件中找到相应的 key 值
String localeKey = ReportEngineEventMapping.getLocaleName(eventName); String localeKey = ReportEngineEventMapping.getLocaleName(eventName);
@ -261,7 +273,6 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
} }
/** /**
* 生成不重复的名字 * 生成不重复的名字
* *
@ -291,19 +302,60 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
public void onAddItem(NameableCreator creator) { public void onAddItem(NameableCreator creator) {
updateSelectedNameList(creator); updateSelectedNameList(creator);
getCommonHandlers().onAddItem(creator); getCommonHandlers().onAddItem(creator);
checkGroupPaneSize();
} }
@Override @Override
public void onRemoveItem() { public void onRemoveItem() {
getCommonHandlers().onRemoveItem(); getCommonHandlers().onRemoveItem();
refreshEventListWrapperPane(); refreshEventListWrapperPane();
checkGroupPaneSize();
} }
@Override @Override
public void onCopyItem() { public void onCopyItem() {
getCommonHandlers().onCopyItem(); getCommonHandlers().onCopyItem();
checkGroupPaneSize();
}
private void checkGroupPaneSize() {
int width = 180;
Iterator<Map.Entry<String, ListWrapperPane>> iterator = nameEdListMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, ListWrapperPane> entry = iterator.next();
ListWrapperPane wrapperPane = entry.getValue();
UIList uiList = wrapperPane.getNameEdList();
width = Math.max(width, calculateUIListMaxCellWidth(uiList.getModel(), uiList.getFontMetrics(uiList.getFont())));
}
iterator = nameEdListMap.entrySet().iterator();
width += 40;
while (iterator.hasNext()) {
Map.Entry<String, ListWrapperPane> entry = iterator.next();
ListWrapperPane wrapperPane = entry.getValue();
UIList uiList = wrapperPane.getNameEdList();
uiList.setFixedCellWidth(width);
}
} }
private int calculateUIListMaxCellWidth(ListModel model, FontMetrics fontMetrics) {
int width = 0;
for (int i = 0; i < model.getSize(); i++) {
Object element = model.getElementAt(i);
if (element != null) {
String text;
if (element instanceof ListModelElement) {
text = ((ListModelElement) element).wrapper.getName();
} else {
text = element.toString();
}
width = Math.max(width, fontMetrics.stringWidth(text));
}
}
return width;
}
@Override @Override
public void onMoveUpItem() { public void onMoveUpItem() {
getCommonHandlers().onMoveUpItem(); getCommonHandlers().onMoveUpItem();
@ -473,7 +525,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
UILabel label = new UILabel(labelText + getWrapperLabelText()) { UILabel label = new UILabel(labelText + getWrapperLabelText()) {
@Override @Override
public void paint(Graphics g) { public void paint(Graphics g) {
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f)); ((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
super.paint(g); super.paint(g);
} }
}; };
@ -481,7 +533,7 @@ public abstract class UIListGroupControlPane extends UIControlPane implements L
label.setOpaque(true); label.setOpaque(true);
label.setBackground(Color.WHITE); label.setBackground(Color.WHITE);
label.setForeground(Color.decode("#333334")); label.setForeground(Color.decode("#333334"));
label.setFont(label.getFont().deriveFont(10F)); label.setFont(label.getFont().deriveFont(11F));
label.setPreferredSize(new Dimension(224, 26)); label.setPreferredSize(new Dimension(224, 26));
this.nameEdList = nameEdList; this.nameEdList = nameEdList;
this.add(label, BorderLayout.NORTH); this.add(label, BorderLayout.NORTH);

35
designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java

@ -172,7 +172,7 @@ public class UIEastResizableContainer extends JPanel {
leftPane.setBounds(0, topToolPaneHeight, leftPaneWidth, getHeight() - topToolPaneHeight); leftPane.setBounds(0, topToolPaneHeight, leftPaneWidth, getHeight() - topToolPaneHeight);
// parameterPane.setBounds(20, 0, 230, getParameterPaneHeight());//10,0,230,462 // parameterPane.setBounds(20, 0, 230, getParameterPaneHeight());//10,0,230,462
rightPane.setBounds(leftPaneWidth, 0, containerWidth-leftPaneWidth, getHeight());//20,0,230,0 rightPane.setBounds(leftPaneWidth, 0, containerWidth - leftPaneWidth, getHeight());//20,0,230,0
} }
@Override @Override
@ -242,7 +242,27 @@ public class UIEastResizableContainer extends JPanel {
* 伸缩右子面板时触发此方法 * 伸缩右子面板时触发此方法
*/ */
public void onResize() { public void onResize() {
// do nothing here refreshContainer();
if (DesignModeContext.isAuthorityEditing()) {
DesignerContext.getDesignerFrame().doResize();
}
}
public void showContainer() {
if (containerWidth != leftPaneWidth) {
return;
}
containerWidth = preferredWidth;
onResize();
}
public void hideContainer() {
if (containerWidth == leftPaneWidth) {
return;
}
setPreferredWidth(containerWidth);
containerWidth = leftPaneWidth;
onResize();
} }
private class TopToolPane extends JPanel { private class TopToolPane extends JPanel {
@ -281,15 +301,9 @@ public class UIEastResizableContainer extends JPanel {
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
if (e.getX() <= ARROW_RANGE) { if (e.getX() <= ARROW_RANGE) {
if (containerWidth == leftPaneWidth) { if (containerWidth == leftPaneWidth) {
containerWidth = preferredWidth; showContainer();
} else { } else {
setPreferredWidth(containerWidth); hideContainer();
containerWidth = leftPaneWidth;
}
onResize();
refreshContainer();
if (DesignModeContext.isAuthorityEditing()) {
DesignerContext.getDesignerFrame().doResize();
} }
} }
} }
@ -316,5 +330,4 @@ public class UIEastResizableContainer extends JPanel {
g.drawImage(button, 18, 7, 5, 10, null); g.drawImage(button, 18, 7, 5, 10, null);
} }
} }
} }

10
designer-base/src/main/java/com/fr/design/locale/impl/BbsRegisterMark.java

@ -16,11 +16,11 @@ import java.util.Map;
public class BbsRegisterMark implements LocaleMark<String> { public class BbsRegisterMark implements LocaleMark<String> {
private final Map<Locale, String> map = new HashMap<>(); private final Map<Locale, String> map = new HashMap<>();
private static final String BBS_REGISTER_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.register"); private static final String BBS_REGISTER_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.register", "http://id.fanruan.com/register/register.php?clueSource=activityfr");
private static final String BBS_REGISTER_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.register"); private static final String BBS_REGISTER_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.register", "http://id.fanruan.com/register/register.php?clueSource=activityfr");
private static final String BBS_REGISTER_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US"); private static final String BBS_REGISTER_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php");
private static final String BBS_REGISTER_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US"); private static final String BBS_REGISTER_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php");
private static final String BBS_REGISTER_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US"); private static final String BBS_REGISTER_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.register.en_US", "https://id.fanruan.com/en/register/register.php");
public BbsRegisterMark() { public BbsRegisterMark() {
map.put(Locale.CHINA, BBS_REGISTER_CN); map.put(Locale.CHINA, BBS_REGISTER_CN);

10
designer-base/src/main/java/com/fr/design/locale/impl/BbsResetMark.java

@ -16,11 +16,11 @@ import java.util.Map;
public class BbsResetMark implements LocaleMark<String> { public class BbsResetMark implements LocaleMark<String> {
private final Map<Locale, String> map = new HashMap<>(); private final Map<Locale, String> map = new HashMap<>();
private static final String BBS_RESET_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset"); private static final String BBS_RESET_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset", "http://id.fanruan.com/forget/forget.php?clue=activityfr");
private static final String BBS_RESET_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.reset"); private static final String BBS_RESET_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.reset", "http://id.fanruan.com/forget/forget.php?clue=activityfr");
private static final String BBS_RESET_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US"); private static final String BBS_RESET_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php");
private static final String BBS_RESET_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US"); private static final String BBS_RESET_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php");
private static final String BBS_RESET_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US"); private static final String BBS_RESET_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.reset.en_US", "https://id.fanruan.com/en/forget/forget.php");
public BbsResetMark() { public BbsResetMark() {
map.put(Locale.CHINA, BBS_RESET_CN); map.put(Locale.CHINA, BBS_RESET_CN);

10
designer-base/src/main/java/com/fr/design/locale/impl/BbsSpaceMark.java

@ -16,11 +16,11 @@ import java.util.Map;
public class BbsSpaceMark implements LocaleMark<String> { public class BbsSpaceMark implements LocaleMark<String> {
private final Map<Locale, String> map = new HashMap<>(); private final Map<Locale, String> map = new HashMap<>();
private static final String BBS_SPACE_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.default"); private static final String BBS_SPACE_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.default", "http://bbs.fanruan.com/home.php?mod=space&do=pm");
private static final String BBS_SPACE_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.default"); private static final String BBS_SPACE_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.default", "http://bbs.fanruan.com/home.php?mod=space&do=pm");
private static final String BBS_SPACE_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US"); private static final String BBS_SPACE_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm");
private static final String BBS_SPACE_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US"); private static final String BBS_SPACE_KR = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm");
private static final String BBS_SPACE_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US"); private static final String BBS_SPACE_JP = CloudCenter.getInstance().acquireUrlByKind("bbs.default.en_US", "https://community.finereport.com/home.php?mod=space&do=pm");
public BbsSpaceMark() { public BbsSpaceMark() {
map.put(Locale.CHINA, BBS_SPACE_CN); map.put(Locale.CHINA, BBS_SPACE_CN);

2
designer-base/src/main/java/com/fr/design/locale/impl/BugNeedMark.java

@ -14,7 +14,7 @@ import java.util.Map;
*/ */
public class BugNeedMark implements LocaleMark<String> { public class BugNeedMark implements LocaleMark<String> {
private Map<Locale, String> map = new HashMap<>(); private Map<Locale, String> map = new HashMap<>();
private static final String TW_BUG_AND_NEEDS = CloudCenter.getInstance().acquireUrlByKind("bbs.bug.needs.zh_TW"); private static final String TW_BUG_AND_NEEDS = CloudCenter.getInstance().acquireUrlByKind("bbs.bug.needs.zh_TW", "https://fanruanhelp.zendesk.com/hc/zh-tw/requests/new");
public BugNeedMark() { public BugNeedMark() {
map.put(Locale.TAIWAN, TW_BUG_AND_NEEDS); map.put(Locale.TAIWAN, TW_BUG_AND_NEEDS);

4
designer-base/src/main/java/com/fr/design/locale/impl/TechSupportMark.java

@ -14,8 +14,8 @@ import java.util.Map;
*/ */
public class TechSupportMark implements LocaleMark<String> { public class TechSupportMark implements LocaleMark<String> {
private Map<Locale, String> map = new HashMap<>(); private Map<Locale, String> map = new HashMap<>();
private static final String EN_TECH_SUPPORT = CloudCenter.getInstance().acquireUrlByKind("bbs.tech.support.en_US"); private static final String EN_TECH_SUPPORT = CloudCenter.getInstance().acquireUrlByKind("bbs.tech.support.en_US", "https://fanruanhelp.zendesk.com/hc/en-us");
private static final String TW_TECH_SUPPORT = CloudCenter.getInstance().acquireUrlByKind("bbs.tech.support.zh_TW"); private static final String TW_TECH_SUPPORT = CloudCenter.getInstance().acquireUrlByKind("bbs.tech.support.zh_TW", "https://fanruanhelp.zendesk.com/hc/zh-tw");
public TechSupportMark() { public TechSupportMark() {
map.put(Locale.US, EN_TECH_SUPPORT); map.put(Locale.US, EN_TECH_SUPPORT);

10
designer-base/src/main/java/com/fr/design/locale/impl/UserInfoMark.java

@ -15,11 +15,11 @@ import java.util.Map;
public class UserInfoMark implements LocaleMark<String> { public class UserInfoMark implements LocaleMark<String> {
private Map<Locale, String> map = new HashMap<>(); private Map<Locale, String> map = new HashMap<>();
private static final String CN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.cn"); private static final String CN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.cn", "http://www.finereport.com/product/active?utm_source=direct&utm_medium=exe");
private static final String EN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.en"); private static final String EN_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.en", "http://www.finereport.com/en/activation");
private static final String TW_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.tw"); private static final String TW_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.tw", "http://www.finereport.com/tw/products/frlogin");
private static final String JP_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.jp"); private static final String JP_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.jp", "http://www.finereport.com/jp/trial/");
private static final String KR_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.kr"); private static final String KR_LOGIN_HTML = CloudCenter.getInstance().acquireUrlByKind("frlogin.kr", "http://www.finereport.com/kr/activation/");
public UserInfoMark() { public UserInfoMark() {
map.put(Locale.CHINA, CN_LOGIN_HTML); map.put(Locale.CHINA, CN_LOGIN_HTML);

6
designer-base/src/main/java/com/fr/design/locale/impl/VideoMark.java

@ -15,9 +15,9 @@ import java.util.Map;
public class VideoMark implements LocaleMark<String> { public class VideoMark implements LocaleMark<String> {
private Map<Locale, String> map = new HashMap<>(); private Map<Locale, String> map = new HashMap<>();
private static final String VIDEO_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.en_US"); private static final String VIDEO_EN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.en_US", "http://www.finereport.com/en/Learning-path");
private static final String VIDEO_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_CN"); private static final String VIDEO_CN = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_CN", "https://edu.fanruan.com/video?class1=16&class2=0");
private static final String VIDEO_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_TW"); private static final String VIDEO_TW = CloudCenter.getInstance().acquireUrlByKind("bbs.video.zh_TW", "http://www.finereport.com/tw/video");
public VideoMark() { public VideoMark() {
map.put(Locale.CHINA, VIDEO_CN); map.put(Locale.CHINA, VIDEO_CN);

60
designer-base/src/main/java/com/fr/design/login/AbstractDesignerSSO.java

@ -1,22 +1,14 @@
package com.fr.design.login; package com.fr.design.login;
import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.actions.UpdateAction; import com.fr.design.actions.UpdateAction;
import com.fr.design.login.utils.DesignerLoginUtils;
import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.os.impl.SupportOSImpl;
import com.fr.design.utils.BrowseUtils; import com.fr.design.utils.BrowseUtils;
import com.fr.general.CloudCenter;
import com.fr.general.log.MessageFormatter;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.third.org.bouncycastle.util.encoders.Hex;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.security.SecureRandom;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/** /**
* @author Lanlan * @author Lanlan
@ -25,30 +17,19 @@ import javax.crypto.spec.SecretKeySpec;
*/ */
public abstract class AbstractDesignerSSO extends UpdateAction { public abstract class AbstractDesignerSSO extends UpdateAction {
private static final String PRODUCT_FINEREPORT = "product-finereport";
private static final String KEY = "i7hP48WAcuTrmxfN";
@Override @Override
public void actionPerformed(ActionEvent event) { public void actionPerformed(ActionEvent event) {
String url = getJumpUrl(); String url = getJumpUrl();
if (!SupportOSImpl.DESIGNER_LOGIN.support()) {
BrowseUtils.browser(url);
return;
}
DesignerEnvManager manager = DesignerEnvManager.getEnvManager(); DesignerEnvManager manager = DesignerEnvManager.getEnvManager();
int uid = manager.getDesignerLoginUid(); int uid = manager.getDesignerLoginUid();
if (uid > 0) { if (uid > 0) {
String ssoUrl = CloudCenter.getInstance().acquireUrlByKind("designer.sso.api", "https://id.fanruan.com/api/app/?code={}&referrer={}"); String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(url);
try { BrowseUtils.browser(ssoUrl);
String code = generateLoginCode(); } else {
MessageFormatter.FormattingTuple tuple = MessageFormatter.arrayFormat(ssoUrl, new String[]{code, url}); if (!SupportOSImpl.DESIGNER_LOGIN.support() || !FRContext.isChineseEnv()) {
BrowseUtils.browser(tuple.getMessage());
} catch (Exception e) {
BrowseUtils.browser(url); BrowseUtils.browser(url);
FineLoggerFactory.getLogger().error(e.getMessage(), e); return;
} }
} else {
boolean loginRemindBeforeJumpBBS = manager.isLoginRemindBeforeJumpBBS(); boolean loginRemindBeforeJumpBBS = manager.isLoginRemindBeforeJumpBBS();
if (loginRemindBeforeJumpBBS) { if (loginRemindBeforeJumpBBS) {
Map<String, String> params = new HashMap<>(); Map<String, String> params = new HashMap<>();
@ -61,32 +42,5 @@ public abstract class AbstractDesignerSSO extends UpdateAction {
} }
} }
private String generateLoginCode() throws Exception {
DesignerEnvManager manager = DesignerEnvManager.getEnvManager();
JSONObject jo = JSONObject.create();
jo.put("uid", manager.getDesignerLoginUid());
jo.put("username", manager.getDesignerLoginUsername());
jo.put("source", PRODUCT_FINEREPORT);
byte[] iv = randomIv();
return new String(Hex.encode(iv)) + encrypt(jo.toString(), KEY.getBytes(), iv);
}
private static byte[] randomIv() {
byte[] salt = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.setSeed(System.currentTimeMillis());
secureRandom.nextBytes(salt);
return salt;
}
public static String encrypt(String content, byte[] key, byte[] iv) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] resultBytes = cipher.doFinal(content.getBytes());
return new String(Hex.encode(resultBytes));
}
public abstract String getJumpUrl(); public abstract String getJumpUrl();
} }

5
designer-base/src/main/java/com/fr/design/login/DesignerLoginHelper.java

@ -68,12 +68,9 @@ public class DesignerLoginHelper {
if (dialog == null) { if (dialog == null) {
if (window instanceof Dialog) { if (window instanceof Dialog) {
dialog = new DesignerLoginShowDialog((Dialog) window, designerLoginPane); dialog = new DesignerLoginShowDialog((Dialog) window, designerLoginPane);
} else if (window instanceof Frame) {
dialog = new DesignerLoginShowDialog((Frame) window, designerLoginPane);
} else { } else {
return; dialog = new DesignerLoginShowDialog((Frame) window, designerLoginPane);
} }
} }
dialog.setVisible(true); dialog.setVisible(true);
} }

13
designer-base/src/main/java/com/fr/design/login/guide/DesignerGuideHelper.java

@ -1,10 +1,13 @@
package com.fr.design.login.guide; package com.fr.design.login.guide;
import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.UIDialog; import com.fr.design.dialog.UIDialog;
import com.fr.design.event.DesignerOpenedListener; import com.fr.design.event.DesignerOpenedListener;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.os.impl.SupportOSImpl;
import com.fr.design.update.push.DesignerPushUpdateManager;
import com.fr.stable.StringUtils;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
/** /**
@ -31,7 +34,8 @@ public class DesignerGuideHelper {
} }
public static void prepareShowGuideDialog() { public static void prepareShowGuideDialog() {
if (!SupportOSImpl.DESIGNER_LOGIN.support()) { // 如果存在更新升级的弹窗,则不显示引导页面
if (!SupportOSImpl.DESIGNER_LOGIN.support() || !FRContext.isChineseEnv() || DesignerPushUpdateManager.getInstance().isShouldPopUp()) {
return; return;
} }
if (isActivatedForOneWeek()) { if (isActivatedForOneWeek()) {
@ -54,7 +58,12 @@ public class DesignerGuideHelper {
* 激活满一周 * 激活满一周
*/ */
private static boolean isActivatedForOneWeek() { private static boolean isActivatedForOneWeek() {
return (System.currentTimeMillis() - DesignerEnvManager.getEnvManager().getDesignerActivatedTime()) > ONE_WEEK; DesignerEnvManager manager = DesignerEnvManager.getEnvManager();
String key = manager.getActivationKey();
if (StringUtils.isEmpty(key)) {
return false;
}
return (System.currentTimeMillis() - manager.getDesignerActivatedTime()) > ONE_WEEK;
} }
/** /**

112
designer-base/src/main/java/com/fr/design/login/message/DesignerMessageHelper.java

@ -0,0 +1,112 @@
package com.fr.design.login.message;
import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.NotificationDialog;
import com.fr.design.dialog.NotificationDialogAction;
import com.fr.design.event.DesignerOpenedListener;
import com.fr.design.login.utils.DesignerLoginUtils;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.BrowseUtils;
import com.fr.general.CloudCenter;
import com.fr.general.http.HttpToolbox;
import com.fr.json.JSON;
import com.fr.json.JSONFactory;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author Lanlan
* @version 10.0
* Created by Lanlan on 2021/6/11
*/
public class DesignerMessageHelper {
private static final long DELAY = 7L;
private static final String STATUS = "status";
private static final String DATA = "data";
private static final String SUCCESS = "success";
private static final String MESSAGE_ID = "messageId";
private static final String TITLE = "title";
private static final String BODY = "body";
private static final String JUMP_TYPE = "jumpType";
private static final String JUMP_TO = "jumpTo";
private static DesignerMessageHelper instance;
private DesignerMessageHelper() {
}
public static DesignerMessageHelper getInstance() {
if (instance == null) {
instance = new DesignerMessageHelper();
}
return instance;
}
public void prepareShowMessage() {
DesignerContext.getDesignerFrame().addDesignerOpenedListener(new DesignerOpenedListener() {
@Override
public void designerOpened() {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DesignerMessageHelper"));
service.schedule(new Runnable() {
@Override
public void run() {
try {
pullLatestMessage();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}, DELAY, TimeUnit.MINUTES);
service.shutdown();
}
});
}
private void pullLatestMessage() throws Exception {
String url = CloudCenter.getInstance().acquireUrlByKind("designer.message.push", "https://market.fanruan.com/api/v1/message/designer");
Map<String, String> params = new HashMap<>();
params.put("designerId", DesignerEnvManager.getEnvManager().getUUID());
String result = HttpToolbox.post(url, params);
JSONObject response = JSONFactory.createJSON(JSON.OBJECT, result);
String status = response.optString(STATUS);
if (SUCCESS.equals(status)) {
parseLatestMessage(response.optJSONObject(DATA));
}
}
private void parseLatestMessage(JSONObject data) {
String messageId = data.optString(MESSAGE_ID);
String title = data.optString(TITLE);
String body = data.optString(BODY);
int jumpType = data.optInt(JUMP_TYPE);
String jumpTo = data.optString(JUMP_TO);
if (StringUtils.isNotEmpty(messageId) && StringUtils.isNotEmpty(title) && StringUtils.isNotEmpty(body) && jumpType > 0 && StringUtils.isNotEmpty(jumpTo)) {
NotificationJumpType notificationJumpType = NotificationJumpType.valueOf(jumpType);
if (notificationJumpType == NotificationJumpType.WEB_URL) {
NotificationDialog.defaultPopup(messageId, title, body, new NotificationDialogAction() {
@Override
public String name() {
return jumpTo;
}
@Override
public void doClick() {
String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(jumpTo);
BrowseUtils.browser(ssoUrl);
}
});
} else if (notificationJumpType == NotificationJumpType.DESIGNER_MODULE) {
NotificationActionType notificationActionType = NotificationActionType.valueOf(jumpTo);
NotificationDialog.defaultPopup(messageId, title, body, notificationActionType.getAction());
}
}
}
}

92
designer-base/src/main/java/com/fr/design/login/message/NotificationActionType.java

@ -0,0 +1,92 @@
package com.fr.design.login.message;
import com.fr.config.ServerPreferenceConfig;
import com.fr.design.dialog.NotificationDialogAction;
import com.fr.design.extra.WebViewDlgHelper;
import com.fr.design.mainframe.BaseJForm;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.EastRegionContainerPane;
import com.fr.design.mainframe.JTemplate;
import com.fr.design.os.impl.SupportOSImpl;
import com.fr.design.upm.UpmFinder;
import com.fr.design.utils.DesignUtils;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import com.fr.stable.bridge.StableFactory;
import com.fr.stable.os.Arch;
import com.fr.stable.os.OperatingSystem;
/**
* @author Lanlan
* @version 10.0
* Created by Lanlan on 2021/6/11
*/
public enum NotificationActionType {
PLUGIN("PLUGIN", new NotificationDialogAction() {
@Override
public String name() {
return "PLUGIN";
}
@Override
public void doClick() {
try {
if (Arch.getArch() == Arch.ARM || OperatingSystem.isLinux() || SupportOSImpl.MACOS_WEB_PLUGIN_MANAGEMENT.support()) {
DesignUtils.visitEnvServerByParameters("#management/plugin", null, null);
return;
}
if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() || SupportOSImpl.MACOS_NEW_PLUGIN_MANAGEMENT.support()) {
UpmFinder.showUPMDialog();
} else {
WebViewDlgHelper.createPluginDialog();
}
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}),
REUSE("REUSE", new NotificationDialogAction() {
@Override
public String name() {
return "REUSE";
}
@Override
public void doClick() {
try {
BaseJForm jform = StableFactory.getMarkedInstanceObjectFromClass(BaseJForm.XML_TAG, BaseJForm.class);
DesignerContext.getDesignerFrame().addAndActivateJTemplate((JTemplate<?, ?>) jform);
EastRegionContainerPane.getInstance().showContainer();
EastRegionContainerPane.getInstance().switchTabTo(EastRegionContainerPane.KEY_WIDGET_LIB);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
}),
UNKNOWN(StringUtils.EMPTY, new NotificationDialogAction() {
@Override
public String name() {
return "UNKNOWN";
}
@Override
public void doClick() {
}
});
private String jumpTo;
private NotificationDialogAction action;
NotificationActionType(String jumpTo, NotificationDialogAction action) {
this.jumpTo = jumpTo;
this.action = action;
}
public String getJumpTo() {
return jumpTo;
}
public NotificationDialogAction getAction() {
return action;
}
}

31
designer-base/src/main/java/com/fr/design/login/message/NotificationJumpType.java

@ -0,0 +1,31 @@
package com.fr.design.login.message;
/**
* @author Lanlan
* @version 10.0
* Created by Lanlan on 2021/6/11
*/
public enum NotificationJumpType {
WEB_URL(1),
DESIGNER_MODULE(2),
UNKNOWN(-1);
private int jumpType;
NotificationJumpType(int jumpType) {
this.jumpType = jumpType;
}
public int getJumpType() {
return jumpType;
}
public static NotificationJumpType valueOf(int jumpType) {
for(NotificationJumpType value : NotificationJumpType.values()) {
if(value.getJumpType() == jumpType) {
return value;
}
}
return UNKNOWN;
}
}

52
designer-base/src/main/java/com/fr/design/login/utils/DesignerLoginUtils.java

@ -2,9 +2,18 @@ package com.fr.design.login.utils;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.mainframe.toast.DesignerToastMsgUtil; import com.fr.design.mainframe.toast.DesignerToastMsgUtil;
import com.fr.general.CloudCenter;
import com.fr.general.GeneralContext; import com.fr.general.GeneralContext;
import com.fr.general.log.MessageFormatter;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.third.org.bouncycastle.util.encoders.Hex;
import java.security.SecureRandom;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/** /**
* @author Lanlan * @author Lanlan
@ -13,6 +22,10 @@ import java.util.Map;
*/ */
public class DesignerLoginUtils { public class DesignerLoginUtils {
private static final String PRODUCT_FINEREPORT = "product-finereport";
private static final String KEY = "i7hP48WAcuTrmxfN";
public static Map<String, String> renderMap() { public static Map<String, String> renderMap() {
Map<String, String> map4Tpl = new HashMap<>(); Map<String, String> map4Tpl = new HashMap<>();
map4Tpl.put("language", GeneralContext.getLocale().toString()); map4Tpl.put("language", GeneralContext.getLocale().toString());
@ -32,4 +45,43 @@ public class DesignerLoginUtils {
} }
} }
} }
public static String generateDesignerSSOUrl(String referrer) {
String ssoTemplate = CloudCenter.getInstance().acquireUrlByKind("designer.sso.api", "https://id.fanruan.com/api/app/?code={}&referrer={}");
try {
String code = generateLoginCode();
MessageFormatter.FormattingTuple tuple = MessageFormatter.arrayFormat(ssoTemplate, new String[]{code, referrer});
return tuple.getMessage();
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
return referrer;
}
private static String generateLoginCode() throws Exception {
DesignerEnvManager manager = DesignerEnvManager.getEnvManager();
JSONObject jo = JSONObject.create();
jo.put("uid", manager.getDesignerLoginUid());
jo.put("username", manager.getDesignerLoginUsername());
jo.put("source", PRODUCT_FINEREPORT);
byte[] iv = randomIv();
return new String(Hex.encode(iv)) + encrypt(jo.toString(), KEY.getBytes(), iv);
}
private static byte[] randomIv() {
byte[] salt = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.setSeed(System.currentTimeMillis());
secureRandom.nextBytes(salt);
return salt;
}
private static String encrypt(String content, byte[] key, byte[] iv) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
byte[] resultBytes = cipher.doFinal(content.getBytes());
return new String(Hex.encode(resultBytes));
}
} }

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

@ -6,6 +6,7 @@ package com.fr.design.mainframe;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.base.chart.exception.ChartNotFoundException; import com.fr.base.chart.exception.ChartNotFoundException;
import com.fr.design.DesignModelAdapter; import com.fr.design.DesignModelAdapter;
import com.fr.design.DesignState;
import com.fr.design.DesignerEnvManager; import com.fr.design.DesignerEnvManager;
import com.fr.design.ExtraDesignClassManager; import com.fr.design.ExtraDesignClassManager;
import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.core.ActionFactory;
@ -21,16 +22,24 @@ import com.fr.design.event.TargetModifiedListener;
import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.file.MutilTempalteTabPane;
import com.fr.design.file.NewTemplatePane;
import com.fr.design.file.SaveSomeTemplatePane; import com.fr.design.file.SaveSomeTemplatePane;
import com.fr.design.file.TemplateTreePane; import com.fr.design.file.TemplateTreePane;
import com.fr.design.fun.OemProcessor; import com.fr.design.fun.OemProcessor;
import com.fr.design.fun.TitlePlaceProcessor;
import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider; import com.fr.design.fun.impl.AbstractTemplateTreeShortCutProvider;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.imenu.UIMenuHighLight;
import com.fr.design.gui.iprogressbar.ProgressDialog; import com.fr.design.gui.iprogressbar.ProgressDialog;
import com.fr.design.gui.iscrollbar.UIScrollBar; import com.fr.design.gui.iscrollbar.UIScrollBar;
import com.fr.design.gui.itoolbar.UIToolbar;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.loghandler.LogMessageBar;
import com.fr.design.mainframe.toolbar.ToolBarMenuDock; import com.fr.design.mainframe.toolbar.ToolBarMenuDock;
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus;
import com.fr.design.mainframe.vcs.common.VcsHelper; import com.fr.design.mainframe.vcs.common.VcsHelper;
import com.fr.design.menu.MenuManager;
import com.fr.design.menu.ShortCut; import com.fr.design.menu.ShortCut;
import com.fr.design.os.impl.MacOsAddListenerAction; import com.fr.design.os.impl.MacOsAddListenerAction;
import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.os.impl.SupportOSImpl;
@ -42,32 +51,47 @@ import com.fr.file.FILE;
import com.fr.file.FILEFactory; import com.fr.file.FILEFactory;
import com.fr.file.FileFILE; import com.fr.file.FileFILE;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.GeneralUtils;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.invoke.Reflect; import com.fr.invoke.Reflect;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.injectable.PluginModule;
import com.fr.plugin.manage.PluginFilter;
import com.fr.plugin.observer.PluginEvent;
import com.fr.plugin.observer.PluginEventListener;
import com.fr.stable.ProductConstants; import com.fr.stable.ProductConstants;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.image4j.codec.ico.ICODecoder; import com.fr.stable.image4j.codec.ico.ICODecoder;
import com.fr.stable.os.OperatingSystem; import com.fr.stable.os.OperatingSystem;
import com.fr.stable.os.support.OSBasedAction;
import com.fr.stable.os.support.OSSupportCenter; import com.fr.stable.os.support.OSSupportCenter;
import com.fr.stable.project.ProjectConstants; import com.fr.stable.project.ProjectConstants;
import com.fr.start.OemHandler; import com.fr.start.OemHandler;
import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace; import com.fr.workspace.Workspace;
import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.connect.WorkspaceConnectionInfo;
import java.util.concurrent.CopyOnWriteArrayList;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JFrame; import javax.swing.JFrame;
import javax.swing.JLayeredPane; import javax.swing.JLayeredPane;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import javax.swing.border.MatteBorder;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Component; import java.awt.Component;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.DataFlavor;
@ -102,16 +126,34 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
private static final long serialVersionUID = -8732559571067484460L; private static final long serialVersionUID = -8732559571067484460L;
private static final int LEFT_ALIGN_GAP = -5;
private static final int MENU_HEIGHT = 26; private static final int MENU_HEIGHT = 26;
private static final Integer SECOND_LAYER = 100; private static final Integer SECOND_LAYER = 100;
private static final Integer TOP_LAYER = 200; private static final Integer TOP_LAYER = 200;
private List<DesignerOpenedListener> designerOpenedListenerList = new ArrayList<>(); private List<DesignerOpenedListener> designerOpenedListenerList = new CopyOnWriteArrayList<>();
private ToolBarMenuDock ad; private ToolBarMenuDock ad;
private DesktopCardPane centerTemplateCardPane;
private JPanel toolbarPane;
private JComponent toolbarComponent;
private JPanel menuPane;
private JMenuBar menuBar;
private JPanel eastCenterPane;
private UIToolbar combineUp;
private NewTemplatePane newWorkBookPane;
private Icon closeMode; private Icon closeMode;
private JLayeredPane layeredPane = this.getLayeredPane(); private JLayeredPane layeredPane = this.getLayeredPane();
@ -233,8 +275,37 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
// the content pane // the content pane
basePane.setLayout(new BorderLayout()); basePane.setLayout(new BorderLayout());
toolbarPane = new JPanel() {
@Override
public Dimension getPreferredSize() {
basePane.add(CenterRegionContainerPane.getInstance(), BorderLayout.CENTER); Dimension dim = super.getPreferredSize();
// dim.height = TOOLBAR_HEIGHT;
return dim;
}
};
toolbarPane.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel eastPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
eastPane.add(ad.createLargeToolbar(), BorderLayout.WEST);
eastCenterPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
combineUpTooBar();
eastCenterPane.add(combineUp, BorderLayout.NORTH);
JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane();
panel.add(newWorkBookPane = ad.getNewTemplatePane(), BorderLayout.WEST);
panel.add(MutilTempalteTabPane.getInstance(), BorderLayout.CENTER);
eastCenterPane.add(panel, BorderLayout.CENTER);
eastPane.add(eastCenterPane, BorderLayout.CENTER);
toolbarPane.add(eastPane, BorderLayout.NORTH);
toolbarPane.add(new UIMenuHighLight(), BorderLayout.SOUTH);
JPanel centerPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
centerPane.add(centerTemplateCardPane = new DesktopCardPane(), BorderLayout.CENTER);
centerPane.add(toolbarPane, BorderLayout.NORTH);
basePane.add(centerPane, BorderLayout.CENTER);
laoyoutWestPane(); laoyoutWestPane();
basePane.add(EastRegionContainerPane.getInstance(), BorderLayout.EAST); basePane.add(EastRegionContainerPane.getInstance(), BorderLayout.EAST);
basePane.setBounds(0, 0, contentWidth, contentHeight); basePane.setBounds(0, 0, contentWidth, contentHeight);
@ -342,7 +413,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
public DesktopCardPane getCenterTemplateCardPane() { public DesktopCardPane getCenterTemplateCardPane() {
return CenterRegionContainerPane.getInstance().getCenterTemplateCardPane(); return centerTemplateCardPane;
} }
/** /**
@ -350,10 +421,82 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
*/ */
protected void initMenuPane() { protected void initMenuPane() {
basePane.add(NorthRegionContainerPane.getInstance(), BorderLayout.NORTH); menuPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
menuPane.add(new UIMenuHighLight(), BorderLayout.SOUTH);
menuPane.add(initNorthEastPane(ad), BorderLayout.EAST);
basePane.add(menuPane, BorderLayout.NORTH);
this.resetToolkitByPlus(null); this.resetToolkitByPlus(null);
} }
/**
* @param ad 菜单栏
* @return panel
*/
protected JPanel initNorthEastPane(final ToolBarMenuDock ad) {
//hugh: private修改为protected方便oem的时候修改右上的组件构成
//顶部日志+登陆按钮
final JPanel northEastPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
//优先级为-1,保证最后全面刷新一次
GeneralContext.listenPluginRunningChanged(new PluginEventListener(-1) {
@Override
public void on(PluginEvent event) {
refreshNorthEastPane(northEastPane, ad);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (DesignerContext.getDesignerFrame() == null) {
return;
}
DesignerContext.getDesignerFrame().refresh();
DesignerContext.getDesignerFrame().repaint();
}
});
}
}, new PluginFilter() {
@Override
public boolean accept(PluginContext context) {
return context.contain(PluginModule.ExtraDesign);
}
});
refreshNorthEastPane(northEastPane, ad);
return northEastPane;
}
private void refreshNorthEastPane(final JPanel northEastPane, final ToolBarMenuDock ad) {
northEastPane.removeAll();
northEastPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0));
northEastPane.add(LogMessageBar.getInstance());
TitlePlaceProcessor processor = ExtraDesignClassManager.getInstance().getSingle(TitlePlaceProcessor.MARK_STRING);
if (processor != null) {
final Component[] bbsLoginPane = {null};
OSSupportCenter.buildAction(new OSBasedAction() {
@Override
public void execute(Object... objects) {
bbsLoginPane[0] = ad.createBBSLoginPane();
}
}, SupportOSImpl.USERINFOPANE);
processor.hold(northEastPane, LogMessageBar.getInstance(), bbsLoginPane[0]);
}
northEastPane.add(ad.createAlphaFinePane());
if (!DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) {
ad.createAlphaFinePane().setVisible(false);
}
northEastPane.add(ad.createNotificationCenterPane());
OSSupportCenter.buildAction(new OSBasedAction() {
@Override
public void execute(Object... objects) {
northEastPane.add(ad.createBBSLoginPane());
}
}, SupportOSImpl.USERINFOPANE);
}
public void initTitleIcon() { public void initTitleIcon() {
try { try {
@ -530,6 +673,94 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
this.closeMode = closeMode; this.closeMode = closeMode;
} }
/**
* 创建上工具栏
*/
private void combineUpTooBar() {
combineUp = new UIToolbar(FlowLayout.LEFT);
combineUp.setBorder(new MatteBorder(new Insets(0, LEFT_ALIGN_GAP, 1, 0), UIConstants.LINE_COLOR));
combineUp.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 2));
setUpUpToolBar(null);
}
/**
* 重置上工具栏
*/
private void resetCombineUpTooBar(JComponent[] toolbar4Form) {
combineUp.removeAll();
setUpUpToolBar(toolbar4Form);
}
/**
* 填充上工具栏的中的工具
*
* @param toolbar4Form 目标组件
*/
private void setUpUpToolBar(@Nullable JComponent[] toolbar4Form) {
UIButton[] fixButtons = ad.createUp();
for (UIButton fixButton : fixButtons) {
combineUp.add(fixButton);
}
if (!DesignModeContext.isAuthorityEditing()) {
combineUp.addSeparator(new Dimension(2, 16));
if (toolbar4Form != null) {
for (JComponent jComponent : toolbar4Form) {
combineUp.add(jComponent);
}
}
//添加检测按钮
addCheckButton();
}
//添加分享按钮
addShareButton();
//添加插件中的按钮
addExtraButtons();
}
private void addExtraButtons() {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jt == null) {
return;
}
UIButton[] extraButtons = jt.createExtraButtons();
for (UIButton extraButton : extraButtons) {
combineUp.add(extraButton);
}
if (extraButtons.length > 0) {
combineUp.addSeparator(new Dimension(2, 16));
}
}
private void addCheckButton() {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jt == null) {
return;
}
combineUp.addSeparator(new Dimension(2, 16));
UIButton[] checkButtons = jt.createCheckButton();
for (UIButton checkButton : checkButtons) {
combineUp.add(checkButton);
}
}
private void addShareButton() {
JTemplate<?, ?> jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jt == null) {
return;
}
combineUp.addSeparator(new Dimension(2, 16));
UIButton[] shareButtons = jt.createShareButton();
for (UIButton shareButton : shareButtons) {
combineUp.add(shareButton);
}
}
/** /**
* 检查 * 检查
* *
@ -537,10 +768,17 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
* @param al 组件名称 * @param al 组件名称
*/ */
public void checkCombineUp(boolean flag, ArrayList<String> al) { public void checkCombineUp(boolean flag, ArrayList<String> al) {
CenterRegionContainerPane.getInstance().checkCombineUp(flag, al); //Yvan: 检查当前是否为WORK_SHEET状态,因为只有WORK_SHEET中含有格式刷组件,此时是不需要进行checkComponentsByNames的
JTemplate<?, ?> jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
if (jTemplate != null) {
// 第一个条件满足后还需要添加一重判断,判断是编辑报表块还是参数面板,编辑报表块时则直接return
if (jTemplate.getMenuState() == DesignState.WORK_SHEET && !jTemplate.isUpMode()) {
return;
}
combineUp.checkComponentsByNames(flag, al);
}
} }
/** /**
* 刷新工具条. * 刷新工具条.
*/ */
@ -549,10 +787,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
this.ad.updateToolBarDef(); this.ad.updateToolBarDef();
} }
ToolBarMenuDock getToolBarMenuDock() {
return this.ad;
}
/** /**
* 重置相关的工具条. * 重置相关的工具条.
* *
@ -564,9 +798,22 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
plus = ToolBarMenuDock.NULLAVOID; plus = ToolBarMenuDock.NULLAVOID;
} }
NorthRegionContainerPane.getInstance().resetToolkitByPlus(plus, ad); DesignState designState = new DesignState(plus);
MenuManager.getInstance().setMenus4Designer(designState);
if (menuBar == null) {
menuPane.add(menuBar = ad.createJMenuBar(plus), BorderLayout.CENTER);
} else {
ad.resetJMenuBar(menuBar, plus);
}
resetCombineUpTooBar(ad.resetUpToolBar(plus));
if (toolbarComponent != null) {
toolbarPane.remove(toolbarComponent);
}
CenterRegionContainerPane.getInstance().resetToolkitByPlus(plus, ad); // 颜色,字体那些按钮的工具栏
toolbarPane.add(toolbarComponent = ad.resetToolBar(toolbarComponent, plus), BorderLayout.CENTER);
this.checkToolbarMenuEnable(); this.checkToolbarMenuEnable();
this.validate(); this.validate();
@ -574,13 +821,16 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
} }
public void refreshUIToolBar() { public void refreshUIToolBar() {
CenterRegionContainerPane.getInstance().refreshUIToolBar(); if (toolbarComponent instanceof UIToolbar) {
((UIToolbar ) toolbarComponent).refreshUIToolBar();
}
combineUp.refreshUIToolBar();
this.ad.updateEnable(); this.ad.updateEnable();
} }
public JComponent getToolbarComponent() { public JComponent getToolbarComponent() {
return CenterRegionContainerPane.getInstance().getToolbarComponent(); return this.toolbarComponent;
} }
/** /**
@ -588,7 +838,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
*/ */
public void needToAddAuhtorityPaint() { public void needToAddAuhtorityPaint() {
CenterRegionContainerPane.getInstance().needToAddAuhtorityPaint(); newWorkBookPane.setButtonGray(DesignModeContext.isAuthorityEditing());
// 进入或退出权限编辑模式,通知插件 // 进入或退出权限编辑模式,通知插件
Set<ShortCut> extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); Set<ShortCut> extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts();
@ -617,7 +867,9 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
JTemplate<?, ?> editingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); JTemplate<?, ?> editingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
StringBuilder defaultTitleSB = new StringBuilder(); StringBuilder defaultTitleSB = new StringBuilder();
defaultTitleSB.append(ProductConstants.PRODUCT_NAME); defaultTitleSB.append(ProductConstants.APP_NAME);
defaultTitleSB.append(" ");
defaultTitleSB.append(GeneralUtils.getVersion());
defaultTitleSB.append(" "); defaultTitleSB.append(" ");
defaultTitleSB.append(ProductConstants.BRANCH); defaultTitleSB.append(ProductConstants.BRANCH);
defaultTitleSB.append(" "); defaultTitleSB.append(" ");
@ -704,7 +956,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
*/ */
public JTemplate<?, ?> getSelectedJTemplate() { public JTemplate<?, ?> getSelectedJTemplate() {
return getCenterTemplateCardPane().getSelectedJTemplate(); return this.centerTemplateCardPane.getSelectedJTemplate();
} }
/** /**
@ -733,14 +985,10 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
if (jt == null || jt.getEditingFILE() == null) { if (jt == null || jt.getEditingFILE() == null) {
return; return;
} }
if (currentTemplateDeactivateFail()) {
return;
}
jt.addJTemplateActionListener(this); jt.addJTemplateActionListener(this);
jt.addTargetModifiedListener(this); jt.addTargetModifiedListener(this);
jt.addJTemplateActionListener(VcsHelper.getInstance()); jt.addJTemplateActionListener(VcsHelper.getInstance());
getCenterTemplateCardPane().showJTemplate(jt); centerTemplateCardPane.showJTemplate(jt);
refreshBaseContentPane(jt);
setTitle(); setTitle();
layeredPane.repaint(); layeredPane.repaint();
} }
@ -758,57 +1006,11 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta
if (jt == null || jt.getEditingFILE() == null) { if (jt == null || jt.getEditingFILE() == null) {
return; return;
} }
if (currentTemplateDeactivateFail()) { centerTemplateCardPane.showJTemplate(jt);
return;
}
getCenterTemplateCardPane().showJTemplate(jt);
refreshBaseContentPane(jt);
setTitle(); setTitle();
layeredPane.repaint(); layeredPane.repaint();
} }
/**
* 当前模板 停用失败
*
* @return 是否停用失败
*/
private boolean currentTemplateDeactivateFail() {
JTemplate currentEditingTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate();
return currentEditingTemplate != null && !currentEditingTemplate.deactivateTemplate();
}
/**
* 根据模板刷新 设计器整个界面
*
* @param jTemplate 当前模板
*/
private void refreshBaseContentPane(JTemplate jTemplate) {
JComponent north = jTemplate.north4DesignerFrame(),
center = jTemplate.center4DesignerFrame(),
west = jTemplate.west4DesignerFrame(),
east = jTemplate.east4DesignerFrame();
basePane.removeAll();
if (north != null) {
basePane.add(north, BorderLayout.NORTH);
}
if (center != null) {
basePane.add(center, BorderLayout.CENTER);
}
if (west != null) {
basePane.add(west, BorderLayout.WEST);
}
if (east != null) {
basePane.add(east, BorderLayout.EAST);
}
layeredPane.repaint();
layeredPane.revalidate();
}
/** /**
* 对象侦听 * 对象侦听
* *

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

@ -123,6 +123,11 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
private volatile boolean opening = false; private volatile boolean opening = false;
private volatile boolean openFailed = false; private volatile boolean openFailed = false;
/**
* UI界面模板运行时唯一的id 不存储在模板中 仅在运行时使用 模板界面上关闭就不关注了
*/
private final String runtimeId = UUID.randomUUID().toString();
private PluginEventListener pluginListener; private PluginEventListener pluginListener;
public JTemplate() { public JTemplate() {
@ -1471,10 +1476,6 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
editingFILE = fileChooser.getSelectedFILE(); editingFILE = fileChooser.getSelectedFILE();
} }
//收集和生成templateID 因为是另存为操作 无论怎么样都需要重新生成templateID
// TODO Hades https://work.fineres.com/browse/REPORT-52936
// initForCollect();
FILE finalEditingFILE = editingFILE; FILE finalEditingFILE = editingFILE;
CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() { CallbackSaveWorker worker = new CallbackSaveWorker(new Callable<Boolean>() {
@Override @Override
@ -1566,13 +1567,13 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
@Override @Override
public void saveDirectly() { public void saveDirectly() {
CallbackSaveWorker worker = save(); CallbackSaveWorker worker = save();
worker.start(this.template.getTemplateID()); worker.start(getRuntimeId());
} }
@Override @Override
public void saveAsDirectly() { public void saveAsDirectly() {
CallbackSaveWorker worker = saveAs(); CallbackSaveWorker worker = saveAs();
worker.start(this.template.getTemplateID()); worker.start(getRuntimeId());
} }
@Override @Override
@ -1613,4 +1614,7 @@ public abstract class JTemplate<T extends BaseBook, U extends BaseUndoState<?>>
return !isSaving() && !isOpening() && !isOpenFailed(); return !isSaving() && !isOpening() && !isOpenFailed();
} }
public String getRuntimeId() {
return runtimeId;
}
} }

6
designer-base/src/main/java/com/fr/design/mainframe/check/CheckButton.java

@ -116,7 +116,7 @@ public class CheckButton extends UIButton {
startCheck(checkThread); startCheck(checkThread);
} }
}); });
worker.start(jtemplate.getTarget().getTemplateID()); worker.start(jtemplate.getRuntimeId());
} }
} else { } else {
if (!jtemplate.isSaved()) { if (!jtemplate.isSaved()) {
@ -127,7 +127,7 @@ public class CheckButton extends UIButton {
startCheck(checkThread); startCheck(checkThread);
} }
}); });
worker.start(jtemplate.getTarget().getTemplateID()); worker.start(jtemplate.getRuntimeId());
} else { } else {
startCheck(checkThread); startCheck(checkThread);
} }
@ -148,7 +148,7 @@ public class CheckButton extends UIButton {
startCheck(checkThread); startCheck(checkThread);
} }
}); });
worker.start(jtemplate.getTarget().getTemplateID()); worker.start(jtemplate.getRuntimeId());
} }
} }
} }

2
designer-base/src/main/java/com/fr/design/mainframe/reuse/ReuseGuideDialog.java

@ -108,7 +108,7 @@ public class ReuseGuideDialog extends UIDialog implements PromptWindow {
JPanel centerPanel = new JPanel(new BorderLayout()); JPanel centerPanel = new JPanel(new BorderLayout());
UILabel titleLabel = new UILabel(Toolkit.i18nText("Fine-Design_Share_Drag_And_Make_Component")); UILabel titleLabel = new UILabel(Toolkit.i18nText("Fine-Design_Share_Drag_And_Make_Component"));
UILabel imageLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/base/images/share/guide.png").getScaledInstance(DEFAULT.width, DEFAULT.height, Image.SCALE_SMOOTH))); UILabel imageLabel = new UILabel(new ImageIcon(IOUtils.readImage("com/fr/design/images/dashboard/guide.png").getScaledInstance(DEFAULT.width, DEFAULT.height, Image.SCALE_SMOOTH)));
titleLabel.setFont(new Font(titleLabel.getFont().getName(), Font.BOLD, TITLE_FONT_SIZE)); titleLabel.setFont(new Font(titleLabel.getFont().getName(), Font.BOLD, TITLE_FONT_SIZE));
titleLabel.setBorder(BorderFactory.createEmptyBorder()); titleLabel.setBorder(BorderFactory.createEmptyBorder());

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

@ -466,6 +466,10 @@ public abstract class ToolBarMenuDock {
return new UILabel(); return new UILabel();
} }
public Component createNotificationCenterPane(){
return new UILabel();
}
protected MenuDef createServerMenuDef(ToolBarMenuDockPlus plus) { protected MenuDef createServerMenuDef(ToolBarMenuDockPlus plus) {
MenuDef menuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic__M_Server"), 'S'); MenuDef menuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic__M_Server"), 'S');

32
designer-base/src/main/java/com/fr/design/mod/ContentObjectManager.java

@ -9,6 +9,8 @@ import com.fr.data.SimpleDSColumn;
import com.fr.data.condition.FormulaCondition; import com.fr.data.condition.FormulaCondition;
import com.fr.data.impl.FormulaDictionary; import com.fr.data.impl.FormulaDictionary;
import com.fr.data.impl.NameTableData; import com.fr.data.impl.NameTableData;
import com.fr.design.mod.impl.repalce.JavaScriptContentReplacer;
import com.fr.design.mod.impl.repalce.VanChartHtmlLabelContentReplacer;
import com.fr.form.main.FormHyperlink; import com.fr.form.main.FormHyperlink;
import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.WidgetTitle; import com.fr.form.ui.WidgetTitle;
@ -22,6 +24,8 @@ import com.fr.report.cell.cellattr.core.group.DSColumn;
import com.fr.report.cell.cellattr.core.group.FunctionGrouper; import com.fr.report.cell.cellattr.core.group.FunctionGrouper;
import com.fr.report.cell.cellattr.core.group.SelectCount; import com.fr.report.cell.cellattr.core.group.SelectCount;
import com.fr.stable.Filter; import com.fr.stable.Filter;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -45,10 +49,12 @@ public class ContentObjectManager {
/** /**
* 放置所有需要替换内容的对象 * 放置所有需要替换内容的对象
*/ */
private Map<String, Set<Object>> objectMap; private Map<String, Collection<Object>> objectMap;
private final Set<String> set = new HashSet<>(); private final Set<String> set = new HashSet<>();
private final Map<String, ContentReplacer> map = new HashMap<>();
private ContentObjectManager() { private ContentObjectManager() {
set.add(Formula.class.getName()); set.add(Formula.class.getName());
set.add(JavaScriptImpl.class.getName()); set.add(JavaScriptImpl.class.getName());
@ -70,6 +76,8 @@ public class ContentObjectManager {
set.add(SelectCount.class.getName()); set.add(SelectCount.class.getName());
set.add(WidgetTitle.class.getName()); set.add(WidgetTitle.class.getName());
set.add(FunctionGrouper.class.getName()); set.add(FunctionGrouper.class.getName());
map.put(JavaScriptImpl.class.getName(), new JavaScriptContentReplacer());
map.put(VanChartHtmlLabel.class.getName(), new VanChartHtmlLabelContentReplacer());
} }
public void searchObject(Object ob) { public void searchObject(Object ob) {
@ -84,12 +92,32 @@ public class ContentObjectManager {
objectMap = ClassHelper.searchObject(ob, set, filter); objectMap = ClassHelper.searchObject(ob, set, filter);
} }
public void clearObject() { public void clearObject() {
if (objectMap != null) {
objectMap.clear();
}
objectMap = null; objectMap = null;
} }
@Nullable @Nullable
public Map<String, Set<Object>> getObjectMap() { public Map<String, Collection<Object>> getObjectMap() {
return objectMap; return objectMap;
} }
public boolean needContentTip(Object ob, Set<String> nameSet) {
objectMap = ClassHelper.searchObject(ob, set, ModClassFilter.getInstance());
for (Map.Entry<String, Collection<Object>> entry : objectMap.entrySet()) {
for (Object o : entry.getValue()) {
for (String name : nameSet) {
ContentReplacer contentReplacer = map.get(entry.getKey());
if (contentReplacer!= null && contentReplacer.contain(o, name)) {
clearObject();
return true;
}
}
}
}
clearObject();
return false;
}
} }

7
designer-base/src/main/java/com/fr/design/mod/ContentReplaceUtil.java

@ -168,5 +168,12 @@ public class ContentReplaceUtil {
return content; return content;
} }
public static boolean containsName(String content, String name) {
if (StringUtils.isNotEmpty(content)) {
return content.contains(name);
}
return false;
}
} }

5
designer-base/src/main/java/com/fr/design/mod/ContentReplacer.java

@ -10,4 +10,9 @@ public interface ContentReplacer<T> {
void replace(T t, String oldName, String newName); void replace(T t, String oldName, String newName);
default boolean contain(T t, String name) {
return false;
}
} }

21
designer-base/src/main/java/com/fr/design/mod/ContentReplacerCenter.java

@ -29,9 +29,10 @@ import com.fr.event.EventDispatcher;
import com.fr.event.Listener; import com.fr.event.Listener;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
/** /**
* 默认联动内容替换器实现 * 默认联动内容替换器实现
@ -51,7 +52,7 @@ public class ContentReplacerCenter {
} }
private List<ContentChange> contentChangeList = new ArrayList<>(); private List<ContentChange> contentChangeList = new ArrayList<>();
private List<ContentChangeItem> items = new ArrayList<>(); private Map<ChangeItem, ContentChangeItem> itemsMap = new HashMap<>();
private ContentReplacerCenter() { private ContentReplacerCenter() {
@ -61,21 +62,21 @@ public class ContentReplacerCenter {
if (param.getChangeMap().isEmpty()) { if (param.getChangeMap().isEmpty()) {
return; return;
} }
items.add(param); itemsMap.put(param.getChangeItem(), param);
} }
}); });
EventDispatcher.listen(TableDataModifyEvent.INSTANCE, new Listener<ContentChangeItem>() { EventDispatcher.listen(TableDataModifyEvent.INSTANCE, new Listener<ContentChangeItem>() {
@Override @Override
public void on(Event event, ContentChangeItem param) { public void on(Event event, ContentChangeItem param) {
items.add(param); itemsMap.put(param.getChangeItem(), param);
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
ContentObjectManager.getInstance().searchObject(param.getObject()); ContentObjectManager.getInstance().searchObject(param.getObject());
FineLoggerFactory.getLogger().debug("search object spend {} ms", (System.currentTimeMillis() - start)); FineLoggerFactory.getLogger().debug("search object spend {} ms", (System.currentTimeMillis() - start));
FineLoggerFactory.getLogger().debug("search result: {}", ContentObjectManager.getInstance().getObjectMap() == null FineLoggerFactory.getLogger().debug("search result: {}", ContentObjectManager.getInstance().getObjectMap() == null
? null : ContentObjectManager.getInstance().getObjectMap().keySet()); ? null : ContentObjectManager.getInstance().getObjectMap().keySet());
List<ContentChangeItem> itemsCopy = new ArrayList<>(items); List<ContentChangeItem> itemsCopy = new ArrayList<>(itemsMap.values());
items.clear(); itemsMap.clear();
onRename(itemsCopy, contentChangeList); onRename(itemsCopy, contentChangeList);
} }
}); });
@ -106,14 +107,14 @@ public class ContentReplacerCenter {
} }
private void onRename(List<ContentChangeItem> contentChangeItemList, List<ContentChange> contentChangeList) { private void onRename(List<ContentChangeItem> contentChangeItemList, List<ContentChange> contentChangeList) {
Map<String, Set<Object>> objectMap = ContentObjectManager.getInstance().getObjectMap(); Map<String, Collection<Object>> objectMap = ContentObjectManager.getInstance().getObjectMap();
if (objectMap != null) { if (objectMap != null) {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
for (ContentChange contentChange : contentChangeList) { for (ContentChange contentChange : contentChangeList) {
Set<Object> set = objectMap.get(contentChange.type()); Collection<Object> objects = objectMap.get(contentChange.type());
// 所有需要处理的js等对象 // 所有需要处理的js等对象
if (set != null) { if (objects != null) {
for (Object ob : set) { for (Object ob : objects) {
fireChange(ob, contentChange, contentChangeItemList); fireChange(ob, contentChange, contentChangeItemList);
} }
} }

4
designer-base/src/main/java/com/fr/design/mod/impl/repalce/JavaScriptContentReplacer.java

@ -19,4 +19,8 @@ public class JavaScriptContentReplacer implements ContentReplacer<JavaScriptImpl
} }
} }
@Override
public boolean contain(JavaScriptImpl javaScript, String name) {
return ContentReplaceUtil.containsName(javaScript.getContent(), name);
}
} }

5
designer-base/src/main/java/com/fr/design/mod/impl/repalce/VanChartHtmlLabelContentReplacer.java

@ -19,4 +19,9 @@ public class VanChartHtmlLabelContentReplacer implements ContentReplacer<VanChar
ContentReplaceUtil.replaceContent(vanChartHtmlLabel.getCustomText(), oldName, newName)); ContentReplaceUtil.replaceContent(vanChartHtmlLabel.getCustomText(), oldName, newName));
} }
} }
@Override
public boolean contain(VanChartHtmlLabel vanChartHtmlLabel, String name) {
return ContentReplaceUtil.containsName(vanChartHtmlLabel.getCustomText(), name);
}
} }

53
designer-base/src/main/java/com/fr/design/notification/Notification.java

@ -0,0 +1,53 @@
package com.fr.design.notification;
import com.fr.design.dialog.NotificationDialogAction;
import com.fr.stable.StringUtils;
public class Notification {
private String messageId;
private int type;
private String message;
private NotificationDialogAction notificationDialogAction;
public static final int ERROR_MESSAGE = 0;
public static final int NEW_MESSAGE = 1;
public static final int WARNING_MESSAGE = 2;
public Notification(String messageId, int type, String message, NotificationDialogAction notificationDialogAction) {
this.messageId = messageId;
this.type = type;
this.message = message;
this.notificationDialogAction = notificationDialogAction;
}
public Notification(String message) {
this.type = WARNING_MESSAGE;
this.message = message;
this.notificationDialogAction = new NotificationDialogAction() {
@Override
public String name() {
return StringUtils.EMPTY;
}
@Override
public void doClick() {
//do nothing
}
};
}
public NotificationDialogAction getNotificationDialogAction() {
return notificationDialogAction;
}
public int getType() {
return type;
}
public String getMessage() {
return message;
}
public String getMessageId() {
return messageId;
}
}

42
designer-base/src/main/java/com/fr/design/notification/NotificationCenter.java

@ -0,0 +1,42 @@
package com.fr.design.notification;
import com.fr.design.notification.ui.NotificationCenterPane;
import java.util.ArrayList;
import java.util.List;
public class NotificationCenter {
private static NotificationCenter notificationCenter = new NotificationCenter();
private List<Notification> notifications;
private NotificationCenter(){
notifications = new ArrayList<>();
}
public static NotificationCenter getInstance(){
return notificationCenter;
}
public void addNotification(Notification message){
notifications.add(message);
NotificationCenterPane.getNotificationCenterPane().refreshButton();
}
public int getNotificationsCount(){
return notifications.size();
}
public void removeNotification(int index){
notifications.remove(index);
NotificationCenterPane.getNotificationCenterPane().refreshButton();
}
public Notification getNotification(int index){
return notifications.get(index);
}
public void clearAllNotifications(){
notifications.clear();
NotificationCenterPane.getNotificationCenterPane().refreshButton();
}
}

133
designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterDialog.java

@ -0,0 +1,133 @@
package com.fr.design.notification.ui;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.notification.Notification;
import com.fr.design.notification.NotificationCenter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JDialog;
import javax.swing.JPanel;
public class NotificationCenterDialog extends JDialog {
private ArrayList<NotificationPane> notificationNeedShow;
private JPanel centerPanel;
private UILabel deleteLabel;
private static final int NOTIFICATIONCOUNT = 5;
private static NotificationCenterDialog instance;
private NotificationCenterDialog(Frame parent) {
super(parent);
setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Notification"));
setResizable(false);
notificationNeedShow = new ArrayList<>();
addWindowFocusListener(new WindowAdapter() {
@Override
public void windowLostFocus(WindowEvent e) {
hideDialog();
}
});
initComponents();
}
public static NotificationCenterDialog getInstance() {
if (instance == null) {
instance = new NotificationCenterDialog(DesignerContext.getDesignerFrame());
}
return instance;
}
private void initComponents() {
centerPanel = FRGUIPaneFactory.createNColumnGridInnerContainer_S_Pane(1);
addNotification();
deleteLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_Notifications") + "(" + NotificationCenter.getInstance().getNotificationsCount() + ")");
deleteLabel.setForeground(Color.BLUE);
deleteLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
NotificationCenter.getInstance().clearAllNotifications();
centerPanel.removeAll();
addNotification();
pack();
deleteLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_Notifications") + "(" + NotificationCenter.getInstance().getNotificationsCount() + ")");
if (notificationNeedShow.size() == 0) {
hideDialog();
}
}
});
JPanel deletePane = new JPanel(FRGUIPaneFactory.createCenterFlowLayout());
deletePane.add(deleteLabel);
deletePane.setPreferredSize(new Dimension(240, 30));
add(centerPanel, BorderLayout.CENTER);
add(deletePane, BorderLayout.SOUTH);
pack();
centerWindow();
}
public ArrayList<NotificationPane> getNotificationNeedShow() {
return notificationNeedShow;
}
public JPanel getCenterPanel() {
return centerPanel;
}
public UILabel getDeleteLabel() {
return deleteLabel;
}
public void showDialog() {
this.setVisible(true);
}
public void hideDialog() {
this.dispose();
}
public void addNotification() {
notificationNeedShow.clear();
int size = NotificationCenter.getInstance().getNotificationsCount();
for (int i = NOTIFICATIONCOUNT; i > 0; i--) {
int j = size - i;
if (j >= 0) {
Notification notification = NotificationCenter.getInstance().getNotification(j);
NotificationPane notificationPane = new NotificationPane(this, notification.getMessageId(), notification.getType(), notification.getMessage(), i, notification.getNotificationDialogAction());
notificationNeedShow.add(notificationPane);
}
}
size = notificationNeedShow.size();
for (int i = size - 1; i >= 0; i--) {
centerPanel.add(notificationNeedShow.get(i));
}
}
private void centerWindow() {
Window win = this;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension winSize = win.getSize();
if (winSize.height > screenSize.height) {
winSize.height = screenSize.height;
}
if (winSize.width > screenSize.width) {
winSize.width = screenSize.width;
}
//这里设置位置:水平居中,竖直偏上
win.setLocation(screenSize.width - winSize.width - 90, 50);
}
}

52
designer-base/src/main/java/com/fr/design/notification/ui/NotificationCenterPane.java

@ -0,0 +1,52 @@
package com.fr.design.notification.ui;
import com.fr.design.constants.UIConstants;
import com.fr.design.dialog.BasicPane;
import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.i18n.Toolkit;
import com.fr.design.notification.NotificationCenter;
import com.fr.general.IOUtils;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class NotificationCenterPane extends BasicPane {
private static NotificationCenterPane notificationCenterPane = new NotificationCenterPane();
private static UIButton notificationCenterButton;
private NotificationCenterPane() {
setPreferredSize(new Dimension(24, 24));
setLayout(new BorderLayout());
notificationCenterButton = new UIButton();
notificationCenterButton.setIcon(IOUtils.readIcon("/com/fr/design/notification/ui/notificationCenter.png"));
notificationCenterButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Show_Notification"));
notificationCenterButton.set4ToolbarButton();
notificationCenterButton.setRolloverEnabled(false);
this.add(notificationCenterButton);
notificationCenterButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
NotificationCenterDialog.getInstance().showDialog();
}
});
this.setBackground(UIConstants.TEMPLATE_TAB_PANE_BACKGROUND);
}
public static NotificationCenterPane getNotificationCenterPane() {
return notificationCenterPane;
}
public void refreshButton() {
if (NotificationCenter.getInstance().getNotificationsCount() > 0) {
notificationCenterButton.setIcon(IOUtils.readIcon("/com/fr/design/notification/ui/notificationCenterDot.png"));
} else {
notificationCenterButton.setIcon(IOUtils.readIcon("/com/fr/design/notification/ui/notificationCenter.png"));
}
}
@Override
protected String title4PopupWindow() {
return "NotificationCenter";
}
}

148
designer-base/src/main/java/com/fr/design/notification/ui/NotificationPane.java

@ -0,0 +1,148 @@
package com.fr.design.notification.ui;
import com.fr.design.dialog.NotificationDialogAction;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.notification.NotificationCenter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.JPanel;
import javax.swing.UIManager;
/**
* @author Lanlan
* @version 10.0
* Created by Lanlan on 2021/6/21
*/
public class NotificationPane extends JPanel {
private NotificationCenterDialog parent;
private String messageId;
private int index;
private UILabel messageLabel;
private UILabel messageIcon;
private NotificationDialogAction notificationDialogAction;
public NotificationPane(NotificationCenterDialog parent, String messageId, int type, String message, int index, NotificationDialogAction notificationDialogAction) {
this.parent = parent;
this.index = index;
this.messageId = messageId;
this.notificationDialogAction = notificationDialogAction;
this.setLayout(FRGUIPaneFactory.createBorderLayout());
setTypeIcon(getIconForType(type));
setNotification(message);
setDeleteIcon();
}
public void setTypeIcon(Icon icon) {
messageIcon = new UILabel(icon);
messageIcon.addMouseListener(messageAndIconListener);
JPanel messageIconPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
messageIconPanel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8));
messageIconPanel.add(messageIcon);
add(messageIconPanel, BorderLayout.WEST);
}
public void setDeleteIcon() {
UILabel deleteIcon = new UILabel(UIManager.getIcon("OptionPane.deleteIcon"));
JPanel deleteIconPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
deleteIconPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 7));
deleteIconPane.add(deleteIcon);
deleteIconPane.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
NotificationCenter.getInstance().removeNotification(NotificationCenter.getInstance().getNotificationsCount() - index);
parent.getCenterPanel().removeAll();
parent.addNotification();
parent.getDeleteLabel().setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_Notifications") + "(" + NotificationCenter.getInstance().getNotificationsCount() + ")");
parent.pack();
if (parent.getNotificationNeedShow().size() == 0) {
parent.hideDialog();
}
NotificationCenterPane.getNotificationCenterPane().refreshButton();
}
@Override
public void mouseEntered(MouseEvent e) {
deleteIcon.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
@Override
public void mouseExited(MouseEvent e) {
deleteIcon.setCursor(Cursor.getDefaultCursor());
}
});
add(deleteIconPane, BorderLayout.EAST);
}
public int getIndex() {
return index;
}
public String getMessageId() {
return messageId;
}
public NotificationDialogAction getNotificationDialogAction() {
return notificationDialogAction;
}
public void setNotification(String message) {
messageLabel = new UILabel("<html>" + message + "</html>");
messageLabel.addMouseListener(messageAndIconListener);
JPanel labelPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
labelPanel.add(messageLabel);
this.add(labelPanel, BorderLayout.CENTER);
}
protected Icon getIconForType(int messageType) {
String propertyName;
switch (messageType) {
case 0:
propertyName = "OptionPane.circularErrorIcon";
break;
case 1:
propertyName = "OptionPane.newMessageIcon";
break;
case 2:
propertyName = "OptionPane.circularWarningIcon";
break;
default:
return null;
}
return UIManager.getIcon(propertyName);
}
private void performTargetAction() {
parent.hideDialog();
notificationDialogAction.doClick();
}
private MouseListener messageAndIconListener = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
performTargetAction();
}
@Override
public void mouseEntered(MouseEvent e) {
messageLabel.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
messageIcon.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
messageLabel.setForeground(new Color(250, 170, 57));
}
@Override
public void mouseExited(MouseEvent e) {
messageLabel.setCursor(Cursor.getDefaultCursor());
messageIcon.setCursor(Cursor.getDefaultCursor());
messageLabel.setForeground(Color.BLACK);
}
};
}

6
designer-base/src/main/java/com/fr/design/ui/ModernUIConstants.java

@ -7,9 +7,9 @@ import com.fr.general.IOUtils;
* @version 10.0 * @version 10.0
* Created by richie on 2019-03-05 * Created by richie on 2019-03-05
*/ */
class ModernUIConstants { public class ModernUIConstants {
static final String SCRIPT_INIT_NAME_SPACE = IOUtils.readResourceAsString("/com/fr/design/ui/InitNameSpace.js"); public static final String SCRIPT_INIT_NAME_SPACE = IOUtils.readResourceAsString("/com/fr/design/ui/InitNameSpace.js");
static final String HTML_TPL = IOUtils.readResourceAsString("/com/fr/design/ui/tpl.html"); public static final String HTML_TPL = IOUtils.readResourceAsString("/com/fr/design/ui/tpl.html");
} }

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

@ -8,6 +8,7 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.web.struct.AssembleComponent; import com.fr.web.struct.AssembleComponent;
import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserType;
import com.teamdev.jxbrowser.chromium.JSValue; import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.events.LoadListener; import com.teamdev.jxbrowser.chromium.events.LoadListener;
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter;
@ -18,11 +19,11 @@ import com.teamdev.jxbrowser.chromium.swing.BrowserView;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import java.util.Map;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Map;
/** /**
* @author richie * @author richie
@ -37,11 +38,11 @@ public class ModernUIPane<T> extends BasicPane {
private String variable = "data"; private String variable = "data";
private String expression = "update()"; private String expression = "update()";
private ModernUIPane() { private ModernUIPane(BrowserType browserType) {
initialize(); initialize(browserType);
} }
private void initialize() { private void initialize(BrowserType browserType) {
if (browser == null) { if (browser == null) {
setLayout(new BorderLayout()); setLayout(new BorderLayout());
Assistant.addChromiumSwitches("--disable-google-traffic"); Assistant.addChromiumSwitches("--disable-google-traffic");
@ -76,10 +77,10 @@ public class ModernUIPane<T> extends BasicPane {
} }
}); });
Assistant.addChromiumSwitches("--remote-debugging-port=9222"); Assistant.addChromiumSwitches("--remote-debugging-port=9222");
initializeBrowser(); initializeBrowser(browserType);
add(new BrowserView(browser), BorderLayout.CENTER); add(new BrowserView(browser), BorderLayout.CENTER);
} else { } else {
initializeBrowser(); initializeBrowser(browserType);
add(new BrowserView(browser), BorderLayout.CENTER); add(new BrowserView(browser), BorderLayout.CENTER);
} }
} }
@ -97,8 +98,8 @@ public class ModernUIPane<T> extends BasicPane {
debugger.loadURL(browser.getRemoteDebuggingURL()); debugger.loadURL(browser.getRemoteDebuggingURL());
} }
private void initializeBrowser() { private void initializeBrowser(BrowserType browserType) {
browser = new Browser(); browser = new Browser(browserType);
// 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的 // 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的
browser.addScriptContextListener(new ScriptContextAdapter() { browser.addScriptContextListener(new ScriptContextAdapter() {
@Override @Override
@ -145,14 +146,22 @@ public class ModernUIPane<T> extends BasicPane {
public T update() { public T update() {
JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression); JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression);
if (jsValue.isObject()) { if (jsValue.isObject()) {
return (T)jsValue.asJavaObject(); return (T) jsValue.asJavaObject();
} }
return null; return null;
} }
public static class Builder<T> { public static class Builder<T> {
private ModernUIPane<T> pane = new ModernUIPane<>(); private ModernUIPane<T> pane;
public Builder() {
this(BrowserType.HEAVYWEIGHT);
}
public Builder(BrowserType browserType) {
this.pane = new ModernUIPane<>(browserType);
}
public Builder<T> prepare(ScriptContextListener contextListener) { public Builder<T> prepare(ScriptContextListener contextListener) {
pane.browser.addScriptContextListener(contextListener); pane.browser.addScriptContextListener(contextListener);

2
designer-base/src/main/java/com/fr/design/ui/compatible/NxInterceptRequestCallback.java

@ -124,7 +124,7 @@ public class NxInterceptRequestCallback implements InterceptRequestCallback {
if (path.endsWith(".gif")) { if (path.endsWith(".gif")) {
return "image/gif"; return "image/gif";
} }
Path file = new File("D:\\Fanruan\\FR10.0\\final_05_27\\FineReport_10.0\\webapps\\webroot\\upm\\lib\\locale\\plugin_zh_CN.js").toPath(); Path file = new File(path).toPath();
try { try {
return Files.probeContentType(file); return Files.probeContentType(file);
} catch (IOException e) { } catch (IOException e) {

32
designer-base/src/main/java/com/fr/design/update/actions/SyncFileProcess.java

@ -2,22 +2,45 @@ package com.fr.design.update.actions;
import com.fr.decision.update.SyncExecutor; import com.fr.decision.update.SyncExecutor;
import com.fr.decision.update.info.UpdateCallBack; import com.fr.decision.update.info.UpdateCallBack;
import com.fr.decision.update.info.UpdateProgressCallBack;
import com.fr.design.i18n.Toolkit;
import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.env.SyncFailedPluginsDialog;
import com.fr.json.JSONArray;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker; import javax.swing.SwingWorker;
public abstract class SyncFileProcess extends SwingWorker<Boolean, Void> { public abstract class SyncFileProcess extends SwingWorker<Boolean, Void> {
private UpdateCallBack callBack;
private String buildNo; private String buildNo;
private JProgressBar bar;
private SyncFailedPluginsDialog syncFailedPluginsDialog;
public SyncFileProcess(UpdateCallBack callBack,String buildNo) { public SyncFileProcess(JProgressBar bar, String buildNo, SyncFailedPluginsDialog syncFailedPluginsDialog) {
this.callBack = callBack; this.bar = bar;
this.buildNo = buildNo; this.buildNo = buildNo;
this.syncFailedPluginsDialog = syncFailedPluginsDialog;
} }
@Override @Override
protected Boolean doInBackground() throws Exception { protected Boolean doInBackground() throws Exception {
return SyncExecutor.getInstance().execute(callBack,buildNo); UpdateCallBack callBack = new UpdateProgressCallBack(bar);
bar.setValue(0);
bar.setString(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugins"));
JSONArray syncFailedPlugins = VersionCheckUtils.syncPlugins(VersionCheckUtils.checkLocalAndRemotePlugin());
if (syncFailedPlugins.size() > 0) {
syncFailedPluginsDialog.showSyncFailedPluginsInfo(syncFailedPlugins);
}
RecoverForDesigner recoverForDesigner = new RecoverForDesigner();
if (!recoverForDesigner.backup()) {
return false;
}
boolean result = SyncExecutor.getInstance().execute(callBack, buildNo);
if (!result) {
recoverForDesigner.recover();
}
return result;
} }
@Override @Override
@ -38,6 +61,7 @@ public abstract class SyncFileProcess extends SwingWorker<Boolean, Void> {
} }
} }
/** /**
* 下载成功 * 下载成功
*/ */

15
designer-base/src/main/java/com/fr/design/update/push/DesignerPushUpdateManager.java

@ -27,6 +27,8 @@ public class DesignerPushUpdateManager {
private DesignerUpdateInfo updateInfo; private DesignerUpdateInfo updateInfo;
private boolean shouldPopUp = false;
private DesignerPushUpdateManager() { private DesignerPushUpdateManager() {
} }
@ -91,13 +93,14 @@ public class DesignerPushUpdateManager {
* 检查更新如果有合适的更新版本则弹窗 * 检查更新如果有合适的更新版本则弹窗
*/ */
private void checkAndPop() { private void checkAndPop() {
if (!shouldPopUp()) {
this.shouldPopUp = true;
FineLoggerFactory.getLogger().debug("skip push update");
return;
}
checkUpdateService.execute(new Runnable() { checkUpdateService.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
if (!shouldPopUp()) {
FineLoggerFactory.getLogger().debug("skip push update");
return;
}
final DesignerFrame designerFrame = DesignerContext.getDesignerFrame(); final DesignerFrame designerFrame = DesignerContext.getDesignerFrame();
DesignerPushUpdateDialog.createAndShow(designerFrame, updateInfo); DesignerPushUpdateDialog.createAndShow(designerFrame, updateInfo);
} }
@ -139,6 +142,10 @@ public class DesignerPushUpdateManager {
return StringUtils.isNotEmpty(prefix) && fullCurrentVersion.contains(SPLIT_CHAR); return StringUtils.isNotEmpty(prefix) && fullCurrentVersion.contains(SPLIT_CHAR);
} }
public boolean isShouldPopUp() {
return shouldPopUp;
}
/** /**
* 跳转到更新升级窗口并自动开始更新 * 跳转到更新升级窗口并自动开始更新
*/ */

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

@ -18,9 +18,11 @@ import com.fr.design.i18n.Toolkit;
import com.fr.design.locale.impl.BbsRegisterMark; import com.fr.design.locale.impl.BbsRegisterMark;
import com.fr.design.locale.impl.BbsResetMark; import com.fr.design.locale.impl.BbsResetMark;
import com.fr.design.locale.impl.BbsSpaceMark; import com.fr.design.locale.impl.BbsSpaceMark;
import com.fr.design.login.utils.DesignerLoginUtils;
import com.fr.design.upm.event.DownloadEvent; import com.fr.design.upm.event.DownloadEvent;
import com.fr.design.upm.exec.UpmBrowserExecutor; import com.fr.design.upm.exec.UpmBrowserExecutor;
import com.fr.design.upm.task.UpmTaskWorker; import com.fr.design.upm.task.UpmTaskWorker;
import com.fr.design.utils.BrowseUtils;
import com.fr.event.EventDispatcher; import com.fr.event.EventDispatcher;
import com.fr.general.GeneralUtils; import com.fr.general.GeneralUtils;
import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.LocaleCenter;
@ -424,7 +426,8 @@ public class UpmBridge {
public void getPriviteMessage() { public void getPriviteMessage() {
try { try {
LocaleMark<String> spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); LocaleMark<String> spaceMark = LocaleCenter.getMark(BbsSpaceMark.class);
Desktop.getDesktop().browse(new URI(spaceMark.getValue())); String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(spaceMark.getValue());
BrowseUtils.browser(ssoUrl);
} catch (Exception exp) { } catch (Exception exp) {
FineLoggerFactory.getLogger().info(exp.getMessage()); FineLoggerFactory.getLogger().info(exp.getMessage());
} }

57
designer-base/src/main/java/com/fr/design/VersionCheckUtils.java → designer-base/src/main/java/com/fr/design/versioncheck/VersionCheckUtils.java

@ -1,12 +1,15 @@
package com.fr.design; package com.fr.design.versioncheck;
import com.fr.base.FRContext; import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager;
import com.fr.design.dialog.NotificationDialog;
import com.fr.design.dialog.NotificationDialogAction;
import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.RemoteWorkspace; import com.fr.design.env.RemoteWorkspace;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.env.VersionCheckMessageDialog; import com.fr.env.CheckServiceDialog;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralUtils; import com.fr.general.GeneralUtils;
import com.fr.invoke.Reflect; import com.fr.invoke.Reflect;
@ -18,9 +21,11 @@ import com.fr.plugin.context.PluginContext;
import com.fr.plugin.context.PluginMarker; import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.manage.PluginManager; import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginControllerHelper; import com.fr.plugin.manage.control.PluginControllerHelper;
import com.fr.plugin.manage.control.PluginExtraInfo;
import com.fr.plugin.manage.control.PluginTaskCallback; import com.fr.plugin.manage.control.PluginTaskCallback;
import com.fr.plugin.manage.control.PluginTaskResult; import com.fr.plugin.manage.control.PluginTaskResult;
import com.fr.plugin.manage.control.ProgressCallback; import com.fr.plugin.manage.control.ProgressCallback;
import com.fr.report.ReportHelper;
import com.fr.rpc.Result; import com.fr.rpc.Result;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContext;
@ -66,8 +71,20 @@ public class VersionCheckUtils {
public static void showVersionCheckDialog(String envName) { public static void showVersionCheckDialog(String envName) {
if (!VersionCheckUtils.versionCheck(envName)) { if (!VersionCheckUtils.versionCheck(envName)) {
VersionCheckMessageDialog versionCheckMessageDialog = new VersionCheckMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Sync_Check_Brief_Info"), envName); NotificationDialog notificationDialog = new NotificationDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Sync_Prompt"),
versionCheckMessageDialog.setVisible(true); false, NotificationDialog.WARNING_MESSAGE, Toolkit.i18nText("Fine-Design_Basic_Sync_Check_Brief_Info"), new NotificationDialogAction() {
@Override
public String name() {
return "VERSION_CHECK";
}
@Override
public void doClick() {
CheckServiceDialog checkServiceDialog = new CheckServiceDialog(DesignerContext.getDesignerFrame(), GeneralUtils.readFullBuildNO(), getRemoteBranch(envName),getNoExistServiceDescription(envName));
checkServiceDialog.setVisible(true);
}
});
notificationDialog.setVisible(true);
} }
} }
@ -200,10 +217,7 @@ public class VersionCheckUtils {
} }
private static boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv) { private static boolean needCheckBranch(DesignerWorkspaceInfo selectedEnv) {
if (selectedEnv.getType() == DesignerWorkspaceType.Remote) { return selectedEnv.getType() == DesignerWorkspaceType.Remote;
return true;
}
return false;
} }
public static JSONArray checkLocalAndRemotePlugin() { public static JSONArray checkLocalAndRemotePlugin() {
@ -215,21 +229,27 @@ public class VersionCheckUtils {
localPluginsMap.put(pluginContext.getID(), pluginContext); localPluginsMap.put(pluginContext.getID(), pluginContext);
} }
JSONObject remotePlugin; JSONObject remotePlugin;
Map<String, String> pluginsNameMap = ReportHelper.getPluginNameMap();
for (int i = 0; i < remotePlugins.size(); i++) { for (int i = 0; i < remotePlugins.size(); i++) {
remotePlugin = remotePlugins.getJSONObject(i); remotePlugin = remotePlugins.getJSONObject(i);
if (localPluginsMap.containsKey(remotePlugin.getString(ID))) { if (ComparatorUtils.equals(remotePlugin.getString("running"), "false")) {
if (ComparatorUtils.equals(localPluginsMap.get(remotePlugin.getString(ID)).getVersion(), remotePlugin.getString(VERSION))) { continue;
}
String remotePluginID = remotePlugin.getString(ID);
if (localPluginsMap.containsKey(remotePluginID)) {
if (ComparatorUtils.equals(localPluginsMap.get(remotePluginID).getVersion(), remotePlugin.getString(VERSION))) {
continue; continue;
} else { } else {
if (remotePlugin.getString(NAME) == null) { if (remotePlugin.getString(NAME) == null) {
remotePlugin.put(NAME, localPluginsMap.get(remotePlugin.getString(ID)).getName()); remotePlugin.put(NAME, localPluginsMap.get(remotePluginID).getName());
} }
remotePlugin.put("type", INCONSISTENCY); remotePlugin.put("type", INCONSISTENCY);
} }
} } else {
remotePlugin.put("type", MISSING); remotePlugin.put("type", MISSING);
if (remotePlugin.getString(NAME) == null) { if (remotePlugin.getString(NAME) == null) {
remotePlugin.put(NAME, remotePlugin.getString("id")); remotePlugin.put(NAME, pluginsNameMap.getOrDefault(remotePluginID, remotePluginID));
}
} }
differentPlugins.put(remotePlugin); differentPlugins.put(remotePlugin);
} }
@ -296,7 +316,7 @@ public class VersionCheckUtils {
return uninstallFailedID; return uninstallFailedID;
} }
private static JSONArray getPluginsSyncFailed(JSONArray differentPlugins){ private static JSONArray getPluginsSyncFailed(JSONArray differentPlugins) {
JSONArray pluginsNeedSync = JSONArray.create(); JSONArray pluginsNeedSync = JSONArray.create();
List<PluginContext> localPlugins = PluginManager.getContexts(); List<PluginContext> localPlugins = PluginManager.getContexts();
Map<String, String> localPluginsInfo = new HashMap<>(); Map<String, String> localPluginsInfo = new HashMap<>();
@ -326,8 +346,11 @@ public class VersionCheckUtils {
@Override @Override
public void done(PluginTaskResult result) { public void done(PluginTaskResult result) {
latch.countDown(); latch.countDown();
if(result.isSuccess()) {
FineLoggerFactory.getLogger().info("installPlugin: " + result.getCurrentTask().getMarker().getPluginID());
}
} }
}); }, PluginExtraInfo.newBuilder().username(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()).build());
} }
try { try {
latch.await(); latch.await();

125
designer-base/src/main/java/com/fr/env/CheckServiceDialog.java vendored

@ -1,10 +1,7 @@
package com.fr.env; package com.fr.env;
import com.fr.decision.update.data.UpdateConstants; import com.fr.decision.update.data.UpdateConstants;
import com.fr.decision.update.info.UpdateCallBack;
import com.fr.decision.update.info.UpdateProgressCallBack;
import com.fr.design.RestartHelper; import com.fr.design.RestartHelper;
import com.fr.design.VersionCheckUtils;
import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
@ -15,6 +12,7 @@ import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.update.actions.SyncFileProcess; import com.fr.design.update.actions.SyncFileProcess;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.general.CloudCenter; import com.fr.general.CloudCenter;
import com.fr.general.CloudCenterConfig; import com.fr.general.CloudCenterConfig;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
@ -40,7 +38,6 @@ import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JDialog; import javax.swing.JDialog;
@ -155,7 +152,7 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
detailsComponents = new Component[][]{{jarCheckTitleLabel}, {jarCheckResultLabel}, {affectedFunctionsLabel}, {affectedFunctionsDetailsPane}, {pluginCheckTitleLabel}, {pluginsCheckResultPanel}}; detailsComponents = new Component[][]{{jarCheckTitleLabel}, {jarCheckResultLabel}, {affectedFunctionsLabel}, {affectedFunctionsDetailsPane}, {pluginCheckTitleLabel}, {pluginsCheckResultPanel}};
hideAffectedFunctionsComponents = new Component[][]{{jarCheckTitleLabel}, {jarCheckResultLabel}, {affectedFunctionsLabel}, {pluginCheckTitleLabel}, {pluginsCheckResultPanel}}; hideAffectedFunctionsComponents = new Component[][]{{jarCheckTitleLabel}, {jarCheckResultLabel}, {affectedFunctionsLabel}, {pluginCheckTitleLabel}, {pluginsCheckResultPanel}};
if (noExistServiceDescription.size() > 0 && !ComparatorUtils.equals(remoteBranch, localBranch)) { if (noExistServiceDescription.size() > 0 && !ComparatorUtils.equals(remoteBranch, localBranch)) {
detailsRowSize = new double[]{p, p, p, p,p,p}; detailsRowSize = new double[]{p, p, p, p, p, p};
detailsInnerPane = TableLayoutHelper.createTableLayoutPane(detailsComponents, detailsRowSize, detailsColumnSize); detailsInnerPane = TableLayoutHelper.createTableLayoutPane(detailsComponents, detailsRowSize, detailsColumnSize);
} else { } else {
detailsRowSize = new double[]{p, p, 0, 0, p, p}; detailsRowSize = new double[]{p, p, 0, 0, p, p};
@ -170,7 +167,8 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
centerPanel.add(detailsPane, BorderLayout.CENTER); centerPanel.add(detailsPane, BorderLayout.CENTER);
JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_M_Pane(); JPanel buttonPanel = FRGUIPaneFactory.createBorderLayout_M_Pane();
buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); buttonPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
if (isOnline()) { boolean Sync = false;
if (Sync && isOnline()) {
ignoreButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Sync_Ignore")); ignoreButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Sync_Ignore"));
ignoreButton.addActionListener(this); ignoreButton.addActionListener(this);
syncButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Sync_To_Local")); syncButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Sync_To_Local"));
@ -186,8 +184,6 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
buttonPanel.add(progressBar, BorderLayout.CENTER); buttonPanel.add(progressBar, BorderLayout.CENTER);
buttonPanel.add(syncButton, BorderLayout.EAST); buttonPanel.add(syncButton, BorderLayout.EAST);
} else { } else {
UILabel adviceLabel = new UILabel(Toolkit.i18nText("Fine-Design_Basic_Sync_Suggestion"));
centerPanel.add(adviceLabel, BorderLayout.SOUTH);
UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Button_Confirm")); UIButton okButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Button_Confirm"));
okButton.addActionListener(this); okButton.addActionListener(this);
buttonPanel.add(okButton, BorderLayout.EAST); buttonPanel.add(okButton, BorderLayout.EAST);
@ -311,51 +307,30 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
private MouseListener syncButtonClickListener = new MouseAdapter() { private MouseListener syncButtonClickListener = new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
ignoreButton.setEnabled(false);
String[] option = {Toolkit.i18nText("Fine-Design_Report_Yes"), Toolkit.i18nText("Fine-Design_Report_No")}; String[] option = {Toolkit.i18nText("Fine-Design_Report_Yes"), Toolkit.i18nText("Fine-Design_Report_No")};
int a = FineJOptionPane.showOptionDialog(getParent(), Toolkit.i18nText("Fine-Design_Basic_Sync_Info_Information"), if (!jarConsistency) {
Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION, QUESTION_MESSAGE, IOUtils.readIcon("com/fr/design/icon/versioncheck/question.png"), option, 1); int a = FineJOptionPane.showOptionDialog(getParent(), Toolkit.i18nText("Fine-Design_Basic_Sync_Info_Information"),
if (0 == a) { Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.YES_NO_OPTION, QUESTION_MESSAGE, IOUtils.readIcon("com/fr/design/icon/versioncheck/question.png"), option, 1);
//jar包一致的话只更新插件 if (0 == a) {
UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); progressBar.setVisible(true);
progressBar.setVisible(true); progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message"));
progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); syncButton.setEnabled(false);
syncButton.setEnabled(false);
if (!jarConsistency) {
deletePreviousPropertyFile(); deletePreviousPropertyFile();
final String installLib = StableUtils.pathJoin(StableUtils.getInstallHome(), ProjectConstants.LOGS_NAME, UpdateConstants.INSTALL_LIB); final String installLib = StableUtils.pathJoin(StableUtils.getInstallHome(), ProjectConstants.LOGS_NAME, UpdateConstants.INSTALL_LIB);
final JFrame frame = DesignerContext.getDesignerFrame(); final JFrame frame = DesignerContext.getDesignerFrame();
final RestartHelper helper = new RestartHelper(); final RestartHelper helper = new RestartHelper();
FineProcessContext.getParentPipe().fire(FineProcessEngineEvent.DESTROY); FineProcessContext.getParentPipe().fire(FineProcessEngineEvent.DESTROY);
new SyncFileProcess(callBack, remoteBuildNo) { SyncFailedPluginsDialog syncFailedPluginsDialog = new SyncFailedPluginsDialog(frame, JSONArray.create());
new SyncFileProcess(progressBar, remoteBuildNo, syncFailedPluginsDialog) {
@Override @Override
public void onDownloadSuccess() { public void onDownloadSuccess() {
deleteForDesignerUpdate(installLib); deleteForDesignerUpdate(installLib);
//主jar下载成功之后再卸载安装插件 progressBar.setVisible(false);
progressBar.setString(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugins")); syncFailedPluginsDialog.showDialog();
progressBar.setValue(0); if (!syncFailedPluginsDialog.restartClicked()) {
new SwingWorker<JSONArray, Void>() { helper.restartForUpdate(frame);
}
@Override
protected JSONArray doInBackground() {
return VersionCheckUtils.syncPlugins(differentPlugins);
}
@Override
protected void done() {
progressBar.setVisible(false);
JSONArray syncFailedPlugins = null;
try {
syncFailedPlugins = get();
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
}
if (syncFailedPlugins != null && syncFailedPlugins.size() > 0) {
SyncFailedPluginsDialog syncFailedPluginsDialog = new SyncFailedPluginsDialog(DesignerContext.getDesignerFrame(), syncFailedPlugins);
syncFailedPluginsDialog.setVisible(true);
}
helper.restartForUpdate(frame);
}
}.execute();
} }
@Override @Override
@ -367,39 +342,39 @@ public class CheckServiceDialog extends JDialog implements ActionListener {
helper.restartForUpdate(frame); helper.restartForUpdate(frame);
} }
}.execute(); }.execute();
} else { }
//到这边说明主jar是一致的,就只尝试同步插件 } else {
progressBar.setString(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugins")); //到这边说明主jar是一致的,就只尝试同步插件
progressBar.setValue(0); new SwingWorker<JSONArray, Void>() {
new SwingWorker<JSONArray, Void>() {
@Override
@Override protected JSONArray doInBackground() {
protected JSONArray doInBackground() { progressBar.setString(Toolkit.i18nText("Fine-Design_Basic_Sync_Plugins"));
return VersionCheckUtils.syncPlugins(differentPlugins); progressBar.setValue(0);
return VersionCheckUtils.syncPlugins(differentPlugins);
}
@Override
protected void done() {
progressBar.setVisible(false);
JSONArray syncFailedPlugins = null;
try {
syncFailedPlugins = get();
} catch (Exception ex) {
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
} }
if (syncFailedPlugins != null && syncFailedPlugins.size() > 0) {
@Override SyncFailedPluginsDialog syncFailedPluginsDialog = new SyncFailedPluginsDialog(DesignerContext.getDesignerFrame(), syncFailedPlugins);
protected void done() { syncFailedPluginsDialog.setVisible(true);
progressBar.setVisible(false); } else {
JSONArray syncFailedPlugins = null; FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
try { Toolkit.i18nText("Fine-Design_Basic_Sync_Success"),
syncFailedPlugins = get(); Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
} catch (Exception ex) { FineJOptionPane.INFORMATION_MESSAGE);
FineLoggerFactory.getLogger().error(ex.getMessage(), ex);
}
if (syncFailedPlugins != null && syncFailedPlugins.size() > 0) {
SyncFailedPluginsDialog syncFailedPluginsDialog = new SyncFailedPluginsDialog(DesignerContext.getDesignerFrame(), syncFailedPlugins);
syncFailedPluginsDialog.setVisible(true);
} else {
FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(),
Toolkit.i18nText("Fine-Design_Basic_Sync_Success"),
Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"),
FineJOptionPane.INFORMATION_MESSAGE);
}
close();
} }
}.execute(); close();
} }
}.execute();
} }
} }
}; };

55
designer-base/src/main/java/com/fr/env/SyncFailedPluginsDialog.java vendored

@ -10,6 +10,7 @@ import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.CloudCenter; import com.fr.general.CloudCenter;
import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext; import com.fr.general.GeneralContext;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.json.JSONArray; import com.fr.json.JSONArray;
@ -17,7 +18,6 @@ import com.fr.json.JSONObject;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.event.MouseListener; import java.awt.event.MouseListener;
@ -25,6 +25,7 @@ import java.util.Locale;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
@ -38,7 +39,12 @@ import javax.swing.UIManager;
public class SyncFailedPluginsDialog extends JDialog { public class SyncFailedPluginsDialog extends JDialog {
private UILabel detailsLabel; private UILabel detailsLabel;
private JScrollPane scrollPane; private JScrollPane scrollPane;
public SyncFailedPluginsDialog(Frame parent, JSONArray syncFailedPlugins) { private UITextArea detailsTextArea;
private JFrame frame = DesignerContext.getDesignerFrame();
private RestartHelper restartHelper = new RestartHelper();
private UIButton restartButton;
private boolean show = false;
public SyncFailedPluginsDialog(JFrame parent, JSONArray syncFailedPlugins) {
super(parent, true); super(parent, true);
JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane(); JPanel body = FRGUIPaneFactory.createBorderLayout_L_Pane();
@ -70,19 +76,15 @@ public class SyncFailedPluginsDialog extends JDialog {
detailsTitlePanel.add(detailsLabel); detailsTitlePanel.add(detailsLabel);
detailsTitlePanel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0)); detailsTitlePanel.setBorder(BorderFactory.createEmptyBorder(0,0,5,0));
UITextArea detailsTextArea = new UITextArea(); detailsTextArea = new UITextArea();
StringBuilder detailsText = new StringBuilder(StringUtils.EMPTY); detailsTextArea.setEditable(false);
for (int i = 0; i < syncFailedPlugins.size(); i++) { showSyncFailedPluginsInfo(syncFailedPlugins);
JSONObject plugin = syncFailedPlugins.getJSONObject(i);
detailsText.append(plugin.getString("name")).append(",").append(Toolkit.i18nText("Fine-Design_Basic_Sync_Server_Version")).append(plugin.getString("version")).append("\n");
}
detailsTextArea.setText(detailsText.toString());
scrollPane = new JScrollPane(detailsTextArea); scrollPane = new JScrollPane(detailsTextArea);
centerPanel.add(detailsTitlePanel,BorderLayout.NORTH); centerPanel.add(detailsTitlePanel,BorderLayout.NORTH);
centerPanel.add(scrollPane,BorderLayout.CENTER); centerPanel.add(scrollPane,BorderLayout.CENTER);
JPanel southPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); JPanel southPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane();
UIButton restartButton = new UIButton(Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); restartButton = new UIButton(Toolkit.i18nText("Fine-Design_Updater_Restart_Designer"));
restartButton.addMouseListener(restartButtonClickListener); restartButton.addMouseListener(restartButtonClickListener);
southPane.add(restartButton); southPane.add(restartButton);
@ -97,6 +99,27 @@ public class SyncFailedPluginsDialog extends JDialog {
GUICoreUtils.centerWindow(this); GUICoreUtils.centerWindow(this);
} }
public void showSyncFailedPluginsInfo(JSONArray syncFailedPlugins){
if(null == syncFailedPlugins){
return;
}
StringBuilder detailsText = new StringBuilder(StringUtils.EMPTY);
for (int i = 0; i < syncFailedPlugins.size(); i++) {
JSONObject plugin = syncFailedPlugins.getJSONObject(i);
detailsText.append(plugin.getString("name")).append(",").append(Toolkit.i18nText("Fine-Design_Basic_Sync_Server_Version")).append(plugin.getString("version")).append("\n");
}
detailsTextArea.setText(detailsText.toString());
if(!ComparatorUtils.equals(detailsTextArea.getText(),StringUtils.EMPTY)){
show = true;
}
}
public void showDialog(){
if(show){
this.setVisible(true);
}
}
private MouseListener detailsLabelClickListener = new MouseAdapter() { private MouseListener detailsLabelClickListener = new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
@ -110,10 +133,20 @@ public class SyncFailedPluginsDialog extends JDialog {
} }
}; };
public boolean restartClicked(){
return !restartButton.isEnabled();
}
private void hideDialog(){
this.dispose();
}
private MouseListener restartButtonClickListener = new MouseAdapter() { private MouseListener restartButtonClickListener = new MouseAdapter() {
@Override @Override
public void mouseClicked(MouseEvent e) { public void mouseClicked(MouseEvent e) {
RestartHelper.restartForUpdate(DesignerContext.getDesignerFrame()); hideDialog();
restartButton.setEnabled(false);
restartHelper.restartForUpdate(frame);
} }
}; };
} }

2
designer-base/src/main/java/com/fr/env/VersionCheckMessageDialog.java vendored

@ -1,6 +1,6 @@
package com.fr.env; package com.fr.env;
import com.fr.design.VersionCheckUtils; import com.fr.design.versioncheck.VersionCheckUtils;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;

BIN
designer-base/src/main/resources/com/fr/design/images/dashboard/guide.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 704 B

After

Width:  |  Height:  |  Size: 308 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/lookandfeel/circularErrorIcon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

BIN
designer-base/src/main/resources/com/fr/design/images/lookandfeel/circularWarningIcon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

BIN
designer-base/src/main/resources/com/fr/design/images/lookandfeel/deleteIcon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

BIN
designer-base/src/main/resources/com/fr/design/images/lookandfeel/newMessageIcon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

11
designer-base/src/main/resources/com/fr/design/login/guide.css

@ -4,9 +4,14 @@
font-size: 14px; font-size: 14px;
} }
.background-guide-close { .background-guide-close {
color: black !important; background: url(./img/icon_install_normal.png) no-repeat center center;
font-weight: bold; background-size: cover;
font-size: 16px; width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
} }
.background-login-loading { .background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center; background: url(./img/login_loading.gif) no-repeat center center;

13
designer-base/src/main/resources/com/fr/design/login/guide.html

@ -14,12 +14,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="lib/bundle.css"/> <link rel="stylesheet" type="text/css" href="lib/bundle.css"/>
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_zh_CN.js?_=compatible"></script> <script type="text/javascript" charset="UTF-8" src="lib/locale/login_zh_CN.js?_=compatible"></script>
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script><script type="text/javascript"></script> <script type="text/javascript" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script>
<style>
body {
overflow-y: auto;
}
</style>
<link href="guide.css" rel="stylesheet"></head> <link href="guide.css" rel="stylesheet"></head>
</html> </html>
<script type="text/javascript">
if (!/macintosh|mac os x/i.test(navigator.userAgent.toLowerCase())) {
document.body.style.zoom = 1 / window.devicePixelRatio;
document.body.style.overflow = 'hidden';
}
</script>
<script type="text/javascript" src="guide.js"></script> <script type="text/javascript" src="guide.js"></script>

2
designer-base/src/main/resources/com/fr/design/login/guide.js

File diff suppressed because one or more lines are too long

BIN
designer-base/src/main/resources/com/fr/design/login/img/icon_close_normal.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

BIN
designer-base/src/main/resources/com/fr/design/login/img/icon_install_normal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

54
designer-base/src/main/resources/com/fr/design/login/lib/locale/login_en_US.js

@ -1,5 +1,59 @@
var Store = { var Store = {
i18n : { i18n : {
'Designer-Login_User_Name': 'Username/Email/Phone number',
'Designer-Login_User_Name_Hint': 'Please enter username/email/phone number',
'Designer-Login_Password': 'Password',
'Designer-Login_Password_Hint': 'Please enter the password',
'Designer-Login': 'Login',
'Designer-Login_Title': 'FanRuan Passport Login',
'Designer-Login_I_Have_Read': 'I have read',
'Designer-Login_Service_Terms': 'Terms of Service',
'Designer-Login_Forget_Password': 'Forgot your password?',
'Designer-Login_Sms': 'SMS login',
'Designer-Login_Normal': 'Password login',
'Designer-Login_Phone': 'Phone number',
'Designer-Login_Phone_Hint': 'Please enter your phone number',
'Designer-Login_Code': 'Captcha',
'Designer-Login_Code_Hint': 'Please enter the captcha',
'Designer-Login_Code_Request': 'Get captcha',
'Designer-Login_Code_Request_Again': 'Re-acquire',
'Designer-Login_Register_Or_Login': 'Register/Login',
'Designer-Basic_Chinese_Mainland': 'Mainland China',
'Designer-Basic_Chinese_Hong_Kong': 'Hong Kong',
'Designer-Basic_Chinese_Macao': 'Macao',
'Designer-Basic_Chinese_Taiwan': 'Taiwan',
'Designer-Basic_Turkey': 'Turkey',
'Designer-Basic_South_Korea': 'South Korea',
'Designer-Basic_Japan': 'Japan',
'Designer-Basic_Singapore': 'Singapore',
'Designer-Basic_Malaysia': 'Malaysia',
'Designer-Login_Username_Not_Null': 'Username cannot be empty',
'Designer-Login_Password_Not_Null': 'Password cannot be empty',
'Designer-Login_Username_Or_Password_Incorrect': 'The username or password is incorrect, please check',
'Designer-Login_Phone_Not_Null': 'The phone number format is illegal',
'Designer-Login_Code_Not_Null': 'The captcha cannot be empty',
'Designer-Login_Code_Incorrect': 'The captcha has expired, please get it again',
'Designer-Login_Password_Setting_Hint': 'Enter the login password (6-16 digits password can be entered)',
'Designer-Login_Store_User_Not_Exist': 'The username does not exist',
'Designer-Login_Store_User_Password_Error': 'Username or password is incorrect',
'Designer-Login_Token_Request_Failed': 'Failed to get registration token',
'Designer-Login_Unexpected_Error': 'Unexpected error',
'Designer-Login_Internal_Error': 'Server internal error',
'Designer-Guide_Do_Not_Remind': 'No reminders within one month',
'Designer-Guide_Login': 'Login now',
'Designer-BBS_Register_Timeout': 'Register timeout, please resend the captcha',
'Designer-BBS_Phone_Is_Register': 'The phone number is already registered',
'Designer-BBS_Captcha_Send_Exceed_Limit': 'The captcha can only be sent once every 60s',
'Designer-BBS_Phone_Format_Error': 'Failed to send, the phone number format is incorrect',
'Designer-BBS_Captcha_Out_Of_Date': 'The captcha has expired, please get it again',
'Designer-BBS_Captcha_Try_Exceed_Limit': 'The number of attempts of the captcha has reached the upper limit, please get it again',
'Designer-BBS_Captcha_Error': 'Captcha error',
'Designer-BBS_Username_Format_Error': 'The nickname only supports Chinese, English and numbers',
'Designer-BBS_Username_Too_Short': 'The length of the nickname is too short',
'Designer-BBS_Username_Too_Long': 'The length of this nickname has reached the upper limit',
'Designer-BBS_Username_Is_Register': 'The user has been registered',
'Designer-BBS_Please_Enter_Correct_Phone': 'Please enter the correct phone number',
'Designer-Login_Network_Connected_Failed': 'Network connection failed',
}} }}
window.Store = Store; window.Store = Store;

54
designer-base/src/main/resources/com/fr/design/login/lib/locale/login_ja_JP.js

@ -1,5 +1,59 @@
var Store = { var Store = {
i18n : { i18n : {
'Designer-Login_User_Name': 'ユーザ名/メールアドレス/携帯番号',
'Designer-Login_User_Name_Hint': 'ユーザ名/メールアドレス/携帯番号を入力してください。',
'Designer-Login_Password': 'パスワード',
'Designer-Login_Password_Hint': 'パスワードを入力してください。',
'Designer-Login': 'ログイン',
'Designer-Login_Title': 'FanRuanアカウントでログイン',
'Designer-Login_I_Have_Read': '承認する',
'Designer-Login_Service_Terms': '利用規約',
'Designer-Login_Forget_Password': 'パスワードをお忘れですか',
'Designer-Login_Sms': '認証コードログイン',
'Designer-Login_Normal': 'パスワードでログイン',
'Designer-Login_Phone': '携帯番号',
'Designer-Login_Phone_Hint': '携帯番号を入力してください。',
'Designer-Login_Code': '認証コード',
'Designer-Login_Code_Hint': '認証コードを入力してください。',
'Designer-Login_Code_Request': '認証コードを取得',
'Designer-Login_Code_Request_Again': '再取得',
'Designer-Login_Register_Or_Login': '登録/ログイン',
'Designer-Basic_Chinese_Mainland': '中国大陸',
'Designer-Basic_Chinese_Hong_Kong': '中国香港',
'Designer-Basic_Chinese_Macao': '中国澳門',
'Designer-Basic_Chinese_Taiwan': '中国台湾',
'Designer-Basic_Turkey': 'トルコ共和国',
'Designer-Basic_South_Korea': '韓国',
'Designer-Basic_Japan': '日本',
'Designer-Basic_Singapore': 'シンガポール',
'Designer-Basic_Malaysia': 'マレーシア',
'Designer-Login_Username_Not_Null': 'ユーザ名は空白不可。',
'Designer-Login_Password_Not_Null': 'パスワードは空白不可。',
'Designer-Login_Username_Or_Password_Incorrect': 'ユーザ名又はパスワードが間違っています。ご確認ください。',
'Designer-Login_Phone_Not_Null': '携帯番号の形式が正しくない。',
'Designer-Login_Code_Not_Null': '認証コードは空白不可。',
'Designer-Login_Code_Incorrect': '認証コードが無効になりました。再取得してください。',
'Designer-Login_Password_Setting_Hint': 'パスワードを入力してください。(6‐16桁入力可能)',
'Designer-Login_Store_User_Not_Exist': 'ユーザ名は存在しません',
'Designer-Login_Store_User_Password_Error': 'ユーザ名又はパスワードが間違っています。',
'Designer-Login_Token_Request_Failed': '登録Token取得に失敗',
'Designer-Login_Unexpected_Error': '未知のエラー',
'Designer-Login_Internal_Error': 'サーバ内部エラー',
'Designer-Guide_Do_Not_Remind': '一か月内アラートしません。',
'Designer-Guide_Login': 'ログイン',
'Designer-BBS_Register_Timeout': '登録Timeout、検証コードをもう一度取得してください。',
'Designer-BBS_Phone_Is_Register': 'この携帯は既に登録されています。',
'Designer-BBS_Captcha_Send_Exceed_Limit': '認証コードは60s内に一回しか送信できません。',
'Designer-BBS_Phone_Format_Error': '携帯番号の形式が間違っています、検証コード送信失敗。',
'Designer-BBS_Captcha_Out_Of_Date': '認証コードが無効になりました。再取得してください。',
'Designer-BBS_Captcha_Try_Exceed_Limit': '認証コードの試行回数が上限に達しています。再取得してください。',
'Designer-BBS_Captcha_Error': '認証コードが間違っています。',
'Designer-BBS_Username_Format_Error': 'ユーザ名は漢字、アルバイトと数字しかサポートできません。',
'Designer-BBS_Username_Too_Short': 'ユーザ名が短すぎます。',
'Designer-BBS_Username_Too_Long': 'ユーザ名が長すぎます。',
'Designer-BBS_Username_Is_Register': 'このユーザは登録済みです。',
'Designer-BBS_Please_Enter_Correct_Phone': '正確な携帯番号を入力してください。',
'Designer-Login_Network_Connected_Failed': 'インターネット接続失敗',
}} }}
window.Store = Store; window.Store = Store;

54
designer-base/src/main/resources/com/fr/design/login/lib/locale/login_ko_KR.js

@ -1,5 +1,59 @@
var Store = { var Store = {
i18n : { i18n : {
'Designer-Login_User_Name': 'Username/Email/Phone number',
'Designer-Login_User_Name_Hint': 'Please enter username/email/phone number',
'Designer-Login_Password': 'Password',
'Designer-Login_Password_Hint': 'Please enter the password',
'Designer-Login': 'Login',
'Designer-Login_Title': 'FanRuan Passport Login',
'Designer-Login_I_Have_Read': 'I have read',
'Designer-Login_Service_Terms': 'Terms of Service',
'Designer-Login_Forget_Password': 'Forgot your password?',
'Designer-Login_Sms': 'SMS login',
'Designer-Login_Normal': 'Password login',
'Designer-Login_Phone': 'Phone number',
'Designer-Login_Phone_Hint': 'Please enter your phone number',
'Designer-Login_Code': 'Captcha',
'Designer-Login_Code_Hint': 'Please enter the captcha',
'Designer-Login_Code_Request': 'Get captcha',
'Designer-Login_Code_Request_Again': 'Re-acquire',
'Designer-Login_Register_Or_Login': 'Register/Login',
'Designer-Basic_Chinese_Mainland': 'Mainland China',
'Designer-Basic_Chinese_Hong_Kong': 'Hong Kong',
'Designer-Basic_Chinese_Macao': 'Macao',
'Designer-Basic_Chinese_Taiwan': 'Taiwan',
'Designer-Basic_Turkey': 'Turkey',
'Designer-Basic_South_Korea': 'South Korea',
'Designer-Basic_Japan': 'Japan',
'Designer-Basic_Singapore': 'Singapore',
'Designer-Basic_Malaysia': 'Malaysia',
'Designer-Login_Username_Not_Null': 'Username cannot be empty',
'Designer-Login_Password_Not_Null': 'Password cannot be empty',
'Designer-Login_Username_Or_Password_Incorrect': 'The username or password is incorrect, please check',
'Designer-Login_Phone_Not_Null': 'The phone number format is illegal',
'Designer-Login_Code_Not_Null': 'The captcha cannot be empty',
'Designer-Login_Code_Incorrect': 'The captcha has expired, please get it again',
'Designer-Login_Password_Setting_Hint': 'Enter the login password (6-16 digits password can be entered)',
'Designer-Login_Store_User_Not_Exist': 'The username does not exist',
'Designer-Login_Store_User_Password_Error': 'Username or password is incorrect',
'Designer-Login_Token_Request_Failed': 'Failed to get registration token',
'Designer-Login_Unexpected_Error': 'Unexpected error',
'Designer-Login_Internal_Error': 'Server internal error',
'Designer-Guide_Do_Not_Remind': 'No reminders within one month',
'Designer-Guide_Login': 'Login now',
'Designer-BBS_Register_Timeout': 'Register timeout, please resend the captcha',
'Designer-BBS_Phone_Is_Register': 'The phone number is already registered',
'Designer-BBS_Captcha_Send_Exceed_Limit': 'The captcha can only be sent once every 60s',
'Designer-BBS_Phone_Format_Error': 'Failed to send, the phone number format is incorrect',
'Designer-BBS_Captcha_Out_Of_Date': 'The captcha has expired, please get it again',
'Designer-BBS_Captcha_Try_Exceed_Limit': 'The number of attempts of the captcha has reached the upper limit, please get it again',
'Designer-BBS_Captcha_Error': 'Captcha error',
'Designer-BBS_Username_Format_Error': 'The nickname only supports Chinese, English and numbers',
'Designer-BBS_Username_Too_Short': 'The length of the nickname is too short',
'Designer-BBS_Username_Too_Long': 'The length of this nickname has reached the upper limit',
'Designer-BBS_Username_Is_Register': 'The user has been registered',
'Designer-BBS_Please_Enter_Correct_Phone': 'Please enter the correct phone number',
'Designer-Login_Network_Connected_Failed': 'Network connection failed',
}} }}
window.Store = Store; window.Store = Store;

54
designer-base/src/main/resources/com/fr/design/login/lib/locale/login_zh_TW.js

@ -1,5 +1,59 @@
var Store = { var Store = {
i18n : { i18n : {
'Designer-Login_User_Name': '帳號/郵箱/手機號',
'Designer-Login_User_Name_Hint': '請輸入帳號/郵箱/手機號',
'Designer-Login_Password': '密碼',
'Designer-Login_Password_Hint': '請輸入密碼',
'Designer-Login': '登入',
'Designer-Login_Title': '帆軟通行證登入',
'Designer-Login_I_Have_Read': '我已閱讀',
'Designer-Login_Service_Terms': '服務條款',
'Designer-Login_Forget_Password': '忘記密碼?',
'Designer-Login_Sms': '驗證碼登入',
'Designer-Login_Normal': '密碼登入',
'Designer-Login_Phone': '手機號碼',
'Designer-Login_Phone_Hint': '請輸入手機號碼',
'Designer-Login_Code': '驗證碼',
'Designer-Login_Code_Hint': '請輸入驗證碼',
'Designer-Login_Code_Request': '獲取驗證碼',
'Designer-Login_Code_Request_Again': '重新獲取',
'Designer-Login_Register_Or_Login': '註冊/登入',
'Designer-Basic_Chinese_Mainland': '中國大陸',
'Designer-Basic_Chinese_Hong_Kong': '中國香港',
'Designer-Basic_Chinese_Macao': '中國澳門',
'Designer-Basic_Chinese_Taiwan': '中國臺灣',
'Designer-Basic_Turkey': '土耳其',
'Designer-Basic_South_Korea': '韓國',
'Designer-Basic_Japan': '日本',
'Designer-Basic_Singapore': '新加坡',
'Designer-Basic_Malaysia': '馬來西亞',
'Designer-Login_Username_Not_Null': '使用者名稱不能為空',
'Designer-Login_Password_Not_Null': '密碼不能為空',
'Designer-Login_Username_Or_Password_Incorrect': '使用者名稱或者密碼錯誤,請檢查',
'Designer-Login_Phone_Not_Null': '手機號碼格式不正確',
'Designer-Login_Code_Not_Null': '驗證碼不能為空',
'Designer-Login_Code_Incorrect': '驗證碼已過期,請重新獲取',
'Designer-Login_Password_Setting_Hint': '輸入登入密碼(可輸入6-16位密碼)',
'Designer-Login_Store_User_Not_Exist': '帳號不存在',
'Designer-Login_Store_User_Password_Error': '帳號或密碼錯誤',
'Designer-Login_Token_Request_Failed': '註冊令牌獲取失敗',
'Designer-Login_Unexpected_Error': '未知錯誤',
'Designer-Login_Internal_Error': '伺服器內部錯誤',
'Designer-Guide_Do_Not_Remind': '一個月內不再提醒',
'Designer-Guide_Login': '立即登入',
'Designer-BBS_Register_Timeout': '註冊超時,請重新發送驗證碼',
'Designer-BBS_Phone_Is_Register': '該手機號碼已註冊',
'Designer-BBS_Captcha_Send_Exceed_Limit': '驗證碼每60s只能傳送一次',
'Designer-BBS_Phone_Format_Error': '傳送失敗,手機號格式錯誤',
'Designer-BBS_Captcha_Out_Of_Date': '驗證碼已過期,請重新獲取',
'Designer-BBS_Captcha_Try_Exceed_Limit': '驗證碼嘗試次數已達上限,請重新獲取',
'Designer-BBS_Captcha_Error': '驗證碼錯誤',
'Designer-BBS_Username_Format_Error': '暱稱只支援中英文和數字',
'Designer-BBS_Username_Too_Short': '暱稱長度太短',
'Designer-BBS_Username_Too_Long': '這個暱稱長度已經達到了上限',
'Designer-BBS_Username_Is_Register': '該帳號已被註冊',
'Designer-BBS_Please_Enter_Correct_Phone': '請輸入正確的手機號',
'Designer-Login_Network_Connected_Failed': '網路連線失敗',
}} }}
window.Store = Store; window.Store = Store;

44
designer-base/src/main/resources/com/fr/design/login/login.css

@ -4,9 +4,14 @@
font-size: 14px; font-size: 14px;
} }
.background-guide-close { .background-guide-close {
color: black !important; background: url(./img/icon_install_normal.png) no-repeat center center;
font-weight: bold; background-size: cover;
font-size: 16px; width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
} }
.background-login-loading { .background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center; background: url(./img/login_loading.gif) no-repeat center center;
@ -50,9 +55,14 @@
font-size: 14px; font-size: 14px;
} }
.background-guide-close { .background-guide-close {
color: black !important; background: url(./img/icon_install_normal.png) no-repeat center center;
font-weight: bold; background-size: cover;
font-size: 16px; width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
} }
.background-login-loading { .background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center; background: url(./img/login_loading.gif) no-repeat center center;
@ -136,9 +146,14 @@
font-size: 14px; font-size: 14px;
} }
.background-guide-close { .background-guide-close {
color: black !important; background: url(./img/icon_install_normal.png) no-repeat center center;
font-weight: bold; background-size: cover;
font-size: 16px; width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
} }
.background-login-loading { .background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center; background: url(./img/login_loading.gif) no-repeat center center;
@ -186,9 +201,14 @@
font-size: 14px; font-size: 14px;
} }
.background-guide-close { .background-guide-close {
color: black !important; background: url(./img/icon_install_normal.png) no-repeat center center;
font-weight: bold; background-size: cover;
font-size: 16px; width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
} }
.background-login-loading { .background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center; background: url(./img/login_loading.gif) no-repeat center center;

13
designer-base/src/main/resources/com/fr/design/login/login.html

@ -14,12 +14,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="lib/bundle.css"/> <link rel="stylesheet" type="text/css" href="lib/bundle.css"/>
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_zh_CN.js?_=compatible"></script> <script type="text/javascript" charset="UTF-8" src="lib/locale/login_zh_CN.js?_=compatible"></script>
<script type="text/javascript" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script><script type="text/javascript"></script> <script type="text/javascript" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script>
<style>
body {
overflow-y: auto;
}
</style>
<link href="login.css" rel="stylesheet"></head> <link href="login.css" rel="stylesheet"></head>
</html> </html>
<script type="text/javascript">
if (!/macintosh|mac os x/i.test(navigator.userAgent.toLowerCase())) {
document.body.style.zoom = 1 / window.devicePixelRatio;
document.body.style.overflow = 'hidden';
}
</script>
<script type="text/javascript" src="login.js"></script> <script type="text/javascript" src="login.js"></script>

2
designer-base/src/main/resources/com/fr/design/login/login.js

File diff suppressed because one or more lines are too long

BIN
designer-base/src/main/resources/com/fr/design/notification/ui/notificationCenter.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

BIN
designer-base/src/main/resources/com/fr/design/notification/ui/notificationCenterDot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

10
designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java

@ -39,6 +39,10 @@ import com.fr.van.chart.designer.style.VanChartStylePane;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.CardLayout; import java.awt.CardLayout;
import java.awt.Component; import java.awt.Component;
@ -47,10 +51,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* 数据点提示内容界面含有通用设置富文本编辑器自定义JS界面 * 数据点提示内容界面含有通用设置富文本编辑器自定义JS界面
@ -411,10 +411,12 @@ public class VanChartTooltipContentPane extends BasicBeanPane<AttrTooltipContent
updateTooltipFormat(richTextTooltipContent, temporary); updateTooltipFormat(richTextTooltipContent, temporary);
SwingUtilities.getWindowAncestor(richEditorPane).setVisible(false); SwingUtilities.getWindowAncestor(richEditorPane).setVisible(false);
VanChartRichEditorPane.checkDispose();
} }
public void doCancel() { public void doCancel() {
SwingUtilities.getWindowAncestor(richEditorPane).setVisible(false); SwingUtilities.getWindowAncestor(richEditorPane).setVisible(false);
VanChartRichEditorPane.checkDispose();
} }
}); });

14
designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichEditorPane.java

@ -20,8 +20,10 @@ import com.fr.plugin.chart.custom.CustomDefinition;
import com.fr.plugin.chart.custom.type.CustomPlotType; import com.fr.plugin.chart.custom.type.CustomPlotType;
import com.fr.plugin.chart.type.TextAlign; import com.fr.plugin.chart.type.TextAlign;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.third.org.apache.commons.lang3.SystemUtils;
import com.fr.van.chart.designer.PlotFactory; import com.fr.van.chart.designer.PlotFactory;
import com.teamdev.jxbrowser.chromium.Browser; import com.teamdev.jxbrowser.chromium.Browser;
import com.teamdev.jxbrowser.chromium.BrowserType;
import com.teamdev.jxbrowser.chromium.JSValue; import com.teamdev.jxbrowser.chromium.JSValue;
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter;
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent;
@ -46,6 +48,8 @@ public class VanChartRichEditorPane {
private static Browser browser; private static Browser browser;
private static List<String> fieldNames; private static List<String> fieldNames;
private static final boolean USE_LIGHT_WEIGHT = SystemUtils.IS_OS_WINDOWS_10;
public static List<String> getFieldNames() { public static List<String> getFieldNames() {
return fieldNames; return fieldNames;
} }
@ -152,7 +156,8 @@ public class VanChartRichEditorPane {
} }
public static ModernUIPane<VanChartRichEditorModel> initPane(VanChartRichEditorModel model) { public static ModernUIPane<VanChartRichEditorModel> initPane(VanChartRichEditorModel model) {
return new ModernUIPane.Builder<VanChartRichEditorModel>() BrowserType type = USE_LIGHT_WEIGHT ? BrowserType.LIGHTWEIGHT : BrowserType.HEAVYWEIGHT;
return new ModernUIPane.Builder<VanChartRichEditorModel>(type)
.prepare(new ScriptContextAdapter() { .prepare(new ScriptContextAdapter() {
public void onScriptContextCreated(ScriptContextEvent event) { public void onScriptContextCreated(ScriptContextEvent event) {
browser = event.getBrowser(); browser = event.getBrowser();
@ -229,4 +234,11 @@ public class VanChartRichEditorPane {
return "!(function () { window.transformI18n && window.transformI18n('" + language + "' || 'zh_CN'); }());"; return "!(function () { window.transformI18n && window.transformI18n('" + language + "' || 'zh_CN'); }());";
} }
public static void checkDispose() {
if (USE_LIGHT_WEIGHT) {
browser.dispose();
richEditorPane = null;
}
}
} }

4
designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextDialog.java

@ -10,7 +10,7 @@ import java.awt.Frame;
public class VanChartRichTextDialog extends BasicDialog { public class VanChartRichTextDialog extends BasicDialog {
public static final Dimension DEFAULT = new Dimension(960, 800); public static final Dimension DEFAULT = new Dimension(960, 700);
public VanChartRichTextDialog(Frame parent, BasicPane pane) { public VanChartRichTextDialog(Frame parent, BasicPane pane) {
super(parent, pane); super(parent, pane);
@ -18,7 +18,7 @@ public class VanChartRichTextDialog extends BasicDialog {
this.setTitle(Toolkit.i18nText("Fine-Design_Report_RichTextEditor")); this.setTitle(Toolkit.i18nText("Fine-Design_Report_RichTextEditor"));
this.setBasicDialogSize(DEFAULT); this.setBasicDialogSize(DEFAULT);
GUICoreUtils.centerWindow(this); GUICoreUtils.centerWindow(this);
this.setResizable(false); this.setResizable(true);
this.setModal(true); this.setModal(true);
} }

2
designer-chart/src/main/java/com/fr/van/chart/designer/component/richText/VanChartRichTextPane.java

@ -20,7 +20,7 @@ public class VanChartRichTextPane extends BasicBeanPane<AttrTooltipContent> {
private static final int FIELD_PANE_H = 270; private static final int FIELD_PANE_H = 270;
private static final int RICH_EDITOR_W = 940; private static final int RICH_EDITOR_W = 940;
private static final int RICH_EDITOR_H = 460; private static final int RICH_EDITOR_H = 400;
private VanChartFieldListPane fieldListPane; private VanChartFieldListPane fieldListPane;
private VanChartFieldAttrPane fieldAttrPane; private VanChartFieldAttrPane fieldAttrPane;

8
designer-form/src/main/java/com/fr/design/designer/beans/models/ModelUtil.java

@ -32,6 +32,8 @@ abstract class ModelUtil {
//直接遍历出来目标值,然后按需处理 //直接遍历出来目标值,然后按需处理
xCreator.traversalNameRelatedXCreators(nameRelatedCreators); xCreator.traversalNameRelatedXCreators(nameRelatedCreators);
Map<String, String> renameMap = new HashMap<>(); Map<String, String> renameMap = new HashMap<>();
// 避免与旧名称重复
initDuplicated(nameRelatedCreators, duplicated);
for (XCreator target : nameRelatedCreators) { for (XCreator target : nameRelatedCreators) {
String uniqueName = uniqueName(form, target, duplicated); String uniqueName = uniqueName(form, target, duplicated);
String oldName = target.toData().getWidgetName(); String oldName = target.toData().getWidgetName();
@ -42,6 +44,12 @@ abstract class ModelUtil {
} }
EventDispatcher.fire(WidgetNameModifyEvent.INSTANCE, new ContentChangeItem(renameMap, xCreator.toData(), ChangeItem.WIDGET_NAME)); EventDispatcher.fire(WidgetNameModifyEvent.INSTANCE, new ContentChangeItem(renameMap, xCreator.toData(), ChangeItem.WIDGET_NAME));
} }
private static void initDuplicated(Set<XCreator> nameRelatedCreators, Set<String> duplicated) {
for (XCreator xCreator : nameRelatedCreators) {
duplicated.add(xCreator.toData().getWidgetName());
}
}
private static String uniqueName(Form form, XCreator xCreator, Set<String> duplicated) { private static String uniqueName(Form form, XCreator xCreator, Set<String> duplicated) {

17
designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java

@ -112,6 +112,21 @@ public class XWTitleLayout extends DedicateLayoutContainer {
return null; return null;
} }
/**
* 返回body组件
* @return body组件
*/
public XCreator getBodyCreator() {
for (int i=0; i < getXCreatorCount(); i++) {
XCreator creator = getXCreator(i);
if (creator.hasTitleStyle()) {
return creator;
}
}
return null;
}
/** /**
* 编辑状态的时候需要重新绘制下边框 * 编辑状态的时候需要重新绘制下边框
* *
@ -196,4 +211,4 @@ public class XWTitleLayout extends DedicateLayoutContainer {
super.setShareId(shareId); super.setShareId(shareId);
this.getEditingChildCreator().setShareId(shareId); this.getEditingChildCreator().setShareId(shareId);
} }
} }

14
designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java

@ -1,13 +1,11 @@
package com.fr.design.designer.treeview; package com.fr.design.designer.treeview;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.base.iofile.attr.ExtendSharableAttrMark;
import com.fr.design.constants.UIConstants; import com.fr.design.constants.UIConstants;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.form.ui.AbstractBorderStyleWidget; import com.fr.design.mainframe.share.util.ShareComponentUtils;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.Icon; import javax.swing.Icon;
@ -38,7 +36,7 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
} }
if (icon != null) { if (icon != null) {
setIcon(icon); setIcon(icon);
this.needAddShareIcon = isShareWidget((XCreator) value); this.needAddShareIcon = ShareComponentUtils.isShareWidgetWithChild((XCreator) value);
} }
} }
@ -47,14 +45,6 @@ public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer {
return this; return this;
} }
private boolean isShareWidget(XCreator xCreator) {
if (!xCreator.toData().acceptType(AbstractBorderStyleWidget.class)) {
return false;
}
ExtendSharableAttrMark attrMark = ((AbstractBorderStyleWidget) xCreator.toData()).getWidgetAttrMark(ExtendSharableAttrMark.XML_TAG);
return attrMark != null && StringUtils.isNotEmpty(attrMark.getShareId());
}
public void paint(Graphics g) { public void paint(Graphics g) {
super.paint(g); super.paint(g);

12
designer-form/src/main/java/com/fr/design/gui/controlpane/EventPropertyPane.java

@ -2,6 +2,7 @@ package com.fr.design.gui.controlpane;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.properties.EventPropertyTable; import com.fr.design.designer.properties.EventPropertyTable;
import com.fr.design.file.Releasable;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.widget.EventCreator; import com.fr.design.widget.EventCreator;
@ -13,7 +14,7 @@ import com.fr.stable.Nameable;
/** /**
* Created by kerry on 5/17/21 * Created by kerry on 5/17/21
*/ */
public class EventPropertyPane extends UIListGroupControlPane { public class EventPropertyPane extends UIListGroupControlPane implements Releasable {
private XCreator creator; private XCreator creator;
private FormDesigner designer; private FormDesigner designer;
@ -24,6 +25,12 @@ public class EventPropertyPane extends UIListGroupControlPane {
this.designer = designer; this.designer = designer;
} }
@Override
public void releaseResources() {
creator = null;
designer = null;
this.removeAll();
}
/** /**
* 刷新 * 刷新
@ -44,7 +51,6 @@ public class EventPropertyPane extends UIListGroupControlPane {
} }
public void populateNameObjects() { public void populateNameObjects() {
Widget widget = creator.toData(); Widget widget = creator.toData();
populateNameObjects(widget); populateNameObjects(widget);
@ -93,7 +99,7 @@ public class EventPropertyPane extends UIListGroupControlPane {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Event"); return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Add_Event");
} }
protected String getWrapperLabelText(){ protected String getWrapperLabelText() {
return Toolkit.i18nText("Fine-Design_Report_Event"); return Toolkit.i18nText("Fine-Design_Report_Event");
} }

12
designer-form/src/main/java/com/fr/design/mainframe/FormParaWidgetPane.java

@ -7,6 +7,7 @@ import com.fr.design.constants.UIConstants;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XCreatorUtils;
import com.fr.design.file.Releasable;
import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.fun.FormWidgetOptionProvider;
import com.fr.design.gui.core.FormWidgetOption; import com.fr.design.gui.core.FormWidgetOption;
import com.fr.design.gui.core.UserDefinedWidgetOption; import com.fr.design.gui.core.UserDefinedWidgetOption;
@ -56,7 +57,7 @@ import java.awt.event.MouseEvent;
/** /**
* @author null * @author null
*/ */
public class FormParaWidgetPane extends JPanel { public class FormParaWidgetPane extends JPanel implements Releasable {
private static FormParaWidgetPane THIS; private static FormParaWidgetPane THIS;
private final static int BORDER = 5; private final static int BORDER = 5;
private final static int WIDGET_WIDTHGAP = 4; private final static int WIDGET_WIDTHGAP = 4;
@ -119,6 +120,15 @@ public class FormParaWidgetPane extends JPanel {
return THIS; return THIS;
} }
public static FormParaWidgetPane getInstance(){
return THIS;
}
@Override
public void releaseResources() {
designer = null;
}
public FormParaWidgetPane() { public FormParaWidgetPane() {
setLayout(new FlowLayout(FlowLayout.LEFT)); setLayout(new FlowLayout(FlowLayout.LEFT));
DesignerContext.getDesignerFrame().getCenterTemplateCardPane().addComponentListener(new ComponentAdapter() { DesignerContext.getDesignerFrame().getCenterTemplateCardPane().addComponentListener(new ComponentAdapter() {

8
designer-form/src/main/java/com/fr/design/mainframe/FormWidgetDetailPane.java

@ -2,6 +2,7 @@ package com.fr.design.mainframe;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.design.file.Releasable;
import com.fr.design.gui.ibutton.UIHeadGroup; import com.fr.design.gui.ibutton.UIHeadGroup;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.reuse.ComponentReuseNotificationInfo; import com.fr.design.mainframe.reuse.ComponentReuseNotificationInfo;
@ -23,7 +24,7 @@ import java.util.List;
* Date: 14-7-8 * Date: 14-7-8
* Time: 下午8:18 * Time: 下午8:18
*/ */
public class FormWidgetDetailPane extends FormDockView{ public class FormWidgetDetailPane extends FormDockView implements Releasable {
private static final int ONLINE_TAB = 1; private static final int ONLINE_TAB = 1;
private JPanel centerPane; private JPanel centerPane;
@ -52,6 +53,11 @@ public class FormWidgetDetailPane extends FormDockView{
private static FormWidgetDetailPane singleton = new FormWidgetDetailPane(); private static FormWidgetDetailPane singleton = new FormWidgetDetailPane();
} }
@Override
public void releaseResources() {
setEditingFormDesigner(null);
}
public String getViewTitle() { public String getViewTitle() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Tree_And_Table"); return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Tree_And_Table");
} }

19
designer-form/src/main/java/com/fr/design/mainframe/JForm.java

@ -116,7 +116,8 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm<F
private static final String[] CARDNAME = new String[]{FORM_CARD, ELEMENTCASE_CARD}; private static final String[] CARDNAME = new String[]{FORM_CARD, ELEMENTCASE_CARD};
private static final int TOOLBARPANEDIMHEIGHT_FORM = 60; private static final int TOOLBARPANEDIMHEIGHT_FORM = 60;
//当前使用的表单设计器
private static FormDesigner currentFormDesign;
//表单设计器 //表单设计器
private FormDesigner formDesign; private FormDesigner formDesign;
//格子设计器 //格子设计器
@ -858,6 +859,7 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm<F
EastRegionContainerPane.getInstance().addParameterPane(parameterPropertyPane); EastRegionContainerPane.getInstance().addParameterPane(parameterPropertyPane);
refreshWidgetLibPane(); refreshWidgetLibPane();
currentFormDesign = formDesign;
} }
private void refreshWidgetLibPane() { private void refreshWidgetLibPane() {
@ -1090,4 +1092,19 @@ public class JForm extends JTemplate<Form, FormUndoState> implements BaseJForm<F
} }
} }
} }
@Override
public void whenClose() {
super.whenClose();
releaseResources();
}
private void releaseResources() {
if (ComparatorUtils.equals(currentFormDesign, formDesign)) {
FormParaWidgetPane.getInstance().releaseResources();
FormWidgetDetailPane.getInstance().releaseResources();
WidgetPropertyPane.getInstance().releaseResources();
currentFormDesign = null;
}
}
} }

28
designer-form/src/main/java/com/fr/design/mainframe/WidgetPropertyPane.java

@ -9,6 +9,7 @@ import com.fr.design.designer.creator.*;
import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.designer.creator.cardlayout.XWCardTagLayout;
import com.fr.design.designer.properties.mobile.MobileBookMarkPropertyUI; import com.fr.design.designer.properties.mobile.MobileBookMarkPropertyUI;
import com.fr.design.designer.properties.mobile.MobileStylePropertyUI; import com.fr.design.designer.properties.mobile.MobileStylePropertyUI;
import com.fr.design.file.Releasable;
import com.fr.design.form.util.FormDesignerUtils; import com.fr.design.form.util.FormDesignerUtils;
import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.fun.WidgetPropertyUIProvider;
import com.fr.design.gui.controlpane.EventPropertyPane; import com.fr.design.gui.controlpane.EventPropertyPane;
@ -32,7 +33,7 @@ import java.util.Set;
* 控件属性表绘制 * 控件属性表绘制
* Modified by fanglei * Modified by fanglei
*/ */
public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane { public class WidgetPropertyPane extends FormDockView implements BaseWidgetPropertyPane, Releasable {
private static final int PADDING = 10; private static final int PADDING = 10;
private static final int PADDING_M = 12; private static final int PADDING_M = 12;
@ -68,6 +69,31 @@ public class WidgetPropertyPane extends FormDockView implements BaseWidgetProper
setLayout(FRGUIPaneFactory.createBorderLayout()); setLayout(FRGUIPaneFactory.createBorderLayout());
} }
@Override
public void releaseResources() {
setEditingFormDesigner(null);
if (eventTable != null) {
eventTable.releaseResources();
}
if (formWidgetCardPane != null) {
formWidgetCardPane.releaseResources();
}
if (wsp != null) {
wsp.removeAll();
}
designer.getSelectionModel().reset();
formWidgetCardPane = null;
eventTable = null;
widgetPropertyTables = null;
mobileExtraPropertyPanes = null;
designer = null;
psp = null;
wsp = null;
tabsHeaderIconPane = null;
lastAffectedCreator = null;
this.removeAll();
}
@Override @Override
protected String title4PopupWindow() { protected String title4PopupWindow() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Control_Setting"); return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Widget_Control_Setting");

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

Loading…
Cancel
Save