Browse Source

Merge pull request #12203 in DESIGN/design from release/11.0 to final/11.0

* commit '41e67f00738a23995874208d001b23189a3fcb21': (52 commits)
  REPORT-92333 frm图片控件,默认图片是中文
  EPORT-97225 【H5控件增强】关于文本类控件的新功能,设计器设置项的屏蔽
  REPORT-76564 设计器检查-国际化问题
  REPORT-76564 设计器检查-国际化问题
  REPORT-76564 设计器检查-国际化问题
  REPORT-96012 移动文件夹到自己文件夹下,文件夹丢失
  REPORT-96808 屏蔽设计器系统信息面板中的jxbrowser相关参数
  REPORT-96808 屏蔽设计器系统信息面板中的jxbrowser相关参数
  REPORT-96808 屏蔽设计器系统信息面板中的jxbrowser相关参数
  REPORT-96808 屏蔽设计器系统信息面板中的jxbrowser相关参数
  REPORT-96424 高级js编辑器超链国际化处理
  REPORT-96107 8.0和11.0.2能双开,8.0和11.0.14不能双开--调整
  REPORT-96424 高级js编辑器超链国际化处理
  REPORT-96107 8.0和11.0.2能双开,8.0和11.0.14不能双开--魔数
  REPORT-96107 8.0和11.0.2能双开,8.0和11.0.14不能双开--方案调整
  REPORT-96567 文本控件无法正确设置输入方式
  REPORT-96107 8.0和11.0.2能双开,8.0和11.0.14不能双开
  REPORT-96012 移动文件夹到自己文件夹下,文件夹丢失 优化代码
  无jira任务,补交遗漏代码
  REPORT-96012 移动文件夹到自己文件夹下,文件夹丢失
  ...
new-design
superman 2 years ago
parent
commit
1d2dec6c8f
  1. 26
      designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java
  2. 20
      designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java
  3. 25
      designer-base/src/main/java/com/fr/design/actions/help/alphafine/RemindPane.java
  4. 14
      designer-base/src/main/java/com/fr/design/components/table/TablePanel.java
  5. 10
      designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java
  6. 24
      designer-base/src/main/java/com/fr/design/env/processor/AbstractRemoteDesignerWorkspaceInfoProcessor.java
  7. 25
      designer-base/src/main/java/com/fr/design/env/processor/RemoteDesignerWorkspaceInfoProcessor.java
  8. 24
      designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java
  9. 46
      designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java
  10. 12
      designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java
  11. 4
      designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java
  12. 3
      designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java
  13. 23
      designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java
  14. 40
      designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java
  15. 11
      designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java
  16. 69
      designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java
  17. 5
      designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeBlock.java
  18. 19
      designer-base/src/main/java/com/fr/design/utils/DesignUtils.java
  19. 11
      designer-base/src/main/java/com/fr/env/RemoteEnvPane.java
  20. 4
      designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java
  21. BIN
      designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png
  22. BIN
      designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_en.png
  23. BIN
      designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh.png
  24. BIN
      designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh_TW.png
  25. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading.gif
  26. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_en.gif
  27. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_zh.gif
  28. BIN
      designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_zh_TW.gif
  29. 57
      designer-base/src/main/resources/com/fr/design/login/guide.css
  30. 2
      designer-base/src/main/resources/com/fr/design/login/guide.html
  31. BIN
      designer-base/src/main/resources/com/fr/design/login/img/guide/login_guide.png
  32. BIN
      designer-base/src/main/resources/com/fr/design/login/img/guide/login_guide_en.png
  33. 0
      designer-base/src/main/resources/com/fr/design/login/img/guide/login_guide_zh.png
  34. BIN
      designer-base/src/main/resources/com/fr/design/login/img/guide/login_guide_zh_TW.png
  35. 57
      designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_en_US.css
  36. 57
      designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_ja_JP.css
  37. 57
      designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_ko_KR.css
  38. 57
      designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_zh_CN.css
  39. 57
      designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_zh_TW.css
  40. 49
      designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java
  41. 10
      designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java
  42. 17
      designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java
  43. 0
      designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata.png
  44. BIN
      designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_en.png
  45. 0
      designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_zh.png
  46. 0
      designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_zh_TW.png
  47. BIN
      designer-chart/src/main/resources/com/fr/van/chart/background/background.png
  48. BIN
      designer-chart/src/main/resources/com/fr/van/chart/background/background_en.png
  49. 0
      designer-chart/src/main/resources/com/fr/van/chart/background/background_zh.png
  50. BIN
      designer-chart/src/main/resources/com/fr/van/chart/background/background_zh_TW.png
  51. 9
      designer-form/src/main/java/com/fr/design/designer/creator/XAutoChartCreator.java
  52. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java
  53. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java
  54. 3
      designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java
  55. 9
      designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java
  56. 4
      designer-form/src/main/java/com/fr/design/designer/creator/XTextEditor.java
  57. 110
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java
  58. 37
      designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java
  59. 37
      designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java
  60. 37
      designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java
  61. 37
      designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java
  62. 15
      designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java
  63. 6
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java
  64. 6
      designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java
  65. 94
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java
  66. 33
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java
  67. 25
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java
  68. 63
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java
  69. 25
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java
  70. 55
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java
  71. 38
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java
  72. 43
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java
  73. 59
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java
  74. 35
      designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java
  75. BIN
      designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview.png
  76. BIN
      designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_en.png
  77. BIN
      designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_zh.png
  78. BIN
      designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_zh_TW.png
  79. 8
      designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java
  80. 41
      designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java
  81. 42
      designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java
  82. 39
      designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java
  83. 42
      designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java
  84. 59
      designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java
  85. 2
      designer-realize/src/main/java/com/fr/start/MainDesigner.java
  86. 12
      designer-realize/src/main/java/com/fr/start/SplashContext.java
  87. 12
      designer-realize/src/main/java/com/fr/start/common/SplashPane.java
  88. 20
      designer-realize/src/main/java/com/fr/start/common/SplashPane4WinAndJDK11.java
  89. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash.png
  90. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash@2x.png
  91. 0
      designer-realize/src/main/resources/com/fr/design/images/splash@2x_en.png
  92. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash@2x_zh.png
  93. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash@2x_zh_TW.png
  94. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash_zh.png
  95. BIN
      designer-realize/src/main/resources/com/fr/design/images/splash_zh_TW.png
  96. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open.png
  97. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_en.png
  98. 0
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_zh.png
  99. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_zh_TW.png
  100. BIN
      designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/remind/remind.png
  101. Some files were not shown because too many files have changed in this diff Show More

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

@ -1,6 +1,7 @@
package com.fr.design; package com.fr.design;
import com.fr.common.report.ReportState; import com.fr.common.report.ReportState;
import com.fr.design.env.processor.RemoteDesignerWorkspaceInfoProcessor;
import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard; import com.fr.design.mainframe.manager.clip.TemplateTreeClipboard;
import com.fr.design.plugin.remind.PluginErrorDesignReminder; import com.fr.design.plugin.remind.PluginErrorDesignReminder;
import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.DesignTableDataManager;
@ -101,6 +102,29 @@ public class EnvChangeEntrance {
} }
} }
/**
* 插件进行用户名转换
*
* @param workspaceInfo 环境信息
*/
private DesignerWorkspaceInfo customUserName(DesignerWorkspaceInfo workspaceInfo) {
//本地环境直接返回
if (workspaceInfo == null || workspaceInfo.getType() == DesignerWorkspaceType.Local) {
return workspaceInfo;
}
RemoteDesignerWorkspaceInfoProcessor processor = ExtraDesignClassManager.getInstance().getSingle(RemoteDesignerWorkspaceInfoProcessor.XML_TAG);
if (processor == null) {
return workspaceInfo;
}
try {
WorkspaceConnectionInfo workspaceConnectionInfo = processor.customUserName(workspaceInfo.getConnection());
return (RemoteDesignerWorkspaceInfo) ((RemoteDesignerWorkspaceInfo) workspaceInfo).cloneWithConnectionInfo(workspaceConnectionInfo);
} catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
return workspaceInfo;
}
}
/** /**
* 切换到新环境 * 切换到新环境
* *
@ -109,7 +133,7 @@ public class EnvChangeEntrance {
*/ */
private boolean switch2Env(final String envName, PopTipStrategy strategy) { private boolean switch2Env(final String envName, PopTipStrategy strategy) {
DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); DesignerWorkspaceInfo selectedEnv = customUserName(envManager.getWorkspaceInfo(envName));
DesignerWorkspaceInfoContext.setWorkspaceInfo(selectedEnv); DesignerWorkspaceInfoContext.setWorkspaceInfo(selectedEnv);
WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection(); WorkspaceConnectionInfo connectionInfo = selectedEnv.getConnection();

20
designer-base/src/main/java/com/fr/design/actions/help/SystemInfoPane.java

@ -41,16 +41,12 @@ public class SystemInfoPane extends JPanel {
for (int i = 0; i < keys.length; i++) { for (int i = 0; i < keys.length; i++) {
Object[] tableRowData = new Object[2]; Object[] tableRowData = new Object[2];
String keyValue = keys[i].toString(); String keyValue = keys[i].toString();
// james:屏蔽掉exe4j的内容
if (keyValue.indexOf("exe4j") != -1) { if (needToShield(keyValue)) {
continue;
}
// james:这个也是exe4j的东东
if ("install4j.exeDir".equals(keyValue)) {
continue; continue;
} }
if(keyValue.indexOf("FineReport") != -1){ if(keyValue.contains("FineReport")){
keys[i] = keyValue.replaceAll("FineReport", ProductConstants.APP_NAME); keys[i] = keyValue.replaceAll("FineReport", ProductConstants.APP_NAME);
} }
@ -66,4 +62,14 @@ public class SystemInfoPane extends JPanel {
add(new JScrollPane(table), BorderLayout.CENTER); add(new JScrollPane(table), BorderLayout.CENTER);
} }
/**
* 是否属于需要屏蔽的内容(当前屏蔽掉exe4j与jxbrowser的内容)
*
* @param keyValue 对应的key值
* @return 需要屏蔽则返回true
*/
private boolean needToShield(String keyValue) {
return keyValue.contains("exe4j") || keyValue.contains("jxbrowser") || "install4j.exeDir".equals(keyValue);
}
} }

25
designer-base/src/main/java/com/fr/design/actions/help/alphafine/RemindPane.java

@ -4,10 +4,21 @@ import com.fr.design.dialog.UIDialog;
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;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.locale.image.I18nImage;
import javax.swing.*; import javax.swing.Icon;
import java.awt.*; import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@ -23,8 +34,10 @@ public class RemindPane extends JPanel {
private Icon checkIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/check.png"); private Icon checkIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/check.png");
private Icon unCheckIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/uncheck.png"); private Icon unCheckIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/uncheck.png");
private Icon closeIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/remind_close.png"); private Icon closeIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/remind_close.png");
private Icon labelIcon = IOUtils.readIcon("/com/fr/design/mainframe/alphafine/images/remind.png"); private static final String REMIND_IMAGE_URL = "/com/fr/design/mainframe/alphafine/images/open/open.png";
private Icon openIcon = IOUtils.readIcon("com/fr/design/mainframe/alphafine/images/open.png"); private Icon labelIcon = new ImageIcon(I18nImage.getImage(REMIND_IMAGE_URL));
private static final String OPEN_IMAGE_URL = "/com/fr/design/mainframe/alphafine/images/open/open.png";
private final Icon openIcon = new ImageIcon(I18nImage.getImage(OPEN_IMAGE_URL));
private static final int WIDTH = 600; private static final int WIDTH = 600;
private static final int HEIGHT = 400; private static final int HEIGHT = 400;

14
designer-base/src/main/java/com/fr/design/components/table/TablePanel.java

