From 31051df0338b05bc9ec088b66e18ff18827d8368 Mon Sep 17 00:00:00 2001 From: ju Date: Sun, 19 Aug 2018 22:40:27 +0800 Subject: [PATCH 01/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=8F=AA=E6=9C=89=E6=9C=80=E5=A4=96=E5=B1=82=E7=9A=84jar?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E9=9C=80=E8=A6=81=E5=88=86=E6=94=AF=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=EF=BC=8C=E5=85=B6=E4=BB=96=E4=B8=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/pom.xml | 2 +- designer-chart/pom.xml | 4 ++-- designer-form/pom.xml | 4 ++-- designer-realize/pom.xml | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/designer-base/pom.xml b/designer-base/pom.xml index 25e3c1ec5..8a725b517 100644 --- a/designer-base/pom.xml +++ b/designer-base/pom.xml @@ -10,7 +10,7 @@ com.fr.report designer-base - ${branch}-SNAPSHOT + 10.0 io.socket diff --git a/designer-chart/pom.xml b/designer-chart/pom.xml index 6a6bc80c0..8d5e30e1c 100644 --- a/designer-chart/pom.xml +++ b/designer-chart/pom.xml @@ -10,12 +10,12 @@ com.fr.report designer-chart - ${branch}-SNAPSHOT + 10.0 com.fr.report designer-base - ${branch}-SNAPSHOT + 10.0 \ No newline at end of file diff --git a/designer-form/pom.xml b/designer-form/pom.xml index 31c439f0c..274032bd3 100644 --- a/designer-form/pom.xml +++ b/designer-form/pom.xml @@ -10,12 +10,12 @@ com.fr.report designer-form - ${branch}-SNAPSHOT + 10.0 com.fr.report designer-base - ${branch}-SNAPSHOT + 10.0 \ No newline at end of file diff --git a/designer-realize/pom.xml b/designer-realize/pom.xml index a0b56b093..2e40943cc 100644 --- a/designer-realize/pom.xml +++ b/designer-realize/pom.xml @@ -10,17 +10,17 @@ com.fr.report designer-realize - ${branch}-SNAPSHOT + 10.0 com.fr.report designer-form - ${branch}-SNAPSHOT + 10.0 com.fr.report designer-chart - ${branch}-SNAPSHOT + 10.0 \ No newline at end of file From b0a9e525c29de61085d392dcddc17fc8e6992a29 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 21 Aug 2018 11:34:01 +0800 Subject: [PATCH 02/77] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E6=96=87=E4=BB=B6=E5=8F=8A=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConfigManager.java | 29 +- .../help/alphafine/AlphaFineConfigPane.java | 33 +- .../alphafine/AlphaFineConstants.java | 21 +- .../design/mainframe/alphafine/CellType.java | 2 +- .../alphafine/cell/CellModelHelper.java | 4 + .../alphafine/cell/model/BottomModel.java | 57 +++ .../alphafine/cell/model/RobotModel.java | 95 ++++ .../cell/render/BottomCellRender.java | 39 ++ .../cell/render/ContentCellRender.java | 73 ++- .../alphafine/component/AlphaFineDialog.java | 479 ++++++++++++++---- .../component/AlphaFineTextField.java | 13 +- .../alphafine/preview/ContainsCirclePane.java | 36 ++ .../alphafine/preview/RobotPreviewPane.java | 41 ++ .../manager/fun/AlphaFineSearchProvider.java | 2 +- .../manager/impl/ActionSearchManager.java | 15 +- .../manager/impl/ComplementAdviceManager.java | 84 +++ .../manager/impl/DocumentSearchManager.java | 72 +-- .../manager/impl/FileSearchManager.java | 25 +- .../search/manager/impl/HotIssuesManager.java | 153 ++++++ .../manager/impl/PluginSearchManager.java | 75 +-- .../manager/impl/RecentSearchManager.java | 13 +- .../manager/impl/RecommendSearchManager.java | 119 ++++- .../manager/impl/SegmentationManager.java | 81 +++ .../manager/impl/SimilarSearchManeger.java | 101 ++++ .../alphafine/images/alphafine10.png | Bin 0 -> 248 bytes .../alphafine/images/alphafine10@2x.png | Bin 0 -> 303 bytes .../mainframe/alphafine/images/alphafine8.png | Bin 0 -> 372 bytes .../alphafine/images/alphafine8@2x.png | Bin 0 -> 618 bytes .../alphafine/images/alphafine_hot1.png | Bin 0 -> 789 bytes .../alphafine/images/alphafine_hot1@2x.png | Bin 0 -> 1743 bytes .../alphafine/images/alphafine_hot2.png | Bin 0 -> 1051 bytes .../alphafine/images/alphafine_hot2@2x.png | Bin 0 -> 2035 bytes .../alphafine/images/alphafine_hot3.png | Bin 0 -> 1590 bytes .../alphafine/images/alphafine_hot3@2x.png | Bin 0 -> 4069 bytes .../alphafine/images/alphafine_hot4.png | Bin 0 -> 634 bytes .../alphafine/images/alphafine_hot4@2x.png | Bin 0 -> 1193 bytes .../alphafine/images/alphafine_hot5.png | Bin 0 -> 1525 bytes .../alphafine/images/alphafine_hot5@2x.png | Bin 0 -> 3569 bytes .../alphafine/images/alphafine_hot6.png | Bin 0 -> 506 bytes .../alphafine/images/alphafine_hot6@2x.png | Bin 0 -> 828 bytes .../mainframe/alphafine/images/selected10.png | Bin 0 -> 14855 bytes .../alphafine/images/selected10@2x.png | Bin 0 -> 279 bytes .../mainframe/alphafine/images/selected8.png | Bin 0 -> 14941 bytes .../alphafine/images/selected8@2x.png | Bin 0 -> 488 bytes 44 files changed, 1423 insertions(+), 239 deletions(-) create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/BottomCellRender.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java create mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine10.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine10@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine8.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine8@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10@2x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected8.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected8@2x.png diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index b1c03c09b..11bc0fb34 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -55,6 +55,14 @@ public class AlphaFineConfigManager implements XMLable { * 应用中心 */ private boolean isContainPlugin = true; + /** + * 分词搜索 + */ + private boolean isNeedSegmentationCheckbox = true; + /** + * 智能客服 + */ + private boolean isNeedIntelligentCustomerService = true; /** * 快捷键 */ @@ -94,6 +102,8 @@ public class AlphaFineConfigManager implements XMLable { this.setContainAction(reader.getAttrAsBoolean("isContainAction", true)); this.setContainTemplate(reader.getAttrAsBoolean("isContainTemplate", true)); this.setContainFileContent(reader.getAttrAsBoolean("isContainFileContent", false)); + this.setNeedSegmentationCheckbox(reader.getAttrAsBoolean("isNeedSegmentationCheckbox", true)); + this.setNeedIntelligentCustomerService(reader.getAttrAsBoolean("isNeedIntelligentCustomerService", true)); this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); @@ -115,7 +125,9 @@ public class AlphaFineConfigManager implements XMLable { .attr("isContainPlugin", this.isContainPlugin()) .attr("isContainFileContent", this.isContainFileContent()) .attr("isNeedRemind", this.isNeedRemind()) - .attr("operateCount", this.getOperateCount()); + .attr("operateCount", this.getOperateCount()) + .attr("isNeedSegmentationCheckbox", this.isNeedSegmentationCheckbox()) + .attr("isNeedIntelligentCustomerService", this.isNeedIntelligentCustomerService()); writer.end(); } @@ -227,6 +239,21 @@ public class AlphaFineConfigManager implements XMLable { isNeedRemind = needRemind; } + public boolean isNeedSegmentationCheckbox() { + return isNeedSegmentationCheckbox; + } + + public void setNeedSegmentationCheckbox(boolean needSegmentationCheckbox) { + isNeedSegmentationCheckbox = needSegmentationCheckbox; + } + + public boolean isNeedIntelligentCustomerService() { + return isNeedIntelligentCustomerService; + } + + public void setNeedIntelligentCustomerService(boolean needIntelligentCustomerService) { + isNeedIntelligentCustomerService = needIntelligentCustomerService; + } public int getOperateCount() { return operateCount; } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index ddb8e425c..1520a7e1d 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -8,7 +8,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayoutHelper; - import com.fr.log.FineLoggerFactory; import javax.swing.*; @@ -56,7 +55,7 @@ public class AlphaFineConfigPane extends BasicPane { private static final double COLUMN_GAP = 180; private static final double ROW_GAP = 25; private KeyStroke shortCutKeyStore = null; - private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; + private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, isNeedSegmentationCheckbox, isNeedIntelligentCustomerService, isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; private UITextField shortcutsField; public AlphaFineConfigPane() { @@ -77,13 +76,21 @@ public class AlphaFineConfigPane extends BasicPane { private Component[][] initSearchRangeComponents() { Component[][] components = new Component[][]{ new Component[]{isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox}, - new Component[]{isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox} + new Component[]{isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox}, + new Component[]{isNeedIntelligentCustomerService, null, null} + }; + return components; + } + + private Component[][] initOnlineComponents() { + Component[][] components = new Component[][]{ + new Component[]{isSearchOnlineCheckbox, isNeedSegmentationCheckbox, null} }; return components; } private void createSearchConfigPane(JPanel contentPane) { - double[] rowSize = {ROW_GAP, ROW_GAP}; + double[] rowSize = {ROW_GAP, ROW_GAP, ROW_GAP}; double[] columnSize = {COLUMN_GAP, COLUMN_GAP, COLUMN_GAP}; @@ -94,6 +101,7 @@ public class AlphaFineConfigPane extends BasicPane { isContainDocumentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help")); isContainTemplateCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates")); isContainFileContentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Templates_Content")); + isNeedIntelligentCustomerService = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Intelligent_Customer_Service")); JPanel searchConfigPane = TableLayoutHelper.createTableLayoutPane(initSearchRangeComponents(), rowSize, columnSize); northPane.add(searchConfigPane); contentPane.add(northPane); @@ -138,8 +146,9 @@ public class AlphaFineConfigPane extends BasicPane { } private void createOnlinePane(JPanel contentPane) { - JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Internet")); + JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Search_Type")); isSearchOnlineCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Internet_Search")); + isNeedSegmentationCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Segmentation")); isSearchOnlineCheckbox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -147,17 +156,23 @@ public class AlphaFineConfigPane extends BasicPane { isContainRecommendCheckbox.setEnabled(false); isContainPluginCheckbox.setEnabled(false); isContainDocumentCheckbox.setEnabled(false); + isNeedIntelligentCustomerService.setEnabled(false); isContainRecommendCheckbox.setSelected(false); isContainPluginCheckbox.setSelected(false); isContainDocumentCheckbox.setSelected(false); + isNeedIntelligentCustomerService.setSelected(false); } else { isContainRecommendCheckbox.setEnabled(true); isContainPluginCheckbox.setEnabled(true); isContainDocumentCheckbox.setEnabled(true); + isNeedIntelligentCustomerService.setEnabled(true); } } }); - northPane.add(isSearchOnlineCheckbox); + double[] rowSize = {ROW_GAP}; + double[] columnSize = {COLUMN_GAP, COLUMN_GAP, COLUMN_GAP}; + JPanel onlinePane = TableLayoutHelper.createTableLayoutPane(initOnlineComponents(), rowSize, columnSize); + northPane.add(onlinePane); contentPane.add(northPane); } @@ -187,6 +202,10 @@ public class AlphaFineConfigPane extends BasicPane { this.isContainRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); this.isContainRecommendCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); + + this.isNeedSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); + this.isNeedIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); + this.isNeedIntelligentCustomerService.setEnabled(alphaFineConfigManager.isSearchOnLine()); shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } @@ -201,6 +220,8 @@ public class AlphaFineConfigPane extends BasicPane { alphaFineConfigManager.setSearchOnLine(this.isSearchOnlineCheckbox.isSelected()); alphaFineConfigManager.setContainTemplate(this.isContainTemplateCheckbox.isSelected()); alphaFineConfigManager.setContainFileContent(this.isContainFileContentCheckbox.isSelected()); + alphaFineConfigManager.setNeedSegmentationCheckbox(this.isNeedSegmentationCheckbox.isSelected()); + alphaFineConfigManager.setNeedIntelligentCustomerService(this.isNeedIntelligentCustomerService.isSelected()); alphaFineConfigManager.setShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : this.shortcutsField.getText()); designerEnvManager.setAlphaFineConfigManager(alphaFineConfigManager); try { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index 09de8e6ed..cf7f04e0a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -2,7 +2,10 @@ package com.fr.design.mainframe.alphafine; import com.fr.general.CloudCenter; -import java.awt.*; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; + /** * Created by XiaXiang on 2017/5/10. @@ -31,6 +34,10 @@ public class AlphaFineConstants { public static final int CELL_TITLE_HEIGHT = 24; + public static final int HOT_ICON_LABEL_HEIGHT = 36; + + public static final int HOT_ITEMS = 6; + public static final Dimension FULL_SIZE = new Dimension(680, 460); @@ -40,6 +47,10 @@ public class AlphaFineConstants { public static final Dimension ICON_LABEL_SIZE = new Dimension(64, 64); + public static final Dimension HOT_ICON_LABEL_SIZE = new Dimension(36, 36); + + public static final Dimension HOT_ISSUES_JAPNEL_SIZE = new Dimension(213,182); + public static final Dimension CLOSE_BUTTON_SIZE = new Dimension(40, 40); public static final Color WHITE = new Color(0xf9f9f9); @@ -62,6 +73,8 @@ public class AlphaFineConstants { public static final Font MEDIUM_FONT = new Font("Song_TypeFace", 0, 12); + public static final Font MEDIUM_FONT_ANOTHER = new Font("HiraginoSansGB-W3", 0, 12); + public static final Font LARGE_FONT = new Font("Song_TypeFace", 0, 18); public static final Font GREATER_FONT = new Font("Song_TypeFace", 0, 20); @@ -87,7 +100,13 @@ public class AlphaFineConstants { public static final String SEARCH_API = CloudCenter.getInstance().acquireUrlByKind("af.cloud_search"); + public static final String ALPHA_ROBOT_SEARCH_TOKEN = "K8dl0Np6l0gs"; + + public static final String SIMILAR_SEARCH_URL_PREFIX = "http://robot.finereport.com/openapi/like.php?action=search&"; + + public static final String COMPLEMENT_ADVICE_SEARCH_URL_PREFIX = "http://robot.finereport.com/openapi/getkw.php?"; + public static final String ALPHA_HOT_SEARCH = "http://robot.finereport.com/openapi/hot.php"; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/CellType.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/CellType.java index 0f4f61a42..3d533e47b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/CellType.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/CellType.java @@ -4,7 +4,7 @@ package com.fr.design.mainframe.alphafine; * Created by XiaXiang on 2017/4/27. */ public enum CellType { - RECOMMEND(0), ACTION(1), DOCUMENT(2), FILE(3), PLUGIN(4), REUSE(5), NO_RESULT(6), MORE(7); + RECOMMEND(0), ACTION(1), DOCUMENT(2), FILE(3), PLUGIN(4), REUSE(5), NO_RESULT(6), MORE(7), RECOMMEND_ROBOT(8), BOTTOM(9), ROBOT(10); private int typeValue; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java index d838f50a9..b388f5e8e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java @@ -6,6 +6,7 @@ import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.SimilarSearchManeger; import com.fr.json.JSONObject; /** @@ -31,6 +32,9 @@ public class CellModelHelper { case REUSE: cellModel = PluginSearchManager.getModelFromCloud(object.optJSONObject(RESULT)); break; + case ROBOT: + case RECOMMEND_ROBOT: + cellModel = SimilarSearchManeger.getModelFromCloud(object.optJSONObject(RESULT)); } return cellModel; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java new file mode 100644 index 000000000..76528685e --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java @@ -0,0 +1,57 @@ +package com.fr.design.mainframe.alphafine.cell.model; + +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Created by alexsung on 2018/7/30. + */ +public class BottomModel extends AlphaCellModel { + /** + * 找不到答案?去论坛提问 + */ + public String getGoToWeb() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Internet_Forum"); + } + + public BottomModel(String name, String content) { + super(name, content, CellType.BOTTOM); + } + + public BottomModel() { + super(null, null, CellType.BOTTOM); + } + + @Override + public JSONObject ModelToJson() throws JSONException { + return null; + } + + @Override + public String getStoreInformation() { + return null; + } + + @Override + public boolean hasAction() { + return true; + } + + @Override + public void doAction() { + try { + Desktop.getDesktop().browse(new URI("http://bbs.fanruan.com/post_newthread_ajax.php?action=newthread&fid=39")); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } catch (URISyntaxException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java new file mode 100644 index 000000000..99ccab4bd --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java @@ -0,0 +1,95 @@ +package com.fr.design.mainframe.alphafine.cell.model; + +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import org.apache.commons.codec.digest.DigestUtils; + + +import java.awt.Desktop; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * Created by alex.sung on 2018/8/3. + */ +public class RobotModel extends AlphaCellModel { + + private String title; + private String content; + + //热门问题列表的list不需要渲染图标,所以这里需要区分一下 + private boolean isHotItemModel = false; + + public boolean isHotItemModel() { + return isHotItemModel; + } + + public void setHotItemModel(boolean hotItemModel) { + isHotItemModel = hotItemModel; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public static String getContent(String titleStr) { + String result; + String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + titleStr); + String url = "http://robot.finereport.com/openapi/reply.php?action=search&msg=" + titleStr + "&token=" + token; + HttpClient httpClient = new HttpClient(url); + httpClient.asGet(); + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + JSONObject jsonObject = new JSONObject(result); + return jsonObject.optString("msg"); + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("get robotmodel content error: " + e.getMessage()); + } + return null; + } + + public RobotModel(String title, String content) { + super(title, content, CellType.ROBOT); + this.title = title; + } + + @Override + public JSONObject ModelToJson() throws JSONException { + JSONObject object = JSONObject.create(); + try { + JSONObject modelObject = JSONObject.create(); + modelObject.put("title", getTitle()).put("content", getContent()).put("searchCount", getSearchCount()); + object.put("result", modelObject).put("cellType", getType().getTypeValue()); + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("RobotModel: " + e.getMessage()); + } + return object; + } + + @Override + public String getStoreInformation() { + return null; + } + + @Override + public void doAction() { + try { + Desktop.getDesktop().browse(new URI("http://robot.finereport.com?send=" + super.getName())); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } catch (URISyntaxException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/BottomCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/BottomCellRender.java new file mode 100644 index 000000000..824fc3bfc --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/BottomCellRender.java @@ -0,0 +1,39 @@ +package com.fr.design.mainframe.alphafine.cell.render; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.cell.model.BottomModel; + +import javax.swing.*; +import java.awt.Component; +import java.awt.BorderLayout; +import java.awt.Dimension; + +/** + * Created by alex.sung on 2018/8/3. + */ +public class BottomCellRender implements ListCellRenderer { + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + + UILabel goToWebLabel = new UILabel(); + BottomModel bottomModel = (BottomModel) value; + JPanel panel = new JPanel(new BorderLayout()); + panel.setBackground(null); + panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + + JPanel line = new JPanel(); + line.setPreferredSize(new Dimension(200, 1)); + line.setBackground(AlphaFineConstants.GRAY); + panel.add(line, BorderLayout.NORTH); + + goToWebLabel.setFont(AlphaFineConstants.MEDIUM_FONT); + goToWebLabel.setText(bottomModel.getGoToWeb()); + goToWebLabel.setForeground(AlphaFineConstants.BLUE); + goToWebLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); + panel.add(goToWebLabel, BorderLayout.EAST); + + panel.setPreferredSize(new Dimension(list.getFixedCellWidth(), AlphaFineConstants.CELL_TITLE_HEIGHT)); + return panel; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index d8cd66d97..367de258c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -4,11 +4,20 @@ import com.bulenkov.iconloader.IconLoader; import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; +import com.fr.design.mainframe.alphafine.cell.model.BottomModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; + +import javax.swing.BorderFactory; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Component; /** * Created by XiaXiang on 2017/4/20. @@ -19,6 +28,14 @@ public class ContentCellRender implements ListCellRenderer { private static final String CELL_PATH = AlphaFineConstants.IMAGE_URL + "alphafine"; private static final String SUFFIX = ".png"; + private String searchText; + private String[] segmentationResult; + + public ContentCellRender(String searchText, String[] segmentationResult) { + this.searchText = searchText; + this.segmentationResult = segmentationResult; + } + @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { UILabel titleLabel = new UILabel(); @@ -26,21 +43,34 @@ public class ContentCellRender implements ListCellRenderer { if (value instanceof MoreModel) { return new TitleCellRender().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); } + if (value instanceof BottomModel) { + return new BottomCellRender().getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + } AlphaCellModel model = (AlphaCellModel) value; JPanel panel = new JPanel(new BorderLayout()); panel.setBackground(null); panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - titleLabel.setText(" " + model.getName()); + if (model.hasAction()) { if (isSelected) { + titleLabel.setText(" " + model.getName()); String iconUrl = SELECTED_PATH + model.getType().getTypeValue() + SUFFIX; panel.setBackground(AlphaFineConstants.BLUE); titleLabel.setForeground(Color.WHITE); - titleLabel.setIcon(IconLoader.getIcon(iconUrl)); + if(value instanceof RobotModel && ((RobotModel) value).isHotItemModel()){ + titleLabel.setIcon(null); + }else{ + titleLabel.setIcon(IconLoader.getIcon(iconUrl)); + } } else { + + titleLabel.setText(dealWithModelName(model.getName(), segmentationResult)); String iconUrl = CELL_PATH + model.getType().getTypeValue() + SUFFIX; - titleLabel.setIcon(IconLoader.getIcon(iconUrl)); - titleLabel.setForeground(AlphaFineConstants.BLACK); + if(value instanceof RobotModel && ((RobotModel) value).isHotItemModel()){ + titleLabel.setIcon(null); + }else{ + titleLabel.setIcon(IconLoader.getIcon(iconUrl)); + } } } else { @@ -66,4 +96,35 @@ public class ContentCellRender implements ListCellRenderer { panel.setPreferredSize(new Dimension(list.getFixedCellWidth(), AlphaFineConstants.CELL_HEIGHT)); return panel; } + + /** + * 处理model的显示颜色,将搜索词高亮 + * + * @param modelName + * @param strings + * @return + */ + public String dealWithModelName(String modelName, String strings[]) { + if (strings == null) { + return modelName; + } + for (int i = 0; i < strings.length; i++) { + String primaryStr = getReplacedString(modelName, strings[i]); + modelName = modelName.replaceAll("(?i)" + strings[i], "|" + strings[i] + "|"); + if(!StringUtils.isEmpty(primaryStr)){ + modelName = modelName.replaceAll(strings[i], primaryStr); + } + } + modelName = "" + modelName.replaceAll("\\|", "") + ""; + return modelName; + } + + private String getReplacedString(String modelName, String string) { + int index = modelName.toLowerCase().indexOf(string.toLowerCase()); + if(index == -1){ + return null; + } + return modelName.substring(index, index+string.length()); + + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index ef791195d..af7cf2d26 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -11,23 +11,11 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.CellModelHelper; -import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; -import com.fr.design.mainframe.alphafine.cell.model.FileModel; -import com.fr.design.mainframe.alphafine.cell.model.MoreModel; -import com.fr.design.mainframe.alphafine.cell.model.PluginModel; +import com.fr.design.mainframe.alphafine.cell.model.*; import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; -import com.fr.design.mainframe.alphafine.listener.DocumentAdapter; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.design.mainframe.alphafine.preview.DocumentPreviewPane; -import com.fr.design.mainframe.alphafine.preview.FilePreviewPane; -import com.fr.design.mainframe.alphafine.preview.NoResultPane; -import com.fr.design.mainframe.alphafine.preview.PluginPreviewPane; -import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; -import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; +import com.fr.design.mainframe.alphafine.preview.*; +import com.fr.design.mainframe.alphafine.search.manager.impl.*; import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.form.main.Form; @@ -45,35 +33,11 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import javax.imageio.ImageIO; -import javax.swing.BorderFactory; -import javax.swing.DefaultListModel; -import javax.swing.ImageIcon; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; -import javax.swing.SwingWorker; -import javax.swing.event.DocumentEvent; +import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.AWTEvent; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Frame; -import java.awt.Graphics; -import java.awt.Image; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.awt.Window; -import java.awt.event.AWTEventListener; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; +import java.awt.*; +import java.awt.event.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; @@ -81,6 +45,8 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.HashMap; import java.util.concurrent.ExecutionException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Created by XiaXiang on 2017/3/21. @@ -99,6 +65,7 @@ public class AlphaFineDialog extends UIDialog { private static final String DS_NAME = "dsname=\""; private static final String PLUGIN_MARK_SHORT = "k:4 "; private static final String PLUGIN_MARK = "k:shop "; + private static final String SIMILAR_MARK = "k:robot "; private static final String PLACE_HOLDER = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine"); private static final int MAX_SHOW_SIZE = 12; @@ -116,9 +83,17 @@ public class AlphaFineDialog extends UIDialog { private SwingWorker searchWorker; private SwingWorker showWorker; private String storeText; + private String[] segmentationResult; //是否强制打开,因为面板是否关闭绑定了全局鼠标事件,这里需要处理一下 private boolean forceOpen; + private JPanel hotPane; + private JPanel backPane; + SearchResult modeList = null; + private static String beforeSearchStr = ""; + private static boolean isAlreadySearch = false; + private static boolean isAlreadyInitHot = false; + public AlphaFineDialog(Frame parent, boolean forceOpen) { super(parent); this.forceOpen = forceOpen; @@ -190,6 +165,45 @@ public class AlphaFineDialog extends UIDialog { }); topPane.add(closeButton, BorderLayout.EAST); add(topPane, BorderLayout.CENTER); + + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + initHotPane(); + } + } + + /** + * 初始化热门界面 + */ + private void initHotPane() { + hotPane = new JPanel(); + hotPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + hotPane.setPreferredSize(AlphaFineConstants.CONTENT_SIZE); + hotPane.setLayout(new BorderLayout()); + + UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Hot")); + uiLabel.setFont(AlphaFineConstants.SMALL_FONT); + uiLabel.setForeground(AlphaFineConstants.DARK_GRAY); + JPanel panel = new JPanel(); + + hotPane.add(uiLabel, BorderLayout.NORTH); + hotPane.add(panel, BorderLayout.CENTER); + + GridLayout gridLayout = new GridLayout(2, 3, 3, 3); + panel.setLayout(gridLayout); + + String[][] ss = HotIssuesManager.getInstance().getHotIssues(); + + if(ss != null){ + for (int i = 0; i < ss.length; i++) { + panel.add(new HotIssueJpanel(ss[i], i + 1)); + } + }else { + for (int i = 0; i < AlphaFineConstants.HOT_ITEMS; i++) { + panel.add(new HotIssueJpanel(new String[]{" "}, i + 1)); + } + } + add(hotPane, BorderLayout.SOUTH); + setSize(AlphaFineConstants.FULL_SIZE); } /** @@ -208,7 +222,7 @@ public class AlphaFineDialog extends UIDialog { */ private void initProperties() { setUndecorated(true); - //addComponentListener(new ComponentHandler()); +//addComponentListener(new ComponentHandler()); setSize(AlphaFineConstants.FIELD_SIZE); centerWindow(this); @@ -230,20 +244,20 @@ public class AlphaFineDialog extends UIDialog { if (winSize.width > screenSize.width) { winSize.width = screenSize.width; } - //这里设置位置:水平居中,竖直偏上 +//这里设置位置:水平居中,竖直偏上 win.setLocation((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / AlphaFineConstants.SHOW_SIZE); } - // TODO: 2017/5/8 xiaxiang: 窗体圆角setShape()有毛边,重写paint方法可以解决毛边问题,但带来了别的问题,处理比较麻烦,暂用setShape(); -// public void paint(Graphics g){ -// Graphics2D g2 = (Graphics2D) g.create(); -// RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); -// qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); -// g2.setRenderingHints(qualityHints); -// g2.setPaint(Color.WHITE); -// g2.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15); -// g2.dispose(); -// } +// TODO: 2017/5/8 xiaxiang: 窗体圆角setShape()有毛边,重写paint方法可以解决毛边问题,但带来了别的问题,处理比较麻烦,暂用setShape(); +// public void paint(Graphics g){ +// Graphics2D g2 = (Graphics2D) g.create(); +// RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); +// qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); +// g2.setRenderingHints(qualityHints); +// g2.setPaint(Color.WHITE); +// g2.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15); +// g2.dispose(); +// } /** * 执行搜索 @@ -254,16 +268,21 @@ public class AlphaFineDialog extends UIDialog { showSearchResult(text); } - boolean isNoNeedSearch(String text) { - return ComparatorUtils.equals(PLACE_HOLDER, text) || text.contains("'") || StringUtils.isBlank(text); - } - @Override public void setVisible(boolean isVisible) { if (!isVisible) { dispose(); return; } + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + if (hotPane == null) { + initHotPane(); + } + }else{ + removeHotPane(); + setSize(AlphaFineConstants.FIELD_SIZE); + refreshContainer(); + } super.setVisible(isVisible); } @@ -289,8 +308,7 @@ public class AlphaFineDialog extends UIDialog { remove(searchResultPane); searchResultPane = null; } - setSize(AlphaFineConstants.FIELD_SIZE); - refreshContainer(); + } /** @@ -307,6 +325,8 @@ public class AlphaFineDialog extends UIDialog { * 初始化搜索面板 */ private void initSearchResultComponents() { + + searchResultList = new AlphaFineList(); searchResultList.setFixedCellHeight(AlphaFineConstants.CELL_HEIGHT); searchListModel = new SearchListModel(new SearchResult()); @@ -314,7 +334,7 @@ public class AlphaFineDialog extends UIDialog { searchResultPane = new JPanel(); searchResultPane.setPreferredSize(AlphaFineConstants.CONTENT_SIZE); searchResultPane.setLayout(new BorderLayout()); - searchResultList.setCellRenderer(new ContentCellRender()); + searchResultList.setCellRenderer(new ContentCellRender(storeText, segmentationResult)); leftSearchResultPane = new UIScrollPane(searchResultList); leftSearchResultPane.setBorder(null); @@ -424,17 +444,19 @@ public class AlphaFineDialog extends UIDialog { */ private void dealWithSearchText(String searchText) { if (searchText.startsWith(ACTION_MARK_SHORT) || searchText.startsWith(ACTION_MARK)) { - buildActionList(getStoreText(searchText)); + buildActionList(new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(DOCUMENT_MARK_SHORT) || searchText.startsWith(DOCUMENT_MARK)) { - buildDocumentList(getStoreText(searchText)); + buildDocumentList(new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(FILE_MARK_SHORT) || searchText.startsWith(FILE_MARK)) { - buildFileList(getStoreText(searchText)); + buildFileList(new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(CPT_MARK) || searchText.startsWith(FRM_MARK)) { - buildFileList(searchText); + buildFileList(new String[]{searchText}); } else if (searchText.startsWith(DS_MARK)) { - buildFileList(DS_NAME + getStoreText(searchText)); + buildFileList(new String[]{DS_NAME + getStoreText(searchText)}); } else if (searchText.startsWith(PLUGIN_MARK_SHORT) || searchText.startsWith(PLUGIN_MARK)) { - buildPluginList(getStoreText(searchText)); + buildPluginList(new String[]{getStoreText(searchText)}); + } else if (searchText.startsWith(SIMILAR_MARK)) { + buildSimilarList(new String[]{getStoreText(searchText)}); } } @@ -467,39 +489,47 @@ public class AlphaFineDialog extends UIDialog { * @param searchText */ private void doNormalSearch(String searchText) { - buildRecentList(searchText); - buildRecommendList(searchText); - buildActionList(searchText); - buildFileList(searchText); - buildDocumentList(searchText); - buildPluginList(searchText); + if (segmentationResult != null) { + buildRecentList(segmentationResult); + buildRecommendList(segmentationResult); + buildActionList(segmentationResult); + buildFileList(segmentationResult); + buildDocumentList(segmentationResult); + buildPluginList(segmentationResult); + buildSimilarList(segmentationResult); + } + searchListModel.addElement(new BottomModel()); } - private void buildDocumentList(final String searchText) { + private void buildDocumentList(final String[] searchText) { addSearchResult(DocumentSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildFileList(final String searchText) { + private void buildFileList(final String[] searchText) { addSearchResult(FileSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildActionList(final String searchText) { + private void buildActionList(final String[] searchText) { addSearchResult(ActionSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildPluginList(final String searchText) { + private void buildPluginList(final String[] searchText) { addSearchResult(PluginSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildRecommendList(final String searchText) { + private void buildRecommendList(final String[] searchText) { addSearchResult(RecommendSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildRecentList(final String searchText) { + private void buildRecentList(final String[] searchText) { addSearchResult(RecentSearchManager.getInstance().getLessSearchResult(searchText)); } + private void buildSimilarList(final String[] searchText) { + addSearchResult(SimilarSearchManeger.getInstance().getLessSearchResult(searchText)); + } + private synchronized void addSearchResult(SearchResult searchResult) { for (AlphaCellModel object : searchResult) { AlphaFineHelper.checkCancel(); @@ -625,12 +655,42 @@ public class AlphaFineDialog extends UIDialog { validate(); repaint(); } - } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } catch (ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + } catch (Exception e) { } + } + }; + this.showWorker.execute(); + break; + case ROBOT: + case RECOMMEND_ROBOT: + showDefaultPreviewPane(); + checkWorker(); + this.showWorker = new SwingWorker() { + @Override + protected String doInBackground() { + String content = RobotModel.getContent((selectedValue).getName()); + //去掉小帆底部的信息 + String regex1 = "
([\\s\\S]*?)class=\"jiaoyes\">YES
"; + String regex2 = "
"; + content = content.replaceAll(regex1, "") + .replaceAll(regex2, ""); + return content; + } + @Override + protected void done() { + if (!isCancelled() && rightSearchResultPane != null) { + rightSearchResultPane.removeAll(); + try { + rightSearchResultPane.add(new RobotPreviewPane((selectedValue).getName(), get())); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + validate(); + repaint(); + } } }; this.showWorker.execute(); @@ -702,24 +762,74 @@ public class AlphaFineDialog extends UIDialog { } }); - searchTextField.getDocument().addDocumentListener(new DocumentAdapter() { + Timer timer = new Timer(300, new ActionListener() { @Override - protected void textChanged(DocumentEvent e) { - if (isNoNeedSearch(searchTextField.getText())) { + public void actionPerformed(ActionEvent e) { + if (!isAlreadyInitHot && searchTextField.getText().length() == 0) { + isAlreadyInitHot = true; removeSearchResult(); - } else { - try { - Thread.sleep(10); + refreshContainer(); + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + if (hotPane == null) { + initHotPane(); + setSize(AlphaFineConstants.FULL_SIZE); + } + }else{ + setSize(AlphaFineConstants.FIELD_SIZE); + } + refreshContainer(); + return; + } else if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) { + if (isAlreadySearch) { + return; + } else { + removeHotPane(); + removeSearchResult(); + refreshContainer(); + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedSegmentationCheckbox()) { + //是高级搜索 + if(searchTextField.getText().toLowerCase().startsWith(ADVANCED_SEARCH_MARK)){ + segmentationResult = SegmentationManager.getInstance().startSegmentation(getStoreText(searchTextField.getText().toLowerCase())); + } + //是普通搜索 + else{ + segmentationResult = SegmentationManager.getInstance().startSegmentation(searchTextField.getText().toLowerCase()); + } + } else { + if(StringUtils.isEmpty(getRealSearchText(searchTextField.getText().toLowerCase()))){ + segmentationResult = null; + }else{ + segmentationResult = new String[]{getRealSearchText(searchTextField.getText().toLowerCase())}; + } + } doSearch(searchTextField.getText().toLowerCase()); - } catch (InterruptedException e1) { - FineLoggerFactory.getLogger().error(e1.getMessage()); + isAlreadySearch = true; } - + } else { + beforeSearchStr = searchTextField.getText(); + isAlreadySearch = false; + } + if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) { + isAlreadyInitHot = false; } } - }); + }); + timer.start(); + } + /** + * 去除特殊字符,空格等 + */ + private String getRealSearchText(String searchText){ + String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】';:”“’。,、?]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(searchText); + searchText = m.replaceAll("").trim().replaceAll(" ", ""); + if (searchText.length() == 0) { + return null; + } + return searchText; } /** @@ -760,7 +870,7 @@ public class AlphaFineDialog extends UIDialog { @Override public void checkValid() throws Exception { - //不处理 +//不处理 } /** @@ -780,6 +890,9 @@ public class AlphaFineDialog extends UIDialog { * @param cellModel */ private void saveLocalHistory(final AlphaCellModel cellModel) { + if(cellModel instanceof BottomModel){ + return; + } Thread sendThread = new Thread(new Runnable() { @Override public void run() { @@ -883,6 +996,13 @@ public class AlphaFineDialog extends UIDialog { case ACTION: moreResult = ActionSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; + case ROBOT: + case RECOMMEND_ROBOT: + moreResult = SimilarSearchManeger.getInstance().getMoreSearchResult(searchTextField.getText()); + break; + case RECOMMEND: + moreResult = RecommendSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); + break; default: moreResult = new SearchResult(); } @@ -953,7 +1073,7 @@ public class AlphaFineDialog extends UIDialog { /** * +-------------------------------------+ - * | 自定义JList | + * | 自定义JList | * +-------------------------------------+ */ private class AlphaFineList extends JList { @@ -1030,7 +1150,7 @@ public class AlphaFineDialog extends UIDialog { /** * +-------------------------------------+ - * | 自定义ListModel | + * | 自定义ListModel | * +-------------------------------------+ */ private class SearchListModel extends DefaultListModel { @@ -1135,4 +1255,171 @@ public class AlphaFineDialog extends UIDialog { } } + public void showIssuesList() { + if (this.searchWorker != null && !this.searchWorker.isDone()) { + this.searchWorker.cancel(true); + this.searchWorker = null; + } + this.searchWorker = new SwingWorker() { + @Override + protected Object doInBackground() throws Exception { + + resetContainer(); + for (AlphaCellModel object : modeList) { + searchListModel.addElement(object); + } + return null; + } + + @Override + protected void done() { + if (!isCancelled()) { + splitLabel.setIcon(null); + fireStopLoading(); + } + } + }; + this.searchWorker.execute(); + } + + /** + * 移除热门面板 + */ + private void removeHotPane() { + if (hotPane != null) { + remove(hotPane); + hotPane = null; + } + } + /** + * 增加返回面板 + */ + private void initBackPane() { + backPane = new JPanel(new BorderLayout()); + JLabel jLabel = new JLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Back")); + jLabel.setPreferredSize(new Dimension(680, 20)); + jLabel.setFont(AlphaFineConstants.SMALL_FONT); + jLabel.setForeground(AlphaFineConstants.DARK_GRAY); + backPane.add(jLabel, BorderLayout.CENTER); + jLabel.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + if (searchResultPane != null) { + remove(searchResultPane); + searchResultPane = null; + } + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + if (hotPane == null) { + initHotPane(); + } + setSize(AlphaFineConstants.FULL_SIZE); + }else{ + setSize(AlphaFineConstants.FIELD_SIZE); + } + refreshContainer(); + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + } + + /** + * +-------------------------------------+ + * | 自定义热门问题面板 | + * +-------------------------------------+ + */ + private class HotIssueJpanel extends JPanel { + + public HotIssueJpanel(String[] str, int pngIndex) { + this.setLayout(new BorderLayout()); + this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + this.setSize(AlphaFineConstants.HOT_ISSUES_JAPNEL_SIZE); + + JPanel pane1 = new JPanel(new BorderLayout()); + ContainsCirclePane circle = new ContainsCirclePane(pngIndex); + circle.setBorder(BorderFactory.createEmptyBorder(20,0,10,0)); + pane1.add(circle, BorderLayout.NORTH); + add(pane1, BorderLayout.NORTH); + + JPanel centerPanel = new JPanel(new BorderLayout()); + centerPanel.setBackground(Color.white); + UILabel title = new UILabel(); + title.setText(str[0]); + title.setFont(AlphaFineConstants.MEDIUM_FONT_ANOTHER); + title.setForeground(AlphaFineConstants.DARK_GRAY); + title.setHorizontalAlignment(JTextField.CENTER); + centerPanel.add(title); + add(centerPanel, BorderLayout.CENTER); + + JPanel bottomPanel = new JPanel(new BorderLayout()); + bottomPanel.setBackground(Color.white); + + GridLayout gridLayout = new GridLayout(2, 2); + + + for (int i = 1; i < str.length; i++) { + final UILabel subTitle = new UILabel(str[i]); + subTitle.setForeground(AlphaFineConstants.DARK_GRAY); + subTitle.setFont(AlphaFineConstants.MEDIUM_FONT_ANOTHER); + subTitle.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + segmentationResult = null; + removeHotPane(); + if (searchResultPane == null) { + initSearchResultComponents(); + } + initBackPane(); + searchResultPane.add(backPane, BorderLayout.NORTH); + refreshContainer(); + modeList = HotIssuesManager.getInstance().getTitleSearchResult(subTitle.getText()); + showIssuesList(); + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + bottomPanel.add(subTitle); + } + bottomPanel.setLayout(gridLayout); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 20, 22, 0)); + add(bottomPanel, BorderLayout.SOUTH); + } + } + } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java index a60a76396..006c0b7b8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java @@ -3,7 +3,10 @@ package com.fr.design.mainframe.alphafine.component; import com.fr.design.gui.itextfield.UITextField; import com.fr.report.web.button.Image; -import java.awt.*; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; + /** * Created by XiaXiang on 2017/3/21. @@ -26,13 +29,7 @@ public class AlphaFineTextField extends UITextField { @Override public String getText() { - String text = super.getText(); - - if (text.trim().length() == 0 && placeHolder != null) { - text = placeHolder; - } - - return text; + return super.getText(); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java new file mode 100644 index 000000000..e320c723a --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java @@ -0,0 +1,36 @@ +package com.fr.design.mainframe.alphafine.preview; + +import com.bulenkov.iconloader.IconLoader; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; + +import javax.swing.JPanel; +import java.awt.Color; +import java.awt.Graphics; + +/** + * @Author alex.sung + * created by 2018.08.15 + */ +public class ContainsCirclePane extends JPanel { + + public ContainsCirclePane(int pngIndex) { + UILabel iconLabel = new UILabel(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + "alphafine_hot" + pngIndex + ".png")); + iconLabel.setPreferredSize(AlphaFineConstants.HOT_ICON_LABEL_SIZE); + iconLabel.setOpaque(true); + iconLabel.setBackground(Color.WHITE); + add(iconLabel); + } + + @Override + public void paintComponent(Graphics g) { + super.paintComponent(g); + int height = AlphaFineConstants.HOT_ICON_LABEL_HEIGHT; + setBackground(Color.white); + int x0 = getSize().width / 2; + int y0 = height / 2 + 23; + int r = height / 2 + 9; + g.setColor(AlphaFineConstants.LIGHT_GRAY); + g.drawOval(x0 - r, y0 - r, r * 2, r * 2); + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java new file mode 100644 index 000000000..32c5cd820 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java @@ -0,0 +1,41 @@ +package com.fr.design.mainframe.alphafine.preview; + + +import com.fr.design.gui.itextarea.UITextArea; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; + +import javax.swing.BorderFactory; +import javax.swing.JEditorPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.text.html.HTMLEditorKit; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; + + +/** + * Created by alex.sung on 2018/8/3. + */ +public class RobotPreviewPane extends JPanel { + + public RobotPreviewPane(String title, String content) { + this.setLayout(new BorderLayout()); + this.setBackground(Color.WHITE); + this.setPreferredSize(new Dimension(AlphaFineConstants.RIGHT_WIDTH, AlphaFineConstants.CONTENT_HEIGHT)); + UITextArea titleArea = new UITextArea(title); + titleArea.setBorder(null); + titleArea.setEditable(false); + titleArea.setForeground(AlphaFineConstants.BLUE); + titleArea.setFont(AlphaFineConstants.LARGE_FONT); + add(titleArea, BorderLayout.NORTH); + + JEditorPane editorPane = new JEditorPane(); + editorPane.setEditorKit(new HTMLEditorKit()); + editorPane.setText(content); + editorPane.setEditable(false); + JScrollPane jScrollPane = new JScrollPane(editorPane); + jScrollPane.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 10, Color.white)); + add(jScrollPane, BorderLayout.CENTER); + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java index 9d29433a2..b75aa894c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java @@ -12,7 +12,7 @@ public interface AlphaFineSearchProvider { * @param searchText * @return */ - SearchResult getLessSearchResult(String searchText); + SearchResult getLessSearchResult(String[] searchText); /** * 获取剩余条数 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index b17b14d06..6335be561 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -57,21 +57,23 @@ public class ActionSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String searchText) { + public synchronized SearchResult getLessSearchResult(String[] searchText) { filterModelList = new SearchResult(); lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (StringUtils.isBlank(searchText)) { + if (searchText.length == 0) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); return lessModelList; } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainAction()) { List updateActions = UpdateActionManager.getUpdateActionManager().getUpdateActions(); for (UpdateActionModel updateActionModel : updateActions) { - AlphaFineHelper.checkCancel(); - if (StringUtils.isNotBlank(updateActionModel.getSearchKey())) { - if (updateActionModel.getSearchKey().contains(searchText) && updateActionModel.getAction().isEnabled()) { - filterModelList.add(new ActionModel(updateActionModel.getActionName(), updateActionModel.getParentName(), updateActionModel.getAction())); + for (int j = 0; j < searchText.length; j++) { + AlphaFineHelper.checkCancel(); + if (StringUtils.isNotBlank(updateActionModel.getSearchKey())) { + if (updateActionModel.getSearchKey().contains(searchText[j]) && updateActionModel.getAction().isEnabled()) { + filterModelList.add(new ActionModel(updateActionModel.getActionName(), updateActionModel.getParentName(), updateActionModel.getAction())); + } } } } @@ -91,7 +93,6 @@ public class ActionSearchManager implements AlphaFineSearchProvider { lessModelList.addAll(result.subList(0, AlphaFineConstants.SHOW_SIZE)); moreModelList.addAll(result.subList(AlphaFineConstants.SHOW_SIZE, result.size())); } - } return lessModelList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java new file mode 100644 index 000000000..c548a1b47 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -0,0 +1,84 @@ +package com.fr.design.mainframe.alphafine.search.manager.impl; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.json.JSONTokener; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; +import org.apache.commons.codec.digest.DigestUtils; + +/** + * @author alex.sung created on 2018/7/23. + */ +public class ComplementAdviceManager { + + public static int count = 0; + + private static ComplementAdviceManager instance; + private SearchResult allModelList; + + public static ComplementAdviceManager getInstance() { + if (instance == null) { + synchronized (ComplementAdviceManager.class) { + if (instance == null) { + instance = new ComplementAdviceManager(); + } + } + } + return instance; + } + + /** + * 从接口中获取补全建议结果 + * @param searchText + * @return + */ + public synchronized SearchResult getAllSearchResult(String[] searchText) { + allModelList = new SearchResult(); + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + SearchResult searchResult = new SearchResult(); + for (int j = 0; j < searchText.length; j++) { + String result; + String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + searchText[j]); + String url = AlphaFineConstants.COMPLEMENT_ADVICE_SEARCH_URL_PREFIX + "msg=" + searchText[j] + "&token=" + token; + HttpClient httpClient = new HttpClient(url); + httpClient.asGet(); + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + Object json = new JSONTokener(result).nextValue(); + if (json instanceof JSONArray) { + JSONArray jsonArray = new JSONArray(result); + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + JSONObject jsonObject = jsonArray.optJSONObject(i); + + String temp = jsonObject.optString("keywords"); + if (!StringUtils.isEmpty(temp)) { + RobotModel robotModel = new RobotModel(temp, null); + if (!AlphaFineHelper.getFilterResult().contains(robotModel) && !allModelList.contains(robotModel)) { + allModelList.add(robotModel); + } + } + } + } + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("complement advice search error: " + e.getMessage()); + } + } + if (searchResult.isEmpty()) { + return allModelList; + } else { + allModelList.addAll(searchResult); + } + } + return allModelList; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index 59595229a..cad89640e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -14,7 +14,6 @@ import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; -import com.fr.stable.StringUtils; /** * Created by XiaXiang on 2017/3/27. @@ -50,48 +49,53 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String searchText) { + public synchronized SearchResult getLessSearchResult(String[] searchText) { lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (StringUtils.isBlank(searchText)) { + if (searchText.length == 0) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); return lessModelList; } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainDocument()) { - String result; - String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText + "-1"; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); - try { - JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.optJSONArray("docdata"); - if (jsonArray != null) { - SearchResult searchResult = new SearchResult(); - for (int i = 0; i < jsonArray.length(); i++) { - AlphaFineHelper.checkCancel(); - DocumentModel cellModel = getModelFromCloud(jsonArray.optJSONObject(i)); - if (!AlphaFineHelper.getFilterResult().contains(cellModel)) { - searchResult.add(cellModel); + SearchResult searchResult = new SearchResult(); + for (int j = 0; j < searchText.length; j++) { + String result; + String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText[j] + "-1"; + HttpClient httpClient = new HttpClient(url); + httpClient.asGet(); + if (!httpClient.isServerAlive()) { + return getNoConnectList(); + } + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = jsonObject.optJSONArray("docdata"); + if (jsonArray != null) { + + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + DocumentModel cellModel = getModelFromCloud(jsonArray.optJSONObject(i)); + if (!AlphaFineHelper.getFilterResult().contains(cellModel)) { + searchResult.add(cellModel); + } } } - if (searchResult.isEmpty()) { - return lessModelList; - } else if (searchResult.size() < AlphaFineConstants.SHOW_SIZE + 1) { - lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); - lessModelList.addAll(searchResult); - } else { - lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.DOCUMENT)); - lessModelList.addAll(searchResult.subList(0, AlphaFineConstants.SHOW_SIZE)); - moreModelList.addAll(searchResult.subList(AlphaFineConstants.SHOW_SIZE, searchResult.size())); - } + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("document search error: " + e.getMessage()); } - } catch (JSONException e) { - FineLoggerFactory.getLogger().error("document search error: " + e.getMessage()); + } + lessModelList.clear(); + moreModelList.clear(); + if (searchResult.isEmpty()) { + return lessModelList; + } else if (searchResult.size() < AlphaFineConstants.SHOW_SIZE + 1) { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); + lessModelList.addAll(searchResult); + } else { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.DOCUMENT)); + lessModelList.addAll(searchResult.subList(0, AlphaFineConstants.SHOW_SIZE)); + moreModelList.addAll(searchResult.subList(AlphaFineConstants.SHOW_SIZE, searchResult.size())); } } return lessModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index d72859891..107cbb864 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -33,7 +33,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { private FileNode[] fileNodes = null; //停止搜索 - //隐藏的搜索功能,可根据特殊的字符标记判断搜索分类 +//隐藏的搜索功能,可根据特殊的字符标记判断搜索分类 private boolean isContainCpt = true; private boolean isContainFrm = true; @@ -62,20 +62,23 @@ public class FileSearchManager implements AlphaFineSearchProvider { return new FileModel(name, filePath, searchCount); } - public synchronized SearchResult getLessSearchResult(String searchText) { + public synchronized SearchResult getLessSearchResult(String[] searchText) { this.filterModelList = new SearchResult(); this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); - this.searchText = dealWithSearchText(searchText); - if (StringUtils.isBlank(this.searchText) || ComparatorUtils.equals(this.searchText, DS_NAME)) { - lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates"))); - return lessModelList; + for (int j = 0; j < searchText.length; j++) { + this.searchText = dealWithSearchText(searchText[j]); + if (StringUtils.isBlank(this.searchText) || ComparatorUtils.equals(this.searchText, DS_NAME)) { + lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Templates"))); + return lessModelList; + } + AlphaFineHelper.checkCancel(); + fileNodes = FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); + isContainCpt = true; + isContainFrm = true; + doSearch(this.searchText); } - AlphaFineHelper.checkCancel(); - fileNodes = FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); - isContainCpt = true; - isContainFrm = true; - doSearch(this.searchText); + if (filterModelList.isEmpty()) { return new SearchResult(); } else if (filterModelList.size() < AlphaFineConstants.SHOW_SIZE + 1) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java new file mode 100644 index 000000000..1ec562546 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java @@ -0,0 +1,153 @@ +package com.fr.design.mainframe.alphafine.search.manager.impl; + +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.general.Inter; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * Created by alex.sung on 2018/8/3. + */ +public class HotIssuesManager { + private static HotIssuesManager instance; + private static final int HOT_ITEM_NUM = 6; + private static final int HOT_SUB_ITEM_NUM = 4; + + public static HotIssuesManager getInstance() { + if (instance == null) { + synchronized (HotIssuesManager.class) { + if (instance == null) { + instance = new HotIssuesManager(); + } + } + } + return instance; + } + + String[][] data = new String[HOT_ITEM_NUM][]; + Map map = new HashMap<>(); + + /** + * 将子标题下的数据塞入modeList + * @param getStr + * @return + */ + public SearchResult getTitleSearchResult(String getStr) { + SearchResult modeList = new SearchResult(); + modeList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText((getStr)))); + + List issueList = map.get(getStr); + for (int i = 0; i < issueList.size(); i++) { + RobotModel robotModel = new RobotModel(issueList.get(i), null); + robotModel.setHotItemModel(true); + modeList.add(robotModel); + } + return modeList; + } + + /** + * 从热门问题接口获取热门问题 + * @return + */ + public String[][] getHotIssues() { + String result; + HttpClient httpClient = new HttpClient(AlphaFineConstants.ALPHA_HOT_SEARCH); + httpClient.asGet(); + if (!httpClient.isServerAlive()) { + return null; + } + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + JSONArray jsonArray = new JSONArray(result); + for (int i = 0; i < HOT_ITEM_NUM; i++) { + AlphaFineHelper.checkCancel(); + JSONObject jsonObject = jsonArray.optJSONObject(i); + data[i] = getTitleStrings(jsonObject); + } + + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("hotissues search error: " + e.getMessage()); + } + return data; + } + + /** + * 根据子标题获取该标题下数据 + * @param jsonObject + * @return + */ + private String[] getTitleStrings(JSONObject jsonObject) { + String[] temp = getSubTitleFromCloud(jsonObject.optJSONObject("data")); + String[] temp1 = new String[1]; + temp1[0] = jsonObject.optString("type"); + int strLen1 = temp.length; + int strLen2 = temp1.length; + + temp1 = Arrays.copyOf(temp1, strLen2 + strLen1); + System.arraycopy(temp, 0, temp1, strLen2, strLen1); + + getIssueStrings(jsonObject.optJSONObject("data")); + + return temp1; + } + + /** + * 获取子标题和子标题下的问题列表 + * @param data + * @return + */ + private String[] getIssueStrings(JSONObject data) { + try { + for (int j = 0; j < HOT_SUB_ITEM_NUM; j++) { + String temp = data.getString("item" + (j + 1)); + JSONArray jsonArray = data.getJSONArray("itemData" + (j + 1)); + List tempList = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + tempList.add(jsonArray.optJSONObject(i).optString("text")); + } + map.put(temp, tempList); + } + + } catch (JSONException e) { + } + return null; + } + + /** + * 获取问题列表 + * @param data + * @return + */ + private String[] getSubTitleFromCloud(JSONObject data) { + ArrayList list = new ArrayList<>(); + for (int i = 0; i < HOT_SUB_ITEM_NUM; i++) { + String temp = null; + try { + temp = data.getString("item" + (i + 1)); + } catch (JSONException e) { + } + if (!StringUtils.isEmpty(temp)) { + list.add(temp); + } + } + String[] strings = new String[list.size()]; + list.toArray(strings); + return strings; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index 975e94311..c59b93c02 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -17,7 +17,6 @@ import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.basic.version.Version; import com.fr.plugin.basic.version.VersionIntervalFactory; -import com.fr.stable.StringUtils; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -95,51 +94,53 @@ public class PluginSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String searchText) { + public synchronized SearchResult getLessSearchResult(String[] searchText) { this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); - if (StringUtils.isBlank(searchText)) { + if (searchText.length == 0) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); return lessModelList; } + SearchResult searchResult = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainPlugin()) { - String result; - try { - String encodedKey = URLEncoder.encode(searchText, "UTF-8"); - String url = AlphaFineConstants.PLUGIN_SEARCH_URL + "?keyword=" + encodedKey; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); - JSONObject jsonObject = new JSONObject(result); - JSONArray jsonArray = jsonObject.optJSONArray("result"); - if (jsonArray != null) { - SearchResult searchResult = new SearchResult(); - for (int i = 0; i < jsonArray.length(); i++) { - AlphaFineHelper.checkCancel(); - PluginModel cellModel = getPluginModel(jsonArray.optJSONObject(i), false); - if (cellModel != null && !AlphaFineHelper.getFilterResult().contains(cellModel)) { - searchResult.add(cellModel); - } + for (int j = 0; j < searchText.length; j++) { + String result; + try { + String encodedKey = URLEncoder.encode(searchText[j], "UTF-8"); + String url = AlphaFineConstants.PLUGIN_SEARCH_URL + "?keyword=" + encodedKey; + HttpClient httpClient = new HttpClient(url); + httpClient.asGet(); + if (!httpClient.isServerAlive()) { + return getNoConnectList(); } - if (searchResult.isEmpty()) { - return this.lessModelList; - } else if (searchResult.size() < AlphaFineConstants.SHOW_SIZE + 1) { - lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); - lessModelList.addAll(searchResult); - } else { - lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.PLUGIN)); - lessModelList.addAll(searchResult.subList(0, AlphaFineConstants.SHOW_SIZE)); - moreModelList.addAll(searchResult.subList(AlphaFineConstants.SHOW_SIZE, searchResult.size())); + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + JSONObject jsonObject = new JSONObject(result); + JSONArray jsonArray = jsonObject.optJSONArray("result"); + if (jsonArray != null) { + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + PluginModel cellModel = getPluginModel(jsonArray.optJSONObject(i), false); + if (cellModel != null && !AlphaFineHelper.getFilterResult().contains(cellModel)) { + searchResult.add(cellModel); + } + } } + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("plugin search json error :" + e.getMessage()); + } catch (UnsupportedEncodingException e) { + FineLoggerFactory.getLogger().error("plugin search encode error :" + e.getMessage()); } - } catch (JSONException e) { - FineLoggerFactory.getLogger().error("plugin search json error :" + e.getMessage()); - } catch (UnsupportedEncodingException e) { - FineLoggerFactory.getLogger().error("plugin search encode error :" + e.getMessage()); + } + if (searchResult.isEmpty()) { + return this.lessModelList; + } else if (searchResult.size() < AlphaFineConstants.SHOW_SIZE + 1) { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); + lessModelList.addAll(searchResult); + } else { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.PLUGIN)); + lessModelList.addAll(searchResult.subList(0, AlphaFineConstants.SHOW_SIZE)); + moreModelList.addAll(searchResult.subList(AlphaFineConstants.SHOW_SIZE, searchResult.size())); } } return this.lessModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index 481442fac..b9c8e6962 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -72,9 +72,11 @@ public class RecentSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String searchText) { + public SearchResult getLessSearchResult(String[] searchText) { this.modelList = new SearchResult(); - recentModelList = getRecentModelList(searchText); + for (int j = 0; j < searchText.length; j++) { + recentModelList = getRecentModelList(searchText[j]); + } if (recentModelList != null && recentModelList.size() > 0) { modelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Latest"))); if (recentModelList.size() > AlphaFineConstants.LATEST_SHOW_SIZE) { @@ -136,6 +138,9 @@ public class RecentSearchManager implements AlphaFineSearchProvider { initWriter(); Document doc = new Document(); doc.add(new StringField("searchKey", searchKey, Field.Store.YES)); + if(cellModel == null){ + System.out.println("null"); + } doc.add(new StringField("cellModel", cellModel.ModelToJson().toString(), Field.Store.YES)); doc.add(new LongField("time", System.currentTimeMillis(), Field.Store.YES)); writeDoc(doc); @@ -171,7 +176,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { initReader(); IndexSearcher searcher = new IndexSearcher(indexReader); - //构建排序字段 + //构建排序字段 SortField[] sortField = new SortField[1]; sortField[0] = new SortField("time", SortField.Type.LONG, true); Sort sortKey = new Sort(sortField); @@ -181,7 +186,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { TopFieldDocs docs = searcher.search(query, MAX_SIZE, sortKey); ScoreDoc[] scores = docs.scoreDocs; this.recentModelList = new SearchResult(); - //遍历结果 + //遍历结果 for (ScoreDoc scoreDoc : scores) { Document document = searcher.doc(scoreDoc.doc); AlphaCellModel model = CellModelHelper.getModelFromJson(new JSONObject(document.get("cellModel"))); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 8a2873e4b..d75f1552d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -15,6 +15,7 @@ import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; +import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; @@ -30,6 +31,9 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { private SearchResult modelList; private SearchResult recommendModelList; + private SearchResult complementAdviceModelList; + private SearchResult moreModelList = new SearchResult(); + public static RecommendSearchManager getInstance() { if (instance == null) { synchronized (RecentSearchManager.class) { @@ -42,37 +46,45 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String searchText) { - searchText = searchText.replaceAll(StringUtils.BLANK, StringUtils.EMPTY); + public synchronized SearchResult getLessSearchResult(String[] searchText) { + this.modelList = new SearchResult(); this.recommendModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainRecommend()) { - String result; - HttpClient httpClient = new HttpClient(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText)); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - httpClient.setTimeout(3000); - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); - try { - JSONObject jsonObject = new JSONObject(result); - if (jsonObject.optString("status").equals("success")) { - JSONArray jsonArray = jsonObject.optJSONArray("result"); - if (jsonArray != null && jsonArray.length() > 0) { - for (int i = 0; i < jsonArray.length(); i++) { - AlphaFineHelper.checkCancel(); - AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); - if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { - this.recommendModelList.add(alphaCellModel); + for (int j = 0; j < searchText.length; j++) { + String result; + searchText[j] = searchText[j].replaceAll(StringUtils.BLANK, StringUtils.EMPTY); + HttpClient httpClient = new HttpClient(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); + httpClient.asGet(); + if (!httpClient.isServerAlive()) { + return getNoConnectList(); + } + httpClient.setTimeout(3000); + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + Object json = new JSONTokener(result).nextValue(); + if (json instanceof JSONObject) { + JSONObject jsonObject = new JSONObject(result); + if (jsonObject.optString("status").equals("success")) { + JSONArray jsonArray = jsonObject.optJSONArray("result"); + if (jsonArray != null && jsonArray.length() > 0) { + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); + if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { + + this.recommendModelList.add(alphaCellModel); + } + } } } } + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("recommend search error! :" + e.getMessage()); } - } catch (JSONException e) { - FineLoggerFactory.getLogger().error("recommend search error! :" + e.getMessage()); } + Iterator modelIterator = recommendModelList.iterator(); while (modelIterator.hasNext()) { AlphaCellModel model = modelIterator.next(); @@ -80,9 +92,63 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { modelIterator.remove(); } } + complementAdviceModelList = ComplementAdviceManager.getInstance().getAllSearchResult(searchText); + moreModelList.clear(); if (recommendModelList.size() > 0) { - modelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); - modelList.addAll(recommendModelList); + if (complementAdviceModelList.size() == 0) { + if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE - 2) { + if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + } + modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.SHOW_SIZE - 2)); + moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.SHOW_SIZE - 2, recommendModelList.size())); + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(recommendModelList); + } + } else { + if (recommendModelList.size() + complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE - 2) { + modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.SHOW_SIZE - 2)); + moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.SHOW_SIZE - 2, recommendModelList.size())); + + if (complementAdviceModelList.size() >= 2) { + modelList.addAll(complementAdviceModelList.subList(0, 2)); + moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); + } else { + modelList.addAll(complementAdviceModelList); + } + } else { + modelList.addAll(recommendModelList); + if (complementAdviceModelList.size() >= (AlphaFineConstants.SHOW_SIZE - recommendModelList.size())) { + modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE - recommendModelList.size())); + moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); + } else { + modelList.addAll(complementAdviceModelList); + } + } + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(recommendModelList); + modelList.addAll(complementAdviceModelList); + } + } + }else{ + if(complementAdviceModelList.size() > 0) { + if (complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); + moreModelList.addAll(complementAdviceModelList.subList(AlphaFineConstants.SHOW_SIZE, complementAdviceModelList.size())); + }else{ + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(complementAdviceModelList); + } + }else{ + return modelList; + } } } return modelList; @@ -105,9 +171,10 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { return result; } + @Override public SearchResult getMoreSearchResult(String searchText) { - return new SearchResult(); + return moreModelList; } public List getRecommendModelList() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java new file mode 100644 index 000000000..ff1d68b95 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -0,0 +1,81 @@ +package com.fr.design.mainframe.alphafine.search.manager.impl; + +import com.fr.stable.StringUtils; + +import com.fr.third.ibm.icu.text.BreakIterator; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by alex.sung on 2018/8/3. + */ +public class SegmentationManager { + private static SegmentationManager segmentationManager = null; + private static final int MAX_CHINESE_CHARACTERS_NUM = 4; + + public static SegmentationManager getInstance() { + if (segmentationManager == null) { + segmentationManager = new SegmentationManager(); + return segmentationManager; + } else { + return segmentationManager; + } + } + + /** + * 判断是否需要分词 + * + * @param searchText + * @return + */ + public boolean isNeedSegmentation(String searchText) { + int count = 0; + String reg = "[\\u4e00-\\u9fa5]"; + Pattern p = Pattern.compile(reg); + Matcher m = p.matcher(searchText); + while (m.find()) { + for (int i = 0; i <= m.groupCount(); i++) { + count = count + 1; + } + } + if (count >= MAX_CHINESE_CHARACTERS_NUM) { + return true; + } + return false; + } + + /** + * 对字符串进行分词 + * @param searchText + * @return + */ + public String[] startSegmentation(String searchText) { + String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】';:”“’。,、?]"; + Pattern p = Pattern.compile(regEx); + Matcher m = p.matcher(searchText); + searchText = m.replaceAll("").trim().replaceAll(" ", ""); + if (searchText.length() == 0) { + return null; + } + if(!isNeedSegmentation(searchText)){ + return new String[]{searchText}; + } + List result = new ArrayList<>(); + BreakIterator itor = BreakIterator.getWordInstance(); + itor.setText(searchText); + int start = itor.first(); + for (int end = itor.next(); + end != BreakIterator.DONE; + start = end, end = itor.next()) { + String temp = searchText.substring(start, end); + if (!StringUtils.isEmpty(temp)) { + result.add(temp); + } + } + String[] strings = new String[result.size()]; + result.toArray(strings); + return strings; + } +} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java new file mode 100644 index 000000000..2a09182a0 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -0,0 +1,101 @@ +package com.fr.design.mainframe.alphafine.search.manager.impl; + +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.design.mainframe.alphafine.AlphaFineHelper; +import com.fr.design.mainframe.alphafine.CellType; +import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; +import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.json.JSONTokener; +import com.fr.log.FineLoggerFactory; +import org.apache.commons.codec.digest.DigestUtils; + +/** + * Created by alex.sung on 2018/8/3. + */ +public class SimilarSearchManeger implements AlphaFineSearchProvider { + private static SimilarSearchManeger instance; + private SearchResult lessModelList; + private SearchResult moreModelList = new SearchResult(); + + public static SimilarSearchManeger getInstance() { + if (instance == null) { + synchronized (SimilarSearchManeger.class) { + if (instance == null) { + instance = new SimilarSearchManeger(); + } + } + } + return instance; + } + + @Override + public synchronized SearchResult getLessSearchResult(String[] searchText) { + lessModelList = new SearchResult(); + if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + SearchResult allModelList = new SearchResult(); + for (int j = 0; j < searchText.length; j++) { + String result; + String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + searchText[j]); + String url = AlphaFineConstants.SIMILAR_SEARCH_URL_PREFIX + "msg=" + searchText[j] + "&token=" + token; + HttpClient httpClient = new HttpClient(url); + httpClient.asGet(); + result = httpClient.getResponseText(); + AlphaFineHelper.checkCancel(); + try { + Object json = new JSONTokener(result).nextValue(); + if (json instanceof JSONArray) { + JSONArray jsonArray = new JSONArray(result); + if (jsonArray.length() != 0) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jsonObject = jsonArray.optJSONObject(i); + String title = jsonObject.optString("title"); + RobotModel robotModel = new RobotModel(title, null); + if (!AlphaFineHelper.getFilterResult().contains(robotModel) && !allModelList.contains(robotModel)) { + allModelList.add(robotModel); + } + } + } + } + } catch (JSONException e) { + FineLoggerFactory.getLogger().error("similar search error: " + e.getMessage()); + } + } + moreModelList.clear(); + if (allModelList.isEmpty()) { + return lessModelList; + } else if (allModelList.size() < AlphaFineConstants.SHOW_SIZE + 1) { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Relation_Item"))); + lessModelList.addAll(allModelList); + } else { + lessModelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Relation_Item"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.ROBOT)); + lessModelList.addAll(allModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); + moreModelList.addAll(allModelList.subList(AlphaFineConstants.SHOW_SIZE, allModelList.size())); + } + } + return lessModelList; + } + + @Override + public SearchResult getMoreSearchResult(String searchText) { + return moreModelList; + } + + /** + * 根据json信息获取RobotModel + * + * @param object + * @return + */ + public static RobotModel getModelFromCloud(JSONObject object) { + String name = object.optString("title"); + String content = object.optString("content"); + return new RobotModel(name, content); + } +} diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine10.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine10.png new file mode 100644 index 0000000000000000000000000000000000000000..2657e4d06d342c464cf364419df5befe77d05125 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`P` z7sn8b(^n@4avfF>aEb5wzfCOf7Gp-ouw6fB0M3km|0-2 z@75O=Z=Y-3^HkjL*h{u$OUhOqT+eoTP5y&8oBBoD|K>F_AN-ZY#;*OFneDED+Sa@U u0yRdfZKc=lS$mg3*kJm%HNTE|*D!Lomz=VG@M@e^USJ z`};TEYqs_*+;Xx(>cq!xu?h}%1r|$YcinU*lhj#1Qo?UVD2U7OScZRAJiIs1G&QP+ z-{rt8W}E*a5)<#wGJ0!!)tcEV{LOR5_$S%rrzOkZdG5R6+g|SIqoAg+eb={NTx-rY zu6Od9y*+!&y0ia2Yi~$AB%pZt53d%*TV30H`b$>Wer!=F~a yC)r28YAUytWAFSq4v6KbLh*2~7ap=XeJI literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine8.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine8.png new file mode 100644 index 0000000000000000000000000000000000000000..aae79cb065f47bb3a700dd4941308fc908ed2ba2 GIT binary patch literal 372 zcmV-)0gL{LP))>M&LGbJUgSRWwbNuBxpLIE24{PrSgpwnxcPqe<2`& zCR^|_U4tNLDFi=y*EUo_8o=m`8j}f@2(%3)&@MHiZRmk!PE=f&`Mt2LfDcIo@CG~p zCv8Im9P*Xm-Wl~MEmU&u?)fhHQ|Stjv5uk#o2J$Fke Su_s^v0000aY`K?H<*-4oO|s62CsZ(#WZ zb%Ah>dxE$ph_iEW&~DN$Br^Z{JR_wm=C?}M7$+#L#F$$0V%Or24O z(BZ|%!2zy;owoiebU3-WI~)O=QIofdsI8v@k10%CFuwe3V`6jw&ZxW%#5ovf1#ua; zzYXxMi&k;k3xu{F@m+zKo`r!nCN3jN`M_B3Ym6S-N^~p+egl6}6i>~8*4%JLy#Vhz zdd2ZsW!uH!E9w?kq>)Iqt z{jptzCSnDk@9+69AeUZ#CC|56pjkZw8(`~i_@% literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1.png new file mode 100644 index 0000000000000000000000000000000000000000..a46dba342094e7578ce898c3ce4685d13b3b9485 GIT binary patch literal 789 zcmV+w1M2*VP)Px%&q+iP*`1umLn;_OQjm!LAr2|^D0iul%?}UzP@ar8oBM=l|i?_ha zi_m))KA)5IvHYTEu=WC~SO?2bL)T3Kb5#N+jLArcFw_j+??c^j8ONaQq?W&rtv zZlIpq@b!x8-d_UYolsmQRq_-D-^g}JH*P%&t3;>&3G_WQQ2thBMkDiVQWcsitJ*G% zj7kH)WQ^+1z``{!D#^OyER@x|?}k1==Pjt&XLK#i3`3y?*^UP=F8QLO>?oL)ZL%f_ z9oi%bUIz+BrRR?Hoc$13l6*}5Sg10?P_Pz;+l=$^-|+UJ3#MW{lnNNlp_IhCr4EX&(OCrA#_9nI}r4d*P3(7$4EQ(=B zE2esnBYLd%t2xwrPY%Umxr`k42G>Rz-r-%-YOC2R z;BR=>Ej$^9w7Nc>g8K84tTEFVwJYmLiQW#iG4?(3_8@(4A%_egb*N{RHoa)0TjpI& z=|@MEu$4MG)W)*-oEICNG@rR1u6FL!Nf?;{O-7i_^}`|{@0LvllA1el$tfAxh=m+7 zojRL<|3GJEhH?R6wGZVIcn)=S%i8DAf3B|E{mAF*JOP#bl+N`Z6!Z%WOl9B?iksuC THVtpx00000NkvXXu0mjfpAUTu literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7263c727370e274bac38adefa23fbfc40025b19d GIT binary patch literal 1743 zcmV;=1~B=FP)Px*iAh93RCodHTWe?>RTTbqlWd-C&8v-RQq$U|v7tsSh(wgAKcosGf{2R#5JdzZ zAf<{3_D2yPi1=0tRYXw{eEiVXA8OS4pnoKmq_(kbXp@-dCN}TQWBtzF47=Ugd2Ef$ z4Y>z)=kCmzJLi0J&bjBD*#Qh01PlTO0fT@+z#w1{SeXcfMD2K6OATVN7l2R;;_(Xu zgQEIAb?M&yfr)@n=x-v@ib!O4sHwF(lmKTY)<%iSf|F|T$~pj)1R;w2NK;r@jt1Z) z1=D3zCfI}%Zl#Mz+Q|`W2?rW;v;!nfAjV@_kRdk&3_xz^@R$L}1E5@wrIUH z0rClmmcW8?fV@)P31HvY8+3W!d5s+0ofYNJ#HO)X|EvuE3P!?yfoIVYV z90Epv0wy|w)bBrEJ3D|%uLo)#1PW@LFC5~Og`3o;`d-G6BS7~Xz&N+dko*CZ%TCDV zy|kRBq>8h{w2(to{3u;(h^{rJTrE;TzRPJ{R{=T29B&6Mc^eq|8t8hFt(I7Fj%6_N z2B@eW*z&w`B~fVdBrW1C;GbWd)f@PnZpW!BZU&^sBcN5>M9ZrK{(6#t65M4%VOKfx zYk{q=DsbWpz!?J5PPcIb$C^-L(cqWBkvnKT2h`q@ZJh5F7C1!~m-bs{fO1NJdUj!D zby}DKI-dagKA=MJ?37xV22SlIxNoZS3O525@8LMn?agkk0Jxo9toC8L#0Di&7hTNN zYPhnA8_hD;uU*MVZXnFQ|jj7`G_X`NGcK5I`l zwU~9z`EDI*xy&vm!b`q0KLPaY%Y4bg&A_&Ifz?+4Gre5VepaiQtaJ?oLgJT=B#ynN z_U4rVYj3l0=(fXdLE(Jm0wQVurv&M2W|`}DDXZ!GIH`0f!XW%IE#xw;UiUEeJZnF9 zqMh#gn@R)9ZeU!a>p4+2wV2Z!e)s!!vDH^nae^ciZB1-!UjjsNquSm3Uh=TyIFj!O zKw@D|6#ZTSRJ>KKkg)+LPF05mSc}Q1$9^w)EbrT&^5A+VFow2Qd1EnYA6 zxJF|;K(Z7IN%`PL>9IqW<3v(P>l$kV1{lBGNaoLB8X?xGG1&n+A7Le_Y~bpYU(G81 zN8rRWOILGgmj_vOQeGB!w(2eg&ct#5;8^p=Tr5?~JV*kskXuVbaU{P>8r68{D}R=g zTdLxZoHe_6z2t0KjqENq{s#r5MM$tN+~T~FrK%AwCNQkgCXS}=bskHpVUb&(NXtCv z>|s@$N-k8^!c4l;QpI`O^&In}1_IRX%#(Vg>^k*p;uuo}mmEmA0`5uM^B}3*tvqGj z?R16Jsj6ijOC2UvzVv{+ND@qGrU^yARa=d}?Es0eJ^QKeJi(#stbf2me6}s>UjjBh z#S-OO4_;ob_7TM+mHz+>Va+KsK+~sG$soe7V?kMdql+4}99i0@dsxAHxTCaCq>>ks zo8XphE3Ux5oqa-D6H=K=PpFQ~GU+)x^@Jn_c~RBfsuv`D;=+Spc%7k+YnKOEV$Y8Q z$9J=(u}^gsr7zw6&SLdVtMN@V$9XH3yLPwe5?#~fPbL8*$*oB@tKs#Y2) zPHP_m8sBG-ZBFINJeGi6c?+=plO#Cf9h~nmx)$rOWkR9&;b!k!>Gaq~9u7+GaN@pG^O94cNu}0c0uZ=fR=HYi+Z6aF_`oYo36%&OthpKqKEV!2ZDCy~F#_vjk#U z-B#42X8}#}BgwYq1Li+q?^^oHxvc2TpBDt7bRu9@df=yUneU`U-`Io_ujJpvcc`aP9ASMZH(oi!$4FU!M lgMdN6AYc$M2&@zY{snY6{S_0-^5y^l002ovPDHLkV1k9DMnC`n literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5e7c60f150c2143f110d29c1ac1834ba98c4bd GIT binary patch literal 1051 zcmV+$1mydPP)Px&)k#D_R9FecSXpZnK@hI$*)wcR@CfEW;`s^6J9MWz&SqzaFg6Tb(^d7=m+I=S z*&sw5Yj4tlluM^GW$H?JkdZKD2i#&3husvOecz8aqCjK4PU~+`YjTPnHBQq?APV+J zq{%FfxXsx6b}xRdCq^(}6@)c6sjGRMKS`GQKv|j?wB+)H3;jUWX*n+#Ht+W&M*4Iz|HrDbBMX2jC98-1iCk5Bu z^xgFOE2eO|?ZRf1TQw{pO#m-oU2kLdfDq|J}?wUmnCy3eL(xst8+SBO@8e*5iUz z>=q$mvO+P9YZe5om=+<%c}HACbR6RP1j{vx5D~O$!5*(LSxq zx(XJDWhSOYNMvYTp{6XXtrtw%KO80aGVVW8jxszCRx3Zf zW!!~TYO$VKZqd0RzrKRDE6jC4yb`LJzB;cwN05j#U+uM0s!$JSex zfd9}~)nARX4OVAJe5STS{WYl|1Ls=Tg>qtiw!!KQAyjXy$}!3;uM2f$RPz^STc5Jo z49UhiPlg6x+4W(9N7X3|#%CL>Cgh;q;xzOzZFUu$ILkvIcKL-tiLj^ VIA81Y`Pcve002ovPDHLkV1n^|-dg|w literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8d133c34d7ac3d0bc4d856d36cea2726e103b3 GIT binary patch literal 2035 zcmVPx+tw}^dRCod9TU~5aMHD_WcX!+E59KE+DneRJ3sMLH;*0uXcu*cl1ceH%L=@7P zsHiU{CcgQkiN>Hv5u?OH0WmQ#MiPx7F%b+zz))=Yi-{&^(6udXcei`zcy8;4+qpB- zdw1{tdXvr0IWuSOIp5CD`R?3hP@?MzMC<%f*cqL`F3ZLRmVl;+fVksMhQqkcVc53V zZ<#3Tt#5(7XV$QZQn<>BebcsM_&{t7_tmAaEn*}0bN>uyVl2)E$Lm=42Y>0B9 zA8F2L8ft|77dosRL4yv`zMudtJ!tpL9YJLP$QX{s*`*|BpTZ(|XW&6L;&yz+ajZ`b z!LC>mI~!@eVj8d#v)IS|Pg+mAZNn@V44@^4amU;tu~#*6Mr+yc_vE@T3qkhAl| zQ`ju~HCh9^f7ryvWqq#l<#jAITFc*-?djeNTaI9ptj|Xd6`)iCc3FxAG~UKv&BsZV zZTl8@jkucau5f~kvo$&3AsL~94bITZ(a%Q z3lET}1Q_%_dZvV`>9Pa(Qf)@O9?L)zm$GD4`*PMf&z{m2439J$4oW0xsl=Y&?cOyWnPh&LtlStCSSNN%D^0Gj6G@9rvg*TXJkTLM& z0Bo&Ra2(8un((1CY%}3+1PFv!VKT0UI&O>QrZ|iMF$52FFm+ambsX6pCcljUahu&{ zGOmg`1Y?Y5fDqL1JDD*? zGeB(WZHvka+rP*3L}2ob5}kz^ARB6QhSj3yGdvzK0|XGt%Le5PCIK)L25R@)zQD#@ zh$$_4uxCA={5WO5SF!D~emO_u?FUht3q`UGY4v(7Mvb(GuL12UDO$xW6u6!*4 zu)HclYfN~)vVO1{Dq^t;{s!9b^IzPXMj6r&MTF(;}{dhpdYYx3iibG>LhsIibcoFuBW&&zthvT$Vw z?($6b?zZl7q3q;->EGzAeV_M))icHF|ICl5Ui};3=j&4_Ic2|BvF%iT#navsR?kRT z(SsWs(f&-;LAC2fnbmoAC+l^`>6v#r(&jd*)-um{39APn#Nrawaspd`m#}&OB1Pa6 z)p80lA73I0!m0o$_=##hPL-9d;)K-$5FKk(1W_#nu=EE#PbTF7h%pHDf9Hh=q)>g* zmhK^}9)RfP!-aC7-1`;68@mS}o3Z2N9!R156M)~yeR~o`r@{Su?CVkPO}k~|YLX`e zyK$Px)@JU2LR9Fe^SKDhHMHrvU?w*shu_;xPrnTN4v|`Y{h?e%Ph_p~qNiCxERbRyy zk@!#%@ek;$Alg=qMJWXl5rsngD1z4dP#WX07p)<-X>#`L%#Ppho0;wA^u%21i{O$o zm+$+2moqcFXCuV_*FUd-9R1_taox6W3S$%5U5kM8L3A-+jcb7_R_9m&zD%?!Gks7# zI(4Lw)+Wr;L%@+E2`hoTr*JfJi+Go6qXf(ZB1dWt4P6|fMoQ@yDL9F7)F8yw{}Nsl zHu2jO#p>)qF{Cgfv%x6W!7PH|L*rsi<7p+tU&6TE(v|ykVefXO^n1mrf%))M;ji7(>mEckDY}8apnOOp0~c_V(Jo?PZ!yK_l*ZwHt`l zHN%(<;VXnWf9p8ro?TEr1Z|=(6a$SNvXMO{ogLKHzEH;}rhG!r<*zob%>SnI;;jcZ zJ%3-(Opnn?^bFKuP%T>+2YTTTGtHP3JwCxb`nXMWmRynQ&$o{3A3J;Dqi+&pcht9| zCg2!PTb1U;uAhHBa;03~*kJ_C+vZtbDX7y2U8O|>Xek8w;z5{kl@Iffnhu!}>-t~$ zsdcoKbj(gdvxkNFz*WO*TMi~Oos(OK_wO@_ZpE91jZyhRyrbO?9KOKM;`Sg0fYJJb z8R~t$jU5JrYbamGGZg{4@!Ht+XD%N7!laEcA^jTk!sGF>V1?K%M1m2&rZ~WI zENNZ;N?Nxjnq(soXBTi72Hp4&PK$C^b4}kllc*L-d*KoHE5z9wMIeu7!X$Dk)owbo z@Q5q^#(^0fF7CsGPUs0c@5XUvkcc%H zRKy4dWh=zRLdjVp>4RR&S)S9FR(Mni{bdyC#)BrQh-(6TgQA*Z#wEuRY2RZKiiMk( zjV)L)s@>Z9WKX_n?ZaHVNRzatpG!Tp--W0f`lR};0zoiAITl9WuLpjx#q=Q3*p5(A zk=5}{lb>i#=H4vo>4W+RigWHOt?*kJ>gd5p8Tvz!ZvqK;C|;-;I{1EFz!A!;+89_2 z56A*uFIUC7@%~T~8^oBD2Hay#1Cy&qXccDaF)j}EY?6|T;i-(1bf!8TDW~G?jxad8 z@qDOzB@y#?n%QfGJc&6j77p$>&x|*db8W~$nGW`+M!V0J!mGF(j71YjSd$v%%DwdJ z_6|KDVknk)7aR?+9(bHFdZs&_rf(-kJcIHe(G%|;lup4;oTh}XJZ^a zwu}YfDvZ1FxsaFBE$+#*)1Cm=Qut-P4`t4cWLGa8&Ii=vc*ud2SB9G&V-%2d;lwPx zGmRFL@^mJ|5WDe~7R4|7eW)qq?&O+%cg_rLo|ocOJX5SqBEcK4nw6rQ6LO+`?}pox zPJXy4#3Ax>i$glT$GbB(v{z54(XF&B!d6Pa)$ z4WYlzbJH?T94`{}vTdmEb(xgHn1@th#&p|#J0Rs2q638aAchHUn)qJ~jCJeFZRbDm z(p=5(8$}e0M4rv((K1mDQ_oi-tH3Y)J`_EW3Ok1g#oz@4j@8GM;N=f7bbQ6yCGe`0 z(s=e8B2bBkj)em!$B@IkP8^E3gTqzg;YH1t_Mj=fDRAN9K2BITOsI=t7DX}g2yz_) ztHWC|bKTg3{G~k2%G+&|bp9%b0Z)wI-Sg6_dHFfCaw`GBD^_y^8@1_bcyG-RE0PQP zV;{F@26W3_+6T|Qf4NVoJE0j5H;>trZ(=S!Dq?=VEPp?H|AC=e>7v6GuMqDFl;~n( o;VVV)>afQ=`sz&_sQ=jYH+DPeSs|7+*8l(j07*qoM6N<$f)iv2<^TWy literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..761a362e918d5d8f5c609f8b7c57b2e0f9b2692f GIT binary patch literal 4069 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 XklW#uJFVx400000NkvXXu0mjf1%UO? literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfd50c8dc09d014c69ca90ea2a0d2e68dfd2252 GIT binary patch literal 634 zcmV-=0)_pFP)Px%G)Y83R9Fekm(MFiQ546&^8<|^8Pm*AkA*Dklr3c}Sja+zWKYS)(t=X_0Tv>p ztStQlN|Y@jiSi?6*o@y}X8ay=A12**@0&Yw?@V*+)jQ{&&iTCazW3hufE*hZnrCR_ zxa}*31t3;Q&&k-qpnr39rL{R(4l5my2^dl%8hP|}^{;Kv^=R7wq`EWz3yMH7fc~dY zf1eC0Yd|)8UgGJ@pt1(!a%m8OvL~>qo5`_ic-;Avmu&`b-Y`CO&Yt}BIvmB&v|2jG zM?1Jc)3bgQ724={rX7xaGX3c|xj?sfA0St@N7ghX`d~Q+#C>I|MNK;7apxft{X#g* z*Blo}wWxiKPV{zp@%|CR%zOYRXHn)`fhO+Yc8C?6s_zeGarqj12hS)ev7^4O7;{Tkh{m1cQBoiT$UL|mYBMJ)qEfRu__7Dg$M3K(TT zs$i4=)l@t5edcdzlhq_DU;;o7X$@6r1-J~n==+Q;41wdWGMe1XuBt2m*|(gfcA=$h zmP;CFXFr6{^Uvvh;eWx+?YmjMq;t|hPfwrN-VG%!BpM*CA<;sjaoi52a+Zk}6Zt#g z0;O`6i2{lIop6EDJPx(V@X6oRCodHo6TzzK@`AWzGFh0+7@bPq8DpF6s=#NqO=!1c-DgjJ*bFQES~x= z2nCDUqW?iX=+T2xlqwcKKu`n`JV;GJOPi$WhqjwE>%62BTSzkdl1+9t?m#;2zM0wg ze*4~hylnuiVi72ZfK5y18-w3MNhLj`g4zoz1hw=rs!en@^78T6$zHwgZx;=Oa1>?j zld7ucWQT*cEdNgQoaq~%5ZR?wE(C<0!@x9Z9Z-gLdO{Kc%7m2+Rugs53z86!8N#X% zJ3SzY0TsHtNv@X*spbLUb1Vnae*vf*NHqt@;cyiU{!%=t<^XxTzJh>C@uZpqw6$Ry z*zFG8Ak`cohtmbY;7;)Q1E5E^Ig6ssBkVid0>_UA*i+JUjLS1Z{!8h!3a{TJVC>OM z{sx4r2&uU_tffbfs1ezNI@^7^!$Bnxc*m~d^M}ZoO329`G&~xCt`0xg^mQOmRe&#F zmn&goS!0p`#phEn`8HA3P0iGq9AaiNP7hrzKmv*uAPbOyfIw_{kOfFUKp-YB^Jdsd z3v4Ed$$-qVlMaVGaQHwyBoYknB5YgmdXaFmtwBT}^|>V~23a3pe}2B|)mGRg8NM9()&EcuT}?O$ zi0nZ|?xd>?rzAi|?WB!>gMi2(hMlTijDmx9N)O0LIMM?$8jjR}WPpQ!$g3E3s&t{j zQ8LGiQZ|8F?2rx+70&IE2;jLTq=ZKbI!mcq&H)v1~qD zDNyOK%HB2mQwk3{eX1#wLzWE=B9a1--0%&jZt><&9JLhm+cr6K_Y#Oww(FOS7WiDzg9MnS!K;tjsu&2w< zxn$~CJPFU9$5^g;ZPWE?{~-mS$#)6BkBmjyNm>?I79hcsumD+r1Ox$@Lh531CAF@e2gv0mT(AOkY$y%?F0P94Z0rqg{*GmHgD z@Te?679arufmrN8HuxzR!@Ob*wg~~*z&2rC0>w4gVw(_<%WWS78^ns=%7jv8Q^q!d z>Ow#xLv7P;w__jsceaNNl=;Jr*?_j7O=z2dk0rJUlu6((V69|eAc`vL00000NkvXX Hu0mjf!%r0r literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5.png new file mode 100644 index 0000000000000000000000000000000000000000..23522960fe518b3950bcf0832d61ca5d9704aaf4 GIT binary patch literal 1525 zcmVPx)uSrBfR9Fe^R!wYGMHK$#-uqt5Pk}0hR0Rz!i~0v9qA{Tgi@HILZcrm-Av=xi z{7V$HCdMrgU9d4#S8OCG3oxdnRHMO&K_ZJb(G)BYgj(9BefPb0$8*lybML&@SEInP z)4sVgbIy0pcg~!ddx3?vkb#@afGPJs`ff6PWlvHqMFwVGYZjKIPHruYO|7mkZ)C)m zH^L(CE1eWvuux^hyDiA>(C3>|@buy0rqtbZ%;hDb$zX4o13yXc(@9{Ub8OH4-e zg^bg^Sv+$IdRkrWJGWFZ^Xxl;L3ZQPMXbn zJkQmtZkhVwtZ9?X78V0hvs)rrZBgspvU;Q2CL*AQ)UYW{AQ?Laq;;k1Y%xC&y#1+< zl$z@0IwTJYC~iNBX!Cob%rdH>^uCd$ypCk*buKO^=VjlaL@K%#O}#@f%kPnyc6Q&q4KD*!GlsInEtAt)aK|Q8e(fhC^#l## z!!N=#w+co(J3F4^Ws$5cT8VJeZd8B&2KM}5Ca*d6>YzG0fbi-$DPXQ6J3|I}JBdt0 zMa?J89e+ntaq^tJfMoK#gy5u<7w=W0y3u2A(BWu8b*L{3jAcSdQ=aWJ@huJ+(D^jg;3Fu1`#Mmb znuD*q7%jr}&m!9T5$wfNC=c#QQ<_H$IzffU`(WBPQ3l_H9X=vtxf4=&Y>>6Qt1wCC}W zUW5mO_W>Dj4*V0sRu#zOaPuC7oll|k*=Cp|<|S#4Oapwe1-7XLW^znbGkv8duMVCB z>w4totbG3=Cpk+cA9p|6yhH)k<=Zx7EHx%80nCSwCu_)vK4Fv$&-06M)r0g(_z}id zQ{%Gx;)F@mL@f?Uo>Ux$uoyWiK@@k+Eow3NFC8C!EqbXTW`?OtbON4%p%<&%oHh{? znh_U8-doCCxaJ82t2UrA_Cw|_KKugR)VF2x`3CG$ZQI#vnOgQeR5|l0eRC|4LPZeJ zZF~;N_y|BRQ^Zq}AyZrm(?qY6)((2(Q-LN4D!&{=a;Bf;se{Qs>88FQ&iwk5pi>H} z%US0ihpB6I$DV{#6Q=Dx`AQ60*V7SR4pUqv5!m=T9btOgj}Jq>9_fzaZPTX4bn*L=@->!MS0 zYx9aD%+LRd&%PMht?yjNY>b;PZ$#Lav-2Cp2SGKGBH+T(D42kb^Jl)sBW{jZe)3e8 zWjfBE`PzJV<`M*@6@93NLQ13Jr`sqtO^&_qU`N8Ot25R1pZ^zch(l0X*5@oQ^a~ld b@eKR}>?+ZMA=+)!00000NkvXXu0mjf&QIaO literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..aca56d637f76f28f206242c47e50713d88af7fb9 GIT binary patch literal 3569 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 literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6.png new file mode 100644 index 0000000000000000000000000000000000000000..66d6c9530b963c524cd2573220019efe27889f28 GIT binary patch literal 506 zcmVPx$v`IukR9FdPU>Ib85u1AyFa56-{K-(q`j>$Pn>?jrznK~Syk}=ui22-3^5wgn}5nzTDXT!8cjGckOPKbel1z4a=d5kGfNQ5R)w)qtULx30q zLyjyV>oMhN;-ITv85r_!Kpd4Mg=r~15t=v%WFg2=IY37}`-RVXOgXaC5T;R>A~%4J z0%1}B%|eJ2M_+*D)Z|NOllN6Ub42 zfV4aZh=&SZ{$yZyLt=G-Yy#F^hxv*B|B)5Ziha_85yO6x5;d(HhHUPrgOEc58+*`& z5JsW`x%xj4U~@gS#TbDA-At_6KH&b%707*qoM6N<$f;C0Va{vGU literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..84ede5a553888a9c48b27d789a1cfe50efcee4eb GIT binary patch literal 828 zcmV-C1H=4@P)Px%_DMuRRCodHn@?*KQ53~b($=bAh4_D=f*ZSSsl=@=b*XjZM-Uf+A3}8D#t$Kg zBBJiZt%VBitQ!qB><*)O#Rc$?LKmw<+iIu4Yb#3x- zjO*2rwCB*&LQ*#?&WRn4ESU5ly=WIt4M?_?HtD#>mFYzdD7ItHev4G57d4>$CY)r= z0g=^pKn{oyAhJ8i0TBX3b_Y2iLV(Ebpm79r>lE;60a!djstfX^IpFOgaQ7UKwTKvr zgRY+dP96ZRHh4=C)0hEnp8@Wl=kddi7zvFOcnwGJD+S-z?vMFXhS z0X}VI+^d8X4WPdXaBr=8NYMZi?{r20DJnpNAYD72Z9R*>(E%z#`nZ`P3C1!T(`K2C z6U%nH^Eo?5YVX=j7NvuVI4t4FJkbLx!m@bpfCyCwYo zazKOtk=;R~1avH1Y>$1IIY_S2ya~5!p3DOW&1SL3Z&rG}f5&3!DDe1VypYTQz5WTj z_>ryfLb&-CDen_T(20@yQ=n?cvF1d=6(m?A*xF;{$Ev8}apd7}d7Vx}( zOv?Wk!)s-L1cpG$58U!uT*XGx56WLz{IK;(0ZH+)-JX62eup~|@7uhccOhn@8_ubI z@mPxp#q$-}w9OBxX2C6LG|9Pgx%k}3;3+D1(BM+WQ*l6KT^x`DA_R!+4st+*0Fm86 z4u}vSvO9AiY@6=lPvLM&KVz`KUc*vY8S90000 literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10.png new file mode 100644 index 0000000000000000000000000000000000000000..6242e61944773486295511a70c6dd23e7a602ca6 GIT binary patch literal 14855 zcmeI3eQXnD9LI0s6eh@U!x^WpmZ4K=@2+dR_UKCHI<_grxtF*>6mHk2+p+fU=-sw% zLL4u?#TgKSLO^0rOo#yn8Y7B`L-Zd|49P$war*~EFhCZA7#Kd+cJ0%y;}OH3Pm}h3 zd!Fz2_j~U1yzKtDH*4lsPRV*Oi=wD0)m5Hac+J+o6Yqk*1;aOZc$uVBHK`PJ|4jXx zQC(YjiJ}~ZVtu35=$*$2a?s5Cj(JIfX3V1gjfctbcCkW?;QYK-LNV5~ROMngoR zwUrvn^n!*)Z;hc`4grJBY&QvPvBOZ}G_y9R!(yFfurREhW}Gx@H8Cv5I5~zj#6CuM z7K~gWpP#Gs%#D?Uf0Y_rHBI4Yy0f#>+*xdvLoGDxbUJCqLR%~*s4%HrlE#Nkk~$-r zWHgTls6t3oG*OledS1R+Zr4hUM!it{6T7dV5-%jFF?Nt59p)99H8XTNlTV0yl=e^{ zGBlq+g8&EuNmHSZP3u!yWldIF<#9^JyT>gI=fvxc*G@a$U@&cIRjcTL2x3UnI@S6v z1<2ukrX4s1Qlw6F9#d3i6s;4Dv02R-_ge zooGaq@fF3D%Kte*cp@6 z4@ykU&CP;|b+R^I;2Eb-;*a3-dQtnB)E-%A*LO-RweJ>FBla<=p9_ibl;Z=4Mj!pH zmPnIkOsOhSg=@15S+j8EM$WN1ur#@Kv?Cx!&Lf2nsX*UtrN+_i7C*q^=acS<>{^Z& z^pngj=$irfTy#=vVpwr!%qITd35@1P?BmzyYz5NIwo)`zL^XaARrYJ0dH!-X@F}?N9Y4tPPT=xh=7BDb0vWKY61^Lmhlb0B*a@R%~<8sm-a5 z8Zit4jUEy1VO3w5tUcyQ?MQ2E8qbJy#Ej9&LjIjc<}%s}9~R(q3LSq?NuK8TX1L8k z;*M@}Vl*8og3`do1Q!+&Dj>K}8rYcN!XiQi1Q$vJ8xveuM5ut^LTO-Qf(wfX6%bq~ z4QxzsVG*GMf(xaAjR`I+B2++dp){~D!G%SH3J5Ng1~w+Ru!v9r!G+Sm#sn7@5h@_K zP#V~n;KCw81q2sL0~-@uSVX9R;6iC&V}c8d2o(@qC=F~(aA6Ul0)h*rfsF|+EFx4u zaG^A?F~NmJgbD~Qlm<2?xUh&&0l|gRz{Ug@77;2SxKJ9{nBc-9LIngDN&_1cTv$Y? zfZ#%DVB?$O%1XTY2PF8uUnhLAucOD_244y^2vxOSit2_h5%#R2sH->N^&CaDGZgj5 zVv6E6QdFM2Zqebn6qWH}wWq8;d}{Ua*=-GFxtW6(3)d^lUu*5lo;JC0``&4<=63A3 zGoKxl`#!rb_+9@qmns_*t9zCZW9Eh`QU9l7xJz^S&Q z=a%d|HsstjxO=2Qx#N?}x-VAz8ty&1^-TG)Z)a`Yz|j8T$3`Ch`Sg(W^UJv}&%AJD zPkvKQB{libwTXG`Eb;W)*RDQt^?dk^_utvJZj)b`-qKB-sa-f+w6S-%K-sbBuLnj3 zKgc-QTbUDlXu`6$rmpf2>~_4qe#*fsJ@+o?`HekO_Tga8yG!#<W98HjmH9 z+xv?Bhr=|`|de*c#EP%2EH%)-SQ7V>3DX& zvuEdid1%3ezLj~89_amL*T9!6XaBur)$>_%)^~00cYl1@yj0py*q8n35_Rg2Yxdn; uyyH)0YFnm!`J=OsFF9d-Y5VSx0;+6zQ?E4e({%k+&FYHzo?TBbUimMpTTYe$ literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected10@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..568b5428eee059393460730696e060a6618970b6 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?2=RS;(M3{v?36g=ta z;usQf`0ezEyv+&%Zt`u6FH~X=2EJ93byV9Z9rNEInZql~X5&*#?nN7W)nrBqevf~RCm4_LE}j#^V5Q|Qo@K|TE1Iqn*F1vd&2g+MeblKTmyWrbn7_<9Ws}JH?|OSM2)9 Z_IO`!h#=p+4M0yZc)I$ztaD0e0stFoX&L|k literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected8.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/selected8.png new file mode 100644 index 0000000000000000000000000000000000000000..dd04302fc1c97c1f0a9efe308ec39e6ea45abd31 GIT binary patch literal 14941 zcmeI3eQXnD9LH}17MU5o5I5wt6hww}cei%ydbXY03T%OnvNyMgu-n~jJ818Y_DahF zV?Z!2N(e71;l+SL0t}S6XaqB<8YGfTF&T&wl@JWFh@g|GyabbuK=uaQb=osS?gpV8ha zWffDe6GXubv8q42)Kmw1TvbvzhE%}(BO&`w7fLLoL^}4V` zU24-8X$5t)PM5Ak_6oYZoO}aE8w+%1OAei9DabX=)a6oiK1o?f+GL<;hO#get&6_& z_H+?9W15g-zD@X<+qO0%rWzGiudlCka~3xhdvI%Bnyj@RQ!TH2@1S`H9IktTKe zs#YihSt0mjzn2qcEeDq}CE3-hVq<)A24vEDh8(*P6o;^BJrP@YDMV(-3a*tY@d~Ue zd#hyGZI7%nS3g2sNr|?q%)04LmJ=n7Yqph4G{t8;o=xMMi=pVF1k~D)#m5M&FLRUa57p&j#X;vvL8`#?4;TFTElEQj@g0|;u`uh?$UCKCl-B&~f$y>Ne`w+`Wj`xCu!Yqcb*_S|T>gl5R4oxhQzp%UCG2=@HE zJY$}fOl(ecxWu5~u62lD5Bs#0NrPP<_9S*BHP#JfggTfyPJw1Qg(aJNFn zZdV3Qb8Is_>WM4i|xGAY+URi3k>8Trdq}jBz0m!2*m6rh$wxE+isYfN{Yz zkTJ%EL<9>kE|>-~#<-A(U;)Mj(?G@;7ZMRHz_?%<$Qa{7B7y}N7fb^gV_Zl?umIzN zX&_^a3yBC8U|cW_WQ=hk5y1kC3#NgLF)kz`Sb%ZCG>|dIg+v4kFfNz|GRC-&h+qN6 z1=B#r7#9)|EWo&68ps&qLL!0%7#B zj0>iLj4>`GB3OWN!8DNZJ#nSS9{?02@YG)bJl?nda3>EQ4b*X^6;6U^0gn>4ts{tk z?}G0u1mUL$qPLzPm~8}+C2wAQVm3jf94>PdRRw=oxyAYFh6UrlTz$=--90am`T3+N{b+pcFe~wOY9H|iGh*kkX=`d0xQ5ka-r5y% ztqinPh8AZ0v-zUz8GU)pmDFo(--YPikBvzgdt;u5Xlm=4weH!_`i7sMJ}9r58#3&! zJFu~B%L`dYj!mx}{?o9+&fn9d)WSAPz47!>buFWeIajGHu4$%5?VMkpdC~>$cHZYri+WOl<#UWZFAL&;OkfYONn}eMWJrO89$d|BhqjSG%+P9n7KD z>cRt)Iw#hc4|Mb_>p7XdH&k?E-*J!Y#|aBxlZ$N!N8LXB*<^oy`@2g@y2hv-CGFk& z?_AAbipxISH_^56*2(hyciIn>pFO{5afj>Zn;qNJ>~nrK|8Zusv2*Ihn`?_V-lRq^ z+JAoCrx)rPxZcd3>>H)ce;pimW>xRisjaT}_rLYUOE)B`y?4^_zTwJ*b16I1mY=vg f{^KWRrrsV)R4coxn}`eHCqT<)l{?-mu3!5fuHP)0l)q zNC}H*AasyDaeQ1Hu)H2;5|W6KM)Jna%qP!JW!*kBR}^5Isj!3U@LjeLF@rwa}av~WFb-j4ge?Atp%~y4Tun785S!#dIIpKIk?pg zd;s`b3ZTh>soeMka5vE_cC7+Yw#osG@L$}3HV52R0JkgIsQ{Ru#r9si=|KDnW@_nY zi6Ju!4E{`N9{6#(1mHN~I0bTC3&15DbR;dw%B%IyVsU|;W-dVK$E#SH%schOh-S3_ zlJhn?Gu}WL^EL;e1?Ys>j*d)}6N7&?f(-(M3ZNC7cfpy{f_;)~HJ#81&%+vjPV7Gf z>$70vFOvUuk;&nvD&Cda~Pli0000 literal 0 HcmV?d00001 From 75c6837e3571c45c28a9fefa69a9ad9921818135 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 21 Aug 2018 23:54:36 +0800 Subject: [PATCH 03/77] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E6=96=87=E4=BB=B6=E5=8F=8A=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConfigManager.java | 21 +-- .../help/alphafine/AlphaFineConfigPane.java | 26 +-- .../alphafine/AlphaFineConstants.java | 21 ++- .../alphafine/cell/model/BottomModel.java | 7 +- .../alphafine/cell/model/RobotModel.java | 8 +- .../cell/render/ContentCellRender.java | 20 +-- .../alphafine/component/AlphaFineDialog.java | 160 +++++++++--------- .../component/AlphaFineTextField.java | 6 - .../alphafine/preview/ContainsCirclePane.java | 2 +- .../manager/impl/ActionSearchManager.java | 3 +- .../manager/impl/ComplementAdviceManager.java | 23 +-- .../manager/impl/DocumentSearchManager.java | 20 +-- .../manager/impl/FileSearchManager.java | 2 +- .../search/manager/impl/HotIssuesManager.java | 70 ++++---- .../manager/impl/PluginSearchManager.java | 23 +-- .../manager/impl/RecentSearchManager.java | 3 - .../manager/impl/RecommendSearchManager.java | 30 ++-- .../manager/impl/SegmentationManager.java | 13 +- .../manager/impl/SimilarSearchManeger.java | 28 ++- 19 files changed, 243 insertions(+), 243 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index 11bc0fb34..d62f44a4b 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -58,11 +58,11 @@ public class AlphaFineConfigManager implements XMLable { /** * 分词搜索 */ - private boolean isNeedSegmentationCheckbox = true; + private boolean needSegmentationCheckbox = true; /** * 智能客服 */ - private boolean isNeedIntelligentCustomerService = true; + private boolean needIntelligentCustomerService = true; /** * 快捷键 */ @@ -102,8 +102,8 @@ public class AlphaFineConfigManager implements XMLable { this.setContainAction(reader.getAttrAsBoolean("isContainAction", true)); this.setContainTemplate(reader.getAttrAsBoolean("isContainTemplate", true)); this.setContainFileContent(reader.getAttrAsBoolean("isContainFileContent", false)); - this.setNeedSegmentationCheckbox(reader.getAttrAsBoolean("isNeedSegmentationCheckbox", true)); - this.setNeedIntelligentCustomerService(reader.getAttrAsBoolean("isNeedIntelligentCustomerService", true)); + this.setNeedSegmentationCheckbox(reader.getAttrAsBoolean("needSegmentationCheckbox", true)); + this.setNeedIntelligentCustomerService(reader.getAttrAsBoolean("needIntelligentCustomerService", true)); this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); @@ -126,8 +126,8 @@ public class AlphaFineConfigManager implements XMLable { .attr("isContainFileContent", this.isContainFileContent()) .attr("isNeedRemind", this.isNeedRemind()) .attr("operateCount", this.getOperateCount()) - .attr("isNeedSegmentationCheckbox", this.isNeedSegmentationCheckbox()) - .attr("isNeedIntelligentCustomerService", this.isNeedIntelligentCustomerService()); + .attr("needSegmentationCheckbox", this.isNeedSegmentationCheckbox()) + .attr("needIntelligentCustomerService", this.isNeedIntelligentCustomerService()); writer.end(); } @@ -240,20 +240,21 @@ public class AlphaFineConfigManager implements XMLable { } public boolean isNeedSegmentationCheckbox() { - return isNeedSegmentationCheckbox; + return needSegmentationCheckbox; } public void setNeedSegmentationCheckbox(boolean needSegmentationCheckbox) { - isNeedSegmentationCheckbox = needSegmentationCheckbox; + this.needSegmentationCheckbox = needSegmentationCheckbox; } public boolean isNeedIntelligentCustomerService() { - return isNeedIntelligentCustomerService; + return needIntelligentCustomerService; } public void setNeedIntelligentCustomerService(boolean needIntelligentCustomerService) { - isNeedIntelligentCustomerService = needIntelligentCustomerService; + this.needIntelligentCustomerService = needIntelligentCustomerService; } + public int getOperateCount() { return operateCount; } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index 1520a7e1d..6f93631bc 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -55,7 +55,7 @@ public class AlphaFineConfigPane extends BasicPane { private static final double COLUMN_GAP = 180; private static final double ROW_GAP = 25; private KeyStroke shortCutKeyStore = null; - private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, isNeedSegmentationCheckbox, isNeedIntelligentCustomerService, isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; + private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, needSegmentationCheckbox, needIntelligentCustomerService, isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; private UITextField shortcutsField; public AlphaFineConfigPane() { @@ -77,14 +77,14 @@ public class AlphaFineConfigPane extends BasicPane { Component[][] components = new Component[][]{ new Component[]{isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox}, new Component[]{isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox}, - new Component[]{isNeedIntelligentCustomerService, null, null} + new Component[]{needIntelligentCustomerService, null, null} }; return components; } private Component[][] initOnlineComponents() { Component[][] components = new Component[][]{ - new Component[]{isSearchOnlineCheckbox, isNeedSegmentationCheckbox, null} + new Component[]{isSearchOnlineCheckbox, needSegmentationCheckbox, null} }; return components; } @@ -101,7 +101,7 @@ public class AlphaFineConfigPane extends BasicPane { isContainDocumentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help")); isContainTemplateCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates")); isContainFileContentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Templates_Content")); - isNeedIntelligentCustomerService = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Intelligent_Customer_Service")); + needIntelligentCustomerService = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Intelligent_Customer_Service")); JPanel searchConfigPane = TableLayoutHelper.createTableLayoutPane(initSearchRangeComponents(), rowSize, columnSize); northPane.add(searchConfigPane); contentPane.add(northPane); @@ -148,7 +148,7 @@ public class AlphaFineConfigPane extends BasicPane { private void createOnlinePane(JPanel contentPane) { JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Search_Type")); isSearchOnlineCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Internet_Search")); - isNeedSegmentationCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Segmentation")); + needSegmentationCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Segmentation")); isSearchOnlineCheckbox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -156,16 +156,16 @@ public class AlphaFineConfigPane extends BasicPane { isContainRecommendCheckbox.setEnabled(false); isContainPluginCheckbox.setEnabled(false); isContainDocumentCheckbox.setEnabled(false); - isNeedIntelligentCustomerService.setEnabled(false); + needIntelligentCustomerService.setEnabled(false); isContainRecommendCheckbox.setSelected(false); isContainPluginCheckbox.setSelected(false); isContainDocumentCheckbox.setSelected(false); - isNeedIntelligentCustomerService.setSelected(false); + needIntelligentCustomerService.setSelected(false); } else { isContainRecommendCheckbox.setEnabled(true); isContainPluginCheckbox.setEnabled(true); isContainDocumentCheckbox.setEnabled(true); - isNeedIntelligentCustomerService.setEnabled(true); + needIntelligentCustomerService.setEnabled(true); } } }); @@ -203,9 +203,9 @@ public class AlphaFineConfigPane extends BasicPane { this.isContainRecommendCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); - this.isNeedSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); - this.isNeedIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); - this.isNeedIntelligentCustomerService.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); + this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); + this.needIntelligentCustomerService.setEnabled(alphaFineConfigManager.isSearchOnLine()); shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } @@ -220,8 +220,8 @@ public class AlphaFineConfigPane extends BasicPane { alphaFineConfigManager.setSearchOnLine(this.isSearchOnlineCheckbox.isSelected()); alphaFineConfigManager.setContainTemplate(this.isContainTemplateCheckbox.isSelected()); alphaFineConfigManager.setContainFileContent(this.isContainFileContentCheckbox.isSelected()); - alphaFineConfigManager.setNeedSegmentationCheckbox(this.isNeedSegmentationCheckbox.isSelected()); - alphaFineConfigManager.setNeedIntelligentCustomerService(this.isNeedIntelligentCustomerService.isSelected()); + alphaFineConfigManager.setNeedSegmentationCheckbox(this.needSegmentationCheckbox.isSelected()); + alphaFineConfigManager.setNeedIntelligentCustomerService(this.needIntelligentCustomerService.isSelected()); alphaFineConfigManager.setShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : this.shortcutsField.getText()); designerEnvManager.setAlphaFineConfigManager(alphaFineConfigManager); try { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index cf7f04e0a..410796f26 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe.alphafine; import com.fr.general.CloudCenter; - import java.awt.Color; import java.awt.Dimension; import java.awt.Font; @@ -69,6 +68,8 @@ public class AlphaFineConstants { public static final Color RED = new Color(0xf46c4c); + public static final String HIGH_LIGHT_COLOR = "rgb(51,148,240)"; + public static final Font SMALL_FONT = new Font("Song_TypeFace", 0, 10); public static final Font MEDIUM_FONT = new Font("Song_TypeFace", 0, 12); @@ -81,6 +82,8 @@ public class AlphaFineConstants { public static final String IMAGE_URL = "/com/fr/design/mainframe/alphafine/images/"; + public static final String ALPHA_HOT_IMAGE_NAME = "alphafine_hot"; + public static final String PLUGIN_SEARCH_URL = CloudCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); public static final String PLUGIN_URL = CloudCenter.getInstance().acquireUrlByKind("af.pluginInfo"); @@ -100,13 +103,23 @@ public class AlphaFineConstants { public static final String SEARCH_API = CloudCenter.getInstance().acquireUrlByKind("af.cloud_search"); + public static final String SPECIAL_CHARACTER_REGEX = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】';:”“’。,、?]"; + + public static final String BOTTOM_REGEX_FIRST = "
([\\s\\S]*?)class=\"jiaoyes\">YES
"; + + public static final String BOTTOM_REGEX_SECOND = "
"; + public static final String ALPHA_ROBOT_SEARCH_TOKEN = "K8dl0Np6l0gs"; - public static final String SIMILAR_SEARCH_URL_PREFIX = "http://robot.finereport.com/openapi/like.php?action=search&"; + public static final String SIMILAR_SEARCH_URL_PREFIX = CloudCenter.getInstance().acquireUrlByKind("af.similar_search"); + + public static final String COMPLEMENT_ADVICE_SEARCH_URL_PREFIX = CloudCenter.getInstance().acquireUrlByKind("af.advice_search"); + + public static final String ALPHA_HOT_SEARCH = CloudCenter.getInstance().acquireUrlByKind("af.hot_search"); - public static final String COMPLEMENT_ADVICE_SEARCH_URL_PREFIX = "http://robot.finereport.com/openapi/getkw.php?"; + public static final String ALPHA_GO_TO_FORUM = CloudCenter.getInstance().acquireUrlByKind("af.go_fourm"); - public static final String ALPHA_HOT_SEARCH = "http://robot.finereport.com/openapi/hot.php"; + public static final String ALPHA_GO_TO_WEB = CloudCenter.getInstance().acquireUrlByKind("af.go_web"); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java index 76528685e..50dc169bf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.alphafine.cell.model; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.CellType; import com.fr.json.JSONException; import com.fr.json.JSONObject; @@ -31,12 +32,12 @@ public class BottomModel extends AlphaCellModel { @Override public JSONObject ModelToJson() throws JSONException { - return null; + return JSONObject.EMPTY; } @Override public String getStoreInformation() { - return null; + return ""; } @Override @@ -47,7 +48,7 @@ public class BottomModel extends AlphaCellModel { @Override public void doAction() { try { - Desktop.getDesktop().browse(new URI("http://bbs.fanruan.com/post_newthread_ajax.php?action=newthread&fid=39")); + Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_GO_TO_FORUM)); } catch (IOException e) { FineLoggerFactory.getLogger().error(e.getMessage()); } catch (URISyntaxException e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java index 99ccab4bd..85e0cfa84 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java @@ -24,14 +24,14 @@ public class RobotModel extends AlphaCellModel { private String content; //热门问题列表的list不需要渲染图标,所以这里需要区分一下 - private boolean isHotItemModel = false; + private boolean hotItemModel = false; public boolean isHotItemModel() { - return isHotItemModel; + return hotItemModel; } public void setHotItemModel(boolean hotItemModel) { - isHotItemModel = hotItemModel; + this.hotItemModel = hotItemModel; } public String getTitle() { @@ -45,7 +45,7 @@ public class RobotModel extends AlphaCellModel { public static String getContent(String titleStr) { String result; String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + titleStr); - String url = "http://robot.finereport.com/openapi/reply.php?action=search&msg=" + titleStr + "&token=" + token; + String url = AlphaFineConstants.ALPHA_GO_TO_WEB + titleStr + "&token=" + token; HttpClient httpClient = new HttpClient(url); httpClient.asGet(); result = httpClient.getResponseText(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index 367de258c..cd9affb30 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -57,18 +57,18 @@ public class ContentCellRender implements ListCellRenderer { String iconUrl = SELECTED_PATH + model.getType().getTypeValue() + SUFFIX; panel.setBackground(AlphaFineConstants.BLUE); titleLabel.setForeground(Color.WHITE); - if(value instanceof RobotModel && ((RobotModel) value).isHotItemModel()){ + if (value instanceof RobotModel && ((RobotModel) value).isHotItemModel()) { titleLabel.setIcon(null); - }else{ + } else { titleLabel.setIcon(IconLoader.getIcon(iconUrl)); } } else { titleLabel.setText(dealWithModelName(model.getName(), segmentationResult)); String iconUrl = CELL_PATH + model.getType().getTypeValue() + SUFFIX; - if(value instanceof RobotModel && ((RobotModel) value).isHotItemModel()){ + if (value instanceof RobotModel && ((RobotModel) value).isHotItemModel()) { titleLabel.setIcon(null); - }else{ + } else { titleLabel.setIcon(IconLoader.getIcon(iconUrl)); } } @@ -104,14 +104,14 @@ public class ContentCellRender implements ListCellRenderer { * @param strings * @return */ - public String dealWithModelName(String modelName, String strings[]) { + public String dealWithModelName(String modelName, String[] strings) { if (strings == null) { return modelName; } for (int i = 0; i < strings.length; i++) { String primaryStr = getReplacedString(modelName, strings[i]); - modelName = modelName.replaceAll("(?i)" + strings[i], "|" + strings[i] + "|"); - if(!StringUtils.isEmpty(primaryStr)){ + modelName = modelName.replaceAll("(?i)" + strings[i], "|" + strings[i] + "|"); + if (StringUtils.isNotEmpty(primaryStr)) { modelName = modelName.replaceAll(strings[i], primaryStr); } } @@ -121,10 +121,10 @@ public class ContentCellRender implements ListCellRenderer { private String getReplacedString(String modelName, String string) { int index = modelName.toLowerCase().indexOf(string.toLowerCase()); - if(index == -1){ - return null; + if (index == -1) { + return ""; } - return modelName.substring(index, index+string.length()); + return modelName.substring(index, index + string.length()); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index af7cf2d26..d9f06137c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -11,11 +11,29 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.CellModelHelper; -import com.fr.design.mainframe.alphafine.cell.model.*; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; +import com.fr.design.mainframe.alphafine.cell.model.BottomModel; +import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; +import com.fr.design.mainframe.alphafine.cell.model.FileModel; +import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.cell.model.PluginModel; import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.design.mainframe.alphafine.preview.*; -import com.fr.design.mainframe.alphafine.search.manager.impl.*; +import com.fr.design.mainframe.alphafine.preview.DocumentPreviewPane; +import com.fr.design.mainframe.alphafine.preview.FilePreviewPane; +import com.fr.design.mainframe.alphafine.preview.NoResultPane; +import com.fr.design.mainframe.alphafine.preview.PluginPreviewPane; +import com.fr.design.mainframe.alphafine.preview.RobotPreviewPane; +import com.fr.design.mainframe.alphafine.preview.ContainsCirclePane; +import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.HotIssuesManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.SegmentationManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.SimilarSearchManeger; import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.form.main.Form; @@ -33,11 +51,38 @@ import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import javax.imageio.ImageIO; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.Timer; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; -import java.awt.*; -import java.awt.event.*; +import java.awt.AWTEvent; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.GridLayout; +import java.awt.Image; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.Window; +import java.awt.event.AWTEventListener; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; @@ -68,6 +113,7 @@ public class AlphaFineDialog extends UIDialog { private static final String SIMILAR_MARK = "k:robot "; private static final String PLACE_HOLDER = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine"); private static final int MAX_SHOW_SIZE = 12; + private static final int TIMER_DELAY = 300; private AlphaFineTextField searchTextField; private UIButton closeButton; @@ -91,8 +137,8 @@ public class AlphaFineDialog extends UIDialog { private JPanel backPane; SearchResult modeList = null; private static String beforeSearchStr = ""; - private static boolean isAlreadySearch = false; - private static boolean isAlreadyInitHot = false; + private static boolean alreadySearch = false; + private static boolean alreadyInitHot = false; public AlphaFineDialog(Frame parent, boolean forceOpen) { super(parent); @@ -248,17 +294,6 @@ public class AlphaFineDialog extends UIDialog { win.setLocation((screenSize.width - winSize.width) / 2, (screenSize.height - winSize.height) / AlphaFineConstants.SHOW_SIZE); } -// TODO: 2017/5/8 xiaxiang: 窗体圆角setShape()有毛边,重写paint方法可以解决毛边问题,但带来了别的问题,处理比较麻烦,暂用setShape(); -// public void paint(Graphics g){ -// Graphics2D g2 = (Graphics2D) g.create(); -// RenderingHints qualityHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); -// qualityHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); -// g2.setRenderingHints(qualityHints); -// g2.setPaint(Color.WHITE); -// g2.fillRoundRect(0, 0, getWidth(), getHeight(), 15, 15); -// g2.dispose(); -// } - /** * 执行搜索 * @@ -669,12 +704,14 @@ public class AlphaFineDialog extends UIDialog { @Override protected String doInBackground() { String content = RobotModel.getContent((selectedValue).getName()); - //去掉小帆底部的信息 - String regex1 = "
([\\s\\S]*?)class=\"jiaoyes\">YES
"; - String regex2 = "
"; - content = content.replaceAll(regex1, "") - .replaceAll(regex2, ""); - return content; + if(StringUtils.isNotEmpty(content)){ + //去掉小帆底部的信息 + content = content.replaceAll(AlphaFineConstants.BOTTOM_REGEX_FIRST, "") + .replaceAll(AlphaFineConstants.BOTTOM_REGEX_SECOND, ""); + return content; + }else{ + return ""; + } } @Override @@ -684,9 +721,9 @@ public class AlphaFineDialog extends UIDialog { try { rightSearchResultPane.add(new RobotPreviewPane((selectedValue).getName(), get())); } catch (InterruptedException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error("get hot item content error: " + e.getMessage()); } catch (ExecutionException e) { - e.printStackTrace(); + FineLoggerFactory.getLogger().error("get hot item content execution error: " + e.getMessage()); } validate(); repaint(); @@ -762,11 +799,11 @@ public class AlphaFineDialog extends UIDialog { } }); - Timer timer = new Timer(300, new ActionListener() { + Timer timer = new Timer(TIMER_DELAY, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (!isAlreadyInitHot && searchTextField.getText().length() == 0) { - isAlreadyInitHot = true; + if (!alreadyInitHot && StringUtils.isEmpty(searchTextField.getText())) { + alreadyInitHot = true; removeSearchResult(); refreshContainer(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { @@ -779,8 +816,8 @@ public class AlphaFineDialog extends UIDialog { } refreshContainer(); return; - } else if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) { - if (isAlreadySearch) { + } else if (beforeSearchStr.equals(searchTextField.getText()) && StringUtils.isNotEmpty(beforeSearchStr)) { + if (alreadySearch) { return; } else { removeHotPane(); @@ -796,21 +833,21 @@ public class AlphaFineDialog extends UIDialog { segmentationResult = SegmentationManager.getInstance().startSegmentation(searchTextField.getText().toLowerCase()); } } else { - if(StringUtils.isEmpty(getRealSearchText(searchTextField.getText().toLowerCase()))){ + if(StringUtils.isEmpty(getRealSearchText(searchTextField.getText()))){ segmentationResult = null; }else{ - segmentationResult = new String[]{getRealSearchText(searchTextField.getText().toLowerCase())}; + segmentationResult = new String[]{getRealSearchText(searchTextField.getText())}; } } doSearch(searchTextField.getText().toLowerCase()); - isAlreadySearch = true; + alreadySearch = true; } } else { beforeSearchStr = searchTextField.getText(); - isAlreadySearch = false; + alreadySearch = false; } if (beforeSearchStr.equals(searchTextField.getText()) && beforeSearchStr.length() != 0) { - isAlreadyInitHot = false; + alreadyInitHot = false; } } @@ -822,8 +859,8 @@ public class AlphaFineDialog extends UIDialog { * 去除特殊字符,空格等 */ private String getRealSearchText(String searchText){ - String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】';:”“’。,、?]"; - Pattern p = Pattern.compile(regEx); + searchText = searchText.toLowerCase(); + Pattern p = Pattern.compile(AlphaFineConstants.SPECIAL_CHARACTER_REGEX); Matcher m = p.matcher(searchText); searchText = m.replaceAll("").trim().replaceAll(" ", ""); if (searchText.length() == 0) { @@ -1301,7 +1338,8 @@ public class AlphaFineDialog extends UIDialog { jLabel.setFont(AlphaFineConstants.SMALL_FONT); jLabel.setForeground(AlphaFineConstants.DARK_GRAY); backPane.add(jLabel, BorderLayout.CENTER); - jLabel.addMouseListener(new MouseListener() { + + jLabel.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (searchResultPane != null) { @@ -1318,26 +1356,6 @@ public class AlphaFineDialog extends UIDialog { } refreshContainer(); } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } }); } @@ -1379,7 +1397,7 @@ public class AlphaFineDialog extends UIDialog { final UILabel subTitle = new UILabel(str[i]); subTitle.setForeground(AlphaFineConstants.DARK_GRAY); subTitle.setFont(AlphaFineConstants.MEDIUM_FONT_ANOTHER); - subTitle.addMouseListener(new MouseListener() { + subTitle.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { segmentationResult = null; @@ -1393,26 +1411,6 @@ public class AlphaFineDialog extends UIDialog { modeList = HotIssuesManager.getInstance().getTitleSearchResult(subTitle.getText()); showIssuesList(); } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } }); bottomPanel.add(subTitle); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java index 006c0b7b8..ba4d279fb 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineTextField.java @@ -26,12 +26,6 @@ public class AlphaFineTextField extends UITextField { this.placeHolder = null; } - - @Override - public String getText() { - return super.getText(); - } - @Override public void paintComponent(Graphics g) { super.paintComponent(g); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java index e320c723a..15076d575 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java @@ -15,7 +15,7 @@ import java.awt.Graphics; public class ContainsCirclePane extends JPanel { public ContainsCirclePane(int pngIndex) { - UILabel iconLabel = new UILabel(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + "alphafine_hot" + pngIndex + ".png")); + UILabel iconLabel = new UILabel(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.ALPHA_HOT_IMAGE_NAME + pngIndex + ".png")); iconLabel.setPreferredSize(AlphaFineConstants.HOT_ICON_LABEL_SIZE); iconLabel.setOpaque(true); iconLabel.setBackground(Color.WHITE); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index 6335be561..a8d6d2b94 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -15,6 +15,7 @@ import com.fr.general.ComparatorUtils; import com.fr.json.JSONObject; import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.lang3.ArrayUtils; import java.util.List; @@ -61,7 +62,7 @@ public class ActionSearchManager implements AlphaFineSearchProvider { filterModelList = new SearchResult(); lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (searchText.length == 0) { + if (ArrayUtils.isEmpty(searchText)) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); return lessModelList; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java index c548a1b47..1e141b3d4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -5,7 +5,7 @@ import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; @@ -14,15 +14,17 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import org.apache.commons.codec.digest.DigestUtils; +import java.io.IOException; +//import com.fr.third.org.apache.commons.codec.digest.DigestUtils; + + /** * @author alex.sung created on 2018/7/23. */ public class ComplementAdviceManager { - public static int count = 0; - private static ComplementAdviceManager instance; - private SearchResult allModelList; + private volatile SearchResult allModelList; public static ComplementAdviceManager getInstance() { if (instance == null) { @@ -40,19 +42,16 @@ public class ComplementAdviceManager { * @param searchText * @return */ - public synchronized SearchResult getAllSearchResult(String[] searchText) { + public SearchResult getAllSearchResult(String[] searchText) { allModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { SearchResult searchResult = new SearchResult(); for (int j = 0; j < searchText.length; j++) { - String result; String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + searchText[j]); String url = AlphaFineConstants.COMPLEMENT_ADVICE_SEARCH_URL_PREFIX + "msg=" + searchText[j] + "&token=" + token; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); try { + String result = HttpToolbox.get(url); + AlphaFineHelper.checkCancel(); Object json = new JSONTokener(result).nextValue(); if (json instanceof JSONArray) { JSONArray jsonArray = new JSONArray(result); @@ -61,7 +60,7 @@ public class ComplementAdviceManager { JSONObject jsonObject = jsonArray.optJSONObject(i); String temp = jsonObject.optString("keywords"); - if (!StringUtils.isEmpty(temp)) { + if (StringUtils.isNotEmpty(temp)) { RobotModel robotModel = new RobotModel(temp, null); if (!AlphaFineHelper.getFilterResult().contains(robotModel) && !allModelList.contains(robotModel)) { allModelList.add(robotModel); @@ -71,6 +70,8 @@ public class ComplementAdviceManager { } } catch (JSONException e) { FineLoggerFactory.getLogger().error("complement advice search error: " + e.getMessage()); + }catch (IOException e1) { + FineLoggerFactory.getLogger().error("complement advice get result error: " + e1.getMessage()); } } if (searchResult.isEmpty()) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index cad89640e..74ae8df28 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -8,12 +8,14 @@ import com.fr.design.mainframe.alphafine.cell.model.DocumentModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; - -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.third.org.apache.commons.lang3.ArrayUtils; + +import java.io.IOException; /** * Created by XiaXiang on 2017/3/27. @@ -52,23 +54,17 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { public synchronized SearchResult getLessSearchResult(String[] searchText) { lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (searchText.length == 0) { + if (ArrayUtils.isEmpty(searchText)) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); return lessModelList; } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainDocument()) { SearchResult searchResult = new SearchResult(); for (int j = 0; j < searchText.length; j++) { - String result; String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText[j] + "-1"; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); try { + String result = HttpToolbox.get(url); + AlphaFineHelper.checkCancel(); JSONObject jsonObject = new JSONObject(result); JSONArray jsonArray = jsonObject.optJSONArray("docdata"); if (jsonArray != null) { @@ -83,6 +79,8 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { } } catch (JSONException e) { FineLoggerFactory.getLogger().error("document search error: " + e.getMessage()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("document search get result error: " + e.getMessage()); } } lessModelList.clear(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 107cbb864..dfe0ca53b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -69,7 +69,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { for (int j = 0; j < searchText.length; j++) { this.searchText = dealWithSearchText(searchText[j]); if (StringUtils.isBlank(this.searchText) || ComparatorUtils.equals(this.searchText, DS_NAME)) { - lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Templates"))); + lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates"))); return lessModelList; } AlphaFineHelper.checkCancel(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java index 1ec562546..bb65d98be 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java @@ -5,14 +5,14 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.general.Inter; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; +import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; - +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -27,14 +27,15 @@ public class HotIssuesManager { private static HotIssuesManager instance; private static final int HOT_ITEM_NUM = 6; private static final int HOT_SUB_ITEM_NUM = 4; + private static final String HOT_ITEM = "item"; + private static final String HOT_ITEM_DATA = "itemData"; + private static final String HOT_ITEM_TEXT = "text"; + private static final String HOT_TYPE = "type"; + private static final String HOT_DATA = "data"; - public static HotIssuesManager getInstance() { + public static synchronized HotIssuesManager getInstance() { if (instance == null) { - synchronized (HotIssuesManager.class) { - if (instance == null) { - instance = new HotIssuesManager(); - } - } + instance = new HotIssuesManager(); } return instance; } @@ -44,14 +45,14 @@ public class HotIssuesManager { /** * 将子标题下的数据塞入modeList - * @param getStr + * @param subTitle * @return */ - public SearchResult getTitleSearchResult(String getStr) { + public SearchResult getTitleSearchResult(String subTitle) { SearchResult modeList = new SearchResult(); - modeList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText((getStr)))); + modeList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText((subTitle)))); - List issueList = map.get(getStr); + List issueList = map.get(subTitle); for (int i = 0; i < issueList.size(); i++) { RobotModel robotModel = new RobotModel(issueList.get(i), null); robotModel.setHotItemModel(true); @@ -65,24 +66,22 @@ public class HotIssuesManager { * @return */ public String[][] getHotIssues() { - String result; - HttpClient httpClient = new HttpClient(AlphaFineConstants.ALPHA_HOT_SEARCH); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return null; - } - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); + try { - JSONArray jsonArray = new JSONArray(result); - for (int i = 0; i < HOT_ITEM_NUM; i++) { - AlphaFineHelper.checkCancel(); - JSONObject jsonObject = jsonArray.optJSONObject(i); - data[i] = getTitleStrings(jsonObject); + String result = HttpToolbox.get(AlphaFineConstants.ALPHA_HOT_SEARCH); + AlphaFineHelper.checkCancel(); + JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); + if(jsonArray != null){ + for (int i = 0; i < HOT_ITEM_NUM; i++) { + AlphaFineHelper.checkCancel(); + JSONObject jsonObject = jsonArray.optJSONObject(i); + data[i] = getTitleStrings(jsonObject); + } } - } catch (JSONException e) { FineLoggerFactory.getLogger().error("hotissues search error: " + e.getMessage()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("hotissues search get result error: " + e.getMessage()); } return data; } @@ -93,16 +92,16 @@ public class HotIssuesManager { * @return */ private String[] getTitleStrings(JSONObject jsonObject) { - String[] temp = getSubTitleFromCloud(jsonObject.optJSONObject("data")); + String[] temp = getSubTitleFromCloud(jsonObject.optJSONObject(HOT_DATA)); String[] temp1 = new String[1]; - temp1[0] = jsonObject.optString("type"); + temp1[0] = jsonObject.optString(HOT_TYPE); int strLen1 = temp.length; int strLen2 = temp1.length; temp1 = Arrays.copyOf(temp1, strLen2 + strLen1); System.arraycopy(temp, 0, temp1, strLen2, strLen1); - getIssueStrings(jsonObject.optJSONObject("data")); + getIssueStrings(jsonObject.optJSONObject(HOT_DATA)); return temp1; } @@ -112,21 +111,20 @@ public class HotIssuesManager { * @param data * @return */ - private String[] getIssueStrings(JSONObject data) { + private void getIssueStrings(JSONObject data) { try { for (int j = 0; j < HOT_SUB_ITEM_NUM; j++) { - String temp = data.getString("item" + (j + 1)); - JSONArray jsonArray = data.getJSONArray("itemData" + (j + 1)); + String temp = data.getString(HOT_ITEM + (j + 1)); + JSONArray jsonArray = data.getJSONArray(HOT_ITEM_DATA + (j + 1)); List tempList = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { - tempList.add(jsonArray.optJSONObject(i).optString("text")); + tempList.add(jsonArray.optJSONObject(i).optString(HOT_ITEM_TEXT)); } map.put(temp, tempList); } } catch (JSONException e) { } - return null; } /** @@ -139,7 +137,7 @@ public class HotIssuesManager { for (int i = 0; i < HOT_SUB_ITEM_NUM; i++) { String temp = null; try { - temp = data.getString("item" + (i + 1)); + temp = data.getString(HOT_ITEM + (i + 1)); } catch (JSONException e) { } if (!StringUtils.isEmpty(temp)) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index c59b93c02..e54d9d67c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -9,15 +9,17 @@ import com.fr.design.mainframe.alphafine.cell.model.PluginModel; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.ComparatorUtils; - -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.basic.version.Version; import com.fr.plugin.basic.version.VersionIntervalFactory; +import com.fr.stable.EncodeConstants; +import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -95,25 +97,22 @@ public class PluginSearchManager implements AlphaFineSearchProvider { @Override public synchronized SearchResult getLessSearchResult(String[] searchText) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); - if (searchText.length == 0) { + if (ArrayUtils.isEmpty(searchText)) { lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); return lessModelList; } SearchResult searchResult = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainPlugin()) { for (int j = 0; j < searchText.length; j++) { - String result; try { - String encodedKey = URLEncoder.encode(searchText[j], "UTF-8"); + String encodedKey = URLEncoder.encode(searchText[j], EncodeConstants.ENCODING_UTF_8); String url = AlphaFineConstants.PLUGIN_SEARCH_URL + "?keyword=" + encodedKey; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - result = httpClient.getResponseText(); + String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); JSONObject jsonObject = new JSONObject(result); JSONArray jsonArray = jsonObject.optJSONArray("result"); @@ -130,6 +129,8 @@ public class PluginSearchManager implements AlphaFineSearchProvider { FineLoggerFactory.getLogger().error("plugin search json error :" + e.getMessage()); } catch (UnsupportedEncodingException e) { FineLoggerFactory.getLogger().error("plugin search encode error :" + e.getMessage()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("plugin search get result error :" + e.getMessage()); } } if (searchResult.isEmpty()) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index b9c8e6962..2b24c84c1 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -138,9 +138,6 @@ public class RecentSearchManager implements AlphaFineSearchProvider { initWriter(); Document doc = new Document(); doc.add(new StringField("searchKey", searchKey, Field.Store.YES)); - if(cellModel == null){ - System.out.println("null"); - } doc.add(new StringField("cellModel", cellModel.ModelToJson().toString(), Field.Store.YES)); doc.add(new LongField("time", System.currentTimeMillis(), Field.Store.YES)); writeDoc(doc); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index d75f1552d..e3a87d6f0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -10,8 +10,7 @@ import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; - -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; @@ -19,7 +18,9 @@ import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import java.io.IOException; import java.util.Iterator; import java.util.List; @@ -48,21 +49,18 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { @Override public synchronized SearchResult getLessSearchResult(String[] searchText) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } + this.modelList = new SearchResult(); this.recommendModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainRecommend()) { for (int j = 0; j < searchText.length; j++) { - String result; searchText[j] = searchText[j].replaceAll(StringUtils.BLANK, StringUtils.EMPTY); - HttpClient httpClient = new HttpClient(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); - httpClient.asGet(); - if (!httpClient.isServerAlive()) { - return getNoConnectList(); - } - httpClient.setTimeout(3000); - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); try { + String result = HttpToolbox.get(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); + AlphaFineHelper.checkCancel(); Object json = new JSONTokener(result).nextValue(); if (json instanceof JSONObject) { JSONObject jsonObject = new JSONObject(result); @@ -82,6 +80,8 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } } catch (JSONException e) { FineLoggerFactory.getLogger().error("recommend search error! :" + e.getMessage()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("recommend search get result error! :" + e.getMessage()); } } @@ -136,17 +136,17 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { modelList.addAll(complementAdviceModelList); } } - }else{ - if(complementAdviceModelList.size() > 0) { + } else { + if (complementAdviceModelList.size() > 0) { if (complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); moreModelList.addAll(complementAdviceModelList.subList(AlphaFineConstants.SHOW_SIZE, complementAdviceModelList.size())); - }else{ + } else { modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); modelList.addAll(complementAdviceModelList); } - }else{ + } else { return modelList; } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index ff1d68b95..aed356a22 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.alphafine.search.manager.impl; +import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.stable.StringUtils; import com.fr.third.ibm.icu.text.BreakIterator; @@ -15,13 +16,12 @@ public class SegmentationManager { private static SegmentationManager segmentationManager = null; private static final int MAX_CHINESE_CHARACTERS_NUM = 4; - public static SegmentationManager getInstance() { + public static synchronized SegmentationManager getInstance() { if (segmentationManager == null) { segmentationManager = new SegmentationManager(); return segmentationManager; - } else { - return segmentationManager; } + return segmentationManager; } /** @@ -52,14 +52,13 @@ public class SegmentationManager { * @return */ public String[] startSegmentation(String searchText) { - String regEx = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】';:”“’。,、?]"; - Pattern p = Pattern.compile(regEx); + Pattern p = Pattern.compile(AlphaFineConstants.SPECIAL_CHARACTER_REGEX); Matcher m = p.matcher(searchText); searchText = m.replaceAll("").trim().replaceAll(" ", ""); - if (searchText.length() == 0) { + if (StringUtils.isEmpty(searchText)) { return null; } - if(!isNeedSegmentation(searchText)){ + if (!isNeedSegmentation(searchText)) { return new String[]{searchText}; } List result = new ArrayList<>(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index 2a09182a0..48d527ae2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -8,7 +8,7 @@ import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; @@ -16,39 +16,35 @@ import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; import org.apache.commons.codec.digest.DigestUtils; +import java.io.IOException; +//import com.fr.third.org.apache.commons.codec.digest.DigestUtils; + /** * Created by alex.sung on 2018/8/3. */ public class SimilarSearchManeger implements AlphaFineSearchProvider { private static SimilarSearchManeger instance; - private SearchResult lessModelList; - private SearchResult moreModelList = new SearchResult(); + private volatile SearchResult lessModelList; + private volatile SearchResult moreModelList = new SearchResult(); - public static SimilarSearchManeger getInstance() { + public static synchronized SimilarSearchManeger getInstance() { if (instance == null) { - synchronized (SimilarSearchManeger.class) { - if (instance == null) { - instance = new SimilarSearchManeger(); - } - } + instance = new SimilarSearchManeger(); } return instance; } @Override - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { lessModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { SearchResult allModelList = new SearchResult(); for (int j = 0; j < searchText.length; j++) { - String result; String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + searchText[j]); String url = AlphaFineConstants.SIMILAR_SEARCH_URL_PREFIX + "msg=" + searchText[j] + "&token=" + token; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); try { + String result = HttpToolbox.get(url); + AlphaFineHelper.checkCancel(); Object json = new JSONTokener(result).nextValue(); if (json instanceof JSONArray) { JSONArray jsonArray = new JSONArray(result); @@ -65,6 +61,8 @@ public class SimilarSearchManeger implements AlphaFineSearchProvider { } } catch (JSONException e) { FineLoggerFactory.getLogger().error("similar search error: " + e.getMessage()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error("similar search get result error: " + e.getMessage()); } } moreModelList.clear(); From 84931e673377dcf96039ab42231330e861640ec0 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 22 Aug 2018 09:38:47 +0800 Subject: [PATCH 04/77] =?UTF-8?q?REPORT-10676=209patch10,=20FR9.0=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E6=94=AF=E6=8C=81=E7=A7=BB=E5=8A=A8=E7=AB=AF?= =?UTF-8?q?=E9=A2=84=E8=A7=88=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/file/WebPreviewUtils.java | 2 +- .../com/fr/design/fun/PreviewProvider.java | 7 +++ .../fun/impl/AbstractPreviewProvider.java | 7 +++ .../com/fr/design/mainframe/JTemplate.java | 5 +- .../java/com/fr/design/mainframe/JForm.java | 47 +++++++++++++++---- .../com/fr/design/mainframe/JWorkBook.java | 3 +- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java index 2a73de7a4..a4a781e53 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/WebPreviewUtils.java @@ -27,7 +27,7 @@ public final class WebPreviewUtils { @SuppressWarnings("unchecked") public static void preview(JTemplate jt, PreviewProvider provider) { String baseRoute = jt.route(); - actionPerformed(jt, baseRoute, provider == null ? Collections.EMPTY_MAP : provider.parametersForPreview(), ParameterConstants.VIEWLET); + actionPerformed(jt, baseRoute, provider == null ? Collections.EMPTY_MAP : provider.parametersForPreview(), provider.getActionType()); } private static void actionPerformed(JTemplate jt, String baseRoute, Map map, String actionType) { diff --git a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java index 876c7d202..57a787e38 100644 --- a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java @@ -54,4 +54,11 @@ public interface PreviewProvider extends Mutable{ */ Map parametersForPreview(); + /** + * 该种预览方式所处理方式 + * @return 处理方式 + */ + String getActionType(); + + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java index 3f824d4bb..f0b780903 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractPreviewProvider.java @@ -3,6 +3,7 @@ package com.fr.design.fun.impl; import com.fr.design.fun.PreviewProvider; import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; +import com.fr.general.web.ParameterConstants; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -45,4 +46,10 @@ public abstract class AbstractPreviewProvider extends AbstractProvider implement public int hashCode() { return nameForPopupItem().hashCode(); } + + + @Override + public String getActionType() { + return ParameterConstants.VIEWLET; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index bf4eb0d0c..6f9383e4d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe; +import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.Parameter; import com.fr.base.ScreenResolution; @@ -1006,7 +1007,9 @@ public abstract class JTemplate> * @return */ public Icon getPreviewLargeIcon() { - return UIConstants.RUN_BIG_ICON; + PreviewProvider provider = getPreviewType(); + String iconPath = provider.iconPathForLarge(); + return BaseUtils.readIcon(iconPath); } /** diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 36bd3f32f..d7cc7ea85 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -25,6 +25,7 @@ import com.fr.design.designer.creator.XWParameterLayout; import com.fr.design.designer.properties.FormWidgetAuthorityEditPane; import com.fr.design.event.TargetModifiedEvent; import com.fr.design.event.TargetModifiedListener; +import com.fr.design.fun.PreviewProvider; import com.fr.design.gui.frpane.HyperlinkGroupPane; import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider; import com.fr.design.gui.ilable.UILabel; @@ -46,6 +47,8 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.parameter.ParameterPropertyPane; +import com.fr.design.preview.FormPreview; +import com.fr.design.preview.MobilePreview; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.LayoutUtils; import com.fr.file.FILE; @@ -78,7 +81,9 @@ import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class JForm extends JTemplate implements BaseJForm { private static final String FORM_CARD = "FORM"; @@ -678,7 +683,7 @@ public class JForm extends JTemplate implements BaseJForm { * */ public Icon getPreviewLargeIcon() { - return UIConstants.RUN_BIG_ICON; + return super.getPreviewLargeIcon(); } @Override @@ -693,14 +698,19 @@ public class JForm extends JTemplate implements BaseJForm { * @return 菜单 */ public UIMenuItem[] createMenuItem4Preview() { - UIMenuItem form = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Form_Preview"), UIConstants.RUN_SMALL_ICON); - form.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - WebPreviewUtils.preview(JForm.this); - } - }); - return new UIMenuItem[]{form}; + List menuItems = new ArrayList(); + PreviewProvider[] previewProviders = supportPreview(); + for (final PreviewProvider provider : previewProviders) { + UIMenuItem item = new UIMenuItem(provider.nameForPopupItem(), BaseUtils.readIcon(provider.iconPathForPopupItem())); + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + provider.onClick(JForm.this); + } + }); + menuItems.add(item); + } + return menuItems.toArray(new UIMenuItem[menuItems.size()]); } /** @@ -917,6 +927,25 @@ public class JForm extends JTemplate implements BaseJForm { return creator.toData(); } + /** + * 支持的预览模式 + * @return 预览模式 + */ + @Override + public PreviewProvider[] supportPreview() { + return new PreviewProvider[]{new FormPreview(), new MobilePreview()}; + } + + /** + * 预览按钮点击事件 + * + * @param provider 预览接口 + */ + @Override + public void previewMenuActionPerformed(PreviewProvider provider) { + super.previewMenuActionPerformed(provider); + } + @Override public String route() { return ViewRequestConstants.FORM_VIEW_PATH; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index fc1945daf..e60fa5978 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -53,6 +53,7 @@ import com.fr.design.menu.ToolBarDef; import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.ParameterDefinitePane; import com.fr.design.parameter.ParameterInputPane; +import com.fr.design.preview.MobilePreview; import com.fr.design.preview.PagePreview; import com.fr.design.preview.ViewPreview; import com.fr.design.preview.WriteEnhancePreview; @@ -890,7 +891,7 @@ public class JWorkBook extends JTemplate { public PreviewProvider[] supportPreview() { Set set = ExtraDesignClassManager.getInstance().getArray(PreviewProvider.MARK_STRING); return ArrayUtils.addAll(new PreviewProvider[]{ - new PagePreview(), new WritePreview(), new ViewPreview(), new WriteEnhancePreview() + new PagePreview(), new WritePreview(), new ViewPreview(), new WriteEnhancePreview(), new MobilePreview() }, set.toArray(new PreviewProvider[set.size()])); } From a0abc164e99b40ef042cec4c2d4d4cb4713bb2fd Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 22 Aug 2018 09:39:02 +0800 Subject: [PATCH 05/77] =?UTF-8?q?=E6=97=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/preview/FormPreview.java | 34 +++++++++++++ .../com/fr/design/preview/MobilePreview.java | 48 ++++++++++++++++++ .../fr/design/images/buttonicon/mobile.png | Bin 0 -> 550 bytes .../fr/design/images/buttonicon/mobileb24.png | Bin 0 -> 1055 bytes 4 files changed, 82 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/preview/FormPreview.java create mode 100644 designer-base/src/main/java/com/fr/design/preview/MobilePreview.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/mobile.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/buttonicon/mobileb24.png diff --git a/designer-base/src/main/java/com/fr/design/preview/FormPreview.java b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java new file mode 100644 index 000000000..d6206a2c0 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java @@ -0,0 +1,34 @@ +package com.fr.design.preview; + +import com.fr.design.fun.impl.AbstractPreviewProvider; +import com.fr.locale.InterProviderFactory; + + +/** + * @author kerry + * @date 2018/5/22 + */ +public class FormPreview extends AbstractPreviewProvider { + private static final int PREVIEW_TYPE = 5; + + @Override + public String nameForPopupItem() { + return InterProviderFactory.getProvider().getLocText("Fine-Design_Form_M_Form_Preview"); + } + + @Override + public String iconPathForPopupItem() { + return "com/fr/design/images/buttonicon/runs.png"; + } + + @Override + public String iconPathForLarge() { + return "com/fr/design/images/buttonicon/run24.png"; + } + + @Override + public int previewTypeCode() { + return PREVIEW_TYPE; + } + +} diff --git a/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java new file mode 100644 index 000000000..8650ec12b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java @@ -0,0 +1,48 @@ +package com.fr.design.preview; + +import com.fr.design.fun.impl.AbstractPreviewProvider; +import com.fr.general.Inter; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author kerry + * @date 2018/5/11 + */ +public class MobilePreview extends AbstractPreviewProvider { + private static final int PREVIEW_TYPE = 4; + private static final String ACTION_TYPE = "path"; + + @Override + public String nameForPopupItem() { + return Inter.getLocText("Fine-Engine_Mobile_Preview"); + } + + @Override + public String iconPathForPopupItem() { + return "com/fr/design/images/buttonicon/mobile.png"; + } + + @Override + public String iconPathForLarge() { + return "com/fr/design/images/buttonicon/mobileb24.png"; + } + + @Override + public int previewTypeCode() { + return PREVIEW_TYPE; + } + + @Override + public String getActionType() { + return ACTION_TYPE; + } + + @Override + public Map parametersForPreview() { + Map map = new HashMap(); + map.put("op", "mobile"); + return map; + } +} diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/mobile.png b/designer-base/src/main/resources/com/fr/design/images/buttonicon/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..989111f3dd7c9faa60758ea67a1ecf0c3c6c9d12 GIT binary patch literal 550 zcmV+>0@?kEP)Px$;7LS5R5%fRlR;|}Q51#0NoLZaXu7B%6H1j_xfI6-?S{cC??zuqYRp(Dlkd4EAAW=}wC|qJ8Qk~U$%7IDsg}v*)lQOl z#xbJv%0{ngI^pF(F;Ey0OggCuTG{9@l!dV)dvUK$M+9pN+p7~QH8fx_dqTyek&Xzk z--2rsX*U0Sr@H)-^E+j%?cY+bE$tQDkrZ`5YHCsu%Ai;*;Mdj^T&qB`X8!=S zUo}N2gTKutY5S0ZYXIVNAA%-<{&PfRB>(^b07*qoM6N<$f_(e}4FCWD literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/buttonicon/mobileb24.png b/designer-base/src/main/resources/com/fr/design/images/buttonicon/mobileb24.png new file mode 100644 index 0000000000000000000000000000000000000000..c1f62a6fbfbcd203bb3487504a13a62d74bbb534 GIT binary patch literal 1055 zcmV+)1mOFLP)Px&*-1n}R9FeMS9?fPQ5gT-y;QJTTTPwY${spR%CM+R=mn7w6hu~kM35mye?&z= zMS(#{RDVQIdVo<;R76A~81^s>41%Pxl|5GY2>0-nI=9_>+qrtz+gaCeJVlDgn0 z;3LV-6D>}#2!`A#N)q6S$j#4o=s-pyk`RGJ3iG++LSS#Pnmd`b_So>TBY3LgG%F&I zJ%!?Sc6q(z!=sp{A_8LQG)+S_*ag*)o4m!uLS$`mZ$;Dh1E)?sMsssB(o{NV)hw70 z88&S`dUG}acAIQr-WeBx#`+o<-rj?Kb1BNo%HU@7u<0rEd0lu|`y4fw4kF#Z9Y|Wn z*O8oK5+FBuZ?OhX9CTq=2vv>4~lRKd6? zIpkj`S)4c&-2pb}Lv?jE$}4ulXiAp^wpeYbsHlMR#dRQ*BPWUo_?@p|x7(37CtnVe z^A!{nVAgCqQhqne#wsEZaD72ePL3>Kq%$u+A6n1HNRvQUL_p>5M@B}507S}=k!giC z&@JWW?1~7mx(Vp)?34wJboO{Xpw%gnCV{SqfM#koT3cHMAW{bBkM9^xogwAs?1~8J zrY%NGOA9_b9I~Lq>2kTy)c6v9bCGOp%=Z9!_MbTXqaZ0rwr#@Ma~HAeKqbCF9|r%` zL%y6wzMk5>eq0O1&=a%3Bux&-h$)IrfB^U`E8sE|;Y{T|ynFKsEIam-?dMkqPFLF35Y*4cgGcx9@YYor%~{ZBb#Qk$5rh^4wlx@R zug9=&5PokPZeOYbm3ZjC^YrWezXJ2(*Q~meF1=9QdCUf;~nAcYw6ep$I|Xn5_5~Tzej! Z`WJ>eID1=>t}g%p002ovPDHLkV1kt%<9z@C literal 0 HcmV?d00001 From 334a62c065e903c201cac0db7c2634a16f83377e Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 10:05:28 +0800 Subject: [PATCH 06/77] =?UTF-8?q?=E6=8F=90=E5=8D=87alphafine=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConfigManager.java | 92 +++++++++---------- .../help/alphafine/AlphaFineConfigPane.java | 92 +++++++++---------- .../manager/impl/ActionSearchManager.java | 2 +- .../manager/impl/ComplementAdviceManager.java | 6 +- .../manager/impl/DocumentSearchManager.java | 2 +- .../manager/impl/FileSearchManager.java | 2 +- .../search/manager/impl/HotIssuesManager.java | 10 +- .../manager/impl/PluginSearchManager.java | 2 +- .../manager/impl/RecentSearchManager.java | 2 +- .../manager/impl/RecommendSearchManager.java | 2 +- .../manager/impl/SegmentationManager.java | 11 ++- .../manager/impl/SimilarSearchManeger.java | 14 +-- 12 files changed, 122 insertions(+), 115 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index d62f44a4b..ba9c67bf5 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -18,11 +18,11 @@ public class AlphaFineConfigManager implements XMLable { /** * 是否开启alphafine */ - private boolean isEnabled = true; + private boolean enabled = true; /** * 是否联网搜索 */ - private boolean isSearchOnLine = true; + private boolean searchOnLine = true; /** * 搜索范围 @@ -34,27 +34,27 @@ public class AlphaFineConfigManager implements XMLable { /** * 猜您需要 */ - private boolean isContainRecommend = true; + private boolean containRecommend = true; /** * 设置 */ - private boolean isContainAction = true; + private boolean containAction = true; /** * 帮助文档 */ - private boolean isContainDocument = true; + private boolean containDocument = true; /** * 模板 */ - private boolean isContainTemplate = true; + private boolean containTemplate = true; /** * 模板内容 */ - private boolean isContainFileContent; + private boolean containFileContent; /** * 应用中心 */ - private boolean isContainPlugin = true; + private boolean containPlugin = true; /** * 分词搜索 */ @@ -70,7 +70,7 @@ public class AlphaFineConfigManager implements XMLable { /** * 是否提醒 */ - private boolean isNeedRemind = true; + private boolean needRemind = true; /** * 直接操作菜单次数 */ @@ -94,18 +94,18 @@ public class AlphaFineConfigManager implements XMLable { @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { - this.setEnabled(reader.getAttrAsBoolean("isEnabled", true)); - this.setSearchOnLine(reader.getAttrAsBoolean("isSearchOnline", true)); - this.setContainPlugin(reader.getAttrAsBoolean("isContainDocument", true)); - this.setContainDocument(reader.getAttrAsBoolean("isContainDocument", true)); - this.setContainRecommend(reader.getAttrAsBoolean("isContainRecommend", true)); - this.setContainAction(reader.getAttrAsBoolean("isContainAction", true)); - this.setContainTemplate(reader.getAttrAsBoolean("isContainTemplate", true)); - this.setContainFileContent(reader.getAttrAsBoolean("isContainFileContent", false)); + this.setEnabled(reader.getAttrAsBoolean("enabled", true)); + this.setSearchOnLine(reader.getAttrAsBoolean("searchOnline", true)); + this.setContainPlugin(reader.getAttrAsBoolean("containDocument", true)); + this.setContainDocument(reader.getAttrAsBoolean("containDocument", true)); + this.setContainRecommend(reader.getAttrAsBoolean("containRecommend", true)); + this.setContainAction(reader.getAttrAsBoolean("containAction", true)); + this.setContainTemplate(reader.getAttrAsBoolean("containTemplate", true)); + this.setContainFileContent(reader.getAttrAsBoolean("containFileContent", false)); this.setNeedSegmentationCheckbox(reader.getAttrAsBoolean("needSegmentationCheckbox", true)); this.setNeedIntelligentCustomerService(reader.getAttrAsBoolean("needIntelligentCustomerService", true)); this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); - this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); + this.setNeedRemind(reader.getAttrAsBoolean("needRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); } @@ -115,16 +115,16 @@ public class AlphaFineConfigManager implements XMLable { @Override public void writeXML(XMLPrintWriter writer) { writer.startTAG("AlphaFineConfigManager"); - writer.attr("isEnabled", this.isEnabled()) - .attr("isSearchOnline", this.isSearchOnLine()) + writer.attr("enabled", this.isEnabled()) + .attr("searchOnline", this.isSearchOnLine()) .attr("shortcuts", this.getShortcuts()) - .attr("isContainRecommend", this.isContainRecommend()) - .attr("isContainAction", this.isContainAction()) - .attr("isContainDocument", this.isContainDocument()) - .attr("isContainTemplate", this.isContainTemplate()) - .attr("isContainPlugin", this.isContainPlugin()) - .attr("isContainFileContent", this.isContainFileContent()) - .attr("isNeedRemind", this.isNeedRemind()) + .attr("containRecommend", this.isContainRecommend()) + .attr("containAction", this.isContainAction()) + .attr("containDocument", this.isContainDocument()) + .attr("containTemplate", this.isContainTemplate()) + .attr("containPlugin", this.isContainPlugin()) + .attr("containFileContent", this.isContainFileContent()) + .attr("needRemind", this.isNeedRemind()) .attr("operateCount", this.getOperateCount()) .attr("needSegmentationCheckbox", this.isNeedSegmentationCheckbox()) .attr("needIntelligentCustomerService", this.isNeedIntelligentCustomerService()); @@ -132,11 +132,11 @@ public class AlphaFineConfigManager implements XMLable { } public boolean isSearchOnLine() { - return isSearchOnLine; + return searchOnLine; } public void setSearchOnLine(boolean searchOnLine) { - isSearchOnLine = searchOnLine; + this.searchOnLine = searchOnLine; } public String getShortcuts() { @@ -161,51 +161,51 @@ public class AlphaFineConfigManager implements XMLable { } public boolean isContainAction() { - return isContainAction; + return containAction; } public void setContainAction(boolean containAction) { - this.isContainAction = containAction; + this.containAction = containAction; } public boolean isContainDocument() { - return isContainDocument; + return containDocument; } public void setContainDocument(boolean containDocument) { - this.isContainDocument = containDocument; + this.containDocument = containDocument; } public boolean isContainTemplate() { - return isContainTemplate; + return containTemplate; } public void setContainTemplate(boolean containTemplate) { - this.isContainTemplate = containTemplate; + this.containTemplate = containTemplate; } public boolean isContainPlugin() { - return isContainPlugin; + return containPlugin; } public void setContainPlugin(boolean containPlugin) { - this.isContainPlugin = containPlugin; + this.containPlugin = containPlugin; } public boolean isContainRecommend() { - return isContainRecommend; + return containRecommend; } public void setContainRecommend(boolean containConclude) { - isContainRecommend = containConclude; + this.containRecommend = containConclude; } public boolean isEnabled() { - return isEnabled; + return enabled; } - public void setEnabled(boolean isEnabled) { - this.isEnabled = isEnabled; + public void setEnabled(boolean enabled) { + this.enabled = enabled; } public KeyStroke getShortCutKeyStore() { @@ -224,19 +224,19 @@ public class AlphaFineConfigManager implements XMLable { } public boolean isContainFileContent() { - return isContainFileContent; + return containFileContent; } public void setContainFileContent(boolean containFileContent) { - isContainFileContent = containFileContent; + this.containFileContent = containFileContent; } public boolean isNeedRemind() { - return isNeedRemind; + return needRemind; } public void setNeedRemind(boolean needRemind) { - isNeedRemind = needRemind; + this.needRemind = needRemind; } public boolean isNeedSegmentationCheckbox() { diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index 6f93631bc..875459ad6 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -55,7 +55,7 @@ public class AlphaFineConfigPane extends BasicPane { private static final double COLUMN_GAP = 180; private static final double ROW_GAP = 25; private KeyStroke shortCutKeyStore = null; - private UICheckBox isEnabledCheckbox, isSearchOnlineCheckbox, needSegmentationCheckbox, needIntelligentCustomerService, isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox, isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox; + private UICheckBox enabledCheckbox, searchOnlineCheckbox, needSegmentationCheckbox, needIntelligentCustomerService, containRecommendCheckbox, containActionCheckbox, containDocumentCheckbox, containTemplateCheckbox, containPluginCheckbox, containFileContentCheckbox; private UITextField shortcutsField; public AlphaFineConfigPane() { @@ -75,8 +75,8 @@ public class AlphaFineConfigPane extends BasicPane { private Component[][] initSearchRangeComponents() { Component[][] components = new Component[][]{ - new Component[]{isContainRecommendCheckbox, isContainActionCheckbox, isContainDocumentCheckbox}, - new Component[]{isContainTemplateCheckbox, isContainPluginCheckbox, isContainFileContentCheckbox}, + new Component[]{containRecommendCheckbox, containActionCheckbox, containDocumentCheckbox}, + new Component[]{containTemplateCheckbox, containPluginCheckbox, containFileContentCheckbox}, new Component[]{needIntelligentCustomerService, null, null} }; return components; @@ -84,7 +84,7 @@ public class AlphaFineConfigPane extends BasicPane { private Component[][] initOnlineComponents() { Component[][] components = new Component[][]{ - new Component[]{isSearchOnlineCheckbox, needSegmentationCheckbox, null} + new Component[]{searchOnlineCheckbox, needSegmentationCheckbox, null} }; return components; } @@ -95,12 +95,12 @@ public class AlphaFineConfigPane extends BasicPane { double[] columnSize = {COLUMN_GAP, COLUMN_GAP, COLUMN_GAP}; JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Search_Range")); - isContainRecommendCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Recommend")); - isContainActionCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set")); - isContainPluginCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon")); - isContainDocumentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help")); - isContainTemplateCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates")); - isContainFileContentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Templates_Content")); + containRecommendCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Recommend")); + containActionCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set")); + containPluginCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon")); + containDocumentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help")); + containTemplateCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Templates")); + containFileContentCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Templates_Content")); needIntelligentCustomerService = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Intelligent_Customer_Service")); JPanel searchConfigPane = TableLayoutHelper.createTableLayoutPane(initSearchRangeComponents(), rowSize, columnSize); northPane.add(searchConfigPane); @@ -147,24 +147,24 @@ public class AlphaFineConfigPane extends BasicPane { private void createOnlinePane(JPanel contentPane) { JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Search_Type")); - isSearchOnlineCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Internet_Search")); + searchOnlineCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Internet_Search")); needSegmentationCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_Segmentation")); - isSearchOnlineCheckbox.addActionListener(new ActionListener() { + searchOnlineCheckbox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (!isSearchOnlineCheckbox.isSelected()) { - isContainRecommendCheckbox.setEnabled(false); - isContainPluginCheckbox.setEnabled(false); - isContainDocumentCheckbox.setEnabled(false); + if (!searchOnlineCheckbox.isSelected()) { + containRecommendCheckbox.setEnabled(false); + containPluginCheckbox.setEnabled(false); + containDocumentCheckbox.setEnabled(false); needIntelligentCustomerService.setEnabled(false); - isContainRecommendCheckbox.setSelected(false); - isContainPluginCheckbox.setSelected(false); - isContainDocumentCheckbox.setSelected(false); + containRecommendCheckbox.setSelected(false); + containPluginCheckbox.setSelected(false); + containDocumentCheckbox.setSelected(false); needIntelligentCustomerService.setSelected(false); } else { - isContainRecommendCheckbox.setEnabled(true); - isContainPluginCheckbox.setEnabled(true); - isContainDocumentCheckbox.setEnabled(true); + containRecommendCheckbox.setEnabled(true); + containPluginCheckbox.setEnabled(true); + containDocumentCheckbox.setEnabled(true); needIntelligentCustomerService.setEnabled(true); } } @@ -178,8 +178,8 @@ public class AlphaFineConfigPane extends BasicPane { private void createOpenPane(JPanel contentPane) { JPanel northPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable")); - isEnabledCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_AlphaFine")); - northPane.add(isEnabledCheckbox); + enabledCheckbox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_AlphaFine_Enable_AlphaFine")); + northPane.add(enabledCheckbox); contentPane.add(northPane); } @@ -189,18 +189,18 @@ public class AlphaFineConfigPane extends BasicPane { } public void populate(AlphaFineConfigManager alphaFineConfigManager) { - this.isEnabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); - this.isSearchOnlineCheckbox.setEnabled(FRContext.isChineseEnv()); - this.isSearchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine()); - this.isContainActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); - this.isContainTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate()); - this.isContainFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent()); - this.isContainDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && alphaFineConfigManager.isSearchOnLine()); - this.isContainDocumentCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); - this.isContainPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine()); - this.isContainPluginCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); - this.isContainRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); - this.isContainRecommendCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); + this.searchOnlineCheckbox.setEnabled(FRContext.isChineseEnv()); + this.searchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine()); + this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); + this.containTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate()); + this.containFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent()); + this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && alphaFineConfigManager.isSearchOnLine()); + this.containDocumentCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine()); + this.containPluginCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); + this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); + this.containRecommendCheckbox.setEnabled(alphaFineConfigManager.isSearchOnLine()); this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); @@ -212,14 +212,14 @@ public class AlphaFineConfigPane extends BasicPane { public void update() { DesignerEnvManager designerEnvManager = DesignerEnvManager.getEnvManager(); AlphaFineConfigManager alphaFineConfigManager = designerEnvManager.getAlphaFineConfigManager(); - alphaFineConfigManager.setContainPlugin(this.isContainPluginCheckbox.isSelected()); - alphaFineConfigManager.setContainAction(this.isContainActionCheckbox.isSelected()); - alphaFineConfigManager.setContainDocument(this.isContainDocumentCheckbox.isSelected()); - alphaFineConfigManager.setContainRecommend(this.isContainRecommendCheckbox.isSelected()); - alphaFineConfigManager.setEnabled(this.isEnabledCheckbox.isSelected()); - alphaFineConfigManager.setSearchOnLine(this.isSearchOnlineCheckbox.isSelected()); - alphaFineConfigManager.setContainTemplate(this.isContainTemplateCheckbox.isSelected()); - alphaFineConfigManager.setContainFileContent(this.isContainFileContentCheckbox.isSelected()); + alphaFineConfigManager.setContainPlugin(this.containPluginCheckbox.isSelected()); + alphaFineConfigManager.setContainAction(this.containActionCheckbox.isSelected()); + alphaFineConfigManager.setContainDocument(this.containDocumentCheckbox.isSelected()); + alphaFineConfigManager.setContainRecommend(this.containRecommendCheckbox.isSelected()); + alphaFineConfigManager.setEnabled(this.enabledCheckbox.isSelected()); + alphaFineConfigManager.setSearchOnLine(this.searchOnlineCheckbox.isSelected()); + alphaFineConfigManager.setContainTemplate(this.containTemplateCheckbox.isSelected()); + alphaFineConfigManager.setContainFileContent(this.containFileContentCheckbox.isSelected()); alphaFineConfigManager.setNeedSegmentationCheckbox(this.needSegmentationCheckbox.isSelected()); alphaFineConfigManager.setNeedIntelligentCustomerService(this.needIntelligentCustomerService.isSelected()); alphaFineConfigManager.setShortcuts(shortCutKeyStore != null ? shortCutKeyStore.toString().replace(TYPE, DISPLAY_TYPE) : this.shortcutsField.getText()); @@ -255,10 +255,10 @@ public class AlphaFineConfigPane extends BasicPane { } public UICheckBox getIsContainFileContentCheckbox() { - return isContainFileContentCheckbox; + return containFileContentCheckbox; } public void setIsContainFileContentCheckbox(UICheckBox isContainFileContentCheckbox) { - this.isContainFileContentCheckbox = isContainFileContentCheckbox; + this.containFileContentCheckbox = isContainFileContentCheckbox; } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index a8d6d2b94..b85022d8c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -23,7 +23,7 @@ import java.util.List; * Created by XiaXiang on 2017/3/27. */ public class ActionSearchManager implements AlphaFineSearchProvider { - private static ActionSearchManager instance; + private static volatile ActionSearchManager instance; private SearchResult filterModelList; private SearchResult lessModelList; private SearchResult moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java index 1e141b3d4..e1bd1917b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -12,10 +12,8 @@ import com.fr.json.JSONObject; import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; -import org.apache.commons.codec.digest.DigestUtils; - import java.io.IOException; -//import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; /** @@ -23,7 +21,7 @@ import java.io.IOException; */ public class ComplementAdviceManager { - private static ComplementAdviceManager instance; + private static volatile ComplementAdviceManager instance; private volatile SearchResult allModelList; public static ComplementAdviceManager getInstance() { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index 74ae8df28..c44c78705 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -21,7 +21,7 @@ import java.io.IOException; * Created by XiaXiang on 2017/3/27. */ public class DocumentSearchManager implements AlphaFineSearchProvider { - private static DocumentSearchManager instance; + private static volatile DocumentSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index dfe0ca53b..0a2d29f11 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -25,7 +25,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { private static final String DS_NAME = "dsname=\""; private static final String FRM_PREFIX = "k:frm "; private static final String CPT_PREFIX = "k:cpt "; - private static FileSearchManager instance; + private static volatile FileSearchManager instance; private SearchResult filterModelList; private SearchResult lessModelList; private SearchResult moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java index bb65d98be..a10c07df2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java @@ -24,7 +24,7 @@ import java.util.Map; * Created by alex.sung on 2018/8/3. */ public class HotIssuesManager { - private static HotIssuesManager instance; + private static volatile HotIssuesManager instance; private static final int HOT_ITEM_NUM = 6; private static final int HOT_SUB_ITEM_NUM = 4; private static final String HOT_ITEM = "item"; @@ -33,9 +33,13 @@ public class HotIssuesManager { private static final String HOT_TYPE = "type"; private static final String HOT_DATA = "data"; - public static synchronized HotIssuesManager getInstance() { + public static HotIssuesManager getInstance() { if (instance == null) { - instance = new HotIssuesManager(); + synchronized (HotIssuesManager.class) { + if (instance == null) { + instance = new HotIssuesManager(); + } + } } return instance; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index e54d9d67c..5bc972f2a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -27,7 +27,7 @@ import java.net.URLEncoder; * Created by XiaXiang on 2017/3/27. */ public class PluginSearchManager implements AlphaFineSearchProvider { - private static PluginSearchManager instance; + private static volatile PluginSearchManager instance; private SearchResult lessModelList; private SearchResult moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index 2b24c84c1..aae6dff2d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -45,7 +45,7 @@ import java.util.List; */ public class RecentSearchManager implements AlphaFineSearchProvider { private static final int MAX_SIZE = 100; - private static RecentSearchManager instance; + private static volatile RecentSearchManager instance; IndexReader indexReader = null; IndexSearcher indexSearcher = null; //索引存储路径 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index e3a87d6f0..3bb4effb6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -28,7 +28,7 @@ import java.util.List; * Created by XiaXiang on 2017/3/31. */ public class RecommendSearchManager implements AlphaFineSearchProvider { - private static RecommendSearchManager instance; + private static volatile RecommendSearchManager instance; private SearchResult modelList; private SearchResult recommendModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index aed356a22..a6eeb1862 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -13,13 +13,16 @@ import java.util.regex.Pattern; * Created by alex.sung on 2018/8/3. */ public class SegmentationManager { - private static SegmentationManager segmentationManager = null; + private static volatile SegmentationManager segmentationManager = null; private static final int MAX_CHINESE_CHARACTERS_NUM = 4; - public static synchronized SegmentationManager getInstance() { + public static SegmentationManager getInstance() { if (segmentationManager == null) { - segmentationManager = new SegmentationManager(); - return segmentationManager; + synchronized (SegmentationManager.class){ + if (segmentationManager == null) { + segmentationManager = new SegmentationManager(); + } + } } return segmentationManager; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index 48d527ae2..b2c63ed31 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -14,22 +14,24 @@ import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; -import org.apache.commons.codec.digest.DigestUtils; - import java.io.IOException; -//import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import com.fr.third.org.apache.commons.codec.digest.DigestUtils; /** * Created by alex.sung on 2018/8/3. */ public class SimilarSearchManeger implements AlphaFineSearchProvider { - private static SimilarSearchManeger instance; + private static volatile SimilarSearchManeger instance; private volatile SearchResult lessModelList; private volatile SearchResult moreModelList = new SearchResult(); - public static synchronized SimilarSearchManeger getInstance() { + public static SimilarSearchManeger getInstance() { if (instance == null) { - instance = new SimilarSearchManeger(); + synchronized (SimilarSearchManeger.class){ + if (instance == null) { + instance = new SimilarSearchManeger(); + } + } } return instance; } From 8548d36a0bea8a4878cde64a639f83ace12cb4f1 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 10:18:55 +0800 Subject: [PATCH 07/77] =?UTF-8?q?=E6=8F=90=E5=8D=87alphafine=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/alphafine/AlphaFineConstants.java | 2 ++ .../fr/design/mainframe/alphafine/cell/model/ActionModel.java | 2 +- .../design/mainframe/alphafine/cell/model/AlphaCellModel.java | 2 +- .../fr/design/mainframe/alphafine/cell/model/BottomModel.java | 2 +- .../design/mainframe/alphafine/cell/model/DocumentModel.java | 2 +- .../fr/design/mainframe/alphafine/cell/model/FileModel.java | 2 +- .../fr/design/mainframe/alphafine/cell/model/MoreModel.java | 2 +- .../design/mainframe/alphafine/cell/model/NoResultModel.java | 2 +- .../fr/design/mainframe/alphafine/cell/model/PluginModel.java | 4 ++-- .../fr/design/mainframe/alphafine/cell/model/RobotModel.java | 2 +- .../alphafine/search/manager/impl/RecentSearchManager.java | 2 +- .../alphafine/search/manager/impl/SegmentationManager.java | 3 +-- 12 files changed, 14 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index 410796f26..d4a532815 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -121,5 +121,7 @@ public class AlphaFineConstants { public static final String ALPHA_GO_TO_WEB = CloudCenter.getInstance().acquireUrlByKind("af.go_web"); + public static final String CHINESE_CHARACTERS = "[\\u4e00-\\u9fa5]"; + } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java index 324006f93..df218b1ce 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java @@ -51,7 +51,7 @@ public class ActionModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() { + public JSONObject modelToJson() { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/AlphaCellModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/AlphaCellModel.java index 04af82195..23be9bd9d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/AlphaCellModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/AlphaCellModel.java @@ -75,7 +75,7 @@ public abstract class AlphaCellModel implements Comparable { * @return * @throws JSONException */ - abstract public JSONObject ModelToJson() throws JSONException; + abstract public JSONObject modelToJson() throws JSONException; /** * 获取需要保存到云中心的信息 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java index 50dc169bf..c8f92721c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/BottomModel.java @@ -31,7 +31,7 @@ public class BottomModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() throws JSONException { + public JSONObject modelToJson() throws JSONException { return JSONObject.EMPTY; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java index 4cb7cd16d..c3dd69369 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java @@ -40,7 +40,7 @@ public class DocumentModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() { + public JSONObject modelToJson() { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java index 377c2c8eb..b21f53bd4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java @@ -35,7 +35,7 @@ public class FileModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() { + public JSONObject modelToJson() { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/MoreModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/MoreModel.java index 2b808a0f8..860b2ff08 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/MoreModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/MoreModel.java @@ -37,7 +37,7 @@ public class MoreModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() throws JSONException { + public JSONObject modelToJson() throws JSONException { return null; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/NoResultModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/NoResultModel.java index 81b19e763..15bd931e6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/NoResultModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/NoResultModel.java @@ -13,7 +13,7 @@ public class NoResultModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() throws JSONException { + public JSONObject modelToJson() throws JSONException { return null; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java index 8416afdec..ef293eea8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java @@ -85,7 +85,7 @@ public class PluginModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() { + public JSONObject modelToJson() { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); @@ -109,7 +109,7 @@ public class PluginModel extends AlphaCellModel { if (StringUtils.isBlank(this.pluginId) || !WorkContext.getCurrent().isLocal()) { return; } - WebViewDlgHelper.showPluginInStore(getName(), "[" + ModelToJson().optString("result") + "]"); + WebViewDlgHelper.showPluginInStore(getName(), "[" + modelToJson().optString("result") + "]"); } @Override diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java index 85e0cfa84..03f038e60 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java @@ -65,7 +65,7 @@ public class RobotModel extends AlphaCellModel { } @Override - public JSONObject ModelToJson() throws JSONException { + public JSONObject modelToJson() throws JSONException { JSONObject object = JSONObject.create(); try { JSONObject modelObject = JSONObject.create(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index aae6dff2d..c4c4ca8e2 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -138,7 +138,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { initWriter(); Document doc = new Document(); doc.add(new StringField("searchKey", searchKey, Field.Store.YES)); - doc.add(new StringField("cellModel", cellModel.ModelToJson().toString(), Field.Store.YES)); + doc.add(new StringField("cellModel", cellModel.modelToJson().toString(), Field.Store.YES)); doc.add(new LongField("time", System.currentTimeMillis(), Field.Store.YES)); writeDoc(doc); } catch (JSONException e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index a6eeb1862..908d1b1f6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -35,8 +35,7 @@ public class SegmentationManager { */ public boolean isNeedSegmentation(String searchText) { int count = 0; - String reg = "[\\u4e00-\\u9fa5]"; - Pattern p = Pattern.compile(reg); + Pattern p = Pattern.compile(AlphaFineConstants.CHINESE_CHARACTERS); Matcher m = p.matcher(searchText); while (m.find()) { for (int i = 0; i <= m.groupCount(); i++) { From c04544037683fc516d8e7f808173a7acb05c2a70 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 22 Aug 2018 10:25:17 +0800 Subject: [PATCH 08/77] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/fun/PreviewProvider.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java index 57a787e38..1cb070aff 100644 --- a/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/PreviewProvider.java @@ -55,7 +55,8 @@ public interface PreviewProvider extends Mutable{ Map parametersForPreview(); /** - * 该种预览方式所处理方式 + * 该种预览方式下对模板的处理方式 + * 分页填报等需要计算输出模板,移动端预览直接输出url * @return 处理方式 */ String getActionType(); From a92ed2f8402453ee7b2ea374d89f657a1b0cb0d6 Mon Sep 17 00:00:00 2001 From: zack Date: Wed, 22 Aug 2018 10:30:27 +0800 Subject: [PATCH 09/77] =?UTF-8?q?REPORT-10384=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E9=A2=84=E8=A7=88=E5=90=AF=E5=8A=A8=E5=81=87=E6=AD=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98,=E5=86=85=E7=BD=AE=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E6=8F=90=E5=89=8D=E5=90=AF=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/iprogressbar/ProgressDialog.java | 3 + .../fr/design/mainframe/DesignerFrame.java | 30 +++++++ .../main/java/com/fr/start/BaseDesigner.java | 12 ++- .../main/java/com/fr/start/ServerStarter.java | 31 +++++-- .../server/FineEmbedServerActivator.java | 2 + .../start/server/FineEmbedServerMonitor.java | 89 +++++++++++++++++++ .../com/fr/start/module/DesignerStartup.java | 9 +- 7 files changed, 163 insertions(+), 13 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java diff --git a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java index 2247fe453..049b868c4 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java +++ b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java @@ -77,4 +77,7 @@ public class ProgressDialog extends UIDialog { centerDialog.dispose(); super.dispose(); } + public void updateLoadingText(String text) { + this.text.setText(text); + } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 78f546f4d..971834e89 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -1153,4 +1153,34 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta return progressDialog; } + public void showProgressDialog() { + + progressDialog.setVisible(true); + + } + + /** + * 隐藏进度框 + */ + public void hideProgressDialog() { + + progressDialog.setVisible(false); + } + + /** + * 更新进度框进度 + * @param progress + */ + public void updateProgress(int progress) { + + progressDialog.setProgressValue(progress); + } + + /** + * 释放进度框 + */ + public void disposeProgressDialog() { + + progressDialog.dispose(); + } } diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 932a1ebb8..3e466ed1f 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -31,6 +31,10 @@ import java.lang.reflect.Method; * The main class of Report Designer. */ public abstract class BaseDesigner extends ToolBarMenuDock { + private static final int PERCENT_TEN = 10; + private static final int PERCENT_SIXTY = 60; + private static final int PERCENT_NINTY= 90; + private static final int PERCENT_COMPLETE= 100; private static final int LOAD_TREE_MAXNUM = 10; @@ -51,15 +55,15 @@ public abstract class BaseDesigner extends ToolBarMenuDock { public void show(final String[] args) { collectUserInformation(); - DesignerContext.getDesignerFrame().getProgressDialog().setProgressValue(10); + DesignerContext.getDesignerFrame().updateProgress(PERCENT_TEN); showDesignerFrame(args, DesignerContext.getDesignerFrame(), false); - DesignerContext.getDesignerFrame().getProgressDialog().setProgressValue(60); + DesignerContext.getDesignerFrame().updateProgress(PERCENT_SIXTY); DesignerContext.getDesignerFrame().refreshEnv(); - DesignerContext.getDesignerFrame().getProgressDialog().setProgressValue(90); + DesignerContext.getDesignerFrame().updateProgress(PERCENT_NINTY); for (int i = 0; !TemplateTreePane.getInstance().getTemplateFileTree().isTemplateShowing() && i < LOAD_TREE_MAXNUM; i++) { TemplateTreePane.getInstance().getTemplateFileTree().refresh(); } - DesignerContext.getDesignerFrame().getProgressDialog().setProgressValue(100); + DesignerContext.getDesignerFrame().updateProgress(PERCENT_COMPLETE); } diff --git a/designer-base/src/main/java/com/fr/start/ServerStarter.java b/designer-base/src/main/java/com/fr/start/ServerStarter.java index b916bd679..5ea007cd8 100644 --- a/designer-base/src/main/java/com/fr/start/ServerStarter.java +++ b/designer-base/src/main/java/com/fr/start/ServerStarter.java @@ -5,20 +5,21 @@ import com.fr.base.ServerConfig; import com.fr.design.DesignerEnvManager; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; - import com.fr.log.FineLoggerFactory; import com.fr.stable.OperatingSystem; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.start.server.FineEmbedServer; +import com.fr.start.server.FineEmbedServerMonitor; import com.fr.workspace.WorkContext; - -import javax.swing.*; -import java.awt.*; +import javax.swing.JOptionPane; +import java.awt.Desktop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public class ServerStarter { @@ -57,10 +58,24 @@ public class ServerStarter { * * @param url 指定路径 */ - public static void browserURLWithLocalEnv(String url) { - - FineEmbedServer.start(); - browser(url); + public static void browserURLWithLocalEnv(final String url) { + + if(!FineEmbedServerMonitor.getInstance().isComplete()){ + FineEmbedServerMonitor.getInstance().monitor(); + ExecutorService service = Executors.newSingleThreadExecutor(); + service.submit(new Runnable() { + + @Override + public void run() { + FineEmbedServer.start(); + browser(url); + } + }); + service.shutdown(); + }else{ + FineEmbedServer.start(); + browser(url); + } } private static void browser(String uri) { diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index 176db579a..15196000e 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -30,9 +30,11 @@ public class FineEmbedServerActivator extends Activator { public synchronized void start() { try { + FineEmbedServerMonitor.getInstance().reset(); //初始化tomcat initTomcat(); tomcat.start(); + FineEmbedServerMonitor.getInstance().setComplete(); } catch (LifecycleException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java new file mode 100644 index 000000000..08ecd3536 --- /dev/null +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -0,0 +1,89 @@ +package com.fr.start.server; + +import com.fr.design.mainframe.DesignerContext; +import com.fr.event.Event; +import com.fr.event.EventDispatcher; +import com.fr.event.Listener; +import com.fr.event.Null; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * 内置服务器启动监视器 + * Created by zack on 2018/8/21. + */ +public class FineEmbedServerMonitor { + private int progress; + private static final int COMPLETE = 100;//启动完成 + private static final int STEP = 5;//随便设置一个假的进度条 + private static final int STEP_HEARTBEAT = 2000;//2秒更新进度 + private static volatile FineEmbedServerMonitor monitor; + + private FineEmbedServerMonitor() { + } + + static { + EventDispatcher.listen(EmbedServerEvent.AfterStop, new Listener() { + @Override + public void on(Event event, Null aNull) { + DesignerContext.getDesignerFrame().disposeProgressDialog(); + } + }); + } + + public static FineEmbedServerMonitor getInstance() { + if (monitor == null) { + synchronized (FineEmbedServerMonitor.class) { + if (monitor == null) { + monitor = new FineEmbedServerMonitor(); + } + } + } + return monitor; + } + + public int getProgress() { + if (progress == COMPLETE) { + return progress; + } else { + progress += STEP; + return progress; + } + } + + public void setComplete() { + this.progress = COMPLETE; + } + + public void reset() { + this.progress = 0; + } + + public boolean isComplete() { + return this.progress == COMPLETE; + } + + public void monitor() { + ExecutorService service = Executors.newSingleThreadExecutor(); + service.submit(new Runnable() { + + @Override + public void run() { + while (!isComplete()) { + if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { + DesignerContext.getDesignerFrame().showProgressDialog(); + DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server")); + } + DesignerContext.getDesignerFrame().updateProgress(getProgress()); + try { + Thread.sleep(STEP_HEARTBEAT); + } catch (InterruptedException ignore) { + } + } + DesignerContext.getDesignerFrame().disposeProgressDialog(); + } + }); + service.shutdown(); + } +} diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index aac6112ee..7c63552cd 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -10,6 +10,7 @@ import com.fr.record.analyzer.Metrics; import com.fr.start.Designer; import com.fr.start.ServerStarter; import com.fr.start.SplashContext; +import com.fr.start.server.FineEmbedServer; import com.fr.startup.activators.BasicActivator; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -39,7 +40,13 @@ public class DesignerStartup extends Activator { startSub(EnvBasedModule.class); //designer模块启动好后,查看demo browserDemo(); - ExecutorService service = Executors.newSingleThreadExecutor(); + ExecutorService service = Executors.newFixedThreadPool(2); + service.submit(new Runnable() { + @Override + public void run() { + FineEmbedServer.start(); + } + }); service.submit(new Runnable() { @Override From b798f6112b99bb958a3b9c6804aa90ac8ca98934 Mon Sep 17 00:00:00 2001 From: zack Date: Wed, 22 Aug 2018 10:57:24 +0800 Subject: [PATCH 10/77] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=B8=80=E4=B8=8B?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/start/server/FineEmbedServerActivator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java index 15196000e..982b3633d 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerActivator.java @@ -34,9 +34,11 @@ public class FineEmbedServerActivator extends Activator { //初始化tomcat initTomcat(); tomcat.start(); - FineEmbedServerMonitor.getInstance().setComplete(); + } catch (LifecycleException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); + }finally { + FineEmbedServerMonitor.getInstance().setComplete(); } } From f948fa32f07a0dc8f280fac102cf4967ecc39fff Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 11:01:21 +0800 Subject: [PATCH 11/77] =?UTF-8?q?=E6=8F=90=E5=8D=87alphafine=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConfigManager.java | 36 +++++++++---------- .../cell/render/ContentCellRender.java | 2 +- .../manager/impl/ActionSearchManager.java | 2 +- .../manager/impl/ComplementAdviceManager.java | 2 +- .../manager/impl/DocumentSearchManager.java | 2 +- .../manager/impl/FileSearchManager.java | 2 +- .../search/manager/impl/HotIssuesManager.java | 6 +--- .../manager/impl/PluginSearchManager.java | 2 +- .../manager/impl/RecentSearchManager.java | 3 ++ .../manager/impl/RecommendSearchManager.java | 2 +- .../manager/impl/SimilarSearchManeger.java | 4 +-- 11 files changed, 31 insertions(+), 32 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java index ba9c67bf5..c853db169 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigManager.java @@ -94,18 +94,18 @@ public class AlphaFineConfigManager implements XMLable { @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { - this.setEnabled(reader.getAttrAsBoolean("enabled", true)); - this.setSearchOnLine(reader.getAttrAsBoolean("searchOnline", true)); - this.setContainPlugin(reader.getAttrAsBoolean("containDocument", true)); - this.setContainDocument(reader.getAttrAsBoolean("containDocument", true)); - this.setContainRecommend(reader.getAttrAsBoolean("containRecommend", true)); - this.setContainAction(reader.getAttrAsBoolean("containAction", true)); - this.setContainTemplate(reader.getAttrAsBoolean("containTemplate", true)); - this.setContainFileContent(reader.getAttrAsBoolean("containFileContent", false)); + this.setEnabled(reader.getAttrAsBoolean("isEnabled", true)); + this.setSearchOnLine(reader.getAttrAsBoolean("isSearchOnline", true)); + this.setContainPlugin(reader.getAttrAsBoolean("isContainDocument", true)); + this.setContainDocument(reader.getAttrAsBoolean("isContainDocument", true)); + this.setContainRecommend(reader.getAttrAsBoolean("isContainRecommend", true)); + this.setContainAction(reader.getAttrAsBoolean("isContainAction", true)); + this.setContainTemplate(reader.getAttrAsBoolean("isContainTemplate", true)); + this.setContainFileContent(reader.getAttrAsBoolean("isContainFileContent", false)); this.setNeedSegmentationCheckbox(reader.getAttrAsBoolean("needSegmentationCheckbox", true)); this.setNeedIntelligentCustomerService(reader.getAttrAsBoolean("needIntelligentCustomerService", true)); this.setShortcuts(reader.getAttrAsString("shortcuts", getDefaultShortCuts())); - this.setNeedRemind(reader.getAttrAsBoolean("needRemind", true)); + this.setNeedRemind(reader.getAttrAsBoolean("isNeedRemind", true)); this.setOperateCount(reader.getAttrAsInt("operateCount", 0)); } @@ -115,16 +115,16 @@ public class AlphaFineConfigManager implements XMLable { @Override public void writeXML(XMLPrintWriter writer) { writer.startTAG("AlphaFineConfigManager"); - writer.attr("enabled", this.isEnabled()) - .attr("searchOnline", this.isSearchOnLine()) + writer.attr("isEnabled", this.isEnabled()) + .attr("isSearchOnline", this.isSearchOnLine()) .attr("shortcuts", this.getShortcuts()) - .attr("containRecommend", this.isContainRecommend()) - .attr("containAction", this.isContainAction()) - .attr("containDocument", this.isContainDocument()) - .attr("containTemplate", this.isContainTemplate()) - .attr("containPlugin", this.isContainPlugin()) - .attr("containFileContent", this.isContainFileContent()) - .attr("needRemind", this.isNeedRemind()) + .attr("isContainRecommend", this.isContainRecommend()) + .attr("isContainAction", this.isContainAction()) + .attr("isContainDocument", this.isContainDocument()) + .attr("isContainTemplate", this.isContainTemplate()) + .attr("isContainPlugin", this.isContainPlugin()) + .attr("isContainFileContent", this.isContainFileContent()) + .attr("isNeedRemind", this.isNeedRemind()) .attr("operateCount", this.getOperateCount()) .attr("needSegmentationCheckbox", this.isNeedSegmentationCheckbox()) .attr("needIntelligentCustomerService", this.isNeedIntelligentCustomerService()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index cd9affb30..3444fecdf 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -122,7 +122,7 @@ public class ContentCellRender implements ListCellRenderer { private String getReplacedString(String modelName, String string) { int index = modelName.toLowerCase().indexOf(string.toLowerCase()); if (index == -1) { - return ""; + return StringUtils.EMPTY; } return modelName.substring(index, index + string.length()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index b85022d8c..7ded4fd9c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -58,7 +58,7 @@ public class ActionSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { filterModelList = new SearchResult(); lessModelList = new SearchResult(); moreModelList = new SearchResult(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java index e1bd1917b..20eeee659 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -22,7 +22,7 @@ import com.fr.third.org.apache.commons.codec.digest.DigestUtils; public class ComplementAdviceManager { private static volatile ComplementAdviceManager instance; - private volatile SearchResult allModelList; + private SearchResult allModelList; public static ComplementAdviceManager getInstance() { if (instance == null) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index c44c78705..7bbbc49a4 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -51,7 +51,7 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { lessModelList = new SearchResult(); moreModelList = new SearchResult(); if (ArrayUtils.isEmpty(searchText)) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 0a2d29f11..626445d9c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -62,7 +62,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { return new FileModel(name, filePath, searchCount); } - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { this.filterModelList = new SearchResult(); this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java index a10c07df2..181d79417 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java @@ -139,11 +139,7 @@ public class HotIssuesManager { private String[] getSubTitleFromCloud(JSONObject data) { ArrayList list = new ArrayList<>(); for (int i = 0; i < HOT_SUB_ITEM_NUM; i++) { - String temp = null; - try { - temp = data.getString(HOT_ITEM + (i + 1)); - } catch (JSONException e) { - } + String temp = data.optString(HOT_ITEM + (i + 1)); if (!StringUtils.isEmpty(temp)) { list.add(temp); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index 5bc972f2a..c1b0c44a5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -96,7 +96,7 @@ public class PluginSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index c4c4ca8e2..404798a07 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -134,6 +134,9 @@ public class RecentSearchManager implements AlphaFineSearchProvider { * @param cellModel */ public void addModel(String searchKey, AlphaCellModel cellModel) { + if(cellModel == null){ + return; + } try { initWriter(); Document doc = new Document(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 3bb4effb6..db05930d8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -47,7 +47,7 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } @Override - public synchronized SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[] searchText) { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index b2c63ed31..7f742d4e5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -22,8 +22,8 @@ import com.fr.third.org.apache.commons.codec.digest.DigestUtils; */ public class SimilarSearchManeger implements AlphaFineSearchProvider { private static volatile SimilarSearchManeger instance; - private volatile SearchResult lessModelList; - private volatile SearchResult moreModelList = new SearchResult(); + private SearchResult lessModelList; + private SearchResult moreModelList = new SearchResult(); public static SimilarSearchManeger getInstance() { if (instance == null) { From a9b74787c158a600289b102553164285ea374809 Mon Sep 17 00:00:00 2001 From: ju Date: Wed, 22 Aug 2018 11:24:32 +0800 Subject: [PATCH 12/77] =?UTF-8?q?DEC-3942=201=E3=80=81=E6=B7=BB=E5=8A=A0mu?= =?UTF-8?q?table=E6=A0=A1=E9=AA=8C=E5=99=A8=EF=BC=8C=E7=94=A8=E4=BA=8E?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=9A=84mutable=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=202=E3=80=81=E6=9C=89=E5=BE=88=E5=A4=9A"ERROR=20null"=E7=9A=84?= =?UTF-8?q?=E6=97=A0=E6=95=88=E9=94=99=E8=AF=AF=E6=97=A5=E5=BF=97=EF=BC=8C?= =?UTF-8?q?=E5=85=A8=E9=83=A8=E6=94=B9=E6=88=90=E6=89=93=E5=8D=B0=E5=A0=86?= =?UTF-8?q?=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 2 +- .../java/com/fr/design/RestartHelper.java | 4 ++-- .../fr/design/actions/help/FeedBackPane.java | 2 +- .../help/alphafine/AlphaFineConfigPane.java | 2 +- .../java/com/fr/design/bbs/BBSLoginUtils.java | 6 +++--- .../design/condition/LiteConditionPane.java | 2 +- .../design/data/DesignTableDataManager.java | 2 +- .../fr/design/data/datapane/ChoosePane.java | 2 +- .../datapane/ChoosePaneSupportFormula.java | 4 ++-- .../wrapper/StoreProcedureDataWrapper.java | 2 +- .../wrapper/StoreProcedureNameWrapper.java | 2 +- .../java/com/fr/design/dialog/UIDialog.java | 2 +- .../com/fr/design/extra/LoginWebBridge.java | 4 ++-- .../fr/design/extra/PluginOperateUtils.java | 2 +- .../java/com/fr/design/extra/PluginUtils.java | 2 +- .../com/fr/design/extra/PluginWebBridge.java | 6 +++--- .../com/fr/design/extra/QQLoginWebPane.java | 2 +- .../com/fr/design/extra/WebViewDlgHelper.java | 2 +- .../extra/exe/GetPluginFromStoreExecutor.java | 2 +- .../extra/exe/ReadUpdateOnlineExecutor.java | 2 +- .../extra/exe/SearchOnlineExecutor.java | 2 +- .../com/fr/design/mainframe/JTemplate.java | 2 +- .../loghandler/DesignerLogHandler.java | 2 +- .../templateinfo/TemplateInfoCollector.java | 6 +++--- .../fr/design/style/color/ColorPicker.java | 2 +- .../main/java/com/fr/env/RemoteEnvUtils.java | 10 +++++----- .../PlotSeries/UIGroupExtensionPane.java | 2 +- .../custom/CustomPlotDesignerPaneFactory.java | 6 +++--- .../VanChartCustomPlotSelectPane.java | 2 +- .../fr/van/chart/designer/PlotFactory.java | 14 ++++++------- .../creator/CRPropertyDescriptorPane.java | 2 +- .../designer/creator/XWidgetCreator.java | 2 +- .../creator/cardlayout/TabMoveAction.java | 2 +- ...bsoluteBodyLayoutPropertiesGroupModel.java | 2 +- .../FRFitLayoutPropertiesGroupModel.java | 2 +- .../mobile/BodyAppRelayoutTable.java | 2 +- .../mobile/ElementCasePropertyTable.java | 2 +- .../FRAbsoluteBodyLayoutDefinePane.java | 2 +- .../layout/FRFitLayoutDefinePane.java | 2 +- .../design/cell/editor/RichTextToolBar.java | 2 +- .../mainframe/CellWidgetPropertyPane.java | 2 +- .../mainframe/InformationCollector.java | 20 +++++++++---------- .../alphafine/cell/model/ActionModel.java | 2 +- .../alphafine/cell/model/DocumentModel.java | 4 ++-- .../alphafine/cell/model/FileModel.java | 2 +- .../alphafine/cell/model/PluginModel.java | 2 +- .../alphafine/component/AlphaFineDialog.java | 20 +++++++++---------- .../manager/impl/RecentSearchManager.java | 4 ++-- .../fr/design/mainframe/bbs/BBSDialog.java | 2 +- .../design/mainframe/bbs/BBSLoginDialog.java | 4 ++-- .../design/mainframe/bbs/UserInfoLabel.java | 4 ++-- .../fr/design/mainframe/bbs/UserInfoPane.java | 4 ++-- .../form/FormElementCaseDesigner.java | 2 +- .../parameter/ParameterDefinitePane.java | 2 +- .../fr/design/present/CellWriteAttrPane.java | 2 +- .../fr/design/report/RichTextEditingPane.java | 2 +- .../com/fr/design/report/RichTextPane.java | 4 ++-- .../report/share/ConfusionTableDataPane.java | 2 +- .../write/submit/SubmitVisitorListPane.java | 2 +- .../src/main/java/com/fr/start/Designer.java | 2 +- 60 files changed, 105 insertions(+), 105 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 4222144ae..f6cfb3186 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -621,7 +621,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { fout.flush(); fout.close(); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/RestartHelper.java b/designer-base/src/main/java/com/fr/design/RestartHelper.java index 2900e09f5..6f1b77acb 100644 --- a/designer-base/src/main/java/com/fr/design/RestartHelper.java +++ b/designer-base/src/main/java/com/fr/design/RestartHelper.java @@ -166,7 +166,7 @@ public class RestartHelper { FineLoggerFactory.getLogger().error("restart lock null!"); } }catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } if (OperatingSystem.isMacOS()) { restartInMacOS(installHome, filesToBeDelete); @@ -174,7 +174,7 @@ public class RestartHelper { restartInWindows(installHome, filesToBeDelete); } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } finally { DesignerContext.getDesignerFrame().exit(); } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/FeedBackPane.java b/designer-base/src/main/java/com/fr/design/actions/help/FeedBackPane.java index 3047f6470..1aa8ea7d4 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/FeedBackPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/FeedBackPane.java @@ -279,7 +279,7 @@ public class FeedBackPane extends BasicPane { try { return DesignUtils.sendFeedBack(feedBackInfo); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; } } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java index ddb8e425c..6b04af8e3 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/alphafine/AlphaFineConfigPane.java @@ -207,7 +207,7 @@ public class AlphaFineConfigPane extends BasicPane { DesignerEnvManager.loadLogSetting(); DesignerEnvManager.getEnvManager().saveXMLFile(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-base/src/main/java/com/fr/design/bbs/BBSLoginUtils.java b/designer-base/src/main/java/com/fr/design/bbs/BBSLoginUtils.java index 5b46b7c68..ea24c49da 100644 --- a/designer-base/src/main/java/com/fr/design/bbs/BBSLoginUtils.java +++ b/designer-base/src/main/java/com/fr/design/bbs/BBSLoginUtils.java @@ -32,7 +32,7 @@ public class BBSLoginUtils { }); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -58,7 +58,7 @@ public class BBSLoginUtils { }); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -71,7 +71,7 @@ public class BBSLoginUtils { try { MarketConfig.getInstance().setBBsAttr(bbsAttr); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java index 9a6cd609e..36fa874cc 100644 --- a/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java +++ b/designer-base/src/main/java/com/fr/design/condition/LiteConditionPane.java @@ -966,7 +966,7 @@ public abstract class LiteConditionPane extends BasicBeanPa try{ newCondition = (Condition)joinCondition.getCondition().clone(); }catch (CloneNotSupportedException e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return newCondition; } diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 9e45309ff..ec1f69d98 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -488,7 +488,7 @@ public abstract class DesignTableDataManager { } rs.release(); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java index dc891c1c6..d004ba6af 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePane.java @@ -278,7 +278,7 @@ public class ChoosePane extends BasicBeanPane implements Refresha schemaBox.setSelectedIndex(index); } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } schemaBox.setRefreshingModel(false); schemaBox.removePopupMenuListener(listener); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePaneSupportFormula.java b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePaneSupportFormula.java index 0bc32dcf0..263d2de53 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePaneSupportFormula.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/ChoosePaneSupportFormula.java @@ -113,7 +113,7 @@ public class ChoosePaneSupportFormula extends ChoosePane { selectedDSName = Utils.objectToString(ca.eval(BaseFormula.createFormulaBuilder().build(item))); // selectedDSName = ParameterHelper.analyzeCurrentContextTableData4Templatee(item, parameters); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } else { selectedDSName = item; @@ -156,7 +156,7 @@ public class ChoosePaneSupportFormula extends ChoosePane { dsName = dsItem.startsWith("=") ? Utils.objectToString(ca.eval(BaseFormula.createFormulaBuilder().build(dsItem))) : dsItem; tableName = tableItem.startsWith("=") ? Utils.objectToString(ca.eval(BaseFormula.createFormulaBuilder().build(tableItem))) : tableItem; } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } ori_ds_name = dsName; ori_table_name = tableName; diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java index 40a62ec0a..ae8fb5cf8 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java @@ -146,7 +146,7 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { } return true; } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } return false; } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java index 9e52524c1..d620caef2 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureNameWrapper.java @@ -77,7 +77,7 @@ public final class StoreProcedureNameWrapper implements TableDataWrapper { try { procedureDataModel = DesignTableDataManager.createLazyDataModel(storeProcedure, needLoadingBar)[0]; } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java index bfba65b94..7380bb58f 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java @@ -166,7 +166,7 @@ public abstract class UIDialog extends JDialog { l.doOk(); } catch (RuntimeException e) { isDoOKSucceed = false; - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } if (isDoOKSucceed) { diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java index b22c5905a..a89a4df03 100644 --- a/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java +++ b/designer-base/src/main/java/com/fr/design/extra/LoginWebBridge.java @@ -150,7 +150,7 @@ public class LoginWebBridge { try { Thread.sleep(millis); } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } @@ -306,7 +306,7 @@ public class LoginWebBridge { } } } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java index b0b1f5432..17658d94e 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginOperateUtils.java @@ -116,7 +116,7 @@ public class PluginOperateUtils { JSONArray jsonArray = new JSONArray(result); resultArray = PluginUtils.filterPluginsFromVersion(jsonArray); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return resultArray.toString(); } diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java index 50f81d574..19b4d3273 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginUtils.java @@ -59,7 +59,7 @@ public class PluginUtils { httpClient.asGet(); result = httpClient.getResponseText(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } else { result = PluginConstants.CONNECTION_404; diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java index de96c10b9..9acc24ba3 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginWebBridge.java @@ -350,7 +350,7 @@ public class PluginWebBridge { Task task = new PluginTask<>(webEngine, callback, new GetPluginFromStoreExecutor(new JSONObject(info))); threadPoolExecutor.submit(task); } catch (JSONException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -486,10 +486,10 @@ public class PluginWebBridge { } } catch (NullPointerException e) { //此为uri为空时抛出异常 - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (IOException e) { //此为无法获取系统默认浏览器 - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java index f3d37cab7..a621d4ecf 100644 --- a/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java +++ b/designer-base/src/main/java/com/fr/design/extra/QQLoginWebPane.java @@ -149,7 +149,7 @@ public class QQLoginWebPane extends JFXPanel { } }); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index 11bfc334a..3e4099bc6 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -123,7 +123,7 @@ public class WebViewDlgHelper { try { CommonIOUtils.copy(new File(mainJsPath), new File(installHome)); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java index 884b115da..4a1168734 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginFromStoreExecutor.java @@ -72,7 +72,7 @@ public class GetPluginFromStoreExecutor implements Executor { JSONArray resultJSONArray = PluginUtils.filterPluginsFromVersion(resultArr); result = resultJSONArray.toString(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } else { result = PluginConstants.CONNECTION_404; diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java index 501cc1dff..739b84666 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/ReadUpdateOnlineExecutor.java @@ -42,7 +42,7 @@ public class ReadUpdateOnlineExecutor implements Executor { } result = jsonArray.toString(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java index a35d10588..fdbd8562f 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/SearchOnlineExecutor.java @@ -50,7 +50,7 @@ public class SearchOnlineExecutor implements Executor { JSONArray resultJSONArray = PluginUtils.filterPluginsFromVersion(jsonArray); result = resultJSONArray.toString(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index bf4eb0d0c..4661bc1bb 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -520,7 +520,7 @@ public abstract class JTemplate> // return false; // } // } catch (Exception e) { -// FineLoggerFactory.getLogger().error(e.getMessage()); +// FineLoggerFactory.getLogger().error(e.getMessage(), e); // } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java index a2bd7018b..7d4f40c86 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java @@ -257,7 +257,7 @@ public class DesignerLogHandler { try { doc.insertString(doc.getLength(), str, attrSet); } catch (BadLocationException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 7eb5e7bfd..c1ca5d6bb 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -132,11 +132,11 @@ public class TemplateInfoCollector implements Serializable, } xmlInputStream.close(); } catch (FileNotFoundException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } catch (IOException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } catch (XMLStreamException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-base/src/main/java/com/fr/design/style/color/ColorPicker.java b/designer-base/src/main/java/com/fr/design/style/color/ColorPicker.java index 90b859fcc..155ac4168 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/ColorPicker.java +++ b/designer-base/src/main/java/com/fr/design/style/color/ColorPicker.java @@ -73,7 +73,7 @@ public class ColorPicker extends JDialog implements ActionListener try { Thread.sleep(100); // 等待弹窗关闭 } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } colorPickerPanel.captureScreen(); } diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java b/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java index 13d251010..1f25267ef 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java @@ -67,7 +67,7 @@ // .build(); // inputStream = httpClient.execute(request, responseHandler); // } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage()); +// FRContext.getLogger().error(e.getMessage(), e); // } // return inputStream; // } @@ -90,7 +90,7 @@ // .build(); // inputStream = httpClient.execute(request, responseHandler); // } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage()); +// FRContext.getLogger().error(e.getMessage(), e); // } // return inputStream; // } @@ -112,7 +112,7 @@ // inputStream = httpClient.execute(request, responseHandler); // // } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage()); +// FRContext.getLogger().error(e.getMessage(), e); // } // return inputStream; // } @@ -137,7 +137,7 @@ // .build(); // inputStream = httpClient.execute(request, responseHandler); // } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage()); +// FRContext.getLogger().error(e.getMessage(), e); // } // // return inputStream; @@ -158,7 +158,7 @@ // .build(); // inputStream = httpClient.execute(request, responseHandler); // } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage()); +// FRContext.getLogger().error(e.getMessage(), e); // } // return inputStream; // } diff --git a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java index 2f69013ce..f693a45f6 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/series/PlotSeries/UIGroupExtensionPane.java @@ -477,7 +477,7 @@ public class UIGroupExtensionPane extends BasicPane { try { list.setSelectedIndices(null); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/CustomPlotDesignerPaneFactory.java b/designer-chart/src/main/java/com/fr/van/chart/custom/CustomPlotDesignerPaneFactory.java index 783a35b87..372b1041e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/CustomPlotDesignerPaneFactory.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/CustomPlotDesignerPaneFactory.java @@ -59,7 +59,7 @@ public class CustomPlotDesignerPaneFactory { Constructor > constructor = cl.getConstructor(); return constructor.newInstance(); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return null; @@ -89,7 +89,7 @@ public class CustomPlotDesignerPaneFactory { Constructor constructor = cl.getConstructor(ChartDataPane.class); return constructor.newInstance(parent); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new CategoryPlotTableDataContentPane(parent); @@ -125,7 +125,7 @@ public class CustomPlotDesignerPaneFactory { return constructor.newInstance(plot, parent); } } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartAxisPane(plot,parent); diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotSelectPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotSelectPane.java index c037e182d..133cba525 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotSelectPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/component/VanChartCustomPlotSelectPane.java @@ -250,7 +250,7 @@ public class VanChartCustomPlotSelectPane extends BasicBeanPane { } } } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java b/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java index d5eb3e754..7c46b8b08 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java @@ -198,7 +198,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(Plot.class, VanChartStylePane.class); return constructor.newInstance(plot, stylePane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartPlotLabelPane(plot, stylePane); @@ -218,7 +218,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(VanChartStylePane.class); return constructor.newInstance(stylePane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartPlotLegendPane(stylePane); @@ -238,7 +238,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(Plot.class, VanChartStylePane.class); return constructor.newInstance(plot, stylePane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartPlotTooltipPane(plot, stylePane); @@ -259,7 +259,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(VanChartStylePane.class, JPanel.class); return constructor.newInstance(parent, showOnPane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartLabelContentPane(parent, showOnPane); @@ -280,7 +280,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(VanChartStylePane.class, JPanel.class); return constructor.newInstance(parent, showOnPane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartTooltipContentPane(parent, showOnPane); @@ -301,7 +301,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(Plot.class); return constructor.newInstance(plot); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartPlotRefreshTooltipPane(plot); @@ -321,7 +321,7 @@ public class PlotFactory { Constructor constructor = cl.getConstructor(VanChartStylePane.class, JPanel.class); return constructor.newInstance(parent, showOnPane); } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return new VanChartRefreshTooltipContentPane(parent, showOnPane); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptorPane.java b/designer-form/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptorPane.java index 906769eaa..882c216f0 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptorPane.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/CRPropertyDescriptorPane.java @@ -103,7 +103,7 @@ public class CRPropertyDescriptorPane { } }); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } return component; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWidgetCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWidgetCreator.java index 9118a4594..401c87a95 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWidgetCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWidgetCreator.java @@ -139,7 +139,7 @@ public abstract class XWidgetCreator extends XCreator { this.setRolloverIcon(new ImageIcon(image1)); this.setPressedIcon(new ImageIcon(image));//按下去的图标 } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/TabMoveAction.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/TabMoveAction.java index 9b5dd2662..31d8d3065 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/TabMoveAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/TabMoveAction.java @@ -40,7 +40,7 @@ public class TabMoveAction extends FormUndoableAction { FormHierarchyTreePane.getInstance().refreshDockingView(); }catch (Exception e){ xwCardTagLayout.setSwitchingTab(false); - FRLogger.getLogger().error(e.getMessage()); + FRLogger.getLogger().error(e.getMessage(), e); return false; } return true; diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java b/designer-form/src/main/java/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java index 3191f7631..ecf285be5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/FRAbsoluteBodyLayoutPropertiesGroupModel.java @@ -170,7 +170,7 @@ public class FRAbsoluteBodyLayoutPropertiesGroupModel extends FRAbsoluteLayoutPr return true; } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; } } diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java b/designer-form/src/main/java/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java index 9d60be9dd..d9f33176d 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/FRFitLayoutPropertiesGroupModel.java @@ -175,7 +175,7 @@ public class FRFitLayoutPropertiesGroupModel implements GroupModel { FormSelectionUtils.rebuildSelection(xfl, new Widget[]{xfl.toData()})); } }catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; } layout.setLayoutType(WBodyLayoutType.parse(state)); diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyAppRelayoutTable.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyAppRelayoutTable.java index 3cfc0db69..2abbfd12f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyAppRelayoutTable.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/BodyAppRelayoutTable.java @@ -50,7 +50,7 @@ public class BodyAppRelayoutTable extends AbstractPropertyTable { try { propertyTableEditor = supportedDescriptor(); }catch (IntrospectionException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } groups.add(new PropertyGroup(new ReportAppPropertyGroupModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Properties_Mobile"), xCreator, propertyTableEditor, designer))); diff --git a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ElementCasePropertyTable.java b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ElementCasePropertyTable.java index 15c4c6568..9fafab0de 100644 --- a/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ElementCasePropertyTable.java +++ b/designer-form/src/main/java/com/fr/design/designer/properties/mobile/ElementCasePropertyTable.java @@ -92,7 +92,7 @@ public class ElementCasePropertyTable extends AbstractPropertyTable{ try { propertyTableEditor = supportedDescriptor(); } catch (IntrospectionException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java index 1302c0c36..bdd011f03 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRAbsoluteBodyLayoutDefinePane.java @@ -193,7 +193,7 @@ public class FRAbsoluteBodyLayoutDefinePane extends FRAbsoluteLayoutDefinePane { formDesigner.getSelectionModel().setSelectedCreator(xfl); return true; } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; } } diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java index 137e0e0d4..8be0e931c 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/layout/FRFitLayoutDefinePane.java @@ -201,7 +201,7 @@ public class FRFitLayoutDefinePane extends AbstractDataModify { FormSelectionUtils.rebuildSelection(xWFitLayout, new Widget[]{wAbsoluteBodyLayout})); } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java index e051b3667..b8031b238 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/RichTextToolBar.java @@ -340,7 +340,7 @@ public class RichTextToolBar extends BasicPane{ try { doc.insertString(start, content, attrs); } catch (BadLocationException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } }).setVisible(true); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java index 042a92c38..eac4c3e0d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java @@ -183,7 +183,7 @@ public class CellWidgetPropertyPane extends BasicPane { newWidget.setWidgetPrivilegeControl((WidgetPrivilegeControl) oldWidget.getWidgetPrivilegeControl().clone()); } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return newWidget; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 6250179db..700b1ca4a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -120,11 +120,11 @@ public class InformationCollector implements XMLReadable, XMLWriter { } xmlInputStream.close(); } catch (FileNotFoundException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } catch (IOException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } catch (XMLStreamException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } @@ -174,7 +174,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { try { return content.toString().getBytes(EncodeConstants.ENCODING_UTF_8); } catch (UnsupportedEncodingException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); return ArrayUtils.EMPTY_BYTE_ARRAY; } } @@ -225,7 +225,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } content = getFunctionsContentAsByte(rs); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } finally { DBUtils.closeConnection(conn); } @@ -258,7 +258,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { Delete delete = new Delete(table); delete.execute(conn); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } finally { DBUtils.closeConnection(conn); } @@ -304,7 +304,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { try { return content.toString().getBytes(EncodeConstants.ENCODING_UTF_8); } catch (UnsupportedEncodingException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); return ArrayUtils.EMPTY_BYTE_ARRAY; } } @@ -356,7 +356,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { //读取XML的5分钟后开始发请求连接服务器. Thread.sleep(SEND_DELAY); } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } sendFunctionsInfo(); sendUserInfo(); @@ -402,7 +402,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { String encodeCotent = DesUtils.getEncString(fileContent); writeEncodeContentToFile(encodeCotent, xmlFile); }catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } @@ -418,7 +418,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { bw = new BufferedWriter(osw); bw.write(fileContent); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } finally { if(bw != null){ try { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java index 324006f93..a2e18f6f8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/ActionModel.java @@ -58,7 +58,7 @@ public class ActionModel extends AlphaCellModel { modelObject.put("className", getAction().getClass().getName()).put("searchCount", getSearchCount()); object.put("result", modelObject).put("cellType", getType().getTypeValue()); } catch (JSONException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return object; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java index 4cb7cd16d..ab52c9022 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/DocumentModel.java @@ -62,9 +62,9 @@ public class DocumentModel extends AlphaCellModel { try { Desktop.getDesktop().browse(new URI(getDocumentUrl())); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (URISyntaxException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java index 377c2c8eb..f8f6794c5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/FileModel.java @@ -42,7 +42,7 @@ public class FileModel extends AlphaCellModel { modelObject.put("filePath", getFilePath()).put("searchCount", getSearchCount()); object.put("result", modelObject).put("cellType", getType().getTypeValue()); } catch (JSONException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return object; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java index 8416afdec..83441023f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/PluginModel.java @@ -92,7 +92,7 @@ public class PluginModel extends AlphaCellModel { modelObject.put("name", getName()).put("description", getContent()).put("pic", getImageUrl()).put("version", getVersion()).put("jartime", getJartime()).put("id", getId()).put("pluginid", getPluginId()).put("type", getType().getTypeValue()).put("price", getPrice()).put("link", getLink()).put("searchCount", getSearchCount()); object.put("result", modelObject).put("cellType", getType().getTypeValue()); } catch (JSONException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return object; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index ef791195d..bc89c105d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -526,7 +526,7 @@ public class AlphaFineDialog extends UIDialog { try { form = FormIO.readForm(fileName); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return FormIO.exportFormAsImage(form); } @@ -538,9 +538,9 @@ public class AlphaFineDialog extends UIDialog { try { rightSearchResultPane.add(new FilePreviewPane(get())); } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } validate(); repaint(); @@ -558,7 +558,7 @@ public class AlphaFineDialog extends UIDialog { try { workBook = (WorkBook) TemplateWorkBookIO.readTemplateWorkBook(fileName); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } BufferedImage bufferedImage = new ImageExporter().exportToImage(workBook); return bufferedImage; @@ -573,9 +573,9 @@ public class AlphaFineDialog extends UIDialog { validate(); repaint(); } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -610,7 +610,7 @@ public class AlphaFineDialog extends UIDialog { try { bufferedImage = ImageIO.read(getClass().getResource("/com/fr/design/mainframe/alphafine/images/default_product.png")); } catch (IOException e1) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } return bufferedImage; @@ -626,9 +626,9 @@ public class AlphaFineDialog extends UIDialog { repaint(); } } catch (InterruptedException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } catch (ExecutionException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -812,7 +812,7 @@ public class AlphaFineDialog extends UIDialog { try { object.put("uuid", uuid).put("activityKey", activityKey).put("username", username).put("createTime", createTime).put("key", key).put("resultKind", resultKind).put("resultValue", resultValue); } catch (JSONException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } final HashMap para = new HashMap<>(); String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index 481442fac..f784ddeb3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -107,7 +107,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { directory = FSDirectory.open(new File(path)); indexWriter = new IndexWriter(directory, config); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } @@ -121,7 +121,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { indexReader = DirectoryReader.open(directory); indexSearcher = new IndexSearcher(indexReader); } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSDialog.java index dd3366273..cfce02c72 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSDialog.java @@ -63,7 +63,7 @@ public class BBSDialog extends UIDialog { } }); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSLoginDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSLoginDialog.java index d923e2517..82f8a8484 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSLoginDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/BBSLoginDialog.java @@ -281,7 +281,7 @@ public class BBSLoginDialog extends UIDialog { username = URLEncoder.encode(username, EncodeConstants.ENCODING_GBK); password = URLEncoder.encode(password, EncodeConstants.ENCODING_GBK); } catch (UnsupportedEncodingException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } String url = CloudCenter.getInstance().acquireUrlByKind("bbs.login") + "&username=" + username + "&password=" + password; String loginSuccessFlag = CloudCenter.getInstance().acquireUrlByKind("bbs"); @@ -294,7 +294,7 @@ public class BBSLoginDialog extends UIDialog { return true; } } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java index 05ee97640..2869b7915 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoLabel.java @@ -149,7 +149,7 @@ public class UserInfoLabel extends UILabel { } Thread.sleep(DELAY_TIME); } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } HttpClient hc = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("bbs.popup")); if (!hc.isServerAlive()) { @@ -222,7 +222,7 @@ public class UserInfoLabel extends UILabel { try { Thread.sleep(millis); } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java index 56ce0dabd..85299d24d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/bbs/UserInfoPane.java @@ -142,7 +142,7 @@ public class UserInfoPane extends BasicPane { return dayNew - dayOld; } } catch (ParseException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } return 1; } @@ -165,7 +165,7 @@ public class UserInfoPane extends BasicPane { } } catch (InterruptedException e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } String userName = MarketConfig.getInstance().getBbsUsername(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java index ba883874c..8fdcfbbc3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/form/FormElementCaseDesigner.java @@ -134,7 +134,7 @@ public class FormElementCaseDesigner{ InputStream in = IOUtils.readResource("/com/fr/design/report/share/shareToolTip.html"); return IOUtils.inputStream2String(in); } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } return StringUtils.EMPTY; diff --git a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java index 0875b1568..6d5aac302 100644 --- a/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java +++ b/designer-realize/src/main/java/com/fr/design/write/submit/SubmitVisitorListPane.java @@ -137,7 +137,7 @@ public class SubmitVisitorListPane extends ObjectJControlPane { try { editing = (BuiltInSQLSubmiterProvider) editing.clone(); } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); + FineLoggerFactory.getLogger().error(e.getMessage(), e); } editing.setDBManipulation(dbManipulation); diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 58d450b68..8747921dd 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -180,7 +180,7 @@ public class Designer extends BaseDesigner { shortCuts.add((ShortCut) DesignModuleFactory.getNewFormAction().newInstance()); } } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } return shortCuts.toArray(new ShortCut[shortCuts.size()]); } From 9804d86b40a48f508af479d48a23f7b07c0a4b5c Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 14:07:44 +0800 Subject: [PATCH 13/77] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E6=96=87=E4=BB=B6=E5=8F=8A=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/alphafine/component/AlphaFineDialog.java | 2 +- .../alphafine/search/manager/impl/SegmentationManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index d9f06137c..82fee0c94 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -1333,7 +1333,7 @@ public class AlphaFineDialog extends UIDialog { */ private void initBackPane() { backPane = new JPanel(new BorderLayout()); - JLabel jLabel = new JLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Back")); + JLabel jLabel = new JLabel(com.fr.design.i18n.Toolkit.i18nText(" < " + "Fine-Design_Report_AlphaFine_Back")); jLabel.setPreferredSize(new Dimension(680, 20)); jLabel.setFont(AlphaFineConstants.SMALL_FONT); jLabel.setForeground(AlphaFineConstants.DARK_GRAY); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index 908d1b1f6..b64093c91 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -56,7 +56,7 @@ public class SegmentationManager { public String[] startSegmentation(String searchText) { Pattern p = Pattern.compile(AlphaFineConstants.SPECIAL_CHARACTER_REGEX); Matcher m = p.matcher(searchText); - searchText = m.replaceAll("").trim().replaceAll(" ", ""); + searchText = m.replaceAll(StringUtils.EMPTY).trim().replaceAll(StringUtils.BLANK, StringUtils.EMPTY); if (StringUtils.isEmpty(searchText)) { return null; } From bcafc5ce1d09d2ccde5cbb97be27a00ccb121c4a Mon Sep 17 00:00:00 2001 From: zack Date: Wed, 22 Aug 2018 14:17:00 +0800 Subject: [PATCH 14/77] =?UTF-8?q?REPORT-10384=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E9=A2=84=E8=A7=88=E5=90=AF=E5=8A=A8=E5=81=87=E6=AD=BB?= =?UTF-8?q?=E9=97=AE=E9=A2=98,=E6=9C=AC=E5=9C=B0=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E4=B9=9F=E6=98=BE=E7=A4=BA=E5=90=AF=E5=8A=A8?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/start/server/FineEmbedServerMonitor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index 08ecd3536..ee54a80de 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -27,7 +27,8 @@ public class FineEmbedServerMonitor { EventDispatcher.listen(EmbedServerEvent.AfterStop, new Listener() { @Override public void on(Event event, Null aNull) { - DesignerContext.getDesignerFrame().disposeProgressDialog(); + getInstance().reset(); + DesignerContext.getDesignerFrame().hideProgressDialog(); } }); } @@ -81,7 +82,7 @@ public class FineEmbedServerMonitor { } catch (InterruptedException ignore) { } } - DesignerContext.getDesignerFrame().disposeProgressDialog(); + DesignerContext.getDesignerFrame().hideProgressDialog(); } }); service.shutdown(); From 614d504347906408a4b11ff2b9df3a5d7957944c Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 15:38:11 +0800 Subject: [PATCH 15/77] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E8=B4=A8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConstants.java | 4 +++ .../alphafine/cell/CellModelHelper.java | 2 +- .../cell/render/ContentCellRender.java | 6 +++-- .../manager/impl/ComplementAdviceManager.java | 8 +++--- .../manager/impl/DocumentSearchManager.java | 4 +-- .../manager/impl/FileSearchManager.java | 2 +- .../manager/impl/RecommendSearchManager.java | 25 ++++++++----------- .../manager/impl/SegmentationManager.java | 8 +++--- .../manager/impl/SimilarSearchManeger.java | 7 +++--- 9 files changed, 34 insertions(+), 32 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index d4a532815..5f42d03e6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.alphafine; +import com.fr.base.extension.FileExtension; import com.fr.general.CloudCenter; import java.awt.Color; import java.awt.Dimension; @@ -123,5 +124,8 @@ public class AlphaFineConstants { public static final String CHINESE_CHARACTERS = "[\\u4e00-\\u9fa5]"; + public static final String FIRST_PAGE = "-1"; + + public static final FileExtension[] FILE_EXTENSIONS= new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java index b388f5e8e..83ab319a6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/CellModelHelper.java @@ -35,7 +35,7 @@ public class CellModelHelper { case ROBOT: case RECOMMEND_ROBOT: cellModel = SimilarSearchManeger.getModelFromCloud(object.optJSONObject(RESULT)); - + break; } return cellModel; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index 3444fecdf..53fa89bd9 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -64,7 +64,7 @@ public class ContentCellRender implements ListCellRenderer { } } else { - titleLabel.setText(dealWithModelName(model.getName(), segmentationResult)); + titleLabel.setText(highLightModelName(model.getName(), segmentationResult)); String iconUrl = CELL_PATH + model.getType().getTypeValue() + SUFFIX; if (value instanceof RobotModel && ((RobotModel) value).isHotItemModel()) { titleLabel.setIcon(null); @@ -104,7 +104,7 @@ public class ContentCellRender implements ListCellRenderer { * @param strings * @return */ - public String dealWithModelName(String modelName, String[] strings) { + public String highLightModelName(String modelName, String[] strings) { if (strings == null) { return modelName; } @@ -127,4 +127,6 @@ public class ContentCellRender implements ListCellRenderer { return modelName.substring(index, index + string.length()); } + + } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java index 20eeee659..f59e98df6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -9,7 +9,7 @@ import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.json.JSONTokener; +import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import java.io.IOException; @@ -50,9 +50,8 @@ public class ComplementAdviceManager { try { String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); - Object json = new JSONTokener(result).nextValue(); - if (json instanceof JSONArray) { - JSONArray jsonArray = new JSONArray(result); + JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); + if(jsonArray != null){ for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); JSONObject jsonObject = jsonArray.optJSONObject(i); @@ -64,6 +63,7 @@ public class ComplementAdviceManager { allModelList.add(robotModel); } } + } } } catch (JSONException e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index 7bbbc49a4..b8ba403aa 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -13,7 +13,7 @@ import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; -import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import com.fr.stable.ArrayUtils; import java.io.IOException; @@ -61,7 +61,7 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainDocument()) { SearchResult searchResult = new SearchResult(); for (int j = 0; j < searchText.length; j++) { - String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText[j] + "-1"; + String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText[j] + AlphaFineConstants.FIRST_PAGE; try { String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 626445d9c..4e50fa935 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -73,7 +73,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { return lessModelList; } AlphaFineHelper.checkCancel(); - fileNodes = FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); + fileNodes = FRContext.getFileNodes().list(ProjectConstants.REPORTLETS_NAME, AlphaFineConstants.FILE_EXTENSIONS, true); isContainCpt = true; isContainFrm = true; doSearch(this.searchText); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index db05930d8..d13050a01 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -14,7 +14,6 @@ import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.json.JSONTokener; import com.fr.log.FineLoggerFactory; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; @@ -61,19 +60,16 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { try { String result = HttpToolbox.get(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); AlphaFineHelper.checkCancel(); - Object json = new JSONTokener(result).nextValue(); - if (json instanceof JSONObject) { - JSONObject jsonObject = new JSONObject(result); - if (jsonObject.optString("status").equals("success")) { - JSONArray jsonArray = jsonObject.optJSONArray("result"); - if (jsonArray != null && jsonArray.length() > 0) { - for (int i = 0; i < jsonArray.length(); i++) { - AlphaFineHelper.checkCancel(); - AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); - if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { - - this.recommendModelList.add(alphaCellModel); - } + JSONObject jsonObject = new JSONObject(result); + if (jsonObject.optString("status").equals("success")) { + JSONArray jsonArray = jsonObject.optJSONArray("result"); + if (jsonArray != null && jsonArray.length() > 0) { + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); + if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { + + this.recommendModelList.add(alphaCellModel); } } } @@ -94,6 +90,7 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } complementAdviceModelList = ComplementAdviceManager.getInstance().getAllSearchResult(searchText); moreModelList.clear(); + if (recommendModelList.size() > 0) { if (complementAdviceModelList.size() == 0) { if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE - 2) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index b64093c91..6f9803955 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -4,6 +4,7 @@ import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.stable.StringUtils; import com.fr.third.ibm.icu.text.BreakIterator; + import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -18,7 +19,7 @@ public class SegmentationManager { public static SegmentationManager getInstance() { if (segmentationManager == null) { - synchronized (SegmentationManager.class){ + synchronized (SegmentationManager.class) { if (segmentationManager == null) { segmentationManager = new SegmentationManager(); } @@ -50,6 +51,7 @@ public class SegmentationManager { /** * 对字符串进行分词 + * * @param searchText * @return */ @@ -67,9 +69,7 @@ public class SegmentationManager { BreakIterator itor = BreakIterator.getWordInstance(); itor.setText(searchText); int start = itor.first(); - for (int end = itor.next(); - end != BreakIterator.DONE; - start = end, end = itor.next()) { + for (int end = itor.next(); end != BreakIterator.DONE; start = end, end = itor.next()) { String temp = searchText.substring(start, end); if (!StringUtils.isEmpty(temp)) { result.add(temp); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index 7f742d4e5..ddaffb88a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -12,7 +12,7 @@ import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.json.JSONTokener; +import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; import java.io.IOException; import com.fr.third.org.apache.commons.codec.digest.DigestUtils; @@ -47,9 +47,8 @@ public class SimilarSearchManeger implements AlphaFineSearchProvider { try { String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); - Object json = new JSONTokener(result).nextValue(); - if (json instanceof JSONArray) { - JSONArray jsonArray = new JSONArray(result); + JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); + if(jsonArray != null){ if (jsonArray.length() != 0) { for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.optJSONObject(i); From 3113347520a8fef30c24729ea758fa213ce43dfd Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 15:48:08 +0800 Subject: [PATCH 16/77] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81=E8=B4=A8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/alphafine/cell/render/ContentCellRender.java | 2 +- .../alphafine/search/manager/impl/ActionSearchManager.java | 2 +- .../alphafine/search/manager/impl/PluginSearchManager.java | 2 +- .../alphafine/search/manager/impl/RecommendSearchManager.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index 53fa89bd9..ffcac3f23 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -53,7 +53,7 @@ public class ContentCellRender implements ListCellRenderer { if (model.hasAction()) { if (isSelected) { - titleLabel.setText(" " + model.getName()); + titleLabel.setText(StringUtils.BLANK + model.getName()); String iconUrl = SELECTED_PATH + model.getType().getTypeValue() + SUFFIX; panel.setBackground(AlphaFineConstants.BLUE); titleLabel.setForeground(Color.WHITE); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index 7ded4fd9c..1ba95926a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -15,7 +15,7 @@ import com.fr.general.ComparatorUtils; import com.fr.json.JSONObject; import com.fr.stable.StringUtils; -import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import com.fr.stable.ArrayUtils; import java.util.List; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index c1b0c44a5..4a78e34e3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -17,7 +17,7 @@ import com.fr.log.FineLoggerFactory; import com.fr.plugin.basic.version.Version; import com.fr.plugin.basic.version.VersionIntervalFactory; import com.fr.stable.EncodeConstants; -import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import com.fr.stable.ArrayUtils; import java.io.IOException; import java.io.UnsupportedEncodingException; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index d13050a01..8edfbcdf3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -17,7 +17,7 @@ import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; -import com.fr.third.org.apache.commons.lang3.ArrayUtils; +import com.fr.stable.ArrayUtils; import java.io.IOException; import java.util.Iterator; From 6e95b0939a7e07de101db5b25715f3a9a9b2fe1a Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 22 Aug 2018 20:01:41 +0800 Subject: [PATCH 17/77] =?UTF-8?q?=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B4=A8=E9=87=8F=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConstants.java | 2 + .../manager/impl/RecommendSearchManager.java | 124 ++++++++++-------- 2 files changed, 73 insertions(+), 53 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index 5f42d03e6..e84969bd0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -128,4 +128,6 @@ public class AlphaFineConstants { public static final FileExtension[] FILE_EXTENSIONS= new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; + public static final int RECOMMEND_MAX_ITEM_NUM = 3; + } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 8edfbcdf3..15476c446 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -47,11 +47,9 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { @Override public SearchResult getLessSearchResult(String[] searchText) { - if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); } - this.modelList = new SearchResult(); this.recommendModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainRecommend()) { @@ -61,14 +59,13 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { String result = HttpToolbox.get(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); AlphaFineHelper.checkCancel(); JSONObject jsonObject = new JSONObject(result); - if (jsonObject.optString("status").equals("success")) { + if ("success".equals(jsonObject.optString("status"))) { JSONArray jsonArray = jsonObject.optJSONArray("result"); if (jsonArray != null && jsonArray.length() > 0) { for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { - this.recommendModelList.add(alphaCellModel); } } @@ -91,58 +88,15 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { complementAdviceModelList = ComplementAdviceManager.getInstance().getAllSearchResult(searchText); moreModelList.clear(); - if (recommendModelList.size() > 0) { - if (complementAdviceModelList.size() == 0) { - if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE - 2) { - if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE) { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); - } else { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); - } - modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.SHOW_SIZE - 2)); - moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.SHOW_SIZE - 2, recommendModelList.size())); - } else { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); - modelList.addAll(recommendModelList); - } + if (!recommendModelList.isEmpty()) { + if (complementAdviceModelList.isEmpty()) { + getRecommendSearchResult(); } else { - if (recommendModelList.size() + complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); - if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE - 2) { - modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.SHOW_SIZE - 2)); - moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.SHOW_SIZE - 2, recommendModelList.size())); - - if (complementAdviceModelList.size() >= 2) { - modelList.addAll(complementAdviceModelList.subList(0, 2)); - moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); - } else { - modelList.addAll(complementAdviceModelList); - } - } else { - modelList.addAll(recommendModelList); - if (complementAdviceModelList.size() >= (AlphaFineConstants.SHOW_SIZE - recommendModelList.size())) { - modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE - recommendModelList.size())); - moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); - } else { - modelList.addAll(complementAdviceModelList); - } - } - } else { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); - modelList.addAll(recommendModelList); - modelList.addAll(complementAdviceModelList); - } + getRecommendAndAdviceSearchResult(); } } else { - if (complementAdviceModelList.size() > 0) { - if (complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); - modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); - moreModelList.addAll(complementAdviceModelList.subList(AlphaFineConstants.SHOW_SIZE, complementAdviceModelList.size())); - } else { - modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); - modelList.addAll(complementAdviceModelList); - } + if (!complementAdviceModelList.isEmpty()) { + getComplementAdviceSearchResult(); } else { return modelList; } @@ -151,6 +105,70 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { return modelList; } + /** + * 将推荐接口获取的数据分别放入“显示部分”,“显示更多”的list + */ + private void getRecommendSearchResult(){ + if (recommendModelList.size() > AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM) { + if (recommendModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + } + modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM)); + moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM, recommendModelList.size())); + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(recommendModelList); + } + } + + /** + * 将补全接口获取的数据分别放入“显示部分”,“显示更多”的list + */ + private void getComplementAdviceSearchResult(){ + if (complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE)); + moreModelList.addAll(complementAdviceModelList.subList(AlphaFineConstants.SHOW_SIZE, complementAdviceModelList.size())); + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(complementAdviceModelList); + } + } + + /** + * 将推荐接口和补全接口获取的数据分别放入“显示部分”,“显示更多”的list + */ + private void getRecommendAndAdviceSearchResult(){ + if (recommendModelList.size() + complementAdviceModelList.size() > AlphaFineConstants.SHOW_SIZE) { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_ShowAll"), true, CellType.RECOMMEND)); + if (recommendModelList.size() > AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM) { + modelList.addAll(recommendModelList.subList(0, AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM)); + moreModelList.addAll(recommendModelList.subList(AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM, recommendModelList.size())); + + if (complementAdviceModelList.size() >= AlphaFineConstants.SHOW_SIZE - AlphaFineConstants.RECOMMEND_MAX_ITEM_NUM) { + modelList.addAll(complementAdviceModelList.subList(0, 2)); + moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); + } else { + modelList.addAll(complementAdviceModelList); + } + } else { + modelList.addAll(recommendModelList); + if (complementAdviceModelList.size() >= (AlphaFineConstants.SHOW_SIZE - recommendModelList.size())) { + modelList.addAll(complementAdviceModelList.subList(0, AlphaFineConstants.SHOW_SIZE - recommendModelList.size())); + moreModelList.addAll(complementAdviceModelList.subList(2, complementAdviceModelList.size())); + } else { + modelList.addAll(complementAdviceModelList); + } + } + } else { + modelList.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"), false)); + modelList.addAll(recommendModelList); + modelList.addAll(complementAdviceModelList); + } + } + /** * 是否已包含该model * From cb32d0b3ec1137dd5d1470cc580003f0291388bb Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Fri, 24 Aug 2018 11:57:37 +0800 Subject: [PATCH 18/77] =?UTF-8?q?=E6=8F=90=E5=8D=87=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/alphafine/AlphaFineHelper.java | 23 +++++++++++++++++++ .../alphafine/cell/model/RobotModel.java | 13 +++++++++++ .../alphafine/component/AlphaFineDialog.java | 2 +- .../manager/impl/ComplementAdviceManager.java | 21 +++-------------- .../manager/impl/RecommendSearchManager.java | 6 ++++- .../manager/impl/SimilarSearchManeger.java | 18 ++++----------- 6 files changed, 49 insertions(+), 34 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java index de409fda7..6c8e2f119 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java @@ -5,12 +5,17 @@ import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.NoResultModel; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; import com.fr.general.ProcessCanceledException; +import com.fr.json.JSONArray; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.json.JSONUtils; import com.fr.stable.StringUtils; import java.util.List; @@ -97,5 +102,23 @@ public class AlphaFineHelper { return filterResult; } + public static SearchResult getModelListFromJSONArray(String result, String keyword) throws ClassCastException, JSONException { + SearchResult allModelList = new SearchResult(); + JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); + for (int i = 0; i < jsonArray.length(); i++) { + AlphaFineHelper.checkCancel(); + JSONObject jsonObject = jsonArray.optJSONObject(i); + + String temp = jsonObject.optString(keyword); + if (StringUtils.isNotEmpty(temp)) { + RobotModel robotModel = new RobotModel(temp, null); + if (!allModelList.contains(robotModel)) { + allModelList.add(robotModel); + } + } + } + return allModelList; + } + } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java index 03f038e60..47d95514e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java @@ -7,6 +7,7 @@ import com.fr.general.http.HttpClient; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.stable.AssistUtils; import org.apache.commons.codec.digest.DigestUtils; @@ -92,4 +93,16 @@ public class RobotModel extends AlphaCellModel { FineLoggerFactory.getLogger().error(e.getMessage()); } } + + @Override + public final boolean equals(Object obj) { + return obj instanceof RobotModel + && AssistUtils.equals(this.title, ((RobotModel)obj).title) + && AssistUtils.equals(this.content, ((RobotModel) obj).content); + } + + @Override + public int hashCode() { + return AssistUtils.hashCode(title, content); + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 172767dd6..37010c127 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -1333,7 +1333,7 @@ public class AlphaFineDialog extends UIDialog { */ private void initBackPane() { backPane = new JPanel(new BorderLayout()); - JLabel jLabel = new JLabel(com.fr.design.i18n.Toolkit.i18nText(" < " + "Fine-Design_Report_AlphaFine_Back")); + JLabel jLabel = new JLabel(" < " + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Back")); jLabel.setPreferredSize(new Dimension(680, 20)); jLabel.setFont(AlphaFineConstants.SMALL_FONT); jLabel.setForeground(AlphaFineConstants.DARK_GRAY); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java index f59e98df6..16182d5f1 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ComplementAdviceManager.java @@ -50,25 +50,10 @@ public class ComplementAdviceManager { try { String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); - JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); - if(jsonArray != null){ - for (int i = 0; i < jsonArray.length(); i++) { - AlphaFineHelper.checkCancel(); - JSONObject jsonObject = jsonArray.optJSONObject(i); - - String temp = jsonObject.optString("keywords"); - if (StringUtils.isNotEmpty(temp)) { - RobotModel robotModel = new RobotModel(temp, null); - if (!AlphaFineHelper.getFilterResult().contains(robotModel) && !allModelList.contains(robotModel)) { - allModelList.add(robotModel); - } - } - - } - } - } catch (JSONException e) { + allModelList = AlphaFineHelper.getModelListFromJSONArray(result,"keywords"); + } catch(ClassCastException | JSONException e){ FineLoggerFactory.getLogger().error("complement advice search error: " + e.getMessage()); - }catch (IOException e1) { + } catch (IOException e1) { FineLoggerFactory.getLogger().error("complement advice get result error: " + e1.getMessage()); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 15476c446..beac652ff 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -193,7 +193,11 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } public List getRecommendModelList() { - return recommendModelList; + SearchResult result = new SearchResult(); + result.addAll(recommendModelList); + result.addAll(modelList); + result.addAll(moreModelList); + return result; } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index ddaffb88a..fc2c173e0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -15,6 +15,8 @@ import com.fr.json.JSONObject; import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; import java.io.IOException; + +import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.codec.digest.DigestUtils; /** @@ -47,20 +49,8 @@ public class SimilarSearchManeger implements AlphaFineSearchProvider { try { String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); - JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); - if(jsonArray != null){ - if (jsonArray.length() != 0) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jsonObject = jsonArray.optJSONObject(i); - String title = jsonObject.optString("title"); - RobotModel robotModel = new RobotModel(title, null); - if (!AlphaFineHelper.getFilterResult().contains(robotModel) && !allModelList.contains(robotModel)) { - allModelList.add(robotModel); - } - } - } - } - } catch (JSONException e) { + allModelList = AlphaFineHelper.getModelListFromJSONArray(result,"title"); + } catch (ClassCastException | JSONException e) { FineLoggerFactory.getLogger().error("similar search error: " + e.getMessage()); } catch (IOException e) { FineLoggerFactory.getLogger().error("similar search get result error: " + e.getMessage()); From 433d15906cd0be33c9dea6da825633549bc6ee4d Mon Sep 17 00:00:00 2001 From: "Mata.Li" Date: Fri, 24 Aug 2018 17:22:32 +0800 Subject: [PATCH 19/77] REPORT-10562 --- .../mainframe/toolbar/ToolBarMenuDock.java | 6 + .../onlineupdate/actions/FileDownloader.java | 118 + .../actions/SoftwareUpdateAction.java | 34 + .../onlineupdate/domain/DownloadItem.java | 102 + .../onlineupdate/domain/UpdateConstants.java | 56 + .../UpdateInfoCachePropertyManager.java | 41 + .../factory/DirectoryOperationFactory.java | 132 + .../ui/dialog/EncodingDetect.java | 4555 +++++++++++++++++ .../onlineupdate/ui/dialog/RestoreDialog.java | 122 + .../ui/dialog/RestoreResultDialog.java | 182 + .../ui/dialog/UpdateMainDialog.java | 821 +++ .../ui/widget/ColorfulCellRender.java | 65 + .../onlineupdate/ui/widget/LoadingLabel.java | 48 + .../ui/widget/UpdateActionLabel.java | 95 + .../ui/widget/UpdateInfoTable.java | 46 + .../ui/widget/UpdateInfoTableCellRender.java | 48 + .../ui/widget/UpdateInfoTableModel.java | 65 + .../widget/UpdateInfoTextAreaCellRender.java | 43 + .../fr/design/images/update/busy-icon0.png | Bin 0 -> 3588 bytes .../fr/design/images/update/busy-icon1.png | Bin 0 -> 3585 bytes .../fr/design/images/update/busy-icon10.png | Bin 0 -> 3568 bytes .../fr/design/images/update/busy-icon11.png | Bin 0 -> 3581 bytes .../fr/design/images/update/busy-icon12.png | Bin 0 -> 3589 bytes .../fr/design/images/update/busy-icon13.png | Bin 0 -> 3586 bytes .../fr/design/images/update/busy-icon14.png | Bin 0 -> 3586 bytes .../fr/design/images/update/busy-icon2.png | Bin 0 -> 3585 bytes .../fr/design/images/update/busy-icon3.png | Bin 0 -> 3572 bytes .../fr/design/images/update/busy-icon4.png | Bin 0 -> 3576 bytes .../fr/design/images/update/busy-icon5.png | Bin 0 -> 3580 bytes .../fr/design/images/update/busy-icon6.png | Bin 0 -> 3581 bytes .../fr/design/images/update/busy-icon7.png | Bin 0 -> 3598 bytes .../fr/design/images/update/busy-icon8.png | Bin 0 -> 3594 bytes .../fr/design/images/update/busy-icon9.png | Bin 0 -> 3581 bytes .../fr/design/images/update/update_new.png | Bin 0 -> 1110 bytes 34 files changed, 6579 insertions(+) create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/actions/FileDownloader.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/actions/SoftwareUpdateAction.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/domain/DownloadItem.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateConstants.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateInfoCachePropertyManager.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/factory/DirectoryOperationFactory.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/EncodingDetect.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreDialog.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreResultDialog.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/UpdateMainDialog.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/ColorfulCellRender.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/LoadingLabel.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateActionLabel.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTable.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableCellRender.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableModel.java create mode 100644 designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTextAreaCellRender.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon0.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon1.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon10.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon11.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon12.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon13.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon14.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon2.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon3.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon4.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon5.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon6.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon7.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon8.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/busy-icon9.png create mode 100644 designer-base/src/main/resources/com/fr/design/images/update/update_new.png diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index e45ec62a1..2bf1343ea 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -47,6 +47,7 @@ import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; +import com.fr.design.onlineupdate.actions.SoftwareUpdateAction; import com.fr.design.remote.action.RemoteDesignAuthorityManagerAction; import com.fr.design.utils.ThemeUtils; import com.fr.general.ComparatorUtils; @@ -469,6 +470,11 @@ public abstract class ToolBarMenuDock { shortCuts.add(new VideoAction()); shortCuts.add(new TutorialAction()); } + //远程不使用更新升级 + if(WorkContext.getCurrent().isLocal()) { + shortCuts.add(new SoftwareUpdateAction()); + } + if (AlphaFineConfigManager.isALPHALicAvailable()) { shortCuts.add(new AlphaFineAction()); } diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/actions/FileDownloader.java b/designer-base/src/main/java/com/fr/design/onlineupdate/actions/FileDownloader.java new file mode 100644 index 000000000..d076cc01e --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/actions/FileDownloader.java @@ -0,0 +1,118 @@ +package com.fr.design.onlineupdate.actions; + +import com.fr.design.onlineupdate.domain.UpdateConstants; +import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.design.onlineupdate.domain.DownloadItem; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StableUtils; + +import javax.swing.JOptionPane; +import javax.swing.SwingWorker; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.util.concurrent.ExecutionException; + +/** + * Created by XINZAI on 2018/8/21. + */ +public abstract class FileDownloader extends SwingWorker { + private static final int REPEAT_DOWNLOAD_TIMES = 3; + private DownloadItem[] files; + private String saveDir; + //已经完成的大小 + private long completeSize; + + public FileDownloader(DownloadItem[] files, String saveDir) { + this.files = files; + this.saveDir = saveDir; + } + + @Override + protected Boolean doInBackground() throws Exception { + if (ArrayUtils.isNotEmpty(files)) { + setCompleteSize(0L); + for (DownloadItem item : files) { + for (int i = 0; i < REPEAT_DOWNLOAD_TIMES; i++) { + item.setTotalLength(0); + item.setDownloadLength(0); + download(item); + if (item.getTotalLength() == item.getDownloadLength()) { + break; + } + } + if (item.getTotalLength() != item.getDownloadLength()) { + JOptionPane.showMessageDialog(null, + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Download_Failed"), + InterProviderFactory.getProvider().getLocText("Fine-Design_Updater_Alert"), JOptionPane.ERROR_MESSAGE); + return false; + } else { + item.setDownloadLength(0); + completeSize += item.getTotalLength(); + } + } + } + return true; + } + + @Override + protected void done() { + boolean success = false; + try { + success = get(); + } catch (InterruptedException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (ExecutionException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + if (success) { + onDownloadSuccess(); + } else { + onDownloadFailed(); + } + } + + private void download(DownloadItem item) throws Exception { + URL url = new URL(item.getUrl()); + URLConnection connection = url.openConnection(); + int total = connection.getContentLength(); + item.setTotalLength(total); + InputStream reader = connection.getInputStream(); + File tempFile = new File(StableUtils.pathJoin(saveDir, item.getName())); + StableUtils.makesureFileExist(tempFile); + FileOutputStream writer = new FileOutputStream(tempFile); + byte[] buffer = new byte[UpdateConstants.BYTE]; + int bytesRead = 0; + int totalBytesRead = 0; + while ((bytesRead = reader.read(buffer)) != -1) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[UpdateConstants.BYTE]; + totalBytesRead += bytesRead; + item.setDownloadLength(totalBytesRead); + publish(item); + } + reader.close(); + writer.close(); + } + + /** + * 下载成功 + */ + public abstract void onDownloadSuccess(); + + /** + * 下载失败 + */ + public abstract void onDownloadFailed(); + + public long getCompleteSize() { + return completeSize; + } + + public void setCompleteSize(long completeSize) { + this.completeSize = completeSize; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/actions/SoftwareUpdateAction.java b/designer-base/src/main/java/com/fr/design/onlineupdate/actions/SoftwareUpdateAction.java new file mode 100644 index 000000000..1b14f5f0b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/actions/SoftwareUpdateAction.java @@ -0,0 +1,34 @@ +package com.fr.design.onlineupdate.actions; + +import com.fr.base.BaseUtils; +import com.fr.design.actions.UpdateAction; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.onlineupdate.ui.dialog.UpdateMainDialog; +import com.fr.locale.InterProviderFactory; + +import java.awt.event.ActionEvent; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class SoftwareUpdateAction extends UpdateAction { + + + public SoftwareUpdateAction() { + setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_UpdateAndUpgrade")); + setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/update/update_new.png")); + + } + + /** + * 事件响应 + * + * @param e 事件 + */ + @Override + public void actionPerformed(ActionEvent e) { + UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); + dialog.showDialog(); + } +} + diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/domain/DownloadItem.java b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/DownloadItem.java new file mode 100644 index 000000000..6871190aa --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/DownloadItem.java @@ -0,0 +1,102 @@ +package com.fr.design.onlineupdate.domain; + +import com.fr.general.ComparatorUtils; +import com.fr.json.JSONObject; + +import java.util.Date; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class DownloadItem { + + //显示为百分比 + private static final int PERCENTAGE_RATIO = 100; + //显示kB + private static final int BYTETOKB_RATIO = 1000; + + private String name; + private String url; + private long size; + + private int totalLength; + private int downloadLength; + + public DownloadItem(JSONObject json) { + this(json.optString("name"), json.optString("url"), json.optLong("size")); + } + + public DownloadItem(String name, String url, long size) { + this.name = name; + this.url = url; + this.size = size; + } + + public String getName() { + return name; + } + + public String getUrl() { + return url + "?v=" + new Date().getTime(); + } + + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public int getTotalLength() { + return totalLength; + } + + public int getDownloadLength() { + return downloadLength; + } + + public void setTotalLength(int totalLength) { + this.totalLength = totalLength; + } + + public void setDownloadLength(int downloadLength) { + this.downloadLength = downloadLength; + } + + public int getProgressValue() { + return (int) ((downloadLength / (double) totalLength) * PERCENTAGE_RATIO); + } + + public String getProgressString() { + return downloadLength / BYTETOKB_RATIO + "KB/" + totalLength / BYTETOKB_RATIO + "KB"; + } + + /** + * 转化为字符串 + * + * @return 字符串 + */ + @Override + public String toString() { + return "name:" + name + ";download:" + getProgressString(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof DownloadItem + && ComparatorUtils.equals(((DownloadItem) obj).name, name) + && ComparatorUtils.equals(((DownloadItem) obj).url, url); + } + + /** + * 返回一个hash码 + * + * @return hash码 + */ + @Override + public int hashCode() { + return name.hashCode(); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateConstants.java b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateConstants.java new file mode 100644 index 000000000..c132dcc03 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateConstants.java @@ -0,0 +1,56 @@ +package com.fr.design.onlineupdate.domain; + +/** + * Created by XINZAI on 2018/8/21. + */ + +import java.awt.Color; + +/** + * 更新升级的常量 + */ +public interface UpdateConstants { + + String APPS_FOLDER_NAME = "webapps"; + + int CONNECTION_TIMEOUT = 1000 * 5; + Color BAR_COLOR = new Color(0x3384F0); + + String CHANGELOG_X_START = "2018-07-11"; + + String DEFAULT_APP_NAME = "FineReport"; + String DOWNLOAD_DIR = "update"; + String DESIGNER_BACKUP_DIR = "designerbackup"; + + String UPDATE_CACHE_CONFIG_X = "updateCacheConfig10"; + String UPDATE_CACHE_INFO_X = "updateCacheInfo10"; + + + int BYTE = 153600; + + String[] JARS_FOR_SERVER_X = new String[]{ + "fine-activator-10.0.jar", + "fine-core-10.0.jar", + "fine-report-engine-10.0.jar", + "fine-decision-10.0.jar", + "fine-decision-report-10.0.jar", + "fine-schedule-10.0.jar", + "fine-schedule-report-10.0.jar", + "fine-swift-log-adaptor-10.0.jar", + "fine-webui-10.0.jar", + "fine-datasource-10.0.jar", + "fine-third-10.0.jar", + "fine-accumulator-10.0.jar" + }; + + String[] JARS_FOR_DESIGNER_X = new String[]{ + "fine-report-designer-10.0.jar", + "aspectjrt.jar" + }; + + + String[] LOG_TYPE = new String[]{ + "REPORT", "MOBILE", "CHART", "PFC", "BI" + }; + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateInfoCachePropertyManager.java b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateInfoCachePropertyManager.java new file mode 100644 index 000000000..7895c6913 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/domain/UpdateInfoCachePropertyManager.java @@ -0,0 +1,41 @@ +package com.fr.design.onlineupdate.domain; + +import com.fr.log.FineLoggerFactory; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Properties; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateInfoCachePropertyManager { + private Properties prop; + private String filePath; + + public UpdateInfoCachePropertyManager(String filePath) { + this.filePath = filePath; + prop = new Properties(); + try { + prop.load(new FileInputStream(filePath)); + } catch (Exception ignored) { + + } + } + + public void updateProperty(String keyName, String keyValue) { + try { + OutputStream fos = new FileOutputStream(filePath); + prop.setProperty(keyName, keyValue); + prop.store(fos, null); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + + public String readProperty(String keyName) { + return prop.getProperty(keyName); + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/factory/DirectoryOperationFactory.java b/designer-base/src/main/java/com/fr/design/onlineupdate/factory/DirectoryOperationFactory.java new file mode 100644 index 000000000..9d929c095 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/factory/DirectoryOperationFactory.java @@ -0,0 +1,132 @@ +package com.fr.design.onlineupdate.factory; + +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StableUtils; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Arrays; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class DirectoryOperationFactory { + /** + * 新建一个目录 + * + * @param dirPath 目录路径 + */ + public static void createNewDirectory(String dirPath) { + try { + File newDirPath = new File(dirPath); + if (!newDirPath.exists()) { + StableUtils.mkdirs(newDirPath); + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + + /** + * 删除目录 + * + * @param dirPath 目录路径 + */ + public static void deleteDirectory(String dirPath) { + try { + File dir = new File(dirPath); + if (dir.isDirectory()) { + File[] file = dir.listFiles(); + for (File fileTemp : file) { + deleteDirectory(fileTemp.toString()); + fileTemp.delete(); + } + } else { + dir.delete(); + } + dir.delete(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + + /** + * 复制目录 + * + * @param oldDirPath 被复制目录 + * @param newDirPath 新目录 + */ + public static void copyDirectory(String oldDirPath, String newDirPath) { + File oldDir = new File(oldDirPath); + if (oldDir.isDirectory()) { + StableUtils.mkdirs(new File(newDirPath)); + File[] files = oldDir.listFiles(); + for (File fileTemp : files) { + copyDirectory(fileTemp.toString(), newDirPath + "/" + fileTemp.getName()); + } + } else { + try { + copy(oldDirPath, newDirPath); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + } + + private static void copy(String path1, String path2) throws IOException { + DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); + DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2))); + byte[] date = new byte[in.available()]; + + in.read(date); + out.write(date); + + in.close(); + out.close(); + } + + /** + * 移动目录 + * + * @param oldDirPath 被移动目录 + * @param newDirPath 新目录 + */ + public static void moveDirectory(String oldDirPath, String newDirPath) { + copyDirectory(oldDirPath, newDirPath); + deleteDirectory(oldDirPath); + } + + /** + * 列出过滤后的文件 + * + * @param installHome 安装目录 + * @param backupdir 备份目录 + * @return String数组 + */ + public static String[] listFilteredFiles(String installHome, String backupdir) { + File backupDir = new File(StableUtils.pathJoin(installHome, backupdir)); + StableUtils.mkdirs(backupDir); + File[] fileNames = backupDir.listFiles(new FileFilter() { + @Override + public boolean accept(File pathname) { + return pathname.isDirectory(); + } + }); + String[] jarFileName = new String[fileNames.length]; + int j = 0; + for (File fileName : fileNames) { + if ((fileName.isDirectory()) && (ArrayUtils.getLength(fileName.listFiles()) > 0)) {//判断备份文件夹中是否为空,为空不显示 + jarFileName[j++] = fileName.getName(); + } + } + return Arrays.copyOf(jarFileName, j); + } +} diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/EncodingDetect.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/EncodingDetect.java new file mode 100644 index 000000000..ecd63fa16 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/EncodingDetect.java @@ -0,0 +1,4555 @@ +package com.fr.design.onlineupdate.ui.dialog; + + +import java.io.File; +import java.io.FileInputStream; + +/** + * + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * EncodingDetect.java
+ * 自动获取文件的编码 + * @author Mata + * @since Create on 2018-08-23 + * @version 1.0 + */ +public class EncodingDetect { + /** + * 得到文件的编码 + * @param file 文件路径 + * @return 文件的编码 + */ + public static String getJavaEncode(File file){ + BytesEncodingDetect s = new BytesEncodingDetect(); + String fileCode = BytesEncodingDetect.javaname[s.detectEncoding(file)]; + return fileCode; + } + + +} + +class BytesEncodingDetect extends Encoding { + // Frequency tables to hold the GB, Big5, and EUC-TW character + // frequencies + int GBFreq[][]; + + int GBKFreq[][]; + + int Big5Freq[][]; + + int Big5PFreq[][]; + + int EUC_TWFreq[][]; + + int KRFreq[][]; + + int JPFreq[][]; + + // int UnicodeFreq[94][128]; + // public static String[] nicename; + // public static String[] codings; + public boolean debug; + + public BytesEncodingDetect() { + super(); + debug = false; + GBFreq = new int[94][94]; + GBKFreq = new int[126][191]; + Big5Freq = new int[94][158]; + Big5PFreq = new int[126][191]; + EUC_TWFreq = new int[94][94]; + KRFreq = new int[94][94]; + JPFreq = new int[94][94]; + // Initialize the Frequency Table for GB, GBK, Big5, EUC-TW, KR, JP + initialize_frequencies(); + } + + /** + * Function : detectEncoding Aruguments: File Returns : One of the encodings from the Encoding enumeration (GB2312, HZ, BIG5, + * EUC_TW, ASCII, or OTHER) Description: This function looks at the file and assigns it a probability score for each encoding + * type. The encoding type with the highest probability is returned. + */ + public int detectEncoding(File testfile) { + FileInputStream chinesefile; + byte[] rawtext; + rawtext = new byte[(int) testfile.length()]; + try { + chinesefile = new FileInputStream(testfile); + chinesefile.read(rawtext); + chinesefile.close(); + } catch (Exception e) { + System.err.println("Error: " + e); + } + return detectEncoding(rawtext); + } + + /** + * Function : detectEncoding Aruguments: byte array Returns : One of the encodings from the Encoding enumeration (GB2312, HZ, + * BIG5, EUC_TW, ASCII, or OTHER) Description: This function looks at the byte array and assigns it a probability score for + * each encoding type. The encoding type with the highest probability is returned. + */ + public int detectEncoding(byte[] rawtext) { + int[] scores; + int index, maxscore = 0; + int encoding_guess = OTHER; + scores = new int[TOTALTYPES]; + // Assign Scores + scores[GB2312] = gb2312_probability(rawtext); + scores[GBK] = gbk_probability(rawtext); + scores[GB18030] = gb18030_probability(rawtext); + scores[HZ] = hz_probability(rawtext); + scores[BIG5] = big5_probability(rawtext); + scores[CNS11643] = euc_tw_probability(rawtext); + scores[ISO2022CN] = iso_2022_cn_probability(rawtext); + scores[UTF8] = utf8_probability(rawtext); + scores[UNICODE] = utf16_probability(rawtext); + scores[EUC_KR] = euc_kr_probability(rawtext); + scores[CP949] = cp949_probability(rawtext); + scores[JOHAB] = 0; + scores[ISO2022KR] = iso_2022_kr_probability(rawtext); + scores[ASCII] = ascii_probability(rawtext); + scores[SJIS] = sjis_probability(rawtext); + scores[EUC_JP] = euc_jp_probability(rawtext); + scores[ISO2022JP] = iso_2022_jp_probability(rawtext); + scores[UNICODET] = 0; + scores[UNICODES] = 0; + scores[ISO2022CN_GB] = 0; + scores[ISO2022CN_CNS] = 0; + scores[OTHER] = 0; + // Tabulate Scores + for (index = 0; index < TOTALTYPES; index++) { + if (debug) + System.err.println("Encoding " + nicename[index] + " score " + scores[index]); + if (scores[index] > maxscore) { + encoding_guess = index; + maxscore = scores[index]; + } + } + // Return OTHER if nothing scored above 50 + if (maxscore <= 50) { + encoding_guess = OTHER; + } + return encoding_guess; + } + + /* + * Function: gb2312_probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text + * in array uses GB-2312 encoding + */ + int gb2312_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, gbchars = 1; + long gbfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xF7 && (byte) 0xA1 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0xFE) { + gbchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + if (GBFreq[row][column] != 0) { + gbfreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + // In GB high-freq character range + gbfreq += 200; + } + } + i++; + } + } + rangeval = 50 * ((float) gbchars / (float) dbchars); + freqval = 50 * ((float) gbfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + /* + * Function: gbk_probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text in + * array uses GBK encoding + */ + int gbk_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, gbchars = 1; + long gbfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xF7 && // Original GB range + (byte) 0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE) { + gbchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + // System.out.println("original row " + row + " column " + column); + if (GBFreq[row][column] != 0) { + gbfreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + gbfreq += 200; + } + } else if ((byte) 0x81 <= rawtext[i] + && rawtext[i] <= (byte) 0xFE + && // Extended GB range + (((byte) 0x80 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE) || ((byte) 0x40 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x7E))) { + gbchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0x81; + if (0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) { + column = rawtext[i + 1] - 0x40; + } else { + column = rawtext[i + 1] + 256 - 0x40; + } + // System.out.println("extended row " + row + " column " + column + " rawtext[i] " + rawtext[i]); + if (GBKFreq[row][column] != 0) { + gbfreq += GBKFreq[row][column]; + } + } + i++; + } + } + rangeval = 50 * ((float) gbchars / (float) dbchars); + freqval = 50 * ((float) gbfreq / (float) totalfreq); + // For regular GB files, this would give the same score, so I handicap it slightly + return (int) (rangeval + freqval) - 1; + } + + /* + * Function: gb18030_probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text + * in array uses GBK encoding + */ + int gb18030_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, gbchars = 1; + long gbfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xF7 && // Original GB range + i + 1 < rawtextlen && (byte) 0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE) { + gbchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + // System.out.println("original row " + row + " column " + column); + if (GBFreq[row][column] != 0) { + gbfreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + gbfreq += 200; + } + } else if ((byte) 0x81 <= rawtext[i] && rawtext[i] <= (byte) 0xFE + && // Extended GB range + i + 1 < rawtextlen + && (((byte) 0x80 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE) || ((byte) 0x40 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x7E))) { + gbchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0x81; + if (0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) { + column = rawtext[i + 1] - 0x40; + } else { + column = rawtext[i + 1] + 256 - 0x40; + } + // System.out.println("extended row " + row + " column " + column + " rawtext[i] " + rawtext[i]); + if (GBKFreq[row][column] != 0) { + gbfreq += GBKFreq[row][column]; + } + } else if ((byte) 0x81 <= rawtext[i] + && rawtext[i] <= (byte) 0xFE + && // Extended GB range + i + 3 < rawtextlen && (byte) 0x30 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x39 + && (byte) 0x81 <= rawtext[i + 2] && rawtext[i + 2] <= (byte) 0xFE && (byte) 0x30 <= rawtext[i + 3] + && rawtext[i + 3] <= (byte) 0x39) { + gbchars++; + /* + * totalfreq += 500; row = rawtext[i] + 256 - 0x81; if (0x40 <= rawtext[i+1] && rawtext[i+1] <= 0x7E) { column = + * rawtext[i+1] - 0x40; } else { column = rawtext[i+1] + 256 - 0x40; } //System.out.println("extended row " + row + " + * column " + column + " rawtext[i] " + rawtext[i]); if (GBKFreq[row][column] != 0) { gbfreq += GBKFreq[row][column]; } + */ + } + i++; + } + } + rangeval = 50 * ((float) gbchars / (float) dbchars); + freqval = 50 * ((float) gbfreq / (float) totalfreq); + // For regular GB files, this would give the same score, so I handicap it slightly + return (int) (rangeval + freqval) - 1; + } + + /* + * Function: hz_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array uses HZ + * encoding + */ + int hz_probability(byte[] rawtext) { + int i, rawtextlen; + int hzchars = 0, dbchars = 1; + long hzfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int hzstart = 0, hzend = 0; + int row, column; + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen; i++) { + if (rawtext[i] == '~') { + if (rawtext[i + 1] == '{') { + hzstart++; + i += 2; + while (i < rawtextlen - 1) { + if (rawtext[i] == 0x0A || rawtext[i] == 0x0D) { + break; + } else if (rawtext[i] == '~' && rawtext[i + 1] == '}') { + hzend++; + i++; + break; + } else if ((0x21 <= rawtext[i] && rawtext[i] <= 0x77) && (0x21 <= rawtext[i + 1] && rawtext[i + 1] <= 0x77)) { + hzchars += 2; + row = rawtext[i] - 0x21; + column = rawtext[i + 1] - 0x21; + totalfreq += 500; + if (GBFreq[row][column] != 0) { + hzfreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + hzfreq += 200; + } + } else if ((0xA1 <= rawtext[i] && rawtext[i] <= 0xF7) && (0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= 0xF7)) { + hzchars += 2; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + totalfreq += 500; + if (GBFreq[row][column] != 0) { + hzfreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + hzfreq += 200; + } + } + dbchars += 2; + i += 2; + } + } else if (rawtext[i + 1] == '}') { + hzend++; + i++; + } else if (rawtext[i + 1] == '~') { + i++; + } + } + } + if (hzstart > 4) { + rangeval = 50; + } else if (hzstart > 1) { + rangeval = 41; + } else if (hzstart > 0) { // Only 39 in case the sequence happened to occur + rangeval = 39; // in otherwise non-Hz text + } else { + rangeval = 0; + } + freqval = 50 * ((float) hzfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + /** + * Function: big5_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array uses + * Big5 encoding + */ + int big5_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, bfchars = 1; + float rangeval = 0, freqval = 0; + long bffreq = 0, totalfreq = 1; + int row, column; + // Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] + && rawtext[i] <= (byte) 0xF9 + && (((byte) 0x40 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x7E) || ((byte) 0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE))) { + bfchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + if (0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) { + column = rawtext[i + 1] - 0x40; + } else { + column = rawtext[i + 1] + 256 - 0x61; + } + if (Big5Freq[row][column] != 0) { + bffreq += Big5Freq[row][column]; + } else if (3 <= row && row <= 37) { + bffreq += 200; + } + } + i++; + } + } + rangeval = 50 * ((float) bfchars / (float) dbchars); + freqval = 50 * ((float) bffreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + /* + * Function: big5plus_probability Argument: pointer to unsigned char array Returns : number from 0 to 100 representing + * probability text in array uses Big5+ encoding + */ + int big5plus_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, bfchars = 1; + long bffreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 128) { + // asciichars++; + } else { + dbchars++; + if (0xA1 <= rawtext[i] && rawtext[i] <= 0xF9 && // Original Big5 range + ((0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) || (0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= 0xFE))) { + bfchars++; + totalfreq += 500; + row = rawtext[i] - 0xA1; + if (0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) { + column = rawtext[i + 1] - 0x40; + } else { + column = rawtext[i + 1] - 0x61; + } + // System.out.println("original row " + row + " column " + column); + if (Big5Freq[row][column] != 0) { + bffreq += Big5Freq[row][column]; + } else if (3 <= row && row < 37) { + bffreq += 200; + } + } else if (0x81 <= rawtext[i] && rawtext[i] <= 0xFE && // Extended Big5 range + ((0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) || (0x80 <= rawtext[i + 1] && rawtext[i + 1] <= 0xFE))) { + bfchars++; + totalfreq += 500; + row = rawtext[i] - 0x81; + if (0x40 <= rawtext[i + 1] && rawtext[i + 1] <= 0x7E) { + column = rawtext[i + 1] - 0x40; + } else { + column = rawtext[i + 1] - 0x40; + } + // System.out.println("extended row " + row + " column " + column + " rawtext[i] " + rawtext[i]); + if (Big5PFreq[row][column] != 0) { + bffreq += Big5PFreq[row][column]; + } + } + i++; + } + } + rangeval = 50 * ((float) bfchars / (float) dbchars); + freqval = 50 * ((float) bffreq / (float) totalfreq); + // For regular Big5 files, this would give the same score, so I handicap it slightly + return (int) (rangeval + freqval) - 1; + } + + /* + * Function: euc_tw_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array + * uses EUC-TW (CNS 11643) encoding + */ + int euc_tw_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, cnschars = 1; + long cnsfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Check to see if characters fit into acceptable ranges + // and have expected frequency of use + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + if (rawtext[i] >= 0) { // in ASCII range + // asciichars++; + } else { // high bit set + dbchars++; + if (i + 3 < rawtextlen && (byte) 0x8E == rawtext[i] && (byte) 0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xB0 + && (byte) 0xA1 <= rawtext[i + 2] && rawtext[i + 2] <= (byte) 0xFE && (byte) 0xA1 <= rawtext[i + 3] + && rawtext[i + 3] <= (byte) 0xFE) { // Planes 1 - 16 + cnschars++; + // System.out.println("plane 2 or above CNS char"); + // These are all less frequent chars so just ignore freq + i += 3; + } else if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xFE && // Plane 1 + (byte) 0xA1 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE) { + cnschars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + if (EUC_TWFreq[row][column] != 0) { + cnsfreq += EUC_TWFreq[row][column]; + } else if (35 <= row && row <= 92) { + cnsfreq += 150; + } + i++; + } + } + } + rangeval = 50 * ((float) cnschars / (float) dbchars); + freqval = 50 * ((float) cnsfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + /* + * Function: iso_2022_cn_probability Argument: byte array Returns : number from 0 to 100 representing probability text in + * array uses ISO 2022-CN encoding WORKS FOR BASIC CASES, BUT STILL NEEDS MORE WORK + */ + int iso_2022_cn_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, isochars = 1; + long isofreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Check to see if characters fit into acceptable ranges + // and have expected frequency of use + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + if (rawtext[i] == (byte) 0x1B && i + 3 < rawtextlen) { // Escape char ESC + if (rawtext[i + 1] == (byte) 0x24 && rawtext[i + 2] == 0x29 && rawtext[i + 3] == (byte) 0x41) { // GB Escape $ ) A + i += 4; + while (rawtext[i] != (byte) 0x1B) { + dbchars++; + if ((0x21 <= rawtext[i] && rawtext[i] <= 0x77) && (0x21 <= rawtext[i + 1] && rawtext[i + 1] <= 0x77)) { + isochars++; + row = rawtext[i] - 0x21; + column = rawtext[i + 1] - 0x21; + totalfreq += 500; + if (GBFreq[row][column] != 0) { + isofreq += GBFreq[row][column]; + } else if (15 <= row && row < 55) { + isofreq += 200; + } + i++; + } + i++; + } + } else if (i + 3 < rawtextlen && rawtext[i + 1] == (byte) 0x24 && rawtext[i + 2] == (byte) 0x29 + && rawtext[i + 3] == (byte) 0x47) { + // CNS Escape $ ) G + i += 4; + while (rawtext[i] != (byte) 0x1B) { + dbchars++; + if ((byte) 0x21 <= rawtext[i] && rawtext[i] <= (byte) 0x7E && (byte) 0x21 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0x7E) { + isochars++; + totalfreq += 500; + row = rawtext[i] - 0x21; + column = rawtext[i + 1] - 0x21; + if (EUC_TWFreq[row][column] != 0) { + isofreq += EUC_TWFreq[row][column]; + } else if (35 <= row && row <= 92) { + isofreq += 150; + } + i++; + } + i++; + } + } + if (rawtext[i] == (byte) 0x1B && i + 2 < rawtextlen && rawtext[i + 1] == (byte) 0x28 && rawtext[i + 2] == (byte) 0x42) { // ASCII: + // ESC + // ( B + i += 2; + } + } + } + rangeval = 50 * ((float) isochars / (float) dbchars); + freqval = 50 * ((float) isofreq / (float) totalfreq); + // System.out.println("isochars dbchars isofreq totalfreq " + isochars + " " + dbchars + " " + isofreq + " " + totalfreq + " + // " + rangeval + " " + freqval); + return (int) (rangeval + freqval); + // return 0; + } + + /* + * Function: utf8_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array uses + * UTF-8 encoding of Unicode + */ + int utf8_probability(byte[] rawtext) { + int score = 0; + int i, rawtextlen = 0; + int goodbytes = 0, asciibytes = 0; + // Maybe also use UTF8 Byte Order Mark: EF BB BF + // Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen; i++) { + if ((rawtext[i] & (byte) 0x7F) == rawtext[i]) { // One byte + asciibytes++; + // Ignore ASCII, can throw off count + } else if (-64 <= rawtext[i] && rawtext[i] <= -33 && // Two bytes + i + 1 < rawtextlen && -128 <= rawtext[i + 1] && rawtext[i + 1] <= -65) { + goodbytes += 2; + i++; + } else if (-32 <= rawtext[i] && rawtext[i] <= -17 + && // Three bytes + i + 2 < rawtextlen && -128 <= rawtext[i + 1] && rawtext[i + 1] <= -65 && -128 <= rawtext[i + 2] + && rawtext[i + 2] <= -65) { + goodbytes += 3; + i += 2; + } + } + if (asciibytes == rawtextlen) { + return 0; + } + score = (int) (100 * ((float) goodbytes / (float) (rawtextlen - asciibytes))); + // System.out.println("rawtextlen " + rawtextlen + " goodbytes " + goodbytes + " asciibytes " + asciibytes + " score " + + // score); + // If not above 98, reduce to zero to prevent coincidental matches + // Allows for some (few) bad formed sequences + if (score > 98) { + return score; + } else if (score > 95 && goodbytes > 30) { + return score; + } else { + return 0; + } + } + + /* + * Function: utf16_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array uses + * UTF-16 encoding of Unicode, guess based on BOM // NOT VERY GENERAL, NEEDS MUCH MORE WORK + */ + int utf16_probability(byte[] rawtext) { + // int score = 0; + // int i, rawtextlen = 0; + // int goodbytes = 0, asciibytes = 0; + if (rawtext.length > 1 && ((byte) 0xFE == rawtext[0] && (byte) 0xFF == rawtext[1]) || // Big-endian + ((byte) 0xFF == rawtext[0] && (byte) 0xFE == rawtext[1])) { // Little-endian + return 100; + } + return 0; + /* + * // Check to see if characters fit into acceptable ranges rawtextlen = rawtext.length; for (i = 0; i < rawtextlen; i++) { + * if ((rawtext[i] & (byte)0x7F) == rawtext[i]) { // One byte goodbytes += 1; asciibytes++; } else if ((rawtext[i] & + * (byte)0xDF) == rawtext[i]) { // Two bytes if (i+1 < rawtextlen && (rawtext[i+1] & (byte)0xBF) == rawtext[i+1]) { + * goodbytes += 2; i++; } } else if ((rawtext[i] & (byte)0xEF) == rawtext[i]) { // Three bytes if (i+2 < rawtextlen && + * (rawtext[i+1] & (byte)0xBF) == rawtext[i+1] && (rawtext[i+2] & (byte)0xBF) == rawtext[i+2]) { goodbytes += 3; i+=2; } } } + * + * score = (int)(100 * ((float)goodbytes/(float)rawtext.length)); // An all ASCII file is also a good UTF8 file, but I'd + * rather it // get identified as ASCII. Can delete following 3 lines otherwise if (goodbytes == asciibytes) { score = 0; } // + * If not above 90, reduce to zero to prevent coincidental matches if (score > 90) { return score; } else { return 0; } + */ + } + + /* + * Function: ascii_probability Argument: byte array Returns : number from 0 to 100 representing probability text in array uses + * all ASCII Description: Sees if array has any characters not in ASCII range, if so, score is reduced + */ + int ascii_probability(byte[] rawtext) { + int score = 75; + int i, rawtextlen; + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen; i++) { + if (rawtext[i] < 0) { + score = score - 5; + } else if (rawtext[i] == (byte) 0x1B) { // ESC (used by ISO 2022) + score = score - 5; + } + if (score <= 0) { + return 0; + } + } + return score; + } + + /* + * Function: euc_kr__probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text + * in array uses EUC-KR encoding + */ + int euc_kr_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, krchars = 1; + long krfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xFE && (byte) 0xA1 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0xFE) { + krchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + if (KRFreq[row][column] != 0) { + krfreq += KRFreq[row][column]; + } else if (15 <= row && row < 55) { + krfreq += 0; + } + } + i++; + } + } + rangeval = 50 * ((float) krchars / (float) dbchars); + freqval = 50 * ((float) krfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + /* + * Function: cp949__probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text + * in array uses Cp949 encoding + */ + int cp949_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, krchars = 1; + long krfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0x81 <= rawtext[i] + && rawtext[i] <= (byte) 0xFE + && ((byte) 0x41 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x5A || (byte) 0x61 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0x7A || (byte) 0x81 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFE)) { + krchars++; + totalfreq += 500; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xFE && (byte) 0xA1 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0xFE) { + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + if (KRFreq[row][column] != 0) { + krfreq += KRFreq[row][column]; + } + } + } + i++; + } + } + rangeval = 50 * ((float) krchars / (float) dbchars); + freqval = 50 * ((float) krfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + int iso_2022_kr_probability(byte[] rawtext) { + int i; + for (i = 0; i < rawtext.length; i++) { + if (i + 3 < rawtext.length && rawtext[i] == 0x1b && (char) rawtext[i + 1] == '$' && (char) rawtext[i + 2] == ')' + && (char) rawtext[i + 3] == 'C') { + return 100; + } + } + return 0; + } + + /* + * Function: euc_jp_probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text + * in array uses EUC-JP encoding + */ + int euc_jp_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, jpchars = 1; + long jpfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xFE && (byte) 0xA1 <= rawtext[i + 1] + && rawtext[i + 1] <= (byte) 0xFE) { + jpchars++; + totalfreq += 500; + row = rawtext[i] + 256 - 0xA1; + column = rawtext[i + 1] + 256 - 0xA1; + if (JPFreq[row][column] != 0) { + jpfreq += JPFreq[row][column]; + } else if (15 <= row && row < 55) { + jpfreq += 0; + } + } + i++; + } + } + rangeval = 50 * ((float) jpchars / (float) dbchars); + freqval = 50 * ((float) jpfreq / (float) totalfreq); + return (int) (rangeval + freqval); + } + + int iso_2022_jp_probability(byte[] rawtext) { + int i; + for (i = 0; i < rawtext.length; i++) { + if (i + 2 < rawtext.length && rawtext[i] == 0x1b && (char) rawtext[i + 1] == '$' && (char) rawtext[i + 2] == 'B') { + return 100; + } + } + return 0; + } + + /* + * Function: sjis_probability Argument: pointer to byte array Returns : number from 0 to 100 representing probability text in + * array uses Shift-JIS encoding + */ + int sjis_probability(byte[] rawtext) { + int i, rawtextlen = 0; + int dbchars = 1, jpchars = 1; + long jpfreq = 0, totalfreq = 1; + float rangeval = 0, freqval = 0; + int row, column, adjust; + // Stage 1: Check to see if characters fit into acceptable ranges + rawtextlen = rawtext.length; + for (i = 0; i < rawtextlen - 1; i++) { + // System.err.println(rawtext[i]); + if (rawtext[i] >= 0) { + // asciichars++; + } else { + dbchars++; + if (i + 1 < rawtext.length + && (((byte) 0x81 <= rawtext[i] && rawtext[i] <= (byte) 0x9F) || ((byte) 0xE0 <= rawtext[i] && rawtext[i] <= (byte) 0xEF)) + && (((byte) 0x40 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0x7E) || ((byte) 0x80 <= rawtext[i + 1] && rawtext[i + 1] <= (byte) 0xFC))) { + jpchars++; + totalfreq += 500; + row = rawtext[i] + 256; + column = rawtext[i + 1] + 256; + if (column < 0x9f) { + adjust = 1; + if (column > 0x7f) { + column -= 0x20; + } else { + column -= 0x19; + } + } else { + adjust = 0; + column -= 0x7e; + } + if (row < 0xa0) { + row = ((row - 0x70) << 1) - adjust; + } else { + row = ((row - 0xb0) << 1) - adjust; + } + row -= 0x20; + column = 0x20; + // System.out.println("original row " + row + " column " + column); + if (row < JPFreq.length && column < JPFreq[row].length && JPFreq[row][column] != 0) { + jpfreq += JPFreq[row][column]; + } + i++; + } else if ((byte) 0xA1 <= rawtext[i] && rawtext[i] <= (byte) 0xDF) { + // half-width katakana, convert to full-width + } + } + } + rangeval = 50 * ((float) jpchars / (float) dbchars); + freqval = 50 * ((float) jpfreq / (float) totalfreq); + // For regular GB files, this would give the same score, so I handicap it slightly + return (int) (rangeval + freqval) - 1; + } + + void initialize_frequencies() { + int i, j; + for (i = 0; i < 94; i++) { + for (j = 0; j < 94; j++) { + GBFreq[i][j] = 0; + } + } + for (i = 0; i < 126; i++) { + for (j = 0; j < 191; j++) { + GBKFreq[i][j] = 0; + } + } + for (i = 0; i < 94; i++) { + for (j = 0; j < 158; j++) { + Big5Freq[i][j] = 0; + } + } + for (i = 0; i < 126; i++) { + for (j = 0; j < 191; j++) { + Big5PFreq[i][j] = 0; + } + } + for (i = 0; i < 94; i++) { + for (j = 0; j < 94; j++) { + EUC_TWFreq[i][j] = 0; + } + } + for (i = 0; i < 94; i++) { + for (j = 0; j < 94; j++) { + JPFreq[i][j] = 0; + } + } + GBFreq[20][35] = 599; + GBFreq[49][26] = 598; + GBFreq[41][38] = 597; + GBFreq[17][26] = 596; + GBFreq[32][42] = 595; + GBFreq[39][42] = 594; + GBFreq[45][49] = 593; + GBFreq[51][57] = 592; + GBFreq[50][47] = 591; + GBFreq[42][90] = 590; + GBFreq[52][65] = 589; + GBFreq[53][47] = 588; + GBFreq[19][82] = 587; + GBFreq[31][19] = 586; + GBFreq[40][46] = 585; + GBFreq[24][89] = 584; + GBFreq[23][85] = 583; + GBFreq[20][28] = 582; + GBFreq[42][20] = 581; + GBFreq[34][38] = 580; + GBFreq[45][9] = 579; + GBFreq[54][50] = 578; + GBFreq[25][44] = 577; + GBFreq[35][66] = 576; + GBFreq[20][55] = 575; + GBFreq[18][85] = 574; + GBFreq[20][31] = 573; + GBFreq[49][17] = 572; + GBFreq[41][16] = 571; + GBFreq[35][73] = 570; + GBFreq[20][34] = 569; + GBFreq[29][44] = 568; + GBFreq[35][38] = 567; + GBFreq[49][9] = 566; + GBFreq[46][33] = 565; + GBFreq[49][51] = 564; + GBFreq[40][89] = 563; + GBFreq[26][64] = 562; + GBFreq[54][51] = 561; + GBFreq[54][36] = 560; + GBFreq[39][4] = 559; + GBFreq[53][13] = 558; + GBFreq[24][92] = 557; + GBFreq[27][49] = 556; + GBFreq[48][6] = 555; + GBFreq[21][51] = 554; + GBFreq[30][40] = 553; + GBFreq[42][92] = 552; + GBFreq[31][78] = 551; + GBFreq[25][82] = 550; + GBFreq[47][0] = 549; + GBFreq[34][19] = 548; + GBFreq[47][35] = 547; + GBFreq[21][63] = 546; + GBFreq[43][75] = 545; + GBFreq[21][87] = 544; + GBFreq[35][59] = 543; + GBFreq[25][34] = 542; + GBFreq[21][27] = 541; + GBFreq[39][26] = 540; + GBFreq[34][26] = 539; + GBFreq[39][52] = 538; + GBFreq[50][57] = 537; + GBFreq[37][79] = 536; + GBFreq[26][24] = 535; + GBFreq[22][1] = 534; + GBFreq[18][40] = 533; + GBFreq[41][33] = 532; + GBFreq[53][26] = 531; + GBFreq[54][86] = 530; + GBFreq[20][16] = 529; + GBFreq[46][74] = 528; + GBFreq[30][19] = 527; + GBFreq[45][35] = 526; + GBFreq[45][61] = 525; + GBFreq[30][9] = 524; + GBFreq[41][53] = 523; + GBFreq[41][13] = 522; + GBFreq[50][34] = 521; + GBFreq[53][86] = 520; + GBFreq[47][47] = 519; + GBFreq[22][28] = 518; + GBFreq[50][53] = 517; + GBFreq[39][70] = 516; + GBFreq[38][15] = 515; + GBFreq[42][88] = 514; + GBFreq[16][29] = 513; + GBFreq[27][90] = 512; + GBFreq[29][12] = 511; + GBFreq[44][22] = 510; + GBFreq[34][69] = 509; + GBFreq[24][10] = 508; + GBFreq[44][11] = 507; + GBFreq[39][92] = 506; + GBFreq[49][48] = 505; + GBFreq[31][46] = 504; + GBFreq[19][50] = 503; + GBFreq[21][14] = 502; + GBFreq[32][28] = 501; + GBFreq[18][3] = 500; + GBFreq[53][9] = 499; + GBFreq[34][80] = 498; + GBFreq[48][88] = 497; + GBFreq[46][53] = 496; + GBFreq[22][53] = 495; + GBFreq[28][10] = 494; + GBFreq[44][65] = 493; + GBFreq[20][10] = 492; + GBFreq[40][76] = 491; + GBFreq[47][8] = 490; + GBFreq[50][74] = 489; + GBFreq[23][62] = 488; + GBFreq[49][65] = 487; + GBFreq[28][87] = 486; + GBFreq[15][48] = 485; + GBFreq[22][7] = 484; + GBFreq[19][42] = 483; + GBFreq[41][20] = 482; + GBFreq[26][55] = 481; + GBFreq[21][93] = 480; + GBFreq[31][76] = 479; + GBFreq[34][31] = 478; + GBFreq[20][66] = 477; + GBFreq[51][33] = 476; + GBFreq[34][86] = 475; + GBFreq[37][67] = 474; + GBFreq[53][53] = 473; + GBFreq[40][88] = 472; + GBFreq[39][10] = 471; + GBFreq[24][3] = 470; + GBFreq[27][25] = 469; + GBFreq[26][15] = 468; + GBFreq[21][88] = 467; + GBFreq[52][62] = 466; + GBFreq[46][81] = 465; + GBFreq[38][72] = 464; + GBFreq[17][30] = 463; + GBFreq[52][92] = 462; + GBFreq[34][90] = 461; + GBFreq[21][7] = 460; + GBFreq[36][13] = 459; + GBFreq[45][41] = 458; + GBFreq[32][5] = 457; + GBFreq[26][89] = 456; + GBFreq[23][87] = 455; + GBFreq[20][39] = 454; + GBFreq[27][23] = 453; + GBFreq[25][59] = 452; + GBFreq[49][20] = 451; + GBFreq[54][77] = 450; + GBFreq[27][67] = 449; + GBFreq[47][33] = 448; + GBFreq[41][17] = 447; + GBFreq[19][81] = 446; + GBFreq[16][66] = 445; + GBFreq[45][26] = 444; + GBFreq[49][81] = 443; + GBFreq[53][55] = 442; + GBFreq[16][26] = 441; + GBFreq[54][62] = 440; + GBFreq[20][70] = 439; + GBFreq[42][35] = 438; + GBFreq[20][57] = 437; + GBFreq[34][36] = 436; + GBFreq[46][63] = 435; + GBFreq[19][45] = 434; + GBFreq[21][10] = 433; + GBFreq[52][93] = 432; + GBFreq[25][2] = 431; + GBFreq[30][57] = 430; + GBFreq[41][24] = 429; + GBFreq[28][43] = 428; + GBFreq[45][86] = 427; + GBFreq[51][56] = 426; + GBFreq[37][28] = 425; + GBFreq[52][69] = 424; + GBFreq[43][92] = 423; + GBFreq[41][31] = 422; + GBFreq[37][87] = 421; + GBFreq[47][36] = 420; + GBFreq[16][16] = 419; + GBFreq[40][56] = 418; + GBFreq[24][55] = 417; + GBFreq[17][1] = 416; + GBFreq[35][57] = 415; + GBFreq[27][50] = 414; + GBFreq[26][14] = 413; + GBFreq[50][40] = 412; + GBFreq[39][19] = 411; + GBFreq[19][89] = 410; + GBFreq[29][91] = 409; + GBFreq[17][89] = 408; + GBFreq[39][74] = 407; + GBFreq[46][39] = 406; + GBFreq[40][28] = 405; + GBFreq[45][68] = 404; + GBFreq[43][10] = 403; + GBFreq[42][13] = 402; + GBFreq[44][81] = 401; + GBFreq[41][47] = 400; + GBFreq[48][58] = 399; + GBFreq[43][68] = 398; + GBFreq[16][79] = 397; + GBFreq[19][5] = 396; + GBFreq[54][59] = 395; + GBFreq[17][36] = 394; + GBFreq[18][0] = 393; + GBFreq[41][5] = 392; + GBFreq[41][72] = 391; + GBFreq[16][39] = 390; + GBFreq[54][0] = 389; + GBFreq[51][16] = 388; + GBFreq[29][36] = 387; + GBFreq[47][5] = 386; + GBFreq[47][51] = 385; + GBFreq[44][7] = 384; + GBFreq[35][30] = 383; + GBFreq[26][9] = 382; + GBFreq[16][7] = 381; + GBFreq[32][1] = 380; + GBFreq[33][76] = 379; + GBFreq[34][91] = 378; + GBFreq[52][36] = 377; + GBFreq[26][77] = 376; + GBFreq[35][48] = 375; + GBFreq[40][80] = 374; + GBFreq[41][92] = 373; + GBFreq[27][93] = 372; + GBFreq[15][17] = 371; + GBFreq[16][76] = 370; + GBFreq[51][12] = 369; + GBFreq[18][20] = 368; + GBFreq[15][54] = 367; + GBFreq[50][5] = 366; + GBFreq[33][22] = 365; + GBFreq[37][57] = 364; + GBFreq[28][47] = 363; + GBFreq[42][31] = 362; + GBFreq[18][2] = 361; + GBFreq[43][64] = 360; + GBFreq[23][47] = 359; + GBFreq[28][79] = 358; + GBFreq[25][45] = 357; + GBFreq[23][91] = 356; + GBFreq[22][19] = 355; + GBFreq[25][46] = 354; + GBFreq[22][36] = 353; + GBFreq[54][85] = 352; + GBFreq[46][20] = 351; + GBFreq[27][37] = 350; + GBFreq[26][81] = 349; + GBFreq[42][29] = 348; + GBFreq[31][90] = 347; + GBFreq[41][59] = 346; + GBFreq[24][65] = 345; + GBFreq[44][84] = 344; + GBFreq[24][90] = 343; + GBFreq[38][54] = 342; + GBFreq[28][70] = 341; + GBFreq[27][15] = 340; + GBFreq[28][80] = 339; + GBFreq[29][8] = 338; + GBFreq[45][80] = 337; + GBFreq[53][37] = 336; + GBFreq[28][65] = 335; + GBFreq[23][86] = 334; + GBFreq[39][45] = 333; + GBFreq[53][32] = 332; + GBFreq[38][68] = 331; + GBFreq[45][78] = 330; + GBFreq[43][7] = 329; + GBFreq[46][82] = 328; + GBFreq[27][38] = 327; + GBFreq[16][62] = 326; + GBFreq[24][17] = 325; + GBFreq[22][70] = 324; + GBFreq[52][28] = 323; + GBFreq[23][40] = 322; + GBFreq[28][50] = 321; + GBFreq[42][91] = 320; + GBFreq[47][76] = 319; + GBFreq[15][42] = 318; + GBFreq[43][55] = 317; + GBFreq[29][84] = 316; + GBFreq[44][90] = 315; + GBFreq[53][16] = 314; + GBFreq[22][93] = 313; + GBFreq[34][10] = 312; + GBFreq[32][53] = 311; + GBFreq[43][65] = 310; + GBFreq[28][7] = 309; + GBFreq[35][46] = 308; + GBFreq[21][39] = 307; + GBFreq[44][18] = 306; + GBFreq[40][10] = 305; + GBFreq[54][53] = 304; + GBFreq[38][74] = 303; + GBFreq[28][26] = 302; + GBFreq[15][13] = 301; + GBFreq[39][34] = 300; + GBFreq[39][46] = 299; + GBFreq[42][66] = 298; + GBFreq[33][58] = 297; + GBFreq[15][56] = 296; + GBFreq[18][51] = 295; + GBFreq[49][68] = 294; + GBFreq[30][37] = 293; + GBFreq[51][84] = 292; + GBFreq[51][9] = 291; + GBFreq[40][70] = 290; + GBFreq[41][84] = 289; + GBFreq[28][64] = 288; + GBFreq[32][88] = 287; + GBFreq[24][5] = 286; + GBFreq[53][23] = 285; + GBFreq[42][27] = 284; + GBFreq[22][38] = 283; + GBFreq[32][86] = 282; + GBFreq[34][30] = 281; + GBFreq[38][63] = 280; + GBFreq[24][59] = 279; + GBFreq[22][81] = 278; + GBFreq[32][11] = 277; + GBFreq[51][21] = 276; + GBFreq[54][41] = 275; + GBFreq[21][50] = 274; + GBFreq[23][89] = 273; + GBFreq[19][87] = 272; + GBFreq[26][7] = 271; + GBFreq[30][75] = 270; + GBFreq[43][84] = 269; + GBFreq[51][25] = 268; + GBFreq[16][67] = 267; + GBFreq[32][9] = 266; + GBFreq[48][51] = 265; + GBFreq[39][7] = 264; + GBFreq[44][88] = 263; + GBFreq[52][24] = 262; + GBFreq[23][34] = 261; + GBFreq[32][75] = 260; + GBFreq[19][10] = 259; + GBFreq[28][91] = 258; + GBFreq[32][83] = 257; + GBFreq[25][75] = 256; + GBFreq[53][45] = 255; + GBFreq[29][85] = 254; + GBFreq[53][59] = 253; + GBFreq[16][2] = 252; + GBFreq[19][78] = 251; + GBFreq[15][75] = 250; + GBFreq[51][42] = 249; + GBFreq[45][67] = 248; + GBFreq[15][74] = 247; + GBFreq[25][81] = 246; + GBFreq[37][62] = 245; + GBFreq[16][55] = 244; + GBFreq[18][38] = 243; + GBFreq[23][23] = 242; + GBFreq[38][30] = 241; + GBFreq[17][28] = 240; + GBFreq[44][73] = 239; + GBFreq[23][78] = 238; + GBFreq[40][77] = 237; + GBFreq[38][87] = 236; + GBFreq[27][19] = 235; + GBFreq[38][82] = 234; + GBFreq[37][22] = 233; + GBFreq[41][30] = 232; + GBFreq[54][9] = 231; + GBFreq[32][30] = 230; + GBFreq[30][52] = 229; + GBFreq[40][84] = 228; + GBFreq[53][57] = 227; + GBFreq[27][27] = 226; + GBFreq[38][64] = 225; + GBFreq[18][43] = 224; + GBFreq[23][69] = 223; + GBFreq[28][12] = 222; + GBFreq[50][78] = 221; + GBFreq[50][1] = 220; + GBFreq[26][88] = 219; + GBFreq[36][40] = 218; + GBFreq[33][89] = 217; + GBFreq[41][28] = 216; + GBFreq[31][77] = 215; + GBFreq[46][1] = 214; + GBFreq[47][19] = 213; + GBFreq[35][55] = 212; + GBFreq[41][21] = 211; + GBFreq[27][10] = 210; + GBFreq[32][77] = 209; + GBFreq[26][37] = 208; + GBFreq[20][33] = 207; + GBFreq[41][52] = 206; + GBFreq[32][18] = 205; + GBFreq[38][13] = 204; + GBFreq[20][18] = 203; + GBFreq[20][24] = 202; + GBFreq[45][19] = 201; + GBFreq[18][53] = 200; + /* + * GBFreq[39][0] = 199; GBFreq[40][71] = 198; GBFreq[41][27] = 197; GBFreq[15][69] = 196; GBFreq[42][10] = 195; + * GBFreq[31][89] = 194; GBFreq[51][28] = 193; GBFreq[41][22] = 192; GBFreq[40][43] = 191; GBFreq[38][6] = 190; + * GBFreq[37][11] = 189; GBFreq[39][60] = 188; GBFreq[48][47] = 187; GBFreq[46][80] = 186; GBFreq[52][49] = 185; + * GBFreq[50][48] = 184; GBFreq[25][1] = 183; GBFreq[52][29] = 182; GBFreq[24][66] = 181; GBFreq[23][35] = 180; + * GBFreq[49][72] = 179; GBFreq[47][45] = 178; GBFreq[45][14] = 177; GBFreq[51][70] = 176; GBFreq[22][30] = 175; + * GBFreq[49][83] = 174; GBFreq[26][79] = 173; GBFreq[27][41] = 172; GBFreq[51][81] = 171; GBFreq[41][54] = 170; + * GBFreq[20][4] = 169; GBFreq[29][60] = 168; GBFreq[20][27] = 167; GBFreq[50][15] = 166; GBFreq[41][6] = 165; + * GBFreq[35][34] = 164; GBFreq[44][87] = 163; GBFreq[46][66] = 162; GBFreq[42][37] = 161; GBFreq[42][24] = 160; + * GBFreq[54][7] = 159; GBFreq[41][14] = 158; GBFreq[39][83] = 157; GBFreq[16][87] = 156; GBFreq[20][59] = 155; + * GBFreq[42][12] = 154; GBFreq[47][2] = 153; GBFreq[21][32] = 152; GBFreq[53][29] = 151; GBFreq[22][40] = 150; + * GBFreq[24][58] = 149; GBFreq[52][88] = 148; GBFreq[29][30] = 147; GBFreq[15][91] = 146; GBFreq[54][72] = 145; + * GBFreq[51][75] = 144; GBFreq[33][67] = 143; GBFreq[41][50] = 142; GBFreq[27][34] = 141; GBFreq[46][17] = 140; + * GBFreq[31][74] = 139; GBFreq[42][67] = 138; GBFreq[54][87] = 137; GBFreq[27][14] = 136; GBFreq[16][63] = 135; + * GBFreq[16][5] = 134; GBFreq[43][23] = 133; GBFreq[23][13] = 132; GBFreq[31][12] = 131; GBFreq[25][57] = 130; + * GBFreq[38][49] = 129; GBFreq[42][69] = 128; GBFreq[23][80] = 127; GBFreq[29][0] = 126; GBFreq[28][2] = 125; + * GBFreq[28][17] = 124; GBFreq[17][27] = 123; GBFreq[40][16] = 122; GBFreq[45][1] = 121; GBFreq[36][33] = 120; + * GBFreq[35][23] = 119; GBFreq[20][86] = 118; GBFreq[29][53] = 117; GBFreq[23][88] = 116; GBFreq[51][87] = 115; + * GBFreq[54][27] = 114; GBFreq[44][36] = 113; GBFreq[21][45] = 112; GBFreq[53][52] = 111; GBFreq[31][53] = 110; + * GBFreq[38][47] = 109; GBFreq[27][21] = 108; GBFreq[30][42] = 107; GBFreq[29][10] = 106; GBFreq[35][35] = 105; + * GBFreq[24][56] = 104; GBFreq[41][29] = 103; GBFreq[18][68] = 102; GBFreq[29][24] = 101; GBFreq[25][84] = 100; + * GBFreq[35][47] = 99; GBFreq[29][56] = 98; GBFreq[30][44] = 97; GBFreq[53][3] = 96; GBFreq[30][63] = 95; GBFreq[52][52] = + * 94; GBFreq[54][1] = 93; GBFreq[22][48] = 92; GBFreq[54][66] = 91; GBFreq[21][90] = 90; GBFreq[52][47] = 89; + * GBFreq[39][25] = 88; GBFreq[39][39] = 87; GBFreq[44][37] = 86; GBFreq[44][76] = 85; GBFreq[46][75] = 84; GBFreq[18][37] = + * 83; GBFreq[47][42] = 82; GBFreq[19][92] = 81; GBFreq[51][27] = 80; GBFreq[48][83] = 79; GBFreq[23][70] = 78; + * GBFreq[29][9] = 77; GBFreq[33][79] = 76; GBFreq[52][90] = 75; GBFreq[53][6] = 74; GBFreq[24][36] = 73; GBFreq[25][25] = + * 72; GBFreq[44][26] = 71; GBFreq[25][36] = 70; GBFreq[29][87] = 69; GBFreq[48][0] = 68; GBFreq[15][40] = 67; + * GBFreq[17][45] = 66; GBFreq[30][14] = 65; GBFreq[48][38] = 64; GBFreq[23][19] = 63; GBFreq[40][42] = 62; GBFreq[31][63] = + * 61; GBFreq[16][23] = 60; GBFreq[26][21] = 59; GBFreq[32][76] = 58; GBFreq[23][58] = 57; GBFreq[41][37] = 56; + * GBFreq[30][43] = 55; GBFreq[47][38] = 54; GBFreq[21][46] = 53; GBFreq[18][33] = 52; GBFreq[52][37] = 51; GBFreq[36][8] = + * 50; GBFreq[49][24] = 49; GBFreq[15][66] = 48; GBFreq[35][77] = 47; GBFreq[27][58] = 46; GBFreq[35][51] = 45; + * GBFreq[24][69] = 44; GBFreq[20][54] = 43; GBFreq[24][41] = 42; GBFreq[41][0] = 41; GBFreq[33][71] = 40; GBFreq[23][52] = + * 39; GBFreq[29][67] = 38; GBFreq[46][51] = 37; GBFreq[46][90] = 36; GBFreq[49][33] = 35; GBFreq[33][28] = 34; + * GBFreq[37][86] = 33; GBFreq[39][22] = 32; GBFreq[37][37] = 31; GBFreq[29][62] = 30; GBFreq[29][50] = 29; GBFreq[36][89] = + * 28; GBFreq[42][44] = 27; GBFreq[51][82] = 26; GBFreq[28][83] = 25; GBFreq[15][78] = 24; GBFreq[46][62] = 23; + * GBFreq[19][69] = 22; GBFreq[51][23] = 21; GBFreq[37][69] = 20; GBFreq[25][5] = 19; GBFreq[51][85] = 18; GBFreq[48][77] = + * 17; GBFreq[32][46] = 16; GBFreq[53][60] = 15; GBFreq[28][57] = 14; GBFreq[54][82] = 13; GBFreq[54][15] = 12; + * GBFreq[49][54] = 11; GBFreq[53][87] = 10; GBFreq[27][16] = 9; GBFreq[29][34] = 8; GBFreq[20][44] = 7; GBFreq[42][73] = 6; + * GBFreq[47][71] = 5; GBFreq[29][37] = 4; GBFreq[25][50] = 3; GBFreq[18][84] = 2; GBFreq[50][45] = 1; GBFreq[48][46] = 0; + */ + // GBFreq[43][89] = -1; GBFreq[54][68] = -2; + Big5Freq[9][89] = 600; + Big5Freq[11][15] = 599; + Big5Freq[3][66] = 598; + Big5Freq[6][121] = 597; + Big5Freq[3][0] = 596; + Big5Freq[5][82] = 595; + Big5Freq[3][42] = 594; + Big5Freq[5][34] = 593; + Big5Freq[3][8] = 592; + Big5Freq[3][6] = 591; + Big5Freq[3][67] = 590; + Big5Freq[7][139] = 589; + Big5Freq[23][137] = 588; + Big5Freq[12][46] = 587; + Big5Freq[4][8] = 586; + Big5Freq[4][41] = 585; + Big5Freq[18][47] = 584; + Big5Freq[12][114] = 583; + Big5Freq[6][1] = 582; + Big5Freq[22][60] = 581; + Big5Freq[5][46] = 580; + Big5Freq[11][79] = 579; + Big5Freq[3][23] = 578; + Big5Freq[7][114] = 577; + Big5Freq[29][102] = 576; + Big5Freq[19][14] = 575; + Big5Freq[4][133] = 574; + Big5Freq[3][29] = 573; + Big5Freq[4][109] = 572; + Big5Freq[14][127] = 571; + Big5Freq[5][48] = 570; + Big5Freq[13][104] = 569; + Big5Freq[3][132] = 568; + Big5Freq[26][64] = 567; + Big5Freq[7][19] = 566; + Big5Freq[4][12] = 565; + Big5Freq[11][124] = 564; + Big5Freq[7][89] = 563; + Big5Freq[15][124] = 562; + Big5Freq[4][108] = 561; + Big5Freq[19][66] = 560; + Big5Freq[3][21] = 559; + Big5Freq[24][12] = 558; + Big5Freq[28][111] = 557; + Big5Freq[12][107] = 556; + Big5Freq[3][112] = 555; + Big5Freq[8][113] = 554; + Big5Freq[5][40] = 553; + Big5Freq[26][145] = 552; + Big5Freq[3][48] = 551; + Big5Freq[3][70] = 550; + Big5Freq[22][17] = 549; + Big5Freq[16][47] = 548; + Big5Freq[3][53] = 547; + Big5Freq[4][24] = 546; + Big5Freq[32][120] = 545; + Big5Freq[24][49] = 544; + Big5Freq[24][142] = 543; + Big5Freq[18][66] = 542; + Big5Freq[29][150] = 541; + Big5Freq[5][122] = 540; + Big5Freq[5][114] = 539; + Big5Freq[3][44] = 538; + Big5Freq[10][128] = 537; + Big5Freq[15][20] = 536; + Big5Freq[13][33] = 535; + Big5Freq[14][87] = 534; + Big5Freq[3][126] = 533; + Big5Freq[4][53] = 532; + Big5Freq[4][40] = 531; + Big5Freq[9][93] = 530; + Big5Freq[15][137] = 529; + Big5Freq[10][123] = 528; + Big5Freq[4][56] = 527; + Big5Freq[5][71] = 526; + Big5Freq[10][8] = 525; + Big5Freq[5][16] = 524; + Big5Freq[5][146] = 523; + Big5Freq[18][88] = 522; + Big5Freq[24][4] = 521; + Big5Freq[20][47] = 520; + Big5Freq[5][33] = 519; + Big5Freq[9][43] = 518; + Big5Freq[20][12] = 517; + Big5Freq[20][13] = 516; + Big5Freq[5][156] = 515; + Big5Freq[22][140] = 514; + Big5Freq[8][146] = 513; + Big5Freq[21][123] = 512; + Big5Freq[4][90] = 511; + Big5Freq[5][62] = 510; + Big5Freq[17][59] = 509; + Big5Freq[10][37] = 508; + Big5Freq[18][107] = 507; + Big5Freq[14][53] = 506; + Big5Freq[22][51] = 505; + Big5Freq[8][13] = 504; + Big5Freq[5][29] = 503; + Big5Freq[9][7] = 502; + Big5Freq[22][14] = 501; + Big5Freq[8][55] = 500; + Big5Freq[33][9] = 499; + Big5Freq[16][64] = 498; + Big5Freq[7][131] = 497; + Big5Freq[34][4] = 496; + Big5Freq[7][101] = 495; + Big5Freq[11][139] = 494; + Big5Freq[3][135] = 493; + Big5Freq[7][102] = 492; + Big5Freq[17][13] = 491; + Big5Freq[3][20] = 490; + Big5Freq[27][106] = 489; + Big5Freq[5][88] = 488; + Big5Freq[6][33] = 487; + Big5Freq[5][139] = 486; + Big5Freq[6][0] = 485; + Big5Freq[17][58] = 484; + Big5Freq[5][133] = 483; + Big5Freq[9][107] = 482; + Big5Freq[23][39] = 481; + Big5Freq[5][23] = 480; + Big5Freq[3][79] = 479; + Big5Freq[32][97] = 478; + Big5Freq[3][136] = 477; + Big5Freq[4][94] = 476; + Big5Freq[21][61] = 475; + Big5Freq[23][123] = 474; + Big5Freq[26][16] = 473; + Big5Freq[24][137] = 472; + Big5Freq[22][18] = 471; + Big5Freq[5][1] = 470; + Big5Freq[20][119] = 469; + Big5Freq[3][7] = 468; + Big5Freq[10][79] = 467; + Big5Freq[15][105] = 466; + Big5Freq[3][144] = 465; + Big5Freq[12][80] = 464; + Big5Freq[15][73] = 463; + Big5Freq[3][19] = 462; + Big5Freq[8][109] = 461; + Big5Freq[3][15] = 460; + Big5Freq[31][82] = 459; + Big5Freq[3][43] = 458; + Big5Freq[25][119] = 457; + Big5Freq[16][111] = 456; + Big5Freq[7][77] = 455; + Big5Freq[3][95] = 454; + Big5Freq[24][82] = 453; + Big5Freq[7][52] = 452; + Big5Freq[9][151] = 451; + Big5Freq[3][129] = 450; + Big5Freq[5][87] = 449; + Big5Freq[3][55] = 448; + Big5Freq[8][153] = 447; + Big5Freq[4][83] = 446; + Big5Freq[3][114] = 445; + Big5Freq[23][147] = 444; + Big5Freq[15][31] = 443; + Big5Freq[3][54] = 442; + Big5Freq[11][122] = 441; + Big5Freq[4][4] = 440; + Big5Freq[34][149] = 439; + Big5Freq[3][17] = 438; + Big5Freq[21][64] = 437; + Big5Freq[26][144] = 436; + Big5Freq[4][62] = 435; + Big5Freq[8][15] = 434; + Big5Freq[35][80] = 433; + Big5Freq[7][110] = 432; + Big5Freq[23][114] = 431; + Big5Freq[3][108] = 430; + Big5Freq[3][62] = 429; + Big5Freq[21][41] = 428; + Big5Freq[15][99] = 427; + Big5Freq[5][47] = 426; + Big5Freq[4][96] = 425; + Big5Freq[20][122] = 424; + Big5Freq[5][21] = 423; + Big5Freq[4][157] = 422; + Big5Freq[16][14] = 421; + Big5Freq[3][117] = 420; + Big5Freq[7][129] = 419; + Big5Freq[4][27] = 418; + Big5Freq[5][30] = 417; + Big5Freq[22][16] = 416; + Big5Freq[5][64] = 415; + Big5Freq[17][99] = 414; + Big5Freq[17][57] = 413; + Big5Freq[8][105] = 412; + Big5Freq[5][112] = 411; + Big5Freq[20][59] = 410; + Big5Freq[6][129] = 409; + Big5Freq[18][17] = 408; + Big5Freq[3][92] = 407; + Big5Freq[28][118] = 406; + Big5Freq[3][109] = 405; + Big5Freq[31][51] = 404; + Big5Freq[13][116] = 403; + Big5Freq[6][15] = 402; + Big5Freq[36][136] = 401; + Big5Freq[12][74] = 400; + Big5Freq[20][88] = 399; + Big5Freq[36][68] = 398; + Big5Freq[3][147] = 397; + Big5Freq[15][84] = 396; + Big5Freq[16][32] = 395; + Big5Freq[16][58] = 394; + Big5Freq[7][66] = 393; + Big5Freq[23][107] = 392; + Big5Freq[9][6] = 391; + Big5Freq[12][86] = 390; + Big5Freq[23][112] = 389; + Big5Freq[37][23] = 388; + Big5Freq[3][138] = 387; + Big5Freq[20][68] = 386; + Big5Freq[15][116] = 385; + Big5Freq[18][64] = 384; + Big5Freq[12][139] = 383; + Big5Freq[11][155] = 382; + Big5Freq[4][156] = 381; + Big5Freq[12][84] = 380; + Big5Freq[18][49] = 379; + Big5Freq[25][125] = 378; + Big5Freq[25][147] = 377; + Big5Freq[15][110] = 376; + Big5Freq[19][96] = 375; + Big5Freq[30][152] = 374; + Big5Freq[6][31] = 373; + Big5Freq[27][117] = 372; + Big5Freq[3][10] = 371; + Big5Freq[6][131] = 370; + Big5Freq[13][112] = 369; + Big5Freq[36][156] = 368; + Big5Freq[4][60] = 367; + Big5Freq[15][121] = 366; + Big5Freq[4][112] = 365; + Big5Freq[30][142] = 364; + Big5Freq[23][154] = 363; + Big5Freq[27][101] = 362; + Big5Freq[9][140] = 361; + Big5Freq[3][89] = 360; + Big5Freq[18][148] = 359; + Big5Freq[4][69] = 358; + Big5Freq[16][49] = 357; + Big5Freq[6][117] = 356; + Big5Freq[36][55] = 355; + Big5Freq[5][123] = 354; + Big5Freq[4][126] = 353; + Big5Freq[4][119] = 352; + Big5Freq[9][95] = 351; + Big5Freq[5][24] = 350; + Big5Freq[16][133] = 349; + Big5Freq[10][134] = 348; + Big5Freq[26][59] = 347; + Big5Freq[6][41] = 346; + Big5Freq[6][146] = 345; + Big5Freq[19][24] = 344; + Big5Freq[5][113] = 343; + Big5Freq[10][118] = 342; + Big5Freq[34][151] = 341; + Big5Freq[9][72] = 340; + Big5Freq[31][25] = 339; + Big5Freq[18][126] = 338; + Big5Freq[18][28] = 337; + Big5Freq[4][153] = 336; + Big5Freq[3][84] = 335; + Big5Freq[21][18] = 334; + Big5Freq[25][129] = 333; + Big5Freq[6][107] = 332; + Big5Freq[12][25] = 331; + Big5Freq[17][109] = 330; + Big5Freq[7][76] = 329; + Big5Freq[15][15] = 328; + Big5Freq[4][14] = 327; + Big5Freq[23][88] = 326; + Big5Freq[18][2] = 325; + Big5Freq[6][88] = 324; + Big5Freq[16][84] = 323; + Big5Freq[12][48] = 322; + Big5Freq[7][68] = 321; + Big5Freq[5][50] = 320; + Big5Freq[13][54] = 319; + Big5Freq[7][98] = 318; + Big5Freq[11][6] = 317; + Big5Freq[9][80] = 316; + Big5Freq[16][41] = 315; + Big5Freq[7][43] = 314; + Big5Freq[28][117] = 313; + Big5Freq[3][51] = 312; + Big5Freq[7][3] = 311; + Big5Freq[20][81] = 310; + Big5Freq[4][2] = 309; + Big5Freq[11][16] = 308; + Big5Freq[10][4] = 307; + Big5Freq[10][119] = 306; + Big5Freq[6][142] = 305; + Big5Freq[18][51] = 304; + Big5Freq[8][144] = 303; + Big5Freq[10][65] = 302; + Big5Freq[11][64] = 301; + Big5Freq[11][130] = 300; + Big5Freq[9][92] = 299; + Big5Freq[18][29] = 298; + Big5Freq[18][78] = 297; + Big5Freq[18][151] = 296; + Big5Freq[33][127] = 295; + Big5Freq[35][113] = 294; + Big5Freq[10][155] = 293; + Big5Freq[3][76] = 292; + Big5Freq[36][123] = 291; + Big5Freq[13][143] = 290; + Big5Freq[5][135] = 289; + Big5Freq[23][116] = 288; + Big5Freq[6][101] = 287; + Big5Freq[14][74] = 286; + Big5Freq[7][153] = 285; + Big5Freq[3][101] = 284; + Big5Freq[9][74] = 283; + Big5Freq[3][156] = 282; + Big5Freq[4][147] = 281; + Big5Freq[9][12] = 280; + Big5Freq[18][133] = 279; + Big5Freq[4][0] = 278; + Big5Freq[7][155] = 277; + Big5Freq[9][144] = 276; + Big5Freq[23][49] = 275; + Big5Freq[5][89] = 274; + Big5Freq[10][11] = 273; + Big5Freq[3][110] = 272; + Big5Freq[3][40] = 271; + Big5Freq[29][115] = 270; + Big5Freq[9][100] = 269; + Big5Freq[21][67] = 268; + Big5Freq[23][145] = 267; + Big5Freq[10][47] = 266; + Big5Freq[4][31] = 265; + Big5Freq[4][81] = 264; + Big5Freq[22][62] = 263; + Big5Freq[4][28] = 262; + Big5Freq[27][39] = 261; + Big5Freq[27][54] = 260; + Big5Freq[32][46] = 259; + Big5Freq[4][76] = 258; + Big5Freq[26][15] = 257; + Big5Freq[12][154] = 256; + Big5Freq[9][150] = 255; + Big5Freq[15][17] = 254; + Big5Freq[5][129] = 253; + Big5Freq[10][40] = 252; + Big5Freq[13][37] = 251; + Big5Freq[31][104] = 250; + Big5Freq[3][152] = 249; + Big5Freq[5][22] = 248; + Big5Freq[8][48] = 247; + Big5Freq[4][74] = 246; + Big5Freq[6][17] = 245; + Big5Freq[30][82] = 244; + Big5Freq[4][116] = 243; + Big5Freq[16][42] = 242; + Big5Freq[5][55] = 241; + Big5Freq[4][64] = 240; + Big5Freq[14][19] = 239; + Big5Freq[35][82] = 238; + Big5Freq[30][139] = 237; + Big5Freq[26][152] = 236; + Big5Freq[32][32] = 235; + Big5Freq[21][102] = 234; + Big5Freq[10][131] = 233; + Big5Freq[9][128] = 232; + Big5Freq[3][87] = 231; + Big5Freq[4][51] = 230; + Big5Freq[10][15] = 229; + Big5Freq[4][150] = 228; + Big5Freq[7][4] = 227; + Big5Freq[7][51] = 226; + Big5Freq[7][157] = 225; + Big5Freq[4][146] = 224; + Big5Freq[4][91] = 223; + Big5Freq[7][13] = 222; + Big5Freq[17][116] = 221; + Big5Freq[23][21] = 220; + Big5Freq[5][106] = 219; + Big5Freq[14][100] = 218; + Big5Freq[10][152] = 217; + Big5Freq[14][89] = 216; + Big5Freq[6][138] = 215; + Big5Freq[12][157] = 214; + Big5Freq[10][102] = 213; + Big5Freq[19][94] = 212; + Big5Freq[7][74] = 211; + Big5Freq[18][128] = 210; + Big5Freq[27][111] = 209; + Big5Freq[11][57] = 208; + Big5Freq[3][131] = 207; + Big5Freq[30][23] = 206; + Big5Freq[30][126] = 205; + Big5Freq[4][36] = 204; + Big5Freq[26][124] = 203; + Big5Freq[4][19] = 202; + Big5Freq[9][152] = 201; + /* + * Big5Freq[5][0] = 200; Big5Freq[26][57] = 199; Big5Freq[13][155] = 198; Big5Freq[3][38] = 197; Big5Freq[9][155] = 196; + * Big5Freq[28][53] = 195; Big5Freq[15][71] = 194; Big5Freq[21][95] = 193; Big5Freq[15][112] = 192; Big5Freq[14][138] = 191; + * Big5Freq[8][18] = 190; Big5Freq[20][151] = 189; Big5Freq[37][27] = 188; Big5Freq[32][48] = 187; Big5Freq[23][66] = 186; + * Big5Freq[9][2] = 185; Big5Freq[13][133] = 184; Big5Freq[7][127] = 183; Big5Freq[3][11] = 182; Big5Freq[12][118] = 181; + * Big5Freq[13][101] = 180; Big5Freq[30][153] = 179; Big5Freq[4][65] = 178; Big5Freq[5][25] = 177; Big5Freq[5][140] = 176; + * Big5Freq[6][25] = 175; Big5Freq[4][52] = 174; Big5Freq[30][156] = 173; Big5Freq[16][13] = 172; Big5Freq[21][8] = 171; + * Big5Freq[19][74] = 170; Big5Freq[15][145] = 169; Big5Freq[9][15] = 168; Big5Freq[13][82] = 167; Big5Freq[26][86] = 166; + * Big5Freq[18][52] = 165; Big5Freq[6][109] = 164; Big5Freq[10][99] = 163; Big5Freq[18][101] = 162; Big5Freq[25][49] = 161; + * Big5Freq[31][79] = 160; Big5Freq[28][20] = 159; Big5Freq[12][115] = 158; Big5Freq[15][66] = 157; Big5Freq[11][104] = 156; + * Big5Freq[23][106] = 155; Big5Freq[34][157] = 154; Big5Freq[32][94] = 153; Big5Freq[29][88] = 152; Big5Freq[10][46] = 151; + * Big5Freq[13][118] = 150; Big5Freq[20][37] = 149; Big5Freq[12][30] = 148; Big5Freq[21][4] = 147; Big5Freq[16][33] = 146; + * Big5Freq[13][52] = 145; Big5Freq[4][7] = 144; Big5Freq[21][49] = 143; Big5Freq[3][27] = 142; Big5Freq[16][91] = 141; + * Big5Freq[5][155] = 140; Big5Freq[29][130] = 139; Big5Freq[3][125] = 138; Big5Freq[14][26] = 137; Big5Freq[15][39] = 136; + * Big5Freq[24][110] = 135; Big5Freq[7][141] = 134; Big5Freq[21][15] = 133; Big5Freq[32][104] = 132; Big5Freq[8][31] = 131; + * Big5Freq[34][112] = 130; Big5Freq[10][75] = 129; Big5Freq[21][23] = 128; Big5Freq[34][131] = 127; Big5Freq[12][3] = 126; + * Big5Freq[10][62] = 125; Big5Freq[9][120] = 124; Big5Freq[32][149] = 123; Big5Freq[8][44] = 122; Big5Freq[24][2] = 121; + * Big5Freq[6][148] = 120; Big5Freq[15][103] = 119; Big5Freq[36][54] = 118; Big5Freq[36][134] = 117; Big5Freq[11][7] = 116; + * Big5Freq[3][90] = 115; Big5Freq[36][73] = 114; Big5Freq[8][102] = 113; Big5Freq[12][87] = 112; Big5Freq[25][64] = 111; + * Big5Freq[9][1] = 110; Big5Freq[24][121] = 109; Big5Freq[5][75] = 108; Big5Freq[17][83] = 107; Big5Freq[18][57] = 106; + * Big5Freq[8][95] = 105; Big5Freq[14][36] = 104; Big5Freq[28][113] = 103; Big5Freq[12][56] = 102; Big5Freq[14][61] = 101; + * Big5Freq[25][138] = 100; Big5Freq[4][34] = 99; Big5Freq[11][152] = 98; Big5Freq[35][0] = 97; Big5Freq[4][15] = 96; + * Big5Freq[8][82] = 95; Big5Freq[20][73] = 94; Big5Freq[25][52] = 93; Big5Freq[24][6] = 92; Big5Freq[21][78] = 91; + * Big5Freq[17][32] = 90; Big5Freq[17][91] = 89; Big5Freq[5][76] = 88; Big5Freq[15][60] = 87; Big5Freq[15][150] = 86; + * Big5Freq[5][80] = 85; Big5Freq[15][81] = 84; Big5Freq[28][108] = 83; Big5Freq[18][14] = 82; Big5Freq[19][109] = 81; + * Big5Freq[28][133] = 80; Big5Freq[21][97] = 79; Big5Freq[5][105] = 78; Big5Freq[18][114] = 77; Big5Freq[16][95] = 76; + * Big5Freq[5][51] = 75; Big5Freq[3][148] = 74; Big5Freq[22][102] = 73; Big5Freq[4][123] = 72; Big5Freq[8][88] = 71; + * Big5Freq[25][111] = 70; Big5Freq[8][149] = 69; Big5Freq[9][48] = 68; Big5Freq[16][126] = 67; Big5Freq[33][150] = 66; + * Big5Freq[9][54] = 65; Big5Freq[29][104] = 64; Big5Freq[3][3] = 63; Big5Freq[11][49] = 62; Big5Freq[24][109] = 61; + * Big5Freq[28][116] = 60; Big5Freq[34][113] = 59; Big5Freq[5][3] = 58; Big5Freq[21][106] = 57; Big5Freq[4][98] = 56; + * Big5Freq[12][135] = 55; Big5Freq[16][101] = 54; Big5Freq[12][147] = 53; Big5Freq[27][55] = 52; Big5Freq[3][5] = 51; + * Big5Freq[11][101] = 50; Big5Freq[16][157] = 49; Big5Freq[22][114] = 48; Big5Freq[18][46] = 47; Big5Freq[4][29] = 46; + * Big5Freq[8][103] = 45; Big5Freq[16][151] = 44; Big5Freq[8][29] = 43; Big5Freq[15][114] = 42; Big5Freq[22][70] = 41; + * Big5Freq[13][121] = 40; Big5Freq[7][112] = 39; Big5Freq[20][83] = 38; Big5Freq[3][36] = 37; Big5Freq[10][103] = 36; + * Big5Freq[3][96] = 35; Big5Freq[21][79] = 34; Big5Freq[25][120] = 33; Big5Freq[29][121] = 32; Big5Freq[23][71] = 31; + * Big5Freq[21][22] = 30; Big5Freq[18][89] = 29; Big5Freq[25][104] = 28; Big5Freq[10][124] = 27; Big5Freq[26][4] = 26; + * Big5Freq[21][136] = 25; Big5Freq[6][112] = 24; Big5Freq[12][103] = 23; Big5Freq[17][66] = 22; Big5Freq[13][151] = 21; + * Big5Freq[33][152] = 20; Big5Freq[11][148] = 19; Big5Freq[13][57] = 18; Big5Freq[13][41] = 17; Big5Freq[7][60] = 16; + * Big5Freq[21][29] = 15; Big5Freq[9][157] = 14; Big5Freq[24][95] = 13; Big5Freq[15][148] = 12; Big5Freq[15][122] = 11; + * Big5Freq[6][125] = 10; Big5Freq[11][25] = 9; Big5Freq[20][55] = 8; Big5Freq[19][84] = 7; Big5Freq[21][82] = 6; + * Big5Freq[24][3] = 5; Big5Freq[13][70] = 4; Big5Freq[6][21] = 3; Big5Freq[21][86] = 2; Big5Freq[12][23] = 1; + * Big5Freq[3][85] = 0; EUC_TWFreq[45][90] = 600; + */ + Big5PFreq[41][122] = 600; + Big5PFreq[35][0] = 599; + Big5PFreq[43][15] = 598; + Big5PFreq[35][99] = 597; + Big5PFreq[35][6] = 596; + Big5PFreq[35][8] = 595; + Big5PFreq[38][154] = 594; + Big5PFreq[37][34] = 593; + Big5PFreq[37][115] = 592; + Big5PFreq[36][12] = 591; + Big5PFreq[18][77] = 590; + Big5PFreq[35][100] = 589; + Big5PFreq[35][42] = 588; + Big5PFreq[120][75] = 587; + Big5PFreq[35][23] = 586; + Big5PFreq[13][72] = 585; + Big5PFreq[0][67] = 584; + Big5PFreq[39][172] = 583; + Big5PFreq[22][182] = 582; + Big5PFreq[15][186] = 581; + Big5PFreq[15][165] = 580; + Big5PFreq[35][44] = 579; + Big5PFreq[40][13] = 578; + Big5PFreq[38][1] = 577; + Big5PFreq[37][33] = 576; + Big5PFreq[36][24] = 575; + Big5PFreq[56][4] = 574; + Big5PFreq[35][29] = 573; + Big5PFreq[9][96] = 572; + Big5PFreq[37][62] = 571; + Big5PFreq[48][47] = 570; + Big5PFreq[51][14] = 569; + Big5PFreq[39][122] = 568; + Big5PFreq[44][46] = 567; + Big5PFreq[35][21] = 566; + Big5PFreq[36][8] = 565; + Big5PFreq[36][141] = 564; + Big5PFreq[3][81] = 563; + Big5PFreq[37][155] = 562; + Big5PFreq[42][84] = 561; + Big5PFreq[36][40] = 560; + Big5PFreq[35][103] = 559; + Big5PFreq[11][84] = 558; + Big5PFreq[45][33] = 557; + Big5PFreq[121][79] = 556; + Big5PFreq[2][77] = 555; + Big5PFreq[36][41] = 554; + Big5PFreq[37][47] = 553; + Big5PFreq[39][125] = 552; + Big5PFreq[37][26] = 551; + Big5PFreq[35][48] = 550; + Big5PFreq[35][28] = 549; + Big5PFreq[35][159] = 548; + Big5PFreq[37][40] = 547; + Big5PFreq[35][145] = 546; + Big5PFreq[37][147] = 545; + Big5PFreq[46][160] = 544; + Big5PFreq[37][46] = 543; + Big5PFreq[50][99] = 542; + Big5PFreq[52][13] = 541; + Big5PFreq[10][82] = 540; + Big5PFreq[35][169] = 539; + Big5PFreq[35][31] = 538; + Big5PFreq[47][31] = 537; + Big5PFreq[18][79] = 536; + Big5PFreq[16][113] = 535; + Big5PFreq[37][104] = 534; + Big5PFreq[39][134] = 533; + Big5PFreq[36][53] = 532; + Big5PFreq[38][0] = 531; + Big5PFreq[4][86] = 530; + Big5PFreq[54][17] = 529; + Big5PFreq[43][157] = 528; + Big5PFreq[35][165] = 527; + Big5PFreq[69][147] = 526; + Big5PFreq[117][95] = 525; + Big5PFreq[35][162] = 524; + Big5PFreq[35][17] = 523; + Big5PFreq[36][142] = 522; + Big5PFreq[36][4] = 521; + Big5PFreq[37][166] = 520; + Big5PFreq[35][168] = 519; + Big5PFreq[35][19] = 518; + Big5PFreq[37][48] = 517; + Big5PFreq[42][37] = 516; + Big5PFreq[40][146] = 515; + Big5PFreq[36][123] = 514; + Big5PFreq[22][41] = 513; + Big5PFreq[20][119] = 512; + Big5PFreq[2][74] = 511; + Big5PFreq[44][113] = 510; + Big5PFreq[35][125] = 509; + Big5PFreq[37][16] = 508; + Big5PFreq[35][20] = 507; + Big5PFreq[35][55] = 506; + Big5PFreq[37][145] = 505; + Big5PFreq[0][88] = 504; + Big5PFreq[3][94] = 503; + Big5PFreq[6][65] = 502; + Big5PFreq[26][15] = 501; + Big5PFreq[41][126] = 500; + Big5PFreq[36][129] = 499; + Big5PFreq[31][75] = 498; + Big5PFreq[19][61] = 497; + Big5PFreq[35][128] = 496; + Big5PFreq[29][79] = 495; + Big5PFreq[36][62] = 494; + Big5PFreq[37][189] = 493; + Big5PFreq[39][109] = 492; + Big5PFreq[39][135] = 491; + Big5PFreq[72][15] = 490; + Big5PFreq[47][106] = 489; + Big5PFreq[54][14] = 488; + Big5PFreq[24][52] = 487; + Big5PFreq[38][162] = 486; + Big5PFreq[41][43] = 485; + Big5PFreq[37][121] = 484; + Big5PFreq[14][66] = 483; + Big5PFreq[37][30] = 482; + Big5PFreq[35][7] = 481; + Big5PFreq[49][58] = 480; + Big5PFreq[43][188] = 479; + Big5PFreq[24][66] = 478; + Big5PFreq[35][171] = 477; + Big5PFreq[40][186] = 476; + Big5PFreq[39][164] = 475; + Big5PFreq[78][186] = 474; + Big5PFreq[8][72] = 473; + Big5PFreq[36][190] = 472; + Big5PFreq[35][53] = 471; + Big5PFreq[35][54] = 470; + Big5PFreq[22][159] = 469; + Big5PFreq[35][9] = 468; + Big5PFreq[41][140] = 467; + Big5PFreq[37][22] = 466; + Big5PFreq[48][97] = 465; + Big5PFreq[50][97] = 464; + Big5PFreq[36][127] = 463; + Big5PFreq[37][23] = 462; + Big5PFreq[40][55] = 461; + Big5PFreq[35][43] = 460; + Big5PFreq[26][22] = 459; + Big5PFreq[35][15] = 458; + Big5PFreq[72][179] = 457; + Big5PFreq[20][129] = 456; + Big5PFreq[52][101] = 455; + Big5PFreq[35][12] = 454; + Big5PFreq[42][156] = 453; + Big5PFreq[15][157] = 452; + Big5PFreq[50][140] = 451; + Big5PFreq[26][28] = 450; + Big5PFreq[54][51] = 449; + Big5PFreq[35][112] = 448; + Big5PFreq[36][116] = 447; + Big5PFreq[42][11] = 446; + Big5PFreq[37][172] = 445; + Big5PFreq[37][29] = 444; + Big5PFreq[44][107] = 443; + Big5PFreq[50][17] = 442; + Big5PFreq[39][107] = 441; + Big5PFreq[19][109] = 440; + Big5PFreq[36][60] = 439; + Big5PFreq[49][132] = 438; + Big5PFreq[26][16] = 437; + Big5PFreq[43][155] = 436; + Big5PFreq[37][120] = 435; + Big5PFreq[15][159] = 434; + Big5PFreq[43][6] = 433; + Big5PFreq[45][188] = 432; + Big5PFreq[35][38] = 431; + Big5PFreq[39][143] = 430; + Big5PFreq[48][144] = 429; + Big5PFreq[37][168] = 428; + Big5PFreq[37][1] = 427; + Big5PFreq[36][109] = 426; + Big5PFreq[46][53] = 425; + Big5PFreq[38][54] = 424; + Big5PFreq[36][0] = 423; + Big5PFreq[72][33] = 422; + Big5PFreq[42][8] = 421; + Big5PFreq[36][31] = 420; + Big5PFreq[35][150] = 419; + Big5PFreq[118][93] = 418; + Big5PFreq[37][61] = 417; + Big5PFreq[0][85] = 416; + Big5PFreq[36][27] = 415; + Big5PFreq[35][134] = 414; + Big5PFreq[36][145] = 413; + Big5PFreq[6][96] = 412; + Big5PFreq[36][14] = 411; + Big5PFreq[16][36] = 410; + Big5PFreq[15][175] = 409; + Big5PFreq[35][10] = 408; + Big5PFreq[36][189] = 407; + Big5PFreq[35][51] = 406; + Big5PFreq[35][109] = 405; + Big5PFreq[35][147] = 404; + Big5PFreq[35][180] = 403; + Big5PFreq[72][5] = 402; + Big5PFreq[36][107] = 401; + Big5PFreq[49][116] = 400; + Big5PFreq[73][30] = 399; + Big5PFreq[6][90] = 398; + Big5PFreq[2][70] = 397; + Big5PFreq[17][141] = 396; + Big5PFreq[35][62] = 395; + Big5PFreq[16][180] = 394; + Big5PFreq[4][91] = 393; + Big5PFreq[15][171] = 392; + Big5PFreq[35][177] = 391; + Big5PFreq[37][173] = 390; + Big5PFreq[16][121] = 389; + Big5PFreq[35][5] = 388; + Big5PFreq[46][122] = 387; + Big5PFreq[40][138] = 386; + Big5PFreq[50][49] = 385; + Big5PFreq[36][152] = 384; + Big5PFreq[13][43] = 383; + Big5PFreq[9][88] = 382; + Big5PFreq[36][159] = 381; + Big5PFreq[27][62] = 380; + Big5PFreq[40][18] = 379; + Big5PFreq[17][129] = 378; + Big5PFreq[43][97] = 377; + Big5PFreq[13][131] = 376; + Big5PFreq[46][107] = 375; + Big5PFreq[60][64] = 374; + Big5PFreq[36][179] = 373; + Big5PFreq[37][55] = 372; + Big5PFreq[41][173] = 371; + Big5PFreq[44][172] = 370; + Big5PFreq[23][187] = 369; + Big5PFreq[36][149] = 368; + Big5PFreq[17][125] = 367; + Big5PFreq[55][180] = 366; + Big5PFreq[51][129] = 365; + Big5PFreq[36][51] = 364; + Big5PFreq[37][122] = 363; + Big5PFreq[48][32] = 362; + Big5PFreq[51][99] = 361; + Big5PFreq[54][16] = 360; + Big5PFreq[41][183] = 359; + Big5PFreq[37][179] = 358; + Big5PFreq[38][179] = 357; + Big5PFreq[35][143] = 356; + Big5PFreq[37][24] = 355; + Big5PFreq[40][177] = 354; + Big5PFreq[47][117] = 353; + Big5PFreq[39][52] = 352; + Big5PFreq[22][99] = 351; + Big5PFreq[40][142] = 350; + Big5PFreq[36][49] = 349; + Big5PFreq[38][17] = 348; + Big5PFreq[39][188] = 347; + Big5PFreq[36][186] = 346; + Big5PFreq[35][189] = 345; + Big5PFreq[41][7] = 344; + Big5PFreq[18][91] = 343; + Big5PFreq[43][137] = 342; + Big5PFreq[35][142] = 341; + Big5PFreq[35][117] = 340; + Big5PFreq[39][138] = 339; + Big5PFreq[16][59] = 338; + Big5PFreq[39][174] = 337; + Big5PFreq[55][145] = 336; + Big5PFreq[37][21] = 335; + Big5PFreq[36][180] = 334; + Big5PFreq[37][156] = 333; + Big5PFreq[49][13] = 332; + Big5PFreq[41][107] = 331; + Big5PFreq[36][56] = 330; + Big5PFreq[53][8] = 329; + Big5PFreq[22][114] = 328; + Big5PFreq[5][95] = 327; + Big5PFreq[37][0] = 326; + Big5PFreq[26][183] = 325; + Big5PFreq[22][66] = 324; + Big5PFreq[35][58] = 323; + Big5PFreq[48][117] = 322; + Big5PFreq[36][102] = 321; + Big5PFreq[22][122] = 320; + Big5PFreq[35][11] = 319; + Big5PFreq[46][19] = 318; + Big5PFreq[22][49] = 317; + Big5PFreq[48][166] = 316; + Big5PFreq[41][125] = 315; + Big5PFreq[41][1] = 314; + Big5PFreq[35][178] = 313; + Big5PFreq[41][12] = 312; + Big5PFreq[26][167] = 311; + Big5PFreq[42][152] = 310; + Big5PFreq[42][46] = 309; + Big5PFreq[42][151] = 308; + Big5PFreq[20][135] = 307; + Big5PFreq[37][162] = 306; + Big5PFreq[37][50] = 305; + Big5PFreq[22][185] = 304; + Big5PFreq[36][166] = 303; + Big5PFreq[19][40] = 302; + Big5PFreq[22][107] = 301; + Big5PFreq[22][102] = 300; + Big5PFreq[57][162] = 299; + Big5PFreq[22][124] = 298; + Big5PFreq[37][138] = 297; + Big5PFreq[37][25] = 296; + Big5PFreq[0][69] = 295; + Big5PFreq[43][172] = 294; + Big5PFreq[42][167] = 293; + Big5PFreq[35][120] = 292; + Big5PFreq[41][128] = 291; + Big5PFreq[2][88] = 290; + Big5PFreq[20][123] = 289; + Big5PFreq[35][123] = 288; + Big5PFreq[36][28] = 287; + Big5PFreq[42][188] = 286; + Big5PFreq[42][164] = 285; + Big5PFreq[42][4] = 284; + Big5PFreq[43][57] = 283; + Big5PFreq[39][3] = 282; + Big5PFreq[42][3] = 281; + Big5PFreq[57][158] = 280; + Big5PFreq[35][146] = 279; + Big5PFreq[24][54] = 278; + Big5PFreq[13][110] = 277; + Big5PFreq[23][132] = 276; + Big5PFreq[26][102] = 275; + Big5PFreq[55][178] = 274; + Big5PFreq[17][117] = 273; + Big5PFreq[41][161] = 272; + Big5PFreq[38][150] = 271; + Big5PFreq[10][71] = 270; + Big5PFreq[47][60] = 269; + Big5PFreq[16][114] = 268; + Big5PFreq[21][47] = 267; + Big5PFreq[39][101] = 266; + Big5PFreq[18][45] = 265; + Big5PFreq[40][121] = 264; + Big5PFreq[45][41] = 263; + Big5PFreq[22][167] = 262; + Big5PFreq[26][149] = 261; + Big5PFreq[15][189] = 260; + Big5PFreq[41][177] = 259; + Big5PFreq[46][36] = 258; + Big5PFreq[20][40] = 257; + Big5PFreq[41][54] = 256; + Big5PFreq[3][87] = 255; + Big5PFreq[40][16] = 254; + Big5PFreq[42][15] = 253; + Big5PFreq[11][83] = 252; + Big5PFreq[0][94] = 251; + Big5PFreq[122][81] = 250; + Big5PFreq[41][26] = 249; + Big5PFreq[36][34] = 248; + Big5PFreq[44][148] = 247; + Big5PFreq[35][3] = 246; + Big5PFreq[36][114] = 245; + Big5PFreq[42][112] = 244; + Big5PFreq[35][183] = 243; + Big5PFreq[49][73] = 242; + Big5PFreq[39][2] = 241; + Big5PFreq[38][121] = 240; + Big5PFreq[44][114] = 239; + Big5PFreq[49][32] = 238; + Big5PFreq[1][65] = 237; + Big5PFreq[38][25] = 236; + Big5PFreq[39][4] = 235; + Big5PFreq[42][62] = 234; + Big5PFreq[35][40] = 233; + Big5PFreq[24][2] = 232; + Big5PFreq[53][49] = 231; + Big5PFreq[41][133] = 230; + Big5PFreq[43][134] = 229; + Big5PFreq[3][83] = 228; + Big5PFreq[38][158] = 227; + Big5PFreq[24][17] = 226; + Big5PFreq[52][59] = 225; + Big5PFreq[38][41] = 224; + Big5PFreq[37][127] = 223; + Big5PFreq[22][175] = 222; + Big5PFreq[44][30] = 221; + Big5PFreq[47][178] = 220; + Big5PFreq[43][99] = 219; + Big5PFreq[19][4] = 218; + Big5PFreq[37][97] = 217; + Big5PFreq[38][181] = 216; + Big5PFreq[45][103] = 215; + Big5PFreq[1][86] = 214; + Big5PFreq[40][15] = 213; + Big5PFreq[22][136] = 212; + Big5PFreq[75][165] = 211; + Big5PFreq[36][15] = 210; + Big5PFreq[46][80] = 209; + Big5PFreq[59][55] = 208; + Big5PFreq[37][108] = 207; + Big5PFreq[21][109] = 206; + Big5PFreq[24][165] = 205; + Big5PFreq[79][158] = 204; + Big5PFreq[44][139] = 203; + Big5PFreq[36][124] = 202; + Big5PFreq[42][185] = 201; + Big5PFreq[39][186] = 200; + Big5PFreq[22][128] = 199; + Big5PFreq[40][44] = 198; + Big5PFreq[41][105] = 197; + Big5PFreq[1][70] = 196; + Big5PFreq[1][68] = 195; + Big5PFreq[53][22] = 194; + Big5PFreq[36][54] = 193; + Big5PFreq[47][147] = 192; + Big5PFreq[35][36] = 191; + Big5PFreq[35][185] = 190; + Big5PFreq[45][37] = 189; + Big5PFreq[43][163] = 188; + Big5PFreq[56][115] = 187; + Big5PFreq[38][164] = 186; + Big5PFreq[35][141] = 185; + Big5PFreq[42][132] = 184; + Big5PFreq[46][120] = 183; + Big5PFreq[69][142] = 182; + Big5PFreq[38][175] = 181; + Big5PFreq[22][112] = 180; + Big5PFreq[38][142] = 179; + Big5PFreq[40][37] = 178; + Big5PFreq[37][109] = 177; + Big5PFreq[40][144] = 176; + Big5PFreq[44][117] = 175; + Big5PFreq[35][181] = 174; + Big5PFreq[26][105] = 173; + Big5PFreq[16][48] = 172; + Big5PFreq[44][122] = 171; + Big5PFreq[12][86] = 170; + Big5PFreq[84][53] = 169; + Big5PFreq[17][44] = 168; + Big5PFreq[59][54] = 167; + Big5PFreq[36][98] = 166; + Big5PFreq[45][115] = 165; + Big5PFreq[73][9] = 164; + Big5PFreq[44][123] = 163; + Big5PFreq[37][188] = 162; + Big5PFreq[51][117] = 161; + Big5PFreq[15][156] = 160; + Big5PFreq[36][155] = 159; + Big5PFreq[44][25] = 158; + Big5PFreq[38][12] = 157; + Big5PFreq[38][140] = 156; + Big5PFreq[23][4] = 155; + Big5PFreq[45][149] = 154; + Big5PFreq[22][189] = 153; + Big5PFreq[38][147] = 152; + Big5PFreq[27][5] = 151; + Big5PFreq[22][42] = 150; + Big5PFreq[3][68] = 149; + Big5PFreq[39][51] = 148; + Big5PFreq[36][29] = 147; + Big5PFreq[20][108] = 146; + Big5PFreq[50][57] = 145; + Big5PFreq[55][104] = 144; + Big5PFreq[22][46] = 143; + Big5PFreq[18][164] = 142; + Big5PFreq[50][159] = 141; + Big5PFreq[85][131] = 140; + Big5PFreq[26][79] = 139; + Big5PFreq[38][100] = 138; + Big5PFreq[53][112] = 137; + Big5PFreq[20][190] = 136; + Big5PFreq[14][69] = 135; + Big5PFreq[23][11] = 134; + Big5PFreq[40][114] = 133; + Big5PFreq[40][148] = 132; + Big5PFreq[53][130] = 131; + Big5PFreq[36][2] = 130; + Big5PFreq[66][82] = 129; + Big5PFreq[45][166] = 128; + Big5PFreq[4][88] = 127; + Big5PFreq[16][57] = 126; + Big5PFreq[22][116] = 125; + Big5PFreq[36][108] = 124; + Big5PFreq[13][48] = 123; + Big5PFreq[54][12] = 122; + Big5PFreq[40][136] = 121; + Big5PFreq[36][128] = 120; + Big5PFreq[23][6] = 119; + Big5PFreq[38][125] = 118; + Big5PFreq[45][154] = 117; + Big5PFreq[51][127] = 116; + Big5PFreq[44][163] = 115; + Big5PFreq[16][173] = 114; + Big5PFreq[43][49] = 113; + Big5PFreq[20][112] = 112; + Big5PFreq[15][168] = 111; + Big5PFreq[35][129] = 110; + Big5PFreq[20][45] = 109; + Big5PFreq[38][10] = 108; + Big5PFreq[57][171] = 107; + Big5PFreq[44][190] = 106; + Big5PFreq[40][56] = 105; + Big5PFreq[36][156] = 104; + Big5PFreq[3][88] = 103; + Big5PFreq[50][122] = 102; + Big5PFreq[36][7] = 101; + Big5PFreq[39][43] = 100; + Big5PFreq[15][166] = 99; + Big5PFreq[42][136] = 98; + Big5PFreq[22][131] = 97; + Big5PFreq[44][23] = 96; + Big5PFreq[54][147] = 95; + Big5PFreq[41][32] = 94; + Big5PFreq[23][121] = 93; + Big5PFreq[39][108] = 92; + Big5PFreq[2][78] = 91; + Big5PFreq[40][155] = 90; + Big5PFreq[55][51] = 89; + Big5PFreq[19][34] = 88; + Big5PFreq[48][128] = 87; + Big5PFreq[48][159] = 86; + Big5PFreq[20][70] = 85; + Big5PFreq[34][71] = 84; + Big5PFreq[16][31] = 83; + Big5PFreq[42][157] = 82; + Big5PFreq[20][44] = 81; + Big5PFreq[11][92] = 80; + Big5PFreq[44][180] = 79; + Big5PFreq[84][33] = 78; + Big5PFreq[16][116] = 77; + Big5PFreq[61][163] = 76; + Big5PFreq[35][164] = 75; + Big5PFreq[36][42] = 74; + Big5PFreq[13][40] = 73; + Big5PFreq[43][176] = 72; + Big5PFreq[2][66] = 71; + Big5PFreq[20][133] = 70; + Big5PFreq[36][65] = 69; + Big5PFreq[38][33] = 68; + Big5PFreq[12][91] = 67; + Big5PFreq[36][26] = 66; + Big5PFreq[15][174] = 65; + Big5PFreq[77][32] = 64; + Big5PFreq[16][1] = 63; + Big5PFreq[25][86] = 62; + Big5PFreq[17][13] = 61; + Big5PFreq[5][75] = 60; + Big5PFreq[36][52] = 59; + Big5PFreq[51][164] = 58; + Big5PFreq[12][85] = 57; + Big5PFreq[39][168] = 56; + Big5PFreq[43][16] = 55; + Big5PFreq[40][69] = 54; + Big5PFreq[26][108] = 53; + Big5PFreq[51][56] = 52; + Big5PFreq[16][37] = 51; + Big5PFreq[40][29] = 50; + Big5PFreq[46][171] = 49; + Big5PFreq[40][128] = 48; + Big5PFreq[72][114] = 47; + Big5PFreq[21][103] = 46; + Big5PFreq[22][44] = 45; + Big5PFreq[40][115] = 44; + Big5PFreq[43][7] = 43; + Big5PFreq[43][153] = 42; + Big5PFreq[17][20] = 41; + Big5PFreq[16][49] = 40; + Big5PFreq[36][57] = 39; + Big5PFreq[18][38] = 38; + Big5PFreq[45][184] = 37; + Big5PFreq[37][167] = 36; + Big5PFreq[26][106] = 35; + Big5PFreq[61][121] = 34; + Big5PFreq[89][140] = 33; + Big5PFreq[46][61] = 32; + Big5PFreq[39][163] = 31; + Big5PFreq[40][62] = 30; + Big5PFreq[38][165] = 29; + Big5PFreq[47][37] = 28; + Big5PFreq[18][155] = 27; + Big5PFreq[20][33] = 26; + Big5PFreq[29][90] = 25; + Big5PFreq[20][103] = 24; + Big5PFreq[37][51] = 23; + Big5PFreq[57][0] = 22; + Big5PFreq[40][31] = 21; + Big5PFreq[45][32] = 20; + Big5PFreq[59][23] = 19; + Big5PFreq[18][47] = 18; + Big5PFreq[45][134] = 17; + Big5PFreq[37][59] = 16; + Big5PFreq[21][128] = 15; + Big5PFreq[36][106] = 14; + Big5PFreq[31][39] = 13; + Big5PFreq[40][182] = 12; + Big5PFreq[52][155] = 11; + Big5PFreq[42][166] = 10; + Big5PFreq[35][27] = 9; + Big5PFreq[38][3] = 8; + Big5PFreq[13][44] = 7; + Big5PFreq[58][157] = 6; + Big5PFreq[47][51] = 5; + Big5PFreq[41][37] = 4; + Big5PFreq[41][172] = 3; + Big5PFreq[51][165] = 2; + Big5PFreq[15][161] = 1; + Big5PFreq[24][181] = 0; + EUC_TWFreq[48][49] = 599; + EUC_TWFreq[35][65] = 598; + EUC_TWFreq[41][27] = 597; + EUC_TWFreq[35][0] = 596; + EUC_TWFreq[39][19] = 595; + EUC_TWFreq[35][42] = 594; + EUC_TWFreq[38][66] = 593; + EUC_TWFreq[35][8] = 592; + EUC_TWFreq[35][6] = 591; + EUC_TWFreq[35][66] = 590; + EUC_TWFreq[43][14] = 589; + EUC_TWFreq[69][80] = 588; + EUC_TWFreq[50][48] = 587; + EUC_TWFreq[36][71] = 586; + EUC_TWFreq[37][10] = 585; + EUC_TWFreq[60][52] = 584; + EUC_TWFreq[51][21] = 583; + EUC_TWFreq[40][2] = 582; + EUC_TWFreq[67][35] = 581; + EUC_TWFreq[38][78] = 580; + EUC_TWFreq[49][18] = 579; + EUC_TWFreq[35][23] = 578; + EUC_TWFreq[42][83] = 577; + EUC_TWFreq[79][47] = 576; + EUC_TWFreq[61][82] = 575; + EUC_TWFreq[38][7] = 574; + EUC_TWFreq[35][29] = 573; + EUC_TWFreq[37][77] = 572; + EUC_TWFreq[54][67] = 571; + EUC_TWFreq[38][80] = 570; + EUC_TWFreq[52][74] = 569; + EUC_TWFreq[36][37] = 568; + EUC_TWFreq[74][8] = 567; + EUC_TWFreq[41][83] = 566; + EUC_TWFreq[36][75] = 565; + EUC_TWFreq[49][63] = 564; + EUC_TWFreq[42][58] = 563; + EUC_TWFreq[56][33] = 562; + EUC_TWFreq[37][76] = 561; + EUC_TWFreq[62][39] = 560; + EUC_TWFreq[35][21] = 559; + EUC_TWFreq[70][19] = 558; + EUC_TWFreq[77][88] = 557; + EUC_TWFreq[51][14] = 556; + EUC_TWFreq[36][17] = 555; + EUC_TWFreq[44][51] = 554; + EUC_TWFreq[38][72] = 553; + EUC_TWFreq[74][90] = 552; + EUC_TWFreq[35][48] = 551; + EUC_TWFreq[35][69] = 550; + EUC_TWFreq[66][86] = 549; + EUC_TWFreq[57][20] = 548; + EUC_TWFreq[35][53] = 547; + EUC_TWFreq[36][87] = 546; + EUC_TWFreq[84][67] = 545; + EUC_TWFreq[70][56] = 544; + EUC_TWFreq[71][54] = 543; + EUC_TWFreq[60][70] = 542; + EUC_TWFreq[80][1] = 541; + EUC_TWFreq[39][59] = 540; + EUC_TWFreq[39][51] = 539; + EUC_TWFreq[35][44] = 538; + EUC_TWFreq[48][4] = 537; + EUC_TWFreq[55][24] = 536; + EUC_TWFreq[52][4] = 535; + EUC_TWFreq[54][26] = 534; + EUC_TWFreq[36][31] = 533; + EUC_TWFreq[37][22] = 532; + EUC_TWFreq[37][9] = 531; + EUC_TWFreq[46][0] = 530; + EUC_TWFreq[56][46] = 529; + EUC_TWFreq[47][93] = 528; + EUC_TWFreq[37][25] = 527; + EUC_TWFreq[39][8] = 526; + EUC_TWFreq[46][73] = 525; + EUC_TWFreq[38][48] = 524; + EUC_TWFreq[39][83] = 523; + EUC_TWFreq[60][92] = 522; + EUC_TWFreq[70][11] = 521; + EUC_TWFreq[63][84] = 520; + EUC_TWFreq[38][65] = 519; + EUC_TWFreq[45][45] = 518; + EUC_TWFreq[63][49] = 517; + EUC_TWFreq[63][50] = 516; + EUC_TWFreq[39][93] = 515; + EUC_TWFreq[68][20] = 514; + EUC_TWFreq[44][84] = 513; + EUC_TWFreq[66][34] = 512; + EUC_TWFreq[37][58] = 511; + EUC_TWFreq[39][0] = 510; + EUC_TWFreq[59][1] = 509; + EUC_TWFreq[47][8] = 508; + EUC_TWFreq[61][17] = 507; + EUC_TWFreq[53][87] = 506; + EUC_TWFreq[67][26] = 505; + EUC_TWFreq[43][46] = 504; + EUC_TWFreq[38][61] = 503; + EUC_TWFreq[45][9] = 502; + EUC_TWFreq[66][83] = 501; + EUC_TWFreq[43][88] = 500; + EUC_TWFreq[85][20] = 499; + EUC_TWFreq[57][36] = 498; + EUC_TWFreq[43][6] = 497; + EUC_TWFreq[86][77] = 496; + EUC_TWFreq[42][70] = 495; + EUC_TWFreq[49][78] = 494; + EUC_TWFreq[36][40] = 493; + EUC_TWFreq[42][71] = 492; + EUC_TWFreq[58][49] = 491; + EUC_TWFreq[35][20] = 490; + EUC_TWFreq[76][20] = 489; + EUC_TWFreq[39][25] = 488; + EUC_TWFreq[40][34] = 487; + EUC_TWFreq[39][76] = 486; + EUC_TWFreq[40][1] = 485; + EUC_TWFreq[59][0] = 484; + EUC_TWFreq[39][70] = 483; + EUC_TWFreq[46][14] = 482; + EUC_TWFreq[68][77] = 481; + EUC_TWFreq[38][55] = 480; + EUC_TWFreq[35][78] = 479; + EUC_TWFreq[84][44] = 478; + EUC_TWFreq[36][41] = 477; + EUC_TWFreq[37][62] = 476; + EUC_TWFreq[65][67] = 475; + EUC_TWFreq[69][66] = 474; + EUC_TWFreq[73][55] = 473; + EUC_TWFreq[71][49] = 472; + EUC_TWFreq[66][87] = 471; + EUC_TWFreq[38][33] = 470; + EUC_TWFreq[64][61] = 469; + EUC_TWFreq[35][7] = 468; + EUC_TWFreq[47][49] = 467; + EUC_TWFreq[56][14] = 466; + EUC_TWFreq[36][49] = 465; + EUC_TWFreq[50][81] = 464; + EUC_TWFreq[55][76] = 463; + EUC_TWFreq[35][19] = 462; + EUC_TWFreq[44][47] = 461; + EUC_TWFreq[35][15] = 460; + EUC_TWFreq[82][59] = 459; + EUC_TWFreq[35][43] = 458; + EUC_TWFreq[73][0] = 457; + EUC_TWFreq[57][83] = 456; + EUC_TWFreq[42][46] = 455; + EUC_TWFreq[36][0] = 454; + EUC_TWFreq[70][88] = 453; + EUC_TWFreq[42][22] = 452; + EUC_TWFreq[46][58] = 451; + EUC_TWFreq[36][34] = 450; + EUC_TWFreq[39][24] = 449; + EUC_TWFreq[35][55] = 448; + EUC_TWFreq[44][91] = 447; + EUC_TWFreq[37][51] = 446; + EUC_TWFreq[36][19] = 445; + EUC_TWFreq[69][90] = 444; + EUC_TWFreq[55][35] = 443; + EUC_TWFreq[35][54] = 442; + EUC_TWFreq[49][61] = 441; + EUC_TWFreq[36][67] = 440; + EUC_TWFreq[88][34] = 439; + EUC_TWFreq[35][17] = 438; + EUC_TWFreq[65][69] = 437; + EUC_TWFreq[74][89] = 436; + EUC_TWFreq[37][31] = 435; + EUC_TWFreq[43][48] = 434; + EUC_TWFreq[89][27] = 433; + EUC_TWFreq[42][79] = 432; + EUC_TWFreq[69][57] = 431; + EUC_TWFreq[36][13] = 430; + EUC_TWFreq[35][62] = 429; + EUC_TWFreq[65][47] = 428; + EUC_TWFreq[56][8] = 427; + EUC_TWFreq[38][79] = 426; + EUC_TWFreq[37][64] = 425; + EUC_TWFreq[64][64] = 424; + EUC_TWFreq[38][53] = 423; + EUC_TWFreq[38][31] = 422; + EUC_TWFreq[56][81] = 421; + EUC_TWFreq[36][22] = 420; + EUC_TWFreq[43][4] = 419; + EUC_TWFreq[36][90] = 418; + EUC_TWFreq[38][62] = 417; + EUC_TWFreq[66][85] = 416; + EUC_TWFreq[39][1] = 415; + EUC_TWFreq[59][40] = 414; + EUC_TWFreq[58][93] = 413; + EUC_TWFreq[44][43] = 412; + EUC_TWFreq[39][49] = 411; + EUC_TWFreq[64][2] = 410; + EUC_TWFreq[41][35] = 409; + EUC_TWFreq[60][22] = 408; + EUC_TWFreq[35][91] = 407; + EUC_TWFreq[78][1] = 406; + EUC_TWFreq[36][14] = 405; + EUC_TWFreq[82][29] = 404; + EUC_TWFreq[52][86] = 403; + EUC_TWFreq[40][16] = 402; + EUC_TWFreq[91][52] = 401; + EUC_TWFreq[50][75] = 400; + EUC_TWFreq[64][30] = 399; + EUC_TWFreq[90][78] = 398; + EUC_TWFreq[36][52] = 397; + EUC_TWFreq[55][87] = 396; + EUC_TWFreq[57][5] = 395; + EUC_TWFreq[57][31] = 394; + EUC_TWFreq[42][35] = 393; + EUC_TWFreq[69][50] = 392; + EUC_TWFreq[45][8] = 391; + EUC_TWFreq[50][87] = 390; + EUC_TWFreq[69][55] = 389; + EUC_TWFreq[92][3] = 388; + EUC_TWFreq[36][43] = 387; + EUC_TWFreq[64][10] = 386; + EUC_TWFreq[56][25] = 385; + EUC_TWFreq[60][68] = 384; + EUC_TWFreq[51][46] = 383; + EUC_TWFreq[50][0] = 382; + EUC_TWFreq[38][30] = 381; + EUC_TWFreq[50][85] = 380; + EUC_TWFreq[60][54] = 379; + EUC_TWFreq[73][6] = 378; + EUC_TWFreq[73][28] = 377; + EUC_TWFreq[56][19] = 376; + EUC_TWFreq[62][69] = 375; + EUC_TWFreq[81][66] = 374; + EUC_TWFreq[40][32] = 373; + EUC_TWFreq[76][31] = 372; + EUC_TWFreq[35][10] = 371; + EUC_TWFreq[41][37] = 370; + EUC_TWFreq[52][82] = 369; + EUC_TWFreq[91][72] = 368; + EUC_TWFreq[37][29] = 367; + EUC_TWFreq[56][30] = 366; + EUC_TWFreq[37][80] = 365; + EUC_TWFreq[81][56] = 364; + EUC_TWFreq[70][3] = 363; + EUC_TWFreq[76][15] = 362; + EUC_TWFreq[46][47] = 361; + EUC_TWFreq[35][88] = 360; + EUC_TWFreq[61][58] = 359; + EUC_TWFreq[37][37] = 358; + EUC_TWFreq[57][22] = 357; + EUC_TWFreq[41][23] = 356; + EUC_TWFreq[90][66] = 355; + EUC_TWFreq[39][60] = 354; + EUC_TWFreq[38][0] = 353; + EUC_TWFreq[37][87] = 352; + EUC_TWFreq[46][2] = 351; + EUC_TWFreq[38][56] = 350; + EUC_TWFreq[58][11] = 349; + EUC_TWFreq[48][10] = 348; + EUC_TWFreq[74][4] = 347; + EUC_TWFreq[40][42] = 346; + EUC_TWFreq[41][52] = 345; + EUC_TWFreq[61][92] = 344; + EUC_TWFreq[39][50] = 343; + EUC_TWFreq[47][88] = 342; + EUC_TWFreq[88][36] = 341; + EUC_TWFreq[45][73] = 340; + EUC_TWFreq[82][3] = 339; + EUC_TWFreq[61][36] = 338; + EUC_TWFreq[60][33] = 337; + EUC_TWFreq[38][27] = 336; + EUC_TWFreq[35][83] = 335; + EUC_TWFreq[65][24] = 334; + EUC_TWFreq[73][10] = 333; + EUC_TWFreq[41][13] = 332; + EUC_TWFreq[50][27] = 331; + EUC_TWFreq[59][50] = 330; + EUC_TWFreq[42][45] = 329; + EUC_TWFreq[55][19] = 328; + EUC_TWFreq[36][77] = 327; + EUC_TWFreq[69][31] = 326; + EUC_TWFreq[60][7] = 325; + EUC_TWFreq[40][88] = 324; + EUC_TWFreq[57][56] = 323; + EUC_TWFreq[50][50] = 322; + EUC_TWFreq[42][37] = 321; + EUC_TWFreq[38][82] = 320; + EUC_TWFreq[52][25] = 319; + EUC_TWFreq[42][67] = 318; + EUC_TWFreq[48][40] = 317; + EUC_TWFreq[45][81] = 316; + EUC_TWFreq[57][14] = 315; + EUC_TWFreq[42][13] = 314; + EUC_TWFreq[78][0] = 313; + EUC_TWFreq[35][51] = 312; + EUC_TWFreq[41][67] = 311; + EUC_TWFreq[64][23] = 310; + EUC_TWFreq[36][65] = 309; + EUC_TWFreq[48][50] = 308; + EUC_TWFreq[46][69] = 307; + EUC_TWFreq[47][89] = 306; + EUC_TWFreq[41][48] = 305; + EUC_TWFreq[60][56] = 304; + EUC_TWFreq[44][82] = 303; + EUC_TWFreq[47][35] = 302; + EUC_TWFreq[49][3] = 301; + EUC_TWFreq[49][69] = 300; + EUC_TWFreq[45][93] = 299; + EUC_TWFreq[60][34] = 298; + EUC_TWFreq[60][82] = 297; + EUC_TWFreq[61][61] = 296; + EUC_TWFreq[86][42] = 295; + EUC_TWFreq[89][60] = 294; + EUC_TWFreq[48][31] = 293; + EUC_TWFreq[35][75] = 292; + EUC_TWFreq[91][39] = 291; + EUC_TWFreq[53][19] = 290; + EUC_TWFreq[39][72] = 289; + EUC_TWFreq[69][59] = 288; + EUC_TWFreq[41][7] = 287; + EUC_TWFreq[54][13] = 286; + EUC_TWFreq[43][28] = 285; + EUC_TWFreq[36][6] = 284; + EUC_TWFreq[45][75] = 283; + EUC_TWFreq[36][61] = 282; + EUC_TWFreq[38][21] = 281; + EUC_TWFreq[45][14] = 280; + EUC_TWFreq[61][43] = 279; + EUC_TWFreq[36][63] = 278; + EUC_TWFreq[43][30] = 277; + EUC_TWFreq[46][51] = 276; + EUC_TWFreq[68][87] = 275; + EUC_TWFreq[39][26] = 274; + EUC_TWFreq[46][76] = 273; + EUC_TWFreq[36][15] = 272; + EUC_TWFreq[35][40] = 271; + EUC_TWFreq[79][60] = 270; + EUC_TWFreq[46][7] = 269; + EUC_TWFreq[65][72] = 268; + EUC_TWFreq[69][88] = 267; + EUC_TWFreq[47][18] = 266; + EUC_TWFreq[37][0] = 265; + EUC_TWFreq[37][49] = 264; + EUC_TWFreq[67][37] = 263; + EUC_TWFreq[36][91] = 262; + EUC_TWFreq[75][48] = 261; + EUC_TWFreq[75][63] = 260; + EUC_TWFreq[83][87] = 259; + EUC_TWFreq[37][44] = 258; + EUC_TWFreq[73][54] = 257; + EUC_TWFreq[51][61] = 256; + EUC_TWFreq[46][57] = 255; + EUC_TWFreq[55][21] = 254; + EUC_TWFreq[39][66] = 253; + EUC_TWFreq[47][11] = 252; + EUC_TWFreq[52][8] = 251; + EUC_TWFreq[82][81] = 250; + EUC_TWFreq[36][57] = 249; + EUC_TWFreq[38][54] = 248; + EUC_TWFreq[43][81] = 247; + EUC_TWFreq[37][42] = 246; + EUC_TWFreq[40][18] = 245; + EUC_TWFreq[80][90] = 244; + EUC_TWFreq[37][84] = 243; + EUC_TWFreq[57][15] = 242; + EUC_TWFreq[38][87] = 241; + EUC_TWFreq[37][32] = 240; + EUC_TWFreq[53][53] = 239; + EUC_TWFreq[89][29] = 238; + EUC_TWFreq[81][53] = 237; + EUC_TWFreq[75][3] = 236; + EUC_TWFreq[83][73] = 235; + EUC_TWFreq[66][13] = 234; + EUC_TWFreq[48][7] = 233; + EUC_TWFreq[46][35] = 232; + EUC_TWFreq[35][86] = 231; + EUC_TWFreq[37][20] = 230; + EUC_TWFreq[46][80] = 229; + EUC_TWFreq[38][24] = 228; + EUC_TWFreq[41][68] = 227; + EUC_TWFreq[42][21] = 226; + EUC_TWFreq[43][32] = 225; + EUC_TWFreq[38][20] = 224; + EUC_TWFreq[37][59] = 223; + EUC_TWFreq[41][77] = 222; + EUC_TWFreq[59][57] = 221; + EUC_TWFreq[68][59] = 220; + EUC_TWFreq[39][43] = 219; + EUC_TWFreq[54][39] = 218; + EUC_TWFreq[48][28] = 217; + EUC_TWFreq[54][28] = 216; + EUC_TWFreq[41][44] = 215; + EUC_TWFreq[51][64] = 214; + EUC_TWFreq[47][72] = 213; + EUC_TWFreq[62][67] = 212; + EUC_TWFreq[42][43] = 211; + EUC_TWFreq[61][38] = 210; + EUC_TWFreq[76][25] = 209; + EUC_TWFreq[48][91] = 208; + EUC_TWFreq[36][36] = 207; + EUC_TWFreq[80][32] = 206; + EUC_TWFreq[81][40] = 205; + EUC_TWFreq[37][5] = 204; + EUC_TWFreq[74][69] = 203; + EUC_TWFreq[36][82] = 202; + EUC_TWFreq[46][59] = 201; + /* + * EUC_TWFreq[38][32] = 200; EUC_TWFreq[74][2] = 199; EUC_TWFreq[53][31] = 198; EUC_TWFreq[35][38] = 197; EUC_TWFreq[46][62] = + * 196; EUC_TWFreq[77][31] = 195; EUC_TWFreq[55][74] = 194; EUC_TWFreq[66][6] = 193; EUC_TWFreq[56][21] = 192; + * EUC_TWFreq[54][78] = 191; EUC_TWFreq[43][51] = 190; EUC_TWFreq[64][93] = 189; EUC_TWFreq[92][7] = 188; EUC_TWFreq[83][89] = + * 187; EUC_TWFreq[69][9] = 186; EUC_TWFreq[45][4] = 185; EUC_TWFreq[53][9] = 184; EUC_TWFreq[43][2] = 183; + * EUC_TWFreq[35][11] = 182; EUC_TWFreq[51][25] = 181; EUC_TWFreq[52][71] = 180; EUC_TWFreq[81][67] = 179; + * EUC_TWFreq[37][33] = 178; EUC_TWFreq[38][57] = 177; EUC_TWFreq[39][77] = 176; EUC_TWFreq[40][26] = 175; + * EUC_TWFreq[37][21] = 174; EUC_TWFreq[81][70] = 173; EUC_TWFreq[56][80] = 172; EUC_TWFreq[65][14] = 171; + * EUC_TWFreq[62][47] = 170; EUC_TWFreq[56][54] = 169; EUC_TWFreq[45][17] = 168; EUC_TWFreq[52][52] = 167; + * EUC_TWFreq[74][30] = 166; EUC_TWFreq[60][57] = 165; EUC_TWFreq[41][15] = 164; EUC_TWFreq[47][69] = 163; + * EUC_TWFreq[61][11] = 162; EUC_TWFreq[72][25] = 161; EUC_TWFreq[82][56] = 160; EUC_TWFreq[76][92] = 159; + * EUC_TWFreq[51][22] = 158; EUC_TWFreq[55][69] = 157; EUC_TWFreq[49][43] = 156; EUC_TWFreq[69][49] = 155; + * EUC_TWFreq[88][42] = 154; EUC_TWFreq[84][41] = 153; EUC_TWFreq[79][33] = 152; EUC_TWFreq[47][17] = 151; + * EUC_TWFreq[52][88] = 150; EUC_TWFreq[63][74] = 149; EUC_TWFreq[50][32] = 148; EUC_TWFreq[65][10] = 147; EUC_TWFreq[57][6] = + * 146; EUC_TWFreq[52][23] = 145; EUC_TWFreq[36][70] = 144; EUC_TWFreq[65][55] = 143; EUC_TWFreq[35][27] = 142; + * EUC_TWFreq[57][63] = 141; EUC_TWFreq[39][92] = 140; EUC_TWFreq[79][75] = 139; EUC_TWFreq[36][30] = 138; + * EUC_TWFreq[53][60] = 137; EUC_TWFreq[55][43] = 136; EUC_TWFreq[71][22] = 135; EUC_TWFreq[43][16] = 134; + * EUC_TWFreq[65][21] = 133; EUC_TWFreq[84][51] = 132; EUC_TWFreq[43][64] = 131; EUC_TWFreq[87][91] = 130; + * EUC_TWFreq[47][45] = 129; EUC_TWFreq[65][29] = 128; EUC_TWFreq[88][16] = 127; EUC_TWFreq[50][5] = 126; EUC_TWFreq[47][33] = + * 125; EUC_TWFreq[46][27] = 124; EUC_TWFreq[85][2] = 123; EUC_TWFreq[43][77] = 122; EUC_TWFreq[70][9] = 121; + * EUC_TWFreq[41][54] = 120; EUC_TWFreq[56][12] = 119; EUC_TWFreq[90][65] = 118; EUC_TWFreq[91][50] = 117; + * EUC_TWFreq[48][41] = 116; EUC_TWFreq[35][89] = 115; EUC_TWFreq[90][83] = 114; EUC_TWFreq[44][40] = 113; + * EUC_TWFreq[50][88] = 112; EUC_TWFreq[72][39] = 111; EUC_TWFreq[45][3] = 110; EUC_TWFreq[71][33] = 109; EUC_TWFreq[39][12] = + * 108; EUC_TWFreq[59][24] = 107; EUC_TWFreq[60][62] = 106; EUC_TWFreq[44][33] = 105; EUC_TWFreq[53][70] = 104; + * EUC_TWFreq[77][90] = 103; EUC_TWFreq[50][58] = 102; EUC_TWFreq[54][1] = 101; EUC_TWFreq[73][19] = 100; EUC_TWFreq[37][3] = + * 99; EUC_TWFreq[49][91] = 98; EUC_TWFreq[88][43] = 97; EUC_TWFreq[36][78] = 96; EUC_TWFreq[44][20] = 95; + * EUC_TWFreq[64][15] = 94; EUC_TWFreq[72][28] = 93; EUC_TWFreq[70][13] = 92; EUC_TWFreq[65][83] = 91; EUC_TWFreq[58][68] = + * 90; EUC_TWFreq[59][32] = 89; EUC_TWFreq[39][13] = 88; EUC_TWFreq[55][64] = 87; EUC_TWFreq[56][59] = 86; + * EUC_TWFreq[39][17] = 85; EUC_TWFreq[55][84] = 84; EUC_TWFreq[77][85] = 83; EUC_TWFreq[60][19] = 82; EUC_TWFreq[62][82] = + * 81; EUC_TWFreq[78][16] = 80; EUC_TWFreq[66][8] = 79; EUC_TWFreq[39][42] = 78; EUC_TWFreq[61][24] = 77; EUC_TWFreq[57][67] = + * 76; EUC_TWFreq[38][83] = 75; EUC_TWFreq[36][53] = 74; EUC_TWFreq[67][76] = 73; EUC_TWFreq[37][91] = 72; + * EUC_TWFreq[44][26] = 71; EUC_TWFreq[72][86] = 70; EUC_TWFreq[44][87] = 69; EUC_TWFreq[45][50] = 68; EUC_TWFreq[58][4] = + * 67; EUC_TWFreq[86][65] = 66; EUC_TWFreq[45][56] = 65; EUC_TWFreq[79][49] = 64; EUC_TWFreq[35][3] = 63; EUC_TWFreq[48][83] = + * 62; EUC_TWFreq[71][21] = 61; EUC_TWFreq[77][93] = 60; EUC_TWFreq[87][92] = 59; EUC_TWFreq[38][35] = 58; + * EUC_TWFreq[66][17] = 57; EUC_TWFreq[37][66] = 56; EUC_TWFreq[51][42] = 55; EUC_TWFreq[57][73] = 54; EUC_TWFreq[51][54] = + * 53; EUC_TWFreq[75][64] = 52; EUC_TWFreq[35][5] = 51; EUC_TWFreq[49][40] = 50; EUC_TWFreq[58][35] = 49; EUC_TWFreq[67][88] = + * 48; EUC_TWFreq[60][51] = 47; EUC_TWFreq[36][92] = 46; EUC_TWFreq[44][41] = 45; EUC_TWFreq[58][29] = 44; + * EUC_TWFreq[43][62] = 43; EUC_TWFreq[56][23] = 42; EUC_TWFreq[67][44] = 41; EUC_TWFreq[52][91] = 40; EUC_TWFreq[42][81] = + * 39; EUC_TWFreq[64][25] = 38; EUC_TWFreq[35][36] = 37; EUC_TWFreq[47][73] = 36; EUC_TWFreq[36][1] = 35; EUC_TWFreq[65][84] = + * 34; EUC_TWFreq[73][1] = 33; EUC_TWFreq[79][66] = 32; EUC_TWFreq[69][14] = 31; EUC_TWFreq[65][28] = 30; EUC_TWFreq[60][93] = + * 29; EUC_TWFreq[72][79] = 28; EUC_TWFreq[48][0] = 27; EUC_TWFreq[73][43] = 26; EUC_TWFreq[66][47] = 25; EUC_TWFreq[41][18] = + * 24; EUC_TWFreq[51][10] = 23; EUC_TWFreq[59][7] = 22; EUC_TWFreq[53][27] = 21; EUC_TWFreq[86][67] = 20; EUC_TWFreq[49][87] = + * 19; EUC_TWFreq[52][28] = 18; EUC_TWFreq[52][12] = 17; EUC_TWFreq[42][30] = 16; EUC_TWFreq[65][35] = 15; + * EUC_TWFreq[46][64] = 14; EUC_TWFreq[71][7] = 13; EUC_TWFreq[56][57] = 12; EUC_TWFreq[56][31] = 11; EUC_TWFreq[41][31] = + * 10; EUC_TWFreq[48][59] = 9; EUC_TWFreq[63][92] = 8; EUC_TWFreq[62][57] = 7; EUC_TWFreq[65][87] = 6; EUC_TWFreq[70][10] = + * 5; EUC_TWFreq[52][40] = 4; EUC_TWFreq[40][22] = 3; EUC_TWFreq[65][91] = 2; EUC_TWFreq[50][25] = 1; EUC_TWFreq[35][84] = + * 0; + */ + GBKFreq[52][132] = 600; + GBKFreq[73][135] = 599; + GBKFreq[49][123] = 598; + GBKFreq[77][146] = 597; + GBKFreq[81][123] = 596; + GBKFreq[82][144] = 595; + GBKFreq[51][179] = 594; + GBKFreq[83][154] = 593; + GBKFreq[71][139] = 592; + GBKFreq[64][139] = 591; + GBKFreq[85][144] = 590; + GBKFreq[52][125] = 589; + GBKFreq[88][25] = 588; + GBKFreq[81][106] = 587; + GBKFreq[81][148] = 586; + GBKFreq[62][137] = 585; + GBKFreq[94][0] = 584; + GBKFreq[1][64] = 583; + GBKFreq[67][163] = 582; + GBKFreq[20][190] = 581; + GBKFreq[57][131] = 580; + GBKFreq[29][169] = 579; + GBKFreq[72][143] = 578; + GBKFreq[0][173] = 577; + GBKFreq[11][23] = 576; + GBKFreq[61][141] = 575; + GBKFreq[60][123] = 574; + GBKFreq[81][114] = 573; + GBKFreq[82][131] = 572; + GBKFreq[67][156] = 571; + GBKFreq[71][167] = 570; + GBKFreq[20][50] = 569; + GBKFreq[77][132] = 568; + GBKFreq[84][38] = 567; + GBKFreq[26][29] = 566; + GBKFreq[74][187] = 565; + GBKFreq[62][116] = 564; + GBKFreq[67][135] = 563; + GBKFreq[5][86] = 562; + GBKFreq[72][186] = 561; + GBKFreq[75][161] = 560; + GBKFreq[78][130] = 559; + GBKFreq[94][30] = 558; + GBKFreq[84][72] = 557; + GBKFreq[1][67] = 556; + GBKFreq[75][172] = 555; + GBKFreq[74][185] = 554; + GBKFreq[53][160] = 553; + GBKFreq[123][14] = 552; + GBKFreq[79][97] = 551; + GBKFreq[85][110] = 550; + GBKFreq[78][171] = 549; + GBKFreq[52][131] = 548; + GBKFreq[56][100] = 547; + GBKFreq[50][182] = 546; + GBKFreq[94][64] = 545; + GBKFreq[106][74] = 544; + GBKFreq[11][102] = 543; + GBKFreq[53][124] = 542; + GBKFreq[24][3] = 541; + GBKFreq[86][148] = 540; + GBKFreq[53][184] = 539; + GBKFreq[86][147] = 538; + GBKFreq[96][161] = 537; + GBKFreq[82][77] = 536; + GBKFreq[59][146] = 535; + GBKFreq[84][126] = 534; + GBKFreq[79][132] = 533; + GBKFreq[85][123] = 532; + GBKFreq[71][101] = 531; + GBKFreq[85][106] = 530; + GBKFreq[6][184] = 529; + GBKFreq[57][156] = 528; + GBKFreq[75][104] = 527; + GBKFreq[50][137] = 526; + GBKFreq[79][133] = 525; + GBKFreq[76][108] = 524; + GBKFreq[57][142] = 523; + GBKFreq[84][130] = 522; + GBKFreq[52][128] = 521; + GBKFreq[47][44] = 520; + GBKFreq[52][152] = 519; + GBKFreq[54][104] = 518; + GBKFreq[30][47] = 517; + GBKFreq[71][123] = 516; + GBKFreq[52][107] = 515; + GBKFreq[45][84] = 514; + GBKFreq[107][118] = 513; + GBKFreq[5][161] = 512; + GBKFreq[48][126] = 511; + GBKFreq[67][170] = 510; + GBKFreq[43][6] = 509; + GBKFreq[70][112] = 508; + GBKFreq[86][174] = 507; + GBKFreq[84][166] = 506; + GBKFreq[79][130] = 505; + GBKFreq[57][141] = 504; + GBKFreq[81][178] = 503; + GBKFreq[56][187] = 502; + GBKFreq[81][162] = 501; + GBKFreq[53][104] = 500; + GBKFreq[123][35] = 499; + GBKFreq[70][169] = 498; + GBKFreq[69][164] = 497; + GBKFreq[109][61] = 496; + GBKFreq[73][130] = 495; + GBKFreq[62][134] = 494; + GBKFreq[54][125] = 493; + GBKFreq[79][105] = 492; + GBKFreq[70][165] = 491; + GBKFreq[71][189] = 490; + GBKFreq[23][147] = 489; + GBKFreq[51][139] = 488; + GBKFreq[47][137] = 487; + GBKFreq[77][123] = 486; + GBKFreq[86][183] = 485; + GBKFreq[63][173] = 484; + GBKFreq[79][144] = 483; + GBKFreq[84][159] = 482; + GBKFreq[60][91] = 481; + GBKFreq[66][187] = 480; + GBKFreq[73][114] = 479; + GBKFreq[85][56] = 478; + GBKFreq[71][149] = 477; + GBKFreq[84][189] = 476; + GBKFreq[104][31] = 475; + GBKFreq[83][82] = 474; + GBKFreq[68][35] = 473; + GBKFreq[11][77] = 472; + GBKFreq[15][155] = 471; + GBKFreq[83][153] = 470; + GBKFreq[71][1] = 469; + GBKFreq[53][190] = 468; + GBKFreq[50][135] = 467; + GBKFreq[3][147] = 466; + GBKFreq[48][136] = 465; + GBKFreq[66][166] = 464; + GBKFreq[55][159] = 463; + GBKFreq[82][150] = 462; + GBKFreq[58][178] = 461; + GBKFreq[64][102] = 460; + GBKFreq[16][106] = 459; + GBKFreq[68][110] = 458; + GBKFreq[54][14] = 457; + GBKFreq[60][140] = 456; + GBKFreq[91][71] = 455; + GBKFreq[54][150] = 454; + GBKFreq[78][177] = 453; + GBKFreq[78][117] = 452; + GBKFreq[104][12] = 451; + GBKFreq[73][150] = 450; + GBKFreq[51][142] = 449; + GBKFreq[81][145] = 448; + GBKFreq[66][183] = 447; + GBKFreq[51][178] = 446; + GBKFreq[75][107] = 445; + GBKFreq[65][119] = 444; + GBKFreq[69][176] = 443; + GBKFreq[59][122] = 442; + GBKFreq[78][160] = 441; + GBKFreq[85][183] = 440; + GBKFreq[105][16] = 439; + GBKFreq[73][110] = 438; + GBKFreq[104][39] = 437; + GBKFreq[119][16] = 436; + GBKFreq[76][162] = 435; + GBKFreq[67][152] = 434; + GBKFreq[82][24] = 433; + GBKFreq[73][121] = 432; + GBKFreq[83][83] = 431; + GBKFreq[82][145] = 430; + GBKFreq[49][133] = 429; + GBKFreq[94][13] = 428; + GBKFreq[58][139] = 427; + GBKFreq[74][189] = 426; + GBKFreq[66][177] = 425; + GBKFreq[85][184] = 424; + GBKFreq[55][183] = 423; + GBKFreq[71][107] = 422; + GBKFreq[11][98] = 421; + GBKFreq[72][153] = 420; + GBKFreq[2][137] = 419; + GBKFreq[59][147] = 418; + GBKFreq[58][152] = 417; + GBKFreq[55][144] = 416; + GBKFreq[73][125] = 415; + GBKFreq[52][154] = 414; + GBKFreq[70][178] = 413; + GBKFreq[79][148] = 412; + GBKFreq[63][143] = 411; + GBKFreq[50][140] = 410; + GBKFreq[47][145] = 409; + GBKFreq[48][123] = 408; + GBKFreq[56][107] = 407; + GBKFreq[84][83] = 406; + GBKFreq[59][112] = 405; + GBKFreq[124][72] = 404; + GBKFreq[79][99] = 403; + GBKFreq[3][37] = 402; + GBKFreq[114][55] = 401; + GBKFreq[85][152] = 400; + GBKFreq[60][47] = 399; + GBKFreq[65][96] = 398; + GBKFreq[74][110] = 397; + GBKFreq[86][182] = 396; + GBKFreq[50][99] = 395; + GBKFreq[67][186] = 394; + GBKFreq[81][74] = 393; + GBKFreq[80][37] = 392; + GBKFreq[21][60] = 391; + GBKFreq[110][12] = 390; + GBKFreq[60][162] = 389; + GBKFreq[29][115] = 388; + GBKFreq[83][130] = 387; + GBKFreq[52][136] = 386; + GBKFreq[63][114] = 385; + GBKFreq[49][127] = 384; + GBKFreq[83][109] = 383; + GBKFreq[66][128] = 382; + GBKFreq[78][136] = 381; + GBKFreq[81][180] = 380; + GBKFreq[76][104] = 379; + GBKFreq[56][156] = 378; + GBKFreq[61][23] = 377; + GBKFreq[4][30] = 376; + GBKFreq[69][154] = 375; + GBKFreq[100][37] = 374; + GBKFreq[54][177] = 373; + GBKFreq[23][119] = 372; + GBKFreq[71][171] = 371; + GBKFreq[84][146] = 370; + GBKFreq[20][184] = 369; + GBKFreq[86][76] = 368; + GBKFreq[74][132] = 367; + GBKFreq[47][97] = 366; + GBKFreq[82][137] = 365; + GBKFreq[94][56] = 364; + GBKFreq[92][30] = 363; + GBKFreq[19][117] = 362; + GBKFreq[48][173] = 361; + GBKFreq[2][136] = 360; + GBKFreq[7][182] = 359; + GBKFreq[74][188] = 358; + GBKFreq[14][132] = 357; + GBKFreq[62][172] = 356; + GBKFreq[25][39] = 355; + GBKFreq[85][129] = 354; + GBKFreq[64][98] = 353; + GBKFreq[67][127] = 352; + GBKFreq[72][167] = 351; + GBKFreq[57][143] = 350; + GBKFreq[76][187] = 349; + GBKFreq[83][181] = 348; + GBKFreq[84][10] = 347; + GBKFreq[55][166] = 346; + GBKFreq[55][188] = 345; + GBKFreq[13][151] = 344; + GBKFreq[62][124] = 343; + GBKFreq[53][136] = 342; + GBKFreq[106][57] = 341; + GBKFreq[47][166] = 340; + GBKFreq[109][30] = 339; + GBKFreq[78][114] = 338; + GBKFreq[83][19] = 337; + GBKFreq[56][162] = 336; + GBKFreq[60][177] = 335; + GBKFreq[88][9] = 334; + GBKFreq[74][163] = 333; + GBKFreq[52][156] = 332; + GBKFreq[71][180] = 331; + GBKFreq[60][57] = 330; + GBKFreq[72][173] = 329; + GBKFreq[82][91] = 328; + GBKFreq[51][186] = 327; + GBKFreq[75][86] = 326; + GBKFreq[75][78] = 325; + GBKFreq[76][170] = 324; + GBKFreq[60][147] = 323; + GBKFreq[82][75] = 322; + GBKFreq[80][148] = 321; + GBKFreq[86][150] = 320; + GBKFreq[13][95] = 319; + GBKFreq[0][11] = 318; + GBKFreq[84][190] = 317; + GBKFreq[76][166] = 316; + GBKFreq[14][72] = 315; + GBKFreq[67][144] = 314; + GBKFreq[84][44] = 313; + GBKFreq[72][125] = 312; + GBKFreq[66][127] = 311; + GBKFreq[60][25] = 310; + GBKFreq[70][146] = 309; + GBKFreq[79][135] = 308; + GBKFreq[54][135] = 307; + GBKFreq[60][104] = 306; + GBKFreq[55][132] = 305; + GBKFreq[94][2] = 304; + GBKFreq[54][133] = 303; + GBKFreq[56][190] = 302; + GBKFreq[58][174] = 301; + GBKFreq[80][144] = 300; + GBKFreq[85][113] = 299; + /* + * GBKFreq[83][15] = 298; GBKFreq[105][80] = 297; GBKFreq[7][179] = 296; GBKFreq[93][4] = 295; GBKFreq[123][40] = 294; + * GBKFreq[85][120] = 293; GBKFreq[77][165] = 292; GBKFreq[86][67] = 291; GBKFreq[25][162] = 290; GBKFreq[77][183] = 289; + * GBKFreq[83][71] = 288; GBKFreq[78][99] = 287; GBKFreq[72][177] = 286; GBKFreq[71][97] = 285; GBKFreq[58][111] = 284; + * GBKFreq[77][175] = 283; GBKFreq[76][181] = 282; GBKFreq[71][142] = 281; GBKFreq[64][150] = 280; GBKFreq[5][142] = 279; + * GBKFreq[73][128] = 278; GBKFreq[73][156] = 277; GBKFreq[60][188] = 276; GBKFreq[64][56] = 275; GBKFreq[74][128] = 274; + * GBKFreq[48][163] = 273; GBKFreq[54][116] = 272; GBKFreq[73][127] = 271; GBKFreq[16][176] = 270; GBKFreq[62][149] = 269; + * GBKFreq[105][96] = 268; GBKFreq[55][186] = 267; GBKFreq[4][51] = 266; GBKFreq[48][113] = 265; GBKFreq[48][152] = 264; + * GBKFreq[23][9] = 263; GBKFreq[56][102] = 262; GBKFreq[11][81] = 261; GBKFreq[82][112] = 260; GBKFreq[65][85] = 259; + * GBKFreq[69][125] = 258; GBKFreq[68][31] = 257; GBKFreq[5][20] = 256; GBKFreq[60][176] = 255; GBKFreq[82][81] = 254; + * GBKFreq[72][107] = 253; GBKFreq[3][52] = 252; GBKFreq[71][157] = 251; GBKFreq[24][46] = 250; GBKFreq[69][108] = 249; + * GBKFreq[78][178] = 248; GBKFreq[9][69] = 247; GBKFreq[73][144] = 246; GBKFreq[63][187] = 245; GBKFreq[68][36] = 244; + * GBKFreq[47][151] = 243; GBKFreq[14][74] = 242; GBKFreq[47][114] = 241; GBKFreq[80][171] = 240; GBKFreq[75][152] = 239; + * GBKFreq[86][40] = 238; GBKFreq[93][43] = 237; GBKFreq[2][50] = 236; GBKFreq[62][66] = 235; GBKFreq[1][183] = 234; + * GBKFreq[74][124] = 233; GBKFreq[58][104] = 232; GBKFreq[83][106] = 231; GBKFreq[60][144] = 230; GBKFreq[48][99] = 229; + * GBKFreq[54][157] = 228; GBKFreq[70][179] = 227; GBKFreq[61][127] = 226; GBKFreq[57][135] = 225; GBKFreq[59][190] = 224; + * GBKFreq[77][116] = 223; GBKFreq[26][17] = 222; GBKFreq[60][13] = 221; GBKFreq[71][38] = 220; GBKFreq[85][177] = 219; + * GBKFreq[59][73] = 218; GBKFreq[50][150] = 217; GBKFreq[79][102] = 216; GBKFreq[76][118] = 215; GBKFreq[67][132] = 214; + * GBKFreq[73][146] = 213; GBKFreq[83][184] = 212; GBKFreq[86][159] = 211; GBKFreq[95][120] = 210; GBKFreq[23][139] = 209; + * GBKFreq[64][183] = 208; GBKFreq[85][103] = 207; GBKFreq[41][90] = 206; GBKFreq[87][72] = 205; GBKFreq[62][104] = 204; + * GBKFreq[79][168] = 203; GBKFreq[79][150] = 202; GBKFreq[104][20] = 201; GBKFreq[56][114] = 200; GBKFreq[84][26] = 199; + * GBKFreq[57][99] = 198; GBKFreq[62][154] = 197; GBKFreq[47][98] = 196; GBKFreq[61][64] = 195; GBKFreq[112][18] = 194; + * GBKFreq[123][19] = 193; GBKFreq[4][98] = 192; GBKFreq[47][163] = 191; GBKFreq[66][188] = 190; GBKFreq[81][85] = 189; + * GBKFreq[82][30] = 188; GBKFreq[65][83] = 187; GBKFreq[67][24] = 186; GBKFreq[68][179] = 185; GBKFreq[55][177] = 184; + * GBKFreq[2][122] = 183; GBKFreq[47][139] = 182; GBKFreq[79][158] = 181; GBKFreq[64][143] = 180; GBKFreq[100][24] = 179; + * GBKFreq[73][103] = 178; GBKFreq[50][148] = 177; GBKFreq[86][97] = 176; GBKFreq[59][116] = 175; GBKFreq[64][173] = 174; + * GBKFreq[99][91] = 173; GBKFreq[11][99] = 172; GBKFreq[78][179] = 171; GBKFreq[18][17] = 170; GBKFreq[58][185] = 169; + * GBKFreq[47][165] = 168; GBKFreq[67][131] = 167; GBKFreq[94][40] = 166; GBKFreq[74][153] = 165; GBKFreq[79][142] = 164; + * GBKFreq[57][98] = 163; GBKFreq[1][164] = 162; GBKFreq[55][168] = 161; GBKFreq[13][141] = 160; GBKFreq[51][31] = 159; + * GBKFreq[57][178] = 158; GBKFreq[50][189] = 157; GBKFreq[60][167] = 156; GBKFreq[80][34] = 155; GBKFreq[109][80] = 154; + * GBKFreq[85][54] = 153; GBKFreq[69][183] = 152; GBKFreq[67][143] = 151; GBKFreq[47][120] = 150; GBKFreq[45][75] = 149; + * GBKFreq[82][98] = 148; GBKFreq[83][22] = 147; GBKFreq[13][103] = 146; GBKFreq[49][174] = 145; GBKFreq[57][181] = 144; + * GBKFreq[64][127] = 143; GBKFreq[61][131] = 142; GBKFreq[52][180] = 141; GBKFreq[74][134] = 140; GBKFreq[84][187] = 139; + * GBKFreq[81][189] = 138; GBKFreq[47][160] = 137; GBKFreq[66][148] = 136; GBKFreq[7][4] = 135; GBKFreq[85][134] = 134; + * GBKFreq[88][13] = 133; GBKFreq[88][80] = 132; GBKFreq[69][166] = 131; GBKFreq[86][18] = 130; GBKFreq[79][141] = 129; + * GBKFreq[50][108] = 128; GBKFreq[94][69] = 127; GBKFreq[81][110] = 126; GBKFreq[69][119] = 125; GBKFreq[72][161] = 124; + * GBKFreq[106][45] = 123; GBKFreq[73][124] = 122; GBKFreq[94][28] = 121; GBKFreq[63][174] = 120; GBKFreq[3][149] = 119; + * GBKFreq[24][160] = 118; GBKFreq[113][94] = 117; GBKFreq[56][138] = 116; GBKFreq[64][185] = 115; GBKFreq[86][56] = 114; + * GBKFreq[56][150] = 113; GBKFreq[110][55] = 112; GBKFreq[28][13] = 111; GBKFreq[54][190] = 110; GBKFreq[8][180] = 109; + * GBKFreq[73][149] = 108; GBKFreq[80][155] = 107; GBKFreq[83][172] = 106; GBKFreq[67][174] = 105; GBKFreq[64][180] = 104; + * GBKFreq[84][46] = 103; GBKFreq[91][74] = 102; GBKFreq[69][134] = 101; GBKFreq[61][107] = 100; GBKFreq[47][171] = 99; + * GBKFreq[59][51] = 98; GBKFreq[109][74] = 97; GBKFreq[64][174] = 96; GBKFreq[52][151] = 95; GBKFreq[51][176] = 94; + * GBKFreq[80][157] = 93; GBKFreq[94][31] = 92; GBKFreq[79][155] = 91; GBKFreq[72][174] = 90; GBKFreq[69][113] = 89; + * GBKFreq[83][167] = 88; GBKFreq[83][122] = 87; GBKFreq[8][178] = 86; GBKFreq[70][186] = 85; GBKFreq[59][153] = 84; + * GBKFreq[84][68] = 83; GBKFreq[79][39] = 82; GBKFreq[47][180] = 81; GBKFreq[88][53] = 80; GBKFreq[57][154] = 79; + * GBKFreq[47][153] = 78; GBKFreq[3][153] = 77; GBKFreq[76][134] = 76; GBKFreq[51][166] = 75; GBKFreq[58][176] = 74; + * GBKFreq[27][138] = 73; GBKFreq[73][126] = 72; GBKFreq[76][185] = 71; GBKFreq[52][186] = 70; GBKFreq[81][151] = 69; + * GBKFreq[26][50] = 68; GBKFreq[76][173] = 67; GBKFreq[106][56] = 66; GBKFreq[85][142] = 65; GBKFreq[11][103] = 64; + * GBKFreq[69][159] = 63; GBKFreq[53][142] = 62; GBKFreq[7][6] = 61; GBKFreq[84][59] = 60; GBKFreq[86][3] = 59; + * GBKFreq[64][144] = 58; GBKFreq[1][187] = 57; GBKFreq[82][128] = 56; GBKFreq[3][66] = 55; GBKFreq[68][133] = 54; + * GBKFreq[55][167] = 53; GBKFreq[52][130] = 52; GBKFreq[61][133] = 51; GBKFreq[72][181] = 50; GBKFreq[25][98] = 49; + * GBKFreq[84][149] = 48; GBKFreq[91][91] = 47; GBKFreq[47][188] = 46; GBKFreq[68][130] = 45; GBKFreq[22][44] = 44; + * GBKFreq[81][121] = 43; GBKFreq[72][140] = 42; GBKFreq[55][133] = 41; GBKFreq[55][185] = 40; GBKFreq[56][105] = 39; + * GBKFreq[60][30] = 38; GBKFreq[70][103] = 37; GBKFreq[62][141] = 36; GBKFreq[70][144] = 35; GBKFreq[59][111] = 34; + * GBKFreq[54][17] = 33; GBKFreq[18][190] = 32; GBKFreq[65][164] = 31; GBKFreq[83][125] = 30; GBKFreq[61][121] = 29; + * GBKFreq[48][13] = 28; GBKFreq[51][189] = 27; GBKFreq[65][68] = 26; GBKFreq[7][0] = 25; GBKFreq[76][188] = 24; + * GBKFreq[85][117] = 23; GBKFreq[45][33] = 22; GBKFreq[78][187] = 21; GBKFreq[106][48] = 20; GBKFreq[59][52] = 19; + * GBKFreq[86][185] = 18; GBKFreq[84][121] = 17; GBKFreq[82][189] = 16; GBKFreq[68][156] = 15; GBKFreq[55][125] = 14; + * GBKFreq[65][175] = 13; GBKFreq[7][140] = 12; GBKFreq[50][106] = 11; GBKFreq[59][124] = 10; GBKFreq[67][115] = 9; + * GBKFreq[82][114] = 8; GBKFreq[74][121] = 7; GBKFreq[106][69] = 6; GBKFreq[94][27] = 5; GBKFreq[78][98] = 4; + * GBKFreq[85][186] = 3; GBKFreq[108][90] = 2; GBKFreq[62][160] = 1; GBKFreq[60][169] = 0; + */ + KRFreq[31][43] = 600; + KRFreq[19][56] = 599; + KRFreq[38][46] = 598; + KRFreq[3][3] = 597; + KRFreq[29][77] = 596; + KRFreq[19][33] = 595; + KRFreq[30][0] = 594; + KRFreq[29][89] = 593; + KRFreq[31][26] = 592; + KRFreq[31][38] = 591; + KRFreq[32][85] = 590; + KRFreq[15][0] = 589; + KRFreq[16][54] = 588; + KRFreq[15][76] = 587; + KRFreq[31][25] = 586; + KRFreq[23][13] = 585; + KRFreq[28][34] = 584; + KRFreq[18][9] = 583; + KRFreq[29][37] = 582; + KRFreq[22][45] = 581; + KRFreq[19][46] = 580; + KRFreq[16][65] = 579; + KRFreq[23][5] = 578; + KRFreq[26][70] = 577; + KRFreq[31][53] = 576; + KRFreq[27][12] = 575; + KRFreq[30][67] = 574; + KRFreq[31][57] = 573; + KRFreq[20][20] = 572; + KRFreq[30][31] = 571; + KRFreq[20][72] = 570; + KRFreq[15][51] = 569; + KRFreq[3][8] = 568; + KRFreq[32][53] = 567; + KRFreq[27][85] = 566; + KRFreq[25][23] = 565; + KRFreq[15][44] = 564; + KRFreq[32][3] = 563; + KRFreq[31][68] = 562; + KRFreq[30][24] = 561; + KRFreq[29][49] = 560; + KRFreq[27][49] = 559; + KRFreq[23][23] = 558; + KRFreq[31][91] = 557; + KRFreq[31][46] = 556; + KRFreq[19][74] = 555; + KRFreq[27][27] = 554; + KRFreq[3][17] = 553; + KRFreq[20][38] = 552; + KRFreq[21][82] = 551; + KRFreq[28][25] = 550; + KRFreq[32][5] = 549; + KRFreq[31][23] = 548; + KRFreq[25][45] = 547; + KRFreq[32][87] = 546; + KRFreq[18][26] = 545; + KRFreq[24][10] = 544; + KRFreq[26][82] = 543; + KRFreq[15][89] = 542; + KRFreq[28][36] = 541; + KRFreq[28][31] = 540; + KRFreq[16][23] = 539; + KRFreq[16][77] = 538; + KRFreq[19][84] = 537; + KRFreq[23][72] = 536; + KRFreq[38][48] = 535; + KRFreq[23][2] = 534; + KRFreq[30][20] = 533; + KRFreq[38][47] = 532; + KRFreq[39][12] = 531; + KRFreq[23][21] = 530; + KRFreq[18][17] = 529; + KRFreq[30][87] = 528; + KRFreq[29][62] = 527; + KRFreq[29][87] = 526; + KRFreq[34][53] = 525; + KRFreq[32][29] = 524; + KRFreq[35][0] = 523; + KRFreq[24][43] = 522; + KRFreq[36][44] = 521; + KRFreq[20][30] = 520; + KRFreq[39][86] = 519; + KRFreq[22][14] = 518; + KRFreq[29][39] = 517; + KRFreq[28][38] = 516; + KRFreq[23][79] = 515; + KRFreq[24][56] = 514; + KRFreq[29][63] = 513; + KRFreq[31][45] = 512; + KRFreq[23][26] = 511; + KRFreq[15][87] = 510; + KRFreq[30][74] = 509; + KRFreq[24][69] = 508; + KRFreq[20][4] = 507; + KRFreq[27][50] = 506; + KRFreq[30][75] = 505; + KRFreq[24][13] = 504; + KRFreq[30][8] = 503; + KRFreq[31][6] = 502; + KRFreq[25][80] = 501; + KRFreq[36][8] = 500; + KRFreq[15][18] = 499; + KRFreq[39][23] = 498; + KRFreq[16][24] = 497; + KRFreq[31][89] = 496; + KRFreq[15][71] = 495; + KRFreq[15][57] = 494; + KRFreq[30][11] = 493; + KRFreq[15][36] = 492; + KRFreq[16][60] = 491; + KRFreq[24][45] = 490; + KRFreq[37][35] = 489; + KRFreq[24][87] = 488; + KRFreq[20][45] = 487; + KRFreq[31][90] = 486; + KRFreq[32][21] = 485; + KRFreq[19][70] = 484; + KRFreq[24][15] = 483; + KRFreq[26][92] = 482; + KRFreq[37][13] = 481; + KRFreq[39][2] = 480; + KRFreq[23][70] = 479; + KRFreq[27][25] = 478; + KRFreq[15][69] = 477; + KRFreq[19][61] = 476; + KRFreq[31][58] = 475; + KRFreq[24][57] = 474; + KRFreq[36][74] = 473; + KRFreq[21][6] = 472; + KRFreq[30][44] = 471; + KRFreq[15][91] = 470; + KRFreq[27][16] = 469; + KRFreq[29][42] = 468; + KRFreq[33][86] = 467; + KRFreq[29][41] = 466; + KRFreq[20][68] = 465; + KRFreq[25][47] = 464; + KRFreq[22][0] = 463; + KRFreq[18][14] = 462; + KRFreq[31][28] = 461; + KRFreq[15][2] = 460; + KRFreq[23][76] = 459; + KRFreq[38][32] = 458; + KRFreq[29][82] = 457; + KRFreq[21][86] = 456; + KRFreq[24][62] = 455; + KRFreq[31][64] = 454; + KRFreq[38][26] = 453; + KRFreq[32][86] = 452; + KRFreq[22][32] = 451; + KRFreq[19][59] = 450; + KRFreq[34][18] = 449; + KRFreq[18][54] = 448; + KRFreq[38][63] = 447; + KRFreq[36][23] = 446; + KRFreq[35][35] = 445; + KRFreq[32][62] = 444; + KRFreq[28][35] = 443; + KRFreq[27][13] = 442; + KRFreq[31][59] = 441; + KRFreq[29][29] = 440; + KRFreq[15][64] = 439; + KRFreq[26][84] = 438; + KRFreq[21][90] = 437; + KRFreq[20][24] = 436; + KRFreq[16][18] = 435; + KRFreq[22][23] = 434; + KRFreq[31][14] = 433; + KRFreq[15][1] = 432; + KRFreq[18][63] = 431; + KRFreq[19][10] = 430; + KRFreq[25][49] = 429; + KRFreq[36][57] = 428; + KRFreq[20][22] = 427; + KRFreq[15][15] = 426; + KRFreq[31][51] = 425; + KRFreq[24][60] = 424; + KRFreq[31][70] = 423; + KRFreq[15][7] = 422; + KRFreq[28][40] = 421; + KRFreq[18][41] = 420; + KRFreq[15][38] = 419; + KRFreq[32][0] = 418; + KRFreq[19][51] = 417; + KRFreq[34][62] = 416; + KRFreq[16][27] = 415; + KRFreq[20][70] = 414; + KRFreq[22][33] = 413; + KRFreq[26][73] = 412; + KRFreq[20][79] = 411; + KRFreq[23][6] = 410; + KRFreq[24][85] = 409; + KRFreq[38][51] = 408; + KRFreq[29][88] = 407; + KRFreq[38][55] = 406; + KRFreq[32][32] = 405; + KRFreq[27][18] = 404; + KRFreq[23][87] = 403; + KRFreq[35][6] = 402; + KRFreq[34][27] = 401; + KRFreq[39][35] = 400; + KRFreq[30][88] = 399; + KRFreq[32][92] = 398; + KRFreq[32][49] = 397; + KRFreq[24][61] = 396; + KRFreq[18][74] = 395; + KRFreq[23][77] = 394; + KRFreq[23][50] = 393; + KRFreq[23][32] = 392; + KRFreq[23][36] = 391; + KRFreq[38][38] = 390; + KRFreq[29][86] = 389; + KRFreq[36][15] = 388; + KRFreq[31][50] = 387; + KRFreq[15][86] = 386; + KRFreq[39][13] = 385; + KRFreq[34][26] = 384; + KRFreq[19][34] = 383; + KRFreq[16][3] = 382; + KRFreq[26][93] = 381; + KRFreq[19][67] = 380; + KRFreq[24][72] = 379; + KRFreq[29][17] = 378; + KRFreq[23][24] = 377; + KRFreq[25][19] = 376; + KRFreq[18][65] = 375; + KRFreq[30][78] = 374; + KRFreq[27][52] = 373; + KRFreq[22][18] = 372; + KRFreq[16][38] = 371; + KRFreq[21][26] = 370; + KRFreq[34][20] = 369; + KRFreq[15][42] = 368; + KRFreq[16][71] = 367; + KRFreq[17][17] = 366; + KRFreq[24][71] = 365; + KRFreq[18][84] = 364; + KRFreq[15][40] = 363; + KRFreq[31][62] = 362; + KRFreq[15][8] = 361; + KRFreq[16][69] = 360; + KRFreq[29][79] = 359; + KRFreq[38][91] = 358; + KRFreq[31][92] = 357; + KRFreq[20][77] = 356; + KRFreq[3][16] = 355; + KRFreq[27][87] = 354; + KRFreq[16][25] = 353; + KRFreq[36][33] = 352; + KRFreq[37][76] = 351; + KRFreq[30][12] = 350; + KRFreq[26][75] = 349; + KRFreq[25][14] = 348; + KRFreq[32][26] = 347; + KRFreq[23][22] = 346; + KRFreq[20][90] = 345; + KRFreq[19][8] = 344; + KRFreq[38][41] = 343; + KRFreq[34][2] = 342; + KRFreq[39][4] = 341; + KRFreq[27][89] = 340; + KRFreq[28][41] = 339; + KRFreq[28][44] = 338; + KRFreq[24][92] = 337; + KRFreq[34][65] = 336; + KRFreq[39][14] = 335; + KRFreq[21][38] = 334; + KRFreq[19][31] = 333; + KRFreq[37][39] = 332; + KRFreq[33][41] = 331; + KRFreq[38][4] = 330; + KRFreq[23][80] = 329; + KRFreq[25][24] = 328; + KRFreq[37][17] = 327; + KRFreq[22][16] = 326; + KRFreq[22][46] = 325; + KRFreq[33][91] = 324; + KRFreq[24][89] = 323; + KRFreq[30][52] = 322; + KRFreq[29][38] = 321; + KRFreq[38][85] = 320; + KRFreq[15][12] = 319; + KRFreq[27][58] = 318; + KRFreq[29][52] = 317; + KRFreq[37][38] = 316; + KRFreq[34][41] = 315; + KRFreq[31][65] = 314; + KRFreq[29][53] = 313; + KRFreq[22][47] = 312; + KRFreq[22][19] = 311; + KRFreq[26][0] = 310; + KRFreq[37][86] = 309; + KRFreq[35][4] = 308; + KRFreq[36][54] = 307; + KRFreq[20][76] = 306; + KRFreq[30][9] = 305; + KRFreq[30][33] = 304; + KRFreq[23][17] = 303; + KRFreq[23][33] = 302; + KRFreq[38][52] = 301; + KRFreq[15][19] = 300; + KRFreq[28][45] = 299; + KRFreq[29][78] = 298; + KRFreq[23][15] = 297; + KRFreq[33][5] = 296; + KRFreq[17][40] = 295; + KRFreq[30][83] = 294; + KRFreq[18][1] = 293; + KRFreq[30][81] = 292; + KRFreq[19][40] = 291; + KRFreq[24][47] = 290; + KRFreq[17][56] = 289; + KRFreq[39][80] = 288; + KRFreq[30][46] = 287; + KRFreq[16][61] = 286; + KRFreq[26][78] = 285; + KRFreq[26][57] = 284; + KRFreq[20][46] = 283; + KRFreq[25][15] = 282; + KRFreq[25][91] = 281; + KRFreq[21][83] = 280; + KRFreq[30][77] = 279; + KRFreq[35][30] = 278; + KRFreq[30][34] = 277; + KRFreq[20][69] = 276; + KRFreq[35][10] = 275; + KRFreq[29][70] = 274; + KRFreq[22][50] = 273; + KRFreq[18][0] = 272; + KRFreq[22][64] = 271; + KRFreq[38][65] = 270; + KRFreq[22][70] = 269; + KRFreq[24][58] = 268; + KRFreq[19][66] = 267; + KRFreq[30][59] = 266; + KRFreq[37][14] = 265; + KRFreq[16][56] = 264; + KRFreq[29][85] = 263; + KRFreq[31][15] = 262; + KRFreq[36][84] = 261; + KRFreq[39][15] = 260; + KRFreq[39][90] = 259; + KRFreq[18][12] = 258; + KRFreq[21][93] = 257; + KRFreq[24][66] = 256; + KRFreq[27][90] = 255; + KRFreq[25][90] = 254; + KRFreq[22][24] = 253; + KRFreq[36][67] = 252; + KRFreq[33][90] = 251; + KRFreq[15][60] = 250; + KRFreq[23][85] = 249; + KRFreq[34][1] = 248; + KRFreq[39][37] = 247; + KRFreq[21][18] = 246; + KRFreq[34][4] = 245; + KRFreq[28][33] = 244; + KRFreq[15][13] = 243; + KRFreq[32][22] = 242; + KRFreq[30][76] = 241; + KRFreq[20][21] = 240; + KRFreq[38][66] = 239; + KRFreq[32][55] = 238; + KRFreq[32][89] = 237; + KRFreq[25][26] = 236; + KRFreq[16][80] = 235; + KRFreq[15][43] = 234; + KRFreq[38][54] = 233; + KRFreq[39][68] = 232; + KRFreq[22][88] = 231; + KRFreq[21][84] = 230; + KRFreq[21][17] = 229; + KRFreq[20][28] = 228; + KRFreq[32][1] = 227; + KRFreq[33][87] = 226; + KRFreq[38][71] = 225; + KRFreq[37][47] = 224; + KRFreq[18][77] = 223; + KRFreq[37][58] = 222; + KRFreq[34][74] = 221; + KRFreq[32][54] = 220; + KRFreq[27][33] = 219; + KRFreq[32][93] = 218; + KRFreq[23][51] = 217; + KRFreq[20][57] = 216; + KRFreq[22][37] = 215; + KRFreq[39][10] = 214; + KRFreq[39][17] = 213; + KRFreq[33][4] = 212; + KRFreq[32][84] = 211; + KRFreq[34][3] = 210; + KRFreq[28][27] = 209; + KRFreq[15][79] = 208; + KRFreq[34][21] = 207; + KRFreq[34][69] = 206; + KRFreq[21][62] = 205; + KRFreq[36][24] = 204; + KRFreq[16][89] = 203; + KRFreq[18][48] = 202; + KRFreq[38][15] = 201; + KRFreq[36][58] = 200; + KRFreq[21][56] = 199; + KRFreq[34][48] = 198; + KRFreq[21][15] = 197; + KRFreq[39][3] = 196; + KRFreq[16][44] = 195; + KRFreq[18][79] = 194; + KRFreq[25][13] = 193; + KRFreq[29][47] = 192; + KRFreq[38][88] = 191; + KRFreq[20][71] = 190; + KRFreq[16][58] = 189; + KRFreq[35][57] = 188; + KRFreq[29][30] = 187; + KRFreq[29][23] = 186; + KRFreq[34][93] = 185; + KRFreq[30][85] = 184; + KRFreq[15][80] = 183; + KRFreq[32][78] = 182; + KRFreq[37][82] = 181; + KRFreq[22][40] = 180; + KRFreq[21][69] = 179; + KRFreq[26][85] = 178; + KRFreq[31][31] = 177; + KRFreq[28][64] = 176; + KRFreq[38][13] = 175; + KRFreq[25][2] = 174; + KRFreq[22][34] = 173; + KRFreq[28][28] = 172; + KRFreq[24][91] = 171; + KRFreq[33][74] = 170; + KRFreq[29][40] = 169; + KRFreq[15][77] = 168; + KRFreq[32][80] = 167; + KRFreq[30][41] = 166; + KRFreq[23][30] = 165; + KRFreq[24][63] = 164; + KRFreq[30][53] = 163; + KRFreq[39][70] = 162; + KRFreq[23][61] = 161; + KRFreq[37][27] = 160; + KRFreq[16][55] = 159; + KRFreq[22][74] = 158; + KRFreq[26][50] = 157; + KRFreq[16][10] = 156; + KRFreq[34][63] = 155; + KRFreq[35][14] = 154; + KRFreq[17][7] = 153; + KRFreq[15][59] = 152; + KRFreq[27][23] = 151; + KRFreq[18][70] = 150; + KRFreq[32][56] = 149; + KRFreq[37][87] = 148; + KRFreq[17][61] = 147; + KRFreq[18][83] = 146; + KRFreq[23][86] = 145; + KRFreq[17][31] = 144; + KRFreq[23][83] = 143; + KRFreq[35][2] = 142; + KRFreq[18][64] = 141; + KRFreq[27][43] = 140; + KRFreq[32][42] = 139; + KRFreq[25][76] = 138; + KRFreq[19][85] = 137; + KRFreq[37][81] = 136; + KRFreq[38][83] = 135; + KRFreq[35][7] = 134; + KRFreq[16][51] = 133; + KRFreq[27][22] = 132; + KRFreq[16][76] = 131; + KRFreq[22][4] = 130; + KRFreq[38][84] = 129; + KRFreq[17][83] = 128; + KRFreq[24][46] = 127; + KRFreq[33][15] = 126; + KRFreq[20][48] = 125; + KRFreq[17][30] = 124; + KRFreq[30][93] = 123; + KRFreq[28][11] = 122; + KRFreq[28][30] = 121; + KRFreq[15][62] = 120; + KRFreq[17][87] = 119; + KRFreq[32][81] = 118; + KRFreq[23][37] = 117; + KRFreq[30][22] = 116; + KRFreq[32][66] = 115; + KRFreq[33][78] = 114; + KRFreq[21][4] = 113; + KRFreq[31][17] = 112; + KRFreq[39][61] = 111; + KRFreq[18][76] = 110; + KRFreq[15][85] = 109; + KRFreq[31][47] = 108; + KRFreq[19][57] = 107; + KRFreq[23][55] = 106; + KRFreq[27][29] = 105; + KRFreq[29][46] = 104; + KRFreq[33][0] = 103; + KRFreq[16][83] = 102; + KRFreq[39][78] = 101; + KRFreq[32][77] = 100; + KRFreq[36][25] = 99; + KRFreq[34][19] = 98; + KRFreq[38][49] = 97; + KRFreq[19][25] = 96; + KRFreq[23][53] = 95; + KRFreq[28][43] = 94; + KRFreq[31][44] = 93; + KRFreq[36][34] = 92; + KRFreq[16][34] = 91; + KRFreq[35][1] = 90; + KRFreq[19][87] = 89; + KRFreq[18][53] = 88; + KRFreq[29][54] = 87; + KRFreq[22][41] = 86; + KRFreq[38][18] = 85; + KRFreq[22][2] = 84; + KRFreq[20][3] = 83; + KRFreq[39][69] = 82; + KRFreq[30][29] = 81; + KRFreq[28][19] = 80; + KRFreq[29][90] = 79; + KRFreq[17][86] = 78; + KRFreq[15][9] = 77; + KRFreq[39][73] = 76; + KRFreq[15][37] = 75; + KRFreq[35][40] = 74; + KRFreq[33][77] = 73; + KRFreq[27][86] = 72; + KRFreq[36][79] = 71; + KRFreq[23][18] = 70; + KRFreq[34][87] = 69; + KRFreq[39][24] = 68; + KRFreq[26][8] = 67; + KRFreq[33][48] = 66; + KRFreq[39][30] = 65; + KRFreq[33][28] = 64; + KRFreq[16][67] = 63; + KRFreq[31][78] = 62; + KRFreq[32][23] = 61; + KRFreq[24][55] = 60; + KRFreq[30][68] = 59; + KRFreq[18][60] = 58; + KRFreq[15][17] = 57; + KRFreq[23][34] = 56; + KRFreq[20][49] = 55; + KRFreq[15][78] = 54; + KRFreq[24][14] = 53; + KRFreq[19][41] = 52; + KRFreq[31][55] = 51; + KRFreq[21][39] = 50; + KRFreq[35][9] = 49; + KRFreq[30][15] = 48; + KRFreq[20][52] = 47; + KRFreq[35][71] = 46; + KRFreq[20][7] = 45; + KRFreq[29][72] = 44; + KRFreq[37][77] = 43; + KRFreq[22][35] = 42; + KRFreq[20][61] = 41; + KRFreq[31][60] = 40; + KRFreq[20][93] = 39; + KRFreq[27][92] = 38; + KRFreq[28][16] = 37; + KRFreq[36][26] = 36; + KRFreq[18][89] = 35; + KRFreq[21][63] = 34; + KRFreq[22][52] = 33; + KRFreq[24][65] = 32; + KRFreq[31][8] = 31; + KRFreq[31][49] = 30; + KRFreq[33][30] = 29; + KRFreq[37][15] = 28; + KRFreq[18][18] = 27; + KRFreq[25][50] = 26; + KRFreq[29][20] = 25; + KRFreq[35][48] = 24; + KRFreq[38][75] = 23; + KRFreq[26][83] = 22; + KRFreq[21][87] = 21; + KRFreq[27][71] = 20; + KRFreq[32][91] = 19; + KRFreq[25][73] = 18; + KRFreq[16][84] = 17; + KRFreq[25][31] = 16; + KRFreq[17][90] = 15; + KRFreq[18][40] = 14; + KRFreq[17][77] = 13; + KRFreq[17][35] = 12; + KRFreq[23][52] = 11; + KRFreq[23][35] = 10; + KRFreq[16][5] = 9; + KRFreq[23][58] = 8; + KRFreq[19][60] = 7; + KRFreq[30][32] = 6; + KRFreq[38][34] = 5; + KRFreq[23][4] = 4; + KRFreq[23][1] = 3; + KRFreq[27][57] = 2; + KRFreq[39][38] = 1; + KRFreq[32][33] = 0; + JPFreq[3][74] = 600; + JPFreq[3][45] = 599; + JPFreq[3][3] = 598; + JPFreq[3][24] = 597; + JPFreq[3][30] = 596; + JPFreq[3][42] = 595; + JPFreq[3][46] = 594; + JPFreq[3][39] = 593; + JPFreq[3][11] = 592; + JPFreq[3][37] = 591; + JPFreq[3][38] = 590; + JPFreq[3][31] = 589; + JPFreq[3][41] = 588; + JPFreq[3][5] = 587; + JPFreq[3][10] = 586; + JPFreq[3][75] = 585; + JPFreq[3][65] = 584; + JPFreq[3][72] = 583; + JPFreq[37][91] = 582; + JPFreq[0][27] = 581; + JPFreq[3][18] = 580; + JPFreq[3][22] = 579; + JPFreq[3][61] = 578; + JPFreq[3][14] = 577; + JPFreq[24][80] = 576; + JPFreq[4][82] = 575; + JPFreq[17][80] = 574; + JPFreq[30][44] = 573; + JPFreq[3][73] = 572; + JPFreq[3][64] = 571; + JPFreq[38][14] = 570; + JPFreq[33][70] = 569; + JPFreq[3][1] = 568; + JPFreq[3][16] = 567; + JPFreq[3][35] = 566; + JPFreq[3][40] = 565; + JPFreq[4][74] = 564; + JPFreq[4][24] = 563; + JPFreq[42][59] = 562; + JPFreq[3][7] = 561; + JPFreq[3][71] = 560; + JPFreq[3][12] = 559; + JPFreq[15][75] = 558; + JPFreq[3][20] = 557; + JPFreq[4][39] = 556; + JPFreq[34][69] = 555; + JPFreq[3][28] = 554; + JPFreq[35][24] = 553; + JPFreq[3][82] = 552; + JPFreq[28][47] = 551; + JPFreq[3][67] = 550; + JPFreq[37][16] = 549; + JPFreq[26][93] = 548; + JPFreq[4][1] = 547; + JPFreq[26][85] = 546; + JPFreq[31][14] = 545; + JPFreq[4][3] = 544; + JPFreq[4][72] = 543; + JPFreq[24][51] = 542; + JPFreq[27][51] = 541; + JPFreq[27][49] = 540; + JPFreq[22][77] = 539; + JPFreq[27][10] = 538; + JPFreq[29][68] = 537; + JPFreq[20][35] = 536; + JPFreq[41][11] = 535; + JPFreq[24][70] = 534; + JPFreq[36][61] = 533; + JPFreq[31][23] = 532; + JPFreq[43][16] = 531; + JPFreq[23][68] = 530; + JPFreq[32][15] = 529; + JPFreq[3][32] = 528; + JPFreq[19][53] = 527; + JPFreq[40][83] = 526; + JPFreq[4][14] = 525; + JPFreq[36][9] = 524; + JPFreq[4][73] = 523; + JPFreq[23][10] = 522; + JPFreq[3][63] = 521; + JPFreq[39][14] = 520; + JPFreq[3][78] = 519; + JPFreq[33][47] = 518; + JPFreq[21][39] = 517; + JPFreq[34][46] = 516; + JPFreq[36][75] = 515; + JPFreq[41][92] = 514; + JPFreq[37][93] = 513; + JPFreq[4][34] = 512; + JPFreq[15][86] = 511; + JPFreq[46][1] = 510; + JPFreq[37][65] = 509; + JPFreq[3][62] = 508; + JPFreq[32][73] = 507; + JPFreq[21][65] = 506; + JPFreq[29][75] = 505; + JPFreq[26][51] = 504; + JPFreq[3][34] = 503; + JPFreq[4][10] = 502; + JPFreq[30][22] = 501; + JPFreq[35][73] = 500; + JPFreq[17][82] = 499; + JPFreq[45][8] = 498; + JPFreq[27][73] = 497; + JPFreq[18][55] = 496; + JPFreq[25][2] = 495; + JPFreq[3][26] = 494; + JPFreq[45][46] = 493; + JPFreq[4][22] = 492; + JPFreq[4][40] = 491; + JPFreq[18][10] = 490; + JPFreq[32][9] = 489; + JPFreq[26][49] = 488; + JPFreq[3][47] = 487; + JPFreq[24][65] = 486; + JPFreq[4][76] = 485; + JPFreq[43][67] = 484; + JPFreq[3][9] = 483; + JPFreq[41][37] = 482; + JPFreq[33][68] = 481; + JPFreq[43][31] = 480; + JPFreq[19][55] = 479; + JPFreq[4][30] = 478; + JPFreq[27][33] = 477; + JPFreq[16][62] = 476; + JPFreq[36][35] = 475; + JPFreq[37][15] = 474; + JPFreq[27][70] = 473; + JPFreq[22][71] = 472; + JPFreq[33][45] = 471; + JPFreq[31][78] = 470; + JPFreq[43][59] = 469; + JPFreq[32][19] = 468; + JPFreq[17][28] = 467; + JPFreq[40][28] = 466; + JPFreq[20][93] = 465; + JPFreq[18][15] = 464; + JPFreq[4][23] = 463; + JPFreq[3][23] = 462; + JPFreq[26][64] = 461; + JPFreq[44][92] = 460; + JPFreq[17][27] = 459; + JPFreq[3][56] = 458; + JPFreq[25][38] = 457; + JPFreq[23][31] = 456; + JPFreq[35][43] = 455; + JPFreq[4][54] = 454; + JPFreq[35][19] = 453; + JPFreq[22][47] = 452; + JPFreq[42][0] = 451; + JPFreq[23][28] = 450; + JPFreq[46][33] = 449; + JPFreq[36][85] = 448; + JPFreq[31][12] = 447; + JPFreq[3][76] = 446; + JPFreq[4][75] = 445; + JPFreq[36][56] = 444; + JPFreq[4][64] = 443; + JPFreq[25][77] = 442; + JPFreq[15][52] = 441; + JPFreq[33][73] = 440; + JPFreq[3][55] = 439; + JPFreq[43][82] = 438; + JPFreq[27][82] = 437; + JPFreq[20][3] = 436; + JPFreq[40][51] = 435; + JPFreq[3][17] = 434; + JPFreq[27][71] = 433; + JPFreq[4][52] = 432; + JPFreq[44][48] = 431; + JPFreq[27][2] = 430; + JPFreq[17][39] = 429; + JPFreq[31][8] = 428; + JPFreq[44][54] = 427; + JPFreq[43][18] = 426; + JPFreq[43][77] = 425; + JPFreq[4][61] = 424; + JPFreq[19][91] = 423; + JPFreq[31][13] = 422; + JPFreq[44][71] = 421; + JPFreq[20][0] = 420; + JPFreq[23][87] = 419; + JPFreq[21][14] = 418; + JPFreq[29][13] = 417; + JPFreq[3][58] = 416; + JPFreq[26][18] = 415; + JPFreq[4][47] = 414; + JPFreq[4][18] = 413; + JPFreq[3][53] = 412; + JPFreq[26][92] = 411; + JPFreq[21][7] = 410; + JPFreq[4][37] = 409; + JPFreq[4][63] = 408; + JPFreq[36][51] = 407; + JPFreq[4][32] = 406; + JPFreq[28][73] = 405; + JPFreq[4][50] = 404; + JPFreq[41][60] = 403; + JPFreq[23][1] = 402; + JPFreq[36][92] = 401; + JPFreq[15][41] = 400; + JPFreq[21][71] = 399; + JPFreq[41][30] = 398; + JPFreq[32][76] = 397; + JPFreq[17][34] = 396; + JPFreq[26][15] = 395; + JPFreq[26][25] = 394; + JPFreq[31][77] = 393; + JPFreq[31][3] = 392; + JPFreq[46][34] = 391; + JPFreq[27][84] = 390; + JPFreq[23][8] = 389; + JPFreq[16][0] = 388; + JPFreq[28][80] = 387; + JPFreq[26][54] = 386; + JPFreq[33][18] = 385; + JPFreq[31][20] = 384; + JPFreq[31][62] = 383; + JPFreq[30][41] = 382; + JPFreq[33][30] = 381; + JPFreq[45][45] = 380; + JPFreq[37][82] = 379; + JPFreq[15][33] = 378; + JPFreq[20][12] = 377; + JPFreq[18][5] = 376; + JPFreq[28][86] = 375; + JPFreq[30][19] = 374; + JPFreq[42][43] = 373; + JPFreq[36][31] = 372; + JPFreq[17][93] = 371; + JPFreq[4][15] = 370; + JPFreq[21][20] = 369; + JPFreq[23][21] = 368; + JPFreq[28][72] = 367; + JPFreq[4][20] = 366; + JPFreq[26][55] = 365; + JPFreq[21][5] = 364; + JPFreq[19][16] = 363; + JPFreq[23][64] = 362; + JPFreq[40][59] = 361; + JPFreq[37][26] = 360; + JPFreq[26][56] = 359; + JPFreq[4][12] = 358; + JPFreq[33][71] = 357; + JPFreq[32][39] = 356; + JPFreq[38][40] = 355; + JPFreq[22][74] = 354; + JPFreq[3][25] = 353; + JPFreq[15][48] = 352; + JPFreq[41][82] = 351; + JPFreq[41][9] = 350; + JPFreq[25][48] = 349; + JPFreq[31][71] = 348; + JPFreq[43][29] = 347; + JPFreq[26][80] = 346; + JPFreq[4][5] = 345; + JPFreq[18][71] = 344; + JPFreq[29][0] = 343; + JPFreq[43][43] = 342; + JPFreq[23][81] = 341; + JPFreq[4][42] = 340; + JPFreq[44][28] = 339; + JPFreq[23][93] = 338; + JPFreq[17][81] = 337; + JPFreq[25][25] = 336; + JPFreq[41][23] = 335; + JPFreq[34][35] = 334; + JPFreq[4][53] = 333; + JPFreq[28][36] = 332; + JPFreq[4][41] = 331; + JPFreq[25][60] = 330; + JPFreq[23][20] = 329; + JPFreq[3][43] = 328; + JPFreq[24][79] = 327; + JPFreq[29][41] = 326; + JPFreq[30][83] = 325; + JPFreq[3][50] = 324; + JPFreq[22][18] = 323; + JPFreq[18][3] = 322; + JPFreq[39][30] = 321; + JPFreq[4][28] = 320; + JPFreq[21][64] = 319; + JPFreq[4][68] = 318; + JPFreq[17][71] = 317; + JPFreq[27][0] = 316; + JPFreq[39][28] = 315; + JPFreq[30][13] = 314; + JPFreq[36][70] = 313; + JPFreq[20][82] = 312; + JPFreq[33][38] = 311; + JPFreq[44][87] = 310; + JPFreq[34][45] = 309; + JPFreq[4][26] = 308; + JPFreq[24][44] = 307; + JPFreq[38][67] = 306; + JPFreq[38][6] = 305; + JPFreq[30][68] = 304; + JPFreq[15][89] = 303; + JPFreq[24][93] = 302; + JPFreq[40][41] = 301; + JPFreq[38][3] = 300; + JPFreq[28][23] = 299; + JPFreq[26][17] = 298; + JPFreq[4][38] = 297; + JPFreq[22][78] = 296; + JPFreq[15][37] = 295; + JPFreq[25][85] = 294; + JPFreq[4][9] = 293; + JPFreq[4][7] = 292; + JPFreq[27][53] = 291; + JPFreq[39][29] = 290; + JPFreq[41][43] = 289; + JPFreq[25][62] = 288; + JPFreq[4][48] = 287; + JPFreq[28][28] = 286; + JPFreq[21][40] = 285; + JPFreq[36][73] = 284; + JPFreq[26][39] = 283; + JPFreq[22][54] = 282; + JPFreq[33][5] = 281; + JPFreq[19][21] = 280; + JPFreq[46][31] = 279; + JPFreq[20][64] = 278; + JPFreq[26][63] = 277; + JPFreq[22][23] = 276; + JPFreq[25][81] = 275; + JPFreq[4][62] = 274; + JPFreq[37][31] = 273; + JPFreq[40][52] = 272; + JPFreq[29][79] = 271; + JPFreq[41][48] = 270; + JPFreq[31][57] = 269; + JPFreq[32][92] = 268; + JPFreq[36][36] = 267; + JPFreq[27][7] = 266; + JPFreq[35][29] = 265; + JPFreq[37][34] = 264; + JPFreq[34][42] = 263; + JPFreq[27][15] = 262; + JPFreq[33][27] = 261; + JPFreq[31][38] = 260; + JPFreq[19][79] = 259; + JPFreq[4][31] = 258; + JPFreq[4][66] = 257; + JPFreq[17][32] = 256; + JPFreq[26][67] = 255; + JPFreq[16][30] = 254; + JPFreq[26][46] = 253; + JPFreq[24][26] = 252; + JPFreq[35][10] = 251; + JPFreq[18][37] = 250; + JPFreq[3][19] = 249; + JPFreq[33][69] = 248; + JPFreq[31][9] = 247; + JPFreq[45][29] = 246; + JPFreq[3][15] = 245; + JPFreq[18][54] = 244; + JPFreq[3][44] = 243; + JPFreq[31][29] = 242; + JPFreq[18][45] = 241; + JPFreq[38][28] = 240; + JPFreq[24][12] = 239; + JPFreq[35][82] = 238; + JPFreq[17][43] = 237; + JPFreq[28][9] = 236; + JPFreq[23][25] = 235; + JPFreq[44][37] = 234; + JPFreq[23][75] = 233; + JPFreq[23][92] = 232; + JPFreq[0][24] = 231; + JPFreq[19][74] = 230; + JPFreq[45][32] = 229; + JPFreq[16][72] = 228; + JPFreq[16][93] = 227; + JPFreq[45][13] = 226; + JPFreq[24][8] = 225; + JPFreq[25][47] = 224; + JPFreq[28][26] = 223; + JPFreq[43][81] = 222; + JPFreq[32][71] = 221; + JPFreq[18][41] = 220; + JPFreq[26][62] = 219; + JPFreq[41][24] = 218; + JPFreq[40][11] = 217; + JPFreq[43][57] = 216; + JPFreq[34][53] = 215; + JPFreq[20][32] = 214; + JPFreq[34][43] = 213; + JPFreq[41][91] = 212; + JPFreq[29][57] = 211; + JPFreq[15][43] = 210; + JPFreq[22][89] = 209; + JPFreq[33][83] = 208; + JPFreq[43][20] = 207; + JPFreq[25][58] = 206; + JPFreq[30][30] = 205; + JPFreq[4][56] = 204; + JPFreq[17][64] = 203; + JPFreq[23][0] = 202; + JPFreq[44][12] = 201; + JPFreq[25][37] = 200; + JPFreq[35][13] = 199; + JPFreq[20][30] = 198; + JPFreq[21][84] = 197; + JPFreq[29][14] = 196; + JPFreq[30][5] = 195; + JPFreq[37][2] = 194; + JPFreq[4][78] = 193; + JPFreq[29][78] = 192; + JPFreq[29][84] = 191; + JPFreq[32][86] = 190; + JPFreq[20][68] = 189; + JPFreq[30][39] = 188; + JPFreq[15][69] = 187; + JPFreq[4][60] = 186; + JPFreq[20][61] = 185; + JPFreq[41][67] = 184; + JPFreq[16][35] = 183; + JPFreq[36][57] = 182; + JPFreq[39][80] = 181; + JPFreq[4][59] = 180; + JPFreq[4][44] = 179; + JPFreq[40][54] = 178; + JPFreq[30][8] = 177; + JPFreq[44][30] = 176; + JPFreq[31][93] = 175; + JPFreq[31][47] = 174; + JPFreq[16][70] = 173; + JPFreq[21][0] = 172; + JPFreq[17][35] = 171; + JPFreq[21][67] = 170; + JPFreq[44][18] = 169; + JPFreq[36][29] = 168; + JPFreq[18][67] = 167; + JPFreq[24][28] = 166; + JPFreq[36][24] = 165; + JPFreq[23][5] = 164; + JPFreq[31][65] = 163; + JPFreq[26][59] = 162; + JPFreq[28][2] = 161; + JPFreq[39][69] = 160; + JPFreq[42][40] = 159; + JPFreq[37][80] = 158; + JPFreq[15][66] = 157; + JPFreq[34][38] = 156; + JPFreq[28][48] = 155; + JPFreq[37][77] = 154; + JPFreq[29][34] = 153; + JPFreq[33][12] = 152; + JPFreq[4][65] = 151; + JPFreq[30][31] = 150; + JPFreq[27][92] = 149; + JPFreq[4][2] = 148; + JPFreq[4][51] = 147; + JPFreq[23][77] = 146; + JPFreq[4][35] = 145; + JPFreq[3][13] = 144; + JPFreq[26][26] = 143; + JPFreq[44][4] = 142; + JPFreq[39][53] = 141; + JPFreq[20][11] = 140; + JPFreq[40][33] = 139; + JPFreq[45][7] = 138; + JPFreq[4][70] = 137; + JPFreq[3][49] = 136; + JPFreq[20][59] = 135; + JPFreq[21][12] = 134; + JPFreq[33][53] = 133; + JPFreq[20][14] = 132; + JPFreq[37][18] = 131; + JPFreq[18][17] = 130; + JPFreq[36][23] = 129; + JPFreq[18][57] = 128; + JPFreq[26][74] = 127; + JPFreq[35][2] = 126; + JPFreq[38][58] = 125; + JPFreq[34][68] = 124; + JPFreq[29][81] = 123; + JPFreq[20][69] = 122; + JPFreq[39][86] = 121; + JPFreq[4][16] = 120; + JPFreq[16][49] = 119; + JPFreq[15][72] = 118; + JPFreq[26][35] = 117; + JPFreq[32][14] = 116; + JPFreq[40][90] = 115; + JPFreq[33][79] = 114; + JPFreq[35][4] = 113; + JPFreq[23][33] = 112; + JPFreq[19][19] = 111; + JPFreq[31][41] = 110; + JPFreq[44][1] = 109; + JPFreq[22][56] = 108; + JPFreq[31][27] = 107; + JPFreq[32][18] = 106; + JPFreq[27][32] = 105; + JPFreq[37][39] = 104; + JPFreq[42][11] = 103; + JPFreq[29][71] = 102; + JPFreq[32][58] = 101; + JPFreq[46][10] = 100; + JPFreq[17][30] = 99; + JPFreq[38][15] = 98; + JPFreq[29][60] = 97; + JPFreq[4][11] = 96; + JPFreq[38][31] = 95; + JPFreq[40][79] = 94; + JPFreq[28][49] = 93; + JPFreq[28][84] = 92; + JPFreq[26][77] = 91; + JPFreq[22][32] = 90; + JPFreq[33][17] = 89; + JPFreq[23][18] = 88; + JPFreq[32][64] = 87; + JPFreq[4][6] = 86; + JPFreq[33][51] = 85; + JPFreq[44][77] = 84; + JPFreq[29][5] = 83; + JPFreq[46][25] = 82; + JPFreq[19][58] = 81; + JPFreq[4][46] = 80; + JPFreq[15][71] = 79; + JPFreq[18][58] = 78; + JPFreq[26][45] = 77; + JPFreq[45][66] = 76; + JPFreq[34][10] = 75; + JPFreq[19][37] = 74; + JPFreq[33][65] = 73; + JPFreq[44][52] = 72; + JPFreq[16][38] = 71; + JPFreq[36][46] = 70; + JPFreq[20][26] = 69; + JPFreq[30][37] = 68; + JPFreq[4][58] = 67; + JPFreq[43][2] = 66; + JPFreq[30][18] = 65; + JPFreq[19][35] = 64; + JPFreq[15][68] = 63; + JPFreq[3][36] = 62; + JPFreq[35][40] = 61; + JPFreq[36][32] = 60; + JPFreq[37][14] = 59; + JPFreq[17][11] = 58; + JPFreq[19][78] = 57; + JPFreq[37][11] = 56; + JPFreq[28][63] = 55; + JPFreq[29][61] = 54; + JPFreq[33][3] = 53; + JPFreq[41][52] = 52; + JPFreq[33][63] = 51; + JPFreq[22][41] = 50; + JPFreq[4][19] = 49; + JPFreq[32][41] = 48; + JPFreq[24][4] = 47; + JPFreq[31][28] = 46; + JPFreq[43][30] = 45; + JPFreq[17][3] = 44; + JPFreq[43][70] = 43; + JPFreq[34][19] = 42; + JPFreq[20][77] = 41; + JPFreq[18][83] = 40; + JPFreq[17][15] = 39; + JPFreq[23][61] = 38; + JPFreq[40][27] = 37; + JPFreq[16][48] = 36; + JPFreq[39][78] = 35; + JPFreq[41][53] = 34; + JPFreq[40][91] = 33; + JPFreq[40][72] = 32; + JPFreq[18][52] = 31; + JPFreq[35][66] = 30; + JPFreq[39][93] = 29; + JPFreq[19][48] = 28; + JPFreq[26][36] = 27; + JPFreq[27][25] = 26; + JPFreq[42][71] = 25; + JPFreq[42][85] = 24; + JPFreq[26][48] = 23; + JPFreq[28][15] = 22; + JPFreq[3][66] = 21; + JPFreq[25][24] = 20; + JPFreq[27][43] = 19; + JPFreq[27][78] = 18; + JPFreq[45][43] = 17; + JPFreq[27][72] = 16; + JPFreq[40][29] = 15; + JPFreq[41][0] = 14; + JPFreq[19][57] = 13; + JPFreq[15][59] = 12; + JPFreq[29][29] = 11; + JPFreq[4][25] = 10; + JPFreq[21][42] = 9; + JPFreq[23][35] = 8; + JPFreq[33][1] = 7; + JPFreq[4][57] = 6; + JPFreq[17][60] = 5; + JPFreq[25][19] = 4; + JPFreq[22][65] = 3; + JPFreq[42][29] = 2; + JPFreq[27][66] = 1; + JPFreq[26][89] = 0; + } + } + + class Encoding { + // Supported Encoding Types + public static int GB2312 = 0; + + public static int GBK = 1; + + public static int GB18030 = 2; + + public static int HZ = 3; + + public static int BIG5 = 4; + + public static int CNS11643 = 5; + + public static int UTF8 = 6; + + public static int UTF8T = 7; + + public static int UTF8S = 8; + + public static int UNICODE = 9; + + public static int UNICODET = 10; + + public static int UNICODES = 11; + + public static int ISO2022CN = 12; + + public static int ISO2022CN_CNS = 13; + + public static int ISO2022CN_GB = 14; + + public static int EUC_KR = 15; + + public static int CP949 = 16; + + public static int ISO2022KR = 17; + + public static int JOHAB = 18; + + public static int SJIS = 19; + + public static int EUC_JP = 20; + + public static int ISO2022JP = 21; + + public static int ASCII = 22; + + public static int OTHER = 23; + + public static int TOTALTYPES = 24; + + public final static int SIMP = 0; + + public final static int TRAD = 1; + + // Names of the encodings as understood by Java + public static String[] javaname; + + // Names of the encodings for human viewing + public static String[] nicename; + + // Names of charsets as used in charset parameter of HTML Meta tag + public static String[] htmlname; + + // Constructor + public Encoding() { + javaname = new String[TOTALTYPES]; + nicename = new String[TOTALTYPES]; + htmlname = new String[TOTALTYPES]; + // Assign encoding names + javaname[GB2312] = "GB2312"; + javaname[GBK] = "GBK"; + javaname[GB18030] = "GB18030"; + javaname[HZ] = "ASCII"; // What to put here? Sun doesn't support HZ + javaname[ISO2022CN_GB] = "ISO2022CN_GB"; + javaname[BIG5] = "BIG5"; + javaname[CNS11643] = "EUC-TW"; + javaname[ISO2022CN_CNS] = "ISO2022CN_CNS"; + javaname[ISO2022CN] = "ISO2022CN"; + javaname[UTF8] = "UTF-8"; + javaname[UTF8T] = "UTF-8"; + javaname[UTF8S] = "UTF-8"; + javaname[UNICODE] = "Unicode"; + javaname[UNICODET] = "Unicode"; + javaname[UNICODES] = "Unicode"; + javaname[EUC_KR] = "EUC_KR"; + javaname[CP949] = "MS949"; + javaname[ISO2022KR] = "ISO2022KR"; + javaname[JOHAB] = "Johab"; + javaname[SJIS] = "SJIS"; + javaname[EUC_JP] = "EUC_JP"; + javaname[ISO2022JP] = "ISO2022JP"; + javaname[ASCII] = "ASCII"; + javaname[OTHER] = "ISO8859_1"; + // Assign encoding names + htmlname[GB2312] = "GB2312"; + htmlname[GBK] = "GBK"; + htmlname[GB18030] = "GB18030"; + htmlname[HZ] = "HZ-GB-2312"; + htmlname[ISO2022CN_GB] = "ISO-2022-CN-EXT"; + htmlname[BIG5] = "BIG5"; + htmlname[CNS11643] = "EUC-TW"; + htmlname[ISO2022CN_CNS] = "ISO-2022-CN-EXT"; + htmlname[ISO2022CN] = "ISO-2022-CN"; + htmlname[UTF8] = "UTF-8"; + htmlname[UTF8T] = "UTF-8"; + htmlname[UTF8S] = "UTF-8"; + htmlname[UNICODE] = "UTF-16"; + htmlname[UNICODET] = "UTF-16"; + htmlname[UNICODES] = "UTF-16"; + htmlname[EUC_KR] = "EUC-KR"; + htmlname[CP949] = "x-windows-949"; + htmlname[ISO2022KR] = "ISO-2022-KR"; + htmlname[JOHAB] = "x-Johab"; + htmlname[SJIS] = "Shift_JIS"; + htmlname[EUC_JP] = "EUC-JP"; + htmlname[ISO2022JP] = "ISO-2022-JP"; + htmlname[ASCII] = "ASCII"; + htmlname[OTHER] = "ISO8859-1"; + // Assign Human readable names + nicename[GB2312] = "GB-2312"; + nicename[GBK] = "GBK"; + nicename[GB18030] = "GB18030"; + nicename[HZ] = "HZ"; + nicename[ISO2022CN_GB] = "ISO2022CN-GB"; + nicename[BIG5] = "Big5"; + nicename[CNS11643] = "CNS11643"; + nicename[ISO2022CN_CNS] = "ISO2022CN-CNS"; + nicename[ISO2022CN] = "ISO2022 CN"; + nicename[UTF8] = "UTF-8"; + nicename[UTF8T] = "UTF-8 (Trad)"; + nicename[UTF8S] = "UTF-8 (Simp)"; + nicename[UNICODE] = "Unicode"; + nicename[UNICODET] = "Unicode (Trad)"; + nicename[UNICODES] = "Unicode (Simp)"; + nicename[EUC_KR] = "EUC-KR"; + nicename[CP949] = "CP949"; + nicename[ISO2022KR] = "ISO 2022 KR"; + nicename[JOHAB] = "Johab"; + nicename[SJIS] = "Shift-JIS"; + nicename[EUC_JP] = "EUC-JP"; + nicename[ISO2022JP] = "ISO 2022 JP"; + nicename[ASCII] = "ASCII"; + nicename[OTHER] = "OTHER"; + } + + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreDialog.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreDialog.java new file mode 100644 index 000000000..c316311ab --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreDialog.java @@ -0,0 +1,122 @@ +package com.fr.design.onlineupdate.ui.dialog; + +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.onlineupdate.domain.UpdateConstants; +import com.fr.design.onlineupdate.factory.DirectoryOperationFactory; +import com.fr.design.onlineupdate.ui.widget.ColorfulCellRender; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.locale.InterProviderFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.StableUtils; + +import javax.swing.BoxLayout; +import javax.swing.JDialog; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ScrollPaneConstants; +import java.awt.BorderLayout; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Arrays; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class RestoreDialog extends JDialog { + private static final int LISTCELLHEIGHT = 30; + private static final Dimension RESTOREJAR = new Dimension(523, 480); + private static final Dimension RESTOREJAR_NORTHPANE = new Dimension(500, 392); + //一个页面上最少显示13个元素 + private static final int NUMOFCELL_LEAST = 13; + + private UIButton okButton; + private UIButton cancelButton; + private JPanel buttonPanel; + private String jarSelected; + + public RestoreDialog(Dialog parent, boolean modal) { + super(parent, modal); + initComponents(); + } + + public RestoreDialog(Frame parent, boolean modal) { + super(parent, modal); + initComponents(); + } + + private void initButton() { + okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Ok")); + cancelButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Cancel")); + + okButton.setEnabled(false); + okButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + RestoreResultDialog dialog = new RestoreResultDialog(DesignerContext.getDesignerFrame(), true, jarSelected); + dialog.showDialog(); + } + }); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + } + + private void initComponents() { + + this.setResizable(false); + JPanel pane = FRGUIPaneFactory.createBorderLayout_L_Pane(); + this.setContentPane(pane); + + initButton(); + + buttonPanel = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + buttonPanel.add(okButton); + buttonPanel.add(cancelButton); + pane.add(buttonPanel, BorderLayout.SOUTH); + + JPanel jarListPane = new JPanel(); + jarListPane.setLayout(new BoxLayout(jarListPane, BoxLayout.Y_AXIS)); + String[] jarBackupFiles = DirectoryOperationFactory.listFilteredFiles(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR); + + ArrayUtils.reverse(jarBackupFiles); + String[] jarFilesList = ((jarBackupFiles.length < NUMOFCELL_LEAST) ? Arrays.copyOf(jarBackupFiles, NUMOFCELL_LEAST) : jarBackupFiles); + final JList jarList = new JList(jarFilesList); + jarList.setFixedCellHeight(LISTCELLHEIGHT); + jarList.setCellRenderer(new ColorfulCellRender()); + jarList.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + super.mousePressed(e); + jarSelected = (String) jarList.getSelectedValue(); + okButton.setEnabled((jarSelected != null)); + } + }); + + JScrollPane jsp = new JScrollPane(jarList, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); + jsp.setPreferredSize(RESTOREJAR_NORTHPANE); + pane.add(jsp, BorderLayout.NORTH); + + } + + /** + * 显示窗口 + */ + public void showDialog() { + this.setSize(RESTOREJAR); + this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); + GUICoreUtils.centerWindow(this); + this.setVisible(true); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreResultDialog.java new file mode 100644 index 000000000..787a88ea8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/RestoreResultDialog.java @@ -0,0 +1,182 @@ +package com.fr.design.onlineupdate.ui.dialog; + +import com.fr.base.FRContext; +import com.fr.design.RestartHelper; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.onlineupdate.domain.UpdateConstants; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.locale.InterProviderFactory; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; + +import javax.swing.AbstractAction; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import java.awt.BorderLayout; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class RestoreResultDialog extends JDialog { + private static final Dimension RESTORE = new Dimension(340, 100); + + private static final Dimension RESTORE_OLD_VERSION = new Dimension(340, 135); + + private String jarRestoreDir; + + public RestoreResultDialog(Dialog parent, boolean modal) { + super(parent, modal); + initCommonComponents(); + } + + public RestoreResultDialog(Frame parent, boolean modal, String jarDir) { + super(parent, modal); + this.jarRestoreDir = jarDir; + if (ComparatorUtils.equals(jarDir, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restore_Old_Version"))) { + initOldVersionRestoreComps(); + } else { + initCommonComponents(); + } + } + + private void initCommonComponents() { + this.setResizable(false); + JPanel pane = new JPanel(); + pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10)); + pane.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setContentPane(pane); + + UIButton restartButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); + UIButton restartLaterButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Later")); + + restartButton.setFont(new Font("Default", Font.PLAIN, 12)); + restartButton.setEnabled(false); + restartButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + RestartHelper.restart(); + } + }); + restartLaterButton.setFont(new Font("Default", Font.PLAIN, 12)); + restartLaterButton.setEnabled(false); + restartLaterButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + JPanel buttonPane = new JPanel(); + buttonPane.add(restartLaterButton); + buttonPane.add(restartButton); + pane.add(buttonPane, BorderLayout.SOUTH); + + JPanel progressLabelPane = new JPanel(new BorderLayout()); + UILabel jarProgressLabel = new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restore_To")) + " " + jarRestoreDir + " " + (com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_WorksAfterRestart"))); + jarProgressLabel.setFont(new Font("Default", Font.PLAIN, 12)); + jarProgressLabel.setVisible(true); + progressLabelPane.add(jarProgressLabel); + pane.add(progressLabelPane, BorderLayout.CENTER); + + UpdateMainDialog.deletePreviousPropertyFile(); + + putJarBackupFiles(); + restartButton.setEnabled(true); + restartLaterButton.setEnabled(true); + this.setSize(RESTORE); + this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); + } + + private void initOldVersionRestoreComps() { + this.setResizable(false); + JPanel pane = new JPanel(); + pane.setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10)); + pane.setLayout(FRGUIPaneFactory.createBorderLayout()); + this.setContentPane(pane); + + UIButton okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Ok")); + okButton.setFont(new Font("Default", Font.PLAIN, 12)); + okButton.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + JPanel buttonPane = new JPanel(); + buttonPane.add(okButton); + pane.add(buttonPane, BorderLayout.SOUTH); + + JPanel infoPane = new JPanel(new BorderLayout()); + JTextArea jTextArea = new JTextArea( + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Already_Backup_Old_Project") + + StringUtils.BLANK + + StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR) + + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Unzip_Replace_Restore") + ); + jTextArea.setLineWrap(true); + jTextArea.setEditable(false); + jTextArea.setBackground(null); + jTextArea.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + jTextArea.setFont(new Font("Default", Font.PLAIN, 12)); + infoPane.add(jTextArea); + pane.add(infoPane, BorderLayout.CENTER); + + this.setSize(RESTORE_OLD_VERSION); + this.setTitle(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Updater_Restore_to_V8")); + } + + + /** + * 显示窗口 + */ + public void showDialog() { + GUICoreUtils.centerWindow(this); + this.setVisible(true); + } + + private void putJarBackupFiles() { + Map map = new HashMap(); + java.util.List list = new ArrayList(); + String installHome = StableUtils.getInstallHome(); + + putJarBackupFilesToInstallLib(installHome, map, list); + putJarBackupFilesToInstallEnv(installHome, map, list); + RestartHelper.saveFilesWhichToMove(map); + RestartHelper.saveFilesWhichToDelete(list.toArray(new String[list.size()])); + } + + private void putJarBackupFilesToInstallLib(String installHome, Map map, java.util.List list) { + String[] files = UpdateConstants.JARS_FOR_DESIGNER_X; + String backupDir = UpdateConstants.DESIGNER_BACKUP_DIR; + for (String file : files) { + map.put(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, file), + StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); + list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); + } + } + + private void putJarBackupFilesToInstallEnv(String installHome, Map map, java.util.List list) { + String[] files = UpdateConstants.JARS_FOR_SERVER_X; + String backupDir = UpdateConstants.DESIGNER_BACKUP_DIR; + for (String file : files) { + map.put(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, file), + StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); + list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); + } + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/UpdateMainDialog.java new file mode 100644 index 000000000..3f99543a3 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/dialog/UpdateMainDialog.java @@ -0,0 +1,821 @@ +package com.fr.design.onlineupdate.ui.dialog; + +import com.fr.base.FRContext; +import com.fr.design.RestartHelper; +import com.fr.design.constants.LayoutConstants; +import com.fr.design.dialog.UIDialog; +import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.icontainer.UIScrollPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.onlineupdate.actions.FileDownloader; +import com.fr.design.onlineupdate.domain.DownloadItem; +import com.fr.design.onlineupdate.domain.UpdateConstants; +import com.fr.design.onlineupdate.domain.UpdateInfoCachePropertyManager; +import com.fr.design.onlineupdate.factory.DirectoryOperationFactory; +import com.fr.design.onlineupdate.ui.widget.LoadingLabel; +import com.fr.design.onlineupdate.ui.widget.UpdateActionLabel; +import com.fr.design.onlineupdate.ui.widget.UpdateInfoTable; +import com.fr.design.onlineupdate.ui.widget.UpdateInfoTableCellRender; +import com.fr.design.onlineupdate.ui.widget.UpdateInfoTableModel; +import com.fr.design.onlineupdate.ui.widget.UpdateInfoTextAreaCellRender; +import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.ComparatorUtils; +import com.fr.general.DateUtils; +import com.fr.general.GeneralUtils; +import com.fr.general.IOUtils; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; +import com.sun.java.swing.plaf.motif.MotifProgressBarUI; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.RowSorter; +import javax.swing.SortOrder; +import javax.swing.SwingConstants; +import javax.swing.SwingWorker; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.table.TableRowSorter; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dialog; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateMainDialog extends UIDialog { + public static final Dimension DEFAULT = new Dimension(660, 620); + + private static final Dimension PROGRESSBAR = new Dimension(120, 15); + private static final Dimension UPDATE_BUTTON = new Dimension(80, 24); + private static final int UPDATE_PANE_ROW_SIZE = 30; + private static final int UPDATE_CONTENT_PANE_ROW_SIZE = 10; + private static final int UPDATE_CONTENT_PANE_COLUMN_SIZE = 10; + private static final int UPDATE_CONTENT_PANE_LABEL_COLUMN_SIZE = 100; + private static final int SEARCH_PANE_ROW_SIZE = 50; + private static final int SEARCH_PANE_TEXT_COLUMN = 130; + private static final int SEARCH_PANE_COLUMN_GAP = 3; + private static final int UPDATE_INFO_TABLE_HEADER_TIME_WIDTH = 120; + private static final int UPDATE_CONTENT_PANE_BORDER_COLOR = 0xCCCCCC; + private static final int RESTORE_LABEL_COLOR = 0x3384F0; + + private static final String UPDATE_CACHE_STATE_FAIL = "fail"; + private static final String UPDATE_CACHE_STATE_SUCCESS = "success"; + + private static final SimpleDateFormat CHANGELOG_FORMAT = new SimpleDateFormat("M/d/y, h:m:s a", Locale.ENGLISH); + private static final SimpleDateFormat UPDATE_INFO_TABLE_FORMAT = new SimpleDateFormat("yyyy.MM.dd"); + + private Set downloadItems = new HashSet(); + private JSONObject downloadFileConfig; + //最新版本标签 + private LoadingLabel loadingLabel; + //更新按钮 + private UIButton updateButton; + //有新版本提示标签 + private UILabel updateLabel; + + //jar包版本信息面板,包括当前版本和最新版本 + private JPanel jarVersionInfoPane; + //jar包更新信息面板,包括每个版本更新的信息 + private JPanel jarUpdateInfoPane; + //jar包更新操作面板,包括更新重启按钮和进度条 + private JPanel updateActionPane; + //进度条 + private JProgressBar progressBar; + //更新版本提示面板 + private JPanel updateVersionReminderPane; + //jar包版本标签 + private UILabel jarCurrentLabel; + //jar包还原标签 + private UILabel jarRestoreLabel; + //更新信息搜索按钮 + private UIButton searchUpdateInfoBtn; + //搜索更新信息关键词文本框 + private UITextField searchUpdateInfoKeyword; + + private boolean updateSuccessful; + + private UpdateInfoTable updateInfoTable; + + private ArrayList updateInfoList; + + private boolean getUpdateInfoSuccess; + + private UpdateInfoCachePropertyManager cacheProperty; + private String lastUpdateCacheTime; + private String lastUpdateCacheState = UPDATE_CACHE_STATE_FAIL; + + public UpdateMainDialog(Dialog parent) { + super(parent); + initComponents(); + } + + public UpdateMainDialog(Frame parent) { + super(parent); + setModal(true); + initComponents(); + } + + private void initUpdateActionPane() { + double[] rowUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_ROW_SIZE, TableLayout.PREFERRED, UPDATE_CONTENT_PANE_ROW_SIZE}; + double[] rowUpdateContentPaneSize = {TableLayout.PREFERRED}; + double[] columnUpdateSubContentPaneProgressSize = {TableLayout.FILL, TableLayout.PREFERRED}; + double[] columnUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_COLUMN_SIZE, TableLayout.FILL, TableLayout.PREFERRED}; + JPanel progressBarPane = new JPanel(new BorderLayout()); + + progressBar = new JProgressBar(); + progressBar.setUI(new MotifProgressBarUI()); + progressBar.setForeground(UpdateConstants.BAR_COLOR); + progressBar.setVisible(false); + progressBar.setStringPainted(true); + progressBar.setPreferredSize(PROGRESSBAR); + + updateLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_New_Version_Available")); + updateLabel.setHorizontalAlignment(SwingConstants.RIGHT); + updateLabel.setVisible(false); + + progressBarPane.add(GUICoreUtils.createBorderLayoutPane( + progressBar, BorderLayout.CENTER, + updateLabel, BorderLayout.EAST + ), BorderLayout.CENTER); + + updateActionPane = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(), new UILabel(), new UILabel()}, + new Component[]{new UILabel(), initPaneContent(getBackground(), rowUpdateContentPaneSize, columnUpdateSubContentPaneProgressSize, progressBarPane, updateButton), new UILabel()}, + new Component[]{new UILabel(), new UILabel(), new UILabel()} + }, rowUpdateSubContentPaneSize, columnUpdateSubContentPaneSize, LayoutConstants.VGAP_LARGE); + } + + private JPanel initPaneContent(Color color, double[] row, double[] column, Component... var) { + JPanel paneContent = TableLayoutHelper.createTableLayoutPane(new Component[][]{var}, row, column); + paneContent.setBackground(color); + return paneContent; + } + + private void initJarVersionInfoPane() { + double[] rowUpdatePaneSize = {UPDATE_PANE_ROW_SIZE, TableLayout.PREFERRED, TableLayout.PREFERRED}; + double[] columnUpdatePaneSize = {TableLayout.PREFERRED, TableLayout.FILL, TableLayout.PREFERRED}; + double[] rowUpdateContentPaneSize = {TableLayout.PREFERRED}; + double[] columnUpdateContentPaneSize = {TableLayout.PREFERRED, TableLayout.FILL, TableLayout.PREFERRED}; + double[] rowUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_ROW_SIZE, TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED, UPDATE_CONTENT_PANE_ROW_SIZE}; + double[] columnUpdateSubContentPaneSize = {UPDATE_CONTENT_PANE_COLUMN_SIZE, TableLayout.FILL, TableLayout.PREFERRED}; + double[] columnUpdateSubContentPaneLabelSize = {UPDATE_CONTENT_PANE_LABEL_COLUMN_SIZE, TableLayout.PREFERRED}; + + JPanel jarUpdateContentPane = new JPanel(); + jarUpdateContentPane.setLayout(new BorderLayout()); + jarUpdateContentPane.setBorder(BorderFactory.createLineBorder(new Color(UPDATE_CONTENT_PANE_BORDER_COLOR))); + + JPanel jarUpdateContentPane2 = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(), new UILabel(), new UILabel()}, + new Component[]{new UILabel(), updateVersionReminderPane, new UILabel()}, + new Component[]{new UILabel(), initPaneContent(Color.WHITE, rowUpdateContentPaneSize, columnUpdateSubContentPaneLabelSize, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_JAR_Version")), jarCurrentLabel), new UILabel()}, + new Component[]{new UILabel(), initPaneContent(Color.WHITE, rowUpdateContentPaneSize, columnUpdateSubContentPaneLabelSize, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Latest_JAR")), loadingLabel), new UILabel()}, + new Component[]{new UILabel(), new UILabel(), new UILabel()} + }, rowUpdateSubContentPaneSize, columnUpdateSubContentPaneSize, LayoutConstants.VGAP_LARGE); + jarUpdateContentPane2.setBackground(Color.WHITE); + jarUpdateContentPane.add(jarUpdateContentPane2); + jarVersionInfoPane = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(), new UILabel(), new UILabel()}, + new Component[]{new UILabel(), initPaneContent(getBackground(), rowUpdateContentPaneSize, columnUpdateContentPaneSize, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_JarUpdate")), new UILabel(), jarRestoreLabel), new UILabel()}, + new Component[]{new UILabel(), jarUpdateContentPane, new UILabel()} + }, rowUpdatePaneSize, columnUpdatePaneSize, LayoutConstants.VGAP_LARGE); + } + + private void initJarUpdateInfoPane() { + double[] rowUpdatePaneSize = {SEARCH_PANE_ROW_SIZE, TableLayout.FILL}; + double[] columnUpdatePaneSize = {TableLayout.PREFERRED, TableLayout.FILL, TableLayout.PREFERRED}; + + double[] searchRow = {UPDATE_CONTENT_PANE_ROW_SIZE, TableLayout.PREFERRED, SEARCH_PANE_COLUMN_GAP * 2}; + double[] searchColumn = {TableLayout.FILL, SEARCH_PANE_TEXT_COLUMN, TableLayout.PREFERRED}; + initUpdateInfoSearchPane(); + JPanel searchPane = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(), new UILabel(), new UILabel()}, + new Component[]{new UILabel(), searchUpdateInfoKeyword, searchUpdateInfoBtn}, + new Component[]{new UILabel(), new UILabel(), new UILabel()} + }, searchRow, searchColumn, LayoutConstants.VGAP_LARGE); + + String[] columnNames = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Date"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Content"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_SignHeader")}; + initUpdateInfoTable(columnNames); + + UIScrollPane uiScrollPane = new UIScrollPane(updateInfoTable); + jarUpdateInfoPane = TableLayoutHelper.createCommonTableLayoutPane(new Component[][]{ + new Component[]{new UILabel(), searchPane, new UILabel()}, + new Component[]{new UILabel(), uiScrollPane, new UILabel()} + }, rowUpdatePaneSize, columnUpdatePaneSize, LayoutConstants.VGAP_LARGE); + } + + private void initUpdateInfoTable(String[] columnNames) { + int updateTimeColIndex = 0; + int updateTitleColIndex = 1; + int updateSignColIndex = 2; + + updateInfoTable = new UpdateInfoTable(columnNames); + + updateInfoTable.setShowGrid(false); + updateInfoTable.setCellSelectionEnabled(false); + TableRowSorter sorter = new TableRowSorter(updateInfoTable.getDataModel()); + sorter.setSortable(updateTimeColIndex, true); + sorter.setSortable(updateTitleColIndex, false); + sorter.setSortable(updateSignColIndex, false); + updateInfoTable.setRowSorter(sorter); + List sortKeys = new ArrayList(); + sortKeys.add(new RowSorter.SortKey(updateTimeColIndex, SortOrder.DESCENDING)); + sorter.setSortKeys(sortKeys); + + updateInfoTable.getTableHeader().setReorderingAllowed(false); + updateInfoTable.getColumnModel().getColumn(updateTimeColIndex).setMaxWidth(UPDATE_INFO_TABLE_HEADER_TIME_WIDTH); + updateInfoTable.getColumnModel().getColumn(updateTimeColIndex).setMinWidth(UPDATE_INFO_TABLE_HEADER_TIME_WIDTH); + updateInfoTable.getColumnModel().getColumn(updateSignColIndex).setMaxWidth(0); + updateInfoTable.getColumnModel().getColumn(updateSignColIndex).setMinWidth(0); + updateInfoTable.getTableHeader().getColumnModel().getColumn(updateSignColIndex).setMaxWidth(0); + updateInfoTable.getTableHeader().getColumnModel().getColumn(updateSignColIndex).setMinWidth(0); + updateInfoTable.getColumn(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Date")).setCellRenderer(new UpdateInfoTableCellRender()); + updateInfoTable.getColumn(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Content")).setCellRenderer(new UpdateInfoTextAreaCellRender()); + } + + private void initUpdateInfoSearchPane() { + searchUpdateInfoKeyword = new UITextField(); + searchUpdateInfoKeyword.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + } + + @Override + public void removeUpdate(DocumentEvent e) { + String keyword = searchUpdateInfoKeyword.getText(); + if (ComparatorUtils.equals(keyword, StringUtils.EMPTY) && getUpdateInfoSuccess) { + updateInfoList.clear(); + getUpdateInfo(keyword).execute(); + } + } + + @Override + public void changedUpdate(DocumentEvent e) { + } + }); + searchUpdateInfoBtn = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Search")); + searchUpdateInfoBtn.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (getUpdateInfoSuccess) { + updateInfoList.clear(); + getUpdateInfo(searchUpdateInfoKeyword.getText()).execute(); + } + } + }); + } + + private void initButtonAndLabel() { + loadingLabel = new LoadingLabel(); + loadingLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Checking_Jar_Update")); + updateButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Update")); + updateButton.setPreferredSize(UPDATE_BUTTON); + updateButton.setEnabled(false); + + double[] rowSize = {TableLayout.PREFERRED}; + + double[] colSize = {UPDATE_CONTENT_PANE_LABEL_COLUMN_SIZE, TableLayout.PREFERRED}; + updateVersionReminderPane = initPaneContent( + Color.WHITE, rowSize, colSize, + new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Designer_Version")), + new UILabel(UpdateConstants.DEFAULT_APP_NAME + StringUtils.BLANK + ProductConstants.VERSION) + ); + + + jarCurrentLabel = new UILabel(StringUtils.isEmpty(GeneralUtils.readBuildNO()) ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Not_Install_Version") : GeneralUtils.readBuildNO(), SwingConstants.CENTER); + UILabel noJarPreviousRevision = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_No_Previous_Version")); + UpdateActionLabel jarRestorePreviousRevision = new UpdateActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restore"), false); + jarRestorePreviousRevision.setForeground(new Color(RESTORE_LABEL_COLOR)); + jarRestorePreviousRevision.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + RestoreDialog dialog = new RestoreDialog(DesignerContext.getDesignerFrame(), true); + dialog.showDialog(); + } + }); + //choose RestoreLabel to show + boolean isNeedRestore = ArrayUtils.isNotEmpty(DirectoryOperationFactory.listFilteredFiles(StableUtils.getInstallHome(), getBackupDirectory())); + jarRestoreLabel = isNeedRestore ? jarRestorePreviousRevision : noJarPreviousRevision; + } + + private void initComponents() { + JPanel contentPane = (JPanel) getContentPane(); + contentPane.setLayout(new BorderLayout()); + + + initButtonAndLabel(); + + initJarVersionInfoPane(); + initJarUpdateInfoPane(); + initUpdateActionPane(); + + add(jarVersionInfoPane, BorderLayout.NORTH); + add(jarUpdateInfoPane, BorderLayout.CENTER); + add(updateActionPane, BorderLayout.SOUTH); + + addActionListenerForUpdateBtn(); + + new SwingWorker() { + @Override + protected JSONObject doInBackground() throws Exception { + HttpClient hc = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("jar10.update")); + hc.setTimeout(UpdateConstants.CONNECTION_TIMEOUT); + return new JSONObject(hc.getResponseText()); + } + + @Override + protected void done() { + try { + downloadFileConfig = get(); + showDownLoadInfo(); + } catch (InterruptedException e) { + stopLoading(); + } catch (ExecutionException e) { + stopLoading(); + } finally { + getUpdateInfo(StringUtils.EMPTY).execute(); + } + } + }.execute(); + } + + private SwingWorker getUpdateInfo(final String keyword) { + updateInfoList = new ArrayList(); + lastUpdateCacheTime = UpdateConstants.CHANGELOG_X_START; + String cacheConfigPath = getUpdateCacheConfig(); + cacheProperty = new UpdateInfoCachePropertyManager(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), "resources", "offlineres", cacheConfigPath)); + String recordUpdateTime = cacheProperty.readProperty("updateTime"); + if (StringUtils.isNotEmpty(recordUpdateTime)) { + lastUpdateCacheTime = recordUpdateTime; + } + String recordUpdateState = cacheProperty.readProperty("updateState"); + if (StringUtils.isNotEmpty(recordUpdateState)) { + lastUpdateCacheState = recordUpdateState; + } + return new SwingWorker() { + @Override + protected JSONArray doInBackground() { + try { + getUpdateInfoSuccess = false; + //step1:read from cache file + getCachedUpdateInfo(keyword); + //step2:read from website,start from cacheRecordTime + if (downloadFileConfig == null) { + throw new Exception("network error."); + } + HttpClient hc = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("changelog10") + "&start=" + lastUpdateCacheTime + "&end=" + getLatestJARTimeStr()); + hc.asGet(); + hc.setTimeout(UpdateConstants.CONNECTION_TIMEOUT * 2); + String responseText = hc.getResponseText(); + JSONArray array = JSONArray.create(); + //假如返回"-1",说明socket出错了 + if (!ComparatorUtils.equals(responseText, "-1")) { + array = new JSONArray(responseText); + } + hc.release(); + return array; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + return JSONArray.create(); + } + + @Override + protected void done() { + try { + JSONArray jsonArray = get(); + //step3:generateInfoTableList + updateInfoTable.getDataModel().populateBean(generateUpdateInfoList(jsonArray, keyword)); + + getUpdateInfoSuccess = true; + //step4:update cache file,start from cacheRecordTime,end latest server jartime + updateCachedInfoFile(jsonArray); + } catch (Exception e) { + getUpdateInfoSuccess = true; + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + }; + } + + //从文件中读取缓存的更新信息 + private void getCachedUpdateInfo(String keyword) throws Exception { + String cacheInfoPath = getUpdateCacheInfo(); + File cacheFile = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), "resources", "offlineres", cacheInfoPath)); + if (!ComparatorUtils.equals(lastUpdateCacheState, "success")) { + cacheFile.delete(); + return; + } + if (cacheFile.exists()) { + FileReader reader = new FileReader(cacheFile); + BufferedReader br = new BufferedReader(reader); + String readStr, updateTimeStr; + + while ((readStr = br.readLine()) != null) { + String[] updateInfo = readStr.split("\\t"); + if (updateInfo.length == 2) { + updateTimeStr = updateInfo[0]; + Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); + //形如 Build#release-2018.07.31.03.03.52.80 + String currentNO = GeneralUtils.readBuildNO(); + Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { + if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateInfo[1], keyword)) { + continue; + } + } + if (isValidLogInfo(updateInfo[1])) { + updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateInfo[1], updateTime.after(curJarDate)}); + } + } + } + br.close(); + reader.close(); + } + } + + private void updateCachedInfoFile(JSONArray jsonArray) throws Exception { + String cacheDirPath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), "resources", "offlineres"); + File cacheFileDir = new File(cacheDirPath); + if (!StableUtils.mkdirs(cacheFileDir)) { + FineLoggerFactory.getLogger().error("make dir error."); + return; + } + final File cacheFile = new File(StableUtils.pathJoin(cacheDirPath, getUpdateCacheInfo())); + if (!cacheFile.exists()) { + cacheFile.createNewFile(); + lastUpdateCacheTime = UpdateConstants.CHANGELOG_X_START; + lastUpdateCacheState = UPDATE_CACHE_STATE_FAIL; + } + if (downloadFileConfig == null) { + return; + } + String endTime = getLatestJARTimeStr(); + if (endTime.equals(lastUpdateCacheTime) || jsonArray.length() == 0 || ComparatorUtils.compare(endTime, lastUpdateCacheTime) <= 0) { + return; + } + FileWriter fileWriter = new FileWriter(cacheFile, true); + BufferedWriter bufferWriter = new BufferedWriter(fileWriter); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jo = (JSONObject) jsonArray.get(i); + bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); + bufferWriter.newLine(); + bufferWriter.flush(); + } + bufferWriter.close(); + fileWriter.close(); + lastUpdateCacheState = UPDATE_CACHE_STATE_SUCCESS; + lastUpdateCacheTime = endTime; + cacheProperty.updateProperty("updateTime", lastUpdateCacheTime); + cacheProperty.updateProperty("updateState", lastUpdateCacheState); + } + + private ArrayList generateUpdateInfoList(JSONArray jsonArray, String keyword) throws Exception { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jo = (JSONObject) jsonArray.get(i); + String updateTitle = (String) jo.get("title"); + String updateTimeStr = (String) jo.get("update"); + Date updateTime = CHANGELOG_FORMAT.parse(updateTimeStr); + //形如 Build#release-2018.07.31.03.03.52.80 + String currentNO = GeneralUtils.readBuildNO(); + Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { + if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateTitle, keyword)) { + continue; + } + } + if (isValidLogInfo(updateTitle)) { + updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateTitle, updateTime.after(curJarDate)}); + } + } + return new ArrayList(updateInfoList); + } + + private boolean containsKeyword(String str, String keyword) { + return str.toUpperCase().contains(keyword.toUpperCase()); + } + + private void stopLoading() { + loadingLabel.stopLoading(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Connect_VersionUpdateServer_Failed")); + } + + + private void showDownLoadInfo() { + //形如 Build#release-2018.07.31.03.03.52.80 + String buildNO = downloadFileConfig.optString("buildNO"); + Date jarDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); + String serverVersionNO = downloadFileConfig.optString("versionNO"); + String currentVersionNO = ProductConstants.RELEASE_VERSION; + String[] serverVersionSplitStr = serverVersionNO.split("\\."); + String[] currentVersionSplitStr = currentVersionNO.split("\\."); + int index = 0; + int compareResult; + int versionLength = Math.min(serverVersionSplitStr.length, currentVersionSplitStr.length); + + //形如 Build#release-2018.07.31.03.03.52.80 + String currentNO = GeneralUtils.readBuildNO(); + if (!".".equals(StableUtils.getInstallHome())) { + Date currentDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (DateUtils.subtractDate(jarDate, currentDate, DateUtils.DAY) > 0) { + updateButton.setEnabled(true); + updateLabel.setVisible(true); + loadingLabel.stopLoading(buildNO.contains("-") ? buildNO.substring(buildNO.lastIndexOf("-") + 1) : buildNO); + } else { + loadingLabel.stopLoading(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Already_Latest_Version")); + } + } else { + updateButton.setEnabled(true); + updateLabel.setVisible(true); + loadingLabel.stopLoading(buildNO.contains("-") ? buildNO.substring(buildNO.lastIndexOf("-") + 1) : buildNO); + } + + while (index < versionLength) { + compareResult = serverVersionSplitStr[index].length() - currentVersionSplitStr[index].length(); + if (0 == compareResult) { + compareResult = serverVersionSplitStr[index].compareTo(currentVersionSplitStr[index]); + if (0 == compareResult) { + ++index; + continue; + } + break; + } + break; + } + + initMapWithInfo(downloadFileConfig); + } + + public void initMapWithInfo(JSONObject result) { + addJarNameToMap(result, "designer"); + addJarNameToMap(result, "server"); + } + + private void addJarNameToMap(JSONObject result, String category) { + JSONArray jsonArray = result.optJSONArray(category); + if (jsonArray != null) { + for (int i = 0, len = jsonArray.length(); i < len; i++) { + JSONObject jo = jsonArray.optJSONObject(i); + String downloadName = jo.optString("name"); + String downloadUrl = jo.optString("url"); + long downloadSize = jo.optLong("size"); + if (ComparatorUtils.equals(category, "server")) { + File currentJAR = new File(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.LIB_NAME, downloadName)); + if (currentJAR.exists() && ComparatorUtils.equals(currentJAR.length(), downloadSize)) { + //假如大小一样的jar包就不要下载了 + continue; + } + } + downloadItems.add(new DownloadItem(downloadName, downloadUrl, downloadSize)); + } + } + } + + /** + * jar包更新按钮监听器 + */ + private void addActionListenerForUpdateBtn() { + updateButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (updateSuccessful) { + RestartHelper.restart(); + } else { + deletePreviousPropertyFile(); + updateButton.setEnabled(false); + progressBar.setVisible(true); + updateLabel.setVisible(false); + + new FileDownloader( + downloadItems.toArray(new DownloadItem[downloadItems.size()]), + StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DOWNLOAD_DIR)) { + @Override + protected void process(java.util.List chunks) { + DownloadItem fileInfo = chunks.get(chunks.size() - 1); + progressBar.setString(fileInfo.getName() + " " + fileInfo.getProgressString()); + progressBar.setValue(fileInfo.getProgressValue()); + } + + @Override + public void onDownloadSuccess() { + updateButton.setEnabled(true); + progressBar.setVisible(false); + backup(); + putNewFiles(); + updateSuccessful = true; + updateButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); + } + + @Override + public void onDownloadFailed() { + progressBar.setVisible(false); + } + }.execute(); + } + } + }); + } + + /** + * 确保升级更新之前删除以前的配置文件 + */ + public static void deletePreviousPropertyFile() { + //在进行更新升级之前确保move和delete.properties删除 + File moveFile = new File(RestartHelper.MOVE_FILE); + File delFile = new File(RestartHelper.RECORD_FILE); + if ((moveFile.exists()) && (!moveFile.delete())) { + FineLoggerFactory.getLogger().error(RestartHelper.MOVE_FILE + "delete failed!"); + } + if ((delFile.exists()) && (!delFile.delete())) { + FineLoggerFactory.getLogger().error(RestartHelper.RECORD_FILE + "delete failed!"); + } + } + + /** + * JAR包更新的时候备份老的jar包,包括设计器相关的和服务器相关的几个 + */ + private void backup() { + String installHome = StableUtils.getInstallHome(); + //jar包备份文件的目录为"backup/"+jar包当前版本号 + String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); + backupFilesFromInstallEnv(installHome, todayBackupDir, getJARList4Server()); + backupFilesFromInstallLib(installHome, todayBackupDir, getJARList4Designer()); + jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); + } + + private void backupFilesFromInstallEnv(String installHome, String todayBackupDir, String[] files) { + for (String file : files) { + try { + IOUtils.copy( + new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)), + new File(StableUtils.pathJoin(todayBackupDir))); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + } + + private void backupFilesFromInstallLib(String installHome, String todayBackupDir, String[] files) { + for (String file : files) { + try { + IOUtils.copy( + new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)), + new File(StableUtils.pathJoin(todayBackupDir))); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + } + + private void putNewFiles() { + Map map = new HashMap(); + java.util.List list = new ArrayList(); + String installHome = StableUtils.getInstallHome(); + putNewFilesToInstallLib(installHome, getDownLoadJAR4Designer(), map, list); + putNewFilesToInstallEnv(installHome, getDownLoadJAR4Server(), map, list); + RestartHelper.saveFilesWhichToMove(map); + RestartHelper.saveFilesWhichToDelete(list.toArray(new String[list.size()])); + } + + private void putNewFilesToInstallLib(String installHome, String[] files, Map map, java.util.List list) { + for (String file : files) { + map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file), + StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); + list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); + } + } + + private void putNewFilesToInstallEnv(String installHome, String[] files, Map map, java.util.List list) { + for (String file : files) { + map.put(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOAD_DIR, file), + StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); + list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, FRContext.getCommonOperator().getAppName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); + } + } + + //获取备份目录 + private String getBackupDirectory() { + return UpdateConstants.DESIGNER_BACKUP_DIR; + } + + //获取服务器jar包列表 + private String[] getJARList4Server() { + return UpdateConstants.JARS_FOR_SERVER_X; + } + + //获取设计器jar包列表 + private String[] getJARList4Designer() { + return UpdateConstants.JARS_FOR_DESIGNER_X; + } + + //获取服务器jar包下载列表 + private String[] getDownLoadJAR4Server() { + ArrayList jarList = new ArrayList(); + for (DownloadItem downloadItem : downloadItems) { + String downloadItemName = downloadItem.getName(); + if (ArrayUtils.contains(getJARList4Server(), downloadItemName)) { + jarList.add(downloadItemName); + } + } + return jarList.toArray(new String[jarList.size()]); + } + + //获取设计器jar包下载列表 + private String[] getDownLoadJAR4Designer() { + ArrayList jarList = new ArrayList(); + for (DownloadItem downloadItem : downloadItems) { + String downloadItemName = downloadItem.getName(); + if (ArrayUtils.contains(getJARList4Designer(), downloadItemName)) { + jarList.add(downloadItemName); + } + } + return jarList.toArray(new String[jarList.size()]); + } + + //获取更新日志缓存配置文件名 + private String getUpdateCacheConfig() { + return UpdateConstants.UPDATE_CACHE_CONFIG_X; + } + + //获取更新日志缓存内容文件名 + private String getUpdateCacheInfo() { + return UpdateConstants.UPDATE_CACHE_INFO_X; + } + + //获取最新的jar包时间字符串 + private String getLatestJARTimeStr() { + if (downloadFileConfig == null) { + return StringUtils.EMPTY; + } + String buildNO = downloadFileConfig.optString("buildNO"); + Date jarDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(jarDate); + } + + //判断是否是有效的日志内容 + private boolean isValidLogInfo(String logContent) { + String log = logContent.toUpperCase(); + for (String s : UpdateConstants.LOG_TYPE) { + if (log.startsWith(s)) { + return true; + } + } + return false; + } + + /** + * 显示窗口 + */ + public void showDialog() { + setSize(DEFAULT); + setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_UpdateAndUpgrade")); + GUICoreUtils.centerWindow(this); + setVisible(true); + } + + /** + * 检查有效性 + * + * @throws Exception + */ + @Override + public void checkValid() throws Exception { + + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/ColorfulCellRender.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/ColorfulCellRender.java new file mode 100644 index 000000000..461489839 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/ColorfulCellRender.java @@ -0,0 +1,65 @@ +package com.fr.design.onlineupdate.ui.widget; + +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.ListCellRenderer; +import java.awt.Color; +import java.awt.Component; +import java.awt.Font; +import java.awt.Graphics; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class ColorfulCellRender extends JPanel implements ListCellRenderer { + private static int CELLCOLOR_DARK = 0xf6f6f6; + private static int CELLCOLOR_LIGHT = 0xffffff; + private static int CELLCOLOR_SELECTED = 0xdfecfd; + private static int TEXT_COORDINATE_X = 10; + private static int TEXT_COORDINATE_Y = 20; + private static final int LISTFONTSIZE = 12; + private Color[] colors = new Color[]{new Color(CELLCOLOR_DARK), new Color(CELLCOLOR_LIGHT)}; + + private String text; + + public ColorfulCellRender() { + setOpaque(true); + } + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + text = ((null != value) ? (value.toString()) : null); + + Color background; + Color foreground = Color.BLACK; + //当前Renderer是否是拖拽目标 + JList.DropLocation dropLocation = list.getDropLocation(); + if (dropLocation != null + && !dropLocation.isInsert() + && dropLocation.getIndex() == index) { + + background = new Color(CELLCOLOR_SELECTED); + //当前Renderer是否被选中 + } else if (isSelected) { + background = new Color(CELLCOLOR_SELECTED); + } else { + background = colors[index % 2]; + } + + setBackground(background); + setForeground(foreground); + + return this; + } + + @Override + public void paintComponent(Graphics g) { + g.setColor(getBackground()); + g.fillRect(0, 0, getWidth(), getHeight()); + g.setColor(getForeground()); + g.setFont(new Font("Default", Font.PLAIN, LISTFONTSIZE)); + if (text != null) { + g.drawString(text, TEXT_COORDINATE_X, TEXT_COORDINATE_Y); + } + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/LoadingLabel.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/LoadingLabel.java new file mode 100644 index 000000000..a21d67e46 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/LoadingLabel.java @@ -0,0 +1,48 @@ +package com.fr.design.onlineupdate.ui.widget; + +import com.fr.design.gui.ilable.UILabel; +import com.fr.general.IOUtils; + +import javax.swing.Icon; +import javax.swing.SwingConstants; +import javax.swing.Timer; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class LoadingLabel extends UILabel { + private Icon[] busyIcons = new Icon[15]; + private Timer busyIconTimer; + private int busyIconIndex; + + public LoadingLabel() { + for (int i = 0; i < busyIcons.length; i++) { + busyIcons[i] = IOUtils.readIcon("/com/fr/design/images/update/busy-icon" + i + ".png"); + } + int busyAnimationRate = 30; + + busyIconTimer = new Timer(busyAnimationRate, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + busyIconIndex = (busyIconIndex + 1) % busyIcons.length; + setIcon(busyIcons[busyIconIndex]); + setHorizontalAlignment(SwingConstants.CENTER); + } + }); + busyIconTimer.start(); + } + + /** + * 停止加载,并显示 + * + * @param text 要显示的字段 + */ + public void stopLoading(String text) { + busyIconTimer.stop(); + setIcon(null); + setText(text); + } + +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateActionLabel.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateActionLabel.java new file mode 100644 index 000000000..74c2b6ae5 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateActionLabel.java @@ -0,0 +1,95 @@ +package com.fr.design.onlineupdate.ui.widget; + +import com.fr.design.gui.ilable.UILabel; + +import javax.swing.event.MouseInputAdapter; +import java.awt.Color; +import java.awt.Cursor; +import java.awt.Graphics; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateActionLabel extends UILabel { + private ActionListener actionListener; + private boolean drawLine = true; + + public UpdateActionLabel(String text, boolean drawUnderLine) { + super(text); + this.drawLine = drawUnderLine; + this.setForeground(Color.BLUE); + this.addMouseListener(mouseInputAdapter); + this.addMouseMotionListener(mouseInputAdapter); + } + + /** + * 增加事件监听 + * + * @param actionListener 监听器 + */ + public void addActionListener(ActionListener actionListener) { + this.actionListener = actionListener; + } + + /** + * Repaints the text. + */ + public void paintComponent(Graphics _gfx) { + super.paintComponent(_gfx); + + _gfx.setColor(Color.BLUE); + if (drawLine) { + _gfx.drawLine(0, this.getHeight() - 1, this.getWidth(), this.getHeight() - 1); + } + } + + private MouseInputAdapter mouseInputAdapter = new MouseInputAdapter() { + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + } + + public void mouseReleased(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + //Action. + if (actionListener != null) { + ActionEvent actionEvent = new ActionEvent(source, 99, ""); + actionListener.actionPerformed(actionEvent); + } + } + } + + public void mouseEntered(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.HAND_CURSOR)); + } + } + + public void mouseExited(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + } + + public void mouseDragged(MouseEvent e) { + } + + public void mouseMoved(MouseEvent evt) { + Object source = evt.getSource(); + + if (source instanceof UILabel) { + ((UILabel) source).setCursor(new Cursor(Cursor.HAND_CURSOR)); + } + } + }; +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTable.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTable.java new file mode 100644 index 000000000..f94a514ad --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTable.java @@ -0,0 +1,46 @@ +package com.fr.design.onlineupdate.ui.widget; + +import javax.swing.JTable; +import javax.swing.table.TableModel; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateInfoTable extends JTable { + private UpdateInfoTableModel dataModel; + + public UpdateInfoTable(TableModel dm) { + super(dm); + dataModel = (UpdateInfoTableModel) dm; + } + + public UpdateInfoTable() { + } + + public UpdateInfoTable(String[] columnNames) { + this(new UpdateInfoTableModel(columnNames, new ArrayList())); + } + + public UpdateInfoTable(List data, String[] columnNames) { + this(new UpdateInfoTableModel(columnNames, data)); + } + + public UpdateInfoTable(Vector rowData, Vector columnNames) { + super(rowData, columnNames); + } + + public UpdateInfoTable(int numRows, int numColumns) { + super(numRows, numColumns); + } + + public UpdateInfoTableModel getDataModel() { + return dataModel; + } + + public void setDataModel(UpdateInfoTableModel dataModel) { + this.dataModel = dataModel; + } +} diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableCellRender.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableCellRender.java new file mode 100644 index 000000000..22c603c86 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableCellRender.java @@ -0,0 +1,48 @@ +package com.fr.design.onlineupdate.ui.widget; + +import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; + +import javax.swing.JLabel; +import javax.swing.JTable; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.Color; +import java.awt.Component; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateInfoTableCellRender extends DefaultTableCellRenderer { + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + cell.setBackground((row & 1) != 0 ? new Color(0xf0f0f0) : Color.WHITE); + if ((Boolean) table.getValueAt(row, 2)) { + cell.setBackground(new Color(0xdfecfd)); + } + if (column == 0) { + //设置首列日期居中显示 + setHorizontalAlignment(JLabel.CENTER); + + for (int i = 1; row - i >= 0; i++) { + if (ComparatorUtils.equals(table.getValueAt(row - i, 0), value)) { + //调用的父类JLabel的setText,table本身的值不变 + setText(StringUtils.EMPTY); + break; + } + } + } + return cell; + } + + @Override + public void setForeground(Color c) { + super.setForeground(c); + } + + @Override + public void setBackground(Color c) { + super.setBackground(c); + } +} diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableModel.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableModel.java new file mode 100644 index 000000000..147f88a29 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTableModel.java @@ -0,0 +1,65 @@ +package com.fr.design.onlineupdate.ui.widget; + +import javax.swing.table.AbstractTableModel; +import java.util.List; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateInfoTableModel extends AbstractTableModel { + private String[] titles; + private List data; + + public UpdateInfoTableModel(String[] titles, List data) { + this.titles = titles; + this.data = data; + } + + public void populateBean(List data) { + if (data == null) { + return; + } + clear(); + this.data = data; + fireTableDataChanged(); + } + + public void clear() { + data.clear(); + } + + public List updateBean() { + return data; + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public int getColumnCount() { + return titles.length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return data.get(rowIndex)[columnIndex]; + } + + @Override + public String getColumnName(int column) { + return titles[column]; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return false; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + super.setValueAt(aValue, rowIndex, columnIndex); + } +} + diff --git a/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTextAreaCellRender.java b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTextAreaCellRender.java new file mode 100644 index 000000000..1e3cebdf8 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/onlineupdate/ui/widget/UpdateInfoTextAreaCellRender.java @@ -0,0 +1,43 @@ +package com.fr.design.onlineupdate.ui.widget; + +import javax.swing.BorderFactory; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.table.TableCellRenderer; +import java.awt.Color; +import java.awt.Component; +import java.awt.Insets; + +/** + * Created by XINZAI on 2018/8/21. + */ +public class UpdateInfoTextAreaCellRender extends JTextArea implements TableCellRenderer { + public UpdateInfoTextAreaCellRender() { + setMargin(new Insets(2, 2, 2, 2)); + setLineWrap(true); + setWrapStyleWord(true); + setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 0)); + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + // 计算当前行的最佳高度 + int maxPreferredHeight = 0; + for (int i = 0; i < table.getColumnCount(); i++) { + setText("" + table.getValueAt(row, i)); + setSize(table.getColumnModel().getColumn(column).getWidth(), 0); + maxPreferredHeight = Math.max(maxPreferredHeight, getPreferredSize().height); + } + + if (table.getRowHeight(row) != maxPreferredHeight) { + table.setRowHeight(row, maxPreferredHeight); + } + + setText(value == null ? "" : value.toString()); + setBackground((row & 1) != 0 ? new Color(0xf0f0f0) : Color.WHITE); + if ((Boolean) table.getValueAt(row, 2)) { + setBackground(new Color(0xdfecfd)); + } + return this; + } +} \ No newline at end of file diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon0.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon0.png new file mode 100644 index 0000000000000000000000000000000000000000..242c0c85bc938a08f6eaa046bd24e9509b0b1d9c GIT binary patch literal 3588 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 KMNUMnLSTZ21;I%G literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon1.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6f63438ec797feb79c00697d783e4c58dcbe88 GIT binary patch literal 3585 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 Hu0mjf*HOc* literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon10.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon10.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ef4a1fc6a59aec6b053ed05c17ad3a2d24ec9b GIT binary patch literal 3568 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 DwfwCf literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon12.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon12.png new file mode 100644 index 0000000000000000000000000000000000000000..e447ee8ac29a421f2cc2c6786ace0e13559d280a GIT binary patch literal 3589 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 LNkvXXu0mjf9hSZ+ literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon13.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon13.png new file mode 100644 index 0000000000000000000000000000000000000000..848a6f1a41bac5459b3768c20e3eb044749c158e GIT binary patch literal 3586 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 IM6N<$g3?{b8UO$Q literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon14.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon14.png new file mode 100644 index 0000000000000000000000000000000000000000..7b3561df212ff3f799e2e5c6f99db7746ffa783c GIT binary patch literal 3586 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 IM6N<$f;*eD;Q#;t literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon2.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..c866e62a7c6ae133b78981f8cfa7562364682ce0 GIT binary patch literal 3585 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 Hu0mjfrAo$p literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon3.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon3.png new file mode 100644 index 0000000000000000000000000000000000000000..9be22fa58602d70a8ffa3b0a7729ebc938153a54 GIT binary patch literal 3572 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 D&7!)r literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon7.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon7.png new file mode 100644 index 0000000000000000000000000000000000000000..49fbc6ec54f7a5a44a83ff2a7fab1d2c286e5b18 GIT binary patch literal 3598 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 literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon8.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon8.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a5a409387b1eccc58b63fa0d1afa9b80108ba8 GIT binary patch literal 3594 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 Qv;Y7A07*qoM6N<$f^|K;T>t<8 literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/busy-icon9.png b/designer-base/src/main/resources/com/fr/design/images/update/busy-icon9.png new file mode 100644 index 0000000000000000000000000000000000000000..827801235b043066db61a9b1216d8f2e11002a7b GIT binary patch literal 3581 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 DEnc`0 literal 0 HcmV?d00001 diff --git a/designer-base/src/main/resources/com/fr/design/images/update/update_new.png b/designer-base/src/main/resources/com/fr/design/images/update/update_new.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b2b231c04b0e2d8af0ed7f6396e97bc68a4f74 GIT binary patch literal 1110 zcmeAS@N?(olHy`uVBq!ia0vp^LLe-_1|-?yf<%B6OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%9|WRD45bDP46hOx7_4S6Fo+k-*%fF5lweEp zc6R~NK=9LfcRi5eEbxdd2GSm2>~=ESj)8&clc$Sgh{y4_q1GPSjv{jn19e22cXY~k zxOUZ~nRT*pb|fS(6wqzySaK;$Fh?Y0!v;|n-7Cj}S``*a1VnBTxcEc&2yb1$1($I1 zMTv>3ijnWMzhypD_7~Q*{c8Dq-p=x8d`|m+*qhv+oSgId_8+tT7f)13>OWq)!XQq1 zeed;6Ivh<394Awj^;yQNu4?u6UfDToMP|($z6*?20=K{r~6rhnl0u=95b3$ULMH1%F*=vc}-2#r7D|ee*b89FWqcD z-&`OJ4Lv&hk?+T4pNd|z#=VG*cMlYCz1YjU$^F}jdB-PzHHf*oE-Sn=Q1EJy?$x;1 zl?SDyjlTw#n$4Ed5IVUf`Td3yVmFnhPo2oXIl&=2`?a+UhpTD15_5lO? zi;`CzeSI2Brvx!52~F(K*Vj3{N#}J@>UH^^tJWsAf8SO6^qn+39_pkT;#Buf`t#qZ zn%bwjHa#j>plQ;&%!1D>QP?cm(4;p#rie0<8 zXF4sLkeRvjp!pBB(v^>|ifSxqxO91O2YF@hte4DK7phyr^i>+W-2O9`YxdC)V6PwRbi!8>p7JMwFx^ zmZVxG7o`Fz1|tJQb6rD2T|?6lLlY}gBP$aVZ37D{1B0{mma!-ra`RI%(<*Um*rU|= z5U9ZyWJ7UTx>ZtQajI@ex7bxeqM=wNp1m{ s7oV49V3d+so|I&fZj@?dsb5+Ea;6^8q$n#lP%dWhboFyt=akR{02q46VgLXD literal 0 HcmV?d00001 From ed5cb1fa6ca42bca4ebc688aeb96ff589a0ed53f Mon Sep 17 00:00:00 2001 From: richie Date: Mon, 27 Aug 2018 17:06:04 +0800 Subject: [PATCH 20/77] =?UTF-8?q?CORE-123=20pack=E7=9A=84=E6=89=93?= =?UTF-8?q?=E5=8C=85=E4=BE=9D=E8=B5=96=E4=BB=A5=E5=8F=8A=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/start/ServerStarter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/start/ServerStarter.java b/designer-base/src/main/java/com/fr/start/ServerStarter.java index 01db37eac..3115730d1 100644 --- a/designer-base/src/main/java/com/fr/start/ServerStarter.java +++ b/designer-base/src/main/java/com/fr/start/ServerStarter.java @@ -67,13 +67,13 @@ public class ServerStarter { @Override public void run() { FineEmbedServer.start(); - browser(url); + BrowseUtils.browser(url); } }); service.shutdown(); }else{ FineEmbedServer.start(); - browser(url); + BrowseUtils.browser(url); } } } From 3752c38f176805e9c3c4defed6b3b5310b7a7a7a Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 28 Aug 2018 15:04:24 +0800 Subject: [PATCH 21/77] =?UTF-8?q?REPORT-10689=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=96=B0=E5=BB=BA=E5=88=A0=E9=99=A4=E5=92=8C?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 38 +- .../com/fr/design/file/FileOperations.java | 77 +- .../design/file/HistoryTemplateListCache.java | 291 ++++++ .../design/file/HistoryTemplateListPane.java | 451 +--------- .../com/fr/design/file/NodeAuthProcessor.java | 225 +++++ .../com/fr/design/file/TemplateTreePane.java | 340 +++++-- .../gui/itree/filetree/TemplateFileTree.java | 136 +-- .../DesignerFrameFileDealerPane.java | 670 ++++++++------ .../java/com/fr/design/menu/KeySetUtils.java | 68 +- .../src/main/java/com/fr/file/FILE.java | 71 +- .../java/com/fr/file/FILEChooserPane.java | 831 +++++++++++------- .../main/java/com/fr/file/FILEFactory.java | 6 +- .../src/main/java/com/fr/file/FileFILE.java | 65 +- .../main/java/com/fr/file/FileNodeFILE.java | 239 +++-- .../src/main/java/com/fr/file/MemFILE.java | 7 +- .../images/icon_NewFolderIcon_normal.png | Bin 0 -> 288 bytes 16 files changed, 2057 insertions(+), 1458 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java create mode 100644 designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java create mode 100644 designer-base/src/main/resources/com/fr/design/images/icon_NewFolderIcon_normal.png diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 8e6b1e26e..16d00156b 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -41,9 +41,10 @@ import com.fr.stable.xml.XMLableReader; import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContextCallback; -import javax.swing.*; +import javax.swing.SwingWorker; import javax.swing.SwingWorker.StateValue; -import java.awt.*; +import java.awt.Color; +import java.awt.Rectangle; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; @@ -57,6 +58,7 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import java.util.Locale; import java.util.Map; import java.util.Map.Entry; @@ -482,7 +484,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { public void setLastEastRegionContainerWidth(int eastRegionContainerWidth) { this.eastRegionContainerWidth = eastRegionContainerWidth; } - + /** * 返回默认环境 */ @@ -544,7 +546,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { DesignerEnvManager.getEnvManager().setCurEnvName(envName); DesignUtils.refreshDesignerFrame(); - if(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate() != null) { + if (HistoryTemplateListPane.getInstance().getCurrentEditingTemplate() != null) { HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshToolArea(); } DesignTableDataManager.fireDSChanged(new HashMap()); @@ -866,12 +868,38 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { public void replaceRecentOpenedFilePath(String oldPath, String newPath) { List list = getRecentOpenedFilePathList(); if (list.contains(oldPath)) { - int index = getRecentOpenedFilePathList().indexOf(oldPath); + int index = list.indexOf(oldPath); + list.remove(oldPath); + list.add(index, newPath); + } + oldPath = oldPath.replaceAll("\\\\", "/"); + if (list.contains(oldPath)) { + int index = list.indexOf(oldPath); list.remove(oldPath); list.add(index, newPath); } } + /** + * 替换近期打开的文件路径 + * + * @param type 文件类型,文件夹true,文件false + * @param oldPath 旧的路径 使用反斜杠分割 + * @param newPath 新的路径 使用反斜杠分割 + */ + public void replaceRecentOpenedFilePath(boolean type, String oldPath, String newPath) { + List list = getRecentOpenedFilePathList(); + ListIterator iterator = list.listIterator(); + + while (iterator.hasNext()) { + String s = iterator.next().replaceAll("/", "\\\\"); + if (type ? s.contains(oldPath + "\\") : s.equals(oldPath)) { + s = s.replace(oldPath, newPath); + iterator.set(s); + } + } + } + private void checkRecentOpenedFileNum() { List list = getRecentOpenedFilePathList(); if (list == null) { diff --git a/designer-base/src/main/java/com/fr/design/file/FileOperations.java b/designer-base/src/main/java/com/fr/design/file/FileOperations.java index 34b86cbc6..6509142a4 100644 --- a/designer-base/src/main/java/com/fr/design/file/FileOperations.java +++ b/designer-base/src/main/java/com/fr/design/file/FileOperations.java @@ -1,45 +1,88 @@ package com.fr.design.file; +import com.fr.file.FILE; +import com.fr.file.filetree.FileNode; + public interface FileOperations { + + /** + * 新建文件夹 + * + * @param name 文件夹名称 + * @return 是否成功 + */ + boolean mkdir(String name); + + /** + * 打开报表文件 + */ + void openFile(); + + /** + * 打开文件夹 + */ + void showInExplorer(); + + /** + * 刷新 + */ + void refresh(); + /** - *打开选中的报表文件 + * 删除文件 */ - public void openSelectedReport(); + void deleteFile(); /** - *打开文件夹 + * 加上文件锁 */ - public void openContainerFolder(); + void lockFile(); /** - *刷新 + * 文件解锁 */ - public void refresh(); + void unlockFile(); + + /** + * 选中的模板路径 + * + * @return 选中的模板路径 + */ + String getFilePath(); + /** - *删除文件 + * 选中的文件节点 + * + * @return 文件节点 */ - public void deleteFile(); + FileNode getFileNode(); /** - *加上文件锁 + * 是否有完整权限 + * + * @return 是否有完整权限 */ - public void lockFile(); + boolean access(); /** - *文件解锁 + * 重命名 + * + * @param tplFile 旧文件 + * @param to 新文件名 + * @param from 旧文件名 + * @return 是否成功 */ - public void unLockFile(); + boolean rename(FILE tplFile, String from, String to); - public String getSelectedTemplatePath(); /** - *文件名是否存在 + * 文件名是否存在 + * * @param newName 原名 - * @param oldName 新的文件名 - * @param suffix 后缀名 + * @param suffix 后缀名 * @return 是否存在 */ - public boolean isNameAlreadyExist(String newName, String oldName, String suffix); + boolean duplicated(String newName, String suffix); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java new file mode 100644 index 000000000..13fd85955 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -0,0 +1,291 @@ +package com.fr.design.file; + +import com.fr.base.chart.chartdata.CallbackEvent; +import com.fr.design.DesignerEnvManager; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.module.DesignModuleFactory; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ListIterator; + +/** + * 历史模板缓存 + * + * @see HistoryTemplateListPane + */ +public class HistoryTemplateListCache implements CallbackEvent { + + //最大保存内存中面板数,为0时关闭优化内存 + private static final int DEAD_LINE = DesignerEnvManager.getEnvManager().getCachingTemplateLimit(); + private List> historyList; + private JTemplate editingTemplate; + + private static volatile HistoryTemplateListCache THIS; + + public static HistoryTemplateListCache getInstance() { + if (THIS == null) { + synchronized (HistoryTemplateListCache.class) { + if (THIS == null) { + THIS = new HistoryTemplateListCache(); + } + } + } + return THIS; + } + + private HistoryTemplateListCache() { + historyList = new ArrayList<>(); + } + + /** + * 关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeSelectedReport(JTemplate selected) { + DesignModuleFactory.clearChartPropertyPane(); + DesignTableDataManager.closeTemplate(selected); + if (contains(selected) == -1) { + return; + } + selected.fireJTemplateClosed(); + selected.stopEditing(); + try { + historyList.remove(contains(selected)); + selected.getEditingFILE().closeTemplate(); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName())); + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + + /** + * 临时关闭选择的文件 + * + * @param selected 选择的 + */ + public void closeVirtualSelectedReport(JTemplate selected) { + DesignModuleFactory.clearChartPropertyPane(); + DesignTableDataManager.closeTemplate(selected); + if (contains(selected) == -1) { + return; + } + selected.fireJTemplateClosed(); + selected.stopEditing(); + try { + selected.getEditingFILE().closeTemplate(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + + public JTemplate getCurrentEditingTemplate() { + return this.editingTemplate; + } + + public void setCurrentEditingTemplate(JTemplate jt) { + this.editingTemplate = jt; + //如果当前历史面板中没有 + + if (contains(jt) == -1) { + addHistory(); + } + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + //设置tab栏为当前选中的那一栏 + if (editingTemplate != null) { + MutilTempalteTabPane.getInstance().setSelectedIndex(contains(jt)); + } + + } + + /** + * 添加历史记录 + */ + public void addHistory() { + if (editingTemplate == null) { + return; + } + DesignerEnvManager.getEnvManager().addRecentOpenedFilePath(editingTemplate.getPath()); + historyList.add(editingTemplate); + closeOverLineTemplate(); + } + + + public List> getHistoryList() { + return historyList; + } + + + /** + * 清空历史记录 + */ + public void removeAllHistory() { + historyList.clear(); + this.editingTemplate = null; + } + + public int getHistoryCount() { + return historyList.size(); + } + + + public JTemplate get(int index) { + if (index > historyList.size() - 1 || index < 0) { + return null; + } + Collections.reverse(historyList); + JTemplate select = historyList.get(index); + Collections.reverse(historyList); + return select; + } + + + public JTemplate getTemplate(int index) { + return historyList.get(index); + } + + /** + * 获取模板的index + * + * @param jt 模板 + * @return 位置 + */ + public int contains(JTemplate jt) { + for (int i = 0; i < historyList.size(); i++) { + if (ComparatorUtils.equals(historyList.get(i).getEditingFILE(), jt.getEditingFILE())) { + return i; + } + } + return -1; + } + + + /** + * 判断是否打开过该模板 + * + * @param filename 文件名 + * @return 文件位置 + */ + public int contains(String filename) { + for (int i = 0; i < historyList.size(); i++) { + String historyPath = historyList.get(i).getPath().replaceAll("/", "\\\\"); + //文件路径是全路径,历史路径是reportlets/模板名 + if (filename.endsWith(historyPath)) { + return i; + } + } + return -1; + } + + /** + * 是否是当前编辑的文件 + * + * @param filename 文件名 + * @return 是则返回TRUE + */ + public boolean isCurrentEditingFile(String filename) { + String editingFileName = editingTemplate.getPath(); + return ComparatorUtils.equals(filename, editingFileName); + } + + @Override + public void callback() { + getCurrentEditingTemplate().repaint(); + } + + /** + * 打开new模板的同时关闭old模板,优先关已保存的、先打开的 + */ + public void closeOverLineTemplate() { + int size = historyList.size(); + int vCount = size - DEAD_LINE; + if (DEAD_LINE == 0 || vCount <= 0) { + return; + } + for (int i = 0; i < vCount; i++) { + JTemplate overTemplate = historyList.get(i); + + if (overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate) { + historyList.get(i).closeOverLineTemplate(i); + } + } + MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); + } + + + public void deleteFile(FileNodeFILE file) { + boolean isDir = file.isDirectory(); + + String suffix = isDir ? "\\" : StringUtils.EMPTY; + + // path like reportlets/xx/xxx/xxx + String path = file.getPath().replaceAll("/", "\\\\") + suffix; + + ListIterator> iterator = historyList.listIterator(); + + while (iterator.hasNext()) { + JTemplate template = iterator.next(); + String tPath = template.getPath().replaceAll("/", "\\\\"); + if (isDir ? tPath.startsWith(path) : tPath.equals(path)) { + iterator.remove(); + int index = iterator.nextIndex(); + int size = getHistoryCount(); + if (size == index + 1 && index > 0) { + //如果删除的是后一个Tab,则定位到前一个 + MutilTempalteTabPane.getInstance().setSelectedIndex(index - 1); + JTemplate selectedFile = MutilTempalteTabPane.getInstance().getSelectedFile(); + if (!isCurrentEditingFile(selectedFile.getPath())) { + //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 + DesignerContext.getDesignerFrame().activateJTemplate(selectedFile); + } + } + } + } + //如果打开过,则删除,实时刷新多tab面板 + int openFileCount = getHistoryCount(); + if (openFileCount == 0) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + } + MutilTempalteTabPane.getInstance().repaint(); + } + + + public boolean rename(FILE tplFile, String from, String to) { + boolean isDir = tplFile.isDirectory(); + + JTemplate template; + + template = this.getCurrentEditingTemplate(); + if (template != null) { + String editingPath = template.getEditingFILE().getPath().replaceAll("/", "\\\\"); + if (isDir ? editingPath.contains(from + "\\") : editingPath.equals(from)) { + FILE renameFile = template.getEditingFILE(); + renameFile.setPath(editingPath.replace(from, to)); + } + } + + for (int i = 0; i < this.getHistoryCount(); i++) { + template = this.get(i); + String editingPath = template.getEditingFILE().getPath().replaceAll("/", "\\\\"); + if (isDir ? editingPath.contains(from + "\\") : editingPath.equals(from)) { + FILE renameFile = template.getEditingFILE(); + renameFile.setPath(editingPath.replace(from, to)); + } + + } + return true; + } +} diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java index eff4291e4..073c4fd1d 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListPane.java @@ -1,443 +1,16 @@ package com.fr.design.file; -import com.fr.base.FRContext; -import com.fr.base.chart.chartdata.CallbackEvent; -import com.fr.design.DesignModelAdapter; -import com.fr.design.DesignerEnvManager; -import com.fr.design.constants.UIConstants; -import com.fr.design.data.DesignTableDataManager; -import com.fr.design.data.datapane.TableDataTreePane; -import com.fr.design.gui.icontainer.UIScrollPane; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.ilist.UIList; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; -import com.fr.design.module.DesignModuleFactory; -import com.fr.design.utils.gui.GUIPaintUtils; -import com.fr.file.filetree.FileNode; -import com.fr.general.ComparatorUtils; -import com.fr.general.IOUtils; - -import com.fr.log.FineLoggerFactory; -import com.fr.stable.Constants; -import com.fr.stable.StableUtils; -import com.fr.stable.project.ProjectConstants; -import com.fr.workspace.WorkContext; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class HistoryTemplateListPane extends JPanel implements FileOperations, CallbackEvent { - //最大保存内存中面板数,为0时关闭优化内存 - private static final int DEAD_LINE = DesignerEnvManager.getEnvManager().getCachingTemplateLimit();; - private static final int LIST_BORDER = 4; - private List> historyList; - private JTemplate editingTemplate; - private FileToolbarStateChangeListener toobarStateChangeListener; - - private static volatile HistoryTemplateListPane THIS; - - private UIList list; - - public static final HistoryTemplateListPane getInstance() { - if (THIS == null) { - synchronized (HistoryTemplateListPane.class) { - if (THIS == null) { - THIS = new HistoryTemplateListPane(); - } - } - } - return THIS; - } - - private HistoryTemplateListPane() { - setLayout(new BorderLayout()); - historyList = new ArrayList>(); - list = new UIList(new HistoryListDataMode()) { - public int locationToIndex(Point location) { - int rowCount = getModel().getSize(); - int height = getPreferredSize().height - 2 * LIST_BORDER; - int rowHeight = height / rowCount; - int index = (location.y - LIST_BORDER) / rowHeight; - if (location.y < LIST_BORDER || index > rowCount - 1) { - return -1; - } else { - return index; - } - } - }; - ToolTipManager.sharedInstance().registerComponent(list); - list.setBackground(UIConstants.NORMAL_BACKGROUND); - list.setCellRenderer(new HistoryListCellRender()); - list.addMouseListener(new MouseAdapter() { - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() < 2) { - return; - } - openSelectedReport(); - } - }); - - - list.addListSelectionListener(new ListSelectionListener() { - - @Override - public void valueChanged(ListSelectionEvent e) { - if (toobarStateChangeListener != null) { - toobarStateChangeListener.stateChange(); - } - - } - }); - list.setBorder(BorderFactory.createEmptyBorder(LIST_BORDER, LIST_BORDER, LIST_BORDER, LIST_BORDER)); - UIScrollPane scrollPane = new UIScrollPane(list); - scrollPane.setBorder(null); - - this.add(scrollPane, BorderLayout.CENTER); - - } - - /** - * 关闭选择的文件 - * - * @param selected 选择的 - */ - public void closeSelectedReport(JTemplate selected) { - DesignModuleFactory.clearChartPropertyPane(); - DesignTableDataManager.closeTemplate(selected); - if (contains(selected) == -1) { - return; - } - selected.fireJTemplateClosed(); - selected.stopEditing(); - try { - historyList.remove(contains(selected)); - selected.getEditingFILE().closeTemplate(); - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Closed_Warn_Text", selected.getEditingFILE().getName())); - MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - - } - - /** - * 临时关闭选择的文件 - * - * @param selected 选择的 - */ - public void closeVirtualSelectedReport(JTemplate selected) { - DesignModuleFactory.clearChartPropertyPane(); - DesignTableDataManager.closeTemplate(selected); - if (contains(selected) == -1) { - return; - } - selected.fireJTemplateClosed(); - selected.stopEditing(); - try { - selected.getEditingFILE().closeTemplate(); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } - } - - /** - * 关闭选择的文件 - */ - public void selectedReportToVirtual(int i) { - closeOverLineTemplate(); - } - - public JTemplate getCurrentEditingTemplate() { - return this.editingTemplate; - } - - public void setCurrentEditingTemplate(JTemplate jt) { - this.editingTemplate = jt; - //如果当前历史面板中没有 - - if (contains(jt) == -1) { - addHistory(); - } - MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); - //设置tab栏为当前选中的那一栏 - if (editingTemplate != null) { - MutilTempalteTabPane.getInstance().setSelectedIndex(contains(jt)); - } - - } - - /** - * 添加历史记录 - */ - public void addHistory() { - if (editingTemplate == null) { - return; - } - DesignerEnvManager.getEnvManager().addRecentOpenedFilePath(editingTemplate.getPath()); - ((HistoryListDataMode) list.getModel()).add(editingTemplate); - } - - - public List> getHistoryList() { - return historyList; - } - - - /** - * 清空历史记录 - */ - public void removeAllHistory() { - historyList.clear(); - this.editingTemplate = null; - } - - public int getHistoryCount() { - return list.getModel().getSize(); - } - - - public UIList getList() { - return list; - } - - - public JTemplate get(int index) { - return (JTemplate) list.getModel().getElementAt(index); - } - - - public JTemplate getTemplate(int index) { - return historyList.get(index); - } - - /** - * 获取模板的index - * - * @param jt 模板 - * @return 位置 - */ - public int contains(JTemplate jt) { - for (int i = 0; i < historyList.size(); i++) { - if (ComparatorUtils.equals(historyList.get(i).getEditingFILE(), jt.getEditingFILE())) { - return i; - } - } - return -1; - } - - - /** - * 判断是否打开过该模板 - * - * @param filename 文件名 - * @return 文件位置 - */ - public int contains(String filename) { - for (int i = 0; i < historyList.size(); i++) { - String historyPath = historyList.get(i).getPath().replaceAll("/", "\\\\"); - //文件路径是全路径,历史路径是reportlets/模板名 - if (filename.endsWith(historyPath)) { - return i; - } - } - return -1; - } - - /** - * 是否是当前编辑的文件 - * - * @param filename 文件名 - * @return 是则返回TRUE - */ - public boolean isCurrentEditingFile(String filename) { - String editingFileName = editingTemplate.getPath(); - return ComparatorUtils.equals(filename, editingFileName); - } - - @Override - public void callback() { - getCurrentEditingTemplate().repaint(); - } - - private class HistoryListCellRender extends DefaultListCellRenderer { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, final boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - JTemplate jt = (JTemplate) value; - UILabel nameLabel = new UILabel(jt.getEditingFILE().getName()); - final int nameWidth = nameLabel.getPreferredSize().width; - UILabel uiLabel = new UILabel() { - public void paint(Graphics g) { - GUIPaintUtils.fillPaint((Graphics2D) g, 18, 0, nameWidth + 2, getHeight(), true, Constants.NULL, isSelected ? UIConstants.FLESH_BLUE : UIConstants.NORMAL_BACKGROUND, UIConstants.ARC); - super.paint(g); - } - - }; - uiLabel.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); - uiLabel.setIcon(jt.getIcon()); - uiLabel.setText(jt.getEditingFILE().getName()); - return uiLabel; - } - - } - - - private class HistoryListDataMode extends AbstractListModel { - - @Override - public int getSize() { - return historyList.size(); - } - - @Override - public JTemplate getElementAt(int index) { - if (index > getSize() - 1 || index < 0) { - return null; - } - Collections.reverse(historyList); - JTemplate select = historyList.get(index); - Collections.reverse(historyList); - return select; - } - - public void remove(int index) { - boolean outofindex = index >= historyList.size() || index < 0; - if (historyList.isEmpty() || outofindex) { - return; - } - historyList.remove(index); - } - - public void add(JTemplate jt) { - historyList.add(jt); - closeOverLineTemplate(); - refresh(); - } - } - - /** - * 打开new模板的同时关闭old模板,优先关已保存的、先打开的 - */ - public void closeOverLineTemplate() { - int size = historyList.size(); - int vCount = size - DEAD_LINE; - if (DEAD_LINE == 0 || vCount <= 0) { - return; - } - for (int i = 0; i < vCount; i++) { - JTemplate overTemplate = historyList.get(i); - - if (overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate) { - historyList.get(i).closeOverLineTemplate(i); - } - } - MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); - } - - /** - * 刷新 - */ - public void refresh() { - list.removeAll(); - list.setModel(new HistoryListDataMode()); - list.setSelectedIndex(list.getSelectedIndex()); - } - - /** - * 打开选择的文件 - */ - public void openSelectedReport() { - DesignerContext.getDesignerFrame().addAndActivateJTemplate((JTemplate) list.getSelectedValue()); - TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); - refresh(); - } - - /** - * 打开文件所在文件夹 - */ - public void openContainerFolder() { - FileNode fileNode = new FileNode(((JTemplate) list.getSelectedValue()).getEditingFILE().getPath(), false); - if (WorkContext.getCurrent().isLocal()) { - IOUtils.openWindowsFolder(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), fileNode.getEnvPath())); - } - } - - /** - * 删除文件 - */ - public void deleteFile() { -// TODO Auto-generated method stub - - } - - /*** - * 琐文件 - */ - public void lockFile() { -// TODO Auto-generated method stub - - } - - /** - * 解锁 - */ - public void unLockFile() { -// TODO Auto-generated method stub - - } - - /** - * 路径 - * - * @return 路径 - */ - public String getSelectedTemplatePath() { - if (list.getSelectedIndex() < 0 || list.getSelectedIndex() > list.getModel().getSize() - 1) { - return null; - } - ; - String path = ((HistoryListDataMode) list.getModel()).getElementAt(list.getSelectedIndex()).getEditingFILE().getPath(); - if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { - return path.substring(ProjectConstants.REPORTLETS_NAME.length()); - } - return path; - } - - public void setToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { - this.toobarStateChangeListener = toobarStateChangeListener; - } - - /** - * 文件是否存在 - * - * @param newName 文件名 - * @param oldName 原名 - * @param suffix 后缀名 - * @return 文件是否存在 - */ - public boolean isNameAlreadyExist(String newName, String oldName, String suffix) { - boolean isNameAreadyExist = false; - for (int i = 0; i < getHistoryCount(); i++) { - JTemplate jt = ((HistoryListDataMode) list.getModel()).getElementAt(i); - if (ComparatorUtils.equals(jt.getEditingFILE().getName(), newName + suffix)) { - isNameAreadyExist = true; - break; - } - } - if (ComparatorUtils.equals(newName, oldName)) { - isNameAreadyExist = false; - } - - return isNameAreadyExist; +/** + * 历史模板缓存 + * + * 为可能存在的插件做兼容处理 + * + * @see HistoryTemplateListCache + * @deprecated use HistoryTemplateListCache instead + */ +@Deprecated +public class HistoryTemplateListPane { + public static HistoryTemplateListCache getInstance() { + return HistoryTemplateListCache.getInstance(); } } diff --git a/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java new file mode 100644 index 000000000..3625a7d4d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java @@ -0,0 +1,225 @@ +package com.fr.design.file; + +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.file.FILE; +import com.fr.file.FileNodeFILE; +import com.fr.file.filetree.FileNode; +import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.report.DesignAuthority; +import com.fr.stable.CoreConstants; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.authority.AuthorityOperator; + +import java.util.ArrayList; + +public class NodeAuthProcessor { + + public static NodeAuthProcessor getInstance() { + return NodeAuthProcessor.HOLDER.singleton; + } + + private static class HOLDER { + private static NodeAuthProcessor singleton = new NodeAuthProcessor(); + } + + /** + * 远程设计拥有全部权限的文件夹路径 + */ + private ArrayList authPaths = new ArrayList<>(); + + + private NodeAuthProcessor() { + + } + + public void refresh() { + + authPaths.clear(); + if (!WorkContext.getCurrent().isLocal()) { + try { + String username = WorkContext.getConnector().currentUser(); + // 远程设计获取全部设计成员的权限列表 + DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(); + DesignAuthority authority = null; + + if (authorities != null) { + for (DesignAuthority designAuthority : authorities) { + if (ComparatorUtils.equals(designAuthority.getUsername(), username)) { + authority = designAuthority; + } + } + } + if (authority != null) { + for (DesignAuthority.Item item : authority.getItems()) { + if (item.getType()) { + authPaths.add(item.getPath()); + } + } + } + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + } + } + } + + public void clear() { + authPaths.clear(); + } + + + /** + * 生成带权限信息的文件节点,供另存对话框使用 + * + * @param fileNodes file nodes + * @return 带权限信息的文件节点 + */ + public FILE[] parser2FILEArray(FileNode[] fileNodes, String envPath) { + + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean isRoot = WorkContext.getCurrent().isRoot(); + FILE[] res = new FILE[fileNodes.length]; + for (int i = 0; i < res.length; i++) { + FileNode fn = fileNodes[i]; + + if (fn.isDirectory()) { + if (isLocal || isRoot) { + res[i] = new FileNodeFILE(fileNodes[i], envPath); + } else { + boolean hasFullAuthority = isContained(fn); + res[i] = new FileNodeFILE(fileNodes[i], envPath, hasFullAuthority); + } + } else { + res[i] = new FileNodeFILE(fileNodes[i], envPath); + } + } + return res; + } + + /** + * 生成带权限信息的文件节点,供另存对话框使用 + * + * @param fileNode file nodes + * @return 带权限信息的文件节点 + */ + public FILE fixFILENodeAuth(FileNode fileNode) { + + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean isRoot = WorkContext.getCurrent().isRoot(); + + if (fileNode.isDirectory()) { + if (isLocal || isRoot) { + return new FileNodeFILE(fileNode); + } else { + boolean hasFullAuthority = isContained(fileNode); + return new FileNodeFILE(fileNode, hasFullAuthority); + } + } else { + return new FileNodeFILE(fileNode); + } + } + + /** + * 生成带权限信息的文件节点,供另存对话框使用 + * + * @param fileNode file nodes + * @return 带权限信息的文件节点 + */ + public boolean fixFileNodeAuth(FileNode fileNode) { + + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean isRoot = WorkContext.getCurrent().isRoot(); + + if (fileNode.isDirectory()) { + if (isLocal || isRoot) { + return true; + } else { + return isContained(fileNode); + } + } else { + return true; + } + } + + /** + * 生成带权限信息的目录树节点, + * 提供给目录树使用 + * + * @param fileNodes file nodes + * @return 带权限信息的目录树节点 + */ + public ExpandMutableTreeNode[] parser2TreeNodeArray(FileNode[] fileNodes) { + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean isRoot = WorkContext.getCurrent().isRoot(); + ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[fileNodes.length]; + for (int i = 0; i < res.length; i++) { + FileNode fn = fileNodes[i]; + res[i] = new ExpandMutableTreeNode(fn); + if (fn.isDirectory()) { + res[i].add(new ExpandMutableTreeNode()); + if (isLocal || isRoot) { + res[i].setFullAuthority(true); + } else { + boolean hasFullAuthority = isContained(fn); + res[i].setFullAuthority(hasFullAuthority); + } + } + } + return res; + } + + public void fixTreeNodeAuth(ExpandMutableTreeNode treeNode) { + if (treeNode == null) { + return; + } + + Object object = treeNode.getUserObject(); + if (object instanceof FileNode) { + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean isRoot = WorkContext.getCurrent().isRoot(); + if (((FileNode) object).isDirectory()) { + if (isLocal || isRoot) { + treeNode.setFullAuthority(true); + } else { + boolean hasFullAuthority = isContained((FileNode) object); + treeNode.setFullAuthority(hasFullAuthority); + } + } + } + + + } + + private boolean isContained(FileNode fileNode) { + + for (String auPath : authPaths) { + if (isContained(auPath, fileNode)) { + return true; + } + } + return false; + } + + private boolean isContained(String auPath, FileNode fileNode) { + auPath = ProjectConstants.REPORTLETS_NAME + CoreConstants.SEPARATOR + auPath; + String fileName = fileNode.getEnvPath(); + String[] auPaths = auPath.split(CoreConstants.SEPARATOR); + String[] nodePaths = fileName.split(CoreConstants.SEPARATOR); + // 待判断目录是有权限目录或者有权限目录的子目录,全部权限 + if (auPaths.length <= nodePaths.length) { + for (int i = 0; i < auPaths.length; i++) { + if (!auPaths[i].equals(nodePaths[i])) { + return false; + } + } + return fileNode.isDirectory(); + } + // 其他情况半权限 + else { + return false; + } + } + + +} diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index e3d12da1a..3344d69f2 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -7,18 +7,18 @@ import com.fr.base.FRContext; import com.fr.base.io.FileAssistUtilsOperator; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itree.filetree.TemplateFileTree; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; +import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.file.filetree.IOFileNodeFilter; import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; - import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; -import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; @@ -26,7 +26,10 @@ import com.fr.workspace.WorkContext; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.ToolTipManager; +import javax.swing.UIManager; import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.TreeNode; +import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Desktop; import java.awt.Dimension; @@ -37,6 +40,11 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Enumeration; + +import static javax.swing.JOptionPane.YES_NO_OPTION; public class TemplateTreePane extends JPanel implements FileOperations { @@ -49,7 +57,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { } private TemplateFileTree reportletsTree; - private FileToolbarStateChangeListener toobarStateChangeListener; + private FileToolbarStateChangeListener toolBarStateChangeListener; private TemplateTreePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -71,14 +79,14 @@ public class TemplateTreePane extends JPanel implements FileOperations { @Override public void mousePressed(MouseEvent evt) { if (evt.getClickCount() == 2) { - openSelectedReport(); + openFile(); } } @Override public void mouseReleased(MouseEvent e) { - if (toobarStateChangeListener != null) { - toobarStateChangeListener.stateChange(); + if (toolBarStateChangeListener != null) { + toolBarStateChangeListener.stateChange(); } } }; @@ -89,24 +97,24 @@ public class TemplateTreePane extends JPanel implements FileOperations { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - openSelectedReport(); + openFile(); } } @Override public void keyReleased(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - openSelectedReport(); + openFile(); } - if (toobarStateChangeListener != null) { - toobarStateChangeListener.stateChange(); + if (toolBarStateChangeListener != null) { + toolBarStateChangeListener.stateChange(); } } @Override public void keyTyped(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - openSelectedReport(); + openFile(); } } }); @@ -116,6 +124,49 @@ public class TemplateTreePane extends JPanel implements FileOperations { return this.reportletsTree; } + + /** + * 选中的路径数 + * + * @return 选中的路径数 + */ + public int countSelectedPath() { + TreePath[] treePaths = reportletsTree.getSelectionPaths(); + if (treePaths == null) { + return 0; + } + return treePaths.length; + } + + /** + * 选中的文件夹个数 + * + * @return 选中的文件夹个数 + */ + + public int countSelectedFolder() { + + if (reportletsTree.getSelectedFolderPaths() == null) { + return 0; + } + + return reportletsTree.getSelectedFolderPaths().length; + } + + /** + * 选中的文件个数 + * + * @return 选中的文件 + */ + public int countSelectedFile() { + + if (reportletsTree.getSelectionPaths() == null) { + return 0; + } + + return reportletsTree.getSelectedTemplatePaths().length; + } + /** * 刷新 */ @@ -125,11 +176,16 @@ public class TemplateTreePane extends JPanel implements FileOperations { } + @Override + public boolean mkdir(String path) { + return WorkContext.getWorkResource().createDirectory(path); + } + /** * 打开选中的报表文件 */ @Override - public void openSelectedReport() { + public void openFile() { String reportPath = reportletsTree.getSelectedTemplatePath(); final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath); DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); @@ -139,7 +195,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { * 打开文件夹 */ @Override - public void openContainerFolder() { + public void showInExplorer() { FileNode fn = TemplateTreePane.this.reportletsTree.getSelectedFileNode(); String filePath = StableUtils.pathJoin(WorkContext.getCurrent().getPath(), fn.getEnvPath()); filePath = filePath.substring(0, filePath.lastIndexOf(CoreConstants.SEPARATOR)); @@ -156,134 +212,232 @@ public class TemplateTreePane extends JPanel implements FileOperations { @Override public void refresh() { reportletsTree.refresh(); - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_File_Tree_Refresh_Successfully") + "!"); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_File_Tree_Refresh_Successfully") + "!"); } /** * 删除文件 + * 文件夹和文件均可删除 + *

+ * 当文件被锁时不能删除 + * 当文件夹中包含被锁文件时不能删除 */ @Override public void deleteFile() { - String[] reportPaths = reportletsTree.getSelectedTemplatePaths(); - if (reportPaths.length == 0) { - return; + + + String tipContent = + countSelectedFolder() > 0 + ? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Folder") + : Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_File"); + + ExpandMutableTreeNode[] treeNodes = reportletsTree.getSelectedTreeNodes(); + // 筛选可以删除的文件 + ArrayList deletableNodes = new ArrayList<>(); + ArrayList lockedNodes = new ArrayList<>(); + for (ExpandMutableTreeNode treeNode : treeNodes) { + checkFreeOrLock(treeNode, deletableNodes, lockedNodes); + } + + boolean success = false; + + if (lockedNodes.isEmpty()) { + + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), + tipContent, + UIManager.getString("OptionPane.titleText"), + YES_NO_OPTION) + == JOptionPane.OK_OPTION) { + // 删除所有选中的即可 + success = deleteNodes(Arrays.asList(treeNodes)); + } + + } else { + + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File"), + UIManager.getString("OptionPane.titleText"), + YES_NO_OPTION) + == JOptionPane.YES_OPTION) { + // 删除其他 + success = deleteNodes(deletableNodes); + } } - if (JOptionPane.showConfirmDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_File")) != JOptionPane.OK_OPTION) { - return; + + if (!success) { + JOptionPane.showConfirmDialog(null, + Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); } - for (String reportPath : reportPaths) { - FileNodeFILE nodeFile = new FileNodeFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath), false)); - if (nodeFile.isLocked()) { - if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FileLocked_Undeleted"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.YES_OPTION, JOptionPane.ERROR_MESSAGE) == JOptionPane.YES_OPTION) { - refreshDockingView(); + reportletsTree.refresh(); + } + + private boolean deleteNodes(Collection nodes) { + boolean success = true; + for (ExpandMutableTreeNode treeNode : nodes) { + Object node = treeNode.getUserObject(); + if (node instanceof FileNode) { + FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); + if (nodeFILE.exists()) { + FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); + success = fileAssistUtils.moveToTrash(nodeFILE.getPath()) && success; + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); } - break; } - if (nodeFile.exists()) { - String path = StableUtils.pathJoin(nodeFile.getEnvPath(), nodeFile.getPath()); - FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - fileAssistUtils.moveToTrash(nodeFile.getPath()); - deleteHistory(path.replaceAll("/", "\\\\")); + } + return success; + } + + private boolean checkFreeOrLock(ExpandMutableTreeNode node, ArrayList dNodes, ArrayList lNodes) { + // 自己没锁 + boolean selfEmptyLock = false; + Object userObj = node.getUserObject(); + if (userObj instanceof FileNode) { + String lock = ((FileNode) userObj).getLock(); + selfEmptyLock = lock == null || ((FileNode) userObj).getUserID().equals(lock); + } + + if (node.isLeaf()) { + if (selfEmptyLock) { + dNodes.add(node); + } else { + lNodes.add(node); + } + return selfEmptyLock; + } + + ExpandMutableTreeNode[] children = reportletsTree.loadChildTreeNodes(node); + + boolean childrenEmptyLock = true; + + for (ExpandMutableTreeNode child : children) { + + boolean childEmptyLock = checkFreeOrLock(child, dNodes, lNodes); + if (childEmptyLock) { + dNodes.add(child); } else { - JOptionPane.showMessageDialog(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Warning_Template_Do_Not_Exsit"), ProductConstants.PRODUCT_NAME, - JOptionPane.INFORMATION_MESSAGE); + lNodes.add(child); } + + childrenEmptyLock = childrenEmptyLock && childEmptyLock; } - reportletsTree.refresh(); + + boolean emptyLock = childrenEmptyLock && selfEmptyLock; + if (emptyLock) { + dNodes.add(node); + } else { + lNodes.add(node); + } + return emptyLock; } + @Override public void lockFile() { throw new UnsupportedOperationException("unsupport now"); } @Override - public void unLockFile() { + public void unlockFile() { throw new UnsupportedOperationException("unsupport now"); } - private void deleteHistory(String fileName) { - int index = HistoryTemplateListPane.getInstance().contains(fileName); - int size = HistoryTemplateListPane.getInstance().getHistoryCount(); - if (index == -1) { - return; + + @Override + public String getFilePath() { + return reportletsTree.getSelectedTemplatePath(); + } + + @Override + public boolean access() { + + TreePath[] selectedTreePaths = reportletsTree.getSelectionPaths(); + + if (selectedTreePaths == null || selectedTreePaths.length != 1) { + return false; } - //如果打开过,则删除,实时刷新多tab面板 - HistoryTemplateListPane.getInstance().getHistoryList().remove(index); - int openfileCount = HistoryTemplateListPane.getInstance().getHistoryCount(); - if (openfileCount == 0) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(); + // 选中的是文件夹 + TreePath treePath = selectedTreePaths[0]; + ExpandMutableTreeNode currentTreeNode = (ExpandMutableTreeNode) treePath.getLastPathComponent(); + + ExpandMutableTreeNode parentTreeNode = (ExpandMutableTreeNode) currentTreeNode.getParent(); + + return parentTreeNode != null && parentTreeNode.hasFullAuthority(); + } + + @Override + public boolean rename(FILE tplFile, String from, String to) { + + // 多人协作时判断是否有锁定的文件 + ExpandMutableTreeNode[] treeNodes = reportletsTree.getSelectedTreeNodes(); + // 筛选可以重命名的文件 + ArrayList unlockedNodes = new ArrayList<>(); + ArrayList lockedNodes = new ArrayList<>(); + for (ExpandMutableTreeNode treeNode : treeNodes) { + checkFreeOrLock(treeNode, unlockedNodes, lockedNodes); } - MutilTempalteTabPane.getInstance().repaint(); - if (size == index + 1 && index != 0) { - //如果删除的是最后一个Tab,则定位到前一个 - MutilTempalteTabPane.getInstance().setSelectedIndex(index - 1); + + if (!lockedNodes.isEmpty()) { + JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Warn_Rename_Lock_File"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); + return true; } - JTemplate selectedfile = MutilTempalteTabPane.getInstance().getSelectedFile(); - if (!HistoryTemplateListPane.getInstance().isCurrentEditingFile(selectedfile.getPath())) { - //如果此时面板上的实时刷新的selectedIndex得到的和历史的不一样 - DesignerContext.getDesignerFrame().activateJTemplate(selectedfile); + + try { + // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 + return WorkContext.getWorkResource().rename(from, to); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return false; } - MutilTempalteTabPane.getInstance().repaint(); } - @Override - public String getSelectedTemplatePath() { - return reportletsTree.getSelectedTemplatePath(); + public FileNode getFileNode() { + return reportletsTree.getSelectedFileNode(); } - public void setToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { - this.toobarStateChangeListener = toobarStateChangeListener; + public void setToolbarStateChangeListener(FileToolbarStateChangeListener listener) { + this.toolBarStateChangeListener = listener; } + /** - * 文件名是否存在 + * 仅支持在拥有完整权限的文件夹下进行新建和重命名操作,那么是可以看到改文件夹下所有文件的。 * * @param newName 原名 - * @param oldName 新的文件名 * @param suffix 后缀名 - * @return 是否存在 + * @return 是否有重名的 */ @Override - public boolean isNameAlreadyExist(String newName, String oldName, String suffix) { - boolean isNameAlreadyExist = false; - - TemplateFileTree tt = reportletsTree; - DefaultMutableTreeNode gen = (DefaultMutableTreeNode) tt.getModel().getRoot(); - ArrayList al = new ArrayList(); + public boolean duplicated(String newName, String suffix) { - findFiles(gen, al); - - for (int i = 0; i < al.size(); i++) { - if (ComparatorUtils.equals(al.get(i), newName + suffix)) { - isNameAlreadyExist = true; - break; - } + // 选中的节点 + TreePath treePath = reportletsTree.getSelectionPath(); + if (treePath == null) { + return false; } + DefaultMutableTreeNode currentTreeNode = (DefaultMutableTreeNode) treePath.getLastPathComponent(); + TreeNode parentTreeNode = currentTreeNode.getParent(); - if (ComparatorUtils.equals(newName, oldName)) { - isNameAlreadyExist = false; - } + Enumeration children = parentTreeNode.children(); - return isNameAlreadyExist; - } - - - private void findFiles(DefaultMutableTreeNode node, ArrayList al) { - String[] str = new String[node.getChildCount()]; - for (int j = 0; j < node.getChildCount(); j++) { - DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(j); - if (childNode.getChildCount() > 0) { - findFiles(childNode, al); - } else { - str[j] = node.getChildAt(j).toString(); - if (str[j].contains(".")) { - al.add(str[j]); + while (children.hasMoreElements()) { + DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) children.nextElement(); + Object object = childNode.getUserObject(); + if (object instanceof FileNode) { + if (ComparatorUtils.equals(((FileNode) object).getName(), newName + suffix)) { + return true; } + } else { + return false; } } + return false; } } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java index 862aff379..0a13dd1bd 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/TemplateFileTree.java @@ -2,17 +2,13 @@ package com.fr.design.gui.itree.filetree; import com.fr.base.FRContext; import com.fr.base.extension.FileExtension; +import com.fr.design.file.NodeAuthProcessor; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.file.filetree.FileNode; -import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; -import com.fr.report.DesignAuthority; import com.fr.stable.ArrayUtils; -import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; -import com.fr.workspace.WorkContext; -import com.fr.workspace.server.authority.AuthorityOperator; import javax.swing.text.Position; import javax.swing.tree.DefaultTreeModel; @@ -26,12 +22,6 @@ import java.util.List; */ public class TemplateFileTree extends EnvFileTree { - - /** - * 远程设计拥有全部权限的文件夹路径 - */ - private ArrayList paths = new ArrayList<>(); - public TemplateFileTree() { super(ProjectConstants.REPORTLETS_NAME, null, null); } @@ -79,10 +69,32 @@ public class TemplateFileTree extends EnvFileTree { } } + return selectedPathList.toArray(new String[0]); + } + public String[] getSelectedFolderPaths() { + TreePath[] selectedTreePaths = this.getSelectionPaths(); + if (ArrayUtils.isEmpty(selectedTreePaths)) { + return ArrayUtils.EMPTY_STRING_ARRAY; + } + List selectedPathList = new ArrayList(); + for (TreePath treepath : selectedTreePaths) { + ExpandMutableTreeNode currentTreeNode = (ExpandMutableTreeNode) treepath.getLastPathComponent(); + Object userObject = currentTreeNode.getUserObject(); + if (userObject instanceof FileNode) { + FileNode fn = (FileNode) userObject; + if (fn.isDirectory()) { + String envPath = fn.getEnvPath(); + if (envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { + selectedPathList.add(envPath.substring(ProjectConstants.REPORTLETS_NAME.length())); + } + } + } + } return selectedPathList.toArray(new String[0]); } + @Override public TreePath getNextMatch(String prefix, int startingRow, Position.Bias bias) { @@ -122,37 +134,11 @@ public class TemplateFileTree extends EnvFileTree { */ @Override public void refreshEnv() { - paths.clear(); - - if (!WorkContext.getCurrent().isLocal()) { - try { - String username = WorkContext.getConnector().currentUser(); - // 远程设计获取全部设计成员的权限列表 - DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(); - DesignAuthority authority = null; - - if (authorities != null) { - for (DesignAuthority designAuthority : authorities) { - if (ComparatorUtils.equals(designAuthority.getUsername(), username)) { - authority = designAuthority; - } - } - } - if (authority != null) { - for (DesignAuthority.Item item : authority.getItems()) { - if (item.getType()) { - paths.add(item.getPath()); - } - } - } - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } - } - + NodeAuthProcessor.getInstance().refresh(); DefaultTreeModel defaultTreeModel = (DefaultTreeModel) this.getModel(); ExpandMutableTreeNode rootTreeNode = (ExpandMutableTreeNode) defaultTreeModel.getRoot(); + NodeAuthProcessor.getInstance().fixTreeNodeAuth(rootTreeNode); rootTreeNode.removeAllChildren(); FileNode[] fns; @@ -178,64 +164,34 @@ public class TemplateFileTree extends EnvFileTree { } @Override - protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode treeNode) { - + public ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode treeNode) { + FileNode[] fnArray = listFileNodes(treeNode); - + return fileNodeArray2TreeNodeArray(fnArray); } - /* - * 把FileNode[]转成ExpandMutableTreeNode[] - */ - private ExpandMutableTreeNode[] fileNodeArray2TreeNodeArray(FileNode[] fileNodes) { - boolean isLocal = WorkContext.getCurrent().isLocal(); - boolean isRoot = WorkContext.getCurrent().isRoot(); - ExpandMutableTreeNode[] res = new ExpandMutableTreeNode[fileNodes.length]; - for (int i = 0; i < res.length; i++) { - FileNode fn = fileNodes[i]; - res[i] = new ExpandMutableTreeNode(fn); - if (fn.isDirectory()) { - res[i].add(new ExpandMutableTreeNode()); - if (isLocal || isRoot) { - res[i].setFullAuthority(true); - } else { - boolean hasFullAuthority = isContained(fn); - res[i].setFullAuthority(hasFullAuthority); - } - } + + public ExpandMutableTreeNode[] getSelectedTreeNodes() { + TreePath[] paths = this.getSelectionPaths(); + + if (paths == null) { + return new ExpandMutableTreeNode[0]; } - return res; - } - private boolean isContained(FileNode fileNode) { + ArrayList res = new ArrayList<>(); - for (String auPath : paths) { - if (isContained(auPath, fileNode)) { - return true; - } + for (TreePath path : paths) { + res.add((ExpandMutableTreeNode) path.getLastPathComponent()); } - return false; + return res.toArray(new ExpandMutableTreeNode[res.size()]); } - private boolean isContained(String auPath, FileNode fileNode) { - auPath = ProjectConstants.REPORTLETS_NAME + CoreConstants.SEPARATOR + auPath; - String fileName = fileNode.getEnvPath(); - String[] auPaths = auPath.split(CoreConstants.SEPARATOR); - String[] nodePaths = fileName.split(CoreConstants.SEPARATOR); - // 待判断目录是有权限目录或者有权限目录的子目录,全部权限 - if (auPaths.length <= nodePaths.length) { - for (int i = 0; i < auPaths.length; i++) { - if (!auPaths[i].equals(nodePaths[i])) { - return false; - } - } - return fileNode.isDirectory(); - } - // 其他情况半权限 - else { - return false; - } + /* + * 把FileNode[]转成ExpandMutableTreeNode[] + */ + private ExpandMutableTreeNode[] fileNodeArray2TreeNodeArray(FileNode[] fileNodes) { + return NodeAuthProcessor.getInstance().parser2TreeNodeArray(fileNodes); } @@ -270,7 +226,7 @@ public class TemplateFileTree extends EnvFileTree { * 求当前TreeNode下所有的FileNode. */ private FileNode[] listFileNodes(ExpandMutableTreeNode currentTreeNode) { - + if (currentTreeNode == null) { return new FileNode[0]; } @@ -278,12 +234,10 @@ public class TemplateFileTree extends EnvFileTree { Object object = currentTreeNode.getUserObject(); if (object instanceof FileNode) { - + return this.listFileNodes(((FileNode) object).getEnvPath()); } return new FileNode[0]; } - - } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index ec27d1f73..83e30eecf 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -1,7 +1,6 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; -import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignModelAdapter; import com.fr.design.DesignerEnvManager; @@ -13,6 +12,7 @@ import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.tabledata.ResponseDataSourceChange; import com.fr.design.file.FileOperations; import com.fr.design.file.FileToolbarStateChangeListener; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.file.MutilTempalteTabPane; import com.fr.design.file.TemplateTreePane; @@ -21,66 +21,66 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuHighLight; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.itoolbar.UIToolbar; -import com.fr.design.gui.itree.filetree.TemplateFileTree; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.roleAuthority.RolesAlreadyEditedPane; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; -import com.fr.io.utils.ResourceIOUtils; +import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; -import com.fr.stable.StableUtils; -import com.fr.stable.project.ProjectConstants; +import com.fr.stable.StringUtils; import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.BoxLayout; import javax.swing.JDialog; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingConstants; +import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; +import java.awt.Component; import java.awt.Dimension; -import java.awt.GridLayout; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; +import static javax.swing.JOptionPane.WARNING_MESSAGE; + public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarStateChangeListener, ResponseDataSourceChange { private static final String FILE = "file"; private static volatile DesignerFrameFileDealerPane THIS; - private CardLayout card; - - private JPanel cardPane; - - private java.util.List otherToobarStateChangeListeners = new ArrayList<>(); + private List otherToolbarStateChangeListeners = new ArrayList<>(); private FileOperations selectedOperation; private UIToolbar toolBar; - private OpenReportAction openReportAction = new OpenReportAction(); + private NewFolderAction newFolderAction = new NewFolderAction(); private RefreshTreeAction refreshTreeAction = new RefreshTreeAction(); - private OpenFolderAction openFolderAction = new OpenFolderAction(); + private ShowInExplorerAction showInExplorerAction = new ShowInExplorerAction(); private RenameAction renameAction = new RenameAction(); @@ -91,11 +91,10 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt * 刷新 */ public void refresh() { - selectedOperation.refresh(); } - public static final DesignerFrameFileDealerPane getInstance() { + public static DesignerFrameFileDealerPane getInstance() { if (THIS == null) { synchronized (DesignerFrameFileDealerPane.class) { @@ -121,13 +120,14 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt tooBarPane.add(new UIMenuHighLight(), BorderLayout.SOUTH); add(tooBarPane, BorderLayout.NORTH); - cardPane = new JPanel(card = new CardLayout()); + CardLayout card; + JPanel cardPane = new JPanel(card = new CardLayout()); cardPane.add(TemplateTreePane.getInstance(), FILE); selectedOperation = TemplateTreePane.getInstance(); card.show(cardPane, FILE); - TemplateTreePane.getInstance().setToobarStateChangeListener(this); + TemplateTreePane.getInstance().setToolbarStateChangeListener(this); add(cardPane, BorderLayout.CENTER); stateChange(); @@ -136,7 +136,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public final void setCurrentEditingTemplate(JTemplate jt) { - DesignModelAdapter.setCurrentModelAdapter(jt == null ? null : jt.getModel()); + DesignModelAdapter.setCurrentModelAdapter(jt.getModel()); fireDSChanged(); TableDataTreePane.getInstance(DesignModelAdapter.getCurrentModelAdapter()); HistoryTemplateListPane.getInstance().setCurrentEditingTemplate(jt); @@ -152,7 +152,9 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt jt.requestFocus(); jt.revert(); - FRContext.getLogger().info("\"" + jt.getEditingFILE().getName() + "\"" + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_LOG_Has_Been_Openned") + "!"); + FineLoggerFactory.getLogger().info( + "\"" + jt.getEditingFILE().getName() + "\"" + + Toolkit.i18nText("Fine-Design_Basic_LOG_Has_Been_Openned") + "!"); } /** @@ -161,27 +163,26 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public void refreshDockingView() { ToolBarDef toolbarDef = new ToolBarDef(); - toolbarDef.addShortCut(openReportAction, refreshTreeAction); + toolbarDef.addShortCut(newFolderAction, refreshTreeAction); if (WorkContext.getCurrent().isLocal()) { - toolbarDef.addShortCut(openFolderAction, renameAction); + toolbarDef.addShortCut(showInExplorerAction); } - toolbarDef.addShortCut(delFileAction); + toolbarDef.addShortCut(renameAction, delFileAction); Set extraShortCuts = ExtraDesignClassManager.getInstance().getExtraShortCuts(); for (ShortCut shortCut : extraShortCuts) { toolbarDef.addShortCut(shortCut); } - toolbarDef.updateToolBar(toolBar); - refreshActions(); + resetActionStatus(); refresh(); } - private void refreshActions() { + private void resetActionStatus() { - openReportAction.setEnabled(false); + newFolderAction.setEnabled(false); refreshTreeAction.setEnabled(true); - openFolderAction.setEnabled(false); + showInExplorerAction.setEnabled(false); renameAction.setEnabled(false); delFileAction.setEnabled(false); this.repaint(); @@ -206,28 +207,53 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } + public void addToolbarStateChangeListener(FileToolbarStateChangeListener listener) { + this.otherToolbarStateChangeListeners.add(listener); + } + + public void removeToolbarStateChangeListener(FileToolbarStateChangeListener listener) { + this.otherToolbarStateChangeListeners.remove(listener); + } + + private void otherStateChange() { + for (FileToolbarStateChangeListener listener : otherToolbarStateChangeListeners) { + listener.stateChange(); + } + } + /* - * Open Report Action + * 新建文件夹 */ - private class OpenReportAction extends UpdateAction { + private class NewFolderAction extends UpdateAction { - public OpenReportAction() { + public NewFolderAction() { - this.setName(KeySetUtils.OPEN_TEMPLATE.getMenuKeySetName()); - this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/open.png")); + this.setName(KeySetUtils.NEW_FOLDER.getMenuKeySetName()); + this.setSmallIcon(BaseUtils.readIcon("com/fr/design/images/icon_NewFolderIcon_normal.png")); } @Override public void actionPerformed(ActionEvent evt) { - selectedOperation.openSelectedReport(); + if (!selectedOperation.access()) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + WARNING_MESSAGE); + return; + } + + new MkdirDialog(); } } - private class OpenFolderAction extends UpdateAction { + /** + * 在系统资源管理器中打开 + */ + private class ShowInExplorerAction extends UpdateAction { - public OpenFolderAction() { + public ShowInExplorerAction() { this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Show_In_Containing_Folder")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_file/view_folder.png")); @@ -236,7 +262,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt @Override public void actionPerformed(ActionEvent evt) { - selectedOperation.openContainerFolder(); + selectedOperation.showInExplorer(); } } @@ -247,7 +273,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public RefreshTreeAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Refresh")); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Refresh")); this.setSmallIcon(UIConstants.REFRESH_ICON); } @@ -260,20 +286,6 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } } - public void addToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { - this.otherToobarStateChangeListeners.add(toobarStateChangeListener); - } - - public void removeToobarStateChangeListener(FileToolbarStateChangeListener toobarStateChangeListener) { - this.otherToobarStateChangeListeners.remove(toobarStateChangeListener); - } - - private void otherStateChange() { - for (FileToolbarStateChangeListener toobarStateChangeListener : otherToobarStateChangeListeners) { - toobarStateChangeListener.stateChange(); - } - } - /* * 重命名文件 */ @@ -281,14 +293,22 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public RenameAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Rename")); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Rename")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/source/rename.png")); } @Override public void actionPerformed(ActionEvent evt) { + if (!selectedOperation.access()) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + WARNING_MESSAGE); + return; + } - new RenameDialog(); + FileNode node = selectedOperation.getFileNode(); + new FileRenameDialog(node); MutilTempalteTabPane.getInstance().repaint(); } @@ -301,13 +321,21 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt public DelFileAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remove")); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Remove")); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/data/source/delete.png")); } @Override public void actionPerformed(ActionEvent evt) { + if (!selectedOperation.access()) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Template_Permission_Denied"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + WARNING_MESSAGE); + return; + } + selectedOperation.deleteFile(); } } @@ -318,295 +346,411 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt @Override public void stateChange() { - if (selectedOperation.getSelectedTemplatePath() != null) { - openReportAction.setEnabled(true); - renameAction.setEnabled(true); - delFileAction.setEnabled(true); - } else { - openReportAction.setEnabled(false); - renameAction.setEnabled(false); - delFileAction.setEnabled(false); - } - openFolderAction.setEnabled(containsFolderNums() + seletedTemplateNums() != 0); + int selectedPathNum = TemplateTreePane.getInstance().countSelectedPath(); + + // 新建文件夹,重命名操作,在explorer中打开三个操作在选中单个文件夹或者文件时可用,其他情况不可用 + boolean singleSelected = selectedPathNum == 1; + newFolderAction.setEnabled(singleSelected); + renameAction.setEnabled(singleSelected); + showInExplorerAction.setEnabled(singleSelected); + // 删除操作在至少选中一个时可用 + boolean selected = selectedPathNum > 0; + delFileAction.setEnabled(selected); + + // 刷新操作始终可用 refreshTreeAction.setEnabled(true); - if (containsFolderNums() > 0 && (containsFolderNums() + seletedTemplateNums() > 1)) { - refreshActions(); - } else if (containsFolderNums() == 0 && seletedTemplateNums() > 1) { - openReportAction.setEnabled(false); - refreshTreeAction.setEnabled(true); - openFolderAction.setEnabled(false); - renameAction.setEnabled(false); - delFileAction.setEnabled(true); - } + // 其他状态 otherStateChange(); } - /** - * 是否包含文件夹 - * - * @return - */ - - private int containsFolderNums() { - - TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); - if (fileTree.getSelectionPaths() == null) { - return 0; - } - - //选择的包含文件和文件夹的数目 - if (fileTree.getSelectionPaths().length == 0) { - return 0; - } - //所有的num减去模板的num,得到文件夹的num - return fileTree.getSelectionPaths().length - fileTree.getSelectedTemplatePaths().length; + public FileOperations getSelectedOperation() { + return selectedOperation; } /** - * 是否选择了多个模板 - * - * @return + * 重命名对话框 + * 支持快捷键Enter,ESC */ - private int seletedTemplateNums() { + private class FileRenameDialog extends JDialog { - TemplateFileTree fileTree = TemplateTreePane.getInstance().getTemplateFileTree(); - if (fileTree.getSelectionPaths() == null) { - return 0; - } + private UITextField nameField; - return fileTree.getSelectedTemplatePaths().length; - } + private UILabel warnLabel; + private UIButton confirmButton; - // js: 重命名对话框,模仿Eclipse的重命名,支持快捷键F2,Enter,ESC - private class RenameDialog { + /** + * 操作的节点 + */ + private FileNodeFILE fnf; - private UITextField jt; - private String userInput; + private FileRenameDialog(FileNode node) { + if (node == null) { + return; + } + fnf = new FileNodeFILE(node); - private String oldName; + String oldName = fnf.getName(); + String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, ""); - private UILabel hintsLabel; + this.setLayout(new BorderLayout()); + this.setModal(true); - private UIButton confirmButton; + // 输入框前提示 + UILabel newNameLabel = new UILabel(Toolkit.i18nText( + fnf.isDirectory() ? + "Fine-Design_Basic_Enter_New_Folder_Name" : "Fine-Design_Basic_Enter_New_File_Name") + ); + newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); + newNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); + newNameLabel.setPreferredSize(new Dimension(118, 15)); - private JDialog jd; + // 重命名输入框 + nameField = new UITextField(oldName); + nameField.getDocument().addDocumentListener(new DocumentListener() { - private String suffix; + public void changedUpdate(DocumentEvent e) { + validInput(); + } - public RenameDialog() { + public void insertUpdate(DocumentEvent e) { + validInput(); + } - final String reportPath = selectedOperation.getSelectedTemplatePath(); - if (reportPath == null) { - return; - } + public void removeUpdate(DocumentEvent e) { + validInput(); + } + }); + nameField.selectAll(); + nameField.setPreferredSize(new Dimension(180, 20)); - final FileNodeFILE nodeFile = new FileNodeFILE(new FileNode(StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath), false)); - final String path = nodeFile.getPath(); - oldName = nodeFile.getName(); - suffix = oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replaceAll(suffix, ""); + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); + topPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15)); + topPanel.add(newNameLabel); + topPanel.add(nameField); - jd = new JDialog(); - jd.setLayout(new GridLayout(2, 2)); - jd.setModal(true); - UILabel newNameLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Enter_New_File_Name")); - newNameLabel.setMinimumSize(new Dimension(150, 27)); - newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); - jt = new UITextField(oldName); - jt.getDocument().addDocumentListener(getdoDocumentListener()); - jt.selectAll(); - jt.setPreferredSize(new Dimension(150, 20)); - - JPanel newNamePanel = new JPanel(); - newNamePanel.setLayout(new BoxLayout(newNamePanel, BoxLayout.X_AXIS)); - newNamePanel.add(Box.createHorizontalGlue()); - newNamePanel.add(newNameLabel); - newNamePanel.add(Box.createHorizontalStrut(5)); - jd.add(newNamePanel); - - JPanel jtPanel = new JPanel(); - jtPanel.setLayout(new BoxLayout(jtPanel, BoxLayout.Y_AXIS)); - JPanel containJt = new JPanel(new BorderLayout()); - containJt.add(jt, BorderLayout.WEST); - containJt.setMaximumSize(new Dimension(200, 20)); - jtPanel.add(Box.createVerticalGlue()); - jtPanel.add(containJt); - jtPanel.add(Box.createVerticalGlue()); - jd.add(jtPanel); - - addUITextFieldListener(nodeFile, path); - - hintsLabel = new UILabel(); - hintsLabel.setBounds(20, 50, 250, 30); - hintsLabel.setMaximumSize(new Dimension(200, 30)); - hintsLabel.setHorizontalAlignment(SwingConstants.RIGHT); - hintsLabel.setForeground(Color.RED); - hintsLabel.setVisible(false); - - confirmButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Confirm")); - confirmButton.setPreferredSize(new Dimension(80, 25)); - confirmButton.setMinimumSize(new Dimension(80, 25)); - confirmButton.setMaximumSize(new Dimension(80, 25)); + // 增加enter以及esc快捷键的支持 + nameField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + dispose(); + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (confirmButton.isEnabled()) { + confirmClose(); + } + } + } + }); + // 重名提示 + warnLabel = new UILabel(); + warnLabel.setPreferredSize(new Dimension(300, 30)); + warnLabel.setHorizontalAlignment(SwingConstants.LEFT); + warnLabel.setForeground(Color.RED); + warnLabel.setVisible(false); + + JPanel midPanel = new JPanel(new BorderLayout()); + midPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + midPanel.add(warnLabel, BorderLayout.WEST); + + // 确认按钮 + confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Confirm")); + confirmButton.setPreferredSize(new Dimension(60, 25)); confirmButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - - confirmClose(nodeFile, path); + confirmClose(); } }); - UIButton cancelButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); - cancelButton.setPreferredSize(new Dimension(80, 25)); - cancelButton.setMinimumSize(new Dimension(80, 25)); - cancelButton.setMaximumSize(new Dimension(80, 25)); + // 取消按钮 + UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); + cancelButton.setPreferredSize(new Dimension(60, 25)); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - - jd.dispose(); + dispose(); } }); - JPanel hintsPanel = new JPanel(); - hintsPanel.setLayout(new BorderLayout()); - hintsPanel.add(hintsLabel, BorderLayout.EAST); - jd.add(hintsLabel); - - JPanel btPanel = new JPanel(new BorderLayout()); - btPanel.setLayout(new BoxLayout(btPanel, BoxLayout.X_AXIS)); - btPanel.add(Box.createHorizontalGlue()); - btPanel.add(confirmButton); - btPanel.add(Box.createHorizontalStrut(5)); - btPanel.add(cancelButton); - btPanel.add(Box.createHorizontalStrut(20)); - jd.add(btPanel); - - jd.setSize(380, 200); - jd.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Rename")); - jd.setResizable(false); - jd.setAlwaysOnTop(true); - jd.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); - jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); - GUICoreUtils.centerWindow(jd); - jd.setVisible(true); + JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + bottomPanel.add(confirmButton); + bottomPanel.add(cancelButton); + + this.add( + TableLayoutHelper.createTableLayoutPane( + new Component[][]{ + new Component[]{topPanel}, + new Component[]{midPanel}, + new Component[]{bottomPanel} + }, + new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, + new double[]{TableLayout.FILL} + ), + BorderLayout.CENTER); + + + this.setSize(340, 180); + this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Rename")); + this.setResizable(false); + this.setAlwaysOnTop(true); + this.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); + this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + GUICoreUtils.centerWindow(this); + this.setVisible(true); } - public void confirmClose(FileNodeFILE nodeFile, String path) { + private void confirmClose() { + + String userInput = nameField.getText().trim(); + + String path = fnf.getPath(); + + String oldName = fnf.getName(); + String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, ""); + + // 输入为空或者没有修改 + if (ComparatorUtils.equals(userInput, oldName)) { + this.dispose(); + return; + } + + String oldPath = path.replaceAll(CoreConstants.SEPARATOR, "\\\\"); + + String parentPath = fnf.getParent().getPath().replaceAll(CoreConstants.SEPARATOR, "\\\\"); - userInput = userInput == null ? oldName : userInput; - String oldPath = path.replaceAll("/", "\\\\"); - String newPath = path.replace(nodeFile.getName(), userInput + suffix); - renameTemplateInMemory(nodeFile, userInput + suffix, oldName + suffix); - DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(oldPath, newPath.replaceAll("/", "\\\\")); + // 简单执行old new 替换是不可行的,例如 /abc/abc/abc/abc/ + String newPath = parentPath + "\\" + userInput + suffix; + + HistoryTemplateListCache.getInstance().rename(fnf, oldPath, newPath); + DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(fnf.isDirectory(), oldPath, newPath); //模版重命名 - ResourceIOUtils.renameTo(path, newPath); + boolean success = selectedOperation.rename(fnf, oldPath, newPath); selectedOperation.refresh(); DesignerContext.getDesignerFrame().setTitle(); - jd.dispose(); + this.dispose(); + + if (!success) { + JOptionPane.showConfirmDialog(null, + Toolkit.i18nText("Fine-Design_Basic_Rename_Failure"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); + } } - private void renameTemplateInMemory(FILE tplFile, String newName, String oldName) { - JTemplate dPane = getSpecialTemplateByFILE(tplFile); - if (dPane == null) { + private void validInput() { + + String userInput = nameField.getText().trim(); + + String oldName = fnf.getName(); + String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, ""); + + if (StringUtils.isEmpty(userInput)) { + confirmButton.setEnabled(false); + } + + if (ComparatorUtils.equals(userInput, oldName)) { + warnLabel.setVisible(false); + confirmButton.setEnabled(true); return; } - FILE renameFile = dPane.getEditingFILE(); - renameFile.setPath(renameFile.getPath().replace(oldName, newName)); + + if (selectedOperation.duplicated(userInput, suffix)) { + nameField.selectAll(); + // 如果文件名已存在,则灰掉确认按钮 + warnLabel.setText( + Toolkit.i18nText(fnf.isDirectory() ? + "Fine-Design_Basic_Folder_Name_Duplicate" : + "Fine-Design_Basic_Template_File_Name_Duplicate", + userInput)); + warnLabel.setVisible(true); + confirmButton.setEnabled(false); + } else { + warnLabel.setVisible(false); + confirmButton.setEnabled(true); + } } + } - // 增加enter以及esc快捷键的支持 - public void addUITextFieldListener(final FileNodeFILE nodeFile, final String path) { - jt.addKeyListener(new KeyAdapter() { + /** + * 新建文件夹对话框 + * 支持快捷键Enter,ESC + */ + private class MkdirDialog extends JDialog { - public void keyPressed(KeyEvent e) { + private UITextField nameField; - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - jd.dispose(); - } + private UILabel warnLabel; + + private UIButton confirmButton; + + + private MkdirDialog() { + + this.setLayout(new BorderLayout()); + this.setModal(true); + + // 输入框前提示 + UILabel newNameLabel = new UILabel(Toolkit.i18nText( + "Fine-Design_Basic_Enter_New_Folder_Name") + ); + newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); + newNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); + newNameLabel.setPreferredSize(new Dimension(118, 15)); + + // 文件名输入框 + nameField = new UITextField(); + nameField.getDocument().addDocumentListener(new DocumentListener() { + + public void changedUpdate(DocumentEvent e) { + validInput(); + } + + public void insertUpdate(DocumentEvent e) { + validInput(); + } + + public void removeUpdate(DocumentEvent e) { + validInput(); } }); + nameField.selectAll(); + nameField.setPreferredSize(new Dimension(180, 20)); - jt.addKeyListener(new KeyAdapter() { + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); + topPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15)); + topPanel.add(newNameLabel); + topPanel.add(nameField); + // 增加enter以及esc快捷键的支持 + nameField.addKeyListener(new KeyAdapter() { + @Override public void keyPressed(KeyEvent e) { - - if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + dispose(); + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { if (confirmButton.isEnabled()) { - confirmClose(nodeFile, path); + confirmClose(); } } } }); + // 重名提示 + warnLabel = new UILabel(); + warnLabel.setPreferredSize(new Dimension(300, 30)); + warnLabel.setHorizontalAlignment(SwingConstants.LEFT); + warnLabel.setForeground(Color.RED); + warnLabel.setVisible(false); + + JPanel midPanel = new JPanel(new BorderLayout()); + midPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + midPanel.add(warnLabel, BorderLayout.WEST); + + // 确认按钮 + confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Confirm")); + confirmButton.setPreferredSize(new Dimension(60, 25)); + confirmButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + confirmClose(); + } + }); - } + // 取消按钮 + UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); + cancelButton.setPreferredSize(new Dimension(60, 25)); - // UITextField的输入监听 - public DocumentListener getdoDocumentListener() { + cancelButton.addActionListener(new ActionListener() { - DocumentListener dl = new DocumentListener() { + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); - public void changedUpdate(DocumentEvent e) { + JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + bottomPanel.add(confirmButton); + bottomPanel.add(cancelButton); + + this.add( + TableLayoutHelper.createTableLayoutPane( + new Component[][]{ + new Component[]{topPanel}, + new Component[]{midPanel}, + new Component[]{bottomPanel} + }, + new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, + new double[]{TableLayout.FILL} + ), + BorderLayout.CENTER); + + + this.setSize(340, 180); + this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir")); + this.setResizable(false); + this.setAlwaysOnTop(true); + this.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); + this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + GUICoreUtils.centerWindow(this); + this.setVisible(true); + } - isNameAlreadyExist(); - } + private void confirmClose() { + String userInput = nameField.getText().trim(); - public void insertUpdate(DocumentEvent e) { + if (StringUtils.isEmpty(userInput)) { + return; + } - isNameAlreadyExist(); - } + //新建文件夹 + boolean success = selectedOperation.mkdir( + selectedOperation.getFileNode().getParent() + CoreConstants.SEPARATOR + userInput + ); + selectedOperation.refresh(); + this.dispose(); + if (!success) { + JOptionPane.showConfirmDialog(null, + Toolkit.i18nText("Fine-Design_Basic_Make_Failure"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); + } + } - public void removeUpdate(DocumentEvent e) { - isNameAlreadyExist(); - } - }; + private void validInput() { + String userInput = nameField.getText().trim(); - return dl; - } - private void isNameAlreadyExist() { + if (StringUtils.isEmpty(userInput)) { + confirmButton.setEnabled(false); + } - userInput = jt.getText().trim(); - if (selectedOperation.isNameAlreadyExist(userInput, oldName, suffix)) { - jt.selectAll(); + if (selectedOperation.duplicated(userInput, StringUtils.EMPTY)) { + nameField.selectAll(); // 如果文件名已存在,则灰掉确认按钮 - hintsLabel.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_File_Name_Duplicate", userInput)); - hintsLabel.setVisible(true); + warnLabel.setText( + Toolkit.i18nText( + "Fine-Design_Basic_Folder_Name_Duplicate", + userInput)); + warnLabel.setVisible(true); confirmButton.setEnabled(false); } else { - hintsLabel.setVisible(false); + warnLabel.setVisible(false); confirmButton.setEnabled(true); } } } - /** - * @param tplFile - * @return 内存中的template重命名一下 - */ - private JTemplate getSpecialTemplateByFILE(FILE tplFile) { - HistoryTemplateListPane historyHandle = HistoryTemplateListPane.getInstance(); - if (ComparatorUtils.equals(historyHandle.getCurrentEditingTemplate().getEditingFILE(), tplFile)) { - return historyHandle.getCurrentEditingTemplate(); - } - for (int i = 0; i < historyHandle.getHistoryCount(); i++) { - if (ComparatorUtils.equals(historyHandle.get(i).getEditingFILE(), tplFile)) { - return historyHandle.get(i); - } - } - return null; - } - - public FileOperations getSelectedOperation() { - return selectedOperation; - } } diff --git a/designer-base/src/main/java/com/fr/design/menu/KeySetUtils.java b/designer-base/src/main/java/com/fr/design/menu/KeySetUtils.java index f220b46a0..3ecda64c4 100644 --- a/designer-base/src/main/java/com/fr/design/menu/KeySetUtils.java +++ b/designer-base/src/main/java/com/fr/design/menu/KeySetUtils.java @@ -5,7 +5,7 @@ package com.fr.design.menu; -import javax.swing.*; +import javax.swing.KeyStroke; import java.awt.event.KeyEvent; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; @@ -20,6 +20,23 @@ import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_M public class KeySetUtils { + public static final MenuKeySet NEW_FOLDER = new MenuKeySet() { + @Override + public char getMnemonic() { + return 'I'; + } + + @Override + public String getMenuName() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_New_Folder"); + } + + @Override + public KeyStroke getKeyStroke() { + return KeyStroke.getKeyStroke(KeyEvent.VK_I, DEFAULT_MODIFIER); + } + }; + public static final MenuKeySet OPEN_TEMPLATE = new MenuKeySet() { @Override @@ -547,7 +564,9 @@ public class KeySetUtils { public static final MenuKeySet REPORT_WATERMARK = new MenuKeySet() { @Override - public char getMnemonic() { return 'M'; } + public char getMnemonic() { + return 'M'; + } @Override public String getMenuName() { @@ -974,14 +993,6 @@ public class KeySetUtils { }; - - - - - - - - public static final MenuKeySet INSERT_FLOAT = new MenuKeySet() { @Override public char getMnemonic() { @@ -1000,41 +1011,4 @@ public class KeySetUtils { }; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - } diff --git a/designer-base/src/main/java/com/fr/file/FILE.java b/designer-base/src/main/java/com/fr/file/FILE.java index 3977ee87e..8c1f734cf 100644 --- a/designer-base/src/main/java/com/fr/file/FILE.java +++ b/designer-base/src/main/java/com/fr/file/FILE.java @@ -1,93 +1,106 @@ package com.fr.file; import javax.swing.Icon; +import java.io.InputStream; +import java.io.OutputStream; public interface FILE { /** - * 后缀 - * @return 后缀 + * 前缀 + * + * @return 前缀 */ - public String prefix(); + String prefix(); /** * 是否是目录 + * * @return 是则返回true */ - public boolean isDirectory(); - - // Name - public String getName(); - - // Icon - public Icon getIcon(); - - // 当前目录的Path - public String getPath(); - - public void setPath(String path); - - // 取当前目录的上级目录 - public FILE getParent(); + boolean isDirectory(); + + // Name + String getName(); + + // Icon + Icon getIcon(); + + // 当前目录的Path + String getPath(); + + void setPath(String path); + + // 取当前目录的上级目录 + FILE getParent(); /** * 列出当前目录下所有的文件及文件夹 + * * @return 文件 */ - public FILE[] listFiles(); + FILE[] listFiles(); /** * 新建一个目录 + * * @param name 名字 * @return 新建目录 */ - public boolean createFolder(String name); + boolean createFolder(String name); /** * 新建文件 + * * @return 是否新建成功 * @throws Exception 异常 */ - public boolean mkfile() throws Exception; + boolean mkfile() throws Exception; /** * 是否存在 + * * @return 是否存在 */ - public boolean exists(); + boolean exists(); /** * 关闭文件 + * * @throws Exception 异常 */ - public void closeTemplate() throws Exception; + void closeTemplate() throws Exception; /** * 作为输入流 + * * @return 输入流 * @throws Exception 异常 */ - public java.io.InputStream asInputStream() throws Exception; + InputStream asInputStream() throws Exception; /** * 作为输出流 + * * @return 输出流 * @throws Exception 异常 */ - public java.io.OutputStream asOutputStream() throws Exception; - - public String getEnvFullName(); + OutputStream asOutputStream() throws Exception; + + String getEnvFullName(); /** * 是否是内存文件 + * * @return 是则返回true */ - public boolean isMemFile(); + boolean isMemFile(); /** * 是否是环境文件 + * * @return 是则返回true */ - public boolean isEnvFile(); + boolean isEnvFile(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 3629dfdf9..447ebc367 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -3,17 +3,19 @@ package com.fr.file; import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.extension.FileExtension; -import com.fr.file.filetree.LocalFileNodes; import com.fr.design.DesignerEnvManager; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.UIDialog; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.DefaultCompletionFilter; import com.fr.design.gui.itextfield.UIAutoCompletionField; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -21,37 +23,63 @@ import com.fr.design.mainframe.DesignerFrame; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.file.filetree.FileNode; +import com.fr.file.filetree.LocalFileNodes; import com.fr.file.filter.ChooseFileFilter; import com.fr.file.filter.FILEFilter; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; - import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; -import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.os.windows.WindowsDetector; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import javax.swing.*; +import javax.swing.AbstractAction; +import javax.swing.AbstractListModel; +import javax.swing.ActionMap; +import javax.swing.BorderFactory; +import javax.swing.DefaultComboBoxModel; +import javax.swing.DefaultListCellRenderer; +import javax.swing.DefaultListModel; +import javax.swing.Icon; +import javax.swing.InputMap; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JList; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.KeyStroke; +import javax.swing.ListModel; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileSystemView; import javax.swing.plaf.basic.BasicArrowButton; import javax.swing.plaf.basic.BasicButtonUI; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Insets; +import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; @@ -68,6 +96,7 @@ import java.util.regex.Pattern; * 该文件选择器,整理行为如下: */ public class FILEChooserPane extends BasicPane { + /** * Return value if OK is chosen. */ @@ -81,17 +110,22 @@ public class FILEChooserPane extends BasicPane { public static final int JOPTIONPANE_CANCEL_OPTION = 3; + + /** + * alex:之所以在Pattern那里加个+,是因为有些路径会有两个甚至多个分隔符放在一起 + */ + private static final Pattern SEPARATOR_PATTERN = Pattern.compile("[/\\\\]+"); + private static final FILEChooserPane INSTANCE = new FILEChooserPane(); - public FILE currentDirectory; // 当前路径,在subFileList中显示这个路径下所有的文件 + private FILE currentDirectory; // 当前路径,在subFileList中显示这个路径下所有的文件 - private List filterList = new ArrayList(); + private List filterList = new ArrayList<>(); private FILEFilter filter; private LocationButtonPane locationBtnPane; // 显示location的Panel - private UIButton createFolderButton; + private UIButton mkdirButton; - private PlaceListModel model; private JList placesList; // File.listRoots() + Env + Favourite private JList subFileList; // 当前选中目录下的文件夹及文件 @@ -100,7 +134,6 @@ public class FILEChooserPane extends BasicPane { private UIComboBox postfixComboBox; // 文件后缀名的下拉列表框 private UIButton okButton; - private UIButton cancelButton; protected int type; @@ -110,7 +143,7 @@ public class FILEChooserPane extends BasicPane { private UIDialog dialog; - private int returnValue = CANCEL_OPTION; + private int option = CANCEL_OPTION; protected String suffix; @@ -138,7 +171,7 @@ public class FILEChooserPane extends BasicPane { INSTANCE.showEnv = showEnv; INSTANCE.showLoc = showLoc; INSTANCE.showWebReport = false; - INSTANCE.setModelOfPlaceList(); + INSTANCE.setPlaceListModel(); INSTANCE.removeAllFilter(); return INSTANCE; } @@ -150,7 +183,7 @@ public class FILEChooserPane extends BasicPane { */ public static FILEChooserPane getInstance(boolean showEnv, FILEFilter filter) { INSTANCE.showEnv = showEnv; - INSTANCE.setModelOfPlaceList(); + INSTANCE.setPlaceListModel(); INSTANCE.removeAllFilter(); INSTANCE.addChooseFILEFilter(filter, 0); return INSTANCE; @@ -166,7 +199,7 @@ public class FILEChooserPane extends BasicPane { INSTANCE.showEnv = showEnv; INSTANCE.showLoc = showLoc; INSTANCE.showWebReport = false; - INSTANCE.setModelOfPlaceList(); + INSTANCE.setPlaceListModel(); INSTANCE.removeAllFilter(); INSTANCE.addChooseFILEFilter(filter, 0); return INSTANCE; @@ -183,7 +216,7 @@ public class FILEChooserPane extends BasicPane { INSTANCE.showEnv = showEnv; INSTANCE.showLoc = showLoc; INSTANCE.showWebReport = showWebReport; - INSTANCE.setModelOfPlaceList(); + INSTANCE.setPlaceListModel(); INSTANCE.removeAllFilter(); INSTANCE.addChooseFILEFilterToFist(filter, 0); return INSTANCE; @@ -202,7 +235,7 @@ public class FILEChooserPane extends BasicPane { actionMap.put("dialogExit", new AbstractAction() { @Override public void actionPerformed(ActionEvent evt) { - returnValue = CANCEL_OPTION; + option = CANCEL_OPTION; dialogExit(); } }); @@ -211,8 +244,8 @@ public class FILEChooserPane extends BasicPane { // locationPane.setLayout(FRGUIPaneFactory.createBorderLayout()); locationPane.add(locationBtnPane = new LocationButtonPane(), BorderLayout.CENTER); - createFolderButton = createFolderButton(); - locationPane.add(createFolderButton, BorderLayout.EAST); + mkdirButton = initMkdirButton(); + locationPane.add(mkdirButton, BorderLayout.EAST); JPanel centerLeftPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); // centerLeftPanel.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -222,32 +255,161 @@ public class FILEChooserPane extends BasicPane { centerLeftPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); centerLeftPanel.setPreferredSize(new Dimension(120, 1)); placesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - placesList.setCellRenderer(placelistRenderer); - placesList.addListSelectionListener(placeListener); - placesList.addMouseListener(placeMouseListener); + placesList.setCellRenderer(new DefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof FILE) { + FILE dir = (FILE) value; + + String name = dir.getName(); + if (name != null && !StringUtils.isBlank(name)) { + this.setText(name); + } else { + this.setText(GeneralContext.getCurrentAppNameOfEnv()); + } + Icon icon = dir.getIcon(); + if (icon != null) { + this.setIcon(icon); + } + } + + return this; + } + + }); + // placeList listener + placesList.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + Object selValue = placesList.getSelectedValue(); + if (selValue instanceof FILE) { + setSelectedDirectory((FILE) selValue); + } + } + }); + /* + * placeList mouseListener + */ + placesList.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + Object selValue = placesList.getSelectedValue(); + if (selValue instanceof FILE) { + setSelectedDirectory((FILE) selValue); + } + } + }); // centerRightPane JPanel centerRightPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); JPanel subFilePanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - // subFilePanel.setLayout(FRGUIPaneFactory.createBorderLayout()); // - // TODO alex_GUI // 以后rightPanel要用JTable - subFileList = new JList(new DefaultListModel()); - subFileList.setCellRenderer(listRenderer); - subFileList.addMouseListener(subFileListMouseListener); - subFileList.addKeyListener(subFileListKeyListener); + subFileList = new JList(new DefaultListModel<>()); + /* + * JList的CellRenderer + */ + subFileList.setCellRenderer(new DefaultListCellRenderer() { + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof FILE) { + FILE dir = (FILE) value; + + String name = dir.getName(); + if (name != null) { + this.setText(name); + } + Icon icon = dir.getIcon(); + if (icon != null) { + this.setIcon(icon); + } + } + + return this; + } + + }); + /* + * 鼠标点击JList时的listener + */ + subFileList.addMouseListener(new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + Object source = e.getSource(); + if (!(source instanceof JList)) { + return; + } + + if (e.getClickCount() < 1) { + return; + } + + JList list = (JList) source; + + Object selValue = list.getSelectedValue(); + if (selValue instanceof FILE) { + if (e.getClickCount() == 1) { + fileNameTextField.removeDocumentListener(); + setFileTextField((FILE) selValue); + fileNameTextField.addDocumentListener(); + } else { + setSelectedDirectory((FILE) selValue); + if (!((FILE) selValue).isDirectory()) { + doOK(); + } + } + } + } + }); + /* + * right list. + */ + // Richie:按下Enter的时候打开文件夹或者打开文件 + subFileList.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + Object source = e.getSource(); + if (!(source instanceof JList)) { + return; + } + + JList list = (JList) source; + + Object selValue = list.getSelectedValue(); + if (selValue instanceof FILE) { + setFileTextField((FILE) selValue); + // if (((FILE)selValue).isDirectory()) { + // fileNameTextField.setText(""); + // } + // Richie:按下Enter的时候打开文件夹或者打开文件 + if (e.getKeyCode() == KeyEvent.VK_ENTER) { + setSelectedDirectory((FILE) selValue); + if (!((FILE) selValue).isDirectory()) { + doOK(); + } + } + } + + } + }); scrollPane = new JScrollPane(subFileList); subFilePanel.add(scrollPane, BorderLayout.CENTER); centerRightPane.add(subFilePanel, BorderLayout.CENTER); // 用createTableLayoutPane布局下fileNamePane + UIButton cancelButton; Component[][] coms = new Component[][]{ - new Component[]{GUICoreUtils.createBorderPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_File_Name") + ":"), BorderLayout.WEST), - fileNameTextField = new UIAutoCompletionField(), okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Design_File_Open")) + new Component[]{GUICoreUtils.createBorderPane(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Utils_File_Name") + ":"), BorderLayout.WEST), + fileNameTextField = new UIAutoCompletionField(), okButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Utils_Design_File_Open")) }, - new Component[]{GUICoreUtils.createBorderPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Utils_File_Type") + ":"), BorderLayout.WEST), - postfixComboBox = new UIComboBox(), cancelButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Design_Action_Cancel")) + new Component[]{GUICoreUtils.createBorderPane(new UILabel(Toolkit.i18nText("Fine-Design_Report_Utils_File_Type") + ":"), BorderLayout.WEST), + postfixComboBox = new UIComboBox(), cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Utils_Design_Action_Cancel")) }}; JPanel fileNamePane = TableLayoutHelper.createGapTableLayoutPane(coms, new double[]{TableLayout.PREFERRED, TableLayout.PREFERRED, @@ -255,7 +417,7 @@ public class FILEChooserPane extends BasicPane { centerRightPane.add(fileNamePane, BorderLayout.SOUTH); Component[][] outComponents = new Component[][]{ - new Component[]{GUICoreUtils.createBorderPane(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_File_Lookup_range") + ":"), BorderLayout.WEST), locationPane}, + new Component[]{GUICoreUtils.createBorderPane(new UILabel(Toolkit.i18nText("Fine-Design_Basic_App_File_Lookup_range") + ":"), BorderLayout.WEST), locationPane}, new Component[]{centerLeftPanel, centerRightPane}}; JPanel contentPane = TableLayoutHelper.createTableLayoutPane(outComponents, new double[]{TableLayout.PREFERRED, TableLayout.FILL}, new double[]{TableLayout.PREFERRED, TableLayout.FILL}); @@ -269,7 +431,7 @@ public class FILEChooserPane extends BasicPane { cancelButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { - returnValue = CANCEL_OPTION; + option = CANCEL_OPTION; doCancel(); } }); @@ -277,7 +439,7 @@ public class FILEChooserPane extends BasicPane { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { - returnValue = CANCEL_OPTION; + option = CANCEL_OPTION; doOK(); } } @@ -309,7 +471,7 @@ public class FILEChooserPane extends BasicPane { this(); this.showEnv = showEnv; this.showLoc = showLoc; - this.setModelOfPlaceList(); + this.setPlaceListModel(); } @@ -320,7 +482,7 @@ public class FILEChooserPane extends BasicPane { */ public FILE getSelectedFILE() { String fileName = fileNameTextField.getText().trim(); - if (!fileName.endsWith(suffix) && fileName.indexOf(CoreConstants.DOT) == -1) { + if (!fileName.endsWith(suffix) && !fileName.contains(CoreConstants.DOT)) { fileName += this.suffix; } if (currentDirectory == null) { @@ -334,7 +496,7 @@ public class FILEChooserPane extends BasicPane { } protected String getEnvProjectName() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Report_Env_Directory"); + return Toolkit.i18nText("Fine-Design_Basic_Utils_Report_Env_Directory"); } /** @@ -360,9 +522,6 @@ public class FILEChooserPane extends BasicPane { this.filterList.add(index, filter); } - // August:上面的方法在包含时直接return了,应该把改filter放在第一个 - // 不然在多次打开两个FILEchooserpane时,filter会出错 - /** * 若是已经存在,则将之删去之后,在指定的位置增加 * @@ -427,22 +586,15 @@ public class FILEChooserPane extends BasicPane { fileNameTextField.removeDocumentListener(); fileNameTextField.setText(text); fileNameTextField.addDocumentListener(); - if (currentDirectory != null) { + if (currentDirectory == null) { return; } - FILE[] res_array = currentDirectory.listFiles(); - String[] name_array = new String[res_array.length]; - for (int i = 0; i < res_array.length; i++) { - name_array[i] = res_array[i].getName(); + FILE[] files = currentDirectory.listFiles(); + String[] names = new String[files.length]; + for (int i = 0; i < files.length; i++) { + names[i] = files[i].getName(); } - fileNameTextField.setFilter(new DefaultCompletionFilter(name_array)); - } - - /** - * @return - */ - public String getFileNameTextField() { - return this.fileNameTextField.getText(); + fileNameTextField.setFilter(new DefaultCompletionFilter(names)); } @@ -514,7 +666,7 @@ public class FILEChooserPane extends BasicPane { @Override public void windowClosing(WindowEvent e) { - returnValue = CANCEL_OPTION; + option = CANCEL_OPTION; dialogExit(); } }); @@ -527,15 +679,13 @@ public class FILEChooserPane extends BasicPane { chooseType(); // richer:当文件类型被选定时,显示的文件就仅仅显示被选定的类型 // 如果是保存对话框,给个默认名字 - if (type == JFileChooser.SAVE_DIALOG) { - this.getFileNameTextField(); - } else { + if (type != JFileChooser.SAVE_DIALOG) { fileNameTextField.removeDocumentListener(); fileNameTextField.setText(""); fileNameTextField.addDocumentListener(); } dialog.setVisible(true); - return returnValue; + return option; } protected void fileType() { @@ -546,39 +696,39 @@ public class FILEChooserPane extends BasicPane { EnumSet fileExtensions = EnumSet.of(FileExtension.CPT, FileExtension.CPTX, FileExtension.FRM, FileExtension.FRMX, FileExtension.CHT); if (type == JFileChooser.OPEN_DIALOG) { if (WorkContext.getCurrent().isLocal()) { //本地连接 - this.addChooseFILEFilter(new ChooseFileFilter(fileSuffix_local, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(fileSuffix_local, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); } else { - this.addChooseFILEFilter(new ChooseFileFilter(fileExtensions, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(fileExtensions, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); } } // ben:filefilter设置初值为cpt过滤 - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CPT, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CPTX, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CPT, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CPTX, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); // richer:form文件 daniel 改成三个字 - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.FRM, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.FRMX, appName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.FRM, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.FRMX, appName + Toolkit.i18nText("Fine-Design_Report_Template_File"))); } else { if (type == JFileChooser.OPEN_DIALOG) { - this.addChooseFILEFilter(new ChooseFileFilter(EnumSet.of(FileExtension.XLS, FileExtension.XLSX), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Excel_Source"))); + this.addChooseFILEFilter(new ChooseFileFilter(EnumSet.of(FileExtension.XLS, FileExtension.XLSX), Toolkit.i18nText("Fine-Design_Basic_Import_Excel_Source"))); } } // 添加 xls 文件类型过滤 kt if (WorkContext.getCurrent().isLocal()) { //本地连接 - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.XLS, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Excel_Source"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.XLSX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Excel2007_Source"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.XLS, Toolkit.i18nText("Fine-Design_Basic_Import_Excel_Source"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.XLSX, Toolkit.i18nText("Fine-Design_Basic_Import_Excel2007_Source"))); } if (FileExtension.PNG.matchExtension(suffix)) { - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.PNG, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_Export_png"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.PNG, Toolkit.i18nText("Fine-Design_Basic_App_Export_png"))); } if (type == JFileChooser.SAVE_DIALOG) { - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.PDF, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Export_PDF"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.SVG, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Export_SVG"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CSV, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Export_CSV"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.DOC, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Export_Word"))); - this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.TXT, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Import_Export_Text"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.PDF, Toolkit.i18nText("Fine-Design_Basic_Import_Export_PDF"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.SVG, Toolkit.i18nText("Fine-Design_Basic_Import_Export_SVG"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.CSV, Toolkit.i18nText("Fine-Design_Basic_Import_Export_CSV"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.DOC, Toolkit.i18nText("Fine-Design_Basic_Import_Export_Word"))); + this.addChooseFILEFilter(new ChooseFileFilter(FileExtension.TXT, Toolkit.i18nText("Fine-Design_Basic_Import_Export_Text"))); } } @@ -586,12 +736,12 @@ public class FILEChooserPane extends BasicPane { private void chooseType() { DefaultComboBoxModel defaultComboBoxModel = (DefaultComboBoxModel) postfixComboBox.getModel(); defaultComboBoxModel.removeAllElements(); - for (FILEFilter aFilterList : filterList) { - defaultComboBoxModel.addElement(aFilterList); + for (FILEFilter filter : filterList) { + defaultComboBoxModel.addElement(filter); } if (WorkContext.getCurrent().isLocal()) { //本地连接 if (!showWebReport) { - defaultComboBoxModel.addElement(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_App_AllFiles") + "(*.*)"); + defaultComboBoxModel.addElement(Toolkit.i18nText("Fine-Design_Basic_Utils_App_AllFiles") + "(*.*)"); } } // 默认选取的文件类型(.cpt)类型 @@ -643,11 +793,11 @@ public class FILEChooserPane extends BasicPane { if (this.subFileList.getSelectedValue() == null) { FILE file = this.getSelectedFILE(); if (file.exists()) { - returnValue = OK_OPTION; + option = OK_OPTION; saveDictionary(); dialogExit(); } else { - JOptionPane.showMessageDialog(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_Template_Report_Not_Exist")); + JOptionPane.showMessageDialog(this, Toolkit.i18nText("Fine-Design_Basic_App_Template_Report_Not_Exist")); return; } } @@ -657,7 +807,7 @@ public class FILEChooserPane extends BasicPane { if (selectedSubFile != null && selectedSubFile.isDirectory()) { setSelectedDirectory((FILE) this.subFileList.getSelectedValue()); } else { - returnValue = OK_OPTION; + option = OK_OPTION; saveDictionary(); dialogExit(); } @@ -678,34 +828,42 @@ public class FILEChooserPane extends BasicPane { fileNameTextField.setText(filename + this.suffix); } } - returnValue = OK_OPTION; + option = OK_OPTION; FILE selectedFile = this.getSelectedFILE(); - boolean access = false; + if (access(selectedFile) && access(currentDirectory)) { + if (selectedFile.exists()) { + int selVal = JOptionPane.showConfirmDialog(dialog, Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Cover_The_Current_File") + " ?", + ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE); + if (selVal == JOptionPane.YES_OPTION) { + option = JOPTIONPANE_OK_OPTION; + saveDictionary(); + dialogExit(); + } else { + option = JOPTIONPANE_CANCEL_OPTION; + } + + } else { + dialogExit(); + saveDictionary(); + } + } else { + JOptionPane.showMessageDialog(FILEChooserPane.this, Toolkit.i18nText("Fine-Design_Basic_App_Privilege_No") + "!", Toolkit.i18nText("Fine-Design_Basic_App_File_Message"), JOptionPane.WARNING_MESSAGE); + + } + } + + private boolean access(FILE selectedFile) { + boolean access = false; try { access = FRContext.getOrganizationOperator().canAccess(selectedFile.getPath()); + if (selectedFile.isEnvFile() && selectedFile instanceof FileNodeFILE) { + access = access && ((FileNodeFILE) selectedFile).hasFullAuth(); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - if (!access) { - JOptionPane.showMessageDialog(FILEChooserPane.this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_Privilege_No") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_File_Message"), JOptionPane.WARNING_MESSAGE); - return; - } - if (selectedFile.exists()) { - int selVal = JOptionPane.showConfirmDialog(dialog, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Cover_The_Current_File") + " ?", - ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE); - if (selVal == JOptionPane.YES_OPTION) { - returnValue = JOPTIONPANE_OK_OPTION; - saveDictionary(); - dialogExit(); - } else { - returnValue = JOPTIONPANE_CANCEL_OPTION; - } - - } else { - dialogExit(); - saveDictionary(); - } + return access; } private void saveDictionary() { @@ -730,18 +888,11 @@ public class FILEChooserPane extends BasicPane { dialog = null; } - /** - * @return - */ - public int getReturnValue() { - return this.returnValue; - } - /* * dialog的名字 */ private String dialogName() { - return type == JFileChooser.OPEN_DIALOG ? com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Design_File_Open") : com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_Template_Save"); + return type == JFileChooser.OPEN_DIALOG ? Toolkit.i18nText("Fine-Design_Basic_Utils_Design_File_Open") : Toolkit.i18nText("Fine-Design_Basic_App_Template_Save"); } /* @@ -756,7 +907,6 @@ public class FILEChooserPane extends BasicPane { for (int i = 0, len = model.getSize(); i < len; i++) { if (ComparatorUtils.equals(name, ((FILE) model.getElementAt(i)).getName())) { subFileList.setSelectedIndex(i); - // TODO alex_GUI 怎么ScrollIntoView? break; } } @@ -782,20 +932,12 @@ public class FILEChooserPane extends BasicPane { }; } if (FILEChooserPane.this.showWebReport) { - // webReportFILE = new FileFILE(new - // File(FRContext.getCommonOperator().getWebReportPath())); webReportFILE = new FileNodeFILE(FRContext.getCommonOperator().getWebRootPath()); - // String webReportPath = - // FRContext.getCommonOperator().getWebReportPath(); - // String webReportParentPath = new - // File(webReportPath).getParent(); - // webReportFILE = new FileNodeFILE(new FileNode("WebReport", - // true),webReportParentPath); } if (FILEChooserPane.this.showLoc) { - if (OperatingSystem.isWindows()) { + if (WindowsDetector.detect(true)) { // windows下展示桌面 File[] desktop = FileSystemView.getFileSystemView().getRoots(); if (desktop != null) { @@ -805,7 +947,8 @@ public class FILEChooserPane extends BasicPane { } } } - } else { // *nix下展示家目录 + } else { + // *nix下展示家目录 filesOfSystem.add(new FileFILE(FileSystemView.getFileSystemView().getDefaultDirectory())); } @@ -847,11 +990,11 @@ public class FILEChooserPane extends BasicPane { } } - private void setCD(final FILE lastdirctory) { + private void setCD(final FILE lastDirectory) { for (int i = 0; i < this.getSize(); i++) { FILE file = this.getElementAt(i); - if (ComparatorUtils.equals(lastdirctory.prefix(), file.prefix())) { - setCurrentDirectory(lastdirctory); + if (ComparatorUtils.equals(lastDirectory.prefix(), file.prefix())) { + setCurrentDirectory(lastDirectory); return; } } @@ -859,16 +1002,17 @@ public class FILEChooserPane extends BasicPane { } } - protected void setModelOfPlaceList() { + private void setPlaceListModel() { if (placesList == null) { return; } - model = new PlaceListModel(); + PlaceListModel model = new PlaceListModel(); placesList.setModel(model); - String lastdirctorypath = DesignerEnvManager.getEnvManager().getDialogCurrentDirectory(); + String lastDirectoryPath = DesignerEnvManager.getEnvManager().getDialogCurrentDirectory(); String prefix = DesignerEnvManager.getEnvManager().getCurrentDirectoryPrefix(); - FILE lastdirctory = FILEFactory.createFolder(prefix + lastdirctorypath); - model.setCD(lastdirctory); + FILE lastDirectory = FILEFactory.createFolder(prefix + lastDirectoryPath); + + model.setCD(lastDirectory); if (currentDirectory != null) { return; @@ -884,159 +1028,10 @@ public class FILEChooserPane extends BasicPane { } } - private ListCellRenderer placelistRenderer = new DefaultListCellRenderer() { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - if (value instanceof FILE) { - FILE dir = (FILE) value; - - String name = dir.getName(); - if (name != null && !StringUtils.isBlank(name)) { - this.setText(name); - } else { - this.setText(GeneralContext.getCurrentAppNameOfEnv()); - } - Icon icon = dir.getIcon(); - if (icon != null) { - this.setIcon(icon); - } - } - - return this; - } - - }; - /* - * JList的CellRenderer - */ - private ListCellRenderer listRenderer = new DefaultListCellRenderer() { - - @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - if (value instanceof FILE) { - FILE dir = (FILE) value; - - String name = dir.getName(); - if (name != null) { - this.setText(name); - } - Icon icon = dir.getIcon(); - if (icon != null) { - this.setIcon(icon); - } - } - - return this; - } - - }; - // placeList listener - ListSelectionListener placeListener = new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - Object selValue = placesList.getSelectedValue(); - if (selValue instanceof FILE) { - setSelectedDirectory((FILE) selValue); - } - } - }; - - /** - * placeList mouseListener - */ - private MouseListener placeMouseListener = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object selValue = placesList.getSelectedValue(); - if (selValue instanceof FILE) { - setSelectedDirectory((FILE) selValue); - } - } - }; - - /** - * right list. - */ - private KeyListener subFileListKeyListener = new KeyAdapter() { - @Override - public void keyReleased(KeyEvent e) { - Object source = e.getSource(); - if (!(source instanceof JList)) { - return; - } - - JList list = (JList) source; - - Object selValue = list.getSelectedValue(); - if (selValue instanceof FILE) { - setFileTextField((FILE) selValue); - // if (((FILE)selValue).isDirectory()) { - // fileNameTextField.setText(""); - // } - // Richie:按下Enter的时候打开文件夹或者打开文件 - if (e.getKeyCode() == KeyEvent.VK_ENTER) { - setSelectedDirectory((FILE) selValue); - if (!((FILE) selValue).isDirectory()) { - doOK(); - } - } - } - - } - }; - /* - * 鼠标点击JList时的listener - */ - private MouseListener subFileListMouseListener = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object source = e.getSource(); - if (!(source instanceof JList)) { - return; - } - - if (e.getClickCount() < 1) { - return; - } - - JList list = (JList) source; - - Object selValue = list.getSelectedValue(); - if (selValue instanceof FILE) { - if (e.getClickCount() == 1) { - fileNameTextField.removeDocumentListener(); - setFileTextField((FILE) selValue); - fileNameTextField.addDocumentListener(); - } else { - setSelectedDirectory((FILE) selValue); - if (!((FILE) selValue).isDirectory()) { - doOK(); - } - } - } - } - }; - /* * 选中文件 */ private void setFileTextField(FILE file) { - // clickedFILE = file; - - // String okButtonText; - // if (file != null && file.isDirectory() - // && this.fileNameTextField.getText().length() == 0) { - // okButtonText = com.fr.design.i18n.Toolkit.i18nText("Open");// + "(O)"; - // } else { - // okButtonText = dialogName(); - // } - // okButton.setText(okButtonText); - if (file != null && !file.isDirectory()) { fileNameTextField.setText(file.getName()); if (file instanceof FileFILE) { @@ -1066,7 +1061,7 @@ public class FILEChooserPane extends BasicPane { for (int i = 0; i < defaultListModel.getSize(); i++) { if (defaultListModel.getElementAt(i) instanceof FileFILE) { FileFILE popDir = (FileFILE) defaultListModel.getElementAt(i); - if (popDir != null && dir != null && dir.getPath().indexOf(popDir.getPath()) == 0) { + if (popDir != null && dir.getPath().indexOf(popDir.getPath()) == 0) { placesList.setSelectedIndex(i); break; } @@ -1089,7 +1084,7 @@ public class FILEChooserPane extends BasicPane { currentDirectory = dir; this.locationBtnPane.populate(currentDirectory); - this.createFolderButton.setEnabled(currentDirectory != null); + this.mkdirButton.setEnabled(currentDirectory != null); refreshSubFileListModel(); } @@ -1127,7 +1122,7 @@ public class FILEChooserPane extends BasicPane { private BasicArrowButton leftArrowButton; private BasicArrowButton rightArrowButton; - private List buttonList = new ArrayList(); + private List buttonList = new ArrayList<>(); private int pathIndex = 0; private int maxPathIndex = 0; @@ -1198,7 +1193,6 @@ public class FILEChooserPane extends BasicPane { if (dir == null) { return; } - String path = dir.getPath(); isWebAppNamePath = ComparatorUtils.equals(dir.prefix(), FILEFactory.WEBREPORT_PREFIX); // 确保最后一个字符是分隔符 @@ -1209,9 +1203,7 @@ public class FILEChooserPane extends BasicPane { if (StringUtils.isBlank(path) && isWebAppNamePath) { this.buttonList.add(createBlankButton(new SetDirectoryAction(webAppName + '/'))); } - - Pattern seperatorPattern = Pattern.compile("[/\\\\]+"); // alex:之所以在Pattern那里加个+,是因为有些路径会有两个甚至多个分隔符放在一起 - Matcher matcher = seperatorPattern.matcher(path); + Matcher matcher = SEPARATOR_PATTERN.matcher(path); int node_start = 0; while (matcher.find()) { int start = matcher.start(); @@ -1223,7 +1215,7 @@ public class FILEChooserPane extends BasicPane { this.buttonList.add(createBlankButton((new SetDirectoryAction(btn_text + '/', // alex:dir.prefix不和btn_path一起参与pathJoin,因为btn_path是否以/打头在unix,linux // OS中意义很不一样 - FILEFactory.createFolder(dir.prefix() + StableUtils.pathJoin(new String[]{btn_path, "/"})))))); + FILEFactory.createFolder(dir.prefix() + StableUtils.pathJoin(btn_path, "/")))))); node_start = matcher.end(); } maxPathIndex = calculateMaxPathIndex(); @@ -1350,40 +1342,44 @@ public class FILEChooserPane extends BasicPane { private UIButton createBlankButton(SetDirectoryAction setDirectoryAction) { + + final Color brighter = this.getBackground().brighter(); + final Color darker = this.getBackground().darker(); + final UIButton blankButton = new UIButton(setDirectoryAction); blankButton.setMargin(new Insets(0, 0, 0, 0)); blankButton.setUI(new BasicButtonUI()); blankButton.setHorizontalTextPosition(SwingConstants.CENTER); blankButton.setBorderPainted(false); blankButton.setBorder(BorderFactory.createRaisedBevelBorder()); - blankButton.setBackground(FILEChooserPane.this.getBackground().darker()); + blankButton.setBackground(darker); blankButton.addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { - blankButton.setBackground(FILEChooserPane.this.getBackground().brighter()); + blankButton.setBackground(brighter); blankButton.setBorderPainted(true); - repaint(); + blankButton.repaint(); } @Override public void mouseExited(MouseEvent e) { - blankButton.setBackground(FILEChooserPane.this.getBackground().darker()); + blankButton.setBackground(darker); blankButton.setBorderPainted(false); - repaint(); + blankButton.repaint(); } @Override public void mousePressed(MouseEvent e) { - blankButton.setBackground(FILEChooserPane.this.getBackground().brighter()); + blankButton.setBackground(brighter); blankButton.setBorderPainted(false); - repaint(); + blankButton.repaint(); } @Override public void mouseReleased(MouseEvent e) { - blankButton.setBackground(FILEChooserPane.this.getBackground().brighter()); + blankButton.setBackground(darker); blankButton.setBorderPainted(true); - repaint(); + blankButton.repaint(); } @@ -1391,61 +1387,218 @@ public class FILEChooserPane extends BasicPane { return blankButton; } + /* + * 新建文件夹的Button + */ + private UIButton initMkdirButton() { + UIButton folderButton = new UIButton(); + folderButton.setIcon(BaseUtils.readIcon("com/fr/design/images/icon_NewFolderIcon_normal.png")); + folderButton.setUI(new UIButtonUI()); + folderButton.setToolTipText(Toolkit.i18nText("Fine-Design_Basic_Utils_New_Folder")); + folderButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent evt) { + if (currentDirectory == null) { + return; + } + + if (access(currentDirectory)) { + new MkdirDialog(); + } else { + JOptionPane.showMessageDialog( + FILEChooserPane.this, + Toolkit.i18nText("Fine-Design_Basic_App_Privilege_No") + "!", + Toolkit.i18nText("Fine-Design_Basic_App_File_Message"), + JOptionPane.WARNING_MESSAGE); + } - private ActionListener createFolderActionListener = new ActionListener() { - @Override - public void actionPerformed(ActionEvent evt) { - if (currentDirectory == null) { - return; - } - boolean access = false; - try { - access = FRContext.getOrganizationOperator().canAccess(currentDirectory.getPath()); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (!access) { - JOptionPane.showMessageDialog(FILEChooserPane.this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_Privilege_No") + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_App_File_Message"), JOptionPane.WARNING_MESSAGE); - return; } + }); + return folderButton; + } - String res = JOptionPane.showInputDialog(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Please_Input_A_New_Name")); - if (res != null) { - currentDirectory.createFolder(res); - refreshSubFileListModel(); + /** + * 新建文件夹对话框 + * 支持快捷键Enter,ESC + */ + private class MkdirDialog extends JDialog { - setSelectedFileName(res); - // ben:这里处理有些不妥,取文件时没有考虑filefilter,不过效果一样,取的时候应该用subfilelist得data - FILE[] allFiles = currentDirectory.listFiles(); - int place = 0; - for (int i = 0; i < allFiles.length; i++) { - if (ComparatorUtils.equals(allFiles[i].getName(), res) && allFiles[i].isDirectory()) { - place = i; - break; + private UITextField nameField; + + private UILabel warnLabel; + + private UIButton confirmButton; + + + private MkdirDialog() { + + this.setLayout(new BorderLayout()); + this.setModal(true); + + // 输入框前提示 + UILabel newNameLabel = new UILabel(Toolkit.i18nText( + "Fine-Design_Basic_Enter_New_Folder_Name") + ); + newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); + newNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); + newNameLabel.setPreferredSize(new Dimension(118, 15)); + + // 文件名输入框 + nameField = new UITextField(); + nameField.getDocument().addDocumentListener(new DocumentListener() { + + public void changedUpdate(DocumentEvent e) { + validInput(); + } + + public void insertUpdate(DocumentEvent e) { + validInput(); + } + + public void removeUpdate(DocumentEvent e) { + validInput(); + } + }); + nameField.selectAll(); + nameField.setPreferredSize(new Dimension(180, 20)); + + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); + topPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15)); + topPanel.add(newNameLabel); + topPanel.add(nameField); + + // 增加enter以及esc快捷键的支持 + nameField.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + dispose(); + } else if (e.getKeyCode() == KeyEvent.VK_ENTER) { + if (confirmButton.isEnabled()) { + confirmClose(); + } } } - scrollPane.validate(); - int total = scrollPane.getVerticalScrollBar().getMaximum(); - int value = total * place / subFileList.getModel().getSize(); - scrollPane.getVerticalScrollBar().setValue(value); + }); + // 重名提示 + warnLabel = new UILabel(); + warnLabel.setPreferredSize(new Dimension(300, 30)); + warnLabel.setHorizontalAlignment(SwingConstants.LEFT); + warnLabel.setForeground(Color.RED); + warnLabel.setVisible(false); + + JPanel midPanel = new JPanel(new BorderLayout()); + midPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + midPanel.add(warnLabel, BorderLayout.WEST); + + // 确认按钮 + confirmButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Confirm")); + confirmButton.setPreferredSize(new Dimension(60, 25)); + confirmButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + confirmClose(); + } + }); + + // 取消按钮 + UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); + cancelButton.setPreferredSize(new Dimension(60, 25)); + + cancelButton.addActionListener(new ActionListener() { + + public void actionPerformed(ActionEvent e) { + dispose(); + } + }); + + JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); + bottomPanel.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 15)); + bottomPanel.add(confirmButton); + bottomPanel.add(cancelButton); + + this.add( + TableLayoutHelper.createTableLayoutPane( + new Component[][]{ + new Component[]{topPanel}, + new Component[]{midPanel}, + new Component[]{bottomPanel} + }, + new double[]{TableLayout.FILL, TableLayout.FILL, TableLayout.FILL}, + new double[]{TableLayout.FILL} + ), + BorderLayout.CENTER); + + + this.setSize(340, 180); + this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir")); + this.setResizable(false); + this.setAlwaysOnTop(true); + this.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); + this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + GUICoreUtils.centerWindow(this); + this.setVisible(true); + } + + private void confirmClose() { + + String userInput = nameField.getText().trim(); + + currentDirectory.createFolder(userInput); + + refreshSubFileListModel(); + + setSelectedFileName(userInput); + // ben:这里处理有些不妥,取文件时没有考虑filefilter,不过效果一样,取的时候应该用subfilelist得data + FILE[] allFiles = currentDirectory.listFiles(); + int place = 0; + for (int i = 0; i < allFiles.length; i++) { + if (ComparatorUtils.equals(allFiles[i].getName(), userInput) && allFiles[i].isDirectory()) { + place = i; + break; + } } + scrollPane.revalidate(); + scrollPane.repaint(); + int total = scrollPane.getVerticalScrollBar().getMaximum(); + int value = total * place / subFileList.getModel().getSize(); + scrollPane.getVerticalScrollBar().setValue(value); + this.dispose(); } - }; - /* - * 新建文件夹的Button - */ - private UIButton createFolderButton() { - UIButton folderButton = new UIButton(); - folderButton.setIcon(BaseUtils.readIcon("/com/fr/design/images/file/newfolder.png")); - folderButton.setEnabled(false); - folderButton.setMargin(new Insets(0, 0, 0, 0)); - folderButton.setUI(new BasicButtonUI()); - folderButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_New_Folder")); - folderButton.addActionListener(createFolderActionListener); - return folderButton; + private void validInput() { + + String userInput = nameField.getText().trim(); + + if (StringUtils.isEmpty(userInput)) { + confirmButton.setEnabled(false); + } + + boolean duplicate = false; + // ben:这里处理有些不妥,取文件时没有考虑filefilter,不过效果一样,取的时候应该用subfilelist得data + FILE[] allFiles = currentDirectory.listFiles(); + for (int i = 0; i < allFiles.length; i++) { + if (ComparatorUtils.equals(allFiles[i].getName(), userInput) && allFiles[i].isDirectory()) { + duplicate = true; + break; + } + } + + if (duplicate) { + nameField.selectAll(); + // 如果文件名已存在,则灰掉确认按钮 + warnLabel.setText( + Toolkit.i18nText( + "Fine-Design_Basic_Folder_Name_Duplicate", + userInput)); + warnLabel.setVisible(true); + confirmButton.setEnabled(false); + } else { + warnLabel.setVisible(false); + confirmButton.setEnabled(true); + } + } } } diff --git a/designer-base/src/main/java/com/fr/file/FILEFactory.java b/designer-base/src/main/java/com/fr/file/FILEFactory.java index f5d690b21..5a19108ee 100644 --- a/designer-base/src/main/java/com/fr/file/FILEFactory.java +++ b/designer-base/src/main/java/com/fr/file/FILEFactory.java @@ -1,6 +1,7 @@ package com.fr.file; import com.fr.base.FRContext; +import com.fr.design.file.NodeAuthProcessor; import com.fr.file.filetree.FileNode; import com.fr.workspace.WorkContext; @@ -19,7 +20,7 @@ public class FILEFactory { * 也有可能就是一个普通的路径d:/foo/bar */ public static FILE createFILE(String path) { - + String envPath = WorkContext.getCurrent().getPath().replaceAll("/", "\\\\"); if (path == null) { return null; @@ -45,7 +46,8 @@ public class FILEFactory { } else if (path.startsWith(MEM_PREFIX)) { return new MemFILE(path.substring(MEM_PREFIX.length())); } else if (path.startsWith(ENV_PREFIX)) { - return new FileNodeFILE(new FileNode(path.substring(ENV_PREFIX.length()), true)); + return NodeAuthProcessor.getInstance(). + fixFILENodeAuth(new FileNode(path.substring(ENV_PREFIX.length()), true)); } else if (path.startsWith(WEBREPORT_PREFIX)) { return new FileNodeFILE(new FileNode(path.substring(WEBREPORT_PREFIX.length()), true), FRContext.getCommonOperator().getWebRootPath()); diff --git a/designer-base/src/main/java/com/fr/file/FileFILE.java b/designer-base/src/main/java/com/fr/file/FileFILE.java index 5242495be..b9c4f7bb0 100644 --- a/designer-base/src/main/java/com/fr/file/FileFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileFILE.java @@ -4,11 +4,11 @@ import com.fr.base.io.XMLEncryptUtils; import com.fr.design.gui.itree.filetree.FileComparator; import com.fr.design.gui.itree.filetree.FileTreeIcon; import com.fr.general.ComparatorUtils; -import com.fr.web.session.SessionLocalManager; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.web.session.SessionLocalManager; -import javax.swing.*; +import javax.swing.Icon; import javax.swing.filechooser.FileSystemView; import java.io.File; import java.io.FileOutputStream; @@ -16,6 +16,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; public class FileFILE implements FILE { @@ -30,9 +32,9 @@ public class FileFILE implements FILE { } /** - * 后缀 + * 前缀 * - * @return 后缀 + * @return 前缀 */ public String prefix() { return FILEFactory.FILE_PREFIX; @@ -44,7 +46,7 @@ public class FileFILE implements FILE { * @returns 是则返回true */ public boolean isDirectory() { - return file == null ? false : file.isDirectory(); + return file != null && file.isDirectory(); } @Override @@ -118,22 +120,22 @@ public class FileFILE implements FILE { return new FILE[]{this}; } - File[] file_array = file.listFiles(); - if (file_array == null) { + File[] fileArray = file.listFiles(); + if (fileArray == null) { return new FILE[0]; } - java.util.Arrays.sort(file_array, new FileComparator()); + Arrays.sort(fileArray, new FileComparator()); - java.util.List res_list = new ArrayList(file_array.length); + List resList = new ArrayList(fileArray.length); - for (int i = 0; i < file_array.length; i++) { + for (int i = 0; i < fileArray.length; i++) { // 因为有一些系统文件,比如虚拟内存等,会在listFiles的时候出现,但却not exists - if (file_array[i].exists()) { - res_list.add(new FileFILE(file_array[i])); + if (fileArray[i].exists()) { + resList.add(new FileFILE(fileArray[i])); } } - return res_list.toArray(new FILE[res_list.size()]); + return resList.toArray(new FILE[resList.size()]); } /** @@ -147,9 +149,7 @@ public class FileFILE implements FILE { return false; } - File new_file = new File(StableUtils.pathJoin(new String[]{ - file.getAbsolutePath(), name - })); + File new_file = new File(StableUtils.pathJoin(file.getAbsolutePath(), name)); if (new_file.exists()) { return false; @@ -164,7 +164,7 @@ public class FileFILE implements FILE { * @return 是否存在 */ public boolean exists() { - return file == null ? false : file.exists(); + return file != null && file.exists(); } /** @@ -192,13 +192,12 @@ public class FileFILE implements FILE { * 作为输出流 * * @return 输出流 - * @throws Exception 异常 */ - public OutputStream asOutputStream() throws Exception { + public OutputStream asOutputStream() { if (file == null || !file.exists()) { return null; } - java.io.OutputStream out = null; + OutputStream out; try { out = new FileOutputStream(file); } catch (Exception e) { @@ -209,10 +208,8 @@ public class FileFILE implements FILE { /** * 关闭文件 - * - * @throws Exception 异常 */ - public void closeTemplate() throws Exception { + public void closeTemplate() { } @Override @@ -225,10 +222,10 @@ public class FileFILE implements FILE { } /** - * 返回hash码 - * - * @return 返回hash码 - */ + * 返回hash码 + * + * @return 返回hash码 + */ public int hashCode() { int hash = 7; hash = 97 * hash + (this.file != null ? this.file.hashCode() : 0); @@ -251,17 +248,19 @@ public class FileFILE implements FILE { } /** - * 是否是内存文件 - * @return 是则返回true - */ + * 是否是内存文件 + * + * @return 是则返回true + */ public boolean isMemFile() { return false; } /** - * 是否是环境文件 - * @return 是则返回true - */ + * 是否是环境文件 + * + * @return 是则返回true + */ public boolean isEnvFile() { return false; } diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index f64f961cb..04016c503 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -3,32 +3,39 @@ package com.fr.file; import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.io.XMLEncryptUtils; +import com.fr.design.file.NodeAuthProcessor; import com.fr.design.gui.itree.filetree.FileNodeComparator; import com.fr.design.gui.itree.filetree.FileTreeIcon; +import com.fr.design.i18n.Toolkit; import com.fr.file.filetree.FileNode; import com.fr.general.ComparatorUtils; - -import com.fr.workspace.resource.WorkResourceOutputStream; import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.resource.WorkResourceOutputStream; -import javax.swing.*; +import javax.swing.Icon; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.Arrays; public class FileNodeFILE implements FILE { - + private FileNode node; - - // carl:记录下FILE对应的运行环境,每次创建都设置下当前的运行环境 + + //记录下FILE对应的运行环境,每次创建都设置下当前的运行环境 private String envPath; - + + /** + * 是否有全部权限 + */ + private boolean hasFullAuth = true; + public FileNodeFILE(FileNodeFILE parent, String name, boolean isDir) { - + FileNode fn = parent.node; String parentDir; if (fn.isDirectory()) { @@ -36,156 +43,187 @@ public class FileNodeFILE implements FILE { } else { parentDir = fn.getParent(); } - + this.node = new FileNode(StableUtils.pathJoin(parentDir, name), isDir); this.envPath = WorkContext.getCurrent().getPath(); + this.hasFullAuth = NodeAuthProcessor.getInstance().fixFileNodeAuth(node); } - + + public FileNodeFILE(FileNode node) { - this.node = node; this.envPath = WorkContext.getCurrent().getPath(); + this.hasFullAuth = NodeAuthProcessor.getInstance().fixFileNodeAuth(node); + } + + public FileNodeFILE(FileNode node, boolean hasFullAuth) { + this(node); + this.hasFullAuth = hasFullAuth; } - + public FileNodeFILE(String envPath) { - this.node = null; this.envPath = envPath; } - + public FileNodeFILE(FileNode node, String envPath) { - this.node = node; this.envPath = envPath; + this.hasFullAuth = NodeAuthProcessor.getInstance().fixFileNodeAuth(node); + } + + public FileNodeFILE(FileNode node, String envPath, boolean hasFullAuth) { + this(node, envPath); + this.hasFullAuth = hasFullAuth; + } + + + /** + * @return 是否有完整权限 + */ + public boolean hasFullAuth() { + return hasFullAuth; } - + /** - * prefix 后缀 + * 前缀 * - * @return 返回后缀 + * @return 前缀 */ + @Override public String prefix() { - + if (ComparatorUtils.equals(getEnvPath(), FRContext.getCommonOperator().getWebRootPath())) { return FILEFactory.WEBREPORT_PREFIX; } return FILEFactory.ENV_PREFIX; } - + /** * @return */ public String getEnvPath() { - + return this.envPath; } - + /** * 是否是目录 * * @return 是则返回true */ + @Override public boolean isDirectory() { - - return ComparatorUtils.equals(node, null) ? true : node.isDirectory(); + + return ComparatorUtils.equals(node, null) || node.isDirectory(); } - + /** * @return */ + @Override public String getName() { - + if (node == null) { return null; } - + if (ComparatorUtils.equals(node.getEnvPath(), ProjectConstants.REPORTLETS_NAME)) { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Report_Runtime_Env"); + return Toolkit.i18nText("Fine-Design_Basic_Utils_Report_Runtime_Env"); } else { return node.getName(); } } - + /** * @return */ + @Override public Icon getIcon() { - + if (node == null) { return null; } - + if (ComparatorUtils.equals(node.getEnvPath(), ProjectConstants.REPORTLETS_NAME)) { return BaseUtils.readIcon("/com/fr/base/images/oem/logo.png"); } else { + + if (!hasFullAuth) { + return FileTreeIcon.getFolderHalfImageIcon(); + } + return FileTreeIcon.getIcon(node); } } - + /** * @return */ + @Override public String getPath() { - + if (node == null) { return ""; } - + return node.getEnvPath(); } - + /** * @param path */ + @Override public void setPath(String path) { - + node.setEnvPath(path); } - + /** * @return */ + @Override public FILE getParent() { - + if (node == null) { return null; } - + return new FileNodeFILE(new FileNode(node.getParent(), true)); } - + /** * 文件 * * @return 文件组 */ + @Override public FILE[] listFiles() { - + if (ComparatorUtils.equals(node, null)) { node = new FileNode(CoreConstants.SEPARATOR, true); - //return new FILE[0]; } if (!node.isDirectory()) { return new FILE[]{this}; } - + try { - FileNode[] node_array; - node_array = listFile(node.getEnvPath()); - java.util.Arrays.sort(node_array, new FileNodeComparator()); - - FILE[] res_array = new FILE[node_array.length]; - for (int i = 0; i < node_array.length; i++) { - res_array[i] = new FileNodeFILE(node_array[i], envPath); - } - - return res_array; + FileNode[] nodeArray; + nodeArray = listFile(node.getEnvPath()); + Arrays.sort(nodeArray, new FileNodeComparator()); + + return fileNodeArray2FILEArray(nodeArray, envPath); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return new FILE[0]; } } - + + private FILE[] fileNodeArray2FILEArray(FileNode[] nodeArray, String envPath) { + return NodeAuthProcessor.getInstance().parser2FILEArray(nodeArray, envPath); + } + + /** * 根目录文件地址 * @@ -193,7 +231,7 @@ public class FileNodeFILE implements FILE { * @return 返回文件节点 */ private FileNode[] listFile(String rootFilePath) { - + try { if (ComparatorUtils.equals(envPath, FRContext.getCommonOperator().getWebRootPath())) { return FRContext.getFileNodes().listWebRootFile(rootFilePath); @@ -205,19 +243,20 @@ public class FileNodeFILE implements FILE { } return new FileNode[0]; } - + /** * 创建文件夹 * * @param name 文件夹名字 * @return 创建成功返回true */ + @Override public boolean createFolder(String name) { - + if (ComparatorUtils.equals(node, null) || !node.isDirectory()) { return false; } - + try { return WorkContext.getWorkResource().createDirectory(StableUtils.pathJoin(node.getEnvPath(), name)); } catch (Exception e) { @@ -225,18 +264,18 @@ public class FileNodeFILE implements FILE { return false; } } - + /** * 是否锁住 * * @return 文件被锁返回true */ public boolean isLocked() { - + if (node == null) { return false; } - + try { return FRContext.getCommonOperator().fileLocked(node.getEnvPath()); } catch (Exception e) { @@ -244,14 +283,15 @@ public class FileNodeFILE implements FILE { return false; } } - + /** * 是否存在 * * @return 文件存在返回 true */ + @Override public boolean exists() { - + if (node == null) { return false; } @@ -259,7 +299,7 @@ public class FileNodeFILE implements FILE { if (!isCurrentEnv()) { return false; } - + try { return WorkContext.getWorkResource().exist(node.getEnvPath()); } catch (Exception e) { @@ -267,28 +307,29 @@ public class FileNodeFILE implements FILE { return false; } } - + /** * 是否是当前环境 * * @return 是报表当前环境返回true */ public boolean isCurrentEnv() { - + return ComparatorUtils.equals(WorkContext.getCurrent().getPath(), envPath); } - + /** * 创建文件 * * @return 成功返回true */ + @Override public boolean mkfile() { - + if (node == null) { return false; } - + try { return WorkContext.getWorkResource().createFile(node.getEnvPath()); } catch (Exception e) { @@ -296,43 +337,45 @@ public class FileNodeFILE implements FILE { return false; } } - + /** * 作为输入流 * * @return 输入流 * @throws Exception */ + @Override public InputStream asInputStream() throws Exception { - + if (node == null) { return null; } - + String envPath = node.getEnvPath(); // envPath必须以reportlets开头 if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - + InputStream in = new ByteArrayInputStream(WorkContext.getWorkResource().readFully(StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)))); - + return envPath.endsWith(".cpt") || envPath.endsWith(".frm") - ? XMLEncryptUtils.decodeInputStream(in) : in; + ? XMLEncryptUtils.decodeInputStream(in) : in; } - + /** * 作为输出流 * * @return 返回输出流 * @throws Exception */ + @Override public OutputStream asOutputStream() throws Exception { - + if (ComparatorUtils.equals(node, null)) { return null; } - + String envPath = node.getEnvPath(); // envPath必须以reportlets开头 if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { @@ -340,58 +383,62 @@ public class FileNodeFILE implements FILE { } return new WorkResourceOutputStream(envPath); } - + /** * 关闭模板 * * @throws Exception */ + @Override public void closeTemplate() throws Exception { - + if (node == null) { return; } - + String envPath = node.getEnvPath(); // envPath必须以reportlets开头 if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return; } - + FRContext.getCommonOperator().unlockTemplate( - envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)); + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)); } - + /** * 得到环境的全名 * * @return */ + @Override public String getEnvFullName() { - + return this.node.getEnvPath().substring(ProjectConstants.REPORTLETS_NAME.length() + 1); } - + /** * 是否是内存文件 * * @return 是则返回true */ + @Override public boolean isMemFile() { - + return false; } - + /** * 是否是环境文件 * * @return 是则返回true */ + @Override public boolean isEnvFile() { - + return true; } - + /** * 是佛相同 * @@ -399,34 +446,34 @@ public class FileNodeFILE implements FILE { * @return */ public boolean equals(Object obj) { - + if (!(obj instanceof FileNodeFILE)) { return false; } - + return ComparatorUtils.equals(this.envPath, ((FileNodeFILE) obj).envPath) && ComparatorUtils.equals(this.node, ((FileNodeFILE) obj).node); } - + /** * 返回hash码 * * @return 返回hash码 */ public int hashCode() { - + int hash = 5; hash = 61 * hash + (this.node != null ? this.node.hashCode() : 0); hash = 61 * hash + (this.envPath != null ? this.envPath.hashCode() : 0); return hash; } - + /** * 作为字符串返回 * * @return String 字符串 */ public String toString() { - + return prefix() + (this.node != null ? this.node.getEnvPath() : ""); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/file/MemFILE.java b/designer-base/src/main/java/com/fr/file/MemFILE.java index fa76ab047..f35151eb9 100644 --- a/designer-base/src/main/java/com/fr/file/MemFILE.java +++ b/designer-base/src/main/java/com/fr/file/MemFILE.java @@ -1,10 +1,9 @@ package com.fr.file; +import javax.swing.Icon; import java.io.InputStream; import java.io.OutputStream; -import javax.swing.Icon; - public class MemFILE implements FILE { private String name; @@ -103,9 +102,9 @@ public class MemFILE implements FILE { } /** - * 后缀 + * 前缀 * - * @return 后缀 + * @return 前缀 */ public String prefix() { return FILEFactory.MEM_PREFIX; diff --git a/designer-base/src/main/resources/com/fr/design/images/icon_NewFolderIcon_normal.png b/designer-base/src/main/resources/com/fr/design/images/icon_NewFolderIcon_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea75fc6d857fef4e30a72519a4afd56ac7d0759 GIT binary patch literal 288 zcmV+*0pI?KP)Px#+DSw~R5%gEQZWv~Fbs4MVnN~&NHDM_p?`o*d;oU-!9REbQ$B&n3KD#!jd9YZ zL{^Iw7P8d7JD;680RKK>Xn>+9W_9gOhd_UWW_n3Ypv)08z%4pKh|E)B%07QE@ZUiymM#>D+As)0WaWr ztQm14H_tYZQa{rs*#@+cg*TuTh9~fYLE8Vz7E)O=cGKD8@dwfyc?I1ENXz Date: Tue, 28 Aug 2018 16:21:23 +0800 Subject: [PATCH 22/77] =?UTF-8?q?REPORT-10689=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=96=B0=E5=BB=BA=E5=88=A0=E9=99=A4=E5=92=8C?= =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/poly/PolyDesigner.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/poly/PolyDesigner.java b/designer-realize/src/main/java/com/fr/poly/PolyDesigner.java index 2307765e3..4d61d7b5f 100644 --- a/designer-realize/src/main/java/com/fr/poly/PolyDesigner.java +++ b/designer-realize/src/main/java/com/fr/poly/PolyDesigner.java @@ -546,7 +546,6 @@ public class PolyDesigner extends ReportComponent Date: Tue, 28 Aug 2018 18:42:54 +0800 Subject: [PATCH 23/77] =?UTF-8?q?REPORT-10704=20&=20REPORT-10864=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=BC=A9=E6=94=BE=E6=89=93=E5=8D=B0=3D>?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=83=A8=E5=88=86=EF=BC=9B=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E6=89=93=E5=8D=B0=E8=AE=BE=E7=BD=AE=E7=9A=84=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=9C=BA=E5=88=97=E8=A1=A8=E4=B8=AD=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E2=80=9C=E6=97=A0=E2=80=9D=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../printsettings/NativePrintSettingPane.java | 34 ++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java index dbdf2ff6f..ef73c7152 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java @@ -10,6 +10,7 @@ import com.fr.design.gui.icombobox.UIComboBoxRenderer; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UIBasicSpinner; +import com.fr.design.gui.itextfield.UINumberField; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; @@ -57,6 +58,7 @@ public class NativePrintSettingPane extends JPanel { private UICheckBox inheritPageLayoutSettingCheck; private UICheckBox inheritPageMarginSettingCheck; private UICheckBox fitPaperSizeCheck; // 缩放 + private UINumberField scalePercentField; // 缩放百分比 private UIRadioButton portraitRadioButton; private UIRadioButton landscapeRadioButton; private PageMarginSettingPane pageMarginSettingPane; @@ -174,10 +176,13 @@ public class NativePrintSettingPane extends JPanel { // 缩放 fitPaperSizeCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_To_Fit_Paper_Size")); + JPanel scalePane = getScalePane(); + scalePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); + JPanel scaleCheckPane = GUICoreUtils.createCheckboxAndDynamicPane(fitPaperSizeCheck, scalePane, true); // TableLayout double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p, p, p, p}; + double[] rowSize = {p, p, p, p, p, p, p}; double[] columnSize = {60, p}; Component[][] components = { {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Printer") + ":"), printerPane}, @@ -185,9 +190,8 @@ public class NativePrintSettingPane extends JPanel { {printAreaLabelPane, getPrintAreaPane()}, {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Paper") + ":"), paperSettingCheckPane}, {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Layout") + ":"), layoutSettingCheckPane}, - {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane} - // 此功能暂时不做,在界面上隐藏缩放选项 -// {new UILabel(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Scale_EnlargeOrReduce") + ":"), fitPaperSizeCheck}, + {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Margin") + ":"), pageMarginCheckPane}, + {getTopAlignLabelPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Scale_EnlargeOrReduce") + ":"), scaleCheckPane}, }; return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); } @@ -197,6 +201,8 @@ public class NativePrintSettingPane extends JPanel { DocFlavor.INPUT_STREAM.AUTOSENSE, null); Set allPrinterName = new HashSet(); + allPrinterName.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_None")); + for (int i = 0, len = printServices.length; i < len; i++) { allPrinterName.add(printServices[i].getName()); } @@ -296,6 +302,24 @@ public class NativePrintSettingPane extends JPanel { return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); } + private JPanel getScalePane() { + scalePercentField = new UINumberField(5); + scalePercentField.setMaxIntegerLength(3); + scalePercentField.setMaxDecimalLength(0); + scalePercentField.setMaxValue(200); + + UILabel percent = new UILabel("%"); + + // TableLayout + double p = TableLayout.PREFERRED; + double[] rowSize = {p}; + double[] columnSize = {p, p}; + Component[][] components = { + {scalePercentField, percent} + }; + return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); + } + // 返回包含一个标签的 panel,标签始终位于 panel 顶部 private JPanel getTopAlignLabelPane(String labelText) { JPanel labelPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); @@ -329,6 +353,7 @@ public class NativePrintSettingPane extends JPanel { inheritPageMarginSettingCheck.setSelected(nativePrintAttr.isInheritPageMarginSetting()); pageMarginSettingPane.populate(nativePrintAttr.getMargin()); fitPaperSizeCheck.setSelected(nativePrintAttr.isFitPaperSize()); + scalePercentField.setValue(nativePrintAttr.getScalePercent()); } public void update(NativePrintAttr nativePrintAttr) { @@ -356,6 +381,7 @@ public class NativePrintSettingPane extends JPanel { nativePrintAttr.setInheritPageMarginSetting(inheritPageMarginSettingCheck.isSelected()); nativePrintAttr.setMargin(pageMarginSettingPane.updateBean()); nativePrintAttr.setFitPaperSize(fitPaperSizeCheck.isSelected()); + nativePrintAttr.setScalePercent((int)scalePercentField.getValue()); } // 刷新面板可用状态 From 2679af4e3c1f96d511fc00ea88b9c32aa1611766 Mon Sep 17 00:00:00 2001 From: plough Date: Thu, 30 Aug 2018 17:06:49 +0800 Subject: [PATCH 24/77] =?UTF-8?q?REPORT-10703=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8F=8C=E9=9D=A2=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../printsettings/NativePrintSettingPane.java | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java index ef73c7152..92a86cdf7 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java @@ -20,6 +20,7 @@ import com.fr.general.ComparatorUtils; import com.fr.report.stable.ReportConstants; import com.fr.stable.StringUtils; +import com.sun.deploy.panel.JavaPanel; import javax.print.DocFlavor; import javax.print.PrintService; @@ -46,12 +47,17 @@ import java.util.regex.Pattern; * Created by plough on 2018/3/5. */ public class NativePrintSettingPane extends JPanel { + private static final int ODD_INDEX = 0; + private static final int EVEN_INDEX = 1; + private UICheckBox isShowDialogCheck; private UIComboBox printerComboBox; private UIBasicSpinner copySpinner; // 份数 private UIRadioButton allPageRadioButton; private UIRadioButton currentPageRadioButton; private UIRadioButton customPageRadioButton; + private UIRadioButton doublePrintRadioButton; + private UIComboBox doublePrintComboBox; private UITextField specifiedAreaField; private UIComboBox predefinedPaperSizeComboBox; private UICheckBox inheritPagePaperSettingCheck; @@ -102,6 +108,7 @@ public class NativePrintSettingPane extends JPanel { allPageRadioButton.addItemListener(getPageRaidoListener()); currentPageRadioButton.addItemListener(getPageRaidoListener()); customPageRadioButton.addItemListener(getPageRaidoListener()); + doublePrintRadioButton.addItemListener(getPageRaidoListener()); isShowDialogCheck.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { @@ -134,6 +141,7 @@ public class NativePrintSettingPane extends JPanel { @Override public void itemStateChanged(ItemEvent e) { specifiedAreaField.setEnabled(customPageRadioButton.isSelected()); + doublePrintComboBox.setEnabled(doublePrintRadioButton.isSelected()); } }; } @@ -272,10 +280,12 @@ public class NativePrintSettingPane extends JPanel { allPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_All_Pages")); currentPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Current_Page")); customPageRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_HJS-Specified_Pages")); + doublePrintRadioButton = new UIRadioButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Double_Side_Print")); ButtonGroup group = new ButtonGroup(); group.add(allPageRadioButton); group.add(currentPageRadioButton); group.add(customPageRadioButton); + group.add(doublePrintRadioButton); allPageRadioButton.setSelected(true); specifiedAreaField = new UITextField(20) { @@ -290,14 +300,28 @@ public class NativePrintSettingPane extends JPanel { }; UILabel areaFieldTip = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Print_Area_Tip")); + doublePrintComboBox = new UIComboBox() { + @Override + public void setEnabled(boolean enabled) { + // 如果未选中"双面打印",此下拉框始终不可用 + if (enabled && !doublePrintRadioButton.isSelected()) { + return; + } + super.setEnabled(enabled); + } + }; + doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Odd_Page")); + doublePrintComboBox.addItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_HF_Even_Page")); + // TableLayout double p = TableLayout.PREFERRED; - double[] rowSize = {p, p, p}; + double[] rowSize = {p, p, p, p}; double[] columnSize = {p, p, p}; Component[][] components = { {allPageRadioButton, null, null}, {currentPageRadioButton, null, null}, - {customPageRadioButton, specifiedAreaField, areaFieldTip} + {customPageRadioButton, specifiedAreaField, areaFieldTip}, + {doublePrintRadioButton, doublePrintComboBox, new JPanel()} }; return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 0); } @@ -336,11 +360,19 @@ public class NativePrintSettingPane extends JPanel { allPageRadioButton.setSelected(true); } else if (nativePrintAttr.getPageType().equals(NativePrintAttr.PageType.CURRENT_PAGE)) { currentPageRadioButton.setSelected(true); - } else { + } else if (nativePrintAttr.getPageType().equals(NativePrintAttr.PageType.SPECIFIED_PAGES)) { customPageRadioButton.setSelected(true); specifiedAreaField.setText(nativePrintAttr.getArea()); + } else { + doublePrintRadioButton.setSelected(true); + if (nativePrintAttr.getPageType().equals(NativePrintAttr.PageType.ODD_PAGES)) { + doublePrintComboBox.setSelectedIndex(ODD_INDEX); + } else { + doublePrintComboBox.setSelectedIndex(EVEN_INDEX); + } } specifiedAreaField.setEnabled(customPageRadioButton.isSelected()); + doublePrintComboBox.setEnabled(doublePrintRadioButton.isSelected()); inheritPagePaperSettingCheck.setSelected(nativePrintAttr.isInheritPagePaperSetting()); predefinedPaperSizeComboBox.setSelectedItem(nativePrintAttr.getPaperSize()); @@ -368,9 +400,13 @@ public class NativePrintSettingPane extends JPanel { nativePrintAttr.setPageType(NativePrintAttr.PageType.ALL_PAGES); } else if (currentPageRadioButton.isSelected()) { nativePrintAttr.setPageType(NativePrintAttr.PageType.CURRENT_PAGE); - } else { + } else if (customPageRadioButton.isSelected()) { nativePrintAttr.setPageType(NativePrintAttr.PageType.SPECIFIED_PAGES); nativePrintAttr.setArea(specifiedAreaField.getText()); + } else if (doublePrintComboBox.getSelectedIndex() == ODD_INDEX){ + nativePrintAttr.setPageType(NativePrintAttr.PageType.ODD_PAGES); + } else { + nativePrintAttr.setPageType(NativePrintAttr.PageType.EVEN_PAGES); } nativePrintAttr.setInheritPagePaperSetting(inheritPagePaperSettingCheck.isSelected()); From 88499cb09a95f0b1faba53ad35bee8862fc26b59 Mon Sep 17 00:00:00 2001 From: plough Date: Thu, 30 Aug 2018 17:39:59 +0800 Subject: [PATCH 25/77] =?UTF-8?q?REPORT-10703=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8F=8C=E9=9D=A2=E6=89=93=E5=8D=B0=3D>=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/webattr/printsettings/NativePrintSettingPane.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java index 92a86cdf7..59077e69f 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java @@ -17,10 +17,8 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; - import com.fr.report.stable.ReportConstants; import com.fr.stable.StringUtils; -import com.sun.deploy.panel.JavaPanel; import javax.print.DocFlavor; import javax.print.PrintService; From 7a0ae88e97b0514fa7e498d5368f7c877efd3dc7 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Fri, 31 Aug 2018 10:11:53 +0800 Subject: [PATCH 26/77] =?UTF-8?q?REPORT-10592=20=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=BB=86=E7=B2=92=E5=BA=A6,=20=E6=94=B9=E6=88=90=E4=BB=8E?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E5=90=AF=E5=8A=A8DecisionActivator,?= =?UTF-8?q?=20=E5=88=A0=E9=99=A4=E4=B8=80=E4=BA=9B=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E4=BB=A3=E7=A0=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roleAuthority/ReportAndFSManagePane.java | 275 +----------------- .../fr/design/roleAuthority/RoleSourceOP.java | 2 +- .../com/fr/design/roleAuthority/RoleTree.java | 56 ++-- .../roleAuthority/RolesEditedSourceOP.java | 2 +- 4 files changed, 27 insertions(+), 308 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java b/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java index ef8f8276e..a412e0a8a 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/ReportAndFSManagePane.java @@ -36,26 +36,17 @@ import java.util.Enumeration; */ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSourceChange { - private static final int REPORT_PLATEFORM_MANAGE = 0; - private static final int FS_MANAGE = 1; private static final int LEFT_GAP = -125; - private static boolean isSupportFS = false; - private TreePath treePath = null; - private static ReportAndFSManagePane singleton = new ReportAndFSManagePane(); private static RoleTree roleTree; - // carl:我先屏了,现在半拉子,等客户要了再好好做 -// private AddAction addAction = new AddAction(); -// private RemoveAction removeAction = new RemoveAction(); private RefreshAction refreshAction = new RefreshAction(); private UIHeadGroup buttonGroup; private RoleSourceOP op; - protected String[] roleNames = new String[2]; + private String roleNames; public synchronized static ReportAndFSManagePane getInstance() { singleton.op = new RoleSourceOP(); - singleton.op.setDataMode(isSupportFS ? FS_MANAGE : REPORT_PLATEFORM_MANAGE); singleton.setDefaultSelectedRole(); return singleton; @@ -99,29 +90,15 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo } protected void setTabRoleName(String roleName) { - roleNames[getMode()] = roleTree.getSelectedRoleName(); + roleNames = roleTree.getSelectedRoleName(); } }; roleTree.setEnabled(true); roleTree.setEditable(false); -// RoleTreeCellEditor treeCellEditor = new RoleTreeCellEditor(new UITextField()); -// treeCellEditor.addCellEditorListener(treeCellEditor); -// roleTree.setCellEditor(treeCellEditor); roleTree.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { super.mouseClicked(e); roleTree.setEditable(false); -// int row = roleTree.getRowForLocation(e.getX(), e.getY()); -// TreePath path = roleTree.getPathForLocation(e.getX(), e.getY()); -// if (e.getClickCount() == 2 && buttonGroup.getSelectedIndex() == REPORT_PLATEFORM_MANAGE) { -// PrivilegeManagerProvider pm = PrivilegeManager.getProviderInstance(); -// AuthenticationProvider ap = pm.getAuthenticationProvider(); -// if (!(ap instanceof DaoAuthenticationProvider)) { -// roleTree.setEditable(true); -// roleTree.startEditingAtPath(path); -// treePath = path; -// } -// } } }); } @@ -141,7 +118,7 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo ExpandMutableTreeNode node = (ExpandMutableTreeNode) parent.getLastPathComponent(); String selectedRole = null; if (singleton != null) { - selectedRole = roleNames[getMode()]; + selectedRole = roleNames; } if (selectedRole == null) { if (node.getChildCount() <= 0 || node.getFirstChild().getChildCount() <= 0) { @@ -190,13 +167,12 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo public void tabChanged(int index) { roleTree.setEditable(false); if (op != null) { - op.setDataMode(getMode()); //判断是否可编辑 refreshDockingView(); } setDefaultSelectedRole(); if (singleton != null) { - changeAlreadyEditedPaneRole(roleNames[getMode()]); + changeAlreadyEditedPaneRole(roleNames); } } }; @@ -204,37 +180,11 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo buttonGroup.setNeedLeftRightOutLine(false); } - private int getMode(){ - return isSupportFS?FS_MANAGE: REPORT_PLATEFORM_MANAGE; - } - - -// /** -// * 检查看看是否可以增删刷新按钮是都可以编辑,并且检查角色树是不是可以编辑 -// */ -// public void checkToolButtonsEnabled() { -// if (buttonGroup.getSelectedIndex() == REPORT_PLATEFORM_MANAGE) { -// PrivilegeManagerProvider pm = PrivilegeManager.getProviderInstance(); -// AuthenticationProvider ap = pm.getAuthenticationProvider(); -// PrivilegeFilter pf = pm.getPrivilegeFilter(); -// boolean isClickable = !(ap instanceof DaoAuthenticationProvider) -// && pf instanceof AuthorityControlFilter; -// addAction.setEnabled(isClickable); -// removeAction.setEnabled(isClickable); -// } else { -// addAction.setEnabled(false); -// removeAction.setEnabled(false); -// } -// -// } - - /** * 刷新界面 */ public void refreshDockingView() { populate(new RoleSourceOP()); -// this.checkToolButtonsEnabled(); } private void populate(RoleSourceOP op) { @@ -276,85 +226,6 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo } -// private class AddAction extends UpdateAction { -// public AddAction() { -// this.setName(com.fr.design.i18n.Toolkit.i18nText("Add")); -// this.setSmallIcon(BaseUtils.readIcon("/com/fr/base/images/cell/control/add.png")); -// } -// -// @Override -// public void actionPerformed(ActionEvent e) { -// refreshDockingView(); -// -// DefaultTreeModel treeModel = (DefaultTreeModel) roleTree.getModel(); -// ExpandMutableTreeNode root = (ExpandMutableTreeNode) treeModel.getRoot(); -// ExpandMutableTreeNode parentNode = (ExpandMutableTreeNode) root.getChildAt(0); -// String newName = com.fr.design.i18n.Toolkit.i18nText("newNode") + (++newIndex); -// parentNode.add(new ExpandMutableTreeNode(newName)); -// op.addAction(newName); -// roleTree.updateUI(); -// -// try { -// synchronized (AuthorityRoleDAOManager.class) { -// AuthorityControlFilter pf = AuthorityRoleDAOManager.getAuthControlFilter(true); -// -// if (AuthorityRoleDAOManager.getAuthorityAllocation(pf, newName) != null) { -// newName = com.fr.design.i18n.Toolkit.i18nText("newNode") + (++newIndex); -// roleTree.refreshTreeNode(); -// expandTree(roleTree, true); -// } -// -// AuthorityRoleDAOManager.addAuthorityRole(pf, new Authority(newName), new Allocation(), false, true); -// -// AuthorityRoleDAOManager.doEnd(pf); -// } -// } catch (Exception e1) { -// FRContext.getLogger().error(e1.getMessage(), e1); -// } -// } -// } - -// private class RemoveAction extends UpdateAction { -// -// public RemoveAction() { -// this.setName(com.fr.design.i18n.Toolkit.i18nText("Remove")); -// this.setSmallIcon(UIConstants.CLEAR_ICON); -// } -// -// @Override -// public void actionPerformed(ActionEvent e) { -// -// -// NameObject selectedNO = roleTree.getSelectedNameObject(); -// -// if (selectedNO == null) { -// return; -// } -// -// int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Are_You_Sure_To_Remove_The_Selected_Item") + ":" + selectedNO.getName() + "?", -// com.fr.design.i18n.Toolkit.i18nText("Remove"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); -// if (returnVal == JOptionPane.OK_OPTION) { -// op.removeAction(selectedNO.getName()); -// -// try { -// AuthorityControlFilter pf = AuthorityRoleDAOManager.getAuthControlFilter(true); -// -// AuthorityRoleDAOManager.removeAuthorityRole(pf, new Authority(selectedNO.getName()), true); -// AuthorityRoleDAOManager.doEnd(pf); -// } catch (Exception e1) { -// FRContext.getLogger().error(e1.getMessage(), e1); -// } -// -// roleTree.refreshTreeNode(); -// expandTree(roleTree, true); -// roleTree.updateUI(); -// roleTree.requestFocus(); -// roleTree.setSelectionRow(roleTree.getRowCount() - 1); -// } -// } -// } - - /* * 刷新ReportletsTree */ @@ -373,144 +244,6 @@ public class ReportAndFSManagePane extends DockingView implements Prepare4DataSo } } - -// private class RoleTreeCellEditor extends DefaultCellEditor implements TreeCellEditor, CellEditorListener { -// -// private NameObject editingNO; -// private String oldName; -// private String newName; -// private UITextField jTextField; -// -// public RoleTreeCellEditor(final UITextField textField) { -// super(textField); -// this.jTextField = textField; -// this.jTextField.setPreferredSize(new Dimension(DesignerEnvManager.getEnvManager().getLastWestRegionContainerWidth() - 5, this.jTextField.getHeight())); -// } -// -// @Override -// public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { -// editingNO = ReportAndFSManagePane.this.roleTree.getSelectedNameObject(); -// oldName = editingNO.getName(); -// -// delegate.setValue(oldName); -// -// editorComponent.setPreferredSize(new java.awt.Dimension(ReportAndFSManagePane.this.getPreferredSize().width, editorComponent.getPreferredSize().height)); -// -// return editorComponent; -// } -// -// @Override -// -// public boolean isCellEditable(EventObject anEvent) { -// NameObject no = ReportAndFSManagePane.this.roleTree.getSelectedNameObject(); -// return !(no.getName() == com.fr.design.i18n.Toolkit.i18nText("Role")); -// } -// -// @Override -// public Object getCellEditorValue() { -// newName = super.getCellEditorValue().toString(); -// editingNO.setName(newName); -// return editingNO; -// } -// -// -// private boolean checkRoleNameNotEmpty() { -// refreshDockingView(); -// -// String currentText = delegate.getCellEditorValue().toString(); -// boolean isContained = false; -// AuthorityControlFilter pf = AuthorityRoleDAOManager.getAuthControlFilter(false); -// if (pf != null && -// !ComparatorUtils.equals(oldName, currentText)) { -// try { -// Iterator iterator = AuthorityRoleDAOManager.authorityAllocationIterator(pf); -// -// while (iterator.hasNext()) { -// AuthorityAllocation authorityAllocation = (AuthorityAllocation) ((Map.Entry) iterator.next()) -// .getValue(); -// Authority _authority = authorityAllocation.getAuthority(); -// if(ComparatorUtils.equals(_authority.getName(), currentText)){ -// isContained = true; -// break; -// } -// } -// } catch (Exception e) { -// } -// } -// -// if (currentText.isEmpty() || isContained) { -// JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("RoleName_Can_Not_Be_Null") + "!"); -// roleTree.refreshTreeNode(); -// expandTree(roleTree, true); -// delegate.setValue(oldName); -// return false; -// } -// return true; -// } -// -// /* -// * 下面两个方法是CellEditorListener的 -// */ -// @Override -// public void editingCanceled(ChangeEvent e) { -// if (!checkRoleNameNotEmpty()) { -// treePath = null; -// return; -// } -// roleTree.stopEditing(); -// if (treePath == null) { -// return; -// } -// changeValue(); -// roleTree.refreshTreeNode(); -// expandTree(roleTree, true); -// } -// -// @Override -// public void editingStopped(ChangeEvent e) { -// if (!checkRoleNameNotEmpty()) { -// treePath = null; -// return; -// } -// changeValue(); -// roleTree.refreshTreeNode(); -// expandTree(roleTree, true); -// roleTree.updateUI(); -// } -// -// private void changeValue() { -// newName = delegate.getCellEditorValue().toString(); -// if (!newName.isEmpty() && newName != oldName) { -// roleTree.setSelectedRoleName(newName); -// op.rename(oldName, newName); -// -// AuthorityControlFilter pf = AuthorityRoleDAOManager.getAuthControlFilter(false); -// if (pf != null) { -// try { -// Iterator iterator = AuthorityRoleDAOManager.authorityAllocationIterator(pf); -// -// while (iterator.hasNext()) { -// AuthorityAllocation authorityAllocation = (AuthorityAllocation) ((Map.Entry) iterator.next()) -// .getValue(); -// Authority _authority = authorityAllocation.getAuthority(); -// if (ComparatorUtils.equals(_authority.getName(), oldName)) { -// _authority.setName(newName); -// } -// } -// } catch (Exception e) { -// } -// } -// -// try { -// AuthorityRoleDAOManager.doEnd(pf); -// } catch (Exception e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// } -// } -// } - - /** * 展开树 * @param tree 树 diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java index 1b90df3df..99c3118d8 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java @@ -1 +1 @@ -package com.fr.design.roleAuthority; import com.fr.general.NameObject; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectOP; import java.util.*; /** * Author : daisy * Date: 13-8-30 * Time: 下午3:36 */ public class RoleSourceOP implements UserObjectOP { private static final int REPORT_PLATEFORM_MANAGE = 0; private static final int FS_MANAGE = 1; public static int manageMode = -1; public RoleSourceOP() { super(); } public List> init() { //用于存放角色 List> allRoles = new ArrayList>(); Map report_roles = new LinkedHashMap(); Map FS_roles = new LinkedHashMap(); addReportRoles(report_roles); addFSRoles(FS_roles); allRoles.add(report_roles); allRoles.add(FS_roles); return allRoles; } /** * 获取报表平台的角色 */ protected void addReportRoles(Map report_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager")); report_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Role"), tdw); } /** * 获取数据决策系统的角色 */ protected void addFSRoles(Map FS_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Name_Duplicate")); FS_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Role"), tdw); } public boolean interceptButtonEnabled() { return true; } /** * 移除名字是name的角色 * * @param name */ public void removeAction(String name) { //删除对应模式下的角色 switch (manageMode) { case REPORT_PLATEFORM_MANAGE: //删除报表平台的角色 break; case FS_MANAGE: //删除数据决策系统的角色 break; } } public void addAction(String name) { switch (manageMode) { case REPORT_PLATEFORM_MANAGE: //增加报表平台的角色 break; case FS_MANAGE: //增加数据决策系统的角色 break; } } public void rename(String oldName, String newName) { switch (manageMode) { case REPORT_PLATEFORM_MANAGE: //修改报表平台的角色 break; case FS_MANAGE: //修改数据决策系统的角色 break; } } /** * 根据不同模式生成子节点 * * @return */ @Override public ExpandMutableTreeNode[] load() { Map report_roles = null; Map FS_roles = null; if (this != null) { report_roles = this.init().get(0); FS_roles = this.init().get(1); } else { report_roles = Collections.emptyMap(); FS_roles = Collections.emptyMap(); } List list = new ArrayList(); //所有的角色 List reportlist = new ArrayList(); //报表平台橘色 List FSlist = new ArrayList(); //数据决策系统角色 list.add(initReportRolseNode(report_roles)); addNodeToList(report_roles, reportlist); list.add(initFSRolseNode(FS_roles)); addNodeToList(FS_roles, FSlist); switch (manageMode) { case REPORT_PLATEFORM_MANAGE: return reportlist.toArray(new ExpandMutableTreeNode[reportlist.size()]); case FS_MANAGE: return FSlist.toArray(new ExpandMutableTreeNode[FSlist.size()]); default: return list.toArray(new ExpandMutableTreeNode[list.size()]); } } protected void setDataMode(int i) { manageMode = i; } protected void addNodeToList(Map roleMap, List roleList) { ExpandMutableTreeNode[] roleNode = getNodeArrayFromMap(roleMap); for (int i = 0; i < roleNode.length; i++) { roleList.add(roleNode[i]); } } protected ExpandMutableTreeNode initReportRolseNode(Map report_roles) { ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager"), REPORT_PLATEFORM_MANAGE), true); templateNode.addChildTreeNodes(getNodeArrayFromMap(report_roles)); return templateNode; } protected ExpandMutableTreeNode initFSRolseNode(Map FS_roles) { ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Name_Duplicate"), FS_MANAGE), true); templateNode.addChildTreeNodes(getNodeArrayFromMap(FS_roles)); return templateNode; } protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); String name = entry.getKey(); RoleDataWrapper t = entry.getValue(); ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); roleList.add(newChildTreeNode); newChildTreeNode.add(new ExpandMutableTreeNode()); } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file +package com.fr.design.roleAuthority; import com.fr.general.NameObject; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectOP; import java.util.*; /** * Author : daisy * Date: 13-8-30 * Time: 下午3:36 */ public class RoleSourceOP implements UserObjectOP { private static final int REPORT_PLATEFORM_MANAGE = 0; public RoleSourceOP() { super(); } public List> init() { //用于存放角色 List> allRoles = new ArrayList>(); Map report_roles = new LinkedHashMap(); addReportRoles(report_roles); allRoles.add(report_roles); return allRoles; } /** * 获取报表平台的角色 */ protected void addReportRoles(Map report_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager")); report_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Role"), tdw); } public boolean interceptButtonEnabled() { return true; } /** * 移除名字是name的角色 * * @param name */ public void removeAction(String name) { } /** * 根据不同模式生成子节点 * * @return */ @Override public ExpandMutableTreeNode[] load() { Map report_roles = this.init().get(REPORT_PLATEFORM_MANAGE); List reportlist = new ArrayList(); //报表平台橘色 addNodeToList(report_roles, reportlist); return reportlist.toArray(new ExpandMutableTreeNode[reportlist.size()]); } protected void addNodeToList(Map roleMap, List roleList) { ExpandMutableTreeNode[] roleNode = getNodeArrayFromMap(roleMap); for (int i = 0; i < roleNode.length; i++) { roleList.add(roleNode[i]); } } protected ExpandMutableTreeNode initReportRolseNode(Map report_roles) { ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager"), REPORT_PLATEFORM_MANAGE), true); templateNode.addChildTreeNodes(getNodeArrayFromMap(report_roles)); return templateNode; } protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); String name = entry.getKey(); RoleDataWrapper t = entry.getValue(); ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); roleList.add(newChildTreeNode); newChildTreeNode.add(new ExpandMutableTreeNode()); } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java index ef576ba0f..76fd45c41 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java @@ -1,5 +1,6 @@ package com.fr.design.roleAuthority; +import com.fr.decision.DecisionActivator; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.itree.checkboxtree.CheckBoxTree; import com.fr.design.gui.itree.checkboxtree.CheckBoxTreeSelectionModel; @@ -13,6 +14,9 @@ import com.fr.design.mainframe.AuthorityPropertyPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.general.ComparatorUtils; +import com.fr.module.Module; +import com.fr.module.ModuleContext; +import com.fr.workspace.WorkContext; import javax.swing.SwingUtilities; @@ -54,13 +58,6 @@ public class RoleTree extends UserObjectRefreshJTree { this.replaceMouseListener(this, handler, 0); this.replaceKeyListener(this, handler, 0); this.addTreeSelectionListener(handler); -// this.removeMouseListener(treeMouseListener); -// this.addTreeSelectionListener(new TreeSelectionListener() { -// public void valueChanged(TreeSelectionEvent e) { -// doWithValueChanged(e); -// } -// }); - } public boolean isCheckBoxVisible(TreePath path) { @@ -68,6 +65,22 @@ public class RoleTree extends UserObjectRefreshJTree { } + @Override + protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode selectedTreeNode) { + // 启动平台模块加载角色列表 + startDecisionActivator(); + return super.loadChildTreeNodes(selectedTreeNode); + } + + private void startDecisionActivator() { + if (WorkContext.getCurrent().isLocal()) { + Module module = ModuleContext.getModule(DecisionActivator.class); + if (!module.isRunning()) { + module.start(); + } + } + } + /** * Creates the mouse listener and key listener used by RoleTree. * @@ -100,26 +113,8 @@ public class RoleTree extends UserObjectRefreshJTree { return null; } -// if (clicksInCheckBox(e, path)) { - return path; -// } else { -// return null; -// } - } - -// protected boolean clicksInCheckBox(MouseEvent e, TreePath path) { -// if (!_tree.isCheckBoxVisible(path)) { -// return false; -// } else { -// Rectangle bounds = _tree.getPathBounds(path); -// if (_tree.getComponentOrientation().isLeftToRight()) { -// return e.getX() < bounds.x + _hotspot; -// } else { -// return e.getX() > bounds.x + bounds.width - _hotspot; -// } -// } -// } + } private TreePath preventToggleEvent(MouseEvent e) { TreePath pathForMouseEvent = getTreePathForMouseEvent(e); @@ -220,9 +215,6 @@ public class RoleTree extends UserObjectRefreshJTree { TreePath tmpTreePath = treePaths[i]; toggleSelection(tmpTreePath); } -// for (TreePath treePath : treePaths) { -// toggleSelection(treePath); -// } } } @@ -366,9 +358,6 @@ public class RoleTree extends UserObjectRefreshJTree { for (int i = 0, length = listeners.length; i < length; i++) { component.removeMouseListener(listeners[i]); } -// for (MouseListener listener : listeners) { -// component.removeMouseListener(listener); -// } for (int i = 0; i < listeners.length; i++) { MouseListener listener = listeners[i]; if (index == i) { @@ -399,9 +388,6 @@ public class RoleTree extends UserObjectRefreshJTree { for (int i = 0, length = listeners.length; i < length; i++) { component.removeKeyListener(listeners[i]); } -// for (MouseListener listener : listeners) { -// component.removeMouseListener(listener); -// } for (int i = 0; i < listeners.length; i++) { KeyListener listener = listeners[i]; if (index == i) { diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java index 88563e8db..a68b0ab32 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java @@ -1 +1 @@ -package com.fr.design.roleAuthority; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.mainframe.JTemplate; import com.fr.general.NameObject; import com.fr.privilege.PrivilegeEditedRoleProvider; /** * Author : daisy * Date: 13-9-25 * Time: 下午4:57 */ public class RolesEditedSourceOP extends RoleSourceOP { /** * 获取报表平台的角色 */ protected void addReportRoles(Map report_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager")); report_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager"), tdw); } /** * 获取数据决策系统的角色 */ protected void addFSRoles(Map FS_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Name_Duplicate")); FS_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Name_Duplicate"), tdw); } /** * 生成子节点 * * @return */ @Override public ExpandMutableTreeNode[] load() { Map report_roles = null; // Map FS_roles = null; if (this != null) { report_roles = this.init().get(0); // FS_roles = this.init().get(1); } else { report_roles = Collections.emptyMap(); // FS_roles = Collections.emptyMap(); } List list = new ArrayList(); //所有的角色 List reportlist = new ArrayList(); //报表平台橘色 // List FSlist = new ArrayList(); //数据决策系统角色 list.add(initReportRolseNode(report_roles)); addNodeToList(report_roles, reportlist); // list.add(initFSRolseNode(FS_roles)); // addNodeToList(FS_roles, FSlist); return list.toArray(new ExpandMutableTreeNode[list.size()]); } protected ExpandMutableTreeNode initReportRolseNode(Map report_roles) { ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Roles_Already_Authority_Edited"), 0), true); templateNode.addChildTreeNodes(getNodeArrayFromMap(report_roles)); return templateNode; } protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); String name = entry.getKey(); RoleDataWrapper t = entry.getValue(); JTemplate jt = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); PrivilegeEditedRoleProvider pe = (PrivilegeEditedRoleProvider) jt.getTarget(); ExpandMutableTreeNode[] expand = t.load(Arrays.asList(pe.getAllEditedRoleSet())); for (ExpandMutableTreeNode expandMutableTreeNode : expand) { roleList.add(expandMutableTreeNode); } } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file +package com.fr.design.roleAuthority; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.mainframe.JTemplate; import com.fr.privilege.PrivilegeEditedRoleProvider; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Author : daisy * Date: 13-9-25 * Time: 下午4:57 */ public class RolesEditedSourceOP extends RoleSourceOP { protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); RoleDataWrapper t = entry.getValue(); JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); PrivilegeEditedRoleProvider pe = (PrivilegeEditedRoleProvider) jt.getTarget(); ExpandMutableTreeNode[] expand = t.load(Arrays.asList(pe.getAllEditedRoleSet())); for (ExpandMutableTreeNode expandMutableTreeNode : expand) { roleList.add(expandMutableTreeNode); } } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file From da53d45bfe526555253457a44a09ae306f760f73 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Fri, 31 Aug 2018 10:13:08 +0800 Subject: [PATCH 27/77] lf --- .../roleAuthority/RolesEditedSourceOP.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java index a68b0ab32..a21cd20e7 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RolesEditedSourceOP.java @@ -1 +1,38 @@ -package com.fr.design.roleAuthority; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.mainframe.JTemplate; import com.fr.privilege.PrivilegeEditedRoleProvider; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Author : daisy * Date: 13-9-25 * Time: 下午4:57 */ public class RolesEditedSourceOP extends RoleSourceOP { protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); RoleDataWrapper t = entry.getValue(); JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); PrivilegeEditedRoleProvider pe = (PrivilegeEditedRoleProvider) jt.getTarget(); ExpandMutableTreeNode[] expand = t.load(Arrays.asList(pe.getAllEditedRoleSet())); for (ExpandMutableTreeNode expandMutableTreeNode : expand) { roleList.add(expandMutableTreeNode); } } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file +package com.fr.design.roleAuthority; + +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.mainframe.JTemplate; +import com.fr.privilege.PrivilegeEditedRoleProvider; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Author : daisy + * Date: 13-9-25 + * Time: 下午4:57 + */ +public class RolesEditedSourceOP extends RoleSourceOP { + + protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { + List roleList = new ArrayList(); + Iterator> entryIt = map.entrySet().iterator(); + while (entryIt.hasNext()) { + Map.Entry entry = entryIt.next(); + RoleDataWrapper t = entry.getValue(); + + JTemplate jt = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + PrivilegeEditedRoleProvider pe = (PrivilegeEditedRoleProvider) jt.getTarget(); + + ExpandMutableTreeNode[] expand = t.load(Arrays.asList(pe.getAllEditedRoleSet())); + for (ExpandMutableTreeNode expandMutableTreeNode : expand) { + roleList.add(expandMutableTreeNode); + } + } + return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); + } +} \ No newline at end of file From bf93acbda1fd866ad9146318bddbfc0abe9a414b Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Fri, 31 Aug 2018 10:13:31 +0800 Subject: [PATCH 28/77] lf --- .../fr/design/roleAuthority/RoleSourceOP.java | 100 +++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java index 99c3118d8..50bf90036 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleSourceOP.java @@ -1 +1,99 @@ -package com.fr.design.roleAuthority; import com.fr.general.NameObject; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectOP; import java.util.*; /** * Author : daisy * Date: 13-8-30 * Time: 下午3:36 */ public class RoleSourceOP implements UserObjectOP { private static final int REPORT_PLATEFORM_MANAGE = 0; public RoleSourceOP() { super(); } public List> init() { //用于存放角色 List> allRoles = new ArrayList>(); Map report_roles = new LinkedHashMap(); addReportRoles(report_roles); allRoles.add(report_roles); return allRoles; } /** * 获取报表平台的角色 */ protected void addReportRoles(Map report_roles) { RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager")); report_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Role"), tdw); } public boolean interceptButtonEnabled() { return true; } /** * 移除名字是name的角色 * * @param name */ public void removeAction(String name) { } /** * 根据不同模式生成子节点 * * @return */ @Override public ExpandMutableTreeNode[] load() { Map report_roles = this.init().get(REPORT_PLATEFORM_MANAGE); List reportlist = new ArrayList(); //报表平台橘色 addNodeToList(report_roles, reportlist); return reportlist.toArray(new ExpandMutableTreeNode[reportlist.size()]); } protected void addNodeToList(Map roleMap, List roleList) { ExpandMutableTreeNode[] roleNode = getNodeArrayFromMap(roleMap); for (int i = 0; i < roleNode.length; i++) { roleList.add(roleNode[i]); } } protected ExpandMutableTreeNode initReportRolseNode(Map report_roles) { ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager"), REPORT_PLATEFORM_MANAGE), true); templateNode.addChildTreeNodes(getNodeArrayFromMap(report_roles)); return templateNode; } protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { List roleList = new ArrayList(); Iterator> entryIt = map.entrySet().iterator(); while (entryIt.hasNext()) { Map.Entry entry = entryIt.next(); String name = entry.getKey(); RoleDataWrapper t = entry.getValue(); ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); roleList.add(newChildTreeNode); newChildTreeNode.add(new ExpandMutableTreeNode()); } return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); } } \ No newline at end of file +package com.fr.design.roleAuthority; + +import com.fr.general.NameObject; +import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.gui.itree.refreshabletree.UserObjectOP; + + +import java.util.*; + +/** + * Author : daisy + * Date: 13-8-30 + * Time: 下午3:36 + */ +public class RoleSourceOP implements UserObjectOP { + private static final int REPORT_PLATEFORM_MANAGE = 0; + + public RoleSourceOP() { + super(); + } + + + public List> init() { + + //用于存放角色 + List> allRoles = new ArrayList>(); + Map report_roles = new LinkedHashMap(); + addReportRoles(report_roles); + allRoles.add(report_roles); + + return allRoles; + } + + + /** + * 获取报表平台的角色 + */ + protected void addReportRoles(Map report_roles) { + RoleDataWrapper tdw = new RoleDataWrapper(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager")); + report_roles.put(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Role"), tdw); + } + + + public boolean interceptButtonEnabled() { + return true; + } + + /** + * 移除名字是name的角色 + * + * @param name + */ + public void removeAction(String name) { + + } + + /** + * 根据不同模式生成子节点 + * + * @return + */ + @Override + public ExpandMutableTreeNode[] load() { + Map report_roles = this.init().get(REPORT_PLATEFORM_MANAGE); + List reportlist = new ArrayList(); //报表平台橘色 + addNodeToList(report_roles, reportlist); + return reportlist.toArray(new ExpandMutableTreeNode[reportlist.size()]); + } + + protected void addNodeToList(Map roleMap, List roleList) { + ExpandMutableTreeNode[] roleNode = getNodeArrayFromMap(roleMap); + for (int i = 0; i < roleNode.length; i++) { + roleList.add(roleNode[i]); + } + } + + + protected ExpandMutableTreeNode initReportRolseNode(Map report_roles) { + ExpandMutableTreeNode templateNode = new ExpandMutableTreeNode(new NameObject(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Server_Platform_Manager"), REPORT_PLATEFORM_MANAGE), true); + templateNode.addChildTreeNodes(getNodeArrayFromMap(report_roles)); + return templateNode; + } + + + protected ExpandMutableTreeNode[] getNodeArrayFromMap(Map map) { + List roleList = new ArrayList(); + Iterator> entryIt = map.entrySet().iterator(); + while (entryIt.hasNext()) { + Map.Entry entry = entryIt.next(); + String name = entry.getKey(); + RoleDataWrapper t = entry.getValue(); + + ExpandMutableTreeNode newChildTreeNode = new ExpandMutableTreeNode(new NameObject(name, t)); + roleList.add(newChildTreeNode); + newChildTreeNode.add(new ExpandMutableTreeNode()); + } + return roleList.toArray(new ExpandMutableTreeNode[roleList.size()]); + } +} From 66ab8a0d91ca444bf09e6f140ab2f4e9b8e4019e Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Fri, 31 Aug 2018 11:04:41 +0800 Subject: [PATCH 29/77] =?UTF-8?q?=E6=94=B9=E6=88=90FineEmbedServer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/roleAuthority/RoleTree.java | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java index 76fd45c41..b52561c05 100644 --- a/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java +++ b/designer-base/src/main/java/com/fr/design/roleAuthority/RoleTree.java @@ -1,27 +1,23 @@ package com.fr.design.roleAuthority; -import com.fr.decision.DecisionActivator; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.constants.UIConstants; +import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.itree.checkboxtree.CheckBoxTree; import com.fr.design.gui.itree.checkboxtree.CheckBoxTreeSelectionModel; -import com.fr.general.NameObject; -import com.fr.design.constants.UIConstants; -import com.fr.design.beans.BasicBeanPane; -import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectRefreshJTree; import com.fr.design.mainframe.AuthorityPropertyPane; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.general.ComparatorUtils; -import com.fr.module.Module; -import com.fr.module.ModuleContext; -import com.fr.workspace.WorkContext; - +import com.fr.general.NameObject; +import com.fr.start.server.FineEmbedServer; -import javax.swing.SwingUtilities; -import javax.swing.JTree; import javax.swing.JComponent; +import javax.swing.JTree; +import javax.swing.SwingUtilities; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; @@ -67,20 +63,11 @@ public class RoleTree extends UserObjectRefreshJTree { @Override protected ExpandMutableTreeNode[] loadChildTreeNodes(ExpandMutableTreeNode selectedTreeNode) { - // 启动平台模块加载角色列表 - startDecisionActivator(); + // 启动平台模块加载角色列表, server内部已经做了启动状态与Workspace判断. + FineEmbedServer.start(); return super.loadChildTreeNodes(selectedTreeNode); } - private void startDecisionActivator() { - if (WorkContext.getCurrent().isLocal()) { - Module module = ModuleContext.getModule(DecisionActivator.class); - if (!module.isRunning()) { - module.start(); - } - } - } - /** * Creates the mouse listener and key listener used by RoleTree. * From f1f5dc76dd87a00adc603636d24974fec13dd8f5 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Fri, 31 Aug 2018 15:25:32 +0800 Subject: [PATCH 30/77] =?UTF-8?q?REPORT-11002=20=E8=B6=85=E9=93=BE?= =?UTF-8?q?=E9=83=A8=E5=88=86=E8=84=B1=E7=A6=BBcjk=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/hyperlink/WebHyperlinkPane.java | 29 ++++++------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/hyperlink/WebHyperlinkPane.java b/designer-base/src/main/java/com/fr/design/hyperlink/WebHyperlinkPane.java index 89663ba7a..2975e7c34 100644 --- a/designer-base/src/main/java/com/fr/design/hyperlink/WebHyperlinkPane.java +++ b/designer-base/src/main/java/com/fr/design/hyperlink/WebHyperlinkPane.java @@ -4,14 +4,16 @@ import com.fr.base.Parameter; import com.fr.design.gui.frpane.ReportletParameterViewPane; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.itableeditorpane.ParameterTableModel; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; - import com.fr.js.WebHyperlink; import com.fr.stable.ParameterProvider; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.FlowLayout; import java.util.HashMap; import java.util.List; @@ -19,8 +21,6 @@ public class WebHyperlinkPane extends AbstractHyperLinkPane { private static final int BORDER_WIDTH = 4; private WebHyperNorthPane northPane; - private UICheckBox useCJKCheckBox; - private UICheckBox extendParametersCheckBox; public WebHyperlinkPane() { @@ -42,16 +42,15 @@ public class WebHyperlinkPane extends AbstractHyperLinkPane { parameterViewPane = new ReportletParameterViewPane(getChartParaType(), getValueEditorPane(), getValueEditorPane()); this.add(parameterViewPane, BorderLayout.CENTER); - parameterViewPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters"), null)); + parameterViewPane.setBorder(GUICoreUtils.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Parameters"), null)); - useCJKCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Use_CJK_To_Encode_Parameter")); - extendParametersCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Extends_Report_Parameters")); - this.add(GUICoreUtils.createFlowPane(new Component[]{useCJKCheckBox, extendParametersCheckBox}, FlowLayout.LEFT), BorderLayout.SOUTH); + extendParametersCheckBox = new UICheckBox(Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Extends_Report_Parameters")); + this.add(GUICoreUtils.createFlowPane(new Component[]{extendParametersCheckBox}, FlowLayout.LEFT), BorderLayout.SOUTH); } @Override public String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"); + return Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"); } @Override @@ -63,7 +62,6 @@ public class WebHyperlinkPane extends AbstractHyperLinkPane { ParameterProvider[] parameters = ob.getParameters(); parameterViewPane.populate(parameters); - useCJKCheckBox.setSelected(ob.isUseCJK()); extendParametersCheckBox.setSelected(ob.isExtendParameters()); } @@ -88,7 +86,6 @@ public class WebHyperlinkPane extends AbstractHyperLinkPane { } else { webHyperlink.setParameters(null); } - webHyperlink.setUseCJK(this.useCJKCheckBox.isSelected()); webHyperlink.setExtendParameters(this.extendParametersCheckBox.isSelected()); } @@ -110,14 +107,6 @@ public class WebHyperlinkPane extends AbstractHyperLinkPane { this.northPane = northPane; } - public UICheckBox getUseCJKCheckBox() { - return useCJKCheckBox; - } - - public void setUseCJKCheckBox(UICheckBox useCJKCheckBox) { - this.useCJKCheckBox = useCJKCheckBox; - } - public UICheckBox getExtendParametersCheckBox() { return extendParametersCheckBox; } From 1908b24e1958c116106a81e83ef6b7eca149cc7d Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 3 Sep 2018 10:01:45 +0800 Subject: [PATCH 31/77] =?UTF-8?q?=E9=BC=A0=E6=A0=87=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=E5=8E=BB=E8=AE=BA=E5=9D=9B=E6=8F=90=E9=97=AE=EF=BC=8C=E5=8F=98?= =?UTF-8?q?=E6=88=90=E5=B0=8F=E6=89=8B=E7=8A=B6=20=E5=8E=BB=E8=AE=BA?= =?UTF-8?q?=E5=9D=9B=E6=8F=90=E9=97=AE=E6=94=B9=E4=B8=BA=E5=8D=95=E5=87=BB?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/component/AlphaFineDialog.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 37010c127..72156d8ae 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -67,6 +67,7 @@ import javax.swing.event.ListSelectionListener; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Cursor; import java.awt.Dimension; import java.awt.Frame; import java.awt.Graphics; @@ -83,6 +84,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.MouseMotionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; @@ -1161,6 +1163,8 @@ public class AlphaFineDialog extends UIDialog { } else if (e.getClickCount() == 1) { if (selectedValue instanceof MoreModel && ((MoreModel) selectedValue).isNeedMore()) { dealWithMoreOrLessResult(selectedIndex, (MoreModel) selectedValue); + }else if(selectedValue instanceof BottomModel){ + dealWithSearchResult(selectedValue); } } } @@ -1175,6 +1179,23 @@ public class AlphaFineDialog extends UIDialog { } }); + addMouseMotionListener(new MouseMotionListener() { + @Override + public void mouseMoved(MouseEvent e) { + final int x = e.getX(); + final int y = e.getY(); + final Rectangle cellBounds = getCellBounds(getModel().getSize() - 1, getModel().getSize() - 1); + if (cellBounds != null && cellBounds.contains(x, y)) { + setCursor(new Cursor(Cursor.HAND_CURSOR)); + } else { + setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); + } + } + @Override + public void mouseDragged(MouseEvent e) { + } + }); + addKeyListener(new KeyAdapter() { @Override public void keyPressed(KeyEvent e) { From fa3d81d76dfbcad2cc643edb9f14171b568524cb Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 4 Sep 2018 16:12:08 +0800 Subject: [PATCH 32/77] =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/start/module/DesignerActivator.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 80edec701..5316eb8ff 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -27,7 +27,7 @@ import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; -import com.fr.design.i18n.DesignI18nImpl; +import com.fr.design.i18n.Toolkit; import com.fr.design.javascript.EmailPane; import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; @@ -123,9 +123,9 @@ public class DesignerActivator extends Activator { public void start() { List markers = rightCollectMutable(InterMutableKey.Path); for (LocaleMarker marker : markers) { - if (marker.match(LocaleScope.DESIGN)) { - DesignI18nImpl.getInstance().addResource(marker.getPath()); - } +// if (marker.match(LocaleScope.DESIGN)) { + Toolkit.addResource(marker.getPath()); +// } } designerModuleStart(); preLoadPane(); @@ -252,11 +252,11 @@ public class DesignerActivator extends Activator { private static NameableCreator[] hyperlinkTypes() { return new NameableCreator[]{ - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Email"), EmailJavaScript.class, EmailPane.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"), WebHyperlink.class, WebHyperlinkPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_JavaScript_Dynamic_Parameters"), ParameterJavaScript.class, ParameterJavaScriptPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JavaScript"), JavaScriptImpl.class, JavaScriptImplPane.ChartNoRename.class) + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Hyperlink_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Email"), EmailJavaScript.class, EmailPane.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Hyperlink-Web_link"), WebHyperlink.class, WebHyperlinkPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("JavaScript-Dynamic_Parameters"), ParameterJavaScript.class, ParameterJavaScriptPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_JavaScript"), JavaScriptImpl.class, JavaScriptImplPane.ChartNoRename.class) }; } @@ -410,4 +410,4 @@ public class DesignerActivator extends Activator { unloadLogAppender(); DesignerSocketIO.close(); } -} +} \ No newline at end of file From 40b12d76c0d7e6003163d9bbf0e33b966038783b Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 4 Sep 2018 16:23:20 +0800 Subject: [PATCH 33/77] revert --- .../fr/start/module/DesignerActivator.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 5316eb8ff..80edec701 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -27,7 +27,7 @@ import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; -import com.fr.design.i18n.Toolkit; +import com.fr.design.i18n.DesignI18nImpl; import com.fr.design.javascript.EmailPane; import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; @@ -123,9 +123,9 @@ public class DesignerActivator extends Activator { public void start() { List markers = rightCollectMutable(InterMutableKey.Path); for (LocaleMarker marker : markers) { -// if (marker.match(LocaleScope.DESIGN)) { - Toolkit.addResource(marker.getPath()); -// } + if (marker.match(LocaleScope.DESIGN)) { + DesignI18nImpl.getInstance().addResource(marker.getPath()); + } } designerModuleStart(); preLoadPane(); @@ -252,11 +252,11 @@ public class DesignerActivator extends Activator { private static NameableCreator[] hyperlinkTypes() { return new NameableCreator[]{ - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Hyperlink_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_Email"), EmailJavaScript.class, EmailPane.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Hyperlink-Web_link"), WebHyperlink.class, WebHyperlinkPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("JavaScript-Dynamic_Parameters"), ParameterJavaScript.class, ParameterJavaScriptPane.ChartNoRename.class), - new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("FR-Designer_JavaScript"), JavaScriptImpl.class, JavaScriptImplPane.ChartNoRename.class) + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Email"), EmailJavaScript.class, EmailPane.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Hyperlink_Web_Link"), WebHyperlink.class, WebHyperlinkPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_JavaScript_Dynamic_Parameters"), ParameterJavaScript.class, ParameterJavaScriptPane.ChartNoRename.class), + new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_JavaScript"), JavaScriptImpl.class, JavaScriptImplPane.ChartNoRename.class) }; } @@ -410,4 +410,4 @@ public class DesignerActivator extends Activator { unloadLogAppender(); DesignerSocketIO.close(); } -} \ No newline at end of file +} From 3f8f894a99241f1012b79bb09e2aeffa3bd4b428 Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 4 Sep 2018 17:14:32 +0800 Subject: [PATCH 34/77] =?UTF-8?q?REPORT-10712=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E7=BA=B8=E5=BC=A0=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=3D>=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../printsettings/NativePrintSettingPane.java | 71 +++++++++++++++++-- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java index 59077e69f..07ed1eaf9 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java @@ -15,9 +15,11 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.report.UnitFieldPane; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.report.stable.ReportConstants; +import com.fr.stable.Constants; import com.fr.stable.StringUtils; import javax.print.DocFlavor; @@ -47,6 +49,8 @@ import java.util.regex.Pattern; public class NativePrintSettingPane extends JPanel { private static final int ODD_INDEX = 0; private static final int EVEN_INDEX = 1; + private static final String CUSTOM_PAPERSIZE = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Custom"); + private static final PaperSize DEFAULT_PAPERSIZE = PaperSize.PAPERSIZE_A4; private UICheckBox isShowDialogCheck; private UIComboBox printerComboBox; @@ -67,6 +71,9 @@ public class NativePrintSettingPane extends JPanel { private UIRadioButton landscapeRadioButton; private PageMarginSettingPane pageMarginSettingPane; private JPanel centerPane; + private JPanel customPaperSizePane; + private UnitFieldPane customWidthFieldPane; + private UnitFieldPane customHeightFieldPane; public NativePrintSettingPane() { initComponents(); @@ -132,6 +139,12 @@ public class NativePrintSettingPane extends JPanel { super.focusLost(e); } }); + predefinedPaperSizeComboBox.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + updateCustomPaperSizeArea(); + } + }); } private ItemListener getPageRaidoListener() { @@ -222,6 +235,7 @@ public class NativePrintSettingPane extends JPanel { Object[] tmpPaperSizeNameArray = ReportConstants.PaperSizeNameSizeArray[i]; predefinedPaperSizeComboBox.addItem(tmpPaperSizeNameArray[1]); } + predefinedPaperSizeComboBox.addItem(CUSTOM_PAPERSIZE); predefinedPaperSizeComboBox.setRenderer(new UIComboBoxRenderer() { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { @@ -250,12 +264,41 @@ public class NativePrintSettingPane extends JPanel { } }); - JPanel panel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); - panel.add(predefinedPaperSizeComboBox); - panel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0)); + // 下拉框 + JPanel comboPanel = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); + comboPanel.add(predefinedPaperSizeComboBox); + comboPanel.setBorder(BorderFactory.createEmptyBorder(8, 0, 0, 0)); + + customPaperSizePane = FRGUIPaneFactory.createX_AXISBoxInnerContainer_M_Pane(); + // 宽度设置 + JPanel customWidthPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + customWidthPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Designer_Width") + ":")); + customWidthFieldPane = new UnitFieldPane(Constants.UNIT_MM); + customWidthFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getWidth()); + customWidthPane.add(customWidthFieldPane); + // 高度设置 + JPanel customHeightPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + customHeightPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Height") + ":")); + customHeightFieldPane = new UnitFieldPane(Constants.UNIT_MM); + customHeightFieldPane.setUnitValue(DEFAULT_PAPERSIZE.getHeight()); + customHeightPane.add(customHeightFieldPane); + + customPaperSizePane.add(customWidthPane); + customPaperSizePane.add(customHeightPane); + customPaperSizePane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); + + JPanel panel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + panel.add(comboPanel, BorderLayout.NORTH); + panel.add(customPaperSizePane, BorderLayout.CENTER); + return panel; } + private void updateCustomPaperSizeArea() { + boolean isCustom = ComparatorUtils.equals(predefinedPaperSizeComboBox.getSelectedItem(), CUSTOM_PAPERSIZE); + customPaperSizePane.setVisible(isCustom); + } + private JPanel getLayoutSettingPane() { JPanel layoutSettingPane = FRGUIPaneFactory.createLeftFlowZeroGapBorderPane(); layoutSettingPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); @@ -373,7 +416,17 @@ public class NativePrintSettingPane extends JPanel { doublePrintComboBox.setEnabled(doublePrintRadioButton.isSelected()); inheritPagePaperSettingCheck.setSelected(nativePrintAttr.isInheritPagePaperSetting()); - predefinedPaperSizeComboBox.setSelectedItem(nativePrintAttr.getPaperSize()); + + PaperSize paperSize = nativePrintAttr.getPaperSize(); + predefinedPaperSizeComboBox.setSelectedItem(paperSize); + if (!ComparatorUtils.equals(predefinedPaperSizeComboBox.getSelectedItem(), paperSize)) { + // 自定义尺寸 + predefinedPaperSizeComboBox.setSelectedItem(CUSTOM_PAPERSIZE); + customWidthFieldPane.setUnitValue(paperSize.getWidth()); + customHeightFieldPane.setUnitValue(paperSize.getHeight()); + } + updateCustomPaperSizeArea(); + inheritPageLayoutSettingCheck.setSelected(nativePrintAttr.isInheritPageLayoutSetting()); if (nativePrintAttr.getOrientation() == ReportConstants.PORTRAIT) { portraitRadioButton.setSelected(true); @@ -408,7 +461,15 @@ public class NativePrintSettingPane extends JPanel { } nativePrintAttr.setInheritPagePaperSetting(inheritPagePaperSettingCheck.isSelected()); - nativePrintAttr.setPaperSize((PaperSize) predefinedPaperSizeComboBox.getSelectedItem()); + + PaperSize newPaperSize; + if (ComparatorUtils.equals(predefinedPaperSizeComboBox.getSelectedItem(), CUSTOM_PAPERSIZE)) { + newPaperSize = new PaperSize(customWidthFieldPane.getUnitValue(), customHeightFieldPane.getUnitValue()); + } else { + newPaperSize = (PaperSize) predefinedPaperSizeComboBox.getSelectedItem(); + } + nativePrintAttr.setPaperSize(newPaperSize); + nativePrintAttr.setInheritPageLayoutSetting(inheritPageLayoutSettingCheck.isSelected()); nativePrintAttr.setOrientation(portraitRadioButton.isSelected() ? ReportConstants.PORTRAIT : ReportConstants.LANDSCAPE); From f06bebdf9fe51685c14c26f70db694b5e5c03363 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 4 Sep 2018 17:19:23 +0800 Subject: [PATCH 35/77] =?UTF-8?q?REPORT-10927=20alphafine=E7=83=AD?= =?UTF-8?q?=E9=97=A8=E6=90=9C=E7=B4=A2=E7=9A=84=E7=9B=B8=E5=85=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98=201.=E7=A7=BB=E5=88=B0=E7=83=AD=E9=97=A8=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E6=9D=A1=E7=9B=AE=E6=97=B6=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=B0=8F=E6=89=8B=E6=A0=B7=E5=BC=8F=E3=80=82=202.=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E7=82=B9=E5=87=BB=E5=85=B3=E9=94=AE=E5=AD=97=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=8F=B3=E4=BE=A7=E6=98=AF=E7=A9=BA=E7=99=BD=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82=203.=E5=A2=9E=E5=8A=A0jeditpane?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E7=9A=84html=E7=9A=84=E5=90=84=E7=A7=8D?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=93=8D=E5=BA=94=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConstants.java | 8 ++++ .../alphafine/cell/model/RobotModel.java | 19 ++++---- .../alphafine/component/AlphaFineDialog.java | 35 ++++++++++----- .../alphafine/preview/RobotPreviewPane.java | 45 +++++++++++++++++-- 4 files changed, 83 insertions(+), 24 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java index e84969bd0..fe72f9c1d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineConstants.java @@ -110,6 +110,10 @@ public class AlphaFineConstants { public static final String BOTTOM_REGEX_SECOND = "

"; + public static final String LINK_REGEX = "javascript:;\"([\\s\\S]*?)','"; + + public static final String LINK_REGEX_ANOTHER = "javascript:([\\s\\S]*?)url=\""; + public static final String ALPHA_ROBOT_SEARCH_TOKEN = "K8dl0Np6l0gs"; public static final String SIMILAR_SEARCH_URL_PREFIX = CloudCenter.getInstance().acquireUrlByKind("af.similar_search"); @@ -122,6 +126,10 @@ public class AlphaFineConstants { public static final String ALPHA_GO_TO_WEB = CloudCenter.getInstance().acquireUrlByKind("af.go_web"); + public static final String ALPHA_PREVIEW = CloudCenter.getInstance().acquireUrlByKind("af.preview"); + + public static final String JAVASCRIPT_PREFIX = "javascript:SendJava"; + public static final String CHINESE_CHARACTERS = "[\\u4e00-\\u9fa5]"; public static final String FIRST_PAGE = "-1"; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java index 47d95514e..273b29fef 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/model/RobotModel.java @@ -1,16 +1,15 @@ package com.fr.design.mainframe.alphafine.cell.model; import com.fr.design.mainframe.alphafine.AlphaFineConstants; -import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.AssistUtils; +import com.fr.stable.StringUtils; import org.apache.commons.codec.digest.DigestUtils; - import java.awt.Desktop; import java.io.IOException; import java.net.URI; @@ -44,17 +43,17 @@ public class RobotModel extends AlphaCellModel { } public static String getContent(String titleStr) { - String result; String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + titleStr); String url = AlphaFineConstants.ALPHA_GO_TO_WEB + titleStr + "&token=" + token; - HttpClient httpClient = new HttpClient(url); - httpClient.asGet(); - result = httpClient.getResponseText(); - AlphaFineHelper.checkCancel(); + try { + String result = HttpToolbox.get(url); + if(StringUtils.isEmpty(result)){ + return StringUtils.EMPTY; + } JSONObject jsonObject = new JSONObject(result); return jsonObject.optString("msg"); - } catch (JSONException e) { + } catch (JSONException | IOException e) { FineLoggerFactory.getLogger().error("get robotmodel content error: " + e.getMessage()); } return null; @@ -86,7 +85,7 @@ public class RobotModel extends AlphaCellModel { @Override public void doAction() { try { - Desktop.getDesktop().browse(new URI("http://robot.finereport.com?send=" + super.getName())); + Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_PREVIEW + super.getName())); } catch (IOException e) { FineLoggerFactory.getLogger().error(e.getMessage()); } catch (URISyntaxException e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 72156d8ae..7fd1dc09c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -11,20 +11,20 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.alphafine.AlphaFineConstants; import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.cell.CellModelHelper; -import com.fr.design.mainframe.alphafine.cell.model.RobotModel; -import com.fr.design.mainframe.alphafine.cell.model.BottomModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; +import com.fr.design.mainframe.alphafine.cell.model.BottomModel; import com.fr.design.mainframe.alphafine.cell.model.FileModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.PluginModel; +import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.preview.ContainsCirclePane; import com.fr.design.mainframe.alphafine.preview.DocumentPreviewPane; import com.fr.design.mainframe.alphafine.preview.FilePreviewPane; import com.fr.design.mainframe.alphafine.preview.NoResultPane; import com.fr.design.mainframe.alphafine.preview.PluginPreviewPane; import com.fr.design.mainframe.alphafine.preview.RobotPreviewPane; -import com.fr.design.mainframe.alphafine.preview.ContainsCirclePane; import com.fr.design.mainframe.alphafine.search.manager.impl.ActionSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.FileSearchManager; @@ -116,6 +116,7 @@ public class AlphaFineDialog extends UIDialog { private static final String PLACE_HOLDER = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine"); private static final int MAX_SHOW_SIZE = 12; private static final int TIMER_DELAY = 300; + private static final int ONLY_ONE_AVAILABLE_MODEL = 2; private AlphaFineTextField searchTextField; private UIButton closeButton; @@ -705,14 +706,20 @@ public class AlphaFineDialog extends UIDialog { this.showWorker = new SwingWorker() { @Override protected String doInBackground() { + if(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item").equals((selectedValue).getName())){ + return StringUtils.EMPTY; + } String content = RobotModel.getContent((selectedValue).getName()); if(StringUtils.isNotEmpty(content)){ - //去掉小帆底部的信息 - content = content.replaceAll(AlphaFineConstants.BOTTOM_REGEX_FIRST, "") - .replaceAll(AlphaFineConstants.BOTTOM_REGEX_SECOND, ""); + //1.去掉小帆底部的信息。2.修改链接标签,使点击能够正常跳转。 + content = content.replaceAll(AlphaFineConstants.BOTTOM_REGEX_FIRST, StringUtils.EMPTY) + .replaceAll(AlphaFineConstants.BOTTOM_REGEX_SECOND, StringUtils.EMPTY) + .replaceAll(AlphaFineConstants.LINK_REGEX,StringUtils.EMPTY) + .replaceAll("'\\)",StringUtils.EMPTY) + .replaceAll(AlphaFineConstants.LINK_REGEX_ANOTHER,StringUtils.EMPTY); return content; }else{ - return ""; + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item"); } } @@ -1185,7 +1192,7 @@ public class AlphaFineDialog extends UIDialog { final int x = e.getX(); final int y = e.getY(); final Rectangle cellBounds = getCellBounds(getModel().getSize() - 1, getModel().getSize() - 1); - if (cellBounds != null && cellBounds.contains(x, y)) { + if (cellBounds != null && cellBounds.contains(x, y) && getModel().getElementAt(getModel().getSize() - 1) instanceof BottomModel) { setCursor(new Cursor(Cursor.HAND_CURSOR)); } else { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); @@ -1323,8 +1330,15 @@ public class AlphaFineDialog extends UIDialog { protected Object doInBackground() throws Exception { resetContainer(); - for (AlphaCellModel object : modeList) { - searchListModel.addElement(object); + if(modeList.size() == ONLY_ONE_AVAILABLE_MODEL && "".equals(modeList.get(1).getName())){ + RobotModel model = new RobotModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item"), null); + searchListModel.addElement(model); + }else { + for (AlphaCellModel object : modeList) { + if(!searchListModel.contains(object)){ + searchListModel.addElement(object); + } + } } return null; } @@ -1418,6 +1432,7 @@ public class AlphaFineDialog extends UIDialog { final UILabel subTitle = new UILabel(str[i]); subTitle.setForeground(AlphaFineConstants.DARK_GRAY); subTitle.setFont(AlphaFineConstants.MEDIUM_FONT_ANOTHER); + subTitle.setCursor(new Cursor(Cursor.HAND_CURSOR)); subTitle.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java index 32c5cd820..336e64dce 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java @@ -1,17 +1,26 @@ package com.fr.design.mainframe.alphafine.preview; +import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itextarea.UITextArea; import com.fr.design.mainframe.alphafine.AlphaFineConstants; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JEditorPane; import javax.swing.JPanel; -import javax.swing.JScrollPane; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; import javax.swing.text.html.HTMLEditorKit; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.Desktop; import java.awt.Dimension; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; /** @@ -30,11 +39,39 @@ public class RobotPreviewPane extends JPanel { titleArea.setFont(AlphaFineConstants.LARGE_FONT); add(titleArea, BorderLayout.NORTH); - JEditorPane editorPane = new JEditorPane(); + final JEditorPane editorPane = new JEditorPane(); editorPane.setEditorKit(new HTMLEditorKit()); - editorPane.setText(content); + editorPane.setText(content+"


"); + editorPane.addHyperlinkListener(new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent e) { + if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED) { + return; + } + if(e.getDescription().startsWith(AlphaFineConstants.JAVASCRIPT_PREFIX)){ + String s = e.getDescription().replaceAll(AlphaFineConstants.JAVASCRIPT_PREFIX,StringUtils.EMPTY) + .replaceAll("\\('",StringUtils.EMPTY) + .replaceAll("'\\)",StringUtils.EMPTY); + try { + Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_PREVIEW + s)); + } catch (IOException e1) { + FineLoggerFactory.getLogger().error(e1.getMessage()); + } catch (URISyntaxException e1) { + FineLoggerFactory.getLogger().error(e1.getMessage()); + } + } + URL linkUrl = e.getURL();if (linkUrl != null) { + try { + Desktop.getDesktop().browse(e.getURL().toURI()); + } catch (IOException | URISyntaxException e1) { + FineLoggerFactory.getLogger().error(" Jump to webpage error: " + e1.getMessage()); + } + } + } + }); editorPane.setEditable(false); - JScrollPane jScrollPane = new JScrollPane(editorPane); + UIScrollPane jScrollPane = new UIScrollPane(editorPane); + jScrollPane.getVerticalScrollBar().setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0)); jScrollPane.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 10, Color.white)); add(jScrollPane, BorderLayout.CENTER); } From 81a7cfef3287730ebfb850535dae4493d8645f7b Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 4 Sep 2018 17:37:12 +0800 Subject: [PATCH 36/77] =?UTF-8?q?REPORT-10390=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E6=9D=83=E9=99=90-=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E6=88=90=E5=91=98=E4=BA=A4=E4=BA=92=E4=BF=AE=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/toolbar/ToolBarMenuDock.java | 17 ++-- ...ava => RemoteDesignAuthManagerAction.java} | 21 ++--- .../remote/ui/AuthorityListControlPane.java | 77 +++++++++++++++--- .../remote/ui/AuthorityManagerPane.java | 4 +- .../fr/design/remote/ui/UserManagerPane.java | 15 +++- ..._Remote_Design_Auth_Manager_normal@1x.png} | Bin ..._Remote_Design_Auth_Manager_normal@2x.png} | Bin 7 files changed, 99 insertions(+), 35 deletions(-) rename designer-base/src/main/java/com/fr/design/remote/action/{RemoteDesignAuthorityManagerAction.java => RemoteDesignAuthManagerAction.java} (80%) rename designer-base/src/main/resources/com/fr/design/remote/images/{icon_Remote_Design_Permission_Manager_normal@1x.png => icon_Remote_Design_Auth_Manager_normal@1x.png} (100%) rename designer-base/src/main/resources/com/fr/design/remote/images/{icon_Remote_Design_Permission_Manager_normal@2x.png => icon_Remote_Design_Auth_Manager_normal@2x.png} (100%) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index 78e440ab7..8f20583ab 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -16,7 +16,6 @@ import com.fr.design.actions.community.NeedAction; import com.fr.design.actions.community.QuestionAction; import com.fr.design.actions.community.SignAction; import com.fr.design.actions.community.TechSolutionAction; -import com.fr.design.actions.community.UpAction; import com.fr.design.actions.community.VideoAction; import com.fr.design.actions.file.CloseCurrentTemplateAction; import com.fr.design.actions.file.ExitDesignerAction; @@ -51,7 +50,7 @@ import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.onlineupdate.actions.SoftwareUpdateAction; -import com.fr.design.remote.action.RemoteDesignAuthorityManagerAction; +import com.fr.design.remote.action.RemoteDesignAuthManagerAction; import com.fr.design.utils.ThemeUtils; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; @@ -426,8 +425,8 @@ public abstract class ToolBarMenuDock { new PlatformManagerAction() ); - if (shouldShowRemotePermission()) { - menuDef.addShortCut(new RemoteDesignAuthorityManagerAction()); + if (shouldShowRemoteAuth()) { + menuDef.addShortCut(new RemoteDesignAuthManagerAction()); } if (!DesignerMode.isAuthorityEditing()) { @@ -451,7 +450,13 @@ public abstract class ToolBarMenuDock { return processor == null ? new GlobalTableDataAction() : processor.createServerTDAction(); } - private boolean shouldShowRemotePermission() { + /** + * 判断是否应该展示远程设计权限管理 + * 如果当前环境是远程环境,并且登录用户为管理员,那么应该展示;否则不予展示 + * + * @return boolean + */ + private boolean shouldShowRemoteAuth() { return WorkContext.getCurrent() != null && !WorkContext.getCurrent().isLocal() && WorkContext.getCurrent().isRoot(); } @@ -474,7 +479,7 @@ public abstract class ToolBarMenuDock { shortCuts.add(new TutorialAction()); } //远程不使用更新升级 - if(WorkContext.getCurrent().isLocal()) { + if (WorkContext.getCurrent().isLocal()) { shortCuts.add(new SoftwareUpdateAction()); } diff --git a/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthorityManagerAction.java b/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java similarity index 80% rename from designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthorityManagerAction.java rename to designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java index ceebd0c01..ff96907a7 100644 --- a/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthorityManagerAction.java +++ b/designer-base/src/main/java/com/fr/design/remote/action/RemoteDesignAuthManagerAction.java @@ -4,25 +4,25 @@ import com.fr.base.BaseUtils; import com.fr.design.actions.UpdateAction; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.remote.ui.AuthorityManagerPane; -import com.fr.workspace.server.authority.AuthorityOperator; - import com.fr.log.FineLoggerFactory; import com.fr.report.DesignAuthority; import com.fr.workspace.WorkContext; +import com.fr.workspace.server.authority.AuthorityOperator; import java.awt.event.ActionEvent; /** * @author yaohwu */ -public class RemoteDesignAuthorityManagerAction extends UpdateAction { +public class RemoteDesignAuthManagerAction extends UpdateAction { - public RemoteDesignAuthorityManagerAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager")); - this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@1x.png")); + public RemoteDesignAuthManagerAction() { + this.setName(Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager")); + this.setSmallIcon(BaseUtils.readIcon("com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@1x.png")); } @@ -49,7 +49,6 @@ public class RemoteDesignAuthorityManagerAction extends UpdateAction { @Override public void doOk() { - DesignAuthority[] authorities = managerPane.update(); if (!WorkContext.getCurrent().isLocal()) { boolean success = false; @@ -58,15 +57,9 @@ public class RemoteDesignAuthorityManagerAction extends UpdateAction { } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - FineLoggerFactory.getLogger().info("update remote design authority: " + success); + FineLoggerFactory.getLogger().debug("update remote design authority: " + success); } } - - @Override - public void doCancel() { - - super.doCancel(); - } }); dialog.setModal(true); dialog.setVisible(true); diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java index f917e9219..7404ed699 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityListControlPane.java @@ -10,6 +10,7 @@ import com.fr.design.gui.controlpane.ShortCut4JControlPane; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.i18n.Toolkit; import com.fr.design.icon.IconPathConstants; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.menu.ShortCut; @@ -19,7 +20,6 @@ import com.fr.design.remote.ui.list.AuthorityList; import com.fr.design.remote.ui.list.AuthorityListCellRenderer; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; - import com.fr.log.FineLoggerFactory; import com.fr.report.DesignAuthority; import com.fr.stable.ArrayUtils; @@ -78,7 +78,7 @@ public class AuthorityListControlPane extends BasicPane { this.setLayout(FRGUIPaneFactory.createBorderLayout()); this.authorityCreators = new RemoteDesignAuthorityCreator[]{ new RemoteDesignAuthorityCreator( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"), + Toolkit.i18nText("Fine-Design_Basic_Remote_Design_User"), BaseUtils.readIcon("com/fr/design/remote/images/icon_Member_normal@1x.png"), DesignAuthority.class, AuthorityEditorPane.class) @@ -247,6 +247,34 @@ public class AuthorityListControlPane extends BasicPane { } + /** + * 添加 RemoteDesignAuthority + * + * @param authorities authority + */ + public void setAuthority(List authorities) { + + if (authorities == null || authorities.isEmpty()) { + return; + } + + DefaultListModel model = (DefaultListModel) authorityList.getModel(); + model.clear(); + + for (DesignAuthority authority : authorities) { + model.addElement(authority); + } + + int size = model.getSize() - 1; + + authorityList.setSelectedIndex(size); + authorityList.ensureIndexIsVisible(size); + + authorityList.revalidate(); + authorityList.repaint(); + } + + protected DefaultListModel getModel() { return (DefaultListModel) this.authorityList.getModel(); } @@ -465,12 +493,12 @@ public class AuthorityListControlPane extends BasicPane { } /** - * 添加按钮 + * 选择按钮 */ private class AddItemUpdateAction extends UpdateAction { AddItemUpdateAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Add")); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Action_Choose")); this.setMnemonic('A'); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); } @@ -480,29 +508,54 @@ public class AuthorityListControlPane extends BasicPane { final UserManagerPane userManagerPane = new UserManagerPane(); BasicDialog dialog = userManagerPane.showWindow(SwingUtilities.getWindowAncestor(AuthorityListControlPane.this)); + // 刷新用户管理面板展示信息 + final DesignAuthority[] authorities = AuthorityListControlPane.this.update(); + dialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { // 获取添加的用户到权限编辑面板 List members = userManagerPane.update(); + + List oldAuthorities = new ArrayList<>(); + + // 已有的未修改的 + for (RemoteDesignMember member : members) { + for (DesignAuthority authority : authorities) { + if (member.getUserId().equals(authority.getUserId())) { + oldAuthorities.add(authority); + } + } + } + // 保留已有且仍选择的,删除不再选择的 + setAuthority(oldAuthorities); + + // 新增的 for (RemoteDesignMember member : members) { DesignAuthority authority = new DesignAuthority(); authority.setUsername(member.getUsername()); authority.setUserId(member.getUserId()); authority.setRealName(member.getRealName()); - AuthorityListControlPane.this.addAuthority(authority, getModel().getSize()); + addAuthority(authority, getModel().getSize()); } - } - @Override - public void doCancel() { - super.doCancel(); } }); - dialog.setModal(true); - dialog.setVisible(true); + List members = new ArrayList<>(); + for (DesignAuthority authority : authorities) { + RemoteDesignMember m = new RemoteDesignMember(); + m.setUsername(authority.getUsername()); + m.setUserId(authority.getUserId()); + m.setRealName(authority.getRealName()); + m.setSelected(true); + members.add(m); + } + userManagerPane.populate(members); + + dialog.setModal(true); + dialog.setVisible(true); } } @@ -511,7 +564,7 @@ public class AuthorityListControlPane extends BasicPane { */ private class RemoveItemAction extends UpdateAction { RemoveItemAction() { - this.setName(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Action_Remove")); + this.setName(Toolkit.i18nText("Fine-Design_Basic_Action_Remove")); this.setMnemonic('R'); this.setSmallIcon(BaseUtils .readIcon(IconPathConstants.TD_REMOVE_ICON_PATH)); diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java index f84bff5c9..7dbf8ed4e 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/AuthorityManagerPane.java @@ -1,7 +1,7 @@ package com.fr.design.remote.ui; import com.fr.design.dialog.BasicPane; - +import com.fr.design.i18n.Toolkit; import com.fr.report.DesignAuthority; import javax.swing.BorderFactory; @@ -23,7 +23,7 @@ public class AuthorityManagerPane extends BasicPane { @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager"); + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Authority_Manager"); } public void populate(DesignAuthority[] authorities) { diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java index bb3f222b9..6c4037145 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java @@ -208,10 +208,23 @@ public class UserManagerPane extends BasicPane { BorderLayout.CENTER); } + public void populate(List addedMembers) { + + // 已选信息 + resetAddedMembers(); + this.addedMembers.addAll(addedMembers); + + // 刷新右侧面板 + addToAddedMemberList(); + + // 刷新左侧展示信息 + addToMemberList(); + } + @Override protected String title4PopupWindow() { - return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Add_Member"); + return Toolkit.i18nText("Fine-Design_Basic_Remote_Design_Choose_Member"); } private JPanel createLeftPanel() { diff --git a/designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@1x.png b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@1x.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@1x.png rename to designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@1x.png diff --git a/designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@2x.png b/designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@2x.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Permission_Manager_normal@2x.png rename to designer-base/src/main/resources/com/fr/design/remote/images/icon_Remote_Design_Auth_Manager_normal@2x.png From 95c9de86aab052dde404fcd9fa03de1e1b0fb82f Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 5 Sep 2018 11:34:34 +0800 Subject: [PATCH 37/77] =?UTF-8?q?REPORT-10390=20=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E4=BA=A4=E4=BA=92=E4=BF=AE=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/EnvChangeEntrance.java | 173 +++++++++ .../fr/design/actions/file/EditEnvAction.java | 6 +- .../design/actions/file/SwitchExistEnv.java | 69 +--- .../tabledata/ResponseDataSourceChange.java | 4 +- .../com/fr/design/mainframe/TemplatePane.java | 345 +----------------- .../main/java/com/fr/env/RemoteEnvPane.java | 2 +- 6 files changed, 192 insertions(+), 407 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java diff --git a/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java new file mode 100644 index 000000000..9ad3b4ab1 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/EnvChangeEntrance.java @@ -0,0 +1,173 @@ +package com.fr.design; + +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.env.DesignerWorkspaceGenerator; +import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.TemplateTreePane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; +import com.fr.design.utils.DesignUtils; +import com.fr.env.EnvListPane; +import com.fr.general.GeneralContext; +import com.fr.license.exception.RegistEditionException; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.EnvChangedListener; +import com.fr.workspace.WorkContext; +import com.fr.workspace.WorkContextCallback; +import com.fr.workspace.Workspace; +import com.fr.workspace.connect.AuthException; + +import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import java.util.HashMap; + +import static javax.swing.JOptionPane.ERROR_MESSAGE; + +public class EnvChangeEntrance { + + private String currentEnvName = ""; + + public static EnvChangeEntrance getInstance() { + return HOLDER.singleton; + } + + private static class HOLDER { + private static EnvChangeEntrance singleton = new EnvChangeEntrance(); + } + + + private EnvChangeEntrance() { + currentEnvName = DesignerEnvManager.getEnvManager().getCurEnvName(); + GeneralContext.addEnvChangedListener(new EnvChangedListener() { + @Override + public void envChanged() { + currentEnvName = DesignerEnvManager.getEnvManager().getCurEnvName(); + } + }); + } + + private boolean envListOkAction(EnvListPane envListPane) { + final String selectedName = envListPane.updateEnvManager(); + return switch2Env(selectedName); + } + + + /** + * 切换到新环境 + * + * @param envName 新工作环境名称 + * @return 是否成功 + */ + public boolean switch2Env(final String envName) { + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); + + try { + Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv); + boolean checkValid = workspace != null && selectedEnv.checkValid(); + if (!checkValid) { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), + UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + return false; + } + WorkContext.switchTo(workspace, new WorkContextCallback() { + @Override + public void done() { + DesignerEnvManager.getEnvManager().setCurEnvName(envName); + DesignUtils.refreshDesignerFrame(); + JTemplate template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (template != null) { + template.refreshToolArea(); + } + DesignTableDataManager.fireDSChanged(new HashMap()); + } + }); + + } catch (AuthException | RegistEditionException e) { + // String title = Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"); + // String title = Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote"); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), + UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + return false; + } catch (Exception exception) { + FineLoggerFactory.getLogger().error(exception.getMessage(), exception); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), + UIManager.getString("OptionPane.messageDialogTitle"), ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + return false; + } + TemplateTreePane.getInstance().refreshDockingView(); + DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); + if (model != null) { + model.envChanged(); + } + return true; + } + + /** + * 编辑items + * + * @see EnvChangeEntrance#chooseEnv() + * @deprecated use {@link EnvChangeEntrance#chooseEnv()} + */ + @Deprecated + public void editItems() { + chooseEnv(); + } + + /** + * 出现对话框,选择使用的工作环境 + */ + public void chooseEnv() { + final EnvListPane envListPane = new EnvListPane(); + final BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame())); + + envListPane.populateEnvManager(currentEnvName); + envListDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + envListDialog.dispose(); + envListOkAction(envListPane); + } + + @Override + public void doCancel() { + + envListDialog.dispose(); + } + }); + envListDialog.setVisible(true); + } + + /** + * 处理异常 + */ + public void dealEvnExceptionWhenStartDesigner() { + final EnvListPane envListPane = new EnvListPane(); + envListPane.populateEnvManager(currentEnvName); + BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame())); + envListDialog.addDialogActionListener(new DialogActionAdapter() { + + @Override + public void doOk() { + + if (!envListOkAction(envListPane)) { + System.exit(0); + } + + } + + @Override + public void doCancel() { + System.exit(0); + } + }); + envListDialog.setVisible(true); + } + +} diff --git a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java index f8b185a09..a4b7c8803 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/EditEnvAction.java @@ -1,12 +1,11 @@ package com.fr.design.actions.file; +import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; -import com.fr.design.mainframe.TemplatePane; import java.awt.event.ActionEvent; - public class EditEnvAction extends UpdateAction { @@ -16,7 +15,6 @@ public class EditEnvAction extends UpdateAction { @Override public void actionPerformed(ActionEvent e) { - TemplatePane.getInstance().editItems(); - + EnvChangeEntrance.getInstance().chooseEnv(); } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java index d79df8d2c..2b55da479 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/SwitchExistEnv.java @@ -2,30 +2,15 @@ package com.fr.design.actions.file; import com.fr.base.BaseUtils; import com.fr.design.DesignerEnvManager; +import com.fr.design.EnvChangeEntrance; import com.fr.design.actions.UpdateAction; -import com.fr.design.data.DesignTableDataManager; -import com.fr.design.data.tabledata.ResponseDataSourceChange; -import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; -import com.fr.design.utils.DesignUtils; -import com.fr.license.exception.RegistEditionException; -import com.fr.log.FineLoggerFactory; -import com.fr.workspace.WorkContext; -import com.fr.workspace.WorkContextCallback; -import com.fr.workspace.Workspace; -import com.fr.workspace.connect.AuthException; -import javax.swing.JOptionPane; -import javax.swing.UIManager; import java.awt.event.ActionEvent; -import java.util.HashMap; import java.util.Iterator; -import java.util.Map; public class SwitchExistEnv extends MenuDef { @@ -37,7 +22,6 @@ public class SwitchExistEnv extends MenuDef { } private void initMenuDef() { - // ButtonGroup group = new ButtonGroup(); Iterator nameIt = DesignerEnvManager.getEnvManager().getEnvNameIterator(); while (nameIt.hasNext()) { String name = nameIt.next(); @@ -48,7 +32,8 @@ public class SwitchExistEnv extends MenuDef { this.addShortCut(new EditEnvAction()); } - public static class GetExistEnvAction extends UpdateAction implements ResponseDataSourceChange { + public static class GetExistEnvAction extends UpdateAction { + public GetExistEnvAction() { } @@ -67,60 +52,14 @@ public class SwitchExistEnv extends MenuDef { } } - /** - * 响应数据集改变 - */ - public void fireDSChanged() { - fireDSChanged(new HashMap()); - } - - /** - * 响应数据集改变 - * - * @param map 数据集 - */ - public void fireDSChanged(Map map) { - DesignTableDataManager.fireDSChanged(map); - } - /** * 动作 * * @param e 事件 */ public void actionPerformed(ActionEvent e) { - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); final String envName = getName(); - DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(envName); - Workspace workspace; - try { - workspace = DesignerWorkspaceGenerator.generate(selectedEnv); - boolean checkValid = workspace == null ? false : selectedEnv.checkValid(); - if (!checkValid) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - return; - } - WorkContext.switchTo(workspace, new WorkContextCallback() { - - @Override - public void done() { - - DesignerEnvManager.getEnvManager().setCurEnvName(envName); - DesignUtils.refreshDesignerFrame(); - HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().refreshToolArea(); - fireDSChanged(); - } - }); - } catch (AuthException exception) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - } catch (RegistEditionException exception) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } + EnvChangeEntrance.getInstance().switch2Env(envName); } } } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/ResponseDataSourceChange.java b/designer-base/src/main/java/com/fr/design/data/tabledata/ResponseDataSourceChange.java index e995d9cce..58daf1cc9 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/ResponseDataSourceChange.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/ResponseDataSourceChange.java @@ -14,12 +14,12 @@ public interface ResponseDataSourceChange { /** * 响应数据集改变 */ - public void fireDSChanged(); + void fireDSChanged(); /** * 响应数据集改变 */ - public void fireDSChanged(Map map); + void fireDSChanged(Map map); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/TemplatePane.java b/designer-base/src/main/java/com/fr/design/mainframe/TemplatePane.java index 452c876ff..bb5b3dab8 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/TemplatePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/TemplatePane.java @@ -1,344 +1,19 @@ package com.fr.design.mainframe; -import com.fr.base.BaseUtils; -import com.fr.design.DesignModelAdapter; -import com.fr.design.DesignerEnvManager; -import com.fr.design.dialog.BasicDialog; -import com.fr.design.dialog.DialogActionAdapter; -import com.fr.design.env.DesignerWorkspaceGenerator; -import com.fr.design.env.DesignerWorkspaceInfo; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.TemplateTreePane; -import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.utils.DesignUtils; -import com.fr.env.EnvListPane; -import com.fr.general.GeneralContext; -import com.fr.general.IOUtils; -import com.fr.license.exception.RegistEditionException; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.EnvChangedListener; -import com.fr.workspace.WorkContext; -import com.fr.workspace.WorkContextCallback; -import com.fr.workspace.Workspace; -import com.fr.workspace.connect.AuthException; +import com.fr.design.EnvChangeEntrance; -import javax.swing.BorderFactory; -import javax.swing.Icon; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.GradientPaint; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; +/** + * @see EnvChangeEntrance + * @deprecated use {@link EnvChangeEntrance} + */ +@Deprecated +public class TemplatePane { -//TODO: august TemplatePane和TemplateTreePane最好合并成一个类 -public class TemplatePane extends JPanel implements MouseListener { - - private static final long NUM = 1L; - - private static int NUM200 = 200; - - public static TemplatePane getInstance() { - - return HOLDER.singleton; + public static EnvChangeEntrance getInstance() { + return EnvChangeEntrance.getInstance(); } - private static class HOLDER { - - private static TemplatePane singleton = new TemplatePane(); - } - - private static final long serialVersionUID = 2108412478281713143L; - - public static final int HEIGHT = 23;// 最好和日志的高度统一 用同一个变量 - - private static javax.swing.Icon leftIcon = BaseUtils.readIcon("/com/fr/design/images/docking/left.png"); - - private static javax.swing.Icon rightIcon = BaseUtils.readIcon("/com/fr/design/images/docking/right.png"); - - private boolean isExpanded = false; - - private UIButton editButton; - - private UILabel envLabel; - private TemplatePane() { - - super(); - this.initComponents(); - this.setFocusable(true); - this.addMouseListener(this); - isExpanded = DesignerEnvManager.getEnvManager().isTemplateTreePaneExpanded(); - TemplateTreePane.getInstance().setVisible(isExpanded); - TemplateTreePane.getInstance().setVisible(true); } - - private void initComponents() { - - GeneralContext.addEnvChangedListener(new EnvChangedListener() { - - public void envChanged() { - - setJLabel(DesignerEnvManager.getEnvManager().getCurEnvName()); - } - }); - this.setLayout(new BorderLayout(25, 0)); - editButton = new UIButton(BaseUtils.readIcon("/com/fr/design/images/control/control-center2.png")) { - - private static final long serialVersionUID = NUM; - - @Override - public Point getToolTipLocation(MouseEvent event) { - - return new Point(25, 2); - } - }; - editButton.setOpaque(false); - editButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 10)); - editButton.setMargin(null); - editButton.setCursor(new Cursor(Cursor.HAND_CURSOR)); - editButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Env_Configure_Workspace")); - this.add(new UILabel(" "), BorderLayout.WEST); - this.add(editButton, BorderLayout.EAST); - editButton.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent evt) { - - editItems(); - } - }); - envLabel = new UILabel(); - envLabel.setForeground(new Color(102, 102, 102)); - setJLabel(DesignerEnvManager.getEnvManager().getCurEnvName()); - this.add(envLabel, BorderLayout.CENTER); - } - - /** - * 是否可扩展 - * - * @return 同上 - */ - public boolean IsExpanded() { - - return this.isExpanded; - } - - public void setExpand(boolean b) { - - this.isExpanded = b; - this.repaint(); - } - - private boolean envListOkAction(EnvListPane envListPane) { - - final String selectedName = envListPane.updateEnvManager(); - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); - DesignerWorkspaceInfo selectedEnv = envManager.getWorkspaceInfo(selectedName); - try { - Workspace workspace = DesignerWorkspaceGenerator.generate(selectedEnv); - boolean checkValid = workspace == null ? false : selectedEnv.checkValid(); - if (!checkValid) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Switch_Workspace_Failed"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - return false; - } - WorkContext.switchTo(workspace, new WorkContextCallback() { - @Override - public void done() { - DesignerEnvManager.getEnvManager().setCurEnvName(selectedName); - DesignUtils.refreshDesignerFrame(); - } - }); - JTemplate template = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - if (template != null) { - template.refreshToolArea(); - } - setJLabel(selectedName); - } catch (AuthException e) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Connect_Auth_Failed"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - return false; - } catch (RegistEditionException e) { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Lic_Does_Not_Support_Remote"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - } catch (Exception exception) { - FineLoggerFactory.getLogger().error(exception.getMessage(), exception); - } - TemplateTreePane.getInstance().refreshDockingView(); - DesignModelAdapter model = DesignModelAdapter.getCurrentModelAdapter(); - if (model != null) { - model.envChanged(); - } - return true; - } - - /** - * 编辑items - */ - public void editItems() { - - final EnvListPane envListPane = new EnvListPane(); - final BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame())); - - envListPane.populateEnvManager(envLabel.getText()); - envListDialog.addDialogActionListener(new DialogActionAdapter() { - - public void doOk() { - - envListOkAction(envListPane); - } - - public void doCancel() { - - envListDialog.setVisible(false); - } - }); - envListDialog.setVisible(true); - } - - private void setJLabel(String name) { - - DesignerWorkspaceInfo config = DesignerEnvManager.getEnvManager().getWorkspaceInfo(name); - if (config != null) { - switch (config.getType()) { - case Remote: { - envLabel.setIcon(IOUtils.readIcon("com/fr/design/images/data/bind/localconnect.png")); - break; - } - case Local: { - envLabel.setIcon(IOUtils.readIcon("com/fr/design/images/data/bind/distanceconnect.png")); - break; - } - } - } - - envLabel.setText(name); - envLabel.repaint(); - } - - @Override - public Dimension getPreferredSize() { - - return new Dimension(250, HEIGHT); - } - - @Override - public void paintComponent(Graphics g) { - - super.paintComponent(g); - paintBackgroundIcon(g); - } - - private void paintBackgroundIcon(Graphics g) { - - int w = this.getWidth(); - int h = this.getHeight(); - Graphics2D g2d = (Graphics2D) g; - Color lightColor = new Color(226, 230, 234); - Color darkColor = new Color(183, 188, 195); - GradientPaint gp = new GradientPaint(1, 1, lightColor, 1, h - 1, darkColor); - g2d.setPaint(gp); - g2d.fillRect(1, 1, w - 2, h - 1); - g2d.setColor(lightColor); - g2d.drawLine(0, 2, 0, h - 1); - g2d.setColor(darkColor); - g2d.drawLine(w - 1, 2, w - 1, h - 1); - Icon icon = !isExpanded ? leftIcon : rightIcon; - icon.paintIcon(this, g2d, 4, 4); - - } - - /** - * 鼠标点击 - * - * @param e 事件 - */ - @Override - public void mouseClicked(MouseEvent e) { - - } - - /** - * 鼠标按下 - * - * @param e 事件 - */ - @Override - public void mousePressed(MouseEvent e) { - - if (e.getX() < NUM200) { - isExpanded = !isExpanded; - TemplateTreePane.getInstance().setVisible(isExpanded); - this.setExpand(isExpanded); - DesignerEnvManager.getEnvManager().setTemplateTreePaneExpanded(isExpanded); - } - } - - /** - * 鼠标放开 - * - * @param e 事件 - */ - @Override - public void mouseReleased(MouseEvent e) { - - } - - /** - * 鼠标进入 - * - * @param e 事件 - */ - @Override - public void mouseEntered(MouseEvent e) { - - } - - /** - * 鼠标离开 - * - * @param e 事件 - */ - @Override - public void mouseExited(MouseEvent e) { - - } - - /** - * 处理异常 - */ - public void dealEvnExceptionWhenStartDesigner() { - - final EnvListPane envListPane = new EnvListPane(); - envListPane.populateEnvManager(envLabel.getText()); - BasicDialog envListDialog = envListPane.showWindow(SwingUtilities.getWindowAncestor(DesignerContext.getDesignerFrame())); - envListDialog.addDialogActionListener(new DialogActionAdapter() { - - public void doOk() { - - if (!envListOkAction(envListPane)) { - System.exit(0); - } - - } - - public void doCancel() { - - System.exit(0); - } - }); - envListDialog.setVisible(true); - } - } + diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index 31cbabd14..9cdc2ae83 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -587,7 +587,7 @@ public class RemoteEnvPane extends BasicBeanPane { message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); okButton.setEnabled(false); - dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(RemoteEnvPane.this), Toolkit.i18nText("Fine-Design_Basic_Datasource_Test_Connection"), true); + dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(RemoteEnvPane.this), UIManager.getString("OptionPane.messageDialogTitle"), true); dialog.setSize(new Dimension(268, 118)); okButton.setEnabled(false); From cb3c30bfda36f7ddb728ea601e0b63934d715f1a Mon Sep 17 00:00:00 2001 From: zack Date: Wed, 5 Sep 2018 15:46:02 +0800 Subject: [PATCH 38/77] =?UTF-8?q?REPORT-11091=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=8D=A2=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/com/fr/design/images/bbs/bbs.png | Bin 350 -> 272 bytes .../resources/com/fr/design/images/bbs/bug.png | Bin 560 -> 352 bytes .../com/fr/design/images/bbs/center.png | Bin 217 -> 199 bytes .../com/fr/design/images/bbs/demand.png | Bin 505 -> 379 bytes .../com/fr/design/images/bbs/help.png | Bin 348 -> 225 bytes .../com/fr/design/images/bbs/need.png | Bin 362 -> 326 bytes .../com/fr/design/images/bbs/question.png | Bin 543 -> 600 bytes .../com/fr/design/images/bbs/sign.png | Bin 340 -> 388 bytes .../com/fr/design/images/bbs/solution.png | Bin 407 -> 309 bytes .../com/fr/design/images/bbs/video.png | Bin 450 -> 449 bytes .../design/images/poly/toolbar/Chart-Map.png | Bin 423 -> 473 bytes .../images/poly/toolbar/ChartF-Column.png | Bin 185 -> 143 bytes .../images/poly/toolbar/ChartF-Comb_Chart.png | Bin 381 -> 379 bytes .../images/poly/toolbar/ChartF-Donut.png | Bin 527 -> 643 bytes .../images/poly/toolbar/ChartF-Funnel.png | Bin 314 -> 314 bytes .../images/poly/toolbar/ChartF-Gantt.png | Bin 204 -> 156 bytes .../design/images/poly/toolbar/ChartF-Gis.png | Bin 800 -> 638 bytes .../images/poly/toolbar/ChartF-Meter.png | Bin 559 -> 629 bytes .../design/images/poly/toolbar/ChartF-Pie.png | Bin 424 -> 576 bytes .../images/poly/toolbar/ChartF-Radar.png | Bin 1002 -> 808 bytes .../images/poly/toolbar/ChartF-Range_Chart.png | Bin 237 -> 188 bytes .../images/poly/toolbar/ChartF-Stock.png | Bin 221 -> 172 bytes .../images/poly/toolbar/ChartF-XYScatter.png | Bin 329 -> 405 bytes .../images/poly/toolbar/Chart_BubbleChart.png | Bin 503 -> 581 bytes .../images/poly/toolbar/FR-Chart-Bit_Map.png | Bin 423 -> 523 bytes .../poly/toolbar/Plugin-ChartF_NewArea.png | Bin 439 -> 422 bytes .../poly/toolbar/Plugin-ChartF_NewBar.png | Bin 3856 -> 144 bytes .../poly/toolbar/Plugin-ChartF_NewPie.png | Bin 424 -> 718 bytes .../toolbar/Plugin-ChartF_VerticalLine.png | Bin 548 -> 580 bytes .../images/poly/toolbar/Poly-Report_Block.png | Bin 206 -> 125 bytes .../fr/design/images/form/toolbar/treeMap.png | Bin 269 -> 181 bytes 31 files changed, 0 insertions(+), 0 deletions(-) diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/bbs.png b/designer-base/src/main/resources/com/fr/design/images/bbs/bbs.png index 4fd2df684a17c4a4afb897fee8df67bd58c41f10..7fa4a98993ed89d2494f2d174fd81792db57a77f 100644 GIT binary patch delta 232 zcmV0+0fbFn<8bNkl8HN09vY??3i4Ffgt;bLLb7x_S&3AZtE+`0(pTj~;zfR#sm9=g*%m zY%W1D09`Z8HhhM_4Zx+DkRf0L2x-P=2&0LKNx}dB4E-QQXJOBt!5XMA17NhVvB`fB zn~{;B5GKX|6NC%kVIZqz!lRBTDHdF+kZl2}!R0-?E&yr5r4eQ^UISo?@X-_-fD#7i i{zkSLpB%C}lGy-i=yD=Y*3Se000003m{l5()&CJSJ^{8L`9yXY#2MvrrkoBM#AeHmN4=6c-;s1X{WJPc` zBjbG_yWrUriA^vuumQ5UFO~oO`!@+_qZdp99}U#BjfsgV?|<=R@w<#tIWJ2X8UD2Z zoy?9;6S^GGOFtPHnW}*Xy!Z`tG7Gu_qWFxAf0)SD46*@eF%wZX;Za1f0l59n$Z(j6 zk?9i1@_+yT=`s9gu*K#O>;^D0ev;G`cRriW_#33jc;oe>6M;n{Fnk zAQzAZ*&+z#TLS6ZXjl&_#|WewfY=zy2U8$}wgB;2AQl3PU?)JDK`wa!#L_^F0@#4O zoj{E4baehxpc(}r1_PKEK%8GdycH~pAQl3dsR%BZbsk7QfPaZ08vqkSrau5V&yfYt z*(^|jDj+Qh#QNw8u<*5kVv~XRHxReMT<{Ob`3uBwvicCUzLe0J#PqIDjmPZh#X|5){|?fE+GKXQ0G4APxlLY9M|C#4s=X1hN+a zu`dvR1ma>K#xVe!fg)*0qRc=xFA#G8F*}mD1(1CYh(XDpasU9xCq6T^m83%e0000< KMNUMnLSTZ9N_buX delta 522 zcmV+l0`>ji0m)QqB%{j3!pvP^es?E#f9g-l}lVtsUs9uIM&(0e6I?151N_Sc;wX~9UBkv}Csv9PGq6#x@rIVF! z*9#kpK_#lB#38W{LrzXpz8hw7$-`#yQiMjZtg00000 MNkvXXt^-0~f~TMTKmY&$ diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/center.png b/designer-base/src/main/resources/com/fr/design/images/bbs/center.png index 1d464ba9bf78c8a4d75ed85ca61e30a938b3367a..c5ccd688d85b421aff358284d75d639b4d3bb731 100644 GIT binary patch delta 158 zcmV;P0Ac^x0mlK5F@J$cL_t(I5v`KZ3BVu>L}TejW{P%RJB1VV#~L9J)L4TGLQL+C zrwFind5||E&DRO36R6-nsKHLS;(Gcg5`jdu<2hjlHnS`pcmDpAL1@7@^6GLlK=n! M07*qoM6N<$g2=E(^#A|> delta 176 zcmV;h08jtN0oehNF@KXuL_t(I5o2IL1B!Xic7rgQFas`e7IcL_|1!Fui-GvK#2KZt zpKtxoz~F^V6Cp8128L}+=$cu9BCO1qTCs_P^kR77_dlSySO6|@CM;@65<)TH*;GkJ z5QdpRh!0YSVgO7dDKw*0_H$rZkPj$!0g3^H{ERLSayN+ diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/demand.png b/designer-base/src/main/resources/com/fr/design/images/bbs/demand.png index b237026fa19ab0919af7d6885b79ec750ead5a2d..cf115b543f16255f2d3da7e4e8d3de9d67e34001 100644 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R5%f(l0QpAQ5eRhnuI_tXl@J=H$kE$T1v>ImcYruPayQi$+e+R&}1$x z4lNagEzRQIXUM{#A%pxqa^K6j$19ON@bkRqT%PCL>-#1W|J0)A-(-IcCoqIpaJ9!~ z0p8q0tFsgjkcK6=ffAVN6hH6*c{{XK=6jIYq_-;vn+oebe1byWVI4xXsJ7q|mSGJ{ zXB0BMfQ5Wf=OEN7RS!;~0}7MOtN=IUX!6wiQAi&Sf^*-jfD!Bl&tsQla5~Ezd$XVP zo4Ja??M}qM!>$4L&Gy>v&FYR?T!e^L*nPtlT!3%ZA8XywoZLY~>b2dhkaIW&P2M4> zI~yQnU@G92Lkk#CTc10kn6e7I$GAWY*;VSqgcAxy&>tHl5S002ovPDHLkV1k}ls9FF3 literal 505 zcmVPx$vq?ljR5%gMQn5+{K@gp}L_I+pAsS60LK?BNv$3+s2Pk5tAYzkTKtY1ooQ;TG zAe|xpfR)xFSZgCTB3NiJcZ#J3qujW&$($E*v9NL>H@h=$-@JJnfIqAWo6MBursXQi zCYh}j2w{r=F3m{a`h9WeL2AL6$T>SiPynFFXe=JPvhm$u027$TKm`ErfFSen)lmDc zYeo?aBH}d@FiMlKf;zpOsPm-0iZpB6q-*-z`XnrOSv8pkG!6_vTWV3>@CZPZk))E_ zTYhm5iD*rARAm57;L#pMBXdv1*sWkW>Tc`-0-hm4Ly8{IYAWZJ6%qbMz2AT*d_grNa~mqK$-;+&P(hJ|gf|en7@?wKTjaqe)(3hk2<@Fcno&02~$Jf{Yf- z%f3xXa)bJ*;hqxEoB)DRy-4M;G~$~rHD5^>fq}Tq7X=(NTXG!r6L%x1mg4*Dks1ZW z>=qGw=PPO|`E;z{2&{k!xC@)fBXlUrJ2uyOX%dX|oU8vxT_*wr8lgU+L>|sd-H+qe v>r^7|gc>R!{rpyKcP#7NsNa(0|4;k|hXT$$t6Mr)00000NkvXXu0mjf!kO18 diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/help.png b/designer-base/src/main/resources/com/fr/design/images/bbs/help.png index c13f2f1926471fbce07f6f9037d63a3b5fcecca5..796d7da6c9b507d265ddbd5b96c2df2f3ec78440 100644 GIT binary patch delta 185 zcmV;q07n1Z0^tFWFn<7>Nkl0leN^>n91;1J zvWzXCCV<#PzV;^6z;*@M*O(d7BlIGBvDGv|OYZeFfqyO&*D_kR{|08%peKM3NDXdD naOEXRMr0t)c|^&_*^iSIbiFS7L1#+m00000NkvXXu0mjfFg8;^ delta 309 zcmV-50m}a20o($RFn<9SNkl`;E$|+I?V#IVg4o^Bj|4HV`DDxf?zJQrK})QoDUy00000NkvXX Hu0mjf+a-zg diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/need.png b/designer-base/src/main/resources/com/fr/design/images/bbs/need.png index 486ff9846a97e1f055c47597dab82dd6bdbd4b8a..2c95e50ee47a2e9ae5f61040cc92a37816fdb899 100644 GIT binary patch delta 286 zcmV+(0pb4Y0>%Q6F@FF_L_t(I5o2JW5HN!D8ylPaC&iqzXU~B3!S#@00J>ThxG6-q z1jA;a9wuZ1$YGj-GAtsu~~p(05%2ahM@CN48Z0BOhXy3Asd2X0H$JO zr4Tj;2b-&@sj1b!e+)|*7?^`m48T;5DiRtR%6$L+{T`sG9Df4?V;2+CUsa-`5vqCd z|Njh;Ky1y($S8FB^y!sE8Gx)AeZ|N zg83iRYdLKjyD0Knx_a9tw2@c;k-07*qoM6N<$f{D?9Jpcdz delta 322 zcmV-I0logl0_p;gF@GdUL_t(I5o2H=5~vk_5|Pe%u~#Plr5>^tMq~~yHc0c=AK&)= zXZR1&{Dz5z$@$4d@k=1}Ot>_`#L+Z^ghl@U{ofCh$7=u<%?ykTjF-6Cxx!%v;Pe7c z%^Y0Lw|e>Bzzl%9;Q#;sD}mS^BtfiZkXpC_K=w2sUUl`+AAdij00XIkI2+Aoumq5R z8^FlOc<|cezp0W!jBCwRSm03w_A?I6AVZj8CV`wi@8HJ;=N|l$oRuudaQ@*hhNtiT zU*g828Kf5;h|<|FE<)p(!9spJ#9X2W!i*Y=T*WjfQ&xrWvH@z>% diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/question.png b/designer-base/src/main/resources/com/fr/design/images/bbs/question.png index c8c6fd8a1bb4dc0866dca76639c331a1ab39d8a2..ffdbdacb8fd1045344c1f85dcc9d5c84000b453d 100644 GIT binary patch delta 588 zcmV-S0<-;}1lR~41^@s6AM^iV00001b5ch_0Itp)=>Px%5=lfsR5%f(Q%!3W zK@jcknZXz*Cp|=S@emA(AhBmR6FfMGIf<;`A5a7pMDXiZgqUa`#DfmQyolg5P=|#~TF#RkH51pZQ zYzs=Mhv@koC4al3`5Mju*FVLWxC3qxRnHNZWvw?5OkECGm%tmI=RJ3}-4}!qtIcNf zTc@+Lg@li&db;F=V2I@n^8Eog?fd?RG9b%#4rB6$eAjP(1_I5J4}xH?+x=x<$ld@G z7Wf@31IlD6<2hrBEzIUxmSuY-4*`UmF8Sp%ekqD#wtoy5p2d<7d>OOZ7-E=eo}YxM z6|@3yUTdwdRD;L{{t1;fM{%v$bzmvsRsaKBMEIpBny(W`OUj!8u%F;Ohq%37uU~+5 z74QlnR-n~teTRA1nBFS{%oE}JyEK#Y{XUx_pH>{l$F(*uAbj8D3}-;^yN!NtAmF8x zwI{fGWJS#ES@-Tvpw}}eV2xwQ__*Bq>(7MGbrRG)^m!RGn1RqAEe!HBiao$^pAP(g aKYjxQU(qh^PTJN00000Px$*-1n}R5%fpQ$0vr zK@gtVcTe=L38Lp8!9!9Q@G7emu}`BA5TamrMM5;#gftdfN*WCu2nG^NA$GAA8x7bB z5fnL4ksNo?VC4@yZ^v)m`Q)AM37KYR=li~$*_mCYd)D>7{C|Q;a>Dddh&mN!q9O}z z3h~!J`L?aN1X$HFAOE%omz7x&9wUO>X)Mh0!*B9F9ez%iloArVCr_UTL9l^+OHB8R zjafwIa}hg)YH;wKo%+5%a5UGl%b96u3{J|wh2&WTGx0Vzm|+{(?>OKp;U^}puY(y8 z8jf)aersFSOMmsfn}B#E0(3RZ^CY$(0?pb3|B{(^uzwZfHQS5xe+dNM#Dbw~iKdX* zug3M>yk^Db?(@)qkp%A6`v4G0As!m4d5g?xH1{={TSHZ?R#4xVe-hb!OS}%TaS;v1 zu;&6a2J8%3#!1{_)f!Z_T<-t~`+#NZBT2aGNNGvAs?kvRl;fP}Gg+2V^r!I_Ll^nmqn{~$i26@I zl!hu5!5BlkDCRp-w|>pyoUJmBzqGG*_2&Qp diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/sign.png b/designer-base/src/main/resources/com/fr/design/images/bbs/sign.png index b1556f7ed13d46cccba615faa4fa305437010f30..c48caf0152dd4e8472d054ae7bfebefedd168cdb 100644 GIT binary patch delta 348 zcmV-i0i*uZ0)zvQF@HWuL_t(I5o2JW5HN!Do0ynv{r{iAi;!82j11e(oH^r-q0ZRY zQRqbAhR;slmU03=7VlJ#9dg z3lLsoY`3(ul>YVW&lX0;|8*cQp%{Qrh|RYQ48p>Kt?%BwKYt9AT?CBIc_39x*p*_6 zHZ(Lay?y(B1u(tbK6B<&HB1Fg1B{K$GCVy!*p|Q-47E-@d8W` zL<7}$y?*^V2uGPW1$mTzBHE%bsZzeSW0000HhR diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/solution.png b/designer-base/src/main/resources/com/fr/design/images/bbs/solution.png index f092306746f5119954551da83e85afd96e3b2efe..f22f85d2385c66585f608a7eb6fa618f387a102b 100644 GIT binary patch delta 270 zcmV+p0rCEq1GNH>Fn<8=Nkl=^jT<-tBQSv*7>zE$ z0P^gkaSo*Q+EUwws|iX%diVc-KYD2Z`13)%zbsek8>j1TCdXwyfK(_2kMgMy_eHHu z@)IGolhN}~n+wuoh!7Ce5&(}uKbA%#&p#{xQS9lxj&#GAOHXW delta 368 zcmV-$0gwK*0+$1jFn)?v=;Y(N?8NO<+YhkMGPy#$P*^7btE|jT zF1kPEn8-GKXlXSCVHcI2vV09th^|q@M^$y+5RF}gb{x%bbswvgzR+T5*k>8tXgnVx z@;w4gp4v&+_an(nv7W8rRnf#Fu=`z2TDJbz&jeDtkuAtx)+LNXx?w;6fqcV3Vvzg* O0000bB diff --git a/designer-base/src/main/resources/com/fr/design/images/bbs/video.png b/designer-base/src/main/resources/com/fr/design/images/bbs/video.png index 1971f2615664186ab99617abff9f0a6a2eddd73d..7178b11a02b5ae9c8a2a6c459b37c002aa758a49 100644 GIT binary patch delta 410 zcmV;L0cHNe1Hl83F@JkWL_t(I5v5bTO2beTJ~zR(gBctP=~O2j9Fp6?Y~mmY`V0~W zAHcykaPblB4k95J?HyA&R>YuJfhC` zJkLtg>7@{KqLkW3TnO={6g_l0t((zklvFuJ^)VO>4knZ7n}7Col`=0ZYqN_FHhhQy zQ{|L40*>RxD*+nWgegiu+E6zPaUO=@OR3smKx8&kx9xUo59Jgkpk`g;bDiwEGIX5% zepLq;V8MZ(dvHo*4y!=ex`~n~i=>oC%Q16^Cd0Q7P<_kld@O_brM7g+kB%d+*aIw2 zh%?~W%G)rg9DjM1Wu?6k5Z_6X?l!Z-Fr{IF5hduOI9HFs5mo1wrtMc-ag*cu6p4 zjFl%d?@#XQ(H+*8ZAkzk{4;4&?}jRt=)a!{oVCs$DicV#ErNSc5dZ)H07*qoM6N<$ Ef;`i~!~g&Q delta 411 zcmV;M0c8Hc1HuE4F@JnXL_t(I5tWl)O2a@9#%H!kL?|furxa-qU_}r-fuP_4>Iw8g z5J6AS6DUH9FW#UB5Pa|um0lny)nY;Mr8P~)`BGDwZ33E??CgBM-JShrnXIpR(W`}H zJ{FM!60XK+7N40P3Xa_Q*X8ak!bwnTi1#_@UqvFPBw~{J)PJ8jGR(J2E9;lt27eX^Iu`C2`w0m88wds?%2m>;(%DRB3giO?$dG{ zSGG+U@QDpW%nt7^a=G(|L5@APoEo8w;Pi#bQqdjfW#Qz*v#b9CPx$lSxEDR5%f(QqLwD+>&Ufy;=N_VeF8tOXj;6K^lVgXh zv1AXNZv_V9T(&cW=X{03QFn&eTl~;)0>fv;n%EU{JJKF6-9Ng{Jac#+@KnnpybEHD zxPzHOM#FT56U5xc%Vh}MwmT7yI#+V6x`2@L3xXpXlqe~M_la-|%bGbH#=U`|SrzkP(EP45 z>KP{CoBcT3gM8+EoD^&*0>7wcN~`TX00&C^1Tz_));zP{hnJFCtB-(H`R-IGgwoJP z)pG_(x{OH7Z8U^R_Pi;1@?K30qMUg7Xw;tcxts#QBzc{ryiRwJdpCeCtIF-Bho^MQ z;fQsdoy4z+G9=Rs6iL%IWuImc4=|f`i;7o1NB#J#r(hh3rdkUo{8fAd&W$GbM*7%PAdv;(yQyn<&-5Bc{%3a{qx=e3;^=q;qT;( RG~ECI002ovPDHLkV1nT{trGwM diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Column.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Column.png index 33af5fd2fe22263f74ebea943ea403a298368791..d5e0cbfa7cff6b2fd37478f119999cbe053b5f89 100644 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|JUv|;Lo5W7 zQw}iNtrPv(uX9xXPn+OO{$%5W5>GBM=QD7x^edn9S6DTN?H;$t?grH)Uy-i)VJ$j` orS9)I)RiROBX!__!3UtZ(xFVdQ&MBb@0QXTXRR910 literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP?4Lbi(^Q|t)xHy|JyU$eRw@V zHHHtxEU!~8fyqF>4;>qCIC cgu(%a?B~2E%M|!UfF?3{y85}Sb4q9e0P;0DtN;K2 diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Comb_Chart.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Comb_Chart.png index 9ff66acafd2cceee3bc61885e6482091515711b5..e92444ceb81a998432688a3326e300975b996dca 100644 GIT binary patch literal 379 zcmV->0fhdEP)Px$HAzH4R5%f1V4x5%lBz#+)qmzUpMEc8U}V^~KbdV26DbD#|Noy6sCh2K|NjCa zysRrgdRa&@z1+93>3==KkmX^8eRm1_s96KxaDsXJq&f^y6xf;{OZ`{@h$__M4*^ z-@r73XcRAe`Tx5Y=*^w`Q`yo%k}h+88UADZAI9*HL5G=%%@w5CarRH3SqK0(z z*Z&Ov+<2MTbYap^FTlM46Gx`O20)!YoAEzW>ZTON&maXK*NULn#2@?y#k(*=z|jcQ zAqDj9jJ>I>yI~T<(qI?tPiDLc)X+h!CS-Li5o@AQoVp@p8CItvYeHs|loF9O!q~&W Z000TYW*s^UgWv!F002ovPDHLkV1hLqu|NO- literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|O(Mr;B4q#jT`2|Nq-FFLfw< zmdvQIm7zoaj{kIBhR%%vCoeENtl>Yxp7_XzXG$|?fU`YQA!8^H+b*$`44Wy^3_NYz zBGNo2CX60Wop*LRIP)uTlV Y^^8PW{oP@~z@TIBboFyt=akR{0G#@PqyPW_ diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Donut.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Donut.png index 8fd08de55395ca6267562b755cfb5b2ea32bed8e..51e16365800510e7fbc15764ce474f7c928279a9 100644 GIT binary patch literal 643 zcmV-}0(||6P)Px%JxN4CR5%fJQcY-6K@gtVw|Qx3X@o+g9#jNlr3cZTrP^9SC z1<@u7A{6S$gFgp7Xt9k3q#}Y8MDSD)L@$DuD2PRiiGld?`gWYzcFUuhxy;Tt^UdE5 z!X`OnzJU}M*3ejlrRy?@-lTtGCA;B@tA zrU+!NSR!HoUSgk;g*mcRZbcSSdUSb;)hl^(7fCW!=mc;d%cA{(_n{DI(Hby~5UBLCosv zepVaX7HqSutW<}10kRAJ82q4s&@M&n$k0X6t%MgRw>07WieORsIx)kk8V=08olCiQ zTnqVZ`P?-gb4YNW+@OYg_LK+ihL;HGNXOPvuA{k7;#j_Ab;DEe&P#f#*@zApFx(v- zbV>R9Zaq5r@I3DTpewDX|D#ads4Xel=)nn zeY-x@xEfgT~5ZI|CC=aub7$@8ByXCRQXl`TEZ6 d$b*mZ_`d`C;i2NeXp{f|002ovPDHLkV1klhEHD57 literal 527 zcmV+q0`UEbP)7h-IsGBL*Jo`9`PYz&@2EUnni5{}>zpxn-_w%j>^AvPvf>D6S!1XuVXRh!_Y+C%^g79-Ts+Cbdi1}qE7^FSyC z{zVMO4Vd#b;fb%y^X&$k6sze|DsNo^{}!!U!SzBB^z8I?h0hbM2q`UF9QJ7-&e{RG z_*H~7B?P%28N7XM0l4f0Gh9}>zDDNDT4M$?y!C4`DBS;=YM%}U|F!)HFaS}+qDLhw R*;D`k002ovPDHLkV1j^u;luy{ diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Funnel.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Funnel.png index b838ac93b361b46b17bdeb3a94a8ee2c69ad8476..32cee18154a983fb5ff85f8dc3d19e5c3151b80a 100644 GIT binary patch literal 314 zcmV-A0mc4_P)Px#^hrcPR5%f(kueIwKoCV|2BTFZ2o`qUK`-C|1R+>xBer^2V54ynUFDcVUDP?iYYU!W{CxZym) zKWsiVYBkwS6K3e;-3kRFq}y=QC-q9ox&l+OSjGedtzaW+R&snkWKRZ6Ks1Old4`5m zTjDj0xJ`gkMAgUm#ryR|<`=B%wr|JGJhSI_I|9bd@H)3zK7uxU&s)g%9IW`dtLE3e zWwBohz~SkRR2u{0y=XGE^i)$%Q7Z+g;Eyf`nQKurX)U)eReS9}05=Fa{j%82UH||9 M07*qoM6N<$g1Fd$ng9R* literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP| z9@ld?S1G(A;{(f%gAU8>8G@u&CcJQ45vh@SlqGAYm~tqCvS7+=o0)BPEW5%O!(U!= zXv~&=F}-i%!S&A5#2cpAbv}zp*=(KXuwnr}gKANb5laaFKPi@s&&)Yo9~&4}$Q=q5 z4p3ZiL|f(11*a8Jm$(!YDw;Q?+wi??b#N9gc*)9P!0>#pZTcjgzyhF`7(8A5T-G@y GGywq1^=tb8 diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Gantt.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Gantt.png index 6b651248c31b99ce7b233b9aa23925fbfdc0a58a..f1c6de1854420a9ccd5760f226dcd5b8c406a590 100644 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|!aQ9ZLo5W7 zOXmFjY|kupWB#dg9cnF;PqzfOd2}|KGaO!c;}DCp;3S5laR)eZWAqM)8jI{sc);tx z<$uQ~<{{H1$Bp6!NsP0tFT@6@Y~)_olO)cwhmqmtW5HYTFF$_=+Q8uH>gTe~DWM4f DE(kR# literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP*J3(i(^Q|t)!3{A79urixt?% zPMg@sbl`}CvO$)?Ti&!E|Nq;wu`LzJd9);9*3KEM(_0>$IsU)!q~PRZ?!iY3ypR7d x*qAxz-%APk1JjPFd&kT8iXJ|i(7?dVka(l-$NP%7LqJOyJYD@<);T3K0RT&cM^gX* diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Gis.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Gis.png index 9435a61d7ac083e362e7ebea59f6dd7d7946b960..d4bf13edd536d5a254dc69fd66bf58276e78c644 100644 GIT binary patch literal 638 zcmV-^0)hRBP)Px%I7vi7R5%f(QqOA>Q4pTD`_d$vv`|ZGEK)>h)kvk_p+Z3j!Gj5cNEI!JhhC}& z5vynOALzND_7tJjL(DHoK@Y8mmKZcPO*Er{+&`aTPc;{~<9Kd@>3;=i> zwjbJGtJU7Ne)_um{`#Fw&&HPiy}hlp8ag#ubGr+grj>)ipl%a0+ejo5J+PNScC+tU z_Mrb=d5pYXmH9eItbHWiw~yvVhRAd|QAex;w+MVmu?ZAKvAUrBAJ*p%6w0G)a6olr zV&s?{C;sq0c{es`;L+15B;JB#0M$TrmD>cSX$BB5`eM&J5NP8!t`T!NWmq|JjFix6 zYR$Yj5{X1E**TWxXub5SogO59{?dE6)3>lpR5coLM25Wo<|IPr$~=(WNVa~Vt8hLv zQT4dR?t^g>XxlpG%U6(D5(*`yqv0cmh-7P>)?^=paJqXof3Y_^bA=dF$fFT$>$KI? zDdtCpR!q+Gz`Oxgikv|_@FrmE@;b{~fw-#K|E&V-1GZJnDg*V4l9xe4KL97V-` z6ubbD4^R>qh9Nfqr?nb+oUf;+K!PUdwyQ-w8yvp;&5jj|#gjES_CRC%O>ld<kc6_V^`ch+~}Y*^Dxqir2{n3NsZWf-8S3JtCBkQa1Evx0b}60Sy5Z$W=O7nqwur5QQr~p zySHTgP#4bx_S^JAv7_AsIZM%KRkyRh5b5m-Vk|NYqcMoV09g5*Y#`OPlN(F>Y4Xa< z3$oMES+jQpE7@q1hxDR(zZp2CXVR$EB$`*Z>v~4xixA8buYEsKZuz)W~xwVFNwpu{cCJn ekN2wm5?}!D;|`-?%x%>G0000Px%FG)l}R5%fhQ$1)DQ4pSax4TJDasdNDi!-2wAQ&qx<^Dt)I}gN0^iB{&(8ki( zS{RFvMDH%K(IRP#jbL(jSf`1Foq|cFpd=@VX5Ze9^KIB=6Hf8LGP5)D%{M>qG3`6~ z=Q}6aa+O%li|{zy%<`Fp--;`Z&b5ILu*HXCc9l1v7wS8cknP$)Bnu5WN@C|>JCt=V zB8h_^Fe6i|>XumRg$+mbtzC^sNrn`#AtI$>!>&fv65VF>OqSP}Xp`dHJ&VER1^;vq&LnhbXxPbrN^vxB zbNi<~uD12kqGY8@gJ5zz?|$I>2bF%%A-Mxgu`XkrrQfI&7+_iZoFc>9e;Zemzvui1e|;XC9ZWVp P00000NkvXXu0mjf)^Z~D literal 559 zcmV+~0?_@5P) zK~#9!v{gM$!%z%vA_lfpVqijm!~y6Ha)jKV?Zn#LAgo=|4KX#{87ej=GO)0P6F|k# z2`Sx?!e{iknAaDm5Vd5z{{&6bbap{|ZGzM5*Dj8P9D^f@R^Spm7k<7ts(to> z&trg&aAXFojpQR4z$dOC^neyPa)K_vDYz#x00ewaDHENXHtil$q0iUUdIDKPV0}Mf znsQ#vARlaa%LA@GTx6Y5WAe7xj`hV~eGI9P=z~*b0i{ z-f{kcdKEoh+bWiN92rHI63^Ycrv{b93b&ZfuIH}acBEy3A{L{jmj%alV%o4{Izfw> zFb#(WYwfY-=SHGpp1LMPnYK%E&qXpU%oIHG4CT0qL1D~}mmY)b1(j~_nt|By{ zNeBnv!5=_J1YK#GLWWzL-pv`owx9#EFEWibH0>fqn(=jN=l&N@r)CLFTKBQD;TG(Q xQVYgTkm73i8=GyXi#}-k=k4Uz^dIygzyS24*hWrHBlZ9Q002ovPDHLkV1nQe@)Q67 diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Pie.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Pie.png index 055502cb224920965188d61f01810a7e39b7a2b3..e204e065959cfe7e95687367b4283872c8fb6ba8 100644 GIT binary patch literal 576 zcmV-G0>AxPx$`bk7VR5%fhQcX)#VH7^+^_|;*(>N-P8DSAPDK1?21ELHe`k)V$mIk^IcWzuZ z2CW2JNf0e+A(4*E5Ca8?> zq2o>C%ZYli<3x@~;7=Icc3gmB82B3&7n{KGBK=mMN^8X#mj1<%UEiT#I*v#2szn9H zc4LfJy>#ipXmD{XhIEkZh*(sw!0V0#F~3QsOT(Fl(qbTVF2aQ!<`0I1m%|t)U(K|X z2UU#D{w;>c2(1{;CT1b}yO#vw*7B{S6qXJXWAcD4JvOiI@Mk#p32mp27Y6@Fti|v` z59hDXzjv3|+GJ-^ZH1v!tz0;)vJ*3{oedxW literal 424 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkD0|TR}r;B4q#jT`2|Nq-F>oRcb zaUPx7FWL~oC}7R7@!#K)$Yb&CI*IFca2#Q8s9>6X_apm_FUAiIN|+|>;y?0J!Fi*` z#r9Ko*`v%F7j!qWaXG{;@^4!Ixv{Oe<|#wTU-lS1wW|Rs@-hrj3Jr+{SAPEzIU??n z&)jwJLdU7)PDu=`-AtRhxmV1%#5IApY{8;~d?(mm2VYFs5b1M4#cltbb~Zb=d0YVz zdF68^Ml?%0rm|kR`h%;d|I?+{msO8`JIk`^XQyGw&YNs*YD@O`i#jK!87e-t$dceP z=T7^;q9qBWa|||ku!z!Cfw>awB8Liy|Z5y&NW27_wiol~giZxZqL5 z<9dE?&y7`T3A5%pI4xxPRL6L&q=&b`h^6Ri%hA>ct2o7$xk&qHGH@6$SSM66<{S=a Q0ERMyr>mdKI;Vst03SD>J^%m! diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Radar.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Radar.png index 754781f9fd9af3545d79eda9c8add80f3cd1eda5..e2c400e63ecfb869ec0dc26d305d4613a340413c 100644 GIT binary patch literal 808 zcmV+@1K0eCP)Px%;z>k7R5%fRQ*B67Q5e1-`)qSlHn$~d7ETs9#@H0HtRERF7!lczObsh2sGy)C zA+aFn>t_W;Dky0}{Rqldp@vihu@7RVD^$>+wzcWz+_!hP=ctK+b>O|{z3=n!o^#K+ zH1&_+@p!VL(daz_%Ve@s27@887L{46=yW=*5IcFEZv-AEIjOD1{mTFX+HSX>$J|fT zbPEw!ES3`_C$(jaUTw7U;&!{WsZ^>9L^%lcR;zUy0$wN-YE34SA9(@ly)c^>i9|r~hi{TZGbK2tp5fuI-$6gb~7jRjKD#+##h%kA=U6BUb%;3H}nkT}FZB9W*j z7Gzjj`MY2I#Lku*c*ptJB)8eP! z^W-;14etIQx@VCzI}f9Zk&q&fVi|IrgiAEkqJcyrd4+rr02ccy(`U`QE*rldD^-Wv z$HIz*YhSi#9!?a7(mYd^pTm;QmCKr?i$t8raYB40lgT^)p%(jdkUAMPk9dWSp1H6= zo;#pDfGnFq_RE20se?bQMMXuUo9RefAhlw00QtP-;JyDNhH^Y$$Fg0q7M3cOx08&{Y>Sv(CwEPN z8HBZpjMrwCjq=&eiE+?|X#{Wq86a|OJi~h#d}f4o{urW?Ja&s*KLXT2xm6t&Obfsm zV1dk~l92~3KtIbo>%SH3Z5Z<2<4DU0BZrwhf)3PCS zWK=v?ja_s)on+Y!pcAO28#C|Ckee30BsT^lVsfe>>@P|7M|ICeHyR|lVSZJU7^{tV zy=zhv5q_yobFo*%bso4xBfKv&D;PU-D}K073fWjav~l%)6#g>kDdE}HXBKvBk} zB3XFn)yJj@pRUpI%b*QJL=DdN9Y_dH)MYJ2AU+2qY4I}%tWp>zeY$#(#?)soE+0w= z#$fLe(6})%=A^&_vk(w2?e*RqTF^&7oi&yXx(xz|n<4%H?4YXX0t#V`Z8o4OCdC=Q zmPm(yR4yqO$8vzzl!HPt>R>|9@A7FWjL(RJ_q!zSsyIpjVnqsdPre(4H*SLm2TcIQ zt_oNIC`nbc2T;NTY?y^RlH_r;mbe0@SSWzJHANquc=*+L3`tZv>lEN5qj{~2@}9Zq zIVQ6+#}siY4dPIUY1E{9FZjZegv|G_6;?H951`HydVfTxP<>NnD3+@`k8aCXdf#f! z8>mkA&ZC@6FMmcor!u0Z;Kpd>nkV8hPe?k-VTk94%C06>+IHRQ!-;{u(q#Y2{pr}W z)6SFvgvG+`Y~x0_Jh7sEhdG@uvZ%QvKJ4L^G^yhEx^mC5@oL7BkP{m!$9GR|+q8Vm zJ}#pQh%B{x)~Lh0$Vn&Nex;?=kC0t$F~%9AM(%7V%@unqv#2pLePOW~F`a7olql4^ z-{l@()}2&bXI*72XjMe(Wyh|X_yrTVS}4901{=a+T3nN^Xhfl+I5F^9U1op1ZrlK* z{1~Vp0=U(&g?|^DqJ#4p|9X!dTvD#hNI5qh{3ct~)@}@i5@&jycGIIHY;V}rAHM|{ Y00yv@$D4zJ>;M1&07*qoM6N<$g4>+GWB>pF diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Range_Chart.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/ChartF-Range_Chart.png index 0d0cb9e063dbfb09cc6eaf4069eae1cf3de07270..9466e8326af83a93a46e1c61bfdc227ac130265b 100644 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|$~;{hLo5W7 z6C^%0d_2}G{oirlggsfz-_8`jRW9&Pl?!9py!`gP^o$*sSkla2TrpJWHa-|S`J_Yz za|EB94M$l`3&#ypBwLpwhJcxUhkm8bW*vS kzea**54XZXlO>)Ee?F=v7aiOt2Xq00r>mdKI;Vst09OS||u)kUW^OGryAf2o_xzbxQL!UG=Wt~>ws-wwFC=w!c}+*{r>8Qp$& f-eU|5jBE^6*Raz^BIC+y98%{PGGQozVNj?Z}J%fxhPx$Pf0{UR5%fxQawupK@goea|q!`BWG=It(8r@##&JjYas}+vI_(oLkg?d2p*&p zAtZmn+P`Aw8N^&9P3W^Ro!cyPQKX5O2f56DLG&D$`3*9iak0wTBspvd6g3aU`I zDA?860Rr3s;MkxMIOx+>l1|%6Ki}~s3Fv|gGAgE@p#A+ce<7k>M9em7VLUj&+~#GY z%_}9+K*0Oj;p=V11|$-|2m1t{+cC@rBB)8q)jxlMH6%vW@HjwhtX0Cj>pFhPm~Xol z>JJmO1=IuWJ)f_)Wa8=YtfN|Ls)l<{M~|hLXo1O*5rI+?lK~>&jX_Hmb1ei&ybXi0 zzLG>#F&OI?n8>`CYoSb8?j`A@Gb3y+D(0B0UZ`uqF$-hW3;k8VTxR(~{UX}u87y0q zB+2R9Rr3qHHA#+V&!=w#EMV7EppE^&MXUY>0_Ko@{q0&p00000NkvXXu0mjf8xFBF literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP|-C{7srr_TSt>Wf1Q9 z_(Pl|M&1+a;`6pGWL$sn!i~1<9rN|PbKaOg zxOCbjQ|j2#>76|{(hrDFe395=`fTA&4#8zNCaZ+)tq5k-=w76%?N)S(>(-RKB`unU zPuU|SSyB{?$P;}UQiC5tOL+hiW Vlj=7`gMmI|@O1TaS?83{1OPtYe479O diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Chart_BubbleChart.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Chart_BubbleChart.png index e1ab5c31315627b1a2771f42f686865d92f62b6c..d2730204a0cea5b1c5d258b59e1718afa17b923f 100644 GIT binary patch literal 581 zcmV-L0=oT)P)Px$|4BqaR5%f(Q_o9OQ4~Js^4^^pNEe2i2*E!<2!e3gjI?mkVx&dQs05m|8iF8# zz+I57#8v)UB#pTcXW_zyI7+KX1hZA!kX%TEKZ1Eb;+^jI9=CbpCZP+L^WE>9@7#0V zxsRLc*Ls2=SR~?pBKf4X9?RYR@trQY9Eh2CyQ7PW=MAnT$>@&Nmuuz0D55!>m7F^8Ltc!u-GzhIL}S|Jd#sK-M5#3pKaO;VJ7-k^$XcVB_UIUVpXtkAQN@|bW@YzU+O{@1|9ZSOEW@a^AA9trx{8V8fjD3bHfyd1vyaL;n z0A=fp`z$4np__4*0x#IJeCN>dOM|g7h5uV^6_^LL6Z*eLP0Dl&lyLm9u;9NoeZ!A7 zmacZ{$#@E-TIq&FJP<~OuRl+R-!Z9al#M`$g`%g5c+Irfo5|{Ul)e|>bslgcrcDyA z5lb;gYPq<)AB&j2!Qz}2T8s~7@Bv!E1_t*BVhrt` T8I8V&00000NkvXXu0mjfvw|5v literal 503 zcmVF(q^})1U>-^Zb81m(L&cUl zD4PJaT~XDkq@oWvVpZ&8cu|+!j_=?3Faw_={7Ihe)<;&*^=qJ1j2!|lXkm^s@*H7} zgGvHd==4JjbVb0CqVmur!}qx~jGZiropX9cb| z3?6sgT)VYXqVmN5Kq$u*-O&GykRq?Q{7&3=bKwiK1L}}gpxb$jzcWs-NXBf5ok7A6`}SmzyO=nzYE@aotOXs002ovPDHLkV1n2^)aU>J diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/FR-Chart-Bit_Map.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/FR-Chart-Bit_Map.png index 2f68dcf8f93961ff2c35ad672f12f4fe2ebbd134..a2499012496145e372b7f340389f979831816404 100644 GIT binary patch literal 523 zcmV+m0`&cfP)Px$#Ysd#R5%f(Qaxx>Q4~JkeLoqDS^@<%OGYQ5i*B|FNU@TlLj@-XLA0v~Djm8+ z=-v+EYZL@2tspjH2XWBF-Oa(D#X3lrwutY&peU5_;ir?)kp^efQk+j>sVw zhSgV-Y{gL0xE$Twm_quW!OSX)Yge(mmvJ@8?+fk2e;nS!@MGu?UTEgyZOetN?L3_) ztMh>MTsOjg5&Dedq?C9xpZ{#;v-;LKH7|Ky<4+UE6R0NXH!Z8uL-cJSNcDn(0|BfY3!>XQwml|c z`03qsY#A7N(5Dzkyx75kU~#*hJyY=yCw5r32QE2i*?<{=6Jqn@{;WAN8o$!g-g;oz zXj*mrE}V+$`oKr}{o2bw8`^>iro=>F2l>81(k`Rc%+DA>$+GR1<-rGYgKU((PVcLd&O?AGjLC@ z4)rfQRio1(_(D;!qxC^W_p=N_dPf)@fT>7p{|?~^9ld} N002ovPDHLkV1n2)@$~=z literal 423 zcmV;Y0a*TtP)W$GbM*7%PAdv;(yQyn<&-5Bc{%3a{qx=e3;^=q;qT;( RG~ECI002ovPDHLkV1nT{trGwM diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewArea.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewArea.png index 473baff55833018f762c200b9beeda6b4437b732..6bfd8bbb9bb900432ab3cb7088f32f7a878c2126 100644 GIT binary patch literal 422 zcmV;X0a^ZuP)Px$U`a$lR5%f1U>Hd7d97$JBR&Uw*&wd_@892_d_iw+p{x6}PQ-`dKf^{QbO{*$ z(*|+hzkmN71M>F+6|2F-LG+jPq6Yu}GcNznz`%snfKThi${7Cs-N3-`pXdL71}S7i zzHOF~{`c?y7LXjsFcdHRzpBml`R1!x|NsAw2T39WMn;Bb%>NmD|1dJnW%&Q!04B%y zWu2%8&?&|s3^dgoY9m-4X!49HiXITFJ|Gyoq8jbkOAaJ+g z^D16m#&_TAcw@Mk{{InyX=Y?#{66zr`~7V{VojK~|4O>_^FQZvn0}D0yMD%Aihp-W z`R;FRu?xR!<g=d0K^yA?2aekQ3sNn4`LHE z7^v6)NNoUOd8p7rY=%SCohK@cfr!1#rm4n zo%f^=K6SI-`hVB1Yf2-t`xuiLqQzG4;9$^y+v{+C%U>n|CzrvyhveO z{lOU=)=V|e)4$*QCH)kaD{XJj1Q`k!18U?9xZlO_`#;Nfc%1xa{Soq@oeLxf4`YQH zkHE1f&H9=lPjuB&Z@!~K@Bi|Cg1Qo?PxzR>GHg^Vdk13s-|rIo^p_ho@?ZuJi9%@9 h;8BC=Y%oB80RZ{Bh?i|%ZOZ@v002ovPDHLkV1jyxutfj> diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewBar.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_NewBar.png index 1f28a094360cc67022c38b26c4d6461578d3e52c..e0e124def5fa69d752c8abc7bc019b7c92691848 100644 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ygXeTLo5W7 zdm@Ct&S&J05Zu%w*l)rtZ0DKugzX+fQjBM`X^;H%t_QuWPS^Nr6oTF`ImIp6YqR+A qoB1k75B&=%o3h8TP=aRTpXLKiW$<+Mb6Mw<&;$VD^)0>t literal 3856 zcmV+r5AX1aP)004&%004{+008|`004nN004b?008NW002DY000@xb3BE2000U( zX+uL$P-t&-Z*ypGa3D!TLm+T+Z)Rz1WdHz3$DNjUR8-d%htIutdZEoQ(iwV_E---f zE+8EQQ5a?h7|H;{3{7l^s6a#!5dlSzpnw6Rp-8NVVj(D~U=K(TP+~BOsHkK{)=GSN zdGF=r_s6~8+Gp=`_t|@&wJrc8PaiHX1(pIJnJ3@}dN|Wpg-6h_{Qw4dfB~ieFj?uT zzCrH6KqN0W7kawL3H*!R3;{^|zGdj?Pp5H0=h0sk8Wyh&7ga7GLtw0fuTQ>mB{3?=`JbBsZ3rr0E=h-EE#ca>7pWA znp#_08k!lIeo?6Zy7)IG?(HJI3i#YJh}QRq?XUb&>HuKOifXg#4_nNB06Mk;Ab0-{ zo8}<^Bt?B|zwyO+XySQ^7YI^qjEyrhGmW?$mXWxizw3WG{0)8aJtOgUzn6#Z%86wP zlLT~e-B>9}DMCIyJ(bDg&<+1Q#Q!+(uk%&0*raG}W_n!s* z`>t?__>spaFD&Aut10z!o?HH?RWufnX30 z)&drY2g!gBGC?lb3<^LI*ah~2N>BspK_h4ZCqM@{4K9Go;5xVo?tlki1dM~{UdPU)xj{ZqAQTQoLvauf5<ZgZNI6o6v>;tbFLDbRL8g&+C=7~%qN5B^ zwkS_j2#SSDLv276qbgBHQSGQ6)GgE~Y6kTQO-3uB4bV1dFZ3#O96A$SfG$Tjpxe-w z(09<|=rSYbRd;g|%>I!rO<0Hzgl9y5R$!^~o_Sb3}g)(-23Wnu-`0_=Y5 zG3+_)Aa)%47DvRX;>>XFxCk5%mxn9IHQ~!?W?(_!4|Qz6*Z? zKaQU#NE37jc7$L;0%0?ug3v;^M0iMeMI;i{iPppbBA2*{SV25ayh0o$z9Y$y^hqwH zNRp7WlXQf1o^+4&icBVJlO4$sWC3|6xsiO4{FwY!f+Arg;U&SA*eFpY(JnD4@j?SR-`K0DzX#{6;CMMSAv!Fl>(L4DIHeoQ<_y) zQT9+yRo<_BQF&U0rsAlQpi-uCR%J?+qH3?oRV`CJr}~U8OLw9t(JSaZ^cgiJHBU96 zTCG~Y+Pu1sdWd?SdaL>)4T1(kBUYnKqg!J}Q&rPfGgq@&^S%~di=h>-wNI;8Yff87 zJ4}0Dt zz%@8vFt8N8)OsmzY2DIcLz1DBVTNI|;iwVK$j2zpsKe-mv8Hi^@owW@<4-0QCP^ms zCJ#(yOjnrZnRc1}YNl_-GOIGXZB90KH{WR9Y5sDV!7|RWgUjw(P%L~cwpnyre6+N( zHrY-t*ICY4 zUcY?IPTh`aS8F$7Pq&Y@KV(1Rpyt4IsB?JYsNu+VY;c@#(sN31I_C7k*~FRe+~z#z zV&k&j<-9B6>fu`G+V3Xg7UEXv_SjwBJ8G6!a$8Ik+VFL5OaMFr+(FGBh%@F?24>HLNsjWR>x%^{cLj zD}-~yJ0q|Wp%D!cv#Z@!?_E6}X%SfvIkZM+P1c&LYZcZetvwSZ8O4k`8I6t(i*Abk z!1QC*F=u1EVya_iST3x6tmkY;b{Tt$W5+4wOvKv7mc~xT*~RUNn~HacFOQ$*x^OGG zFB3cyY7*uW{SuEPE+mB|wI<_|qmxhZWO#|Zo)ndotdxONgVci5ku;mMy=gOiZ+=5M zl)fgtQ$Q8{O!WzMgPUHd;& z##i2{a;|EvR;u1nJ$Hb8VDO;h!Im23nxdNbhq#CC)_T;o*J;<4AI2QcIQ+Cew7&Oi z#@CGv3JpaKACK^kj2sO-+S6#&*x01hRMHGL3!A5oMIO8Pjq5j^Eru<%t+dvnoA$o+&v?IGcZV;atwS+4HIAr!T}^80(JeesFQs#oIjrJ^h!wFI~Cpe)(drQ}4Me zc2`bcwYhrg8sl2Wb<6AReHMLfKUnZUby9Y>+)@{ z+t=@`yfZKqGIV!1a(Lt}`|jkuqXC)@%*Rcr{xo>6OEH*lc%TLr*1x5{cQYs>ht;Of}f>-u708W z;=5lQf9ac9H8cK_|8n8i;#cyoj=Wy>x_j1t_VJtKH}i9aZ{^<}eaCp$`#$Xb#C+xl z?1zevdLO$!d4GDiki4+)8~23s`{L#u!T7DPP<));D=YL{!{i{QVLUpa7%c5@eB{q*fw+rS3{ zQ)U*Z-T>A<1ibpV18s1dGF;1SLKAl&lAB24Ekxa45O~+%wbs#YTt>Tk1x2HPRs-lX z3CeB=-2NH(?%aOk()OMMW>4jWh!KQgA6?1-LFB^^eR!dVFpd;u5==-%e)Urzp`(MY zVFr&;+I~rtra|L18o%}#5OyB^<&g|h#MB!gqP2)&4$$RVVi37Be)Z!=8y~00Na4(6 zkt^geRXmJC#X01kdKQJlE}lH{JdPfH5p#1dLqBBV=5N4{pD>t*&@!6OUKhPlTCTjG z|J^0kEQbM+vYXgPLV<~DIt)Jd<6UfS?cDKO;+AmK9vWVP=46VLB1!Zp4%hY^EG?g^ zTy&4Q8rvdCW9muG1gWBhpETi}{4zIAhWn8jr@Tppd?%~UwU$zc3ULfOKa0)F-*<)% z%FC5Y^LbZz9^cb}LWCq4u6xhfMU;t>gY~$6+-xHE%4@iBx84~ka=#=(V=#n9=sG1K zrA{^^3`TECSb)VLFo4aqoguiTGY$m5BU5|8!DIC5zf>7_Kt3h!f}U9?<;o?u=nAPkI^NWz>urF9j#W`*apjsH zU1N_q6G+%$F~e1)98}~|sZ@Dq+HwQGs|?6?kzLns9MwJjA{giF)TAR?nYZ z#5W(U9#kHdnll-gSa@#!bpC~tg>JQhu(6Av(L%t{+^#p#syB!lntWHQ)^TsAf!lvq zp$9EIgKhkkJN~7eoBAWzTHEJiSY&cbIw2&dgydGj)H%j=O~EEIh6abHPL{B_R`uW+ zHLf_i!Ge1_dt#*^3o5zN>BzKnIJSjJ9>UW(3;CRl z;-rnIpRjRk*1?e}2e)cnRDq&;uPEp0&|l#`sMM!7Jg;4s z!=l%ovM7?}(W6FnY>yb0%h0sDrVyW#vD%Ou*3+3pYwc_GsQ0rapZ{New%i9Ptn;B; SPx%h)G02R5%fJQ%y)zQ4~Js-uvFXnNeqaP6;81E{deucJF(=;T3is@4oxK^L^)> zd+xmm|Jbz`Zii0bVp7L_6d?E0qNgs^UO0{DEmB^&trzaTjZ0Ycb9Go4DdOF$F-TEx zP5?yU;sEogr}F?>kt1|hUZ1~X>>cbv#DE})07_iTys5MfM?!HFR?0M(L!?=S2muIM z{Tb`cynN*V$=;C&(fj$T)=^NfNUZIHCj4=T<$Lt+Z7WLVdoaLt2ml9pBz(SSoRcb zaUPx7FWL~oC}7R7@!#K)$Yb&CI*IFca2#Q8s9>6X_apm_FUAiIN|+|>;y?0J!Fi*` z#r9Ko*`v%F7j!qWaXG{;@^4!Ixv{Oe<|#wTU-lS1wW|Rs@-hrj3Jr+{SAPEzIU??n z&)jwJLdU7)PDu=`-AtRhxmV1%#5IApY{8;~d?(mm2VYFs5b1M4#cltbb~Zb=d0YVz zdF68^Ml?%0rm|kR`h%;d|I?+{msO8`JIk`^XQyGw&YNs*YD@O`i#jK!87e-t$dceP z=T7^;q9qBWa|||ku!z!Cfw>awB8Liy|Z5y&NW27_wiol~giZxZqL5 z<9dE?&y7`T3A5%pI4xxPRL6L&q=&b`h^6Ri%hA>ct2o7$xk&qHGH@6$SSM66<{S=a Q0ERMyr>mdKI;Vst03SD>J^%m! diff --git a/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_VerticalLine.png b/designer-base/src/main/resources/com/fr/design/images/poly/toolbar/Plugin-ChartF_VerticalLine.png index 63c460d69ea6c48bbc987d0e27667e74f91b159a..6bd4ebbb7fb81e82f4e3cd88a719f85c81996258 100644 GIT binary patch literal 580 zcmV-K0=xZ*P)Px${z*hZR5%gEkWWYyaTLej`_1f3Yq%bA#;rsmi2isKHj0Rv2(m8b7C|hLBi6}- zw+b@zWJH(9({9_*SaK&bBm!5GD9p@)x>;RXvQ~wiSw%ZcVRX@XxIuHQ<8osz6t>q=mxz5U=*4iMfnNFn2P zjouFg-y-qCl|K?VkD`sGA-%4WtcQp}KzBf*Hm-f%h|ewFPgI9%`UJDgzPH1Ip7JgdKrv^k1L~HLnW(xEds0rk!{amdG6N@Drw6|Om?3r{N@oKK?&Tls zxXGB`69VcKaHhO@-!5s=PA&FsHX2+5}^GtEKpTnmliuFFS?A&*@lt28ez{;&bQ3u&BdHw~0S~cwp1+^ad!I zeAj(~;6UVLVJ{+*k#b|aOJHZUK6_AmMjslL-=hE*UQ>u0yfp5*=Y{52(L=>S?V~fK z9jq{wjzvrBkA&5$c literal 548 zcmV+<0^9wGP)Oggwk zhYC({auP#DT(h=I{4U%JAwLCU3O@MA%W?hgyYJphl`ss&C{|63Xw|DG96T*+qf+bu znjnwMKt1befS!!?AD2wPrF|*I^XH#UR_0)@u>}6nNdWzDD#xObIhbJzuF)-6T}qvKpMv$?sj|hTx*@q z6%w;oahvQVt@gs(H5Ig}6A%ZSuR`tX`n&bz52jxbH!>bGX+#EheHZ!?sX&Rw6e#e)3=&KmargE`tMDiHl$XA>bEXpgNRNWh+l9 zE1vR7)7qNL-G7B5E%X~W^eW2s)%@>IczPvs?tdWKu0wNg( zo)We~%!1F#C3^LFB9yMVEL^flRPnUL#G?*1GaPSZh~+fBNctUovrx)u3geGG1|K|U cCW$jJ%$=mNXxUOzHK5fDp00i_>zopr076wf?f?J) literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|&H|6fVg?3oVGw3ym^DWNC@5Lt z8c`CQpH@+2u$DqB_b`ZBbhKY7Yyk0WJBDTtpeq?X MUHx3vIVCg!01hT#rT_o{ From ee5c24ef12a66c4d2f8f4f2c3517ea2ab89ca8b0 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 6 Sep 2018 10:05:26 +0800 Subject: [PATCH 39/77] =?UTF-8?q?REPORT-10719=20=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E4=BF=9D=E5=AD=980kb,=20=E6=94=AF=E6=8C=81=E9=9B=86=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/file/FileNodeFILE.java | 3 +- .../fr/file/WorkResourceTempRenameStream.java | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index 04016c503..c7c6bf2b3 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -14,7 +14,6 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.resource.WorkResourceOutputStream; import javax.swing.Icon; import java.io.ByteArrayInputStream; @@ -381,7 +380,7 @@ public class FileNodeFILE implements FILE { if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - return new WorkResourceOutputStream(envPath); + return new WorkResourceTempRenameStream(envPath); } /** diff --git a/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java b/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java new file mode 100644 index 000000000..576239b35 --- /dev/null +++ b/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java @@ -0,0 +1,39 @@ +package com.fr.file; + +import com.fr.stable.ArrayUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; +import com.fr.workspace.resource.WorkResource; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * 这个流会先输出临时文件到服务器. + * 然后再操作服务器对文件进行重命名. + * 用于设计器本地和远程修改模板. + */ +public class WorkResourceTempRenameStream extends ByteArrayOutputStream { + + private String path; + + public WorkResourceTempRenameStream(String path) { + this.path = path; + } + + @Override + public void close() throws IOException { + //写到给定的path上去 + byte[] content = super.toByteArray(); + if (ArrayUtils.isEmpty(content)) { + return; + } + + String tmpPath = path + ProjectConstants.TEMP_SUFFIX; + WorkResource resource = WorkContext.getWorkResource(); + // 输出临时文件到服务器 + resource.write(tmpPath, content); + // 重命名文件 + resource.rename(tmpPath, path); + } +} From 010ebe46dd4e8654219c1ac4bc25dd815929adfc Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 6 Sep 2018 10:21:13 +0800 Subject: [PATCH 40/77] =?UTF-8?q?=E6=94=BEcore=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/file/FileNodeFILE.java | 1 + .../fr/file/WorkResourceTempRenameStream.java | 39 ------------------- 2 files changed, 1 insertion(+), 39 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index c7c6bf2b3..d077a342e 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -14,6 +14,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.resource.WorkResourceTempRenameStream; import javax.swing.Icon; import java.io.ByteArrayInputStream; diff --git a/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java b/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java deleted file mode 100644 index 576239b35..000000000 --- a/designer-base/src/main/java/com/fr/file/WorkResourceTempRenameStream.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.fr.file; - -import com.fr.stable.ArrayUtils; -import com.fr.stable.project.ProjectConstants; -import com.fr.workspace.WorkContext; -import com.fr.workspace.resource.WorkResource; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * 这个流会先输出临时文件到服务器. - * 然后再操作服务器对文件进行重命名. - * 用于设计器本地和远程修改模板. - */ -public class WorkResourceTempRenameStream extends ByteArrayOutputStream { - - private String path; - - public WorkResourceTempRenameStream(String path) { - this.path = path; - } - - @Override - public void close() throws IOException { - //写到给定的path上去 - byte[] content = super.toByteArray(); - if (ArrayUtils.isEmpty(content)) { - return; - } - - String tmpPath = path + ProjectConstants.TEMP_SUFFIX; - WorkResource resource = WorkContext.getWorkResource(); - // 输出临时文件到服务器 - resource.write(tmpPath, content); - // 重命名文件 - resource.rename(tmpPath, path); - } -} From 132f6d3062ff4ac466cc3eee37cc8efec87e81ea Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 6 Sep 2018 20:36:52 +0800 Subject: [PATCH 41/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20FineRun?= =?UTF-8?q?time?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/start/Designer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index c362916c9..31b16dd42 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -41,6 +41,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.module.Module; import com.fr.module.ModuleContext; +import com.fr.plugin.manage.FineRuntime; import com.fr.stable.BuildContext; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; @@ -93,7 +94,9 @@ public class Designer extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + + //启动运行时 + FineRuntime.start(); BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); From f4e429b0ff67dc1ea4b795c4d77f16db0c330eb6 Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 6 Sep 2018 20:40:28 +0800 Subject: [PATCH 42/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20FineRun?= =?UTF-8?q?time?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/start/Designer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 31b16dd42..b0d4b398b 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -41,7 +41,7 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.module.Module; import com.fr.module.ModuleContext; -import com.fr.plugin.manage.FineRuntime; +import com.fr.runtime.FineRuntime; import com.fr.stable.BuildContext; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; From 620b061413c6006a473c10199137ead7878300a0 Mon Sep 17 00:00:00 2001 From: plough Date: Fri, 7 Sep 2018 09:48:51 +0800 Subject: [PATCH 43/77] =?UTF-8?q?REPORT-11110=20=E6=89=93=E5=8D=B0?= =?UTF-8?q?=E4=BA=8C=E6=9C=9F=20ie=20=E4=B8=8B=E9=9D=99=E9=BB=98=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E4=BA=A4=E4=BA=92=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../NoClientPrintSettingPane.java | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java index 4dd9fa6b9..a61cd7a3c 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NoClientPrintSettingPane.java @@ -8,12 +8,10 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; - import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.FlowLayout; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; @@ -23,6 +21,7 @@ import java.awt.event.ItemListener; */ public class NoClientPrintSettingPane extends JPanel { private UICheckBox setMarginWhenPrintCheck; + private UICheckBox ieQuietPrintCheck; private UICheckBox inheritPageMarginSettingCheck; // 继承页面边距设置 private PageMarginSettingPane pageMarginSettingPane; private JPanel centerPane; @@ -35,15 +34,16 @@ public class NoClientPrintSettingPane extends JPanel { private void initComponents() { JPanel printPane = FRGUIPaneFactory.createBorderLayout_S_Pane(); - setMarginWhenPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Set_Margin_When_Printing")); - setMarginWhenPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 20)); - UILabel tipLabel = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); - JPanel northPane = GUICoreUtils.createFlowPane(new Component[] { - setMarginWhenPrintCheck, tipLabel}, FlowLayout.LEFT); - northPane.setBorder(BorderFactory.createEmptyBorder(8, 10, 10, 0)); + printPane.add(createNorthPane(), BorderLayout.NORTH); + + initCenterPane(); + printPane.add(centerPane, BorderLayout.CENTER); - printPane.add(northPane, BorderLayout.NORTH); + this.setLayout(new BorderLayout()); + this.add(printPane, BorderLayout.CENTER); + } + private void initCenterPane() { centerPane = FRGUIPaneFactory.createTitledBorderPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Default_Settings")); inheritPageMarginSettingCheck = GUICoreUtils.createNoBorderCheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Inherit_Page_Margin_Setting")); @@ -61,11 +61,27 @@ public class NoClientPrintSettingPane extends JPanel { JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 15); centerPane.add(panel); + } - printPane.add(centerPane, BorderLayout.CENTER); + private JPanel createNorthPane() { + setMarginWhenPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Engine_Set_Margin_When_Printing")); + setMarginWhenPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 20)); + UILabel tipLabel = GUICoreUtils.createTipLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Tip_Use_Default_Print_Margin")); + ieQuietPrintCheck = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_No_Print_Settings_In_IE")); + ieQuietPrintCheck.setBorder(BorderFactory.createEmptyBorder(0, 12, 10, 0)); - this.setLayout(new BorderLayout()); - this.add(printPane, BorderLayout.CENTER); + // TableLayout + double p = TableLayout.PREFERRED; + double[] rowSize = {p, p}; + double[] columnSize = {180, p}; + Component[][] components = { + {setMarginWhenPrintCheck, tipLabel}, + {ieQuietPrintCheck, null} + }; + JPanel northPane = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 10); + northPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 0, 0)); + + return northPane; } private void initListeners() { @@ -86,12 +102,14 @@ public class NoClientPrintSettingPane extends JPanel { public void populate(NoClientPrintAttr noClientPrintAttr) { setMarginWhenPrintCheck.setSelected(noClientPrintAttr.isSetMarginOnPrint()); + ieQuietPrintCheck.setSelected(noClientPrintAttr.isIeQuietPrint()); inheritPageMarginSettingCheck.setSelected(noClientPrintAttr.isInheritPageMarginSetting()); pageMarginSettingPane.populate(noClientPrintAttr.getMargin()); } public void update(NoClientPrintAttr noClientPrintAttr) { noClientPrintAttr.setSetMarginOnPrint(setMarginWhenPrintCheck.isSelected()); + noClientPrintAttr.setIeQuietPrint(ieQuietPrintCheck.isSelected()); noClientPrintAttr.setInheritPageMarginSetting(inheritPageMarginSettingCheck.isSelected()); noClientPrintAttr.setMargin(pageMarginSettingPane.updateBean()); } From f7081a10959ed41e0c3ca83236dc69629daf3bb6 Mon Sep 17 00:00:00 2001 From: rinoux Date: Fri, 7 Sep 2018 14:12:47 +0800 Subject: [PATCH 44/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=90=91=E4=B8=8D=E5=AD=98=E5=9C=A8=E7=9A=84=E6=A8=A1=E7=89=88?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E5=86=99=E5=85=A5=E6=97=B6=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=85=88=E6=96=B0=E5=BB=BA=E7=A9=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=EF=BC=8C=E5=90=A6=E5=88=99=E5=85=B6=E5=AE=83=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BC=9A=E5=AF=BC=E8=87=B4=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/JTemplate.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index d94ac661b..1235419f5 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -591,7 +591,6 @@ public abstract class JTemplate> return false; } editingFILE = fileChooser.getSelectedFILE(); - mkNewFile(editingFILE); } return saveNewFile(editingFILE, oldName); From 381b5d9eed96c0df545b90341c13b7df028b6e6b Mon Sep 17 00:00:00 2001 From: rinoux Date: Fri, 7 Sep 2018 14:31:58 +0800 Subject: [PATCH 45/77] update --- designer-base/src/main/java/com/fr/file/FileFILE.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/file/FileFILE.java b/designer-base/src/main/java/com/fr/file/FileFILE.java index b9c4f7bb0..ee92205f5 100644 --- a/designer-base/src/main/java/com/fr/file/FileFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileFILE.java @@ -194,11 +194,12 @@ public class FileFILE implements FILE { * @return 输出流 */ public OutputStream asOutputStream() { - if (file == null || !file.exists()) { + if (file == null) { return null; } OutputStream out; try { + StableUtils.makesureFileExist(file); out = new FileOutputStream(file); } catch (Exception e) { throw SessionLocalManager.createLogPackedException(e); From 7f7c48a6678724c91dd35ec6a0db5dfc20336fb7 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Sat, 8 Sep 2018 19:03:13 +0800 Subject: [PATCH 46/77] =?UTF-8?q?REPORT-10946=20=E7=A6=BB=E7=BA=BF?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E4=B8=8B=EF=BC=88=E6=96=AD=E7=BD=91=EF=BC=89?= =?UTF-8?q?alphafine=E9=83=BD=E6=89=93=E4=B8=8D=E5=BC=80=E4=BA=86=201?= =?UTF-8?q?=E3=80=81=E6=AD=A3=E5=B8=B8=E6=96=AD=E7=BD=91=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E9=9C=80=E8=A6=81=E8=81=94=E7=BD=91=E7=9A=84=E5=90=84=E6=A8=A1?= =?UTF-8?q?=E5=9D=97=E6=8F=90=E7=A4=BA=E2=80=9C=E9=93=BE=E6=8E=A5=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E2=80=9D=202=E3=80=81=E6=96=AD=E7=BD=91=E5=90=8E?= =?UTF-8?q?=E8=81=94=E7=BD=91=EF=BC=8Calphafine=E5=8F=AF=E4=BB=A5=E6=AD=A3?= =?UTF-8?q?=E5=B8=B8=E6=89=93=E5=BC=80=203=E3=80=81=E5=92=8C=E8=A7=86?= =?UTF-8?q?=E8=A7=89=E6=B2=9F=E9=80=9A=EF=BC=8C=E7=83=AD=E9=97=A8=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E5=9B=BE=E6=A0=87=E5=A4=96=E5=9B=B4=E7=9A=84?= =?UTF-8?q?=E5=9C=86=EF=BC=8C=E4=B8=8D=E4=BD=BF=E7=94=A8swing=E7=94=BB?= =?UTF-8?q?=E4=BA=86=EF=BC=8C=E7=94=B1=E8=A7=86=E8=A7=89=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E5=88=87=E5=9B=BE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/alphafine/AlphaFineHelper.java | 30 +++++- .../cell/render/ContentCellRender.java | 12 ++- .../alphafine/component/AlphaFineDialog.java | 97 ++++++++++-------- .../alphafine/preview/ContainsCirclePane.java | 36 ------- .../manager/impl/DocumentSearchManager.java | 18 ++-- .../search/manager/impl/HotIssuesManager.java | 8 +- .../manager/impl/PluginSearchManager.java | 10 +- .../manager/impl/RecommendSearchManager.java | 14 +-- .../manager/impl/SimilarSearchManeger.java | 14 ++- .../alphafine/images/alphafine_hot1.png | Bin 789 -> 1958 bytes .../alphafine/images/alphafine_hot1@2x.png | Bin 1743 -> 5320 bytes .../alphafine/images/alphafine_hot2.png | Bin 1051 -> 2279 bytes .../alphafine/images/alphafine_hot2@2x.png | Bin 2035 -> 5838 bytes .../alphafine/images/alphafine_hot3.png | Bin 1590 -> 2890 bytes .../alphafine/images/alphafine_hot3@2x.png | Bin 4069 -> 8056 bytes .../alphafine/images/alphafine_hot4.png | Bin 634 -> 1830 bytes .../alphafine/images/alphafine_hot4@2x.png | Bin 1193 -> 4796 bytes .../alphafine/images/alphafine_hot5.png | Bin 1525 -> 2842 bytes .../alphafine/images/alphafine_hot5@2x.png | Bin 3569 -> 7422 bytes .../alphafine/images/alphafine_hot6.png | Bin 506 -> 1635 bytes .../alphafine/images/alphafine_hot6@2x.png | Bin 828 -> 4419 bytes 21 files changed, 112 insertions(+), 127 deletions(-) delete mode 100644 designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java index 6c8e2f119..763c822a9 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/AlphaFineHelper.java @@ -4,13 +4,17 @@ import com.fr.design.DesignerEnvManager; import com.fr.design.actions.help.alphafine.AlphaFineConfigManager; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; +import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.NoResultModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; +import com.fr.design.mainframe.alphafine.search.manager.impl.DocumentSearchManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.HotIssuesManager; +import com.fr.design.mainframe.alphafine.search.manager.impl.PluginSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; - +import com.fr.design.mainframe.alphafine.search.manager.impl.SimilarSearchManeger; import com.fr.general.ProcessCanceledException; import com.fr.json.JSONArray; import com.fr.json.JSONException; @@ -104,7 +108,7 @@ public class AlphaFineHelper { public static SearchResult getModelListFromJSONArray(String result, String keyword) throws ClassCastException, JSONException { SearchResult allModelList = new SearchResult(); - JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); + JSONArray jsonArray = (JSONArray) JSONUtils.jsonDecode(result); for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); JSONObject jsonObject = jsonArray.optJSONObject(i); @@ -120,5 +124,25 @@ public class AlphaFineHelper { return allModelList; } - + /** + * 网络异常时的处理 + * @param object + * @return + */ + public static SearchResult getNoConnectList(Object object) { + SearchResult result = new SearchResult(); + if (object instanceof RecommendSearchManager) { + result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"))); + } else if (object instanceof DocumentSearchManager) { + result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); + } else if (object instanceof PluginSearchManager) { + result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); + } else if (object instanceof SimilarSearchManeger) { + result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Relation_Item"))); + } else if (object instanceof HotIssuesManager) { + return new SearchResult(); + } + result.add(AlphaFineHelper.NO_CONNECTION_MODEL); + return result; + } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java index ffcac3f23..07f5b4d4e 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/cell/render/ContentCellRender.java @@ -9,15 +9,14 @@ import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.stable.StringUtils; - import javax.swing.BorderFactory; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.ListCellRenderer; import java.awt.BorderLayout; import java.awt.Color; -import java.awt.Dimension; import java.awt.Component; +import java.awt.Dimension; /** * Created by XiaXiang on 2017/4/20. @@ -50,7 +49,6 @@ public class ContentCellRender implements ListCellRenderer { JPanel panel = new JPanel(new BorderLayout()); panel.setBackground(null); panel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - if (model.hasAction()) { if (isSelected) { titleLabel.setText(StringUtils.BLANK + model.getName()); @@ -63,7 +61,6 @@ public class ContentCellRender implements ListCellRenderer { titleLabel.setIcon(IconLoader.getIcon(iconUrl)); } } else { - titleLabel.setText(highLightModelName(model.getName(), segmentationResult)); String iconUrl = CELL_PATH + model.getType().getTypeValue() + SUFFIX; if (value instanceof RobotModel && ((RobotModel) value).isHotItemModel()) { @@ -74,6 +71,7 @@ public class ContentCellRender implements ListCellRenderer { } } else { + titleLabel.setText(model.getName()); titleLabel.setIcon(null); titleLabel.setForeground(AlphaFineConstants.MEDIUM_GRAY); } @@ -115,7 +113,11 @@ public class ContentCellRender implements ListCellRenderer { modelName = modelName.replaceAll(strings[i], primaryStr); } } - modelName = "" + modelName.replaceAll("\\|", "") + ""; + modelName = "" + modelName.replaceAll("\\|", StringUtils.EMPTY) + ""; return modelName; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 7fd1dc09c..10a3387e8 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -19,7 +19,6 @@ import com.fr.design.mainframe.alphafine.cell.model.PluginModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; import com.fr.design.mainframe.alphafine.cell.render.ContentCellRender; import com.fr.design.mainframe.alphafine.model.SearchResult; -import com.fr.design.mainframe.alphafine.preview.ContainsCirclePane; import com.fr.design.mainframe.alphafine.preview.DocumentPreviewPane; import com.fr.design.mainframe.alphafine.preview.FilePreviewPane; import com.fr.design.mainframe.alphafine.preview.NoResultPane; @@ -40,6 +39,7 @@ import com.fr.form.main.Form; import com.fr.form.main.FormIO; import com.fr.general.ComparatorUtils; import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; import com.fr.io.TemplateWorkBookIO; import com.fr.io.exporter.ImageExporter; import com.fr.json.JSONException; @@ -49,6 +49,7 @@ import com.fr.main.impl.WorkBook; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.third.org.apache.http.client.methods.HttpGet; import javax.imageio.ImageIO; import javax.swing.BorderFactory; @@ -142,6 +143,7 @@ public class AlphaFineDialog extends UIDialog { private static String beforeSearchStr = ""; private static boolean alreadySearch = false; private static boolean alreadyInitHot = false; + public static String[][] data; public AlphaFineDialog(Frame parent, boolean forceOpen) { super(parent); @@ -224,6 +226,7 @@ public class AlphaFineDialog extends UIDialog { * 初始化热门界面 */ private void initHotPane() { + removeHotPane(); hotPane = new JPanel(); hotPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); hotPane.setPreferredSize(AlphaFineConstants.CONTENT_SIZE); @@ -232,25 +235,28 @@ public class AlphaFineDialog extends UIDialog { UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Hot")); uiLabel.setFont(AlphaFineConstants.SMALL_FONT); uiLabel.setForeground(AlphaFineConstants.DARK_GRAY); - JPanel panel = new JPanel(); - - hotPane.add(uiLabel, BorderLayout.NORTH); - hotPane.add(panel, BorderLayout.CENTER); GridLayout gridLayout = new GridLayout(2, 3, 3, 3); + JPanel panel = new JPanel(); panel.setLayout(gridLayout); - - String[][] ss = HotIssuesManager.getInstance().getHotIssues(); - - if(ss != null){ - for (int i = 0; i < ss.length; i++) { - panel.add(new HotIssueJpanel(ss[i], i + 1)); + try { + HttpGet getHelp = new HttpGet(AlphaFineConstants.ALPHA_HOT_SEARCH); + HttpToolbox.getHttpClient(AlphaFineConstants.ALPHA_HOT_SEARCH).execute(getHelp).getStatusLine(); + if (data == null) { + data = HotIssuesManager.getInstance().getHotIssues(); } - }else { + for (int i = 0; i < data.length; i++) { + panel.add(new HotIssueJpanel(data[i], i + 1)); + } + } catch (Exception e) { + data = null; for (int i = 0; i < AlphaFineConstants.HOT_ITEMS; i++) { - panel.add(new HotIssueJpanel(new String[]{" "}, i + 1)); + panel.add(new HotIssueJpanel(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Connection_Failed")}, i + 1)); } } + + hotPane.add(uiLabel, BorderLayout.NORTH); + hotPane.add(panel, BorderLayout.CENTER); add(hotPane, BorderLayout.SOUTH); setSize(AlphaFineConstants.FULL_SIZE); } @@ -313,10 +319,8 @@ public class AlphaFineDialog extends UIDialog { return; } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { - if (hotPane == null) { - initHotPane(); - } - }else{ + initHotPane(); + } else { removeHotPane(); setSize(AlphaFineConstants.FIELD_SIZE); refreshContainer(); @@ -706,19 +710,19 @@ public class AlphaFineDialog extends UIDialog { this.showWorker = new SwingWorker() { @Override protected String doInBackground() { - if(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item").equals((selectedValue).getName())){ + if (com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item").equals((selectedValue).getName())) { return StringUtils.EMPTY; } String content = RobotModel.getContent((selectedValue).getName()); - if(StringUtils.isNotEmpty(content)){ + if (StringUtils.isNotEmpty(content)) { //1.去掉小帆底部的信息。2.修改链接标签,使点击能够正常跳转。 content = content.replaceAll(AlphaFineConstants.BOTTOM_REGEX_FIRST, StringUtils.EMPTY) .replaceAll(AlphaFineConstants.BOTTOM_REGEX_SECOND, StringUtils.EMPTY) - .replaceAll(AlphaFineConstants.LINK_REGEX,StringUtils.EMPTY) - .replaceAll("'\\)",StringUtils.EMPTY) - .replaceAll(AlphaFineConstants.LINK_REGEX_ANOTHER,StringUtils.EMPTY); + .replaceAll(AlphaFineConstants.LINK_REGEX, StringUtils.EMPTY) + .replaceAll("'\\)", StringUtils.EMPTY) + .replaceAll(AlphaFineConstants.LINK_REGEX_ANOTHER, StringUtils.EMPTY); return content; - }else{ + } else { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item"); } } @@ -816,11 +820,9 @@ public class AlphaFineDialog extends UIDialog { removeSearchResult(); refreshContainer(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { - if (hotPane == null) { - initHotPane(); - setSize(AlphaFineConstants.FULL_SIZE); - } - }else{ + initHotPane(); + setSize(AlphaFineConstants.FULL_SIZE); + } else { setSize(AlphaFineConstants.FIELD_SIZE); } refreshContainer(); @@ -834,17 +836,17 @@ public class AlphaFineDialog extends UIDialog { refreshContainer(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedSegmentationCheckbox()) { //是高级搜索 - if(searchTextField.getText().toLowerCase().startsWith(ADVANCED_SEARCH_MARK)){ + if (searchTextField.getText().toLowerCase().startsWith(ADVANCED_SEARCH_MARK)) { segmentationResult = SegmentationManager.getInstance().startSegmentation(getStoreText(searchTextField.getText().toLowerCase())); } //是普通搜索 - else{ + else { segmentationResult = SegmentationManager.getInstance().startSegmentation(searchTextField.getText().toLowerCase()); } } else { - if(StringUtils.isEmpty(getRealSearchText(searchTextField.getText()))){ + if (StringUtils.isEmpty(getRealSearchText(searchTextField.getText()))) { segmentationResult = null; - }else{ + } else { segmentationResult = new String[]{getRealSearchText(searchTextField.getText())}; } } @@ -867,7 +869,7 @@ public class AlphaFineDialog extends UIDialog { /** * 去除特殊字符,空格等 */ - private String getRealSearchText(String searchText){ + private String getRealSearchText(String searchText) { searchText = searchText.toLowerCase(); Pattern p = Pattern.compile(AlphaFineConstants.SPECIAL_CHARACTER_REGEX); Matcher m = p.matcher(searchText); @@ -936,7 +938,7 @@ public class AlphaFineDialog extends UIDialog { * @param cellModel */ private void saveLocalHistory(final AlphaCellModel cellModel) { - if(cellModel instanceof BottomModel){ + if (cellModel instanceof BottomModel) { return; } Thread sendThread = new Thread(new Runnable() { @@ -1170,7 +1172,7 @@ public class AlphaFineDialog extends UIDialog { } else if (e.getClickCount() == 1) { if (selectedValue instanceof MoreModel && ((MoreModel) selectedValue).isNeedMore()) { dealWithMoreOrLessResult(selectedIndex, (MoreModel) selectedValue); - }else if(selectedValue instanceof BottomModel){ + } else if (selectedValue instanceof BottomModel) { dealWithSearchResult(selectedValue); } } @@ -1198,6 +1200,7 @@ public class AlphaFineDialog extends UIDialog { setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } } + @Override public void mouseDragged(MouseEvent e) { } @@ -1330,12 +1333,12 @@ public class AlphaFineDialog extends UIDialog { protected Object doInBackground() throws Exception { resetContainer(); - if(modeList.size() == ONLY_ONE_AVAILABLE_MODEL && "".equals(modeList.get(1).getName())){ + if (modeList.size() == ONLY_ONE_AVAILABLE_MODEL && "".equals(modeList.get(1).getName())) { RobotModel model = new RobotModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Alpha_Hot_No_Item"), null); searchListModel.addElement(model); - }else { + } else { for (AlphaCellModel object : modeList) { - if(!searchListModel.contains(object)){ + if (!searchListModel.contains(object)) { searchListModel.addElement(object); } } @@ -1363,6 +1366,7 @@ public class AlphaFineDialog extends UIDialog { hotPane = null; } } + /** * 增加返回面板 */ @@ -1382,11 +1386,9 @@ public class AlphaFineDialog extends UIDialog { searchResultPane = null; } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { - if (hotPane == null) { - initHotPane(); - } + initHotPane(); setSize(AlphaFineConstants.FULL_SIZE); - }else{ + } else { setSize(AlphaFineConstants.FIELD_SIZE); } refreshContainer(); @@ -1407,14 +1409,19 @@ public class AlphaFineDialog extends UIDialog { this.setSize(AlphaFineConstants.HOT_ISSUES_JAPNEL_SIZE); JPanel pane1 = new JPanel(new BorderLayout()); - ContainsCirclePane circle = new ContainsCirclePane(pngIndex); - circle.setBorder(BorderFactory.createEmptyBorder(20,0,10,0)); - pane1.add(circle, BorderLayout.NORTH); + UILabel iconLabel = new UILabel(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.ALPHA_HOT_IMAGE_NAME + pngIndex + ".png")); + iconLabel.setOpaque(true); + iconLabel.setBackground(Color.WHITE); + iconLabel.setBorder(BorderFactory.createEmptyBorder(20, 0, 0, 0)); + pane1.add(iconLabel, BorderLayout.NORTH); add(pane1, BorderLayout.NORTH); JPanel centerPanel = new JPanel(new BorderLayout()); centerPanel.setBackground(Color.white); UILabel title = new UILabel(); + if (StringUtils.isEmpty(str[0])) { + title.setText(StringUtils.EMPTY); + } title.setText(str[0]); title.setFont(AlphaFineConstants.MEDIUM_FONT_ANOTHER); title.setForeground(AlphaFineConstants.DARK_GRAY); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java deleted file mode 100644 index 15076d575..000000000 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/ContainsCirclePane.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.fr.design.mainframe.alphafine.preview; - -import com.bulenkov.iconloader.IconLoader; -import com.fr.design.gui.ilable.UILabel; -import com.fr.design.mainframe.alphafine.AlphaFineConstants; - -import javax.swing.JPanel; -import java.awt.Color; -import java.awt.Graphics; - -/** - * @Author alex.sung - * created by 2018.08.15 - */ -public class ContainsCirclePane extends JPanel { - - public ContainsCirclePane(int pngIndex) { - UILabel iconLabel = new UILabel(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.ALPHA_HOT_IMAGE_NAME + pngIndex + ".png")); - iconLabel.setPreferredSize(AlphaFineConstants.HOT_ICON_LABEL_SIZE); - iconLabel.setOpaque(true); - iconLabel.setBackground(Color.WHITE); - add(iconLabel); - } - - @Override - public void paintComponent(Graphics g) { - super.paintComponent(g); - int height = AlphaFineConstants.HOT_ICON_LABEL_HEIGHT; - setBackground(Color.white); - int x0 = getSize().width / 2; - int y0 = height / 2 + 23; - int r = height / 2 + 9; - g.setColor(AlphaFineConstants.LIGHT_GRAY); - g.drawOval(x0 - r, y0 - r, r * 2, r * 2); - } -} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index b8ba403aa..cb1f91cda 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -6,6 +6,7 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.DocumentModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; @@ -52,6 +53,11 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { @Override public SearchResult getLessSearchResult(String[] searchText) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } else if (AlphaFineDialog.data == null) { + return AlphaFineHelper.getNoConnectList(instance); + } lessModelList = new SearchResult(); moreModelList = new SearchResult(); if (ArrayUtils.isEmpty(searchText)) { @@ -99,18 +105,6 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { return lessModelList; } - /** - * 无连接 - * - * @return - */ - private SearchResult getNoConnectList() { - SearchResult result = new SearchResult(); - result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); - result.add(AlphaFineHelper.NO_CONNECTION_MODEL); - return result; - } - @Override public SearchResult getMoreSearchResult(String searchText) { return moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java index 181d79417..c1dd0ea82 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/HotIssuesManager.java @@ -12,7 +12,7 @@ import com.fr.json.JSONObject; import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; -import java.io.IOException; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -73,7 +73,6 @@ public class HotIssuesManager { try { String result = HttpToolbox.get(AlphaFineConstants.ALPHA_HOT_SEARCH); - AlphaFineHelper.checkCancel(); JSONArray jsonArray = (JSONArray)JSONUtils.jsonDecode(result); if(jsonArray != null){ for (int i = 0; i < HOT_ITEM_NUM; i++) { @@ -82,10 +81,9 @@ public class HotIssuesManager { data[i] = getTitleStrings(jsonObject); } } - } catch (JSONException e) { + } catch (Exception e) { FineLoggerFactory.getLogger().error("hotissues search error: " + e.getMessage()); - } catch (IOException e) { - FineLoggerFactory.getLogger().error("hotissues search get result error: " + e.getMessage()); + return null; } return data; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index 4a78e34e3..5aafe29fa 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -6,6 +6,7 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.PluginModel; +import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.ComparatorUtils; @@ -99,6 +100,8 @@ public class PluginSearchManager implements AlphaFineSearchProvider { public SearchResult getLessSearchResult(String[] searchText) { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); + } else if (AlphaFineDialog.data == null) { + return AlphaFineHelper.getNoConnectList(instance); } this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); @@ -147,13 +150,6 @@ public class PluginSearchManager implements AlphaFineSearchProvider { return this.lessModelList; } - private SearchResult getNoConnectList() { - SearchResult result = new SearchResult(); - result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); - result.add(AlphaFineHelper.NO_CONNECTION_MODEL); - return result; - } - @Override public SearchResult getMoreSearchResult(String searchText) { return this.moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index beac652ff..7a234838a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -8,6 +8,7 @@ import com.fr.design.mainframe.alphafine.cell.CellModelHelper; import com.fr.design.mainframe.alphafine.cell.model.ActionModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; +import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; @@ -49,6 +50,8 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { public SearchResult getLessSearchResult(String[] searchText) { if (ArrayUtils.isEmpty(searchText)) { return new SearchResult(); + } else if(AlphaFineDialog.data == null){ + return AlphaFineHelper.getNoConnectList(instance); } this.modelList = new SearchResult(); this.recommendModelList = new SearchResult(); @@ -56,7 +59,8 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { for (int j = 0; j < searchText.length; j++) { searchText[j] = searchText[j].replaceAll(StringUtils.BLANK, StringUtils.EMPTY); try { - String result = HttpToolbox.get(AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j])); + String url = AlphaFineConstants.SEARCH_API + CodeUtils.cjkEncode(searchText[j]); + String result = HttpToolbox.get(url); AlphaFineHelper.checkCancel(); JSONObject jsonObject = new JSONObject(result); if ("success".equals(jsonObject.optString("status"))) { @@ -179,14 +183,6 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { return RecentSearchManager.getInstance().getRecentModelList().contains(cellModel) || this.recommendModelList.contains(cellModel); } - private SearchResult getNoConnectList() { - SearchResult result = new SearchResult(); - result.add(0, new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Recommend"))); - result.add(AlphaFineHelper.NO_CONNECTION_MODEL); - return result; - } - - @Override public SearchResult getMoreSearchResult(String searchText) { return moreModelList; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index fc2c173e0..661eba0ff 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -6,19 +6,18 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; +import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; -import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; -import com.fr.json.JSONUtils; import com.fr.log.FineLoggerFactory; -import java.io.IOException; - -import com.fr.stable.StringUtils; +import com.fr.stable.ArrayUtils; import com.fr.third.org.apache.commons.codec.digest.DigestUtils; +import java.io.IOException; + /** * Created by alex.sung on 2018/8/3. */ @@ -40,6 +39,11 @@ public class SimilarSearchManeger implements AlphaFineSearchProvider { @Override public SearchResult getLessSearchResult(String[] searchText) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } else if (AlphaFineDialog.data == null) { + return AlphaFineHelper.getNoConnectList(instance); + } lessModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { SearchResult allModelList = new SearchResult(); diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1.png index a46dba342094e7578ce898c3ce4685d13b3b9485..7f1f514add8a154a75ec4d06a9e41e6c851d7c50 100644 GIT binary patch literal 1958 zcmV;X2U+-uP)Px+U`a$lRA>d|TUl&WRT%!y?X=Tr83j{lSzaJw6CYGW3CL=EFt|PVprFR62|k#Z znCJt97%}jGL5+!t4{8D~X@Cbp#JDB;z*10_YD_ev2+>ez%iftgcc$&k@%!$b+vzg< z+)k&RliWFT&-u^)|KC~u^PlA^nV_Jx4wz!4C9NU@*^i&A0y z>%nVCv=K5ypKfmU9|4U;8n1)$l3`fuIm(JZqm%kct<(~wb(b>Kam1m7@`dWvPEPxud+R$%Wd%|YyR5Yp=6i}oh zB-DjEQ8()7iO_znTfndrU1;BAbm4p;>@E)7s3UdFN1ro4)v}%FHal|?RzW6pB z)m`wEm2xWjs$uHM2QFK_J!N5@F335-IOyQSo{ia5Nl!T^9Xa)-pGwzlDvjH0fQZ3% zL&x~uzEK5|vK{NtExFdB`sB*>Sjc{ia-};U!FwFB;a^9IFY@IA*3vJl`;UE_sT?uD z_ue8&y&d_hU7BI1AIq<`TC3I>frkBVX2!T&uo;<_l(-;O@mUKK3o#L!OEe5vClhbf zDZLXllXNq)#HF`v7KUXc=hTH*h>6%-88%?sF2vn4Z{{2o;)R%r&FM8uVsJs!F)^56T}^F7MpE+{b)tB+f$O7xksy0dSl zNE>?0taT!d^Bpx47#;nmM0#QL!(AS!UK$%>gF|(OSbf|#HVipY8Y`5#b%n^HZ6X7g zL@w?TG5^Fib6ms^;I}=5-RKWRu6!->@4HAJDp^dq1+iUxBAHZ6ecU8hS`L@Q@Rs{T zZr>@=^98`}2B1WmP5dHS_@v0y??e{9iD#?Gxwq5#75>M)aZ!2=&0{+@$v-JtzTtO( zTs|n${i##jXcU?KxJZ2qtZb)9!GXE>Vit``< zJ!})Kv})stKxWQ4Qd=HHiw=rh_$W=Z_#KfMcZ&?d7~Qc;q-n8}7yVo0(w8E0pHI_P z_@9GOwfW$l1yjc##i=lJCA#YmB1w!_2DUE2c0GbL7_6DAV89lN5G=#xuQ2DnAkr|$ zezkupWTh#K7zfQ*(0~Qw!Ipd0W9w1SkAI$sbuLYsjEVfQ$pL%IGLZnlatym+pchjW zDuU%ECxnT0jEhsICKg)LzW`SIEu00uCc+lX6)HG}T{Yl@;K&lEcy2<$F|BZ5(RlLU zUFa{T(fX;b>{2weiqzqJjpZgM1c?>Xk_z+45;|NhN)KAxwr63CK1+{dGPwCO#_d1j zS1Q!t_ocga1;?K=~a5D%jfA1g{et@HWqB8%UHF~X>D9S?d{eB8j@4LTmzei}UoGrxjk zm>3hlifPFRX+slm@qxZFor*=i(tORctNK%D-yidCM*wofpLxxAT2DNy0~;g-uL+m=grpx7}IzP2^AW{sU>h1v7(h> zYz=iFsnmu-bexJbNu@Uuqm7k6+~Cq?JQQs9&(GJb^LFV%YNUc)+V0L~yjwN<+j;%T zZejZ#l#-*-Xl&ZGvW*GY+`C>jV7sY}x?KsaHls#{)3P+yg)Hflk(^T(Vj(64Y_4*{ z;DUkr!%FGih&Aw(o0&1j@dna!3d&f{`$YSwB^O&_AtqwWNXLt2)BP}Q9PpYtE+zV! zI}j)6n!55pzzj8Ysl|beEh*>P(mwaS+GE(C(yuKM9Of}zIjo(FX#_pu>fv5gK!9o0 z6sS|GWy`;M=mJZ%bZuNNbwM+B3|S3aA07$Xp0aA?g18Gj<($;UCjc&J#=OXe8*kJ9 zBae}w9pHm&vFMoS&v=IKT8))o%zNGquws}+v~CqEzL6J5QXgBL;mLcEA8IW}*?Uoj sA9;EHp_ZqBM^+B!M{b@~+oyQ{12Rkv3(F2YIsgCw07*qoM6N<$f)GKn-2eap literal 789 zcmV+w1M2*VP)Px%&q+iP*`1umLn;_OQjm!LAr2|^D0iul%?}UzP@ar8oBM=l|i?_ha zi_m))KA)5IvHYTEu=WC~SO?2bL)T3Kb5#N+jLArcFw_j+??c^j8ONaQq?W&rtv zZlIpq@b!x8-d_UYolsmQRq_-D-^g}JH*P%&t3;>&3G_WQQ2thBMkDiVQWcsitJ*G% zj7kH)WQ^+1z``{!D#^OyER@x|?}k1==Pjt&XLK#i3`3y?*^UP=F8QLO>?oL)ZL%f_ z9oi%bUIz+BrRR?Hoc$13l6*}5Sg10?P_Pz;+l=$^-|+UJ3#MW{lnNNlp_IhCr4EX&(OCrA#_9nI}r4d*P3(7$4EQ(=B zE2esnBYLd%t2xwrPY%Umxr`k42G>Rz-r-%-YOC2R z;BR=>Ej$^9w7Nc>g8K84tTEFVwJYmLiQW#iG4?(3_8@(4A%_egb*N{RHoa)0TjpI& z=|@MEu$4MG)W)*-oEICNG@rR1u6FL!Nf?;{O-7i_^}`|{@0LvllA1el$tfAxh=m+7 zojRL<|3GJEhH?R6wGZVIcn)=S%i8DAf3B|E{mAF*JOP#bl+N`Z6!Z%WOl9B?iksuC THVtpx00000NkvXXu0mjfpAUTu diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot1@2x.png index 7263c727370e274bac38adefa23fbfc40025b19d..d16b39adfaa0e0ddad28fdafc51065a4f1e86140 100644 GIT binary patch literal 5320 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 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2.png index fb5e7c60f150c2143f110d29c1ac1834ba98c4bd..e312a2a58f9e76ea01c3e95151470bd67331f4e1 100644 GIT binary patch literal 2279 zcmVPx-p-DtRRA>d|Tlc5Q(oJG?9cqz?cw0jCHA$fc?P`6BSB88y?}2>Q=Nhwx(?`q&u%W-MQ!M_j6{> zcz5>By>rjZZa3^n?wm8{d|#h?p5JrMCACI@nM;jE`zEdEBZ~CAsF8Q8#>n|-ypxW*7EM9MsRqk9=yHO zXg^%92e(M=m0isPFJwSgS7vY+I$Y&VjIY*eeX`bQ9TB6BHyW*b#sN9ZD9D6t=zuQK z`H5k)YnETH^K7l&Iv}-rqSkERE=GB4rmQCzI-tww6y304t#umtjYjYp0eeo~_K(Gg z(z+;(D1lDsh7GVKQZ)Hwy%~HDeU02G|0dvT=?;EpIiy)M!0YYXmPg zo4kDlmUSV4EwBl;!N!RwU1ENZ2z*|e&|?>)38#TDO3dN^m-H2n^Uh1o>z4{0 zE`Yz|Q`jod>zy3Gp;)P0NY|9w{GnXPKFX!G+x1JmkN)jedL94A30RznjvduXX@6AC z3cy&WvZjZt<-*nDx@R{WVYqwA%N|!Zl`g5~=j6A-(S}Og?@~>P2YxN@mdjGg!A$+OBk6N(jOWx5} z@ABpb!GaD=_|-eT`K7XFx{vTw!ngQQl#LUB0a%n^ipuE&7WZq9bg`|KQvP6+z$Gnj zmnu#EJa{imQLsEiH>b&=Ep#(zK_~rv?`_;|=4pIM<-h_=z-Hmx1w#K zYrOMU>TcUF8+o;`xEH$`$pKARXb*tOmp*-LLEV$gkzNWczyxfT+5pB*g>>*6%jM#N zEf_D>H(7r6yr*nBE!I=slYN?wzOkPkBVjNJHiJ>*7{J(;k-eoS<&8AQklknXnJ%|~ zD6jry)2T73la|Jd$gp`XvB3mvz$n20#vYW%JfYeZsalz7#u&J4eqDZYE=+Mezy^#c zll?VusGIF`G8Jugso`sW8UCUYs5^YUw!0poN4j26zkcIR|Bg6NNqK^?EEvxU#w{MU zQU&$PE@0;l^0t|l`tn+X1sLd<3Do|b2l;(T;Nr@F4H$vd!@jX>rJ6Y~jyNeV-&P+V zx?D_RbS=ZuG*C{1888B?tg-bx_Kh8F$o#e)_4L_f&~egfFbY--TJzW>?@P>(@U-5Z zfqXKgtot)S7J)sC08Fzu5y--9X_?h!HoaakF*)h%Vx(C)%HeA7_#?B;IZZ?NkmjTW zPh4;sXV!^oN;YijJ+(@fY!Mox^O2=I3NmM(v`O{~IkBCGATSiKF}U6{POpgYi(jrBJKi zzbW4Sgo3P^DvqM6z$()c)o^6#B1HVEbw6s69gCuitp=lDl_t$+a6T(SPG%M4v5MX8 zM~&wFu9q2CyGKvC*SPfISepb%yoi!xsOp?{Zh#LmpB2M0uh~vt3{ETNv4cUc^W9a4Wem|-0!ifjztU*>xwCm@b zd1^8kais!xD#Ufld>S}YQded*7WB`aWOeF%_d(hvgrWLiRz6&%0M;BXkcjJaEnKK9 z9+M8#j;u;S|DPqLetNXqzmXmcqfBS4jqZ^ho}PQSt5Pl;$qC4o>_xu<*GZH=J!rtN z|57(ji+ISpZhN;WKXYPb4UamV$w-??w{d}$T(A+W7_^kQPETl}+mRkMY5(^7a8&OH%y0$ zFm(shr{qQa@wcps)v;@tl|(7JEgi7P!Q@$Bvw5aT+dtC4e;{w=C-S7Pk=+;ZeRZx0 zS@5Jf5WoN|g6aEFJu3jqDcc`qCG&!upno??6qlCP?0mH_PF|Kg(Vgl*00Xc@PY$7D z1z=>zA@Von*ySr}cd?|0HbH+;f>wz)ZH?`M!C)CMa1~&jn9DZET_J~ulI~msQVSY!cOcsY*N3B^H`N7k3w%?3 z0$@QS#zi)9INtdmc|<{XfiLe_htGKS4C;0HpWxAE7guNAs#@)RxIohT*y?4RyyGxB z!-rbe3-7hUgO9u>{-M@H0Y_gE=0|LvZM0AE{s%DfEPe$hhARL7002ovPDHLkV1oJ4 BZBPIJ literal 1051 zcmV+$1mydPP)Px&)k#D_R9FecSXpZnK@hI$*)wcR@CfEW;`s^6J9MWz&SqzaFg6Tb(^d7=m+I=S z*&sw5Yj4tlluM^GW$H?JkdZKD2i#&3husvOecz8aqCjK4PU~+`YjTPnHBQq?APV+J zq{%FfxXsx6b}xRdCq^(}6@)c6sjGRMKS`GQKv|j?wB+)H3;jUWX*n+#Ht+W&M*4Iz|HrDbBMX2jC98-1iCk5Bu z^xgFOE2eO|?ZRf1TQw{pO#m-oU2kLdfDq|J}?wUmnCy3eL(xst8+SBO@8e*5iUz z>=q$mvO+P9YZe5om=+<%c}HACbR6RP1j{vx5D~O$!5*(LSxq zx(XJDWhSOYNMvYTp{6XXtrtw%KO80aGVVW8jxszCRx3Zf zW!!~TYO$VKZqd0RzrKRDE6jC4yb`LJzB;cwN05j#U+uM0s!$JSex zfd9}~)nARX4OVAJe5STS{WYl|1Ls=Tg>qtiw!!KQAyjXy$}!3;uM2f$RPz^STc5Jo z49UhiPlg6x+4W(9N7X3|#%CL>Cgh;q;xzOzZFUu$ILkvIcKL-tiLj^ VIA81Y`Pcve002ovPDHLkV1n^|-dg|w diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot2@2x.png index 7c8d133c34d7ac3d0bc4d856d36cea2726e103b3..cb3fc0c51e4ed6e9b8e60a4d372af529946468c0 100644 GIT binary patch literal 5838 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 Ye-SC0knZ#-`v3p{07*qoM6N<$f}YVzq5uE@ literal 2035 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 literal 1590 zcmV-62Fdw}P)Px)@JU2LR9Fe^SKDhHMHrvU?w*shu_;xPrnTN4v|`Y{h?e%Ph_p~qNiCxERbRyy zk@!#%@ek;$Alg=qMJWXl5rsngD1z4dP#WX07p)<-X>#`L%#Ppho0;wA^u%21i{O$o zm+$+2moqcFXCuV_*FUd-9R1_taox6W3S$%5U5kM8L3A-+jcb7_R_9m&zD%?!Gks7# zI(4Lw)+Wr;L%@+E2`hoTr*JfJi+Go6qXf(ZB1dWt4P6|fMoQ@yDL9F7)F8yw{}Nsl zHu2jO#p>)qF{Cgfv%x6W!7PH|L*rsi<7p+tU&6TE(v|ykVefXO^n1mrf%))M;ji7(>mEckDY}8apnOOp0~c_V(Jo?PZ!yK_l*ZwHt`l zHN%(<;VXnWf9p8ro?TEr1Z|=(6a$SNvXMO{ogLKHzEH;}rhG!r<*zob%>SnI;;jcZ zJ%3-(Opnn?^bFKuP%T>+2YTTTGtHP3JwCxb`nXMWmRynQ&$o{3A3J;Dqi+&pcht9| zCg2!PTb1U;uAhHBa;03~*kJ_C+vZtbDX7y2U8O|>Xek8w;z5{kl@Iffnhu!}>-t~$ zsdcoKbj(gdvxkNFz*WO*TMi~Oos(OK_wO@_ZpE91jZyhRyrbO?9KOKM;`Sg0fYJJb z8R~t$jU5JrYbamGGZg{4@!Ht+XD%N7!laEcA^jTk!sGF>V1?K%M1m2&rZ~WI zENNZ;N?Nxjnq(soXBTi72Hp4&PK$C^b4}kllc*L-d*KoHE5z9wMIeu7!X$Dk)owbo z@Q5q^#(^0fF7CsGPUs0c@5XUvkcc%H zRKy4dWh=zRLdjVp>4RR&S)S9FR(Mni{bdyC#)BrQh-(6TgQA*Z#wEuRY2RZKiiMk( zjV)L)s@>Z9WKX_n?ZaHVNRzatpG!Tp--W0f`lR};0zoiAITl9WuLpjx#q=Q3*p5(A zk=5}{lb>i#=H4vo>4W+RigWHOt?*kJ>gd5p8Tvz!ZvqK;C|;-;I{1EFz!A!;+89_2 z56A*uFIUC7@%~T~8^oBD2Hay#1Cy&qXccDaF)j}EY?6|T;i-(1bf!8TDW~G?jxad8 z@qDOzB@y#?n%QfGJc&6j77p$>&x|*db8W~$nGW`+M!V0J!mGF(j71YjSd$v%%DwdJ z_6|KDVknk)7aR?+9(bHFdZs&_rf(-kJcIHe(G%|;lup4;oTh}XJZ^a zwu}YfDvZ1FxsaFBE$+#*)1Cm=Qut-P4`t4cWLGa8&Ii=vc*ud2SB9G&V-%2d;lwPx zGmRFL@^mJ|5WDe~7R4|7eW)qq?&O+%cg_rLo|ocOJX5SqBEcK4nw6rQ6LO+`?}pox zPJXy4#3Ax>i$glT$GbB(v{z54(XF&B!d6Pa)$ z4WYlzbJH?T94`{}vTdmEb(xgHn1@th#&p|#J0Rs2q638aAchHUn)qJ~jCJeFZRbDm z(p=5(8$}e0M4rv((K1mDQ_oi-tH3Y)J`_EW3Ok1g#oz@4j@8GM;N=f7bbQ6yCGe`0 z(s=e8B2bBkj)em!$B@IkP8^E3gTqzg;YH1t_Mj=fDRAN9K2BITOsI=t7DX}g2yz_) ztHWC|bKTg3{G~k2%G+&|bp9%b0Z)wI-Sg6_dHFfCaw`GBD^_y^8@1_bcyG-RE0PQP zV;{F@26W3_+6T|Qf4NVoJE0j5H;>trZ(=S!Dq?=VEPp?H|AC=e>7v6GuMqDFl;~n( o;VVV)>afQ=`sz&_sQ=jYH+DPeSs|7+*8l(j07*qoM6N<$f)iv2<^TWy diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot3@2x.png index 761a362e918d5d8f5c609f8b7c57b2e0f9b2692f..74d612ba171efd3151ee797da5fd6888fd735757 100644 GIT binary patch literal 8056 zcmV-;ABW(HP)Py9GD$>1RCodHT?vpJ)p_pMGqXF=YLSdMbXW(cB(5?B2g)I3P;9_p8y_4JLL`n! zoN`=tj7^-f!7dy~Vr<7pTor?_SP&rrArKr4u}iYCA$EWw24Nv&khBt#5CY3PJ3D80 z=llNmUQh36XLpVs?aZ>TcKeltn*CAnrmf9 zr*fQ!5U-grt>*#61zXoiamN9i%@*I{JN}0-BCo*Nau%IM@GxCI3}qh-FjXGb+xy%^ zIB~F0SPD&+Lzj!7%LVKNS`T#qoo>DBxZmyT>v?=4bnAGTnOyGN%uxQvgG0H%{%5lJ zCo;qNk7a`3$WAkWI*D%3(dx^XHqe$%(|5x3$!7EK9L(k(tvD%vU~o8p3l>r*O_)** z3Z|~qd2k52+YSnwXj_A;o?~U_HpZw%uw!?Otx@6roEZnY9)224YbADMH^{r zx7yUO-f+Uh7+rt^ZbJFA*12~k2iis(0d9ddi|z0MebJd3H>uU|aIgT=)+5G9S%}~|^u#9F zbsZUOT@qbD(iike*BLUJ!dPfrEIn6G$1i1u3%LAweFoZ&5&e=K&Gb#zdIHl>5-ZCu z*>mk+Hva(1Chs|@PNd+2+4KcL7T>@}^i`eYozV=_&wQM3A2UW2hlcW>f)SJJywifK z=?nS<02gI6!&mfK3oH*EDSrsSG&G>W&F#P?!r6yTdUr{pZ{VvP##aOKBT6TmK!u^K zUL|88fu8!hpOVMJi$01hK=*g-fZ$ylOgUNI8}s);@$`7cP1S1;&{y!?ea3g$j=KYf z)!_;#SfYYM+5C5)aAFF)#ymiu(RT*q5`Eejhc>k~BUix1`Q+v{iFw_yr4KF06F!pl zBEe3}Q{cwc3nL(BC+wWe6(4$*2e!L{t*>vVVtg_|Mty{&6o%-fH85s=#ffm7GH zZS%BdOdn&ml$#;+eOtw0Rd+F_4gR)SoUoIBTP^HN=4LTlr0bSO5{t69UtHt&;(Z;@Pe4=hX=FMTwCBivZ@G_v8C`2`c+k$Bd4x*Wi z^wIUmSSXEBM@)zf2G5ye{pwT`V9yDzCtpkjU&eoK6d83FaU@z`qiHF#fZ7I#nPfW~ zqBPO;q@cG(HW(8VVnZ_D2|inkd{ltt<*C4VD}21aZ(8rIwTSC32NEGLOq0;Wc3KYc zM8eh!fVM3PB_9)gxwq#*?+tG_uAJ^&Ri4)K&*k3a&-|o2MB#@*zO}z@ACA(H*g)6) z@ZlfUdf{#Ko7bK~kDw>rucMb_N8w#}5kavIGh;(smvC7ibJ?mzO&`hBy(6^swBX@B zZ|`esQzh?R3M<}5<=3nKQ;W4870Vk-VL8Or+Dyu+CJlsZE1r?w|L}+?9W9!962*B6Z5k>;E!Q^scL> zXP&{zSAnmRWp8#eU%K{)fo+*ncCWkRGW_WN>`|Be_UQ#z9#`y1{-;tH>r|>rzAz%M zCiJ(ot;7~9Vn+<4yhZ@bJu#sDEcA*ev7-#8w-^G9W{;*P88Jv~Gg59ch-|Sqk&VZp z_fqbDuXo0qHqBr0o=r0@d6}S`wrAa!PusP2XL;vy`Bbj>FRJ9tI!HcwGhiCAcf%-? z@-Yu2Qiam0ExYbKu=M41?`N}T=dZj3o#=)@DKSSHvZ6)($)eRjtcV%3pQSOZa2x?J z(7#%$l(VMNq{S3G1|Nv$B*wwUQY`gSA{8d3{l`o#dRGOdbn@O`&%g4hXXd>383KFC z-u2&peqik|Zi{}>EqQNrc?Yc)J%u9>t?=dxzqyol z{~pfdN>IXB^wOr5d@D$^Y5iz03o$etLx8ze5oBHn<;%{r-aA{Ds5ykAgIO8{gYg%} zVy7`y4-H*!r@K+<;b2UeU)?l!@7Rj?oZ~5*SI(flmD3XlyAa#^07iy zJ%#cO0QmPP z67H2aWNID|i9ZV}%fu;+Z9*zdxo&Or^as6_AJRv4X);aBV8+A5kXTwa zA;6e)ma`DTAGDQm#9|C2GZsH0Au;ndQC%iPx}78=^ccDKR={2N#dM)`J*Q&JN_dVz zPep87+9&BqSxtJ3Wc&*B`IGnF^&ZlBvwGj{+v|XO=xfO$vzP+Z5bP|LWE%nu!v$dO zLlu)e%?45#=txN-VTukK!EDDm3%vC32)&Ak((}-uR~+=a}-O*rmvPS z1U`-t#K)5FLRO+wyaS^|{igrYXR*Nhq421azFK~qBba)G*cmKYCIIunYB+Tc1n!A_ zlQCnw7{`Moj89Q#&r#M`HaAUlBkMd|3KeIhmg{rwy0cTo(q|nXTZkHT#-p#6PvaRZ z`+DgUUeJ$AsPB>Xz`Vs*_^u;6?A1$ejT5<6IGM!|h#mCULoDsX@_Gd8jXh~?yrUON ziwzc3WYGJ?6zgyRrrWR>g|?iHSR}1cSWLJ-eD3heWwo3vlz)`q3YqQeq!)f*X5}-_ zpx^Z8iVI+n` zoEKh_uwEQyjAd3lrOR2(Q9*hiJHPhMoF#YIezW_|ZzX-b#bLelf}r6wLOw1yaxcAbBWYA3byK7Cq?2InwfPugoUk?;Hs>)GfFbA2%y45*#&HL+!x&?t z5LN4((MFFr7Rr$;`zT3ytvhkjJ~#>i&r6G2HHdfRmLW&d4HM1F-b z3=fi7!~VE^Z83znGsqk3h9C`{7GkO^ao5(k1(F{}qOos8TFR_LYy-qhlE#K0>3)Xk zO}p3sL(&buXI zN^D)(DIJ?>L%|mTvMd;4l&4w2lF&&^v(&`aF(IBv*m^p^Q*LqdoE5($Ny0B*Y3Xb{ z9zE%#Etry@rDKvI;3^uSmVBwCuGREd;3f79UdnoGh5K~F^u~VSALD@-5=($9*d}Eg zdf|Bz=DX!ALrhHbkD-cV5+5n$8NHRe= zu5#M42Q!V9fCRpuAV~`*ohWH>7OEJFXH7ZlU5Af|I>WnXT%GoDQNm`@4v9MGaUG=t z+D7Fs9lUq;bBDeE)y?x(U29r29l1TJ$5jE7-zfUmk`Hx6|E7hGMW_L$K1-7PfQ2ZA zZScpUX||636=RT)G#!mH3v9?YQXc|{GR%ZpFJGPA4871$NQ6J-s{_OTwRF#atQej) z9RA23>e4_WT~19`xzeps{!#sF$v?>c24s%cG!X>Pd1ypzljzk)bK=3xnO)-%Hd8O) z3ZfOD$tRrVB1}h=frd`N(LAmj%oko#RzH0$`Ds5m%gGOIo0g9%KyfB-TmFJApPJzZEMk;VVPza8)2S&H8>5c2UPYNLW`Yix zmYgNOOXC!R&*bPJvCWXbr9zo4w)7&Gh0?AA>5WZsMixtAi(ggM3^K>pNrvJS67qs` z2~^bKl9vODrQT!^nUn?!nS3&rBsuO!=rg!&V;YV}AIi0QbQnEti#u2>i7mc9gO5fb z@Y6GK3nIU8bTLCv;As4XvEUQ|%T$F^cu*>xDrJGcyD54tjVzjz-)4HPSiDDzC9%a5 z4|<9=-xZ2il5o>Q#)8TsgQo_O1yX6sb@NJ@=PhFsEc17aXon&>=do@Kdf^J5&C0Ju zFK0MwNUQQ`LyRHB64<)9FqRPv{%sk-;sZE0g(8VG`>>uq3wj$A(zBk6;!7D{3s;RF6O@!@&a2 zdaMFvw_1PU;cNKxBvCRf>!P=f32rm;tLd>q4N?odk36Y9TteLdbq;%{krCCuntoLM zg-Lr3yccapt{utoN|Iq?oJ$WIbfg#udyckXhd@vZWRkvr8k4_O7x7lY_D1Qg^F?eE z@~i1f31{ci>S}r013y`wKA!&7^ws*)wl)O8lGx%mRV4uPTYha2r0uhy5>V5m z=r#sfTTWd}QEJ)1+V?UKfbVIPo;*UQHX*;7zT^b=kmb^Wb?0Mw-#ecE)%4Z+lULj! z#1h!zGD)9%`Ju+R1(BZsMk|qE+TMy}9T6nn(uP^_hAw9{N43xd-bb1D79RdN&yg3O znXQ}N_LOGjTYCI1UF=^l{I?XXg7PQp)!)*OCZD|G4i-ydi_0WEMe{41aSO8i1UCbo z#n7Tkqa`3AX;ToT!BlwODKD=*n$vXARbR918P`J}<<*RQOOIFTzs+;+@p~RTG8Oo5 zk3+uL67#`gNo;Y0NKeuH#A?iPLUtU9*0IsFlvzM+1H??SoefF6Gg8iZ+<3&7qwmx(K5;)nt?f6&Mo=noBn|v33#`W2*Uiwz#^O2!^ zDs}$dN_ofay#M&L;lVUqzM}SB^_46KBR3uV>GFhMbgt;^|lkY z|Jzqsv}N(?k7SklYs}Sh1Ed~$GOkBHrDvVs#;uF4`WwnRVf&h!(vG^QUiw=4*QBSA zxPk$g*t&f^JzH@thtrI6ET$m&Ki#Xc`jDCgLTo9={WMsO8qXQoO7OEwE9M>a>9<=zc#~hKZ6%X^+o$Q^keE@ zC7=A`48)LF5>sN!d(nBw96&{i->i>QnDBzNGNmy#%q6xNDK{BJwpc)5`%&n@Q1t=i zrQ2@b2)*T;{OmESXATAGmJ+sO5HVl`(oyL}h7}Z%kB8@q_|5eD&n#Ls`-R1;Wru(z zFW$bsFHj$YX5rH}wdkp{WjmJsBj`oh_zuL7SVG1Cv6aOFY1-Uf2^79dd+td)?$~+!9=*EWddyXy&L1=TFl?1`3wBp| zky|>1j;^LRB7K~}i}=wX>-b+>y7;Q;TaQ`&XK+k#{PsIfKY81lebbe5xgEJeV&xn9 zru8@U#!In97DKQXOzo7s5fVOtE_xo~@5Uw#jJN`_iwi*(j>aEWcqXPW8p}NXO;S(c z(q?S>bl}YIDfrJUd2!9pihaoyxEb;?xP6-cd~P||w*Tsc>zo?+!6K|E=W)uy9$>FP z)^1F=kIh_^Tk~uFaDec<^C!;yUH8tOQO@3)R^Iz?4ap~7+NwY0#uo3P6c&y5zm5qvG0(ZZ@SDqAl-fb&Z#*yshRZ$5v_mG?#2 zj+b7t`_40ig7=kaZg7t4S1yAZkuNeD)W6kTcB<{dcEh{j>$xiBo`kI(Hd7r5sF1hP zoRqsP&NmFhZImFT+F6pPbZB8afNdiqT34}!1Y0+vEo(-h_xzxQ-)o=7$o(ZA>)#qA z5}UnV_tyzO>0^6`rMTO30?3x)>4)=E3bCVl=?p8QRr&SO+wGjhz!ndKg~C#&wSfW5{CWSu2MKzBWGz>BSi_9Ecg*bOA9WmX>7* z@L@{rhyNY|07)lTSZN!y8VfcN@WK@}84F+`o^l=*d2ElsQ9aq|wWTo}ff=zQhQ!ix z3;|{V&|f1JfpfKO&}xj^h&cNp7|=`7eE>b-3|u;$6o=q~AME5vw7^EwQf2|Q4G=TQb~Z$5qUmm@r*Eu{t;EENm=QaT zVTIcWfPp@)ES$SojaBELR+=@RDkf8x`TXtHf(%pyI}@8zvOVoerL7kLDVl9389jYM z-!$*p3Z=ygK3Y!czYmML`|_dAmGoxeb@m>F%{O!~!zE1$@?$+L2PupK`{>nTYP z)Z8R#!9x*bh83)ff*j_$n4Z&eE(o^MC-jXrw)vxA1gyvb*nPK}Q^Zx3s?1RS$GCiX zJD!xe0eeQ@RH^Bnl)Zx%_K-+#VW$zpabSO9`YE%2boW@OHN{@h*9X`T9E;bV^v_7Y zqgwwFQ*>CF2=qrd0{`RaA$?(a7bOHhfES$sB#nybbl*iL9i*yY1B|4?Vpi2^RDk=Z zP5UXj^%)wrUJAaOqzxGC&&yY(wQzh5*uPftOT=B^dA*qw!^(y znVQi{K81h$GS_8+AW~%<{vuNV&~)kB!8H*id7O)o9w+1h}s+{UbQ%2{>o& z&~P3f>FBN?kP%@d7=E{Dzo%u-zg85%U^im z#1H`|Tw>W|6cwhygg*%N+}d z9jQ?RZQY2rRHjaPJhN4P=GfJGZ>&~~Xn{8N&&y&OcnuEVBQWry|4#(G1^rql#VsHU znq3JKOdD8702!p-G!}4Kh(t^D(FADQuG;fq159gIBn`|c{(C6Cs&ODg# zb7B&!9>c@I0(@G0KR+)%G?bU+d8`7an2qTH`dmKk4h)FJn2npQ#Ai$|#-hu|e-R%h zmaP?<zip!}1WW7hT!B{tdZNCR6QedSD1Xm5~b{)7Lc{wzI;V{IjN) z>7N+eDe!f|8?)oh+Nb&KgfC{Xs(UAuLo%Fi#(amqK!vs>5#}am81;gv#xh@I^ugf@)RLi&T9RgFc(E)v{Hn-k8^H;mr`- zV&i>O^i*@3zg{krw;g>!pI}-pa&byu9rEkkR^1CDlDw@6BYbT{{sB%$t@7=5diY@W zU^f4NzUqK);3N8~Ywf~<;o|VToXx$2)!`LgYfOuZ({@b7FG+{T`If$Ek!5F)WBOST zSx5wY`i zZ^1QTEbk{D3InMtbsnVdyzJ4JK96?n9jQa%lxi87T<+ZHLWEAjwDv@1IRCLY_YA3) z+iadXiEhv_1eH2tF-2RN&!*0M@bR)l6Z$4{YwzP4?1dkhga_>iO4~WNYm!s3k=3?ZJPKSL@ zore&w;kF5gN4!}dhYoS@=vaWG#tjC+5zcV_5;%IfarB&My*L}6HAfvbz;>R)=Am0~ zCGrx!!a2wfHS$}2=5uf1H==ND+Rv|(-~$#ju ztsC*O%m(iLSgU=fmUkt<)y@RC>1?rh0>4?$(Z?@e^W(^P>!F{YSjAM{kM~*n0h)YS z2JJH#jv34d8SDZ*gcs`=zbxOcz%0O>(#=Nc`D$6+mj8dpJ8^UkY5d&)0000Px^pGibPRCodHTMLX8)ft{MGxy%*rK?nV35x}k4UbANkr*3m)7r%NE-3HDXw$@) z_=;_#fWc}T6OG0;sm7#@fXgD3mQ-zNnzr;|HPu*g5qT)f!(BvF3hwL9VIdgHGGvy2eXBarcz~C{U;Cj}P4VOl3;d(EK#ye5$ zCE;LHn;t4wwjyq)1nF^uuz*ty@3~Rrd;7hi{=B!V=f0^xjy~G{hKjVCW!Xf#ehXsF2?7LqKlz+)zU9xAjmdTL4<4FDpO4g#R4oEr~_)lsk4LzVP zZ%bmZjhTnme?1PvWquf6rJ^`@vi!>>rDhR9>>F8{7FV2fiWp|WjzgaVOJUOEJO-t1 z@R92l4(aA)Onh9ojV6>uA|b zcbu=L@f;%rQd03%62H&M;XnqsZH@9GEHdk)L`KSqqaN^@hzWiF73b_B-)|Ux!^aZy zZ2e}gubl{`n~l^?WW;L(>_|e zDIdhwIiv?{Nvsf1DUp#@Iq~z;GZYb><;K*~VY%&4CE|oo>!>SylyeV9h2fVpjGKQw z$eE|LH?z6^iJ1rL_J{l5Z_l+Af2o3~`UE_ugt)NkmHMZ7=;by<`kSG; zZQOzzf_!edR*KURh_PFWXVWC2&`sVL?jnCTNi+ozAn=A|maq}qGXBvKoYW*^9arg~ z%HR0TxP|AxJNm|VLCo}n>z?1auddZ=5AJt^=mHl{@PdU3ap?}vI^tJq@o(|8{?UjO2&u~wTeF^3HmAmn%XIA&PXQM5 z{!bB7fmj!u$ zljPA8zSH<&$mUPaL1cpdgcOXiQPk4lK`S@v7GSm0cp@Yy_)l#cGyi^!);6zuBwuX% z7u~6<*<4R}_ysUsdh+jRmFtL>OmANIFklU1=ie0i?w(%7Pk8YUyvrR505!)!4I2+n zZ#cwYiHt!;#?2I-X3oarm^oF&@Bvb`+X0Z;6JgoP z;qUXN+{<*jC-OBF>|KQ;cMRt3;pM<1P6s?jHEZbut53!ub zGV%Liv;@yscvT5=-oGowCoaftvIdFs-s}g(O2vh&Lp9Q((d=N$!Ar zX_y*kmB%2r?Gpba)-kOl0xJ_wYo6Ek(FZF5Q(o@TO7YempBa9eXTR3D#2`_LaY;br zX-wd`TizaV%_n%)aRa@S9avyF__VFWzm2lDcuxnn!$iZVd4CGM)GmNEc!E#sIPq`w zm>`@<8A!KTCI&@;YBc4VMiAO}A4J{IwC-oVW1e$Zjzbyvw9j-KaEBu#AKmy*W2EiJ z&Uusds|A?Qp4w3LeXK^aHPk#dXMN6&v92E903SScPj#*k6i zOYmq@(YT9I>B>J3BGxRPZV+Dc(YY88wX?Niyv@JlZQg`PreKYuwSmF81z-`EuN-*W zk6g7KLCn_A<$`_j7)Dfpha0FT?4ZX22puQ()gOzl+m3Ogi~Fk8fgn}zJi*ZcPh<4V zn&V+l{apvnZ7j~jZ)_TU@xcDAZSyt{EAVNz&V&rexXsRt5m`i8j&axdGvKXF!I^wB5-50bf%ZrcCUqZ>!Qf7Z>PZXdhoKC98|%FXBgqdMqr&v9{NCPwyY&1U?w z79C1v5Msqt#h?(AL`8!#o)AC+n#ns@CsuQ0yb?TPV1OEFygJhQ%GBoH&Tk#knrxCK zu~g8g3UfnMTku@kemefH{7e3Q-VdU*cA9wgI1s~GQU#*XW*OvEN@O&U1e(@G#8j$c zeVNn##hxMUrq4&KC+#dgrD@MHBpr#k691yx=l!4|el=~I@&ncRHaEkObU=i#Mlunj zfqdmM8?Xj(VrwGadK@F zGlM36t8M`#i=tZS(o4(U5B2mf8+>2^=MuW(MK5B`&PG1y`|5-j@G za6+KStYaS5&J+^k5_`8dcs51A-umwh-|o4qyooJ^4yBq9TX*qyhL^OFf1me*=o+1a z7~%=%uEN&~u*^;omo&tqi8Udf$E^-j(!o-N3lkerH!c!yadl~aj4LL79V)d{;g^$ zzM0XhkDk?2{8@a~f1me*D4$&IzPcL`5D~PYxBE%JL4+3%%Ws zk`tD!L0}F-d6j?@u#2Es8C_~~u{CBDV{~*EX_%`7pSIN- z|AMD8^E}p`$<42xm(%gLQekjBUBxeW=x6;iL6`|LkZ!X~2oVLU(Udg_Mt!B+uq~=b zdq>UU9|g)eigvm9w9jocw9sG(d~4e=Tj}@JI4;@qO`+E#LNB?rQo@A5Gf7X>yh0TwQ7W zUHLaGTSAg~l(1pRqP~zJi>O?3BBy;|l{*%0rg61%!h(O$v&g-~dh+@qdR^g-1FKbu zfAZ0))ML9ZnEyI_S4GGENoU=hc*=`Sl@Whe{>>r{g2;$0&~nxxIjtD~RAj|pI;9DK$8>HB|+a-P^VVbKcstlhij_j#>H^)~*_ z{FlriCId;+KOqK=xsX7{QIiS_Se9xJan+R!e+XYw8dp79<)~}Q#dj5d7H?({YadU#^o+y3DLe}(OID{tLR1=0m)cNA z-zy~Ts#)|*o9lmr?l4Eo!ow(hq-|#Whe~~ZOgUHVtXZ-WLsRyyetNj$K1e@&F<)_e zz_V#ObQ*uw|E$K^_J}u7xULv zC{Nk5=JA5o_vDn5w`gm>6TB#-{L_PIk@nAC+&OXa?f8NVm5V=Iy^dz>JYt4_7?k+$ z1P>8F&`Ap0@7n+I-zW+q?SZV77?d&6WqGPE@Z$^_rFP|f6coJg>>jgl8+7m~Mm2u+ zi0A0J1y@bv-v}jOYKTo+)7?I?gdwh0vsz+w&Hmuv@cuR4ZKY!1tg~?CwK$hNfcq#o_dxnm6 z4ZS&!bzNdW>rcpc69x9#*)?se_{Eb0bewSqHjW$~wmes*)J^7BBR%`?G_G>v=br(S zvRocE4pUhp-N~55GVu|8c?-<8uK5+Dmmu^yCm%U*XdGjHp-Q zpD~%7dcv1nVp(PG!)l5E(ZMyAjN52sOvp~gJHbb>4rsq-E6tqO>DNQMwC8P)3hp~z z?8o%;ys2>W_`kvmO^ zvoi6XQuIB>neBLLHg>ahM3+h{mKR=Pj5h>goq!A!CaE9%r%dyihJDUE6MvuggM>Ub z&R#hWBPM5k-H#b;{0T2~@+u$+_jNzzRLA$reh^O=V$@6^rZ$;IvK~QzHWypt>S1m4 zZ9BQ6LJ>2N{)xrGz`OJsKv%yBCRHU-NpO;YM0)~;1)LMioECU+<95V)KhC7h@A!KV z<;XJ2Q2Ojao-EL|eLCX7ja&3{^LXz@NTN)c6I%;0mM0#RaUlgvCM2IGcyI!4+z%%# zc=MR+U)C1u##m`{k4@OHWKmzpkVRZBIguL$+dGBvxUA?MvJsqsn^Y=vtqfq1C-{VU zL}K|x#eva57U{R`{~sH`5ZP7o$Ue}HnE+zKa>5O6(?I%i9q72S{sxU8Op)|VL101} z2IMBdvTW1?*dIKCK!Rn3Zv>Vwhrb4G8m!;6D2iuxX%X~X1VPQ zEH~_J&e3(U< zXNpK|ozZ1!Mke?$cEZ*$eB^_RZu?2bN}sy@K7)qk{T1{zhJThP51D2iF>%UzgB~Ym z8%f^OfSkqB$jYEhC5@+FqxwUApFjVY(f&F1J3;h;$E+a~pWKO(j3J|cLL85GlB^Z= z4&Oh#Bv$&Jpcb0u^!7`?{s$BIGt)rGO3u0+7xI`C98!c;f{)23e8cRSa)yB~4+H-P XklW#uJFVx400000NkvXXu0mjf1%UO? diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot4.png index ddfd50c8dc09d014c69ca90ea2a0d2e68dfd2252..784e25edb1a089fb3733e6253f150b92b0f0f343 100644 GIT binary patch literal 1830 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≀}_f$?s zQX0eE*N8I*_tPTGPU600u1iyGfP%|nS;0MiA}{`TSQo$k?NO1>mqbq}z^=vO)JQ=* zhMIIf@BZVGVoA2R2V>GGES!3#+P#^*RS&LGW#NK|=;<*ZlL&X~6T{;4nen1po#)0{ zu_W6NX9S}W*1SS)*i#j!7h19=gM01Ovjy!`IoC^Y70W_eXT=Idv^Cuu4tOF5yWNuI zceqw=ku1r!+-0XK8@agQW=mFwz^$UkwrJ9xiyw>Xk*cFEY`E2u)nRbuZI^6W1(eyD zbNRWz(-Tp47+g_i3AT7lGVi^dsL>N@J8VR!!KHkPCE4OJNfyz9vv4}Bt?SWsB3z29 zSduLo-^?PKQ>?nKxPu0CDqKpaSduMs@WKIcp<_$>pj=9Wk>G$>?JYT&8GIPkP5rHZ8obIIcny<~3eW)s5`6>T82`+siL$V}OvXwoE z@Y3rb59W);HC%Vv66-U&S^VQ*LhyaAS~?9b{Zb4SQ`JRmFAt*SVqN+3M2EP63nJ*xEX3fFKI?t1zwf!{a3VvX6xLUw5-`Sico*{m z9LHB_1BqO2Y3F@mNRRQ#?7SZNlNBoJ{HGc&*v|Ds3G`x8#Rt z9o0vA&(In1xn(i>TV76|DTv*FJ&nFr#qvJC|3h{%DXT9G;ZPYc`tJ-OYp=rzYq0-G zzdKuL|Nghm3jR8MvDl%Ba{M!3Rml>fFZv>?)dkePu1^}q`JFCCr};-_WJiW%sr)Mg z=BO-40lQ>lM>cnxI-$Gvi2`6oc4VkV*rDZRz}x`+?Oda%UN6_(KmJj`Vpe8oSzZOW zzc;)Sm`9NkmSc>EW&ZJQW?M>DWJY!-!*M;zl`QT8{Tyc3dLEBUcN#_GcIguJY=cbRAC*Irp zD%z#rL?WG+&gQ;5!FAnT9#DX6$cU^Yvk7dP5HQaR3QZQxNG12<*E_+r-CZs!Kqh2E z6BMh7%&7}F7K{D`DdTOvfJkNZy3@8y6lix}`xPJ)vLPeMs!o)30rUKj7UUFaCZM$tC}+}9U=3m0!gQ4lVSiQhB|Xv)Vpdsn9}ZSoB) zIOSj%vTd^%)m5+|U|!YV7x^((BYbSa1jV=14QYx8P`!V3ikEu+vUd1J24n%}M=UlC zb(j<|ih_kR?geeJ~^bXs7KW@>K8F4x_rq(j|Li@Hm zjR-@DboNaNIhEaq?P%L0ouLs>+axrWaG^Q1cSH)@0~R1v4VyVx-+_odFhZjvt~(Y9 zHARuU!_+uCOwApOoDp$W4@7QOy3)G&4%tx)Iy*AFCE6x)E;Lp%s5tJib@NYKscf_3 z26SkIC>=MOn(ArSE3>H8-GHK`(1mPIYO8=-ptkmeI?Yh<0Dh~2%%Y`xPi|dMYNm>1 zYDrC752cM)SUK4$u4TomTf1&jZ@`U?SE%%~XL4?>{k&hGsFoEkR_|fBt?kye@pZyB zH7Y*}$yO?lHz2XbH~t8fJ?wfV!NaM*tfZQa7}U(Q+H$KJ@tLjM7=k7?wxc4Y+V+B? zReQX4KDD4GD3tpL3@x3Y-YBSrbl_Oegf6ERLoduHUbR26Gc>eW&@<0d1fW zweqcBs4%Q8-##m8iV$NiSt_{H{ycB1%MR8f&I(6N5cOzPuB zU+J?27XD}VQIm$E`RyQzAr1GM4dc04$9GWKhq1q7yX4Y0`iR?9PUTu^KrQ^nuW5VX z9A1CvPpNw|1o#kLK<~r;Skr-c{6zXfpXeLG(pUOS-#u=+edgg2;Yy_D0~N*A$z(eB z5JYhNgEzapqV4nnMes@G7k#9!cE#blaM)@C5%!k_N$I1gS#H5Ip>MuVrmeIY)4Gn9 z{eVxNZIN;#l_ay-6_phc3WZ|r?PNyZlu=iyInF6sPBI_UUx~ zijpX8MDM|y(U))zjYcm;Oj<5>!`PS6m4C>salAMVl{Hk+8rX6@ie&5gRU5^}*U$6Y z>WMz#oJe@5_IVDlavb7CQrY~CSg(hXtFi7;#~|iM7)N9Xb#woMv#-=0$G70K8_8z3+wG1HUaCZFYE2F!HzII3%Js`gkj7R8T}>*y$XG& zDfIlx<5Fxxe1KyZ09(ArxsdTBatyO@COA>yWk8`3%K$A1e;QS=AV-h7o5))UXI6Dc}C*=GUCOr0000Px(V@X6oRCodHo6TzzK@`AWzGFh0+7@bPq8DpF6s=#NqO=!1c-DgjJ*bFQES~x= z2nCDUqW?iX=+T2xlqwcKKu`n`JV;GJOPi$WhqjwE>%62BTSzkdl1+9t?m#;2zM0wg ze*4~hylnuiVi72ZfK5y18-w3MNhLj`g4zoz1hw=rs!en@^78T6$zHwgZx;=Oa1>?j zld7ucWQT*cEdNgQoaq~%5ZR?wE(C<0!@x9Z9Z-gLdO{Kc%7m2+Rugs53z86!8N#X% zJ3SzY0TsHtNv@X*spbLUb1Vnae*vf*NHqt@;cyiU{!%=t<^XxTzJh>C@uZpqw6$Ry z*zFG8Ak`cohtmbY;7;)Q1E5E^Ig6ssBkVid0>_UA*i+JUjLS1Z{!8h!3a{TJVC>OM z{sx4r2&uU_tffbfs1ezNI@^7^!$Bnxc*m~d^M}ZoO329`G&~xCt`0xg^mQOmRe&#F zmn&goS!0p`#phEn`8HA3P0iGq9AaiNP7hrzKmv*uAPbOyfIw_{kOfFUKp-YB^Jdsd z3v4Ed$$-qVlMaVGaQHwyBoYknB5YgmdXaFmtwBT}^|>V~23a3pe}2B|)mGRg8NM9()&EcuT}?O$ zi0nZ|?xd>?rzAi|?WB!>gMi2(hMlTijDmx9N)O0LIMM?$8jjR}WPpQ!$g3E3s&t{j zQ8LGiQZ|8F?2rx+70&IE2;jLTq=ZKbI!mcq&H)v1~qD zDNyOK%HB2mQwk3{eX1#wLzWE=B9a1--0%&jZt><&9JLhm+cr6K_Y#Oww(FOS7WiDzg9MnS!K;tjsu&2w< zxn$~CJPFU9$5^g;ZPWE?{~-mS$#)6BkBmjyNm>?I79hcsumD+r1Ox$@Lh531CAF@e2gv0mT(AOkY$y%?F0P94Z0rqg{*GmHgD z@Te?679arufmrN8HuxzR!@Ob*wg~~*z&2rC0>w4gVw(_<%WWS78^ns=%7jv8Q^q!d z>Ow#xLv7P;w__jsceaNNl=;Jr*?_j7O=z2dk0rJUlu6((V69|eAc`vL00000NkvXX Hu0mjf!%r0r diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5.png index 23522960fe518b3950bcf0832d61ca5d9704aaf4..706f04c3ab68378177f883e39b2351937bb58756 100644 GIT binary patch literal 2842 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 literal 1525 zcmVPx)uSrBfR9Fe^R!wYGMHK$#-uqt5Pk}0hR0Rz!i~0v9qA{Tgi@HILZcrm-Av=xi z{7V$HCdMrgU9d4#S8OCG3oxdnRHMO&K_ZJb(G)BYgj(9BefPb0$8*lybML&@SEInP z)4sVgbIy0pcg~!ddx3?vkb#@afGPJs`ff6PWlvHqMFwVGYZjKIPHruYO|7mkZ)C)m zH^L(CE1eWvuux^hyDiA>(C3>|@buy0rqtbZ%;hDb$zX4o13yXc(@9{Ub8OH4-e zg^bg^Sv+$IdRkrWJGWFZ^Xxl;L3ZQPMXbn zJkQmtZkhVwtZ9?X78V0hvs)rrZBgspvU;Q2CL*AQ)UYW{AQ?Laq;;k1Y%xC&y#1+< zl$z@0IwTJYC~iNBX!Cob%rdH>^uCd$ypCk*buKO^=VjlaL@K%#O}#@f%kPnyc6Q&q4KD*!GlsInEtAt)aK|Q8e(fhC^#l## z!!N=#w+co(J3F4^Ws$5cT8VJeZd8B&2KM}5Ca*d6>YzG0fbi-$DPXQ6J3|I}JBdt0 zMa?J89e+ntaq^tJfMoK#gy5u<7w=W0y3u2A(BWu8b*L{3jAcSdQ=aWJ@huJ+(D^jg;3Fu1`#Mmb znuD*q7%jr}&m!9T5$wfNC=c#QQ<_H$IzffU`(WBPQ3l_H9X=vtxf4=&Y>>6Qt1wCC}W zUW5mO_W>Dj4*V0sRu#zOaPuC7oll|k*=Cp|<|S#4Oapwe1-7XLW^znbGkv8duMVCB z>w4totbG3=Cpk+cA9p|6yhH)k<=Zx7EHx%80nCSwCu_)vK4Fv$&-06M)r0g(_z}id zQ{%Gx;)F@mL@f?Uo>Ux$uoyWiK@@k+Eow3NFC8C!EqbXTW`?OtbON4%p%<&%oHh{? znh_U8-doCCxaJ82t2UrA_Cw|_KKugR)VF2x`3CG$ZQI#vnOgQeR5|l0eRC|4LPZeJ zZF~;N_y|BRQ^Zq}AyZrm(?qY6)((2(Q-LN4D!&{=a;Bf;se{Qs>88FQ&iwk5pi>H} z%US0ihpB6I$DV{#6Q=Dx`AQ60*V7SR4pUqv5!m=T9btOgj}Jq>9_fzaZPTX4bn*L=@->!MS0 zYx9aD%+LRd&%PMht?yjNY>b;PZ$#Lav-2Cp2SGKGBH+T(D42kb^Jl)sBW{jZe)3e8 zWjfBE`PzJV<`M*@6@93NLQ13Jr`sqtO^&_qU`N8Ot25R1pZ^zch(l0X*5@oQ^a~ld b@eKR}>?+ZMA=+)!00000NkvXXu0mjf&QIaO diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot5@2x.png index aca56d637f76f28f206242c47e50713d88af7fb9..19b1c415dfb0386b7e989bbb9aa5cde309c1261c 100644 GIT binary patch literal 7422 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 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6.png index 66d6c9530b963c524cd2573220019efe27889f28..ba8ced22cc01586e202ec03d8cd04d6755d2e0a8 100644 GIT binary patch literal 1635 zcmV-p2AuhcP)Px*9Z5t%RA>d|n@?yQRUF6Po6VoyP4-YINwkV6$f}2e5upWZ^&~y0#e=jxl_KJy zAgG|C?V+t0^rnax(Vjxlv$Hds{qy{O-|j4vY?7Ht z=B3l@!0!BczxVt7K5yQVB7HAeSwvf`s z(E?6OLRlqCsNY6LhA%q#H$F1ObUZJiAc4btfh&)B)-5bbzLFI<0Q9?J{;wkyJ-TJd-$D1ivygOy5_D!YY zy@0!y->7@cOC8kJ*6GdA#zyremd|$G=WWNm1gHLV9QW8}AlGt=I;opBXbU!mN8=;#k4_N+9qt%2h%pSe#h|+0QM$I`wX1OZHdu<5!$3} z`aoX-Ny#5ps@~f$HeanS?MYsHJdN~$zR;(5IU`7;RENrrd)9WmtJSJ{AVQWc5uq>i ziN4XtM2wb|+6jf1QH9RmjVc@lp{qE2qmT48On%+;&YiuCYBRO2UMpstADPmH=gO(4VixR=+-zr4U`WRwr@9N?)+M> zte(C!U+7AB*D_Y-rF?$qmoNiNfB2d@v7;tV4mQO=6#2L^^^9oT85XB*?3SmaIhg!a)lI?rrU^a!v>f!$!}jc)2qhjV zjOLC6WtVjc*-yntW$$P{`%zFR?ASCc?Z>r22C}T|doKePEpZy-(DzM^MZ*d%$#gQ1 zg-k)cU0@8q_A4dFM{`5p1_kcrW3rHmY(7U9Shbq(WTcuxskHpWdwow9GLg+^(ZHOk zzytnFKA*j3IvGAd*j_V%O*2AR19Msib4%Z$M5%vnko@fd2888SR=8tZcN3oFq46COuj^j0BbwToFi* zYi2xYGs+1p<)}hu`NNE*lxWqAV71VKabe3}>q&`wM%=K;syiM=)TdM_Iw4rH#44T% z{|;c%w7B6VwZuItkQJ{bX>-XkarIDmAG(cSJTAl&BPO)R)2SK3ia98?!1Y;V|0kY` zaOtnn_K)D9`Rp+vF5V88H!0C(Y%K5@E^#s1l(EnM72I~lZw!9!8BWNCmg6&N~w5KJ_2{3W1Q+ur?awX4ZrV<-ix z^BJo%becp9mY()BVP3NNLtu71Ty(7GICM(bPHNP3hQM=V)g2EEoi4PbJd_#_6LzE} z)nPJHtp;Xj5c<>yw_~-|OiI428G{AMup>sx1g}LshSDwBqWTk*(-A;m^RIOmzoeD< zwApNa1<%i-uE(02KKi?_E?s-DShiDpPi8W&`JQ!w3%S9cu>iGLahG02VyqcV&Qzpv zBa4)3k!-$y`Wg05@I;?PseFvzmWLyCeMsnl3}gY*iJ;15z=d4yB3@Bfu!0_|Bhpa1 zBNfz}_;FktWFQNeehNCX444U6M1Bj)F0aRl#VXguskjaWod`RoZrTWw^V7BOV9+f7 z#r5{vIpkqY?!F3Y@k^l-wshV@aHy?UP zU~Zi|-5br|B*)!x(#06zXhN1 zbYrbn+K+SI6KfeK^Gex@Qscs{9cBOtC(Y1#pXJIs_HjPc+Jn54$it7k68}&uQQ%+! h@cqciv$TDR_dh5Kr2`!569NDL002ovPDHLkV1gDg8W;co literal 506 zcmVPx$v`IukR9FdPU>Ib85u1AyFa56-{K-(q`j>$Pn>?jrznK~Syk}=ui22-3^5wgn}5nzTDXT!8cjGckOPKbel1z4a=d5kGfNQ5R)w)qtULx30q zLyjyV>oMhN;-ITv85r_!Kpd4Mg=r~15t=v%WFg2=IY37}`-RVXOgXaC5T;R>A~%4J z0%1}B%|eJ2M_+*D)Z|NOllN6Ub42 zfV4aZh=&SZ{$yZyLt=G-Yy#F^hxv*B|B)5Ziha_85yO6x5;d(HhHUPrgOEc58+*`& z5JsW`x%xj4U~@gS#TbDA-At_6KH&b%707*qoM6N<$f;C0Va{vGU diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/alphafine_hot6@2x.png index 84ede5a553888a9c48b27d789a1cfe50efcee4eb..c60ecb7d4c54d58c30ee2a1b67923d3c41c3f8d1 100644 GIT binary patch literal 4419 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 JPDHLkV1lqBis}FW literal 828 zcmV-C1H=4@P)Px%_DMuRRCodHn@?*KQ53~b($=bAh4_D=f*ZSSsl=@=b*XjZM-Uf+A3}8D#t$Kg zBBJiZt%VBitQ!qB><*)O#Rc$?LKmw<+iIu4Yb#3x- zjO*2rwCB*&LQ*#?&WRn4ESU5ly=WIt4M?_?HtD#>mFYzdD7ItHev4G57d4>$CY)r= z0g=^pKn{oyAhJ8i0TBX3b_Y2iLV(Ebpm79r>lE;60a!djstfX^IpFOgaQ7UKwTKvr zgRY+dP96ZRHh4=C)0hEnp8@Wl=kddi7zvFOcnwGJD+S-z?vMFXhS z0X}VI+^d8X4WPdXaBr=8NYMZi?{r20DJnpNAYD72Z9R*>(E%z#`nZ`P3C1!T(`K2C z6U%nH^Eo?5YVX=j7NvuVI4t4FJkbLx!m@bpfCyCwYo zazKOtk=;R~1avH1Y>$1IIY_S2ya~5!p3DOW&1SL3Z&rG}f5&3!DDe1VypYTQz5WTj z_>ryfLb&-CDen_T(20@yQ=n?cvF1d=6(m?A*xF;{$Ev8}apd7}d7Vx}( zOv?Wk!)s-L1cpG$58U!uT*XGx56WLz{IK;(0ZH+)-JX62eup~|@7uhccOhn@8_ubI z@mPxp#q$-}w9OBxX2C6LG|9Pgx%k}3;3+D1(BM+WQ*l6KT^x`DA_R!+4st+*0Fm86 z4u}vSvO9AiY@6=lPvLM&KVz`KUc*vY8S90000 From fd7af4ca241001acef3b942cebda94baa15cae82 Mon Sep 17 00:00:00 2001 From: ju Date: Sun, 9 Sep 2018 09:52:16 +0800 Subject: [PATCH 47/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E5=B1=8F=E8=94=BD=E8=80=81=E7=9A=84collector?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/InformationCollector.java | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 700b1ca4a..91342b1db 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -212,43 +212,43 @@ public class InformationCollector implements XMLReadable, XMLWriter { return; } - byte[] content = ArrayUtils.EMPTY_BYTE_ARRAY; - Connection conn = null; - Table table = new Table(TABLE_NAME); - - try { - conn = DBRecordXManager.getDB().createConnection(); - ResultSet rs = selectAllFromLogDB(conn, table); - - if(rs == null){ - return; - } - content = getFunctionsContentAsByte(rs); - } catch (Exception e) { - FRContext.getLogger().error(e.getMessage(), e); - } finally { - DBUtils.closeConnection(conn); - } - - HttpClient httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("functions.info")); - httpClient.setContent(content); - httpClient.setTimeout(5000); - - if (!httpClient.isServerAlive()) { - return; - } - - String res = httpClient.getResponseText(); - boolean success = false; - try { - success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); - } catch (JSONException e) { - FRContext.getLogger().error(e.getMessage(), e); - } - //服务器返回true, 说明已经获取成功, 清空当前记录的信息 - if (success) { - deleteLogDB(conn, table); - } +// byte[] content = ArrayUtils.EMPTY_BYTE_ARRAY; +// Connection conn = null; +// Table table = new Table(TABLE_NAME); + +// try { +// conn = DBRecordXManager.getDB().createConnection(); +// ResultSet rs = selectAllFromLogDB(conn, table); +// +// if(rs == null){ +// return; +// } +// content = getFunctionsContentAsByte(rs); +// } catch (Exception e) { +// FRContext.getLogger().error(e.getMessage(), e); +// } finally { +// DBUtils.closeConnection(conn); +// } +// +// HttpClient httpClient = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("functions.info")); +// httpClient.setContent(content); +// httpClient.setTimeout(5000); +// +// if (!httpClient.isServerAlive()) { +// return; +// } +// +// String res = httpClient.getResponseText(); +// boolean success = false; +// try { +// success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); +// } catch (JSONException e) { +// FRContext.getLogger().error(e.getMessage(), e); +// } +// //服务器返回true, 说明已经获取成功, 清空当前记录的信息 +// if (success) { +// deleteLogDB(conn, table); +// } } From 5e44caac63e3cbbcd31514511c0db569706137f5 Mon Sep 17 00:00:00 2001 From: plough Date: Mon, 10 Sep 2018 17:24:42 +0800 Subject: [PATCH 48/77] =?UTF-8?q?REPORT-10703=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8F=8C=E9=9D=A2=E6=89=93=E5=8D=B0=3D>=E9=97=AE=E9=A2=981:?= =?UTF-8?q?=E5=8F=8C=E9=9D=A2=E6=89=93=E5=8D=B0=E4=B8=8B=E6=8B=89=E6=A1=86?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E7=81=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/webattr/printsettings/NativePrintSettingPane.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java index 07ed1eaf9..cc6154aec 100644 --- a/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java +++ b/designer-realize/src/main/java/com/fr/design/webattr/printsettings/NativePrintSettingPane.java @@ -437,6 +437,8 @@ public class NativePrintSettingPane extends JPanel { pageMarginSettingPane.populate(nativePrintAttr.getMargin()); fitPaperSizeCheck.setSelected(nativePrintAttr.isFitPaperSize()); scalePercentField.setValue(nativePrintAttr.getScalePercent()); + + checkEnabled(); } public void update(NativePrintAttr nativePrintAttr) { From 8ba66293908d0ee0d4fc30315068c28e13ebfbf9 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Mon, 10 Sep 2018 17:49:40 +0800 Subject: [PATCH 49/77] =?UTF-8?q?REPORT-10896=20=E5=A4=9A=E4=BA=BA?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/DesignerEnvManager.java | 32 +++----- .../design/file/HistoryTemplateListCache.java | 10 ++- .../com/fr/design/file/TemplateTreePane.java | 82 ++++++++++++------- .../DesignerFrameFileDealerPane.java | 29 ++++--- .../mainframe/socketio/DesignerSocketIO.java | 13 ++- 5 files changed, 93 insertions(+), 73 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 16d00156b..d054ab959 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -26,6 +26,7 @@ import com.fr.general.xml.GeneralXMLTools; import com.fr.log.FineLoggerFactory; import com.fr.stable.CommonUtils; import com.fr.stable.Constants; +import com.fr.stable.CoreConstants; import com.fr.stable.EnvChangedListener; import com.fr.stable.ListMap; import com.fr.stable.ProductConstants; @@ -38,6 +39,7 @@ import com.fr.stable.xml.XMLReadable; import com.fr.stable.xml.XMLTools; import com.fr.stable.xml.XMLWriter; import com.fr.stable.xml.XMLableReader; +import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.WorkContextCallback; @@ -850,10 +852,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * @param filePath 文件路径 */ public void addRecentOpenedFilePath(String filePath) { + filePath = FilenameUtils.standard(filePath); // 先删除. - if (getRecentOpenedFilePathList().contains(filePath)) { - getRecentOpenedFilePathList().remove(filePath); - } + getRecentOpenedFilePathList().remove(filePath); getRecentOpenedFilePathList().add(0, filePath); checkRecentOpenedFileNum(); @@ -862,8 +863,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { /** * 替换近期打开的文件路径 * - * @param oldPath 旧的路径 - * @param newPath 新的路径 + * @param oldPath path 使用 unix 分隔符 + * @param newPath path 使用 unix 分隔符 */ public void replaceRecentOpenedFilePath(String oldPath, String newPath) { List list = getRecentOpenedFilePathList(); @@ -872,28 +873,22 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { list.remove(oldPath); list.add(index, newPath); } - oldPath = oldPath.replaceAll("\\\\", "/"); - if (list.contains(oldPath)) { - int index = list.indexOf(oldPath); - list.remove(oldPath); - list.add(index, newPath); - } } /** * 替换近期打开的文件路径 * * @param type 文件类型,文件夹true,文件false - * @param oldPath 旧的路径 使用反斜杠分割 - * @param newPath 新的路径 使用反斜杠分割 + * @param oldPath path 使用 unix 分隔符 + * @param newPath path 使用 unix 分隔符 */ public void replaceRecentOpenedFilePath(boolean type, String oldPath, String newPath) { List list = getRecentOpenedFilePathList(); ListIterator iterator = list.listIterator(); while (iterator.hasNext()) { - String s = iterator.next().replaceAll("/", "\\\\"); - if (type ? s.contains(oldPath + "\\") : s.equals(oldPath)) { + String s = FilenameUtils.standard(iterator.next()); + if (type ? s.contains(oldPath + CoreConstants.SEPARATOR) : s.equals(oldPath)) { s = s.replace(oldPath, newPath); iterator.set(s); } @@ -916,9 +911,8 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * @param filePath 文件路径 */ public void removeRecentOpenedFilePath(String filePath) { - if (getRecentOpenedFilePathList().contains(filePath)) { - getRecentOpenedFilePathList().remove(filePath); - } + filePath = FilenameUtils.standard(filePath); + getRecentOpenedFilePathList().remove(filePath); } @@ -1637,7 +1631,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (reader.isChildNode()) { String n = reader.getTagName(); if ("Path".equals(n)) { - String path = reader.getElementValue(); + String path = FilenameUtils.standard(reader.getElementValue()); if (StringUtils.isNotEmpty(path)) { recentOpenedFileList.add(path); } diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 13fd85955..70fbde3f1 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -11,7 +11,9 @@ import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; +import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.io.FilenameUtils; import java.util.ArrayList; import java.util.Collections; @@ -270,8 +272,8 @@ public class HistoryTemplateListCache implements CallbackEvent { template = this.getCurrentEditingTemplate(); if (template != null) { - String editingPath = template.getEditingFILE().getPath().replaceAll("/", "\\\\"); - if (isDir ? editingPath.contains(from + "\\") : editingPath.equals(from)) { + String editingPath = FilenameUtils.standard(template.getEditingFILE().getPath()); + if (isDir ? editingPath.contains(from + CoreConstants.SEPARATOR) : editingPath.equals(from)) { FILE renameFile = template.getEditingFILE(); renameFile.setPath(editingPath.replace(from, to)); } @@ -279,8 +281,8 @@ public class HistoryTemplateListCache implements CallbackEvent { for (int i = 0; i < this.getHistoryCount(); i++) { template = this.get(i); - String editingPath = template.getEditingFILE().getPath().replaceAll("/", "\\\\"); - if (isDir ? editingPath.contains(from + "\\") : editingPath.equals(from)) { + String editingPath = FilenameUtils.standard(template.getEditingFILE().getPath()); + if (isDir ? editingPath.contains(from + CoreConstants.SEPARATOR) : editingPath.equals(from)) { FILE renameFile = template.getEditingFILE(); renameFile.setPath(editingPath.replace(from, to)); } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 3344d69f2..2a8b543d7 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -5,6 +5,8 @@ package com.fr.design.file; import com.fr.base.FRContext; import com.fr.base.io.FileAssistUtilsOperator; +import com.fr.design.DesignerEnvManager; +import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -20,8 +22,10 @@ import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.connect.WorkspaceConnection; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -186,6 +190,26 @@ public class TemplateTreePane extends JPanel implements FileOperations { */ @Override public void openFile() { + // 判断是否是远程设计的锁定文件 + if (!WorkContext.getCurrent().isLocal()) { + FileNode node = reportletsTree.getSelectedFileNode(); + if (node == null) { + return; + } + + String envName = DesignerEnvManager.getEnvManager().getCurEnvName(); + DesignerWorkspaceInfo info = DesignerEnvManager.getEnvManager().getWorkspaceInfo(envName); + + String username = null; + if (info != null) { + WorkspaceConnection connection = info.getConnection(); + username = connection == null ? StringUtils.EMPTY : connection.getUserName(); + } + String lock = node.getLock(); + if (lock != null && !lock.equals(username)) { + return; + } + } String reportPath = reportletsTree.getSelectedTemplatePath(); final String selectedFilePath = StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, reportPath); DesignerContext.getDesignerFrame().openTemplate(new FileNodeFILE(new FileNode(selectedFilePath, false))); @@ -226,11 +250,6 @@ public class TemplateTreePane extends JPanel implements FileOperations { public void deleteFile() { - String tipContent = - countSelectedFolder() > 0 - ? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Folder") - : Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_File"); - ExpandMutableTreeNode[] treeNodes = reportletsTree.getSelectedTreeNodes(); // 筛选可以删除的文件 ArrayList deletableNodes = new ArrayList<>(); @@ -238,40 +257,49 @@ public class TemplateTreePane extends JPanel implements FileOperations { for (ExpandMutableTreeNode treeNode : treeNodes) { checkFreeOrLock(treeNode, deletableNodes, lockedNodes); } - - boolean success = false; - if (lockedNodes.isEmpty()) { + String tipContent = + countSelectedFolder() > 0 + ? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Folder") + : Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_File"); + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), tipContent, UIManager.getString("OptionPane.titleText"), YES_NO_OPTION) - == JOptionPane.OK_OPTION) { + == JOptionPane.YES_OPTION) { // 删除所有选中的即可 - success = deleteNodes(Arrays.asList(treeNodes)); + if (!deleteNodes(Arrays.asList(treeNodes))) { + JOptionPane.showConfirmDialog(null, + Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); + } } - } else { + String tipContent = + countSelectedFolder() > 0 + ? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File_And_Folder") + : Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File"); + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), - Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File"), + tipContent, UIManager.getString("OptionPane.titleText"), YES_NO_OPTION) == JOptionPane.YES_OPTION) { // 删除其他 - success = deleteNodes(deletableNodes); + if (!deleteNodes(deletableNodes)) { + JOptionPane.showConfirmDialog(null, + Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), + UIManager.getString("OptionPane.titleText"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); + } } } - - if (!success) { - JOptionPane.showConfirmDialog(null, - Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), - UIManager.getString("OptionPane.titleText"), - JOptionPane.DEFAULT_OPTION, - JOptionPane.ERROR_MESSAGE); - } - reportletsTree.refresh(); } @@ -314,15 +342,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { boolean childrenEmptyLock = true; for (ExpandMutableTreeNode child : children) { - - boolean childEmptyLock = checkFreeOrLock(child, dNodes, lNodes); - if (childEmptyLock) { - dNodes.add(child); - } else { - lNodes.add(child); - } - - childrenEmptyLock = childrenEmptyLock && childEmptyLock; + childrenEmptyLock = checkFreeOrLock(child, dNodes, lNodes) && childrenEmptyLock; } boolean emptyLock = childrenEmptyLock && selfEmptyLock; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 83e30eecf..5e1c6b2a4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -36,6 +36,7 @@ import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; import javax.swing.BorderFactory; @@ -394,8 +395,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt fnf = new FileNodeFILE(node); String oldName = fnf.getName(); - String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replaceAll(suffix, ""); + String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, StringUtils.EMPTY); this.setLayout(new BorderLayout()); this.setModal(true); @@ -509,11 +510,11 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt String userInput = nameField.getText().trim(); - String path = fnf.getPath(); + String path = FilenameUtils.standard(fnf.getPath()); String oldName = fnf.getName(); - String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replaceAll(suffix, ""); + String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, StringUtils.EMPTY); // 输入为空或者没有修改 if (ComparatorUtils.equals(userInput, oldName)) { @@ -521,18 +522,16 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt return; } - String oldPath = path.replaceAll(CoreConstants.SEPARATOR, "\\\\"); - - String parentPath = fnf.getParent().getPath().replaceAll(CoreConstants.SEPARATOR, "\\\\"); + String parentPath = FilenameUtils.standard(fnf.getParent().getPath()); // 简单执行old new 替换是不可行的,例如 /abc/abc/abc/abc/ - String newPath = parentPath + "\\" + userInput + suffix; + String newPath = parentPath + CoreConstants.SEPARATOR + userInput + suffix; - HistoryTemplateListCache.getInstance().rename(fnf, oldPath, newPath); - DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(fnf.isDirectory(), oldPath, newPath); + HistoryTemplateListCache.getInstance().rename(fnf, path, newPath); + DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(fnf.isDirectory(), path, newPath); //模版重命名 - boolean success = selectedOperation.rename(fnf, oldPath, newPath); + boolean success = selectedOperation.rename(fnf, path, newPath); selectedOperation.refresh(); DesignerContext.getDesignerFrame().setTitle(); this.dispose(); @@ -552,8 +551,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt String userInput = nameField.getText().trim(); String oldName = fnf.getName(); - String suffix = fnf.isDirectory() ? "" : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); - oldName = oldName.replaceAll(suffix, ""); + String suffix = fnf.isDirectory() ? StringUtils.EMPTY : oldName.substring(oldName.lastIndexOf(CoreConstants.DOT), oldName.length()); + oldName = oldName.replaceAll(suffix, StringUtils.EMPTY); if (StringUtils.isEmpty(userInput)) { confirmButton.setEnabled(false); @@ -714,7 +713,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt //新建文件夹 boolean success = selectedOperation.mkdir( - selectedOperation.getFileNode().getParent() + CoreConstants.SEPARATOR + userInput + FilenameUtils.standard(selectedOperation.getFileNode().getParent() + CoreConstants.SEPARATOR + userInput) ); selectedOperation.refresh(); this.dispose(); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index e9b12e7b1..4f5c6e371 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -2,8 +2,9 @@ package com.fr.design.mainframe.socketio; import com.fr.config.RemoteConfigEvent; import com.fr.decision.webservice.utils.DecisionServiceConstants; +import com.fr.design.EnvChangeEntrance; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.TemplatePane; import com.fr.design.mainframe.loghandler.DesignerLogHandler; import com.fr.event.EventDispatcher; import com.fr.log.FineLoggerFactory; @@ -84,9 +85,13 @@ public class DesignerSocketIO { try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), - null, 0, UIManager.getIcon("OptionPane.errorIcon")); - TemplatePane.getInstance().editItems(); + JOptionPane.showMessageDialog( + DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Remote_Disconnected"), + UIManager.getString("OptionPane.messageDialogTitle"), + JOptionPane.ERROR_MESSAGE, + UIManager.getIcon("OptionPane.errorIcon")); + EnvChangeEntrance.getInstance().chooseEnv(); } }); } catch (Exception e) { From 965d4207050ed16b6f506bbfe1f77d5f742daefa Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 11 Sep 2018 00:29:21 +0800 Subject: [PATCH 50/77] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B9=20=E4=BA=A4=E4=BA=92=E4=BF=AE=E8=AE=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignerFrameFileDealerPane.java | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 5e1c6b2a4..a9baaf54c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -10,12 +10,7 @@ import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.tabledata.ResponseDataSourceChange; -import com.fr.design.file.FileOperations; -import com.fr.design.file.FileToolbarStateChangeListener; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.HistoryTemplateListPane; -import com.fr.design.file.MutilTempalteTabPane; -import com.fr.design.file.TemplateTreePane; +import com.fr.design.file.*; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuHighLight; @@ -39,29 +34,16 @@ import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import javax.swing.BorderFactory; -import javax.swing.JDialog; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.SwingConstants; -import javax.swing.UIManager; +import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.FlowLayout; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.util.ArrayList; -import java.util.HashMap; +import java.util.*; import java.util.List; -import java.util.Map; -import java.util.Set; import static javax.swing.JOptionPane.WARNING_MESSAGE; @@ -664,6 +646,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt confirmClose(); } }); + confirmButton.setEnabled(false); // 取消按钮 UIButton cancelButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Cancel")); @@ -700,7 +683,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt this.setAlwaysOnTop(true); this.setIconImage(BaseUtils.readImage("/com/fr/base/images/oem/logo.png")); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); - GUICoreUtils.centerWindow(this); + GUICoreUtils.setWindowCenter(DesignerContext.getDesignerFrame(), this); this.setVisible(true); } @@ -718,7 +701,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt selectedOperation.refresh(); this.dispose(); if (!success) { - JOptionPane.showConfirmDialog(null, + JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Make_Failure"), UIManager.getString("OptionPane.titleText"), JOptionPane.DEFAULT_OPTION, @@ -733,6 +716,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (StringUtils.isEmpty(userInput)) { confirmButton.setEnabled(false); + return; } if (selectedOperation.duplicated(userInput, StringUtils.EMPTY)) { From 87711970404bd946fe5b6657d400c5114d3c89e8 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 11 Sep 2018 02:19:20 +0800 Subject: [PATCH 51/77] =?UTF-8?q?=E6=97=A0=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E8=87=AA=E6=B5=8Bbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/TemplateTreePane.java | 7 ++- .../DesignerFrameFileDealerPane.java | 58 +++++++++++++++---- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 2a8b543d7..2b5f2d358 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -311,8 +311,11 @@ public class TemplateTreePane extends JPanel implements FileOperations { FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); if (nodeFILE.exists()) { FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - success = fileAssistUtils.moveToTrash(nodeFILE.getPath()) && success; - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + } else { + success = false; + } } } } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index a9baaf54c..63d3bd6c6 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -10,7 +10,13 @@ import com.fr.design.constants.UIConstants; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataTreePane; import com.fr.design.data.tabledata.ResponseDataSourceChange; -import com.fr.design.file.*; +import com.fr.design.file.FileOperations; +import com.fr.design.file.FileToolbarStateChangeListener; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.MutilTempalteTabPane; +import com.fr.design.file.SaveSomeTemplatePane; +import com.fr.design.file.TemplateTreePane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.imenu.UIMenuHighLight; @@ -34,16 +40,29 @@ import com.fr.stable.StringUtils; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Set; import static javax.swing.JOptionPane.WARNING_MESSAGE; @@ -509,19 +528,34 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt // 简单执行old new 替换是不可行的,例如 /abc/abc/abc/abc/ String newPath = parentPath + CoreConstants.SEPARATOR + userInput + suffix; - HistoryTemplateListCache.getInstance().rename(fnf, path, newPath); - DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(fnf.isDirectory(), path, newPath); //模版重命名 - boolean success = selectedOperation.rename(fnf, path, newPath); - selectedOperation.refresh(); - DesignerContext.getDesignerFrame().setTitle(); + this.dispose(); - if (!success) { - JOptionPane.showConfirmDialog(null, + boolean success = false; + SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true); + // 只有一个文件未保存时 + if (HistoryTemplateListCache.getInstance().getHistoryCount() == 1) { + int choose = saveSomeTempaltePane.saveLastOneTemplate(); + if (choose != JOptionPane.CANCEL_OPTION) { + success = selectedOperation.rename(fnf, path, newPath); + } + } else { + if (saveSomeTempaltePane.showSavePane()) { + success = selectedOperation.rename(fnf, path, newPath); + } + } + + if (success) { + HistoryTemplateListCache.getInstance().rename(fnf, path, newPath); + DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(fnf.isDirectory(), path, newPath); + selectedOperation.refresh(); + DesignerContext.getDesignerFrame().setTitle(); + } else { + JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Rename_Failure"), - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); } From 39127c9789abcd88155a6b96b993406607a75f3c Mon Sep 17 00:00:00 2001 From: ju Date: Tue, 11 Sep 2018 10:01:06 +0800 Subject: [PATCH 52/77] =?UTF-8?q?REPORT-11204=20=E5=90=8C=E4=B8=80?= =?UTF-8?q?=E8=B4=A6=E6=88=B7=E5=A4=9A=E5=A4=84=E7=99=BB=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E8=BF=9E=E6=8E=A5=E7=9A=84ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/env/DesignerWorkspaceInfo.java | 4 ++-- .../fr/design/env/LocalDesignerWorkspaceInfo.java | 7 ++----- .../fr/design/env/RemoteDesignerWorkspaceInfo.java | 12 ++++++------ .../main/java/com/fr/design/env/RemoteWorkspace.java | 6 +++--- .../java/com/fr/design/mainframe/DesignerFrame.java | 4 ++-- .../src/main/java/com/fr/env/RemoteEnvPane.java | 8 ++++---- .../design/mainframe/socketio/DesignerSocketIO.java | 2 +- 7 files changed, 20 insertions(+), 23 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java index 09cfff5cf..2e5cc9f8c 100644 --- a/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/DesignerWorkspaceInfo.java @@ -1,7 +1,7 @@ package com.fr.design.env; import com.fr.stable.xml.XMLable; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; public interface DesignerWorkspaceInfo extends XMLable { DesignerWorkspaceType getType(); @@ -10,7 +10,7 @@ public interface DesignerWorkspaceInfo extends XMLable { String getPath(); - WorkspaceConnection getConnection(); + WorkspaceConnectionInfo getConnection(); boolean checkValid(); } diff --git a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java index 7da0d9fe0..efba8a2df 100644 --- a/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/LocalDesignerWorkspaceInfo.java @@ -1,13 +1,10 @@ package com.fr.design.env; -import com.fr.base.EnvException; import com.fr.general.ComparatorUtils; -import com.fr.general.NameObject; -import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; import java.io.File; @@ -47,7 +44,7 @@ public class LocalDesignerWorkspaceInfo implements DesignerWorkspaceInfo { } @Override - public WorkspaceConnection getConnection() { + public WorkspaceConnectionInfo getConnection() { return null; } diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java index fd8aa77dc..ffc80cb08 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java @@ -5,15 +5,15 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { private String name; - private WorkspaceConnection connection; + private WorkspaceConnectionInfo connection; - public static RemoteDesignerWorkspaceInfo create(WorkspaceConnection connection) { + public static RemoteDesignerWorkspaceInfo create(WorkspaceConnectionInfo connection) { RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo(); info.connection = connection; return info; @@ -38,7 +38,7 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { } @Override - public WorkspaceConnection getConnection() { + public WorkspaceConnectionInfo getConnection() { return connection; } @@ -58,7 +58,7 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(" ", "\r\n")); String certPath = reader.getAttrAsString("certPath", StringUtils.EMPTY); String certSecretKey = reader.getAttrAsString("certSecretKey", StringUtils.EMPTY); - this.connection = new WorkspaceConnection(url, username, password, certPath, certSecretKey); + this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey); } } } @@ -83,7 +83,7 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { RemoteDesignerWorkspaceInfo object = (RemoteDesignerWorkspaceInfo) super.clone(); - object.connection = (WorkspaceConnection) StableUtils.cloneObject(this.connection); + object.connection = (WorkspaceConnectionInfo) StableUtils.cloneObject(this.connection); return object; } diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index 35bc5d82f..88b8fc572 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -5,7 +5,7 @@ import com.fr.stable.AssistUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.connect.WorkspaceClient; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.server.authority.decision.DecisionOperator; /** @@ -18,9 +18,9 @@ public class RemoteWorkspace implements Workspace { private final String address; - private final WorkspaceConnection connection; + private final WorkspaceConnectionInfo connection; - RemoteWorkspace(WorkspaceClient client, WorkspaceConnection connection) { + RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) { this.client = client; this.address = connection.getUrl(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index 971834e89..ba41d2e9f 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -57,7 +57,7 @@ import com.fr.stable.image4j.codec.ico.ICODecoder; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; import javax.swing.Icon; import javax.swing.JComponent; @@ -747,7 +747,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta String username = null; if (info != null) { - WorkspaceConnection connection = info.getConnection(); + WorkspaceConnectionInfo connection = info.getConnection(); username = connection == null ? StringUtils.EMPTY : connection.getUserName(); } defaultTitleSB.append(username).append("@").append(envName).append("[").append(workspace.getDescription()).append("]"); diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index 9cdc2ae83..769c843cc 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -20,7 +20,7 @@ import com.fr.stable.StringUtils; import com.fr.third.guava.base.Strings; import com.fr.workspace.WorkContext; import com.fr.workspace.connect.AuthException; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -270,7 +270,7 @@ public class RemoteEnvPane extends BasicBeanPane { @Override public void populateBean(RemoteDesignerWorkspaceInfo ob) { - WorkspaceConnection connection = ob.getConnection(); + WorkspaceConnectionInfo connection = ob.getConnection(); if (connection != null) { this.remoteWorkspaceURL = Strings.isNullOrEmpty(connection.getUrl()) ? RemoteWorkspaceURL.createDefaultURL() @@ -303,7 +303,7 @@ public class RemoteEnvPane extends BasicBeanPane { @Override public RemoteDesignerWorkspaceInfo updateBean() { - WorkspaceConnection connection = new WorkspaceConnection( + WorkspaceConnectionInfo connection = new WorkspaceConnectionInfo( this.remoteWorkspaceURL.getURL(), this.usernameInput.getText(), new String(this.passwordInput.getPassword()), @@ -518,7 +518,7 @@ public class RemoteEnvPane extends BasicBeanPane { final RemoteDesignerWorkspaceInfo remoteEnv = updateBean(); - WorkspaceConnection connection = remoteEnv.getConnection(); + WorkspaceConnectionInfo connection = remoteEnv.getConnection(); DesignerEnvManager.getEnvManager().setCertificatePath(connection.getCertPath()); DesignerEnvManager.getEnvManager().setCertificatePass(connection.getCertSecretKey()); try { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index e9b12e7b1..7ce17da8f 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -112,6 +112,6 @@ public class DesignerSocketIO { port, WorkspaceConstants.WS_NAMESPACE, DecisionServiceConstants.WEB_SOCKET_TOKEN_NAME, - RemoteCallClient.getInstance().getToken()); + RemoteCallClient.getInstance().getConnection()); } } From bfc608c6b05f77b684e94389f6ec420d4d5851bc Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 11 Sep 2018 10:42:18 +0800 Subject: [PATCH 53/77] =?UTF-8?q?bug=20=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/TemplateTreePane.java | 10 ++--- .../DesignerFrameFileDealerPane.java | 15 ++++--- .../java/com/fr/file/FILEChooserPane.java | 44 ++++++++++++------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 2b5f2d358..509e484ae 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -266,14 +266,14 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), tipContent, - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), YES_NO_OPTION) == JOptionPane.YES_OPTION) { // 删除所有选中的即可 if (!deleteNodes(Arrays.asList(treeNodes))) { JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); } @@ -287,14 +287,14 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), tipContent, - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), YES_NO_OPTION) == JOptionPane.YES_OPTION) { // 删除其他 if (!deleteNodes(deletableNodes)) { JOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Delete_Failure"), - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); } @@ -406,7 +406,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (!lockedNodes.isEmpty()) { JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Warn_Rename_Lock_File"), - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE); return true; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index 63d3bd6c6..a0d1531e4 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -510,6 +510,8 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private void confirmClose() { String userInput = nameField.getText().trim(); + // 处理不合法的文件夹名称 + userInput = userInput.replaceAll("[\\\\/:*?\"<>|]", StringUtils.EMPTY); String path = FilenameUtils.standard(fnf.getPath()); @@ -527,13 +529,12 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt // 简单执行old new 替换是不可行的,例如 /abc/abc/abc/abc/ String newPath = parentPath + CoreConstants.SEPARATOR + userInput + suffix; - - - //模版重命名 - this.dispose(); + //模版重命名 boolean success = false; + + // 提醒保存文件 SaveSomeTemplatePane saveSomeTempaltePane = new SaveSomeTemplatePane(true); // 只有一个文件未保存时 if (HistoryTemplateListCache.getInstance().getHistoryCount() == 1) { @@ -572,6 +573,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (StringUtils.isEmpty(userInput)) { confirmButton.setEnabled(false); + return; } if (ComparatorUtils.equals(userInput, oldName)) { @@ -724,6 +726,9 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt private void confirmClose() { String userInput = nameField.getText().trim(); + // 处理不合法的文件夹名称 + userInput = userInput.replaceAll("[\\\\/:*?\"<>|]", StringUtils.EMPTY); + if (StringUtils.isEmpty(userInput)) { return; } @@ -737,7 +742,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt if (!success) { JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Make_Failure"), - UIManager.getString("OptionPane.titleText"), + UIManager.getString("OptionPane.messageDialogTitle"), JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE); } diff --git a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java index 447ebc367..1e4ec0d65 100644 --- a/designer-base/src/main/java/com/fr/file/FILEChooserPane.java +++ b/designer-base/src/main/java/com/fr/file/FILEChooserPane.java @@ -58,6 +58,7 @@ import javax.swing.ListModel; import javax.swing.ListSelectionModel; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import javax.swing.UIManager; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.event.ListSelectionEvent; @@ -1545,25 +1546,34 @@ public class FILEChooserPane extends BasicPane { String userInput = nameField.getText().trim(); - currentDirectory.createFolder(userInput); - - refreshSubFileListModel(); - - setSelectedFileName(userInput); - // ben:这里处理有些不妥,取文件时没有考虑filefilter,不过效果一样,取的时候应该用subfilelist得data - FILE[] allFiles = currentDirectory.listFiles(); - int place = 0; - for (int i = 0; i < allFiles.length; i++) { - if (ComparatorUtils.equals(allFiles[i].getName(), userInput) && allFiles[i].isDirectory()) { - place = i; - break; + // 处理不合法的文件夹名称 + userInput = userInput.replaceAll("[\\\\/:*?\"<>|]", StringUtils.EMPTY); + + if (currentDirectory.createFolder(userInput)) { + refreshSubFileListModel(); + setSelectedFileName(userInput); + // ben:这里处理有些不妥,取文件时没有考虑filefilter,不过效果一样,取的时候应该用subfilelist得data + FILE[] allFiles = currentDirectory.listFiles(); + int place = 0; + for (int i = 0; i < allFiles.length; i++) { + if (ComparatorUtils.equals(allFiles[i].getName(), userInput) && allFiles[i].isDirectory()) { + place = i; + break; + } } + scrollPane.revalidate(); + scrollPane.repaint(); + int total = scrollPane.getVerticalScrollBar().getMaximum(); + int value = total * place / subFileList.getModel().getSize(); + scrollPane.getVerticalScrollBar().setValue(value); + + } else { + JOptionPane.showConfirmDialog(FILEChooserPane.this, + Toolkit.i18nText("Fine-Design_Basic_Make_Failure"), + UIManager.getString("OptionPane.messageDialogTitle"), + JOptionPane.DEFAULT_OPTION, + JOptionPane.ERROR_MESSAGE); } - scrollPane.revalidate(); - scrollPane.repaint(); - int total = scrollPane.getVerticalScrollBar().getMaximum(); - int value = total * place / subFileList.getModel().getSize(); - scrollPane.getVerticalScrollBar().setValue(value); this.dispose(); } From e61294d4925bc6f1e906a20af39b2795c552db19 Mon Sep 17 00:00:00 2001 From: ju Date: Tue, 11 Sep 2018 11:34:57 +0800 Subject: [PATCH 54/77] =?UTF-8?q?REPORT-11204=20=E5=90=8C=E4=B8=80?= =?UTF-8?q?=E8=B4=A6=E6=88=B7=E5=A4=9A=E5=A4=84=E7=99=BB=E5=BD=95=EF=BC=8C?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E8=BF=9E=E6=8E=A5=E7=9A=84ID=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/socketio/DesignerSocketIO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 7ce17da8f..f3ec1340b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -112,6 +112,6 @@ public class DesignerSocketIO { port, WorkspaceConstants.WS_NAMESPACE, DecisionServiceConstants.WEB_SOCKET_TOKEN_NAME, - RemoteCallClient.getInstance().getConnection()); + RemoteCallClient.getInstance().getConnection().getToken()); } } From ff520def37d587f091de7f14f889e991daf3ffe5 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 11 Sep 2018 12:26:34 +0800 Subject: [PATCH 55/77] =?UTF-8?q?=E5=A4=9A=E4=BA=BA=E8=BF=9C=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/TemplateTreePane.java | 15 +++++++++++++-- .../mainframe/DesignerFrameFileDealerPane.java | 10 ++++++++++ .../mainframe/socketio/DesignerSocketIO.java | 10 ++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 509e484ae..f40036fe9 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -25,7 +25,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.connect.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnectionInfo; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -48,6 +48,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Enumeration; +import static javax.swing.JOptionPane.WARNING_MESSAGE; import static javax.swing.JOptionPane.YES_NO_OPTION; public class TemplateTreePane extends JPanel implements FileOperations { @@ -202,7 +203,7 @@ public class TemplateTreePane extends JPanel implements FileOperations { String username = null; if (info != null) { - WorkspaceConnection connection = info.getConnection(); + WorkspaceConnectionInfo connection = info.getConnection(); username = connection == null ? StringUtils.EMPTY : connection.getUserName(); } String lock = node.getLock(); @@ -285,6 +286,16 @@ public class TemplateTreePane extends JPanel implements FileOperations { ? Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File_And_Folder") : Toolkit.i18nText("Fine-Design_Basic_Confirm_Delete_Unlock_File"); + if (deletableNodes.isEmpty()) { + // 提醒被锁定模板无法删除 + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Unable_Delete_Locked_File"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + WARNING_MESSAGE); + return; + } + + if (JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), tipContent, UIManager.getString("OptionPane.messageDialogTitle"), diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index a0d1531e4..d0800c087 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -310,6 +310,16 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } FileNode node = selectedOperation.getFileNode(); + String lock = node.getLock(); + if (lock != null && !lock.equals(node.getUserID())) { + // 提醒被锁定模板无法重命名 + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), + Toolkit.i18nText("Fine-Design_Basic_Unable_Rename_Locked_File"), + Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), + WARNING_MESSAGE); + return; + } + new FileRenameDialog(node); MutilTempalteTabPane.getInstance().repaint(); } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 4e7d42e7d..8ac8b8da9 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -8,6 +8,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.loghandler.DesignerLogHandler; import com.fr.event.EventDispatcher; import com.fr.log.FineLoggerFactory; +import com.fr.report.RemoteDesignConstants; import com.fr.serialization.SerializerHelper; import com.fr.stable.ArrayUtils; import com.fr.third.apache.log4j.spi.LoggingEvent; @@ -16,6 +17,7 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.base.WorkspaceConstants; import com.fr.workspace.engine.server.rpc.netty.RemoteCallClient; +import com.fr.workspace.server.WorkspaceConnection; import com.fr.workspace.server.socket.SocketInfoOperator; import io.socket.client.IO; import io.socket.client.Socket; @@ -111,12 +113,16 @@ public class DesignerSocketIO { private static String getSocketUri(Workspace current) throws IOException { URL url = new URL(current.getPath()); int port = WorkContext.getCurrent().get(SocketInfoOperator.class).getPort(); - return String.format("%s://%s:%s%s?%s=%s", + WorkspaceConnection connection = RemoteCallClient.getInstance().getConnection(); + return String.format("%s://%s:%s%s?%s=%s&%s=%s", url.getProtocol(), url.getHost(), port, WorkspaceConstants.WS_NAMESPACE, DecisionServiceConstants.WEB_SOCKET_TOKEN_NAME, - RemoteCallClient.getInstance().getConnection()); + connection.getToken(), + RemoteDesignConstants.USER_LOCK_ID, + connection.getId() + ); } } From 295a93d6b38f807883d4abab57e0146bbc413091 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Tue, 11 Sep 2018 12:39:38 +0800 Subject: [PATCH 56/77] =?UTF-8?q?=E5=A4=9A=E4=BA=BA=E8=BF=9C=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/file/TemplateTreePane.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index f40036fe9..fbe7d4eca 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -5,8 +5,6 @@ package com.fr.design.file; import com.fr.base.FRContext; import com.fr.base.io.FileAssistUtilsOperator; -import com.fr.design.DesignerEnvManager; -import com.fr.design.env.DesignerWorkspaceInfo; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -22,10 +20,8 @@ import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.connect.WorkspaceConnectionInfo; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -197,17 +193,8 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (node == null) { return; } - - String envName = DesignerEnvManager.getEnvManager().getCurEnvName(); - DesignerWorkspaceInfo info = DesignerEnvManager.getEnvManager().getWorkspaceInfo(envName); - - String username = null; - if (info != null) { - WorkspaceConnectionInfo connection = info.getConnection(); - username = connection == null ? StringUtils.EMPTY : connection.getUserName(); - } String lock = node.getLock(); - if (lock != null && !lock.equals(username)) { + if (lock != null && !lock.equals(node.getUserID())) { return; } } From ef33237cae7086ad8214466854de4501d4ffc443 Mon Sep 17 00:00:00 2001 From: ju Date: Wed, 12 Sep 2018 11:06:25 +0800 Subject: [PATCH 57/77] =?UTF-8?q?REPORT-11216=2010.0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3=20?= =?UTF-8?q?=E5=85=88=E4=BC=A0=E4=B8=80=E6=B3=A2=E4=BB=A3=E7=A0=81=201?= =?UTF-8?q?=E3=80=81=E6=8B=86=E5=88=86=E4=BA=86rpc=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=92=8Cchannel=E9=83=A8=E5=88=86=202=E3=80=81http=20channel?= =?UTF-8?q?=E5=86=99=E5=AE=8C=E5=A5=BD=E4=BA=86=20=E5=90=8E=E7=BB=AD?= =?UTF-8?q?=E5=A4=84=E7=90=86=EF=BC=9A=201=E3=80=81netty=20channel=202?= =?UTF-8?q?=E3=80=81gzip=E4=BC=A0=E8=BE=93=203=E3=80=81=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E5=9C=B0=E5=9B=BE=E8=B5=84=E6=BA=90=E5=A4=AA=E5=A4=A7=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=9B=BE=E8=A1=A8=E5=8D=A1=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=204=E3=80=81=E5=85=B6=E4=BB=96=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=205=E3=80=81=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/env/RemoteWorkspace.java | 17 +- .../com/fr/design/file/NodeAuthProcessor.java | 2 +- .../fr/design/remote/ui/UserManagerPane.java | 5 +- .../main/java/com/fr/env/RemoteEnvPane2.java | 185 ------------------ .../main/java/com/fr/env/RemoteEnvUtils.java | 167 ---------------- .../mainframe/socketio/DesignerSocketIO.java | 5 +- 6 files changed, 21 insertions(+), 360 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/env/RemoteEnvPane2.java delete mode 100644 designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index 88b8fc572..fb8bc80a7 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -5,6 +5,7 @@ import com.fr.stable.AssistUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.connect.WorkspaceClient; +import com.fr.workspace.connect.WorkspaceConnection; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.server.authority.decision.DecisionOperator; @@ -54,18 +55,30 @@ public class RemoteWorkspace implements Workspace { @Override public boolean isRoot() { try { - return WorkContext.getCurrent().get(DecisionOperator.class).isRoot(WorkContext.getConnector().currentUser()); + return WorkContext.getCurrent().get(DecisionOperator.class).isRoot(getConnection().getUserName()); } catch (Exception e) { return false; } } - + + @Override + public WorkspaceConnection getConnection() { + + return client.getConnection(); + } + @Override public T get(Class type) { return client.getPool().get(type); } + @Override + public void close() { + + client.close(); + } + @Override public int hashCode() { diff --git a/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java index 3625a7d4d..01c4615af 100644 --- a/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java +++ b/designer-base/src/main/java/com/fr/design/file/NodeAuthProcessor.java @@ -39,7 +39,7 @@ public class NodeAuthProcessor { authPaths.clear(); if (!WorkContext.getCurrent().isLocal()) { try { - String username = WorkContext.getConnector().currentUser(); + String username = WorkContext.getCurrent().getConnection().getUserName(); // 远程设计获取全部设计成员的权限列表 DesignAuthority[] authorities = WorkContext.getCurrent().get(AuthorityOperator.class).getAuthorities(); DesignAuthority authority = null; diff --git a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java index 6c4037145..a0fbb0bab 100644 --- a/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java +++ b/designer-base/src/main/java/com/fr/design/remote/ui/UserManagerPane.java @@ -368,7 +368,7 @@ public class UserManagerPane extends BasicPane { @Override protected List doInBackground() { addingMembers.clear(); - String username = WorkContext.getConnector().currentUser(); + String username = WorkContext.getCurrent().getConnection().getUserName(); synchronized (addingMembers) { Collection more = WorkContext.getCurrent().get(DecisionOperator.class).getMembers(username, keyword); pageNum = 1; @@ -395,7 +395,8 @@ public class UserManagerPane extends BasicPane { final SwingWorker loadMoreWorker = new SwingWorker, Void>() { @Override protected List doInBackground() { - String username = WorkContext.getConnector().currentUser(); + + String username = WorkContext.getCurrent().getConnection().getUserName(); synchronized (addingMembers) { addingMembers.remove(RemoteDesignMember.DEFAULT_MEMBER); Collection more = diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane2.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane2.java deleted file mode 100644 index dc0ee27bf..000000000 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane2.java +++ /dev/null @@ -1,185 +0,0 @@ -//package com.fr.env; -// -//import com.fr.design.beans.BasicBeanPane; -//import com.fr.design.border.UITitledBorder; -//import com.fr.design.env.DesignerWorkspaceInfo; -//import com.fr.design.env.DesignerWorkspaceType; -//import com.fr.design.gui.ibutton.UIButton; -//import com.fr.design.gui.ilable.UILabel; -//import com.fr.design.gui.ipasswordfield.UIPassWordField; -//import com.fr.design.gui.itextfield.UIIntNumberField; -//import com.fr.design.gui.itextfield.UITextField; -//import com.fr.design.layout.TableLayout; -//import com.fr.design.layout.TableLayoutHelper; -//import com.fr.design.utils.gui.GUICoreUtils; -// -//import com.fr.workspace.WorkContext; -//import com.fr.workspace.connect.WorkspaceConnection; -// -//import javax.swing.*; -//import javax.swing.border.EmptyBorder; -//import java.awt.*; -//import java.awt.event.ActionEvent; -//import java.awt.event.ActionListener; -//import java.awt.event.WindowAdapter; -//import java.awt.event.WindowEvent; -// -///** -// * 远程环境设置界面,暂时命名为2,待做完功能直接替代掉老的RemoteEnvPane -// */ -//public class RemoteEnvPane2 extends BasicBeanPane { -// -// private UITextField urlTextField; -// private UITextField usernameTextField; -// private UIPassWordField passwordTextField; -// private JDialog dialog; -// private UILabel message; -// private UIButton okButton; -// private UIButton cancelButton; -// -// public RemoteEnvPane2() { -// initComponents(); -// } -// -// private void initComponents() { -// setLayout(new BorderLayout()); -// -// JPanel contentPanel = new JPanel(new BorderLayout()); -// add(contentPanel, BorderLayout.CENTER); -// -// contentPanel.setBorder( -// BorderFactory.createCompoundBorder( -// new EmptyBorder(6, 0, 0, 0), -// UITitledBorder.createBorderWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_Config"))) -// ); -// -// double p = TableLayout.PREFERRED; -// double f = TableLayout.FILL; -// double[] rowSize = new double[]{p, p, p, p}; -// double[] columnSize = new double[]{p, f}; -// UIButton testConnectionButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_Try")); -// urlTextField = new UITextField(); -// urlTextField.setPlaceholder("http://192.168.100.200/webroot/decision"); -// JPanel valuePane = TableLayoutHelper.createTableLayoutPane( -// new Component[][]{ -// {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_Host") + ":", SwingConstants.RIGHT), urlTextField}, -// {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_User") + ":", SwingConstants.RIGHT), usernameTextField = new UITextField()}, -// {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_Password") + ":", SwingConstants.RIGHT), passwordTextField = new UIPassWordField()}, -// {null, GUICoreUtils.createFlowPane(testConnectionButton, FlowLayout.LEFT)} -// }, -// rowSize, columnSize -// ); -// testConnectionButton.addActionListener(new ActionListener() { -// @Override -// public void actionPerformed(ActionEvent e) { -// tryConnectRemoteEnv(); -// } -// }); -// contentPanel.add(valuePane, BorderLayout.CENTER); -// -// message = new UILabel(); -// okButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("OK")); -// cancelButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Cancel")); -// } -// -// private void tryConnectRemoteEnv() { -// final SwingWorker worker = new SwingWorker() { -// -// @Override -// protected Void doInBackground() throws Exception { -// -// final DesignerWorkspaceInfo remoteEnv = updateBean(); -// WorkContext.getConnector().testConnection(remoteEnv.getConnection()); -// return null; -// } -// -// @Override -// protected void done() { -// okButton.setEnabled(true); -// try { -// get(); -// message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Connect_Successful")); -// } catch (Exception e) { -// message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Connect_Failed")); -// } -// } -// }; -// worker.execute(); -// initMessageDialog(); -// okButton.addActionListener(new ActionListener() { -// public void actionPerformed(ActionEvent e) { -// dialog.dispose(); -// } -// }); -// cancelButton.addActionListener(new ActionListener() { -// public void actionPerformed(ActionEvent e) { -// dialog.dispose(); -// worker.cancel(true); -// } -// }); -// -// dialog.addWindowListener(new WindowAdapter() { -// public void windowClosed(WindowEvent e) { -// worker.cancel(true); -// } -// }); -// -// dialog.setVisible(true); -// dialog.dispose(); -// } -// -// private void initMessageDialog() { -// message.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Designer_Basic_Remote_Env_Try") + "..."); -// message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); -// okButton.setEnabled(false); -// -// dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(RemoteEnvPane2.this), com.fr.design.i18n.Toolkit.i18nText("Datasource-Test_Connection"), true); -// -// dialog.setSize(new Dimension(268, 118)); -// okButton.setEnabled(false); -// JPanel jp = new JPanel(); -// JPanel upPane = new JPanel(); -// JPanel downPane = new JPanel(); -// UILabel uiLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); -// upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); -// upPane.add(uiLabel); -// upPane.add(message); -// downPane.setLayout(new FlowLayout(FlowLayout.CENTER, 6, 0)); -// downPane.add(okButton); -// downPane.add(cancelButton); -// jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS)); -// jp.add(upPane); -// jp.add(downPane); -// dialog.add(jp); -// dialog.setResizable(false); -// dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(RemoteEnvPane2.this)); -// } -// -// @Override -// protected String title4PopupWindow() { -// return "RemoteEnv"; -// } -// -// @Override -// public void populateBean(DesignerWorkspaceInfo config) { -// if (config == null) { -// return; -// } -// WorkspaceConnection connection = config.getConnection(); -// if (connection != null) { -// urlTextField.setText(connection.getUrl()); -// usernameTextField.setText(connection.getUserName()); -// passwordTextField.setText(connection.getPassword()); -// } -// } -// -// @Override -// public DesignerWorkspaceInfo updateBean() { -// -// DesignerWorkspaceInfo config = new DesignerWorkspaceInfo(); -// WorkspaceConnection connection = new WorkspaceConnection(urlTextField.getText(), usernameTextField.getText(), passwordTextField.getText()); -// config.setConnection(connection); -// config.setType(DesignerWorkspaceType.Remote); -// return config; -// } -//} diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java b/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java deleted file mode 100644 index 1f25267ef..000000000 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvUtils.java +++ /dev/null @@ -1,167 +0,0 @@ -//package com.fr.env; -// -//import com.fr.base.EnvException; -//import com.fr.base.FRContext; -//import com.fr.report.DesignAuthority; -//import com.fr.report.util.AuthorityXMLUtils; -//import com.fr.stable.EncodeConstants; -//import com.fr.third.org.apache.commons.io.IOUtils; -//import com.fr.third.org.apache.http.HttpResponse; -//import com.fr.third.org.apache.http.HttpStatus; -//import com.fr.third.org.apache.http.client.ClientProtocolException; -//import com.fr.third.org.apache.http.client.ResponseHandler; -//import com.fr.third.org.apache.http.client.methods.HttpUriRequest; -//import com.fr.third.org.apache.http.client.methods.RequestBuilder; -//import com.fr.third.org.apache.http.entity.ContentType; -//import com.fr.third.org.apache.http.entity.InputStreamEntity; -//import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; -//import com.fr.third.org.apache.http.impl.client.HttpClients; -// -//import java.io.ByteArrayInputStream; -//import java.io.ByteArrayOutputStream; -//import java.io.IOException; -//import java.io.InputStream; -//import java.net.URLEncoder; -//import java.util.Map; -// -//public class RemoteEnvUtils { -// -// private RemoteEnvUtils() { -// } -// -// private static ResponseHandler responseHandler = new ResponseHandler() { -// @Override -// public InputStream handleResponse(HttpResponse response) throws IOException { -// int statusCode = response.getStatusLine().getStatusCode(); -// if (statusCode != HttpStatus.SC_OK) { -// throw new ClientProtocolException("Method failed: " + response.getStatusLine().toString()); -// } -// InputStream in = response.getEntity().getContent(); -// if (in == null) { -// return null; -// } -// // 读取并返回 -// ByteArrayOutputStream out = new ByteArrayOutputStream(); -// IOUtils.copy(in, out); -// return new ByteArrayInputStream(out.toByteArray()); -// } -// }; -// -// public static InputStream simulateRPCByHttpPost(byte[] bytes, Map parameters, boolean isSignIn, RemoteEnv env) throws EnvException { -// String path = env.getPath(); -// RequestBuilder builder = RequestBuilder.post(path); -// -// InputStream inputStream = null; -// -// for (Map.Entry entry : parameters.entrySet()) { -// builder.addParameter(entry.getKey(), entry.getValue()); -// } -// if (!isSignIn) { -// builder.addParameter("id", env.getUserID()); -// } -// InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(bytes)); -// -// try (CloseableHttpClient httpClient = HttpClients.createSystem()) { -// HttpUriRequest request = builder -// .setEntity(reqEntity) -// .build(); -// inputStream = httpClient.execute(request, responseHandler); -// } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// return inputStream; -// } -// -// public static InputStream simulateRPCByHttpPost(Map parameters, boolean isSignIn, RemoteEnv env) throws EnvException { -// String path = env.getPath(); -// RequestBuilder builder = RequestBuilder.post(path); -// -// InputStream inputStream = null; -// -// for (Map.Entry entry : parameters.entrySet()) { -// builder.addParameter(entry.getKey(), entry.getValue()); -// } -// if (!isSignIn) { -// builder.addParameter("id", env.getUserID()); -// } -// -// try (CloseableHttpClient httpClient = HttpClients.createSystem()) { -// HttpUriRequest request = builder -// .build(); -// inputStream = httpClient.execute(request, responseHandler); -// } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// return inputStream; -// } -// -// public static InputStream simulateRPCByHttpGet(Map parameters, boolean isSignIn, RemoteEnv env) throws EnvException { -// String path = env.getPath(); -// RequestBuilder builder = RequestBuilder.get(path); -// -// InputStream inputStream = null; -// -// for (Map.Entry entry : parameters.entrySet()) { -// builder.addParameter(entry.getKey(), entry.getValue()); -// } -// if (!isSignIn) { -// builder.addParameter("id", env.getUserID()); -// } -// try (CloseableHttpClient httpClient = HttpClients.createSystem()) { -// HttpUriRequest request = builder.build(); -// inputStream = httpClient.execute(request, responseHandler); -// -// } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// return inputStream; -// } -// -// -// public static InputStream updateAuthorities(DesignAuthority[] authorities, RemoteEnv env) { -// String path = env.getPath(); -// // 远程设计临时用户id -// String userID = env.getUserID(); -// InputStream inputStream = null; -// -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// AuthorityXMLUtils.writeDesignAuthoritiesXML(authorities, outputStream); -// InputStreamEntity reqEntity = new InputStreamEntity(new ByteArrayInputStream(outputStream.toByteArray()), ContentType.TEXT_XML); -// -// try (CloseableHttpClient httpClient = HttpClients.createSystem()) { -// HttpUriRequest request = RequestBuilder.post(path) -// .addParameter("id", userID) -// .addParameter("op", "remote_design_authority") -// .addParameter("cmd", "update_authorities") -// .setEntity(reqEntity) -// .build(); -// inputStream = httpClient.execute(request, responseHandler); -// } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// -// return inputStream; -// -// } -// -// public static InputStream getAuthorities(RemoteEnv env) throws EnvException { -// String path = env.getPath(); -// // 远程设计临时用户id -// String userID = env.getUserID(); -// InputStream inputStream = null; -// -// try (CloseableHttpClient httpClient = HttpClients.createSystem();) { -// HttpUriRequest request = RequestBuilder.get(path) -// .addParameter("id", userID) -// .addParameter("op", "remote_design_authority") -// .addParameter("cmd", "get_authorities") -// .build(); -// inputStream = httpClient.execute(request, responseHandler); -// } catch (IOException e) { -// FRContext.getLogger().error(e.getMessage(), e); -// } -// return inputStream; -// } -// -// -//} diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java index 8ac8b8da9..3c04dff35 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/socketio/DesignerSocketIO.java @@ -16,8 +16,7 @@ import com.fr.third.guava.base.Optional; import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; import com.fr.workspace.base.WorkspaceConstants; -import com.fr.workspace.engine.server.rpc.netty.RemoteCallClient; -import com.fr.workspace.server.WorkspaceConnection; +import com.fr.workspace.connect.WorkspaceConnection; import com.fr.workspace.server.socket.SocketInfoOperator; import io.socket.client.IO; import io.socket.client.Socket; @@ -113,7 +112,7 @@ public class DesignerSocketIO { private static String getSocketUri(Workspace current) throws IOException { URL url = new URL(current.getPath()); int port = WorkContext.getCurrent().get(SocketInfoOperator.class).getPort(); - WorkspaceConnection connection = RemoteCallClient.getInstance().getConnection(); + WorkspaceConnection connection = WorkContext.getCurrent().getConnection(); return String.format("%s://%s:%s%s?%s=%s&%s=%s", url.getProtocol(), url.getHost(), From baf67a033b5e71eae0ca24109872b1d3963c3c4f Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 15:21:31 +0800 Subject: [PATCH 58/77] =?UTF-8?q?REPORT-11268=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=B8=BB=E5=8A=A8=E9=87=8A=E6=94=BE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E9=94=81=EF=BC=8C=E5=88=86=E5=B8=83=E5=BC=8F=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MutilTempalteTabPane.java | 462 +++++++++--------- .../com/fr/design/file/TemplateTreePane.java | 28 +- .../main/java/com/fr/file/FileNodeFILE.java | 24 +- 3 files changed, 284 insertions(+), 230 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index b1cb56ede..8d4ae2f2d 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -7,6 +7,7 @@ import com.fr.base.vcs.DesignerMode; import com.fr.design.constants.UIConstants; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIScrollPopUpMenu; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; @@ -14,16 +15,34 @@ import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; - import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; -import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; - -import javax.swing.*; +import com.fr.third.org.apache.commons.io.FilenameUtils; +import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplLockOperator; + +import javax.swing.BorderFactory; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSeparator; import javax.swing.plaf.basic.BasicMenuItemUI; -import java.awt.*; +import java.awt.AWTEvent; +import java.awt.AlphaComposite; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -36,13 +55,15 @@ import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; import java.io.File; +import java.util.List; /** * Author : daisy * Date: 13-8-5 * Time: 下午6:12 */ -public class MutilTempalteTabPane extends JComponent implements MouseListener, MouseMotionListener, Action { +public class MutilTempalteTabPane extends JComponent { + private static Icon LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_normal.png"); private static Icon MOUSE_OVER_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); private static Icon MOUSE_PRESS_LIST_DOWN = BaseUtils.readIcon("/com/fr/design/images/buttonicon/list_pressed.png"); @@ -50,13 +71,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private static Icon MOUSE_OVER_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/mouseoverclose icon.png"); private static Icon MOUSE_PRESS_CLOSE = BaseUtils.readIcon("/com/fr/design/images/buttonicon/pressclose icon.png"); private static final String ELLIPSIS = "..."; - private static final int GAP_BEFORE_CLOSE = 10; private static final int GAP = 5; private static final int SMALLGAP = 3; private static final int LIST_BUTTON_WIDTH = 34; private static final int HEIGHT = 26; private static final int LIST_DOWN_HEIGHT = 25; - private static final double FOR_CAL_BYTES = 0.5; private static final double CORNOR_RADIUS = 0.0; //选了30度和60度的特殊角度的x,y作为经过的两个点的坐标 private static final double SPECIAL_LOCATION_1 = 2.5; @@ -86,19 +105,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private int minPaintIndex = 0; private int maxPaintIndex = 0; - /** - * 鼠标按下时的坐标数组、鼠标放开时的坐标数组 - */ - private int[] xyPressedCoordinate = {0, 0}; - - //每个关闭图标的起始位置 private int[] startX; private boolean[] isNeedToolTips; - private Graphics2D g2d; - //记录关闭按钮的状态 private int closeIconIndex = -1; private boolean isCloseCurrent = false; @@ -112,26 +123,41 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M private JTemplate temTemplate = null; - private AWTEventListener awt = new AWTEventListener() { - public void eventDispatched(AWTEvent event) { - if (event instanceof MouseEvent) { - MouseEvent mv = (MouseEvent) event; - if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { - isShowList = false; - } - } - } - - }; - - - public static final MutilTempalteTabPane getInstance() { + public static MutilTempalteTabPane getInstance() { if (THIS == null) { THIS = new MutilTempalteTabPane(); } return THIS; } + + /** + * 多工作簿面板 + */ + public MutilTempalteTabPane() { + this.setLayout(new BorderLayout(0, 0)); + this.addMouseListener(new MultiTemplateTabMouseListener()); + this.addMouseMotionListener(new MultiTemplateTabMouseMotionListener()); + this.setBorder(null); + this.setForeground(new Color(58, 56, 58)); + this.setFont(new Font(Toolkit.i18nText("Fine-Design_Basic_Song_TypeFace"), 0, 12)); + openedTemplate = HistoryTemplateListCache.getInstance().getHistoryList(); + selectedIndex = openedTemplate.size() - 1; + AWTEventListener awt = new AWTEventListener() { + @Override + public void eventDispatched(AWTEvent event) { + if (event instanceof MouseEvent) { + MouseEvent mv = (MouseEvent) event; + if (mv.getClickCount() > 0 && !ComparatorUtils.equals(mv.getSource(), MutilTempalteTabPane.this)) { + isShowList = false; + } + } + } + + }; + java.awt.Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); + } + public JTemplate getSelectedFile() { return openedTemplate.get(selectedIndex); } @@ -152,31 +178,18 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } + @Override public Dimension getPreferredSize() { Dimension dimension = super.getPreferredSize(); dimension.height = HEIGHT; return dimension; } - /** - * 多工作簿面板 - */ - public MutilTempalteTabPane() { - this.setLayout(new BorderLayout(0, 0)); - this.addMouseListener(this); - this.addMouseMotionListener(this); - this.setBorder(null); - this.setForeground(new Color(58, 56, 58)); - this.setFont(new Font(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Song_TypeFace"), 0, 12)); - openedTemplate = HistoryTemplateListPane.getInstance().getHistoryList(); - selectedIndex = openedTemplate.size() - 1; - Toolkit.getDefaultToolkit().addAWTEventListener(awt, AWTEvent.MOUSE_EVENT_MASK); - } - private UIMenuItem initCloseOther() { - UIMenuItem closeOther = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); + UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); setListDownItemPreferredSize(closeOther); closeOther.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { if (openedTemplate.size() == 1) { return; @@ -193,11 +206,11 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M //判断关闭的模板是不是格式刷的被参照的模板 openedTemplate.remove(panes[i]); closeFormat(panes[i]); - HistoryTemplateListPane.getInstance().closeSelectedReport(panes[i]); + HistoryTemplateListCache.getInstance().closeSelectedReport(panes[i]); } } - JTemplate currentTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); - HistoryTemplateListPane.getInstance().removeAllHistory(); + JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + HistoryTemplateListCache.getInstance().removeAllHistory(); DesignerContext.getDesignerFrame().activateJTemplate(currentTemplate); THIS.repaint(); } @@ -227,6 +240,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M templates[i].setBackground(UIConstants.SHADOW_CENTER); } templates[i].addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent e) { selectedIndex = index; tem.activeNewJTemplate(); @@ -256,7 +270,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M * * @param history 模板 */ - public void refreshOpenedTemplate(java.util.List> history) { + public void refreshOpenedTemplate(List> history) { openedTemplate = history; } @@ -271,6 +285,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M menu.setBorder(BorderFactory.createEmptyBorder(-3, 3, 3, 0)); menu.add(initCloseOther()); JSeparator separator = new JSeparator() { + @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; @@ -278,6 +293,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } }; menu.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; @@ -287,6 +303,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M separator.setForeground(UIConstants.LINE_COLOR); menu.add(separator); menu.add(new JPanel() { + @Override public Dimension getPreferredSize() { Dimension d = super.getPreferredSize(); d.height = 1; @@ -306,14 +323,16 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } + @Override public void paintComponent(Graphics g) { super.paintComponent(g); double maxWidth = getWidth() - LIST_BUTTON_WIDTH; //最大宽度 - g2d = (Graphics2D) g; + Graphics2D g2d = (Graphics2D) g; paintBackgroundAndLine(g2d, maxWidth); } + @Override public void paint(Graphics g) { //不可见时,按钮.4f透明 AlphaComposite composite = DesignerMode.isVcsMode() @@ -354,7 +373,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M isNeedToolTips[i - minPaintIndex] = false; } - Icon selectedIcon = null; + Icon selectedIcon; if (i == closeIconIndex) { selectedIcon = clodeMode; } else { @@ -370,7 +389,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } if (!DesignerMode.isVcsMode()) { - paintListDown(g2d, maxWidth); + paintListDown(g2d, maxWidth); } paintUnderLine(templateStartX, maxWidth, g2d); } @@ -551,7 +570,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); + closeIcon.paintIcon(this, g2d, closePosition, closeY); } return closePosition; @@ -609,7 +628,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M int closeY = (getHeight() - closeIcon.getIconHeight()) / 2; int closePosition = (int) templateStartX + realWidth - CLOSE.getIconWidth() - SMALLGAP; if (!DesignerMode.isVcsMode()) { - closeIcon.paintIcon(this, g2d, closePosition, closeY); + closeIcon.paintIcon(this, g2d, closePosition, closeY); } return closePosition; } @@ -642,72 +661,6 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M generalPath.closePath(); } - /** - * 点击 - * - * @param e 鼠标事件 - */ - public void mouseClicked(MouseEvent e) { - } - - /** - * 按下 - * - * @param e 鼠标事件 - */ - public void mousePressed(MouseEvent e) { - //如果在版本管理情况下,不允许切换tab - if (DesignerMode.isVcsMode()) { - return; - } - - int evtX = e.getX(); - int evtY = e.getY(); - this.setPressedXY(evtX, evtY); - - //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 - boolean isOverCloseIcon = isOverCloseIcon(evtX); - if (isOverListDown(evtX)) { - listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; - if (!isShowList) { - showListDown(); - } - isShowList = !isShowList; - - } else if (isOverCloseIcon) { - //关闭按钮的图标变化 - closeIconIndex = getTemplateIndex(evtX); - clodeMode = MOUSE_PRESS_CLOSE; - //关闭close图标所在的模板{ - closeFormat(openedTemplate.get(closeIconIndex)); - closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); - DesignerContext.getDesignerFrame().getContentFrame().repaint(); - isShowList = false; - } else { - //没有点击关闭和ListDown按钮,则切换到点击的模板处 - closeIconIndex = -1; - clodeMode = CLOSE; - int tempSelectedIndex = selectedIndex; - if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { - openedTemplate.get(selectedIndex).stopEditing(); - selectedIndex = getTemplateIndex(evtX); - //如果在权限编辑情况下,不允许切换到表单类型的工作簿 - if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { - DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); - JOptionPane.showMessageDialog(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") - + "!", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); - this.repaint(); - return; - } - JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); - evtXTemplate.activeNewJTemplate(); - } - isShowList = false; - } - this.repaint(); - - - } public void setIsCloseCurrent(boolean isCloseCurrent) { this.isCloseCurrent = isCloseCurrent; @@ -730,19 +683,32 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; } - filename = OperatingSystem.isWindows() ? filename.replaceAll("/", "\\\\") : filename.replaceAll("\\\\", "/"); + filename = FilenameUtils.normalize(filename); if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { specifiedTemplate.stopEditing(); - int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", + int returnVal = JOptionPane.showConfirmDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Would_You_Like_To_Save") + " \"" + specifiedTemplate.getEditingFILE() + "\" ?", ProductConstants.PRODUCT_NAME, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); - if (returnVal == JOptionPane.YES_OPTION && specifiedTemplate.saveTemplate()) { + if (returnVal == JOptionPane.YES_OPTION) { specifiedTemplate.saveTemplate(); - FineLoggerFactory.getLogger().info(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + // release lock + if (!WorkContext.getCurrent().isLocal()) { + WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + } + activeTemplate(filename); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); + } + } else { + HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); + // release lock + if (!WorkContext.getCurrent().isLocal()) { + WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); } + activeTemplate(filename); + FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } - HistoryTemplateListPane.getInstance().closeSelectedReport(specifiedTemplate); - activeTemplate(filename); + } /** @@ -767,15 +733,15 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M /** * 关闭掉一个模板之后该激活的Tab * - * @param fileName + * @param fileName 关闭掉一个模板之后该激活的Tab的文件名,绝对路径 */ private void activeTemplate(String fileName) { if (openedTemplate.isEmpty()) { //新建并激活模板 DesignerContext.getDesignerFrame().addAndActivateJTemplate(); selectedIndex = 0; - //此时刚自动新建的模板在HistoryTemplateListPane的editingTemplate - temTemplate = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); + //此时刚自动新建的模板在HistoryTemplateListCache的editingTemplate + temTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); } else { //如果关闭的模板是当前选中的模板,则重新激活 @@ -794,30 +760,13 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } } else { //如果关闭的模板不是当前选中的模板,则激活的模板不变 - selectedIndex = HistoryTemplateListPane.getInstance().contains(fileName); + selectedIndex = HistoryTemplateListCache.getInstance().contains(fileName); } //如果是已后台关闭的模板,则重新打开文件 openedTemplate.get(selectedIndex).activeOldJTemplate(); } } - /** - * 鼠标释放 - * - * @param e 鼠标事件 - */ - public void mouseReleased(MouseEvent e) { - } - - /** - * 鼠标进入 - * - * @param e 鼠标事件 - */ - public void mouseEntered(MouseEvent e) { - - } - private boolean isOverCloseIcon(int evtX) { boolean isOverCloseIcon = false; @@ -849,76 +798,6 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M return -1; } - /** - * 鼠标离开 - * - * @param e 鼠标事件 - */ - public void mouseExited(MouseEvent e) { - listDownMode = LIST_DOWN; - closeIconIndex = -1; - mouseOveredIndex = -1; - this.repaint(); - } - - /** - * 鼠标拖拽 - * - * @param e 鼠标事件 - */ - public void mouseDragged(MouseEvent e) { - } - - /** - * 鼠标移动 - * - * @param e 鼠标事件 - */ - public void mouseMoved(MouseEvent e) { - int evtX = e.getX(); - mouseOveredIndex = getTemplateIndex(evtX); - - //看是否需要显示toolTip - if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { - setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); - } else { - setToolTipText(null); - } - - listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; - - boolean isOverCloseIcon = isOverCloseIcon(evtX); - clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; - closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; - this.repaint(); - } - - - private void setPressedXY(int x, int y) { - this.xyPressedCoordinate[0] = x; - this.xyPressedCoordinate[1] = y; - } - - public Object getValue(String key) { - return null; - } - - /** - * 加入值 - * - * @param key 键 - * @param value 值 - */ - public void putValue(String key, Object value) { - } - - /** - * 动作 - * - * @param e 事件 - */ - public void actionPerformed(ActionEvent e) { - } /** * 处理自动新建的模板 在切换时的处理 @@ -926,7 +805,7 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M public void doWithtemTemplate() { //temtemplate保存的一定是手动新建的没有编辑或是编辑了没有保存的模板 //没有保存,说明有编辑;已经保存在磁盘里的文件,说明有过处理,并且已经保存,此时切换都不将其自动关闭 - if (temTemplate == null || temTemplate == HistoryTemplateListPane.getInstance().getCurrentEditingTemplate()) { + if (temTemplate == null || temTemplate == HistoryTemplateListCache.getInstance().getCurrentEditingTemplate()) { return; } @@ -936,9 +815,9 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M //自动新建的模板B若没有进行任何编辑(新建模板没有进行任何编辑时saved都是true):还没有存盘 if (temTemplate != null && temTemplate.getEditingFILE().isMemFile() && temTemplate.isSaved()) { - HistoryTemplateListPane.getInstance().closeSelectedReport(temTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(temTemplate); temTemplate = null; - setSelectedIndex(HistoryTemplateListPane.getInstance().contains(HistoryTemplateListPane.getInstance().getCurrentEditingTemplate())); + setSelectedIndex(HistoryTemplateListCache.getInstance().contains(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate())); } } @@ -970,5 +849,146 @@ public class MutilTempalteTabPane extends JComponent implements MouseListener, M } } + private class MultiTemplateTabMouseListener implements MouseListener { + + + /** + * 鼠标进入 + * + * @param e 鼠标事件 + */ + @Override + public void mouseEntered(MouseEvent e) { + + } + + /** + * 鼠标离开 + * + * @param e 鼠标事件 + */ + @Override + public void mouseExited(MouseEvent e) { + listDownMode = LIST_DOWN; + closeIconIndex = -1; + mouseOveredIndex = -1; + MutilTempalteTabPane.this.repaint(); + } + + /** + * 鼠标释放 + * + * @param e 鼠标事件 + */ + @Override + public void mouseReleased(MouseEvent e) { + } + + /** + * 点击 + * + * @param e 鼠标事件 + */ + @Override + public void mouseClicked(MouseEvent e) { + } + + /** + * 按下 + * + * @param e 鼠标事件 + */ + @Override + public void mousePressed(MouseEvent e) { + //如果在版本管理情况下,不允许切换tab + if (DesignerMode.isVcsMode()) { + return; + } + + int evtX = e.getX(); + + //是否点击关闭按钮 如果点击了关闭按钮,则将点击的模板关闭,不需要切换,如果没有点击关闭按钮,则切换到点击的模板处 + boolean isOverCloseIcon = isOverCloseIcon(evtX); + if (isOverListDown(evtX)) { + listDownMode = isOverListDown(evtX) ? MOUSE_PRESS_LIST_DOWN : LIST_DOWN; + if (!isShowList) { + showListDown(); + } + isShowList = !isShowList; + + } else if (isOverCloseIcon) { + //关闭按钮的图标变化 + closeIconIndex = getTemplateIndex(evtX); + clodeMode = MOUSE_PRESS_CLOSE; + //关闭close图标所在的模板{ + closeFormat(openedTemplate.get(closeIconIndex)); + closeSpecifiedTemplate(openedTemplate.get(closeIconIndex)); + DesignerContext.getDesignerFrame().getContentFrame().repaint(); + isShowList = false; + } else { + //没有点击关闭和ListDown按钮,则切换到点击的模板处 + closeIconIndex = -1; + clodeMode = CLOSE; + int tempSelectedIndex = selectedIndex; + if (selectedIndex != getTemplateIndex(evtX) && getTemplateIndex(evtX) != -1) { + openedTemplate.get(selectedIndex).stopEditing(); + selectedIndex = getTemplateIndex(evtX); + //如果在权限编辑情况下,不允许切换到表单类型的工作簿 + if (DesignerMode.isAuthorityEditing() && !openedTemplate.get(selectedIndex).isJWorkBook()) { + DesignerContext.getDesignerFrame().addAndActivateJTemplate(openedTemplate.get(tempSelectedIndex)); + JOptionPane.showMessageDialog(MutilTempalteTabPane.this, Toolkit.i18nText("Fine-Design_Basic_Form_Authority_Edited_Cannot_Be_Supported") + + "!", Toolkit.i18nText("Fine-Design_Basic_Alert"), JOptionPane.WARNING_MESSAGE); + MutilTempalteTabPane.this.repaint(); + return; + } + JTemplate evtXTemplate = openedTemplate.get(getTemplateIndex(evtX)); + evtXTemplate.activeNewJTemplate(); + } + isShowList = false; + } + MutilTempalteTabPane.this.repaint(); + + + } + + + } + + private class MultiTemplateTabMouseMotionListener implements MouseMotionListener { + /** + * 鼠标拖拽 + * + * @param e 鼠标事件 + */ + @Override + public void mouseDragged(MouseEvent e) { + } + + /** + * 鼠标移动 + * + * @param e 鼠标事件 + */ + @Override + public void mouseMoved(MouseEvent e) { + int evtX = e.getX(); + mouseOveredIndex = getTemplateIndex(evtX); + + //看是否需要显示toolTip + if (mouseOveredIndex != -1 && isNeedToolTips[mouseOveredIndex - minPaintIndex]) { + setToolTipText(openedTemplate.get(mouseOveredIndex).getEditingFILE().getName()); + } else { + setToolTipText(null); + } + + listDownMode = isOverListDown(evtX) ? MOUSE_OVER_LIST_DOWN : LIST_DOWN; + + boolean isOverCloseIcon = isOverCloseIcon(evtX); + clodeMode = isOverCloseIcon ? MOUSE_OVER_CLOSE : CLOSE; + closeIconIndex = isOverCloseIcon ? mouseOveredIndex : -1; + MutilTempalteTabPane.this.repaint(); + } + } + } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index fbe7d4eca..38c9b1da7 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -22,6 +22,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; +import com.fr.workspace.server.lock.TplLockOperator; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -302,17 +303,28 @@ public class TemplateTreePane extends JPanel implements FileOperations { } private boolean deleteNodes(Collection nodes) { + + boolean isLocal = WorkContext.getCurrent().isLocal(); + boolean success = true; for (ExpandMutableTreeNode treeNode : nodes) { Object node = treeNode.getUserObject(); if (node instanceof FileNode) { FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); if (nodeFILE.exists()) { - FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + if (isLocal) { + FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); + if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + } else { + success = false; + } } else { - success = false; + if (WorkContext.getCurrent().get(TplLockOperator.class).delete(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); + } else { + success = false; + } } } } @@ -410,8 +422,12 @@ public class TemplateTreePane extends JPanel implements FileOperations { } try { - // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 - return WorkContext.getWorkResource().rename(from, to); + if (WorkContext.getCurrent().isLocal()) { + // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 + return WorkContext.getWorkResource().rename(from, to); + } else { + return WorkContext.getCurrent().get(TplLockOperator.class).rename(from, to); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index d077a342e..ab1dfa091 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -15,6 +15,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.WorkResourceTempRenameStream; +import com.fr.workspace.server.lock.TplLockOperator; import javax.swing.Icon; import java.io.ByteArrayInputStream; @@ -356,9 +357,26 @@ public class FileNodeFILE implements FILE { if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - - InputStream in = new ByteArrayInputStream(WorkContext.getWorkResource().readFully(StableUtils.pathJoin(ProjectConstants.REPORTLETS_NAME, envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1)))); - + InputStream in; + if (WorkContext.getCurrent().isLocal()) { + in = new ByteArrayInputStream( + WorkContext.getWorkResource().readFully( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + } else { + in = new ByteArrayInputStream( + WorkContext.getCurrent().get(TplLockOperator.class).readAndLockFile( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + } return envPath.endsWith(".cpt") || envPath.endsWith(".frm") ? XMLEncryptUtils.decodeInputStream(in) : in; } From 366810a296087a7ff8c59e687dc8ba3275ec87f9 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 17:07:44 +0800 Subject: [PATCH 59/77] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/file/MutilTempalteTabPane.java | 12 ++--- .../com/fr/design/file/TemplateTreePane.java | 26 +++------ .../main/java/com/fr/file/FileNodeFILE.java | 31 ++++------- .../java/com/fr/env/RemoteEnvPaneTest.java | 54 +++++++++++++++++++ 4 files changed, 75 insertions(+), 48 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index 8d4ae2f2d..fc71d031b 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -21,7 +21,7 @@ import com.fr.stable.ProductConstants; import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.BorderFactory; import javax.swing.ButtonModel; @@ -693,18 +693,16 @@ public class MutilTempalteTabPane extends JComponent { specifiedTemplate.saveTemplate(); HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - if (!WorkContext.getCurrent().isLocal()) { - WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); - } + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } } else { HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - if (!WorkContext.getCurrent().isLocal()) { - WorkContext.getCurrent().get(TplLockOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); - } + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); } diff --git a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java index 38c9b1da7..61d071e00 100644 --- a/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java +++ b/designer-base/src/main/java/com/fr/design/file/TemplateTreePane.java @@ -4,7 +4,6 @@ package com.fr.design.file; import com.fr.base.FRContext; -import com.fr.base.io.FileAssistUtilsOperator; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; @@ -22,7 +21,7 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -312,19 +311,10 @@ public class TemplateTreePane extends JPanel implements FileOperations { if (node instanceof FileNode) { FileNodeFILE nodeFILE = new FileNodeFILE((FileNode) node); if (nodeFILE.exists()) { - if (isLocal) { - FileAssistUtilsOperator fileAssistUtils = WorkContext.getCurrent().get(FileAssistUtilsOperator.class); - if (fileAssistUtils.moveToTrash(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); - } else { - success = false; - } + if (WorkContext.getCurrent().get(TplOperator.class).delete(nodeFILE.getPath())) { + HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); } else { - if (WorkContext.getCurrent().get(TplLockOperator.class).delete(nodeFILE.getPath())) { - HistoryTemplateListCache.getInstance().deleteFile(nodeFILE); - } else { - success = false; - } + success = false; } } } @@ -422,12 +412,8 @@ public class TemplateTreePane extends JPanel implements FileOperations { } try { - if (WorkContext.getCurrent().isLocal()) { - // com.fr.io.utils.ResourceIOUtils 接收的是WEB-INF下的路径 - return WorkContext.getWorkResource().rename(from, to); - } else { - return WorkContext.getCurrent().get(TplLockOperator.class).rename(from, to); - } + // 接收的是WEB-INF下的路径 + return WorkContext.getCurrent().get(TplOperator.class).rename(from, to); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return false; diff --git a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java index ab1dfa091..84724df35 100644 --- a/designer-base/src/main/java/com/fr/file/FileNodeFILE.java +++ b/designer-base/src/main/java/com/fr/file/FileNodeFILE.java @@ -15,7 +15,7 @@ import com.fr.stable.StableUtils; import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.fr.workspace.resource.WorkResourceTempRenameStream; -import com.fr.workspace.server.lock.TplLockOperator; +import com.fr.workspace.server.lock.TplOperator; import javax.swing.Icon; import java.io.ByteArrayInputStream; @@ -357,26 +357,15 @@ public class FileNodeFILE implements FILE { if (!envPath.startsWith(ProjectConstants.REPORTLETS_NAME)) { return null; } - InputStream in; - if (WorkContext.getCurrent().isLocal()) { - in = new ByteArrayInputStream( - WorkContext.getWorkResource().readFully( - StableUtils.pathJoin( - ProjectConstants.REPORTLETS_NAME, - envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) - ) - ) - ); - } else { - in = new ByteArrayInputStream( - WorkContext.getCurrent().get(TplLockOperator.class).readAndLockFile( - StableUtils.pathJoin( - ProjectConstants.REPORTLETS_NAME, - envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) - ) - ) - ); - } + InputStream in = new ByteArrayInputStream( + WorkContext.getCurrent().get(TplOperator.class).readAndLockFile( + StableUtils.pathJoin( + ProjectConstants.REPORTLETS_NAME, + envPath.substring(ProjectConstants.REPORTLETS_NAME.length() + 1) + ) + ) + ); + return envPath.endsWith(".cpt") || envPath.endsWith(".frm") ? XMLEncryptUtils.decodeInputStream(in) : in; } diff --git a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java new file mode 100644 index 000000000..bd5ee3379 --- /dev/null +++ b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java @@ -0,0 +1,54 @@ +package com.fr.env; + +import org.fest.swing.annotation.RunsInEDT; +import org.fest.swing.core.ComponentLookupScope; +import org.fest.swing.core.Robot; +import org.fest.swing.edt.GuiQuery; +import org.fest.swing.fixture.JPanelFixture; +import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; +import org.junit.Test; + +import javax.swing.JFrame; +import javax.swing.WindowConstants; + +import static org.fest.swing.edt.GuiActionRunner.execute; + +public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { + + @Override + protected void onSetUp() { + + } + + @Test + public void test() { + + Robot robot = robot(); + + robot.settings().componentLookupScope(ComponentLookupScope.ALL); + + JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); + rootFixture.checkBox("httpsCheckbox").check(); + + rootFixture.checkBox("httpsCheckbox").requireSelected(); + } + + @RunsInEDT + private static RemoteEnvPane createNewEditor() { + + return execute(new GuiQuery() { + @Override + protected RemoteEnvPane executeInEDT() { + RemoteEnvPane envPane = new RemoteEnvPane(); + JFrame frame = new JFrame(); + frame.getContentPane().add(envPane); + frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); + frame.setResizable(false); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + return envPane; + } + }); + } +} From 5d8a420ca5d8ff2bab69688e9d3533124b3a5876 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Wed, 12 Sep 2018 17:30:28 +0800 Subject: [PATCH 60/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E8=BF=98=E6=B2=A1=E5=86=99?= =?UTF-8?q?=E5=AE=8C=EF=BC=8C=E5=85=88=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/env/RemoteEnvPaneTest.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java index bd5ee3379..d2bf95220 100644 --- a/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java +++ b/designer-base/src/test/java/com/fr/env/RemoteEnvPaneTest.java @@ -1,54 +1,54 @@ -package com.fr.env; - -import org.fest.swing.annotation.RunsInEDT; -import org.fest.swing.core.ComponentLookupScope; -import org.fest.swing.core.Robot; -import org.fest.swing.edt.GuiQuery; -import org.fest.swing.fixture.JPanelFixture; -import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; -import org.junit.Test; - -import javax.swing.JFrame; -import javax.swing.WindowConstants; - -import static org.fest.swing.edt.GuiActionRunner.execute; - -public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { - - @Override - protected void onSetUp() { - - } - - @Test - public void test() { - - Robot robot = robot(); - - robot.settings().componentLookupScope(ComponentLookupScope.ALL); - - JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); - rootFixture.checkBox("httpsCheckbox").check(); - - rootFixture.checkBox("httpsCheckbox").requireSelected(); - } - - @RunsInEDT - private static RemoteEnvPane createNewEditor() { - - return execute(new GuiQuery() { - @Override - protected RemoteEnvPane executeInEDT() { - RemoteEnvPane envPane = new RemoteEnvPane(); - JFrame frame = new JFrame(); - frame.getContentPane().add(envPane); - frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - frame.setResizable(false); - frame.pack(); - frame.setLocationRelativeTo(null); - frame.setVisible(true); - return envPane; - } - }); - } -} +//package com.fr.env; +// +//import org.fest.swing.annotation.RunsInEDT; +//import org.fest.swing.core.ComponentLookupScope; +//import org.fest.swing.core.Robot; +//import org.fest.swing.edt.GuiQuery; +//import org.fest.swing.fixture.JPanelFixture; +//import org.fest.swing.junit.testcase.FestSwingJUnitTestCase; +//import org.junit.Test; +// +//import javax.swing.JFrame; +//import javax.swing.WindowConstants; +// +//import static org.fest.swing.edt.GuiActionRunner.execute; +// +//public class RemoteEnvPaneTest extends FestSwingJUnitTestCase { +// +// @Override +// protected void onSetUp() { +// +// } +// +// @Test +// public void test() { +// +// Robot robot = robot(); +// +// robot.settings().componentLookupScope(ComponentLookupScope.ALL); +// +// JPanelFixture rootFixture = new JPanelFixture(robot, createNewEditor()); +// rootFixture.checkBox("httpsCheckbox").check(); +// +// rootFixture.checkBox("httpsCheckbox").requireSelected(); +// } +// +// @RunsInEDT +// private static RemoteEnvPane createNewEditor() { +// +// return execute(new GuiQuery() { +// @Override +// protected RemoteEnvPane executeInEDT() { +// RemoteEnvPane envPane = new RemoteEnvPane(); +// JFrame frame = new JFrame(); +// frame.getContentPane().add(envPane); +// frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); +// frame.setResizable(false); +// frame.pack(); +// frame.setLocationRelativeTo(null); +// frame.setVisible(true); +// return envPane; +// } +// }); +// } +//} From 8da56daee841b0c187999e3ac8cdbd4f6302973f Mon Sep 17 00:00:00 2001 From: ju Date: Wed, 12 Sep 2018 20:18:06 +0800 Subject: [PATCH 61/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20=20?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=AB=AF=E5=8F=A3=E5=8D=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=E5=8D=A1=E4=B8=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/start/Designer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index b0d4b398b..834dc21ef 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -39,6 +39,7 @@ import com.fr.design.utils.DesignUtils; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; import com.fr.module.Module; import com.fr.module.ModuleContext; import com.fr.runtime.FineRuntime; @@ -98,13 +99,15 @@ public class Designer extends BaseDesigner { //启动运行时 FineRuntime.start(); BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); - - // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 if (DesignUtils.isStarted()) { DesignUtils.clientSend(args); + FineLoggerFactory.getLogger().error("Designer port not available."); + System.exit(0); return; } + + preloadResource(); From ba0ab2680a5d411fe37f32996e9c893da04a4ab1 Mon Sep 17 00:00:00 2001 From: zack Date: Thu, 13 Sep 2018 10:35:51 +0800 Subject: [PATCH 62/77] =?UTF-8?q?REPORT-11255=20=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E7=8E=AF=E5=A2=83=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=90=AF=E5=8A=A8=E5=86=85=E7=BD=AE=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/start/module/DesignerStartup.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java index 7c63552cd..1ca077f41 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerStartup.java @@ -92,6 +92,14 @@ public class DesignerStartup extends Activator { public void on(Event event, Workspace param) { getSub(EnvBasedModule.class).start(); + ExecutorService service = Executors.newSingleThreadExecutor(); + service.submit(new Runnable() { + @Override + public void run() { + FineEmbedServer.start(); + } + }); + service.shutdown(); } }); } From ac6d19d81b17d6ba19ed12b51a73d2159c185132 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 13 Sep 2018 14:00:10 +0800 Subject: [PATCH 63/77] =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/preview/FormPreview.java | 3 ++- .../src/main/java/com/fr/design/preview/MobilePreview.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/preview/FormPreview.java b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java index 8522d6773..d6206a2c0 100644 --- a/designer-base/src/main/java/com/fr/design/preview/FormPreview.java +++ b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java @@ -1,6 +1,7 @@ package com.fr.design.preview; import com.fr.design.fun.impl.AbstractPreviewProvider; +import com.fr.locale.InterProviderFactory; /** @@ -12,7 +13,7 @@ public class FormPreview extends AbstractPreviewProvider { @Override public String nameForPopupItem() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Form_Preview"); + return InterProviderFactory.getProvider().getLocText("Fine-Design_Form_M_Form_Preview"); } @Override diff --git a/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java index ca75e39ac..8650ec12b 100644 --- a/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java +++ b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java @@ -1,6 +1,7 @@ package com.fr.design.preview; import com.fr.design.fun.impl.AbstractPreviewProvider; +import com.fr.general.Inter; import java.util.HashMap; import java.util.Map; @@ -15,7 +16,7 @@ public class MobilePreview extends AbstractPreviewProvider { @Override public String nameForPopupItem() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Preview"); + return Inter.getLocText("Fine-Engine_Mobile_Preview"); } @Override From 323b0402c5645f9f1a34be7096f19cba6c1bc4a0 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 13 Sep 2018 14:03:45 +0800 Subject: [PATCH 64/77] =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/mainframe/JForm.java | 1 - .../src/main/java/com/fr/start/Designer.java | 16 ++++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index 25fc777e6..e59069f71 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -951,7 +951,6 @@ public class JForm extends JTemplate implements BaseJForm { super.previewMenuActionPerformed(provider); } - @Override public String route() { return ViewRequestConstants.FORM_VIEW_PATH; diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 3a5fe8f6b..834dc21ef 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -4,7 +4,6 @@ import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; -import com.fr.design.RestartHelper; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.file.WebPreviewUtils; import com.fr.design.actions.file.newReport.NewPolyReportAction; @@ -40,8 +39,10 @@ import com.fr.design.utils.DesignUtils; import com.fr.design.utils.concurrent.ThreadFactoryBuilder; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; import com.fr.module.Module; import com.fr.module.ModuleContext; +import com.fr.runtime.FineRuntime; import com.fr.stable.BuildContext; import com.fr.stable.OperatingSystem; import com.fr.stable.ProductConstants; @@ -94,16 +95,19 @@ public class Designer extends BaseDesigner { * @param args 参数 */ public static void main(String[] args) { - + + //启动运行时 + FineRuntime.start(); BuildContext.setBuildFilePath("/com/fr/stable/build.properties"); - - // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 if (DesignUtils.isStarted()) { DesignUtils.clientSend(args); + FineLoggerFactory.getLogger().error("Designer port not available."); + System.exit(0); return; } - RestartHelper.deleteRecordFilesWhenStart(); + + preloadResource(); @@ -176,7 +180,7 @@ public class Designer extends BaseDesigner { shortCuts.add((ShortCut) DesignModuleFactory.getNewFormAction().newInstance()); } } catch (Exception e) { - FRContext.getLogger().error(e.getMessage()); + FRContext.getLogger().error(e.getMessage(), e); } return shortCuts.toArray(new ShortCut[shortCuts.size()]); } From 2575ec502b44d8b212a88ed7bd9b12b9353c8543 Mon Sep 17 00:00:00 2001 From: "Mata.Li" Date: Thu, 13 Sep 2018 14:14:48 +0800 Subject: [PATCH 65/77] REPORT-11144 --- designer-realize/src/main/java/com/fr/start/Designer.java | 3 ++- .../src/main/java/com/fr/start/module/PreStartActivator.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index 834dc21ef..756cd1262 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -4,6 +4,7 @@ import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.vcs.DesignerMode; import com.fr.design.DesignerEnvManager; +import com.fr.design.RestartHelper; import com.fr.design.actions.core.ActionFactory; import com.fr.design.actions.file.WebPreviewUtils; import com.fr.design.actions.file.newReport.NewPolyReportAction; @@ -106,8 +107,8 @@ public class Designer extends BaseDesigner { System.exit(0); return; } - + RestartHelper.deleteRecordFilesWhenStart(); preloadResource(); diff --git a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java index 1f7db5622..c4eea3bad 100644 --- a/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/PreStartActivator.java @@ -23,7 +23,6 @@ public class PreStartActivator extends Activator { @Override public void start() { - RestartHelper.deleteRecordFilesWhenStart(); CloudCenter.getInstance(); if (checkMultiStart()) { return; From f9b9ede9f0c336931abe1ba44a80f40c5e432478 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 13 Sep 2018 15:19:59 +0800 Subject: [PATCH 66/77] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=EF=BC=8C?= =?UTF-8?q?=E5=86=B2=E7=AA=81=E4=BF=AE=E5=A4=8D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/preview/FormPreview.java | 3 +-- .../src/main/java/com/fr/design/preview/MobilePreview.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/preview/FormPreview.java b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java index d6206a2c0..8522d6773 100644 --- a/designer-base/src/main/java/com/fr/design/preview/FormPreview.java +++ b/designer-base/src/main/java/com/fr/design/preview/FormPreview.java @@ -1,7 +1,6 @@ package com.fr.design.preview; import com.fr.design.fun.impl.AbstractPreviewProvider; -import com.fr.locale.InterProviderFactory; /** @@ -13,7 +12,7 @@ public class FormPreview extends AbstractPreviewProvider { @Override public String nameForPopupItem() { - return InterProviderFactory.getProvider().getLocText("Fine-Design_Form_M_Form_Preview"); + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_M_Form_Preview"); } @Override diff --git a/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java index 8650ec12b..ca75e39ac 100644 --- a/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java +++ b/designer-base/src/main/java/com/fr/design/preview/MobilePreview.java @@ -1,7 +1,6 @@ package com.fr.design.preview; import com.fr.design.fun.impl.AbstractPreviewProvider; -import com.fr.general.Inter; import java.util.HashMap; import java.util.Map; @@ -16,7 +15,7 @@ public class MobilePreview extends AbstractPreviewProvider { @Override public String nameForPopupItem() { - return Inter.getLocText("Fine-Engine_Mobile_Preview"); + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Mobile_Preview"); } @Override From 3a6d78c7b2e487da149f41c15c53f18afb7f13c1 Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 13 Sep 2018 15:56:12 +0800 Subject: [PATCH 67/77] =?UTF-8?q?REPORT-11216=2010.0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/start/module/DesignerWorkspaceProvider.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java index cd9479c7d..a6ba2c009 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerWorkspaceProvider.java @@ -1,11 +1,11 @@ package com.fr.start.module; import com.fr.design.DesignerEnvManager; +import com.fr.design.EnvChangeEntrance; import com.fr.design.env.DesignerWorkspaceGenerator; import com.fr.design.env.DesignerWorkspaceInfo; -import com.fr.design.mainframe.TemplatePane; +import com.fr.log.FineLoggerFactory; import com.fr.module.Activator; - import com.fr.workspace.WorkContext; import com.fr.workspace.Workspace; @@ -30,12 +30,13 @@ public class DesignerWorkspaceProvider extends Activator { Workspace workspace = DesignerWorkspaceGenerator.generate(workspaceInfo); boolean checkValid = workspace != null && workspaceInfo.checkValid(); if (!checkValid) { - TemplatePane.getInstance().dealEvnExceptionWhenStartDesigner(); + EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(); } else { WorkContext.switchTo(workspace); } } catch (Throwable e) { - TemplatePane.getInstance().dealEvnExceptionWhenStartDesigner(); + FineLoggerFactory.getLogger().error(e.getMessage(), e); + EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(); } } } From d60c3e69362cce2760361796edca717b186780fd Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 13 Sep 2018 16:13:26 +0800 Subject: [PATCH 68/77] =?UTF-8?q?REPORT-11216=2010.0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3=20isRoot?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=8B=EF=BC=8C=E4=B8=8D=E7=94=A8=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E9=83=BDrpc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/env/RemoteWorkspace.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index fb8bc80a7..65a277a0f 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -21,6 +21,8 @@ public class RemoteWorkspace implements Workspace { private final WorkspaceConnectionInfo connection; + private volatile Boolean isRoot = null; + RemoteWorkspace(WorkspaceClient client, WorkspaceConnectionInfo connection) { this.client = client; @@ -54,11 +56,15 @@ public class RemoteWorkspace implements Workspace { @Override public boolean isRoot() { - try { - return WorkContext.getCurrent().get(DecisionOperator.class).isRoot(getConnection().getUserName()); - } catch (Exception e) { - return false; + + if (isRoot == null) { + synchronized (this) { + if (isRoot == null) { + isRoot = WorkContext.getCurrent().get(DecisionOperator.class).isRoot(getConnection().getUserName()); + } + } } + return isRoot; } @Override From ccaf797fd825664428b34735ff346fd63552be63 Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 13 Sep 2018 16:14:35 +0800 Subject: [PATCH 69/77] =?UTF-8?q?REPORT-11216=2010.0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3=20isRoot?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E4=B8=8B=EF=BC=8C=E4=B8=8D=E7=94=A8=E6=AF=8F?= =?UTF-8?q?=E6=AC=A1=E9=83=BDrpc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/env/RemoteWorkspace.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java index 65a277a0f..36d8e7f7a 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteWorkspace.java @@ -94,6 +94,6 @@ public class RemoteWorkspace implements Workspace { @Override public boolean equals(Object obj) { - return obj != null && obj instanceof RemoteWorkspace && AssistUtils.equals(((RemoteWorkspace) obj).connection, this.connection); + return obj instanceof RemoteWorkspace && AssistUtils.equals(((RemoteWorkspace) obj).connection, this.connection); } } From c1c0c303b537a84b57fb001b5625b1547fa4b2f7 Mon Sep 17 00:00:00 2001 From: ju Date: Thu, 13 Sep 2018 16:49:23 +0800 Subject: [PATCH 70/77] =?UTF-8?q?REPORT-10847=20=E3=80=9010.0=E5=86=92?= =?UTF-8?q?=E7=83=9F=E3=80=91=E6=97=A5=E5=BF=97=E7=BA=A7=E5=88=AB=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E4=B8=BAdebug,=E6=97=A5=E5=BF=97=E4=B8=AD=E5=8F=AA?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E5=BE=97=E5=88=B0info=E4=BF=A1=E6=81=AF=20bu?= =?UTF-8?q?g=E6=8F=90=E9=94=99=E4=BA=86=20=20=E5=9B=9E=E9=80=80=E4=B8=80?= =?UTF-8?q?=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../loghandler/DesignerLogHandler.java | 151 ++++++++++++------ 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java index 2ae9e13f7..35abeb82c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/DesignerLogHandler.java @@ -5,20 +5,29 @@ import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.general.ComparatorUtils; - import com.fr.general.log.Log4jConfig; import com.fr.log.FineLoggerFactory; import com.fr.third.apache.log4j.Level; import com.fr.third.apache.log4j.spi.LoggingEvent; import com.fr.third.apache.log4j.spi.ThrowableInformation; -import javax.swing.*; +import javax.swing.AbstractAction; +import javax.swing.ActionMap; +import javax.swing.InputMap; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JTextPane; +import javax.swing.KeyStroke; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultEditorKit; import javax.swing.text.Document; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; @@ -32,57 +41,74 @@ import java.util.Date; import static com.fr.design.gui.syntax.ui.rtextarea.RTADefaultInputMap.DEFAULT_MODIFIER; public class DesignerLogHandler { - + private static final SimpleDateFormat LOG_SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - protected static final int INFO_INT = Level.INFO.toInt(); - protected static final int ERROR_INT = Level.ERROR.toInt(); - protected static final int WARN_INT = Level.WARN.toInt(); - protected static final int DEBUG_INT = Level.DEBUG.toInt(); + + private static final int INFO_INT = Level.INFO.toInt(); + + private static final int ERROR_INT = Level.ERROR.toInt(); + + private static final int WARN_INT = Level.WARN.toInt(); + + private static final int DEBUG_INT = Level.DEBUG.toInt(); + private static final int GAP_X = -150; + private static final int INFO_GAP_Y = -60; + private static final int ERRO_GAP_Y = -40; + private static final int SERVER_GAP_Y = -20; - + public static DesignerLogHandler getInstance() { + return HOLDER.singleton; } - + private static class HOLDER { + private static DesignerLogHandler singleton = new DesignerLogHandler(); } - + // 所有的面板 private LogHandlerBar caption; + private JCheckBoxMenuItem showInfo; + private JCheckBoxMenuItem showError; + private JCheckBoxMenuItem showServer; + private LogHandlerArea logHandlerArea; - + public DesignerLogHandler() { + logHandlerArea = new LogHandlerArea(); caption = new LogHandlerBar(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Log")); - + caption.addClearListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + logHandlerArea.jTextArea.setText(""); caption.clearMessage(); } }); caption.addSelectedListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + logHandlerArea.jTextArea.requestFocus(); logHandlerArea.jTextArea.selectAll(); } }); ItemListener itemlistener = new ItemListener() { - + @Override public void itemStateChanged(ItemEvent e) { + logHandlerArea.jTextArea.setText(""); caption.clearMessage(); } @@ -94,11 +120,12 @@ public class DesignerLogHandler { showServer = new JCheckBoxMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Log_Level_Error"), true); showServer.addItemListener(itemlistener); caption.addSetListener(new ActionListener() { - + @Override public void actionPerformed(ActionEvent e) { + JPopupMenu jPopupMenu = new JPopupMenu(); - + int logLevelInt = Log4jConfig.getInstance().getRootLevel().toInt(); if (logLevelInt <= INFO_INT) { jPopupMenu.add(showInfo); @@ -116,61 +143,72 @@ public class DesignerLogHandler { } }); } - + public JComponent getLogHandlerArea() { + return logHandlerArea; } - + public JComponent getCaption() { + return caption; } - + public void printRemoteLog(String message, Level level, Date date) { + logHandlerArea.printStackTrace(message, level, date); } - + private class LogHandlerArea extends JPanel { - + private static final long serialVersionUID = 8215630927304621660L; + private JTextPane jTextArea; + private JPopupMenu popup; + private UIMenuItem selectAll; + private UIMenuItem copy; + private UIMenuItem clear; - + private LogHandlerArea() { + jTextArea = initLogJTextArea(); this.setLayout(FRGUIPaneFactory.createBorderLayout()); UIScrollPane js = new UIScrollPane(jTextArea); this.add(js, BorderLayout.CENTER); this.setPreferredSize(new Dimension(super.getPreferredSize().width, 150)); - + jTextArea.setEditable(false); jTextArea.setBackground(Color.WHITE); - + popup = new JPopupMenu(); selectAll = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Select_All")); selectAll.addActionListener(popupListener); selectAll.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/selectedall.png")); popup.add(selectAll); - + copy = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy")); copy.addActionListener(popupListener); copy.setIcon(BaseUtils.readIcon("/com/fr/design/images/m_edit/copy.png")); popup.add(copy); - + clear = new UIMenuItem(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Clear_All")); clear.addActionListener(popupListener); clear.setIcon(BaseUtils.readIcon("/com/fr/design/images/log/clear.png")); popup.add(clear); - + selectAll.setAccelerator(KeyStroke.getKeyStroke('A', DEFAULT_MODIFIER)); copy.setAccelerator(KeyStroke.getKeyStroke('C', DEFAULT_MODIFIER)); clear.setAccelerator(KeyStroke.getKeyStroke('L', DEFAULT_MODIFIER)); - + jTextArea.addMouseListener(new MouseAdapter() { + // check for right click public void mousePressed(MouseEvent event) { + if (event.getButton() == MouseEvent.BUTTON3) { popup.show(jTextArea, event.getX(), event.getY()); checkEnabled(); @@ -178,8 +216,9 @@ public class DesignerLogHandler { } }); } - + private JTextPane initLogJTextArea() { + final JTextPane resultPane = new JTextPane(); InputMap inputMap = resultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_C, DEFAULT_MODIFIER), DefaultEditorKit.copyAction); @@ -187,15 +226,18 @@ public class DesignerLogHandler { inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_L, DEFAULT_MODIFIER), "clear"); ActionMap actionMap = resultPane.getActionMap(); actionMap.put("clear", new AbstractAction() { + public void actionPerformed(ActionEvent evt) { + resultPane.setText(""); caption.clearMessage(); } }); return resultPane; } - + public void printStackTrace(LoggingEvent event) { + int intLevel = event.getLevel().toInt(); Date date = new Date(event.getTimeStamp()); ThrowableInformation information = event.getThrowableInformation(); @@ -207,27 +249,27 @@ public class DesignerLogHandler { printMessage(event.getRenderedMessage(), intLevel, date, information == null ? null : information.getThrowable()); } } - + public void printStackTrace(String message, Level level, Date date) { + int intLevel = level.toInt(); - int logLevel = Log4jConfig.getInstance().getRootLevel().toInt(); if (intLevel == INFO_INT && showInfo.isSelected()) { printMessage(message, intLevel, date); } else if (intLevel == ERROR_INT && showError.isSelected()) { printMessage(message, intLevel, date); } else if (intLevel == WARN_INT && showServer.isSelected()) { printMessage(message, intLevel, date); - } else if (intLevel == DEBUG_INT && logLevel == DEBUG_INT){ - printMessage(message, intLevel, date); } - + } - + private void printMessage(String message, int intLevel, Date date) { + printMessage(message, intLevel, date, null); } - + private void printMessage(String msg, int intLevel, Date date, Throwable e) { + this.log(LOG_SIMPLE_DATE_FORMAT.format(date) + "\n", 0); String message = appendLocaleMark(msg, intLevel); this.log(message, intLevel); @@ -235,14 +277,15 @@ public class DesignerLogHandler { if (e == null) { return; } - + StackTraceElement[] traceElements = e.getStackTrace(); for (int i = 0; i < traceElements.length; i++) { this.log("\t" + "at " + traceElements[i].toString() + "\n", 0); } } - + private void log(String str, int style) { + SimpleAttributeSet attrSet = new SimpleAttributeSet(); if (style == ERROR_INT) { StyleConstants.setForeground(attrSet, new Color(247, 148, 29)); @@ -264,8 +307,9 @@ public class DesignerLogHandler { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - + private String appendLocaleMark(String str, int style) { + if (style == ERROR_INT) { str = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Alert") + ":" + str + "\n"; } else if (style == WARN_INT) { @@ -275,8 +319,9 @@ public class DesignerLogHandler { } return str; } - + private void setMessage(String message, int level) { + LogMessageBar.getInstance().setMessage(message); if (level == DesignerLogHandler.INFO_INT && showInfo.isSelected()) { caption.infoAdd(); @@ -286,28 +331,31 @@ public class DesignerLogHandler { caption.serverAdd(); } } - + private void checkEnabled() { + this.selectAll.setEnabled(true); this.copy.setEnabled(true); this.clear.setEnabled(true); - + if (ComparatorUtils.equals(this.jTextArea.getText(), "")) { this.selectAll.setEnabled(false); this.clear.setEnabled(false); } - + if (ComparatorUtils.equals(this.jTextArea.getSelectionStart(), this.jTextArea.getSelectionEnd())) { this.copy.setEnabled(false); } - + if (this.jTextArea.getSelectionStart() == 0 && ComparatorUtils.equals(this.jTextArea.getSelectionEnd(), this.jTextArea.getText().length())) { this.selectAll.setEnabled(false); } } - + ActionListener popupListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (ComparatorUtils.equals(evt.getActionCommand(), LogHandlerArea.this.selectAll.getText())) { LogHandlerArea.this.jTextArea.selectAll(); } else if (ComparatorUtils.equals(evt.getActionCommand(), LogHandlerArea.this.copy.getText())) { @@ -318,10 +366,11 @@ public class DesignerLogHandler { } } }; - + } - + public void printLoggingEvent(LoggingEvent event) { + logHandlerArea.printStackTrace(event); } } From c8705329e15b9fab6872f793cd9a5534e24af23c Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Thu, 13 Sep 2018 20:05:48 +0800 Subject: [PATCH 71/77] =?UTF-8?q?REPORT-10954&REPORT-10928=20=E2=80=9C?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=86=85=E5=AE=B9=E2=80=9D=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E9=A1=B9=E4=B8=8D=E8=A6=81=E6=94=AF=E6=8C=81=E5=88=86=E8=AF=8D?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=EF=BC=9B=20=E9=9C=80=E5=88=86=E8=AF=8D?= =?UTF-8?q?=E7=9A=84=E5=9C=BA=E6=99=AF=E4=B8=8B=EF=BC=8C=E5=85=88=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E4=B8=8D=E5=88=86=E8=AF=8D=E7=9A=84=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E9=9B=86=EF=BC=8C=E4=BB=A5=E8=8E=B7=E5=8F=96=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E5=BA=A6=E6=9C=80=E9=AB=98=E7=9A=84=E7=BB=93=E6=9E=9C=E9=9B=86?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/component/AlphaFineDialog.java | 12 ++++++------ .../search/manager/impl/FileSearchManager.java | 16 +++++++++++++++- .../search/manager/impl/SegmentationManager.java | 1 + 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index 10a3387e8..de66ad3d5 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -490,11 +490,11 @@ public class AlphaFineDialog extends UIDialog { } else if (searchText.startsWith(DOCUMENT_MARK_SHORT) || searchText.startsWith(DOCUMENT_MARK)) { buildDocumentList(new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(FILE_MARK_SHORT) || searchText.startsWith(FILE_MARK)) { - buildFileList(new String[]{getStoreText(searchText)}); + buildFileList(getStoreText(searchText), new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(CPT_MARK) || searchText.startsWith(FRM_MARK)) { - buildFileList(new String[]{searchText}); + buildFileList(getStoreText(searchText), new String[]{searchText}); } else if (searchText.startsWith(DS_MARK)) { - buildFileList(new String[]{DS_NAME + getStoreText(searchText)}); + buildFileList(getStoreText(searchText), new String[]{DS_NAME + getStoreText(searchText)}); } else if (searchText.startsWith(PLUGIN_MARK_SHORT) || searchText.startsWith(PLUGIN_MARK)) { buildPluginList(new String[]{getStoreText(searchText)}); } else if (searchText.startsWith(SIMILAR_MARK)) { @@ -535,7 +535,7 @@ public class AlphaFineDialog extends UIDialog { buildRecentList(segmentationResult); buildRecommendList(segmentationResult); buildActionList(segmentationResult); - buildFileList(segmentationResult); + buildFileList(searchText, segmentationResult); buildDocumentList(segmentationResult); buildPluginList(segmentationResult); buildSimilarList(segmentationResult); @@ -547,8 +547,8 @@ public class AlphaFineDialog extends UIDialog { addSearchResult(DocumentSearchManager.getInstance().getLessSearchResult(searchText)); } - private void buildFileList(final String[] searchText) { - addSearchResult(FileSearchManager.getInstance().getLessSearchResult(searchText)); + private void buildFileList(String searchStr, final String[] searchText) { + addSearchResult(FileSearchManager.getInstance().getLessSearchResult(searchStr, searchText)); } private void buildActionList(final String[] searchText) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 4e50fa935..17c58998d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -62,7 +62,8 @@ public class FileSearchManager implements AlphaFineSearchProvider { return new FileModel(name, filePath, searchCount); } - public SearchResult getLessSearchResult(String[] searchText) { + + public SearchResult getLessSearchResult(String searchStr, String[] searchText) { this.filterModelList = new SearchResult(); this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); @@ -78,6 +79,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { isContainFrm = true; doSearch(this.searchText); } + doFileContentSearch(searchStr); if (filterModelList.isEmpty()) { return new SearchResult(); @@ -93,6 +95,11 @@ public class FileSearchManager implements AlphaFineSearchProvider { return lessModelList; } + @Override + public SearchResult getLessSearchResult(String[] searchText) { + return null; + } + @Override public SearchResult getMoreSearchResult(String searchText) { return moreModelList; @@ -111,6 +118,13 @@ public class FileSearchManager implements AlphaFineSearchProvider { } } + } + + /** + * 搜索模板内容 + * @param searchText + */ + private void doFileContentSearch(String searchText) { if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainFileContent()) { FileNode[] fileNodes = FRContext.getFileNodes().filterFiles(searchText, ProjectConstants.REPORTLETS_NAME, new FileExtension[]{FileExtension.CPT, FileExtension.FRM}, true); for (FileNode node : fileNodes) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java index 6f9803955..6f1e3850a 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SegmentationManager.java @@ -66,6 +66,7 @@ public class SegmentationManager { return new String[]{searchText}; } List result = new ArrayList<>(); + result.add(searchText); BreakIterator itor = BreakIterator.getWordInstance(); itor.setText(searchText); int start = itor.first(); From db6239a952e0521c90d5d4f11047307a06b4805f Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Fri, 14 Sep 2018 09:40:43 +0800 Subject: [PATCH 72/77] =?UTF-8?q?REPORT-11315=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=A8=A1=E6=9D=BF=E6=97=B6=E9=87=8A=E6=94=BE?= =?UTF-8?q?=E9=94=81;=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E8=BF=87?= =?UTF-8?q?=E5=A4=9A=E6=97=B6=EF=BC=8C=E5=85=B3=E9=97=AD=E5=85=B6=E4=B8=AD?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=A8=A1=E6=9D=BF=E9=94=81=E4=B8=8D=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/MutilTempalteTabPane.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index fc71d031b..79d4dbf45 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -203,10 +203,14 @@ public class MutilTempalteTabPane extends JComponent { } for (int i = 0; i < panes.length; i++) { if (i != selectedIndex) { + JTemplate jTemplate = panes[i]; //判断关闭的模板是不是格式刷的被参照的模板 - openedTemplate.remove(panes[i]); - closeFormat(panes[i]); - HistoryTemplateListCache.getInstance().closeSelectedReport(panes[i]); + openedTemplate.remove(jTemplate); + closeFormat(jTemplate); + HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); + // release lock + String path = jTemplate.getEditingFILE().getPath(); + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(path); } } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); @@ -215,8 +219,6 @@ public class MutilTempalteTabPane extends JComponent { THIS.repaint(); } //如果取消保存了,则不关闭其他模板 - - } }); if (openedTemplate.size() == 1) { @@ -693,7 +695,8 @@ public class MutilTempalteTabPane extends JComponent { specifiedTemplate.saveTemplate(); HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); + String path = specifiedTemplate.getEditingFILE().getPath(); + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(path); activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); From 82f844565441c944b3e6a08c058bfe06a456ca1f Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Fri, 14 Sep 2018 10:14:56 +0800 Subject: [PATCH 73/77] =?UTF-8?q?REPORT-11315=20=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E6=A8=A1=E6=9D=BF=E6=97=B6=E9=87=8A=E6=94=BE?= =?UTF-8?q?=E9=94=81;=E6=89=93=E5=BC=80=E6=A8=A1=E6=9D=BF=E8=BF=87?= =?UTF-8?q?=E5=A4=9A=E6=97=B6=EF=BC=8C=E5=85=B3=E9=97=AD=E5=85=B6=E4=B8=AD?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=A8=A1=E6=9D=BF=E9=94=81=E4=B8=8D=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 4 ++- .../fr/design/file/MutilTempalteTabPane.java | 6 ++-- .../fr/design/mainframe/DesignerFrame.java | 3 +- .../com/fr/design/mainframe/JTemplate.java | 29 +++++-------------- .../fr/design/mainframe/JVirtualTemplate.java | 22 ++------------ 5 files changed, 17 insertions(+), 47 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 70fbde3f1..7aaff7be8 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -6,6 +6,7 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.design.mainframe.JVirtualTemplate; import com.fr.design.module.DesignModuleFactory; import com.fr.file.FILE; import com.fr.file.FileNodeFILE; @@ -221,7 +222,8 @@ public class HistoryTemplateListCache implements CallbackEvent { JTemplate overTemplate = historyList.get(i); if (overTemplate.getEditingFILE().exists() && overTemplate.isALLSaved() && overTemplate != editingTemplate) { - historyList.get(i).closeOverLineTemplate(i); + closeVirtualSelectedReport(overTemplate); + historyList.set(i, new JVirtualTemplate(overTemplate.getEditingFILE())); } } MutilTempalteTabPane.getInstance().refreshOpenedTemplate(historyList); diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index 79d4dbf45..e4d592c77 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -209,8 +209,7 @@ public class MutilTempalteTabPane extends JComponent { closeFormat(jTemplate); HistoryTemplateListCache.getInstance().closeSelectedReport(jTemplate); // release lock - String path = jTemplate.getEditingFILE().getPath(); - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(path); + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(jTemplate.getPath()); } } JTemplate currentTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); @@ -695,8 +694,7 @@ public class MutilTempalteTabPane extends JComponent { specifiedTemplate.saveTemplate(); HistoryTemplateListCache.getInstance().closeSelectedReport(specifiedTemplate); // release lock - String path = specifiedTemplate.getEditingFILE().getPath(); - WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(path); + WorkContext.getCurrent().get(TplOperator.class).closeAndFreeFile(specifiedTemplate.getPath()); activeTemplate(filename); FineLoggerFactory.getLogger().info(Toolkit.i18nText("Fine-Design_Basic_Template_Already_Saved", specifiedTemplate.getEditingFILE().getName())); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index ba41d2e9f..a8802553c 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -42,7 +42,6 @@ import com.fr.file.FILEFactory; import com.fr.file.FileFILE; import com.fr.general.ComparatorUtils; import com.fr.general.GeneralContext; - import com.fr.log.FineLoggerFactory; import com.fr.plugin.context.PluginContext; import com.fr.plugin.injectable.PluginModule; @@ -1153,6 +1152,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta return progressDialog; } + public void showProgressDialog() { progressDialog.setVisible(true); @@ -1169,6 +1169,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta /** * 更新进度框进度 + * * @param progress */ public void updateProgress(int progress) { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 44737b3d6..0098a2a4d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -17,7 +17,6 @@ import com.fr.design.actions.edit.UndoAction; import com.fr.design.actions.file.SaveAsTemplateAction; import com.fr.design.actions.file.SaveTemplateAction; import com.fr.design.actions.file.WebPreviewUtils; -import com.fr.design.constants.UIConstants; import com.fr.design.designer.TargetComponent; import com.fr.design.dialog.InformationWarnPane; import com.fr.design.file.HistoryTemplateListPane; @@ -47,7 +46,6 @@ import com.fr.file.MemFILE; import com.fr.form.ui.NoneWidget; import com.fr.form.ui.Widget; import com.fr.general.ComparatorUtils; - import com.fr.log.FineLoggerFactory; import com.fr.report.cell.Elem; import com.fr.report.cell.cellattr.CellImage; @@ -56,10 +54,13 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StringUtils; import com.fr.stable.core.UUID; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JOptionPane; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.undo.UndoManager; -import java.awt.*; +import java.awt.BorderLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.Set; @@ -180,7 +181,6 @@ public abstract class JTemplate> * 有条件取消格式刷 */ public void doConditionCancelFormat() { - return; } @Override @@ -193,7 +193,6 @@ public abstract class JTemplate> */ @Override public void cancelFormat() { - return; } //因为报表的tab从0开始,所以表单默认为-1吧 @@ -462,8 +461,6 @@ public abstract class JTemplate> // 子类实现 } - ; - /** * 是否保存 * @@ -565,8 +562,9 @@ public abstract class JTemplate> /** * 保存 + * * @param isShowLoc 是否显示“报表运行环境”外的路径(C盘D盘等) - * @param fileName 保存文件名 + * @param fileName 保存文件名 * @return */ public boolean saveAsTemplate(boolean isShowLoc, String fileName) { @@ -726,7 +724,7 @@ public abstract class JTemplate> tplMenu.addShortCut(shortcut4TemplateMenu()); } if (!DesignerMode.isVcsMode()) { - tplMenu.addShortCut(shortCuts4Authority()); + tplMenu.addShortCut(shortCuts4Authority()); } return new MenuDef[]{tplMenu}; @@ -941,17 +939,6 @@ public abstract class JTemplate> DesignerContext.getDesignerFrame().addAndActivateJTemplate(this); } - /** - * 后台关闭template - */ - public void closeOverLineTemplate(int index) { - JTemplate overTemplate = HistoryTemplateListPane.getInstance().getHistoryList().get(index); - HistoryTemplateListPane.getInstance().closeVirtualSelectedReport(overTemplate); - HistoryTemplateListPane.getInstance().getHistoryList().set(index, new JVirtualTemplate(overTemplate.getEditingFILE())); - } - - ; - /** * 返回当前支持的超链界面pane diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java index d472cc062..cea108892 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java @@ -11,15 +11,11 @@ import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.file.FILE; -import com.fr.file.FileNodeFILE; -import com.fr.stable.OperatingSystem; import com.fr.stable.StringUtils; -import com.fr.stable.project.ProjectConstants; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; -import java.io.File; import java.util.List; /** @@ -30,20 +26,10 @@ import java.util.List; */ public class JVirtualTemplate extends JTemplate { - private FILE editingFILE = null; + private FILE editingFILE; public JVirtualTemplate(FILE editingFILE) { - setEditingFILE(editingFILE); - } - - @Override - public String getPath() { - String editingFileName = getEditingFILE().getPath(); - if (editingFileName.startsWith(ProjectConstants.REPORTLETS_NAME)) { - editingFileName = ((FileNodeFILE) getEditingFILE()).getEnvPath() + File.separator + editingFileName; - } - editingFileName = OperatingSystem.isWindows() ? editingFileName.replaceAll("/", "\\\\") : editingFileName.replaceAll("\\\\", "/"); - return editingFileName; + this.editingFILE = editingFILE; } /** @@ -237,10 +223,6 @@ public class JVirtualTemplate extends JTemplate { DesignerContext.getDesignerFrame().openTemplate(this.getEditingFILE()); } - @Override - public void closeOverLineTemplate(int index) { - } - @Override public HyperlinkGroupPane getHyperLinkPane(HyperlinkGroupPaneActionProvider hyperlinkGroupPaneActionProvider) { return null; From f0854ca7d60e1094d53ad0c8758dfffdfdb1fd53 Mon Sep 17 00:00:00 2001 From: "yaoh.wu" Date: Fri, 14 Sep 2018 12:02:29 +0800 Subject: [PATCH 74/77] =?UTF-8?q?REPORT-11121=20=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E7=94=A8unix=E6=96=87=E4=BB=B6=E8=B7=AF=E5=BE=84=E5=88=86?= =?UTF-8?q?=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/file/HistoryTemplateListCache.java | 12 ++++++------ .../com/fr/design/file/MutilTempalteTabPane.java | 11 +++-------- .../java/com/fr/design/mainframe/DesignerFrame.java | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java index 7aaff7be8..b73805ee6 100644 --- a/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java +++ b/designer-base/src/main/java/com/fr/design/file/HistoryTemplateListCache.java @@ -184,9 +184,9 @@ public class HistoryTemplateListCache implements CallbackEvent { */ public int contains(String filename) { for (int i = 0; i < historyList.size(); i++) { - String historyPath = historyList.get(i).getPath().replaceAll("/", "\\\\"); - //文件路径是全路径,历史路径是reportlets/模板名 - if (filename.endsWith(historyPath)) { + String historyPath = historyList.get(i).getPath(); + //文件路径和历史路径都是 reportlets/xxx/xxx/xxx/xx.suffix + if (filename.equals(historyPath)) { return i; } } @@ -233,16 +233,16 @@ public class HistoryTemplateListCache implements CallbackEvent { public void deleteFile(FileNodeFILE file) { boolean isDir = file.isDirectory(); - String suffix = isDir ? "\\" : StringUtils.EMPTY; + String suffix = isDir ? CoreConstants.SEPARATOR : StringUtils.EMPTY; // path like reportlets/xx/xxx/xxx - String path = file.getPath().replaceAll("/", "\\\\") + suffix; + String path = file.getPath() + suffix; ListIterator> iterator = historyList.listIterator(); while (iterator.hasNext()) { JTemplate template = iterator.next(); - String tPath = template.getPath().replaceAll("/", "\\\\"); + String tPath = template.getPath(); if (isDir ? tPath.startsWith(path) : tPath.equals(path)) { iterator.remove(); int index = iterator.nextIndex(); diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index e4d592c77..b1a3b8e34 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -13,12 +13,10 @@ import com.fr.design.mainframe.JTemplate; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; import com.fr.file.FILE; -import com.fr.file.FileNodeFILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; import com.fr.stable.ProductConstants; -import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.commons.io.FilenameUtils; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; @@ -54,7 +52,6 @@ import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Path2D; import java.awt.geom.RoundRectangle2D; -import java.io.File; import java.util.List; /** @@ -679,12 +676,10 @@ public class MutilTempalteTabPane extends JComponent { } //当前激活的模板 - String filename = openedTemplate.get(selectedIndex).getEditingFILE().getPath(); - if (filename.startsWith(ProjectConstants.REPORTLETS_NAME)) { - filename = ((FileNodeFILE) openedTemplate.get(selectedIndex).getEditingFILE()).getEnvPath() + File.separator + filename; - } + String filename = openedTemplate.get(selectedIndex).getPath(); + - filename = FilenameUtils.normalize(filename); + filename = FilenameUtils.standard(filename); if (!specifiedTemplate.isALLSaved() && !DesignerMode.isVcsMode()) { specifiedTemplate.stopEditing(); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index a8802553c..af5723d05 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -757,7 +757,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } else if (path.startsWith(ProjectConstants.REPORTLETS_NAME)) { path = workspace.getPath() + File.separator + path; } - defaultTitleSB.append(" " + path); + defaultTitleSB.append(" ").append(path); } setTitle(defaultTitleSB.toString()); From 9eab8bdad61942404cad48097dcbdd1f72853756 Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 14 Sep 2018 17:31:06 +0800 Subject: [PATCH 75/77] =?UTF-8?q?REPORT-11216=2010.0=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=97=AE=E9=A2=98=E8=A7=A3=E5=86=B3=20?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=94=81=E7=8E=B0=E5=9C=A8=E6=98=AF=E7=94=A8?= =?UTF-8?q?socketio=E5=81=9A=E7=9A=84=E5=85=B3=E9=97=AD=E8=A7=A3=E9=94=81?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9Csocketio=E6=B2=A1=E8=BF=9E=E4=B8=8A?= =?UTF-8?q?=E7=9A=84=E8=AF=9D=EF=BC=8C=E6=A8=A1=E6=9D=BF=E5=B0=B1=E6=B0=B8?= =?UTF-8?q?=E8=BF=9C=E6=B2=A1=E5=8A=9E=E6=B3=95=E8=A7=A3=E9=94=81=E4=BA=86?= =?UTF-8?q?=20=E5=8A=A0=E5=BF=83=E8=B7=B3=E6=9D=A5=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E9=94=81=E5=BC=82=E5=B8=B8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/mainframe/DesignerFrame.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java index a8802553c..741976513 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrame.java @@ -1069,8 +1069,8 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta EastRegionContainerPane.getInstance().getContainerWidth()); DesignerEnvManager.getEnvManager().saveXMLFile(); - - WorkContext.switchTo(null); + //关闭当前环境 + WorkContext.getCurrent().close(); this.setVisible(false); this.dispose(); From 6b0d6c60ec1abcde0a6b4d890d0d6c6a4dcd6d9e Mon Sep 17 00:00:00 2001 From: plough Date: Fri, 14 Sep 2018 17:31:51 +0800 Subject: [PATCH 76/77] =?UTF-8?q?REPORT-11155=2010.0=20=E4=B8=A2=E5=A4=B1?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E7=82=B9=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../beans/actions/FormWidgetEditAction.java | 22 ++++++++++++++++++- .../actions/FormMobileAttrAction.java | 10 +++++++++ .../AccessibleBodyWatermarkEditor.java | 10 +++++++++ .../report/ReportMobileAttrAction.java | 9 ++++++++ .../actions/report/ReportWatermarkAction.java | 10 +++++++++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormWidgetEditAction.java b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormWidgetEditAction.java index 753dc812b..300086040 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormWidgetEditAction.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/actions/FormWidgetEditAction.java @@ -3,9 +3,14 @@ package com.fr.design.designer.beans.actions; import com.fr.design.actions.TemplateComponentAction; import com.fr.design.designer.beans.actions.behavior.UpdateBehavior; import com.fr.design.mainframe.FormDesigner; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.record.analyzer.EnableMetrics; +import javax.swing.JButton; import java.awt.event.ActionEvent; +@EnableMetrics public abstract class FormWidgetEditAction extends TemplateComponentAction { private UpdateBehavior updateBehavior = new UpdateBehavior() { @@ -27,9 +32,24 @@ public abstract class FormWidgetEditAction extends TemplateComponentAction { public FormMobileAttrAction(JForm jf) { @@ -64,6 +68,7 @@ public class FormMobileAttrAction extends JTemplateAction { // 放到后面。如果提前 return 了,则仍然处于未设置状态,不要添加 jf.getTarget().addAttrMark(new MobileOnlyTemplateAttrMark()); } + recordFunction(); // 设置移动端属性并刷新界面 formTpl.setFormMobileAttr(formMobileAttr); // 会调整 body 的自适应布局,放到最后 ((FormArea)jf.getFormDesign().getParent()).onMobileAttrModified(); @@ -74,6 +79,11 @@ public class FormMobileAttrAction extends JTemplateAction { dialog.setVisible(true); } + @Focus(id = "com.fr.mobile.mobile_template_frm", text = "Fine-Design_Function_Mobile_Template_Frm", source = Original.EMBED) + private void recordFunction() { + // do nothing + } + private static final MenuKeySet REPORT_APP_ATTR = new MenuKeySet() { @Override public char getMnemonic() { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleBodyWatermarkEditor.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleBodyWatermarkEditor.java index c5acb6114..a0567bad1 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleBodyWatermarkEditor.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/accessibles/AccessibleBodyWatermarkEditor.java @@ -7,6 +7,9 @@ import com.fr.design.mainframe.widget.editors.ITextComponent; import com.fr.design.mainframe.widget.renderer.WatermarkRenderer; import com.fr.design.mainframe.widget.wrappers.WatermarkWrapper; import com.fr.design.report.WatermarkPane; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; +import com.fr.record.analyzer.EnableMetrics; import javax.swing.*; import java.awt.*; @@ -15,6 +18,7 @@ import java.awt.*; * Created by plough on 2018/5/15. */ +@EnableMetrics public class AccessibleBodyWatermarkEditor extends UneditableAccessibleEditor { private WatermarkPane watermarkPane; @@ -40,9 +44,15 @@ public class AccessibleBodyWatermarkEditor extends UneditableAccessibleEditor { public void doOk() { setValue(watermarkPane.update()); fireStateChanged(); + recordFunction(); } }); watermarkPane.populate((WatermarkAttr) getValue()); dlg.setVisible(true); } + + @Focus(id = "com.fr.watermark", text = "Fine-Design_Form_WaterMark", source = Original.EMBED) + private void recordFunction() { + // do nothing + } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java index 40d4e68a4..a31108f2c 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportMobileAttrAction.java @@ -11,7 +11,9 @@ import com.fr.design.report.mobile.ReportMobileAttrPane; import com.fr.file.FILE; import com.fr.general.IOUtils; +import com.fr.intelli.record.Focus; import com.fr.main.TemplateWorkBook; +import com.fr.record.analyzer.EnableMetrics; import com.fr.report.mobile.ElementCaseMobileAttr; import javax.swing.*; @@ -22,6 +24,7 @@ import java.awt.event.ActionEvent; * * Created by Administrator on 2016/5/12/0012. */ +@EnableMetrics public class ReportMobileAttrAction extends JWorkBookAction{ public ReportMobileAttrAction(JWorkBook jwb) { @@ -64,6 +67,7 @@ public class ReportMobileAttrAction extends JWorkBookAction{ // 放到后面。如果提前 return 了,则仍然处于未设置状态,不要添加 wbTpl.addAttrMark(new MobileOnlyTemplateAttrMark()); } + recordFunction(); // 设置移动端属性并刷新界面 wbTpl.setReportMobileAttr(elementCaseMobileAttr); // 会同时修改页面设置,放到最后 jwb.fireTargetModified(); @@ -72,6 +76,11 @@ public class ReportMobileAttrAction extends JWorkBookAction{ dialog.setVisible(true); } + @Focus(id = "com.fr.mobile.mobile_template_cpt", text = "Fine-Design_Function_Mobile_Template_Cpt") + private void recordFunction() { + // do nothing + } + private static final MenuKeySet REPORT_APP_ATTR = new MenuKeySet() { @Override public char getMnemonic() { return 'P'; } diff --git a/designer-realize/src/main/java/com/fr/design/actions/report/ReportWatermarkAction.java b/designer-realize/src/main/java/com/fr/design/actions/report/ReportWatermarkAction.java index db1d10f9d..a07df219f 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/report/ReportWatermarkAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/report/ReportWatermarkAction.java @@ -8,7 +8,10 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JWorkBook; import com.fr.design.menu.KeySetUtils; import com.fr.design.report.WatermarkPane; +import com.fr.intelli.record.Focus; +import com.fr.intelli.record.Original; import com.fr.main.impl.WorkBook; +import com.fr.record.analyzer.EnableMetrics; import com.fr.report.core.ReportUtils; import java.awt.event.ActionEvent; @@ -16,6 +19,7 @@ import java.awt.event.ActionEvent; /** * Created by plough on 2018/5/15. */ +@EnableMetrics public class ReportWatermarkAction extends JWorkBookAction { public ReportWatermarkAction(JWorkBook jwb) { super(jwb); @@ -42,7 +46,13 @@ public class ReportWatermarkAction extends JWorkBookAction { public void doOk() { wbTpl.addAttrMark(watermarkPane.update()); jwb.fireTargetModified(); + recordFunction(); } }).setVisible(true); } + + @Focus(id = "com.fr.watermark", text = "Fine-Design_Form_WaterMark", source = Original.EMBED) + private void recordFunction() { + // do nothing + } } From 8185971723e9d0b07e35014edcacb3a2139cc3ad Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Fri, 14 Sep 2018 19:07:54 +0800 Subject: [PATCH 77/77] =?UTF-8?q?REPORT-11328=20&=20REPORT-10946=20&=20REP?= =?UTF-8?q?ORT-10928=20&=20REPORT-11196=201.=E4=BF=AE=E5=A4=8D=E5=8F=B3?= =?UTF-8?q?=E4=BE=A7=E9=A2=84=E8=A7=88=E5=86=85=E5=AE=B9=E8=BF=87=E5=AE=BD?= =?UTF-8?q?=EF=BC=8C=E6=B2=A1=E6=9C=89=E6=A8=AA=E5=90=91=E6=BB=9A=E5=8A=A8?= =?UTF-8?q?=E6=9D=A1=E7=9A=84=E9=97=AE=E9=A2=98=202.=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=96=AD=E7=BD=91=E6=97=B6=EF=BC=8C=E6=98=BE=E7=A4=BA=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E5=A4=B1=E8=B4=A5=E7=9A=84=E4=B8=80=E5=A4=84=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=80=BB=E8=BE=91=203.list=E4=B8=AD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E5=85=83=E7=B4=A0=E5=8E=BB=E9=87=8D=204.=E5=8E=9F=E5=85=88?= =?UTF-8?q?=E5=86=99=E6=B3=95=E4=B8=8D=E8=A7=84=E8=8C=83=EF=BC=8C=E5=BA=94?= =?UTF-8?q?=E7=94=B3=E6=98=8E=E4=B8=BAprivate=EF=BC=8Cset=EF=BC=8Cget?= =?UTF-8?q?=E5=8F=96=E5=AD=98=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/component/AlphaFineDialog.java | 32 ++++++++++++------- .../alphafine/preview/RobotPreviewPane.java | 16 ++++++---- .../manager/fun/AlphaFineSearchProvider.java | 2 +- .../manager/impl/ActionSearchManager.java | 13 ++++---- .../manager/impl/DocumentSearchManager.java | 20 +++++------- .../manager/impl/FileSearchManager.java | 2 +- .../manager/impl/PluginSearchManager.java | 22 ++++++------- .../manager/impl/RecentSearchManager.java | 2 +- .../manager/impl/RecommendSearchManager.java | 17 +++++----- .../manager/impl/SimilarSearchManeger.java | 13 ++++---- 10 files changed, 70 insertions(+), 69 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index de66ad3d5..ff61edda0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -143,7 +143,15 @@ public class AlphaFineDialog extends UIDialog { private static String beforeSearchStr = ""; private static boolean alreadySearch = false; private static boolean alreadyInitHot = false; - public static String[][] data; + private String[][] hotData; + + public String[][] getHotData() { + return hotData; + } + + public void setHotData(String[][] hotData) { + this.hotData = hotData; + } public AlphaFineDialog(Frame parent, boolean forceOpen) { super(parent); @@ -242,14 +250,14 @@ public class AlphaFineDialog extends UIDialog { try { HttpGet getHelp = new HttpGet(AlphaFineConstants.ALPHA_HOT_SEARCH); HttpToolbox.getHttpClient(AlphaFineConstants.ALPHA_HOT_SEARCH).execute(getHelp).getStatusLine(); - if (data == null) { - data = HotIssuesManager.getInstance().getHotIssues(); + if (hotData == null) { + hotData = HotIssuesManager.getInstance().getHotIssues(); } - for (int i = 0; i < data.length; i++) { - panel.add(new HotIssueJpanel(data[i], i + 1)); + for (int i = 0; i < hotData.length; i++) { + panel.add(new HotIssueJpanel(hotData[i], i + 1)); } } catch (Exception e) { - data = null; + hotData = null; for (int i = 0; i < AlphaFineConstants.HOT_ITEMS; i++) { panel.add(new HotIssueJpanel(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Connection_Failed")}, i + 1)); } @@ -544,7 +552,7 @@ public class AlphaFineDialog extends UIDialog { } private void buildDocumentList(final String[] searchText) { - addSearchResult(DocumentSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(DocumentSearchManager.getInstance().getLessSearchResult(getHotData(), searchText)); } private void buildFileList(String searchStr, final String[] searchText) { @@ -552,24 +560,24 @@ public class AlphaFineDialog extends UIDialog { } private void buildActionList(final String[] searchText) { - addSearchResult(ActionSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(ActionSearchManager.getInstance().getLessSearchResult(getHotData(), searchText)); } private void buildPluginList(final String[] searchText) { - addSearchResult(PluginSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(PluginSearchManager.getInstance().getLessSearchResult(getHotData(), searchText)); } private void buildRecommendList(final String[] searchText) { - addSearchResult(RecommendSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(RecommendSearchManager.getInstance().getLessSearchResult(getHotData(), searchText)); } private void buildRecentList(final String[] searchText) { - addSearchResult(RecentSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(RecentSearchManager.getInstance().getLessSearchResult(getHotData(), searchText)); } private void buildSimilarList(final String[] searchText) { - addSearchResult(SimilarSearchManeger.getInstance().getLessSearchResult(searchText)); + addSearchResult(SimilarSearchManeger.getInstance().getLessSearchResult(getHotData(), searchText)); } private synchronized void addSearchResult(SearchResult searchResult) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java index 336e64dce..120d15f2b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/preview/RobotPreviewPane.java @@ -28,6 +28,8 @@ import java.net.URL; */ public class RobotPreviewPane extends JPanel { + private static final int TITLE_AREA_HEIGHT = 30; + public RobotPreviewPane(String title, String content) { this.setLayout(new BorderLayout()); this.setBackground(Color.WHITE); @@ -41,17 +43,17 @@ public class RobotPreviewPane extends JPanel { final JEditorPane editorPane = new JEditorPane(); editorPane.setEditorKit(new HTMLEditorKit()); - editorPane.setText(content+"


"); + editorPane.setText(content + "


"); editorPane.addHyperlinkListener(new HyperlinkListener() { @Override public void hyperlinkUpdate(HyperlinkEvent e) { if (e.getEventType() != HyperlinkEvent.EventType.ACTIVATED) { return; } - if(e.getDescription().startsWith(AlphaFineConstants.JAVASCRIPT_PREFIX)){ - String s = e.getDescription().replaceAll(AlphaFineConstants.JAVASCRIPT_PREFIX,StringUtils.EMPTY) - .replaceAll("\\('",StringUtils.EMPTY) - .replaceAll("'\\)",StringUtils.EMPTY); + if (e.getDescription().startsWith(AlphaFineConstants.JAVASCRIPT_PREFIX)) { + String s = e.getDescription().replaceAll(AlphaFineConstants.JAVASCRIPT_PREFIX, StringUtils.EMPTY) + .replaceAll("\\('", StringUtils.EMPTY) + .replaceAll("'\\)", StringUtils.EMPTY); try { Desktop.getDesktop().browse(new URI(AlphaFineConstants.ALPHA_PREVIEW + s)); } catch (IOException e1) { @@ -60,7 +62,8 @@ public class RobotPreviewPane extends JPanel { FineLoggerFactory.getLogger().error(e1.getMessage()); } } - URL linkUrl = e.getURL();if (linkUrl != null) { + URL linkUrl = e.getURL(); + if (linkUrl != null) { try { Desktop.getDesktop().browse(e.getURL().toURI()); } catch (IOException | URISyntaxException e1) { @@ -73,6 +76,7 @@ public class RobotPreviewPane extends JPanel { UIScrollPane jScrollPane = new UIScrollPane(editorPane); jScrollPane.getVerticalScrollBar().setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 0)); jScrollPane.setBorder(BorderFactory.createMatteBorder(5, 10, 0, 10, Color.white)); + this.setPreferredSize(new Dimension(AlphaFineConstants.RIGHT_WIDTH, AlphaFineConstants.CONTENT_HEIGHT - TITLE_AREA_HEIGHT)); add(jScrollPane, BorderLayout.CENTER); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java index b75aa894c..154e7c858 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/fun/AlphaFineSearchProvider.java @@ -12,7 +12,7 @@ public interface AlphaFineSearchProvider { * @param searchText * @return */ - SearchResult getLessSearchResult(String[] searchText); + SearchResult getLessSearchResult(String[][] data, String[] searchText); /** * 获取剩余条数 diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java index 1ba95926a..97bfde18d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/ActionSearchManager.java @@ -12,10 +12,9 @@ import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvi import com.fr.design.mainframe.toolbar.UpdateActionManager; import com.fr.design.mainframe.toolbar.UpdateActionModel; import com.fr.general.ComparatorUtils; - import com.fr.json.JSONObject; -import com.fr.stable.StringUtils; import com.fr.stable.ArrayUtils; +import com.fr.stable.StringUtils; import java.util.List; @@ -58,15 +57,15 @@ public class ActionSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { filterModelList = new SearchResult(); lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (ArrayUtils.isEmpty(searchText)) { - lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); - return lessModelList; - } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainAction()) { + if (ArrayUtils.isEmpty(searchText)) { + lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Set"))); + return lessModelList; + } List updateActions = UpdateActionManager.getUpdateActionManager().getUpdateActions(); for (UpdateActionModel updateActionModel : updateActions) { for (int j = 0; j < searchText.length; j++) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java index cb1f91cda..1003c0e21 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/DocumentSearchManager.java @@ -6,7 +6,6 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.DocumentModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; -import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; @@ -52,19 +51,16 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { - if (ArrayUtils.isEmpty(searchText)) { - return new SearchResult(); - } else if (AlphaFineDialog.data == null) { - return AlphaFineHelper.getNoConnectList(instance); - } + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { lessModelList = new SearchResult(); moreModelList = new SearchResult(); - if (ArrayUtils.isEmpty(searchText)) { - lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); - return lessModelList; - } if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainDocument()) { + if (ArrayUtils.isEmpty(searchText)) { + lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Community_Help"))); + return lessModelList; + } else if (hotData == null) { + return AlphaFineHelper.getNoConnectList(instance); + } SearchResult searchResult = new SearchResult(); for (int j = 0; j < searchText.length; j++) { String url = AlphaFineConstants.DOCUMENT_SEARCH_URL + searchText[j] + AlphaFineConstants.FIRST_PAGE; @@ -78,7 +74,7 @@ public class DocumentSearchManager implements AlphaFineSearchProvider { for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); DocumentModel cellModel = getModelFromCloud(jsonArray.optJSONObject(i)); - if (!AlphaFineHelper.getFilterResult().contains(cellModel)) { + if (!AlphaFineHelper.getFilterResult().contains(cellModel) && !searchResult.contains(cellModel)) { searchResult.add(cellModel); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java index 17c58998d..c7972753c 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/FileSearchManager.java @@ -96,7 +96,7 @@ public class FileSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { return null; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java index 5aafe29fa..0feff5521 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/PluginSearchManager.java @@ -6,7 +6,6 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.PluginModel; -import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.ComparatorUtils; @@ -17,8 +16,8 @@ import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.basic.version.Version; import com.fr.plugin.basic.version.VersionIntervalFactory; -import com.fr.stable.EncodeConstants; import com.fr.stable.ArrayUtils; +import com.fr.stable.EncodeConstants; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -97,20 +96,17 @@ public class PluginSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { - if (ArrayUtils.isEmpty(searchText)) { - return new SearchResult(); - } else if (AlphaFineDialog.data == null) { - return AlphaFineHelper.getNoConnectList(instance); - } + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { this.lessModelList = new SearchResult(); this.moreModelList = new SearchResult(); - if (ArrayUtils.isEmpty(searchText)) { - lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); - return lessModelList; - } SearchResult searchResult = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainPlugin()) { + if (ArrayUtils.isEmpty(searchText)) { + lessModelList.add(new MoreModel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Plugin_Addon"))); + return lessModelList; + } else if (hotData == null) { + return AlphaFineHelper.getNoConnectList(instance); + } for (int j = 0; j < searchText.length; j++) { try { String encodedKey = URLEncoder.encode(searchText[j], EncodeConstants.ENCODING_UTF_8); @@ -123,7 +119,7 @@ public class PluginSearchManager implements AlphaFineSearchProvider { for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); PluginModel cellModel = getPluginModel(jsonArray.optJSONObject(i), false); - if (cellModel != null && !AlphaFineHelper.getFilterResult().contains(cellModel)) { + if (cellModel != null && !AlphaFineHelper.getFilterResult().contains(cellModel) && !searchResult.contains(cellModel)) { searchResult.add(cellModel); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java index 866c2c734..38f413423 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecentSearchManager.java @@ -72,7 +72,7 @@ public class RecentSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { this.modelList = new SearchResult(); for (int j = 0; j < searchText.length; j++) { recentModelList = getRecentModelList(searchText[j]); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java index 7a234838a..de527d551 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/RecommendSearchManager.java @@ -8,7 +8,6 @@ import com.fr.design.mainframe.alphafine.cell.CellModelHelper; import com.fr.design.mainframe.alphafine.cell.model.ActionModel; import com.fr.design.mainframe.alphafine.cell.model.AlphaCellModel; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; -import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; @@ -16,9 +15,9 @@ import com.fr.json.JSONArray; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; +import com.fr.stable.ArrayUtils; import com.fr.stable.CodeUtils; import com.fr.stable.StringUtils; -import com.fr.stable.ArrayUtils; import java.io.IOException; import java.util.Iterator; @@ -47,15 +46,15 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { - if (ArrayUtils.isEmpty(searchText)) { - return new SearchResult(); - } else if(AlphaFineDialog.data == null){ - return AlphaFineHelper.getNoConnectList(instance); - } + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { this.modelList = new SearchResult(); this.recommendModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isContainRecommend()) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } else if(hotData == null){ + return AlphaFineHelper.getNoConnectList(instance); + } for (int j = 0; j < searchText.length; j++) { searchText[j] = searchText[j].replaceAll(StringUtils.BLANK, StringUtils.EMPTY); try { @@ -69,7 +68,7 @@ public class RecommendSearchManager implements AlphaFineSearchProvider { for (int i = 0; i < jsonArray.length(); i++) { AlphaFineHelper.checkCancel(); AlphaCellModel alphaCellModel = CellModelHelper.getModelFromJson((JSONObject) jsonArray.get(i)); - if (alphaCellModel != null && !alreadyContain(alphaCellModel)) { + if (alphaCellModel != null && !alreadyContain(alphaCellModel) && !this.recommendModelList.contains(alphaCellModel)) { this.recommendModelList.add(alphaCellModel); } } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java index 661eba0ff..90d048932 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/search/manager/impl/SimilarSearchManeger.java @@ -6,7 +6,6 @@ import com.fr.design.mainframe.alphafine.AlphaFineHelper; import com.fr.design.mainframe.alphafine.CellType; import com.fr.design.mainframe.alphafine.cell.model.MoreModel; import com.fr.design.mainframe.alphafine.cell.model.RobotModel; -import com.fr.design.mainframe.alphafine.component.AlphaFineDialog; import com.fr.design.mainframe.alphafine.model.SearchResult; import com.fr.design.mainframe.alphafine.search.manager.fun.AlphaFineSearchProvider; import com.fr.general.http.HttpToolbox; @@ -38,14 +37,14 @@ public class SimilarSearchManeger implements AlphaFineSearchProvider { } @Override - public SearchResult getLessSearchResult(String[] searchText) { - if (ArrayUtils.isEmpty(searchText)) { - return new SearchResult(); - } else if (AlphaFineDialog.data == null) { - return AlphaFineHelper.getNoConnectList(instance); - } + public SearchResult getLessSearchResult(String[][] hotData, String[] searchText) { lessModelList = new SearchResult(); if (DesignerEnvManager.getEnvManager().getAlphaFineConfigManager().isNeedIntelligentCustomerService()) { + if (ArrayUtils.isEmpty(searchText)) { + return new SearchResult(); + } else if (hotData == null) { + return AlphaFineHelper.getNoConnectList(instance); + } SearchResult allModelList = new SearchResult(); for (int j = 0; j < searchText.length; j++) { String token = DigestUtils.md5Hex(AlphaFineConstants.ALPHA_ROBOT_SEARCH_TOKEN + searchText[j]);