From 4849f46757742fcd5a5e0b601967a2aba508fa15 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Mon, 8 Oct 2018 16:11:14 +0800 Subject: [PATCH 01/73] =?UTF-8?q?REPORT-10699=20=E5=B1=8F=E8=94=BD?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E9=87=8C=E9=9D=A2=E7=9A=84=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=2010.0=E5=88=86=E6=94=AF=E4=B9=9F=E8=A6=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/fun/JavaScriptActionProvider.java | 1 + .../fun/impl/AbstractJavaScriptActionProvider.java | 9 +++++++++ .../com/fr/design/javascript/JavaScriptActionPane.java | 4 +++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java index 6d70e8785..93b6cab2f 100644 --- a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java @@ -18,4 +18,5 @@ public interface JavaScriptActionProvider extends Mutable{ FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane); + boolean isSupportType(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java index daf4f92c8..9928124cf 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java @@ -26,4 +26,13 @@ public abstract class AbstractJavaScriptActionProvider extends AbstractProvider public FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane) { return getJavaScriptActionPane(); } + + /** + * 判断是否是支持的类型(cpt,frm),默认是 + * @return + */ + @Override + public boolean isSupportType(){ + return true; + } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java index 373480096..fb19c89d7 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java @@ -46,7 +46,9 @@ public abstract class JavaScriptActionPane extends UIComboBoxPane { Set javaScriptActionProviders = ExtraDesignClassManager.getInstance().getArray(JavaScriptActionProvider.XML_TAG); if (javaScriptActionProviders != null) { for (JavaScriptActionProvider jsp : javaScriptActionProviders) { - paneList.add(jsp.getJavaScriptActionPane(this)); + if(jsp.isSupportType()){ + paneList.add(jsp.getJavaScriptActionPane(this)); + } } } // 自定义事件 From 98a24462d5f92b29db9c3186614b3a8d33cc5644 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 9 Oct 2018 09:19:37 +0800 Subject: [PATCH 02/73] =?UTF-8?q?REPORT-11709=20AlphaFine=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=B0=8F=E5=B8=86=E8=A7=86=E8=A7=89=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=20REPORT-11692=20alphafine=E5=88=86=E8=AF=8D=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=B8=AD=E5=8C=85=E5=90=AB=E4=BA=86=E8=BF=9E?= =?UTF-8?q?=E8=AF=8D=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/AlphaFineConstants.java | 10 ++++++++- .../cell/render/BottomCellRender.java | 2 +- .../alphafine/component/AlphaFineDialog.java | 3 +++ .../manager/impl/SegmentationManager.java | 19 ++++++++++++++++++ .../mainframe/alphafine/images/back@1x.png | Bin 0 -> 221 bytes .../mainframe/alphafine/images/back@2x.png | Bin 0 -> 336 bytes 6 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@1x.png create mode 100644 designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@2x.png 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 fe72f9c1d..250116542 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 @@ -5,7 +5,7 @@ import com.fr.general.CloudCenter; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; - +import java.util.ArrayList; /** * Created by XiaXiang on 2017/5/10. @@ -137,5 +137,13 @@ public class AlphaFineConstants { public static final FileExtension[] FILE_EXTENSIONS= new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; public static final int RECOMMEND_MAX_ITEM_NUM = 3; + + public static final String BACK_ICON_NAME = "back@1x.png"; + + public static final ArrayList CONJUNCTION = new ArrayList() {{ + add("和"); + add("与"); + add("的"); + }}; } 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 index 824fc3bfc..43aca2cae 100644 --- 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 @@ -24,7 +24,7 @@ public class BottomCellRender implements ListCellRenderer { JPanel line = new JPanel(); line.setPreferredSize(new Dimension(200, 1)); - line.setBackground(AlphaFineConstants.GRAY); + line.setBackground(AlphaFineConstants.WHITE); panel.add(line, BorderLayout.NORTH); goToWebLabel.setFont(AlphaFineConstants.MEDIUM_FONT); 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 6b21b0b6a..c21dee121 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 @@ -239,6 +239,7 @@ public class AlphaFineDialog extends UIDialog { hotPane.setLayout(new BorderLayout()); UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Hot")); + uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); uiLabel.setFont(AlphaFineConstants.SMALL_FONT); uiLabel.setForeground(AlphaFineConstants.DARK_GRAY); @@ -1378,6 +1379,8 @@ 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.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); + jLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); jLabel.setPreferredSize(new Dimension(80, 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 6f1e3850a..7ca123a35 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 @@ -6,6 +6,7 @@ import com.fr.stable.StringUtils; import com.fr.third.ibm.icu.text.BreakIterator; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -76,8 +77,26 @@ public class SegmentationManager { result.add(temp); } } + result = removeConjunction(result); String[] strings = new String[result.size()]; result.toArray(strings); return strings; } + + /** + * 去除连词 + * + * @param result + * @return + */ + public static List removeConjunction(List result) { + Iterator it = result.iterator(); + while (it.hasNext()) { + String s = it.next(); + if (AlphaFineConstants.CONJUNCTION.contains(s)) { + it.remove(); + } + } + return result; + } } diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@1x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3cc82966536005104870347a6260ffbd0055445a GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4F%}28J29*~C-V}>neOT07$PB= zoN$1#r?SPn$UL=D#m5FY_xDuF110es)H4!SYA{{{B|y3SwbmsNi-x Uc>1{o(1i>Pp00i_>zopr0PZqZkN^Mx literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@2x.png b/designer-realize/src/main/resources/com/fr/design/mainframe/alphafine/images/back@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7a0e30162f762e2edc9597e25356b45a7497b5cb GIT binary patch literal 336 zcmV-W0k8gvP)Px$3Q0skR5%f1U?3BOhK90X)5?NP5TBTXg9Fc(FJCs_yLV3vs7@PQEfcx`K0e5> z&!0bU`~UyH15n*YY-$;?31Sn283vTIWn^URJ9FktF*bEX8Az;QAPWc@NQz+u4J6et zyatkE7)}GpH4J1R)?@=r8Y_Tucw-Z!85_WAAd*6Yk%pue%*1M-u&{7AQ1&n|0T-H> znDn7*!pCRECVBVn-QT*px~sl_|85JE50{pf=709=*-mU~(Z#SD2vS6@p*RgB*HF9$ zl4B@A14%WMC<9@Js;jH7{`Kn@IHIJaq}ZQ7f4&zahYYYL8)OB@>;nf5eBtHg^#Y3R i2V#F@If~i1ssI4qxto(zpcf Date: Tue, 9 Oct 2018 09:26:00 +0800 Subject: [PATCH 03/73] =?UTF-8?q?REPORT-10617=2010.0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E4=B8=AD=E6=9C=89=E9=83=A8=E4=BB=BD9.0=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=AB=AF=E7=9A=84=E5=8A=9F=E8=83=BD=E7=BC=BA=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-form/src/main/java/com/fr/design/mainframe/JForm.java | 2 +- .../src/main/java/com/fr/design/mainframe/JWorkBook.java | 3 ++- 2 files changed, 3 insertions(+), 2 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 95d4e16ce..2fb5febd3 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 @@ -936,7 +936,7 @@ public class JForm extends JTemplate implements BaseJForm { */ @Override public PreviewProvider[] supportPreview() { - return new PreviewProvider[]{new FormPreview()}; + return new PreviewProvider[]{new FormPreview(), new MobilePreview()}; } /** 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 b546d618b..bfc01d0bf 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 @@ -52,6 +52,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; @@ -889,7 +890,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 417414a9f20b3a416fa37591b287fe988652965a Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 9 Oct 2018 09:31:25 +0800 Subject: [PATCH 04/73] =?UTF-8?q?REPORT-11335=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BC=9A=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E4=B8=AA=E7=9A=84=E8=AE=B0=E5=BD=95=3D>?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/data/datapane/connect/JDBCDefPane.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 81d52d4e6..d6137b986 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -35,12 +35,12 @@ public class JDBCDefPane extends JPanel { public static final String DRIVER_TYPE = "driver_type"; public static final String USER_NAME = "user_name"; public static final int TIME_MULTIPLE = 1000; - private static final String EMPTY_DB = StringUtils.EMPTY; + private static final String OTHER_DB = "Others"; private static Map jdbcMap = new HashMap(); static { - jdbcMap.put("Others", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), + jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/")}); @@ -65,7 +65,7 @@ public class JDBCDefPane extends JPanel { private UITextField userNameTextField; private JPasswordField passwordTextField; // 请不要改动dbtype,只应该最后添加 - private final String[] dbtype = {EMPTY_DB, "Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", "Others"}; + private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", OTHER_DB}; // carl:DBCP的一些属性 private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); @@ -184,7 +184,7 @@ public class JDBCDefPane extends JPanel { } } if (!out) { - this.dbtypeComboBox.setSelectedItem(EMPTY_DB); + this.dbtypeComboBox.setSelectedItem(OTHER_DB); } } this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); From d891df9538d99d07fb3dc88ad649e7453d1746b3 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 9 Oct 2018 10:14:54 +0800 Subject: [PATCH 05/73] =?UTF-8?q?REPORT-11692=20alphafine=E5=88=86?= =?UTF-8?q?=E8=AF=8D=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E4=B8=AD=E5=8C=85?= =?UTF-8?q?=E5=90=AB=E4=BA=86=E8=BF=9E=E8=AF=8D=E7=BB=93=E6=9E=9C=20?= =?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 --- .../alphafine/AlphaFineConstants.java | 6 ++--- .../manager/impl/SegmentationManager.java | 22 ++----------------- 2 files changed, 5 insertions(+), 23 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 250116542..1166efad8 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 @@ -141,9 +141,9 @@ public class AlphaFineConstants { public static final String BACK_ICON_NAME = "back@1x.png"; public static final ArrayList CONJUNCTION = new ArrayList() {{ - add("和"); - add("与"); - add("的"); + add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Conjunction_HE")); + add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Conjunction_YU")); + add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Conjunction_DE")); }}; } 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 7ca123a35..49075769b 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 @@ -6,7 +6,6 @@ import com.fr.stable.StringUtils; import com.fr.third.ibm.icu.text.BreakIterator; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -73,30 +72,13 @@ public class SegmentationManager { 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)) { + //去掉空和连词 + if (!StringUtils.isEmpty(temp) & !AlphaFineConstants.CONJUNCTION.contains(temp)) { result.add(temp); } } - result = removeConjunction(result); String[] strings = new String[result.size()]; result.toArray(strings); return strings; } - - /** - * 去除连词 - * - * @param result - * @return - */ - public static List removeConjunction(List result) { - Iterator it = result.iterator(); - while (it.hasNext()) { - String s = it.next(); - if (AlphaFineConstants.CONJUNCTION.contains(s)) { - it.remove(); - } - } - return result; - } } From 01065e0accadc6759708de326f567b528120bb4e Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 9 Oct 2018 10:19:18 +0800 Subject: [PATCH 06/73] =?UTF-8?q?=E5=82=BB=E9=80=BC=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alphafine/search/manager/impl/SegmentationManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 49075769b..03c39af8f 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 @@ -73,7 +73,7 @@ public class SegmentationManager { for (int end = itor.next(); end != BreakIterator.DONE; start = end, end = itor.next()) { String temp = searchText.substring(start, end); //去掉空和连词 - if (!StringUtils.isEmpty(temp) & !AlphaFineConstants.CONJUNCTION.contains(temp)) { + if (StringUtils.isNotEmpty(temp) && !AlphaFineConstants.CONJUNCTION.contains(temp)) { result.add(temp); } } From 4eb126b9ad08775375c87a5a521356be9f855f74 Mon Sep 17 00:00:00 2001 From: ju Date: Tue, 9 Oct 2018 12:15:26 +0800 Subject: [PATCH 07/73] =?UTF-8?q?BI-33768=20=E6=8F=90=E4=BE=9B=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=89=80=E6=9C=89=E5=90=AF=E5=8A=A8=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/module/DesignerStartup.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 237a19fa9..71f197ea6 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 @@ -7,6 +7,7 @@ import com.fr.event.Listener; import com.fr.module.Activator; import com.fr.record.analyzer.EnableMetrics; import com.fr.record.analyzer.Metrics; +import com.fr.runtime.FineRuntime; import com.fr.start.Designer; import com.fr.start.ServerStarter; import com.fr.start.SplashContext; @@ -63,7 +64,7 @@ public class DesignerStartup extends Activator { DesignerContext.getDesignerFrame().getProgressDialog().setVisible(true); startSub(StartFinishActivator.class); - + FineRuntime.startFinish(); } private void browserDemo() { From 3269aab42295ef7a2eb54f596c9084f6c59f848c Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Tue, 9 Oct 2018 14:46:46 +0800 Subject: [PATCH 08/73] =?UTF-8?q?REPORT-11709=20AlphaFine=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=B0=8F=E5=B8=86=E8=A7=86=E8=A7=89=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=2010.0=E5=88=86=E6=94=AF=E6=B2=A1=E6=94=B9=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/alphafine/component/AlphaFineDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c21dee121..b8b9362cc 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 @@ -1378,7 +1378,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.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); jLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); jLabel.setPreferredSize(new Dimension(80, 20)); From 7db1c448d073dcd3900a7dc4d272688fa5a2df36 Mon Sep 17 00:00:00 2001 From: kerry Date: Wed, 10 Oct 2018 19:40:33 +0800 Subject: [PATCH 09/73] =?UTF-8?q?REPORT-11794=2010.0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=AE=89=E8=A3=85=E8=B7=AF=E5=BE=84=E5=AD=98=E5=9C=A8?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=E4=BC=9A=E5=AF=BC=E8=87=B4=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=95=8C=E9=9D=A2=E8=B5=84=E6=BA=90=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=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/extra/PluginWebPane.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java b/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java index 3e2cafdfe..627d16855 100644 --- a/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java +++ b/designer-base/src/main/java/com/fr/design/extra/PluginWebPane.java @@ -4,6 +4,7 @@ import com.fr.base.TemplateUtils; import com.fr.general.GeneralContext; import com.fr.general.IOUtils; import com.fr.log.FineLoggerFactory; +import com.fr.stable.EncodeConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import javafx.application.Platform; @@ -32,6 +33,9 @@ import java.util.Map; public class PluginWebPane extends JFXPanel { private static final String RESOURCE_URL = "resourceURL"; private static final String LANGUAGE = "language"; + private static final String URL_PLUS = "+"; + private static final String URL_SPACING = "%20"; + private static final String URL_PREFIX = "file:///"; private WebEngine webEngine; public PluginWebPane(final String installHome, final String mainJs) { @@ -75,8 +79,9 @@ public class PluginWebPane extends JFXPanel { StringBuffer sb = new StringBuffer(); String line; Map map4Tpl = new HashMap(); - - map4Tpl.put(RESOURCE_URL, "file:///" + URLEncoder.encode(installHome, "UTF-8")); + //URL中关于空格的编码与空格所在位置相关:空格被编码成+的情况只能在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中 + //URLEncoder会将空格转成+,这边需要+转成%20 + map4Tpl.put(RESOURCE_URL, URL_PREFIX + URLEncoder.encode(installHome, EncodeConstants.ENCODING_UTF_8).replace(URL_PLUS, URL_SPACING)); map4Tpl.put(LANGUAGE, GeneralContext.getLocale().toString()); while ((line = read.readLine()) != null) { if (sb.length() > 0) { From c9cb2e9aea5ad4413821c4909db88e3e45f40fe4 Mon Sep 17 00:00:00 2001 From: zheng Date: Thu, 11 Oct 2018 14:59:04 +0800 Subject: [PATCH 10/73] =?UTF-8?q?CHART-2982=20gis=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=20=E4=BF=AE=E6=94=B9typepane=20update=E6=97=B6?= =?UTF-8?q?=E5=80=99=E4=BC=9A=E6=9B=BF=E6=8D=A2=E9=BB=98=E8=AE=A4chart?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/chart/gui/ChartTypePane.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index e847f190c..cc9a20104 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -152,9 +152,10 @@ public class ChartTypePane extends AbstractChartAttrPane{ try{ Chart newDefaultChart = (Chart)((AbstractChartTypePane)getSelectedPane()).getDefaultChart().clone(); - if(!chart.accept(newDefaultChart.getClass())){ - //vanChart 和 chart 之间切换 - editingCollection.removeNameObject(editingCollection.getSelectedIndex()); + if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { + //vanChart 和 chart 之间切换 + //不同chart之间切换 + editingCollection.removeNameObject(editingCollection.getSelectedIndex()); editingCollection.addChart(newDefaultChart); chart = newDefaultChart; } From 1622209ed5178b22fcfed527398dde6096845d37 Mon Sep 17 00:00:00 2001 From: neil Date: Wed, 31 Oct 2018 22:07:10 +0800 Subject: [PATCH 11/73] =?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/design/fun/JavaScriptActionProvider.java | 3 +-- .../impl/AbstractJavaScriptActionProvider.java | 4 ++-- .../design/javascript/JavaScriptActionPane.java | 3 ++- .../mainframe/chart/gui/ChartTypePane.java | 2 +- .../mainframe/alphafine/AlphaFineConstants.java | 12 +++++------- .../alphafine/component/AlphaFineDialog.java | 16 ++++++++-------- 6 files changed, 19 insertions(+), 21 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java index 754bdaeb4..93b6cab2f 100644 --- a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java @@ -18,6 +18,5 @@ public interface JavaScriptActionProvider extends Mutable{ FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane); - boolean isSupportType(); - + boolean isSupportType(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java index 4640eaf4f..9928124cf 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java @@ -26,8 +26,8 @@ public abstract class AbstractJavaScriptActionProvider extends AbstractProvider public FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane) { return getJavaScriptActionPane(); } - - /** + + /** * 判断是否是支持的类型(cpt,frm),默认是 * @return */ diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java index 05208762e..fb19c89d7 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java @@ -9,6 +9,7 @@ import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.write.submit.DBManipulationPane; import com.fr.form.ui.WebContentUtils; + import com.fr.js.JavaScript; import javax.swing.BorderFactory; @@ -45,7 +46,7 @@ public abstract class JavaScriptActionPane extends UIComboBoxPane { Set javaScriptActionProviders = ExtraDesignClassManager.getInstance().getArray(JavaScriptActionProvider.XML_TAG); if (javaScriptActionProviders != null) { for (JavaScriptActionProvider jsp : javaScriptActionProviders) { - if(jsp.isSupportType()){ + if(jsp.isSupportType()){ paneList.add(jsp.getJavaScriptActionPane(this)); } } diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index 5f9dd9a15..cc9a20104 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -155,7 +155,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { //vanChart 和 chart 之间切换 //不同chart之间切换 - editingCollection.removeNameObject(editingCollection.getSelectedIndex()); + editingCollection.removeNameObject(editingCollection.getSelectedIndex()); editingCollection.addChart(newDefaultChart); chart = newDefaultChart; } 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 4cebe741c..1166efad8 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,13 +2,11 @@ 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; import java.awt.Font; import java.util.ArrayList; - /** * Created by XiaXiang on 2017/5/10. */ @@ -51,7 +49,7 @@ public class AlphaFineConstants { 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 HOT_ISSUES_JAPNEL_SIZE = new Dimension(213,182); public static final Dimension CLOSE_BUTTON_SIZE = new Dimension(40, 40); @@ -85,7 +83,7 @@ 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 ALPHA_HOT_IMAGE_NAME = "alphafine_hot"; public static final String PLUGIN_SEARCH_URL = CloudCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); @@ -136,11 +134,11 @@ public class AlphaFineConstants { public static final String FIRST_PAGE = "-1"; - public static final FileExtension[] FILE_EXTENSIONS = new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; + public static final FileExtension[] FILE_EXTENSIONS= new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; public static final int RECOMMEND_MAX_ITEM_NUM = 3; - - public static final String BACK_ICON_NAME = "back@1x.png"; + + public static final String BACK_ICON_NAME = "back@1x.png"; public static final ArrayList CONJUNCTION = new ArrayList() {{ add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Conjunction_HE")); 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 6310a2233..b8b9362cc 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 @@ -32,7 +32,7 @@ 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.SimilarSearchManager; +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; @@ -239,21 +239,21 @@ public class AlphaFineDialog extends UIDialog { hotPane.setLayout(new BorderLayout()); UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Hot")); - uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); uiLabel.setFont(AlphaFineConstants.SMALL_FONT); uiLabel.setForeground(AlphaFineConstants.DARK_GRAY); GridLayout gridLayout = new GridLayout(2, 3, 3, 3); JPanel panel = new JPanel(); panel.setLayout(gridLayout); - if (AlphaFineHelper.isNetworkOk()) { + if(AlphaFineHelper.isNetworkOk()) { if (hotData == null) { hotData = HotIssuesManager.getInstance().getHotIssues(); } for (int i = 0; i < hotData.length; i++) { panel.add(new HotIssueJpanel(hotData[i], i + 1)); } - } else { + }else { 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)); @@ -573,7 +573,7 @@ public class AlphaFineDialog extends UIDialog { } private void buildSimilarList(final String[] searchText) { - addSearchResult(SimilarSearchManager.getInstance().getLessSearchResult(searchText)); + addSearchResult(SimilarSearchManeger.getInstance().getLessSearchResult(searchText)); } private synchronized void addSearchResult(SearchResult searchResult) { @@ -948,7 +948,7 @@ public class AlphaFineDialog extends UIDialog { Thread sendThread = new Thread(new Runnable() { @Override public void run() { - if (StringUtils.isNotEmpty(storeText)) { + if(StringUtils.isNotEmpty(storeText)){ RecentSearchManager searchManager = RecentSearchManager.getInstance(); searchManager.addModel(storeText, cellModel); sendDataToServer(storeText, cellModel); @@ -1052,7 +1052,7 @@ public class AlphaFineDialog extends UIDialog { break; case ROBOT: case RECOMMEND_ROBOT: - moreResult = SimilarSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); + moreResult = SimilarSearchManeger.getInstance().getMoreSearchResult(searchTextField.getText()); break; case RECOMMEND: moreResult = RecommendSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); @@ -1379,7 +1379,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.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); + jLabel.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); jLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); jLabel.setPreferredSize(new Dimension(80, 20)); jLabel.setFont(AlphaFineConstants.SMALL_FONT); From 2c3c08724965f70b66ce47dd314b4d3715aae26c Mon Sep 17 00:00:00 2001 From: neil Date: Wed, 31 Oct 2018 22:08:01 +0800 Subject: [PATCH 12/73] ct --- .../mainframe/alphafine/AlphaFineConstants.java | 12 +++++++----- .../alphafine/component/AlphaFineDialog.java | 16 ++++++++-------- 2 files changed, 15 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 1166efad8..4cebe741c 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,11 +2,13 @@ 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; import java.awt.Font; import java.util.ArrayList; + /** * Created by XiaXiang on 2017/5/10. */ @@ -49,7 +51,7 @@ public class AlphaFineConstants { 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 HOT_ISSUES_JAPNEL_SIZE = new Dimension(213, 182); public static final Dimension CLOSE_BUTTON_SIZE = new Dimension(40, 40); @@ -83,7 +85,7 @@ 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 ALPHA_HOT_IMAGE_NAME = "alphafine_hot"; public static final String PLUGIN_SEARCH_URL = CloudCenter.getInstance().acquireUrlByKind("plugin.searchAPI"); @@ -134,11 +136,11 @@ public class AlphaFineConstants { public static final String FIRST_PAGE = "-1"; - public static final FileExtension[] FILE_EXTENSIONS= new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; + public static final FileExtension[] FILE_EXTENSIONS = new FileExtension[]{FileExtension.CPT, FileExtension.FRM}; public static final int RECOMMEND_MAX_ITEM_NUM = 3; - - public static final String BACK_ICON_NAME = "back@1x.png"; + + public static final String BACK_ICON_NAME = "back@1x.png"; public static final ArrayList CONJUNCTION = new ArrayList() {{ add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Conjunction_HE")); 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 b8b9362cc..6310a2233 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 @@ -32,7 +32,7 @@ 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.alphafine.search.manager.impl.SimilarSearchManager; import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.form.main.Form; @@ -239,21 +239,21 @@ public class AlphaFineDialog extends UIDialog { hotPane.setLayout(new BorderLayout()); UILabel uiLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_AlphaFine_Hot")); - uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); + uiLabel.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); uiLabel.setFont(AlphaFineConstants.SMALL_FONT); uiLabel.setForeground(AlphaFineConstants.DARK_GRAY); GridLayout gridLayout = new GridLayout(2, 3, 3, 3); JPanel panel = new JPanel(); panel.setLayout(gridLayout); - if(AlphaFineHelper.isNetworkOk()) { + if (AlphaFineHelper.isNetworkOk()) { if (hotData == null) { hotData = HotIssuesManager.getInstance().getHotIssues(); } for (int i = 0; i < hotData.length; i++) { panel.add(new HotIssueJpanel(hotData[i], i + 1)); } - }else { + } else { 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)); @@ -573,7 +573,7 @@ public class AlphaFineDialog extends UIDialog { } private void buildSimilarList(final String[] searchText) { - addSearchResult(SimilarSearchManeger.getInstance().getLessSearchResult(searchText)); + addSearchResult(SimilarSearchManager.getInstance().getLessSearchResult(searchText)); } private synchronized void addSearchResult(SearchResult searchResult) { @@ -948,7 +948,7 @@ public class AlphaFineDialog extends UIDialog { Thread sendThread = new Thread(new Runnable() { @Override public void run() { - if(StringUtils.isNotEmpty(storeText)){ + if (StringUtils.isNotEmpty(storeText)) { RecentSearchManager searchManager = RecentSearchManager.getInstance(); searchManager.addModel(storeText, cellModel); sendDataToServer(storeText, cellModel); @@ -1052,7 +1052,7 @@ public class AlphaFineDialog extends UIDialog { break; case ROBOT: case RECOMMEND_ROBOT: - moreResult = SimilarSearchManeger.getInstance().getMoreSearchResult(searchTextField.getText()); + moreResult = SimilarSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); break; case RECOMMEND: moreResult = RecommendSearchManager.getInstance().getMoreSearchResult(searchTextField.getText()); @@ -1379,7 +1379,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.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); + jLabel.setIcon(IconLoader.getIcon(AlphaFineConstants.IMAGE_URL + AlphaFineConstants.BACK_ICON_NAME)); jLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); jLabel.setPreferredSize(new Dimension(80, 20)); jLabel.setFont(AlphaFineConstants.SMALL_FONT); From 673fa11ca699145c2668b484733d5c937f4b3b94 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Fri, 23 Nov 2018 14:07:13 +0800 Subject: [PATCH 13/73] =?UTF-8?q?REPORT-12928=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8finedb=E9=94=81=E4=BD=8F,=20=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E6=98=AF=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=8A=A0=E8=BD=BD=E9=97=AE?= =?UTF-8?q?=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../toolbar/UpdateActionManager.java | 24 +++++++----------- .../src/main/java/com/fr/start/Designer.java | 25 ------------------- .../fr/start/module/DesignerActivator.java | 18 ++++++++++++- 3 files changed, 26 insertions(+), 41 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java index dcc053e12..fe3629774 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/UpdateActionManager.java @@ -56,21 +56,15 @@ public class UpdateActionManager { } public synchronized void dealWithSearchText(final String paneClass, final UpdateAction updateAction) { - threadPoolExecutor.allowCoreThreadTimeOut(true); - threadPoolExecutor.execute(new Runnable() { - @Override - public void run() { - JPanel panel = null; - try { - panel = (JPanel) StableUtils.classForName(paneClass).newInstance(); - if (panel instanceof LoadingBasicPane) { - panel = ((LoadingBasicPane) panel).getAllComponents(); - } - updateAction.setSearchText(updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer())); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } + JPanel panel = null; + try { + panel = (JPanel) StableUtils.classForName(paneClass).newInstance(); + if (panel instanceof LoadingBasicPane) { + panel = ((LoadingBasicPane) panel).getAllComponents(); } - }); + updateAction.setSearchText(updateAction.getComponentTexts(panel, "_", new StringBuffer(), new StringBuffer(), new StringBuffer())); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } } \ No newline at end of file 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 756cd1262..c9ce8bc06 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -29,7 +29,6 @@ import com.fr.design.mainframe.JWorkBook; import com.fr.design.mainframe.alphafine.component.AlphaFinePane; import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; @@ -54,7 +53,6 @@ import com.fr.stable.xml.XMLTools; import com.fr.start.fx.SplashFx; import com.fr.start.jni.SplashMac; import com.fr.start.module.StartupArgs; -import com.fr.start.preload.ImagePreLoader; import com.fr.start.server.ServerTray; import com.fr.workspace.WorkContext; @@ -69,8 +67,6 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; @@ -110,8 +106,6 @@ public class Designer extends BaseDesigner { RestartHelper.deleteRecordFilesWhenStart(); - preloadResource(); - SplashContext.getInstance().registerSplash(createSplash()); SplashContext.getInstance().show(); @@ -131,25 +125,6 @@ public class Designer extends BaseDesigner { } - private static void preloadResource() { - ExecutorService service = Executors.newCachedThreadPool(); - - service.submit(new Runnable() { - @Override - public void run() { - new ImagePreLoader(); - } - }); - - service.submit(new Runnable() { - @Override - public void run() { - TemplateInfoCollector.getInstance(); - } - }); - service.shutdown(); - } - private static SplashStrategy createSplash() { // 这里可以开接口加载自定义启动画面 if (OperatingSystem.isWindows()) { 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..2b8e77ac4 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 @@ -52,6 +52,7 @@ import com.fr.design.mainframe.form.FormReportComponentComposite; import com.fr.design.mainframe.loghandler.DesignerLogAppender; import com.fr.design.mainframe.loghandler.LogMessageBar; import com.fr.design.mainframe.socketio.DesignerSocketIO; +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.FormParameterReader; import com.fr.design.parameter.ParameterPropertyPane; @@ -98,9 +99,10 @@ import com.fr.stable.script.ValueConverter; import com.fr.stable.xml.ObjectTokenizer; import com.fr.stable.xml.ObjectXMLWriterFinder; import com.fr.start.BBSGuestPaneProvider; +import com.fr.start.preload.ImagePreLoader; import com.fr.xml.ReportXMLUtils; -import java.awt.*; +import java.awt.Image; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; @@ -176,6 +178,20 @@ public class DesignerActivator extends Activator { private static void preLoadPane() { ExecutorService service = Executors.newCachedThreadPool(); + service.submit(new Runnable() { + @Override + public void run() { + new ImagePreLoader(); + } + }); + + service.submit(new Runnable() { + @Override + public void run() { + TemplateInfoCollector.getInstance(); + } + }); + service.submit(new Runnable() { @Override public void run() { From 22cd3c95e453180bb5a968e6c739107aefa9ebad Mon Sep 17 00:00:00 2001 From: zack Date: Tue, 4 Dec 2018 09:01:04 +0800 Subject: [PATCH 14/73] =?UTF-8?q?REPORT-13215=2010.0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=90=AF=E5=8A=A8=E8=BF=87=E7=A8=8B=E4=B8=AD=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E7=94=B1=E4=BA=8E=E6=8A=A5=E9=94=99=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=99=BD=E8=89=B2=E8=92=99=E5=B1=82=E4=B8=8D=E6=B6=88=E5=A4=B1?= =?UTF-8?q?.=E5=90=8C=E6=AD=A5master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/ServerStarter.java | 6 +++++- .../main/java/com/fr/start/module/DesignerStartup.java | 8 +++++--- 2 files changed, 10 insertions(+), 4 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 3115730d1..7499b1ae3 100644 --- a/designer-base/src/main/java/com/fr/start/ServerStarter.java +++ b/designer-base/src/main/java/com/fr/start/ServerStarter.java @@ -66,7 +66,11 @@ public class ServerStarter { @Override public void run() { - FineEmbedServer.start(); + try { + FineEmbedServer.start(); + } finally { + FineEmbedServerMonitor.getInstance().setComplete(); + } BrowseUtils.browser(url); } }); 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 71f197ea6..701a6936c 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 @@ -52,9 +52,11 @@ public class DesignerStartup extends Activator { @Override public void run() { - - designer.show(args); - DesignerContext.getDesignerFrame().getProgressDialog().dispose(); + try { + designer.show(args); + } finally { + DesignerContext.getDesignerFrame().getProgressDialog().dispose(); + } } }); service.shutdown(); From a8c0718ca3257b8a8cee4f7b2b66fc92eeae2314 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Tue, 4 Dec 2018 09:58:02 +0800 Subject: [PATCH 15/73] =?UTF-8?q?REPORT-12924=20=E6=8E=92=E6=9F=A5?= =?UTF-8?q?=E9=97=AA=E9=80=80,=20=E5=85=88=E6=89=93=E5=8D=B0=E6=8A=A5?= =?UTF-8?q?=E9=94=99,=20=E7=B1=BB=E4=BC=BCfinedb=E9=94=81=E4=BA=86?= =?UTF-8?q?=E6=98=AF=E4=B8=8D=E9=9C=80=E8=A6=81=E9=97=AA=E9=80=80=E7=9A=84?= =?UTF-8?q?.?= 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 c9ce8bc06..5b10dc9c1 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -115,7 +115,7 @@ public class Designer extends BaseDesigner { try { designerRoot.start(); } catch (LifecycleFatalError fatal) { - System.exit(0); + FineLoggerFactory.getLogger().error(fatal.getMessage(), fatal); } if (WorkContext.getCurrent().isLocal()) { From 2202ea1564806b2a992cf33c6734480575c64b4f Mon Sep 17 00:00:00 2001 From: qinghuiliu Date: Thu, 6 Dec 2018 16:36:06 +0800 Subject: [PATCH 16/73] =?UTF-8?q?CHART-3472=20=E8=BF=98=E5=8E=9FCHART-3252?= =?UTF-8?q?=E7=9A=84master=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/AbstractExtendedChartReportDataPane.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java index 950d71e8c..aa6bbf1a0 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java @@ -12,7 +12,7 @@ import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.Component; -import java.awt.BorderLayout; +import java.awt.FlowLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -54,11 +54,11 @@ public abstract class AbstractExtendedChartReportDataPane Date: Tue, 11 Dec 2018 17:03:12 +0800 Subject: [PATCH 17/73] =?UTF-8?q?REPORT-13363=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=90=8E=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/Designer.java | 10 ++++++++-- 1 file changed, 8 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 5b10dc9c1..e80a31603 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -57,6 +57,7 @@ import com.fr.start.server.ServerTray; import com.fr.workspace.WorkContext; import javax.swing.JComponent; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.MatteBorder; import java.awt.Component; @@ -92,14 +93,16 @@ 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."); + String message = "Designer port not available."; + JOptionPane.showMessageDialog(null, message, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); + FineLoggerFactory.getLogger().error(message); System.exit(0); return; } @@ -115,7 +118,10 @@ public class Designer extends BaseDesigner { try { designerRoot.start(); } catch (LifecycleFatalError fatal) { + SplashContext.getInstance().hide(); + JOptionPane.showMessageDialog(null, fatal.getMessage(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); FineLoggerFactory.getLogger().error(fatal.getMessage(), fatal); + System.exit(0); } if (WorkContext.getCurrent().isLocal()) { From 94857554978ca4984db9f9d9c309cb5de5b7efbb Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 11 Dec 2018 17:06:42 +0800 Subject: [PATCH 18/73] =?UTF-8?q?REPORT-13363=20=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=90=8E=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=97=AA=E9=80=80=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 --- designer-realize/src/main/java/com/fr/start/Designer.java | 4 +--- 1 file changed, 1 insertion(+), 3 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 e80a31603..60a80469f 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -100,9 +100,7 @@ public class Designer extends BaseDesigner { // 如果端口被占用了 说明程序已经运行了一次,也就是说,已经建立一个监听服务器,现在只要给服务器发送命令就好了 if (DesignUtils.isStarted()) { DesignUtils.clientSend(args); - String message = "Designer port not available."; - JOptionPane.showMessageDialog(null, message, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); - FineLoggerFactory.getLogger().error(message); + FineLoggerFactory.getLogger().error("Designer port not available."); System.exit(0); return; } From db4aca22e43cff97c53e077bbfb76b9ff30b82d2 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Mon, 24 Dec 2018 15:56:19 +0800 Subject: [PATCH 19/73] 1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 408bc7be8..7be92004b 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ - 4.0.0 + 4.0.0 com.fr.report From e80551f3cb4bc2f9422807227da7e5fdceb58555 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Mon, 24 Dec 2018 15:56:49 +0800 Subject: [PATCH 20/73] . --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7be92004b..408bc7be8 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ - 4.0.0 + 4.0.0 com.fr.report From 9eead4389df6551742e65a70223f67e108557647 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 27 Dec 2018 15:29:06 +0800 Subject: [PATCH 21/73] . --- .../design/fun/JavaScriptActionProvider.java | 17 ++--------------- .../impl/AbstractJavaScriptActionProvider.java | 18 +++++------------- 2 files changed, 7 insertions(+), 28 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java index 5f1f1aa5a..93b6cab2f 100644 --- a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java @@ -2,12 +2,11 @@ package com.fr.design.fun; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.javascript.JavaScriptActionPane; -import com.fr.design.mainframe.JTemplate; import com.fr.js.JavaScript; import com.fr.stable.fun.mark.Mutable; /** - * 控件的事件扩展接口 + * Created by zack on 2015/8/14. */ public interface JavaScriptActionProvider extends Mutable{ @@ -15,21 +14,9 @@ public interface JavaScriptActionProvider extends Mutable{ int CURRENT_LEVEL = 1; - /** - * 事件的界面 - */ FurtherBasicBeanPane getJavaScriptActionPane(); - /** - * 这个界面在哪些类型模板设计的时候会出现 - * @see com.fr.design.mainframe.JWorkBook - * @see com.fr.design.mainframe.JForm - */ - boolean accept(JTemplate template); - - @Deprecated FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane); - @Deprecated - boolean isSupportType(); + boolean isSupportType(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java index 7f57f35a5..9928124cf 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java @@ -3,8 +3,6 @@ package com.fr.design.fun.impl; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.fun.JavaScriptActionProvider; import com.fr.design.javascript.JavaScriptActionPane; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; import com.fr.js.JavaScript; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -28,17 +26,11 @@ public abstract class AbstractJavaScriptActionProvider extends AbstractProvider public FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane) { return getJavaScriptActionPane(); } - - @Override - public boolean accept(JTemplate template) { - // 这里只是为了兼容原来的isSupportType方法 - boolean result = isSupportType(); - if (result) { - return true; - } - return true; - } - + + /** + * 判断是否是支持的类型(cpt,frm),默认是 + * @return + */ @Override public boolean isSupportType(){ return true; From cc9aec02ff5957f4fd5d0657a02bfde94900e83a Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 27 Dec 2018 15:30:28 +0800 Subject: [PATCH 22/73] . --- .../java/com/fr/design/javascript/JavaScriptActionPane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java index 3b025ae1f..fb19c89d7 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java @@ -7,9 +7,9 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.fun.JavaScriptActionProvider; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.write.submit.DBManipulationPane; import com.fr.form.ui.WebContentUtils; + import com.fr.js.JavaScript; import javax.swing.BorderFactory; @@ -46,7 +46,7 @@ public abstract class JavaScriptActionPane extends UIComboBoxPane { Set javaScriptActionProviders = ExtraDesignClassManager.getInstance().getArray(JavaScriptActionProvider.XML_TAG); if (javaScriptActionProviders != null) { for (JavaScriptActionProvider jsp : javaScriptActionProviders) { - if(jsp.accept(DesignerContext.getDesignerFrame().getSelectedJTemplate())){ + if(jsp.isSupportType()){ paneList.add(jsp.getJavaScriptActionPane(this)); } } From 8c7b7ec9f366a1007b894ee9453a674eb1202075 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Thu, 27 Dec 2018 15:31:47 +0800 Subject: [PATCH 23/73] . --- .../AbstractExtendedChartReportDataPane.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java index e42707a62..aa6bbf1a0 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java @@ -6,14 +6,13 @@ import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.Component; -import java.awt.BorderLayout; +import java.awt.FlowLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -50,17 +49,16 @@ public abstract class AbstractExtendedChartReportDataPane Date: Thu, 27 Dec 2018 15:34:47 +0800 Subject: [PATCH 24/73] ct --- .../design/javascript/JavaScriptActionPane.java | 4 ++-- .../AbstractExtendedChartReportDataPane.java | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java index fb19c89d7..3b025ae1f 100644 --- a/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java +++ b/designer-base/src/main/java/com/fr/design/javascript/JavaScriptActionPane.java @@ -7,9 +7,9 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.fun.JavaScriptActionProvider; import com.fr.design.gui.frpane.UIComboBoxPane; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.write.submit.DBManipulationPane; import com.fr.form.ui.WebContentUtils; - import com.fr.js.JavaScript; import javax.swing.BorderFactory; @@ -46,7 +46,7 @@ public abstract class JavaScriptActionPane extends UIComboBoxPane { Set javaScriptActionProviders = ExtraDesignClassManager.getInstance().getArray(JavaScriptActionProvider.XML_TAG); if (javaScriptActionProviders != null) { for (JavaScriptActionProvider jsp : javaScriptActionProviders) { - if(jsp.isSupportType()){ + if(jsp.accept(DesignerContext.getDesignerFrame().getSelectedJTemplate())){ paneList.add(jsp.getJavaScriptActionPane(this)); } } diff --git a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java index aa6bbf1a0..e42707a62 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/AbstractExtendedChartReportDataPane.java @@ -6,13 +6,14 @@ import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.AbstractReportDataContentPane; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import java.awt.Component; -import java.awt.FlowLayout; +import java.awt.BorderLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -49,16 +50,17 @@ public abstract class AbstractExtendedChartReportDataPane Date: Thu, 27 Dec 2018 15:35:21 +0800 Subject: [PATCH 25/73] ct --- .../design/fun/JavaScriptActionProvider.java | 17 +++++++++++++++-- .../impl/AbstractJavaScriptActionProvider.java | 18 +++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java index 93b6cab2f..5f1f1aa5a 100644 --- a/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/JavaScriptActionProvider.java @@ -2,11 +2,12 @@ package com.fr.design.fun; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.javascript.JavaScriptActionPane; +import com.fr.design.mainframe.JTemplate; import com.fr.js.JavaScript; import com.fr.stable.fun.mark.Mutable; /** - * Created by zack on 2015/8/14. + * 控件的事件扩展接口 */ public interface JavaScriptActionProvider extends Mutable{ @@ -14,9 +15,21 @@ public interface JavaScriptActionProvider extends Mutable{ int CURRENT_LEVEL = 1; + /** + * 事件的界面 + */ FurtherBasicBeanPane getJavaScriptActionPane(); + /** + * 这个界面在哪些类型模板设计的时候会出现 + * @see com.fr.design.mainframe.JWorkBook + * @see com.fr.design.mainframe.JForm + */ + boolean accept(JTemplate template); + + @Deprecated FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane); - boolean isSupportType(); + @Deprecated + boolean isSupportType(); } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java index 9928124cf..7f57f35a5 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractJavaScriptActionProvider.java @@ -3,6 +3,8 @@ package com.fr.design.fun.impl; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.fun.JavaScriptActionProvider; import com.fr.design.javascript.JavaScriptActionPane; +import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.JTemplate; import com.fr.js.JavaScript; import com.fr.stable.fun.impl.AbstractProvider; import com.fr.stable.fun.mark.API; @@ -26,11 +28,17 @@ public abstract class AbstractJavaScriptActionProvider extends AbstractProvider public FurtherBasicBeanPane getJavaScriptActionPane(JavaScriptActionPane pane) { return getJavaScriptActionPane(); } - - /** - * 判断是否是支持的类型(cpt,frm),默认是 - * @return - */ + + @Override + public boolean accept(JTemplate template) { + // 这里只是为了兼容原来的isSupportType方法 + boolean result = isSupportType(); + if (result) { + return true; + } + return true; + } + @Override public boolean isSupportType(){ return true; From b240e98948033c8a089bd11ebc384675f1ff6915 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 2 Jan 2019 18:05:50 +0800 Subject: [PATCH 26/73] =?UTF-8?q?REPORT-14022=20=E3=80=90=E9=9A=BE?= =?UTF-8?q?=E8=BF=98=E5=8E=9F=E3=80=91=E6=9C=80=E6=96=B0=E7=9A=8429?= =?UTF-8?q?=E5=8F=B7release=EF=BC=8C=E8=8E=AB=E5=90=8D=E5=85=B6=E5=A6=99?= =?UTF-8?q?=E7=9A=84=E5=8D=A1=E4=BD=8F=E5=BE=88=E4=B9=85=EF=BC=8C=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=99=BE=E5=88=86=E7=99=BE=E7=9A=84cpu=E5=8D=A0?= =?UTF-8?q?=E7=94=A8=20=E5=90=88=E5=B9=B6=E5=8F=91=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E5=8E=BB=E9=87=8D=EF=BC=9B=E6=AF=8F=E6=AC=A1query=20200?= =?UTF-8?q?=E6=9D=A1=EF=BC=8C=E6=94=BE=E5=85=A5=E5=86=85=E5=AD=98=EF=BC=8C?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=88=90=E5=8A=9F=E5=86=8D=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E8=AF=B7=E6=B1=82=20=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E6=9B=B4=E6=94=B9=E5=88=B010.0=20master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/InformationCollector.java | 186 ++++++++++-------- 1 file changed, 104 insertions(+), 82 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 61b583c61..49ad7d6a3 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 @@ -89,11 +89,15 @@ public class InformationCollector implements XMLReadable, XMLWriter { private static final String ATTR_TEXT = "text"; private static final String ATTR_SOURCE = "source"; private static final String ATTR_TIME = "time"; + private static final String ATTR_TIMES = "times"; private static final String ATTR_TITLE = "title"; private static final String ATTR_USER_NAME = "username"; private static final String ATTR_UUID = "uuid"; + private static final String ATTR_ITEMS = "items"; private static final String ATTR_FUNCTION_ARRAY = "functionArray"; private static final int MAX_EACH_REQUEST_RECORD_COUNT = 200; + private static final int PAGE_SIZE = 200; + private long totalCount = -1; private static InformationCollector collector; @@ -214,26 +218,14 @@ public class InformationCollector implements XMLReadable, XMLWriter { if (currentTime - lastTime <= DELTA) { return; } - JSONArray content = getFunctionsContent(currentTime, lastTime); - boolean success = false; FineLoggerFactory.getLogger().info("Start sent function records to the cloud center..."); - String url = CloudCenter.getInstance().acquireUrlByKind(TABLE_FUNCTION_RECORD); - try { - for(int i=0;i 0){ - success = sendFunctionRecord(url, functionArray); - } - } - //服务器返回true, 说明已经获取成功, 更新最后一次发送时间 - if (success) { - this.lastTime = dateToString(); - FineLoggerFactory.getLogger().info("Function records successfully sent to the cloud center."); - } - }catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); + queryAndSendOnePageFunctionContent(currentTime, lastTime, 0); + long page = (totalCount/PAGE_SIZE) + 1; + for(int i=1; i focusPoints = MetricRegistry.getMetric().find(FocusPoint.class,condition); + //第一次查询获取总记录数 + if(page == 0){ + totalCount = focusPoints.getTotalCount(); + } + sendThisPageFunctionContent(focusPoints); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + private void sendThisPageFunctionContent(DataList focusPoints) { + String url = CloudCenter.getInstance().acquireUrlByKind(TABLE_FUNCTION_RECORD); + try { + JSONObject jsonObject = dealWithSendFunctionContent(focusPoints); + sendFunctionRecord(url, jsonObject); + } catch (JSONException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + private JSONObject dealWithSendFunctionContent(DataList focusPoints) throws JSONException { + JSONObject jsonObject = new JSONObject(); + Map map = new HashMap<>(); + if(!focusPoints.isEmpty()){ + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + String bbsUserName = MarketConfig.getInstance().getBbsUsername(); + String uuid = envManager.getUUID(); + jsonObject.put(ATTR_UUID, uuid); + jsonObject.put(ATTR_USER_NAME, bbsUserName); + for(FocusPoint focusPoint : focusPoints.getList()) { + FunctionRecord functionRecord = getOneRecord(focusPoint); + if (map.containsKey(focusPoint.getId())) { + functionRecord.setTimes(functionRecord.getTimes() + 1); + map.put(focusPoint.getId(), functionRecord); + } else { + map.put(focusPoint.getId(), functionRecord); + } + } + jsonObject.put(ATTR_ITEMS, mapToJSONArray(map)); + } + return jsonObject; + } + + private JSONArray mapToJSONArray(Map map) throws JSONException { + JSONArray jsonArray = new JSONArray(); + for(String keys : map.keySet()){ + FunctionRecord functionRecord = (FunctionRecord)map.get(keys); + JSONObject jo = new JSONObject(); + jo.put(ATTR_ID, functionRecord.getId()); + jo.put(ATTR_TEXT, functionRecord.getText()); + jo.put(ATTR_SOURCE, functionRecord.getSource()); + jo.put(ATTR_TIME, functionRecord.getTime()); + jo.put(ATTR_TITLE, functionRecord.getTitle()); + jo.put(ATTR_TIMES, functionRecord.getTimes()); + jsonArray.put(jo); + } + return jsonArray; + } + + private void sendFunctionRecord(String url, JSONObject record) { boolean success = false; try { HashMap para = new HashMap<>(); @@ -260,12 +320,28 @@ public class InformationCollector implements XMLReadable, XMLWriter { para.put("content", record); String res = HttpToolbox.post(url, para); success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + if (success) { + this.lastTime = dateToString(); + } else { + FineLoggerFactory.getLogger().error("Error occured when sent function records to the cloud center."); + } } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - return success; } + private FunctionRecord getOneRecord(FocusPoint focusPoint) { + FunctionRecord functionRecord = new FunctionRecord(); + functionRecord.setId(focusPoint.getId() == null?StringUtils.EMPTY : focusPoint.getId()); + functionRecord.setText(focusPoint.getText() == null?StringUtils.EMPTY : focusPoint.getText()); + functionRecord.setSource(focusPoint.getSource()); + functionRecord.setTime(focusPoint.getTime().getTime()); + functionRecord.setTitle(focusPoint.getTitle() == null?StringUtils.EMPTY : focusPoint.getTitle()); + functionRecord.setUsername(MarketConfig.getInstance().getBbsUsername() == null?StringUtils.EMPTY : MarketConfig.getInstance().getBbsUsername()); + functionRecord.setUuid(DesignerEnvManager.getEnvManager().getUUID() == null?StringUtils.EMPTY : DesignerEnvManager.getEnvManager().getUUID()); + return functionRecord; + } + /** * 收集开始使用时间,发送信息 */ @@ -426,69 +502,6 @@ public class InformationCollector implements XMLReadable, XMLWriter { }); } - public JSONArray getFunctionsContent(long current, long last) { - //记录当前条数,达到200条合并成一个请求 - int count = 0; - JSONArray functionArray = new JSONArray(); - QueryCondition condition = QueryFactory.create() - .addRestriction(RestrictionFactory.lte(COLUMN_TIME, current)) - .addRestriction(RestrictionFactory.gte(COLUMN_TIME, last)); - try { - DataList focusPoints = MetricRegistry.getMetric().find(FocusPoint.class,condition); - TreeSet focusPointsList = new TreeSet<>(); - if(!focusPoints.isEmpty()){ - for(int i=0;i< focusPoints.getList().size();i++){ - FocusPoint focusPoint = focusPoints.getList().get(i); - if(focusPoint != null){ - if((++count <= MAX_EACH_REQUEST_RECORD_COUNT)){ - focusPointsList.add(getOneRecord(focusPoint)); - } else { - count = 0; - functionArray.put(setToJSONArray(focusPointsList)); - focusPointsList.add(getOneRecord(focusPoint)); - } - if(i == (focusPoints.getList().size() -1)){ - functionArray.put(setToJSONArray(focusPointsList)); - } - } - } - } - - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - return functionArray; - } - - private FunctionRecord getOneRecord(FocusPoint focusPoint) { - FunctionRecord functionRecord = new FunctionRecord(); - functionRecord.setId(focusPoint.getId() == null?StringUtils.EMPTY : focusPoint.getId()); - functionRecord.setText(focusPoint.getText() == null?StringUtils.EMPTY : focusPoint.getText()); - functionRecord.setSource(focusPoint.getSource()); - functionRecord.setTime(focusPoint.getTime().getTime()); - functionRecord.setTitle(focusPoint.getTitle() == null?StringUtils.EMPTY : focusPoint.getTitle()); - functionRecord.setUsername(MarketConfig.getInstance().getBbsUsername() == null?StringUtils.EMPTY : MarketConfig.getInstance().getBbsUsername()); - functionRecord.setUuid(DesignerEnvManager.getEnvManager().getUUID() == null?StringUtils.EMPTY : DesignerEnvManager.getEnvManager().getUUID()); - return functionRecord; - } - - private JSONArray setToJSONArray(Set set) throws JSONException { - JSONArray jsonArray = new JSONArray(); - for(Iterator iter = set.iterator(); iter.hasNext(); ) { - FunctionRecord functionRecord = (FunctionRecord)iter.next(); - com.fr.json.JSONObject record = new com.fr.json.JSONObject(); - record.put(ATTR_ID, functionRecord.getId()); - record.put(ATTR_TEXT, functionRecord.getText()); - record.put(ATTR_SOURCE, functionRecord.getSource()); - record.put(ATTR_TIME, functionRecord.getTime()); - record.put(ATTR_TITLE, functionRecord.getTitle()); - record.put(ATTR_USER_NAME, functionRecord.getUsername()); - record.put(ATTR_UUID, functionRecord.getUuid()); - jsonArray.put(record); - } - return jsonArray; - } - private class StartStopTime implements XMLReadable, XMLWriter { private String startDate; @@ -533,6 +546,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { private String text; private int source; private long time; + private int times = 1; private String title; private String username; private String uuid; @@ -548,6 +562,14 @@ public class InformationCollector implements XMLReadable, XMLWriter { this.id = id; } + public int getTimes() { + return times; + } + + public void setTimes(int times) { + this.times = times; + } + public String getText() { return text; } From 1942bbc2cae00f31b9004c5d22285582e0840b37 Mon Sep 17 00:00:00 2001 From: "alex.sung" Date: Wed, 2 Jan 2019 18:34:54 +0800 Subject: [PATCH 27/73] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=AC=A1=E6=95=B0bugfi?= =?UTF-8?q?x?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/InformationCollector.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 49ad7d6a3..b71144774 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 @@ -285,7 +285,8 @@ public class InformationCollector implements XMLReadable, XMLWriter { for(FocusPoint focusPoint : focusPoints.getList()) { FunctionRecord functionRecord = getOneRecord(focusPoint); if (map.containsKey(focusPoint.getId())) { - functionRecord.setTimes(functionRecord.getTimes() + 1); + int times = ((FunctionRecord)map.get(focusPoint.getId())).getTimes() + 1; + functionRecord.setTimes(times); map.put(focusPoint.getId(), functionRecord); } else { map.put(focusPoint.getId(), functionRecord); From 525837842ca9a5419289eeb9be00a9f3dd8119c7 Mon Sep 17 00:00:00 2001 From: XiaXiang Date: Wed, 2 Jan 2019 19:03:53 +0800 Subject: [PATCH 28/73] =?UTF-8?q?REPORT-14020=20=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E6=89=93=E5=BC=80=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=20=E8=B0=83=E8=AF=95=E7=9A=84=E4=BB=A3=E7=A0=81=E4=B8=8A?= =?UTF-8?q?=E6=AC=A1=E8=AF=AF=E4=BC=A0=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/utils/DesignUtils.java | 12 ++++++------ .../fr/start/server/FineEmbedServerActivator.java | 1 + .../main/java/com/fr/start/fx/PrismImageLoader2.java | 11 ++++++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java index 77173cebb..240176eef 100644 --- a/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/DesignUtils.java @@ -65,12 +65,12 @@ public class DesignUtils { * @return 启动了返回true */ public static boolean isStarted() { -// try { -// new Socket("localhost", port); -// return true; -// } catch (Exception exp) { -// -// } + try { + new Socket("localhost", port); + return true; + } catch (Exception exp) { + + } return false; } 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 2d08b286d..eda1fb77e 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 @@ -68,6 +68,7 @@ public class FineEmbedServerActivator extends Activator { //覆盖tomcat的WebAppClassLoader context.setLoader(new FRTomcatLoader()); + //直接指定initializer,tomcat就不用再扫描一遍了 SpringServletContainerInitializer initializer = new SpringServletContainerInitializer(); Set> classes = new HashSet>(); diff --git a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java index 99066e964..c742a3851 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java +++ b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java @@ -67,11 +67,21 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return height; } + @Override + public boolean getError() { + return false; + } + @Override public int getFrameCount() { return gifCount; } + @Override + public PlatformImage[] getFrames() { + return new PlatformImage[0]; + } + @Override public PlatformImage getFrame(int index) { while (images[index] == null) { @@ -112,7 +122,6 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return 0; } - @Override public Exception getException() { return exception; } From 0e214d0eb894d399656308e878bf6804a481c57b Mon Sep 17 00:00:00 2001 From: XiaXiang Date: Wed, 2 Jan 2019 19:07:45 +0800 Subject: [PATCH 29/73] rt --- .../main/java/com/fr/start/fx/PrismImageLoader2.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java index c742a3851..99066e964 100644 --- a/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java +++ b/designer-realize/src/main/java/com/fr/start/fx/PrismImageLoader2.java @@ -67,21 +67,11 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return height; } - @Override - public boolean getError() { - return false; - } - @Override public int getFrameCount() { return gifCount; } - @Override - public PlatformImage[] getFrames() { - return new PlatformImage[0]; - } - @Override public PlatformImage getFrame(int index) { while (images[index] == null) { @@ -122,6 +112,7 @@ class PrismImageLoader2 implements com.sun.javafx.tk.ImageLoader { return 0; } + @Override public Exception getException() { return exception; } From 51687dd770a0aa030471461a4a4937d7d2c16eb5 Mon Sep 17 00:00:00 2001 From: ju Date: Fri, 17 May 2019 20:07:17 +0800 Subject: [PATCH 30/73] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20?= =?UTF-8?q?=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/start/module/DesignerActivator.java | 144 ++++++++---------- 1 file changed, 64 insertions(+), 80 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 f48ac546f..87e8142f2 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 @@ -52,7 +52,6 @@ import com.fr.design.mainframe.form.FormReportComponentComposite; import com.fr.design.mainframe.loghandler.DesignerLogAppender; import com.fr.design.mainframe.loghandler.LogMessageBar; import com.fr.design.mainframe.socketio.DesignerSocketIO; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.FormParameterReader; import com.fr.design.parameter.ParameterPropertyPane; @@ -98,7 +97,6 @@ import com.fr.stable.script.ValueConverter; import com.fr.stable.xml.ObjectTokenizer; import com.fr.stable.xml.ObjectXMLWriterFinder; import com.fr.start.BBSGuestPaneProvider; -import com.fr.start.preload.ImagePreLoader; import com.fr.xml.ReportXMLUtils; import java.awt.Image; @@ -115,9 +113,9 @@ import java.util.concurrent.Executors; * 之后慢慢将DesignerModule拆成Activator */ public class DesignerActivator extends Activator { - + private LogHandler logHandler = null; - + @Override public void start() { List markers = rightCollectMutable(InterMutableKey.Path); @@ -132,11 +130,11 @@ public class DesignerActivator extends Activator { DesignerSocketIO.update(); UserInfoPane.getInstance().updateBBSUserInfo(); } - + private void loadLogAppender() { logHandler = new LogHandler() { final DesignerLogAppender logAppender = new DesignerLogAppender(); - + @Override public DesignerLogAppender getHandler() { return logAppender; @@ -144,55 +142,41 @@ public class DesignerActivator extends Activator { }; FineLoggerFactory.getLogger().addLogAppender(logHandler); } - + private void unloadLogAppender() { if (logHandler != null) { FineLoggerFactory.getLogger().removeLogAppender(logHandler); } } - + private void designerModuleStart() { - + StableFactory.registerMarkedClass(ExtraDesignClassManagerProvider.XML_TAG, ExtraDesignClassManager.class); ActionFactory.registerCellInsertActionClass(actionsForInsertCellElement()); ActionFactory.registerFloatInsertActionClass(actionsForInsertFloatElement()); DesignModuleFactory.registerCreators4Hyperlink(hyperlinkTypes()); - + justStartModules4Designer(); - + CalculatorProviderContext.setValueConverter(valueConverter()); GeneralXMLTools.Object_Tokenizer = startXMLReadObjectTokenizer(); GeneralXMLTools.Object_XML_Writer_Finder = startObjectXMLWriterFinder(); addAdapterForPlate(); - + designerRegister(); - + InformationCollector.getInstance().collectStartTime(); } - + private static void preLoadPane() { ExecutorService service = Executors.newCachedThreadPool(); - service.submit(new Runnable() { - @Override - public void run() { - new ImagePreLoader(); - } - }); - - service.submit(new Runnable() { - @Override - public void run() { - TemplateInfoCollector.getInstance(); - } - }); - service.submit(new Runnable() { @Override public void run() { LogMessageBar.getInstance(); } }); - + service.submit(new Runnable() { @Override public void run() { @@ -217,7 +201,7 @@ public class DesignerActivator extends Activator { DesignerFrameFileDealerPane.getInstance();//这边会涉及到TemplateTreePane } }); - + service.submit(new Runnable() { @Override public void run() { @@ -226,26 +210,26 @@ public class DesignerActivator extends Activator { }); service.shutdown(); } - + private static Class[] actionsForInsertCellElement() { List> classes = new ArrayList<>(); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { classes.add(provider.actionForInsertCellElement()); } - + return ArrayUtils.addAll(new Class[]{ - DSColumnCellAction.class, - GeneralCellAction.class, - RichTextCellAction.class, - FormulaCellAction.class, - ChartCellAction.class, - ImageCellAction.class, - BiasCellAction.class, - SubReportCellAction.class + DSColumnCellAction.class, + GeneralCellAction.class, + RichTextCellAction.class, + FormulaCellAction.class, + ChartCellAction.class, + ImageCellAction.class, + BiasCellAction.class, + SubReportCellAction.class }, classes.toArray(new Class[classes.size()])); } - + private static Class[] actionsForInsertFloatElement() { List> classes = new ArrayList<>(); Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); @@ -253,28 +237,28 @@ public class DesignerActivator extends Activator { classes.add(provider.actionForInsertFloatElement()); } return ArrayUtils.addAll(new Class[]{ - TextBoxFloatAction.class, - FormulaFloatAction.class, - ChartFloatAction.class, - ImageFloatAction.class + TextBoxFloatAction.class, + FormulaFloatAction.class, + ChartFloatAction.class, + ImageFloatAction.class }, classes.toArray(new Class[classes.size()])); } - + 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("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) }; } - - + + private static void justStartModules4Designer() { formDesignerRegister(); } - + /** * CellElementValueConverter用来处理设计器格子里的值,将公式/数组/其他元素转换成对应的值。 * @@ -283,7 +267,7 @@ public class DesignerActivator extends Activator { private static ValueConverter valueConverter() { return new CellElementValueConverter(); } - + /* * 针对不同的对象,在读取Object对象的xml的时候需要使用不同的对象生成器 * @return 返回对象生成器 @@ -291,7 +275,7 @@ public class DesignerActivator extends Activator { private static ObjectTokenizer startXMLReadObjectTokenizer() { return new ReportXMLUtils.ReportObjectTokenizer(); } - + /** * 针对不同的对象,在写对象的XML时需要使用不同的XML生成器 * @@ -300,51 +284,51 @@ public class DesignerActivator extends Activator { private static ObjectXMLWriterFinder startObjectXMLWriterFinder() { return new ReportXMLUtils.ReportObjectXMLWriterFinder(); } - - + + //wei:fs的模块中可能有需要设计器界面做设置的地方,在这边添加 private static void addAdapterForPlate() { - + ProcessTransitionAdapter.setProcessTransitionAdapter(new ProcessTransitionAdapter() { - + @Override protected String[] getTransitionNamesByBook(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getTransitionNamesByBook(book); } - + @Override protected String[] getParaNames(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getParaNames(book); } - + @Override protected ParameterProvider[] getParas(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getParas(book); } - + @Override protected MultiFieldParameter[] getAllMultiFieldParas(String book) { return StableFactory.getMarkedObject(ProcessOperator.MARK_STRING, ProcessOperator.class, ProcessOperator.EMPTY).getAllMultiFieldParas(book); } }); } - + private static void designerRegister() { registerCellEditor(); registerFloatEditor(); registerData4Form(); registerOtherPane(); } - + private static void registerOtherPane() { StableFactory.registerMarkedClass(BBSGuestPaneProvider.XML_TAG, BBSGuestPane.class); } - + /** * kunsnat:注册单元格选中Editor */ private static void registerCellEditor() { - + ActionFactory.registerCellEditor(String.class, new CellStringQuickEditor()); ActionFactory.registerCellEditor(Number.class, new CellStringQuickEditor()); ActionFactory.registerCellEditor(BaseFormula.class, new CellFormulaQuickEditor()); @@ -357,7 +341,7 @@ public class DesignerActivator extends Activator { ActionFactory.registerCellEditor(CellImagePainter.class, new CellImageQuickEditor()); //todo 图表编辑器populate没能实现刷新面板显示 ActionFactory.registerCellEditorClass(ChartCollection.class, BasicChartQuickEditor.class); - + Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { try { @@ -367,13 +351,13 @@ public class DesignerActivator extends Activator { } } } - - + + /** * kunnat: 注册悬浮选中Editor */ private static void registerFloatEditor() { - + ActionFactory.registerFloatEditor(String.class, new FloatStringQuickEditor()); ActionFactory.registerFloatEditor(Formula.class, new FloatStringQuickEditor()); ActionFactory.registerFloatEditor(Image.class, new FloatImageQuickEditor()); @@ -382,19 +366,19 @@ public class DesignerActivator extends Activator { //todo 图表编辑器populate没能实现刷新面板显示 ActionFactory.registerFloatEditorClass(ChartCollection.class, FloatChartQuickEditor.class); } - - + + private static void registerData4Form() { StableFactory.registerMarkedClass(FormECDesignerProvider.XML_TAG, FormElementCaseDesigner.class); StableFactory.registerMarkedClass(FormECCompositeProvider.XML_TAG, FormReportComponentComposite.class); DesignModuleFactory.registerParameterReader(new WorkBookParameterReader()); } - - + + private static void formDesignerRegister() { - + StableFactory.registerMarkedObject(DesignToolbarProvider.STRING_MARKED, WidgetToolBarPane.getInstance()); - + DesignModuleFactory.registerNewFormActionClass(NewFormAction.class); DesignModuleFactory.registerFormParaDesignerClass(FormParaDesigner.class); DesignModuleFactory.registerParaPropertyPaneClass(ParameterPropertyPane.class); @@ -402,12 +386,12 @@ public class DesignerActivator extends Activator { DesignModuleFactory.registerWidgetPropertyPaneClass(WidgetPropertyPane.class); DesignModuleFactory.registerButtonDetailPaneClass(FormSubmitButtonDetailPane.class); DesignModuleFactory.registerParameterReader(new FormParameterReader()); - + StableFactory.registerMarkedClass(BaseJForm.XML_TAG, JForm.class); - + StableFactory.registerMarkedObject(ElementCaseThumbnailProcessor.MARK_STRING, new ElementCaseThumbnail()); } - + @Override public void stop() { unloadLogAppender(); From 512cd4b120d75829e8d3fbf008d7deb63bd1344f Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Tue, 26 May 2020 23:30:32 +0800 Subject: [PATCH 31/73] =?UTF-8?q?MOBILE-27220=20=E5=9C=A8=E8=A1=A8?= =?UTF-8?q?=E5=8D=95=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=B1=9E=E6=80=A7=E5=8A=A0?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E2=80=9C=E9=BB=98=E8=AE=A4=E2=80=9D=E5=92=8C?= =?UTF-8?q?=E2=80=9C=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=B7=E5=BC=8F=E2=80=9D?= =?UTF-8?q?=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/ui/MobileStyleDefinePane.java | 39 +++++++++++++++---- .../mobile/ui/MobileStyleFontConfigPane.java | 21 +++++----- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index 5f11e46db..3ae82f926 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -5,6 +5,7 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.gui.icombobox.LineComboBox; +import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.i18n.Toolkit; @@ -21,14 +22,14 @@ import com.fr.stable.Constants; import javax.swing.JPanel; import javax.swing.border.TitledBorder; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; public class MobileStyleDefinePane extends BasicBeanPane { @@ -42,6 +43,8 @@ public class MobileStyleDefinePane extends BasicBeanPane { private Widget widget; private MobileStyleCustomDefinePane customBeanPane; private Class mobileStyleClazz; + private UIComboBox customCombo; + private JPanel settingPane; private ColorSelectBox colorSelectBox; private Color titleColor = new Color(47, 142, 241); private JPanel commomPane; @@ -62,6 +65,8 @@ public class MobileStyleDefinePane extends BasicBeanPane { @Override public void populateBean(MobileStyle ob) { this.customBeanPane.populateBean(ob); + + customCombo.setSelectedIndex(ob.isCommonCustom() ? 1 : 0); if(ob.getBackground() != null) { colorSelectBox.setSelectObject(((ColorBackground)ob.getBackground()).getColor()); } @@ -83,6 +88,7 @@ public class MobileStyleDefinePane extends BasicBeanPane { MobileStyle mobileStyle = Reflect.on(mobileStyleClazz).create().get(); this.widget.setMobileStyle(mobileStyle); this.customBeanPane.updateBean(); + mobileStyle.setCommonCustom(customCombo.getSelectedIndex() == 1); mobileStyle.setBackground(ColorBackground.getInstance(colorSelectBox.getSelectObject())); mobileStyle.setBorderType(borderType.getSelectedLineStyle()); mobileStyle.setBorderColor(borderColor.getSelectObject()); @@ -126,6 +132,22 @@ public class MobileStyleDefinePane extends BasicBeanPane { commomPane.setBorder(titledBorder); this.add(commomPane, BorderLayout.NORTH); + customCombo = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Mobile_Default"), Toolkit.i18nText("FIne-Design_Mobile_Custom")}); + customCombo.setSelectedIndex(0); + customCombo.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 15, 20)); + customCombo.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + boolean custom = customCombo.getSelectedIndex() == 1; + settingPane.setVisible(custom); + } + }); + commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Attribute_Settings")), customCombo)); + + settingPane = FRGUIPaneFactory.createVerticalFlowLayout_Pane(true, FlowLayout.LEADING, 0, 10); + settingPane.setVisible(false); + commomPane.add(settingPane); + createBackgroundPane(); createBorderPane(); createIconSettingPane(); @@ -136,7 +158,7 @@ public class MobileStyleDefinePane extends BasicBeanPane { colorSelectBox = new ColorSelectBox(NORMAL_COMBO_WIDTH); JPanel backgroundPane = createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Background")), colorSelectBox); - commomPane.add(backgroundPane); + settingPane.add(backgroundPane); } private void createBorderPane() { @@ -146,19 +168,20 @@ public class MobileStyleDefinePane extends BasicBeanPane { borderColor = new NewColorSelectBox(NORMAL_COMBO_WIDTH); borderRadius = new UISpinner(0, Integer.MAX_VALUE, 1, 2); borderRadius.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 20, 20)); - commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderType")), borderType)); - commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderColor")), borderColor)); - commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderRadius")), borderRadius)); + settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderType")), borderType)); + settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderColor")), borderColor)); + settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_BorderRadius")), borderRadius)); } private void createIconSettingPane() { iconColor = new NewColorSelectBox(NORMAL_COMBO_WIDTH); - commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Icon_Color")), iconColor)); + iconColor.setSelectObject(new Color(31,173,229)); + settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Icon_Color")), iconColor)); } private void createFontPane() { fontConfigPane = new MobileStyleFontConfigPane(); - commomPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Font")), fontConfigPane)); + settingPane.add(createLeftRightComponentsPane(createConfigLabel(Toolkit.i18nText("Fine-Design_Mobile_Widget_Font")), fontConfigPane)); } private void createCustomPane() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java index f765e2584..3c756db09 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleFontConfigPane.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe.mobile.ui; import com.fr.base.BaseUtils; import com.fr.design.constants.LayoutConstants; +import com.fr.design.gui.ibutton.UIColorButton; import com.fr.design.gui.ibutton.UIToggleButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxRenderer; @@ -16,7 +17,6 @@ import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import java.awt.BorderLayout; -import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; @@ -31,7 +31,6 @@ public class MobileStyleFontConfigPane extends JPanel { public static Vector getFontSizes() { Vector FONT_SIZES = new Vector(); - FONT_SIZES.add(FONT_NONE); for (int i = MIN_FONT_SIZE; i <= MAX_FONT_SIZE; i++) { FONT_SIZES.add(i); } @@ -39,7 +38,7 @@ public class MobileStyleFontConfigPane extends JPanel { } private UIComboBox fontSizeComboBox; - private UIToggleButton underline; + private UIColorButton color; private UIToggleButton italic; private UIToggleButton bold; @@ -51,10 +50,10 @@ public class MobileStyleFontConfigPane extends JPanel { fontSizeComboBox = new UIComboBox(); fontSizeComboBox.setModel(new DefaultComboBoxModel(getFontSizes())); - fontSizeComboBox.setSelectedItem(0); + fontSizeComboBox.setSelectedItem(16); fontSizeComboBox.setPreferredSize(new Dimension(60, 20)); fontSizeComboBox.setRenderer(new LineCellRenderer()); - underline = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/underline.png")); + color = new UIColorButton(); italic = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/italic.png")); bold = new UIToggleButton(BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/bold.png")); @@ -62,7 +61,7 @@ public class MobileStyleFontConfigPane extends JPanel { this.setButtonsSize(BUTTON_SIZE); Component[] components_font = new Component[]{ - fontSizeComboBox, underline, italic, bold + fontSizeComboBox, color, italic, bold }; JPanel buttonPane = new JPanel(new BorderLayout()); @@ -73,13 +72,13 @@ public class MobileStyleFontConfigPane extends JPanel { } private void setButtonsTips() { - underline.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Underline")); + color.setToolTipText(Toolkit.i18nText("Fine-Design_Report_Foreground")); italic.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Italic")); bold.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Bold")); } private void setButtonsSize(Dimension size) { - underline.setPreferredSize(size); + color.setPreferredSize(size); italic.setPreferredSize(size); bold.setPreferredSize(size); } @@ -87,9 +86,9 @@ public class MobileStyleFontConfigPane extends JPanel { public void populateBean(FRFont frFont) { fontSizeComboBox.setSelectedItem(frFont.getSize()); + color.setColor(frFont.getForeground()); bold.setSelected(frFont.isBold()); italic.setSelected(frFont.isItalic()); - underline.setSelected(frFont.getUnderline() != Constants.LINE_NONE); } public FRFont updateBean() { @@ -100,8 +99,8 @@ public class MobileStyleFontConfigPane extends JPanel { FRFont.DEFAULT_FONTNAME, style, Float.parseFloat(fontSizeComboBox.getSelectedItem().toString()), - Color.BLACK, - underline.isSelected() ? Constants.LINE_THIN : Constants.LINE_NONE + color.getColor(), + Constants.LINE_NONE ); } From 66fd4cc702d7ee72beb0b0d2e909d7b1237924f8 Mon Sep 17 00:00:00 2001 From: kuangshuai Date: Tue, 26 May 2020 23:38:11 +0800 Subject: [PATCH 32/73] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java index 3ae82f926..9d08a4d4e 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/mobile/ui/MobileStyleDefinePane.java @@ -132,7 +132,7 @@ public class MobileStyleDefinePane extends BasicBeanPane { commomPane.setBorder(titledBorder); this.add(commomPane, BorderLayout.NORTH); - customCombo = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Mobile_Default"), Toolkit.i18nText("FIne-Design_Mobile_Custom")}); + customCombo = new UIComboBox(new String[]{Toolkit.i18nText("Fine-Design_Mobile_Default"), Toolkit.i18nText("Fine-Design_Mobile_Custom")}); customCombo.setSelectedIndex(0); customCombo.setPreferredSize(new Dimension(NORMAL_COMBO_WIDTH + 15, 20)); customCombo.addItemListener(new ItemListener() { From 9018c51a45ac44d0d2fb795875f205d9dd400a11 Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 3 Jun 2020 22:30:42 +0800 Subject: [PATCH 33/73] =?UTF-8?q?REPORT-32939=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=AD=A3=E5=B8=B82g=E7=9B=AE=E5=89=8D=E7=BB=8F?= =?UTF-8?q?=E5=B8=B8=E5=87=BA=E7=8E=B0=E6=8E=92=E9=98=9F=E7=8E=B0=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 36 +++++++++++++++++++ .../fr/design/mainframe/DesignerFrame.java | 16 ++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) 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 cb68bb6e4..437569348 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 @@ -42,6 +42,14 @@ public class HistoryTemplateListCache implements CallbackEvent { private List> historyList; private JTemplate editingTemplate; + /** + * 当设计器打开的模板数大于模板缓存对象个数时,会产生JVirtualTemplate(个数=打开的总模板数 - 缓存模板数) + * 每次点击切换模板时,当切换到JVirtualTemplate,会创建真实的JTemplate,但是该JTemplate创建后不会释放掉,需要调用whenClose主动释放 + * 该变量对JVirtualTemplate创建真实的JTemplate管理 + */ + private JTemplate currentVirtualReplaceTemplate; + + public static HistoryTemplateListCache getInstance() { return Holder.INSTANCE; } @@ -112,6 +120,14 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate) */ public void setCurrentEditingTemplate(JTemplate jt) { + + // 模板之间切换 如果存在上次JVirtualTemplate创建的真实模板 需要在此关闭,并释放掉 + boolean canReleaseVirtualReplaceTemplate = this.currentVirtualReplaceTemplate != null && jt != null + && !ComparatorUtils.equals(this.currentVirtualReplaceTemplate.getEditingFILE(), jt.getEditingFILE()); + if (canReleaseVirtualReplaceTemplate) { + HistoryTemplateListCache.getInstance().releaseVirtualReplaceTemplate(); + } + this.editingTemplate = jt; //如果当前历史面板中没有 @@ -423,4 +439,24 @@ public class HistoryTemplateListCache implements CallbackEvent { } } + + public void setCurrentVirtualReplaceTemplate(JTemplate currentVirtualReplaceTemplate) { + // 保证先释放 + releaseVirtualReplaceTemplate(); + this.currentVirtualReplaceTemplate = currentVirtualReplaceTemplate; + } + + public JTemplate getCurrentVirtualReplaceTemplate() { + return currentVirtualReplaceTemplate; + } + + /** + * 释放JVirtualTemplate创建的真实模板JTemplate + */ + private void releaseVirtualReplaceTemplate() { + if (this.currentVirtualReplaceTemplate != null) { + this.currentVirtualReplaceTemplate.whenClose(); + this.currentVirtualReplaceTemplate = null; + } + } } 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 2cf8d8c35..e5b8e8b7e 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 @@ -1101,11 +1101,19 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta */ private void openFile(FILE tplFile) { + boolean virtualTemplate = false; if (tplFile != null) { int index = HistoryTemplateListCache.getInstance().contains(tplFile); if (index != -1) { JTemplate jt = HistoryTemplateListCache.getInstance().getHistoryList().get(index); - if (!(jt instanceof JVirtualTemplate)) { + if (jt instanceof JVirtualTemplate) { + JTemplate currentVirtualReplaceTemplate = HistoryTemplateListCache.getInstance().getCurrentVirtualReplaceTemplate(); + if (currentVirtualReplaceTemplate != null && ComparatorUtils.equals(currentVirtualReplaceTemplate.getEditingFILE(), jt.getEditingFILE())) { + currentVirtualReplaceTemplate.activeOldJTemplate(); + return; + } + virtualTemplate = true; + } else { jt.activeOldJTemplate(); return; } @@ -1116,6 +1124,12 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null) { return; } + + // 将JVirtualTemplate创建的真实模板管理起来 + if (virtualTemplate) { + HistoryTemplateListCache.getInstance().setCurrentVirtualReplaceTemplate(jt); + } + // 新的form不往前兼容 if (inValidDesigner(jt)) { this.addAndActivateJTemplate(); From 838183e165e8c864ef7a66c30cdee5cf635d6ac2 Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 3 Jun 2020 22:37:06 +0800 Subject: [PATCH 34/73] REPORT-32939 add comment --- .../src/main/java/com/fr/design/mainframe/DesignerFrame.java | 1 + 1 file changed, 1 insertion(+) 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 e5b8e8b7e..2cfd36687 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 @@ -1109,6 +1109,7 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt instanceof JVirtualTemplate) { JTemplate currentVirtualReplaceTemplate = HistoryTemplateListCache.getInstance().getCurrentVirtualReplaceTemplate(); if (currentVirtualReplaceTemplate != null && ComparatorUtils.equals(currentVirtualReplaceTemplate.getEditingFILE(), jt.getEditingFILE())) { + // 防止在打开了模板的情况下 去双击目录树对应的模板重复创建JTemplate currentVirtualReplaceTemplate.activeOldJTemplate(); return; } From 0b3aac756a2d086bd96c00a7d21d7fc337cffa48 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 4 Jun 2020 11:26:59 +0800 Subject: [PATCH 35/73] =?UTF-8?q?REPORT-33018=20=20fix=20=E6=B2=BF?= =?UTF-8?q?=E7=94=A8=E4=B9=8B=E5=89=8D=E7=9A=84=E6=96=B9=E6=A1=88=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20=E9=98=B2=E6=AD=A2=E4=BA=A7=E7=94=9F=E5=81=87?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/file/HistoryTemplateListCache.java | 37 ------------------- .../fr/design/mainframe/DesignerFrame.java | 19 ++++------ 2 files changed, 7 insertions(+), 49 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 437569348..466e919b7 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 @@ -42,14 +42,6 @@ public class HistoryTemplateListCache implements CallbackEvent { private List> historyList; private JTemplate editingTemplate; - /** - * 当设计器打开的模板数大于模板缓存对象个数时,会产生JVirtualTemplate(个数=打开的总模板数 - 缓存模板数) - * 每次点击切换模板时,当切换到JVirtualTemplate,会创建真实的JTemplate,但是该JTemplate创建后不会释放掉,需要调用whenClose主动释放 - * 该变量对JVirtualTemplate创建真实的JTemplate管理 - */ - private JTemplate currentVirtualReplaceTemplate; - - public static HistoryTemplateListCache getInstance() { return Holder.INSTANCE; } @@ -120,14 +112,6 @@ public class HistoryTemplateListCache implements CallbackEvent { * @see DesignerFrameFileDealerPane#setCurrentEditingTemplate(JTemplate) */ public void setCurrentEditingTemplate(JTemplate jt) { - - // 模板之间切换 如果存在上次JVirtualTemplate创建的真实模板 需要在此关闭,并释放掉 - boolean canReleaseVirtualReplaceTemplate = this.currentVirtualReplaceTemplate != null && jt != null - && !ComparatorUtils.equals(this.currentVirtualReplaceTemplate.getEditingFILE(), jt.getEditingFILE()); - if (canReleaseVirtualReplaceTemplate) { - HistoryTemplateListCache.getInstance().releaseVirtualReplaceTemplate(); - } - this.editingTemplate = jt; //如果当前历史面板中没有 @@ -438,25 +422,4 @@ public class HistoryTemplateListCache implements CallbackEvent { jt.refreshResource(); } } - - - public void setCurrentVirtualReplaceTemplate(JTemplate currentVirtualReplaceTemplate) { - // 保证先释放 - releaseVirtualReplaceTemplate(); - this.currentVirtualReplaceTemplate = currentVirtualReplaceTemplate; - } - - public JTemplate getCurrentVirtualReplaceTemplate() { - return currentVirtualReplaceTemplate; - } - - /** - * 释放JVirtualTemplate创建的真实模板JTemplate - */ - private void releaseVirtualReplaceTemplate() { - if (this.currentVirtualReplaceTemplate != null) { - this.currentVirtualReplaceTemplate.whenClose(); - this.currentVirtualReplaceTemplate = null; - } - } } 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 2cfd36687..e52d4333f 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 @@ -1101,19 +1101,20 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta */ private void openFile(FILE tplFile) { - boolean virtualTemplate = false; if (tplFile != null) { int index = HistoryTemplateListCache.getInstance().contains(tplFile); if (index != -1) { JTemplate jt = HistoryTemplateListCache.getInstance().getHistoryList().get(index); if (jt instanceof JVirtualTemplate) { - JTemplate currentVirtualReplaceTemplate = HistoryTemplateListCache.getInstance().getCurrentVirtualReplaceTemplate(); - if (currentVirtualReplaceTemplate != null && ComparatorUtils.equals(currentVirtualReplaceTemplate.getEditingFILE(), jt.getEditingFILE())) { - // 防止在打开了模板的情况下 去双击目录树对应的模板重复创建JTemplate - currentVirtualReplaceTemplate.activeOldJTemplate(); + // 如果是JVirtualTemplate 创建真实JTemplate + JTemplate realJTemplate = JTemplateFactory.createJTemplate(tplFile); + if (realJTemplate == null) { return; } - virtualTemplate = true; + // 由JVirtualTemplate激活真实JTemplate 本质在historyList中进行替换 + // 同时 realJTemplate被管理起来 不需要主动释放 关闭时会自动释放 + jt.activeJTemplate(index, realJTemplate); + return; } else { jt.activeOldJTemplate(); return; @@ -1125,12 +1126,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta if (jt == null) { return; } - - // 将JVirtualTemplate创建的真实模板管理起来 - if (virtualTemplate) { - HistoryTemplateListCache.getInstance().setCurrentVirtualReplaceTemplate(jt); - } - // 新的form不往前兼容 if (inValidDesigner(jt)) { this.addAndActivateJTemplate(); From d8233ad43e3f64457a6372e10ca379ae12c8e9d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Mon, 22 Jun 2020 10:01:26 +0800 Subject: [PATCH 36/73] =?UTF-8?q?CHART-13666=20=E8=87=AA=E5=8A=A8=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=8E=A8=E8=8D=90=E5=8C=B9=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/chart/AutoChartIcon.java | 2 +- .../fr/design/chart/AutoChartTypePane.java | 80 +- .../design/chart/auto/AutoChartDataModel.java | 46 + .../design/chart/auto/AutoTypeCalculate.java | 142 + .../com/fr/design/chart/auto/ColumnInfo.java | 56 + .../strategy/AbstractAutoTypeStrategy.java | 265 ++ .../chart/auto/strategy/AutoTypeStrategy.java | 22 + .../design/chart/auto/strategy/AvaType.java | 79 + .../chart/auto/strategy/imp/AvaStrategy.java | 106 + .../strategy/imp/BubbleChartStrategy.java | 76 + .../strategy/imp/SingleDimensionStrategy.java | 68 + .../strategy/imp/SingleTargetStrategy.java | 45 + .../com/fr/design/chart/auto/js/analyze.js | 66 + .../com/fr/design/chart/auto/js/ava.js | 2729 +++++++++++++++++ 14 files changed, 3777 insertions(+), 5 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java create mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java create mode 100644 designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js create mode 100644 designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java index b85e2194c..6e347d34b 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartIcon.java @@ -66,7 +66,7 @@ public class AutoChartIcon implements Icon { public void paintIcon(Component c, Graphics g, int x, int y) { BaseChartPainter painter = chartCollection.createResultChartPainterWithOutDealFormula(Calculator.createCalculator(), - WebChartIDInfo.createEmptyDesignerInfo(), getIconWidth(), getIconHeight()); + WebChartIDInfo.createAutoTypeInfo(), getIconWidth(), getIconHeight()); int resolution = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getJTemplateResolution(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java index b546a330b..a7ad368fb 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java @@ -3,27 +3,41 @@ package com.fr.design.chart; import com.fr.base.chart.chartdata.CallbackEvent; import com.fr.chart.chartattr.ChartCollection; import com.fr.chartx.attr.ChartProvider; +import com.fr.design.chart.auto.AutoTypeCalculate; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataComboBox; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; +import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombocheckbox.UIComboCheckBox; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.utils.gui.GUICoreUtils; +import com.fr.general.GeneralUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.JList; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.ListCellRenderer; +import javax.swing.SwingWorker; +import javax.swing.UIManager; +import javax.swing.plaf.SplitPaneUI; +import javax.swing.plaf.basic.BasicSplitPaneUI; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CancellationException; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; @@ -46,6 +60,9 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent private TableDataComboBox tableNameComboBox; private UIComboCheckBox dataFieldBox; + private AutoProgressBar connectionBar; + private SwingWorker worker; + public AutoChartTypePane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); initButtonGroup(); @@ -62,10 +79,15 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent chartViewList.setCellRenderer(iconCellRenderer); JScrollPane subListPane = new JScrollPane(chartViewList); + subListPane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_Recommended_Chart"))); + + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false, contentPane, subListPane); - JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, contentPane, subListPane); + SplitPaneUI ui = splitPane.getUI(); + if (ui instanceof BasicSplitPaneUI) { + ((BasicSplitPaneUI) ui).getDivider().setBorder(null); + } splitPane.setDividerLocation(60); - splitPane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type"))); this.add(splitPane); } @@ -94,7 +116,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent JPanel tableDataPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); panel.add(tableDataPane); tableDataPane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data") + ":")); - tableNameComboBox.setPreferredSize(new Dimension(96, 20)); + tableNameComboBox.setPreferredSize(new Dimension(126, 20)); tableDataPane.add(tableNameComboBox); JPanel areaNamePane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); @@ -102,6 +124,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent areaNamePane.add(new UILabel(Toolkit.i18nText("Fine-Design_Chart_Data_Field") + ":")); areaNamePane.add(dataFieldBox); panel.add(refreshButton); + panel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); return panel; } @@ -154,6 +177,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent refreshButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + refreshButton.setEnabled(false); calculateAutoChart(); } }); @@ -161,7 +185,55 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } private void calculateAutoChart() { - chartResultModel.clear(); + connectionBar = new AutoProgressBar(this, Toolkit.i18nText("Fine-Design_Chart_Generate_Recommended_Chart"), "", 0, 100) { + public void doMonitorCanceled() { + refreshButton.setEnabled(true); + worker.cancel(true); + } + }; + setWorker(); + worker.execute(); + } + + private void setWorker() { + + worker = new SwingWorker, Void>() { + protected List doInBackground() { + connectionBar.start(); + chartResultModel.clear(); + List columnList = new ArrayList<>(); + Object[] selectedValues = dataFieldBox.getSelectedValues(); + for (Object value : selectedValues) { + columnList.add(GeneralUtils.objectToString(value)); + } + List vanChartList = AutoTypeCalculate.calculateType(tableNameComboBox.getSelectedItem().getTableDataName(), columnList); + connectionBar.close(); + return vanChartList; + } + + public void done() { + try { + List vanChartList = get(); + if (vanChartList != null && !vanChartList.isEmpty()) { + for (VanChart vanChart : vanChartList) { + ChartCollection chartCollection = new ChartCollection(vanChart); + AutoChartIcon autoChartIcon = new AutoChartIcon(chartCollection); + autoChartIcon.registerCallBackEvent(AutoChartTypePane.this); + chartResultModel.addElement(autoChartIcon); + } + chartViewList.setSelectedIndex(0); + } + } catch (Exception e) { + if (!(e instanceof CancellationException)) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), + Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + } + } finally { + refreshButton.setEnabled(true); + } + } + }; } @Override diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java new file mode 100644 index 000000000..76889dcd2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java @@ -0,0 +1,46 @@ +package com.fr.design.chart.auto; + +import com.fr.data.AbstractDataModel; +import com.fr.general.data.DataModel; + +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + */ +public class AutoChartDataModel extends AbstractDataModel { + + public List columnInfoList; + + public AutoChartDataModel(List columnInfos) { + this.columnInfoList = columnInfos; + } + + @Override + public int getColumnCount() { + return columnInfoList.size(); + } + + @Override + public String getColumnName(int index) { + if (index >= columnInfoList.size()) { + return null; + } + return columnInfoList.get(index).getColumnName(); + } + + @Override + public int getRowCount() { + return columnInfoList.get(0).getValues().size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if (columnIndex == DataModel.COLUMN_NAME_NOT_FOUND || columnIndex >= columnInfoList.size()) { + return null; + } + return columnInfoList.get(columnIndex).getValues().get(rowIndex); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java new file mode 100644 index 000000000..73c23bd1c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java @@ -0,0 +1,142 @@ +package com.fr.design.chart.auto; + +import com.fr.data.TableDataSource; +import com.fr.data.TableDataSourceTailor; +import com.fr.data.impl.EmbeddedTableData; +import com.fr.data.impl.NameTableData; +import com.fr.design.chart.auto.strategy.AutoTypeStrategy; +import com.fr.design.chart.auto.strategy.imp.AvaStrategy; +import com.fr.design.chart.auto.strategy.imp.BubbleChartStrategy; +import com.fr.design.chart.auto.strategy.imp.SingleDimensionStrategy; +import com.fr.design.chart.auto.strategy.imp.SingleTargetStrategy; +import com.fr.design.data.DesignTableDataManager; +import com.fr.design.file.HistoryTemplateListCache; +import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; +import com.fr.general.data.DataModel; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-05-08 + */ +public class AutoTypeCalculate { + + public static List calculateType(String tableName, List columns) { + List columnValue = calculateField(tableName, columns); + if (columnValue.isEmpty()) { + return new ArrayList<>(); + } + + List dimensions = new ArrayList<>(); + List targets = new ArrayList<>(); + for (ColumnInfo field : columnValue) { + if (isTarget(field.getValues())) { + targets.add(field); + } else { + dimensions.add(field); + } + } + AutoTypeStrategy autoTypeStrategy = chooseStrategy(dimensions.size(), targets.size()); + return autoTypeStrategy.rankChart(tableName, dimensions, targets); + } + + private static AutoTypeStrategy chooseStrategy(int dimensionSize, int targetSize) { + if (dimensionSize == 0) { + //没有维度,并且只有一个指标,使用单指标匹配逻辑,大于1个指标,使用气泡图(散点图)匹配逻辑 + if (targetSize == 1) { + return new SingleTargetStrategy(); + } else { + return new BubbleChartStrategy(); + } + } else if (dimensionSize == 1) { + //1个维度,并且没有指标,使用单维度匹配,2~3个指标,使用气泡图(散点图)匹配逻辑,其余使用ava匹配 + if (targetSize == 0) { + return new SingleDimensionStrategy(); + } else if (targetSize == 2 || targetSize == 3) { + return new BubbleChartStrategy(); + } else { + return new AvaStrategy(); + } + } else { + //大与1个维度,并且没有指标,使用单维度匹配(循环),否则使用ava匹配 + if (targetSize == 0) { + return new SingleDimensionStrategy(); + } else { + return new AvaStrategy(); + } + } + } + + private static boolean isTarget(List values) { + for (String value : values) { + if (StringUtils.isEmpty(value)) { + continue; + } + Number number = GeneralUtils.string2Number(value); + if (number == null) { + return false; + } + } + return true; + } + + private static List calculateField(String tableName, List columns) { + NameTableData nameTableData = new NameTableData(tableName); + TableDataSource dataSource = TableDataSourceTailor.extractTableData(HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTarget()); + Calculator calculator = Calculator.createCalculator(); + calculator.setAttribute(TableDataSource.KEY, dataSource); + nameTableData.createTableData(calculator); + + EmbeddedTableData tableData; + try { + tableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, nameTableData, Integer.MAX_VALUE, false); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return new ArrayList<>(); + } + + List originalData = new ArrayList<>(); + for (String column : columns) { + List columnData = getColumnData(tableData, column); + if (columnData != null && !columnData.isEmpty()) { + originalData.add(new ColumnInfo(column, columnData)); + } + } + return originalData; + } + + private static List getColumnData(EmbeddedTableData tableData, String columnName) { + int colIndex = getColIndex(tableData, columnName); + + if (colIndex == DataModel.COLUMN_NAME_NOT_FOUND) { + return null; + } + + int size = tableData.getRowCount(); + List columnData = new ArrayList<>(); + for (int i = 0; i < size; i++) { + Object valueAt = tableData.getValueAt(i, colIndex); + columnData.add(GeneralUtils.objectToString(valueAt)); + } + return columnData; + } + + private static int getColIndex(EmbeddedTableData tableData, String columnName) { + int colIndex = 0; + + for (int count = tableData.getColumnCount(); colIndex < count; ++colIndex) { + if (ComparatorUtils.tableDataColumnNameEquals(tableData.getColumnName(colIndex), columnName)) { + return colIndex; + } + } + return DataModel.COLUMN_NAME_NOT_FOUND; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java b/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java new file mode 100644 index 000000000..9d27925df --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java @@ -0,0 +1,56 @@ +package com.fr.design.chart.auto; + +import com.fr.data.util.function.DataFunction; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + */ +public class ColumnInfo { + + private String columnName; + private List values; + private DataFunction function; + private List resultValues = new ArrayList<>(); + + public ColumnInfo(String columnName, List values) { + this.columnName = columnName; + this.values = values; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + } + + public DataFunction getFunction() { + return function; + } + + public void setFunction(DataFunction function) { + this.function = function; + } + + public List getResultValues() { + return resultValues; + } + + public void setResultValues(List resultValues) { + this.resultValues = resultValues; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java new file mode 100644 index 000000000..417cd036c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java @@ -0,0 +1,265 @@ +package com.fr.design.chart.auto.strategy; + +import com.fr.base.chart.chartdata.TopDefinitionProvider; +import com.fr.chart.chartdata.BubbleTableDefinition; +import com.fr.chart.chartdata.ChartDataUtils; +import com.fr.chart.chartdata.ChartSummaryColumn; +import com.fr.chart.chartdata.MoreNameCDDefinition; +import com.fr.chart.chartdata.OneValueCDDefinition; +import com.fr.data.impl.NameTableData; +import com.fr.data.util.function.DataFunction; +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.general.GeneralUtils; +import com.fr.general.data.DataModel; +import com.fr.graph.g2d.canvas.CanvasPainter; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.locale.InterProviderFactory; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-17 + */ +public abstract class AbstractAutoTypeStrategy implements AutoTypeStrategy { + + private static CanvasPainter engine; + + public static final String NONE = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Use_None"); + + public static final int MAX_COUNT = 3; + + //对维度和指标进行计算 + protected void calculateColumn(List dimensions, List targets) { + //> 需要聚合计算的数据数组。eg:{a-x-:{fieldId3:[1,4],fieldId4:[5,8]},a-y-:{fieldId3:[3],fieldId4:[7]}}。 + Map>> targetFieldMap = new HashMap<>(); + + //关键字段可能有数据字典属性,需要拿到数据字典的映射值>。eg:{a-x-:{fieldId1:(a,a1),fieldId1:(x,x1)},a-y-:{fieldId1:(a,a1),fieldId1:(y,y1)}} + Map> dimensionFieldMap = new LinkedHashMap<>(); + + int size = dimensions.get(0).getValues().size(); + + for (int rowIndex = 0; rowIndex < size; rowIndex++) { + String key = StringUtils.EMPTY; + Map keyValueMap = new HashMap<>(); + //处理维度字段 + for (ColumnInfo field : dimensions) { + String columnName = field.getColumnName(); + String result = field.getValues().get(rowIndex); + List resultList = new ArrayList<>(); + key += (result + "-"); + resultList.add(result); + keyValueMap.put(columnName, result); + } + if (!dimensionFieldMap.containsKey(key)) { + dimensionFieldMap.put(key, keyValueMap); + } + //处理指标字段 + for (ColumnInfo field : targets) { + String result = field.getValues().get(rowIndex); + Map> map = targetFieldMap.get(key); + if (map == null) { + map = new HashMap<>(); + targetFieldMap.put(key, map); + } + String columnName = field.getColumnName(); + List list = map.get(columnName); + if (list == null) { + list = new ArrayList<>(); + map.put(columnName, list); + } + list.add(result); + } + } + calculateAndFill(dimensionFieldMap, targetFieldMap, dimensions, targets); + } + + private void calculateAndFill(Map> dimensionFieldMap, + Map>> targetFieldMap, + List dimensions, List targets) { + for (String key : dimensionFieldMap.keySet()) { + Map> targetValues = targetFieldMap.get(key); + //对需要计算的字段使用dataFunction进行计算 + for (ColumnInfo field : targets) { + DataFunction dataFunction = field.getFunction(); + dataFunction.reset(); + List valueList = targetValues.get(field.getColumnName()); + field.getResultValues().add(ChartDataUtils.calculateByFunction(dataFunction, valueList)); + } + + Map keyValue = dimensionFieldMap.get(key); + for (ColumnInfo field : dimensions) { + String result = keyValue.get(field.getColumnName()); + field.getResultValues().add(result); + } + } + } + + protected List analyzeByAva(List dimensions, List targets) { + + List rankChartList = new ArrayList<>(); + + CanvasPainter engine = createEngine(); + if (engine == null) { + return rankChartList; + } + + JSONArray jsonArray = new JSONArray(); + int size = dimensions.isEmpty() ? targets.get(0).getResultValues().size() : dimensions.get(0).getResultValues().size(); + for (int i = 0; i < size; i++) { + JSONObject jsonObject = new JSONObject(); + for (ColumnInfo columnInfo : dimensions) { + jsonObject.put(columnInfo.getColumnName(), GeneralUtils.objectToString(columnInfo.getResultValues().get(i))); + } + for (ColumnInfo columnInfo : targets) { + jsonObject.put(columnInfo.getColumnName(), GeneralUtils.objectToNumber(columnInfo.getResultValues().get(i))); + } + jsonArray.add(jsonObject); + } + + String result = StringUtils.EMPTY; + try { + result = (String) engine.executeFunction("analyzeData", jsonArray.toString()); + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage(), ex); + } + + JSONArray resultArray = new JSONArray(result); + for (int i = 0; i < resultArray.length(); i++) { + JSONObject jsonObject = resultArray.getJSONObject(i); + AvaType type = AvaType.parse(GeneralUtils.objectToString(jsonObject.get("type"))); + double score = GeneralUtils.objectToNumber(jsonObject.get("score")).doubleValue(); + if (type == null || score <= 0) { + continue; + } + + RankChart rankChart = new RankChart(); + rankChart.setVanChart(type.getVanChart()); + rankChart.setGrade(score); + rankChart.setMainCategory(GeneralUtils.objectToString(jsonObject.get("category"))); + rankChartList.add(rankChart); + if (rankChartList.size() >= MAX_COUNT) { + break; + } + } + + return rankChartList; + } + + protected List selectHighRankChart(List rankChartList) { + Collections.sort(rankChartList); + List vanChartList = new ArrayList<>(); + int size = Math.min(rankChartList.size(), MAX_COUNT); + for (int i = 0; i < size; i++) { + vanChartList.add(rankChartList.get(i).getVanChart()); + } + return vanChartList; + } + + private synchronized static CanvasPainter createEngine() { + if (engine != null) { + return engine; + } + CanvasPainter.Builder builder = null; + try { + builder = CanvasPainter.newDefaultBuilder() + .loadAndExecute("/com/fr/design/chart/auto/js/analyze.js") + .loadAndExecute("/com/fr/design/chart/auto/js/ava.js"); + + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage(), ex); + } finally { + if (builder != null) { + engine = builder.build(); + } + } + return engine; + } + + protected TopDefinitionProvider createOneValueCDDefinition(String tableName, DataModel dataModel, String categoryName, + String seriesName, String valueName, DataFunction dataFunction) { + OneValueCDDefinition oneValueCDDefinition = new OneValueCDDefinition(); + oneValueCDDefinition.setTableData(new NameTableData(tableName)); + oneValueCDDefinition.setDataModel(dataModel); + oneValueCDDefinition.setCategoryName(categoryName); + oneValueCDDefinition.setSeriesColumnName(seriesName); + oneValueCDDefinition.setValueColumnName(valueName); + oneValueCDDefinition.setDataFunction(dataFunction); + return oneValueCDDefinition; + } + + protected TopDefinitionProvider createMoreNameCDDefinition(String tableName, DataModel dataModel, + String categoryName, String seriesName, DataFunction dataFunction) { + ChartSummaryColumn chartSummaryColumn = new ChartSummaryColumn(); + chartSummaryColumn.setCustomName(seriesName); + chartSummaryColumn.setName(seriesName); + chartSummaryColumn.setFunction(dataFunction); + + MoreNameCDDefinition moreNameCDDefinition = new MoreNameCDDefinition(); + moreNameCDDefinition.setTableData(new NameTableData(tableName)); + moreNameCDDefinition.setDataModel(dataModel); + moreNameCDDefinition.setCategoryName(categoryName); + moreNameCDDefinition.setChartSummaryColumn(new ChartSummaryColumn[]{chartSummaryColumn}); + return moreNameCDDefinition; + } + + protected TopDefinitionProvider createBubbleTableDefinition(String tableName, DataModel dataModel, + String seriesName, String x, String y, String value) { + BubbleTableDefinition bubbleTableDefinition = new BubbleTableDefinition(); + bubbleTableDefinition.setTableData(new NameTableData(tableName)); + bubbleTableDefinition.setDataModel(dataModel); + bubbleTableDefinition.setSeriesName(seriesName); + bubbleTableDefinition.setBubbleX(x); + bubbleTableDefinition.setBubbleY(y); + bubbleTableDefinition.setBubbleSize(value); + return bubbleTableDefinition; + } + + public class RankChart implements Comparable { + + private double grade; + + private VanChart vanChart; + + private String mainCategory; + + public double getGrade() { + return grade; + } + + public void setGrade(double grade) { + this.grade = grade; + } + + public VanChart getVanChart() { + return vanChart; + } + + public void setVanChart(VanChart vanChart) { + this.vanChart = vanChart; + } + + public String getMainCategory() { + return mainCategory; + } + + public void setMainCategory(String mainCategory) { + this.mainCategory = mainCategory; + } + + public int compareTo(RankChart compare) { + //分数越高,排名越前 + return compare.getGrade() - grade >= 0 ? 1 : -1; + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java new file mode 100644 index 000000000..12c794568 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java @@ -0,0 +1,22 @@ +package com.fr.design.chart.auto.strategy; + +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.plugin.chart.vanchart.VanChart; + +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + */ +public interface AutoTypeStrategy { + + /** + * 计算排名匹配度最高的图表 + * + * @param dimensions 维度 + * @param targets 指标 + */ + public List rankChart(String tableName, List dimensions, List targets); +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java new file mode 100644 index 000000000..29f242279 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java @@ -0,0 +1,79 @@ +package com.fr.design.chart.auto.strategy; + +import com.fr.chart.charttypes.ChartTypeManager; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.PiePlot4VanChart; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.bubble.VanChartBubblePlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; +import com.fr.plugin.chart.radar.VanChartRadarPlot; +import com.fr.plugin.chart.scatter.VanChartScatterPlot; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-18 + */ +public enum AvaType { + + //柱形图,堆积柱形图,百分比堆积柱形图 + COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 0), + STACKED_COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 1), + PERCENT_STACKED_COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 2), + + //条形图,堆积条形图,百分比堆积条形图 + BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 0), + STACKED_BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 1), + PERCENT_STACKED_BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 2), + + //雷达图 + RADAR_CHART(VanChartRadarPlot.VAN_CHART_RADAR_PLOT, 0), + + //饼图 + PIE_CHART(PiePlot4VanChart.VAN_CHART_PIE_PLOT, 0), + + //折线图 + LINE_CHART(VanChartLinePlot.VAN_CHART_LINE_PLOT, 0), + + //面积图 + AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 0), + STACKED_AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 1), + PERCENT_STACKED_AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 2), + + //散点图 + SCATTER_PLOT(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID, 0), + + //气泡图 + BUBBLE_CHART(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID, 0); + + private VanChart vanChart; + + AvaType(String vanChartType, int vanChartIndex) { + vanChart = (VanChart) ChartTypeManager.getInstance(). + getCharts(vanChartType)[vanChartIndex]; + + } + + public VanChart getVanChart() { + VanChart vanChart = null; + try { + vanChart = (VanChart) this.vanChart.clone(); + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage(), ex); + } + return vanChart; + } + + + public static AvaType parse(String typeName) { + for (AvaType type : AvaType.values()) { + if (StringUtils.equalsIgnoreCase(type.toString(), typeName)) { + return type; + } + } + return null; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java new file mode 100644 index 000000000..aef4999f0 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java @@ -0,0 +1,106 @@ +package com.fr.design.chart.auto.strategy.imp; + +import com.fr.base.chart.chartdata.TopDefinitionProvider; +import com.fr.data.util.function.SumFunction; +import com.fr.design.chart.auto.AutoChartDataModel; +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; +import com.fr.general.data.DataModel; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; +import com.fr.plugin.chart.radar.VanChartRadarPlot; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + * 使用ava来匹配的策略 + */ +public class AvaStrategy extends AbstractAutoTypeStrategy { + + + public List rankChart(String tableName, List dimensions, List targets) { + List rankChartList = new ArrayList<>(); + + for (ColumnInfo columnInfo : targets) { + columnInfo.setFunction(new SumFunction()); + } + if (dimensions.size() == 1) { + //一个维度+一个指标匹配 + for (ColumnInfo target : targets) { + List newTargets = new ArrayList<>(); + newTargets.add(target); + rankChartList.addAll(rankChartByAva(tableName, dimensions, newTargets)); + //ava匹配之后,初始化图表和分数 + } + } else { + //两个维度+一个指标匹配 + int size = dimensions.size(); + for (int i = 0; i < size; i++) { + for (int j = i + 1; j < size; j++) { + for (ColumnInfo target : targets) { + List newDimensions = new ArrayList<>(); + newDimensions.add(dimensions.get(i)); + newDimensions.add(dimensions.get(j)); + List newTargets = new ArrayList<>(); + newTargets.add(target); + rankChartList.addAll(rankChartByAva(tableName, newDimensions, newTargets)); + } + } + } + } + + return selectHighRankChart(rankChartList); + } + + private List rankChartByAva(String tableName, List dimensions, List targets) { + for (ColumnInfo columnInfo : dimensions) { + columnInfo.setResultValues(new ArrayList<>()); + } + for (ColumnInfo columnInfo : targets) { + columnInfo.setResultValues(new ArrayList<>()); + } + calculateColumn(dimensions, targets); + //调用ava + List rankChartList = analyzeByAva(dimensions, targets); + + List modelList = new ArrayList<>(); + modelList.addAll(dimensions); + modelList.addAll(targets); + AutoChartDataModel dataModel = new AutoChartDataModel(modelList); + for (RankChart rankChart : rankChartList) { + VanChart vanChart = rankChart.getVanChart(); + String plotID = vanChart.getPlot().getPlotID(); + vanChart.setFilterDefinition(creatDefinition(plotID, rankChart.getMainCategory(), tableName, dataModel, dimensions, targets)); + } + return rankChartList; + } + + private TopDefinitionProvider creatDefinition(String plotId, String category, String tableName, DataModel dataModel, + List dimensions, List targets) { + String categoryName; + String seriesName; + switch (plotId) { + case VanChartLinePlot.VAN_CHART_LINE_PLOT: + case VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID: + case VanChartRadarPlot.VAN_CHART_RADAR_PLOT: + if (dimensions.size() == 1) { + return createMoreNameCDDefinition(tableName, dataModel, dimensions.get(0).getColumnName(), targets.get(0).getColumnName(), new SumFunction()); + } else { + categoryName = category; + seriesName = StringUtils.equals(dimensions.get(0).getColumnName(), categoryName) ? + dimensions.get(1).getColumnName() : dimensions.get(0).getColumnName(); + return createOneValueCDDefinition(tableName, dataModel, categoryName, seriesName, targets.get(0).getColumnName(), new SumFunction()); + } + default: + categoryName = dimensions.size() > 1 ? dimensions.get(0).getColumnName() : NONE; + seriesName = dimensions.size() > 1 ? dimensions.get(1).getColumnName() : dimensions.get(0).getColumnName(); + return createOneValueCDDefinition(tableName, dataModel, categoryName, seriesName, targets.get(0).getColumnName(), new SumFunction()); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java new file mode 100644 index 000000000..6f10f561b --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java @@ -0,0 +1,76 @@ +package com.fr.design.chart.auto.strategy.imp; + +import com.fr.base.chart.chartdata.TopDefinitionProvider; +import com.fr.design.chart.auto.AutoChartDataModel; +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + * 匹配气泡图和散点图的策略 + */ +public class BubbleChartStrategy extends AbstractAutoTypeStrategy { + + @Override + public List rankChart(String tableName, List dimensions, List targets) { + List rankChartList = new ArrayList<>(); + for (ColumnInfo columnInfo : dimensions) { + List resultValues = columnInfo.getResultValues(); + for (String str : columnInfo.getValues()) { + resultValues.add(str); + } + } + for (ColumnInfo columnInfo : targets) { + List resultValues = columnInfo.getResultValues(); + for (String str : columnInfo.getValues()) { + resultValues.add(str); + } + } + int size = targets.size(); + //散点图 + if (size == 2) { + rankChartList.addAll(rankChartByAva(tableName, dimensions, targets)); + } else { + //气泡图 + for (int i = 0; i < size; i++) { + for (int j = i + 1; j < size; j++) { + for (int k = j + 1; k < size; k++) { + List newTargets = new ArrayList<>(); + newTargets.add(targets.get(i)); + newTargets.add(targets.get(j)); + newTargets.add(targets.get(k)); + rankChartList.addAll(rankChartByAva(tableName, dimensions, newTargets)); + } + } + } + } + return selectHighRankChart(rankChartList); + } + + private List rankChartByAva(String tableName, List dimensions, List targets) { + //调用ava + List rankChartList = analyzeByAva(dimensions, targets); + + List modelList = new ArrayList<>(); + modelList.addAll(dimensions); + modelList.addAll(targets); + AutoChartDataModel dataModel = new AutoChartDataModel(modelList); + + String series = dimensions.size() == 0 ? NONE : dimensions.get(0).getColumnName(); + String value = targets.size() == 2 ? StringUtils.EMPTY : targets.get(2).getColumnName(); + TopDefinitionProvider bubbleTableDefinition = createBubbleTableDefinition(tableName, dataModel, series, + targets.get(0).getColumnName(), targets.get(1).getColumnName(), value); + for (RankChart rankChart : rankChartList) { + VanChart vanChart = rankChart.getVanChart(); + vanChart.setFilterDefinition(bubbleTableDefinition); + } + return rankChartList; + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java new file mode 100644 index 000000000..4d7ad03f4 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java @@ -0,0 +1,68 @@ +package com.fr.design.chart.auto.strategy.imp; + +import com.fr.base.chart.chartdata.TopDefinitionProvider; +import com.fr.data.util.function.CountFunction; +import com.fr.design.chart.auto.AutoChartDataModel; +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; +import com.fr.general.data.DataModel; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; +import com.fr.plugin.chart.radar.VanChartRadarPlot; +import com.fr.plugin.chart.vanchart.VanChart; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + * 匹配无指标的策略 + */ +public class SingleDimensionStrategy extends AbstractAutoTypeStrategy { + + @Override + public List rankChart(String tableName, List dimensions, List targets) { + List rankChartList = new ArrayList<>(); + for (ColumnInfo columnInfo : dimensions) { + ColumnInfo target = new ColumnInfo(columnInfo.getColumnName(), columnInfo.getValues()); + target.setFunction(new CountFunction()); + target.setColumnName("value"); + + List newDimension = new ArrayList<>(); + List newTarget = new ArrayList<>(); + newDimension.add(columnInfo); + newTarget.add(target); + + rankChartList.addAll(rankChartByAva(tableName, newDimension, newTarget)); + } + return selectHighRankChart(rankChartList); + } + + private List rankChartByAva(String tableName, List dimensions, List targets) { + calculateColumn(dimensions, targets); + //调用ava + List rankChartList = analyzeByAva(dimensions, targets); + + AutoChartDataModel dataModel = new AutoChartDataModel(dimensions); + for (RankChart rankChart : rankChartList) { + VanChart vanChart = rankChart.getVanChart(); + String plotID = vanChart.getPlot().getPlotID(); + vanChart.setFilterDefinition(creatDefinition(plotID, tableName, dataModel, dimensions)); + } + return rankChartList; + } + + private TopDefinitionProvider creatDefinition(String plotId, String tableName, DataModel dataModel, + List dimensions) { + switch (plotId) { + case VanChartLinePlot.VAN_CHART_LINE_PLOT: + case VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID: + case VanChartRadarPlot.VAN_CHART_RADAR_PLOT: + return createMoreNameCDDefinition(tableName, dataModel, dimensions.get(0).getColumnName(), dimensions.get(0).getColumnName(), new CountFunction()); + default: + return createOneValueCDDefinition(tableName, dataModel, NONE, dimensions.get(0).getColumnName(), dimensions.get(0).getColumnName(), new CountFunction()); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java new file mode 100644 index 000000000..5679b6125 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java @@ -0,0 +1,45 @@ +package com.fr.design.chart.auto.strategy.imp; + +import com.fr.data.util.function.NoneFunction; +import com.fr.design.chart.auto.AutoChartDataModel; +import com.fr.design.chart.auto.ColumnInfo; +import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; +import com.fr.design.chart.auto.strategy.AvaType; +import com.fr.plugin.chart.attr.axis.VanChartAxis; +import com.fr.plugin.chart.attr.axis.VanChartValueAxis; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.vanchart.VanChart; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-16 + * 匹配无维度的策略 + */ +public class SingleTargetStrategy extends AbstractAutoTypeStrategy { + + @Override + public List rankChart(String tableName, List dimensions, List targets) { + //只有一个指标,匹配直方图 + VanChart vanChart = AvaType.COLUMN_CHART.getVanChart(); + List allColumn = new ArrayList<>(dimensions); + allColumn.addAll(targets); + + AutoChartDataModel dataModel = new AutoChartDataModel(allColumn); + String columnName = targets.get(0).getColumnName(); + vanChart.setFilterDefinition(createMoreNameCDDefinition(tableName, dataModel, columnName, columnName, new NoneFunction())); + + VanChartColumnPlot plot = vanChart.getPlot(); + List xAxisList = plot.getXAxisList(); + VanChartAxis vanChartAxis = xAxisList.get(0); + VanChartValueAxis axis = new VanChartValueAxis(vanChartAxis.getAxisName(), vanChartAxis.getPosition()); + xAxisList.set(0, axis); + + List vanChartList = new ArrayList<>(); + vanChartList.add(vanChart); + return vanChartList; + } +} diff --git a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js new file mode 100644 index 000000000..c181cd20e --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js @@ -0,0 +1,66 @@ +var document = { + + body: { + + style: {} + + }, + + documentElement: { + style: {} + }, + + head: { + prepend: function () { + } + }, + + addEventListener: function () { + }, + + createDocumentFragment: function () { + return { + appendChild: function () { + return {}; + } + }; + }, + + createElement: function () { + return { + getContext: function () { + return undefined; + }, + + setAttribute: function () { + + }, + + getElementsByTagName: function () { + return []; + }, + + appendChild: function () { + return {}; + } + } + } +}; + +function analyzeData(data) { + + data = JSON.parse(data); + + var result = window.analyze(data); + + for (i = 0; i < result.length; i++) { + var type = result[i].type; + + if(type == "line_chart" || type == "area_chart" + || type == "stacked_area_chart" || type == "percent_stacked_area_chart"){ + result[i].category = result[i].channels.x; + } + } + + return JSON.stringify(result); +} \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js new file mode 100644 index 000000000..07965c88f --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js @@ -0,0 +1,2729 @@ +!function(e, a) { + 'object' == typeof exports && 'object' == typeof module ? module.exports = a() : 'function' == typeof define && define.amd ? define([], a) : 'object' == typeof exports ? exports.Advisor = a() : e.Advisor = a(); +}(window, (function() { + return function(e) { + var a = {}; + + function t(r) { + if (a[r]) return a[r].exports; + var n = a[r] = { i: r, l: !1, exports: {} }; + return e[r].call(n.exports, n, n.exports, t), n.l = !0, n.exports; + } + + return t.m = e, t.c = a, t.d = function(e, a, r) { + t.o(e, a) || Object.defineProperty(e, a, { enumerable: !0, get: r }); + }, t.r = function(e) { + 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); + }, t.t = function(e, a) { + if (1 & a && (e = t(e)), 8 & a) return e; + if (4 & a && 'object' == typeof e && e && e.__esModule) return e; + var r = Object.create(null); + if (t.r(r), Object.defineProperty(r, 'default', { + enumerable: !0, + value: e, + }), 2 & a && 'string' != typeof e) for (var n in e) t.d(r, n, function(a) { + return e[a]; + }.bind(null, n)); + return r; + }, t.n = function(e) { + var a = e && e.__esModule ? function() { + return e.default; + } : function() { + return e; + }; + return t.d(a, 'a', a), a; + }, t.o = function(e, a) { + return Object.prototype.hasOwnProperty.call(e, a); + }, t.p = '', t(t.s = 3); + }([function(e, a, t) { + 'use strict'; + t.d(a, 'a', (function() { + return r; + })), t.d(a, 'd', (function() { + return n; + })), t.d(a, 'b', (function() { + return i; + })), t.d(a, 'c', (function() { + return o; + })); + var r = function() { + return (r = Object.assign || function(e) { + for (var a, t = 1, r = arguments.length; t < r; t++) for (var n in a = arguments[t]) Object.prototype.hasOwnProperty.call(a, n) && (e[n] = a[n]); + return e; + }).apply(this, arguments); + }; + + function n(e) { + var a = 'function' == typeof Symbol && Symbol.iterator, t = a && e[a], r = 0; + if (t) return t.call(e); + if (e && 'number' == typeof e.length) return { + next: function() { + return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; + }, + }; + throw new TypeError(a ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); + } + + function i(e, a) { + var t = 'function' == typeof Symbol && e[Symbol.iterator]; + if (!t) return e; + var r, n, i = t.call(e), o = []; + try { + for (; (void 0 === a || a-- > 0) && !(r = i.next()).done;) o.push(r.value); + } catch (e) { + n = { error: e }; + } finally { + try { + r && !r.done && (t = i.return) && t.call(i); + } finally { + if (n) throw n.error; + } + } + return o; + } + + function o() { + for (var e = [], a = 0; a < arguments.length; a++) e = e.concat(i(arguments[a])); + return e; + } + }, function(e, a, t) { + 'use strict'; + + function r(e, a) { + for (var t = 0; t < a.length; t++) { + var r = a[t]; + r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + function n(e, a, t) { + return a in e ? Object.defineProperty(e, a, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0, + }) : e[a] = t, e; + } + + Object.defineProperty(a, '__esModule', { value: !0 }), a.default = void 0; + var i = function() { + function e(a, t, r, i, o) { + !function(e, a) { + if (!(e instanceof a)) throw new TypeError('Cannot call a class as a function'); + }(this, e), n(this, '_id', void 0), n(this, '_hardOrSoft', void 0), n(this, '_specChartTypes', void 0), n(this, '_weight', void 0), n(this, 'validator', void 0), this._id = a, this._hardOrSoft = t, this._specChartTypes = r, this._weight = i, this.validator = o; + } + + var a, t, i; + return a = e, (t = [{ + key: 'toString', value: function() { + return 'RULE: '.concat(this._id, '^').concat(this._hardOrSoft, '^').concat(this._specChartTypes.toString(), '^*').concat(this.weight); + }, + }, { + key: 'check', value: function(e) { + return this.validator(e) * this._weight; + }, + }, { + key: 'id', get: function() { + return this._id; + }, + }, { + key: 'hardOrSoft', get: function() { + return this._hardOrSoft; + }, + }, { + key: 'specChartTypes', get: function() { + return this._specChartTypes; + }, + }, { + key: 'weight', get: function() { + return this._weight; + }, + }]) && r(a.prototype, t), i && r(a, i), e; + }(); + a.default = i; + }, function(e, a, t) { + 'use strict'; + t.r(a), t.d(a, 'CKBJson', (function() { + return o; + })), t.d(a, 'addChart', (function() { + return c; + })), t.d(a, 'CKBOptions', (function() { + return _; + })), t.d(a, 'FAMILY_OPTIONS', (function() { + return l; + })), t.d(a, 'PURPOSE_OPTIONS', (function() { + return d; + })), t.d(a, 'COORD_TYPE_OPTIONS', (function() { + return u; + })), t.d(a, 'GRAPHIC_CATEGORY_OPTIONS', (function() { + return m; + })), t.d(a, 'SHAPE_OPTIONS', (function() { + return h; + })), t.d(a, 'LOM_OPTIONS', (function() { + return p; + })), t.d(a, 'CHANNEL_OPTIONS', (function() { + return f; + })), t.d(a, 'RECOMMEND_RATING_OPTIONS', (function() { + return y; + })), t.d(a, 'CHART_ID_OPTIONS', (function() { + return g; + })); + var r = { + 'en-US': null, 'zh-CN': { + concepts: { + family: { + LineCharts: '折线图类', + ColumnCharts: '柱状图类', + BarCharts: '条形图类', + PieCharts: '饼图类', + AreaCharts: '面积图类', + ScatterCharts: '散点图类', + FunnelCharts: '漏斗图类', + HeatmapCharts: '热力图类', + RadarCharts: '雷达图类', + TreeGraph: '树形关系类', + GeneralGraph: '关系图类', + PointLayer: '点图层类', + LineLayer: '线图层类', + PolygonLayer: '面图层类', + HeatmapLayer: '地图热力图类', + Others: '其他类', + }, + category: { Statistic: '统计图表', Diagram: '示意图', Graph: '关系图', Map: '地图' }, + purpose: { + Comparison: '比较', + Trend: '趋势', + Distribution: '分布', + Rank: '排名', + Proportion: '占比', + Composition: '组成', + Relation: '关系', + Hierarchy: '层级', + Flow: '流向', + Spatial: '空间', + }, + coord: { + NumberLine: '数轴', + Cartesian2D: '二维直角坐标系', + SymmetricCartesian: '对称直角坐标系', + Cartesian3D: '三维直角坐标系', + Polar: '极坐标系', + NodeLink: '点线关系网络', + Radar: '雷达型坐标系', + Geo: '地理坐标系', + Other: '其他', + }, + shape: { + Lines: '线形', + Bars: '条形', + Round: '圆形', + Square: '方形', + Area: '面形', + Scatter: '散点形', + Symmetric: '对称形', + Network: '网络形', + Map: '地图', + }, + channel: { + Position: '位置', + Length: '长度', + Color: '颜色', + Area: '面积', + Angle: '角度', + ArcLength: '弧长', + Direction: '方向', + Size: '大小', + Opacity: '透明度', + Stroke: '线色', + LineWidth: '线粗', + Lightness: '亮度', + }, + lom: { Continuous: '连续', Discrete: '离散', Interval: '数值', Nominal: '无序名词', Ordinal: '有序名词', Time: '时间' }, + recRate: { Recommended: '推荐', 'Use with Caution': '慎用', 'Not Recommended': '不推荐' }, + }, chartTypes: { + line_chart: { name: '折线图', alias: ['折线图', '线图'], def: '使用折线的线段显示数据在一个具有顺序性的维度上的变化。' }, + step_line_chart: { + name: '阶梯图', + alias: ['阶梯线'], + def: '折线根据分类字段分为多根在 x 方向(时间)的信息是完全一致、颜色及 y 方向(变量)信息不一致的折线,通常用作同一时间区间内多个变量发展趋势的对比。', + }, + area_chart: { name: '面积图', alias: [], def: '使用带填充区域的线段显示数据在一个具有顺序性的维度上的变化。' }, + stacked_area_chart: { + name: '堆叠面积图', + alias: [], + def: '使用带不同样式的填充区域的层叠线段来显示多组数据在同一个具有顺序性的维度上的变化,线段在同一维度值上的端点高度按照数值累加。', + }, + percent_stacked_area_chart: { + name: '百分比堆叠面积图', + alias: ['%堆叠面积图', '100%堆叠面积图'], + def: '一种特殊的堆叠面积图,线段在同一维度值上的端点高度代表值在其中的占比,占比总和为百分之百。', + }, + interval_area_chart: { name: '', alias: [], def: 'TBD' }, + stream_chart: { name: '', alias: [], def: 'TBD' }, + column_chart: { name: '柱状图', alias: ['柱形图'], def: '使用柱形显示维度的数值。横轴显示分类维度,纵轴显示相应的值。' }, + grouped_column_chart: { + name: '分组柱状图', + alias: ['簇状柱状图'], + def: '使用颜色不同的柱形并排组成小组来显示各维度的数值。横轴标示出分组,颜色标示出分类,纵轴显示相应的值。', + }, + stacked_column_chart: { + name: '堆叠柱状图', + alias: [], + def: '使用颜色不同的堆叠的柱形来显示各维度的数值。横轴标示出第一个分类维度,颜色标示出第二个分类维度,纵轴显示相应的值。', + }, + percent_stacked_column_chart: { + name: '百分比堆叠柱状图', + alias: ['%堆叠柱状图', '100%堆叠柱状图'], + def: '使用颜色不同的堆叠的柱形来显示各维度的数值。横轴标示出第一个分类维度,颜色标示出第二个分类维度,纵轴显示相应分类所占的百分比。', + }, + interval_column_chart: { name: '', alias: [], def: 'TBD' }, + range_column_chart: { name: '区间柱状图', alias: [], def: '区间柱状图是一种特殊的柱状图,柱子不一定要从 0 开始,而是用柱子长度表示一个从起始值到终止值的区间。' }, + waterfall_chart: { name: '瀑布图', alias: ['桥图'], def: '瀑布图形似瀑布流水,采用绝对值与相对值结合的方式,适用于表达数个特定数值之间的数量变化关系。' }, + histogram: { name: '直方图', alias: [], def: '直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。' }, + bar_chart: { name: '条形图', alias: ['条状图'], def: '使用条形显示维度的数值。纵轴显示分类维度,横轴显示相应的值。' }, + grouped_bar_chart: { + name: '分组条形图', + alias: ['簇状条形图'], + def: '使用颜色不同的条形并排组成小组来显示维度的数值。纵轴标示出分组,颜色标示出分类,横轴显示相应的值。', + }, + stacked_bar_chart: { + name: '堆叠条形图', + alias: [], + def: '使用颜色不同的堆叠的条形来显示各维度的数值。纵轴标示出第一个分类维度,颜色标示出第二个分类维度,横轴显示相应的值。', + }, + percent_stacked_bar_chart: { + name: '百分比堆叠条形图', + alias: ['%堆叠条形图', '100%堆叠条形图'], + def: '使用颜色不同的堆叠的条形来显示各维度的数值。纵轴标示出第一个分类维度,颜色标示出第二个分类维度,横轴显示相应分类所占的百分比。', + }, + interval_bar_chart: { name: '', alias: [], def: 'TBD' }, + range_bar_chart: { name: '区间条形图', alias: [], def: '区间条形图是一种特殊的条形图,条不一定要从 0 开始,而是用长度表示一个从起始值到终止值的区间。' }, + radial_bar_chart: { name: '', alias: [], def: 'TBD' }, + mirror_bar_chart: { name: '', alias: [], def: 'TBD' }, + bullet_chart: { name: '子弹图', alias: ['靶心图', '标靶图'], def: '子弹图可用于将度量的绩效可视化并与目标值和定性刻度。' }, + pie_chart: { name: '饼图', alias: [], def: '通过扇形区块的颜色和弧长(角度、面积)来展现数据的分类和占比情况。' }, + donut_chart: { name: '环图', alias: ['甜甜圈图'], def: '通过弧形区块的颜色和弧长来展现数据的分类和占比情况。' }, + nested_pie_chart: { name: '', alias: [], def: 'TBD' }, + rose_chart: { + name: '玫瑰图', + alias: ['南丁格尔图', '鸡冠花图', '极坐标面积图'], + def: '统计学家和医学改革家佛罗伦萨‧南丁格尔在克里米亚战争期间创造了这种图表。尽管外形很像饼图,但本质上来说,南丁格尔玫瑰图更像在极坐标下绘制的柱状图或堆叠柱状图。只不过,它用半径来反映数值。', + }, + scatter_plot: { name: '散点图', alias: [], def: '散点图是将所有的数据以不同颜色的点的形式展现在平面直角坐标系上的统计图表。' }, + bubble_chart: { name: '气泡图', alias: [], def: '气泡图是一种多变量的统计图表,由笛卡尔坐标系(直角坐标系)和大小不一、颜色不同的圆组成,可以看作是散点图的变形。' }, + non_ribbon_chord_diagram: { name: '', alias: [], def: 'TBD' }, + arc_diagram: { name: '弧形图', alias: [], def: '弧形图是一种关系图的特殊布局,节点被排列在同一水平线上,关系由节点间的圆弧线表示。' }, + chord_diagram: { name: '', alias: [], def: 'TBD' }, + treemap: { name: '', alias: [], def: 'TBD' }, + sankey_diagram: { name: '桑基图', alias: ['桑吉图'], def: '桑基图,是一种表现流程的示意图,用于描述一组值到另一组值的流向。分支的宽度对应了数据流量的大小。' }, + funnel_chart: { name: '漏斗图', alias: [], def: '漏斗图,形如“漏斗”,用于单流程分析,在开始和结束之间由N个流程环节组成。' }, + overlapping_funnel_chart: { name: '', alias: [], def: 'TBD' }, + mirror_funnel_chart: { name: '对比漏斗图', alias: ['对称漏斗图', '镜像漏斗图'], def: '对比漏斗图是两个独立的漏斗图以一根中轴线对称展开的图表形式。' }, + boxplot: { name: '', alias: [], def: 'TBD' }, + heatmap: { name: '热力图', alias: ['区块热力图'], def: '热力图,是一种通过对色块着色来显示数据的统计图表。' }, + density_heatmap: { name: '密度热力图', alias: ['热力图'], def: '密度热力图是一种用在连续坐标系上用色点展现密度分布的统计图表。' }, + gauge_chart: { name: '', alias: [], def: 'TBD' }, + radar_chart: { + name: '雷达图', + alias: ['蛛网图'], + def: '将不同系列的多个维度的数据量映射到坐标轴上,这些坐标轴起始于同一个圆心点,通常结束于圆周边缘,将同一组的点使用线连接起来,用颜色区分系列。', + }, + wordcloud: { name: '', alias: [], def: 'TBD' }, + candlestick_chart: { name: '', alias: [], def: 'TBD' }, + compact_box_tree: { name: '紧凑树', alias: [], def: '紧凑树是一种树图布局,从根节点开始,同一深度的节点在同一层,并且布局时会将节点大小考虑进去。' }, + dendrogram: { name: '生态树', alias: [], def: '生态树是一种树图布局,不管数据的深度多少,总是叶节点对齐。不考虑节点大小,布局时将节点视为 1 个像素点。' }, + indented_tree: { name: '缩进树', alias: [], def: '缩进树是一种树图布局,缩进树布局。每个元素会占一行/一列。' }, + radial_tree: { name: '辐射树', alias: [], def: '辐射树是一种树图布局,跟节点位于辐射树中心,其他分支辐射式展开。' }, + flow_diagram: { name: '流程图', alias: [], def: '流程图是一种图解,可视表示在过程或功能内部诸如事件、步骤等之间的顺序关系。' }, + fruchterman_layout_graph: { name: 'Fruchterman 布局力导向图', alias: [], def: '一种使用 Fruchterman 布局算法的力导向图。' }, + force_directed_layout_graph: { + name: '力导向图', + alias: [], + def: '力导向图布局作为较早被发明的一种实际应用布局算法,经过研究者多年改进、扩展,已发展成为一类算法的集合。该类算法的特点是模拟物理世界中的作用力,施加在节点上,并迭代计算以达到合理放置节点、美观布局的一类算法。', + }, + circular_layout_graph: { name: '环形布局关系图', alias: [], def: '环形布局根据参数指定的排序方式对节点进行排序后,将节点排列在圆环上。' }, + spiral_layout_graph: { name: '螺旋布局关系图', alias: [], def: '螺旋布局图的节点排列在一根螺旋线上。' }, + radial_layout_graph: { + name: '辐射布局关系图', + alias: [], + def: '辐射布局根据指定的中心点,根据其他节点与中心点的拓扑距离(最短路径长度)将其余节点放置在以中心点为圆心的同心圆上。', + }, + concentric_layout_graph: { name: '同心圆布局关系图', alias: [], def: '同心圆布局关系图将所有节点放置在同心圆上。' }, + grid_layout_graph: { name: '网格布局关系图', alias: [], def: '网格布局根据参数指定的排序方式对节点进行排序后,将节点排列在网格上。' }, + symbol_map: { + name: '符号地图', + alias: [], + def: '散点地图的变体,用具象的图标指代抽象的圆点,无需图例就能直观看出数据点代表的内容,常用于地图上重要地标的显示或数据量较少时的信息表达。', + }, + chart_map: { name: '复合图表地图', alias: [], def: '是定点地图的变体,使用二维统计图表代替点状符号的一种特殊复合形式。' }, + column_map_3d: { name: '3D 柱状图', alias: [], def: '用形状大小相同的柱状体代替点状符号,高度与数值大小映射共同表达离散现象分布特征的地图' }, + scatter_map: { name: '散点地图', alias: [], def: '指地图上可用一个形状大小相同的圆点来定位,用表达离散现象分布特征的地图,如人口、农作物、动植物等的分布' }, + path_map: { + name: '路径地图', + alias: [], + def: '指需要用一连串首尾不闭合的点坐标对(xi,yi)来定位的一类图层。属于半依比例图层,线端点依附地图比例缩放,但线的粗细不会变化。', + }, + isoline_map: { name: '等值线地图', alias: [], def: 'TBD' }, + arc_map_3d: { + name: '3D 弧线地图', + alias: [], + def: '将两个点的连线绘制成弧形,绘制的弧线可以是贝塞尔曲线,大圆航线,通常用来表示两种地理事物关系和联系,或者人口迁移,物流起点目的地等。', + }, + choropleth_map: { name: '填充地图', alias: [], def: '填充图,也叫分级统计图,可在地图上不同领土区域进行着色,查看区域间的分布对比情况' }, + choropleth_map_3d: { name: '3D 填充地图', alias: [], def: '填充地图的增强实现,通过三维视角中的高度模拟真实地物的高度。' }, + hexagonal_heat_map: { + name: '蜂窝热力地图', + alias: [], + def: '使用六边形将地图区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', + }, + hexagonal_heat_map_3d: { + name: '3D 蜂窝热力地图', + alias: [], + def: '使用3D 六边形将地图区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', + }, + classical_heat_map: { name: '热力地图', alias: [], def: '密度热力图是一种用在连续坐标系上用色点展现密度分布的统计地图。' }, + grid_heat_map: { + name: '网格热力地图', + alias: [], + def: '使用网格区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', + }, + bubble_map: { name: '气泡地图', alias: [], def: '指地图上用一个形状相同、面积大小和数值成正比的圆点来定位的地图,是散点图的扩展,用于表达离散现象分布特征的地图。' }, + bubble_light_map: { + name: '亮点地图', + alias: [], + def: '散点图的变形,指用一个点代表一个值,连续渐进颜色代表数值大小,并通过色彩的叠加的达到效果增强,专为海量散点数据运用而生,解决远视角下,点颜色无法区分问题', + }, + packed_circles: { name: '', alias: [], def: 'TBD' }, + polar_treemap: { name: '', alias: [], def: 'TBD' }, + sunburst_diagram: { name: '', alias: [], def: 'TBD' }, + liquid_chart: { name: '水波图', alias: ['进度球'], def: '一种用来表示进度的拟物化示意图' }, + }, + }, + }; + + function n(e) { + return e && Object.keys(r).includes(e) ? r[e] : null; + } + + var i = { + line_chart: { + id: 'line_chart', + name: 'Line Chart', + alias: ['Lines'], + family: ['LineCharts'], + def: 'A line chart uses lines with segments to show changes in data in a ordinal dimension.', + purpose: ['Comparison', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Lines'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { + minQty: 0, + maxQty: 1, + fieldConditions: ['Nominal'], + }, { minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], + channel: ['Position', 'Direction'], + recRate: 'Recommended', + }, + step_line_chart: { + id: 'step_line_chart', + name: 'Step Line Chart', + alias: ['Step Lines'], + family: ['LineCharts'], + def: 'A step line chart is a line chart in which points of each line are connected by horizontal and vertical line segments, looking like steps of a staircase.', + purpose: ['Comparison', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Lines'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { + minQty: 0, + maxQty: 1, + fieldConditions: ['Nominal'], + }, { minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], + channel: ['Position', 'Direction'], + recRate: 'Recommended', + }, + area_chart: { + id: 'area_chart', + name: 'Area Chart', + alias: [], + family: ['AreaCharts'], + def: 'An area chart uses series of line segments with overlapped areas to show the change in data in a ordinal dimension.', + purpose: ['Comparison', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Area'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }, { minQty: 0, maxQty: 1, fieldConditions: ['Nominal'] }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + stacked_area_chart: { + id: 'stacked_area_chart', + name: 'Stacked Area Chart', + alias: [], + family: ['AreaCharts'], + def: 'A stacked area chart uses layered line segments with different styles of padding regions to display how multiple sets of data change in the same ordinal dimension, and the endpoint heights of the segments on the same dimension tick are accumulated by value.', + purpose: ['Comparison', 'Composition', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Area'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], + channel: ['Color', 'Length'], + recRate: 'Recommended', + }, + percent_stacked_area_chart: { + id: 'percent_stacked_area_chart', + name: 'Percent Stacked Area Chart', + alias: ['Percent Stacked Area', '% Stacked Area', '100% Stacked Area'], + family: ['AreaCharts'], + def: 'A percent stacked area chart is an extented stacked area chart in which the height of the endpoints of the line segment on the same dimension tick is the accumulated proportion of the ratio, which is 100% of the total.', + purpose: ['Comparison', 'Composition', 'Proportion', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Area'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], + channel: ['Color', 'Length'], + recRate: 'Recommended', + }, + interval_area_chart: { + id: 'interval_area_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + stream_chart: { + id: 'stream_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + column_chart: { + id: 'column_chart', + name: 'Column Chart', + alias: ['Columns'], + family: ['ColumnCharts'], + def: 'A column chart uses series of columns to display the value of the dimension. The horizontal axis shows the classification dimension and the vertical axis shows the corresponding value.', + purpose: ['Comparison', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Position', 'Color'], + recRate: 'Recommended', + }, + grouped_column_chart: { + id: 'grouped_column_chart', + name: 'Grouped Column Chart', + alias: ['Grouped Column'], + family: ['ColumnCharts'], + def: 'A grouped column chart uses columns of different colors to form a group to display the values ​​of dimensions. The horizontal axis indicates the grouping of categories, the color indicates the categories, and the vertical axis shows the corresponding value.', + purpose: ['Comparison', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + stacked_column_chart: { + id: 'stacked_column_chart', + name: 'Stacked Column Chart', + alias: ['Stacked Column'], + family: ['ColumnCharts'], + def: 'A stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The horizontal axis indicates the first classification dimension, the color indicates the second classification dimension, and the vertical axis shows the corresponding value.', + purpose: ['Comparison', 'Composition', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length', 'Position'], + recRate: 'Recommended', + }, + percent_stacked_column_chart: { + id: 'percent_stacked_column_chart', + name: 'Percent Stacked Column Chart', + alias: ['Percent Stacked Column', '% Stacked Column', '100% Stacked Column'], + family: ['ColumnCharts'], + def: 'A percent stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The horizontal axis indicates the first classification dimension, the color indicates the second classification dimension, and the vertical axis shows the percentage of the corresponding classification.', + purpose: ['Comparison', 'Composition', 'Distribution', 'Proportion'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length'], + recRate: 'Recommended', + }, + interval_column_chart: { + id: 'interval_column_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + range_column_chart: { + id: 'range_column_chart', + name: 'Range Column Chart', + alias: [], + family: ['ColumnCharts'], + def: 'A column chart that does not have to start from zero axis.', + purpose: ['Comparison'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Nominal'], + }], + channel: ['Length'], + recRate: 'Recommended', + }, + waterfall_chart: { + id: 'waterfall_chart', + name: 'Waterfall Chart', + alias: ['Flying Bricks Chart', 'Mario Chart', 'Bridge Chart', 'Cascade Chart'], + family: ['ColumnCharts'], + def: 'A waterfall chart is used to portray how an initial value is affected by a series of intermediate positive or negative values', + purpose: ['Comparison', 'Trend'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal', 'Time', 'Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length', 'Position'], + recRate: 'Recommended', + }, + histogram: { + id: 'histogram', + name: 'Histogram', + alias: [], + family: ['ColumnCharts'], + def: 'A histogram is an accurate representation of the distribution of numerical data.', + purpose: ['Distribution'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], + channel: ['Position'], + recRate: 'Recommended', + }, + bar_chart: { + id: 'bar_chart', + name: 'Bar Chart', + alias: ['Bars'], + family: ['BarCharts'], + def: 'A bar chart uses series of bars to display the value of the dimension. The vertical axis shows the classification dimension and the horizontal axis shows the corresponding value.', + purpose: ['Comparison', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Position', 'Color'], + recRate: 'Recommended', + }, + grouped_bar_chart: { + id: 'grouped_bar_chart', + name: 'Grouped Bar Chart', + alias: ['Grouped Bar'], + family: ['BarCharts'], + def: 'A grouped bar chart uses bars of different colors to form a group to display the values of the dimensions. The vertical axis indicates the grouping of categories, the color indicates the categories, and the horizontal axis shows the corresponding value.', + purpose: ['Comparison', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + stacked_bar_chart: { + id: 'stacked_bar_chart', + name: 'Stacked Bar Chart', + alias: ['Stacked Bar'], + family: ['BarCharts'], + def: 'A stacked bar chart uses stacked bars of different colors to display the values ​​for each dimension. The vertical axis indicates the first classification dimension, the color indicates the second classification dimension, and the horizontal axis shows the corresponding value.', + purpose: ['Comparison', 'Composition', 'Distribution', 'Rank'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length', 'Position'], + recRate: 'Recommended', + }, + percent_stacked_bar_chart: { + id: 'percent_stacked_bar_chart', + name: 'Percent Stacked Bar Chart', + alias: ['Percent Stacked Bar', '% Stacked Bar', '100% Stacked Bar'], + family: ['BarCharts'], + def: 'A percent stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The vertical axis indicates the first classification dimension, the color indicates the second classification dimension, and the horizontal axis shows the percentage of the corresponding classification.', + purpose: ['Comparison', 'Composition', 'Distribution', 'Proportion'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length'], + recRate: 'Recommended', + }, + interval_bar_chart: { + id: 'interval_bar_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + range_bar_chart: { + id: 'range_bar_chart', + name: 'Range Bar Chart', + alias: [], + family: ['BarCharts'], + def: 'A bar chart that does not have to start from zero axis.', + purpose: ['Comparison'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Nominal'], + }], + channel: ['Length'], + recRate: 'Recommended', + }, + radial_bar_chart: { + id: 'radial_bar_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + mirror_bar_chart: { + id: 'mirror_bar_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + bullet_chart: { + id: 'bullet_chart', + name: 'Bullet Chart', + alias: [], + family: ['BarCharts'], + def: 'A bullet graph is a variation of a bar graph developed by Stephen Few. Seemingly inspired by the traditional thermometer charts and progress bars found in many dashboards, the bullet graph serves as a replacement for dashboard gauges and meters.', + purpose: ['Proportion'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Bars'], + dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Nominal'], + }], + channel: ['Position', 'Color'], + recRate: 'Recommended', + }, + pie_chart: { + id: 'pie_chart', + name: 'Pie Chart', + alias: ['Circle Chart', 'Pie'], + family: ['PieCharts'], + def: 'A pie chart is a chart that the classification and proportion of data are represented by the color and arc length (angle, area) of the sector.', + purpose: ['Comparison', 'Composition', 'Proportion'], + coord: ['Polar'], + category: ['Statistic'], + shape: ['Round'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Angle', 'Area', 'Color'], + recRate: 'Use with Caution', + }, + donut_chart: { + id: 'donut_chart', + name: 'Donut Chart', + alias: ['Donut', 'Doughnut', 'Doughnut Chart', 'Ring Chart'], + family: ['PieCharts'], + def: 'A donut chart is a variation on a Pie chart except it has a round hole in the center which makes it look like a donut.', + purpose: ['Comparison', 'Composition', 'Proportion'], + coord: ['Polar'], + category: ['Statistic'], + shape: ['Round'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['ArcLength'], + recRate: 'Recommended', + }, + nested_pie_chart: { + id: 'nested_pie_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + rose_chart: { + id: 'rose_chart', + name: 'Rose Chart', + alias: ['Nightingale Chart', 'Polar Area Chart', 'Coxcomb Chart'], + family: ['PieCharts'], + def: 'Nightingale Rose Chart is a peculiar combination of the Radar Chart and Stacked Column Chart types of data visualization.', + purpose: ['Comparison', 'Composition', 'Proportion'], + coord: ['Polar'], + category: ['Statistic'], + shape: ['Round'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Angle', 'Color', 'Length'], + recRate: 'Use with Caution', + }, + scatter_plot: { + id: 'scatter_plot', + name: 'Scatter Plot', + alias: ['Scatter Chart', 'Scatterplot'], + family: ['ScatterCharts'], + def: 'A scatter plot is a type of plot or mathematical diagram using Cartesian coordinates to display values for typically two variables for series of data.', + purpose: ['Comparison', 'Distribution'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Scatter'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { + minQty: 0, + maxQty: 1, + fieldConditions: ['Nominal'], + }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + bubble_chart: { + id: 'bubble_chart', + name: 'Bubble Chart', + alias: ['Bubble Chart'], + family: ['ScatterCharts'], + def: 'A bubble chart is a type of chart that displays four dimensions of data with x, y positions, circle size and circle color.', + purpose: ['Comparison', 'Distribution'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Scatter'], + dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }, { + minQty: 0, + maxQty: 1, + fieldConditions: ['Nominal'], + }], + channel: ['Color', 'Position', 'Size'], + recRate: 'Recommended', + }, + non_ribbon_chord_diagram: { + id: 'non_ribbon_chord_diagram', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + arc_diagram: { + id: 'arc_diagram', + name: 'Arc Diagram', + alias: [], + family: ['GeneralGraph'], + def: 'A graph where the edges are represented as arcs.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + chord_diagram: { + id: 'chord_diagram', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + treemap: { + id: 'treemap', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + sankey_diagram: { + id: 'sankey_diagram', + name: 'Sankey Diagram', + alias: [], + family: ['GeneralGraph'], + def: 'A graph shows the flows with weights between objects.', + purpose: ['Flow', 'Trend', 'Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + funnel_chart: { + id: 'funnel_chart', + name: 'Funnel Chart', + alias: [], + family: ['FunnelCharts'], + def: 'A funnel chart is often used to represent stages in a sales process and show the amount of potential revenue for each stage.', + purpose: ['Trend'], + coord: ['SymmetricCartesian'], + category: ['Statistic'], + shape: ['Symmetric'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Length'], + recRate: 'Recommended', + }, + overlapping_funnel_chart: { + id: 'overlapping_funnel_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + mirror_funnel_chart: { + id: 'mirror_funnel_chart', + name: 'Mirror Funnel Chart', + alias: ['Contrast Funnel Chart'], + family: ['FunnelCharts'], + def: 'A mirror funnel chart is a funnel chart divided into two series by a central axis.', + purpose: ['Comparison', 'Trend'], + coord: ['SymmetricCartesian'], + category: ['Statistic'], + shape: ['Symmetric'], + dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], + channel: ['Color', 'Length', 'Direction'], + recRate: 'Recommended', + }, + boxplot: { + id: 'boxplot', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + heatmap: { + id: 'heatmap', + name: 'Heatmap', + alias: [], + family: ['HeatmapCharts'], + def: 'A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors.', + purpose: ['Distribution'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Square'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal', 'Ordinal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + density_heatmap: { + id: 'density_heatmap', + name: 'Density Heatmap', + alias: ['Heatmap'], + family: ['HeatmapCharts'], + def: 'A density heatmap is a heatmap for representing the density of dots.', + purpose: ['Distribution'], + coord: ['Cartesian2D'], + category: ['Statistic'], + shape: ['Area'], + dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }], + channel: ['Color', 'Position', 'Area'], + recRate: 'Recommended', + }, + gauge_chart: { + id: 'gauge_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + radar_chart: { + id: 'radar_chart', + name: 'Radar Chart', + alias: ['Web Chart', 'Spider Chart', 'Star Chart', 'Cobweb Chart', 'Irregular Polygon', 'Kiviat diagram'], + family: ['RadarCharts'], + def: 'A radar chart maps series of data volume of multiple dimensions onto the axes. Starting at the same center point, usually ending at the edge of the circle, connecting the same set of points using lines.', + purpose: ['Comparison'], + coord: ['Radar'], + category: ['Statistic'], + shape: ['Round'], + dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { + minQty: 1, + maxQty: 1, + fieldConditions: ['Interval'], + }], + channel: ['Color', 'Position'], + recRate: 'Recommended', + }, + wordcloud: { + id: 'wordcloud', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + candlestick_chart: { + id: 'candlestick_chart', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + compact_box_tree: { + id: 'compact_box_tree', + name: 'CompactBox Tree', + alias: [], + family: ['TreeGraph'], + def: 'A type of tree graph layout which arranges the nodes with same depth on the same level.', + purpose: ['Relation', 'Hierarchy'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + dendrogram: { + id: 'dendrogram', + name: 'Dendrogram', + alias: [], + family: ['TreeGraph'], + def: 'A type of tree graph layout which arranges the leaves on the same level and ignores the node size.', + purpose: ['Relation', 'Hierarchy'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + indented_tree: { + id: 'indented_tree', + name: 'Indented Tree Layout', + alias: [], + family: ['TreeGraph'], + def: 'A type of tree graph layout where each node takes a row or a column.', + purpose: ['Relation', 'Hierarchy'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + radial_tree: { + id: 'radial_tree', + name: 'Radial Tree Layout', + alias: [], + family: ['TreeGraph'], + def: 'A type of tree graph layout which places the root at the center, and the branches around the root radially.', + purpose: ['Relation', 'Hierarchy'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + flow_diagram: { + id: 'flow_diagram', + name: 'Flow Diagram', + alias: ['Dagre Graph Layout', 'Dagre', 'Flow Chart'], + family: ['GeneralGraph'], + def: 'Directed flow graph.', + purpose: ['Relation', 'Flow'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + fruchterman_layout_graph: { + id: 'fruchterman_layout_graph', + name: 'Fruchterman Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of force directed graph layout.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + force_directed_layout_graph: { + id: 'force_directed_layout_graph', + name: 'Force Directed Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'The classical force directed graph layout.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + circular_layout_graph: { + id: 'circular_layout_graph', + name: 'Circular Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of graph layout which arranges all the nodes on a circle.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + spiral_layout_graph: { + id: 'spiral_layout_graph', + name: 'Spiral Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of graph layout which arranges all the nodes along a spiral line.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + radial_layout_graph: { + id: 'radial_layout_graph', + name: 'Radial Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of graph layout which places a focus node on the center and the others on the concentrics centered at the focus node according to the shortest path length to the it.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + concentric_layout_graph: { + id: 'concentric_layout_graph', + name: 'Concentric Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of graph layout which arranges the nodes on concentrics.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + grid_layout_graph: { + id: 'grid_layout_graph', + name: 'Grid Graph Layout', + alias: [], + family: ['GeneralGraph'], + def: 'A type of graph layout arranges the nodes on grids.', + purpose: ['Relation'], + coord: ['Cartesian2D'], + category: ['Graph'], + shape: ['Network'], + dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], + channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + symbol_map: { + id: 'symbol_map', + name: 'Symbol Map', + alias: [], + family: ['PointLayer'], + def: 'Overlay symbols on the map as glyphs.', + purpose: ['Distribution', 'Comparison', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Scatter', 'Map'], + dataPres: [], + channel: ['Position'], + recRate: 'Recommended', + }, + chart_map: { + id: 'chart_map', + name: 'Chart Map', + alias: [], + family: ['PointLayer'], + def: 'Overlay charts on the map as glyphs.', + purpose: ['Composition', 'Distribution', 'Comparison', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Map'], + dataPres: [], + channel: ['Position'], + recRate: 'Recommended', + }, + column_map_3d: { + id: 'column_map_3d', + name: '3D Column Map', + alias: [], + family: ['PointLayer'], + def: 'Maps that use height of 3D columns to represent distribution.', + purpose: ['Distribution', 'Comparison', 'Spatial'], + coord: [], + category: ['Map'], + shape: ['Map'], + dataPres: [], + channel: ['Position', 'Length'], + recRate: 'Recommended', + }, + scatter_map: { + id: 'scatter_map', + name: 'Scatter Map', + alias: [], + family: ['PointLayer'], + def: 'Overlay dots with same size on the map as glyphs.', + purpose: ['Distribution', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Scatter', 'Map'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + path_map: { + id: 'path_map', + name: 'Path Map', + alias: [], + family: ['LineLayer'], + def: 'Overlay paths on the map as glyphs.', + purpose: ['Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Lines'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + isoline_map: { + id: 'isoline_map', + name: 'Isoline Map', + alias: [], + family: ['LineLayer'], + def: '', + purpose: ['Comparison'], + coord: ['Geo'], + category: ['Map'], + shape: ['Lines'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + arc_map_3d: { + id: 'arc_map_3d', + name: '3D Arc Map', + alias: [], + family: ['LineLayer'], + def: '', + purpose: ['Relation', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Lines'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + choropleth_map: { + id: 'choropleth_map', + name: 'Choropleth Map', + alias: [], + family: ['PolygonLayer'], + def: 'A choropleth map is a type of thematic map in which areas are shaded or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income.', + purpose: ['Comparison', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Area', 'Map'], + dataPres: [], + channel: ['Color', 'Position', 'Opacity', 'Stroke', 'LineWidth'], + recRate: 'Recommended', + }, + choropleth_map_3d: { + id: 'choropleth_map_3d', + name: '3D Choropleth Map', + alias: ['Extrude Map'], + family: ['PolygonLayer'], + def: '', + purpose: ['Comparison'], + coord: ['Geo'], + category: ['Map'], + shape: ['Area', 'Map'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + hexagonal_heat_map: { + id: 'hexagonal_heat_map', + name: 'Hexagonal Heat Map', + alias: [], + family: [], + def: 'Dividing the map area using hexagons.', + purpose: ['Distribution', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Area', 'Map'], + dataPres: [], + channel: ['Size', 'Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + hexagonal_heat_map_3d: { + id: 'hexagonal_heat_map_3d', + name: '3D Hexagonal Heat Map', + alias: [], + family: [], + def: 'Dividing the 3D map area using hexagons.', + purpose: ['Distribution'], + coord: ['Geo'], + category: ['Map'], + shape: ['Map'], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + classical_heat_map: { + id: 'classical_heat_map', + name: 'Classical Heat Map', + alias: [], + family: [], + def: '', + purpose: ['Distribution'], + coord: ['Geo'], + category: ['Map'], + shape: ['Map'], + dataPres: [], + channel: ['Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + grid_heat_map: { + id: 'grid_heat_map', + name: 'Gird Heat Map', + alias: [], + family: [], + def: '', + purpose: ['Distribution'], + coord: [], + category: ['Map'], + shape: ['Map'], + dataPres: [], + channel: ['Color', 'Position', 'Opacity'], + recRate: 'Recommended', + }, + bubble_map: { + id: 'bubble_map', + name: 'Bubble Map', + alias: [], + family: ['PointLayer'], + def: 'Overlay bubbles on the map as glyphs.', + purpose: ['Distribution', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Scatter', 'Map'], + dataPres: [], + channel: ['Position', 'Color', 'Size'], + recRate: 'Recommended', + }, + bubble_light_map: { + id: 'bubble_light_map', + name: 'Bubble Light Map', + alias: [], + family: ['PointLayer'], + def: 'Overlay bubbles with different lightness on the map as glyphs.', + purpose: ['Distribution', 'Spatial'], + coord: ['Geo'], + category: ['Map'], + shape: ['Scatter', 'Map'], + dataPres: [], + channel: ['Position', 'Color', 'Size', 'Opacity'], + recRate: 'Recommended', + }, + packed_circles: { + id: 'packed_circles', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + polar_treemap: { + id: 'polar_treemap', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + sunburst_diagram: { + id: 'sunburst_diagram', + name: '', + alias: [], + family: [], + def: '', + purpose: [], + coord: [], + category: [], + shape: [], + dataPres: [], + channel: [], + recRate: 'Recommended', + }, + liquid_chart: { + id: 'liquid_chart', + name: 'Liquid Chart', + alias: ['Liquid Ball', 'Progress Ball'], + family: ['Others'], + def: 'Liquid chart is a diagram to represent progress.', + purpose: ['Composition'], + coord: ['Other'], + category: ['Diagram'], + shape: ['Round'], + dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }], + channel: ['Position'], + recRate: 'Not Recommended', + }, + }; + + function o(e, a) { + void 0 === e && (e = 'en-US'), void 0 === a && (a = !1); + var t = JSON.parse(JSON.stringify(i)), r = {}; + Object.keys(t).forEach((function(e) { + var n = t[e], i = !0; + if (a) for (var o = Object.keys(n), c = 0; c < o.length; c++) { + var s = o[c], l = n[s]; + if ('alias' !== s && 'boolean' != typeof l && (Array.isArray(l) && 0 === l.length || !l)) { + i = !1; + break; + } + } + i && (r[e] = n); + })); + var o = {}; + if (e && 'en-US' != e) { + var c = n(e), s = Object.keys(r); + c && s.forEach((function(e) { + o[e] = {}, o[e].id = e, o[e].name = c.chartTypes[e].name, o[e].alias = c.chartTypes[e].alias, o[e].def = c.chartTypes[e].def, o[e].family = r[e].family.map((function(e) { + return c.concepts.family[e]; + })), o[e].purpose = r[e].purpose.map((function(e) { + return c.concepts.purpose[e]; + })), o[e].coord = r[e].coord.map((function(e) { + return c.concepts.coord[e]; + })), o[e].category = r[e].category.map((function(e) { + return c.concepts.category[e]; + })), o[e].shape = r[e].shape.map((function(e) { + return c.concepts.shape[e]; + })), o[e].channel = r[e].channel.map((function(e) { + return c.concepts.channel[e]; + })), o[e].dataPres = r[e].dataPres.map((function(e) { + var a = {}; + return a.minQty = e.minQty, a.maxQty = e.maxQty, a.fieldConditions = e.fieldConditions.map((function(e) { + return c.concepts.lom[e]; + })), a; + })); + })); + } else o = r; + return o; + } + + function c(e, a) { + var t = e.id; + i[t] = e, Object.keys(a).forEach((function(e) { + var n = r[e]; + n && (n.chartTypes[t] = a[e]); + })); + } + + var s = t(0), + l = ['LineCharts', 'ColumnCharts', 'BarCharts', 'PieCharts', 'AreaCharts', 'ScatterCharts', 'FunnelCharts', 'HeatmapCharts', 'RadarCharts', 'TreeGraph', 'GeneralGraph', 'PolygonLayer', 'LineLayer', 'PointLayer', 'HeatmapLayer', 'Others'], + d = ['Comparison', 'Trend', 'Distribution', 'Rank', 'Proportion', 'Composition', 'Relation', 'Hierarchy', 'Flow', 'Spatial'], + u = ['NumberLine', 'Cartesian2D', 'SymmetricCartesian', 'Cartesian3D', 'Polar', 'NodeLink', 'Radar', 'Geo', 'Other'], + m = ['Statistic', 'Diagram', 'Graph', 'Map'], + h = ['Lines', 'Bars', 'Round', 'Square', 'Area', 'Scatter', 'Symmetric', 'Network', 'Map'], + p = ['Nominal', 'Ordinal', 'Interval', 'Discrete', 'Continuous', 'Time'], + f = ['Position', 'Length', 'Color', 'Area', 'Angle', 'ArcLength', 'Direction', 'Size', 'Opacity', 'Stroke', 'LineWidth', 'Lightness'], + y = ['Recommended', 'Use with Caution', 'Not Recommended']; + + function _(e) { + if (void 0 === e && (e = 'en-US'), e && 'en-US' != e) { + var a = n(e); + if (a && a.concepts) { + var t = a.concepts; + return { + family: Object.values(t.family), + category: Object.values(t.category), + purpose: Object.values(t.purpose), + coord: Object.values(t.coord), + shape: Object.values(t.shape), + channel: Object.values(t.channel), + lom: Object.values(t.lom), + recRate: Object.values(t.recRate), + }; + } + } + return { + family: Object(s.c)(l), + category: Object(s.c)(m), + purpose: Object(s.c)(d), + coord: Object(s.c)(u), + shape: Object(s.c)(h), + channel: Object(s.c)(f), + lom: Object(s.c)(p), + recRate: Object(s.c)(y), + }; + } + + var g = ['line_chart', 'step_line_chart', 'area_chart', 'stacked_area_chart', 'percent_stacked_area_chart', 'interval_area_chart', 'stream_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart', 'interval_column_chart', 'range_column_chart', 'waterfall_chart', 'histogram', 'bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'grouped_bar_chart', 'interval_bar_chart', 'range_bar_chart', 'radial_bar_chart', 'mirror_bar_chart', 'bullet_chart', 'pie_chart', 'donut_chart', 'nested_pie_chart', 'rose_chart', 'scatter_plot', 'bubble_chart', 'non_ribbon_chord_diagram', 'arc_diagram', 'chord_diagram', 'treemap', 'sankey_diagram', 'funnel_chart', 'overlapping_funnel_chart', 'mirror_funnel_chart', 'boxplot', 'heatmap', 'density_heatmap', 'gauge_chart', 'radar_chart', 'wordcloud', 'candlestick_chart', 'compact_box_tree', 'dendrogram', 'indented_tree', 'radial_tree', 'flow_diagram', 'fruchterman_layout_graph', 'force_directed_layout_graph', 'circular_layout_graph', 'spiral_layout_graph', 'radial_layout_graph', 'concentric_layout_graph', 'grid_layout_graph', 'symbol_map', 'chart_map', 'column_map_3d', 'scatter_map', 'path_map', 'isoline_map', 'arc_map_3d', 'choropleth_map', 'choropleth_map_3d', 'hexagonal_heat_map', 'hexagonal_heat_map_3d', 'classical_heat_map', 'grid_heat_map', 'bubble_map', 'bubble_light_map', 'packed_circles', 'polar_treemap', 'sunburst_diagram', 'liquid_chart']; + }, function(e, a, t) { + 'use strict'; + var r = t(4); + window.analyze = r.analyze; + }, function(e, a, t) { + 'use strict'; + + function r(e) { + return (r = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + + Object.defineProperty(a, '__esModule', { value: !0 }), a.dataToDataProps = C, a.dataPropsToSpecs = x, a.analyze = function(e, a) { + console.log('💠💠💠💠💠💠 data 💠💠💠💠💠💠'), console.log(e), console.log('🍯🍯🍯🍯🍯🍯 options 🍯🍯🍯🍯🍯🍯'), console.log(a); + var t = C(e); + return console.log('🔶🔶🔶🔶🔶🔶 dataset analysis 🔶🔶🔶🔶🔶🔶'), console.log(t), x(t, a); + }, a.specToLibConfig = function(e, a) { + var t = (0, l.getMappingForLib)(a), r = t.typeMapping, n = t.configMapping, i = e.type, o = e.channels, c = {}; + i && r[i] && (c.type = r[i]); + for (var s = {}, d = 0, u = Object.entries(o); d < u.length; d++) { + var h = (g = u[d], b = 2, function(e) { + if (Array.isArray(e)) return e; + }(g) || function(e, a) { + if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) return; + var t = [], r = !0, n = !1, i = void 0; + try { + for (var o, c = e[Symbol.iterator](); !(r = (o = c.next()).done) && (t.push(o.value), !a || t.length !== a); r = !0) ; + } catch (e) { + n = !0, i = e; + } finally { + try { + r || null == c.return || c.return(); + } finally { + if (n) throw i; + } + } + return t; + }(g, b) || m(g, b) || function() { + throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }()), p = h[0], f = h[1], y = n[i]; + if (y) { + var _ = y[p]; + _ && (s[_] = f); + } + } + var g, b; + return c.configs = s, c; + }; + var n, i = t(2), o = (n = t(5)) && n.__esModule ? n : { default: n }, c = function(e) { + if (e && e.__esModule) return e; + if (null === e || 'object' !== r(e) && 'function' != typeof e) return { default: e }; + var a = d(); + if (a && a.has(e)) return a.get(e); + var t = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) if (Object.prototype.hasOwnProperty.call(e, i)) { + var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; + o && (o.get || o.set) ? Object.defineProperty(t, i, o) : t[i] = e[i]; + } + t.default = e, a && a.set(e, t); + return t; + }(t(11)), s = t(7), l = t(9); + + function d() { + if ('function' != typeof WeakMap) return null; + var e = new WeakMap; + return d = function() { + return e; + }, e; + } + + function u(e) { + return function(e) { + if (Array.isArray(e)) return h(e); + }(e) || function(e) { + if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e); + }(e) || m(e) || function() { + throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + }(); + } + + function m(e, a) { + if (e) { + if ('string' == typeof e) return h(e, a); + var t = Object.prototype.toString.call(e).slice(8, -1); + return 'Object' === t && e.constructor && (t = e.constructor.name), 'Map' === t || 'Set' === t ? Array.from(e) : 'Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? h(e, a) : void 0; + } + } + + function h(e, a) { + (null == a || a > e.length) && (a = e.length); + for (var t = 0, r = new Array(a); t < a; t++) r[t] = e[t]; + return r; + } + + function p(e, a) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(e); + a && (r = r.filter((function(a) { + return Object.getOwnPropertyDescriptor(e, a).enumerable; + }))), t.push.apply(t, r); + } + return t; + } + + function f(e) { + for (var a = 1; a < arguments.length; a++) { + var t = null != arguments[a] ? arguments[a] : {}; + a % 2 ? p(Object(t), !0).forEach((function(a) { + y(e, a, t[a]); + })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : p(Object(t)).forEach((function(a) { + Object.defineProperty(e, a, Object.getOwnPropertyDescriptor(t, a)); + })); + } + return e; + } + + function y(e, a, t) { + return a in e ? Object.defineProperty(e, a, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0, + }) : e[a] = t, e; + } + + var _ = (0, i.CKBJson)('en-US', !0); + + function g(e, a) { + return e.distinct < a.distinct ? 1 : e.distinct > a.distinct ? -1 : 0; + } + + function b(e, a) { + return a.every((function(a) { + return e.includes(a); + })); + } + + function v(e, a) { + return a.some((function(a) { + return e.includes(a); + })); + } + + function C(e) { + var a = c.typeAll(e), t = []; + return a.forEach((function(e) { + var a = []; + c.isNominal(e) && a.push('Nominal'), c.isOrdinal(e) && a.push('Ordinal'), c.isInterval(e) && a.push('Interval'), c.isDiscrete(e) && a.push('Discrete'), c.isContinuous(e) && a.push('Continuous'), c.isTime(e) && a.push('Time'); + var r = f(f({}, e), {}, { levelOfMeasurements: a }); + t.push(r); + })), t; + } + + function x(e, a) { + var t = a ? a.purpose : '', r = a ? a.preferences : void 0; + var n = Object.keys(_).map((function(a) { + var n = 0, i = {}, s = 1; + o.default.filter((function(e) { + return 'HARD' === e.hardOrSoft && e.specChartTypes.includes(a); + })).forEach((function(n) { + var o = n.check({ dataProps: e, chartType: a, purpose: t, preferences: r }); + s *= o, i[n.id] = o; + })); + var l = 0; + o.default.filter((function(e) { + return 'SOFT' === e.hardOrSoft && e.specChartTypes.includes(a); + })).forEach((function(n) { + var o = n.check({ dataProps: e, chartType: a, purpose: t, preferences: r }); + l += o, i[n.id] = o; + })), n = s * (1 + l), console.log('💯score: ', n, '=', s, '* (1 +', l, ') ;charttype: ', a), console.log(i); + var d = {}; + if ('pie_chart' === a || 'donut_chart' === a) { + var m = e.find((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })), h = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + h && m ? (d.color = m.name, d.angle = h.name) : n = 0; + } + if ('line_chart' === a || 'step_line_chart' == a) { + var p = e.find((function(e) { + return v(e.levelOfMeasurements, ['Time', 'Ordinal']); + })), f = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })), y = e.find((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })); + y && (d.color = y.name), p && f ? (d.x = p.name, d.y = f.name) : n = 0; + } + if ('area_chart' === a) { + var _ = e.find((function(e) { + return v(e.levelOfMeasurements, ['Time', 'Ordinal']); + })), C = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + _ && C ? (d.x = _.name, d.y = C.name) : n = 0; + } + if ('bar_chart' === a) { + var x = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })).sort(g), P = x[0], O = x[1], S = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + S && P ? (d.y = P.name, d.x = S.name, O && (d.color = O.name)) : n = 0; + } + if ('column_chart' === a) { + var R = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })).sort(g), k = R[0], w = R[1], Q = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + k && Q ? (d.y = Q.name, d.x = k.name, w && (d.color = w.name)) : n = 0; + } + if ('grouped_bar_chart' === a || 'stacked_bar_chart' === a || 'percent_stacked_bar_chart' === a) { + var D = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })).sort(g), M = D[0], T = D[1], A = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + M && T && A ? (d.y = M.name, d.y2 = T.name, d.x = A.name) : n = 0; + } + if ('grouped_column_chart' === a || 'stacked_column_chart' === a || 'percent_stacked_column_chart' === a) { + var N = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })).sort(g), L = N[0], F = N[1], G = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + L && F && G ? (d.x = L.name, d.x2 = F.name, d.y = G.name) : n = 0; + } + if ('stacked_area_chart' === a || 'percent_stacked_area_chart' === a) { + var j = e.find((function(e) { + return v(e.levelOfMeasurements, ['Time', 'Ordinal']); + })), I = e.find((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })), B = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + j && I && B ? (d.x = j.name, d.x2 = I.name, d.y = B.name) : n = 0; + } + if ('radar_chart' === a) { + var z = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })).sort(g), E = z[0], H = z[1], W = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + E && H && W ? (d.angle = E.name, d.series = H.name, d.radius = W.name) : n = 0; + } + if ('scatter_plot' === a) { + var U = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })).sort(g), q = U[0], Y = U[1], $ = e.find((function(e) { + return b(e.levelOfMeasurements, ['Nominal']); + })); + q && Y ? (d.x = q.name, d.y = Y.name, $ && (d.color = $.name)) : n = 0; + } + if ('bubble_chart' === a) { + for (var K = e.filter((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })), J = { x: K[0], y: K[1], corr: 0, size: K[2] }, X = function(e) { + for (var a = function(a) { + var t = c.pearson(K[e], K[a]); + Math.abs(t) > J.corr && (J.x = K[e], J.y = K[a], J.corr = t, J.size = K[u(Array(K.length).keys()).find((function(t) { + return t !== e && t !== a; + })) || 0]); + }, t = e + 1; t < K.length; t++) a(t); + }, Z = 0; Z < K.length; Z++) X(Z); + var V = J.x, ee = J.y, ae = J.size, te = e.find((function(e) { + return v(e.levelOfMeasurements, ['Nominal']); + })); + V && ee && ae && te ? (d.x = V.name, d.y = ee.name, d.size = ae.name, d.color = te.name) : n = 0; + } + if ('histogram' === a) { + var re = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + re ? d.x = re.name : n = 0; + } + if ('heatmap' === a) { + var ne = e.filter((function(e) { + return v(e.levelOfMeasurements, ['Nominal', 'Ordinal']); + })).sort(g), ie = ne[0], oe = ne[1], ce = e.find((function(e) { + return b(e.levelOfMeasurements, ['Interval']); + })); + ie && oe && ce ? (d.x = ie.name, d.y = oe.name, d.color = ce.name) : n = 0; + } + return { type: a, channels: d, score: n }; + })).filter((function(e) { + return e.score && 0 !== e.score && (0, s.translate)(e.type); + })).sort((function(e, a) { + return e.score < a.score ? 1 : e.score > a.score ? -1 : 0; + })); + return console.log('🍒🍒🍒🍒🍒🍒 resultList 🍒🍒🍒🍒🍒🍒'), console.log(n), n; + } + }, function(e, a, t) { + 'use strict'; + + function r(e) { + return (r = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(e) { + return typeof e; + } : function(e) { + return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; + })(e); + } + + Object.defineProperty(a, '__esModule', { value: !0 }), Object.defineProperty(a, 'Rule', { + enumerable: !0, + get: function() { + return i.default; + }, + }), Object.defineProperty(a, 'Preferences', { + enumerable: !0, get: function() { + return i.Preferences; + }, + }), a.default = void 0; + var n, i = function(e) { + if (e && e.__esModule) return e; + if (null === e || 'object' !== r(e) && 'function' != typeof e) return { default: e }; + var a = o(); + if (a && a.has(e)) return a.get(e); + var t = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; + for (var i in e) if (Object.prototype.hasOwnProperty.call(e, i)) { + var c = n ? Object.getOwnPropertyDescriptor(e, i) : null; + c && (c.get || c.set) ? Object.defineProperty(t, i, c) : t[i] = e[i]; + } + t.default = e, a && a.set(e, t); + return t; + }(t(1)); + + function o() { + if ('function' != typeof WeakMap) return null; + var e = new WeakMap; + return o = function() { + return e; + }, e; + } + + var c = ((n = t(6)) && n.__esModule ? n : { default: n }).default; + a.default = c; + }, function(e, a, t) { + 'use strict'; + Object.defineProperty(a, '__esModule', { value: !0 }), a.default = void 0; + var r, n = (r = t(1)) && r.__esModule ? r : { default: r }; + + function i(e) { + if ('undefined' == typeof Symbol || null == e[Symbol.iterator]) { + if (Array.isArray(e) || (e = function(e, a) { + if (!e) return; + if ('string' == typeof e) return o(e, a); + var t = Object.prototype.toString.call(e).slice(8, -1); + 'Object' === t && e.constructor && (t = e.constructor.name); + if ('Map' === t || 'Set' === t) return Array.from(e); + if ('Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)) return o(e, a); + }(e))) { + var a = 0, t = function() { + }; + return { + s: t, n: function() { + return a >= e.length ? { done: !0 } : { done: !1, value: e[a++] }; + }, e: function(e) { + throw e; + }, f: t, + }; + } + throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); + } + var r, n, i = !0, c = !1; + return { + s: function() { + r = e[Symbol.iterator](); + }, n: function() { + var e = r.next(); + return i = e.done, e; + }, e: function(e) { + c = !0, n = e; + }, f: function() { + try { + i || null == r.return || r.return(); + } finally { + if (c) throw n; + } + }, + }; + } + + function o(e, a) { + (null == a || a > e.length) && (a = e.length); + for (var t = 0, r = new Array(a); t < a; t++) r[t] = e[t]; + return r; + } + + var c = (0, t(2).CKBJson)('en-US', !0), s = Object.keys(c); + + function l(e, a) { + return e.distinct < a.distinct ? 1 : e.distinct > a.distinct ? -1 : 0; + } + + function d(e, a) { + return a.every((function(a) { + return e.includes(a); + })); + } + + function u(e, a) { + return a.some((function(a) { + return e.includes(a); + })); + } + + function m(e, a) { + var t = a.map((function(e) { + return e.levelOfMeasurements; + })); + if (t) { + var r, n = 0, o = i(t); + try { + for (o.s(); !(r = o.n()).done;) { + var c = r.value; + c && u(c, e.fieldConditions) && (n += 1); + } + } catch (e) { + o.e(e); + } finally { + o.f(); + } + if (n >= e.minQty && (n <= e.maxQty || '*' === e.maxQty)) return !0; + } + return !1; + } + + var h = [new n.default('data-check', 'HARD', s, 1, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && r && c[r]) { + a = 1; + var n, o = i(c[r].dataPres || []); + try { + for (o.s(); !(n = o.n()).done;) { + if (!m(n.value, t)) return a = 0; + } + } catch (e) { + o.e(e); + } finally { + o.f(); + } + } + return a; + })), new n.default('data-field-qty', 'HARD', s, 1, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && r && c[r]) { + a = 1; + var n = (c[r].dataPres || []).map((function(e) { + return e.minQty; + })).reduce((function(e, a) { + return e + a; + })); + if (t.length) t.length >= n && (a = 1); + } + return a; + })), new n.default('no-redundant-field', 'HARD', s, 1, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && r && c[r]) { + var n = (c[r].dataPres || []).map((function(e) { + return '*' === e.maxQty ? 99 : e.maxQty; + })).reduce((function(e, a) { + return e + a; + })); + if (t.length) t.length <= n && (a = 1); + } + return a; + })), new n.default('purpose-check', 'HARD', s, 1, (function(e) { + var a = 0, t = e.chartType, r = e.purpose; + if (!r) return a = 1; + if (t && c[t] && r && (c[t].purpose || '').includes(r)) return a = 1; + return a; + })), new n.default('series-qty-limit', 'SOFT', ['pie_chart', 'donut_chart', 'radar_chart', 'rose_chart'], .8, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType, n = 6; + if ('pie_chart' !== r && 'donut_chart' !== r && 'rose_chart' !== r || (n = 6), 'radar_chart' === r && (n = 8), t) { + var i = t.find((function(e) { + return d(e.levelOfMeasurements, ['Nominal']); + })), o = i && i.count ? i.count : 0; + o >= 2 && o <= n && (a = 2 / o); + } + return a; + })), new n.default('bar-series-qty', 'SOFT', ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'], .5, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && r) { + var n = t.find((function(e) { + return d(e.levelOfMeasurements, ['Nominal']); + })), i = n && n.count ? n.count : 0; + i >= 2 && i <= 20 ? a = 1 : i > 20 && (a = 20 / i); + } + return a; + })), new n.default('line-field-time-ordinal', 'SOFT', ['line_chart', 'area_chart', 'stacked_area_chart', 'percent_stacked_area_chart'], 1, (function(e) { + var a = 0, t = e.dataProps; + t && (t.find((function(e) { + return u(e.levelOfMeasurements, ['Ordinal', 'Time']); + })) && (a = 1)); + return a; + })), new n.default('landscape-or-portrait', 'SOFT', ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'], .3, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType, n = e.preferences; + return t && r && n && n.canvasLayout && ('portrait' === n.canvasLayout && ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart'].includes(r) || 'landscape' === n.canvasLayout && ['column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'].includes(r)) && (a = 1), a; + })), new n.default('diff-pie-sector', 'SOFT', ['pie_chart', 'donut_chart'], .5, (function(e) { + var a = 0, t = e.dataProps; + if (t) { + var r = t.find((function(e) { + return d(e.levelOfMeasurements, ['Interval']); + })); + if (r && r.sum && r.samples) { + var n = 1 / r.sum, i = r.samples.map((function(e) { + return e * n; + })).reduce((function(e, a) { + return e * a; + })), o = r.samples.length, c = Math.pow(1 / o, o); + a = Math.abs(c - Math.abs(i)) / c; + } + } + return a; + })), new n.default('nominal-enum-combinatorial', 'SOFT', s, 1, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && s) { + var n = t.filter((function(e) { + return d(e.levelOfMeasurements, ['Nominal']); + })); + if (n.length >= 2) { + var i = n.sort(l), o = i[0], c = i[1]; + if (o.distinct === o.count && ['bar_chart', 'column_chart'].includes(r) && (a = 1), o.count && o.distinct && c.distinct && o.count >= o.distinct * c.distinct) { + ['grouped_bar_chart', 'grouped_column_chart', 'stacked_bar_chart', 'stacked_column_chart'].includes(r) && (a = 1); + } + } + } + return a; + })), new n.default('limit-series', 'SOFT', s, 1, (function(e) { + var a = 0, t = e.dataProps, r = e.chartType; + if (t && s) { + var n = t.filter((function(e) { + return u(e.levelOfMeasurements, ['Nominal', 'Ordinal']); + })); + if (n.length >= 2) { + var i = n.sort(l)[1]; + i.distinct && (a = 1 / i.distinct, i.distinct > 6 && 'heatmap' === r ? a = 2 : 'heatmap' === r && (a = 0)); + } + } + return a; + }))]; + a.default = h; + }, function(e, a, t) { + 'use strict'; + Object.defineProperty(a, '__esModule', { value: !0 }), a.uuid = function() { + return ''.concat('xxxx-xxxx-xxxx'.replace(/x/g, (function() { + return (16 * Math.random() | 0).toString(16); + }))); + }, a.getElementDispay = function(e) { + return getComputedStyle(e, null).display; + }, a.getPosition = function(e) { + var a = e.getBoundingClientRect(), t = a.top, r = a.left; + return { top: t + window.scrollY, left: r + window.scrollX }; + }, a.translate = function(e) { + return { + line_chart: 'Line', + step_line_chart: 'StepLine', + area_chart: 'Area', + stacked_area_chart: 'StackArea', + percent_stacked_area_chart: 'PercentageStackArea', + column_chart: 'Column', + grouped_column_chart: 'GroupColumn', + stacked_column_chart: 'StackColumn', + percent_stacked_column_chart: 'PercentageStackColumn', + bar_chart: 'Bar', + grouped_bar_chart: 'GroupBar', + stacked_bar_chart: 'StackBar', + percent_stacked_bar_chart: 'PercentageStackBar', + histogram: 'Histogram', + pie_chart: 'Pie', + donut_chart: 'Ring', + rose_chart: 'Rose', + scatter_plot: 'Scatter', + bubble_chart: 'Bubble', + radar_chart: 'Radar', + heatmap: 'Matrix', + }[e] || e; + }, a.createLayer = function(e) { + ['relative', 'absolute', 'fixed'].includes(getComputedStyle(e).position) || (e.style.position = 'relative'); + var a = document.createElement('div'); + return a.style.height = '100%', a.style.width = '100%', a.style.position = 'absolute', a.style.top = '0px', a.style.left = '0px', a.style.pointerEvents = 'none', e.appendChild(a), a; + }, a.DEFAULT_FEEDBACK = function(e) { + return function(a) { + var t = document.createElement('div'); + t.className = ''.concat(r.CLASS_PREFIX, 'no_data_content'), t.innerHTML = '\n
\n \n
\n
'.concat(e, '
\n '), a.appendChild(t); + }; + }; + var r = t(8); + }, function(e, a, t) { + 'use strict'; + Object.defineProperty(a, '__esModule', { value: !0 }), a.CLASS_PREFIX = void 0; + var r = '__AUTO_CHART__'; + a.CLASS_PREFIX = r; + var n = '\n .'.concat(r, 'toolbar {\n position: absolute;\n bottom: 0px;\n left: 0px;\n z-index: 10;\n display: none;\n box-sizing: border-box;\n }\n .').concat(r, 'toolbar * {\n box-sizing: border-box;\n }\n .').concat(r, 'advice_container {\n width: 290px;\n display: none;\n padding: 0 16px;\n background: #454857;\n position: absolute;\n bottom: 100%;\n left: 0;\n max-height: 195px;\n overflow: auto;\n }\n .').concat(r, 'advice {\n height: 65px;\n font-size: 12px;\n color: #FFFFFF;\n display: flex;\n padding: 9px 0;\n cursor: pointer;\n border-bottom: 1px solid #D8D8D8;\n }\n .').concat(r, 'advice img {\n height: 46px;\n width: 46px;\n background: #fff;\n }\n .').concat(r, 'advice * {\n pointer-events: none;\n line-height: 46px;\n font-size: 14px;\n }\n .').concat(r, 'advice>div:nth-child(1) {\n width: 46px;\n }\n .').concat(r, 'advice>div:nth-child(2) {\n width: 46px;\n }\n .').concat(r, 'advice>div:nth-child(3) {\n margin-left: 8px;\n flex-grow: 1;\n }\n .').concat(r, 'advice>div:nth-child(3) div {\n line-height: 23px;\n text-align: right;\n }\n .').concat(r, 'advice:last-child{\n border: none;\n }\n .').concat(r, 'chart_type_btn {\n height: 24px;\n width: 24px;\n text-align: center;\n display: inline-block;\n padding: 6px;\n background: #454857;\n color: #fff;\n cursor: pointer;\n }\n .').concat(r, 'chart_type_btn img {\n pointer-events: none;\n height: 12px;\n width: 12px;\n vertical-align: top;\n }\n .').concat(r, 'dev_btn {\n height: 27px;\n line-height: 27px;\n background: #454857;\n padding: 0 7px;\n color: #fff;\n display: none;\n position: absolute;\n bottom: 0;\n right: 0;\n user-select: none;\n cursor: pointer;\n }\n .').concat(r, 'dev_panel {\n border-radius: 5px;\n overflow: hidden;\n box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.25);\n box-sizing: border-box;\n position: absolute;\n background: #fff;\n z-index: 1000;\n display: none;\n }\n .').concat(r, 'dev_panel header {\n box-sizing: border-box;\n height: ').concat(32, 'px;\n width: 100%;\n padding-left: 16px;\n line-height: ').concat(32, 'px;\n cursor: move; \n color: #fff;\n position: relative;\n z-index: 1;\n background-color: #454857;\n box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.45);\n }\n .').concat(r, 'dev_panel_close {\n margin: 8px;\n height: 16px;\n width: 16px;\n border-radius: 50%;\n background: #fff;\n text-align: center;\n color: #454857;\n font-size: 14px;\n line-height: 14px;\n cursor: pointer;\n float: right;\n }\n .').concat(r, 'dev_panel_content {\n width: 100%;\n height: calc(100% - ').concat(32, 'px);\n }\n .').concat(r, 'dev_panel_content iframe {\n height: 100%;\n width: 100%;\n border: none;\n }\n .').concat(r, 'dev_panel_mask {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n }\n .').concat(r, 'no_data_content, .').concat(r, 'mock_guide {\n color: #aaa;\n text-align: center;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n .').concat(r, 'mock_guide_button {\n margin-top: 22px;\n border-radius: 3px;\n height: 30px;\n width: 116px;\n font-size: 14px;\n display: inline-block;\n line-height: 30px;\n background: #454859;\n color: #fff;\n cursor: pointer;\n }\n \n'), + i = document.createElement('style'); + i.textContent = n, document.head.prepend(i); + }, function(e, a, t) { + 'use strict'; + Object.defineProperty(a, '__esModule', { value: !0 }), a.getMappingForLib = function(e) { + return { typeMapping: n[e], configMapping: i[e] }; + }; + var r = t(10), n = { G2Plot: r.G2PLOT_TYPE_MAPPING, antdCharts: r.G2PLOT_TYPE_MAPPING }, + i = { G2Plot: r.G2PLOT_CONFIG_MAPPING, antdCharts: r.G2PLOT_CONFIG_MAPPING }; + }, function(e, a, t) { + 'use strict'; + Object.defineProperty(a, '__esModule', { value: !0 }), a.G2PLOT_TYPE_MAPPING = a.G2PLOT_CONFIG_MAPPING = void 0; + a.G2PLOT_CONFIG_MAPPING = { + line_chart: { x: 'xField', y: 'yField', color: 'seriesField' }, + area_chart: { x: 'xField', y: 'yField' }, + bar_chart: { x: 'xField', y: 'yField', color: 'colorField' }, + column_chart: { x: 'xField', y: 'yField', color: 'colorField' }, + pie_chart: { angle: 'angleField', color: 'colorField' }, + donut_chart: { angle: 'angleField', color: 'colorField' }, + grouped_bar_chart: { y: 'yField', y2: 'groupField', x: 'xField' }, + stacked_bar_chart: { y: 'yField', y2: 'stackField', x: 'xField' }, + percent_stacked_bar_chart: { y: 'yField', y2: 'stackField', x: 'xField' }, + grouped_column_chart: { x: 'xField', x2: 'groupField', y: 'yField' }, + stacked_column_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, + percent_stacked_column_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, + stacked_area_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, + percent_stacked_area_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, + radar_chart: { angle: 'angleField', radius: 'radiusField', series: 'seriesField' }, + scatter_plot: { x: 'xField', y: 'yField', color: 'colorField' }, + bubble_chart: { x: 'xField', y: 'yField', size: 'sizeField', color: 'colorField' }, + heatmap: { x: 'xField', y: 'yField', color: 'colorField', size: 'sizeField' }, + density_heatmap: { x: 'xField', y: 'yField', color: 'colorField' }, + step_line_chart: { x: 'xField', y: 'yField', color: 'seriesField' }, + funnel_chart: { x: 'xField', y: 'yField' }, + waterfall_chart: { x: 'xField', y: 'yField' }, + mirror_funnel_chart: { x: 'xField', y: 'yField', x2: 'compareField' }, + histogram: { x: 'binField' }, + }; + a.G2PLOT_TYPE_MAPPING = { + line_chart: 'Line', + step_line_chart: 'StepLine', + area_chart: 'Area', + stacked_area_chart: 'StackedArea', + percent_stacked_area_chart: 'PercentageStackedArea', + column_chart: 'Column', + grouped_column_chart: 'GroupedColumn', + stacked_column_chart: 'StackedColumn', + percent_stacked_column_chart: 'PercentageStackedColumn', + bar_chart: 'Bar', + grouped_bar_chart: 'GroupedBar', + stacked_bar_chart: 'StackedBar', + percent_stacked_bar_chart: 'PercentageStackedBar', + histogram: 'Histogram', + pie_chart: 'Pie', + donut_chart: 'Donut', + rose_chart: 'Rose', + scatter_plot: 'Scatter', + bubble_chart: 'Bubble', + radar_chart: 'Radar', + heatmap: 'Heatmap', + }; + }, function(e, a, t) { + 'use strict'; + t.r(a), t.d(a, 'type', (function() { + return j; + })), t.d(a, 'typeAll', (function() { + return I; + })), t.d(a, 'isOrdinal', (function() { + return B; + })), t.d(a, 'isConst', (function() { + return z; + })), t.d(a, 'isUnique', (function() { + return E; + })), t.d(a, 'isDiscrete', (function() { + return H; + })), t.d(a, 'isContinuous', (function() { + return W; + })), t.d(a, 'isInterval', (function() { + return U; + })), t.d(a, 'isNominal', (function() { + return q; + })), t.d(a, 'isTime', (function() { + return Y; + })), t.d(a, 'pearson', (function() { + return $; + })); + var r = t(0), n = '([-_./\\s])', i = '\\d{2,4}', o = '(0?[1-9]|1[012])', c = '(0?[1-9]|[12]\\d|3[01])', + s = '(0?\\d|1\\d|2[0-4])', l = '(0?\\d|[012345]\\d)', d = '(Z|[+-]' + s + '(:' + l + ')?)', + u = ['' + i + n + '?W([0-4]\\d|5[0-2])(' + n + '?([1-7]))?', '' + o + n + '?' + c + n + '?' + i, '' + i + n + '?' + o + n + '?' + c, '' + i + n + o, '' + i + n + '?((([0-2]\\d|3[0-5])\\d)|36[0-6])'], + m = [s + ':?' + l + ':?(0?\\d|[012345]\\d)([.,]\\d{1,4})?' + d + '?', s + ':?' + l + '?' + d], + h = Object(r.c)(u, m); + u.forEach((function(e) { + m.forEach((function(a) { + h.push(e + '[T\\s]' + a); + })); + })); + var p = h.map((function(e) { + return new RegExp('^' + e + '$'); + })); + var f = [/^(19|20)\d{2}$/, /^\d{4}(0?[1-9]|1[012])$/, /^\d{4}(0?[1-9]|1[012])(0?[1-9]|[12]\d|3[01])$/]; + + function y(e, a) { + if (e) throw new Error(a); + } + + function _(e) { + return null == e || '' === e || Number.isNaN(e) || 'null' === e; + } + + function g(e) { + return 'number' == typeof e ? Number.isInteger(e) : !('string' != typeof e || !C(e)) && !e.includes('.'); + } + + function b(e) { + return 'number' == typeof e ? !Number.isNaN(e) && !Number.isInteger(e) : !('string' != typeof e || !C(e)) && e.includes('.'); + } + + function v(e) { + return !(!e || Object.getPrototypeOf(e) !== Date.prototype) || 'string' == typeof e && function(e) { + var a, t; + try { + for (var n = Object(r.d)(p), i = n.next(); !i.done; i = n.next()) { + if (i.value.test(e.trim())) return !0; + } + } catch (e) { + a = { error: e }; + } finally { + try { + i && !i.done && (t = n.return) && t.call(n); + } finally { + if (a) throw a.error; + } + } + return !1; + }(e); + } + + function C(e) { + var a, t, n = !1; + /^[+-]/.test(e) && (e = e.slice(1)); + try { + for (var i = Object(r.d)(e), o = i.next(); !o.done; o = i.next()) { + var c = o.value; + if ('.' === c) { + if (!1 === n) { + n = !0; + continue; + } + return !1; + } + if (!/[0-9]/.test(c)) return !1; + } + } catch (e) { + a = { error: e }; + } finally { + try { + o && !o.done && (t = i.return) && t.call(i); + } finally { + if (a) throw a.error; + } + } + return '' !== e.trim(); + } + + var x = new WeakMap; + + function P(e, a, t) { + return x.get(e) || x.set(e, new Map), x.get(e).set(a, t), t; + } + + function O(e, a) { + var t = x.get(e); + if (t) return t.get(a); + } + + function S(e) { + var a = O(e, 'min'); + return void 0 !== a ? a : P(e, 'min', Math.min.apply(Math, Object(r.c)(e))); + } + + function R(e) { + var a = O(e, 'max'); + return void 0 !== a ? a : P(e, 'max', Math.max.apply(Math, Object(r.c)(e))); + } + + function k(e) { + var a = O(e, 'minIndex'); + return void 0 !== a ? a : P(e, 'minIndex', function(e) { + var a = e[0], t = 0; + for (var r in e) e[r] < a && (t = Number(r), a = e[r]); + return t; + }(e)); + } + + function w(e) { + var a = O(e, 'maxIndex'); + return void 0 !== a ? a : P(e, 'maxIndex', function(e) { + var a = e[0], t = 0; + for (var r in e) e[r] > a && (t = Number(r), a = e[r]); + return t; + }(e)); + } + + function Q(e) { + var a = O(e, 'sum'); + return void 0 !== a ? a : P(e, 'sum', e.reduce((function(e, a) { + return a + e; + }), 0)); + } + + function D(e) { + var a = {}; + return e.forEach((function(e) { + a[e] ? a[e] += 1 : a[e] = 1; + })), a; + } + + function M(e) { + return e.sort((function(e, a) { + return e > a ? 1 : -1; + })); + } + + function T(e, a, t) { + return void 0 === t && (t = !1), y(a <= 0 || a >= 100, 'percent cannot be between (0, 100)'), (t ? e : M(e))[Math.ceil(e.length * a / 100) - 1]; + } + + function A(e) { + return Q(e) / e.length; + } + + function N(e) { + var a = A(e), t = O(e, 'variance'); + return void 0 === t ? P(e, 'variance', e.reduce((function(e, t) { + return e + Math.pow(t - a, 2); + }), 0) / e.length) : t; + } + + function L(e) { + return Math.sqrt(N(e)); + } + + function F(e, a) { + return function(e, a) { + return y(e.length !== a.length, 'x and y must has same length'), A(e.map((function(e, t) { + return e * a[t]; + }))) - A(e) * A(a); + }(e, a) / (Math.sqrt(A(e.map((function(e) { + return e * e; + }))) - Math.pow(A(e), 2)) * Math.sqrt(A(a.map((function(e) { + return e * e; + }))) - Math.pow(A(a), 2))); + } + + function G(e) { + return _(e) ? 'null' : 'number' == typeof e ? Number.isInteger(e) ? 'integer' : 'float' : 'string' == typeof e && C(e) ? e.includes('.') ? 'float' : 'integer' : v(e) ? 'date' : 'string'; + } + + function j(e) { + var a, t = e.map((function(e) { + return _(e) ? null : e; + })), r = D(t), n = r.null ? t.filter((function(e) { + return null !== e; + })) : t, i = t.map((function(e) { + return G(e); + })), o = Object.keys(D(i)).filter((function(e) { + return 'null' !== e; + })); + switch (o.length) { + case 0: + a = 'null'; + break; + case 1: + if ('integer' === (a = o[0])) for (var c = t.filter((function(e) { + return null !== e; + })), s = function(e) { + var t = f[e]; + if (!c.some((function(e) { + return !t.test(e); + }))) return a = 'date', 'break'; + }, l = 0; l < f.length; l++) { + if ('break' === s(l)) break; + } + break; + case 2: + a = o.includes('integer') && o.includes('float') ? 'float' : 'string'; + break; + default: + a = 'string'; + } + var d, u = function(e) { + return Array.from(new Set(e)); + }(n), m = { + count: e.length, + distinct: u.length, + type: o.length <= 1 ? o[0] || 'null' : 'mixed', + recommendation: a, + missing: r.null || 0, + samples: e, + valueMap: r, + }; + if (o.length > 1) { + var h = {}; + o.forEach((function(e) { + 'date' === e ? h.date = j(n.filter(v)) : 'integer' === e ? h.integer = j(n.filter(g)) : 'float' === e ? h.float = j(n.filter(b)) : 'string' === e && (h.string = j(n.filter((function(e) { + return 'string' === G(e); + })))); + })), m.meta = h; + } + return 2 === m.distinct && 'date' !== m.recommendation && (t.length >= 100 ? m.recommendation = 'boolean' : (d = u, [[!0, !1], [0, 1], ['true', 'false'], ['Yes', 'No'], ['True', 'False'], ['0', '1'], ['是', '否']].some((function(e) { + return d.every((function(a) { + return e.includes(a); + })); + })) && (m.recommendation = 'boolean'))), 'string' === a && Object.assign(m, function(e) { + var a = e.map((function(e) { + return e.length; + })); + return { + maxLength: R(a), minLength: S(a), meanLength: A(a), containsChars: e.some((function(e) { + return /[A-z]/.test(e); + })), containsDigits: e.some((function(e) { + return /[0-9]/.test(e); + })), containsSpace: e.some((function(e) { + return /\s/.test(e); + })), containsNonWorlds: !1, + }; + }(n.map((function(e) { + return '' + e; + })))), 'integer' !== a && 'float' !== a || Object.assign(m, function(e) { + return { + minimum: S(e), + maximum: R(e), + mean: A(e), + percentile5: T(e, 5), + percentile25: T(e, 25), + percentile50: T(e, 50), + percentile75: T(e, 75), + percentile95: T(e, 95), + sum: Q(e), + variance: N(e), + stdev: L(e), + zeros: e.filter((function(e) { + return 0 === e; + })).length, + }; + }(n.map((function(e) { + return 1 * e; + })))), 'date' === a && Object.assign(m, function(e, a) { + void 0 === a && (a = !1); + var t = e.map((function(e) { + if (a) { + var t = '' + e; + if (8 === t.length) return new Date(t.substr(0, 4) + '/' + t.substr(4, 2) + '/' + t.substr(6, 2)).getTime(); + } + return new Date(e).getTime(); + })); + return { minimum: e[k(t)], maximum: e[w(t)] }; + }(n, 'integer' === m.type)), m; + } + + function I(e, a) { + if (y(a && 0 === a.length, 'fields.length woudle greater than 0'), !a) { + var t = new Set; + e.forEach((function(e) { + return Object.keys(e).forEach((function(e) { + return t.add(e); + })); + })), a = Object(r.c)(t); + } + return a.map((function(a) { + return Object(r.a)(Object(r.a)({}, j(e.map((function(e) { + return e[a]; + })))), { name: a }); + })); + } + + function B(e) { + var a = e.samples; + if ('string' !== e.recommendation) return !1; + if (z(e)) return !1; + for (var t = a.filter((function(e) { + return !_(e); + })), r = null, n = null, i = -1, o = -1; ;) { + for (var c = !0, s = 0; s < t.length; s++) { + var l = (d = t[s])[i + 1]; + if (null !== r && 0 !== s || (r = l), l !== r) { + c = !1; + break; + } + } + if (!c) break; + i += 1; + } + for (; ;) { + for (c = !0, s = 0; s < t.length; s++) { + var d; + l = (d = t[s])[d.length - 1 - (o + 1)]; + if (null !== n && 0 !== s || (n = l), l !== n) { + c = !1; + break; + } + } + if (!c) break; + o += 1; + } + var u = [/\d+/, /(零|一|二|三|四|五|六|七|八|九|十)+/, /(一|二|三|四|五|六|日)/, /^[a-z]$/, /^[A-Z]$/]; + if (-1 === i && -1 === o) return !1; + var m = t.map((function(e) { + return e.slice(-1 === i ? 0 : i + 1, -1 === o ? void 0 : e.length - o - 1); + })), h = function(e) { + var a = u[e]; + if (!m.some((function(e) { + return !a.test(e); + }))) return { value: !0 }; + }; + for (s = 0; s < u.length; s++) { + var p = h(s); + if ('object' == typeof p) return p.value; + } + return !1; + } + + function z(e) { + return 1 === e.distinct; + } + + function E(e) { + return e.distinct === e.count; + } + + function H(e) { + return 'integer' === e.recommendation; + } + + function W(e) { + return 'float' === e.recommendation; + } + + function U(e) { + return 'integer' === e.recommendation || 'float' === e.recommendation; + } + + function q(e) { + return 'boolean' === e.recommendation || 'string' === e.recommendation && !B(e); + } + + function Y(e) { + return 'date' === e.recommendation; + } + + function $(e, a) { + var t = ['integer', 'float']; + y(!(t.includes(e.recommendation) && t.includes(a.recommendation)), 'field\'s type must be integer or float'); + var n = e.samples, i = a.samples, o = Object(r.b)(function(e, a) { + for (var t = [], r = [], n = 0; n < e.length; n++) _(e[n]) || _(a[n]) || (t.push(e[n]), r.push(a[n])); + return [t, r]; + }(n, i), 2), c = o[0], s = o[1]; + return F(c.map(Number.parseFloat), s.map(Number.parseFloat)); + } + }]); +})); +//# sourceMappingURL=index.js.map \ No newline at end of file From e811e5846f888d2081ec5d1bc38b337fa0d31c39 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Wed, 24 Jun 2020 15:04:58 +0800 Subject: [PATCH 37/73] =?UTF-8?q?REPORT-34127=20=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6=EF=BC=8C=E6=94=B9=E4=BA=86=E5=90=8E=E9=9D=A2?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E6=9D=A1=E4=BB=B6=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E5=89=8D=E9=9D=A2=E5=8D=95=E5=85=83=E6=A0=BC=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E8=B7=9F=E7=9D=80=E4=BF=AE=E6=94=B9=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/IntelliElements.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/IntelliElements.java b/designer-realize/src/main/java/com/fr/grid/IntelliElements.java index 7c15b8629..ca1ed55d8 100644 --- a/designer-realize/src/main/java/com/fr/grid/IntelliElements.java +++ b/designer-realize/src/main/java/com/fr/grid/IntelliElements.java @@ -194,8 +194,12 @@ public class IntelliElements { TemplateCellElement newCellElement = new DefaultTemplateCellElement(colIndex, rowIndex); applyStyle(newCellElement, sourceCellElement);//style if (sourceCellElement.getValue() instanceof DSColumn) { - DSColumn dsColumn = (DSColumn) sourceCellElement.getValue(); - newCellElement.setValue(dsColumn); + try{ + DSColumn dsColumn = (DSColumn)((DSColumn) sourceCellElement.getValue()).clone(); + newCellElement.setValue(dsColumn); + }catch (CloneNotSupportedException e){ + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } newCellElement.setCellExpandAttr(sourceCellElement.getCellExpandAttr()); } else if (sourceCellElement.getValue() instanceof Number) { newCellElement.setValue(processNumber((Number) sourceCellElement.getValue())); From 151a8bb5ca78c66a0894f76223ba64458b5a38ce Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 24 Jun 2020 15:34:13 +0800 Subject: [PATCH 38/73] =?UTF-8?q?REPORT-34222=20=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=BB=99=E5=AE=B9=E5=99=A8=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=80=E4=B8=AA=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=20=E5=90=8C=E6=AD=A5=E5=88=B0final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/fun/FormWidgetOptionProvider.java | 7 +++++ .../AbstractFormWidgetOptionProvider.java | 5 ++++ .../designer/beans/models/SelectionModel.java | 26 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java index bfc32f4e9..9f033d6dc 100644 --- a/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/FormWidgetOptionProvider.java @@ -16,4 +16,11 @@ public interface FormWidgetOptionProvider extends ParameterWidgetOptionProvider */ boolean isContainer(); + /** + * 如果是布局容器要实现粘贴到容器中的操作 + * @param t + * @param 泛型参数 表示选中的组件 一般为FormSelection + */ + void paste2Container(T t); + } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java index 43cab9514..537a49d01 100644 --- a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractFormWidgetOptionProvider.java @@ -25,4 +25,9 @@ public abstract class AbstractFormWidgetOptionProvider extends AbstractProvider public boolean isContainer() { return false; } + + @Override + public void paste2Container(T t) { + // do nothing + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index dd964e4ab..9f5f36f66 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -1,6 +1,7 @@ package com.fr.design.designer.beans.models; import com.fr.common.inputevent.InputEventBaseOnOS; +import com.fr.design.ExtraDesignClassManager; import com.fr.design.base.clipboard.ClipboardFilter; import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.LayoutAdapter; @@ -19,11 +20,13 @@ import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.form.util.FormDesignerUtils; import com.fr.design.form.util.XCreatorConstants; +import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormSelection; import com.fr.design.mainframe.FormSelectionUtils; import com.fr.design.utils.ComponentUtils; import com.fr.design.utils.gui.LayoutUtils; +import com.fr.general.ComparatorUtils; import com.fr.stable.ArrayUtils; import java.awt.LayoutManager; @@ -31,6 +34,7 @@ import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.util.ArrayList; +import java.util.Set; /** * 该model保存当前选择的组件和剪切版信息 @@ -43,6 +47,7 @@ public class SelectionModel { private FormDesigner designer; private FormSelection selection; private Rectangle hotspotBounds; + private FormWidgetOptionProvider provider; public SelectionModel(FormDesigner designer) { this.designer = designer; @@ -256,9 +261,30 @@ public class SelectionModel { //绝对布局 Rectangle rec = selection.getSelctionBounds(); FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y); + } else if (isExtraContainer(container)) { + provider.paste2Container(selection); } } + + /** + * 扩展的容器布局 + * @param container + * @return + */ + private boolean isExtraContainer(XLayoutContainer container) { + if (container != null) { + Set set = ExtraDesignClassManager.getInstance().getArray(FormWidgetOptionProvider.XML_TAG); + for (FormWidgetOptionProvider provider : set) { + if (provider.isContainer() && ComparatorUtils.equals(provider.appearanceForWidget(), selection.getSelectedCreator().getParent().getClass())) { + this.provider = provider; + return true; + } + } + } + return false; + } + /** * 删除当前所有选择的组件 */ From 56c61a0c16bb17d1c6fd117014a5475614116b67 Mon Sep 17 00:00:00 2001 From: "Qinghui.Liu" Date: Thu, 25 Jun 2020 14:32:57 +0800 Subject: [PATCH 39/73] =?UTF-8?q?CHART-14399=20=E5=9D=90=E6=A0=87=E8=BD=B4?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E7=B1=BB=E5=9E=8B=E6=97=B6=EF=BC=8C=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E7=BD=91=E6=A0=BC=E7=BA=BF=E7=B1=BB=E5=9E=8B=E5=92=8C?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=09=E5=90=8C=E6=AD=A5=E5=88=B0final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../style/axis/VanChartAxisScrollPaneWithTypeSelect.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java index 830bebf64..ef042e0f2 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisScrollPaneWithTypeSelect.java @@ -102,21 +102,21 @@ public class VanChartAxisScrollPaneWithTypeSelect extends AbstractVanChartScroll if(ComparatorUtils.equals(axis.getAxisType(), AxisType.AXIS_CATEGORY)){ textAxisPane.updateBean(axis); } else { - axis = new VanChartAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType()); + axis = new VanChartAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType(), axis.getMainGridColor()); textAxisPane.updateBean(axis); } } else if(ComparatorUtils.equals(index, AxisType.AXIS_TIME.ordinal())){ if(ComparatorUtils.equals(axis.getAxisType(), AxisType.AXIS_TIME)){ timeAxisPane.updateBean(axis); } else { - axis = new VanChartTimeAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType()); + axis = new VanChartTimeAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType(), axis.getMainGridColor()); timeAxisPane.updateBean(axis); } } else if(ComparatorUtils.equals(index, AxisType.AXIS_VALUE.ordinal())){ if(ComparatorUtils.equals(axis.getAxisType(), AxisType.AXIS_VALUE)){ valueAxisPane.updateBean(axis); } else { - axis = new VanChartValueAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType()); + axis = new VanChartValueAxis(axis.getAxisName(), axis.getPosition(), axis.getGridLineType(), axis.getMainGridColor()); valueAxisPane.updateBean(axis); } } From b981d8be031964d4861730f4236229d05eff32ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Sun, 28 Jun 2020 14:48:29 +0800 Subject: [PATCH 40/73] =?UTF-8?q?CHART-13666=20=E5=9B=BE=E8=A1=A8=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/chart/info/ChartInfo.java | 25 +- .../chart/info/ChartInfoCollector.java | 17 +- .../com/fr/design/chart/AutoChartDialog.java | 4 +- .../fr/design/chart/AutoChartTypePane.java | 36 +- .../java/com/fr/design/chart/ChartDialog.java | 7 +- .../design/chart/auto/AutoChartDataModel.java | 46 - .../design/chart/auto/AutoTypeCalculate.java | 17 +- .../com/fr/design/chart/auto/ColumnInfo.java | 56 - .../strategy/AbstractAutoTypeStrategy.java | 265 -- .../chart/auto/strategy/AutoTypeStrategy.java | 22 - .../design/chart/auto/strategy/AvaType.java | 79 - .../chart/auto/strategy/imp/AvaStrategy.java | 106 - .../strategy/imp/BubbleChartStrategy.java | 76 - .../strategy/imp/SingleDimensionStrategy.java | 68 - .../strategy/imp/SingleTargetStrategy.java | 45 - .../com/fr/design/chart/auto/js/analyze.js | 66 - .../com/fr/design/chart/auto/js/ava.js | 2729 ----------------- 17 files changed, 74 insertions(+), 3590 deletions(-) delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java delete mode 100644 designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java delete mode 100644 designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js delete mode 100644 designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java index 4c546c4cd..9025b9806 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfo.java @@ -54,6 +54,8 @@ public class ChartInfo extends AbstractPointInfo { private static final String ATTR_OVER_CHART_TYPE_COUNT = "overChartTypeCount"; private static final String ATTR_IS_NEW = "isNew"; private static final String ATTR_IS_REUSE = "isReuse"; + private static final String ATTR_AUTO_CHART_CREATE_TIME = "autoChartCreateTime"; + private static final String ATTR_AUTO_CHART_ENSURE_TIME = "autoChartEnsureTime"; private static final int COMPLETE_DAY_COUNT = 3; // 判断图表是否可以上传的天数 @@ -122,10 +124,10 @@ public class ChartInfo extends AbstractPointInfo { } public static ChartInfo newInstance(ChartProvider chartProvider) { - return newInstance(chartProvider, null, false, false); + return newInstance(chartProvider, null, false, false, false); } - public static ChartInfo newInstance(ChartProvider chartProvider, String createTime, boolean isNew, boolean isReuse) { + public static ChartInfo newInstance(ChartProvider chartProvider, String createTime, boolean isNew, boolean isReuse, boolean isAutoChart) { HashMap chartConsumingMap = new HashMap<>(); String username = MarketConfig.getInstance().getBbsUsername(); @@ -163,6 +165,13 @@ public class ChartInfo extends AbstractPointInfo { chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, "0"); chartConsumingMap.put(ATTR_IS_NEW, String.valueOf(isNew)); chartConsumingMap.put(ATTR_IS_REUSE, String.valueOf(isReuse)); + if (isAutoChart) { + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, createTime); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, typeTime); + } else { + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, StringUtils.EMPTY); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, StringUtils.EMPTY); + } ChartInfo chartInfo = new ChartInfo(chartId, templateId, book); chartInfo.chartConsumingMap = chartConsumingMap; @@ -202,6 +211,9 @@ public class ChartInfo extends AbstractPointInfo { writer.attr(ATTR_OVER_CHART_TYPE_COUNT, chartConsumingMap.get(ATTR_OVER_CHART_TYPE_COUNT)); writer.attr(ATTR_IS_NEW, chartConsumingMap.get(ATTR_IS_NEW)); writer.attr(ATTR_IS_REUSE, chartConsumingMap.get(ATTR_IS_REUSE)); + writer.attr(ATTR_AUTO_CHART_CREATE_TIME, chartConsumingMap.get(ATTR_AUTO_CHART_CREATE_TIME)); + writer.attr(ATTR_AUTO_CHART_ENSURE_TIME, chartConsumingMap.get(ATTR_AUTO_CHART_ENSURE_TIME)); + writer.end(); chartConfigInfo.writeXML(writer); @@ -238,6 +250,8 @@ public class ChartInfo extends AbstractPointInfo { chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, reader.getAttrAsString(ATTR_OVER_CHART_TYPE_COUNT, "0")); chartConsumingMap.put(ATTR_IS_NEW, reader.getAttrAsString(ATTR_IS_NEW, StringUtils.EMPTY)); chartConsumingMap.put(ATTR_IS_REUSE, reader.getAttrAsString(ATTR_IS_REUSE, StringUtils.EMPTY)); + chartConsumingMap.put(ATTR_AUTO_CHART_CREATE_TIME, reader.getAttrAsString(ATTR_AUTO_CHART_CREATE_TIME, StringUtils.EMPTY)); + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, reader.getAttrAsString(ATTR_AUTO_CHART_ENSURE_TIME, StringUtils.EMPTY)); } if (ChartConfigInfo.XML_TAG.equals(name)) { this.chartConfigInfo = (ChartConfigInfo) reader.readXMLObject(new ChartConfigInfo()); @@ -276,6 +290,10 @@ public class ChartInfo extends AbstractPointInfo { } public void updateChartType(ChartProvider chartProvider) { + updateChartType(chartProvider, false); + } + + public void updateChartType(ChartProvider chartProvider, boolean isAutoChart) { String typeTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); chartConsumingMap.put(ATTR_CHART_TYPE_TIME, typeTime); @@ -285,6 +303,9 @@ public class ChartInfo extends AbstractPointInfo { String count = chartConsumingMap.get(ATTR_OVER_CHART_TYPE_COUNT); count = StringUtils.isEmpty(count) ? "1" : String.valueOf(Integer.parseInt(count) + 1); chartConsumingMap.put(ATTR_OVER_CHART_TYPE_COUNT, count); + if (isAutoChart) { + chartConsumingMap.put(ATTR_AUTO_CHART_ENSURE_TIME, typeTime); + } resetChartConfigInfo(chartProvider); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java index 87dc8ca40..cd651fc6b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/chart/info/ChartInfoCollector.java @@ -12,6 +12,7 @@ import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; import com.fr.stable.xml.XMLableReader; import com.fr.third.joda.time.DateTime; + import java.util.HashMap; import java.util.Map; @@ -49,18 +50,22 @@ public class ChartInfoCollector extends AbstractPointCollector { } public void collection(ChartProvider chartProvider, String createTime) { - collection(chartProvider, createTime, false); + collection(chartProvider, createTime, false, false); + } + + public void collection(ChartProvider chartProvider, String createTime, boolean isReuse) { + collection(chartProvider, createTime, isReuse, false); } /** * 新建图表,保存状态 */ - public void collection(ChartProvider chartProvider, String createTime, boolean isReuse) { + public void collection(ChartProvider chartProvider, String createTime, boolean isReuse, boolean isAutoChart) { String chartId = chartProvider.getChartUuid(); if (!shouldCollectInfo() || StringUtils.isEmpty(chartId)) { return; } - ChartInfo chartInfo = ChartInfo.newInstance(chartProvider, createTime, true, isReuse); + ChartInfo chartInfo = ChartInfo.newInstance(chartProvider, createTime, true, isReuse, isAutoChart); chartInfoCacheMap.put(chartId, chartInfo); } @@ -116,6 +121,10 @@ public class ChartInfoCollector extends AbstractPointCollector { * 图表类型变化,更新类型和类型确认时间 */ public void updateChartTypeTime(ChartProvider chartProvider, String oldType) { + updateChartTypeTime(chartProvider, oldType, false); + } + + public void updateChartTypeTime(ChartProvider chartProvider, String oldType, boolean isAutoChart) { if (!shouldCollectInfo() || StringUtils.isEmpty(chartProvider.getChartUuid())) { return; } @@ -123,7 +132,7 @@ public class ChartInfoCollector extends AbstractPointCollector { ChartInfo chartInfo = getOrCreateChartInfo(chartProvider, oldType); //更新类型确认时间和类型 - chartInfo.updateChartType(chartProvider); + chartInfo.updateChartType(chartProvider, isAutoChart); //重置计数 chartInfo.resetIdleDayCount(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java index ddf4a0b40..058e07045 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java @@ -36,11 +36,11 @@ public class AutoChartDialog extends ChartDialog { return autoChartTypePane; } - protected ActionListener getActionListener() { + protected ActionListener getActionListener(final String createTime) { return new ActionListener() { public void actionPerformed(ActionEvent e) { ChartCollection chartCollection = (ChartCollection) getChartCollection(); - autoChartTypePane.update(chartCollection); + autoChartTypePane.update(chartCollection, createTime); if (chartCollection.getChartCount() > 0) { doOK(); } else { diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java index a7ad368fb..1d827c00f 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java @@ -2,7 +2,6 @@ package com.fr.design.chart; import com.fr.base.chart.chartdata.CallbackEvent; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chartx.attr.ChartProvider; import com.fr.design.chart.auto.AutoTypeCalculate; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.TableDataComboBox; @@ -15,6 +14,7 @@ import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.mainframe.chart.info.ChartInfoCollector; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.GeneralUtils; import com.fr.log.FineLoggerFactory; @@ -225,8 +225,9 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } } catch (Exception e) { if (!(e instanceof CancellationException)) { + connectionBar.close(); FineLoggerFactory.getLogger().error(e.getMessage(), e); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), + FineJOptionPane.showMessageDialog(AutoChartTypePane.this, e.getMessage(), Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); } } finally { @@ -243,16 +244,7 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent @Override public void update(ChartCollection cc) { - if (chartViewList.getSelectedIndex() < 0) { - return; - } - AutoChartIcon chartIcon = (AutoChartIcon) chartViewList.getSelectedValue(); - ChartProvider chartProvider = chartIcon.getChartCollection().getSelectedChartProvider(ChartProvider.class); - if (cc.getChartCount() > 0) { - cc.setSelectChart(chartProvider); - } else { - cc.addChart(chartProvider); - } + update(cc, null); } public void populate(String tableName, String[] dataFields) { @@ -264,6 +256,26 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent dataFieldBox.setSelectedValues(map); } + public void update(ChartCollection cc, String createTime) { + if (chartViewList.getSelectedIndex() < 0) { + return; + } + AutoChartIcon chartIcon = (AutoChartIcon) chartViewList.getSelectedValue(); + VanChart vanChart = chartIcon.getChartCollection().getSelectedChartProvider(VanChart.class); + if (cc.getChartCount() > 0) { + VanChart selectedChartProvider = cc.getSelectedChartProvider(VanChart.class); + if (selectedChartProvider.getChartUuid() != null) { + vanChart.setUuid(selectedChartProvider.getChartUuid()); + } + cc.setSelectChart(vanChart); + ChartInfoCollector.getInstance().updateChartTypeTime(vanChart, null, true); + } else { + cc.addChart(vanChart); + //记录埋点 + ChartInfoCollector.getInstance().collection(vanChart, createTime, false, true); + } + } + @Override public void callback() { this.repaint(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java index 9251bdbc8..b2d273a60 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java @@ -31,7 +31,6 @@ public class ChartDialog extends MiddleChartDialog { private UIButton ok; private UIButton cancel; private ChartTypePane chartTypePane; - private String createTime; public ChartDialog(Frame owner) { super(owner); @@ -44,7 +43,7 @@ public class ChartDialog extends MiddleChartDialog { } private void initComponent() { - createTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); + String createTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); this.setModal(true); this.setLayout(new BorderLayout()); setTitle(getDialogTitle()); @@ -61,7 +60,7 @@ public class ChartDialog extends MiddleChartDialog { ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); - ok.addActionListener(getActionListener()); + ok.addActionListener(getActionListener(createTime)); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doCancel(); @@ -83,7 +82,7 @@ public class ChartDialog extends MiddleChartDialog { return chartTypePane; } - protected ActionListener getActionListener() { + protected ActionListener getActionListener(final String createTime) { return new ActionListener() { public void actionPerformed(ActionEvent e) { chartTypePane.update((ChartCollection) cc, createTime); diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java deleted file mode 100644 index 76889dcd2..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoChartDataModel.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.fr.design.chart.auto; - -import com.fr.data.AbstractDataModel; -import com.fr.general.data.DataModel; - -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - */ -public class AutoChartDataModel extends AbstractDataModel { - - public List columnInfoList; - - public AutoChartDataModel(List columnInfos) { - this.columnInfoList = columnInfos; - } - - @Override - public int getColumnCount() { - return columnInfoList.size(); - } - - @Override - public String getColumnName(int index) { - if (index >= columnInfoList.size()) { - return null; - } - return columnInfoList.get(index).getColumnName(); - } - - @Override - public int getRowCount() { - return columnInfoList.get(0).getValues().size(); - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - if (columnIndex == DataModel.COLUMN_NAME_NOT_FOUND || columnIndex >= columnInfoList.size()) { - return null; - } - return columnInfoList.get(columnIndex).getValues().get(rowIndex); - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java index 73c23bd1c..db20af8cf 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java +++ b/designer-chart/src/main/java/com/fr/design/chart/auto/AutoTypeCalculate.java @@ -1,14 +1,15 @@ package com.fr.design.chart.auto; +import com.fr.chart.auto.ColumnInfo; +import com.fr.chart.auto.strategy.AutoTypeStrategy; +import com.fr.chart.auto.strategy.imp.AvaStrategy; +import com.fr.chart.auto.strategy.imp.BubbleChartStrategy; +import com.fr.chart.auto.strategy.imp.SingleDimensionStrategy; +import com.fr.chart.auto.strategy.imp.SingleTargetStrategy; import com.fr.data.TableDataSource; import com.fr.data.TableDataSourceTailor; import com.fr.data.impl.EmbeddedTableData; import com.fr.data.impl.NameTableData; -import com.fr.design.chart.auto.strategy.AutoTypeStrategy; -import com.fr.design.chart.auto.strategy.imp.AvaStrategy; -import com.fr.design.chart.auto.strategy.imp.BubbleChartStrategy; -import com.fr.design.chart.auto.strategy.imp.SingleDimensionStrategy; -import com.fr.design.chart.auto.strategy.imp.SingleTargetStrategy; import com.fr.design.data.DesignTableDataManager; import com.fr.design.file.HistoryTemplateListCache; import com.fr.general.ComparatorUtils; @@ -114,14 +115,14 @@ public class AutoTypeCalculate { } private static List getColumnData(EmbeddedTableData tableData, String columnName) { - int colIndex = getColIndex(tableData, columnName); + List columnData = new ArrayList<>(); + int colIndex = getColIndex(tableData, columnName); if (colIndex == DataModel.COLUMN_NAME_NOT_FOUND) { - return null; + return columnData; } int size = tableData.getRowCount(); - List columnData = new ArrayList<>(); for (int i = 0; i < size; i++) { Object valueAt = tableData.getValueAt(i, colIndex); columnData.add(GeneralUtils.objectToString(valueAt)); diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java b/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java deleted file mode 100644 index 9d27925df..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/ColumnInfo.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fr.design.chart.auto; - -import com.fr.data.util.function.DataFunction; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - */ -public class ColumnInfo { - - private String columnName; - private List values; - private DataFunction function; - private List resultValues = new ArrayList<>(); - - public ColumnInfo(String columnName, List values) { - this.columnName = columnName; - this.values = values; - } - - public String getColumnName() { - return columnName; - } - - public void setColumnName(String columnName) { - this.columnName = columnName; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - - public DataFunction getFunction() { - return function; - } - - public void setFunction(DataFunction function) { - this.function = function; - } - - public List getResultValues() { - return resultValues; - } - - public void setResultValues(List resultValues) { - this.resultValues = resultValues; - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java deleted file mode 100644 index 417cd036c..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AbstractAutoTypeStrategy.java +++ /dev/null @@ -1,265 +0,0 @@ -package com.fr.design.chart.auto.strategy; - -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.chart.chartdata.BubbleTableDefinition; -import com.fr.chart.chartdata.ChartDataUtils; -import com.fr.chart.chartdata.ChartSummaryColumn; -import com.fr.chart.chartdata.MoreNameCDDefinition; -import com.fr.chart.chartdata.OneValueCDDefinition; -import com.fr.data.impl.NameTableData; -import com.fr.data.util.function.DataFunction; -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.general.GeneralUtils; -import com.fr.general.data.DataModel; -import com.fr.graph.g2d.canvas.CanvasPainter; -import com.fr.json.JSONArray; -import com.fr.json.JSONObject; -import com.fr.locale.InterProviderFactory; -import com.fr.log.FineLoggerFactory; -import com.fr.plugin.chart.vanchart.VanChart; -import com.fr.stable.StringUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-17 - */ -public abstract class AbstractAutoTypeStrategy implements AutoTypeStrategy { - - private static CanvasPainter engine; - - public static final String NONE = InterProviderFactory.getProvider().getLocText("Fine-Engine_Chart_Use_None"); - - public static final int MAX_COUNT = 3; - - //对维度和指标进行计算 - protected void calculateColumn(List dimensions, List targets) { - //> 需要聚合计算的数据数组。eg:{a-x-:{fieldId3:[1,4],fieldId4:[5,8]},a-y-:{fieldId3:[3],fieldId4:[7]}}。 - Map>> targetFieldMap = new HashMap<>(); - - //关键字段可能有数据字典属性,需要拿到数据字典的映射值>。eg:{a-x-:{fieldId1:(a,a1),fieldId1:(x,x1)},a-y-:{fieldId1:(a,a1),fieldId1:(y,y1)}} - Map> dimensionFieldMap = new LinkedHashMap<>(); - - int size = dimensions.get(0).getValues().size(); - - for (int rowIndex = 0; rowIndex < size; rowIndex++) { - String key = StringUtils.EMPTY; - Map keyValueMap = new HashMap<>(); - //处理维度字段 - for (ColumnInfo field : dimensions) { - String columnName = field.getColumnName(); - String result = field.getValues().get(rowIndex); - List resultList = new ArrayList<>(); - key += (result + "-"); - resultList.add(result); - keyValueMap.put(columnName, result); - } - if (!dimensionFieldMap.containsKey(key)) { - dimensionFieldMap.put(key, keyValueMap); - } - //处理指标字段 - for (ColumnInfo field : targets) { - String result = field.getValues().get(rowIndex); - Map> map = targetFieldMap.get(key); - if (map == null) { - map = new HashMap<>(); - targetFieldMap.put(key, map); - } - String columnName = field.getColumnName(); - List list = map.get(columnName); - if (list == null) { - list = new ArrayList<>(); - map.put(columnName, list); - } - list.add(result); - } - } - calculateAndFill(dimensionFieldMap, targetFieldMap, dimensions, targets); - } - - private void calculateAndFill(Map> dimensionFieldMap, - Map>> targetFieldMap, - List dimensions, List targets) { - for (String key : dimensionFieldMap.keySet()) { - Map> targetValues = targetFieldMap.get(key); - //对需要计算的字段使用dataFunction进行计算 - for (ColumnInfo field : targets) { - DataFunction dataFunction = field.getFunction(); - dataFunction.reset(); - List valueList = targetValues.get(field.getColumnName()); - field.getResultValues().add(ChartDataUtils.calculateByFunction(dataFunction, valueList)); - } - - Map keyValue = dimensionFieldMap.get(key); - for (ColumnInfo field : dimensions) { - String result = keyValue.get(field.getColumnName()); - field.getResultValues().add(result); - } - } - } - - protected List analyzeByAva(List dimensions, List targets) { - - List rankChartList = new ArrayList<>(); - - CanvasPainter engine = createEngine(); - if (engine == null) { - return rankChartList; - } - - JSONArray jsonArray = new JSONArray(); - int size = dimensions.isEmpty() ? targets.get(0).getResultValues().size() : dimensions.get(0).getResultValues().size(); - for (int i = 0; i < size; i++) { - JSONObject jsonObject = new JSONObject(); - for (ColumnInfo columnInfo : dimensions) { - jsonObject.put(columnInfo.getColumnName(), GeneralUtils.objectToString(columnInfo.getResultValues().get(i))); - } - for (ColumnInfo columnInfo : targets) { - jsonObject.put(columnInfo.getColumnName(), GeneralUtils.objectToNumber(columnInfo.getResultValues().get(i))); - } - jsonArray.add(jsonObject); - } - - String result = StringUtils.EMPTY; - try { - result = (String) engine.executeFunction("analyzeData", jsonArray.toString()); - } catch (Exception ex) { - FineLoggerFactory.getLogger().error(ex.getMessage(), ex); - } - - JSONArray resultArray = new JSONArray(result); - for (int i = 0; i < resultArray.length(); i++) { - JSONObject jsonObject = resultArray.getJSONObject(i); - AvaType type = AvaType.parse(GeneralUtils.objectToString(jsonObject.get("type"))); - double score = GeneralUtils.objectToNumber(jsonObject.get("score")).doubleValue(); - if (type == null || score <= 0) { - continue; - } - - RankChart rankChart = new RankChart(); - rankChart.setVanChart(type.getVanChart()); - rankChart.setGrade(score); - rankChart.setMainCategory(GeneralUtils.objectToString(jsonObject.get("category"))); - rankChartList.add(rankChart); - if (rankChartList.size() >= MAX_COUNT) { - break; - } - } - - return rankChartList; - } - - protected List selectHighRankChart(List rankChartList) { - Collections.sort(rankChartList); - List vanChartList = new ArrayList<>(); - int size = Math.min(rankChartList.size(), MAX_COUNT); - for (int i = 0; i < size; i++) { - vanChartList.add(rankChartList.get(i).getVanChart()); - } - return vanChartList; - } - - private synchronized static CanvasPainter createEngine() { - if (engine != null) { - return engine; - } - CanvasPainter.Builder builder = null; - try { - builder = CanvasPainter.newDefaultBuilder() - .loadAndExecute("/com/fr/design/chart/auto/js/analyze.js") - .loadAndExecute("/com/fr/design/chart/auto/js/ava.js"); - - } catch (Exception ex) { - FineLoggerFactory.getLogger().error(ex.getMessage(), ex); - } finally { - if (builder != null) { - engine = builder.build(); - } - } - return engine; - } - - protected TopDefinitionProvider createOneValueCDDefinition(String tableName, DataModel dataModel, String categoryName, - String seriesName, String valueName, DataFunction dataFunction) { - OneValueCDDefinition oneValueCDDefinition = new OneValueCDDefinition(); - oneValueCDDefinition.setTableData(new NameTableData(tableName)); - oneValueCDDefinition.setDataModel(dataModel); - oneValueCDDefinition.setCategoryName(categoryName); - oneValueCDDefinition.setSeriesColumnName(seriesName); - oneValueCDDefinition.setValueColumnName(valueName); - oneValueCDDefinition.setDataFunction(dataFunction); - return oneValueCDDefinition; - } - - protected TopDefinitionProvider createMoreNameCDDefinition(String tableName, DataModel dataModel, - String categoryName, String seriesName, DataFunction dataFunction) { - ChartSummaryColumn chartSummaryColumn = new ChartSummaryColumn(); - chartSummaryColumn.setCustomName(seriesName); - chartSummaryColumn.setName(seriesName); - chartSummaryColumn.setFunction(dataFunction); - - MoreNameCDDefinition moreNameCDDefinition = new MoreNameCDDefinition(); - moreNameCDDefinition.setTableData(new NameTableData(tableName)); - moreNameCDDefinition.setDataModel(dataModel); - moreNameCDDefinition.setCategoryName(categoryName); - moreNameCDDefinition.setChartSummaryColumn(new ChartSummaryColumn[]{chartSummaryColumn}); - return moreNameCDDefinition; - } - - protected TopDefinitionProvider createBubbleTableDefinition(String tableName, DataModel dataModel, - String seriesName, String x, String y, String value) { - BubbleTableDefinition bubbleTableDefinition = new BubbleTableDefinition(); - bubbleTableDefinition.setTableData(new NameTableData(tableName)); - bubbleTableDefinition.setDataModel(dataModel); - bubbleTableDefinition.setSeriesName(seriesName); - bubbleTableDefinition.setBubbleX(x); - bubbleTableDefinition.setBubbleY(y); - bubbleTableDefinition.setBubbleSize(value); - return bubbleTableDefinition; - } - - public class RankChart implements Comparable { - - private double grade; - - private VanChart vanChart; - - private String mainCategory; - - public double getGrade() { - return grade; - } - - public void setGrade(double grade) { - this.grade = grade; - } - - public VanChart getVanChart() { - return vanChart; - } - - public void setVanChart(VanChart vanChart) { - this.vanChart = vanChart; - } - - public String getMainCategory() { - return mainCategory; - } - - public void setMainCategory(String mainCategory) { - this.mainCategory = mainCategory; - } - - public int compareTo(RankChart compare) { - //分数越高,排名越前 - return compare.getGrade() - grade >= 0 ? 1 : -1; - } - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java deleted file mode 100644 index 12c794568..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AutoTypeStrategy.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.fr.design.chart.auto.strategy; - -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.plugin.chart.vanchart.VanChart; - -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - */ -public interface AutoTypeStrategy { - - /** - * 计算排名匹配度最高的图表 - * - * @param dimensions 维度 - * @param targets 指标 - */ - public List rankChart(String tableName, List dimensions, List targets); -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java deleted file mode 100644 index 29f242279..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/AvaType.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.fr.design.chart.auto.strategy; - -import com.fr.chart.charttypes.ChartTypeManager; -import com.fr.log.FineLoggerFactory; -import com.fr.plugin.chart.PiePlot4VanChart; -import com.fr.plugin.chart.area.VanChartAreaPlot; -import com.fr.plugin.chart.bubble.VanChartBubblePlot; -import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.plugin.chart.line.VanChartLinePlot; -import com.fr.plugin.chart.radar.VanChartRadarPlot; -import com.fr.plugin.chart.scatter.VanChartScatterPlot; -import com.fr.plugin.chart.vanchart.VanChart; -import com.fr.stable.StringUtils; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-18 - */ -public enum AvaType { - - //柱形图,堆积柱形图,百分比堆积柱形图 - COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 0), - STACKED_COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 1), - PERCENT_STACKED_COLUMN_CHART(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID, 2), - - //条形图,堆积条形图,百分比堆积条形图 - BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 0), - STACKED_BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 1), - PERCENT_STACKED_BAR_CHART(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID, 2), - - //雷达图 - RADAR_CHART(VanChartRadarPlot.VAN_CHART_RADAR_PLOT, 0), - - //饼图 - PIE_CHART(PiePlot4VanChart.VAN_CHART_PIE_PLOT, 0), - - //折线图 - LINE_CHART(VanChartLinePlot.VAN_CHART_LINE_PLOT, 0), - - //面积图 - AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 0), - STACKED_AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 1), - PERCENT_STACKED_AREA_CHART(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID, 2), - - //散点图 - SCATTER_PLOT(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID, 0), - - //气泡图 - BUBBLE_CHART(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID, 0); - - private VanChart vanChart; - - AvaType(String vanChartType, int vanChartIndex) { - vanChart = (VanChart) ChartTypeManager.getInstance(). - getCharts(vanChartType)[vanChartIndex]; - - } - - public VanChart getVanChart() { - VanChart vanChart = null; - try { - vanChart = (VanChart) this.vanChart.clone(); - } catch (Exception ex) { - FineLoggerFactory.getLogger().error(ex.getMessage(), ex); - } - return vanChart; - } - - - public static AvaType parse(String typeName) { - for (AvaType type : AvaType.values()) { - if (StringUtils.equalsIgnoreCase(type.toString(), typeName)) { - return type; - } - } - return null; - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java deleted file mode 100644 index aef4999f0..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/AvaStrategy.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.fr.design.chart.auto.strategy.imp; - -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.data.util.function.SumFunction; -import com.fr.design.chart.auto.AutoChartDataModel; -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; -import com.fr.general.data.DataModel; -import com.fr.plugin.chart.area.VanChartAreaPlot; -import com.fr.plugin.chart.line.VanChartLinePlot; -import com.fr.plugin.chart.radar.VanChartRadarPlot; -import com.fr.plugin.chart.vanchart.VanChart; -import com.fr.stable.StringUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - * 使用ava来匹配的策略 - */ -public class AvaStrategy extends AbstractAutoTypeStrategy { - - - public List rankChart(String tableName, List dimensions, List targets) { - List rankChartList = new ArrayList<>(); - - for (ColumnInfo columnInfo : targets) { - columnInfo.setFunction(new SumFunction()); - } - if (dimensions.size() == 1) { - //一个维度+一个指标匹配 - for (ColumnInfo target : targets) { - List newTargets = new ArrayList<>(); - newTargets.add(target); - rankChartList.addAll(rankChartByAva(tableName, dimensions, newTargets)); - //ava匹配之后,初始化图表和分数 - } - } else { - //两个维度+一个指标匹配 - int size = dimensions.size(); - for (int i = 0; i < size; i++) { - for (int j = i + 1; j < size; j++) { - for (ColumnInfo target : targets) { - List newDimensions = new ArrayList<>(); - newDimensions.add(dimensions.get(i)); - newDimensions.add(dimensions.get(j)); - List newTargets = new ArrayList<>(); - newTargets.add(target); - rankChartList.addAll(rankChartByAva(tableName, newDimensions, newTargets)); - } - } - } - } - - return selectHighRankChart(rankChartList); - } - - private List rankChartByAva(String tableName, List dimensions, List targets) { - for (ColumnInfo columnInfo : dimensions) { - columnInfo.setResultValues(new ArrayList<>()); - } - for (ColumnInfo columnInfo : targets) { - columnInfo.setResultValues(new ArrayList<>()); - } - calculateColumn(dimensions, targets); - //调用ava - List rankChartList = analyzeByAva(dimensions, targets); - - List modelList = new ArrayList<>(); - modelList.addAll(dimensions); - modelList.addAll(targets); - AutoChartDataModel dataModel = new AutoChartDataModel(modelList); - for (RankChart rankChart : rankChartList) { - VanChart vanChart = rankChart.getVanChart(); - String plotID = vanChart.getPlot().getPlotID(); - vanChart.setFilterDefinition(creatDefinition(plotID, rankChart.getMainCategory(), tableName, dataModel, dimensions, targets)); - } - return rankChartList; - } - - private TopDefinitionProvider creatDefinition(String plotId, String category, String tableName, DataModel dataModel, - List dimensions, List targets) { - String categoryName; - String seriesName; - switch (plotId) { - case VanChartLinePlot.VAN_CHART_LINE_PLOT: - case VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID: - case VanChartRadarPlot.VAN_CHART_RADAR_PLOT: - if (dimensions.size() == 1) { - return createMoreNameCDDefinition(tableName, dataModel, dimensions.get(0).getColumnName(), targets.get(0).getColumnName(), new SumFunction()); - } else { - categoryName = category; - seriesName = StringUtils.equals(dimensions.get(0).getColumnName(), categoryName) ? - dimensions.get(1).getColumnName() : dimensions.get(0).getColumnName(); - return createOneValueCDDefinition(tableName, dataModel, categoryName, seriesName, targets.get(0).getColumnName(), new SumFunction()); - } - default: - categoryName = dimensions.size() > 1 ? dimensions.get(0).getColumnName() : NONE; - seriesName = dimensions.size() > 1 ? dimensions.get(1).getColumnName() : dimensions.get(0).getColumnName(); - return createOneValueCDDefinition(tableName, dataModel, categoryName, seriesName, targets.get(0).getColumnName(), new SumFunction()); - } - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java deleted file mode 100644 index 6f10f561b..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/BubbleChartStrategy.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.fr.design.chart.auto.strategy.imp; - -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.design.chart.auto.AutoChartDataModel; -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; -import com.fr.plugin.chart.vanchart.VanChart; -import com.fr.stable.StringUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - * 匹配气泡图和散点图的策略 - */ -public class BubbleChartStrategy extends AbstractAutoTypeStrategy { - - @Override - public List rankChart(String tableName, List dimensions, List targets) { - List rankChartList = new ArrayList<>(); - for (ColumnInfo columnInfo : dimensions) { - List resultValues = columnInfo.getResultValues(); - for (String str : columnInfo.getValues()) { - resultValues.add(str); - } - } - for (ColumnInfo columnInfo : targets) { - List resultValues = columnInfo.getResultValues(); - for (String str : columnInfo.getValues()) { - resultValues.add(str); - } - } - int size = targets.size(); - //散点图 - if (size == 2) { - rankChartList.addAll(rankChartByAva(tableName, dimensions, targets)); - } else { - //气泡图 - for (int i = 0; i < size; i++) { - for (int j = i + 1; j < size; j++) { - for (int k = j + 1; k < size; k++) { - List newTargets = new ArrayList<>(); - newTargets.add(targets.get(i)); - newTargets.add(targets.get(j)); - newTargets.add(targets.get(k)); - rankChartList.addAll(rankChartByAva(tableName, dimensions, newTargets)); - } - } - } - } - return selectHighRankChart(rankChartList); - } - - private List rankChartByAva(String tableName, List dimensions, List targets) { - //调用ava - List rankChartList = analyzeByAva(dimensions, targets); - - List modelList = new ArrayList<>(); - modelList.addAll(dimensions); - modelList.addAll(targets); - AutoChartDataModel dataModel = new AutoChartDataModel(modelList); - - String series = dimensions.size() == 0 ? NONE : dimensions.get(0).getColumnName(); - String value = targets.size() == 2 ? StringUtils.EMPTY : targets.get(2).getColumnName(); - TopDefinitionProvider bubbleTableDefinition = createBubbleTableDefinition(tableName, dataModel, series, - targets.get(0).getColumnName(), targets.get(1).getColumnName(), value); - for (RankChart rankChart : rankChartList) { - VanChart vanChart = rankChart.getVanChart(); - vanChart.setFilterDefinition(bubbleTableDefinition); - } - return rankChartList; - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java deleted file mode 100644 index 4d7ad03f4..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleDimensionStrategy.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.fr.design.chart.auto.strategy.imp; - -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.data.util.function.CountFunction; -import com.fr.design.chart.auto.AutoChartDataModel; -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; -import com.fr.general.data.DataModel; -import com.fr.plugin.chart.area.VanChartAreaPlot; -import com.fr.plugin.chart.line.VanChartLinePlot; -import com.fr.plugin.chart.radar.VanChartRadarPlot; -import com.fr.plugin.chart.vanchart.VanChart; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - * 匹配无指标的策略 - */ -public class SingleDimensionStrategy extends AbstractAutoTypeStrategy { - - @Override - public List rankChart(String tableName, List dimensions, List targets) { - List rankChartList = new ArrayList<>(); - for (ColumnInfo columnInfo : dimensions) { - ColumnInfo target = new ColumnInfo(columnInfo.getColumnName(), columnInfo.getValues()); - target.setFunction(new CountFunction()); - target.setColumnName("value"); - - List newDimension = new ArrayList<>(); - List newTarget = new ArrayList<>(); - newDimension.add(columnInfo); - newTarget.add(target); - - rankChartList.addAll(rankChartByAva(tableName, newDimension, newTarget)); - } - return selectHighRankChart(rankChartList); - } - - private List rankChartByAva(String tableName, List dimensions, List targets) { - calculateColumn(dimensions, targets); - //调用ava - List rankChartList = analyzeByAva(dimensions, targets); - - AutoChartDataModel dataModel = new AutoChartDataModel(dimensions); - for (RankChart rankChart : rankChartList) { - VanChart vanChart = rankChart.getVanChart(); - String plotID = vanChart.getPlot().getPlotID(); - vanChart.setFilterDefinition(creatDefinition(plotID, tableName, dataModel, dimensions)); - } - return rankChartList; - } - - private TopDefinitionProvider creatDefinition(String plotId, String tableName, DataModel dataModel, - List dimensions) { - switch (plotId) { - case VanChartLinePlot.VAN_CHART_LINE_PLOT: - case VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID: - case VanChartRadarPlot.VAN_CHART_RADAR_PLOT: - return createMoreNameCDDefinition(tableName, dataModel, dimensions.get(0).getColumnName(), dimensions.get(0).getColumnName(), new CountFunction()); - default: - return createOneValueCDDefinition(tableName, dataModel, NONE, dimensions.get(0).getColumnName(), dimensions.get(0).getColumnName(), new CountFunction()); - } - } -} diff --git a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java b/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java deleted file mode 100644 index 5679b6125..000000000 --- a/designer-chart/src/main/java/com/fr/design/chart/auto/strategy/imp/SingleTargetStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.fr.design.chart.auto.strategy.imp; - -import com.fr.data.util.function.NoneFunction; -import com.fr.design.chart.auto.AutoChartDataModel; -import com.fr.design.chart.auto.ColumnInfo; -import com.fr.design.chart.auto.strategy.AbstractAutoTypeStrategy; -import com.fr.design.chart.auto.strategy.AvaType; -import com.fr.plugin.chart.attr.axis.VanChartAxis; -import com.fr.plugin.chart.attr.axis.VanChartValueAxis; -import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.plugin.chart.vanchart.VanChart; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Bjorn - * @version 10.0 - * Created by Bjorn on 2020-06-16 - * 匹配无维度的策略 - */ -public class SingleTargetStrategy extends AbstractAutoTypeStrategy { - - @Override - public List rankChart(String tableName, List dimensions, List targets) { - //只有一个指标,匹配直方图 - VanChart vanChart = AvaType.COLUMN_CHART.getVanChart(); - List allColumn = new ArrayList<>(dimensions); - allColumn.addAll(targets); - - AutoChartDataModel dataModel = new AutoChartDataModel(allColumn); - String columnName = targets.get(0).getColumnName(); - vanChart.setFilterDefinition(createMoreNameCDDefinition(tableName, dataModel, columnName, columnName, new NoneFunction())); - - VanChartColumnPlot plot = vanChart.getPlot(); - List xAxisList = plot.getXAxisList(); - VanChartAxis vanChartAxis = xAxisList.get(0); - VanChartValueAxis axis = new VanChartValueAxis(vanChartAxis.getAxisName(), vanChartAxis.getPosition()); - xAxisList.set(0, axis); - - List vanChartList = new ArrayList<>(); - vanChartList.add(vanChart); - return vanChartList; - } -} diff --git a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js deleted file mode 100644 index c181cd20e..000000000 --- a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/analyze.js +++ /dev/null @@ -1,66 +0,0 @@ -var document = { - - body: { - - style: {} - - }, - - documentElement: { - style: {} - }, - - head: { - prepend: function () { - } - }, - - addEventListener: function () { - }, - - createDocumentFragment: function () { - return { - appendChild: function () { - return {}; - } - }; - }, - - createElement: function () { - return { - getContext: function () { - return undefined; - }, - - setAttribute: function () { - - }, - - getElementsByTagName: function () { - return []; - }, - - appendChild: function () { - return {}; - } - } - } -}; - -function analyzeData(data) { - - data = JSON.parse(data); - - var result = window.analyze(data); - - for (i = 0; i < result.length; i++) { - var type = result[i].type; - - if(type == "line_chart" || type == "area_chart" - || type == "stacked_area_chart" || type == "percent_stacked_area_chart"){ - result[i].category = result[i].channels.x; - } - } - - return JSON.stringify(result); -} \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js b/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js deleted file mode 100644 index 07965c88f..000000000 --- a/designer-chart/src/main/resources/com/fr/design/chart/auto/js/ava.js +++ /dev/null @@ -1,2729 +0,0 @@ -!function(e, a) { - 'object' == typeof exports && 'object' == typeof module ? module.exports = a() : 'function' == typeof define && define.amd ? define([], a) : 'object' == typeof exports ? exports.Advisor = a() : e.Advisor = a(); -}(window, (function() { - return function(e) { - var a = {}; - - function t(r) { - if (a[r]) return a[r].exports; - var n = a[r] = { i: r, l: !1, exports: {} }; - return e[r].call(n.exports, n, n.exports, t), n.l = !0, n.exports; - } - - return t.m = e, t.c = a, t.d = function(e, a, r) { - t.o(e, a) || Object.defineProperty(e, a, { enumerable: !0, get: r }); - }, t.r = function(e) { - 'undefined' != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, { value: 'Module' }), Object.defineProperty(e, '__esModule', { value: !0 }); - }, t.t = function(e, a) { - if (1 & a && (e = t(e)), 8 & a) return e; - if (4 & a && 'object' == typeof e && e && e.__esModule) return e; - var r = Object.create(null); - if (t.r(r), Object.defineProperty(r, 'default', { - enumerable: !0, - value: e, - }), 2 & a && 'string' != typeof e) for (var n in e) t.d(r, n, function(a) { - return e[a]; - }.bind(null, n)); - return r; - }, t.n = function(e) { - var a = e && e.__esModule ? function() { - return e.default; - } : function() { - return e; - }; - return t.d(a, 'a', a), a; - }, t.o = function(e, a) { - return Object.prototype.hasOwnProperty.call(e, a); - }, t.p = '', t(t.s = 3); - }([function(e, a, t) { - 'use strict'; - t.d(a, 'a', (function() { - return r; - })), t.d(a, 'd', (function() { - return n; - })), t.d(a, 'b', (function() { - return i; - })), t.d(a, 'c', (function() { - return o; - })); - var r = function() { - return (r = Object.assign || function(e) { - for (var a, t = 1, r = arguments.length; t < r; t++) for (var n in a = arguments[t]) Object.prototype.hasOwnProperty.call(a, n) && (e[n] = a[n]); - return e; - }).apply(this, arguments); - }; - - function n(e) { - var a = 'function' == typeof Symbol && Symbol.iterator, t = a && e[a], r = 0; - if (t) return t.call(e); - if (e && 'number' == typeof e.length) return { - next: function() { - return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; - }, - }; - throw new TypeError(a ? 'Object is not iterable.' : 'Symbol.iterator is not defined.'); - } - - function i(e, a) { - var t = 'function' == typeof Symbol && e[Symbol.iterator]; - if (!t) return e; - var r, n, i = t.call(e), o = []; - try { - for (; (void 0 === a || a-- > 0) && !(r = i.next()).done;) o.push(r.value); - } catch (e) { - n = { error: e }; - } finally { - try { - r && !r.done && (t = i.return) && t.call(i); - } finally { - if (n) throw n.error; - } - } - return o; - } - - function o() { - for (var e = [], a = 0; a < arguments.length; a++) e = e.concat(i(arguments[a])); - return e; - } - }, function(e, a, t) { - 'use strict'; - - function r(e, a) { - for (var t = 0; t < a.length; t++) { - var r = a[t]; - r.enumerable = r.enumerable || !1, r.configurable = !0, 'value' in r && (r.writable = !0), Object.defineProperty(e, r.key, r); - } - } - - function n(e, a, t) { - return a in e ? Object.defineProperty(e, a, { - value: t, - enumerable: !0, - configurable: !0, - writable: !0, - }) : e[a] = t, e; - } - - Object.defineProperty(a, '__esModule', { value: !0 }), a.default = void 0; - var i = function() { - function e(a, t, r, i, o) { - !function(e, a) { - if (!(e instanceof a)) throw new TypeError('Cannot call a class as a function'); - }(this, e), n(this, '_id', void 0), n(this, '_hardOrSoft', void 0), n(this, '_specChartTypes', void 0), n(this, '_weight', void 0), n(this, 'validator', void 0), this._id = a, this._hardOrSoft = t, this._specChartTypes = r, this._weight = i, this.validator = o; - } - - var a, t, i; - return a = e, (t = [{ - key: 'toString', value: function() { - return 'RULE: '.concat(this._id, '^').concat(this._hardOrSoft, '^').concat(this._specChartTypes.toString(), '^*').concat(this.weight); - }, - }, { - key: 'check', value: function(e) { - return this.validator(e) * this._weight; - }, - }, { - key: 'id', get: function() { - return this._id; - }, - }, { - key: 'hardOrSoft', get: function() { - return this._hardOrSoft; - }, - }, { - key: 'specChartTypes', get: function() { - return this._specChartTypes; - }, - }, { - key: 'weight', get: function() { - return this._weight; - }, - }]) && r(a.prototype, t), i && r(a, i), e; - }(); - a.default = i; - }, function(e, a, t) { - 'use strict'; - t.r(a), t.d(a, 'CKBJson', (function() { - return o; - })), t.d(a, 'addChart', (function() { - return c; - })), t.d(a, 'CKBOptions', (function() { - return _; - })), t.d(a, 'FAMILY_OPTIONS', (function() { - return l; - })), t.d(a, 'PURPOSE_OPTIONS', (function() { - return d; - })), t.d(a, 'COORD_TYPE_OPTIONS', (function() { - return u; - })), t.d(a, 'GRAPHIC_CATEGORY_OPTIONS', (function() { - return m; - })), t.d(a, 'SHAPE_OPTIONS', (function() { - return h; - })), t.d(a, 'LOM_OPTIONS', (function() { - return p; - })), t.d(a, 'CHANNEL_OPTIONS', (function() { - return f; - })), t.d(a, 'RECOMMEND_RATING_OPTIONS', (function() { - return y; - })), t.d(a, 'CHART_ID_OPTIONS', (function() { - return g; - })); - var r = { - 'en-US': null, 'zh-CN': { - concepts: { - family: { - LineCharts: '折线图类', - ColumnCharts: '柱状图类', - BarCharts: '条形图类', - PieCharts: '饼图类', - AreaCharts: '面积图类', - ScatterCharts: '散点图类', - FunnelCharts: '漏斗图类', - HeatmapCharts: '热力图类', - RadarCharts: '雷达图类', - TreeGraph: '树形关系类', - GeneralGraph: '关系图类', - PointLayer: '点图层类', - LineLayer: '线图层类', - PolygonLayer: '面图层类', - HeatmapLayer: '地图热力图类', - Others: '其他类', - }, - category: { Statistic: '统计图表', Diagram: '示意图', Graph: '关系图', Map: '地图' }, - purpose: { - Comparison: '比较', - Trend: '趋势', - Distribution: '分布', - Rank: '排名', - Proportion: '占比', - Composition: '组成', - Relation: '关系', - Hierarchy: '层级', - Flow: '流向', - Spatial: '空间', - }, - coord: { - NumberLine: '数轴', - Cartesian2D: '二维直角坐标系', - SymmetricCartesian: '对称直角坐标系', - Cartesian3D: '三维直角坐标系', - Polar: '极坐标系', - NodeLink: '点线关系网络', - Radar: '雷达型坐标系', - Geo: '地理坐标系', - Other: '其他', - }, - shape: { - Lines: '线形', - Bars: '条形', - Round: '圆形', - Square: '方形', - Area: '面形', - Scatter: '散点形', - Symmetric: '对称形', - Network: '网络形', - Map: '地图', - }, - channel: { - Position: '位置', - Length: '长度', - Color: '颜色', - Area: '面积', - Angle: '角度', - ArcLength: '弧长', - Direction: '方向', - Size: '大小', - Opacity: '透明度', - Stroke: '线色', - LineWidth: '线粗', - Lightness: '亮度', - }, - lom: { Continuous: '连续', Discrete: '离散', Interval: '数值', Nominal: '无序名词', Ordinal: '有序名词', Time: '时间' }, - recRate: { Recommended: '推荐', 'Use with Caution': '慎用', 'Not Recommended': '不推荐' }, - }, chartTypes: { - line_chart: { name: '折线图', alias: ['折线图', '线图'], def: '使用折线的线段显示数据在一个具有顺序性的维度上的变化。' }, - step_line_chart: { - name: '阶梯图', - alias: ['阶梯线'], - def: '折线根据分类字段分为多根在 x 方向(时间)的信息是完全一致、颜色及 y 方向(变量)信息不一致的折线,通常用作同一时间区间内多个变量发展趋势的对比。', - }, - area_chart: { name: '面积图', alias: [], def: '使用带填充区域的线段显示数据在一个具有顺序性的维度上的变化。' }, - stacked_area_chart: { - name: '堆叠面积图', - alias: [], - def: '使用带不同样式的填充区域的层叠线段来显示多组数据在同一个具有顺序性的维度上的变化,线段在同一维度值上的端点高度按照数值累加。', - }, - percent_stacked_area_chart: { - name: '百分比堆叠面积图', - alias: ['%堆叠面积图', '100%堆叠面积图'], - def: '一种特殊的堆叠面积图,线段在同一维度值上的端点高度代表值在其中的占比,占比总和为百分之百。', - }, - interval_area_chart: { name: '', alias: [], def: 'TBD' }, - stream_chart: { name: '', alias: [], def: 'TBD' }, - column_chart: { name: '柱状图', alias: ['柱形图'], def: '使用柱形显示维度的数值。横轴显示分类维度,纵轴显示相应的值。' }, - grouped_column_chart: { - name: '分组柱状图', - alias: ['簇状柱状图'], - def: '使用颜色不同的柱形并排组成小组来显示各维度的数值。横轴标示出分组,颜色标示出分类,纵轴显示相应的值。', - }, - stacked_column_chart: { - name: '堆叠柱状图', - alias: [], - def: '使用颜色不同的堆叠的柱形来显示各维度的数值。横轴标示出第一个分类维度,颜色标示出第二个分类维度,纵轴显示相应的值。', - }, - percent_stacked_column_chart: { - name: '百分比堆叠柱状图', - alias: ['%堆叠柱状图', '100%堆叠柱状图'], - def: '使用颜色不同的堆叠的柱形来显示各维度的数值。横轴标示出第一个分类维度,颜色标示出第二个分类维度,纵轴显示相应分类所占的百分比。', - }, - interval_column_chart: { name: '', alias: [], def: 'TBD' }, - range_column_chart: { name: '区间柱状图', alias: [], def: '区间柱状图是一种特殊的柱状图,柱子不一定要从 0 开始,而是用柱子长度表示一个从起始值到终止值的区间。' }, - waterfall_chart: { name: '瀑布图', alias: ['桥图'], def: '瀑布图形似瀑布流水,采用绝对值与相对值结合的方式,适用于表达数个特定数值之间的数量变化关系。' }, - histogram: { name: '直方图', alias: [], def: '直方图是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。' }, - bar_chart: { name: '条形图', alias: ['条状图'], def: '使用条形显示维度的数值。纵轴显示分类维度,横轴显示相应的值。' }, - grouped_bar_chart: { - name: '分组条形图', - alias: ['簇状条形图'], - def: '使用颜色不同的条形并排组成小组来显示维度的数值。纵轴标示出分组,颜色标示出分类,横轴显示相应的值。', - }, - stacked_bar_chart: { - name: '堆叠条形图', - alias: [], - def: '使用颜色不同的堆叠的条形来显示各维度的数值。纵轴标示出第一个分类维度,颜色标示出第二个分类维度,横轴显示相应的值。', - }, - percent_stacked_bar_chart: { - name: '百分比堆叠条形图', - alias: ['%堆叠条形图', '100%堆叠条形图'], - def: '使用颜色不同的堆叠的条形来显示各维度的数值。纵轴标示出第一个分类维度,颜色标示出第二个分类维度,横轴显示相应分类所占的百分比。', - }, - interval_bar_chart: { name: '', alias: [], def: 'TBD' }, - range_bar_chart: { name: '区间条形图', alias: [], def: '区间条形图是一种特殊的条形图,条不一定要从 0 开始,而是用长度表示一个从起始值到终止值的区间。' }, - radial_bar_chart: { name: '', alias: [], def: 'TBD' }, - mirror_bar_chart: { name: '', alias: [], def: 'TBD' }, - bullet_chart: { name: '子弹图', alias: ['靶心图', '标靶图'], def: '子弹图可用于将度量的绩效可视化并与目标值和定性刻度。' }, - pie_chart: { name: '饼图', alias: [], def: '通过扇形区块的颜色和弧长(角度、面积)来展现数据的分类和占比情况。' }, - donut_chart: { name: '环图', alias: ['甜甜圈图'], def: '通过弧形区块的颜色和弧长来展现数据的分类和占比情况。' }, - nested_pie_chart: { name: '', alias: [], def: 'TBD' }, - rose_chart: { - name: '玫瑰图', - alias: ['南丁格尔图', '鸡冠花图', '极坐标面积图'], - def: '统计学家和医学改革家佛罗伦萨‧南丁格尔在克里米亚战争期间创造了这种图表。尽管外形很像饼图,但本质上来说,南丁格尔玫瑰图更像在极坐标下绘制的柱状图或堆叠柱状图。只不过,它用半径来反映数值。', - }, - scatter_plot: { name: '散点图', alias: [], def: '散点图是将所有的数据以不同颜色的点的形式展现在平面直角坐标系上的统计图表。' }, - bubble_chart: { name: '气泡图', alias: [], def: '气泡图是一种多变量的统计图表,由笛卡尔坐标系(直角坐标系)和大小不一、颜色不同的圆组成,可以看作是散点图的变形。' }, - non_ribbon_chord_diagram: { name: '', alias: [], def: 'TBD' }, - arc_diagram: { name: '弧形图', alias: [], def: '弧形图是一种关系图的特殊布局,节点被排列在同一水平线上,关系由节点间的圆弧线表示。' }, - chord_diagram: { name: '', alias: [], def: 'TBD' }, - treemap: { name: '', alias: [], def: 'TBD' }, - sankey_diagram: { name: '桑基图', alias: ['桑吉图'], def: '桑基图,是一种表现流程的示意图,用于描述一组值到另一组值的流向。分支的宽度对应了数据流量的大小。' }, - funnel_chart: { name: '漏斗图', alias: [], def: '漏斗图,形如“漏斗”,用于单流程分析,在开始和结束之间由N个流程环节组成。' }, - overlapping_funnel_chart: { name: '', alias: [], def: 'TBD' }, - mirror_funnel_chart: { name: '对比漏斗图', alias: ['对称漏斗图', '镜像漏斗图'], def: '对比漏斗图是两个独立的漏斗图以一根中轴线对称展开的图表形式。' }, - boxplot: { name: '', alias: [], def: 'TBD' }, - heatmap: { name: '热力图', alias: ['区块热力图'], def: '热力图,是一种通过对色块着色来显示数据的统计图表。' }, - density_heatmap: { name: '密度热力图', alias: ['热力图'], def: '密度热力图是一种用在连续坐标系上用色点展现密度分布的统计图表。' }, - gauge_chart: { name: '', alias: [], def: 'TBD' }, - radar_chart: { - name: '雷达图', - alias: ['蛛网图'], - def: '将不同系列的多个维度的数据量映射到坐标轴上,这些坐标轴起始于同一个圆心点,通常结束于圆周边缘,将同一组的点使用线连接起来,用颜色区分系列。', - }, - wordcloud: { name: '', alias: [], def: 'TBD' }, - candlestick_chart: { name: '', alias: [], def: 'TBD' }, - compact_box_tree: { name: '紧凑树', alias: [], def: '紧凑树是一种树图布局,从根节点开始,同一深度的节点在同一层,并且布局时会将节点大小考虑进去。' }, - dendrogram: { name: '生态树', alias: [], def: '生态树是一种树图布局,不管数据的深度多少,总是叶节点对齐。不考虑节点大小,布局时将节点视为 1 个像素点。' }, - indented_tree: { name: '缩进树', alias: [], def: '缩进树是一种树图布局,缩进树布局。每个元素会占一行/一列。' }, - radial_tree: { name: '辐射树', alias: [], def: '辐射树是一种树图布局,跟节点位于辐射树中心,其他分支辐射式展开。' }, - flow_diagram: { name: '流程图', alias: [], def: '流程图是一种图解,可视表示在过程或功能内部诸如事件、步骤等之间的顺序关系。' }, - fruchterman_layout_graph: { name: 'Fruchterman 布局力导向图', alias: [], def: '一种使用 Fruchterman 布局算法的力导向图。' }, - force_directed_layout_graph: { - name: '力导向图', - alias: [], - def: '力导向图布局作为较早被发明的一种实际应用布局算法,经过研究者多年改进、扩展,已发展成为一类算法的集合。该类算法的特点是模拟物理世界中的作用力,施加在节点上,并迭代计算以达到合理放置节点、美观布局的一类算法。', - }, - circular_layout_graph: { name: '环形布局关系图', alias: [], def: '环形布局根据参数指定的排序方式对节点进行排序后,将节点排列在圆环上。' }, - spiral_layout_graph: { name: '螺旋布局关系图', alias: [], def: '螺旋布局图的节点排列在一根螺旋线上。' }, - radial_layout_graph: { - name: '辐射布局关系图', - alias: [], - def: '辐射布局根据指定的中心点,根据其他节点与中心点的拓扑距离(最短路径长度)将其余节点放置在以中心点为圆心的同心圆上。', - }, - concentric_layout_graph: { name: '同心圆布局关系图', alias: [], def: '同心圆布局关系图将所有节点放置在同心圆上。' }, - grid_layout_graph: { name: '网格布局关系图', alias: [], def: '网格布局根据参数指定的排序方式对节点进行排序后,将节点排列在网格上。' }, - symbol_map: { - name: '符号地图', - alias: [], - def: '散点地图的变体,用具象的图标指代抽象的圆点,无需图例就能直观看出数据点代表的内容,常用于地图上重要地标的显示或数据量较少时的信息表达。', - }, - chart_map: { name: '复合图表地图', alias: [], def: '是定点地图的变体,使用二维统计图表代替点状符号的一种特殊复合形式。' }, - column_map_3d: { name: '3D 柱状图', alias: [], def: '用形状大小相同的柱状体代替点状符号,高度与数值大小映射共同表达离散现象分布特征的地图' }, - scatter_map: { name: '散点地图', alias: [], def: '指地图上可用一个形状大小相同的圆点来定位,用表达离散现象分布特征的地图,如人口、农作物、动植物等的分布' }, - path_map: { - name: '路径地图', - alias: [], - def: '指需要用一连串首尾不闭合的点坐标对(xi,yi)来定位的一类图层。属于半依比例图层,线端点依附地图比例缩放,但线的粗细不会变化。', - }, - isoline_map: { name: '等值线地图', alias: [], def: 'TBD' }, - arc_map_3d: { - name: '3D 弧线地图', - alias: [], - def: '将两个点的连线绘制成弧形,绘制的弧线可以是贝塞尔曲线,大圆航线,通常用来表示两种地理事物关系和联系,或者人口迁移,物流起点目的地等。', - }, - choropleth_map: { name: '填充地图', alias: [], def: '填充图,也叫分级统计图,可在地图上不同领土区域进行着色,查看区域间的分布对比情况' }, - choropleth_map_3d: { name: '3D 填充地图', alias: [], def: '填充地图的增强实现,通过三维视角中的高度模拟真实地物的高度。' }, - hexagonal_heat_map: { - name: '蜂窝热力地图', - alias: [], - def: '使用六边形将地图区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', - }, - hexagonal_heat_map_3d: { - name: '3D 蜂窝热力地图', - alias: [], - def: '使用3D 六边形将地图区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', - }, - classical_heat_map: { name: '热力地图', alias: [], def: '密度热力图是一种用在连续坐标系上用色点展现密度分布的统计地图。' }, - grid_heat_map: { - name: '网格热力地图', - alias: [], - def: '使用网格区域进行分割,计算每个区域中点数或其他累加值,将离散的点转换为数值。然后将数值映射到每个区域的色值、高度或其他参数', - }, - bubble_map: { name: '气泡地图', alias: [], def: '指地图上用一个形状相同、面积大小和数值成正比的圆点来定位的地图,是散点图的扩展,用于表达离散现象分布特征的地图。' }, - bubble_light_map: { - name: '亮点地图', - alias: [], - def: '散点图的变形,指用一个点代表一个值,连续渐进颜色代表数值大小,并通过色彩的叠加的达到效果增强,专为海量散点数据运用而生,解决远视角下,点颜色无法区分问题', - }, - packed_circles: { name: '', alias: [], def: 'TBD' }, - polar_treemap: { name: '', alias: [], def: 'TBD' }, - sunburst_diagram: { name: '', alias: [], def: 'TBD' }, - liquid_chart: { name: '水波图', alias: ['进度球'], def: '一种用来表示进度的拟物化示意图' }, - }, - }, - }; - - function n(e) { - return e && Object.keys(r).includes(e) ? r[e] : null; - } - - var i = { - line_chart: { - id: 'line_chart', - name: 'Line Chart', - alias: ['Lines'], - family: ['LineCharts'], - def: 'A line chart uses lines with segments to show changes in data in a ordinal dimension.', - purpose: ['Comparison', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Lines'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { - minQty: 0, - maxQty: 1, - fieldConditions: ['Nominal'], - }, { minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], - channel: ['Position', 'Direction'], - recRate: 'Recommended', - }, - step_line_chart: { - id: 'step_line_chart', - name: 'Step Line Chart', - alias: ['Step Lines'], - family: ['LineCharts'], - def: 'A step line chart is a line chart in which points of each line are connected by horizontal and vertical line segments, looking like steps of a staircase.', - purpose: ['Comparison', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Lines'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { - minQty: 0, - maxQty: 1, - fieldConditions: ['Nominal'], - }, { minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], - channel: ['Position', 'Direction'], - recRate: 'Recommended', - }, - area_chart: { - id: 'area_chart', - name: 'Area Chart', - alias: [], - family: ['AreaCharts'], - def: 'An area chart uses series of line segments with overlapped areas to show the change in data in a ordinal dimension.', - purpose: ['Comparison', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Area'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }, { minQty: 0, maxQty: 1, fieldConditions: ['Nominal'] }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - stacked_area_chart: { - id: 'stacked_area_chart', - name: 'Stacked Area Chart', - alias: [], - family: ['AreaCharts'], - def: 'A stacked area chart uses layered line segments with different styles of padding regions to display how multiple sets of data change in the same ordinal dimension, and the endpoint heights of the segments on the same dimension tick are accumulated by value.', - purpose: ['Comparison', 'Composition', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Area'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], - channel: ['Color', 'Length'], - recRate: 'Recommended', - }, - percent_stacked_area_chart: { - id: 'percent_stacked_area_chart', - name: 'Percent Stacked Area Chart', - alias: ['Percent Stacked Area', '% Stacked Area', '100% Stacked Area'], - family: ['AreaCharts'], - def: 'A percent stacked area chart is an extented stacked area chart in which the height of the endpoints of the line segment on the same dimension tick is the accumulated proportion of the ratio, which is 100% of the total.', - purpose: ['Comparison', 'Composition', 'Proportion', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Area'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Time', 'Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], - channel: ['Color', 'Length'], - recRate: 'Recommended', - }, - interval_area_chart: { - id: 'interval_area_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - stream_chart: { - id: 'stream_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - column_chart: { - id: 'column_chart', - name: 'Column Chart', - alias: ['Columns'], - family: ['ColumnCharts'], - def: 'A column chart uses series of columns to display the value of the dimension. The horizontal axis shows the classification dimension and the vertical axis shows the corresponding value.', - purpose: ['Comparison', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Position', 'Color'], - recRate: 'Recommended', - }, - grouped_column_chart: { - id: 'grouped_column_chart', - name: 'Grouped Column Chart', - alias: ['Grouped Column'], - family: ['ColumnCharts'], - def: 'A grouped column chart uses columns of different colors to form a group to display the values ​​of dimensions. The horizontal axis indicates the grouping of categories, the color indicates the categories, and the vertical axis shows the corresponding value.', - purpose: ['Comparison', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - stacked_column_chart: { - id: 'stacked_column_chart', - name: 'Stacked Column Chart', - alias: ['Stacked Column'], - family: ['ColumnCharts'], - def: 'A stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The horizontal axis indicates the first classification dimension, the color indicates the second classification dimension, and the vertical axis shows the corresponding value.', - purpose: ['Comparison', 'Composition', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length', 'Position'], - recRate: 'Recommended', - }, - percent_stacked_column_chart: { - id: 'percent_stacked_column_chart', - name: 'Percent Stacked Column Chart', - alias: ['Percent Stacked Column', '% Stacked Column', '100% Stacked Column'], - family: ['ColumnCharts'], - def: 'A percent stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The horizontal axis indicates the first classification dimension, the color indicates the second classification dimension, and the vertical axis shows the percentage of the corresponding classification.', - purpose: ['Comparison', 'Composition', 'Distribution', 'Proportion'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length'], - recRate: 'Recommended', - }, - interval_column_chart: { - id: 'interval_column_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - range_column_chart: { - id: 'range_column_chart', - name: 'Range Column Chart', - alias: [], - family: ['ColumnCharts'], - def: 'A column chart that does not have to start from zero axis.', - purpose: ['Comparison'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Nominal'], - }], - channel: ['Length'], - recRate: 'Recommended', - }, - waterfall_chart: { - id: 'waterfall_chart', - name: 'Waterfall Chart', - alias: ['Flying Bricks Chart', 'Mario Chart', 'Bridge Chart', 'Cascade Chart'], - family: ['ColumnCharts'], - def: 'A waterfall chart is used to portray how an initial value is affected by a series of intermediate positive or negative values', - purpose: ['Comparison', 'Trend'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal', 'Time', 'Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length', 'Position'], - recRate: 'Recommended', - }, - histogram: { - id: 'histogram', - name: 'Histogram', - alias: [], - family: ['ColumnCharts'], - def: 'A histogram is an accurate representation of the distribution of numerical data.', - purpose: ['Distribution'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Interval'] }], - channel: ['Position'], - recRate: 'Recommended', - }, - bar_chart: { - id: 'bar_chart', - name: 'Bar Chart', - alias: ['Bars'], - family: ['BarCharts'], - def: 'A bar chart uses series of bars to display the value of the dimension. The vertical axis shows the classification dimension and the horizontal axis shows the corresponding value.', - purpose: ['Comparison', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Position', 'Color'], - recRate: 'Recommended', - }, - grouped_bar_chart: { - id: 'grouped_bar_chart', - name: 'Grouped Bar Chart', - alias: ['Grouped Bar'], - family: ['BarCharts'], - def: 'A grouped bar chart uses bars of different colors to form a group to display the values of the dimensions. The vertical axis indicates the grouping of categories, the color indicates the categories, and the horizontal axis shows the corresponding value.', - purpose: ['Comparison', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - stacked_bar_chart: { - id: 'stacked_bar_chart', - name: 'Stacked Bar Chart', - alias: ['Stacked Bar'], - family: ['BarCharts'], - def: 'A stacked bar chart uses stacked bars of different colors to display the values ​​for each dimension. The vertical axis indicates the first classification dimension, the color indicates the second classification dimension, and the horizontal axis shows the corresponding value.', - purpose: ['Comparison', 'Composition', 'Distribution', 'Rank'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length', 'Position'], - recRate: 'Recommended', - }, - percent_stacked_bar_chart: { - id: 'percent_stacked_bar_chart', - name: 'Percent Stacked Bar Chart', - alias: ['Percent Stacked Bar', '% Stacked Bar', '100% Stacked Bar'], - family: ['BarCharts'], - def: 'A percent stacked column chart uses stacked bars of different colors to display the values ​​for each dimension. The vertical axis indicates the first classification dimension, the color indicates the second classification dimension, and the horizontal axis shows the percentage of the corresponding classification.', - purpose: ['Comparison', 'Composition', 'Distribution', 'Proportion'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length'], - recRate: 'Recommended', - }, - interval_bar_chart: { - id: 'interval_bar_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - range_bar_chart: { - id: 'range_bar_chart', - name: 'Range Bar Chart', - alias: [], - family: ['BarCharts'], - def: 'A bar chart that does not have to start from zero axis.', - purpose: ['Comparison'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Nominal'], - }], - channel: ['Length'], - recRate: 'Recommended', - }, - radial_bar_chart: { - id: 'radial_bar_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - mirror_bar_chart: { - id: 'mirror_bar_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - bullet_chart: { - id: 'bullet_chart', - name: 'Bullet Chart', - alias: [], - family: ['BarCharts'], - def: 'A bullet graph is a variation of a bar graph developed by Stephen Few. Seemingly inspired by the traditional thermometer charts and progress bars found in many dashboards, the bullet graph serves as a replacement for dashboard gauges and meters.', - purpose: ['Proportion'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Bars'], - dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Nominal'], - }], - channel: ['Position', 'Color'], - recRate: 'Recommended', - }, - pie_chart: { - id: 'pie_chart', - name: 'Pie Chart', - alias: ['Circle Chart', 'Pie'], - family: ['PieCharts'], - def: 'A pie chart is a chart that the classification and proportion of data are represented by the color and arc length (angle, area) of the sector.', - purpose: ['Comparison', 'Composition', 'Proportion'], - coord: ['Polar'], - category: ['Statistic'], - shape: ['Round'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Angle', 'Area', 'Color'], - recRate: 'Use with Caution', - }, - donut_chart: { - id: 'donut_chart', - name: 'Donut Chart', - alias: ['Donut', 'Doughnut', 'Doughnut Chart', 'Ring Chart'], - family: ['PieCharts'], - def: 'A donut chart is a variation on a Pie chart except it has a round hole in the center which makes it look like a donut.', - purpose: ['Comparison', 'Composition', 'Proportion'], - coord: ['Polar'], - category: ['Statistic'], - shape: ['Round'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['ArcLength'], - recRate: 'Recommended', - }, - nested_pie_chart: { - id: 'nested_pie_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - rose_chart: { - id: 'rose_chart', - name: 'Rose Chart', - alias: ['Nightingale Chart', 'Polar Area Chart', 'Coxcomb Chart'], - family: ['PieCharts'], - def: 'Nightingale Rose Chart is a peculiar combination of the Radar Chart and Stacked Column Chart types of data visualization.', - purpose: ['Comparison', 'Composition', 'Proportion'], - coord: ['Polar'], - category: ['Statistic'], - shape: ['Round'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Angle', 'Color', 'Length'], - recRate: 'Use with Caution', - }, - scatter_plot: { - id: 'scatter_plot', - name: 'Scatter Plot', - alias: ['Scatter Chart', 'Scatterplot'], - family: ['ScatterCharts'], - def: 'A scatter plot is a type of plot or mathematical diagram using Cartesian coordinates to display values for typically two variables for series of data.', - purpose: ['Comparison', 'Distribution'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Scatter'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }, { - minQty: 0, - maxQty: 1, - fieldConditions: ['Nominal'], - }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - bubble_chart: { - id: 'bubble_chart', - name: 'Bubble Chart', - alias: ['Bubble Chart'], - family: ['ScatterCharts'], - def: 'A bubble chart is a type of chart that displays four dimensions of data with x, y positions, circle size and circle color.', - purpose: ['Comparison', 'Distribution'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Scatter'], - dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }, { - minQty: 0, - maxQty: 1, - fieldConditions: ['Nominal'], - }], - channel: ['Color', 'Position', 'Size'], - recRate: 'Recommended', - }, - non_ribbon_chord_diagram: { - id: 'non_ribbon_chord_diagram', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - arc_diagram: { - id: 'arc_diagram', - name: 'Arc Diagram', - alias: [], - family: ['GeneralGraph'], - def: 'A graph where the edges are represented as arcs.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - chord_diagram: { - id: 'chord_diagram', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - treemap: { - id: 'treemap', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - sankey_diagram: { - id: 'sankey_diagram', - name: 'Sankey Diagram', - alias: [], - family: ['GeneralGraph'], - def: 'A graph shows the flows with weights between objects.', - purpose: ['Flow', 'Trend', 'Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - funnel_chart: { - id: 'funnel_chart', - name: 'Funnel Chart', - alias: [], - family: ['FunnelCharts'], - def: 'A funnel chart is often used to represent stages in a sales process and show the amount of potential revenue for each stage.', - purpose: ['Trend'], - coord: ['SymmetricCartesian'], - category: ['Statistic'], - shape: ['Symmetric'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Length'], - recRate: 'Recommended', - }, - overlapping_funnel_chart: { - id: 'overlapping_funnel_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - mirror_funnel_chart: { - id: 'mirror_funnel_chart', - name: 'Mirror Funnel Chart', - alias: ['Contrast Funnel Chart'], - family: ['FunnelCharts'], - def: 'A mirror funnel chart is a funnel chart divided into two series by a central axis.', - purpose: ['Comparison', 'Trend'], - coord: ['SymmetricCartesian'], - category: ['Statistic'], - shape: ['Symmetric'], - dataPres: [{ minQty: 1, maxQty: 1, fieldConditions: ['Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }, { minQty: 1, maxQty: 1, fieldConditions: ['Nominal'] }], - channel: ['Color', 'Length', 'Direction'], - recRate: 'Recommended', - }, - boxplot: { - id: 'boxplot', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - heatmap: { - id: 'heatmap', - name: 'Heatmap', - alias: [], - family: ['HeatmapCharts'], - def: 'A heatmap is a graphical representation of data where the individual values contained in a matrix are represented as colors.', - purpose: ['Distribution'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Square'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Nominal', 'Ordinal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - density_heatmap: { - id: 'density_heatmap', - name: 'Density Heatmap', - alias: ['Heatmap'], - family: ['HeatmapCharts'], - def: 'A density heatmap is a heatmap for representing the density of dots.', - purpose: ['Distribution'], - coord: ['Cartesian2D'], - category: ['Statistic'], - shape: ['Area'], - dataPres: [{ minQty: 3, maxQty: 3, fieldConditions: ['Interval'] }], - channel: ['Color', 'Position', 'Area'], - recRate: 'Recommended', - }, - gauge_chart: { - id: 'gauge_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - radar_chart: { - id: 'radar_chart', - name: 'Radar Chart', - alias: ['Web Chart', 'Spider Chart', 'Star Chart', 'Cobweb Chart', 'Irregular Polygon', 'Kiviat diagram'], - family: ['RadarCharts'], - def: 'A radar chart maps series of data volume of multiple dimensions onto the axes. Starting at the same center point, usually ending at the edge of the circle, connecting the same set of points using lines.', - purpose: ['Comparison'], - coord: ['Radar'], - category: ['Statistic'], - shape: ['Round'], - dataPres: [{ minQty: 1, maxQty: 2, fieldConditions: ['Nominal'] }, { - minQty: 1, - maxQty: 1, - fieldConditions: ['Interval'], - }], - channel: ['Color', 'Position'], - recRate: 'Recommended', - }, - wordcloud: { - id: 'wordcloud', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - candlestick_chart: { - id: 'candlestick_chart', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - compact_box_tree: { - id: 'compact_box_tree', - name: 'CompactBox Tree', - alias: [], - family: ['TreeGraph'], - def: 'A type of tree graph layout which arranges the nodes with same depth on the same level.', - purpose: ['Relation', 'Hierarchy'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - dendrogram: { - id: 'dendrogram', - name: 'Dendrogram', - alias: [], - family: ['TreeGraph'], - def: 'A type of tree graph layout which arranges the leaves on the same level and ignores the node size.', - purpose: ['Relation', 'Hierarchy'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - indented_tree: { - id: 'indented_tree', - name: 'Indented Tree Layout', - alias: [], - family: ['TreeGraph'], - def: 'A type of tree graph layout where each node takes a row or a column.', - purpose: ['Relation', 'Hierarchy'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - radial_tree: { - id: 'radial_tree', - name: 'Radial Tree Layout', - alias: [], - family: ['TreeGraph'], - def: 'A type of tree graph layout which places the root at the center, and the branches around the root radially.', - purpose: ['Relation', 'Hierarchy'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - flow_diagram: { - id: 'flow_diagram', - name: 'Flow Diagram', - alias: ['Dagre Graph Layout', 'Dagre', 'Flow Chart'], - family: ['GeneralGraph'], - def: 'Directed flow graph.', - purpose: ['Relation', 'Flow'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - fruchterman_layout_graph: { - id: 'fruchterman_layout_graph', - name: 'Fruchterman Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of force directed graph layout.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - force_directed_layout_graph: { - id: 'force_directed_layout_graph', - name: 'Force Directed Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'The classical force directed graph layout.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - circular_layout_graph: { - id: 'circular_layout_graph', - name: 'Circular Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of graph layout which arranges all the nodes on a circle.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - spiral_layout_graph: { - id: 'spiral_layout_graph', - name: 'Spiral Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of graph layout which arranges all the nodes along a spiral line.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - radial_layout_graph: { - id: 'radial_layout_graph', - name: 'Radial Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of graph layout which places a focus node on the center and the others on the concentrics centered at the focus node according to the shortest path length to the it.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - concentric_layout_graph: { - id: 'concentric_layout_graph', - name: 'Concentric Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of graph layout which arranges the nodes on concentrics.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - grid_layout_graph: { - id: 'grid_layout_graph', - name: 'Grid Graph Layout', - alias: [], - family: ['GeneralGraph'], - def: 'A type of graph layout arranges the nodes on grids.', - purpose: ['Relation'], - coord: ['Cartesian2D'], - category: ['Graph'], - shape: ['Network'], - dataPres: [{ minQty: 1, maxQty: '*', fieldConditions: ['Nominal'] }], - channel: ['Color', 'Size', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - symbol_map: { - id: 'symbol_map', - name: 'Symbol Map', - alias: [], - family: ['PointLayer'], - def: 'Overlay symbols on the map as glyphs.', - purpose: ['Distribution', 'Comparison', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Scatter', 'Map'], - dataPres: [], - channel: ['Position'], - recRate: 'Recommended', - }, - chart_map: { - id: 'chart_map', - name: 'Chart Map', - alias: [], - family: ['PointLayer'], - def: 'Overlay charts on the map as glyphs.', - purpose: ['Composition', 'Distribution', 'Comparison', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Map'], - dataPres: [], - channel: ['Position'], - recRate: 'Recommended', - }, - column_map_3d: { - id: 'column_map_3d', - name: '3D Column Map', - alias: [], - family: ['PointLayer'], - def: 'Maps that use height of 3D columns to represent distribution.', - purpose: ['Distribution', 'Comparison', 'Spatial'], - coord: [], - category: ['Map'], - shape: ['Map'], - dataPres: [], - channel: ['Position', 'Length'], - recRate: 'Recommended', - }, - scatter_map: { - id: 'scatter_map', - name: 'Scatter Map', - alias: [], - family: ['PointLayer'], - def: 'Overlay dots with same size on the map as glyphs.', - purpose: ['Distribution', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Scatter', 'Map'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - path_map: { - id: 'path_map', - name: 'Path Map', - alias: [], - family: ['LineLayer'], - def: 'Overlay paths on the map as glyphs.', - purpose: ['Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Lines'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - isoline_map: { - id: 'isoline_map', - name: 'Isoline Map', - alias: [], - family: ['LineLayer'], - def: '', - purpose: ['Comparison'], - coord: ['Geo'], - category: ['Map'], - shape: ['Lines'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - arc_map_3d: { - id: 'arc_map_3d', - name: '3D Arc Map', - alias: [], - family: ['LineLayer'], - def: '', - purpose: ['Relation', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Lines'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - choropleth_map: { - id: 'choropleth_map', - name: 'Choropleth Map', - alias: [], - family: ['PolygonLayer'], - def: 'A choropleth map is a type of thematic map in which areas are shaded or patterned in proportion to a statistical variable that represents an aggregate summary of a geographic characteristic within each area, such as population density or per-capita income.', - purpose: ['Comparison', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Area', 'Map'], - dataPres: [], - channel: ['Color', 'Position', 'Opacity', 'Stroke', 'LineWidth'], - recRate: 'Recommended', - }, - choropleth_map_3d: { - id: 'choropleth_map_3d', - name: '3D Choropleth Map', - alias: ['Extrude Map'], - family: ['PolygonLayer'], - def: '', - purpose: ['Comparison'], - coord: ['Geo'], - category: ['Map'], - shape: ['Area', 'Map'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - hexagonal_heat_map: { - id: 'hexagonal_heat_map', - name: 'Hexagonal Heat Map', - alias: [], - family: [], - def: 'Dividing the map area using hexagons.', - purpose: ['Distribution', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Area', 'Map'], - dataPres: [], - channel: ['Size', 'Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - hexagonal_heat_map_3d: { - id: 'hexagonal_heat_map_3d', - name: '3D Hexagonal Heat Map', - alias: [], - family: [], - def: 'Dividing the 3D map area using hexagons.', - purpose: ['Distribution'], - coord: ['Geo'], - category: ['Map'], - shape: ['Map'], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - classical_heat_map: { - id: 'classical_heat_map', - name: 'Classical Heat Map', - alias: [], - family: [], - def: '', - purpose: ['Distribution'], - coord: ['Geo'], - category: ['Map'], - shape: ['Map'], - dataPres: [], - channel: ['Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - grid_heat_map: { - id: 'grid_heat_map', - name: 'Gird Heat Map', - alias: [], - family: [], - def: '', - purpose: ['Distribution'], - coord: [], - category: ['Map'], - shape: ['Map'], - dataPres: [], - channel: ['Color', 'Position', 'Opacity'], - recRate: 'Recommended', - }, - bubble_map: { - id: 'bubble_map', - name: 'Bubble Map', - alias: [], - family: ['PointLayer'], - def: 'Overlay bubbles on the map as glyphs.', - purpose: ['Distribution', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Scatter', 'Map'], - dataPres: [], - channel: ['Position', 'Color', 'Size'], - recRate: 'Recommended', - }, - bubble_light_map: { - id: 'bubble_light_map', - name: 'Bubble Light Map', - alias: [], - family: ['PointLayer'], - def: 'Overlay bubbles with different lightness on the map as glyphs.', - purpose: ['Distribution', 'Spatial'], - coord: ['Geo'], - category: ['Map'], - shape: ['Scatter', 'Map'], - dataPres: [], - channel: ['Position', 'Color', 'Size', 'Opacity'], - recRate: 'Recommended', - }, - packed_circles: { - id: 'packed_circles', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - polar_treemap: { - id: 'polar_treemap', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - sunburst_diagram: { - id: 'sunburst_diagram', - name: '', - alias: [], - family: [], - def: '', - purpose: [], - coord: [], - category: [], - shape: [], - dataPres: [], - channel: [], - recRate: 'Recommended', - }, - liquid_chart: { - id: 'liquid_chart', - name: 'Liquid Chart', - alias: ['Liquid Ball', 'Progress Ball'], - family: ['Others'], - def: 'Liquid chart is a diagram to represent progress.', - purpose: ['Composition'], - coord: ['Other'], - category: ['Diagram'], - shape: ['Round'], - dataPres: [{ minQty: 2, maxQty: 2, fieldConditions: ['Interval'] }], - channel: ['Position'], - recRate: 'Not Recommended', - }, - }; - - function o(e, a) { - void 0 === e && (e = 'en-US'), void 0 === a && (a = !1); - var t = JSON.parse(JSON.stringify(i)), r = {}; - Object.keys(t).forEach((function(e) { - var n = t[e], i = !0; - if (a) for (var o = Object.keys(n), c = 0; c < o.length; c++) { - var s = o[c], l = n[s]; - if ('alias' !== s && 'boolean' != typeof l && (Array.isArray(l) && 0 === l.length || !l)) { - i = !1; - break; - } - } - i && (r[e] = n); - })); - var o = {}; - if (e && 'en-US' != e) { - var c = n(e), s = Object.keys(r); - c && s.forEach((function(e) { - o[e] = {}, o[e].id = e, o[e].name = c.chartTypes[e].name, o[e].alias = c.chartTypes[e].alias, o[e].def = c.chartTypes[e].def, o[e].family = r[e].family.map((function(e) { - return c.concepts.family[e]; - })), o[e].purpose = r[e].purpose.map((function(e) { - return c.concepts.purpose[e]; - })), o[e].coord = r[e].coord.map((function(e) { - return c.concepts.coord[e]; - })), o[e].category = r[e].category.map((function(e) { - return c.concepts.category[e]; - })), o[e].shape = r[e].shape.map((function(e) { - return c.concepts.shape[e]; - })), o[e].channel = r[e].channel.map((function(e) { - return c.concepts.channel[e]; - })), o[e].dataPres = r[e].dataPres.map((function(e) { - var a = {}; - return a.minQty = e.minQty, a.maxQty = e.maxQty, a.fieldConditions = e.fieldConditions.map((function(e) { - return c.concepts.lom[e]; - })), a; - })); - })); - } else o = r; - return o; - } - - function c(e, a) { - var t = e.id; - i[t] = e, Object.keys(a).forEach((function(e) { - var n = r[e]; - n && (n.chartTypes[t] = a[e]); - })); - } - - var s = t(0), - l = ['LineCharts', 'ColumnCharts', 'BarCharts', 'PieCharts', 'AreaCharts', 'ScatterCharts', 'FunnelCharts', 'HeatmapCharts', 'RadarCharts', 'TreeGraph', 'GeneralGraph', 'PolygonLayer', 'LineLayer', 'PointLayer', 'HeatmapLayer', 'Others'], - d = ['Comparison', 'Trend', 'Distribution', 'Rank', 'Proportion', 'Composition', 'Relation', 'Hierarchy', 'Flow', 'Spatial'], - u = ['NumberLine', 'Cartesian2D', 'SymmetricCartesian', 'Cartesian3D', 'Polar', 'NodeLink', 'Radar', 'Geo', 'Other'], - m = ['Statistic', 'Diagram', 'Graph', 'Map'], - h = ['Lines', 'Bars', 'Round', 'Square', 'Area', 'Scatter', 'Symmetric', 'Network', 'Map'], - p = ['Nominal', 'Ordinal', 'Interval', 'Discrete', 'Continuous', 'Time'], - f = ['Position', 'Length', 'Color', 'Area', 'Angle', 'ArcLength', 'Direction', 'Size', 'Opacity', 'Stroke', 'LineWidth', 'Lightness'], - y = ['Recommended', 'Use with Caution', 'Not Recommended']; - - function _(e) { - if (void 0 === e && (e = 'en-US'), e && 'en-US' != e) { - var a = n(e); - if (a && a.concepts) { - var t = a.concepts; - return { - family: Object.values(t.family), - category: Object.values(t.category), - purpose: Object.values(t.purpose), - coord: Object.values(t.coord), - shape: Object.values(t.shape), - channel: Object.values(t.channel), - lom: Object.values(t.lom), - recRate: Object.values(t.recRate), - }; - } - } - return { - family: Object(s.c)(l), - category: Object(s.c)(m), - purpose: Object(s.c)(d), - coord: Object(s.c)(u), - shape: Object(s.c)(h), - channel: Object(s.c)(f), - lom: Object(s.c)(p), - recRate: Object(s.c)(y), - }; - } - - var g = ['line_chart', 'step_line_chart', 'area_chart', 'stacked_area_chart', 'percent_stacked_area_chart', 'interval_area_chart', 'stream_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart', 'interval_column_chart', 'range_column_chart', 'waterfall_chart', 'histogram', 'bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'grouped_bar_chart', 'interval_bar_chart', 'range_bar_chart', 'radial_bar_chart', 'mirror_bar_chart', 'bullet_chart', 'pie_chart', 'donut_chart', 'nested_pie_chart', 'rose_chart', 'scatter_plot', 'bubble_chart', 'non_ribbon_chord_diagram', 'arc_diagram', 'chord_diagram', 'treemap', 'sankey_diagram', 'funnel_chart', 'overlapping_funnel_chart', 'mirror_funnel_chart', 'boxplot', 'heatmap', 'density_heatmap', 'gauge_chart', 'radar_chart', 'wordcloud', 'candlestick_chart', 'compact_box_tree', 'dendrogram', 'indented_tree', 'radial_tree', 'flow_diagram', 'fruchterman_layout_graph', 'force_directed_layout_graph', 'circular_layout_graph', 'spiral_layout_graph', 'radial_layout_graph', 'concentric_layout_graph', 'grid_layout_graph', 'symbol_map', 'chart_map', 'column_map_3d', 'scatter_map', 'path_map', 'isoline_map', 'arc_map_3d', 'choropleth_map', 'choropleth_map_3d', 'hexagonal_heat_map', 'hexagonal_heat_map_3d', 'classical_heat_map', 'grid_heat_map', 'bubble_map', 'bubble_light_map', 'packed_circles', 'polar_treemap', 'sunburst_diagram', 'liquid_chart']; - }, function(e, a, t) { - 'use strict'; - var r = t(4); - window.analyze = r.analyze; - }, function(e, a, t) { - 'use strict'; - - function r(e) { - return (r = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(e) { - return typeof e; - } : function(e) { - return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; - })(e); - } - - Object.defineProperty(a, '__esModule', { value: !0 }), a.dataToDataProps = C, a.dataPropsToSpecs = x, a.analyze = function(e, a) { - console.log('💠💠💠💠💠💠 data 💠💠💠💠💠💠'), console.log(e), console.log('🍯🍯🍯🍯🍯🍯 options 🍯🍯🍯🍯🍯🍯'), console.log(a); - var t = C(e); - return console.log('🔶🔶🔶🔶🔶🔶 dataset analysis 🔶🔶🔶🔶🔶🔶'), console.log(t), x(t, a); - }, a.specToLibConfig = function(e, a) { - var t = (0, l.getMappingForLib)(a), r = t.typeMapping, n = t.configMapping, i = e.type, o = e.channels, c = {}; - i && r[i] && (c.type = r[i]); - for (var s = {}, d = 0, u = Object.entries(o); d < u.length; d++) { - var h = (g = u[d], b = 2, function(e) { - if (Array.isArray(e)) return e; - }(g) || function(e, a) { - if ('undefined' == typeof Symbol || !(Symbol.iterator in Object(e))) return; - var t = [], r = !0, n = !1, i = void 0; - try { - for (var o, c = e[Symbol.iterator](); !(r = (o = c.next()).done) && (t.push(o.value), !a || t.length !== a); r = !0) ; - } catch (e) { - n = !0, i = e; - } finally { - try { - r || null == c.return || c.return(); - } finally { - if (n) throw i; - } - } - return t; - }(g, b) || m(g, b) || function() { - throw new TypeError('Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); - }()), p = h[0], f = h[1], y = n[i]; - if (y) { - var _ = y[p]; - _ && (s[_] = f); - } - } - var g, b; - return c.configs = s, c; - }; - var n, i = t(2), o = (n = t(5)) && n.__esModule ? n : { default: n }, c = function(e) { - if (e && e.__esModule) return e; - if (null === e || 'object' !== r(e) && 'function' != typeof e) return { default: e }; - var a = d(); - if (a && a.has(e)) return a.get(e); - var t = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; - for (var i in e) if (Object.prototype.hasOwnProperty.call(e, i)) { - var o = n ? Object.getOwnPropertyDescriptor(e, i) : null; - o && (o.get || o.set) ? Object.defineProperty(t, i, o) : t[i] = e[i]; - } - t.default = e, a && a.set(e, t); - return t; - }(t(11)), s = t(7), l = t(9); - - function d() { - if ('function' != typeof WeakMap) return null; - var e = new WeakMap; - return d = function() { - return e; - }, e; - } - - function u(e) { - return function(e) { - if (Array.isArray(e)) return h(e); - }(e) || function(e) { - if ('undefined' != typeof Symbol && Symbol.iterator in Object(e)) return Array.from(e); - }(e) || m(e) || function() { - throw new TypeError('Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); - }(); - } - - function m(e, a) { - if (e) { - if ('string' == typeof e) return h(e, a); - var t = Object.prototype.toString.call(e).slice(8, -1); - return 'Object' === t && e.constructor && (t = e.constructor.name), 'Map' === t || 'Set' === t ? Array.from(e) : 'Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? h(e, a) : void 0; - } - } - - function h(e, a) { - (null == a || a > e.length) && (a = e.length); - for (var t = 0, r = new Array(a); t < a; t++) r[t] = e[t]; - return r; - } - - function p(e, a) { - var t = Object.keys(e); - if (Object.getOwnPropertySymbols) { - var r = Object.getOwnPropertySymbols(e); - a && (r = r.filter((function(a) { - return Object.getOwnPropertyDescriptor(e, a).enumerable; - }))), t.push.apply(t, r); - } - return t; - } - - function f(e) { - for (var a = 1; a < arguments.length; a++) { - var t = null != arguments[a] ? arguments[a] : {}; - a % 2 ? p(Object(t), !0).forEach((function(a) { - y(e, a, t[a]); - })) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : p(Object(t)).forEach((function(a) { - Object.defineProperty(e, a, Object.getOwnPropertyDescriptor(t, a)); - })); - } - return e; - } - - function y(e, a, t) { - return a in e ? Object.defineProperty(e, a, { - value: t, - enumerable: !0, - configurable: !0, - writable: !0, - }) : e[a] = t, e; - } - - var _ = (0, i.CKBJson)('en-US', !0); - - function g(e, a) { - return e.distinct < a.distinct ? 1 : e.distinct > a.distinct ? -1 : 0; - } - - function b(e, a) { - return a.every((function(a) { - return e.includes(a); - })); - } - - function v(e, a) { - return a.some((function(a) { - return e.includes(a); - })); - } - - function C(e) { - var a = c.typeAll(e), t = []; - return a.forEach((function(e) { - var a = []; - c.isNominal(e) && a.push('Nominal'), c.isOrdinal(e) && a.push('Ordinal'), c.isInterval(e) && a.push('Interval'), c.isDiscrete(e) && a.push('Discrete'), c.isContinuous(e) && a.push('Continuous'), c.isTime(e) && a.push('Time'); - var r = f(f({}, e), {}, { levelOfMeasurements: a }); - t.push(r); - })), t; - } - - function x(e, a) { - var t = a ? a.purpose : '', r = a ? a.preferences : void 0; - var n = Object.keys(_).map((function(a) { - var n = 0, i = {}, s = 1; - o.default.filter((function(e) { - return 'HARD' === e.hardOrSoft && e.specChartTypes.includes(a); - })).forEach((function(n) { - var o = n.check({ dataProps: e, chartType: a, purpose: t, preferences: r }); - s *= o, i[n.id] = o; - })); - var l = 0; - o.default.filter((function(e) { - return 'SOFT' === e.hardOrSoft && e.specChartTypes.includes(a); - })).forEach((function(n) { - var o = n.check({ dataProps: e, chartType: a, purpose: t, preferences: r }); - l += o, i[n.id] = o; - })), n = s * (1 + l), console.log('💯score: ', n, '=', s, '* (1 +', l, ') ;charttype: ', a), console.log(i); - var d = {}; - if ('pie_chart' === a || 'donut_chart' === a) { - var m = e.find((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })), h = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - h && m ? (d.color = m.name, d.angle = h.name) : n = 0; - } - if ('line_chart' === a || 'step_line_chart' == a) { - var p = e.find((function(e) { - return v(e.levelOfMeasurements, ['Time', 'Ordinal']); - })), f = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })), y = e.find((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })); - y && (d.color = y.name), p && f ? (d.x = p.name, d.y = f.name) : n = 0; - } - if ('area_chart' === a) { - var _ = e.find((function(e) { - return v(e.levelOfMeasurements, ['Time', 'Ordinal']); - })), C = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - _ && C ? (d.x = _.name, d.y = C.name) : n = 0; - } - if ('bar_chart' === a) { - var x = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })).sort(g), P = x[0], O = x[1], S = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - S && P ? (d.y = P.name, d.x = S.name, O && (d.color = O.name)) : n = 0; - } - if ('column_chart' === a) { - var R = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })).sort(g), k = R[0], w = R[1], Q = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - k && Q ? (d.y = Q.name, d.x = k.name, w && (d.color = w.name)) : n = 0; - } - if ('grouped_bar_chart' === a || 'stacked_bar_chart' === a || 'percent_stacked_bar_chart' === a) { - var D = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })).sort(g), M = D[0], T = D[1], A = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - M && T && A ? (d.y = M.name, d.y2 = T.name, d.x = A.name) : n = 0; - } - if ('grouped_column_chart' === a || 'stacked_column_chart' === a || 'percent_stacked_column_chart' === a) { - var N = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })).sort(g), L = N[0], F = N[1], G = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - L && F && G ? (d.x = L.name, d.x2 = F.name, d.y = G.name) : n = 0; - } - if ('stacked_area_chart' === a || 'percent_stacked_area_chart' === a) { - var j = e.find((function(e) { - return v(e.levelOfMeasurements, ['Time', 'Ordinal']); - })), I = e.find((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })), B = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - j && I && B ? (d.x = j.name, d.x2 = I.name, d.y = B.name) : n = 0; - } - if ('radar_chart' === a) { - var z = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })).sort(g), E = z[0], H = z[1], W = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - E && H && W ? (d.angle = E.name, d.series = H.name, d.radius = W.name) : n = 0; - } - if ('scatter_plot' === a) { - var U = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })).sort(g), q = U[0], Y = U[1], $ = e.find((function(e) { - return b(e.levelOfMeasurements, ['Nominal']); - })); - q && Y ? (d.x = q.name, d.y = Y.name, $ && (d.color = $.name)) : n = 0; - } - if ('bubble_chart' === a) { - for (var K = e.filter((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })), J = { x: K[0], y: K[1], corr: 0, size: K[2] }, X = function(e) { - for (var a = function(a) { - var t = c.pearson(K[e], K[a]); - Math.abs(t) > J.corr && (J.x = K[e], J.y = K[a], J.corr = t, J.size = K[u(Array(K.length).keys()).find((function(t) { - return t !== e && t !== a; - })) || 0]); - }, t = e + 1; t < K.length; t++) a(t); - }, Z = 0; Z < K.length; Z++) X(Z); - var V = J.x, ee = J.y, ae = J.size, te = e.find((function(e) { - return v(e.levelOfMeasurements, ['Nominal']); - })); - V && ee && ae && te ? (d.x = V.name, d.y = ee.name, d.size = ae.name, d.color = te.name) : n = 0; - } - if ('histogram' === a) { - var re = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - re ? d.x = re.name : n = 0; - } - if ('heatmap' === a) { - var ne = e.filter((function(e) { - return v(e.levelOfMeasurements, ['Nominal', 'Ordinal']); - })).sort(g), ie = ne[0], oe = ne[1], ce = e.find((function(e) { - return b(e.levelOfMeasurements, ['Interval']); - })); - ie && oe && ce ? (d.x = ie.name, d.y = oe.name, d.color = ce.name) : n = 0; - } - return { type: a, channels: d, score: n }; - })).filter((function(e) { - return e.score && 0 !== e.score && (0, s.translate)(e.type); - })).sort((function(e, a) { - return e.score < a.score ? 1 : e.score > a.score ? -1 : 0; - })); - return console.log('🍒🍒🍒🍒🍒🍒 resultList 🍒🍒🍒🍒🍒🍒'), console.log(n), n; - } - }, function(e, a, t) { - 'use strict'; - - function r(e) { - return (r = 'function' == typeof Symbol && 'symbol' == typeof Symbol.iterator ? function(e) { - return typeof e; - } : function(e) { - return e && 'function' == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? 'symbol' : typeof e; - })(e); - } - - Object.defineProperty(a, '__esModule', { value: !0 }), Object.defineProperty(a, 'Rule', { - enumerable: !0, - get: function() { - return i.default; - }, - }), Object.defineProperty(a, 'Preferences', { - enumerable: !0, get: function() { - return i.Preferences; - }, - }), a.default = void 0; - var n, i = function(e) { - if (e && e.__esModule) return e; - if (null === e || 'object' !== r(e) && 'function' != typeof e) return { default: e }; - var a = o(); - if (a && a.has(e)) return a.get(e); - var t = {}, n = Object.defineProperty && Object.getOwnPropertyDescriptor; - for (var i in e) if (Object.prototype.hasOwnProperty.call(e, i)) { - var c = n ? Object.getOwnPropertyDescriptor(e, i) : null; - c && (c.get || c.set) ? Object.defineProperty(t, i, c) : t[i] = e[i]; - } - t.default = e, a && a.set(e, t); - return t; - }(t(1)); - - function o() { - if ('function' != typeof WeakMap) return null; - var e = new WeakMap; - return o = function() { - return e; - }, e; - } - - var c = ((n = t(6)) && n.__esModule ? n : { default: n }).default; - a.default = c; - }, function(e, a, t) { - 'use strict'; - Object.defineProperty(a, '__esModule', { value: !0 }), a.default = void 0; - var r, n = (r = t(1)) && r.__esModule ? r : { default: r }; - - function i(e) { - if ('undefined' == typeof Symbol || null == e[Symbol.iterator]) { - if (Array.isArray(e) || (e = function(e, a) { - if (!e) return; - if ('string' == typeof e) return o(e, a); - var t = Object.prototype.toString.call(e).slice(8, -1); - 'Object' === t && e.constructor && (t = e.constructor.name); - if ('Map' === t || 'Set' === t) return Array.from(e); - if ('Arguments' === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)) return o(e, a); - }(e))) { - var a = 0, t = function() { - }; - return { - s: t, n: function() { - return a >= e.length ? { done: !0 } : { done: !1, value: e[a++] }; - }, e: function(e) { - throw e; - }, f: t, - }; - } - throw new TypeError('Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.'); - } - var r, n, i = !0, c = !1; - return { - s: function() { - r = e[Symbol.iterator](); - }, n: function() { - var e = r.next(); - return i = e.done, e; - }, e: function(e) { - c = !0, n = e; - }, f: function() { - try { - i || null == r.return || r.return(); - } finally { - if (c) throw n; - } - }, - }; - } - - function o(e, a) { - (null == a || a > e.length) && (a = e.length); - for (var t = 0, r = new Array(a); t < a; t++) r[t] = e[t]; - return r; - } - - var c = (0, t(2).CKBJson)('en-US', !0), s = Object.keys(c); - - function l(e, a) { - return e.distinct < a.distinct ? 1 : e.distinct > a.distinct ? -1 : 0; - } - - function d(e, a) { - return a.every((function(a) { - return e.includes(a); - })); - } - - function u(e, a) { - return a.some((function(a) { - return e.includes(a); - })); - } - - function m(e, a) { - var t = a.map((function(e) { - return e.levelOfMeasurements; - })); - if (t) { - var r, n = 0, o = i(t); - try { - for (o.s(); !(r = o.n()).done;) { - var c = r.value; - c && u(c, e.fieldConditions) && (n += 1); - } - } catch (e) { - o.e(e); - } finally { - o.f(); - } - if (n >= e.minQty && (n <= e.maxQty || '*' === e.maxQty)) return !0; - } - return !1; - } - - var h = [new n.default('data-check', 'HARD', s, 1, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && r && c[r]) { - a = 1; - var n, o = i(c[r].dataPres || []); - try { - for (o.s(); !(n = o.n()).done;) { - if (!m(n.value, t)) return a = 0; - } - } catch (e) { - o.e(e); - } finally { - o.f(); - } - } - return a; - })), new n.default('data-field-qty', 'HARD', s, 1, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && r && c[r]) { - a = 1; - var n = (c[r].dataPres || []).map((function(e) { - return e.minQty; - })).reduce((function(e, a) { - return e + a; - })); - if (t.length) t.length >= n && (a = 1); - } - return a; - })), new n.default('no-redundant-field', 'HARD', s, 1, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && r && c[r]) { - var n = (c[r].dataPres || []).map((function(e) { - return '*' === e.maxQty ? 99 : e.maxQty; - })).reduce((function(e, a) { - return e + a; - })); - if (t.length) t.length <= n && (a = 1); - } - return a; - })), new n.default('purpose-check', 'HARD', s, 1, (function(e) { - var a = 0, t = e.chartType, r = e.purpose; - if (!r) return a = 1; - if (t && c[t] && r && (c[t].purpose || '').includes(r)) return a = 1; - return a; - })), new n.default('series-qty-limit', 'SOFT', ['pie_chart', 'donut_chart', 'radar_chart', 'rose_chart'], .8, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType, n = 6; - if ('pie_chart' !== r && 'donut_chart' !== r && 'rose_chart' !== r || (n = 6), 'radar_chart' === r && (n = 8), t) { - var i = t.find((function(e) { - return d(e.levelOfMeasurements, ['Nominal']); - })), o = i && i.count ? i.count : 0; - o >= 2 && o <= n && (a = 2 / o); - } - return a; - })), new n.default('bar-series-qty', 'SOFT', ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'], .5, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && r) { - var n = t.find((function(e) { - return d(e.levelOfMeasurements, ['Nominal']); - })), i = n && n.count ? n.count : 0; - i >= 2 && i <= 20 ? a = 1 : i > 20 && (a = 20 / i); - } - return a; - })), new n.default('line-field-time-ordinal', 'SOFT', ['line_chart', 'area_chart', 'stacked_area_chart', 'percent_stacked_area_chart'], 1, (function(e) { - var a = 0, t = e.dataProps; - t && (t.find((function(e) { - return u(e.levelOfMeasurements, ['Ordinal', 'Time']); - })) && (a = 1)); - return a; - })), new n.default('landscape-or-portrait', 'SOFT', ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart', 'column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'], .3, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType, n = e.preferences; - return t && r && n && n.canvasLayout && ('portrait' === n.canvasLayout && ['bar_chart', 'grouped_bar_chart', 'stacked_bar_chart', 'percent_stacked_bar_chart'].includes(r) || 'landscape' === n.canvasLayout && ['column_chart', 'grouped_column_chart', 'stacked_column_chart', 'percent_stacked_column_chart'].includes(r)) && (a = 1), a; - })), new n.default('diff-pie-sector', 'SOFT', ['pie_chart', 'donut_chart'], .5, (function(e) { - var a = 0, t = e.dataProps; - if (t) { - var r = t.find((function(e) { - return d(e.levelOfMeasurements, ['Interval']); - })); - if (r && r.sum && r.samples) { - var n = 1 / r.sum, i = r.samples.map((function(e) { - return e * n; - })).reduce((function(e, a) { - return e * a; - })), o = r.samples.length, c = Math.pow(1 / o, o); - a = Math.abs(c - Math.abs(i)) / c; - } - } - return a; - })), new n.default('nominal-enum-combinatorial', 'SOFT', s, 1, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && s) { - var n = t.filter((function(e) { - return d(e.levelOfMeasurements, ['Nominal']); - })); - if (n.length >= 2) { - var i = n.sort(l), o = i[0], c = i[1]; - if (o.distinct === o.count && ['bar_chart', 'column_chart'].includes(r) && (a = 1), o.count && o.distinct && c.distinct && o.count >= o.distinct * c.distinct) { - ['grouped_bar_chart', 'grouped_column_chart', 'stacked_bar_chart', 'stacked_column_chart'].includes(r) && (a = 1); - } - } - } - return a; - })), new n.default('limit-series', 'SOFT', s, 1, (function(e) { - var a = 0, t = e.dataProps, r = e.chartType; - if (t && s) { - var n = t.filter((function(e) { - return u(e.levelOfMeasurements, ['Nominal', 'Ordinal']); - })); - if (n.length >= 2) { - var i = n.sort(l)[1]; - i.distinct && (a = 1 / i.distinct, i.distinct > 6 && 'heatmap' === r ? a = 2 : 'heatmap' === r && (a = 0)); - } - } - return a; - }))]; - a.default = h; - }, function(e, a, t) { - 'use strict'; - Object.defineProperty(a, '__esModule', { value: !0 }), a.uuid = function() { - return ''.concat('xxxx-xxxx-xxxx'.replace(/x/g, (function() { - return (16 * Math.random() | 0).toString(16); - }))); - }, a.getElementDispay = function(e) { - return getComputedStyle(e, null).display; - }, a.getPosition = function(e) { - var a = e.getBoundingClientRect(), t = a.top, r = a.left; - return { top: t + window.scrollY, left: r + window.scrollX }; - }, a.translate = function(e) { - return { - line_chart: 'Line', - step_line_chart: 'StepLine', - area_chart: 'Area', - stacked_area_chart: 'StackArea', - percent_stacked_area_chart: 'PercentageStackArea', - column_chart: 'Column', - grouped_column_chart: 'GroupColumn', - stacked_column_chart: 'StackColumn', - percent_stacked_column_chart: 'PercentageStackColumn', - bar_chart: 'Bar', - grouped_bar_chart: 'GroupBar', - stacked_bar_chart: 'StackBar', - percent_stacked_bar_chart: 'PercentageStackBar', - histogram: 'Histogram', - pie_chart: 'Pie', - donut_chart: 'Ring', - rose_chart: 'Rose', - scatter_plot: 'Scatter', - bubble_chart: 'Bubble', - radar_chart: 'Radar', - heatmap: 'Matrix', - }[e] || e; - }, a.createLayer = function(e) { - ['relative', 'absolute', 'fixed'].includes(getComputedStyle(e).position) || (e.style.position = 'relative'); - var a = document.createElement('div'); - return a.style.height = '100%', a.style.width = '100%', a.style.position = 'absolute', a.style.top = '0px', a.style.left = '0px', a.style.pointerEvents = 'none', e.appendChild(a), a; - }, a.DEFAULT_FEEDBACK = function(e) { - return function(a) { - var t = document.createElement('div'); - t.className = ''.concat(r.CLASS_PREFIX, 'no_data_content'), t.innerHTML = '\n
\n \n
\n
'.concat(e, '
\n '), a.appendChild(t); - }; - }; - var r = t(8); - }, function(e, a, t) { - 'use strict'; - Object.defineProperty(a, '__esModule', { value: !0 }), a.CLASS_PREFIX = void 0; - var r = '__AUTO_CHART__'; - a.CLASS_PREFIX = r; - var n = '\n .'.concat(r, 'toolbar {\n position: absolute;\n bottom: 0px;\n left: 0px;\n z-index: 10;\n display: none;\n box-sizing: border-box;\n }\n .').concat(r, 'toolbar * {\n box-sizing: border-box;\n }\n .').concat(r, 'advice_container {\n width: 290px;\n display: none;\n padding: 0 16px;\n background: #454857;\n position: absolute;\n bottom: 100%;\n left: 0;\n max-height: 195px;\n overflow: auto;\n }\n .').concat(r, 'advice {\n height: 65px;\n font-size: 12px;\n color: #FFFFFF;\n display: flex;\n padding: 9px 0;\n cursor: pointer;\n border-bottom: 1px solid #D8D8D8;\n }\n .').concat(r, 'advice img {\n height: 46px;\n width: 46px;\n background: #fff;\n }\n .').concat(r, 'advice * {\n pointer-events: none;\n line-height: 46px;\n font-size: 14px;\n }\n .').concat(r, 'advice>div:nth-child(1) {\n width: 46px;\n }\n .').concat(r, 'advice>div:nth-child(2) {\n width: 46px;\n }\n .').concat(r, 'advice>div:nth-child(3) {\n margin-left: 8px;\n flex-grow: 1;\n }\n .').concat(r, 'advice>div:nth-child(3) div {\n line-height: 23px;\n text-align: right;\n }\n .').concat(r, 'advice:last-child{\n border: none;\n }\n .').concat(r, 'chart_type_btn {\n height: 24px;\n width: 24px;\n text-align: center;\n display: inline-block;\n padding: 6px;\n background: #454857;\n color: #fff;\n cursor: pointer;\n }\n .').concat(r, 'chart_type_btn img {\n pointer-events: none;\n height: 12px;\n width: 12px;\n vertical-align: top;\n }\n .').concat(r, 'dev_btn {\n height: 27px;\n line-height: 27px;\n background: #454857;\n padding: 0 7px;\n color: #fff;\n display: none;\n position: absolute;\n bottom: 0;\n right: 0;\n user-select: none;\n cursor: pointer;\n }\n .').concat(r, 'dev_panel {\n border-radius: 5px;\n overflow: hidden;\n box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.25);\n box-sizing: border-box;\n position: absolute;\n background: #fff;\n z-index: 1000;\n display: none;\n }\n .').concat(r, 'dev_panel header {\n box-sizing: border-box;\n height: ').concat(32, 'px;\n width: 100%;\n padding-left: 16px;\n line-height: ').concat(32, 'px;\n cursor: move; \n color: #fff;\n position: relative;\n z-index: 1;\n background-color: #454857;\n box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.45);\n }\n .').concat(r, 'dev_panel_close {\n margin: 8px;\n height: 16px;\n width: 16px;\n border-radius: 50%;\n background: #fff;\n text-align: center;\n color: #454857;\n font-size: 14px;\n line-height: 14px;\n cursor: pointer;\n float: right;\n }\n .').concat(r, 'dev_panel_content {\n width: 100%;\n height: calc(100% - ').concat(32, 'px);\n }\n .').concat(r, 'dev_panel_content iframe {\n height: 100%;\n width: 100%;\n border: none;\n }\n .').concat(r, 'dev_panel_mask {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: -1;\n }\n .').concat(r, 'no_data_content, .').concat(r, 'mock_guide {\n color: #aaa;\n text-align: center;\n position: relative;\n top: 50%;\n transform: translateY(-50%);\n }\n .').concat(r, 'mock_guide_button {\n margin-top: 22px;\n border-radius: 3px;\n height: 30px;\n width: 116px;\n font-size: 14px;\n display: inline-block;\n line-height: 30px;\n background: #454859;\n color: #fff;\n cursor: pointer;\n }\n \n'), - i = document.createElement('style'); - i.textContent = n, document.head.prepend(i); - }, function(e, a, t) { - 'use strict'; - Object.defineProperty(a, '__esModule', { value: !0 }), a.getMappingForLib = function(e) { - return { typeMapping: n[e], configMapping: i[e] }; - }; - var r = t(10), n = { G2Plot: r.G2PLOT_TYPE_MAPPING, antdCharts: r.G2PLOT_TYPE_MAPPING }, - i = { G2Plot: r.G2PLOT_CONFIG_MAPPING, antdCharts: r.G2PLOT_CONFIG_MAPPING }; - }, function(e, a, t) { - 'use strict'; - Object.defineProperty(a, '__esModule', { value: !0 }), a.G2PLOT_TYPE_MAPPING = a.G2PLOT_CONFIG_MAPPING = void 0; - a.G2PLOT_CONFIG_MAPPING = { - line_chart: { x: 'xField', y: 'yField', color: 'seriesField' }, - area_chart: { x: 'xField', y: 'yField' }, - bar_chart: { x: 'xField', y: 'yField', color: 'colorField' }, - column_chart: { x: 'xField', y: 'yField', color: 'colorField' }, - pie_chart: { angle: 'angleField', color: 'colorField' }, - donut_chart: { angle: 'angleField', color: 'colorField' }, - grouped_bar_chart: { y: 'yField', y2: 'groupField', x: 'xField' }, - stacked_bar_chart: { y: 'yField', y2: 'stackField', x: 'xField' }, - percent_stacked_bar_chart: { y: 'yField', y2: 'stackField', x: 'xField' }, - grouped_column_chart: { x: 'xField', x2: 'groupField', y: 'yField' }, - stacked_column_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, - percent_stacked_column_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, - stacked_area_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, - percent_stacked_area_chart: { x: 'xField', x2: 'stackField', y: 'yField' }, - radar_chart: { angle: 'angleField', radius: 'radiusField', series: 'seriesField' }, - scatter_plot: { x: 'xField', y: 'yField', color: 'colorField' }, - bubble_chart: { x: 'xField', y: 'yField', size: 'sizeField', color: 'colorField' }, - heatmap: { x: 'xField', y: 'yField', color: 'colorField', size: 'sizeField' }, - density_heatmap: { x: 'xField', y: 'yField', color: 'colorField' }, - step_line_chart: { x: 'xField', y: 'yField', color: 'seriesField' }, - funnel_chart: { x: 'xField', y: 'yField' }, - waterfall_chart: { x: 'xField', y: 'yField' }, - mirror_funnel_chart: { x: 'xField', y: 'yField', x2: 'compareField' }, - histogram: { x: 'binField' }, - }; - a.G2PLOT_TYPE_MAPPING = { - line_chart: 'Line', - step_line_chart: 'StepLine', - area_chart: 'Area', - stacked_area_chart: 'StackedArea', - percent_stacked_area_chart: 'PercentageStackedArea', - column_chart: 'Column', - grouped_column_chart: 'GroupedColumn', - stacked_column_chart: 'StackedColumn', - percent_stacked_column_chart: 'PercentageStackedColumn', - bar_chart: 'Bar', - grouped_bar_chart: 'GroupedBar', - stacked_bar_chart: 'StackedBar', - percent_stacked_bar_chart: 'PercentageStackedBar', - histogram: 'Histogram', - pie_chart: 'Pie', - donut_chart: 'Donut', - rose_chart: 'Rose', - scatter_plot: 'Scatter', - bubble_chart: 'Bubble', - radar_chart: 'Radar', - heatmap: 'Heatmap', - }; - }, function(e, a, t) { - 'use strict'; - t.r(a), t.d(a, 'type', (function() { - return j; - })), t.d(a, 'typeAll', (function() { - return I; - })), t.d(a, 'isOrdinal', (function() { - return B; - })), t.d(a, 'isConst', (function() { - return z; - })), t.d(a, 'isUnique', (function() { - return E; - })), t.d(a, 'isDiscrete', (function() { - return H; - })), t.d(a, 'isContinuous', (function() { - return W; - })), t.d(a, 'isInterval', (function() { - return U; - })), t.d(a, 'isNominal', (function() { - return q; - })), t.d(a, 'isTime', (function() { - return Y; - })), t.d(a, 'pearson', (function() { - return $; - })); - var r = t(0), n = '([-_./\\s])', i = '\\d{2,4}', o = '(0?[1-9]|1[012])', c = '(0?[1-9]|[12]\\d|3[01])', - s = '(0?\\d|1\\d|2[0-4])', l = '(0?\\d|[012345]\\d)', d = '(Z|[+-]' + s + '(:' + l + ')?)', - u = ['' + i + n + '?W([0-4]\\d|5[0-2])(' + n + '?([1-7]))?', '' + o + n + '?' + c + n + '?' + i, '' + i + n + '?' + o + n + '?' + c, '' + i + n + o, '' + i + n + '?((([0-2]\\d|3[0-5])\\d)|36[0-6])'], - m = [s + ':?' + l + ':?(0?\\d|[012345]\\d)([.,]\\d{1,4})?' + d + '?', s + ':?' + l + '?' + d], - h = Object(r.c)(u, m); - u.forEach((function(e) { - m.forEach((function(a) { - h.push(e + '[T\\s]' + a); - })); - })); - var p = h.map((function(e) { - return new RegExp('^' + e + '$'); - })); - var f = [/^(19|20)\d{2}$/, /^\d{4}(0?[1-9]|1[012])$/, /^\d{4}(0?[1-9]|1[012])(0?[1-9]|[12]\d|3[01])$/]; - - function y(e, a) { - if (e) throw new Error(a); - } - - function _(e) { - return null == e || '' === e || Number.isNaN(e) || 'null' === e; - } - - function g(e) { - return 'number' == typeof e ? Number.isInteger(e) : !('string' != typeof e || !C(e)) && !e.includes('.'); - } - - function b(e) { - return 'number' == typeof e ? !Number.isNaN(e) && !Number.isInteger(e) : !('string' != typeof e || !C(e)) && e.includes('.'); - } - - function v(e) { - return !(!e || Object.getPrototypeOf(e) !== Date.prototype) || 'string' == typeof e && function(e) { - var a, t; - try { - for (var n = Object(r.d)(p), i = n.next(); !i.done; i = n.next()) { - if (i.value.test(e.trim())) return !0; - } - } catch (e) { - a = { error: e }; - } finally { - try { - i && !i.done && (t = n.return) && t.call(n); - } finally { - if (a) throw a.error; - } - } - return !1; - }(e); - } - - function C(e) { - var a, t, n = !1; - /^[+-]/.test(e) && (e = e.slice(1)); - try { - for (var i = Object(r.d)(e), o = i.next(); !o.done; o = i.next()) { - var c = o.value; - if ('.' === c) { - if (!1 === n) { - n = !0; - continue; - } - return !1; - } - if (!/[0-9]/.test(c)) return !1; - } - } catch (e) { - a = { error: e }; - } finally { - try { - o && !o.done && (t = i.return) && t.call(i); - } finally { - if (a) throw a.error; - } - } - return '' !== e.trim(); - } - - var x = new WeakMap; - - function P(e, a, t) { - return x.get(e) || x.set(e, new Map), x.get(e).set(a, t), t; - } - - function O(e, a) { - var t = x.get(e); - if (t) return t.get(a); - } - - function S(e) { - var a = O(e, 'min'); - return void 0 !== a ? a : P(e, 'min', Math.min.apply(Math, Object(r.c)(e))); - } - - function R(e) { - var a = O(e, 'max'); - return void 0 !== a ? a : P(e, 'max', Math.max.apply(Math, Object(r.c)(e))); - } - - function k(e) { - var a = O(e, 'minIndex'); - return void 0 !== a ? a : P(e, 'minIndex', function(e) { - var a = e[0], t = 0; - for (var r in e) e[r] < a && (t = Number(r), a = e[r]); - return t; - }(e)); - } - - function w(e) { - var a = O(e, 'maxIndex'); - return void 0 !== a ? a : P(e, 'maxIndex', function(e) { - var a = e[0], t = 0; - for (var r in e) e[r] > a && (t = Number(r), a = e[r]); - return t; - }(e)); - } - - function Q(e) { - var a = O(e, 'sum'); - return void 0 !== a ? a : P(e, 'sum', e.reduce((function(e, a) { - return a + e; - }), 0)); - } - - function D(e) { - var a = {}; - return e.forEach((function(e) { - a[e] ? a[e] += 1 : a[e] = 1; - })), a; - } - - function M(e) { - return e.sort((function(e, a) { - return e > a ? 1 : -1; - })); - } - - function T(e, a, t) { - return void 0 === t && (t = !1), y(a <= 0 || a >= 100, 'percent cannot be between (0, 100)'), (t ? e : M(e))[Math.ceil(e.length * a / 100) - 1]; - } - - function A(e) { - return Q(e) / e.length; - } - - function N(e) { - var a = A(e), t = O(e, 'variance'); - return void 0 === t ? P(e, 'variance', e.reduce((function(e, t) { - return e + Math.pow(t - a, 2); - }), 0) / e.length) : t; - } - - function L(e) { - return Math.sqrt(N(e)); - } - - function F(e, a) { - return function(e, a) { - return y(e.length !== a.length, 'x and y must has same length'), A(e.map((function(e, t) { - return e * a[t]; - }))) - A(e) * A(a); - }(e, a) / (Math.sqrt(A(e.map((function(e) { - return e * e; - }))) - Math.pow(A(e), 2)) * Math.sqrt(A(a.map((function(e) { - return e * e; - }))) - Math.pow(A(a), 2))); - } - - function G(e) { - return _(e) ? 'null' : 'number' == typeof e ? Number.isInteger(e) ? 'integer' : 'float' : 'string' == typeof e && C(e) ? e.includes('.') ? 'float' : 'integer' : v(e) ? 'date' : 'string'; - } - - function j(e) { - var a, t = e.map((function(e) { - return _(e) ? null : e; - })), r = D(t), n = r.null ? t.filter((function(e) { - return null !== e; - })) : t, i = t.map((function(e) { - return G(e); - })), o = Object.keys(D(i)).filter((function(e) { - return 'null' !== e; - })); - switch (o.length) { - case 0: - a = 'null'; - break; - case 1: - if ('integer' === (a = o[0])) for (var c = t.filter((function(e) { - return null !== e; - })), s = function(e) { - var t = f[e]; - if (!c.some((function(e) { - return !t.test(e); - }))) return a = 'date', 'break'; - }, l = 0; l < f.length; l++) { - if ('break' === s(l)) break; - } - break; - case 2: - a = o.includes('integer') && o.includes('float') ? 'float' : 'string'; - break; - default: - a = 'string'; - } - var d, u = function(e) { - return Array.from(new Set(e)); - }(n), m = { - count: e.length, - distinct: u.length, - type: o.length <= 1 ? o[0] || 'null' : 'mixed', - recommendation: a, - missing: r.null || 0, - samples: e, - valueMap: r, - }; - if (o.length > 1) { - var h = {}; - o.forEach((function(e) { - 'date' === e ? h.date = j(n.filter(v)) : 'integer' === e ? h.integer = j(n.filter(g)) : 'float' === e ? h.float = j(n.filter(b)) : 'string' === e && (h.string = j(n.filter((function(e) { - return 'string' === G(e); - })))); - })), m.meta = h; - } - return 2 === m.distinct && 'date' !== m.recommendation && (t.length >= 100 ? m.recommendation = 'boolean' : (d = u, [[!0, !1], [0, 1], ['true', 'false'], ['Yes', 'No'], ['True', 'False'], ['0', '1'], ['是', '否']].some((function(e) { - return d.every((function(a) { - return e.includes(a); - })); - })) && (m.recommendation = 'boolean'))), 'string' === a && Object.assign(m, function(e) { - var a = e.map((function(e) { - return e.length; - })); - return { - maxLength: R(a), minLength: S(a), meanLength: A(a), containsChars: e.some((function(e) { - return /[A-z]/.test(e); - })), containsDigits: e.some((function(e) { - return /[0-9]/.test(e); - })), containsSpace: e.some((function(e) { - return /\s/.test(e); - })), containsNonWorlds: !1, - }; - }(n.map((function(e) { - return '' + e; - })))), 'integer' !== a && 'float' !== a || Object.assign(m, function(e) { - return { - minimum: S(e), - maximum: R(e), - mean: A(e), - percentile5: T(e, 5), - percentile25: T(e, 25), - percentile50: T(e, 50), - percentile75: T(e, 75), - percentile95: T(e, 95), - sum: Q(e), - variance: N(e), - stdev: L(e), - zeros: e.filter((function(e) { - return 0 === e; - })).length, - }; - }(n.map((function(e) { - return 1 * e; - })))), 'date' === a && Object.assign(m, function(e, a) { - void 0 === a && (a = !1); - var t = e.map((function(e) { - if (a) { - var t = '' + e; - if (8 === t.length) return new Date(t.substr(0, 4) + '/' + t.substr(4, 2) + '/' + t.substr(6, 2)).getTime(); - } - return new Date(e).getTime(); - })); - return { minimum: e[k(t)], maximum: e[w(t)] }; - }(n, 'integer' === m.type)), m; - } - - function I(e, a) { - if (y(a && 0 === a.length, 'fields.length woudle greater than 0'), !a) { - var t = new Set; - e.forEach((function(e) { - return Object.keys(e).forEach((function(e) { - return t.add(e); - })); - })), a = Object(r.c)(t); - } - return a.map((function(a) { - return Object(r.a)(Object(r.a)({}, j(e.map((function(e) { - return e[a]; - })))), { name: a }); - })); - } - - function B(e) { - var a = e.samples; - if ('string' !== e.recommendation) return !1; - if (z(e)) return !1; - for (var t = a.filter((function(e) { - return !_(e); - })), r = null, n = null, i = -1, o = -1; ;) { - for (var c = !0, s = 0; s < t.length; s++) { - var l = (d = t[s])[i + 1]; - if (null !== r && 0 !== s || (r = l), l !== r) { - c = !1; - break; - } - } - if (!c) break; - i += 1; - } - for (; ;) { - for (c = !0, s = 0; s < t.length; s++) { - var d; - l = (d = t[s])[d.length - 1 - (o + 1)]; - if (null !== n && 0 !== s || (n = l), l !== n) { - c = !1; - break; - } - } - if (!c) break; - o += 1; - } - var u = [/\d+/, /(零|一|二|三|四|五|六|七|八|九|十)+/, /(一|二|三|四|五|六|日)/, /^[a-z]$/, /^[A-Z]$/]; - if (-1 === i && -1 === o) return !1; - var m = t.map((function(e) { - return e.slice(-1 === i ? 0 : i + 1, -1 === o ? void 0 : e.length - o - 1); - })), h = function(e) { - var a = u[e]; - if (!m.some((function(e) { - return !a.test(e); - }))) return { value: !0 }; - }; - for (s = 0; s < u.length; s++) { - var p = h(s); - if ('object' == typeof p) return p.value; - } - return !1; - } - - function z(e) { - return 1 === e.distinct; - } - - function E(e) { - return e.distinct === e.count; - } - - function H(e) { - return 'integer' === e.recommendation; - } - - function W(e) { - return 'float' === e.recommendation; - } - - function U(e) { - return 'integer' === e.recommendation || 'float' === e.recommendation; - } - - function q(e) { - return 'boolean' === e.recommendation || 'string' === e.recommendation && !B(e); - } - - function Y(e) { - return 'date' === e.recommendation; - } - - function $(e, a) { - var t = ['integer', 'float']; - y(!(t.includes(e.recommendation) && t.includes(a.recommendation)), 'field\'s type must be integer or float'); - var n = e.samples, i = a.samples, o = Object(r.b)(function(e, a) { - for (var t = [], r = [], n = 0; n < e.length; n++) _(e[n]) || _(a[n]) || (t.push(e[n]), r.push(a[n])); - return [t, r]; - }(n, i), 2), c = o[0], s = o[1]; - return F(c.map(Number.parseFloat), s.map(Number.parseFloat)); - } - }]); -})); -//# sourceMappingURL=index.js.map \ No newline at end of file From 55ce7416233fe7bc9f589306b30b37f9fe462eb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Sun, 28 Jun 2020 15:50:46 +0800 Subject: [PATCH 41/73] =?UTF-8?q?CHART-13666=20=E8=87=AA=E5=8A=A8=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/chart/AutoChartDialog.java | 11 +++++++++++ .../java/com/fr/design/chart/AutoChartTypePane.java | 12 ++++++++++-- .../main/java/com/fr/design/chart/ChartDialog.java | 11 ++++++++--- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java index 058e07045..34dacfa90 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java @@ -7,6 +7,9 @@ import com.fr.chartx.TwoTuple; import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.vanchart.VanChart; +import javax.swing.JList; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import java.awt.Component; import java.awt.Dialog; import java.awt.Frame; @@ -33,6 +36,14 @@ public class AutoChartDialog extends ChartDialog { protected Component initCenterPane() { autoChartTypePane = new AutoChartTypePane(); + getOk().setEnabled(false); + + autoChartTypePane.registsListAction(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + getOk().setEnabled(((JList) e.getSource()).getSelectedIndex() >= 0); + } + }); return autoChartTypePane; } diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java index 1d827c00f..b7974fb6e 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartTypePane.java @@ -13,7 +13,6 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.chart.info.ChartInfoCollector; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.GeneralUtils; @@ -31,6 +30,7 @@ import javax.swing.JSplitPane; import javax.swing.ListCellRenderer; import javax.swing.SwingWorker; import javax.swing.UIManager; +import javax.swing.event.ListSelectionListener; import javax.swing.plaf.SplitPaneUI; import javax.swing.plaf.basic.BasicSplitPaneUI; import java.util.ArrayList; @@ -159,6 +159,10 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } } + public void registsListAction(ListSelectionListener listSelectionListener) { + chartViewList.addListSelectionListener(listSelectionListener); + } + private void refreshBox() { TableDataWrapper dataWrap = tableNameComboBox.getSelectedItem(); @@ -225,12 +229,12 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent } } catch (Exception e) { if (!(e instanceof CancellationException)) { - connectionBar.close(); FineLoggerFactory.getLogger().error(e.getMessage(), e); FineJOptionPane.showMessageDialog(AutoChartTypePane.this, e.getMessage(), Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); } } finally { + connectionBar.close(); refreshButton.setEnabled(true); } } @@ -254,6 +258,10 @@ public class AutoChartTypePane extends ChartWizardPane implements CallbackEvent map.put(dataField, true); } dataFieldBox.setSelectedValues(map); + if (refreshButton.isEnabled()) { + refreshButton.setEnabled(false); + calculateAutoChart(); + } } public void update(ChartCollection cc, String createTime) { diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java index b2d273a60..4cd00e577 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java @@ -48,6 +48,9 @@ public class ChartDialog extends MiddleChartDialog { this.setLayout(new BorderLayout()); setTitle(getDialogTitle()); + ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); + cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); + this.applyClosingAction(); this.applyEscapeAction(); this.setBasicDialogSize(BasicDialog.DEFAULT); @@ -57,9 +60,6 @@ public class ChartDialog extends MiddleChartDialog { buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); this.add(buttonPane, BorderLayout.SOUTH); - ok = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_OK")); - cancel = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Cancel")); - ok.addActionListener(getActionListener(createTime)); cancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { @@ -91,6 +91,11 @@ public class ChartDialog extends MiddleChartDialog { }; } + + public UIButton getOk() { + return ok; + } + /** * 不处理 */ From ed82eca8c98c75ba507514b96385c2a9bd0b4a8b Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Sun, 28 Jun 2020 19:56:31 +0800 Subject: [PATCH 42/73] =?UTF-8?q?REPORT-33944=20=E9=A1=B5=E8=BE=B9?= =?UTF-8?q?=E8=B7=9D=E4=B8=BA0=EF=BC=8C=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E8=99=9A=E7=BA=BF=E5=92=8C=E5=AE=9E=E9=99=85=E6=9C=891?= =?UTF-8?q?=E7=9A=84=E8=AF=AF=E5=B7=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/grid/GridUI.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index ff027af08..36b81ea68 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -315,7 +315,7 @@ public class GridUI extends ComponentUI { } protected void iterateStart2End(Graphics2D g2d) { - float tmpSize = 0, paperSumSize = 0, sumSize = 0; + double tmpSize = 0, paperSumSize = 0, sumSize = 0; for (int i = 0; i <= endIndex; i++) { // denny: 开始 if (i == 0) { @@ -323,7 +323,7 @@ public class GridUI extends ComponentUI { // denny: 增加从0到Grid左边被hide的列宽 for (int k = 0; k < startIndex; k++) { - tmpSize = sizeList.get(k).toPixF(resolution); + tmpSize = sizeList.get(k).toPixD(resolution); paperSumSize += tmpSize; if (paperSumSize >= paperPaintSize) { @@ -333,7 +333,7 @@ public class GridUI extends ComponentUI { } // adjust height. - tmpSize = sizeList.get(i).toPixF(resolution); + tmpSize = sizeList.get(i).toPixD(resolution); paperSumSize += tmpSize; if (showGridLine) {// paint line. @@ -342,7 +342,7 @@ public class GridUI extends ComponentUI { } // paint paper margin line. - if (showPaginateLine && paperSumSize >= paperPaintSize) { + if (showPaginateLine && (float)paperSumSize > (float) paperPaintSize) { paginateLineList.add(getPaginateLine2D((int) sumSize)); paperSumSize = tmpSize; } @@ -497,8 +497,8 @@ public class GridUI extends ComponentUI { paintCellElementRectangleList.add(this.tmpRectangle.clone()); - double cellWidth = this.tmpRectangle.getWidth(); - double cellHeight = this.tmpRectangle.getHeight(); + double cellWidth = this.tmpRectangle.getWidth(); + double cellHeight = this.tmpRectangle.getHeight(); // denny_Grid: 画Grid中单元格的内容(包括单元格的背景Content + Background), 不包括边框 painter.paintBackground(g2d, report, tmpCellElement, cellWidth - 1, cellHeight - 1); @@ -625,10 +625,10 @@ public class GridUI extends ComponentUI { tmpLine2D = (Line2D) paginateLineList.get(j);// 直接强制转换,因为List中肯定都是Line2D型的 for (int k = j + 1; k < paginateLineList.size(); k++) { tmpLine2D2 = (Line2D) paginateLineList.get(k); - if (AssistUtils.equals(tmpLine2D2.getX1() ,tmpLine2D.getX1()) - && AssistUtils.equals(tmpLine2D2.getX2() , tmpLine2D.getX2()) - && AssistUtils.equals(tmpLine2D2.getY1() , tmpLine2D.getY1()) - && AssistUtils.equals(tmpLine2D2.getY2() , tmpLine2D.getY2())) { + if (AssistUtils.equals(tmpLine2D2.getX1(), tmpLine2D.getX1()) + && AssistUtils.equals(tmpLine2D2.getX2(), tmpLine2D.getX2()) + && AssistUtils.equals(tmpLine2D2.getY1(), tmpLine2D.getY1()) + && AssistUtils.equals(tmpLine2D2.getY2(), tmpLine2D.getY2())) { paginateLineList.remove(k); } } From a6648211e945261b7273b109d1dc479efa7777a5 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 29 Jun 2020 14:41:13 +0800 Subject: [PATCH 43/73] =?UTF-8?q?REPORT-33944=20=E5=A4=A7=E4=BA=8E?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E7=9A=84=E7=B2=BE=E5=BA=A6=E4=B9=8B=E5=A4=96?= =?UTF-8?q?=E6=89=8D=E6=98=AF=E5=A4=A7=E4=BA=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/grid/GridUI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index 36b81ea68..3ca89fc01 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -342,7 +342,7 @@ public class GridUI extends ComponentUI { } // paint paper margin line. - if (showPaginateLine && (float)paperSumSize > (float) paperPaintSize) { + if (showPaginateLine && paperSumSize - paperPaintSize > 1.0E-7D) { paginateLineList.add(getPaginateLine2D((int) sumSize)); paperSumSize = tmpSize; } From c1d29e61697a5997eaadeb53751620158efe06be Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Mon, 29 Jun 2020 17:28:01 +0800 Subject: [PATCH 44/73] =?UTF-8?q?REPORT-33944=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-realize/src/main/java/com/fr/grid/GridUI.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/grid/GridUI.java b/designer-realize/src/main/java/com/fr/grid/GridUI.java index 3ca89fc01..62927647a 100644 --- a/designer-realize/src/main/java/com/fr/grid/GridUI.java +++ b/designer-realize/src/main/java/com/fr/grid/GridUI.java @@ -300,6 +300,8 @@ public class GridUI extends ComponentUI { private int resolution; + private static final double THRESHOLD = 1.0E-4D; + DrawLineHelper(int startIndex, int endIndex, boolean showGridLine, boolean showPaginateLine, DynamicUnitList sizeList, double paperPaintSize, List paginateLineList, int resolution) { @@ -315,7 +317,7 @@ public class GridUI extends ComponentUI { } protected void iterateStart2End(Graphics2D g2d) { - double tmpSize = 0, paperSumSize = 0, sumSize = 0; + float tmpSize = 0, paperSumSize = 0, sumSize = 0; for (int i = 0; i <= endIndex; i++) { // denny: 开始 if (i == 0) { @@ -323,7 +325,7 @@ public class GridUI extends ComponentUI { // denny: 增加从0到Grid左边被hide的列宽 for (int k = 0; k < startIndex; k++) { - tmpSize = sizeList.get(k).toPixD(resolution); + tmpSize = sizeList.get(k).toPixF(resolution); paperSumSize += tmpSize; if (paperSumSize >= paperPaintSize) { @@ -333,7 +335,7 @@ public class GridUI extends ComponentUI { } // adjust height. - tmpSize = sizeList.get(i).toPixD(resolution); + tmpSize = sizeList.get(i).toPixF(resolution); paperSumSize += tmpSize; if (showGridLine) {// paint line. @@ -342,7 +344,7 @@ public class GridUI extends ComponentUI { } // paint paper margin line. - if (showPaginateLine && paperSumSize - paperPaintSize > 1.0E-7D) { + if (showPaginateLine && paperSumSize - paperPaintSize > THRESHOLD) { paginateLineList.add(getPaginateLine2D((int) sumSize)); paperSumSize = tmpSize; } From 322f01e340a7c96b8a0667dfca75110fd2868d00 Mon Sep 17 00:00:00 2001 From: assassion <1536296691@qq.com> Date: Tue, 30 Jun 2020 14:26:13 +0800 Subject: [PATCH 45/73] =?UTF-8?q?REPORT-32520=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E8=AE=BE=E7=BD=AE=E8=B6=85=E8=BF=872000?= =?UTF-8?q?=E5=90=8E=E9=A2=84=E8=A7=88=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E5=AE=BD=E5=92=8C=E9=AB=98=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/report/PageSetupPane.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java index 20beaa564..591cd461a 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java @@ -19,25 +19,20 @@ import java.awt.event.FocusEvent; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import javax.swing.BorderFactory; -import javax.swing.Box; -import javax.swing.ButtonGroup; -import javax.swing.Icon; +import javax.swing.*; +import com.fr.design.gui.ispinner.ColumnRowSpinner; import com.fr.page.PaperSettingProvider; import com.fr.page.ReportSettingsProvider; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ibutton.UIRadioButton; import com.fr.design.gui.ilable.UILabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JSpinner; -import javax.swing.SpinnerNumberModel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.text.NumberFormatter; import com.fr.base.BaseUtils; import com.fr.base.Margin; @@ -212,6 +207,13 @@ public class PageSetupPane extends BasicPane { ((JSpinner.DefaultEditor) paperWidthSpinner.getEditor()).getTextField().setColumns(7); paperHeightSpinner = new UIBasicSpinner(new SpinnerNumberModel(0.0, 0.0, Double.MAX_VALUE, 1.0)); ((JSpinner.DefaultEditor) paperHeightSpinner.getEditor()).getTextField().setColumns(7); + + JFormattedTextField txt = ((JSpinner.NumberEditor) paperWidthSpinner.getEditor()).getTextField(); + ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); + txt = ((JSpinner.NumberEditor) paperHeightSpinner.getEditor()).getTextField(); + ((NumberFormatter) txt.getFormatter()).setAllowsInvalid(false); + + unitLabel = new UnitFieldPane.UnitLabel(Constants.UNIT_MM, paperHeightSpinner.getPreferredSize().height); String[] inch = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_MM"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Unit_INCH")}; @@ -738,8 +740,8 @@ public class PageSetupPane extends BasicPane { return; } // 最大2000,以免画的时候超边 - this.paper_width = Math.min(paper_width, 2000); - this.paper_height = Math.min(paper_height, 2000); + this.paper_width = Math.min(paper_width, Double.MAX_VALUE); + this.paper_height = Math.min(paper_height, Double.MAX_VALUE); this.paper_orientation = paper_orientation; length_scale = !useLocale ? NUM_3 : NUM_POINT_3; } @@ -766,18 +768,24 @@ public class PageSetupPane extends BasicPane { FontMetrics fm = g2d.getFontMetrics(); // 横向的长度 String w_str = "" + paper_width; - if (w_str.indexOf(CoreConstants.DOT) > 0) { + if (!w_str.contains("E")&&w_str.indexOf(CoreConstants.DOT) > 0) { w_str = w_str.substring(0, w_str.indexOf(CoreConstants.DOT) + 2); } int w_length = fm.stringWidth(w_str); paint_width = Math.max(paint_width, w_length + 26); // 纵向的长度 String h_str = "" + paper_height; - if (h_str.indexOf(".") > 0) { + //使用科学计数法显示长度的时候,限制纵向显示长度为9位 + if (h_str.contains("E")){ + String str1=h_str.substring(h_str.indexOf("E")); + String str2=h_str.substring(0,9-str1.length()); + h_str = str2+str1; + }else if(h_str.indexOf(".") > 0) { h_str = h_str.substring(0, h_str.indexOf(".") + 2); } int h_length = fm.stringWidth(h_str); paint_height = Math.max(paint_height, h_length + 26); + paint_height = Math.min(paint_height, 75); double startX = (pane_width - paint_width) / 2; double startY = (pane_height - paint_height) / 2; g2d.translate(startX, startY); From 900d1f688382b3aaabfae034b44f250517136b66 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Tue, 30 Jun 2020 15:19:47 +0800 Subject: [PATCH 46/73] =?UTF-8?q?REPORT-32520=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/PageSetupPane.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java index 591cd461a..8dadbe7cc 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java @@ -67,6 +67,7 @@ public class PageSetupPane extends BasicPane { private PagePane pagePane; private OtherPane otherPane; private UILabel zeroMarginWarn; + private static final String E = "E"; public PageSetupPane() { this.initComponents(); @@ -768,7 +769,7 @@ public class PageSetupPane extends BasicPane { FontMetrics fm = g2d.getFontMetrics(); // 横向的长度 String w_str = "" + paper_width; - if (!w_str.contains("E")&&w_str.indexOf(CoreConstants.DOT) > 0) { + if (!w_str.contains(E) && w_str.indexOf(CoreConstants.DOT) > 0) { w_str = w_str.substring(0, w_str.indexOf(CoreConstants.DOT) + 2); } int w_length = fm.stringWidth(w_str); @@ -776,16 +777,16 @@ public class PageSetupPane extends BasicPane { // 纵向的长度 String h_str = "" + paper_height; //使用科学计数法显示长度的时候,限制纵向显示长度为9位 - if (h_str.contains("E")){ - String str1=h_str.substring(h_str.indexOf("E")); + if (h_str.contains(E)){ + String str1=h_str.substring(h_str.indexOf(E)); String str2=h_str.substring(0,9-str1.length()); h_str = str2+str1; - }else if(h_str.indexOf(".") > 0) { - h_str = h_str.substring(0, h_str.indexOf(".") + 2); + }else if(h_str.indexOf(CoreConstants.DOT) > 0) { + h_str = h_str.substring(0, h_str.indexOf(CoreConstants.DOT) + 2); } int h_length = fm.stringWidth(h_str); paint_height = Math.max(paint_height, h_length + 26); - paint_height = Math.min(paint_height, 75); + paint_height = Math.min(paint_height, 74); double startX = (pane_width - paint_width) / 2; double startY = (pane_height - paint_height) / 2; g2d.translate(startX, startY); From 1f3781c3442bbc773acaa88f8fd7630ac98853e5 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Tue, 30 Jun 2020 15:34:20 +0800 Subject: [PATCH 47/73] =?UTF-8?q?REPORT-32520=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/report/PageSetupPane.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java index 8dadbe7cc..668700a95 100644 --- a/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java +++ b/designer-realize/src/main/java/com/fr/design/report/PageSetupPane.java @@ -777,11 +777,11 @@ public class PageSetupPane extends BasicPane { // 纵向的长度 String h_str = "" + paper_height; //使用科学计数法显示长度的时候,限制纵向显示长度为9位 - if (h_str.contains(E)){ - String str1=h_str.substring(h_str.indexOf(E)); - String str2=h_str.substring(0,9-str1.length()); - h_str = str2+str1; - }else if(h_str.indexOf(CoreConstants.DOT) > 0) { + if (h_str.contains(E)) { + String str1 = h_str.substring(h_str.indexOf(E)); + String str2 = h_str.substring(0, 9 - str1.length()); + h_str = str2 + str1; + } else if (h_str.indexOf(CoreConstants.DOT) > 0) { h_str = h_str.substring(0, h_str.indexOf(CoreConstants.DOT) + 2); } int h_length = fm.stringWidth(h_str); @@ -790,7 +790,7 @@ public class PageSetupPane extends BasicPane { double startX = (pane_width - paint_width) / 2; double startY = (pane_height - paint_height) / 2; g2d.translate(startX, startY); - g2d = getG2d(paint_width, paint_height,g2d,w_str,h_str,w_length,h_length); + g2d = getG2d(paint_width, paint_height, g2d, w_str, h_str, w_length, h_length); if (paper_orientation == ReportConstants.PORTRAIT) { g2d.drawImage(img, (int) ((paint_width - img.getWidth(null)) / 2), (int) ((paint_height - img.getHeight(null)) / 2), null); From d64b28795db65468421bd90c6207b1856a68d507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 30 Jun 2020 16:20:27 +0800 Subject: [PATCH 48/73] =?UTF-8?q?CHART-14449=20=E5=88=87=E6=8D=A2=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=9C=80=E8=A6=81=E9=87=8D=E7=BD=AE=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/chart/gui/ChartTypePane.java | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index b363dc5f6..1fa61298a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -111,12 +111,15 @@ public class ChartTypePane extends AbstractChartAttrPane { autoButtonListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { + final String lastId = editingCollection.getSelectedChartProvider(ChartProvider.class).getID(); final MiddleChartDialog autoChartDialog = DesignModuleFactory.getAutoChartDialog(DesignerContext.getDesignerFrame()); autoChartDialog.populate(editingCollection); autoChartDialog.addDialogActionListener(new DialogActionAdapter() { @Override public void doOk() { populate(editingCollection); + ChartProvider chart = editingCollection.getSelectedChartProvider(ChartProvider.class); + reLayoutEditPane(chart, lastId); } }); autoChartDialog.setVisible(true); @@ -124,6 +127,17 @@ public class ChartTypePane extends AbstractChartAttrPane { }; } + private void reLayoutEditPane(ChartProvider chart, String lastChartId) { + String chartId = chart.getID(); + //chartID改变的话图表类型就算改变了 + if (StringUtils.isNotEmpty(chartId)) { + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartId); + if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastChartId, chartId))) { + editPane.reLayout(chart); + } + } + } + class ComboBoxPane extends UIComboBoxPane { private Map>> allChartTypePane; @@ -167,17 +181,7 @@ public class ChartTypePane extends AbstractChartAttrPane { //这一步会替换plot ((AbstractChartTypePane) getSelectedPane()).updateBean(chart); - String chartID = chart.getID(); - - //chartID改变的话图表类型就算改变了 - if (StringUtils.isNotEmpty(chartID)) { - - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); - - if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { - editPane.reLayout(chart); - } - } + reLayoutEditPane(chart,lastPlotID); } protected UIComboBox createComboBox() { From 5113972ecfad36129c1afafdbea4f1ab20d29828 Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 1 Jul 2020 15:54:28 +0800 Subject: [PATCH 49/73] =?UTF-8?q?REPORT-34222=20=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=BB=99=E5=AE=B9=E5=99=A8=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=80=E4=B8=AA=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=20=E6=94=B9=E4=B8=8B=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/designer/beans/models/SelectionModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index 9f5f36f66..1209310f6 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -262,7 +262,7 @@ public class SelectionModel { Rectangle rec = selection.getSelctionBounds(); FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y); } else if (isExtraContainer(container)) { - provider.paste2Container(selection); + provider.paste2Container(clipboard); } } From d425ae62b7f1d11858b0e975f8356b94d823c95d Mon Sep 17 00:00:00 2001 From: hades Date: Wed, 1 Jul 2020 15:54:28 +0800 Subject: [PATCH 50/73] =?UTF-8?q?REPORT-34222=20=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E5=99=A8=E7=BB=99=E5=AE=B9=E5=99=A8=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=BC=80=E4=B8=AA=E5=A4=8D=E5=88=B6=E7=B2=98=E8=B4=B4?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=20=E6=94=B9=E4=B8=8B=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/designer/beans/models/SelectionModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java index 9f5f36f66..1209310f6 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/SelectionModel.java @@ -262,7 +262,7 @@ public class SelectionModel { Rectangle rec = selection.getSelctionBounds(); FormSelectionUtils.paste2Container(designer, container, clipboard, rec.x + DELTA_X_Y, rec.y + DELTA_X_Y); } else if (isExtraContainer(container)) { - provider.paste2Container(selection); + provider.paste2Container(clipboard); } } From c88bac574499a4aaae37df06329033823b5d1fa2 Mon Sep 17 00:00:00 2001 From: Lanlan Date: Thu, 2 Jul 2020 11:53:12 +0800 Subject: [PATCH 51/73] =?UTF-8?q?REPORT-29573=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E6=8F=92=E4=BB=B6=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E3=80=81=E5=9C=BA=E6=99=AF=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=8D=E6=98=BE=E7=A4=BA=E4=B8=AD=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exe/GetPluginCategoriesExecutor.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java index 1d6e8c483..1f8db99a0 100644 --- a/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java +++ b/designer-base/src/main/java/com/fr/design/extra/exe/GetPluginCategoriesExecutor.java @@ -1,10 +1,13 @@ package com.fr.design.extra.exe; +import com.fr.design.DesignerEnvManager; import com.fr.design.extra.PluginConstants; import com.fr.design.extra.Process; import com.fr.general.CloudCenter; -import com.fr.general.http.HttpClient; +import com.fr.general.http.HttpToolbox; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; +import java.util.Locale; /** * Created by vito on 16/5/16. @@ -28,14 +31,17 @@ public class GetPluginCategoriesExecutor implements Executor { @Override public void run(Process process) { - String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category"); + Locale locale = DesignerEnvManager.getEnvManager().getLanguage(); + String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.category") + "&locale=" + locale.toString(); if (StringUtils.isNotEmpty(url)) { - HttpClient httpClient = new HttpClient(url); - result = httpClient.getResponseText(); - } else { - result = PluginConstants.CONNECTION_404; + try { + result = HttpToolbox.get(url); + return; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } } - + result = PluginConstants.CONNECTION_404; } } }; From 7946d9ddfbe510883e2d75fdd750dfdc8cf7d360 Mon Sep 17 00:00:00 2001 From: hades Date: Thu, 2 Jul 2020 17:38:14 +0800 Subject: [PATCH 52/73] =?UTF-8?q?REPORT-32997=20=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=88=97=E5=AE=BD=E4=BF=AE=E6=94=B9=E4=BD=86=E6=98=AF=E5=80=BC?= =?UTF-8?q?=E4=B8=8D=E5=8F=98=E5=87=BA=E7=8E=B0=E4=BA=86=E7=BC=A9=E8=BF=9B?= =?UTF-8?q?=20=E8=BD=AC=E4=B8=93=E4=BA=BA=E6=9C=8D=E5=8A=A1-Cafu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/columnrow/ColumnRowSizingAction.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/columnrow/ColumnRowSizingAction.java b/designer-realize/src/main/java/com/fr/design/actions/columnrow/ColumnRowSizingAction.java index f7e86d2c0..0903323b8 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/columnrow/ColumnRowSizingAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/columnrow/ColumnRowSizingAction.java @@ -13,6 +13,7 @@ import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.fun.ReportLengthUNITProvider; import com.fr.design.unit.UnitConvertUtil; +import com.fr.general.ComparatorUtils; import com.fr.grid.selection.CellSelection; import com.fr.report.elementcase.ElementCase; import com.fr.stable.ArrayUtils; @@ -39,8 +40,8 @@ public abstract class ColumnRowSizingAction extends AbstractColumnRowIndexAction return ColumnRowSizingAction.this.title4UnitInputPane(); } }; - UNIT len = getShowLen(report, cs); - populateNumberDialog(uPane, len); + final UNIT oldLen = getShowLen(report, cs); + populateNumberDialog(uPane, oldLen); final CellSelection finalCS = cs; uPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { @@ -51,8 +52,10 @@ public abstract class ColumnRowSizingAction extends AbstractColumnRowIndexAction float newHeight = (float) uPane.update(); int unitType = DesignerEnvManager.getEnvManager().getReportLengthUnit(); ReportLengthUNITProvider lengthUNIT = UnitConvertUtil.parseLengthUNIT(unitType); - UNIT len = lengthUNIT.float2UNIT(newHeight); - updateAction(report, len, finalCS); + UNIT newLen = lengthUNIT.float2UNIT(newHeight); + if (!ComparatorUtils.equals(oldLen, newLen)) { + updateAction(report, newLen, finalCS); + } } catch (ValueNotChangeException e) { // nothing } From 4f6cd94afbf0416b28460e2d353a4af88fc4f962 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Mon, 6 Jul 2020 16:52:54 +0800 Subject: [PATCH 53/73] =?UTF-8?q?REPORT-34385=20=E5=9C=A8alphafine?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E7=AA=97=E5=8F=A3=E6=89=93=E5=BC=80=E7=9A=84?= =?UTF-8?q?=E6=97=B6=E5=80=99=EF=BC=8C=E5=B0=86=E8=81=94=E7=BD=91=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=8A=B6=E6=80=81=E4=B8=8E=E5=87=A0=E4=B8=AA=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=80=89=E9=A1=B9=E7=9A=84=E7=8A=B6=E6=80=81=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=85=B3=E8=81=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../help/alphafine/AlphaFineConfigPane.java | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) 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 d261de57c..251e2275a 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 @@ -189,34 +189,35 @@ public class AlphaFineConfigPane extends BasicPane { } public void populate(AlphaFineConfigManager alphaFineConfigManager) { - + this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); - + boolean enabled4Locale = FRContext.isChineseEnv(); - + boolean isSearchOnLine = alphaFineConfigManager.isSearchOnLine(); + this.searchOnlineCheckbox.setEnabled(enabled4Locale); - this.searchOnlineCheckbox.setSelected(alphaFineConfigManager.isSearchOnLine()); - + this.searchOnlineCheckbox.setSelected(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(enabled4Locale); - - this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && alphaFineConfigManager.isSearchOnLine()); - this.containPluginCheckbox.setEnabled(enabled4Locale); - - this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && alphaFineConfigManager.isSearchOnLine()); - this.containRecommendCheckbox.setEnabled(enabled4Locale); - + + this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && isSearchOnLine); + this.containDocumentCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + + this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && isSearchOnLine); + this.containPluginCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + + this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && isSearchOnLine); + this.containRecommendCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); - - this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && alphaFineConfigManager.isSearchOnLine()); - this.needIntelligentCustomerService.setEnabled(enabled4Locale); - + + this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && isSearchOnLine); + this.needIntelligentCustomerService.setEnabled(enabled4Locale && isSearchOnLine); + shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } From 4f01746dafdd339e8efcabacffebe8894ae32127 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Mon, 6 Jul 2020 17:31:30 +0800 Subject: [PATCH 54/73] =?UTF-8?q?REPORT-34385=20enabled4Locale=E4=B8=8EisS?= =?UTF-8?q?earchOnLine=E6=9D=A1=E4=BB=B6=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../help/alphafine/AlphaFineConfigPane.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) 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 251e2275a..d478fb347 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 @@ -192,31 +192,30 @@ public class AlphaFineConfigPane extends BasicPane { this.enabledCheckbox.setSelected(alphaFineConfigManager.isEnabled()); - boolean enabled4Locale = FRContext.isChineseEnv(); - boolean isSearchOnLine = alphaFineConfigManager.isSearchOnLine(); + boolean enabled4Locale = FRContext.isChineseEnv() && alphaFineConfigManager.isSearchOnLine(); this.searchOnlineCheckbox.setEnabled(enabled4Locale); - this.searchOnlineCheckbox.setSelected(isSearchOnLine); + this.searchOnlineCheckbox.setSelected(enabled4Locale); this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); this.containTemplateCheckbox.setSelected(alphaFineConfigManager.isContainTemplate()); this.containFileContentCheckbox.setSelected(alphaFineConfigManager.isContainFileContent()); - this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && isSearchOnLine); - this.containDocumentCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + this.containDocumentCheckbox.setSelected(alphaFineConfigManager.isContainDocument() && enabled4Locale); + this.containDocumentCheckbox.setEnabled(enabled4Locale); - this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && isSearchOnLine); - this.containPluginCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + this.containPluginCheckbox.setSelected(alphaFineConfigManager.isContainPlugin() && enabled4Locale); + this.containPluginCheckbox.setEnabled(enabled4Locale); - this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && isSearchOnLine); - this.containRecommendCheckbox.setEnabled(enabled4Locale && isSearchOnLine); + this.containRecommendCheckbox.setSelected(alphaFineConfigManager.isContainRecommend() && enabled4Locale); + this.containRecommendCheckbox.setEnabled(enabled4Locale); this.shortcutsField.setText(getDisplayShortCut(alphaFineConfigManager.getShortcuts())); this.needSegmentationCheckbox.setSelected(alphaFineConfigManager.isNeedSegmentationCheckbox()); - this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && isSearchOnLine); - this.needIntelligentCustomerService.setEnabled(enabled4Locale && isSearchOnLine); + this.needIntelligentCustomerService.setSelected(alphaFineConfigManager.isNeedIntelligentCustomerService() && enabled4Locale); + this.needIntelligentCustomerService.setEnabled(enabled4Locale); shortCutKeyStore = convert2KeyStroke(alphaFineConfigManager.getShortcuts()); } From e5b618372952499bcc39ded59afacef2b019dd50 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Mon, 6 Jul 2020 17:39:09 +0800 Subject: [PATCH 55/73] =?UTF-8?q?REPORT-34351=20=E4=BF=AE=E6=AD=A3FineJOpt?= =?UTF-8?q?ionPane=E7=BB=84=E4=BB=B6showInputDialog=EF=BC=88=EF=BC=89?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=82=B9=E5=87=BB=E5=BC=B9=E5=87=BA=E6=A1=86?= =?UTF-8?q?=E7=9A=84=E5=8F=96=E6=B6=88=E9=94=AE=E5=90=8E=E7=9A=84=E8=A1=8C?= =?UTF-8?q?=E4=B8=BA=EF=BC=9B=E5=9C=A8=E7=BB=84=E4=BB=B6=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E5=90=8E=E5=B0=86=E4=B8=8E=E8=87=AA=E5=B7=B1=E7=9A=84?= =?UTF-8?q?=E5=8E=9F=E6=9D=A5=E7=9A=84=E5=90=8D=E5=AD=97=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E7=9A=84=E6=83=85=E5=86=B5=E5=8E=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/dialog/FineJOptionPane.java | 6 +++++- .../main/java/com/fr/design/mainframe/SheetNameTabPane.java | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java index 4a4424d9f..c64455079 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java +++ b/designer-base/src/main/java/com/fr/design/dialog/FineJOptionPane.java @@ -1,6 +1,7 @@ package com.fr.design.dialog; import com.fr.invoke.Reflect; +import com.fr.stable.StringUtils; import javax.swing.Icon; import javax.swing.JDialog; @@ -279,8 +280,11 @@ public class FineJOptionPane extends JOptionPane { dialog.show(); dialog.dispose(); - Object value = pane.getInputValue(); + //点击取消按钮,返回null + if (StringUtils.equals((String) pane.getValue(), OPTION_OK_CANCEL[1])) + return null; + Object value = pane.getInputValue(); if (value == UNINITIALIZED_VALUE) { return null; } diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java index 74443e831..52f1fe1f0 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/SheetNameTabPane.java @@ -945,7 +945,7 @@ public class SheetNameTabPane extends JComponent implements MouseListener, Mouse // marks:判断是否重名 boolean isExisted = false; for (int i = 0; i < reportComposite.getEditingWorkBook().getReportCount(); i++) { - if (newName.equalsIgnoreCase(reportComposite.getEditingWorkBook().getReportName(i))) { + if (newName.equalsIgnoreCase(reportComposite.getEditingWorkBook().getReportName(i)) && i != selectedIndex) { isExisted = true; break; } From 4326eb79ade863a8fbee9e5e209de5f2fccaaa7c Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Tue, 7 Jul 2020 13:52:26 +0800 Subject: [PATCH 56/73] =?UTF-8?q?REPORT-34385=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E8=81=94=E7=BD=91=E6=90=9C=E7=B4=A2=E7=9A=84enable=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/help/alphafine/AlphaFineConfigPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d478fb347..5bf0214e0 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 @@ -194,7 +194,7 @@ public class AlphaFineConfigPane extends BasicPane { boolean enabled4Locale = FRContext.isChineseEnv() && alphaFineConfigManager.isSearchOnLine(); - this.searchOnlineCheckbox.setEnabled(enabled4Locale); + this.searchOnlineCheckbox.setEnabled(FRContext.isChineseEnv()); this.searchOnlineCheckbox.setSelected(enabled4Locale); this.containActionCheckbox.setSelected(alphaFineConfigManager.isContainAction()); From f026765d25ed46b04bd5ab205ab54af435c33aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 7 Jul 2020 17:05:26 +0800 Subject: [PATCH 57/73] =?UTF-8?q?CHART-14346=20&&=20CHART-14180=20=20?= =?UTF-8?q?=E6=82=AC=E6=B5=AE=E5=9B=BE=E8=A1=A8=E9=85=8D=E7=BD=AE=E7=BB=84?= =?UTF-8?q?=E5=90=88=E5=9B=BE=E4=B8=8D=E8=83=BD=E9=80=89=E6=8B=A9=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC=E6=95=B0=E6=8D=AE=E6=BA=90=20&&=20=E8=BD=B4?= =?UTF-8?q?=E6=A0=87=E9=A2=98=E9=9A=90=E8=97=8F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/custom/VanChartCustomDataPane.java | 1 + ...VanChartCustomPlotDataContentsTabPane.java | 12 + .../style/axis/VanChartBaseAxisPane.java | 260 ++++++++++-------- 3 files changed, 162 insertions(+), 111 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java index 6c5f714bf..ec15e4cf9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomDataPane.java @@ -27,6 +27,7 @@ public class VanChartCustomDataPane extends ChartDataPane { } contentsTabPane = new VanChartCustomPlotDataContentsTabPane((VanChartCustomPlot)chart.getPlot(), VanChartCustomDataPane.this, listener); + contentsTabPane.setSupportCellData(isSupportCellData()); content.add(contentsTabPane, BorderLayout.CENTER); return content; diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java index e8f6f3a0a..6dbe9577c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java @@ -22,10 +22,21 @@ import java.util.Map; * Created by Fangjie on 2016/4/29. */ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTabPane { + + private boolean supportCellData = true; + public VanChartCustomPlotDataContentsTabPane(VanChartCustomPlot plot, VanChartCustomDataPane parent, AttributeChangeListener listener) { super(plot, parent, listener); } + public boolean isSupportCellData() { + return supportCellData; + } + + public void setSupportCellData(boolean supportCellData) { + this.supportCellData = supportCellData; + } + @Override protected void initTabTitle() { @@ -60,6 +71,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab for (int i = 0; i < customPlotList.size(); i++){ //根据不同的plot创建不同的数据配置界面 ChartDataPane contentPane = new VanChartDataPane(listener); + contentPane.setSupportCellData(supportCellData); paneList.add(contentPane); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index 064a7156b..d96b1e40f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -54,11 +54,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { private static final long serialVersionUID = -5717246802333308973L; private static final double ROTATION_MAX = 90.0; + protected UIButtonGroup showTitle; protected TinyFormulaPane titleContent; protected UIButtonGroup titleAlignPane; protected UIToggleButton titleUseHtml; protected ChartTextAttrPane titleTextAttrPane; protected UINumberDragPane titleTextRotation; + protected JPanel titlePane; protected UIButtonGroup showLabel; protected ChartTextAttrPane labelTextAttrPane; @@ -96,11 +98,11 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected JPanel centerPane; private VanChartHtmlLabelPane htmlLabelPane; - public VanChartBaseAxisPane(){ + public VanChartBaseAxisPane() { this(true); } - public VanChartBaseAxisPane(boolean isXAxis){ + public VanChartBaseAxisPane(boolean isXAxis) { this.setLayout(new BorderLayout()); this.add(createContentPane(isXAxis), BorderLayout.CENTER); } @@ -108,12 +110,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { public void setParentPane(VanChartStylePane parent) { htmlLabelPane.setParent(parent); } - protected void reLayoutPane(boolean isXAxis){ + + protected void reLayoutPane(boolean isXAxis) { this.removeAll(); this.add(createContentPane(isXAxis), BorderLayout.CENTER); } - protected JPanel createContentPane(boolean isXAxis){ + protected JPanel createContentPane(boolean isXAxis) { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; @@ -121,7 +124,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; double[] columnSize = {f, e}; double[] column = {f, s}; - double[] rowSize = {p, p, p, p, p, p, p,p}; + double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, columnSize, isXAxis), null}, new Component[]{createLabelPane(new double[]{p, p}, column), null}, @@ -131,39 +134,52 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{createValueStylePane(), null}, }; - return TableLayoutHelper.createTableLayoutPane(components,rowSize,columnSize); + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } - protected JPanel createTitlePane(double[] row, double[] col, boolean isXAxis){ + protected JPanel createTitlePane(double[] row, double[] col, boolean isXAxis) { + showTitle = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Use_Show"), Toolkit.i18nText("Fine-Design_Chart_Hidden")}); titleAlignPane = isXAxis ? getXAxisTitleAlignPane() : getYAxisTitleAlignPane(); titleAlignPane.setSelectedItem(Constants.CENTER); titleContent = new TinyFormulaPane(); titleUseHtml = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Html")); UIComponentUtils.setLineWrap(titleUseHtml); titleTextAttrPane = new ChartTextAttrPane(); - titleTextRotation = new UINumberDragPane(-ROTATION_MAX,ROTATION_MAX); - if(isXAxis){ + titleTextRotation = new UINumberDragPane(-ROTATION_MAX, ROTATION_MAX); + if (isXAxis) { titleTextRotation.populateBean(0.0); } else { titleTextRotation.populateBean(-ROTATION_MAX); } Component[][] components = new Component[][]{ - new Component[]{null,null}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content")),titleContent}, - new Component[]{null,titleUseHtml}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position")),titleAlignPane}, - new Component[]{titleTextAttrPane,null}, + new Component[]{null, null}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content")), titleContent}, + new Component[]{null, titleUseHtml}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position")), titleAlignPane}, + new Component[]{titleTextAttrPane, null}, new Component[]{ FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_TextRotation")), UIComponentUtils.wrapWithBorderLayoutPane(titleTextRotation) }, }; + titlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, panel); + JPanel showTitlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"), showTitle); + showTitle.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + checkTitlePane(); + } + }); + + JPanel jPanel = new JPanel(new BorderLayout()); + jPanel.add(showTitlePane, BorderLayout.NORTH); + jPanel.add(titlePane, BorderLayout.CENTER); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_TITLE_TITLE, jPanel); } - private UIButtonGroup getXAxisTitleAlignPane(){ + private UIButtonGroup getXAxisTitleAlignPane() { Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_left_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/h_right_normal.png")}; @@ -171,7 +187,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return new UIButtonGroup(alignmentIconArray, alignment); } - private UIButtonGroup getYAxisTitleAlignPane(){ + + private UIButtonGroup getYAxisTitleAlignPane() { Icon[] alignmentIconArray = {BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_top_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_center_normal.png"), BaseUtils.readIcon("/com/fr/design/images/m_format/cellstyle/v_down_normal.png")}; @@ -180,7 +197,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return new UIButtonGroup(alignmentIconArray, alignment); } - protected JPanel createLabelPane(double[] row, double[] col){ + protected JPanel createLabelPane(double[] row, double[] col) { showLabel = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Show"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Hidden")}); labelTextAttrPane = getChartTextAttrPane(); @@ -205,9 +222,9 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { new Component[]{gapPanel, null}, }; - JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label"),showLabel); + JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label"), showLabel); labelPanel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); - labelPanel.setBorder(BorderFactory.createEmptyBorder(0,10,0,0)); + labelPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); showLabel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -308,11 +325,11 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } - protected ChartTextAttrPane getChartTextAttrPane(){ - return new ChartTextAttrPane(){ + protected ChartTextAttrPane getChartTextAttrPane() { + return new ChartTextAttrPane() { @Override - protected JPanel getContentPane (JPanel buttonPane) { + protected JPanel getContentPane(JPanel buttonPane) { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; @@ -324,10 +341,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { }; } - protected JPanel createLineStylePane(double[] row, double[] col){ + protected JPanel createLineStylePane(double[] row, double[] col) { axisLineStyle = createLineComboBox(); axisLineColor = new ColorSelectBox(100); - String[] strings = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"),com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}; + String[] strings = new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Open"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Close")}; AxisTickLineType[] values = new AxisTickLineType[]{AxisTickLineType.TICK_LINE_OUTSIDE, AxisTickLineType.TICK_LINE_NONE}; mainTick = new UIButtonGroup(strings, values); secondTick = new UIButtonGroup(strings, values); @@ -342,15 +359,15 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected Component[][] getLineStylePaneComponents() { return new Component[][]{ - new Component[]{null,null} , - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Type")),axisLineStyle} , - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")),axisLineColor}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")),mainTick}, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")),secondTick}, + new Component[]{null, null}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Type")), axisLineStyle}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Color")), axisLineColor}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Main_Graduation_Line")), mainTick}, + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Second_Graduation_Line")), secondTick}, }; } - protected JPanel createAxisPositionPane(double[] row, double[] col, boolean isXAxis){ + protected JPanel createAxisPositionPane(double[] row, double[] col, boolean isXAxis) { position = new UIButtonGroup(getAxisPositionNameArray(isXAxis), getAxisPositionValueArray(isXAxis)); reversed = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_On"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Off")}, new Boolean[]{true, false}); Component[][] components = new Component[][]{ @@ -359,30 +376,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Position")), UIComponentUtils.wrapWithBorderLayoutPane(position) }, - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_AxisReversed")),reversed}, - } ; + new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_AxisReversed")), reversed}, + }; JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), panel); } - private String[] getAxisPositionNameArray(boolean isXAxis){ - if(isXAxis){ + private String[] getAxisPositionNameArray(boolean isXAxis) { + if (isXAxis) { return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Top"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Bottom"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Vertical_Zero")}; } else { return new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Left"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Layout_Right"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Vertical_Zero")}; } } - private Integer[] getAxisPositionValueArray(boolean isXAxis){ - if(isXAxis){ + private Integer[] getAxisPositionValueArray(boolean isXAxis) { + if (isXAxis) { return new Integer[]{VanChartConstants.AXIS_TOP, VanChartConstants.AXIS_BOTTOM, VanChartConstants.AXIS_VERTICAL_ZERO}; } else { return new Integer[]{VanChartConstants.AXIS_LEFT, VanChartConstants.AXIS_RIGHT, VanChartConstants.AXIS_VERTICAL_ZERO}; } } - protected JPanel createDisplayStrategy(){ + protected JPanel createDisplayStrategy() { //区域显示策略 恢复用注释。删除到return,即除了注释的代码都删除。 maxProportion = new UISpinner(0, 100, 1, 30); axisLimitSize = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Limit"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Not_Limit")}); @@ -408,7 +425,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { // return limitPane; } - protected JPanel createValueStylePane(){ + protected JPanel createValueStylePane() { valueFormatStyle = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")}); @@ -418,19 +435,19 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { htmlLabelPane = new VanChartHtmlLabelPane(); centerPane = new JPanel(new CardLayout()); - centerPane.add(valueFormat,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); + centerPane.add(valueFormat, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); centerPane.add(htmlLabelPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); double p = TableLayout.PREFERRED; double f = TableLayout.FILL; - double[] columnSize = {p,f}; - double[] rowSize = {p,p,p}; + double[] columnSize = {p, f}; + double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ - new Component[]{null,null}, + new Component[]{null, null}, new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Format"), SwingConstants.LEFT), valueFormatStyle}, new Component[]{null, centerPane}, }; - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components,rowSize,columnSize); + JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); valueFormatStyle.addActionListener(new ActionListener() { @@ -443,12 +460,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { return TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Format"), contentPane); } - protected FormatPane createFormatPane(){ - return new FormatPane(){ - protected Component[][] getComponent (JPanel fontPane, JPanel centerPane, JPanel typePane) { + protected FormatPane createFormatPane() { + return new FormatPane() { + protected Component[][] getComponent(JPanel fontPane, JPanel centerPane, JPanel typePane) { typePane.setBorder(BorderFactory.createEmptyBorder()); return new Component[][]{ - new Component[]{typePane,null}, + new Component[]{typePane, null}, new Component[]{centerPane, null}, }; } @@ -462,6 +479,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected void checkAllUse() { checkCardPane(); checkLabelPane(); + checkTitlePane(); //区域显示策略 恢复用注释。删除下面一行。 checkMaxProPortionUse(); @@ -480,10 +498,10 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void checkCardPane() { - if(centerPane != null && valueFormatStyle != null){ + if (centerPane != null && valueFormatStyle != null) { CardLayout cardLayout = (CardLayout) centerPane.getLayout(); if (valueFormatStyle.getSelectedIndex() == 1) { - cardLayout.show(centerPane,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); + cardLayout.show(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); } else { cardLayout.show(centerPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); } @@ -491,12 +509,12 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void checkLabelPane() { - if(showLabel != null){ + if (showLabel != null) { boolean enabled = showLabel.getSelectedIndex() == 0; - if(labelPanel != null){ + if (labelPanel != null) { labelPanel.setVisible(enabled); } - if(enabled){ + if (enabled) { //轴标签缩略间隔显示 恢复用注释。下面1行删除。 checkLabelGapValuePane(); //轴标签缩略间隔显示 恢复用注释。取消注释。 @@ -505,6 +523,15 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } } + protected void checkTitlePane() { + if (showTitle != null) { + boolean enabled = showTitle.getSelectedIndex() == 0; + if (titlePane != null) { + titlePane.setVisible(enabled); + } + } + } + private void checkLabelGapAndStylePane() { if (overlapHandleTypeGroup != null && labelGapStylePane != null) { boolean visible = overlapHandleTypeGroup.getSelectedItem() == OverlapHandleType.INTERVAL; @@ -528,28 +555,31 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { /** * 是否是指定类型 + * * @param ob 对象 * @return 是否是指定类型 */ - public boolean accept(Object ob){ + public boolean accept(Object ob) { return false; } /** * title应该是一个属性,不只是对话框的标题时用到,与其他组件结合时,也会用得到 + * * @return 绥化狂标题 */ @Override - public String title4PopupWindow(){ + public String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Category_Axis"); } /** * 重置 */ - public void reset(){ + public void reset() { } + @Override public void populateBean(VanChartAxis axis) { populateTitle(axis); @@ -568,50 +598,53 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //标题 - private void populateTitle(VanChartAxis axis){ + private void populateTitle(VanChartAxis axis) { + if (showTitle != null) { + showTitle.setSelectedIndex(axis.isShowAxisTitle() ? 0 : 1); + } Title axisTitle = axis.getTitle(); - if(axisTitle != null){ + if (axisTitle != null) { if (axisTitle.getTextObject() instanceof BaseFormula && titleContent != null) { titleContent.populateBean(((BaseFormula) axisTitle.getTextObject()).getContent()); - } else if(titleContent != null){ + } else if (titleContent != null) { titleContent.populateBean(Utils.objectToString(axisTitle.getTextObject())); } - if(titleAlignPane != null){ + if (titleAlignPane != null) { titleAlignPane.setSelectedItem(axisTitle.getPosition()); } - if(titleTextAttrPane != null){ + if (titleTextAttrPane != null) { titleTextAttrPane.populate(axisTitle.getTextAttr()); } - if(titleUseHtml != null){ + if (titleUseHtml != null) { titleUseHtml.setSelected(axis.isTitleUseHtml()); } - if(titleTextRotation != null){ - titleTextRotation.populateBean((double)axisTitle.getTextAttr().getRotation()); + if (titleTextRotation != null) { + titleTextRotation.populateBean((double) axisTitle.getTextAttr().getRotation()); } } } //标签 - private void populateLabel(VanChartAxis axis){ - if(showLabel != null){ + private void populateLabel(VanChartAxis axis) { + if (showLabel != null) { showLabel.setSelectedIndex(axis.isShowAxisLabel() ? 0 : 1); } TextAttr labelTextAttr = axis.getTextAttr(); - if(labelTextAttrPane != null){ + if (labelTextAttrPane != null) { labelTextAttrPane.populate(labelTextAttr); } - if(labelTextRotation != null){ - labelTextRotation.populateBean((double)labelTextAttr.getRotation()); + if (labelTextRotation != null) { + labelTextRotation.populateBean((double) labelTextAttr.getRotation()); } //轴标签缩略间隔显示 恢复用注释。取消注释。 // if (overlapHandleTypeGroup != null) { // overlapHandleTypeGroup.setSelectedItem(axis.getOverlapHandleType()); // } - if(labelGapStyle != null){ + if (labelGapStyle != null) { labelGapStyle.setSelectedIndex(axis.isAutoLabelGap() ? 0 : 1); } - if(labelGapValue != null){ + if (labelGapValue != null) { //轴标签缩略间隔显示 恢复用注释。下面1行删除。 labelGapValue.setText(axis.getLabelNumber().getContent()); //轴标签缩略间隔显示 恢复用注释。取消注释。 @@ -620,30 +653,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //轴线样式 - private void populateLineStyle(VanChartAxis axis){ - if(axisLineStyle != null){ + private void populateLineStyle(VanChartAxis axis) { + if (axisLineStyle != null) { axisLineStyle.setSelectedLineStyle(axis.getAxisStyle()); } - if(axisLineColor != null){ + if (axisLineColor != null) { axisLineColor.setSelectObject(axis.getAxisColor()); } - if(mainTick != null){ + if (mainTick != null) { mainTick.setSelectedItem(axis.getMainTickLine()); } - if(secondTick != null){ + if (secondTick != null) { secondTick.setSelectedItem(axis.getSecTickLine()); } } //位置 - private void populatePosition(VanChartAxis axis){ - if(position != null){ + private void populatePosition(VanChartAxis axis) { + if (position != null) { position.setSelectedItem(axis.getPosition()); - if(position.getSelectedItem() == null){ + if (position.getSelectedItem() == null) { position.setSelectedIndex(1); } } - if(reversed != null){ + if (reversed != null) { reversed.setSelectedIndex(axis.hasAxisReversed() == true ? 0 : 1); } } @@ -666,13 +699,13 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { //格式 protected void populateFormat(VanChartAxis axis) { - if(valueFormatStyle != null){ + if (valueFormatStyle != null) { valueFormatStyle.setSelectedIndex(axis.isCommonValueFormat() ? 0 : 1); } - if(valueFormat != null){ + if (valueFormat != null) { valueFormat.populateBean(axis.getFormat()); } - if(htmlLabelPane != null){ + if (htmlLabelPane != null) { htmlLabelPane.populate(axis.getHtmlLabel()); } } @@ -690,15 +723,19 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { updateFormat(axis); } + //标题 - private void updateTitle(VanChartAxis axis){ + private void updateTitle(VanChartAxis axis) { + if (showTitle != null) { + axis.setShowAxisTitle(showTitle.getSelectedIndex() == 0); + } Title axisTitle = axis.getTitle(); - if(axisTitle == null){ + if (axisTitle == null) { axisTitle = new Title(); axis.setTitle(axisTitle); } - if(titleContent != null){ + if (titleContent != null) { String titleString = titleContent.updateBean(); Object titleObj; if (StableUtils.maybeFormula(titleString)) { @@ -708,42 +745,42 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } axisTitle.setTextObject(titleObj); } - if(titleAlignPane != null){ + if (titleAlignPane != null) { axisTitle.setPosition(titleAlignPane.getSelectedItem()); } TextAttr textAttr = axisTitle.getTextAttr(); - if(titleTextAttrPane != null){ + if (titleTextAttrPane != null) { titleTextAttrPane.update(textAttr); } - if(titleUseHtml != null){ + if (titleUseHtml != null) { axis.setTitleUseHtml(titleUseHtml.isSelected()); } - if(titleTextRotation != null){ + if (titleTextRotation != null) { textAttr.setRotation(titleTextRotation.updateBean().intValue()); } } //标签 - private void updateLabel(VanChartAxis axis){ - if(showLabel != null){ + private void updateLabel(VanChartAxis axis) { + if (showLabel != null) { axis.setShowAxisLabel(showLabel.getSelectedIndex() == 0); } TextAttr labelTextAttr = axis.getTextAttr(); - if(labelTextAttrPane != null){ + if (labelTextAttrPane != null) { labelTextAttrPane.update(labelTextAttr); } - if(labelTextRotation != null){ + if (labelTextRotation != null) { labelTextAttr.setRotation(labelTextRotation.updateBean().intValue()); } //轴标签缩略间隔显示 恢复用注释。取消注释。 // if (overlapHandleTypeGroup != null) { // axis.setOverlapHandleType(overlapHandleTypeGroup.getSelectedItem()); // } - if(labelGapStyle != null){ + if (labelGapStyle != null) { axis.setAutoLabelGap(labelGapStyle.getSelectedIndex() == 0); } - if(labelGapValue != null){ + if (labelGapValue != null) { //轴标签缩略间隔显示 恢复用注释。下面5行删除。 if (axis.isAutoLabelGap()) { axis.setLabelIntervalNumber(BaseFormula.createFormulaBuilder().build("1")); @@ -756,33 +793,33 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } //轴线样式 - private void updateLineStyle(VanChartAxis axis){ - if(axisLineStyle != null){ + private void updateLineStyle(VanChartAxis axis) { + if (axisLineStyle != null) { axis.setAxisStyle(axisLineStyle.getSelectedLineStyle()); } - if(axisLineColor != null){ + if (axisLineColor != null) { axis.setAxisColor(axisLineColor.getSelectObject()); } - if(mainTick != null){ + if (mainTick != null) { axis.setMainTickLine(mainTick.getSelectedItem()); } - if(secondTick != null){ + if (secondTick != null) { axis.setSecTickLine(secondTick.getSelectedItem()); } } //位置 - private void updatePosition(VanChartAxis axis){ - if(position != null){ + private void updatePosition(VanChartAxis axis) { + if (position != null) { axis.setPosition(position.getSelectedItem()); } - if(reversed != null){ + if (reversed != null) { axis.setAxisReversed(reversed.getSelectedItem()); } } //显示策略 - private void updateDisplayStrategy(VanChartAxis axis){ + private void updateDisplayStrategy(VanChartAxis axis) { //区域显示策略 恢复用注释。下面6行删除。 if (axisLimitSize != null) { axis.setLimitSize(axisLimitSize.getSelectedIndex() == 0); @@ -797,29 +834,30 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void updateFormat(VanChartAxis axis) { - if(valueFormatStyle != null){ + if (valueFormatStyle != null) { axis.setCommonValueFormat(valueFormatStyle.getSelectedIndex() == 0); } - if(valueFormat != null){ + if (valueFormat != null) { axis.setFormat(valueFormat.update()); } - if(htmlLabelPane != null){ + if (htmlLabelPane != null) { htmlLabelPane.update(axis.getHtmlLabel()); } } /** * X坐标轴不同类型切换,new一个新的 + * * @param axisName 坐标轴名称 * @return 新的axis */ - public VanChartAxis updateBean(String axisName, int position){ + public VanChartAxis updateBean(String axisName, int position) { VanChartAxis axis = new VanChartAxis(axisName, position); this.updateBean(axis); return axis; } - public VanChartAxis updateBean(){ + public VanChartAxis updateBean() { return null; } } From 7b66e7b244cb2484e222bafc7a6f0e6842993e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 7 Jul 2020 17:10:23 +0800 Subject: [PATCH 58/73] =?UTF-8?q?CHART-14180=20=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/designer/style/axis/VanChartBaseAxisPane.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index d96b1e40f..fcc34958e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -524,11 +524,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } protected void checkTitlePane() { - if (showTitle != null) { - boolean enabled = showTitle.getSelectedIndex() == 0; - if (titlePane != null) { - titlePane.setVisible(enabled); - } + if (showTitle != null && titlePane != null) { + titlePane.setVisible(showTitle.getSelectedIndex() == 0); } } From b90617919fe53e3ad11e2b5d9593ce33cbade421 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Tue, 7 Jul 2020 17:59:26 +0800 Subject: [PATCH 59/73] =?UTF-8?q?REPORT-34954=20=E5=AF=8C=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E4=B8=8A=E6=A0=87=E4=B8=8B=E6=A0=87=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/cell/editor/RichTextToolBar.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 52a33ff12..4541ac3ba 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 @@ -256,8 +256,11 @@ public class RichTextToolBar extends BasicPane{ @Override public void actionPerformed(ActionEvent e) { boolean isSub = RichTextToolBar.this.subPane.isSelected(); - // 调用setCharacterAttributes函数设置文本区选择文本的字体 MutableAttributeSet attr = new SimpleAttributeSet(); + if (!isSub && RichTextToolBar.this.superPane.isSelected()) { + StyleConstants.setSuperscript(attr, false); + } + // 调用setCharacterAttributes函数设置文本区选择文本的字体 StyleConstants.setSubscript(attr, !isSub); setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } @@ -269,6 +272,9 @@ public class RichTextToolBar extends BasicPane{ boolean isSuper = RichTextToolBar.this.superPane.isSelected(); // 调用setCharacterAttributes函数设置文本区选择文本的字体 MutableAttributeSet attr = new SimpleAttributeSet(); + if (!isSuper && RichTextToolBar.this.subPane.isSelected()) { + StyleConstants.setSubscript(attr, false); + } StyleConstants.setSuperscript(attr, !isSuper); setCharacterAttributes(RichTextToolBar.this.textPane, attr, false); } From b4bb3235df0fa7eb37c4284d0575b26e188ca83f Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Wed, 8 Jul 2020 09:30:41 +0800 Subject: [PATCH 60/73] =?UTF-8?q?REPORT-34954=20=E5=AF=8C=E6=96=87?= =?UTF-8?q?=E6=9C=AC=E4=B8=8A=E6=A0=87=E4=B8=8B=E6=A0=87=E4=B8=8D=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E5=8F=AF=E4=BB=A5=E5=90=8C=E6=97=B6=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/cell/editor/RichTextToolBar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4541ac3ba..b3a78d34d 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 @@ -408,7 +408,7 @@ public class RichTextToolBar extends BasicPane{ bold.setSelected(isBold); italic.setSelected(isItalic); underline.setSelected(isUnderline); - subPane.setSelected(isSubscript); + subPane.setSelected(isSuperscript ? false : isSubscript); superPane.setSelected(isSuperscript); //为什么字体名称, 大小, 颜色, 不需要去判断是否全相同呢 //因为如果全相同, 则设置为第一个字符的样式, 如果不全相同, 那么默认也设置成第一个字符的样式. From b44b3b3585b74b9dc808362fc36def3e686eea5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Wed, 8 Jul 2020 10:02:56 +0800 Subject: [PATCH 61/73] =?UTF-8?q?CHART-14346=20=E6=82=AC=E6=B5=AE=E7=AA=97?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=BB=84=E5=90=88=E5=9B=BE=E4=B8=8D=E5=85=81?= =?UTF-8?q?=E8=AE=B8=E9=80=89=E6=8B=A9=E5=8D=95=E5=85=83=E6=A0=BC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...VanChartCustomPlotDataContentsTabPane.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java index 6dbe9577c..184bc2b11 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java @@ -34,13 +34,15 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } public void setSupportCellData(boolean supportCellData) { - this.supportCellData = supportCellData; + for (JPanel jPanel : paneList) { + ((VanChartDataPane) jPanel).setSupportCellData(supportCellData); + } } @Override protected void initTabTitle() { - if (plot == null){ + if (plot == null) { return; } @@ -60,7 +62,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab @Override protected List initPaneList() { - if (plot == null){ + if (plot == null) { return null; } @@ -68,10 +70,9 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab List customPlotList = plot.getCustomPlotList(); - for (int i = 0; i < customPlotList.size(); i++){ + for (int i = 0; i < customPlotList.size(); i++) { //根据不同的plot创建不同的数据配置界面 ChartDataPane contentPane = new VanChartDataPane(listener); - contentPane.setSupportCellData(supportCellData); paneList.add(contentPane); } @@ -79,15 +80,15 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } @Override - public void populateBean(ChartCollection chartCollection){ + public void populateBean(ChartCollection chartCollection) { plot = (VanChartCustomPlot) chartCollection.getSelectedChart().getPlot(); - if (paneList == null){ + if (paneList == null) { paneList = initPaneList(); } - if (paneList != null){ + if (paneList != null) { try { @@ -105,14 +106,14 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab TopDefinitionProvider definition = chartCollection.getSelectedChart().getFilterDefinition(); TopDefinitionProvider dataDefinition = null; if (definition != null && definition instanceof CustomDefinition) { - Map definitionProviderMap = ((CustomDefinition)definition).getDefinitionProviderMap(); + Map definitionProviderMap = ((CustomDefinition) definition).getDefinitionProviderMap(); dataDefinition = definitionProviderMap.get(CustomPlotFactory.getCustomType(customPlotList.get(i))); } cloneCollection.getSelectedChart().setFilterDefinition(dataDefinition); ((ChartDataPane) paneList.get(i)).populate(cloneCollection); } - }catch (Exception e){ + } catch (Exception e) { return; } } @@ -124,8 +125,8 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } @Override - public void updateBean(ChartCollection collection){ - if (paneList == null || plot == null){ + public void updateBean(ChartCollection collection) { + if (paneList == null || plot == null) { return; } try { @@ -158,7 +159,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab customDefinition.setDefinitionProviderMap(definitionMap); collection.getSelectedChart().setFilterDefinition(customDefinition); - }catch (Exception e){ + } catch (Exception e) { return; } } @@ -180,10 +181,11 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab /** * 返回绑定的属性事件. - * @param listener 增加监听 + * + * @param listener 增加监听 */ public void addAttributeChangeListener(AttributeChangeListener listener) { - for (int i = 0; i < paneList.size(); i++){ + for (int i = 0; i < paneList.size(); i++) { ((ChartDataPane) paneList.get(i)).addAttributeChangeListener(listener); } } From 40fb79cbf4d81faa9b93ed53b8a623571264d303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Wed, 8 Jul 2020 11:43:06 +0800 Subject: [PATCH 62/73] CHART-14346 --- ...VanChartCustomPlotDataContentsTabPane.java | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java index 184bc2b11..6d7d24bf9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotDataContentsTabPane.java @@ -23,7 +23,7 @@ import java.util.Map; */ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTabPane { - private boolean supportCellData = true; + private boolean supportCellData; public VanChartCustomPlotDataContentsTabPane(VanChartCustomPlot plot, VanChartCustomDataPane parent, AttributeChangeListener listener) { super(plot, parent, listener); @@ -34,9 +34,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab } public void setSupportCellData(boolean supportCellData) { - for (JPanel jPanel : paneList) { - ((VanChartDataPane) jPanel).setSupportCellData(supportCellData); - } + this.supportCellData = supportCellData; } @Override @@ -73,6 +71,7 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab for (int i = 0; i < customPlotList.size(); i++) { //根据不同的plot创建不同的数据配置界面 ChartDataPane contentPane = new VanChartDataPane(listener); + contentPane.setSupportCellData(supportCellData); paneList.add(contentPane); } @@ -84,38 +83,34 @@ public class VanChartCustomPlotDataContentsTabPane extends VanChartCustomPlotTab plot = (VanChartCustomPlot) chartCollection.getSelectedChart().getPlot(); - if (paneList == null) { - paneList = initPaneList(); - } - - if (paneList != null) { - - try { + paneList = initPaneList(); - List customPlotList = plot.getCustomPlotList(); + relayoutWhenListChange(); + try { + List customPlotList = plot.getCustomPlotList(); - for (int i = 0; i < paneList.size() && i < customPlotList.size(); i++) { - //將plot包裝起来,主要是为了获取dataDefinition - ChartCollection cloneCollection = (ChartCollection) chartCollection.clone(); - //设置collection的plot - cloneCollection.getSelectedChart().setPlot(customPlotList.get(i)); + for (int i = 0; i < paneList.size() && i < customPlotList.size(); i++) { + //將plot包裝起来,主要是为了获取dataDefinition + ChartCollection cloneCollection = (ChartCollection) chartCollection.clone(); - //获取definitionMap中的dataDefinition - TopDefinitionProvider definition = chartCollection.getSelectedChart().getFilterDefinition(); - TopDefinitionProvider dataDefinition = null; - if (definition != null && definition instanceof CustomDefinition) { - Map definitionProviderMap = ((CustomDefinition) definition).getDefinitionProviderMap(); - dataDefinition = definitionProviderMap.get(CustomPlotFactory.getCustomType(customPlotList.get(i))); - } - cloneCollection.getSelectedChart().setFilterDefinition(dataDefinition); + //设置collection的plot + cloneCollection.getSelectedChart().setPlot(customPlotList.get(i)); - ((ChartDataPane) paneList.get(i)).populate(cloneCollection); + //获取definitionMap中的dataDefinition + TopDefinitionProvider definition = chartCollection.getSelectedChart().getFilterDefinition(); + TopDefinitionProvider dataDefinition = null; + if (definition != null && definition instanceof CustomDefinition) { + Map definitionProviderMap = ((CustomDefinition) definition).getDefinitionProviderMap(); + dataDefinition = definitionProviderMap.get(CustomPlotFactory.getCustomType(customPlotList.get(i))); } - } catch (Exception e) { - return; + cloneCollection.getSelectedChart().setFilterDefinition(dataDefinition); + + ((ChartDataPane) paneList.get(i)).populate(cloneCollection); } + } catch (Exception e) { + return; } } From 87e818f2721dfa1869bfa07ac03b083a684ae78c Mon Sep 17 00:00:00 2001 From: Harrison Date: Wed, 8 Jul 2020 14:42:02 +0800 Subject: [PATCH 63/73] =?UTF-8?q?REPORT-35016=E3=80=90=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E7=94=9F=E6=88=90=E3=80=91=E7=9B=AE=E5=89=8D=E7=94=9F=E6=88=90?= =?UTF-8?q?=E7=9A=84=E7=BB=84=E4=BB=B6=EF=BC=8C=E4=BB=8E=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=BA=93=E6=8B=96=E5=85=A5=E6=A8=A1=E6=9D=BF=E4=B8=AD=E4=BC=9A?= =?UTF-8?q?=E5=8F=98=E5=A4=A7=20[=E5=9C=BA=E6=99=AF]=20=E4=BB=8E=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=BA=93=E6=8B=96=E5=85=A5=E6=97=B6=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E4=BF=9D=E6=8C=81=E5=8E=9F=E6=9C=89=E7=9A=84=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E3=80=82=20[=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88]=20?= =?UTF-8?q?=E5=B0=86=E5=8E=9F=E6=9D=A5=E7=9A=84=E5=A4=A7=E5=B0=8F=EF=BC=8C?= =?UTF-8?q?=E5=9C=A8=E5=88=9B=E5=BB=BA=E6=97=B6=E4=B8=80=E5=B9=B6=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/mainframe/ShareWidgetButton.java | 61 +++++++++++++------ .../mainframe/ShareWidgetButtonTest.java | 38 ++++++++++++ 2 files changed, 80 insertions(+), 19 deletions(-) create mode 100644 designer-form/src/test/java/com/fr/design/mainframe/ShareWidgetButtonTest.java diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ShareWidgetButton.java b/designer-form/src/main/java/com/fr/design/mainframe/ShareWidgetButton.java index 7e7d76d89..cdfa095bf 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ShareWidgetButton.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ShareWidgetButton.java @@ -14,6 +14,7 @@ import com.fr.general.ComparatorUtils; import com.fr.general.IOUtils; import com.fr.share.ShareConstants; import com.fr.stable.StringUtils; +import org.jetbrains.annotations.NotNull; import javax.swing.Icon; import javax.swing.ImageIcon; @@ -52,12 +53,12 @@ import java.io.Serializable; */ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMotionListener, Serializable { - private static final Dimension TAB_DEFAULT_SIZE = new Dimension(500, 300); - private SharableWidgetProvider bindInfo; - private MouseEvent lastPressEvent; - private JPanel reportPane; - private boolean isEdit; - private boolean isMarked; + protected SharableWidgetProvider bindInfo; + protected MouseEvent lastPressEvent; + protected JPanel reportPane; + protected boolean isEdit; + protected boolean isMarked; + private ShareWidgetUI ui; private Icon markedMode = IOUtils.readIcon("/com/fr/design/form/images/marked.png"); private Icon unMarkedMode = IOUtils.readIcon("/com/fr/design/form/images/unmarked.png"); private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 60 / 100.0F); @@ -71,9 +72,11 @@ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMot unMarkedMode.paintIcon(this, g, 0, 0); } }; - - public ShareWidgetButton(SharableWidgetProvider bindInfo) { + + public ShareWidgetButton(SharableWidgetProvider bindInfo, ShareWidgetUI ui) { + this.bindInfo = bindInfo; + this.ui = ui; this.setPreferredSize(new Dimension(108, 68)); initUI(); this.setLayout(getCoverLayout()); @@ -81,7 +84,12 @@ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMot this.addMouseMotionListener(this); new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE); } - + + public ShareWidgetButton(SharableWidgetProvider bindInfo) { + + this(bindInfo, new ShareWidgetUI()); + } + public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; Composite oldComposite = g2d.getComposite(); @@ -219,21 +227,14 @@ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMot if (creatorSource != null) { ((AbstractBorderStyleWidget)creatorSource).addWidgetAttrMark(new SharableAttrMark(true)); //tab布局WCardMainBorderLayout通过反射出来的大小是960*480 - XCreator xCreator = null; - if (creatorSource instanceof WCardMainBorderLayout) { - xCreator = XCreatorUtils.createXCreator(creatorSource, TAB_DEFAULT_SIZE); - } else { - xCreator = XCreatorUtils.createXCreator(creatorSource); - } - xCreator.setBackupBound(new Rectangle(no.getBindInfo().getWidth(), no.getBindInfo().getHeight())); - xCreator.setShareId(shareId); + XCreator xCreator = ui.createXCreator(creatorSource, shareId, no.getBindInfo()); WidgetToolBarPane.getTarget().startDraggingBean(xCreator); lastPressEvent = null; this.setBorder(null); } } } - + @Override public void mouseMoved(MouseEvent e) { @@ -283,9 +284,31 @@ public class ShareWidgetButton extends JPanel implements MouseListener, MouseMot } return false; } - + public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException { return widget; } } + + /** + * 抽出来,专门为了创建 ui 来搞 + */ + public static class ShareWidgetUI { + + private static final Dimension TAB_DEFAULT_SIZE = new Dimension(500, 300); + + @NotNull + public XCreator createXCreator(Widget creatorSource, String shareId, SharableWidgetProvider provider) { + + XCreator xCreator = null; + if (creatorSource instanceof WCardMainBorderLayout) { + xCreator = XCreatorUtils.createXCreator(creatorSource, TAB_DEFAULT_SIZE); + } else { + xCreator = XCreatorUtils.createXCreator(creatorSource, new Dimension(provider.getWidth(), provider.getHeight())); + } + xCreator.setBackupBound(new Rectangle(provider.getWidth(), provider.getHeight())); + xCreator.setShareId(shareId); + return xCreator; + } + } } diff --git a/designer-form/src/test/java/com/fr/design/mainframe/ShareWidgetButtonTest.java b/designer-form/src/test/java/com/fr/design/mainframe/ShareWidgetButtonTest.java new file mode 100644 index 000000000..50f8afc18 --- /dev/null +++ b/designer-form/src/test/java/com/fr/design/mainframe/ShareWidgetButtonTest.java @@ -0,0 +1,38 @@ +package com.fr.design.mainframe; + +import com.fr.chart.chartattr.ChartCollection; +import com.fr.design.designer.creator.XCreator; +import com.fr.form.share.SharableWidgetProvider; +import com.fr.form.ui.ChartEditor; +import com.fr.general.ImageWithSuffix; +import com.fr.invoke.Reflect; +import org.easymock.EasyMock; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PowerMockIgnore; +import org.powermock.modules.junit4.PowerMockRunner; + +@RunWith(PowerMockRunner.class) +@PowerMockIgnore({"com.fr.jvm.assist.*", "javax.swing.*"}) +public class ShareWidgetButtonTest { + + @Test + public void testCreateXCreator() throws Exception { + + SharableWidgetProvider provider = EasyMock.mock(SharableWidgetProvider.class); + EasyMock.expect(provider.getWidth()).andReturn(300).anyTimes(); + EasyMock.expect(provider.getHeight()).andReturn(400).anyTimes(); + EasyMock.expect(provider.getName()).andReturn("test-drag").anyTimes(); + EasyMock.expect(provider.getCover()).andReturn(new ImageWithSuffix("utf-8")).anyTimes(); + EasyMock.replay(provider); + + ShareWidgetButton.ShareWidgetUI ui = new ShareWidgetButton.ShareWidgetUI(); + + ChartEditor editor = new ChartEditor(); + Reflect.on(editor).set("chartCollection", new ChartCollection()); + XCreator xCreator = ui.createXCreator(editor, "333", provider); + Assert.assertEquals(300, xCreator.getWidth()); + Assert.assertEquals(400, xCreator.getHeight()); + } +} \ No newline at end of file From c2042dbd000ecd0464ddee34e0bf09f435863ac3 Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Wed, 8 Jul 2020 15:07:08 +0800 Subject: [PATCH 64/73] =?UTF-8?q?REPORT-33500=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=B8=85=E9=99=A4=E6=97=A5=E5=BF=97=E5=90=8E?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=B8=85=E9=99=A4=E8=AE=BE=E8=AE=A1=E5=99=A8?= =?UTF-8?q?=E5=8F=B3=E4=B8=8A=E8=A7=92=E6=97=A5=E5=BF=97=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/loghandler/LogHandlerBar.java | 1 + .../com/fr/design/mainframe/loghandler/LogMessageBar.java | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java index 433d601c0..eb9ba74c2 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogHandlerBar.java @@ -93,6 +93,7 @@ public class LogHandlerBar extends JPanel implements ItemSelectable { public void clearMessage() { INFONUM = ERRORNUM = SERVERNUM = 0; + LogMessageBar.getInstance().clear(); changeLabel(); } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 8b3cedeef..2e0f0a987 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -63,6 +63,11 @@ public class LogMessageBar extends JPanel { repaint(); } + public void clear() { + messageLabel.setText(""); + repaint(); + } + public void setLoggerBarWidth(int width) { this.width = width; } From bf1b315dcae41d94986d06f1826e5de8eee40ffd Mon Sep 17 00:00:00 2001 From: "Yuan.Wang" <1536296691@qq.com> Date: Wed, 8 Jul 2020 15:29:00 +0800 Subject: [PATCH 65/73] =?UTF-8?q?REPORT-34351=20""=E6=94=B9=E4=B8=BAString?= =?UTF-8?q?Utils.EMPTY?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/mainframe/loghandler/LogMessageBar.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java index 2e0f0a987..dc10d8883 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/loghandler/LogMessageBar.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe.loghandler; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ilable.UILabel; +import com.fr.stable.StringUtils; import javax.swing.JFrame; @@ -64,7 +65,7 @@ public class LogMessageBar extends JPanel { } public void clear() { - messageLabel.setText(""); + messageLabel.setText(StringUtils.EMPTY); repaint(); } From 9a0b3023a07ab51950e4bbcc3611ead2980ff18b Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Thu, 9 Jul 2020 15:01:07 +0800 Subject: [PATCH 66/73] =?UTF-8?q?REPORT-31546=20=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E7=9A=84=E8=AF=B4=E6=98=8E=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E5=81=B6=E5=B0=94=E4=BC=9A=E5=A4=B1=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/formula/FormulaPane.java | 83 ++++++++++++------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java index 9259248ac..96a82d228 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaPane.java @@ -246,44 +246,69 @@ public class FormulaPane extends BasicPane implements KeyListener, UIFormula { } public class DoubleClick extends MouseAdapter { + String singlePressContent; + + String doublePressContent; + + @Override + public void mousePressed(MouseEvent e) { + int index = tipsList.getSelectedIndex(); + if (index != -1) { + if (e.getClickCount() == 1) { + singlePressContent = (String) listModel.getElementAt(index); + } else if (e.getClickCount() == 2) { + doublePressContent = (String) listModel.getElementAt(index); + } + } + } @Override - public void mouseClicked(MouseEvent e) { + public void mouseReleased(MouseEvent e) { int index = tipsList.getSelectedIndex(); if (index != -1) { - String currentLineContent = (String) listModel.getElementAt(index); - if (e.getClickCount() == 2) { - if (ifHasBeenWriten == 0) { - formulaTextArea.setForeground(Color.black); - formulaTextArea.setText(""); + if (e.getClickCount() == 1) { + if (ComparatorUtils.equals((String) listModel.getElementAt(index), singlePressContent)) { + singleClickActuator(singlePressContent); } - formulaTextArea.setForeground(Color.black); - currentPosition = formulaTextArea.getCaretPosition(); - String output = currentLineContent + "()"; - String textAll = formulaTextArea.getText(); - String textReplaced; - int position = 0; - if (insertPosition <= currentPosition) { - textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition); - position = insertPosition + output.length() - 1; - } else { - textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition); - position = currentPosition + output.length() - 1; + } else if (e.getClickCount() == 2) { + if (ComparatorUtils.equals((String) listModel.getElementAt(index), doublePressContent)) { + doubleClickActuator(doublePressContent); } - formulaTextArea.setText(textReplaced); - formulaTextArea.requestFocusInWindow(); - formulaTextArea.setCaretPosition(position); - insertPosition = position; - ifHasBeenWriten = 1; - listModel.removeAllElements(); - } else if (e.getClickCount() == 1) { - refreshDescriptionTextArea(currentLineContent); - - formulaTextArea.requestFocusInWindow(); - fixFunctionNameList(); } } } + + private void singleClickActuator(String currentLineContent) { + refreshDescriptionTextArea(currentLineContent); + formulaTextArea.requestFocusInWindow(); + fixFunctionNameList(); + } + + private void doubleClickActuator(String currentLineContent) { + if (ifHasBeenWriten == 0) { + formulaTextArea.setForeground(Color.black); + formulaTextArea.setText(""); + } + formulaTextArea.setForeground(Color.black); + currentPosition = formulaTextArea.getCaretPosition(); + String output = currentLineContent + "()"; + String textAll = formulaTextArea.getText(); + String textReplaced; + int position = 0; + if (insertPosition <= currentPosition) { + textReplaced = textAll.substring(0, insertPosition) + output + textAll.substring(currentPosition); + position = insertPosition + output.length() - 1; + } else { + textReplaced = textAll.substring(0, currentPosition) + output + textAll.substring(insertPosition); + position = currentPosition + output.length() - 1; + } + formulaTextArea.setText(textReplaced); + formulaTextArea.requestFocusInWindow(); + formulaTextArea.setCaretPosition(position); + insertPosition = position; + ifHasBeenWriten = 1; + listModel.removeAllElements(); + } } @Override From 57662d4bfb2acfeae6c9b5d52a29fbfe4f8d1266 Mon Sep 17 00:00:00 2001 From: "Jimmy.Zheng" Date: Thu, 9 Jul 2020 15:42:06 +0800 Subject: [PATCH 67/73] REPORT-33236 --- .../data/datapane/connect/JDBCDefPane.java | 719 +++++++++--------- 1 file changed, 373 insertions(+), 346 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java index 7bbcda825..5e8199d95 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/connect/JDBCDefPane.java @@ -1,5 +1,6 @@ package com.fr.design.data.datapane.connect; +import com.fr.base.GraphHelper; import com.fr.design.constants.UIConstants; import com.fr.data.impl.JDBCDatabaseConnection; import com.fr.data.pool.DBCPConnectionPoolAttr; @@ -16,7 +17,9 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.dialog.BasicPane; import com.fr.design.editor.editor.IntegerEditor; +import com.fr.design.utils.BrowseUtils; import com.fr.file.filter.ChooseFileFilter; +import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; @@ -32,351 +35,375 @@ import java.util.Map; import java.util.Map.Entry; public class JDBCDefPane extends JPanel { - public static final String DRIVER_TYPE = "driver_type"; - public static final String USER_NAME = "user_name"; + public static final String DRIVER_TYPE = "driver_type"; + public static final String USER_NAME = "user_name"; public static final int TIME_MULTIPLE = 1000; - private static final String OTHER_DB = "Others"; - - private static Map jdbcMap = new HashMap(); - - static { - jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), - new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), - new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), - new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"), - new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")}); - jdbcMap.put("Inceptor",new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver","jdbc:inceptor2://localhost:10000/default"), - new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver","jdbc:inceptor://localhost:10000/default")}); - jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); - jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); - jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); - jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), - new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); - jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); - jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); - jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); - jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); - jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")}); - } - - private UIButton dbtypeButton; - private UIComboBox dbtypeComboBox; - private UIComboBox driverComboBox; - private UITextField urlTextField; - private UITextField userNameTextField; - private JPasswordField passwordTextField; - // 请不要改动dbtype,只应该最后添加 - private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre","SQLite","Inceptor", OTHER_DB}; - - // carl:DBCP的一些属性 - private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); - private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); - private UITextField DBCP_VALIDATION_QUERY = new UITextField(); - - private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); - - private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); - private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); - private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); - - public JDBCDefPane() { - this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); - this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); - JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); - this.add(innerthis); - dbtypeComboBox = new UIComboBox(); - dbtypeComboBox.setName(DRIVER_TYPE); - for (int i = 0; i < dbtype.length; i++) { - dbtypeComboBox.addItem(dbtype[i]); - } - dbtypeComboBox.addActionListener(dbtypeActionListener); - dbtypeComboBox.setMaximumRowCount(10); - - driverComboBox = new UIComboBox(); - driverComboBox.setEditable(true); - driverComboBox.addActionListener(driverListener); - urlTextField = new UITextField(15); - userNameTextField = new UITextField(15); - userNameTextField.setName(USER_NAME); - passwordTextField = new UIPassWordField(15); - dbtypeButton = new UIButton("."); - dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); - dbtypeButton.addActionListener(dbtypeButtonActionListener); - - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); - JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] dbtypeComComponents = {{dbtypeComboBox}}; - double[] dbtypeRowSize = {p}; - double[] dbtypeColumnSize = {p}; - dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); - - JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); - - JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - urlPane.add(new UILabel("URL:")); - JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; - double[] urlRowSize = {p}; - double[] urlColumnSize = {f, 21}; - urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); - - JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); - JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; - double[] userRowSize = {p}; - double[] userColumnSize = {f, p, f}; - userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); - - JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); - passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":")); - - Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBox}, {urlPane, urlComPane}, {userPane, userComPane},}; - - double[] rowSize = {p, p, p, p}; - double[] columnSize = {p, f, 22}; - JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); - innerthis.add(centerPanel); - JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); - innerthis.add(southPanel); - southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); - ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); - southPanel.add(actionLabel, BorderLayout.EAST); - actionLabel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent evt) { - JDialog wDialog = createJDialog(); - wDialog.setVisible(true); - } - }); - } - - public void populate(JDBCDatabaseConnection jdbcDatabase) { - if (jdbcDatabase == null) { - jdbcDatabase = new JDBCDatabaseConnection(); - } - if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") - && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { - this.dbtypeComboBox.setSelectedItem("Access"); - } else { - Iterator> jdbc = jdbcMap.entrySet().iterator(); - boolean out = false; - while (jdbc.hasNext()) { - Entry entry = jdbc.next(); - DriverURLName[] dus = entry.getValue(); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) { - this.dbtypeComboBox.setSelectedItem(entry.getKey()); - out = true; - break; - } - } - if (out) { - break; - } - } - if (!out) { - this.dbtypeComboBox.setSelectedItem(OTHER_DB); - } - } - this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); - this.urlTextField.setText(jdbcDatabase.getURL()); - this.userNameTextField.setText(jdbcDatabase.getUser()); - this.passwordTextField.setText(jdbcDatabase.getPassword()); - - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); - } - this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); - this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); - this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); - this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); - this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); - this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); - this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); - this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); - this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); - this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); - this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); - this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); - } - - public JDBCDatabaseConnection update() { - JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection(); - Object driveItem = this.driverComboBox.getSelectedItem(); - jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); - jdbcDatabase.setURL(this.urlTextField.getText().trim()); - jdbcDatabase.setUser(this.userNameTextField.getText().trim()); - jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); - - DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); - if (dbcpAttr == null) { - dbcpAttr = new DBCPConnectionPoolAttr(); - jdbcDatabase.setDbcpAttr(dbcpAttr); - } - dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); - dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); - dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); - dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); - dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); - dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); - dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); - dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); - dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); - dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); - - return jdbcDatabase; - } - - ActionListener dbtypeActionListener = new ActionListener() { - public void actionPerformed(ActionEvent evt) { - - urlTextField.setText(StringUtils.EMPTY); - driverComboBox.removeAllItems(); - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { - driverComboBox.setSelectedItem(StringUtils.EMPTY); - return; - } - - DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); - for (int i = 0, len = dus.length; i < len; i++) { - driverComboBox.addItem(dus[i].getDriver()); - if (i == 0) { - driverComboBox.setSelectedItem(dus[i].getDriver()); - urlTextField.setText(dus[i].getURL()); - } - } - } - }; - - ActionListener driverListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (driverComboBox.getSelectedItem() == null ||ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { - return; - } - Iterator> jdbc = jdbcMap.entrySet().iterator(); - while (jdbc.hasNext()) { - Entry entry = jdbc.next(); - DriverURLName[] dus = entry.getValue(); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) { - urlTextField.setText(dus[i].getURL()); - return; - } - } - } - } - - }; - - ActionListener dbtypeButtonActionListener = new ActionListener() { - public void actionPerformed(ActionEvent evt) { - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { - return; - } - DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); - for (int i = 0, len = dus.length; i < len; i++) { - if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) { - urlTextField.setText(dus[i].getURL()); - if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) { - // ben:这个能不能换种处理方案- - - JFileChooser filechooser = new JFileChooser(); - filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open")); - filechooser.setMultiSelectionEnabled(false); - filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access")); - int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame()); - File selectedfile = null; - - if (result == JFileChooser.APPROVE_OPTION) { - selectedfile = filechooser.getSelectedFile(); - if (selectedfile != null) { - String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1); - if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) { - urlTextField.setText(urlTextField.getText() + selectedfile.getPath()); - } - } - } - } - break; - } - } - } - }; - - private JDialog createJDialog() { - return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); - } - - class DBCPAttrPane extends BasicPane { - public DBCPAttrPane() { - JPanel defaultPane = this; - - // JPanel northFlowPane - JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); - defaultPane.add(northFlowPane, BorderLayout.NORTH); - - DBCP_VALIDATION_QUERY.setColumns(15); - // ContextPane - - double f = TableLayout.FILL; - // double p = TableLayout.PREFERRED; - double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; - double[] columnSize = {f, f}; - Component[][] comps = { - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":" , SwingConstants.RIGHT), DBCP_MAX_WAIT}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), - DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":" , SwingConstants.RIGHT), - DBCP_MINEVICTABLEIDLETIMEMILLIS}}; - - JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); - contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); - northFlowPane.add(contextPane); - } - - @Override - protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); - } - } - - private static class DriverURLName { - public DriverURLName(String driver, String url) { - this.driver = driver; - this.url = url; - } - - public String getDriver() { - return this.driver; - } - - public String getURL() { - return this.url; - } - - private String driver; - private String url; - } + private static final String OTHER_DB = "Others"; + + private static Map jdbcMap = new HashMap(); + + static { + jdbcMap.put(OTHER_DB, new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:"), + new DriverURLName("org.hsqldb.jdbcDriver", "jdbc:hsqldb:file:[PATH_TO_DB_FILES]"), new DriverURLName("com.inet.tds.TdsDriver", "jdbc:inetdae7:localhost:1433/"), + new DriverURLName("COM.cloudscape.JDBCDriver", "jdbc:cloudscape:/cloudscape/"), + new DriverURLName("com.internetcds.jdbc.tds.Driver", "jdbc:freetds:sqlserver://localhost/"), + new DriverURLName("com.fr.swift.jdbc.Driver", "jdbc:swift:emb://default")}); + jdbcMap.put("Inceptor", new DriverURLName[]{new DriverURLName("org.apache.hive.jdbc.HiveDriver", "jdbc:inceptor2://localhost:10000/default"), + new DriverURLName("org.apache.hadoop.hive.jdbc.HiveDriver", "jdbc:inceptor://localhost:10000/default")}); + jdbcMap.put("Oracle", new DriverURLName[]{new DriverURLName("oracle.jdbc.driver.OracleDriver", "jdbc:oracle:thin:@localhost:1521:databaseName")}); + jdbcMap.put("DB2", new DriverURLName[]{new DriverURLName("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://localhost:50000/")}); + jdbcMap.put("SQL Server", new DriverURLName[]{new DriverURLName("com.microsoft.sqlserver.jdbc.SQLServerDriver", "jdbc:sqlserver://localhost:1433;" + "databaseName=")}); + jdbcMap.put("MySQL", new DriverURLName[]{new DriverURLName("com.mysql.jdbc.Driver", "jdbc:mysql://localhost/"), + new DriverURLName("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/")}); + jdbcMap.put("Sybase", new DriverURLName[]{new DriverURLName("com.sybase.jdbc2.jdbc.SybDriver", "jdbc:sybase:Tds:localhost:5000/")}); + jdbcMap.put("Access", new DriverURLName[]{new DriverURLName("sun.jdbc.odbc.JdbcOdbcDriver", "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=")}); + jdbcMap.put("Derby", new DriverURLName[]{new DriverURLName("org.apache.derby.jdbc.ClientDriver", "jdbc:derby://localhost:1527/")}); + jdbcMap.put("Postgre", new DriverURLName[]{new DriverURLName("org.postgresql.Driver", "jdbc:postgresql://localhost:5432/")}); + jdbcMap.put("SQLite", new DriverURLName[]{new DriverURLName("org.sqlite.JDBC", "jdbc:sqlite://${ENV_HOME}/../help/FRDemo.db")}); + } + + private UIButton dbtypeButton; + private UIComboBox dbtypeComboBox; + private UIComboBox driverComboBox; + private UITextField urlTextField; + private UITextField userNameTextField; + private JPasswordField passwordTextField; + private ActionLabel odbcTipsLink; + // 请不要改动dbtype,只应该最后添加 + private final String[] dbtype = {"Oracle", "DB2", "SQL Server", "MySQL", "Sybase", "Access", "Derby", "Postgre", "SQLite", "Inceptor", OTHER_DB}; + + // carl:DBCP的一些属性 + private IntegerEditor DBCP_INITIAL_SIZE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_ACTIVE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MIN_IDLE = new IntegerEditor(); + private IntegerEditor DBCP_MAX_WAIT = new IntegerEditor(); + private UITextField DBCP_VALIDATION_QUERY = new UITextField(); + + private UIComboBox DBCP_TESTONBORROW = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTONRETURN = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + private UIComboBox DBCP_TESTWHILEIDLE = new UIComboBox(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_No"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Yes")}); + + private IntegerEditor DBCP_TIMEBETWEENEVICTIONRUNSMILLS = new IntegerEditor(); + private IntegerEditor DBCP_NUMTESTSPEREVICTIONRUN = new IntegerEditor(); + private IntegerEditor DBCP_MINEVICTABLEIDLETIMEMILLIS = new IntegerEditor(); + + public JDBCDefPane() { + this.setBorder(UITitledBorder.createBorderWithTitle("JDBC" + ":")); + this.setLayout(FRGUIPaneFactory.createLabelFlowLayout()); + JPanel innerthis = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + innerthis.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + this.add(innerthis); + dbtypeComboBox = new UIComboBox(); + dbtypeComboBox.setName(DRIVER_TYPE); + for (int i = 0; i < dbtype.length; i++) { + dbtypeComboBox.addItem(dbtype[i]); + } + dbtypeComboBox.addActionListener(dbtypeActionListener); + dbtypeComboBox.setMaximumRowCount(10); + + driverComboBox = new UIComboBox(); + driverComboBox.setEditable(true); + driverComboBox.addActionListener(driverListener); + urlTextField = new UITextField(15); + userNameTextField = new UITextField(15); + userNameTextField.setName(USER_NAME); + passwordTextField = new UIPassWordField(15); + dbtypeButton = new UIButton("."); + dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); + dbtypeButton.addActionListener(dbtypeButtonActionListener); + + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + JPanel dbtypePane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + dbtypePane.add(new UILabel((com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database") + ":"))); + JPanel dbtypeComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] dbtypeComComponents = {{dbtypeComboBox}}; + double[] dbtypeRowSize = {p}; + double[] dbtypeColumnSize = {p}; + dbtypeComPane = TableLayoutHelper.createTableLayoutPane(dbtypeComComponents, dbtypeRowSize, dbtypeColumnSize); + + JPanel driverPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + driverPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Driver") + ":")); + // 选择ODBC数据源的时候的提示链接 + JPanel odbcTipsPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + odbcTipsLink = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")) { + @Override + public void paintComponent(Graphics _gfx) { + super.paintComponent(_gfx); + _gfx.setColor(Color.blue); + _gfx.drawLine(0, this.getHeight() - 1, GraphHelper.getWidth(this.getText()), this.getHeight() - 1); + } + }; + odbcTipsPane.add(odbcTipsLink); + odbcTipsLink.setPreferredSize(new Dimension(GraphHelper.getWidth(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Odbc_Tips")), odbcTipsLink.getPreferredSize().height)); + odbcTipsLink.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + String url = CloudCenter.getInstance().acquireUrlByKind("odbc.help"); + BrowseUtils.browser(url); + } + }); + + JPanel driverComboBoxAndTips = new JPanel(new BorderLayout()); + driverComboBoxAndTips.add(driverComboBox, BorderLayout.WEST); + driverComboBoxAndTips.add(odbcTipsPane, BorderLayout.CENTER); + + JPanel urlPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + urlPane.add(new UILabel("URL:")); + JPanel urlComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] urlComComponents = {{urlTextField, dbtypeButton}}; + double[] urlRowSize = {p}; + double[] urlColumnSize = {f, 21}; + urlComPane = TableLayoutHelper.createCommonTableLayoutPane(urlComComponents, urlRowSize, urlColumnSize, 4); + + JPanel userPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + userPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_UserName") + ":")); + JPanel userComPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + Component[][] userComComponents = {{userNameTextField, new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":"), passwordTextField}}; + double[] userRowSize = {p}; + double[] userColumnSize = {f, p, f}; + userComPane = TableLayoutHelper.createCommonTableLayoutPane(userComComponents, userRowSize, userColumnSize, 4); + + JPanel passwordPane = FRGUIPaneFactory.createRightFlowInnerContainer_S_Pane(); + passwordPane.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Password") + ":")); + + Component[][] components = {{dbtypePane, dbtypeComPane}, {driverPane, driverComboBoxAndTips}, {urlPane, urlComPane}, {userPane, userComPane},}; + + double[] rowSize = {p, p, p, p}; + double[] columnSize = {p, f, 22}; + JPanel centerPanel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); + innerthis.add(centerPanel); + JPanel southPanel = FRGUIPaneFactory.createBorderLayout_S_Pane(); + innerthis.add(southPanel); + southPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 4, 20)); + ActionLabel actionLabel = new ActionLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr")); + southPanel.add(actionLabel, BorderLayout.EAST); + actionLabel.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JDialog wDialog = createJDialog(); + wDialog.setVisible(true); + } + }); + } + + public void populate(JDBCDatabaseConnection jdbcDatabase) { + if (jdbcDatabase == null) { + jdbcDatabase = new JDBCDatabaseConnection(); + } + if (ComparatorUtils.equals(jdbcDatabase.getDriver(), "sun.jdbc.odbc.JdbcOdbcDriver") + && jdbcDatabase.getURL().startsWith("jdbc:odbc:Driver={Microsoft")) { + this.dbtypeComboBox.setSelectedItem("Access"); + } else { + Iterator> jdbc = jdbcMap.entrySet().iterator(); + boolean out = false; + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), jdbcDatabase.getDriver())) { + this.dbtypeComboBox.setSelectedItem(entry.getKey()); + out = true; + break; + } + } + if (out) { + break; + } + } + if (!out) { + this.dbtypeComboBox.setSelectedItem(OTHER_DB); + } + } + this.driverComboBox.setSelectedItem(jdbcDatabase.getDriver()); + this.urlTextField.setText(jdbcDatabase.getURL()); + this.userNameTextField.setText(jdbcDatabase.getUser()); + this.passwordTextField.setText(jdbcDatabase.getPassword()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + this.DBCP_INITIAL_SIZE.setValue(dbcpAttr.getInitialSize()); + this.DBCP_MAX_ACTIVE.setValue(dbcpAttr.getMaxActive()); + this.DBCP_MAX_IDLE.setValue(dbcpAttr.getMaxIdle()); + this.DBCP_MAX_WAIT.setValue(dbcpAttr.getMaxWait()); + this.DBCP_MIN_IDLE.setValue(dbcpAttr.getMinIdle()); + this.DBCP_VALIDATION_QUERY.setText(dbcpAttr.getValidationQuery()); + this.DBCP_TESTONBORROW.setSelectedIndex(dbcpAttr.isTestOnBorrow() ? 1 : 0); + this.DBCP_TESTONRETURN.setSelectedIndex(dbcpAttr.isTestOnReturn() ? 1 : 0); + this.DBCP_TESTWHILEIDLE.setSelectedIndex(dbcpAttr.isTestWhileIdle() ? 1 : 0); + this.DBCP_MINEVICTABLEIDLETIMEMILLIS.setValue(dbcpAttr.getMinEvictableIdleTimeMillis() / TIME_MULTIPLE); + this.DBCP_NUMTESTSPEREVICTIONRUN.setValue(dbcpAttr.getNumTestsPerEvictionRun()); + this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.setValue(dbcpAttr.getTimeBetweenEvictionRunsMillis()); + } + + public JDBCDatabaseConnection update() { + JDBCDatabaseConnection jdbcDatabase = new JDBCDatabaseConnection(); + Object driveItem = this.driverComboBox.getSelectedItem(); + jdbcDatabase.setDriver(driveItem == null ? null : driveItem.toString()); + jdbcDatabase.setURL(this.urlTextField.getText().trim()); + jdbcDatabase.setUser(this.userNameTextField.getText().trim()); + jdbcDatabase.setPassword(new String(this.passwordTextField.getPassword()).trim()); + + DBCPConnectionPoolAttr dbcpAttr = jdbcDatabase.getDbcpAttr(); + if (dbcpAttr == null) { + dbcpAttr = new DBCPConnectionPoolAttr(); + jdbcDatabase.setDbcpAttr(dbcpAttr); + } + dbcpAttr.setInitialSize(this.DBCP_INITIAL_SIZE.getValue().intValue()); + dbcpAttr.setMaxActive(this.DBCP_MAX_ACTIVE.getValue().intValue()); + dbcpAttr.setMaxIdle(this.DBCP_MAX_IDLE.getValue().intValue()); + dbcpAttr.setMaxWait(this.DBCP_MAX_WAIT.getValue().intValue()); + dbcpAttr.setMinIdle(this.DBCP_MIN_IDLE.getValue().intValue()); + dbcpAttr.setValidationQuery(this.DBCP_VALIDATION_QUERY.getText()); + dbcpAttr.setTestOnBorrow(this.DBCP_TESTONBORROW.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestOnReturn(this.DBCP_TESTONRETURN.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setTestWhileIdle(this.DBCP_TESTWHILEIDLE.getSelectedIndex() == 0 ? false : true); + dbcpAttr.setMinEvictableIdleTimeMillis(((Number) this.DBCP_MINEVICTABLEIDLETIMEMILLIS.getValue()).intValue() * TIME_MULTIPLE); + dbcpAttr.setNumTestsPerEvictionRun(((Number) this.DBCP_NUMTESTSPEREVICTIONRUN.getValue()).intValue()); + dbcpAttr.setTimeBetweenEvictionRunsMillis(((Number) this.DBCP_TIMEBETWEENEVICTIONRUNSMILLS.getValue()).intValue()); + + return jdbcDatabase; + } + + ActionListener dbtypeActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + + urlTextField.setText(StringUtils.EMPTY); + driverComboBox.removeAllItems(); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + driverComboBox.setSelectedItem(StringUtils.EMPTY); + return; + } + + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + driverComboBox.addItem(dus[i].getDriver()); + if (i == 0) { + driverComboBox.setSelectedItem(dus[i].getDriver()); + urlTextField.setText(dus[i].getURL()); + } + } + } + }; + + ActionListener driverListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (driverComboBox.getSelectedItem() == null || ComparatorUtils.equals(driverComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + odbcTipsLink.setVisible(ComparatorUtils.equals("sun.jdbc.odbc.JdbcOdbcDriver", driverComboBox.getSelectedItem())); // 选择的如果是ODBC就显示提示 + Iterator> jdbc = jdbcMap.entrySet().iterator(); + while (jdbc.hasNext()) { + Entry entry = jdbc.next(); + DriverURLName[] dus = entry.getValue(); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(dus[i].getDriver(), (driverComboBox.getSelectedItem()))) { + urlTextField.setText(dus[i].getURL()); + return; + } + } + } + } + + }; + + ActionListener dbtypeButtonActionListener = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), StringUtils.EMPTY)) { + return; + } + DriverURLName[] dus = jdbcMap.get(dbtypeComboBox.getSelectedItem()); + for (int i = 0, len = dus.length; i < len; i++) { + if (ComparatorUtils.equals(driverComboBox.getSelectedItem(), (dus[i].getDriver()))) { + urlTextField.setText(dus[i].getURL()); + if (ComparatorUtils.equals(dbtypeComboBox.getSelectedItem(), ("Access"))) { + // ben:这个能不能换种处理方案- - + JFileChooser filechooser = new JFileChooser(); + filechooser.setDialogTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Open")); + filechooser.setMultiSelectionEnabled(false); + filechooser.addChoosableFileFilter(new ChooseFileFilter(new String[]{"accdb", "mdb"}, "Microsoft Office Access")); + int result = filechooser.showOpenDialog(DesignerContext.getDesignerFrame()); + File selectedfile = null; + + if (result == JFileChooser.APPROVE_OPTION) { + selectedfile = filechooser.getSelectedFile(); + if (selectedfile != null) { + String selectedName = selectedfile.getPath().substring(selectedfile.getPath().lastIndexOf('.') + 1); + if (selectedName.equalsIgnoreCase("mdb") || selectedName.equalsIgnoreCase("accdb")) { + urlTextField.setText(urlTextField.getText() + selectedfile.getPath()); + } + } + } + } + break; + } + } + } + }; + + private JDialog createJDialog() { + return new DBCPAttrPane().showWindow(SwingUtilities.getWindowAncestor(JDBCDefPane.this)); + } + + class DBCPAttrPane extends BasicPane { + public DBCPAttrPane() { + JPanel defaultPane = this; + + // JPanel northFlowPane + JPanel northFlowPane = FRGUIPaneFactory.createY_AXISBoxInnerContainer_L_Pane(); + defaultPane.add(northFlowPane, BorderLayout.NORTH); + + DBCP_VALIDATION_QUERY.setColumns(15); + // ContextPane + + double f = TableLayout.FILL; + // double p = TableLayout.PREFERRED; + double[] rowSize = {f, f, f, f, f, f, f, f, f, f, f, f}; + double[] columnSize = {f, f}; + Component[][] comps = { + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Initial_Size") + ":", SwingConstants.RIGHT), DBCP_INITIAL_SIZE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Active") + ":", SwingConstants.RIGHT), DBCP_MAX_ACTIVE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Max_Idle") + ":", SwingConstants.RIGHT), DBCP_MAX_IDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Min_Idle") + ":", SwingConstants.RIGHT), DBCP_MIN_IDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Max_Wait_Time") + ":", SwingConstants.RIGHT), DBCP_MAX_WAIT}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Validation_Query") + ":", SwingConstants.RIGHT), DBCP_VALIDATION_QUERY}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Borrow") + ":", SwingConstants.RIGHT), DBCP_TESTONBORROW}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_On_Return") + ":", SwingConstants.RIGHT), DBCP_TESTONRETURN}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Test_While_Idle") + ":", SwingConstants.RIGHT), DBCP_TESTWHILEIDLE}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Evictionruns_millis") + ":", SwingConstants.RIGHT), + DBCP_TIMEBETWEENEVICTIONRUNSMILLS}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Dbcp_Num_Test_Per_Evction_Run") + ":", SwingConstants.RIGHT), DBCP_NUMTESTSPEREVICTIONRUN}, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Connection_Pool_Mix_Evictable_Idle_Time_Millis") + ":", SwingConstants.RIGHT), + DBCP_MINEVICTABLEIDLETIMEMILLIS}}; + + JPanel contextPane = TableLayoutHelper.createGapTableLayoutPane(comps, rowSize, columnSize, 10, 4); + contextPane.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, UIConstants.LINE_COLOR)); + northFlowPane.add(contextPane); + } + + @Override + protected String title4PopupWindow() { + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_ConnectionPool_Attr"); + } + } + + private static class DriverURLName { + public DriverURLName(String driver, String url) { + this.driver = driver; + this.url = url; + } + + public String getDriver() { + return this.driver; + } + + public String getURL() { + return this.url; + } + + private String driver; + private String url; + } } From 3285d11d499de50aaa79a003aadee974ae45181c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 10 Jul 2020 11:15:16 +0800 Subject: [PATCH 68/73] =?UTF-8?q?CHART-14120=20=E8=8B=B1=E6=96=87=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8=E5=9C=B0=E5=9B=BE=E6=95=B0=E6=8D=AE=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF=E6=88=AA=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../table/VanPointMapPlotTableDataContentPane.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java index 2e25e1bc2..39110caf1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/data/contentpane/table/VanPointMapPlotTableDataContentPane.java @@ -4,9 +4,11 @@ import com.fr.design.beans.BasicBeanPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ilable.BoldFontTextLabel; import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.chart.gui.ChartDataPane; +import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.map.data.VanMapTableDefinitionProvider; import com.fr.van.chart.map.designer.data.component.table.AbstractLongLatAreaPane; import com.fr.van.chart.map.designer.data.component.table.AreaPane; @@ -91,6 +93,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData double p = TableLayout.PREFERRED; double f = TableLayout.FILL; + double labelWidth = 65; this.setLayout(new BorderLayout(0, 5)); centerPane = new JPanel(new CardLayout()) { @@ -122,13 +125,14 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData locationType.setSelectedIndex(0); - double[] columnSize = {p, f}; + double[] columnSize = {labelWidth, f}; double[] rowSize = {p}; + UILabel label = FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Geographic")); Component[][] components = new Component[][]{ - new Component[]{new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Geographic")), locationType}, + new Component[]{label, locationType}, }; - JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 30, 6); + JPanel panel = TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 5, 6); this.add(panel, BorderLayout.NORTH); this.add(centerPane, BorderLayout.CENTER); @@ -219,7 +223,7 @@ public class VanPointMapPlotTableDataContentPane extends VanAreaMapPlotTableData return new PointMapAreaPane(longLatAreaTableComboPane) { protected void initAreaPane(VanPointMapPlotTableDataContentPane.LongLatAreaTableComboPane parentPane) { areaPane = new AreaPane(parentPane) { - protected Component[][] getComponent () { + protected Component[][] getComponent() { return new Component[][]{ new Component[]{new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Area_Name")), VanPointMapPlotTableDataContentPane.this.createAreaPanel(areaNameCom)} }; From 831f34ccf7eaa543ae6c04550a2f81a27aae21e7 Mon Sep 17 00:00:00 2001 From: "Henry.Wang" Date: Fri, 10 Jul 2020 12:42:34 +0800 Subject: [PATCH 69/73] =?UTF-8?q?REPORT-34020=20=E3=80=90=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E3=80=91=E9=9D=9E=E7=AE=80=E4=B8=AD=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=99=A8-=E7=95=8C=E9=9D=A2=E5=8F=B3=E4=BE=A7?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E9=80=89=E6=8B=A9=E8=B6=85=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E6=88=96=E6=82=AC=E6=B5=AE=E5=85=83=E7=B4=A0=E5=90=8E=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E6=BA=A2=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/utils/gui/GUICoreUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java index 5a9396da6..586047f5a 100644 --- a/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/gui/GUICoreUtils.java @@ -398,9 +398,11 @@ public final class GUICoreUtils { Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); screen.setSize(screen.getSize().width, screen.height - HEIGHT_GAP); + int showOnScreenX = Math.min(screen.width, parentComponent.getLocationOnScreen().x + parentComponent.getWidth()); + // peter:调整X的高度. - if (point.x + size.width > screen.width && size.width < screen.width) { - x += (screen.width - point.x - size.width); + if (point.x + size.width > showOnScreenX && size.width < showOnScreenX) { + x += (showOnScreenX - point.x - size.width); } // peter:调整y高度. From e828cd48d5030505beb64c53954f33bb6a8b14f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 10 Jul 2020 15:11:41 +0800 Subject: [PATCH 70/73] =?UTF-8?q?CHART-14541=20=E8=BD=B4=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=BC=A9=E8=BF=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chart/designer/style/axis/VanChartBaseAxisPane.java | 5 +++-- .../chart/designer/style/axis/VanChartTimeAxisPane.java | 8 ++++---- .../chart/designer/style/axis/VanChartValueAxisPane.java | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index fcc34958e..be2c7d8a5 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -126,7 +126,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { double[] column = {f, s}; double[] rowSize = {p, p, p, p, p, p, p, p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, new Component[]{createLabelPane(new double[]{p, p}, column), null}, new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, new Component[]{createAxisPositionPane(new double[]{p, p, p}, columnSize, isXAxis), null}, @@ -144,7 +144,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { titleContent = new TinyFormulaPane(); titleUseHtml = new UIToggleButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Html")); UIComponentUtils.setLineWrap(titleUseHtml); - titleTextAttrPane = new ChartTextAttrPane(); + titleTextAttrPane = getChartTextAttrPane(); titleTextRotation = new UINumberDragPane(-ROTATION_MAX, ROTATION_MAX); if (isXAxis) { titleTextRotation.populateBean(0.0); @@ -163,6 +163,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { }, }; titlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col); + titlePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); JPanel showTitlePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Title"), showTitle); showTitle.addActionListener(new ActionListener() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java index 2d408c905..b57f0fc2f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartTimeAxisPane.java @@ -27,15 +27,15 @@ import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.BorderFactory; import javax.swing.JPanel; +import java.text.ParseException; +import java.util.Date; +import java.util.regex.Pattern; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.text.ParseException; -import java.util.Date; -import java.util.regex.Pattern; /** * 时间坐标轴 @@ -68,7 +68,7 @@ public class VanChartTimeAxisPane extends VanChartBaseAxisPane { double[] column = {f, s}; double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p,p}, columnSize, isXAxis),null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p,p}, column, isXAxis),null}, new Component[]{createLabelPane(new double[]{p, p}, column),null}, new Component[]{createValueDefinition(),null}, new Component[]{createLineStylePane(new double[]{p, p,p,p,p}, columnSize),null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java index 2b90633e6..934185b38 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartValueAxisPane.java @@ -49,7 +49,7 @@ public class VanChartValueAxisPane extends VanChartBaseAxisPane { double[] column = {f, s}; double[] rowSize = {p,p,p,p,p,p,p,p,p,p,p,p,p,p}; Component[][] components = new Component[][]{ - new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, columnSize, isXAxis), null}, + new Component[]{createTitlePane(new double[]{p, p, p, p, p, p}, column, isXAxis), null}, new Component[]{createLabelPane(new double[]{p, p}, column), null}, new Component[]{createMinMaxValuePane(new double[]{p, p}, columnSize), null}, new Component[]{createLineStylePane(new double[]{p, p, p, p, p}, columnSize), null}, From ac5c016673f719ca46011cd815a5b08c7060b115 Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 14 Jul 2020 15:39:25 +0800 Subject: [PATCH 71/73] REPORT-35381 && REPORT-35379 --- .../java/com/fr/design/actions/help/AboutDialog.java | 2 +- .../java/com/fr/design/actions/help/AboutPane.java | 12 +++++++++++- .../gui/icontainer/UIEastResizableContainer.java | 12 +++++++++++- .../fr/design/mainframe/EastRegionContainerPane.java | 10 +++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java index b4b6d53c6..d94e8ea5c 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutDialog.java @@ -76,7 +76,7 @@ public class AboutDialog extends JDialog implements ActionListener { this.getRootPane().setDefaultButton(okButton); - this.setSize(new Dimension(660, 600)); + this.setSize(defaultPane.getPreferredSize().width, 600); GUICoreUtils.centerWindow(this); } diff --git a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java index 3ede15950..a7aac0391 100644 --- a/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java +++ b/designer-base/src/main/java/com/fr/design/actions/help/AboutPane.java @@ -4,6 +4,7 @@ package com.fr.design.actions.help; import com.fr.base.FRContext; +import com.fr.base.GraphHelper; import com.fr.design.DesignerEnvManager; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.gui.ilable.BoldFontTextLabel; @@ -36,9 +37,13 @@ public class AboutPane extends JPanel { private static final String COMPANY_TELEPHONE = CloudCenter.getInstance().acquireUrlByKind("help.compNo"); private static final String PRESIDENT_PHONE = CloudCenter.getInstance().acquireUrlByKind("help.PNo"); + private int maxWidth; + public AboutPane() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); - + this.maxWidth = GraphHelper.getWidth(getBuildTitle() + GeneralUtils.readFullBuildNO() + + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO") + + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Copy_Build_NO_OK")); //center panel JPanel centerPane = FRGUIPaneFactory.createBorderLayout_L_Pane(); this.add(centerPane, BorderLayout.CENTER); @@ -90,6 +95,11 @@ public class AboutPane extends JPanel { } } + @Override + public Dimension getPreferredSize() { + return new Dimension(this.maxWidth, super.getPreferredSize().height); + } + private void addPhoneAndQQPane(JPanel contentPane) { BoxCenterAligmentPane boxCenterAlignmentPane; // 英文版不显示服务电话和QQ diff --git a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java index 2a5c29d8c..df07acf1a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java +++ b/designer-base/src/main/java/com/fr/design/gui/icontainer/UIEastResizableContainer.java @@ -18,6 +18,10 @@ import java.awt.event.MouseMotionListener; */ public class UIEastResizableContainer extends JPanel { private static final long serialVersionUID = 1854340560790476907L; + + public static final int MAX_CONTAINER_WIDTH = 500; + public static final int MIN_CONTAINER_WIDTH = 286; + private int containerWidth = 240; private int preferredWidth = 240; private int topToolPaneHeight = 25; @@ -262,7 +266,13 @@ public class UIEastResizableContainer extends JPanel { @Override public void mouseDragged(MouseEvent e) { - // do nothing + containerWidth = UIEastResizableContainer.this.getWidth() + (UIEastResizableContainer.this.getLocationOnScreen().x - e.getXOnScreen()); + containerWidth = Math.min(containerWidth, MAX_CONTAINER_WIDTH); + containerWidth = Math.max(containerWidth, MIN_CONTAINER_WIDTH); + refreshContainer(); + if ( DesignModeContext.isAuthorityEditing()) { + DesignerContext.getDesignerFrame().doResize(); + } } }); addMouseListener(new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java index 394dfca1e..b2ea7be11 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/EastRegionContainerPane.java @@ -1,6 +1,7 @@ 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.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -66,7 +67,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private JPanel leftPane; private JPanel rightPane; private FixedPopupPane currentPopupPane; - private static final int CONTAINER_WIDTH = 286; + private static final int CONTAINER_WIDTH = containerWidth(); private static final int TAB_WIDTH = 38; private static final int TAB_BUTTON_WIDTH = 32; private static final int TAB_BUTTON_HEIGHT = 28; @@ -107,6 +108,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private PropertyMode currentMode; // 当前模式(根据不同模式,显示不同的可用面板) + private static int containerWidth() { + if (FRContext.isChineseEnv()) { + return UIEastResizableContainer.MIN_CONTAINER_WIDTH; + } + return UIEastResizableContainer.MAX_CONTAINER_WIDTH; + } + /** * 得到实例 * From 1f25a4de4fe8d5d6f54bb3e9d27c40739bbe22e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 14 Jul 2020 17:37:39 +0800 Subject: [PATCH 72/73] =?UTF-8?q?CHART-14624=20=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=9D=A2=E7=A7=AF=E5=9B=BE=E7=B3=BB=E5=88=97=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E4=B8=8D=E9=80=8F=E6=98=8E=E7=9A=84enable=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E7=9A=84check?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/VanChartAreaFillColorConditionPane.java | 11 ++++++----- .../series/VanChartAbstractPlotSeriesPane.java | 15 +++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java index c8be9aa7a..aeb72f07d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/other/condition/item/VanChartAreaFillColorConditionPane.java @@ -1,11 +1,11 @@ package com.fr.van.chart.designer.other.condition.item; -import com.fr.chart.base.ChartConstants; import com.fr.chart.base.DataSeriesCondition; import com.fr.chart.chartattr.Plot; import com.fr.design.condition.ConditionAttributesPane; - +import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.AttrAreaSeriesFillColorBackground; +import com.fr.plugin.chart.type.GradientType; import com.fr.van.chart.designer.component.VanChartAreaSeriesFillColorPane; import javax.swing.JPanel; @@ -13,7 +13,7 @@ import javax.swing.JPanel; /** * 面积图,填充色 */ -public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLineConditionPane { +public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLineConditionPane { private Plot plot; private static final long serialVersionUID = -4148284851967140012L; private VanChartAreaSeriesFillColorPane fillColorBackground; @@ -40,6 +40,7 @@ public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLine /** * 条件属性item的名称 + * * @return item的名称 */ public String nameForPopupMenuItem() { @@ -54,13 +55,13 @@ public class VanChartAreaFillColorConditionPane extends AbstractNormalMultiLine public void setDefault() { //下面这句话是给各组件一个默认值 fillColorBackground.populate(new AttrAreaSeriesFillColorBackground()); - fillColorBackground.checkoutAlpha(!(plot != null && plot.getPlotStyle() == ChartConstants.STYLE_SHADE)); + fillColorBackground.checkoutAlpha(plot != null && ((VanChartPlot) plot).getGradientStyle().getGradientType() == GradientType.NONE); } public void populate(DataSeriesCondition condition) { if (condition instanceof AttrAreaSeriesFillColorBackground) { fillColorBackground.populate((AttrAreaSeriesFillColorBackground) condition); - fillColorBackground.checkoutAlpha(!(plot != null && plot.getPlotStyle() == ChartConstants.STYLE_SHADE)); + fillColorBackground.checkoutAlpha(plot != null && ((VanChartPlot) plot).getGradientStyle().getGradientType() == GradientType.NONE); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java index 4c914b0cd..e8f9def4b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/series/VanChartAbstractPlotSeriesPane.java @@ -5,7 +5,6 @@ import com.fr.base.chart.chartdata.model.LargeDataModel; import com.fr.base.chart.chartdata.model.NormalDataModel; import com.fr.chart.base.AttrAlpha; import com.fr.chart.base.AttrBorder; -import com.fr.chart.base.ChartConstants; import com.fr.chart.base.GradientStyle; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; @@ -90,7 +89,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP } JPanel panel = new JPanel(new BorderLayout()); JPanel colorPane = getColorPane(); - if(colorPane != null) { + if (colorPane != null) { panel.add(colorPane, BorderLayout.NORTH); } panel.add(getContentInPlotType(), BorderLayout.CENTER); @@ -279,7 +278,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP checkoutMapType(plot); - if(vanChartFillStylePane != null) { //配色 + if (vanChartFillStylePane != null) { //配色 vanChartFillStylePane.populateBean(plot.getPlotFillStyle()); } @@ -310,7 +309,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP populateCondition(plot.getConditionCollection().getDefaultAttr()); - checkAreaSeriesFillColorPane(plot.getPlotStyle()); + checkAreaSeriesFillColorPane(((VanChartPlot) plot).getGradientStyle()); checkCompsEnabledWithLarge(plot); } @@ -340,7 +339,7 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP //更新之前先更新界面的map类型属性 checkoutMapType(plot); - if(vanChartFillStylePane != null) {//配色 + if (vanChartFillStylePane != null) {//配色 plot.setPlotFillStyle(vanChartFillStylePane.updateBean()); } @@ -369,16 +368,16 @@ public abstract class VanChartAbstractPlotSeriesPane extends AbstractPlotSeriesP updateCondition(plot.getConditionCollection().getDefaultAttr()); - checkAreaSeriesFillColorPane(plot.getPlotStyle()); + checkAreaSeriesFillColorPane(((VanChartPlot) plot).getGradientStyle()); } protected void checkoutMapType(Plot plot) { } - protected void checkAreaSeriesFillColorPane(int plotStyle) { + protected void checkAreaSeriesFillColorPane(GradientStyle gradientStyle) { if (areaSeriesFillColorPane != null) { - areaSeriesFillColorPane.checkoutAlpha(plotStyle == ChartConstants.STYLE_NONE); + areaSeriesFillColorPane.checkoutAlpha(gradientStyle.getGradientType() == GradientType.NONE); } } From 64dcfc7bde6b376bd8876d77a5c369404af6745b Mon Sep 17 00:00:00 2001 From: hades Date: Tue, 14 Jul 2020 18:51:45 +0800 Subject: [PATCH 73/73] REPORT-34780 && CHART-14441 --- .../com/fr/design/data/datapane/TableDataPaneListPane.java | 5 ++++- .../java/com/fr/design/designer/creator/XCreatorUtils.java | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java index 1dd1f00aa..8c09eb303 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataPaneListPane.java @@ -60,7 +60,10 @@ public class TableDataPaneListPane extends JListControlPane implements TableData if (StringUtils.isEmpty(tempName)) { isNamePermitted = false; nameableList.stopEditing(); - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips")); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), + Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"), + Toolkit.i18nText("Fine-Design_Report_Alert"), + JOptionPane.WARNING_MESSAGE); setIllegalIndex(editingIndex); return; } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java index 36d2d44a5..42069e4d8 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreatorUtils.java @@ -11,6 +11,7 @@ import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWCardTagLayout; import com.fr.design.designer.creator.cardlayout.XWCardTitleLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; +import com.fr.design.fun.ChartWidgetOptionProvider; import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.fun.ParameterWidgetOptionProvider; import com.fr.design.module.DesignModuleFactory; @@ -102,7 +103,8 @@ public class XCreatorUtils { public boolean accept(PluginContext context) { return context.contain(PluginModule.ExtraDesign, ParameterWidgetOptionProvider.XML_TAG) - || context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG); + || context.contain(PluginModule.ExtraDesign, FormWidgetOptionProvider.XML_TAG) + || context.contain(PluginModule.ExtraDesign, ChartWidgetOptionProvider.XML_TAG); } }); }