@ -161,6 +161,20 @@ public class TablePanel extends JPanel {
} }
cellPanel.add(component); cellPanel.add(component);
} }
/**
* 为单元格Panel更新tooltip
*
* @param row 行数
* @param column 列数
* @param value tooltip值
*/
public void updateCellToolTip(int row, int column, String value) {
int x = row - 1;
int y = column - 1;
JPanel cellPanel = this.cellPanels[x][y];
cellPanel.setToolTipText(value);
}
public void updateCell(int row, int column, String value) { public void updateCell(int row, int column, String value) {

10
designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java vendored

@ -6,6 +6,7 @@ import com.fr.log.FineLoggerFactory;
import com.fr.security.SecurityToolbox; import com.fr.security.SecurityToolbox;
import com.fr.stable.StableUtils; import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.fun.mark.Immutable;
import com.fr.stable.project.ProjectConstants; import com.fr.stable.project.ProjectConstants;
import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLPrintWriter;
import com.fr.stable.xml.XMLableReader; import com.fr.stable.xml.XMLableReader;
@ -166,6 +167,15 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo {
return object; return object;
} }
/**
* clone一个自定义连接信息的RemoteDesignerWorkspaceInfo
*/
public Object cloneWithConnectionInfo(WorkspaceConnectionInfo workspaceConnectionInfo) throws CloneNotSupportedException {
RemoteDesignerWorkspaceInfo object = (RemoteDesignerWorkspaceInfo) super.clone();
object.connection = workspaceConnectionInfo;
return object;
}
@Override @Override
public boolean checkValid() throws Exception { public boolean checkValid() throws Exception {

24
designer-base/src/main/java/com/fr/design/env/processor/AbstractRemoteDesignerWorkspaceInfoProcessor.java vendored

@ -0,0 +1,24 @@
package com.fr.design.env.processor;
import com.fr.stable.fun.mark.API;
/**
* 远程设计自定义用户名接口实现抽象类
*
* @author John.Ying
* @since 11.0
* Created on 2023/5/17
*/
@API(level = RemoteDesignerWorkspaceInfoProcessor.CURRENT_LEVEL)
public abstract class AbstractRemoteDesignerWorkspaceInfoProcessor implements RemoteDesignerWorkspaceInfoProcessor {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public int layerIndex() {
return DEFAULT_LAYER_INDEX;
}
}

25
designer-base/src/main/java/com/fr/design/env/processor/RemoteDesignerWorkspaceInfoProcessor.java vendored

@ -0,0 +1,25 @@
package com.fr.design.env.processor;
import com.fr.stable.fun.mark.Immutable;
import com.fr.workspace.connect.WorkspaceConnectionInfo;
/**
* 远程设计自定义用户名接口
* px:为了二开插件开的接口不建议实现后面可能会变动
*
* @author John.Ying
* @since 11.0
* Created on 2023/5/17
*/
public interface RemoteDesignerWorkspaceInfoProcessor extends Immutable {
String XML_TAG = "RemoteDesignerWorkspaceInfoProcessor";
int CURRENT_LEVEL = 1;
/**
* 根据链接信息自定义用户名
*/
WorkspaceConnectionInfo customUserName(WorkspaceConnectionInfo workspaceInfo);
}

24
designer-base/src/main/java/com/fr/design/file/DefaultTemplateTreeDefineProcessor.java

@ -28,7 +28,6 @@ import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import com.fr.stable.collections.CollectionUtils; import com.fr.stable.collections.CollectionUtils;
import com.fr.stable.project.ProjectConstants; import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JDialog; import javax.swing.JDialog;
@ -221,6 +220,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
/** /**
* 检测是否能够黏贴 * 检测是否能够黏贴
*
* @param treeNodeList * @param treeNodeList
* @return * @return
*/ */
@ -271,7 +271,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
} }
} }
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e,"Template paste failed.", e.getMessage()); FineLoggerFactory.getLogger().error(e, "Template paste failed.", e.getMessage());
FineJOptionPane.showConfirmDialog(null, FineJOptionPane.showConfirmDialog(null,
Toolkit.i18nText("Fine-Design_Basic_Paste_Failure"), Toolkit.i18nText("Fine-Design_Basic_Paste_Failure"),
Toolkit.i18nText("Fine-Design_Basic_Error"), Toolkit.i18nText("Fine-Design_Basic_Error"),
@ -286,7 +286,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
/** /**
* 确认粘贴的目标目录是否是复制文件的子目录并确认是否继续执行粘贴任务 * 确认粘贴的目标目录是否是复制文件的子目录并确认是否继续执行粘贴任务
* *
* @param targetDir 目标文件夹 * @param targetDir 目标文件夹
* @param pasteNodes 待粘贴的文件 * @param pasteNodes 待粘贴的文件
* @return 是否继续 * @return 是否继续
*/ */
@ -433,6 +433,14 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
WARNING_MESSAGE); WARNING_MESSAGE);
return false; return false;
} }
// 检查移动的源文件夹是否为目标文件夹相同文件夹或子文件夹
if (FileOperationHelper.getInstance().isSubDirectoryOrSame(getFileTree().getSelectedTreeNodes(), getTargetFileNode())) {
FineJOptionPane.showMessageDialog(this,
Toolkit.i18nText("Fine-Design_Basic_Move_To_SubDirectory"),
Toolkit.i18nText("Fine-Design_Basic_Alert"),
WARNING_MESSAGE);
return false;
}
if (TemplateUtils.checkSelectedTemplateIsEditing()) { if (TemplateUtils.checkSelectedTemplateIsEditing()) {
return FineJOptionPane.showConfirmDialog(this, return FineJOptionPane.showConfirmDialog(this,
Toolkit.i18nText("Fine-Design_Basic_Template_Is_Editing"), Toolkit.i18nText("Fine-Design_Basic_Template_Is_Editing"),
@ -443,9 +451,7 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
} }
private boolean doMove() { private boolean doMove() {
FileNode fileNode = getDirTree().getSelectedFileNode(); FileNode fileNode = getTargetFileNode();
ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) getDirTree().getModel().getRoot();
fileNode = fileNode == null ? (FileNode) rootTreeNode.getUserObject() : fileNode;
boolean moveSuccess = true; boolean moveSuccess = true;
try { try {
//待移动的文件可以有多个 //待移动的文件可以有多个
@ -465,6 +471,12 @@ public class DefaultTemplateTreeDefineProcessor extends AbstractTemplateTreeDefi
return moveSuccess; return moveSuccess;
} }
private FileNode getTargetFileNode() {
FileNode fileNode = getDirTree().getSelectedFileNode();
ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) getDirTree().getModel().getRoot();
return fileNode == null ? (FileNode) rootTreeNode.getUserObject() : fileNode;
}
@Override @Override
public void dispose() { public void dispose() {
TemplateDirTreeSearchManager.getInstance().outOfSearchMode(); TemplateDirTreeSearchManager.getInstance().outOfSearchMode();

46
designer-base/src/main/java/com/fr/design/file/FileOperationHelper.java

@ -16,7 +16,10 @@ import com.fr.stable.StringUtils;
import com.fr.stable.project.ProjectConstants; import com.fr.stable.project.ProjectConstants;
import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContext;
import com.fr.workspace.resource.ResourceIOException; import com.fr.workspace.resource.ResourceIOException;
import org.jetbrains.annotations.NotNull;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList; import java.util.ArrayList;
import static javax.swing.JOptionPane.WARNING_MESSAGE; import static javax.swing.JOptionPane.WARNING_MESSAGE;
@ -32,6 +35,38 @@ public class FileOperationHelper {
return INSTANCE; return INSTANCE;
} }
/**
* 检查目标文件夹是否为多个源文件夹中的任一文件夹或者任一文件夹的子文件夹
*
* @param fileNodes 需移动的源文件
* @param targetNode 移动后的目标文件夹
* @return
*/
public boolean isSubDirectoryOrSame(@NotNull ExpandMutableTreeNode[] fileNodes, @NotNull FileNode targetNode) {
for (ExpandMutableTreeNode treeNode : fileNodes) {
FileNode sourceFileNode = (FileNode) treeNode.getUserObject();
if (isSubDirectoryOrSame(sourceFileNode, targetNode)) {
return true;
}
}
return false;
}
/**
* 检查目标文件夹是否为源文件夹或源文件夹的子文件夹
*
* @param sourceFileNode 需移动的源文件
* @param targetNode 移动后的目标文件夹
*/
public boolean isSubDirectoryOrSame(@NotNull FileNode sourceFileNode, @NotNull FileNode targetNode) {
if (!sourceFileNode.isDirectory() || !targetNode.isDirectory()) {
return false;
}
Path sourceDir = Paths.get(sourceFileNode.getEnvPath()).normalize();
Path targetDir = Paths.get(targetNode.getEnvPath()).normalize();
return targetDir.startsWith(sourceDir);
}
public String moveFile(FileNode sourceFileNode, String targetDir) { public String moveFile(FileNode sourceFileNode, String targetDir) {
String targetPath = copyFileAndVcs(sourceFileNode, targetDir); String targetPath = copyFileAndVcs(sourceFileNode, targetDir);
FileNodeFILE nodeFILE = new FileNodeFILE(sourceFileNode); FileNodeFILE nodeFILE = new FileNodeFILE(sourceFileNode);
@ -51,8 +86,9 @@ public class FileOperationHelper {
/** /**
* 拷贝文件的同时拷贝对应的版本控制文件 * 拷贝文件的同时拷贝对应的版本控制文件
*
* @param sourceFile 源文件或目录 * @param sourceFile 源文件或目录
* @param targetDir 目标目录 * @param targetDir 目标目录
* @return 复制后的目标文件的路径 * @return 复制后的目标文件的路径
*/ */
public String copyFileAndVcs(FileNode sourceFile, String targetDir) { public String copyFileAndVcs(FileNode sourceFile, String targetDir) {
@ -61,8 +97,9 @@ public class FileOperationHelper {
/** /**
* 只拷贝文件, 不拷贝对应的版本控制文件 * 只拷贝文件, 不拷贝对应的版本控制文件
*
* @param sourceFile 源文件或目录 * @param sourceFile 源文件或目录
* @param targetDir 目标目录 * @param targetDir 目标目录
* @return 复制后的目标文件的路径 * @return 复制后的目标文件的路径
*/ */
public String copyFile(FileNode sourceFile, String targetDir) { public String copyFile(FileNode sourceFile, String targetDir) {
@ -71,7 +108,8 @@ public class FileOperationHelper {
/** /**
* 检测节点是否被锁住了 * 检测节点是否被锁住了
* @param node 待检测节点 *
* @param node 待检测节点
* @param dNodes 没有锁住的节点集合 * @param dNodes 没有锁住的节点集合
* @param lNodes 锁住的节点集合 * @param lNodes 锁住的节点集合
* @return 是否存在被锁住的文件 * @return 是否存在被锁住的文件
@ -165,7 +203,7 @@ public class FileOperationHelper {
} else { } else {
if (!TemplateResourceManager.getResource().copy(sourcePath, targetPath)) { if (!TemplateResourceManager.getResource().copy(sourcePath, targetPath)) {
throw new ResourceIOException(String.format("copy file failed, from %s to %s", sourcePath, targetPath)); throw new ResourceIOException(String.format("copy file failed, from %s to %s", sourcePath, targetPath));
} else if (withCopyVcs){ } else if (withCopyVcs) {
sourcePath = sourcePath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); sourcePath = sourcePath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY);
targetPath = targetPath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY); targetPath = targetPath.replaceFirst(ProjectConstants.REPORTLETS_NAME, StringUtils.EMPTY);
VcsHelper.getInstance().moveVcs(sourcePath, targetPath); VcsHelper.getInstance().moveVcs(sourcePath, targetPath);

12
designer-base/src/main/java/com/fr/design/javascript/JSContentWithDescriptionPane.java

@ -20,6 +20,7 @@ import com.fr.design.javascript.jsapi.JSAPITreeHelper;
import com.fr.design.javascript.jsapi.JSAPIUserObject; import com.fr.design.javascript.jsapi.JSAPIUserObject;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.GeneralContext;
import com.fr.general.http.HttpToolbox; import com.fr.general.http.HttpToolbox;
import com.fr.json.JSONArray; import com.fr.json.JSONArray;
import com.fr.json.JSONException; import com.fr.json.JSONException;
@ -70,6 +71,7 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener { public class JSContentWithDescriptionPane extends JSContentPane implements KeyListener {
@ -393,9 +395,13 @@ public class JSContentWithDescriptionPane extends JSContentPane implements KeyLi
private void updateHelpDocuments(Object value, List<HelpDocument> helpDocuments) { private void updateHelpDocuments(Object value, List<HelpDocument> helpDocuments) {
String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) + value.toString(); String url = LocaleLinkProvider.getInstance().getLink(PROPS_LINK_KEY, PROPS_LINK_KEY_DEFAULT) + value.toString();
try { try {
String result = HttpToolbox.get(url); JSONArray jsonArray = null;
JSONObject jsonObject = new JSONObject(result); //目前简中繁中之外的语言高级编辑器功能及文档不完善,右侧展示的文档链接列表暂时为空白
JSONArray jsonArray = jsonObject.optJSONArray("list"); if(GeneralContext.isChineseEnv()) {
String result = HttpToolbox.get(url);
JSONObject jsonObject = new JSONObject(result);
jsonArray = jsonObject.optJSONArray("list");
}
if (jsonArray != null) { if (jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) { for (int i = 0; i < jsonArray.length(); i++) {
JSONObject resultJSONObject = jsonArray.optJSONObject(i); JSONObject resultJSONObject = jsonArray.optJSONObject(i);

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

@ -54,6 +54,7 @@ import com.fr.plugin.injectable.PluginModule;
import com.fr.plugin.manage.PluginFilter; import com.fr.plugin.manage.PluginFilter;
import com.fr.plugin.observer.PluginEvent; import com.fr.plugin.observer.PluginEvent;
import com.fr.plugin.observer.PluginEventListener; import com.fr.plugin.observer.PluginEventListener;
import com.fr.report.lock.LockInfoOperator;
import com.fr.stable.CoreConstants; import com.fr.stable.CoreConstants;
import com.fr.stable.StableUtils; import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -61,7 +62,6 @@ import com.fr.stable.project.ProjectConstants;
import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.third.org.apache.commons.io.FilenameUtils;
import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContext;
import com.fr.report.lock.LockInfoOperator;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
@ -537,7 +537,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt
} }
private boolean pathSupportVcsAction(String path) { private boolean pathSupportVcsAction(String path) {
if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path)) { if (FileExtension.CPT.matchExtension(path) || FileExtension.FRM.matchExtension(path) || FileExtension.VIS.matchExtension(path)) {
return true; return true;
} }
return false; return false;

3
designer-base/src/main/java/com/fr/design/mainframe/NorthRegionContainerPane.java

@ -157,7 +157,8 @@ public class NorthRegionContainerPane extends JPanel {
if (!DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) { if (!DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isEnabled()) {
ad.createAlphaFinePane().setVisible(false); ad.createAlphaFinePane().setVisible(false);
} }
northEastPane.add(ad.createGuideEntryPane()); /// 新手引导功能,暂时屏蔽
// northEastPane.add(ad.createGuideEntryPane());
northEastPane.add(ad.createNotificationCenterPane()); northEastPane.add(ad.createNotificationCenterPane());
OSSupportCenter.buildAction(new OSBasedAction() { OSSupportCenter.buildAction(new OSBasedAction() {

23
designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/AbstractMobileStyleDefinePaneCreator.java

@ -0,0 +1,23 @@
package com.fr.design.mainframe.mobile.processor;
import com.fr.stable.fun.mark.API;
/**
* 移动端Form控件样式模板通用属性替换接口
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/11
*/
@API(level = MobileStyleDefinePaneCreator.CURRENT_LEVEL)
public abstract class AbstractMobileStyleDefinePaneCreator implements MobileStyleDefinePaneCreator {
@Override
public int currentAPILevel() {
return CURRENT_LEVEL;
}
@Override
public int layerIndex() {
return DEFAULT_LAYER_INDEX;
}
}

40
designer-base/src/main/java/com/fr/design/mainframe/mobile/processor/MobileStyleDefinePaneCreator.java

@ -0,0 +1,40 @@
package com.fr.design.mainframe.mobile.processor;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.mainframe.mobile.ui.MobileStyleCustomDefinePane;
import com.fr.form.ui.Widget;
import com.fr.form.ui.mobile.MobileCommonExtraStyle;
import com.fr.form.ui.mobile.MobileStyle;
import com.fr.stable.fun.mark.Immutable;
import org.jetbrains.annotations.Nullable;
/**
* 移动端Form控件样式模板通用属性替换接口
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/11
*/
public interface MobileStyleDefinePaneCreator extends Immutable {
String XML_TAG = "MobileStyleDefinePaneCreator";
int CURRENT_LEVEL = 1;
/**
* <p> 创建通用属性样式界面可替换{@link com.fr.design.mainframe.mobile.ui.MobileStyleDefinePane}
* <p> 每种样式的通用属性面板是一样的
*
* @param widget 控件
* @param customDefinePane 自定义面板
* @param mobileStyle 移动端样式
* @return
*/
@Nullable BasicBeanPane<MobileStyle> createBaseBeanPane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customDefinePane, Class<? extends MobileStyle> mobileStyle);
/**
* 替换通用属性面板注册额外属性
*
* @return 属性类
*/
@Nullable Class<? extends MobileCommonExtraStyle> classForCommonExtraStyle(Widget widget);
}

11
designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java

@ -53,22 +53,28 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
private UISpinner borderRadius; private UISpinner borderRadius;
private NewColorSelectBox iconColor; private NewColorSelectBox iconColor;
private MobileStyleFontConfigPane fontConfigPane; private MobileStyleFontConfigPane fontConfigPane;
private MobileStyle mobileStyle;
MobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass, MobileStyleDefinePane(Widget widget, Class<? extends MobileStyleCustomDefinePane> customBeanPaneClass,
Class<? extends MobileStyle> mobileStyleClazz) { Class<? extends MobileStyle> mobileStyleClazz) {
this.widget = widget; this.widget = widget;
this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get(); this.customBeanPane = Reflect.on(customBeanPaneClass).create(widget).get();
this.mobileStyleClazz = mobileStyleClazz; this.mobileStyleClazz = mobileStyleClazz;
initMobileStyle(widget);
init(); init();
} }
private void initMobileStyle(Widget widget) {
mobileStyle = widget.getMobileStyle() != null ? widget.getMobileStyle() : Reflect.on(mobileStyleClazz).create().get();
}
@Override @Override
public void populateBean(MobileStyle ob) { public void populateBean(MobileStyle ob) {
this.customBeanPane.populateBean(ob); this.customBeanPane.populateBean(ob);
customCombo.setSelectedIndex(ob.isCommonCustom() ? 1 : 0); customCombo.setSelectedIndex(ob.isCommonCustom() ? 1 : 0);
if(ob.getCommonBackground() != null) { if (ob.getCommonBackground() != null) {
colorSelectBox.setSelectObject(((ColorBackground)ob.getCommonBackground()).getColor()); colorSelectBox.setSelectObject(((ColorBackground) ob.getCommonBackground()).getColor());
} }
borderType.setSelectedLineStyle(ob.getCommonBorderType()); borderType.setSelectedLineStyle(ob.getCommonBorderType());
if (ob.getCommonBorderColor() != null) { if (ob.getCommonBorderColor() != null) {
@ -85,7 +91,6 @@ public class MobileStyleDefinePane extends BasicBeanPane<MobileStyle> {
@Override @Override
public MobileStyle updateBean() { public MobileStyle updateBean() {
MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get();
this.widget.setMobileStyle(mobileStyle); this.widget.setMobileStyle(mobileStyle);
this.customBeanPane.updateBean(); this.customBeanPane.updateBean();
mobileStyle.setCommonCustom(customCombo.getSelectedIndex() == 1); mobileStyle.setCommonCustom(customCombo.getSelectedIndex() == 1);

69
designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStylePane.java

@ -5,17 +5,32 @@ import com.fr.design.beans.BasicBeanPane;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.fun.MobileWidgetStyleProvider;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.mobile.processor.MobileStyleDefinePaneCreator;
import com.fr.event.Event;
import com.fr.event.EventDispatcher;
import com.fr.event.Listener;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WScaleLayout; import com.fr.form.ui.container.WScaleLayout;
import com.fr.form.ui.mobile.MobileCommonExtraStyle;
import com.fr.form.ui.mobile.MobileStyle; import com.fr.form.ui.mobile.MobileStyle;
import com.fr.form.ui.mobile.StyleClassMap;
import com.fr.form.ui.widget.CRBoundsWidget; import com.fr.form.ui.widget.CRBoundsWidget;
import com.fr.log.FineLoggerFactory; import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginContext;
import com.fr.plugin.observer.PluginEventType;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import javax.swing.*; import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionListener;
import java.awt.*; import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -28,9 +43,11 @@ public class MobileStylePane extends BasicPane {
private JList styleList; private JList styleList;
private Map<String, BasicBeanPane<MobileStyle>> map = new HashMap<>(); private Map<String, BasicBeanPane<MobileStyle>> map = new HashMap<>();
private boolean checkFlag = true;
public MobileStylePane(Widget widget) { public MobileStylePane(Widget widget) {
if(widget instanceof WScaleLayout) { if (widget instanceof WScaleLayout) {
this.widget = ((CRBoundsWidget)((WScaleLayout) widget).getBoundsWidget()).getWidget(); this.widget = ((CRBoundsWidget) ((WScaleLayout) widget).getBoundsWidget()).getWidget();
} else { } else {
this.widget = widget; this.widget = widget;
} }
@ -63,13 +80,18 @@ public class MobileStylePane extends BasicPane {
} }
private void init() { private void init() {
initComponent();
initPluginListener();
}
private void initComponent() {
this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setLayout(FRGUIPaneFactory.createBorderLayout());
listModel = new DefaultListModel<>(); listModel = new DefaultListModel<>();
card = new CardLayout(); card = new CardLayout();
right = FRGUIPaneFactory.createCardLayout_S_Pane(); right = FRGUIPaneFactory.createCardLayout_S_Pane();
right.setLayout(card); right.setLayout(card);
MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders(); MobileWidgetStyleProvider[] styleProviders = getMobileWidgetStyleProviders();
for(MobileWidgetStyleProvider styleProvider: styleProviders) { for (MobileWidgetStyleProvider styleProvider : styleProviders) {
this.addProvider2View(styleProvider); this.addProvider2View(styleProvider);
} }
this.addWestList(); this.addWestList();
@ -107,7 +129,15 @@ public class MobileStylePane extends BasicPane {
listModel.addElement(displayName); listModel.addElement(displayName);
try { try {
MobileStyleDefinePaneCreator processor = ExtraDesignClassManager.getInstance().getSingle(MobileStyleDefinePaneCreator.XML_TAG);
BasicBeanPane<MobileStyle> mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz); BasicBeanPane<MobileStyle> mobileStyleBasicBeanPane = new MobileStyleDefinePane(widget, appearanceClazz, mobileStyleClazz);
if (checkFlag && processor != null && processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz) != null) {
mobileStyleBasicBeanPane = processor.createBaseBeanPane(widget, appearanceClazz, mobileStyleClazz);
Class<? extends MobileCommonExtraStyle> extraStyle = processor.classForCommonExtraStyle(widget);
if (extraStyle != null) {
StyleClassMap.putCommonStyle(extraStyle.getName(), extraStyle.getName());
}
}
right.add(displayName, mobileStyleBasicBeanPane); right.add(displayName, mobileStyleBasicBeanPane);
map.put(displayName, mobileStyleBasicBeanPane); map.put(displayName, mobileStyleBasicBeanPane);
} catch (Exception e) { } catch (Exception e) {
@ -133,4 +163,33 @@ public class MobileStylePane extends BasicPane {
styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider); styleProviders = ArrayUtils.insert(0, styleProviders, defaultMobileWidgetStyleProvider);
return styleProviders; return styleProviders;
} }
private void initPluginListener() {
EventDispatcher.listen(PluginEventType.AfterRun, new Listener<PluginContext>() {
@Override
public void on(Event event, PluginContext pluginContext) {
if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) {
checkFlag = true;
refreshDockingView();
}
}
});
EventDispatcher.listen(PluginEventType.BeforeStop, new Listener<PluginContext>() {
@Override
public void on(Event event, PluginContext pluginContext) {
if (pluginContext.getRuntime().contain(MobileStyleDefinePaneCreator.XML_TAG)) {
checkFlag = false;
refreshDockingView();
}
}
});
}
private void refreshDockingView() {
removeAll();
initComponent();
populate(widget.getMobileStyle());
this.updateUI();
this.repaint();
}
} }

5
designer-base/src/main/java/com/fr/design/mainframe/theme/TemplateThemeBlock.java

@ -11,6 +11,7 @@ import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.JTemplate; import com.fr.design.mainframe.JTemplate;
import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog; import com.fr.design.mainframe.theme.dialog.TemplateThemeProfileDialog;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.locale.image.I18nImage;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -26,7 +27,6 @@ import java.awt.Graphics2D;
import java.awt.Image; import java.awt.Image;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.RenderingHints; import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.Window; import java.awt.Window;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@ -209,7 +209,8 @@ public class TemplateThemeBlock<T extends TemplateTheme> extends JPanel {
} }
private static class ThumbnailPane extends JPanel { private static class ThumbnailPane extends JPanel {
private static final Image LOADING_IMAGE = Toolkit.getDefaultToolkit().createImage(ThumbnailPane.class.getResource("/com/fr/design/images/mainframe/loading.gif")); private static final String LOADING_IMAGE_URL = "/com/fr/design/images/mainframe/loading/loading.gif";
private static final Image LOADING_IMAGE = I18nImage.getImage(LOADING_IMAGE_URL);
private Image thumbnail = null; private Image thumbnail = null;
@Override @Override

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

@ -66,8 +66,8 @@ import java.util.concurrent.TimeoutException;
* Some util method of Designer * Some util method of Designer
*/ */
public class DesignUtils { public class DesignUtils {
private static int port = DesignerPort.getInstance().getMessagePort();
private static Integer port;
private static boolean started = false; private static boolean started = false;
@ -80,6 +80,9 @@ public class DesignUtils {
} }
public synchronized static int getPort() { public synchronized static int getPort() {
if (port == null) {
setPort(DesignerPort.getInstance().getMessagePort());
}
return port; return port;
} }
@ -93,7 +96,6 @@ public class DesignUtils {
return started; return started;
} }
/** /**
* 判断设计器端口是否被其他程序占用 * 判断设计器端口是否被其他程序占用
* 尝试去通信无回应就是其他程序占用端口否则需要继续判断是否为设计器进程未关闭 * 尝试去通信无回应就是其他程序占用端口否则需要继续判断是否为设计器进程未关闭
@ -103,7 +105,7 @@ public class DesignUtils {
public static boolean isPortOccupied() { public static boolean isPortOccupied() {
ExecutorService executor = null; ExecutorService executor = null;
Future<String> future = null; Future<String> future = null;
try (Socket socket = new Socket("localhost", port); try (Socket socket = new Socket("localhost", getPort());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)))) { PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8)))) {
writer.println("check"); writer.println("check");
@ -167,7 +169,7 @@ public class DesignUtils {
if (lines == null || lines.length == 0) { if (lines == null || lines.length == 0) {
return; return;
} }
try (Socket socket = new Socket("localhost", port)) { try (Socket socket = new Socket("localhost", getPort())) {
clientSend(lines, socket); clientSend(lines, socket);
} catch (Exception ignore) { } catch (Exception ignore) {
@ -190,7 +192,7 @@ public class DesignUtils {
try { try {
serverSocket = new ServerSocket(startPort); serverSocket = new ServerSocket(startPort);
} catch (IOException e1) { } catch (IOException e1) {
FineLoggerFactory.getLogger().error("Cannot create server socket on " + port); FineLoggerFactory.getLogger().error("Cannot create server socket on " + getPort());
} }
while (true) { while (true) {
try { try {
@ -221,7 +223,7 @@ public class DesignUtils {
@Override @Override
public void run() { public void run() {
DesignerStartupContext context = DesignerStartupContext.getInstance(); DesignerStartupContext context = DesignerStartupContext.getInstance();
// 如果在启动页展示中 // 如果在启动页展示中
if (DesignerStartupUtil.openTemplateIfOnWaiting(f)) { if (DesignerStartupUtil.openTemplateIfOnWaiting(f)) {
return; return;
@ -231,7 +233,7 @@ public class DesignUtils {
// 之前就有这样的问题 // 之前就有这样的问题
return; return;
} }
// 打开模板 // 打开模板
DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f)); DesignerContext.getDesignerFrame().openTemplate(new FileFILE(f));
} }
@ -250,7 +252,7 @@ public class DesignUtils {
reader.close(); reader.close();
socket.close(); socket.close();
} else { } else {
FineLoggerFactory.getLogger().error("Cannot create server socket on " + port); FineLoggerFactory.getLogger().error("Cannot create server socket on " + getPort());
break; break;
} }
} catch (IOException ignored) { } catch (IOException ignored) {
@ -484,6 +486,7 @@ public class DesignUtils {
/** /**
* 获取设计器可用字体 * 获取设计器可用字体
*
* @return * @return
*/ */
public static String[] getAvailableFontFamilyNames4Report() { public static String[] getAvailableFontFamilyNames4Report() {

11
designer-base/src/main/java/com/fr/env/RemoteEnvPane.java vendored

@ -5,6 +5,7 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.BasicBeanPane;
import com.fr.design.border.UITitledBorder; import com.fr.design.border.UITitledBorder;
import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.env.processor.RemoteDesignerWorkspaceInfoProcessor;
import com.fr.design.fun.DesignerEnvProcessor; import com.fr.design.fun.DesignerEnvProcessor;
import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButton;
import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icheckbox.UICheckBox;
@ -579,8 +580,14 @@ public class RemoteEnvPane extends BasicBeanPane<RemoteDesignerWorkspaceInfo> {
private void tryConnectRemoteEnv() { private void tryConnectRemoteEnv() {
final RemoteDesignerWorkspaceInfo remoteEnv = updateBean(); final RemoteDesignerWorkspaceInfo remoteEnv = updateBean();
final WorkspaceConnectionInfo connection = remoteEnv.getConnection(); WorkspaceConnectionInfo originalConnection = remoteEnv.getConnection();
final WorkspaceConnectionInfo connection;
RemoteDesignerWorkspaceInfoProcessor processor = ExtraDesignClassManager.getInstance().getSingle(RemoteDesignerWorkspaceInfoProcessor.XML_TAG);
if (processor != null) {
connection = processor.customUserName(originalConnection);
} else {
connection = originalConnection;
}
final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() { final SwingWorker<Boolean, Void> worker = new SwingWorker<Boolean, Void>() {
@Override @Override

4
designer-base/src/main/java/com/fr/env/detect/ui/EnvDetectorDialog.java vendored

@ -163,6 +163,7 @@ public class EnvDetectorDialog extends JDialog {
} }
}; };
detectButton.setForeground(Color.WHITE); detectButton.setForeground(Color.WHITE);
detectButton.setToolTipText(buttonStatus.getDesc());
detectButton.addActionListener(event -> { detectButton.addActionListener(event -> {
if (buttonStatus.isNotExecuting()) { if (buttonStatus.isNotExecuting()) {
startDetecting(); startDetecting();
@ -284,6 +285,7 @@ public class EnvDetectorDialog extends JDialog {
UIUtil.invokeLaterIfNeeded(() -> { UIUtil.invokeLaterIfNeeded(() -> {
// 刷新按钮 // 刷新按钮
detectButton.setText(buttonStatus.getDesc()); detectButton.setText(buttonStatus.getDesc());
detectButton.setToolTipText(detectButton.getText());
// 刷新面板 // 刷新面板
refreshBody(); refreshBody();
}); });
@ -293,6 +295,7 @@ public class EnvDetectorDialog extends JDialog {
// 刷新按钮 // 刷新按钮
detectButton.setText(buttonStatus.getDesc()); detectButton.setText(buttonStatus.getDesc());
detectButton.setToolTipText(detectButton.getText());
if (buttonStatus == EnvDetectorButtonStatus.A_NEW) { if (buttonStatus == EnvDetectorButtonStatus.A_NEW) {
this.resultSummaryPane = new JPanel(); this.resultSummaryPane = new JPanel();
this.resultSummaryPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); this.resultSummaryPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0));
@ -358,6 +361,7 @@ public class EnvDetectorDialog extends JDialog {
} }
EnvDetectorItem item = items.get(i); EnvDetectorItem item = items.get(i);
tablePanel.updateCell(row, 2, new UILabel(item.getDescription())); tablePanel.updateCell(row, 2, new UILabel(item.getDescription()));
tablePanel.updateCellToolTip(row, 2, item.getDescription());
DetectorResult result = item.getResult(); DetectorResult result = item.getResult();
int detectRow = currentDetectIndex + 1; int detectRow = currentDetectIndex + 1;

BIN
designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_en.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/form/designer/widget/picture_widget_designer_bg_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_en.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_zh.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
designer-base/src/main/resources/com/fr/design/images/mainframe/loading/loading_zh_TW.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

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

@ -1,57 +0,0 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(./img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(./img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(./img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(./img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(./img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(./img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(./img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(./img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(./img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(./img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(./img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(./img/login_guide.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

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

@ -15,7 +15,7 @@
<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" charset="UTF-8" src="lib/locale/login_${language}.js"></script><script type="text/javascript" charset="UTF-8" src="lib/fineui.min.js"></script>
<link href="guide.css" rel="stylesheet"></head> <link href="lib/locale/guide/guide_${language}.css" rel="stylesheet"></head>
</html> </html>
<script type="text/javascript"> <script type="text/javascript">
if (!/macintosh|mac os x/i.test(navigator.userAgent.toLowerCase())) { if (!/macintosh|mac os x/i.test(navigator.userAgent.toLowerCase())) {

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

0
designer-base/src/main/resources/com/fr/design/login/img/login_guide.png → designer-base/src/main/resources/com/fr/design/login/img/guide/login_guide_zh.png

Before

Width:  |  Height:  |  Size: 473 KiB

After

Width:  |  Height:  |  Size: 473 KiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

57
designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_en_US.css

@ -0,0 +1,57 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(../../../img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(../../../img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(../../../img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(../../../img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(../../../img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(../../../img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(../../../img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(../../../img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(../../../img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(../../../img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(../../../img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(../../../img/guide/login_guide_en.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

57
designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_ja_JP.css

@ -0,0 +1,57 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(../../../img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(../../../img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(../../../img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(../../../img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(../../../img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(../../../img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(../../../img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(../../../img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(../../../img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(../../../img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(../../../img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(../../../img/guide/login_guide_en.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

57
designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_ko_KR.css

@ -0,0 +1,57 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(../../../img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(../../../img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(../../../img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(../../../img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(../../../img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(../../../img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(../../../img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(../../../img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(../../../img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(../../../img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(../../../img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(../../../img/guide/login_guide_en.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

57
designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_zh_CN.css

@ -0,0 +1,57 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(../../../img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(../../../img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(../../../img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(../../../img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(../../../img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(../../../img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(../../../img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(../../../img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(../../../img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(../../../img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(../../../img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(../../../img/guide/login_guide_zh.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

57
designer-base/src/main/resources/com/fr/design/login/lib/locale/guide/guide_zh_TW.css

@ -0,0 +1,57 @@
.background-login-close {
color: white !important;
font-weight: bold;
font-size: 14px;
}
.background-guide-close {
background: url(../../../img/icon_install_normal.png) no-repeat center center;
background-size: cover;
width: 20px;
height: 20px;
cursor: pointer;
}
.background-guide-close:hover {
background-color: #E8E8E9;
}
.background-login-loading {
background: url(../../../img/login_loading.gif) no-repeat center center;
}
.background-plugin-need-update {
background: url(../../../img/icon_new.png) no-repeat center center;
}
.background-plugin-cant-use {
background: url(../../../img/icon_cantuse.png) no-repeat center center;
}
.background-plugin-is-disable {
background: url(../../../img/icon_disable.png) no-repeat center center;
}
.background-plugin-is-disable-new {
background: url(../../../img/icon_disable-new.png) no-repeat center center;
}
.background-plugin-selected {
background: url(../../../img/icon_marked.png) no-repeat center center;
}
.background-shop-title-close {
background: url(../../../img/icon_close40x40_normal.svg) no-repeat center center;
}
.background-dialog-confirm {
background: url(../../../img/warning.png) no-repeat center center;
background-size: contain;
}
.background-close-button {
background: url(../../../img/icon_close9x9_normal.png) no-repeat center center;
}
.background-close-button:hover {
background: url(../../../img/icon_close9x9_hover.png) no-repeat center center;
}
.designer-login-guide {
background: url(../../../img/guide/login_guide_zh_TW.png) no-repeat center center;
background-size: cover;
}
.designer-guide-login-button {
font-size: 14px;
color: white;
border-radius: 4px;
background-color: #3685F2;
}

49
designer-base/src/test/java/com/fr/design/file/FileOperationHelperTest.java

@ -0,0 +1,49 @@
package com.fr.design.file;
import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode;
import com.fr.file.filetree.FileNode;
import org.junit.Assert;
import org.junit.Test;
/**
*
* @author Levy.Xie
* @version 11.0
* Created by Levy.Xie on 2023/05/23
*/
public class FileOperationHelperTest {
@Test
public void testIsSubDirectory() {
FileNode sourceNode1 = new FileNode("/usr/local/webroot/reportlets", true);
FileNode sourceNode2 = new FileNode("/usr/local/webroot/reportlets/demo", true);
FileNode sourceNode3 = new FileNode("/usr/local/webroot/reportlets/doc", true);
FileNode sourceNode4 = new FileNode("/usr/local/webroot/reportlets/doc/1.cpt", false);
FileNode sourceNode5 = new FileNode("/usr/local/webroot/reportlets/demo/test", true);
FileNode sourceNode6 = new FileNode("/usr/local/webroot/reportlets/demo/test", false);
FileNode sourceNode7 = new FileNode("/usr/local/webroot/reportlets/demo/test123", true);
FileNode sourceNode8 = new FileNode("/usr/local/webroot/reportlets/../reportlets/demo/test", true);
FileNode sourceNode9 = new FileNode("/usr/local/webroot/reportlets/../reportlets/demo/test/c", true);
FileNode targetNode = new FileNode("/usr/local/webroot/reportlets/demo/test", true);
Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode1, targetNode));
Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode2, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode3, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode4, targetNode));
Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode5, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode6, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode7, targetNode));
Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode8, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(sourceNode9, targetNode));
ExpandMutableTreeNode treeNode1 = new ExpandMutableTreeNode(sourceNode1);
ExpandMutableTreeNode treeNode2 = new ExpandMutableTreeNode(sourceNode2);
ExpandMutableTreeNode treeNode3 = new ExpandMutableTreeNode(sourceNode3);
ExpandMutableTreeNode treeNode4 = new ExpandMutableTreeNode(sourceNode4);
Assert.assertTrue(FileOperationHelper.getInstance().isSubDirectoryOrSame(new ExpandMutableTreeNode[]{treeNode1, treeNode2, treeNode3}, targetNode));
Assert.assertFalse(FileOperationHelper.getInstance().isSubDirectoryOrSame(new ExpandMutableTreeNode[]{treeNode3, treeNode4}, targetNode));
}
}

10
designer-chart/src/main/java/com/fr/design/module/ChartEmptyDataStylePane.java

@ -14,8 +14,7 @@ import com.fr.design.style.background.image.ImageFileChooser;
import com.fr.design.style.background.image.ImagePreviewPane; import com.fr.design.style.background.image.ImagePreviewPane;
import com.fr.design.utils.ImageUtils; import com.fr.design.utils.ImageUtils;
import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.general.locale.image.LocaleImageFactory; import com.fr.general.locale.image.I18nImage;
import com.fr.general.locale.image.LocaleImageMark;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.CoreGraphHelper; import com.fr.stable.CoreGraphHelper;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -61,11 +60,10 @@ public class ChartEmptyDataStylePane extends AbstractAttrNoScrollPane {
private Image emptyDataImage = DEFAULT_EMPTY_DATA_IMAGE; private Image emptyDataImage = DEFAULT_EMPTY_DATA_IMAGE;
private SwingWorker<Void, Void> imageWorker; private SwingWorker<Void, Void> imageWorker;
private static final String EMPTY_DATA_IMAGE_PATH = "/com/fr/design/images/emptydata.png"; private static final String EMPTY_DATA_IMAGE_PATH = "/com/fr/design/images/emptydata/emptydata.png";
static { static {;
LocaleImageMark localeImageMark = LocaleImageFactory.getOrCreateLocaleMark(EMPTY_DATA_IMAGE_PATH); DEFAULT_EMPTY_DATA_IMAGE = I18nImage.getImage(EMPTY_DATA_IMAGE_PATH);
DEFAULT_EMPTY_DATA_IMAGE = localeImageMark.getValue();
} }
@Override @Override

17
designer-chart/src/main/java/com/fr/van/chart/DownloadOnlineSourcesHelper.java

@ -12,6 +12,7 @@ import com.fr.general.CloudCenter;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.SiteBlockedException; import com.fr.general.SiteBlockedException;
import com.fr.general.http.HttpClient; import com.fr.general.http.HttpClient;
import com.fr.general.locale.image.I18nImage;
import com.fr.plugin.chart.DownloadSourcesEvent; import com.fr.plugin.chart.DownloadSourcesEvent;
import com.fr.stable.CommonUtils; import com.fr.stable.CommonUtils;
import com.fr.stable.StableUtils; import com.fr.stable.StableUtils;
@ -23,20 +24,19 @@ import javax.swing.JFrame;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JProgressBar; import javax.swing.JProgressBar;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Rectangle;
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.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import static com.fr.design.dialog.FineJOptionPane.OPTION_OK_CANCEL; import static com.fr.design.dialog.FineJOptionPane.OPTION_OK_CANCEL;
@ -65,7 +65,7 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent {
private double totalBytes = 0; private double totalBytes = 0;
private static final double MAP_JSON_MB = 4.5 * 1024 * 1024; private static final double MAP_JSON_MB = 4.5 * 1024 * 1024;
private static final String BACKGROUND_IMAGE_URL = "com/fr/van/chart/background/background.png";
public void addMapJSONSiteInfo() { public void addMapJSONSiteInfo() {
this.addSiteInfo("map10.json", ChartConstants.MAP_JSON_URL, MAP_JSON_MB); this.addSiteInfo("map10.json", ChartConstants.MAP_JSON_URL, MAP_JSON_MB);
} }
@ -189,8 +189,7 @@ public class DownloadOnlineSourcesHelper implements DownloadSourcesEvent {
private void initDialog() { private void initDialog() {
// 创建标签,并在标签上放置一张图片 // 创建标签,并在标签上放置一张图片
BufferedImage image = IOUtils.readImage("/com/fr/van/chart/background.png"); ImageIcon imageIcon = new ImageIcon(I18nImage.getImage(BACKGROUND_IMAGE_URL));
ImageIcon imageIcon = new ImageIcon(image);
UILabel label = new UILabel(imageIcon); UILabel label = new UILabel(imageIcon);
label.setBounds(0, 0, LOAD_WIDTH, LOAD_HEIGHT); label.setBounds(0, 0, LOAD_WIDTH, LOAD_HEIGHT);

0
designer-chart/src/main/resources/com/fr/design/images/en_us_emptydata.png → designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata.png

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_en.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

0
designer-chart/src/main/resources/com/fr/design/images/zh_cn_emptydata.png → designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_zh.png

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

0
designer-chart/src/main/resources/com/fr/design/images/zh_tw_emptydata.png → designer-chart/src/main/resources/com/fr/design/images/emptydata/emptydata_zh_TW.png

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

BIN
designer-chart/src/main/resources/com/fr/van/chart/background/background.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
designer-chart/src/main/resources/com/fr/van/chart/background/background_en.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

0
designer-chart/src/main/resources/com/fr/van/chart/background.png → designer-chart/src/main/resources/com/fr/van/chart/background/background_zh.png

Before

Width:  |  Height:  |  Size: 105 KiB

After

Width:  |  Height:  |  Size: 105 KiB

BIN
designer-chart/src/main/resources/com/fr/van/chart/background/background_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

9
designer-form/src/main/java/com/fr/design/designer/creator/XAutoChartCreator.java

@ -12,13 +12,14 @@ import com.fr.design.mainframe.EditingMouseListener;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.module.DesignModuleFactory; import com.fr.design.module.DesignModuleFactory;
import com.fr.form.ui.ChartAutoEditor; import com.fr.form.ui.ChartAutoEditor;
import com.fr.general.IOUtils; import com.fr.general.locale.image.I18nImage;
import com.fr.stable.Constants; import com.fr.stable.Constants;
import com.fr.stable.bridge.StableFactory; import com.fr.stable.bridge.StableFactory;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JPanel; import javax.swing.JPanel;
import java.awt.*; import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
@ -38,6 +39,8 @@ public class XAutoChartCreator extends XChartEditor {
super(editor, size); super(editor, size);
} }
private static final String AUTO_CHART_IMAGE_PATH = "com/fr/design/form/images/autochartpreview/auto_chart_preview.png";
/** /**
* 返回组件默认名 * 返回组件默认名
* *
@ -103,7 +106,7 @@ public class XAutoChartCreator extends XChartEditor {
@Override @Override
public void paintForeground(Graphics2D g) { public void paintForeground(Graphics2D g) {
BufferedImage bufferedImage = IOUtils.readImage("com/fr/design/form/images/auto_chart_preview.png"); BufferedImage bufferedImage = I18nImage.getImage(AUTO_CHART_IMAGE_PATH);
GraphHelper.paintImage( GraphHelper.paintImage(
g, this.getWidth(), this.getHeight(), bufferedImage, g, this.getWidth(), this.getHeight(), bufferedImage,
Constants.IMAGE_ADJUST, Constants.IMAGE_ADJUST,

4
designer-form/src/main/java/com/fr/design/designer/creator/XNumberEditor.java

@ -102,4 +102,8 @@ public class XNumberEditor extends XWrapperedFieldEditor {
return "number_field_16.png"; return "number_field_16.png";
} }
// @Override
// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() {
// return new WidgetPropertyUIProvider[]{new NumberEditorMobilePropertyUI(this)};
// }
} }

4
designer-form/src/main/java/com/fr/design/designer/creator/XPassword.java

@ -68,4 +68,8 @@ public class XPassword extends XWrapperedFieldEditor {
(CRPropertyDescriptor[]) ArrayUtils.addAll(sup, new CRPropertyDescriptor[]{regex, waterMark}); (CRPropertyDescriptor[]) ArrayUtils.addAll(sup, new CRPropertyDescriptor[]{regex, waterMark});
} }
// @Override
// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() {
// return new WidgetPropertyUIProvider[]{new PasswordMobilePropertyUI(this)};
// }
} }

3
designer-form/src/main/java/com/fr/design/designer/creator/XPicture.java

@ -9,6 +9,7 @@ import com.fr.design.mainframe.widget.renderer.PictureRenderer;
import com.fr.design.mainframe.widget.renderer.UrlLinkRenderer; import com.fr.design.mainframe.widget.renderer.UrlLinkRenderer;
import com.fr.form.ui.PictureWidget; import com.fr.form.ui.PictureWidget;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.locale.image.I18nImage;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Image; import java.awt.Image;
@ -59,7 +60,7 @@ public class XPicture extends XWidgetCreator {
imgPanel.setBackgroundImage((Image) value); imgPanel.setBackgroundImage((Image) value);
imgPanel.setImageDisplayMode(pictureWidget.getShowType()); imgPanel.setImageDisplayMode(pictureWidget.getShowType());
} else { } else {
imgPanel.setBackgroundImage(IOUtils.readImage("com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png")); imgPanel.setBackgroundImage(I18nImage.getImage("/com/fr/design/images/form/designer/widget/picture_widget_designer_bg.png"));
imgPanel.setImageDisplayMode(0); imgPanel.setImageDisplayMode(0);
} }
this.editor.add(imgPanel, "Center"); this.editor.add(imgPanel, "Center");

9
designer-form/src/main/java/com/fr/design/designer/creator/XTextArea.java

@ -25,8 +25,9 @@ import java.beans.IntrospectionException;
/** /**
* @author richer * @author richer
* @since 6.5.3 * @since 6.5.3
* Created on 2016/3/29
*/ */
public class XTextArea extends XFieldEditor { public class XTextArea extends XWrapperedFieldEditor {
public XTextArea(TextArea widget, Dimension initSize) { public XTextArea(TextArea widget, Dimension initSize) {
super(widget, initSize); super(widget, initSize);
@ -81,4 +82,10 @@ public class XTextArea extends XFieldEditor {
protected String getIconName() { protected String getIconName() {
return "text_area_16.png"; return "text_area_16.png";
} }
// @Override
// public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() {
// return new WidgetPropertyUIProvider[]{new TextAreaMobilePropertyUI(this)};
// }
} }

4
designer-form/src/main/java/com/fr/design/designer/creator/XTextEditor.java

@ -6,7 +6,7 @@ package com.fr.design.designer.creator;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.base.ScreenResolution; import com.fr.base.ScreenResolution;
import com.fr.base.Style; import com.fr.base.Style;
import com.fr.design.designer.properties.mobile.ScanCodeMobilePropertyUI; import com.fr.design.designer.properties.mobile.TextEditorMobilePropertyUI;
import com.fr.design.form.util.XCreatorConstants; import com.fr.design.form.util.XCreatorConstants;
import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.fun.WidgetPropertyUIProvider;
import com.fr.design.mainframe.widget.editors.RegexEditor; import com.fr.design.mainframe.widget.editors.RegexEditor;
@ -86,6 +86,6 @@ public class XTextEditor extends XWrapperedFieldEditor {
@Override @Override
public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() { public WidgetPropertyUIProvider[] getWidgetPropertyUIProviders() {
return new WidgetPropertyUIProvider[] {new ScanCodeMobilePropertyUI(this)}; return new WidgetPropertyUIProvider[]{new TextEditorMobilePropertyUI(this)};
} }
} }

110
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java

@ -10,6 +10,7 @@ import com.fr.design.designer.beans.models.SelectionModel;
import com.fr.design.designer.creator.XButton; import com.fr.design.designer.creator.XButton;
import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XLayoutContainer;
import com.fr.design.designer.creator.XWAbsoluteLayout;
import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
@ -25,16 +26,27 @@ import com.fr.form.ui.container.WTabTextDirection;
import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout;
import com.fr.general.Background; import com.fr.general.Background;
import com.fr.general.act.BorderPacker;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont; import com.fr.general.FRFont;
import com.fr.general.act.BorderPacker;
import com.fr.general.act.TitlePacker; import com.fr.general.act.TitlePacker;
import com.fr.general.cardtag.TemplateStyle; import com.fr.general.cardtag.TemplateStyle;
import com.fr.stable.unit.PT; import com.fr.stable.unit.PT;
import javax.swing.*; import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.SwingUtilities;
import javax.swing.plaf.basic.BasicLabelUI; import javax.swing.plaf.basic.BasicLabelUI;
import java.awt.*; import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.awt.geom.Rectangle2D; import java.awt.geom.Rectangle2D;
import java.util.ArrayList; import java.util.ArrayList;
@ -236,52 +248,43 @@ public class XCardSwitchButton extends XButton {
//SwitchButton对应的XWCardLayout和XWCardTagLayout暂未存到xml中,重新打开时根据父子层关系获取 //SwitchButton对应的XWCardLayout和XWCardTagLayout暂未存到xml中,重新打开时根据父子层关系获取
private void initRelateLayout(){ private void initRelateLayout() {
this.tagLayout = (XWCardTagLayout)this.getBackupParent(); this.tagLayout = (XWCardTagLayout) this.getBackupParent();
XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.tagLayout.getBackupParent(); XWCardTitleLayout titleLayout = (XWCardTitleLayout) this.tagLayout.getBackupParent();
XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout)titleLayout.getBackupParent(); XWCardMainBorderLayout borderLayout = (XWCardMainBorderLayout) titleLayout.getBackupParent();
this.cardLayout = borderLayout.getCardPart(); this.cardLayout = borderLayout.getCardPart();
} }
//是否进入点击关闭按钮区域 /**
private boolean isSelectedClose(MouseEvent e, FormDesigner designer){ * <p> 是否进入点击关闭按钮区域
* <p> 计算逻辑
* <p> 先得到鼠标的绝对坐标 -> tab布局的绝对坐标 -> 得到鼠标相对tab的坐标有参数面板时要减去参数面板的高度
* <p> 再计算删除区域位置的相对坐标通过对比判定鼠标是否在点击关闭按钮区域内鼠标的位置(ex,ey)
* <li> 当前点击tag删除区域的x坐标 < ex < 当前点击tag删除区域的x坐标 + 偏移量</li>
* <li> 当前点击tag删除区域的y坐标 < ey < 当前点击tag删除区域的y坐标 + 偏移量</li>
*
* @param e 鼠标事件
* @param designer 表单编辑对象
* @return true/false 在内/不在
*/
private boolean isSelectedClose(MouseEvent e, FormDesigner designer) {
int diff = designer.getHorizontalScaleValue(); int diff = designer.getHorizontalScaleValue();
// mouse position // mouse position
// 这里是鼠标的绝对位置
int ex = e.getX() + diff; int ex = e.getX() + diff;
int ey = e.getY(); int ey = e.getY();
// 获取tab布局的位置,鼠标相对于tab按钮的位置
//获取tab布局的位置,鼠标相对于tab按钮的位置 double[] tabPositionInBody = getTabAbsolutePositionInBody();
Container mainLayout = cardLayout.getBackupParent();
Point point = mainLayout.getLocation();
int y = 0;
int x = 0;
//遍历一下,不然是相对位置,嵌套后位置不对
while (mainLayout.getParent() != null){
if(mainLayout instanceof XWCardLayout){
y += mainLayout.getY();
}
mainLayout = mainLayout.getParent();
if(mainLayout instanceof XWCardMainBorderLayout){
x += mainLayout.getX();
y += mainLayout.getY();
}
}
double mainX = point.getX() + x;
double mainY = point.getY() + y;
// 参数界面对坐标的影响 // 参数界面对坐标的影响
JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate();
if(jform.getFormDesign().getParaComponent() != null){ if (jform.getFormDesign().getParaComponent() != null) {
ey -= jform.getFormDesign().getParaHeight(); ey -= jform.getFormDesign().getParaHeight();
} }
//减掉tab布局的相对位置 //减掉tab布局的相对位置
ex -= mainX; ex -= tabPositionInBody[0];
ey -= mainY; ey -= tabPositionInBody[1];
XLayoutContainer titleLayout = tagLayout.getBackupParent(); XLayoutContainer titleLayout = tagLayout.getBackupParent();
Point titlePoint = titleLayout.getLocation(); Point titlePoint = titleLayout.getLocation();
@ -291,10 +294,43 @@ public class XCardSwitchButton extends XButton {
int width = button.getWidth(); int width = button.getWidth();
// 鼠标进入按钮右侧删除图标区域 // 鼠标进入按钮右侧删除图标区域
double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET); double recX = position.getX() + titlePoint.getX() + (width - CLOSE_ICON_RIGHT_OFFSET);
double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET; double recY = position.getY() + titlePoint.getY() + CLOSE_ICON_TOP_OFFSET;
// 比较的是相对位置的偏移量是否在一定距离内
// 所以要得到鼠标相对于当前tab块的坐标
return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY());
}
/**
* 获取tab布局在body内的绝对位置
*
* @return
*/
private double[] getTabAbsolutePositionInBody() {
// 获取tab布局的位置,鼠标相对于tab按钮的位置
Container mainLayout = cardLayout.getBackupParent();
// 这个point是当前tab布局的相对坐标,是相对于父容器的坐标
// 比如父级是一个absolute块,放在左上角,现在得到的point就是(0,0)
Point point = mainLayout.getLocation();
int y = 0;
int x = 0;
// 遍历一下,不然是相对位置,嵌套后位置不对
// 这里是要得到tab布局的绝对位置,所以要加上父组件的位置
while (mainLayout.getParent() != null) {
if (mainLayout instanceof XWCardLayout) {
y += mainLayout.getY();
}
mainLayout = mainLayout.getParent();
return (recX < ex && ex < recX + CLOSE_ICON_RIGHT_OFFSET && ey < recY && ey > position.getY()); if ((mainLayout instanceof XWCardMainBorderLayout) || (mainLayout instanceof XWAbsoluteLayout)) {
x += mainLayout.getX();
y += mainLayout.getY();
}
}
double mainX = point.getX() + x;
double mainY = point.getY() + y;
return new double[]{mainX, mainY};
} }
//将当前switchButton改为选中状态 //将当前switchButton改为选中状态
@ -306,7 +342,7 @@ public class XCardSwitchButton extends XButton {
} }
} }
@Override @Override
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
super.paintComponent(g); super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g; Graphics2D g2d = (Graphics2D) g;

37
designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java

@ -24,21 +24,25 @@ import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.gui.imenu.UIPopupMenu;
import com.fr.design.mainframe.EditingMouseListener; import com.fr.design.mainframe.EditingMouseListener;
import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesigner;
import com.fr.design.mainframe.FormHierarchyTreePane;
import com.fr.design.mainframe.WidgetPropertyPane; import com.fr.design.mainframe.WidgetPropertyPane;
import com.fr.design.utils.gui.LayoutUtils;
import com.fr.form.ui.CardSwitchButton; import com.fr.form.ui.CardSwitchButton;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.WTabDisplayPosition; import com.fr.form.ui.container.WTabDisplayPosition;
import com.fr.form.ui.container.cardlayout.WCardTagLayout; import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.form.ui.container.cardlayout.WTabFitLayout; import com.fr.form.ui.container.cardlayout.WTabFitLayout;
import com.fr.general.act.BorderPacker;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont; import com.fr.general.FRFont;
import com.fr.general.act.BorderPacker;
import com.fr.general.cardtag.DefaultTemplateStyle; import com.fr.general.cardtag.DefaultTemplateStyle;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import javax.swing.border.Border; import javax.swing.border.Border;
import java.awt.*; import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Rectangle;
import java.awt.event.ContainerEvent; import java.awt.event.ContainerEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import java.util.HashMap; import java.util.HashMap;
@ -434,7 +438,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
} }
private void fixTitleLayout(XLayoutContainer parent){ private void fixTitleLayout(XLayoutContainer parent) {
FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner(); FormDesigner formDesigner = WidgetPropertyPane.getInstance().getEditingFormDesigner();
LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent); LayoutAdapter layoutAdapter = AdapterBus.searchLayoutAdapter(formDesigner, parent);
if (layoutAdapter != null) { if (layoutAdapter != null) {
@ -443,4 +447,31 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout {
} }
} }
/**
* <p> 对于tab组件WCardMainBorderLayout里面有两个子容器:
* <li> WCardTitleLayout里面包含两个部分一个是CardAddButton另一个是WCardTagLayout - tabpane0 </li>
* <li> WCardLayout里面放的是WTabFitLayout - tab00tab10</li>
* <p> 在右侧组件树选择删除WCardTagLayout时tabpane0按照现在的产品逻辑应该删除整个tab组件
*
* @param creator 组件
* @param designer 表单设计器
*/
@Override
public void deleteRelatedComponent(XCreator creator, FormDesigner designer) {
XWCardTagLayout tagLayout = (XWCardTagLayout) creator;
// 先删除所有tab按钮
tagLayout.removeAll();
//逐层回溯找出最外层的XWCardMainBorderLayout
XWCardTitleLayout cardTitleLayout = (XWCardTitleLayout) tagLayout.getBackupParent();
XWCardMainBorderLayout mainLayout = (XWCardMainBorderLayout) cardTitleLayout.getBackupParent();
// 删除tab布局
SelectionModel selectionModel = designer.getSelectionModel();
if (mainLayout != null) {
selectionModel.setSelectedCreator(mainLayout);
selectionModel.deleteSelection();
}
LayoutUtils.layoutRootContainer(designer.getRootComponent());
FormHierarchyTreePane.getInstance().refreshRoot();
selectionModel.setSelectedCreator(designer.getRootComponent());
}
} }

37
designer-form/src/main/java/com/fr/design/designer/properties/mobile/NumberEditorMobilePropertyUI.java

@ -0,0 +1,37 @@
package com.fr.design.designer.properties.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider;
import com.fr.design.gui.itable.AbstractPropertyTable;
import com.fr.design.widget.ui.designer.mobile.NumberEditorMobileDefinePane;
/**
* 数字控件属性面板注册
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class NumberEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
private XCreator xCreator;
public NumberEditorMobilePropertyUI(XCreator xCreator) {
this.xCreator = xCreator;
}
@Override
public AbstractPropertyTable createWidgetAttrTable() {
return null;
}
@Override
public BasicPane createWidgetAttrPane() {
return new NumberEditorMobileDefinePane(xCreator);
}
@Override
public String tableTitle() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr");
}
}

37
designer-form/src/main/java/com/fr/design/designer/properties/mobile/PasswordMobilePropertyUI.java

@ -0,0 +1,37 @@
package com.fr.design.designer.properties.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider;
import com.fr.design.gui.itable.AbstractPropertyTable;
import com.fr.design.widget.ui.designer.mobile.PasswordMobileDefinePane;
/**
* 密码控件移动端属性注册
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class PasswordMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
private XCreator xCreator;
public PasswordMobilePropertyUI(XCreator xCreator) {
this.xCreator = xCreator;
}
@Override
public AbstractPropertyTable createWidgetAttrTable() {
return null;
}
@Override
public BasicPane createWidgetAttrPane() {
return new PasswordMobileDefinePane(xCreator);
}
@Override
public String tableTitle() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr");
}
}

37
designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextAreaMobilePropertyUI.java

@ -0,0 +1,37 @@
package com.fr.design.designer.properties.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider;
import com.fr.design.gui.itable.AbstractPropertyTable;
import com.fr.design.widget.ui.designer.mobile.TextAreaAdvancedDefinePane;
/**
* 文本域控件移动端属性
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/29
*/
public class TextAreaMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
private XCreator xCreator;
public TextAreaMobilePropertyUI(XCreator xCreator) {
this.xCreator = xCreator;
}
@Override
public AbstractPropertyTable createWidgetAttrTable() {
return null;
}
@Override
public BasicPane createWidgetAttrPane() {
return new TextAreaAdvancedDefinePane(xCreator);
}
@Override
public String tableTitle() {
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Mobile_Attr");
}
}

15
designer-form/src/main/java/com/fr/design/designer/properties/mobile/ScanCodeMobilePropertyUI.java → designer-form/src/main/java/com/fr/design/designer/properties/mobile/TextEditorMobilePropertyUI.java

@ -5,13 +5,20 @@ import com.fr.design.designer.creator.XTextEditor;
import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.BasicPane;
import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider; import com.fr.design.fun.impl.AbstractWidgetPropertyUIProvider;
import com.fr.design.gui.itable.AbstractPropertyTable; import com.fr.design.gui.itable.AbstractPropertyTable;
import com.fr.design.widget.ui.designer.mobile.ScanCodeMobileDefinePane; import com.fr.design.widget.ui.designer.mobile.TextEditorMobileDefinePane;
public class ScanCodeMobilePropertyUI extends AbstractWidgetPropertyUIProvider { /**
* 文本控件
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class TextEditorMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
private XCreator xCreator; private XCreator xCreator;
public ScanCodeMobilePropertyUI(XTextEditor xTextEditor) { public TextEditorMobilePropertyUI(XTextEditor xTextEditor) {
this.xCreator = xTextEditor; this.xCreator = xTextEditor;
} }
@ -22,7 +29,7 @@ public class ScanCodeMobilePropertyUI extends AbstractWidgetPropertyUIProvider {
@Override @Override
public BasicPane createWidgetAttrPane() { public BasicPane createWidgetAttrPane() {
return new ScanCodeMobileDefinePane(xCreator); return new TextEditorMobileDefinePane(xCreator);
} }
@Override @Override

6
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardMainLayoutDefinePane.java

@ -7,16 +7,13 @@ import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ilable.UILabel;
import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.ispinner.UISpinner;
import com.fr.design.gui.xpane.CardTagLayoutStylePane; import com.fr.design.gui.xpane.CardTagLayoutStylePane;
import com.fr.design.gui.xpane.LayoutStylePane;
import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.layout.TableLayoutHelper; import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.mainframe.widget.accessibles.AccessibleCardTagWLayoutBorderStyleEditor;
import com.fr.design.widget.ui.designer.AbstractDataModify; import com.fr.design.widget.ui.designer.AbstractDataModify;
import com.fr.form.ui.LayoutBorderStyle; import com.fr.form.ui.LayoutBorderStyle;
import com.fr.form.ui.container.WCardLayout; import com.fr.form.ui.container.WCardLayout;
import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout; import com.fr.form.ui.container.cardlayout.WCardMainBorderLayout;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
import javax.swing.JPanel; import javax.swing.JPanel;
import java.awt.BorderLayout; import java.awt.BorderLayout;
@ -72,6 +69,9 @@ public class WCardMainLayoutDefinePane extends AbstractDataModify<WCardMainBorde
@Override @Override
public void populateBean(WCardMainBorderLayout ob) { public void populateBean(WCardMainBorderLayout ob) {
WCardLayout cardLayout = ob.getCardPart(); WCardLayout cardLayout = ob.getCardPart();
if (cardLayout == null) {
return;
}
stylePane.populateBean((LayoutBorderStyle) cardLayout.getBorderStyle()); stylePane.populateBean((LayoutBorderStyle) cardLayout.getBorderStyle());
setCarousel.setSelected(cardLayout.isCarousel()); setCarousel.setSelected(cardLayout.isCarousel());
IntervalPane.setVisible(cardLayout.isCarousel()); IntervalPane.setVisible(cardLayout.isCarousel());

6
designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/WCardTagLayoutDefinePane.java

@ -24,7 +24,6 @@ import com.fr.form.ui.container.cardlayout.WCardTagLayout;
import com.fr.general.Background; import com.fr.general.Background;
import com.fr.general.ComparatorUtils; import com.fr.general.ComparatorUtils;
import com.fr.general.FRFont; import com.fr.general.FRFont;
import com.fr.general.cardtag.TemplateStyle; import com.fr.general.cardtag.TemplateStyle;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
@ -107,8 +106,11 @@ public class WCardTagLayoutDefinePane extends AbstractDataModify<WCardTagLayout>
public void populateBean(WCardTagLayout ob) { public void populateBean(WCardTagLayout ob) {
//标题背景和字体属性设置在WCardLayout上做兼容 //标题背景和字体属性设置在WCardLayout上做兼容
XLayoutContainer topLayout = creator.getTopLayout(); XLayoutContainer topLayout = creator.getTopLayout();
if (topLayout.getComponentCount() == 0) {
// 没有子组件,不用做处理
return;
}
LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle(); LayoutBorderStyle layoutBorderStyle = (LayoutBorderStyle) ((XWCardMainBorderLayout) topLayout).getCardPart().toData().getBorderStyle();
displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType()); displayPositionGroup.setSelectedIndex(ob.getDisplayPosition().getType());
textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType()); textDirectionGroup.setSelectedIndex(ob.getTextDirection().getType());
backgroundEditor.setValue(layoutBorderStyle.getTitle().getBackground()); backgroundEditor.setValue(layoutBorderStyle.getTitle().getBackground());

94
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/BaseTextEditorMobileDefinePane.java

@ -0,0 +1,94 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane;
import com.fr.form.ui.TextEditor;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
/**
* <p> 文本类组件移动端高级属性的定义面板基础扩展可以直接继承此面板
* <p> 往内部添加其他配置
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class BaseTextEditorMobileDefinePane extends MobileWidgetDefinePane {
private XCreator xCreator;
protected MobileTextEditSettingPane textSettingPane;
public BaseTextEditorMobileDefinePane(XCreator xCreator) {
this.xCreator = xCreator;
}
@Override
public void initPropertyGroups(Object source) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5);
addPropertyPanesToContainer(container);
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH);
this.repaint();
}
/**
* 添加其他属性面板
*
* @param container 展开容器
*/
protected void addPropertyPanesToContainer(JPanel container) {
initSettingPane(container);
}
/**
* 初始化文本类基础面板
*
* @param container
*/
protected void initSettingPane(JPanel container) {
textSettingPane = new MobileTextEditSettingPane();
container.add(textSettingPane);
}
@Override
public void populate(FormDesigner designer) {
TextEditor textEditor = (TextEditor) xCreator.toData();
textSettingPane.populateBean(textEditor.getMobileTextEditAttr());
this.bindListeners2Widgets();
}
protected void bindListeners2Widgets() {
reInitAllListeners();
AttributeChangeListener changeListener = new AttributeChangeListener() {
@Override
public void attributeChange() {
update();
}
};
this.addAttributeChangeListener(changeListener);
}
private void reInitAllListeners() {
initListener(this);
}
@Override
public void update() {
TextEditor textEditor = (TextEditor) xCreator.toData();
textSettingPane.updateBean(textEditor.getMobileTextEditAttr());
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified();
}
public XCreator getxCreator() {
return xCreator;
}
}

33
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/NumberEditorMobileDefinePane.java

@ -0,0 +1,33 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.form.ui.NumberEditor;
/**
* 数字控件
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class NumberEditorMobileDefinePane extends BaseTextEditorMobileDefinePane {
public NumberEditorMobileDefinePane(XCreator xCreator) {
super(xCreator);
}
@Override
public void populate(FormDesigner designer) {
NumberEditor numberEditor = (NumberEditor) getxCreator().toData();
textSettingPane.populateBean(numberEditor.getMobileTextEditAttr());
this.bindListeners2Widgets();
}
@Override
public void update() {
NumberEditor numberEditor = (NumberEditor) getxCreator().toData();
textSettingPane.updateBean(numberEditor.getMobileTextEditAttr());
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified();
}
}

25
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/PasswordMobileDefinePane.java

@ -0,0 +1,25 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.widget.ui.designer.mobile.component.MobilePasswordEditSettingPane;
import javax.swing.JPanel;
/**
* 密码控件移动端高级属性
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class PasswordMobileDefinePane extends BaseTextEditorMobileDefinePane {
public PasswordMobileDefinePane(XCreator xCreator) {
super(xCreator);
}
@Override
protected void initSettingPane(JPanel container) {
textSettingPane = new MobilePasswordEditSettingPane();
container.add(textSettingPane);
}
}

63
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/ScanCodeMobileDefinePane.java

@ -1,63 +0,0 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.base.mobile.MobileScanCodeAttr;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.gui.frpane.AttributeChangeListener;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane;
import com.fr.form.ui.TextEditor;
import java.awt.BorderLayout;
public class ScanCodeMobileDefinePane extends MobileWidgetDefinePane {
private XCreator xCreator;
private MobileTextFieldInputSettingPane settingPane;
public ScanCodeMobileDefinePane(XCreator xCreator) {
this.xCreator = xCreator;
}
@Override
public void initPropertyGroups(Object source) {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
settingPane = new MobileTextFieldInputSettingPane();
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, settingPane), BorderLayout.NORTH);
this.repaint();
}
private void bindListeners2Widgets() {
reInitAllListeners();
AttributeChangeListener changeListener = new AttributeChangeListener() {
@Override
public void attributeChange() {
update();
}
};
this.addAttributeChangeListener(changeListener);
}
private void reInitAllListeners() {
initListener(this);
}
@Override
public void populate(FormDesigner designer) {
MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr();
settingPane.populateBean(mobileScanCodeAttr);
this.bindListeners2Widgets();
}
@Override
public void update() {
MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) xCreator.toData()).getMobileScanCodeAttr();
settingPane.updateBean(mobileScanCodeAttr);
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified();
}
}

25
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextAreaAdvancedDefinePane.java

@ -0,0 +1,25 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextAreaSettingPane;
import javax.swing.JPanel;
/**
* 文本域控件
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/29
*/
public class TextAreaAdvancedDefinePane extends BaseTextEditorMobileDefinePane {
public TextAreaAdvancedDefinePane(XCreator xCreator) {
super(xCreator);
}
@Override
protected void initSettingPane(JPanel container) {
textSettingPane = new MobileTextAreaSettingPane();
container.add(textSettingPane);
}
}

55
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/TextEditorMobileDefinePane.java

@ -0,0 +1,55 @@
package com.fr.design.widget.ui.designer.mobile;
import com.fr.design.designer.creator.XCreator;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.FormDesigner;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane;
import com.fr.form.ui.TextEditor;
import javax.swing.JPanel;
/**
* 文本控件移动端属性
* 输入方式
* 输入框属性
*
* @author hades
* @since 11.0
* Created on 2018/11/27
*/
public class TextEditorMobileDefinePane extends BaseTextEditorMobileDefinePane {
/**
* 输入方式
*/
private MobileTextFieldInputSettingPane inputSettingPane;
public TextEditorMobileDefinePane(XCreator xCreator) {
super(xCreator);
}
@Override
protected void initSettingPane(JPanel container) {
inputSettingPane = new MobileTextFieldInputSettingPane();
// textSettingPane = new MobileTextEditSettingPane();
container.add(inputSettingPane);
// container.add(textSettingPane);
}
@Override
public void populate(FormDesigner designer) {
TextEditor textEditor = (TextEditor) getxCreator().toData();
inputSettingPane.populateBean(textEditor.getMobileScanCodeAttr());
// textSettingPane.populateBean(textEditor.getMobileTextEditAttr());
this.bindListeners2Widgets();
}
@Override
public void update() {
TextEditor textEditor = (TextEditor) getxCreator().toData();
inputSettingPane.updateBean(textEditor.getMobileScanCodeAttr());
// textSettingPane.updateBean(textEditor.getMobileTextEditAttr());
DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified();
}
}

38
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobilePasswordEditSettingPane.java

@ -0,0 +1,38 @@
package com.fr.design.widget.ui.designer.mobile.component;
import com.fr.base.mobile.MobileTextEditAttr;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.i18n.Toolkit;
import java.awt.BorderLayout;
/**
* 密码控件编辑属性设置面板
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/30
*/
public class MobilePasswordEditSettingPane extends MobileTextEditSettingPane {
// 显示密码
private UICheckBox showPassword;
public MobilePasswordEditSettingPane() {
super();
showPassword = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Password"), false);
this.add(showPassword, BorderLayout.NORTH);
}
@Override
public void populateBean(MobileTextEditAttr ob) {
super.populateBean(ob);
// 要兼容处理一下,为null 的话赋默认值,默认开启
this.showPassword.setSelected(ob.isShowPassword() == null || ob.isShowPassword());
}
@Override
public void updateBean(MobileTextEditAttr ob) {
super.updateBean(ob);
ob.setShowPassword(showPassword.isSelected());
}
}

43
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextAreaSettingPane.java

@ -0,0 +1,43 @@
package com.fr.design.widget.ui.designer.mobile.component;
import com.fr.base.mobile.MobileTextEditAttr;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.i18n.Toolkit;
import java.awt.BorderLayout;
/**
* 文本域控件
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/29
*/
public class MobileTextAreaSettingPane extends MobileTextEditSettingPane {
// 显示字数统计
private UICheckBox showWordCount;
public MobileTextAreaSettingPane() {
super();
showWordCount = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Show_Word_Count"), false);
this.add(showWordCount, BorderLayout.NORTH);
}
@Override
protected boolean getClearDefaultState() {
return false;
}
@Override
public void populateBean(MobileTextEditAttr ob) {
super.populateBean(ob);
// 要兼容处理一下,为null 的话赋默认值,默认不开启
this.showWordCount.setSelected(ob.isShowWordCount() != null && ob.isShowWordCount());
}
@Override
public void updateBean(MobileTextEditAttr ob) {
super.updateBean(ob);
ob.setShowWordCount(showWordCount.isSelected());
}
}

59
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextEditSettingPane.java

@ -0,0 +1,59 @@
package com.fr.design.widget.ui.designer.mobile.component;
import com.fr.base.mobile.MobileTextEditAttr;
import com.fr.design.beans.BasicBeanPane;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.VerticalFlowLayout;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
/**
* 文本类基础设置
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/3/29
*/
public class MobileTextEditSettingPane extends BasicBeanPane<MobileTextEditAttr> {
// 允许一键清空
protected UICheckBox allowOneClickClear;
public MobileTextEditSettingPane() {
initLayout();
allowOneClickClear = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Allow_One_Click_Clear"), getClearDefaultState());
this.add(allowOneClickClear, BorderLayout.NORTH);
}
protected boolean getClearDefaultState() {
return true;
}
protected void initLayout() {
VerticalFlowLayout verticalFlowLayout = new VerticalFlowLayout(FlowLayout.LEADING, 0, 5);
verticalFlowLayout.setAlignLeft(true);
this.setLayout(verticalFlowLayout);
}
@Override
public void populateBean(MobileTextEditAttr ob) {
allowOneClickClear.setSelected(ob.isAllowOneClickClear() == null || ob.isAllowOneClickClear());
}
@Override
public MobileTextEditAttr updateBean() {
// do nothing
return null;
}
@Override
public void updateBean(MobileTextEditAttr ob) {
ob.setAllowOneClickClear(allowOneClickClear.isSelected());
}
@Override
protected String title4PopupWindow() {
return null;
}
}

35
designer-form/src/main/java/com/fr/design/widget/ui/designer/mobile/component/MobileTextFieldInputSettingPane.java

@ -2,16 +2,21 @@ package com.fr.design.widget.ui.designer.mobile.component;
import com.fr.base.mobile.MobileScanCodeAttr; import com.fr.base.mobile.MobileScanCodeAttr;
import com.fr.design.beans.BasicBeanPane; import com.fr.design.beans.BasicBeanPane;
import com.fr.design.constants.LayoutConstants;
import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ibutton.UIRadioButton;
import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icheckbox.UICheckBox;
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;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.design.layout.VerticalFlowLayout; import com.fr.design.layout.VerticalFlowLayout;
import javax.swing.ButtonGroup; import javax.swing.ButtonGroup;
import javax.swing.JPanel; import javax.swing.JPanel;
import java.awt.BorderLayout; import java.awt.BorderLayout;
import java.awt.FlowLayout; import java.awt.Component;
import java.awt.Dimension;
/** /**
* @author hades * @author hades
@ -31,7 +36,6 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane<MobileScanCod
public MobileTextFieldInputSettingPane() { public MobileTextFieldInputSettingPane() {
this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.setLayout(FRGUIPaneFactory.createBorderLayout());
JPanel settingPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 5);
manualInputCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Manual_Input"), true); manualInputCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Manual_Input"), true);
scanCodeCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Scan_Code_Input"), true); scanCodeCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_Scan_Code_Input"), true);
nfcInputCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_NFC_Input"), false); nfcInputCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Mobile_NFC_Input"), false);
@ -40,12 +44,25 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane<MobileScanCod
// 更新面板是否可见 // 更新面板是否可见
updateNfcContentTypePane(source.isSelected(), nfcContentTypePane.getSelectedType()); updateNfcContentTypePane(source.isSelected(), nfcContentTypePane.getSelectedType());
}); });
settingPane.add(manualInputCheckBox); initComponents();
settingPane.add(scanCodeCheckBox);
settingPane.add(nfcInputCheckBox);
settingPane.add(nfcContentTypePane);
// 初始状态,内容类型面板不可见 // 初始状态,内容类型面板不可见
nfcContentTypePane.setVisible(false); nfcContentTypePane.setVisible(false);
nfcContentTypePane.setPreferredSize(new Dimension(0, 0));
}
private void initComponents() {
Component[][] components = new Component[][]{
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Mobile_Input_Way")), manualInputCheckBox},
new Component[]{null, scanCodeCheckBox},
new Component[]{null, nfcInputCheckBox},
new Component[]{null, nfcContentTypePane},
};
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double[] rowSize = {p, p, p, p};
double[] columnSize = {p, f};
int[][] rowCount = {{1, 1}, {1, 1}, {1, 1}, {1, 1}};
JPanel settingPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, rowCount, LayoutConstants.HGAP_LARGE, LayoutConstants.VGAP_LARGE);
this.add(settingPane, BorderLayout.NORTH); this.add(settingPane, BorderLayout.NORTH);
} }
@ -78,6 +95,11 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane<MobileScanCod
* @param contentType 内容类型 * @param contentType 内容类型
*/ */
private void updateNfcContentTypePane(boolean visible, MobileScanCodeAttr.NFCContentType contentType) { private void updateNfcContentTypePane(boolean visible, MobileScanCodeAttr.NFCContentType contentType) {
if (visible) {
nfcContentTypePane.setPreferredSize(new Dimension(400, 60));
} else {
nfcContentTypePane.setPreferredSize(new Dimension(0, 0));
}
nfcContentTypePane.setVisible(visible); nfcContentTypePane.setVisible(visible);
nfcContentTypePane.setSelectedType(contentType); nfcContentTypePane.setSelectedType(contentType);
} }
@ -144,3 +166,4 @@ public class MobileTextFieldInputSettingPane extends BasicBeanPane<MobileScanCod
} }
} }

BIN
designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_en.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_zh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
designer-form/src/main/resources/com/fr/design/form/images/autochartpreview/auto_chart_preview_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

8
designer-realize/src/main/java/com/fr/design/widget/WidgetMobilePaneFactory.java

@ -4,7 +4,7 @@ import com.fr.design.ExtraDesignClassManager;
import com.fr.design.fun.CellWidgetOptionProvider; import com.fr.design.fun.CellWidgetOptionProvider;
import com.fr.design.widget.mobile.WidgetMobilePane; import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.mobile.MultiFileEditorMobilePane; import com.fr.design.widget.ui.mobile.MultiFileEditorMobilePane;
import com.fr.design.widget.ui.mobile.ScanCodeMobilePane; import com.fr.design.widget.ui.mobile.TextEditorMobilePane;
import com.fr.form.ui.MultiFileEditor; import com.fr.form.ui.MultiFileEditor;
import com.fr.form.ui.TextEditor; import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget; import com.fr.form.ui.Widget;
@ -28,7 +28,11 @@ public class WidgetMobilePaneFactory {
static { static {
mobilePaneMap.put(MultiFileEditor.class, MultiFileEditorMobilePane.class); mobilePaneMap.put(MultiFileEditor.class, MultiFileEditorMobilePane.class);
mobilePaneMap.put(TextEditor.class, ScanCodeMobilePane.class); mobilePaneMap.put(TextEditor.class, TextEditorMobilePane.class);
// 此版本不发布,先屏蔽入口
// mobilePaneMap.put(TextArea.class, TextAreaMobilePane.class);
// mobilePaneMap.put(NumberEditor.class, NumberEditorMobilePane.class);
// mobilePaneMap.put(Password.class, PasswordMobilePane.class);
mobilePluginPaneMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetMobileOptionsMap()); mobilePluginPaneMap.putAll(ExtraDesignClassManager.getInstance().getCellWidgetMobileOptionsMap());
GeneralContext.listenPluginRunningChanged(new PluginEventListener() { GeneralContext.listenPluginRunningChanged(new PluginEventListener() {

41
designer-realize/src/main/java/com/fr/design/widget/ui/mobile/NumberEditorMobilePane.java

@ -0,0 +1,41 @@
package com.fr.design.widget.ui.mobile;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane;
import com.fr.form.ui.NumberEditor;
import com.fr.form.ui.Widget;
import java.awt.BorderLayout;
/**
* 数字控件移动端属性
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/11
*/
public class NumberEditorMobilePane extends WidgetMobilePane {
private MobileTextEditSettingPane textSettingPane;
@Override
protected void init() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
textSettingPane = new MobileTextEditSettingPane();
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH);
}
@Override
public void populate(Widget widget) {
NumberEditor numberEditor = (NumberEditor) widget;
textSettingPane.populateBean(numberEditor.getMobileTextEditAttr());
}
@Override
public void update(Widget widget) {
NumberEditor numberEditor = (NumberEditor) widget;
textSettingPane.updateBean(numberEditor.getMobileTextEditAttr());
}
}

42
designer-realize/src/main/java/com/fr/design/widget/ui/mobile/PasswordMobilePane.java

@ -0,0 +1,42 @@
package com.fr.design.widget.ui.mobile;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.designer.mobile.component.MobilePasswordEditSettingPane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget;
import java.awt.BorderLayout;
/**
* 密码控件移动端属性
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/11
*/
public class PasswordMobilePane extends WidgetMobilePane {
private MobileTextEditSettingPane textSettingPane;
@Override
protected void init() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
textSettingPane = new MobilePasswordEditSettingPane();
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH);
}
@Override
public void populate(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
textSettingPane.populateBean(textEditor.getMobileTextEditAttr());
}
@Override
public void update(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
textSettingPane.updateBean(textEditor.getMobileTextEditAttr());
}
}

39
designer-realize/src/main/java/com/fr/design/widget/ui/mobile/ScanCodeMobilePane.java

@ -1,39 +0,0 @@
package com.fr.design.widget.ui.mobile;
import com.fr.base.mobile.MobileScanCodeAttr;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget;
import java.awt.BorderLayout;
public class ScanCodeMobilePane extends WidgetMobilePane {
private MobileTextFieldInputSettingPane settingPane;
@Override
protected void init() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
settingPane = new MobileTextFieldInputSettingPane();
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, settingPane), BorderLayout.NORTH);
}
@Override
public void populate(Widget widget) {
MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) widget).getMobileScanCodeAttr();
settingPane.populateBean(mobileScanCodeAttr);
}
@Override
public void update(Widget widget) {
MobileScanCodeAttr mobileScanCodeAttr = ((TextEditor) widget).getMobileScanCodeAttr();
settingPane.updateBean(mobileScanCodeAttr);
}
}

42
designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextAreaMobilePane.java

@ -0,0 +1,42 @@
package com.fr.design.widget.ui.mobile;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextAreaSettingPane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget;
import java.awt.BorderLayout;
/**
* 文本域控件移动端属性
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/11
*/
public class TextAreaMobilePane extends WidgetMobilePane {
private MobileTextEditSettingPane textSettingPane;
@Override
protected void init() {
this.setLayout(FRGUIPaneFactory.createBorderLayout());
textSettingPane = new MobileTextAreaSettingPane();
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, textSettingPane), BorderLayout.NORTH);
}
@Override
public void populate(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
textSettingPane.populateBean(textEditor.getMobileTextEditAttr());
}
@Override
public void update(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
textSettingPane.updateBean(textEditor.getMobileTextEditAttr());
}
}

59
designer-realize/src/main/java/com/fr/design/widget/ui/mobile/TextEditorMobilePane.java

@ -0,0 +1,59 @@
package com.fr.design.widget.ui.mobile;
import com.fr.design.foldablepane.UIExpandablePane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.layout.FRGUIPaneFactory;
import com.fr.design.widget.mobile.WidgetMobilePane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextEditSettingPane;
import com.fr.design.widget.ui.designer.mobile.component.MobileTextFieldInputSettingPane;
import com.fr.form.ui.TextEditor;
import com.fr.form.ui.Widget;
import javax.swing.JPanel;
import java.awt.BorderLayout;
/**
* 文本控件移动端属性面板
*
* @author Coral.Chen
* @since 11.0
* Created on 2023/4/12
*/
public class TextEditorMobilePane extends WidgetMobilePane {
/**
* 输入方式
*/
private MobileTextFieldInputSettingPane settingPane;
/**
* 输入框属性配置
*/
private MobileTextEditSettingPane textSettingPane;
@Override
protected void init() {
JPanel container = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true);
this.setLayout(FRGUIPaneFactory.createBorderLayout());
settingPane = new MobileTextFieldInputSettingPane();
textSettingPane = new MobileTextEditSettingPane();
container.add(settingPane);
// container.add(textSettingPane);
this.add(new UIExpandablePane(Toolkit.i18nText("Fine-Design_Report_Advanced"), 280, 20, container), BorderLayout.NORTH);
}
@Override
public void populate(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
settingPane.populateBean(textEditor.getMobileScanCodeAttr());
textSettingPane.populateBean(textEditor.getMobileTextEditAttr());
}
@Override
public void update(Widget widget) {
TextEditor textEditor = (TextEditor) widget;
settingPane.updateBean(textEditor.getMobileScanCodeAttr());
textSettingPane.updateBean(textEditor.getMobileTextEditAttr());
}
}

2
designer-realize/src/main/java/com/fr/start/MainDesigner.java

@ -213,7 +213,6 @@ public class MainDesigner extends BaseDesigner {
ArrayList<ShortCut> shortCuts = new ArrayList<ShortCut>(); ArrayList<ShortCut> shortCuts = new ArrayList<ShortCut>();
// shortCuts.add(new NewWorkBookXAction()); // shortCuts.add(new NewWorkBookXAction());
shortCuts.add(new NewWorkBookAction()); shortCuts.add(new NewWorkBookAction());
shortCuts.add(new NewPolyReportAction());
try { try {
if (DesignModuleFactory.getNewFormAction() != null) { if (DesignModuleFactory.getNewFormAction() != null) {
shortCuts.add((ShortCut) DesignModuleFactory.getNewFormAction().newInstance()); shortCuts.add((ShortCut) DesignModuleFactory.getNewFormAction().newInstance());
@ -221,6 +220,7 @@ public class MainDesigner extends BaseDesigner {
} catch (Exception e) { } catch (Exception e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e); FineLoggerFactory.getLogger().error(e.getMessage(), e);
} }
shortCuts.add(new NewPolyReportAction());
return shortCuts.toArray(new ShortCut[0]); return shortCuts.toArray(new ShortCut[0]);
} }

12
designer-realize/src/main/java/com/fr/start/SplashContext.java

@ -2,14 +2,12 @@ package com.fr.start;
import com.fr.concurrent.NamedThreadFactory; import com.fr.concurrent.NamedThreadFactory;
import com.fr.design.i18n.Toolkit; import com.fr.design.i18n.Toolkit;
import com.fr.design.locale.impl.SplashMark;
import com.fr.design.mainframe.bbs.BBSConstants; import com.fr.design.mainframe.bbs.BBSConstants;
import com.fr.event.Event; import com.fr.event.Event;
import com.fr.event.EventDispatcher; import com.fr.event.EventDispatcher;
import com.fr.event.Listener; import com.fr.event.Listener;
import com.fr.general.GeneralContext; import com.fr.general.GeneralContext;
import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.image.I18nImage;
import com.fr.general.locale.LocaleMark;
import com.fr.module.ModuleEvent; import com.fr.module.ModuleEvent;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -44,6 +42,11 @@ public class SplashContext {
private String guest = StringUtils.EMPTY; private String guest = StringUtils.EMPTY;
private boolean hasShowThanks = false; private boolean hasShowThanks = false;
/**
* 正常图片路径
*/
private static final String SPLASH_IMAGE_PATH = "/com/fr/design/images/splash.png";
private ScheduledExecutorService scheduler = Executors private ScheduledExecutorService scheduler = Executors
.newScheduledThreadPool(1, new NamedThreadFactory("SplashContext")); .newScheduledThreadPool(1, new NamedThreadFactory("SplashContext"));
@ -174,7 +177,6 @@ public class SplashContext {
} }
private static String getSplashPath() { private static String getSplashPath() {
LocaleMark<String> localeMark = LocaleCenter.getMark(SplashMark.class); return I18nImage.getImagePath(SPLASH_IMAGE_PATH);
return localeMark.getValue();
} }
} }

12
designer-realize/src/main/java/com/fr/start/common/SplashPane.java

@ -3,9 +3,7 @@ package com.fr.start.common;
import com.bulenkov.iconloader.IconLoader; import com.bulenkov.iconloader.IconLoader;
import com.bulenkov.iconloader.util.JBUI; import com.bulenkov.iconloader.util.JBUI;
import com.fr.base.GraphHelper; import com.fr.base.GraphHelper;
import com.fr.design.locale.impl.SplashMark; import com.fr.general.locale.image.I18nImage;
import com.fr.general.locale.LocaleCenter;
import com.fr.general.locale.LocaleMark;
import com.fr.stable.GraphDrawHelper; import com.fr.stable.GraphDrawHelper;
import com.fr.stable.GraphicsConfig; import com.fr.stable.GraphicsConfig;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -51,13 +49,17 @@ public class SplashPane extends JPanel {
private String thanksLog = StringUtils.EMPTY; private String thanksLog = StringUtils.EMPTY;
private String moduleText = StringUtils.EMPTY; private String moduleText = StringUtils.EMPTY;
/**
* 正常图片路径
*/
private static final String SPLASH_PATH = "/com/fr/design/images/splash.png";
private static int uiScale(int i) { private static int uiScale(int i) {
return (int) (i * JBUI_INIT_SCALE); return (int) (i * JBUI_INIT_SCALE);
} }
private static String getSplashPath() { private static String getSplashPath() {
LocaleMark<String> localeMark = LocaleCenter.getMark(SplashMark.class); return I18nImage.getImagePath(SPLASH_PATH);
return localeMark.getValue();
} }
private NotNullLazyValue<Font> fontValue = new NotNullLazyValue<Font>() { private NotNullLazyValue<Font> fontValue = new NotNullLazyValue<Font>() {

20
designer-realize/src/main/java/com/fr/start/common/SplashPane4WinAndJDK11.java

@ -2,16 +2,14 @@ package com.fr.start.common;
import com.bulenkov.iconloader.IconLoader; import com.bulenkov.iconloader.IconLoader;
import com.fr.base.BaseUtils; import com.fr.base.BaseUtils;
import com.fr.design.locale.impl.DoubleSplashMark;
import com.fr.design.locale.impl.SplashMark;
import com.fr.general.IOUtils; import com.fr.general.IOUtils;
import com.fr.general.locale.LocaleCenter; import com.fr.general.locale.image.I18nImage;
import java.awt.RenderingHints;
import javax.swing.Icon; import javax.swing.Icon;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
/** /**
@ -30,13 +28,23 @@ public class SplashPane4WinAndJDK11 extends SplashPane{
*/ */
private boolean isDouble = false; private boolean isDouble = false;
/**
* 正常图片路径
*/
private static final String SPLASH_PATH = "/com/fr/design/images/splash.png";
/**
* 两倍图片路径
*/
private static final String DOUBLE_SPLASH_PATH = "/com/fr/design/images/splash@2x.png";
public SplashPane4WinAndJDK11() { public SplashPane4WinAndJDK11() {
this.imagePath = getSplashPath4WinAndJdk11(); this.imagePath = getSplashPath4WinAndJdk11();
} }
private String getSplashPath4WinAndJdk11() { private String getSplashPath4WinAndJdk11() {
String path = (String) LocaleCenter.getMark(SplashMark.class).getValue(); String path = I18nImage.getImagePath(SPLASH_PATH);
String pathOfDouble = (String) LocaleCenter.getMark(DoubleSplashMark.class).getValue(); String pathOfDouble = I18nImage.getImagePath(DOUBLE_SPLASH_PATH);
// 为图片加上"@2x" // 为图片加上"@2x"
// 某些定制jar里面没有两倍图,判断一下,如果文件不存在,就返回一倍图的path // 某些定制jar里面没有两倍图,判断一下,如果文件不存在,就返回一倍图的path
if (IOUtils.readResource(pathOfDouble) != null) { if (IOUtils.readResource(pathOfDouble) != null) {

BIN
designer-realize/src/main/resources/com/fr/design/images/splash.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 297 KiB

After

Width:  |  Height:  |  Size: 298 KiB

BIN
designer-realize/src/main/resources/com/fr/design/images/splash@2x.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 946 KiB

After

Width:  |  Height:  |  Size: 949 KiB

0
designer-realize/src/main/resources/com/fr/design/images/splash_en@2x.png → designer-realize/src/main/resources/com/fr/design/images/splash@2x_en.png

Before

Width:  |  Height:  |  Size: 949 KiB

After

Width:  |  Height:  |  Size: 949 KiB

BIN
designer-realize/src/main/resources/com/fr/design/images/splash@2x_zh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 KiB

BIN
designer-realize/src/main/resources/com/fr/design/images/splash@2x_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 564 KiB

BIN
designer-realize/src/main/resources/com/fr/design/images/splash_zh.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

BIN
designer-realize/src/main/resources/com/fr/design/images/splash_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_en.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

0
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open.png → designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_zh.png

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/open/open_zh_TW.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/remind/remind.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

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

Loading…
Cancel
Save