diff --git a/build.gradle b/build.gradle index 6446da4044..3580cbae0d 100644 --- a/build.gradle +++ b/build.gradle @@ -64,7 +64,7 @@ allprojects { implementation 'org.swingexplorer:swexpl:2.0.1' implementation 'org.swingexplorer:swag:1.0' implementation 'net.java.dev.jna:jna:5.4.0' - implementation 'org.apache.tomcat:tomcat-catalina:8.5.32' + implementation 'org.apache.tomcat:tomcat-catalina:8.5.57' implementation 'io.socket:socket.io-client:0.7.0' implementation 'com.fr.third:fine-third:' + frVersion implementation 'com.fr.core:fine-core:' + frDevVersion @@ -73,6 +73,7 @@ allprojects { implementation 'com.fr.decision:fine-decision:' + frVersion implementation 'com.fr.schedule:fine-schedule:' + frVersion implementation 'com.fr.report:fine-report-engine:' + frDevVersion + implementation 'com.fr.design:design-i18n:' + frDevVersion testImplementation 'org.easymock:easymock:3.5.1' testImplementation 'org.powermock:powermock-module-junit4:1.7.1' testImplementation 'org.powermock:powermock-api-easymock:1.7.1' diff --git a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java index 88d2625d02..c6488d3300 100644 --- a/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java +++ b/designer-base/src/main/java/com/fr/design/DesignerEnvManager.java @@ -163,7 +163,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * alphafine */ private AlphaFineConfigManager alphaFineConfigManager = AlphaFineConfigManager.getInstance(); - + /** * 阅后即焚的配置项 */ @@ -218,14 +218,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { if (needCheckEnv) { checkNameEnvMap(); } - - GeneralContext.addEnvChangedListener(new EnvChangedListener() { - @Override - public void envChanged() { - - designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX); - designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME); - } + GeneralContext.addEnvChangedListener(() -> { + designerEnvManager.setCurrentDirectoryPrefix(FILEFactory.ENV_PREFIX); + designerEnvManager.setDialogCurrentDirectory(ProjectConstants.REPORTLETS_NAME); }); } @@ -423,21 +418,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { this.isHttps = isHttps; } - - public String getCertificatePath() { - return certificatePath; - } - - public void setCertificatePath(String certificatePath) { this.certificatePath = certificatePath; } - - public String getCertificatePass() { - return certificatePass; - } - public void setCertificatePass(String certificatePass) { this.certificatePass = certificatePass; } @@ -1424,7 +1408,9 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { * @return */ private Locale checkLocale(Locale locale) { - return SupportLocale.getInstance().isSupport(locale) ? locale : Locale.US; + // Yvan: REPORT-39341,有一些情况下,获取到的是zh-Hans-CN这种,需要找到项目中最匹配的Locale + return SupportLocale.getInstance().isSupport(locale) ? + locale : SupportLocale.getInstance().getSuitableLocale(locale); } private void readReportLengthUnit(XMLableReader reader) { @@ -1475,7 +1461,10 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } public String getUUID() { - return StringUtils.isEmpty(uuid) ? UUID.randomUUID().toString() : uuid; + if (StringUtils.isEmpty(uuid)) { + uuid = UUID.randomUUID().toString(); + } + return uuid; } public int getActiveKeyStatus() { @@ -1578,7 +1567,7 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { } } } - + private void readSnapChatConfig(XMLableReader reader) { reader.readXMLObject(this.snapChatConfig = SnapChatConfig.getInstance()); } @@ -1801,14 +1790,14 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { writeSnapChatConfig(writer); writer.end(); } - + private void writeSnapChatConfig(XMLPrintWriter writer) { - + if (this.snapChatConfig != null) { this.snapChatConfig.writeXML(writer); } } - + private void writeAlphaFineAttr(XMLPrintWriter writer) { if (this.alphaFineConfigManager != null) { this.alphaFineConfigManager.writeXML(writer); @@ -2015,11 +2004,13 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter { private void writeHttpsParas(XMLPrintWriter writer) { writer.startTAG(CAS_PARAS); + // 这边的密钥path和password没有用处了 当前已经全部储存在对应的WorkspaceConnectionInfo中 + // 把历史遗留保存的全部置为空 防止显示明文密钥 后面删除 todo if (StringUtils.isNotBlank(certificatePath)) { - writer.attr(CAS_CERTIFICATE_PATH, certificatePath); + writer.attr(CAS_CERTIFICATE_PATH, StringUtils.EMPTY); } if (StringUtils.isNotBlank(certificatePass)) { - writer.attr(CAS_CERTIFICATE_PASSWORD, certificatePass); + writer.attr(CAS_CERTIFICATE_PASSWORD, StringUtils.EMPTY); } if (isHttps) { writer.attr("enable", true); diff --git a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java index 0ccb5d3e7b..5afe58ad30 100644 --- a/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java +++ b/designer-base/src/main/java/com/fr/design/actions/file/PreferencePane.java @@ -20,6 +20,7 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.UIProgressBarUI; import com.fr.design.gui.ispinner.UISpinner; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.jdk.JdkVersion; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -39,6 +40,7 @@ import com.fr.general.log.Log4jConfig; import com.fr.locale.InterProviderFactory; import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; +import com.fr.stable.StableUtils; import com.fr.stable.os.OperatingSystem; import com.fr.third.apache.log4j.Level; import com.fr.transaction.Configurations; @@ -216,7 +218,7 @@ public class PreferencePane extends BasicPane { oracleSpace = new UICheckBox(i18nText("Fine-Design_Basic_Show_All_Oracle_Tables")); oraclePane.add(oracleSpace); - if (!OperatingSystem.isLinux()) { + if (!OperatingSystem.isLinux() && JdkVersion.LE_8.support()) { JPanel upmSelectorPane = FRGUIPaneFactory.createTitledBorderPane(i18nText("Fine-Design_Basic_Update_Plugin_Manager")); useOptimizedUPMCheckbox = new UICheckBox(i18nText("Fine-Design_Basic_Use_New_Update_Plugin_Manager")); upmSelectorPane.add(useOptimizedUPMCheckbox); diff --git a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java index 15a7c87c08..93dc57a8f4 100644 --- a/designer-base/src/main/java/com/fr/design/constants/UIConstants.java +++ b/designer-base/src/main/java/com/fr/design/constants/UIConstants.java @@ -37,7 +37,7 @@ public interface UIConstants { public static final Image APPFIT_H3 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H3.png"); public static final Image APPFIT_H4 = IOUtils.readImage("/com/fr/design/images/dialog/appfit/H4.png"); - public static final Border CELL_ATTR_ZEROBORDER = BorderFactory.createEmptyBorder(0, 0, 0, 0); + public static final Border CELL_ATTR_ZEROBORDER = BorderFactory.createEmptyBorder(0, 1, 0, 0); public static final Border CELL_ATTR_EMPTYBORDER = BorderFactory.createEmptyBorder(0, 10, 0, 0); public static final Border CELL_ATTR_PRESENTBORDER = BorderFactory.createEmptyBorder(0, 5, 0, 0); public static final Border CELL_ATTR_NORMALBORDER = BorderFactory.createEmptyBorder(0, 10, 0, 15); diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index f2b1e8e5b3..f1758f0689 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -50,6 +50,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -74,7 +75,7 @@ public abstract class DesignTableDataManager { private static java.util.Map dsNameChangedMap = new HashMap(); private static List globalDsListeners = new ArrayList<>(); - private static Map> dsListenersMap = new HashMap>(); + private static Map> dsListenersMap = new ConcurrentHashMap<>(); public static String NO_PARAMETER = "no_paramater_pane"; @@ -96,8 +97,8 @@ public abstract class DesignTableDataManager { */ private static void fireDsChanged() { fireDsChanged(globalDsListeners); - for (Entry> listenerEntry : dsListenersMap.entrySet()) { - List dsListeners = listenerEntry.getValue(); + for (Iterator>> entryIterator = dsListenersMap.entrySet().iterator(); entryIterator.hasNext(); ) { + List dsListeners = entryIterator.next().getValue(); fireDsChanged(dsListeners); } } @@ -189,6 +190,7 @@ public abstract class DesignTableDataManager { } dsListeners.add(l); } + /** * 获取数据源source中dsName的所有字段 * @@ -279,7 +281,7 @@ public abstract class DesignTableDataManager { Entry entry = entryIt.next(); list.add(entry.getKey()); } - return list.toArray(new String[list.size()]); + return list.toArray(new String[0]); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java index bebcd14e25..51bd8b49bf 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataCreatorProducer.java @@ -72,24 +72,18 @@ public class TableDataCreatorProducer { public TableDataNameObjectCreator[] createServerTableDataCreator() { TableDataNameObjectCreator dataBase = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_DS_Database_Query"), - "ds", "/com/fr/design/images/data/dock/serverdatabase.png", DBTableData.class, DBTableDataPane.class); TableDataNameObjectCreator ds_Class = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Class"), - "Class", "/com/fr/design/images/data/dock/serverclasstabledata.png", ClassTableData.class, ClassTableDataPane.class); TableDataNameObjectCreator table = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Embedded"), - "Embedded", "/com/fr/design/images/data/dock/serverdatatable.png", EmbeddedTableData.class, EmbeddedTableDataPane.class); TableDataNameObjectCreator fileTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_File"), - "File", "/com/fr/design/images/data/file.png", FileTableData.class, FileTableDataSmallPane.class); - TableDataNameObjectCreator treeTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Tree"), - "Tree", "/com/fr/design/images/data/tree.png", RecursionTableData.class, GlobalTreeTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { @@ -97,7 +91,6 @@ public class TableDataCreatorProducer { } }; TableDataNameObjectCreator multiTable = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Relation"), - "Multi", "/com/fr/design/images/data/multi.png", ConditionTableData.class, GlobalMultiTDTableDataPane.class) { public boolean isNeedParameterWhenPopulateJControlPane() { @@ -105,7 +98,6 @@ public class TableDataCreatorProducer { } }; TableDataNameObjectCreator storeProcedure = new TableDataNameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Type_Stored_Procedure"), - "Proc", "/com/fr/design/images/data/store_procedure.png", StoreProcedure.class, ProcedureDataPane.class) { @Override @@ -113,9 +105,7 @@ public class TableDataCreatorProducer { return true; } }; - TableDataNameObjectCreator[] creators = new TableDataNameObjectCreator[]{dataBase, ds_Class, table, fileTable, storeProcedure, multiTable, treeTable}; - return merge(creators, ExtraDesignClassManager.getInstance().getServerTableDataCreators()); } @@ -141,6 +131,6 @@ public class TableDataCreatorProducer { for (int i = 0; i < coverIndexList.size(); i ++) { creators[coverIndexList.get(i)] = coverCreators.get(i); } - return (TableDataNameObjectCreator[])ArrayUtils.addAll(creators, list.toArray(new TableDataNameObjectCreator[list.size()])); + return ArrayUtils.addAll(creators, list.toArray(new TableDataNameObjectCreator[0])); } } 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 8c09eb3035..8972821b43 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 @@ -7,6 +7,7 @@ import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.design.data.BasicTableDataUtils; import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.FineJOptionPane; +import com.fr.design.gui.NameInspector; import com.fr.design.gui.controlpane.JListControlPane; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.ilist.ListModelElement; @@ -23,18 +24,20 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; /** * TableDataList Pane. */ public class TableDataPaneListPane extends JListControlPane implements TableDataPaneController { private boolean isNamePermitted = true; - private Map dsNameChangedMap = new HashMap(); + private Map dsNameChangedMap = new HashMap<>(); public TableDataPaneListPane() { super(); @@ -43,11 +46,15 @@ public class TableDataPaneListPane extends JListControlPane implements TableData @Override public void propertyChange() { isNamePermitted = true; - TableDataSource source = DesignTableDataManager.getEditingTableDataSource(); - String[] allDSNames = DesignTableDataManager.getAllDSNames(source); - String[] allListNames = nameableList.getAllNames(); - allListNames[nameableList.getSelectedIndex()] = StringUtils.EMPTY; String tempName = getEditingName(); + if (ComparatorUtils.equals(tempName, selectedName)) { + //说明双击之后又取消了,啥也不用做 + return; + } + Set allDSNames = DesignTableDataManager.getGlobalDataSet().keySet(); + String[] allListNames = nameableList.getAllNames(); + allListNames[editingIndex] = StringUtils.EMPTY; + Object editingType = getEditingType(); if (!BasicTableDataUtils.checkName(tempName)) { @@ -61,15 +68,14 @@ public class TableDataPaneListPane extends JListControlPane implements TableData isNamePermitted = false; nameableList.stopEditing(); 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); + Toolkit.i18nText("Fine-Design_Basic_Table_Data_Empty_Name_Tips"), + Toolkit.i18nText("Fine-Design_Report_Alert"), + JOptionPane.WARNING_MESSAGE); setIllegalIndex(editingIndex); return; } - - if (!ComparatorUtils.equals(tempName, selectedName) - && isNameRepeated(new List[]{Arrays.asList(allDSNames), Arrays.asList(allListNames)}, tempName)) { + boolean isRepeated = isNameRepeated(new Collection[]{allDSNames, Arrays.asList(allListNames)}, tempName); + if (isRepeated) { isNamePermitted = false; nameableList.stopEditing(); FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(TableDataPaneListPane.this), Toolkit.i18nText("Fine-Design_Basic_Table_Data_Duplicate_Name_Tips", tempName)); @@ -81,11 +87,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData setIllegalIndex(editingIndex); } if (nameableList.getSelectedValue() instanceof ListModelElement) { - Nameable selected = ((ListModelElement) nameableList.getSelectedValue()).wrapper; - if (!ComparatorUtils.equals(tempName, selected.getName()) && !isNameRepeated(new List[]{Arrays.asList(allDSNames), Arrays.asList(allListNames)}, tempName)) { - rename(selected.getName(), tempName); - - } + rename(selectedName, isRepeated ? NameInspector.ILLEGAL_NAME_HOLDER : tempName); } } }); @@ -93,7 +95,19 @@ public class TableDataPaneListPane extends JListControlPane implements TableData @Override public void rename(String oldName, String newName) { - dsNameChangedMap.put(oldName, newName); + //如果a改成了b,b又被改成了c,就认为是a改成了c + for (Map.Entry entry : dsNameChangedMap.entrySet()) { + if (StringUtils.equals(oldName, entry.getValue())) { + oldName = entry.getKey(); + break; + } + } + if (StringUtils.equals(oldName, newName)) { + //a -> b;b -> a,说明没改 + dsNameChangedMap.remove(oldName); + } else { + dsNameChangedMap.put(oldName, newName); + } } /** @@ -148,7 +162,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData String[] allDsNames = DesignTableDataManager.getAllDSNames(source); // richer:生成的名字从1开始. kunsnat: 添加属性从0开始. - int count = 1; + int count = 1; while (isDsNameRepeated(prefix + count, allDsNames)) { count++; } @@ -192,7 +206,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData } } - populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); + populate(nameObjectList.toArray(new NameObject[0])); } /** @@ -209,10 +223,10 @@ public class TableDataPaneListPane extends JListControlPane implements TableData } while (procedurenameIt.hasNext()) { String name = procedurenameIt.next(); - nameObjectList.add(new NameObject(name, ProcedureConfig.getInstance().getProcedure(name))); + nameObjectList.add(new NameObject(name, ProcedureConfig.getInstance().getProcedure(name))); } - populate(nameObjectList.toArray(new NameObject[nameObjectList.size()])); + populate(nameObjectList.toArray(new NameObject[0])); } @Override @@ -220,7 +234,7 @@ public class TableDataPaneListPane extends JListControlPane implements TableData tableDataConfig.removeAllTableData(); ProcedureConfig.getInstance().removeAllProcedure(); Nameable[] tableDataArray = this.update(); - Map tableDataMap = new LinkedHashMap(); + Map tableDataMap = new LinkedHashMap(); for (int i = 0; i < tableDataArray.length; i++) { NameObject nameObject = (NameObject) tableDataArray[i]; tableDataMap.put(nameObject.getName(), (TableData) nameObject.getObject()); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java index 8f49b6e504..94efc5faa8 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTree.java @@ -1,21 +1,22 @@ package com.fr.design.data.datapane; import com.fr.base.BaseUtils; -import com.fr.general.NameObject; import com.fr.design.constants.UIConstants; import com.fr.design.data.tabledata.wrapper.TableDataWrapper; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.UserObjectRefreshJTree; import com.fr.design.icon.IconPathConstants; import com.fr.general.ComparatorUtils; +import com.fr.general.NameObject; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; -import java.awt.*; +import java.awt.Color; +import java.awt.Component; /** * TableData Tree @@ -31,6 +32,7 @@ public class TableDataTree extends UserObjectRefreshJTree { this.setCellRenderer(tableDataTreeCellRenderer); this.setEditable(false); } + // CellRenderer private DefaultTreeCellRenderer tableDataTreeCellRenderer = new DefaultTreeCellRenderer() { private static final long serialVersionUID = 1L; @@ -66,14 +68,7 @@ public class TableDataTree extends UserObjectRefreshJTree { this.setIcon(null); this.setText(PENDING.toString()); } - // 这里新建一个Label作为render是因为JTree在动态刷新的时候,节点上render画布的的宽度不会变,会使得一部分比较长的数据显示为"..." - UILabel label = new UILabel(); - label.setText(getText()); - label.setIcon(getIcon()); - Dimension dim = label.getPreferredSize(); - dim.height += 2; - this.setSize(dim); - this.setPreferredSize(dim); + this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); this.setTextSelectionColor(Color.WHITE); this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); @@ -152,7 +147,7 @@ public class TableDataTree extends UserObjectRefreshJTree { /* * p:获得选中的NameObject = name + tabledata. - */ + */ public NameObject getSelectedNameObject() { TreePath selectedTreePath = this.getSelectionPath(); if (selectedTreePath == null) { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java index 8b5c626571..8964ff8de0 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TreeTableDataComboBox.java @@ -69,7 +69,16 @@ public class TreeTableDataComboBox extends UIComboBox { } } } - + + /** + * 带参刷新方法 + * @param source 数据源数据集 + */ + public void refresh(TableDataSource source) { + this.source = source; + refresh(); + } + public void setSelectedTableDataByName(String name) { TableDataWrapper tableDataWrapper; if (res_map.get(name) != null) { 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 5e8199d953..683b38e016 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 @@ -8,7 +8,7 @@ import com.fr.design.border.UITitledBorder; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.ipasswordfield.UIPassWordField; +import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.gui.ilable.ActionLabel; import com.fr.design.layout.FRGUIPaneFactory; @@ -24,8 +24,18 @@ import com.fr.general.ComparatorUtils; import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; @@ -108,7 +118,7 @@ public class JDBCDefPane extends JPanel { urlTextField = new UITextField(15); userNameTextField = new UITextField(15); userNameTextField.setName(USER_NAME); - passwordTextField = new UIPassWordField(15); + passwordTextField = new UIPasswordFieldWithFixedLength(15); dbtypeButton = new UIButton("."); dbtypeButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_Get_Default_URL")); dbtypeButton.addActionListener(dbtypeButtonActionListener); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java index 8d8e3a48c6..d3881bcd12 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/preview/PreviewTablePane.java @@ -15,20 +15,31 @@ import com.fr.design.data.DesignTableDataManager; import com.fr.design.dialog.BasicDialog; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.FineJOptionPane; -import com.fr.design.file.HistoryTemplateListPane; +import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.frpane.UITabbedPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.gui.itable.SortableJTable; import com.fr.design.gui.itable.TableSorter; import com.fr.design.gui.itextfield.UINumberField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.ui.util.UIUtil; import com.fr.function.TIME; import com.fr.general.FRFont; import com.fr.log.FineLoggerFactory; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.UIManager; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; @@ -81,7 +92,7 @@ public class PreviewTablePane extends BasicPane { JPanel currentPreviewPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); previewNumberPanel.add(currentPreviewPanel); - currentPreviewPanel.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Current_Preview_Rows") + ":")); + currentPreviewPanel.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Current_Preview_Rows") + ":")); currentRowsField = new UINumberField(); currentPreviewPanel.add(currentRowsField); @@ -91,7 +102,7 @@ public class PreviewTablePane extends BasicPane { JPanel maxPanel = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); previewNumberPanel.add(maxPanel); - maxPanel.add(new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Datasource_Maximum_Number_of_Preview_Rows") + ":")); + maxPanel.add(new UILabel(Toolkit.i18nText("Fine-Design_Basic_Datasource_Maximum_Number_of_Preview_Rows") + ":")); maxPreviewNumberField = new UINumberField(); maxPanel.add(maxPreviewNumberField); @@ -158,7 +169,7 @@ public class PreviewTablePane extends BasicPane { if (this.dialog == null) { this.dialog = this.showWindow(new JFrame()); } - progressBar = new AutoProgressBar(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { + progressBar = new AutoProgressBar(this, Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { public void doMonitorCanceled() { if (getWorker() != null) { getWorker().cancel(true); @@ -174,7 +185,7 @@ public class PreviewTablePane extends BasicPane { @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"); + return Toolkit.i18nText("Fine-Design_Basic_Preview"); } private void addLoadedListener(LoadedEventListener l) { @@ -268,7 +279,7 @@ public class PreviewTablePane extends BasicPane { */ public static EmbeddedTableData previewTableData(TableData tableData, final int keyIndex, final int valueIndex) { PreviewTablePane previewTablePane = new PreviewTablePane(); - previewTablePane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data"))); + previewTablePane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Data"))); try { previewTablePane.populate(tableData); previewTablePane.resetPreviewTableColumnColor(); @@ -298,13 +309,13 @@ public class PreviewTablePane extends BasicPane { try { int choiceColumn = Integer.parseInt(columnErrMessage.trim()); int tatalColumn = Integer.parseInt(tatolColumnErrMessage.trim()); - columnErrMessage = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tabledata_Preview_Warn_Text", choiceColumn + 1, tatalColumn); + columnErrMessage = Toolkit.i18nText("Fine-Design_Basic_Tabledata_Preview_Warn_Text", choiceColumn + 1, tatalColumn); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); return; } FineLoggerFactory.getLogger().error(exp.getMessage(), exp); - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), columnErrMessage, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), columnErrMessage, Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); } private void populate(TableData tableData) throws Exception { @@ -317,7 +328,7 @@ public class PreviewTablePane extends BasicPane { } private void previewTableDataSQL() throws Exception { - connectionBar = new AutoProgressBar(this, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Now_Create_Connection"), "", 0, 100) { + connectionBar = new AutoProgressBar(this, Toolkit.i18nText("Fine-Design_Basic_Utils_Now_Create_Connection"), "", 0, 100) { public void doMonitorCanceled() { getWorker().cancel(true); getDialog().setVisible(false); @@ -365,13 +376,14 @@ public class PreviewTablePane extends BasicPane { if (tableData instanceof DBTableData) { boolean status = DataOperator.getInstance().testConnection(((DBTableData) tableData).getDatabase()); if (!status) { - throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); + throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); } } } finally { - connectionBar.close(); + // 将close操作放到EDT线程中 + UIUtil.invokeLaterIfNeeded(() -> connectionBar.close()); } - TableDataSource dataSource = HistoryTemplateListPane.getInstance().getCurrentEditingTemplate().getTarget(); + TableDataSource dataSource = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getTarget(); previewTableData = DesignTableDataManager.previewTableDataNeedInputParameters(dataSource, tableData, (int) maxPreviewNumberField.getValue(), true, progressBar); // parameterInputDialog // update之后的parameters,转成一个parameterMap,用于预览TableData @@ -396,7 +408,7 @@ public class PreviewTablePane extends BasicPane { if (!(e instanceof CancellationException)) { FineLoggerFactory.getLogger().error(e.getMessage(), e); FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), e.getMessage(), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); + Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE, UIManager.getIcon("OptionPane.errorIcon")); } dialog.setVisible(false); } finally { @@ -425,7 +437,7 @@ public class PreviewTablePane extends BasicPane { public static void previewStoreData(final ProcedureDataModel storeProcedureDataModel, final int keyIndex, final int valueIndex) { final PreviewTablePane previewTablePane = new PreviewTablePane(); previewTablePane.storeProcedureDataModel = storeProcedureDataModel; - previewTablePane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data"))); + previewTablePane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Data"))); try { previewTablePane.populateStoreDataSQL(); @@ -442,7 +454,7 @@ public class PreviewTablePane extends BasicPane { FineLoggerFactory.getLogger().error(e.getMessage(), e); } previewTablePane.fireLoadedListener(); - previewTablePane.showWindow(DesignerContext.getDesignerFrame()).setVisible(true); + previewTablePane.showWindow(new JFrame()).setVisible(true); } /** @@ -456,7 +468,7 @@ public class PreviewTablePane extends BasicPane { for (int i = 0; i < tableSize; i++) { PreviewTablePane previewTablePane = new PreviewTablePane(); previewTablePane.storeProcedureDataModel = storeProcedureDataModels[i]; - previewTablePane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Data"))); + previewTablePane.setBorder(BorderFactory.createTitledBorder(Toolkit.i18nText("Fine-Design_Basic_Data"))); try { previewTablePane.populateStoreDataSQL(); } catch (Exception e) { @@ -469,13 +481,13 @@ public class PreviewTablePane extends BasicPane { @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Preview"); + return Toolkit.i18nText("Fine-Design_Basic_Preview"); } }; prieviewPane.setLayout(FRGUIPaneFactory.createBorderLayout()); prieviewPane.add(tabPreviewpane, BorderLayout.CENTER); - prieviewPane.showWindow(DesignerContext.getDesignerFrame()).setVisible(true); + prieviewPane.showWindow(new JFrame()).setVisible(true); } private void populateStoreDataSQL() throws Exception { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java index 23e6f46136..6065d04859 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/DBTableDataPane.java @@ -185,7 +185,8 @@ public class DBTableDataPane extends AbstractTableDataPane { box.setMinimumSize(new Dimension(300, 400)); // 防止数据连接名过长时影响 split pane 分割效果 - connectionTableProcedurePane.setMinimumSize(new Dimension(250, 400)); + // 本界面中给MaxMemRowCountPanel留的空间太小,造成MaxMemRowCountPanel显示异常,这边减小一点最小宽度,拉长MaxMemRowCountPanel + connectionTableProcedurePane.setMinimumSize(new Dimension(230, 400)); connectionTableProcedurePane.setMaximumSize(new Dimension(500, 400)); // 使用SplitPane JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, connectionTableProcedurePane, sqlSplitPane); @@ -218,7 +219,7 @@ public class DBTableDataPane extends AbstractTableDataPane { paramTexts[0] = SqlUtils.tryPureSqlText(sqlTextPane.getText()); paramTexts[1] = SqlUtils.tryPureSqlText(pageQuery); List existParameterList = editorPane.update(); - Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[existParameterList.size()]); + Parameter[] ps = existParameterList == null ? new Parameter[0] : existParameterList.toArray(new Parameter[0]); editorPane.populate(ParameterUtils.analyzeAndUnionParameters(paramTexts, ps)); } diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java index d43e6bdee4..af2b71a7c6 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/tabledatapane/MaxMemRowCountPanel.java @@ -21,7 +21,7 @@ public class MaxMemRowCountPanel extends UIToolbar { private static final int MAX_IN_MEMORY = 1; private static final String[] CACHE_LIST = {com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Save_All_Records_In_Memory"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Max_Mem_Row_Count") }; - private static final int MAX_WIDTH = getMaxComBoBoxWidth() > 200 ? 350 : 250; + private static final int MAX_WIDTH = getMaxComBoBoxWidth() > 200 ? 350 : 280; private static final int MAX_COMPONENT_COUNT_OF_MAX_MEMORY = 4; private static int getMaxComBoBoxWidth() { int maxWidth = GraphHelper.getWidth(CACHE_LIST[0]); @@ -73,6 +73,7 @@ public class MaxMemRowCountPanel extends UIToolbar { switchCache = new UIComboBox(CACHE_LIST); switchCache.addActionListener(switchStateL); numberSpinner = new UISpinner(0, Integer.MAX_VALUE, 1); + numberSpinner.setNumberFieldColumns(3); } private void showAllPanel() { diff --git a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java index cefc0e1128..17fbf57888 100644 --- a/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java +++ b/designer-base/src/main/java/com/fr/design/data/tabledata/wrapper/StoreProcedureDataWrapper.java @@ -7,17 +7,16 @@ import com.fr.data.impl.storeproc.StoreProcedure; import com.fr.data.operator.DataOperator; import com.fr.design.data.DesignTableDataManager; import com.fr.design.data.datapane.preview.PreviewTablePane; -import com.fr.design.dialog.BasicDialog; -import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.gui.iprogressbar.AutoProgressBar; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import javax.swing.Icon; -import javax.swing.JOptionPane; +import javax.swing.JFrame; import javax.swing.SwingWorker; import java.util.ArrayList; import java.util.Arrays; @@ -50,7 +49,6 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { private AutoProgressBar connectionBar; private ProcedureDataModel[] dataModels; private SwingWorker worker; - private BasicDialog dialog; private int previewModel; public StoreProcedureDataWrapper(StoreProcedure storeProcedure, String storeprocedureName, String dsName) { @@ -71,19 +69,8 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { if (needLoad) { setWorker(); } - dialog = PreviewTablePane.getInstance().getDialog(); - dialog.addDialogActionListener(new DialogActionAdapter() { - public void doOk() { - getWorker().cancel(true); - } - - public void doCancel() { - getWorker().cancel(true); - } - }); - loadingBar = new AutoProgressBar(dialog, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { + loadingBar = new AutoProgressBar(new JFrame(), Toolkit.i18nText("Fine-Design_Basic_Loading_Data"), "", 0, 100) { public void doMonitorCanceled() { - getDialog().setVisible(false); getWorker().cancel(true); } }; @@ -93,17 +80,17 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { * 数据集执行结果返回的所有字段 * * @return 数据集执行结果返回的所有字段 - * + * * * @date 2014-12-3-下午7:43:17 - * + * */ public List calculateColumnNameList() { if (columnNameList != null) { return columnNameList; } if (!createStore(false)) { - FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_No_TableData")); + FineJOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Basic_Engine_No_TableData")); return new ArrayList(); } columnNameList = Arrays.asList(procedureDataModel.getColumnName()); @@ -114,10 +101,10 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { * 生成子节点 * * @return 节点数组 - * + * * * @date 2014-12-3-下午7:06:47 - * + * */ public ExpandMutableTreeNode[] load() { List namelist; @@ -160,25 +147,16 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { /** * 预览数据 - * + * * @param previewModel 预览模式, 全部还是一个 - * + * * * @date 2014-12-3-下午7:05:50 - * + * */ public void previewData(final int previewModel) { this.previewModel = previewModel; - new SwingWorker() { - - protected Object doInBackground() throws Exception { - loadingBar.close(); - PreviewTablePane.resetPreviewTable(); - dialog.setVisible(true); - return null; - } - }.execute(); - connectionBar = new AutoProgressBar(dialog, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Utils_Now_Create_Connection"), "", 0, 100) { + connectionBar = new AutoProgressBar(new JFrame(), Toolkit.i18nText("Fine-Design_Basic_Utils_Now_Create_Connection"), "", 0, 100) { public void doMonitorCanceled() { connectionBar.close(); worker.cancel(true); @@ -190,13 +168,13 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { private void setWorker() { worker = new SwingWorker() { protected Void doInBackground() throws Exception { + loadingBar.close(); + PreviewTablePane.resetPreviewTable(); connectionBar.start(); boolean status = DataOperator.getInstance().testConnection(((StoreProcedure) getTableData()).getDatabaseConnection()); if (!status) { connectionBar.close(); - // bug 61345 预览失败时,关闭窗口 - dialog.setVisible(false); - throw new Exception(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); + throw new Exception(Toolkit.i18nText("Fine-Design_Basic_Database_Connection_Failed")); } connectionBar.close(); storeProcedure.resetDataModelList(); @@ -208,7 +186,6 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { try { get(); loadingBar.close(); - dialog.setVisible(false); switch (previewModel) { case StoreProcedureDataWrapper.PREVIEW_ALL: PreviewTablePane.previewStoreDataWithAllDs(dataModels); @@ -228,10 +205,6 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { }; } - private BasicDialog getDialog() { - return this.dialog; - } - private SwingWorker getWorker() { return this.worker; } @@ -240,10 +213,10 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { /** * 预览返回的一个数据集 - * + * * * @date 2014-12-3-下午7:42:53 - * + * */ public void previewData() { previewData(-1, -1); @@ -253,13 +226,13 @@ public final class StoreProcedureDataWrapper implements TableDataWrapper { /** * 预览返回的一个数据集,带有显示值和实际值的标记结果 - * + * * @param keyIndex 实际值 * @param valueIndex 显示值 - * + * * * @date 2014-12-3-下午7:42:27 - * + * */ public void previewData(final int keyIndex, final int valueIndex) { PreviewTablePane.previewStoreData(procedureDataModel, keyIndex, valueIndex); diff --git a/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java index 21042a57a9..11a49fafe1 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/ErrorDialog.java @@ -35,7 +35,7 @@ public abstract class ErrorDialog extends JDialog implements ActionListener { JPanel messagePane = FRGUIPaneFactory.createVerticalFlowLayout_S_Pane(true); UILabel boldFontLabel = new UILabel(message); UILabel label = new UILabel(Toolkit.i18nText("Fine-Design_Send_Report_To_Us")); - Font font = FRFont.getInstance("Dialog", Font.BOLD, 20); + Font font = FRFont.getInstance(label.getFont().getFontName(), Font.BOLD, 20); boldFontLabel.setFont(font); messagePane.add(boldFontLabel); messagePane.add(label); diff --git a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java index 8f2021c696..dd3ddab3b9 100644 --- a/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java +++ b/designer-base/src/main/java/com/fr/design/dialog/UIDialog.java @@ -116,6 +116,11 @@ public abstract class UIDialog extends JDialog { doCancel(); } }); + + applyEnterAction(); + } + + protected void applyEnterAction() { JPanel defaultPane = (JPanel) this.getContentPane(); InputMap inputMapAncestor = defaultPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); ActionMap actionMap = defaultPane.getActionMap(); diff --git a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java index 2f30f70b97..37a671eeb8 100644 --- a/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java +++ b/designer-base/src/main/java/com/fr/design/env/RemoteDesignerWorkspaceInfo.java @@ -40,6 +40,12 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { private WorkspaceConnectionInfo connection; + /** + * 标记下新创建的远程工作目录 兼容存留的远程目录客户升级后再回退 读取为密文 + * 仅保证当前新增是加密的 + */ + private boolean newCreated; + public static RemoteDesignerWorkspaceInfo create(WorkspaceConnectionInfo connection) { RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo(); info.connection = connection; @@ -79,12 +85,21 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { return remindTime; } + public boolean isNewCreated() { + return newCreated; + } + + public void setNewCreated(boolean newCreated) { + this.newCreated = newCreated; + } + @Override public void readXML(XMLableReader reader) { if (reader.isAttr()) { this.name = reader.getAttrAsString("name", StringUtils.EMPTY); this.remindTime = reader.getAttrAsString("remindTime", StringUtils.EMPTY); + this.newCreated = reader.getAttrAsBoolean("newCreated", false); } if (reader.isChildNode()) { String tagName = reader.getTagName(); @@ -92,32 +107,49 @@ public class RemoteDesignerWorkspaceInfo implements DesignerWorkspaceInfo { String url = reader.getAttrAsString("url", StringUtils.EMPTY); String username = reader.getAttrAsString("username", StringUtils.EMPTY); //密码解密 - String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(" ", "\r\n")); + String password = SecurityToolbox.defaultDecrypt(reader.getAttrAsString("password", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n")); String certPath = reader.getAttrAsString("certPath", StringUtils.EMPTY); - String certSecretKey = reader.getAttrAsString("certSecretKey", StringUtils.EMPTY); + String certSecretKey = readCertSecretKey(reader); boolean rememberPwd = reader.getAttrAsBoolean("rememberPwd", true); this.connection = new WorkspaceConnectionInfo(url, username, password, certPath, certSecretKey, rememberPwd); } } } + private String readCertSecretKey(XMLableReader reader) { + if (isNewCreated()) { + return SecurityToolbox.defaultDecrypt(reader.getAttrAsString("certSecretKey", StringUtils.EMPTY).replaceAll(StringUtils.BLANK, "\r\n")); + } else { + return reader.getAttrAsString("certSecretKey", StringUtils.EMPTY); + } + } + @Override public void writeXML(XMLPrintWriter writer) { writer.attr("name", name); writer.attr("remindTime", remindTime); + writer.attr("newCreated", isNewCreated()); if (this.connection != null) { writer.startTAG("Connection"); writer.attr("url", connection.getUrl()); writer.attr("username", connection.getUserName()); writer.attr("password", SecurityToolbox.defaultEncrypt(connection.getPassword())); writer.attr("certPath", connection.getCertPath()); - writer.attr("certSecretKey", connection.getCertSecretKey()); + writeCertSecretKey(writer); writer.attr("rememberPwd", connection.isRememberPwd()); writer.end(); } } + private void writeCertSecretKey(XMLPrintWriter writer) { + if (isNewCreated()) { + writer.attr("certSecretKey", SecurityToolbox.defaultEncrypt(connection.getCertSecretKey())); + } else { + writer.attr("certSecretKey", connection.getCertSecretKey()); + } + } + @Override @SuppressWarnings("squid:S2975") public Object clone() throws CloneNotSupportedException { diff --git a/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java b/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java index 42791ad522..8fbb2d2a5d 100644 --- a/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java +++ b/designer-base/src/main/java/com/fr/design/extra/LoginDialog.java @@ -24,7 +24,7 @@ public class LoginDialog extends UIDialog { } private void init(Component pane) { - if (StableUtils.getMajorJavaVersion() == 8) { + if (StableUtils.getMajorJavaVersion() >= 8) { setUndecorated(true); } JPanel panel = (JPanel) getContentPane(); diff --git a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java index 72fa6149b6..69ad0f08d1 100644 --- a/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java +++ b/designer-base/src/main/java/com/fr/design/extra/ShopDialog.java @@ -16,7 +16,7 @@ public class ShopDialog extends UIDialog { public ShopDialog(Frame frame, BasicPane pane) { super(frame); - if (StableUtils.getMajorJavaVersion() == 8) { + if (StableUtils.getMajorJavaVersion() >= 8) { setUndecorated(true); } JPanel panel = (JPanel) getContentPane(); diff --git a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java index d7f858b65f..628adfec64 100644 --- a/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java +++ b/designer-base/src/main/java/com/fr/design/extra/WebViewDlgHelper.java @@ -159,7 +159,7 @@ public class WebViewDlgHelper { } public static void createLoginDialog() { - if (StableUtils.getMajorJavaVersion() == VERSION_8) { + if (StableUtils.getMajorJavaVersion() >= VERSION_8) { File file = new File(StableUtils.pathJoin(installHome, "scripts")); if (!file.exists()) { confirmDownLoadShopJS(); @@ -172,7 +172,7 @@ public class WebViewDlgHelper { public static void createLoginDialog(Window parent) { - if (StableUtils.getMajorJavaVersion() == VERSION_8) { + if (StableUtils.getMajorJavaVersion() >= VERSION_8) { File file = new File(StableUtils.pathJoin(installHome, "scripts")); if (!file.exists()) { confirmDownLoadShopJS(); diff --git a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java index e4ab990337..69aee1b50e 100644 --- a/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java +++ b/designer-base/src/main/java/com/fr/design/file/MutilTempalteTabPane.java @@ -17,14 +17,31 @@ import com.fr.file.FILE; import com.fr.general.ComparatorUtils; import com.fr.log.FineLoggerFactory; import com.fr.stable.Constants; -import com.fr.stable.ProductConstants; import com.fr.third.javax.annotation.Nonnull; import com.fr.workspace.WorkContext; import com.fr.workspace.server.lock.TplOperator; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.ButtonModel; +import javax.swing.Icon; +import javax.swing.JComponent; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JSeparator; +import javax.swing.SwingConstants; import javax.swing.plaf.basic.BasicMenuItemUI; -import java.awt.*; +import java.awt.AWTEvent; +import java.awt.AlphaComposite; +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Font; +import java.awt.GradientPaint; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; import java.awt.event.AWTEventListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -171,6 +188,8 @@ public class MutilTempalteTabPane extends JComponent { private UIMenuItem initCloseOther() { UIMenuItem closeOther = new UIMenuItem(Toolkit.i18nText("Fine-Design_Basic_FS_Close_Other_Templates")); + // Yvan: 英文下文本显示不全,后续发现如果将模板名设置的比较短,其它语言也会出现显示不全的问题,所以设置一下文本水平居中 + closeOther.setHorizontalAlignment(SwingConstants.CENTER); setListDownItemPreferredSize(closeOther); closeOther.addActionListener(new ActionListener() { @Override diff --git a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java index e94b182695..10ea21a9ae 100644 --- a/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/columnrow/ColumnRowPane.java @@ -200,13 +200,17 @@ public class ColumnRowPane extends JPanel implements UIObserver { column = 0; } removeDocumentListener(d); - columnSpinner.setValue(StableUtils.convertIntToABC(column + 1)); + String colValue = StableUtils.convertIntToABC(column + 1); + columnSpinner.setValue(colValue); + ((DefaultEditor) columnSpinner.getEditor()).getTextField().setText(colValue); int row = columnRow.getRow(); // shoc 小于0就蹦了 if (row < 0) { row = 0; } - rowSpinner.setValue("" + (row + 1)); + String rowValue = Integer.toString(row + 1); + rowSpinner.setValue(rowValue); + ((DefaultEditor) rowSpinner.getEditor()).getTextField().setText(rowValue); addDocumentListener(d); fireChanged(); } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java index 3eb644c334..b82a584679 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/JListControlPane.java @@ -27,6 +27,7 @@ import java.awt.Component; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.Collection; public abstract class JListControlPane extends JControlPane implements ListControlPaneProvider { private static final String LIST_NAME = "JControl_List"; @@ -190,9 +191,9 @@ public abstract class JListControlPane extends JControlPane implements ListContr return getHelper().getSelectedName(); } - protected boolean isNameRepeated(java.util.List[] list, String name) { - for (int i = 0; i < list.length; i++) { - if (list[i].contains(name)) { + protected boolean isNameRepeated(Collection[] collections, String name) { + for (int i = 0; i < collections.length; i++) { + if (collections[i].contains(name)) { isNameRepeated = true; return true; } diff --git a/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java b/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java index 0d12772d33..76255d96b7 100644 --- a/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java +++ b/designer-base/src/main/java/com/fr/design/gui/controlpane/ListControlPaneHelper.java @@ -65,7 +65,7 @@ class ListControlPaneHelper { res.add(((ListModelElement) listModel.getElementAt(i)).wrapper); } - return res.toArray(new Nameable[res.size()]); + return res.toArray(new Nameable[0]); } /** diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java index 46cdae35bd..6103e68002 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/JTreeAutoBuildPane.java @@ -26,14 +26,14 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; - import com.fr.stable.StringUtils; - -import javax.swing.*; import java.awt.*; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; +import javax.swing.*; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; public class JTreeAutoBuildPane extends BasicPane implements PreviewLabel.Previewable, EditOrNewLabel.Editable { private TreeTableDataComboBox treeTableDataComboBox; @@ -61,6 +61,23 @@ public class JTreeAutoBuildPane extends BasicPane implements PreviewLabel.Previe tdChange(); } }); + // REPORT-38762 加一个展开监听事件,下拉框展开时刷新一下数据集 + treeTableDataComboBox.addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + treeTableDataComboBox.refresh(DesignTableDataManager.getEditingTableDataSource()); + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + + } + }); selectTreeDataPanel.add(treeTableDataComboBox); treeTableDataComboBox.setPreferredSize(new Dimension(200, 25)); treeTableDataComboBox.setSelectedIndex(-1); diff --git a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java index 37e9db1546..9906749b7b 100644 --- a/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java +++ b/designer-base/src/main/java/com/fr/design/gui/icombobox/LazyComboBoxTest.java @@ -3,10 +3,10 @@ */ package com.fr.design.gui.icombobox; +import com.fr.design.gui.UILookAndFeel; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.log.FineLoggerFactory; -import com.sun.java.swing.plaf.windows.WindowsLookAndFeel; import javax.swing.JFrame; import javax.swing.JPanel; @@ -23,7 +23,7 @@ import java.awt.event.ItemListener; public class LazyComboBoxTest { public static void main(String[] args) { try { - UIManager.setLookAndFeel(new WindowsLookAndFeel()); + UIManager.setLookAndFeel(new UILookAndFeel()); } catch (UnsupportedLookAndFeelException e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); } 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 df07acf1ab..77407a3eda 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 @@ -19,7 +19,7 @@ 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 MAX_CONTAINER_WIDTH = 340; public static final int MIN_CONTAINER_WIDTH = 286; private int containerWidth = 240; @@ -266,13 +266,7 @@ public class UIEastResizableContainer extends JPanel { @Override public void mouseDragged(MouseEvent e) { - 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(); - } + // do noting } }); addMouseListener(new MouseAdapter() { diff --git a/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java b/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java new file mode 100644 index 0000000000..c1cb98ca3d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/gui/ipasswordfield/UIPasswordFieldWithFixedLength.java @@ -0,0 +1,106 @@ +package com.fr.design.gui.ipasswordfield; + +import com.fr.stable.StringUtils; +import org.jetbrains.annotations.NotNull; + +import javax.swing.text.Document; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +/** + * @author Yvan + * @version 10.0 + * Created by Yvan on 2020-08-11 + * 有固定长度的"*"回显的密码框,避免泄露密码长度 + */ +public class UIPasswordFieldWithFixedLength extends UIPassWordField { + /** + * 展示密码,为固定8位长度的特殊字符"*"组成 + */ + private static final String DISPLAY_PASSWORD = "********"; + + /** + * 实际密码 + */ + private String realPassword; + + /** + * 用于判断是否清空密码 + */ + private boolean clearPassword; + + public UIPasswordFieldWithFixedLength() { + this(null, null, 0); + } + + public UIPasswordFieldWithFixedLength(String text) { + this(null, text, 0); + } + + public UIPasswordFieldWithFixedLength(int columns) { + this(null, null, columns); + } + + public UIPasswordFieldWithFixedLength(String text, int columns) { + this(null, text, columns); + } + + public UIPasswordFieldWithFixedLength(Document doc, String txt, int columns) { + super(doc, txt, columns); + initRealPassword(txt); + } + + /** + * 为realPassword赋初值并添加一个鼠标单击事件 + */ + public void initRealPassword(String text) { + this.realPassword = text == null ? StringUtils.EMPTY : text; + this.clearPassword = true; + addShowFixedLengthPasswordListener(); + } + + /** + * 当鼠标点击密码框,第一次做出键入动作时,清空显示密码与实际密码,用户需要重新输入密码 + */ + private void addShowFixedLengthPasswordListener() { + this.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + UIPasswordFieldWithFixedLength.this.clearPassword = true; + } + }); + this.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (clearPassword) { + UIPasswordFieldWithFixedLength.this.setText(StringUtils.EMPTY); + UIPasswordFieldWithFixedLength.this.clearPassword = false; + UIPasswordFieldWithFixedLength.this.updateUI(); + } + } + }); + } + + @Override + public void setText(@NotNull String t) { + this.realPassword = t; + // 看到代码中有些场景是将密码置为空字符串的,所以在这里加个判断 + if (StringUtils.isEmpty(t)) { + super.setText(t); + } else { + super.setText(DISPLAY_PASSWORD); + } + } + + @Override + public char[] getPassword() { + //如果用户刚清空密码框,并输入了新密码,则返回输入内容,否则返回realPassword + String text = new String(super.getPassword()); + if (!StringUtils.isEmpty(text) && StringUtils.isEmpty(realPassword)) { + return text.toCharArray(); + } + return realPassword.toCharArray(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java index 29214984c3..d1847545ce 100644 --- a/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java +++ b/designer-base/src/main/java/com/fr/design/gui/iprogressbar/ProgressDialog.java @@ -3,11 +3,12 @@ package com.fr.design.gui.iprogressbar; import com.fr.design.constants.UIConstants; import com.fr.design.dialog.UIDialog; import com.fr.design.gui.ilable.UILabel; -import com.fr.stable.os.support.OSBasedAction; -import com.fr.stable.os.support.OSSupportCenter; import com.fr.design.os.impl.SupportOSImpl; +import com.fr.design.utils.DesignUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.FRFont; +import com.fr.stable.os.support.OSBasedAction; +import com.fr.stable.os.support.OSSupportCenter; import javax.swing.JDialog; import javax.swing.JLabel; @@ -57,7 +58,10 @@ public class ProgressDialog extends UIDialog { progressBar.setMaximum(1000); panel.add(progressBar, BorderLayout.CENTER); text = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Loading_Project"), JLabel.CENTER); - FRFont font = FRFont.getInstance().applySize(14).applyForeground(new ColorUIResource(333334)); + FRFont font = DesignUtils + .getDefaultGUIFont() + .applySize(14) + .applyForeground(new ColorUIResource(333334)); text.setFont(font); panel.add(text, BorderLayout.SOUTH); panel.setVisible(true); diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index fb6752ac19..c60ae27605 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -30,6 +30,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver private static final int LEN = 13; private static final int WIDTH = 13; private static final int HEIGHT = 10; + private static final int DEFAULT_NUMBERFIELD_COLUMNS = 2; private UINumberField textField; private UIButton preButton; private UIButton nextButton; @@ -40,9 +41,22 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver private UIObserverListener uiObserverListener; private GlobalNameListener globalNameListener = null; private boolean lessMinValue = false; + /** + * Spinner内的数字文本框长度 + */ + private int numberFieldColumns; public UISpinner(double minValue, double maxValue, double dierta) { + init(minValue, maxValue, dierta); + } + + public UISpinner(double minValue, double maxValue, double dierta, double defaultValue) { + init(minValue, maxValue, dierta); + textField.setValue(defaultValue); + } + + private void init(double minValue, double maxValue, double dierta) { this.minValue = minValue; this.maxValue = maxValue; this.dierta = dierta; @@ -50,11 +64,6 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver iniListener(); } - public UISpinner(double minValue, double maxValue, double dierta, double defaultValue) { - this(minValue, maxValue, dierta); - textField.setValue(defaultValue); - } - private void iniListener() { if (shouldResponseChangeListener()) { this.addChangeListener(new ChangeListener() { @@ -156,6 +165,13 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver fireStateChanged(); } + /** + * 设置Spinner内的数字输入框列数 + * @param numberFieldColumns 输入框列数 + */ + public void setNumberFieldColumns(int numberFieldColumns) { + textField.setColumns(numberFieldColumns); + } public void setEnabled(boolean flag) { super.setEnabled(flag); @@ -308,7 +324,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver } protected UINumberField initNumberField() { - return new UINumberField(2) { + int columns = this.numberFieldColumns == 0 ? DEFAULT_NUMBERFIELD_COLUMNS : this.numberFieldColumns; + return new UINumberField(columns) { public boolean shouldResponseChangeListener() { return false; } diff --git a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java index d5a9044d5e..435d5a465a 100644 --- a/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java +++ b/designer-base/src/main/java/com/fr/design/gui/itree/filetree/EnvFileTree.java @@ -2,7 +2,6 @@ package com.fr.design.gui.itree.filetree; import com.fr.base.FRContext; import com.fr.design.constants.UIConstants; -import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itree.refreshabletree.ExpandMutableTreeNode; import com.fr.design.gui.itree.refreshabletree.RefreshableJTree; import com.fr.design.i18n.Toolkit; @@ -14,13 +13,13 @@ import com.fr.stable.CoreConstants; import com.fr.stable.StableUtils; import com.fr.workspace.WorkContext; +import javax.swing.BorderFactory; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import java.awt.Color; import java.awt.Component; -import java.awt.Dimension; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -79,14 +78,7 @@ public class EnvFileTree extends RefreshableJTree { this.setIcon(null); this.setText(PENDING.toString()); } - // 这里新建一个Label作为render是因为JTree在动态刷新的时候,节点上render画布的的宽度不会变,会使得一部分比较长的数据显示为"..." - UILabel label = new UILabel(); - label.setText(getText()); - label.setIcon(getIcon()); - this.setSize(label.getPreferredSize()); - Dimension dim = label.getPreferredSize(); - dim.height += 2; - this.setPreferredSize(dim); + this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); this.setTextSelectionColor(Color.WHITE); this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java index 9ce63abe37..f806ded065 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/FRFontPane.java @@ -25,10 +25,20 @@ import com.fr.general.FRFont; import com.fr.stable.Constants; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JPanel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.Vector; @@ -67,11 +77,20 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse private UIToggleButton subPane; private JPanel linePane; private int italic_bold; + /** + * LeftPane和RightPane之间的间隙,也是fontSizeStyleComboBox与fontSizeComboBox之间的间隙,之前的默认值为VGAP_LARGE + */ + private int hGapBetweenLeftPaneAndRightPane = LayoutConstants.VGAP_LARGE; public FRFontPane() { this.initComponents(); } + public FRFontPane(int hGapBetweenLeftPaneAndRightPane) { + this.hGapBetweenLeftPaneAndRightPane = hGapBetweenLeftPaneAndRightPane; + this.initComponents(); + } + public static void main(String[] args) { JFrame jf = new JFrame("test"); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); @@ -345,7 +364,7 @@ public class FRFontPane extends AbstractBasicStylePane implements GlobalNameObse private JPanel createPane() { JPanel createPane = new JPanel(new BorderLayout()); createPane.add(fontNameComboBox, BorderLayout.NORTH); - JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{createLeftPane(), createRightPane()}}, TableLayoutHelper.FILL_LASTCOLUMN, LayoutConstants.VGAP_LARGE, LayoutConstants.VGAP_LARGE); + JPanel jPanel = TableLayoutHelper.createGapTableLayoutPane(new Component[][]{new Component[]{createLeftPane(), createRightPane()}}, TableLayoutHelper.FILL_LASTCOLUMN, hGapBetweenLeftPaneAndRightPane, LayoutConstants.VGAP_LARGE); jPanel.setBorder(BorderFactory.createEmptyBorder(10, 0, 0, 0)); createPane.add(jPanel, BorderLayout.CENTER); return createPane; diff --git a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java index 47c4d35015..233fcd598c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java +++ b/designer-base/src/main/java/com/fr/design/gui/syntax/ui/rtextarea/ConfigurableCaret.java @@ -12,6 +12,7 @@ import java.awt.*; import java.awt.event.*; import java.awt.datatransfer.*; import java.awt.event.ActionEvent; +import java.awt.geom.Line2D; import java.io.*; import javax.swing.*; import javax.swing.plaf.*; @@ -454,9 +455,10 @@ public class ConfigurableCaret extends DefaultCaret { // A thicker vertical line. case THICK_VERTICAL_LINE_STYLE: - g.drawLine(r.x,r.y, r.x,r.y+r.height); - r.x++; - g.drawLine(r.x,r.y, r.x,r.y+r.height); + Graphics2D g2 = (Graphics2D) g; + g2.setStroke(new BasicStroke(2)); + // 向右再移动一个位置 避免光标太接近文字内容 + g2.draw(new Line2D.Float(r.x + 1, r.y, r.x + 1, r.y + r.height)); break; } // End of switch (style). diff --git a/designer-base/src/main/java/com/fr/design/jdk/JdkVersion.java b/designer-base/src/main/java/com/fr/design/jdk/JdkVersion.java new file mode 100644 index 0000000000..be0c3da013 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/jdk/JdkVersion.java @@ -0,0 +1,38 @@ +package com.fr.design.jdk; + +import com.fr.stable.StableUtils; + +/** + * 设计器运行jdk版本 + * + * @author hades + * @version 10.0 + * Created by hades on 2020/9/27 + */ +public enum JdkVersion { + + /** + * 小于或等于jdk 8 + */ + LE_8 { + + @Override + public boolean support() { + return StableUtils.getMajorJavaVersion() <= 8; + } + }, + + /** + * 大于或等于jdk 9 + */ + GE_9 { + + @Override + public boolean support() { + return StableUtils.getMajorJavaVersion() >= 9; + } + }; + + + abstract public boolean support(); +} diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java b/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java index 904a6c18b1..0373dad033 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java @@ -156,7 +156,20 @@ public enum SupportLocaleImpl implements SupportLocale { set.add(Locale.TAIWAN); return set; } - } - + }, + /** + * 更新升级-帮助菜单下 + */ + UPDATE_HELP { + @Override + public Set support() { + Set set = new HashSet<>(); + set.add(Locale.US); + set.add(Locale.KOREA); + set.add(Locale.CHINA); + set.add(Locale.TAIWAN); + return set; + } + } } 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 42365dcc57..2f65fca0a8 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 @@ -257,8 +257,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } }; - private ProgressDialog progressDialog; - public DesignerFrame(ToolBarMenuDock ad) { setName(DESIGNER_FRAME_NAME); @@ -338,7 +336,6 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta this.setDropTarget(new DropTarget(this, DnDConstants.ACTION_MOVE, new FileDropTargetListener(), true)); closeMode = UIConstants.CLOSE_OF_AUTHORITY; initMenuPane(); - this.progressDialog = new ProgressDialog(this); } public void resizeFrame() { @@ -748,9 +745,15 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * @param al 组件名称 */ public void checkCombineUp(boolean flag, ArrayList al) { - - combineUp.checkComponentsByNames(flag, al); - + //Yvan: 检查当前是否为WORK_SHEET状态,因为只有WORK_SHEET中含有格式刷组件,此时是不需要进行checkComponentsByNames的 + JTemplate jTemplate = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); + if (jTemplate != null) { + // 第一个条件满足后还需要添加一重判断,判断是编辑报表块还是参数面板,编辑报表块时则直接return + if (jTemplate.getMenuState() == DesignState.WORK_SHEET && !jTemplate.isUpMode()) { + return; + } + combineUp.checkComponentsByNames(flag, al); + } } /** @@ -1262,23 +1265,15 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta } } + @Deprecated public ProgressDialog getProgressDialog() { - return progressDialog; + return new ProgressDialog(this); } - public void showProgressDialog() { - - progressDialog.setVisible(true); - - } - - /** - * 隐藏进度框 - */ - public void hideProgressDialog() { + @Deprecated + public void openProgressDialog() { - progressDialog.setVisible(false); } /** @@ -1286,17 +1281,17 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta * * @param progress 进度值 */ + @Deprecated public void updateProgress(int progress) { - progressDialog.setProgressValue(progress); } /** * 释放进度框 */ + @Deprecated public void disposeProgressDialog() { - progressDialog.dispose(); } /** @@ -1307,4 +1302,5 @@ public class DesignerFrame extends JFrame implements JTemplateActionListener, Ta public boolean isDesignerOpened() { return designerOpened; } + } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java index bcac7f946c..4f59032dca 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/DesignerFrameFileDealerPane.java @@ -556,7 +556,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt ); newNameLabel.setHorizontalAlignment(SwingConstants.RIGHT); newNameLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10)); - newNameLabel.setPreferredSize(new Dimension(118, 15)); + //newNameLabel.setPreferredSize(new Dimension(118, 15)); // 重命名输入框 nameField = new UITextField(oldName); @@ -578,7 +578,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt } }); nameField.selectAll(); - nameField.setPreferredSize(new Dimension(180, 20)); + nameField.setPreferredSize(new Dimension(170, 20)); JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 5)); topPanel.setBorder(BorderFactory.createEmptyBorder(15, 15, 0, 15)); @@ -856,7 +856,7 @@ public class DesignerFrameFileDealerPane extends JPanel implements FileToolbarSt BorderLayout.CENTER); - this.setSize(340, 180); + this.setSize(380, 180); this.setTitle(Toolkit.i18nText("Fine-Design_Basic_Mkdir")); this.setResizable(false); this.setAlwaysOnTop(true); 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 a273828d84..0703216eba 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 @@ -12,6 +12,8 @@ import com.fr.design.gui.ibutton.UIButtonUI; import com.fr.design.gui.icontainer.UIEastResizableContainer; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.VerticalFlowLayout; +import com.fr.design.menu.SnapChatUtil; +import com.fr.design.notification.SnapChat; import com.fr.design.ui.util.UIUtil; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.design.utils.gui.GUIPaintUtils; @@ -171,7 +173,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } updateAllPropertyPane(); } - }); } + }); + } }, filter); PluginListenerRegistration.getInstance().listen( PluginEventType.BeforeStop, @@ -221,11 +224,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { String key = provider.key(); PropertyItemBean itemBean = provider.getItem(); PropertyItem propertyItem = new PropertyItem(itemBean.getName(), - itemBean.getTitle(), - itemBean.getBtnIconName(), - itemBean.getBtnIconBaseDir(), - itemBean.getVisibleModes(), - itemBean.getEnableModes()); + itemBean.getTitle(), + itemBean.getBtnIconName(), + itemBean.getBtnIconBaseDir(), + itemBean.getVisibleModes(), + itemBean.getEnableModes(), + itemBean.getSnapChat(), + itemBean.getPromptWindow()); UIButton button = propertyItem.getButton(); List buttonListeners = itemBean.getButtonListeners(); if (buttonListeners != null) { @@ -324,6 +329,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { cellElement.popupDialog.showDefaultPane(); } } + // 禁用单元格元素tab private void enableCellElementPane(PropertyItem cellElement) { cellElement.setEnabled(true); @@ -381,7 +387,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { /** * 可通过此方法,判断当前的编辑模式 - * */ + */ public PropertyMode getCurrentMode() { return currentMode; } @@ -511,7 +517,10 @@ public class EastRegionContainerPane extends UIEastResizableContainer { UIUtil.invokeLaterIfNeeded(new Runnable() { @Override public void run() { - propertyItemMap.get(key).replaceContentPane(pane); + PropertyItem item = propertyItemMap.get(key); + if (item != null) { + item.replaceContentPane(pane); + } } }); } @@ -524,7 +533,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { propertyItemMap.get(KEY_WIDGET_SETTINGS).replaceHeaderPane(paraPane); } - public static void main(String[] args){ + public static void main(String[] args) { JFrame jf = new JFrame("test"); // jf = new JFrame("test"); @@ -546,7 +555,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { // leftPane.add(b2); // leftPane.setLayout(new BoxLayout(leftPane, BoxLayout.Y_AXIS)); - JPanel content = (JPanel)jf.getContentPane(); + JPanel content = (JPanel) jf.getContentPane(); // content.setLayout(null); content.add(cc, BorderLayout.CENTER); content.add(new EastRegionContainerPane(), BorderLayout.EAST); @@ -654,6 +663,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { class PropertyItem { + private SnapChat snapChat; private UIButton button; private String name; // 用于 card 切换 private String title; // 用于显示 @@ -664,6 +674,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private FixedPopupPane popupPane; // 左侧固定弹出框 private PopupToolPane popupToolPane; // 弹出工具条 private PopupDialog popupDialog; // 弹出框 + private PromptWindow promptWindow; //提示窗 private boolean isPoppedOut = false; // 是否弹出 private boolean isVisible = true; // 是否可见 private boolean replace = false; // 是否被替代 @@ -684,14 +695,16 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public PropertyItem(String name, String title, String btnIconName, PropertyMode[] visibleModes, PropertyMode[] enableModes) { - this(name, title, btnIconName, ICON_BASE_DIR, visibleModes, enableModes); + this(name, title, btnIconName, ICON_BASE_DIR, visibleModes, enableModes, null, null); } - public PropertyItem(String name, String title, String btnIconName, String iconBaseDir, PropertyMode[] visibleModes, PropertyMode[] enableModes) { + public PropertyItem(String name, String title, String btnIconName, String iconBaseDir, PropertyMode[] visibleModes, PropertyMode[] enableModes, SnapChat snapChat, PromptWindow promptWindow) { this.name = name; this.title = title; this.btnIconName = btnIconName; this.iconBaseDir = iconBaseDir; + this.snapChat = snapChat; + this.promptWindow = promptWindow; initButton(); initPropertyPanel(); initModes(visibleModes, enableModes); @@ -832,7 +845,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { if (isRightPaneVisible()) { hideCurrentPopupPane(); replaceContentPane(contentPane); - } else if(popupPane != null && popupPane.isVisible()) { + } else if (popupPane != null && popupPane.isVisible()) { popupPane.replaceContentPane(contentArea); } } @@ -869,9 +882,13 @@ public class EastRegionContainerPane extends UIEastResizableContainer { public Dimension getPreferredSize() { return new Dimension(TAB_BUTTON_WIDTH, TAB_BUTTON_HEIGHT); } + @Override public void paintComponent(Graphics g) { super.paintComponent(g); + if (snapChat != null && !snapChat.hasRead()) { + SnapChatUtil.paintPropertyItemPoint(g, getBounds()); + } } }; button.set4LargeToolbarButton(); @@ -899,6 +916,12 @@ public class EastRegionContainerPane extends UIEastResizableContainer { popupFixedPane(); } setTabButtonSelected(); + if (snapChat != null && !snapChat.hasRead()) { + snapChat.markRead(); + if (promptWindow != null) { + promptWindow.showWindow(); + } + } } }); button.setToolTipText(title); @@ -1012,8 +1035,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } /** - * @Description:刷新currentPopupPane面板位置,当设计器缩放时会调用这个函数 * @param + * @Description:刷新currentPopupPane面板位置,当设计器缩放时会调用这个函数 * @return: * @Author: Henry.Wang * @date: 2020/7/30 11:39 @@ -1028,8 +1051,8 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } /** - * @Description:清空currentPopupPane数据,当切换模板时会调用这个函数 * @param + * @Description:清空currentPopupPane数据,当切换模板时会调用这个函数 * @return: * @Author: Henry.Wang * @date: 2020/7/30 11:42 @@ -1068,12 +1091,14 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } repaint(); } + @Override public void mouseClicked(MouseEvent e) { if (e.getX() >= ARROW_RANGE_START) { onPop(); } } + @Override public void mouseReleased(MouseEvent e) { mouseDownCompCoords = null; @@ -1081,6 +1106,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { contentPane.setBackground(originColor); } } + @Override public void mousePressed(MouseEvent e) { if (e.getX() < ARROW_RANGE_START) { @@ -1102,6 +1128,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { } repaint(); } + @Override public void mouseDragged(MouseEvent e) { if (isMovable && mouseDownCompCoords != null) { @@ -1214,6 +1241,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { private Container contentPane; private JPanel defaultPane; // 无可用配置项 private PropertyItem propertyItem; + public PopupDialog(PropertyItem propertyItem) { super(DesignerContext.getDesignerFrame()); container = getContentPane(); @@ -1316,6 +1344,7 @@ public class EastRegionContainerPane extends UIEastResizableContainer { mouseDownCompCoords = e.getLocationOnScreen(); } } + @Override public void mouseReleased(MouseEvent e) { mouseDownCompCoords = null; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/PromptWindow.java b/designer-base/src/main/java/com/fr/design/mainframe/PromptWindow.java new file mode 100644 index 0000000000..dc7fc1f63a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/PromptWindow.java @@ -0,0 +1,20 @@ +package com.fr.design.mainframe; + +import javax.swing.JWindow; + +/** + * @Author: Yuan.Wang + * @Date: 2020/10/9 + * 只关心Window的显示和隐藏操作时可以实现该接口 + */ +public interface PromptWindow { + /** + * 显示弹窗 + */ + void showWindow(); + + /** + * 隐藏弹窗 + */ + void hideWindow(); +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/PropertyItemBean.java b/designer-base/src/main/java/com/fr/design/mainframe/PropertyItemBean.java index ee54364ba5..cdd5dbb64d 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/PropertyItemBean.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/PropertyItemBean.java @@ -1,5 +1,7 @@ package com.fr.design.mainframe; +import com.fr.design.notification.SnapChat; + import java.awt.event.ActionListener; import java.util.List; @@ -7,71 +9,89 @@ import java.util.List; * created by Harrison on 2020/03/23 **/ public class PropertyItemBean { - + private String name; private String title; private String btnIconName; private String btnIconBaseDir; + private SnapChat snapChat; + private PromptWindow promptWindow; private EastRegionContainerPane.PropertyMode[] visibleModes; private EastRegionContainerPane.PropertyMode[] enableModes; private List buttonListeners; - + public PropertyItemBean() { } - + public String getName() { return name; } - + public void setName(String name) { this.name = name; } - + public String getTitle() { return title; } - + public void setTitle(String title) { this.title = title; } - + public String getBtnIconName() { return btnIconName; } - + public void setBtnIconName(String btnIconName) { this.btnIconName = btnIconName; } - + public String getBtnIconBaseDir() { - + return btnIconBaseDir; } - + public void setBtnIconBaseDir(String btnIconBaseDir) { this.btnIconBaseDir = btnIconBaseDir; } - + + public SnapChat getSnapChat() { + return snapChat; + } + + public void setSnapChat(SnapChat snapChat) { + this.snapChat = snapChat; + } + + public PromptWindow getPromptWindow() { + return promptWindow; + } + + public void setPromptWindow(PromptWindow promptWindow) { + this.promptWindow = promptWindow; + } + public EastRegionContainerPane.PropertyMode[] getVisibleModes() { return visibleModes; } - + public void setVisibleModes(EastRegionContainerPane.PropertyMode[] visibleModes) { this.visibleModes = visibleModes; } - + public EastRegionContainerPane.PropertyMode[] getEnableModes() { return enableModes; } - + public void setEnableModes(EastRegionContainerPane.PropertyMode[] enableModes) { this.enableModes = enableModes; } - + public List getButtonListeners() { return buttonListeners; } - + public void setButtonListeners(List buttonListeners) { this.buttonListeners = buttonListeners; } diff --git a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java index c81c6749f8..078d4d1289 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/toolbar/ToolBarMenuDock.java @@ -54,9 +54,7 @@ import com.fr.design.mainframe.ToolBarNewTemplatePane; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; import com.fr.design.menu.ShortCut; -import com.fr.design.menu.SnapChatMenuDef; import com.fr.design.menu.ToolBarDef; -import com.fr.design.notification.SnapChatAllTypes; import com.fr.design.os.impl.SupportOSImpl; import com.fr.design.remote.action.RemoteDesignAuthManagerAction; import com.fr.design.update.actions.SoftwareUpdateAction; @@ -530,35 +528,18 @@ public abstract class ToolBarMenuDock { * @return 帮组菜单的子菜单 */ public ShortCut[] createHelpShortCuts() { - final java.util.List shortCuts = new ArrayList(); - - Locale locale = GeneralContext.getLocale(); + final java.util.List shortCuts = new ArrayList<>(); - LocaleCenter.buildAction(new LocaleAction() { - @Override - public void execute() { - shortCuts.add(new VideoAction()); - } - }, SupportLocaleImpl.VIDEO); + LocaleCenter.buildAction(() -> shortCuts.add(new VideoAction()), SupportLocaleImpl.VIDEO); - LocaleCenter.buildAction(new LocaleAction() { - @Override - public void execute() { - shortCuts.add(new TutorialAction()); - } - }, SupportLocaleImpl.TUTORIAL_HELP); + LocaleCenter.buildAction(() -> shortCuts.add(new TutorialAction()), SupportLocaleImpl.TUTORIAL_HELP); - LocaleCenter.buildAction(new LocaleAction() { - @Override - public void execute() { - shortCuts.add(new TechSupportAction()); - } - }, SupportLocaleImpl.TECH_SUPPORT_HELP); + LocaleCenter.buildAction(() -> shortCuts.add(new TechSupportAction()), SupportLocaleImpl.TECH_SUPPORT_HELP); //远程不使用更新升级,产品演示 if (WorkContext.getCurrent().isLocal()) { shortCuts.add(new WebDemoAction()); - shortCuts.add(new SoftwareUpdateAction()); + LocaleCenter.buildAction(() -> shortCuts.add(new SoftwareUpdateAction()), SupportLocaleImpl.UPDATE_HELP); } if (AlphaFineConfigManager.isALPHALicAvailable()) { shortCuts.add(new AlphaFineAction()); @@ -566,12 +547,7 @@ public abstract class ToolBarMenuDock { shortCuts.add(SeparatorDef.DEFAULT); if (DesignerEnvManager.getEnvManager().isOpenDebug()) { - OSSupportCenter.buildAction(new OSBasedAction() { - @Override - public void execute(Object... objects) { - shortCuts.add(new FineUIAction()); - } - }, SupportOSImpl.FINEUI); + OSSupportCenter.buildAction(objects -> shortCuts.add(new FineUIAction()), SupportOSImpl.FINEUI); } shortCuts.add(new AboutAction()); @@ -655,11 +631,8 @@ public abstract class ToolBarMenuDock { } public MenuDef createCommunityMenuDef() { - - MenuDef menuDef = new SnapChatMenuDef( - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community"), - 'C', - SnapChatAllTypes.Menu.BBS); + + MenuDef menuDef = new MenuDef(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Community"), 'C'); ShortCut[] otherCommunityShortCuts = createCommunityShortCuts(); for (ShortCut shortCut : otherCommunityShortCuts) { menuDef.addShortCut(shortCut); diff --git a/designer-base/src/main/java/com/fr/design/menu/SnapChatMenuDef.java b/designer-base/src/main/java/com/fr/design/menu/SnapChatMenuDef.java index 2ec3f6c7ee..80ba40afeb 100644 --- a/designer-base/src/main/java/com/fr/design/menu/SnapChatMenuDef.java +++ b/designer-base/src/main/java/com/fr/design/menu/SnapChatMenuDef.java @@ -4,6 +4,7 @@ import com.fr.design.gui.imenu.UIMenu; import com.fr.design.gui.imenu.UIScrollMenu; import com.fr.design.notification.SnapChat; import com.fr.design.notification.SnapChatConfig; +import com.fr.design.notification.SnapChatFactory; import com.fr.design.notification.SnapChatKey; import javax.swing.JMenu; @@ -19,47 +20,49 @@ import java.awt.image.BufferedImage; * created by Harrison on 2020/03/16 **/ public class SnapChatMenuDef extends MenuDef implements SnapChat { - + private SnapChatKey uniqueKey; private SnapChatMenuUI menuUI = new SnapChatMenuUI(this); - + private SnapChat snapChat ; + public SnapChatMenuDef(String name, SnapChatKey uniqueKey) { super(name); this.uniqueKey = uniqueKey; + snapChat = SnapChatFactory.createSnapChat(true, uniqueKey); } public SnapChatMenuDef(Boolean rePaint, SnapChatKey uniqueKey) { super(rePaint); this.uniqueKey = uniqueKey; + snapChat = SnapChatFactory.createSnapChat(true, uniqueKey); } public SnapChatMenuDef(String name, char mnemonic, SnapChatKey uniqueKey) { super(name, mnemonic); this.uniqueKey = uniqueKey; + snapChat = SnapChatFactory.createSnapChat(true, uniqueKey); } @Override public boolean hasRead() { - - String calcKey = calcKey(); - Boolean val = SnapChatConfig.getInstance().hasRead(calcKey); - // 默认读过了。 - return val == null ? defaultStatus() : val; + return snapChat.hasRead(); } @Override public void markRead() { - - String calcKey = calcKey(); - SnapChatConfig.getInstance().markRead(calcKey); + snapChat.markRead(); } - + @Override public boolean defaultStatus() { - - return true; + return snapChat.defaultStatus(); } - + + @Override + public SnapChatKey key() { + return snapChat.key(); + } + @Override public void addShortCut(ShortCut shortCut) { @@ -74,13 +77,6 @@ public class SnapChatMenuDef extends MenuDef implements SnapChat { super.insertShortCut(index, shortCut); } - - @Override - public SnapChatKey key() { - - return this.uniqueKey; - } - @Override protected MenuListener createMenuListener() { @@ -97,17 +93,12 @@ public class SnapChatMenuDef extends MenuDef implements SnapChat { if (shortCut instanceof SnapChatUpdateAction) { SnapChatUpdateAction action = (SnapChatUpdateAction) shortCut; if (!action.hasRead()) { - String calcKey = calcKey(); + String calcKey = snapChat.calcKey(); SnapChatConfig.getInstance().resetRead(calcKey); } } } - - private String calcKey() { - - return key().calc(); - } - + @Override protected UIMenu createJMenu0() { diff --git a/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java b/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java index 9ade762500..8cc0734371 100644 --- a/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java +++ b/designer-base/src/main/java/com/fr/design/menu/SnapChatUpdateAction.java @@ -3,7 +3,7 @@ package com.fr.design.menu; import com.fr.design.actions.UpdateAction; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.notification.SnapChat; -import com.fr.design.notification.SnapChatConfig; +import com.fr.design.notification.SnapChatFactory; import com.fr.design.notification.SnapChatKey; import java.awt.event.ActionEvent; @@ -12,57 +12,46 @@ import java.awt.event.ActionEvent; * created by Harrison on 2020/03/22 **/ public abstract class SnapChatUpdateAction extends UpdateAction implements SnapChat { - + private SnapChatKey uniqueKey; - + private SnapChat snapChat ; + public SnapChatUpdateAction(SnapChatKey uniqueKey) { this.uniqueKey = uniqueKey; + snapChat = SnapChatFactory.createSnapChat(false, uniqueKey); } - + @Override public final void actionPerformed(ActionEvent e) { - markRead(); actionPerformed0(e); } - + protected abstract void actionPerformed0(ActionEvent e); - + @Override public boolean hasRead() { - - String calcKey = calcKey(); - Boolean val = SnapChatConfig.getInstance().hasRead(calcKey); - return val == null ? defaultStatus() : val; + return snapChat.hasRead(); } - + @Override public void markRead() { - - String calcKey = calcKey(); - SnapChatConfig.getInstance().markRead(calcKey); + snapChat.markRead(); } - + @Override public boolean defaultStatus() { - - return false; + return snapChat.defaultStatus(); } - + @Override public SnapChatKey key() { - - return this.uniqueKey; - } - - private String calcKey() { - - return key().calc(); + return snapChat.key(); } - + @Override public UIMenuItem createMenuItem() { - + Object object = this.getValue(UIMenuItem.class.getName()); if (object == null && !(object instanceof UIMenuItem)) { UIMenuItem menuItem = new UIMenuItem(this); @@ -70,10 +59,10 @@ public abstract class SnapChatUpdateAction extends UpdateAction implements SnapC menuItem.setName(getName()); menuItem.setUI(new SnapChatMenuItemUI(this)); object = menuItem; - + this.putValue(UIMenuItem.class.getName(), object); } return (UIMenuItem) object; } - + } diff --git a/designer-base/src/main/java/com/fr/design/menu/SnapChatUtil.java b/designer-base/src/main/java/com/fr/design/menu/SnapChatUtil.java index 6eb648055a..46bede232f 100644 --- a/designer-base/src/main/java/com/fr/design/menu/SnapChatUtil.java +++ b/designer-base/src/main/java/com/fr/design/menu/SnapChatUtil.java @@ -10,24 +10,31 @@ import java.awt.geom.Ellipse2D; * created by Harrison on 2020/03/22 **/ public class SnapChatUtil { - + private static final int WIDTH = 4; + private static final int HEIGHT = 4; + private static final int TOP_GAP = 4; + private static final int RIGHT_GAP = 6; + + /** + * 绘制菜单项的小红点 + */ public static void paintSnapChat(Graphics g, Rectangle textRect) { - - Color oldColor = g.getColor(); - - double x = textRect.getWidth(); - x += textRect.getX(); - x += 2; - + double x = textRect.getWidth() + textRect.getX() + 2; double y = textRect.getY(); - + paintRedPoint(g, new Ellipse2D.Double(x, y, WIDTH, HEIGHT)); + } + + public static void paintPropertyItemPoint(Graphics g, Rectangle bounds) { + double x = bounds.getWidth() - RIGHT_GAP; + paintRedPoint(g, new Ellipse2D.Double(x, TOP_GAP, WIDTH, HEIGHT)); + } + + private static void paintRedPoint(Graphics g, Ellipse2D.Double shape) { + Color oldColor = g.getColor(); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.red); - Ellipse2D.Double shape = - new Ellipse2D.Double(x, y, 4, 4); g2d.fill(shape); g2d.draw(shape); - g2d.setColor(oldColor); } } diff --git a/designer-base/src/main/java/com/fr/design/notification/AbstractSnapChat.java b/designer-base/src/main/java/com/fr/design/notification/AbstractSnapChat.java new file mode 100644 index 0000000000..0b174da942 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/notification/AbstractSnapChat.java @@ -0,0 +1,22 @@ +package com.fr.design.notification; + +/** + * @Author: Yuan.Wang + * @Date: 2020/9/27 + */ +public abstract class AbstractSnapChat implements SnapChat { + @Override + public boolean hasRead() { + + String calcKey = calcKey(); + Boolean val = SnapChatConfig.getInstance().hasRead(calcKey); + return val == null ? defaultStatus() : val; + } + + @Override + public void markRead() { + + String calcKey = calcKey(); + SnapChatConfig.getInstance().markRead(calcKey); + } +} diff --git a/designer-base/src/main/java/com/fr/design/notification/SnapChat.java b/designer-base/src/main/java/com/fr/design/notification/SnapChat.java index 4f610c060b..71aabb87d7 100644 --- a/designer-base/src/main/java/com/fr/design/notification/SnapChat.java +++ b/designer-base/src/main/java/com/fr/design/notification/SnapChat.java @@ -32,4 +32,8 @@ public interface SnapChat { * @return 字符标志 */ SnapChatKey key(); + + default String calcKey() { + return key().calc(); + } } diff --git a/designer-base/src/main/java/com/fr/design/notification/SnapChatFactory.java b/designer-base/src/main/java/com/fr/design/notification/SnapChatFactory.java new file mode 100644 index 0000000000..a3fd463a36 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/notification/SnapChatFactory.java @@ -0,0 +1,32 @@ +package com.fr.design.notification; + +import com.fr.plugin.context.PluginContext; + +/** + * @Author: Yuan.Wang + * @Date: 2020/10/10 + */ +public class SnapChatFactory { + public static SnapChat createSnapChat(boolean defaultStatus, SnapChatKey snapChatKey) { + return createSnapChat(defaultStatus, snapChatKey, null); + } + + public static SnapChat createSnapChat(boolean defaultStatus, SnapChatKey snapChatKey, PluginContext context) { + return new AbstractSnapChat() { + @Override + public boolean defaultStatus() { + return defaultStatus; + } + + @Override + public SnapChatKey key() { + return snapChatKey; + } + + @Override + public String calcKey() { + return context == null ? key().calc() : key().calc(context); + } + }; + } +} diff --git a/designer-base/src/main/java/com/fr/design/notification/SnapChatKey.java b/designer-base/src/main/java/com/fr/design/notification/SnapChatKey.java index fa316db350..ecb89e5097 100644 --- a/designer-base/src/main/java/com/fr/design/notification/SnapChatKey.java +++ b/designer-base/src/main/java/com/fr/design/notification/SnapChatKey.java @@ -1,9 +1,18 @@ package com.fr.design.notification; +import com.fr.plugin.context.PluginContext; + /** * created by Harrison on 2020/03/16 **/ public interface SnapChatKey { - + String calc(); + + /** + * 插件刚被安装时不能通过PluginContexts.getContext()方法获取插件上下文,因此加一个接口 + */ + default String calc(PluginContext context) { + throw new UnsupportedOperationException(); + } } diff --git a/designer-base/src/main/java/com/fr/design/object/NameObject.java b/designer-base/src/main/java/com/fr/design/object/NameObject.java index 818de9d57a..c7dc3811c0 100644 --- a/designer-base/src/main/java/com/fr/design/object/NameObject.java +++ b/designer-base/src/main/java/com/fr/design/object/NameObject.java @@ -2,6 +2,7 @@ package com.fr.design.object; import com.fr.base.BaseUtils; import com.fr.general.ComparatorUtils; +import com.fr.stable.StableUtils; /** * @@ -60,10 +61,10 @@ public class NameObject { return "Name:" + this.getName() + "\tObject:" + this.getObject(); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({ "rawtypes"}) public Object clone() throws CloneNotSupportedException { NameObject newNameObject = (NameObject)super.clone(); - newNameObject.object = BaseUtils.cloneObject(this.object); + newNameObject.object = StableUtils.cloneObject(this.object); return newNameObject; } diff --git a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java index 3f2f097283..7e74e7651a 100644 --- a/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java +++ b/designer-base/src/main/java/com/fr/design/os/impl/PMDialogAction.java @@ -2,8 +2,10 @@ package com.fr.design.os.impl; import com.fr.config.ServerPreferenceConfig; import com.fr.design.extra.WebViewDlgHelper; +import com.fr.design.jdk.JdkVersion; import com.fr.design.upm.UpmFinder; import com.fr.design.utils.DesignUtils; +import com.fr.stable.StableUtils; import com.fr.stable.os.Arch; import com.fr.stable.os.OperatingSystem; import com.fr.stable.os.support.OSBasedAction; @@ -17,11 +19,11 @@ public class PMDialogAction implements OSBasedAction { private static String PLUGIN_MANAGER_ROUTE = "#management/plugin"; @Override public void execute(Object... objects) { - if(Arch.getArch() == Arch.ARM){ + if(Arch.getArch() == Arch.ARM || OperatingSystem.isLinux()){ DesignUtils.visitEnvServerByParameters( PLUGIN_MANAGER_ROUTE,null,null); return; } - if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() && !OperatingSystem.isLinux()) { + if (ServerPreferenceConfig.getInstance().isUseOptimizedUPM() && JdkVersion.LE_8.support()) { UpmFinder.showUPMDialog(); } else { WebViewDlgHelper.createPluginDialog(); diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterArrayPane.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterArrayPane.java index d3efcae4aa..adb0e48472 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterArrayPane.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterArrayPane.java @@ -7,7 +7,7 @@ import com.fr.design.gui.controlpane.JListControlPane; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.NameableSelfCreator; import com.fr.design.gui.controlpane.UnrepeatedNameHelper; -import com.fr.design.gui.ilist.ModNameActionListener; +import com.fr.design.i18n.Toolkit; import com.fr.general.ComparatorUtils; import com.fr.stable.Nameable; import com.fr.stable.StringUtils; @@ -18,79 +18,74 @@ import java.util.Arrays; import java.util.List; public class ParameterArrayPane extends JListControlPane { - /** - * Constructor. - */ - public ParameterArrayPane() { - super(); - this.addModNameActionListener(new ModNameActionListener() { - public void nameModed(int index, String oldName, String newName) { - populateSelectedValue(); - } + /** + * Constructor. + */ + public ParameterArrayPane() { + super(); + this.addModNameActionListener((index, oldName, newName) -> populateSelectedValue()); + this.addEditingListener(new PropertyChangeAdapter() { + public void propertyChange() { + Parameter[] parameters = ParameterConfig.getInstance().getGlobalParameters(); + String[] allListNames = nameableList.getAllNames(); + allListNames[editingIndex] = StringUtils.EMPTY; + String tempName = getEditingName(); + if (StringUtils.isEmpty(tempName)) { + nameableList.stopEditing(); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ParameterArrayPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Empty_Parameter_Name")); + setIllegalIndex(editingIndex); + return; + } + if (!ComparatorUtils.equals(tempName, selectedName) + && isNameRepeated(new List[]{Arrays.asList(parameters), Arrays.asList(allListNames)}, tempName)) { + nameableList.stopEditing(); + FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ParameterArrayPane.this), + Toolkit.i18nText("Fine-Design_Basic_Duplicate_Parameter_Name")); + setIllegalIndex(editingIndex); + } + } + }); + } - }); - this.addEditingListener(new PropertyChangeAdapter() { - public void propertyChange() { - Parameter[] parameters = ParameterConfig.getInstance().getGlobalParameters(); - String[] allListNames = nameableList.getAllNames(); - allListNames[nameableList.getSelectedIndex()] = StringUtils.EMPTY; - String tempName = getEditingName(); - if (StringUtils.isEmpty(tempName)) { - nameableList.stopEditing(); - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ParameterArrayPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Empty_Parameter_Name")); - setIllegalIndex(editingIndex); - return; - } - if (!ComparatorUtils.equals(tempName, selectedName) - && isNameRepeated(new List[]{Arrays.asList(parameters), Arrays.asList(allListNames)}, tempName)) { - nameableList.stopEditing(); - FineJOptionPane.showMessageDialog(SwingUtilities.getWindowAncestor(ParameterArrayPane.this), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Duplicate_Parameter_Name")); - setIllegalIndex(editingIndex); - } - } - }); - } + @Override + protected String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Basic_Engine_Schedule_Template_Parameter"); + } - @Override - protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_Schedule_Template_Parameter"); - } - - /** - * 创建模板参数设置组件 - * - * @return 模板参数设置组件 - */ - public NameableCreator[] createNameableCreators() { - return new NameableCreator[]{ - new NameableSelfCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Engine_Parameter_Name"), Parameter.class, ParameterPane.class) { - public Parameter createNameable(UnrepeatedNameHelper helper) { - // 返回参数设置面板. - return new Parameter(helper.createUnrepeatedName("p")); - } + /** + * 创建模板参数设置组件 + * + * @return 模板参数设置组件 + */ + public NameableCreator[] createNameableCreators() { + return new NameableCreator[]{ + new NameableSelfCreator(Toolkit.i18nText("Fine-Design_Basic_Engine_Parameter_Name"), Parameter.class, ParameterPane.class) { + public Parameter createNameable(UnrepeatedNameHelper helper) { + // 返回参数设置面板. + return new Parameter(helper.createUnrepeatedName("p")); + } - @Override - public String createTooltip() { - return null; - } - } - }; - } + @Override + public String createTooltip() { + return null; + } + } + }; + } - /** - * 更新参数 + /** + * 更新参数 * * @return 更新后的参数 - */ - public Parameter[] updateParameters() { - // Nameable[]居然不能强转成Parameter[],一定要这么写... - Nameable[] res = this.update(); - Parameter[] res_array = new Parameter[res.length]; - java.util.Arrays.asList(res).toArray(res_array); + */ + public Parameter[] updateParameters() { + // Nameable[]居然不能强转成Parameter[],一定要这么写... + Nameable[] res = this.update(); + Parameter[] res_array = new Parameter[res.length]; + Arrays.asList(res).toArray(res_array); - return res_array; - } + return res_array; + } } diff --git a/designer-base/src/main/java/com/fr/design/parameter/ParameterInputPane.java b/designer-base/src/main/java/com/fr/design/parameter/ParameterInputPane.java index b16e6b2792..7c8f675b1e 100644 --- a/designer-base/src/main/java/com/fr/design/parameter/ParameterInputPane.java +++ b/designer-base/src/main/java/com/fr/design/parameter/ParameterInputPane.java @@ -20,14 +20,18 @@ import com.fr.design.editor.editor.TextEditor; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; - import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Dimension; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; @@ -37,31 +41,34 @@ import java.util.Map.Entry; /** * The dialog used to input parameter. + * * @editor zhou * @since 2012-3-26上午11:09:45 */ public class ParameterInputPane extends BasicPane { - /** - * - */ - private static final long serialVersionUID = 1L; + /** + * + */ + private static final long serialVersionUID = 1L; + + // alex:保存编辑器对应的参数的名字 + private java.util.Map editorNameMap; // Map + + private boolean allowBlank = true; - // alex:保存编辑器对应的参数的名字 - private java.util.Map editorNameMap; // Map + private FlowTableLayoutHelper flowTableLayoutHelper; - private boolean allowBlank = true; - - /** + /** * Constructor. */ public ParameterInputPane(ParameterProvider[] parameters) { this.initComponents(parameters); } - public ParameterInputPane(ParameterProvider[] parameters, boolean allowBlank) { - this.allowBlank = allowBlank; - this.initComponents(parameters); - } + public ParameterInputPane(ParameterProvider[] parameters, boolean allowBlank) { + this.allowBlank = allowBlank; + this.initComponents(parameters); + } private void initComponents(ParameterProvider[] parameters) { this.setLayout(new BorderLayout(0, 4)); @@ -71,24 +78,24 @@ public class ParameterInputPane extends BasicPane { this.add(new JScrollPane(contentPane), BorderLayout.CENTER); contentPane.setBorder(BorderFactory.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters") + ":")); - FlowTableLayoutHelper flowTableLayoutHelper = new FlowTableLayoutHelper(); + flowTableLayoutHelper = new FlowTableLayoutHelper(); + + editorNameMap = new java.util.HashMap(); - editorNameMap = new java.util.HashMap(); - //Parameter list. java.util.List nameAddedList = new java.util.ArrayList(); // alex:已经加到界面中去的参数名 if (parameters != null && parameters.length > 0) { for (int i = 0; i < parameters.length; i++) { ParameterProvider parameter = parameters[i]; - + // alex:已经在界面中的参数,不加了 if (nameAddedList.contains(parameter.getName())) { - continue; - } - if(parameter instanceof StoreProcedureParameter - && ((StoreProcedureParameter) parameter).getSchema() == StoreProcedureConstants.OUT) { - continue; - } + continue; + } + if (parameter instanceof StoreProcedureParameter + && ((StoreProcedureParameter) parameter).getSchema() == StoreProcedureConstants.OUT) { + continue; + } final Object pv = parameter.getValue(); Editor[] editors = makeEditorByValue(pv); @@ -100,135 +107,140 @@ public class ParameterInputPane extends BasicPane { editPane.setPreferredSize(new Dimension(180, editPane.getPreferredSize().height)); String parameterDisplayName = parameter.getName(); - if(StringUtils.isNotBlank(parameter.getName())) { - parameterDisplayName = parameter.getName(); + if (StringUtils.isNotBlank(parameter.getName())) { + parameterDisplayName = parameter.getName(); } contentPane.add(flowTableLayoutHelper.createLabelFlowPane(parameterDisplayName + ":", editPane)); //add editor to parameter hashtable. - initTextListener(textF); + initTextListener(textF); this.editorNameMap.put(textF, parameter.getName()); nameAddedList.add(parameter.getName()); } } + } + @Override + public void addNotify() { + super.addNotify(); + // windows 高DPI下,使用getPreferredSize必须在添加到容器之后,否则得到的数值不准确,因此先放到这调整大小 flowTableLayoutHelper.adjustLabelWidth(); } protected void initTextListener(ValueEditorPane textF) { - textF.getCurrentEditor().addChangeListener(new ChangeListener() { - @Override - public void stateChanged(ChangeEvent e) { - HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().fireTargetModified(); - } - }); - } - - private Editor[] makeEditorByValue(Object pv) { - Editor[] editors = {null}; - if (pv instanceof Integer) { - editors[0] = new IntegerEditor(); - } else if (pv instanceof Double || pv instanceof Float) { - editors[0] = new DoubleEditor(); - } else if (pv instanceof Float) { - editors[0] = new FloatEditor(); - } else if (pv instanceof Date) { - editors[0] = new DateEditor(true, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date")); - } else if (pv instanceof Boolean) { - editors[0] = new BooleanEditor(); - } else if (pv instanceof BaseFormula) { - editors = ValueEditorPaneFactory.basicEditors(); - } else { - editors[0] = new TextEditor(); - } - return editors; - } - + textF.getCurrentEditor().addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().fireTargetModified(); + } + }); + } + + private Editor[] makeEditorByValue(Object pv) { + Editor[] editors = {null}; + if (pv instanceof Integer) { + editors[0] = new IntegerEditor(); + } else if (pv instanceof Double || pv instanceof Float) { + editors[0] = new DoubleEditor(); + } else if (pv instanceof Float) { + editors[0] = new FloatEditor(); + } else if (pv instanceof Date) { + editors[0] = new DateEditor(true, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Date")); + } else if (pv instanceof Boolean) { + editors[0] = new BooleanEditor(); + } else if (pv instanceof BaseFormula) { + editors = ValueEditorPaneFactory.basicEditors(); + } else { + editors[0] = new TextEditor(); + } + return editors; + } + @Override protected String title4PopupWindow() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters"); + return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Parameters"); } /** * Update */ - public Map update() { - - java.util.Map nameValueMap = new java.util.HashMap(); - - Iterator> entryIt = this.editorNameMap.entrySet().iterator(); - while(entryIt.hasNext()) { - java.util.Map.Entry entry = entryIt.next(); - ValueEditorPane editor = entry.getKey(); - String parameterName = entry.getValue(); - - Object editorStringValue = editor.update(); - nameValueMap.put(parameterName, editorStringValue); - } - - return nameValueMap; + public Map update() { + + java.util.Map nameValueMap = new java.util.HashMap(); + + Iterator> entryIt = this.editorNameMap.entrySet().iterator(); + while (entryIt.hasNext()) { + java.util.Map.Entry entry = entryIt.next(); + ValueEditorPane editor = entry.getKey(); + String parameterName = entry.getValue(); + + Object editorStringValue = editor.update(); + nameValueMap.put(parameterName, editorStringValue); + } + + return nameValueMap; + } + + public void checkValid() throws Exception { + if (!allowBlank) { + boolean valid = true; + String error = ""; + Iterator> entryIt = this.editorNameMap.entrySet().iterator(); + while (entryIt.hasNext()) { + java.util.Map.Entry entry = entryIt.next(); + ValueEditorPane editor = entry.getKey(); + String parameterName = entry.getValue(); + Object editorStringValue = editor.update(); + if (editorStringValue == null || StringUtils.isEmpty(Utils.objectToString(editorStringValue))) { + valid = false; + error += parameterName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Not_Null_Des") + "\n"; + } + } + if (!valid) { + throw new Exception(error); + } + } } - public void checkValid() throws Exception { - if (!allowBlank) { - boolean valid = true; - String error = ""; - Iterator> entryIt = this.editorNameMap.entrySet().iterator(); - while (entryIt.hasNext()) { - java.util.Map.Entry entry = entryIt.next(); - ValueEditorPane editor = entry.getKey(); - String parameterName = entry.getValue(); - Object editorStringValue = editor.update(); - if (editorStringValue == null || StringUtils.isEmpty(Utils.objectToString(editorStringValue))) { - valid = false; - error += parameterName + com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Not_Null_Des") + "\n"; - } - } - if (!valid) { - throw new Exception(error); - } - } - } - /** * The class help to flowlayout components */ private static class FlowTableLayoutHelper { - private List labelList = new ArrayList(); + private List labelList = new ArrayList(); - public FlowTableLayoutHelper() { - } + public FlowTableLayoutHelper() { + } - public JPanel createLabelFlowPane(String text, JComponent comp) { - JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); + public JPanel createLabelFlowPane(String text, JComponent comp) { + JPanel centerPane = FRGUIPaneFactory.createNormalFlowInnerContainer_S_Pane(); - UILabel textLabel = new UILabel(text); - centerPane.add(textLabel); - textLabel.setHorizontalAlignment(SwingConstants.LEFT); + UILabel textLabel = new UILabel(text); + centerPane.add(textLabel); + textLabel.setHorizontalAlignment(SwingConstants.LEFT); - this.labelList.add(textLabel); - centerPane.add(comp); + this.labelList.add(textLabel); + centerPane.add(comp); - return centerPane; - } + return centerPane; + } - public void adjustLabelWidth() { - int maxWidth = 0; + public void adjustLabelWidth() { + int maxWidth = 0; - for (int i = 0; i < labelList.size(); i++) { - maxWidth = Math.max(maxWidth, labelList.get(i).getPreferredSize().width); - } + for (int i = 0; i < labelList.size(); i++) { + maxWidth = Math.max(maxWidth, labelList.get(i).getPreferredSize().width); + } - for (int i = 0; i < labelList.size(); i++) { - UILabel label = labelList.get(i); + for (int i = 0; i < labelList.size(); i++) { + UILabel label = labelList.get(i); - Dimension labelDim = new Dimension(maxWidth, label.getPreferredSize().height); + Dimension labelDim = new Dimension(maxWidth, label.getPreferredSize().height); - label.setPreferredSize(labelDim); - label.setSize(labelDim); - label.setMinimumSize(labelDim); - } - } + label.setPreferredSize(labelDim); + label.setSize(labelDim); + label.setMinimumSize(labelDim); + } + } } -} \ No newline at end of file +} diff --git a/designer-base/src/main/java/com/fr/design/style/FormatPane.java b/designer-base/src/main/java/com/fr/design/style/FormatPane.java index 255efe78c5..d1679561d7 100644 --- a/designer-base/src/main/java/com/fr/design/style/FormatPane.java +++ b/designer-base/src/main/java/com/fr/design/style/FormatPane.java @@ -45,7 +45,7 @@ import java.util.Date; */ public class FormatPane extends BasicPane { private static final long serialVersionUID = 724330854437726751L; - + private Format format; private UILabel sampleLabel; //preview label. private UIRadioButton nullRadioButton; @@ -59,14 +59,14 @@ public class FormatPane extends BasicPane { //content pane. private UITextField patternTextField = null; private JList patternList = null; - + /** * Constructor. */ public FormatPane() { this.initComponents(); } - + public UILabel getSampleLabel() { return sampleLabel; } @@ -74,7 +74,7 @@ public class FormatPane extends BasicPane { public void setSampleLabel(UILabel sampleLabel) { this.sampleLabel = sampleLabel; } - + protected void initComponents() { this.setLayout(FRGUIPaneFactory.createM_BorderLayout()); @@ -172,7 +172,7 @@ public class FormatPane extends BasicPane { protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Style"); } - + /** * Populate */ @@ -185,17 +185,17 @@ public class FormatPane extends BasicPane { } else { if (format instanceof DecimalFormat) { checkDecimalFormat(); - } else if (format instanceof SimpleDateFormat) { + } else if (format instanceof SimpleDateFormat) { //date and time - checkDateFormat(); - } else if (format instanceof TextFormat) { + checkDateFormat(); + } else if (format instanceof TextFormat) { //Text this.textRadioButton.setSelected(true); this.applyRadioActionListener(this.textRadioButton); } } } - + private void checkDateFormat() { String pattern = ((SimpleDateFormat) format).toPattern(); if(pattern == null) { @@ -276,7 +276,7 @@ public class FormatPane extends BasicPane { } } } - + /** * 百分比面板 */ @@ -296,7 +296,7 @@ public class FormatPane extends BasicPane { /** * 是否属于数组中的列表样式 - * + * * @param stringArray 格式数组 * @param pattern 输入的格式 * @return 返回在数组中的位置 @@ -323,7 +323,7 @@ public class FormatPane extends BasicPane { } return FormatField.getInstance().getFormat(getFormatContents(), text); } - + private int getFormatContents(){ if (nullRadioButton.isSelected()) return FormatContents.NULL; @@ -335,7 +335,7 @@ public class FormatPane extends BasicPane { return FormatContents.PERCENT; else if (scientificRadioButton.isSelected()) return FormatContents.SCIENTIFIC; - else if (dateRadioButton.isSelected()) + else if (dateRadioButton.isSelected()) return FormatContents.DATE; else if (timeRadioButton.isSelected()) return FormatContents.TIME; @@ -380,7 +380,7 @@ public class FormatPane extends BasicPane { ActionEvent evt = new ActionEvent(radioButton, 100, ""); this.radioActionListener.actionPerformed(evt); } - + /** * Radio selection listener. */ @@ -393,6 +393,7 @@ public class FormatPane extends BasicPane { patternTextField.setEditable(true); patternList.setEnabled(true); + int contents = getContents(source); String[] patternArray = FormatField.getInstance().getFormatArray(contents); @@ -407,6 +408,7 @@ public class FormatPane extends BasicPane { //maybe need to select the first item. String text = patternTextField.getText(); + if (hasPattenText(text, patternModel)) { String pattern = null; if (format instanceof DecimalFormat) { @@ -418,6 +420,10 @@ public class FormatPane extends BasicPane { if (pattern != null) { patternList.setSelectedValue(pattern, true); + if (patternList.getSelectedIndex() == -1) { + //patten不在下拉框里面 + patternList.setSelectedIndex(0); + } } else { patternList.setSelectedIndex(0); } @@ -426,13 +432,13 @@ public class FormatPane extends BasicPane { }; private boolean hasPattenText (String text, DefaultListModel patternModel) { - return (text == null || text.length() <= 0) && patternModel.size() > 0; + return StringUtils.isEmpty(text) && patternModel.size() > 0; } - + private void setPatternTextEnable() { patternTextField.setEnabled(false); patternTextField.setEditable(false); - patternTextField.setText(""); + patternTextField.setText(StringUtils.EMPTY); patternList.setEnabled(false); } @@ -459,7 +465,7 @@ public class FormatPane extends BasicPane { } return contents; } - + /** * text pattern document listener. */ @@ -477,7 +483,7 @@ public class FormatPane extends BasicPane { refreshPreviewLabel(); } }; - + /** * Pattern list selection listener. */ @@ -487,5 +493,5 @@ public class FormatPane extends BasicPane { patternTextField.setText((String) patternList.getSelectedValue()); } }; - + } diff --git a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java index 6e3e688c8b..4f291c6398 100644 --- a/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java +++ b/designer-base/src/main/java/com/fr/design/style/color/NewColorSelectBox.java @@ -30,23 +30,27 @@ public class NewColorSelectBox extends AbstractSelectBox implements UIObs iniListener(); } - private void iniListener(){ + protected void iniListener(){ if(shouldResponseChangeListener()){ this.addSelectChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - if(uiObserverListener == null){ - return; - } - if (globalNameListener != null && shouldResponseNameListener()){ - globalNameListener.setGlobalName(newColorSelectBoxName); - } - uiObserverListener.doChange(); + attributeChange(); } }); } } + protected void attributeChange() { + if(uiObserverListener == null){ + return; + } + if (globalNameListener != null && shouldResponseNameListener()){ + globalNameListener.setGlobalName(newColorSelectBoxName); + } + uiObserverListener.doChange(); + } + /** * 初始化下拉面板 * @param preferredWidth 面板大小 diff --git a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java b/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java deleted file mode 100644 index 48c151488a..0000000000 --- a/designer-base/src/main/java/com/fr/design/update/factory/DirectoryOperationFactory.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.fr.design.update.factory; - -import com.fr.log.FineLoggerFactory; -import com.fr.stable.ArrayUtils; -import com.fr.stable.StableUtils; - -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Arrays; - -/** - * Created by XINZAI on 2018/8/21. - */ -public class DirectoryOperationFactory { - /** - * 新建一个目录 - * - * @param dirPath 目录路径 - */ - public static void createNewDirectory(String dirPath) { - try { - File newDirPath = new File(dirPath); - if (!newDirPath.exists()) { - StableUtils.mkdirs(newDirPath); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - - /** - * 删除目录 - * - * @param dirPath 目录路径 - */ - public static void deleteDirectory(String dirPath) { - try { - File dir = new File(dirPath); - if (dir.isDirectory()) { - File[] file = dir.listFiles(); - for (File fileTemp : file) { - deleteDirectory(fileTemp.toString()); - fileTemp.delete(); - } - } else { - dir.delete(); - } - dir.delete(); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - - /** - * 复制目录 - * - * @param oldDirPath 被复制目录 - * @param newDirPath 新目录 - */ - public static void copyDirectory(String oldDirPath, String newDirPath) { - File oldDir = new File(oldDirPath); - if (oldDir.isDirectory()) { - StableUtils.mkdirs(new File(newDirPath)); - File[] files = oldDir.listFiles(); - for (File fileTemp : files) { - copyDirectory(fileTemp.toString(), newDirPath + "/" + fileTemp.getName()); - } - } else { - try { - copy(oldDirPath, newDirPath); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - } - - private static void copy(String path1, String path2) throws IOException { - try (DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(path1))); - DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(path2)))) { - byte[] date = new byte[in.available()]; - in.read(date); - out.write(date); - } - } - - /** - * 移动目录 - * - * @param oldDirPath 被移动目录 - * @param newDirPath 新目录 - */ - public static void moveDirectory(String oldDirPath, String newDirPath) { - copyDirectory(oldDirPath, newDirPath); - deleteDirectory(oldDirPath); - } - - /** - * 列出过滤后的文件 - * - * @param installHome 安装目录 - * @param backupdir 备份目录 - * @return String数组 - */ - public static String[] listFilteredFiles(String installHome, String backupdir) { - File backupDir = new File(StableUtils.pathJoin(installHome, backupdir)); - StableUtils.mkdirs(backupDir); - File[] fileNames = backupDir.listFiles(new FileFilter() { - @Override - public boolean accept(File pathname) { - return pathname.isDirectory(); - } - }); - String[] jarFileName = new String[fileNames.length]; - int j = 0; - for (File fileName : fileNames) { - if ((fileName.isDirectory()) && (ArrayUtils.getLength(fileName.listFiles()) > 0)) {//判断备份文件夹中是否为空,为空不显示 - jarFileName[j++] = fileName.getName(); - } - } - return Arrays.copyOf(jarFileName, j); - } -} diff --git a/designer-base/src/main/java/com/fr/design/update/factory/UpdateFileFactory.java b/designer-base/src/main/java/com/fr/design/update/factory/UpdateFileFactory.java new file mode 100644 index 0000000000..cf992fe08b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/update/factory/UpdateFileFactory.java @@ -0,0 +1,50 @@ +package com.fr.design.update.factory; + +import com.fr.decision.update.data.UpdateConstants; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StableUtils; + +import java.io.File;; + +/** + * @author Bryant + * @version 10.0 + * Created by Bryant on 2020-09-29 + */ +public class UpdateFileFactory { + + private UpdateFileFactory() { + } + + public static File[] getBackupVersions() { + File[] versions = null; + try { + File backupDir = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR)); + StableUtils.mkdirs(backupDir); + versions = backupDir.listFiles(); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return versions; + } + + public static boolean isBackupVersionsValid(String version) { + boolean designerValid = false; + boolean envValid = false; + try { + File designerLib = new File(StableUtils.pathJoin(version, UpdateConstants.DESIGNERBACKUPPATH)); + File[] jars = designerLib.listFiles(); + if (jars != null && jars.length > 0) { + designerValid = true; + } + File envLib = new File(StableUtils.pathJoin(version, UpdateConstants.BACKUPPATH)); + jars = envLib.listFiles(); + if (jars != null && jars.length > 0) { + envValid = true; + } + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return designerValid && envValid; + } +} diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java index 8ffe8d4a41..69f3f61604 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java @@ -4,7 +4,7 @@ import com.fr.decision.update.data.UpdateConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.update.factory.DirectoryOperationFactory; +import com.fr.design.update.utils.UpdateFileUtils; import com.fr.design.update.ui.widget.ColorfulCellRender; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.stable.ArrayUtils; @@ -86,7 +86,7 @@ public class RestoreDialog extends JDialog { JPanel jarListPane = new JPanel(); jarListPane.setLayout(new BoxLayout(jarListPane, BoxLayout.Y_AXIS)); - String[] jarBackupFiles = DirectoryOperationFactory.listFilteredFiles(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR); + String[] jarBackupFiles = UpdateFileUtils.listBackupVersions(); ArrayUtils.reverse(jarBackupFiles); String[] jarFilesList = ((jarBackupFiles.length < NUMOFCELL_LEAST) ? Arrays.copyOf(jarBackupFiles, NUMOFCELL_LEAST) : jarBackupFiles); diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 3992be6a91..3c91ebf145 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -17,7 +17,7 @@ import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.update.actions.FileProcess; import com.fr.design.update.domain.UpdateInfoCachePropertyManager; -import com.fr.design.update.factory.DirectoryOperationFactory; +import com.fr.design.update.utils.UpdateFileUtils; import com.fr.design.update.ui.widget.LoadingLabel; import com.fr.design.update.ui.widget.UpdateActionLabel; import com.fr.design.update.ui.widget.UpdateInfoTable; @@ -320,7 +320,7 @@ public class UpdateMainDialog extends UIDialog { } }); //choose RestoreLabel to show - boolean isNeedRestore = ArrayUtils.isNotEmpty(DirectoryOperationFactory.listFilteredFiles(StableUtils.getInstallHome(), getBackupDirectory())); + boolean isNeedRestore = ArrayUtils.isNotEmpty(UpdateFileUtils.listBackupVersions()); jarRestoreLabel = isNeedRestore ? jarRestorePreviousRevision : noJarPreviousRevision; } @@ -544,7 +544,7 @@ public class UpdateMainDialog extends UIDialog { private void showDownLoadInfo() { //形如 Build#release-2018.07.31.03.03.52.80 String buildNO = downloadFileConfig.optString("buildNO"); - Date jarDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); + Date jarDate = (new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss")).parse(buildNO, new ParsePosition(buildNO.indexOf("-") + 1)); String serverVersionNO = downloadFileConfig.optString("versionNO"); String currentVersionNO = ProductConstants.RELEASE_VERSION; String[] serverVersionSplitStr = serverVersionNO.split("\\."); @@ -556,8 +556,8 @@ public class UpdateMainDialog extends UIDialog { //形如 Build#release-2018.07.31.03.03.52.80 String currentNO = GeneralUtils.readBuildNO(); if (!".".equals(StableUtils.getInstallHome())) { - Date currentDate = (new SimpleDateFormat("yyyy.MM.dd")).parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); - if (DateUtils.subtractDate(jarDate, currentDate, DateUtils.DAY) > 0) { + Date currentDate = (new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss")).parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (DateUtils.subtractDate(jarDate, currentDate, DateUtils.SECOND) > 0) { updateButton.setEnabled(true); updateLabel.setVisible(true); loadingLabel.stopLoading(buildNO.contains("-") ? buildNO.substring(buildNO.lastIndexOf("-") + 1) : buildNO); diff --git a/designer-base/src/main/java/com/fr/design/update/utils/UpdateFileUtils.java b/designer-base/src/main/java/com/fr/design/update/utils/UpdateFileUtils.java new file mode 100644 index 0000000000..7a3c0a2a8a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/update/utils/UpdateFileUtils.java @@ -0,0 +1,36 @@ +package com.fr.design.update.utils; + +import com.fr.design.update.factory.UpdateFileFactory; +import com.fr.stable.StableUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Bryant + * @version 10.0 + * Created by Bryant on 2020-09-25 + */ +public class UpdateFileUtils { + /** + * 列出过滤后的文件 + * + * @return String数组 + */ + public static String[] listBackupVersions() { + File[] versionBackup = UpdateFileFactory.getBackupVersions(); + List versions = new ArrayList<>(); + if (versionBackup != null) { + for (File file : versionBackup) { + if (UpdateFileFactory.isBackupVersionsValid(file.getAbsolutePath())) { + versions.add(file.getName()); + } else { + StableUtils.deleteFile(file); + } + } + } + String[] result = new String[versions.size()]; + return versions.toArray(result); + } +} diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 4febad3a99..2aaa9556bc 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -10,6 +10,7 @@ import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; +import com.fr.general.GeneralContext; import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; import com.fr.workspace.Workspace; @@ -17,6 +18,7 @@ import com.fr.workspace.WorkspaceEvent; import javax.swing.*; import java.io.File; +import java.util.Locale; /** * @author richie @@ -27,6 +29,7 @@ public class UpmFinder { private static final String UPM_DIR = "/upm"; private static final String MAIN_RESOURCE_PATH = UPM_DIR + "/plugin_design.html"; + private static final String JXBROWSER = "com.teamdev.jxbrowser.chromium.Browser"; public static String installHome = FRContext.getCommonOperator().getWebRootPath(); @@ -56,39 +59,49 @@ public class UpmFinder { } public static void showUPMDialog() { - boolean flag = true; + boolean hasJxBrowser = true; try { - Class.forName("com.teamdev.jxbrowser.chromium.Browser"); + Class.forName(JXBROWSER); } catch (ClassNotFoundException e) { - flag = false; + hasJxBrowser = false; } - if (flag) { - if (!checkUPMResourcesExist()){ - // upm下载 - int val = FineJOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"), - Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); - if (val == JOptionPane.OK_OPTION){ - try { - UpmResourceLoader.INSTANCE.download(); - UpmResourceLoader.INSTANCE.install(); - FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), - Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); - } catch (Exception e){ - FineLoggerFactory.getLogger().error(e.getMessage(), e); - FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Updater_Download_Failed"), - Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); - } + if (hasJxBrowser) { + showUpmPane(); + } else { + showUpdatePane(); + } + } + + private static void showUpmPane() { + if (!checkUPMResourcesExist()){ + // upm下载 + int val = FineJOptionPane.showConfirmDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"), + Toolkit.i18nText("Fine-Design_Basic_Confirm"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE); + if (val == JOptionPane.OK_OPTION){ + try { + UpmResourceLoader.INSTANCE.download(); + UpmResourceLoader.INSTANCE.install(); + FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), + Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); + } catch (Exception e){ + FineLoggerFactory.getLogger().error(e.getMessage(), e); + FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Updater_Download_Failed"), + Toolkit.i18nText("Fine-Design_Basic_Message"), JOptionPane.INFORMATION_MESSAGE); } } - else { - UpmShowPane upmPane = new UpmShowPane(); - if (dialog == null) { - dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); - } - dialog.setVisible(true); + } + else { + UpmShowPane upmPane = new UpmShowPane(); + if (dialog == null) { + dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); } - } else { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); + dialog.setVisible(true); + } + } + + private static void showUpdatePane() { + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); + if (!GeneralContext.getLocale().equals(Locale.JAPAN)) { UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); dialog.setAutoUpdateAfterInit(); dialog.showDialog(); 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 2bf64642f2..775118d285 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 @@ -8,6 +8,7 @@ import com.fr.design.ExtraDesignClassManager; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.fun.DesignerEnvProcessor; import com.fr.design.gui.UILookAndFeel; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.exit.DesignerExiter; import com.fr.file.FileFILE; @@ -19,10 +20,12 @@ import com.fr.stable.ArrayUtils; import com.fr.stable.CommonCodeUtils; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.os.OperatingSystem; import com.fr.start.ServerStarter; +import com.fr.value.NotNullLazyValue; import com.fr.workspace.WorkContext; +import org.jetbrains.annotations.NotNull; -import javax.swing.JOptionPane; import javax.swing.SwingUtilities; import javax.swing.UIManager; import java.awt.Desktop; @@ -31,7 +34,6 @@ import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; @@ -83,6 +85,7 @@ public class DesignUtils { /** * 判断设计器端口是否被其他程序占用 * 尝试去通信,无回应就是其他程序占用端口,否则需要继续判断是否为设计器进程未关闭 + * * @return */ public static boolean isPortOccupied() { @@ -153,7 +156,7 @@ public class DesignUtils { return; } try (Socket socket = new Socket("localhost", port)) { - clientSend(lines, socket); + clientSend(lines, socket); } catch (Exception ignore) { } @@ -189,10 +192,10 @@ public class DesignUtils { DesignerEnvManager.getEnvManager().setCurrentEnv2Default(); ServerStarter.browserDemoURL(); } else if ("check".equals(line)) { - clientSend(new String[] {"response"}, socket); + clientSend(new String[]{"response"}, socket); } else if ("end".equals(line)) { - DesignerExiter.getInstance().execute(); } - else if (StringUtils.isNotEmpty(line)) { + DesignerExiter.getInstance().execute(); + } else if (StringUtils.isNotEmpty(line)) { File f = new File(line); String path = f.getAbsolutePath(); @@ -219,7 +222,7 @@ public class DesignUtils { } - public static void responseToClient(Socket socket) { + public static void responseToClient(Socket socket) { try (OutputStream outputStream = socket.getOutputStream()) { outputStream.write("reponse".getBytes(StandardCharsets.UTF_8)); outputStream.flush(); @@ -248,6 +251,7 @@ public class DesignUtils { // 刷新DesignerFrame里面的面板 SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { if (DesignerContext.getDesignerFrame() == null) { return; @@ -269,7 +273,7 @@ public class DesignUtils { FineLoggerFactory.getLogger().error("Substance Raven Graphite failed to initialize"); } //获取当前系统语言下设计器用的默认字体 - FRFont guiFRFont = getCurrentLocaleFont(); + FRFont guiFRFont = getDefaultGUIFont(); //指定UIManager中字体 Enumeration keys = UIManager.getDefaults().keys(); while (keys.hasMoreElements()) { @@ -285,35 +289,51 @@ public class DesignUtils { return key.startsWith("TextField.") || key.startsWith("PasswordField."); } - private static FRFont getCurrentLocaleFont() { - FRFont guiFRFont; - Locale defaultLocale = Locale.getDefault(); + /** + * 获取当前系统语言下设计器界面使用的默认字体 + * + * @return 默认字体 + */ + public static FRFont getDefaultGUIFont() { + return CURRENT_LOCALE_FONT.getValue(); + } - if (isDisplaySimSun(defaultLocale)) { - guiFRFont = getNamedFont("SimSun"); - } else { - guiFRFont = getNamedFont("Dialog"); - } + /** + * 获取当前系统语言下设计器用的默认字体 + */ + private static final NotNullLazyValue CURRENT_LOCALE_FONT = new NotNullLazyValue() { + @NotNull + @Override + protected FRFont compute() { + FRFont guiFRFont; + Locale defaultLocale = Locale.getDefault(); + // JDK9 之后宋体在计算label中字母的空间上出现问题,暂时先用雅黑兼容,以后再统一字体 + if (StableUtils.getMajorJavaVersion() >= 9 && OperatingSystem.isWindows()) { + guiFRFont = getNamedFont("Microsoft YaHei"); + } else if (isDisplaySimSun(defaultLocale)) { + guiFRFont = getNamedFont("SimSun"); + } else { + guiFRFont = getNamedFont("Dialog"); + } - //先初始化的设计器locale, 后初始化lookandfeel.如果顺序改了, 这边也要调整. - Locale designerLocale = GeneralContext.getLocale(); - String file = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_File"); - char displayChar = file.charAt(0); - if (!guiFRFont.canDisplay(displayChar)) { - //如果不能用默认的语言显示字体, 比如想在英文系统里用中文设计器 - //默认语言(中文:宋体, 英文:Tahoma, 其他:Dialog) - guiFRFont = getNamedFont("SimSun"); + String file = Toolkit.i18nText("Fine-Design_Basic_File"); + char displayChar = file.charAt(0); if (!guiFRFont.canDisplay(displayChar)) { - //比如想在中文或英文系统里用韩文设计器 - guiFRFont = getNamedFont("Dialog"); + //如果不能用默认的语言显示字体, 比如想在英文系统里用中文设计器 + //默认语言(中文:宋体, 英文:Tahoma, 其他:Dialog) + guiFRFont = getNamedFont("SimSun"); if (!guiFRFont.canDisplay(displayChar)) { - FineLoggerFactory.getLogger().error(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Base_SimSun_Not_Found")); + //比如想在中文或英文系统里用韩文设计器 + guiFRFont = getNamedFont("Dialog"); + if (!guiFRFont.canDisplay(displayChar)) { + FineLoggerFactory.getLogger().error(Toolkit.i18nText("Fine-Design_Basic_Base_SimSun_Not_Found")); + } } } - } - return guiFRFont; - } + return guiFRFont; + } + }; private static FRFont getNamedFont(String name) { return FRFont.getInstance(name, Font.PLAIN, 12); diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 12c72c5cd3..ef66fc039a 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -4,6 +4,7 @@ import com.fr.base.BaseUtils; import com.fr.base.GraphHelper; import com.fr.base.Icon; import com.fr.base.IconManager; +import com.fr.design.designer.IntervalConstants; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.dialog.FineJOptionPane; @@ -401,9 +402,8 @@ public class CustomIconPane extends BasicPane { private void init() { this.setLayout(FRGUIPaneFactory.createBorderLayout()); double p = TableLayout.PREFERRED; - double rowSize[] = {p, p}; - double columnSize[] = {p, p, p}; - + double[] rowSize = {p, p}; + double[] columnSize = {p, p}; UIButton browseButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Custom_Icon_SelectIcon")); browseButton.setPreferredSize(new Dimension(80, 25)); browseButton.setToolTipText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Click_this_button")); diff --git a/designer-base/src/main/java/com/fr/env/EnvListPane.java b/designer-base/src/main/java/com/fr/env/EnvListPane.java index 911a7b22f8..2d875cb458 100644 --- a/designer-base/src/main/java/com/fr/env/EnvListPane.java +++ b/designer-base/src/main/java/com/fr/env/EnvListPane.java @@ -3,6 +3,7 @@ package com.fr.env; import com.fr.design.DesignerEnvManager; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.env.DesignerWorkspaceInfo; +import com.fr.design.env.DesignerWorkspaceType; import com.fr.design.env.LocalDesignerWorkspaceInfo; import com.fr.design.env.RemoteDesignerWorkspaceInfo; import com.fr.design.gui.controlpane.JListControlPane; @@ -17,8 +18,10 @@ import com.fr.stable.core.PropertyChangeAdapter; import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; /** * @author yaohwu @@ -98,11 +101,30 @@ public class EnvListPane extends JListControlPane { DesignerEnvManager mgr = DesignerEnvManager.getEnvManager(); //这里代码时序换一下,因为update中需要借助mgr来获取提醒时间,已确认mgr对res无依赖 Nameable[] res = this.update(); + Set set = findNewWorkSpaceInfo(res); mgr.clearAllEnv(); for (Nameable re : res) { NameObject nameObject = (NameObject) re; - mgr.putEnv(nameObject.getName(), (DesignerWorkspaceInfo) nameObject.getObject()); + DesignerWorkspaceInfo info = (DesignerWorkspaceInfo) nameObject.getObject(); + if (set.contains(re) && info.getType() == DesignerWorkspaceType.Remote) { + RemoteDesignerWorkspaceInfo newInfo = (RemoteDesignerWorkspaceInfo) info; + newInfo.setNewCreated(true); + mgr.putEnv(nameObject.getName(), newInfo); + } else { + mgr.putEnv(nameObject.getName(), info); + } } return this.getSelectedName(); } + + private Set findNewWorkSpaceInfo(Nameable[] res) { + Set set = new HashSet<>(); + for (Nameable val : res) { + NameObject nameObject = (NameObject) val; + if (DesignerEnvManager.getEnvManager().getWorkspaceInfo(nameObject.getName()) == null) { + set.add(val); + } + } + return set; + } } diff --git a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java index bc32385b7c..5257e74f42 100644 --- a/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java +++ b/designer-base/src/main/java/com/fr/env/RemoteEnvPane.java @@ -1,7 +1,5 @@ package com.fr.env; -import com.fr.base.FRContext; -import com.fr.base.ServerConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; @@ -13,6 +11,7 @@ import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.ipasswordfield.UIPassWordField; +import com.fr.design.gui.ipasswordfield.UIPasswordFieldWithFixedLength; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; @@ -26,7 +25,17 @@ import com.fr.workspace.WorkContext; import com.fr.workspace.connect.WorkspaceConnectionInfo; import com.fr.workspace.engine.exception.WorkspaceAuthException; -import javax.swing.*; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JDialog; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.JTextPane; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.SwingWorker; +import javax.swing.ToolTipManager; +import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; @@ -96,7 +105,7 @@ public class RemoteEnvPane extends BasicBeanPane { /** * 密码 */ - private UIPassWordField passwordInput = new UIPassWordField(); + private UIPassWordField passwordInput = new UIPasswordFieldWithFixedLength(); /** * 是否记住密码 */ @@ -108,7 +117,7 @@ public class RemoteEnvPane extends BasicBeanPane { /** * https密钥 */ - private UIPassWordField certSecretKeyInput = new UIPassWordField(); + private UIPassWordField certSecretKeyInput = new UIPasswordFieldWithFixedLength(); /** * 选择证书文件按钮 */ @@ -134,6 +143,12 @@ public class RemoteEnvPane extends BasicBeanPane { * https 证书路径输入框 */ private JPanel httpsCertFileInputPanel; + + /** + * 当前远程工作目录是否为新创建的 + */ + private boolean newCreated; + /** * 主机名,web应用,Servlet,端口监听器 */ @@ -318,12 +333,15 @@ public class RemoteEnvPane extends BasicBeanPane { this.certPathInput.setText(certPath); this.certSecretKeyInput.setText(certSecretKey); this.rememberPwdCheckbox.setSelected(rememberPwd); - + this.newCreated = ob.isNewCreated(); } else { this.remoteWorkspaceURL = RemoteWorkspaceURL.createDefaultURL(); this.usernameInput.setText(StringUtils.EMPTY); this.passwordInput.setText(StringUtils.EMPTY); + this.certPathInput.setText(StringUtils.EMPTY); + this.certSecretKeyInput.setText(StringUtils.EMPTY); this.rememberPwdCheckbox.setSelected(true); + this.newCreated = true; } fillRemoteEnvURLField(); @@ -355,7 +373,9 @@ public class RemoteEnvPane extends BasicBeanPane { new String(this.certSecretKeyInput.getPassword()), rememberPwd); - return RemoteDesignerWorkspaceInfo.create(connection); + RemoteDesignerWorkspaceInfo info = RemoteDesignerWorkspaceInfo.create(connection); + info.setNewCreated(newCreated); + return info; } @Override @@ -433,38 +453,6 @@ public class RemoteEnvPane extends BasicBeanPane { new double[]{FILL} )); - setDefaultAppAndServlet(); - } - - /** - * 设置 app 和 servlet 默认值 - */ - private void setDefaultAppAndServlet() { - setWrap(webAppNameInput, () -> FRContext.getCommonOperator().getAppName(), RemoteWorkspaceURL.DEFAULT_WEB_APP_NAME); - setWrap(servletNameInput, () -> ServerConfig.getInstance().getServletName(), RemoteWorkspaceURL.DEFAULT_SERVLET_NAME); - } - - private void setWrap(final UITextField textField, final Supplier supplier, final String defaultName) { - new SwingWorker() { - - @Override - protected String doInBackground() throws Exception { - return supplier.get(); - } - - @Override - protected void done() { - String name = defaultName; - try { - name = get(); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage() , e); - } - if (StringUtils.isEmpty(textField.getText())) { - textField.setText(name); - } - } - }.execute(); } @@ -588,9 +576,6 @@ public class RemoteEnvPane extends BasicBeanPane { @Override protected TestConnectionResult doInBackground() throws Exception { - - DesignerEnvManager.getEnvManager().setCertificatePath(connection.getCertPath()); - DesignerEnvManager.getEnvManager().setCertificatePass(connection.getCertSecretKey()); try { return TestConnectionResult.parse(WorkContext.getConnector().testConnection(connection), connection); } catch (WorkspaceAuthException ignored) { diff --git a/designer-base/src/main/java/com/fr/start/BaseDesigner.java b/designer-base/src/main/java/com/fr/start/BaseDesigner.java index 1469dd32ec..7808bd7ecd 100644 --- a/designer-base/src/main/java/com/fr/start/BaseDesigner.java +++ b/designer-base/src/main/java/com/fr/start/BaseDesigner.java @@ -64,14 +64,11 @@ public abstract class BaseDesigner extends ToolBarMenuDock { @Override public void on(Event event, Null param) { EventDispatcher.stopListen(this); - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { + UIUtil.invokeLaterIfNeeded(() -> { - // 打开上次的文件 - showDesignerFrame(false); - DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); - } + // 打开上次的文件 + showDesignerFrame(false); + DesignerLaunchStatus.setStatus(DesignerLaunchStatus.OPEN_LAST_FILE_COMPLETE); }); } }); @@ -90,12 +87,7 @@ public abstract class BaseDesigner extends ToolBarMenuDock { } public void show() { - UIUtil.invokeLaterIfNeeded(new Runnable() { - @Override - public void run() { - refreshTemplateTree(); - } - }); + UIUtil.invokeLaterIfNeeded(this::refreshTemplateTree); } private void refreshTemplateTree() { diff --git a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java index 7e95c48d27..f8f7a13ea2 100644 --- a/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java +++ b/designer-base/src/main/java/com/fr/start/server/FineEmbedServerMonitor.java @@ -32,7 +32,7 @@ public class FineEmbedServerMonitor { */ private static final int STEP_HEARTBEAT = 40; private static volatile FineEmbedServerMonitor monitor; - private static ProgressDialog progressBar = DesignerContext.getDesignerFrame().getProgressDialog(); + private static ProgressDialog progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame()); //由于默认值的字体不支持韩文,所以要对韩文单独生成字体 private FRFont font = null; private static final int FONT_RGB = 333334; @@ -47,7 +47,7 @@ public class FineEmbedServerMonitor { @Override public void on(Event event, Null aNull) { getInstance().reset(); - DesignerContext.getDesignerFrame().hideProgressDialog(); + progressDialog.dispose(); } }); } @@ -64,7 +64,7 @@ public class FineEmbedServerMonitor { } public int getProgress() { - if (progress == progressBar.getProgressMaximum()) { + if (progress == progressDialog.getProgressMaximum()) { return progress; } else { progress += STEP; @@ -73,7 +73,7 @@ public class FineEmbedServerMonitor { } public void setComplete() { - this.progress = progressBar.getProgressMaximum(); + this.progress = progressDialog.getProgressMaximum(); } public void reset() { @@ -81,7 +81,7 @@ public class FineEmbedServerMonitor { } public boolean isComplete() { - return this.progress >= progressBar.getProgressMaximum(); + return this.progress >= progressDialog.getProgressMaximum(); } public void monitor() { @@ -92,11 +92,12 @@ public class FineEmbedServerMonitor { public void run() { if (isComplete()) { scheduler.shutdown(); - DesignerContext.getDesignerFrame().hideProgressDialog(); + progressDialog.dispose(); return; } - if (!DesignerContext.getDesignerFrame().getProgressDialog().isVisible()) { - DesignerContext.getDesignerFrame().showProgressDialog(); + if (!progressDialog.isVisible()) { + progressDialog = new ProgressDialog(DesignerContext.getDesignerFrame()); + progressDialog.setVisible(true); //如果为韩文则改变字体 LocaleCenter.buildAction(new LocaleAction() { @Override @@ -105,9 +106,9 @@ public class FineEmbedServerMonitor { } }, SupportLocaleImpl.SUPPORT_KOREA); String text = Toolkit.i18nText("Fine-Design_Basic_Loading_Embed_Server"); - DesignerContext.getDesignerFrame().getProgressDialog().updateLoadingText(text, font); + progressDialog.updateLoadingText(text, font); } - DesignerContext.getDesignerFrame().updateProgress(getProgress()); + progressDialog.setProgressValue(getProgress()); } }, 0, STEP_HEARTBEAT, TimeUnit.MILLISECONDS); diff --git a/designer-base/src/main/java/com/fr/start/server/ServerTray.java b/designer-base/src/main/java/com/fr/start/server/ServerTray.java index 2b3713c0f7..4ad6e15b49 100644 --- a/designer-base/src/main/java/com/fr/start/server/ServerTray.java +++ b/designer-base/src/main/java/com/fr/start/server/ServerTray.java @@ -29,9 +29,9 @@ public class ServerTray { private MenuItem stopMenu; - private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted.png"); + private Image trayStartedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStarted@2x.png"); - private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped.png"); + private Image trayStoppedImage = BaseUtils.readImage("/com/fr/base/images/oem/trayStopped@2x.png"); private ServerManageFrame serverManageFrame; @@ -188,4 +188,4 @@ public class ServerTray { } }); } -} \ No newline at end of file +} diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png new file mode 100644 index 0000000000..3a22b64a60 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ja_JP.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png new file mode 100644 index 0000000000..3041f446bb Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_ko_KR.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/images/reportcolumns/col.png rename to designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh.png diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png new file mode 100644 index 0000000000..1ce2bb297b Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/col_zh_TW.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png new file mode 100644 index 0000000000..83480d4295 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ja_JP.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png new file mode 100644 index 0000000000..e10509a1f3 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_ko_KR.png differ diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh.png similarity index 100% rename from designer-base/src/main/resources/com/fr/design/images/reportcolumns/row.png rename to designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh.png diff --git a/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png new file mode 100644 index 0000000000..935d1059d5 Binary files /dev/null and b/designer-base/src/main/resources/com/fr/design/images/reportcolumns/row_zh_TW.png differ diff --git a/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java b/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java index b7d123d66e..f60d6da291 100644 --- a/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java +++ b/designer-base/src/test/java/com/fr/design/DesignerEnvManagerTest.java @@ -3,6 +3,7 @@ package com.fr.design; import junit.framework.TestCase; import java.util.Locale; +import org.junit.Assert; public class DesignerEnvManagerTest extends TestCase{ @@ -17,4 +18,11 @@ public class DesignerEnvManagerTest extends TestCase{ assertEquals("下边界", envManager.getLanguage(), Locale.SIMPLIFIED_CHINESE); } + + public void testGetUUID() { + DesignerEnvManager envManager = new DesignerEnvManager(); + String uuid0 = envManager.getUUID(); + String uuid1 = envManager.getUUID(); + Assert.assertEquals(uuid0, uuid1); + } } diff --git a/designer-base/src/test/java/com/fr/design/data/datapane/TableDataPaneListPaneTest.java b/designer-base/src/test/java/com/fr/design/data/datapane/TableDataPaneListPaneTest.java new file mode 100644 index 0000000000..dd5e5bc5ce --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/data/datapane/TableDataPaneListPaneTest.java @@ -0,0 +1,26 @@ +package com.fr.design.data.datapane; + +import org.junit.Test; + +import java.util.Map; + +import static org.junit.Assert.*; + +/** + * @author Yyming + * @version 10.0 + * Created by Yyming on 2020/9/29 + */ +public class TableDataPaneListPaneTest { + + @Test + public void rename() { + TableDataPaneListPane listPane = new TableDataPaneListPane(); + listPane.rename("111", "222"); + listPane.rename("222", "333"); + Map dsNameChangedMap = listPane.getDsNameChangedMap(); + assertEquals(1, dsNameChangedMap.size()); + listPane.rename("333","111"); + assertEquals(0, dsNameChangedMap.size()); + } +} \ No newline at end of file diff --git a/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java index 54dbae3b02..d6e89cd93f 100644 --- a/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java +++ b/designer-base/src/test/java/com/fr/design/env/RemoteDesignerWorkspaceInfoTest.java @@ -1,9 +1,16 @@ package com.fr.design.env; +import com.fr.invoke.Reflect; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReaderHelper; +import com.fr.stable.xml.XMLableReader; import com.fr.workspace.connect.WorkspaceConnectionInfo; import junit.framework.TestCase; import org.junit.Assert; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + /** * @author hades * @version 10.0 @@ -22,4 +29,64 @@ public class RemoteDesignerWorkspaceInfoTest extends TestCase { Assert.assertFalse(workspaceInfo3.checkValid()); } + public void testReadXml() { + String xml0 = ""; + String xml1 = ""; + byte[] bytes0 = xml0.getBytes(); + byte[] bytes1 = xml1.getBytes(); + RemoteDesignerWorkspaceInfo info = new RemoteDesignerWorkspaceInfo(); + ByteArrayInputStream in0 = new ByteArrayInputStream(bytes0); + ByteArrayInputStream in1 = new ByteArrayInputStream(bytes1); + + try { + XMLableReader reader0 = XMLReaderHelper.createXMLableReader(in0, XMLPrintWriter.XML_ENCODER); + Reflect.on(reader0).set("state", 1); + info.setNewCreated(true); + info.readXML(reader0); + Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey()); + + XMLableReader reader1 = XMLReaderHelper.createXMLableReader(in1, XMLPrintWriter.XML_ENCODER); + Reflect.on(reader1).set("state", 1); + info.setNewCreated(false); + info.readXML(reader1); + Assert.assertEquals("xxxxxxx", info.getConnection().getCertSecretKey()); + } catch (Exception ignore) { + + } + } + + public void testWriteXml() { + ByteArrayOutputStream out0 = new ByteArrayOutputStream(); + XMLPrintWriter writer0 = XMLPrintWriter.create(out0); + RemoteDesignerWorkspaceInfo info0 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true)); + info0.setNewCreated(true); + info0.writeXML(writer0); + writer0.close(); + String result0 = new String(out0.toByteArray()); + Assert.assertTrue(result0.contains("certSecretKey")); + Assert.assertFalse(result0.contains("certSecretKey=\"xxxxx\"")); + + ByteArrayOutputStream out1 = new ByteArrayOutputStream(); + XMLPrintWriter writer1 = XMLPrintWriter.create(out1); + RemoteDesignerWorkspaceInfo info1 = RemoteDesignerWorkspaceInfo.create(new WorkspaceConnectionInfo("127.0.0.1", "1", "1", "/xxx", "xxxxx", true)); + info1.writeXML(writer1); + writer1.close(); + String result1 = new String(out1.toByteArray()); + Assert.assertTrue(result1.contains("certSecretKey")); + Assert.assertTrue(result1.contains("certSecretKey=\"xxxxx\"")); + + } + } diff --git a/designer-base/src/test/java/com/fr/design/update/factory/UpdateFileFactoryTest.java b/designer-base/src/test/java/com/fr/design/update/factory/UpdateFileFactoryTest.java new file mode 100644 index 0000000000..6c2211e76c --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/update/factory/UpdateFileFactoryTest.java @@ -0,0 +1,28 @@ +package com.fr.design.update.factory; + +import com.fr.decision.update.data.UpdateConstants; +import com.fr.stable.StableUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; + +public class UpdateFileFactoryTest { + + @Test + public void testGetBackupVersions() { + Assert.assertEquals(0, UpdateFileFactory.getBackupVersions().length); + File backupDir = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR)); + StableUtils.deleteFile(backupDir); + } + + @Test + public void testIsBackupVersionsValid() { + File des = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR, "test", UpdateConstants.BACKUPPATH, "test")); + File env = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR, "test", UpdateConstants.DESIGNERBACKUPPATH, "test")); + StableUtils.mkdirs(des); + StableUtils.mkdirs(env); + Assert.assertTrue(UpdateFileFactory.isBackupVersionsValid(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR, "test"))); + StableUtils.deleteFile(new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR))); + } +} diff --git a/designer-base/src/test/java/com/fr/design/update/utils/UpdateFileUtilsTest.java b/designer-base/src/test/java/com/fr/design/update/utils/UpdateFileUtilsTest.java new file mode 100644 index 0000000000..8788675352 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/update/utils/UpdateFileUtilsTest.java @@ -0,0 +1,27 @@ +package com.fr.design.update.utils; + +import com.fr.decision.update.data.UpdateConstants; +import com.fr.stable.StableUtils; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; + +/** + * @author Bryant + * @version 10.0 + * Created by Bryant on 2020-09-25 + */ +public class UpdateFileUtilsTest { + + @Test + public void testListFilteredFiles() { + File des = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR, "test", UpdateConstants.BACKUPPATH, "test")); + File env = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR, "test", UpdateConstants.DESIGNERBACKUPPATH, "test")); + StableUtils.mkdirs(des); + StableUtils.mkdirs(env); + String[] result = UpdateFileUtils.listBackupVersions(); + Assert.assertEquals(1, result.length); + StableUtils.deleteFile(new File(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNER_BACKUP_DIR))); + } +} diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java index e4e27b7f49..16f983c758 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/AbstractCustomFieldComboBoxPane.java @@ -82,6 +82,10 @@ public abstract class AbstractCustomFieldComboBoxPane extends BasicBeanPane extends BasicBeanPane{ * @return 界面是否接受对象 */ public boolean accept(Object ob) { - return ob instanceof ChartCollection && ((ChartCollection)ob).getSelectedChart().getFilterDefinition() instanceof ReportDataDefinition; + TopDefinitionProvider filterDefinition = ((ChartCollection) ob).getSelectedChartProvider(Chart.class).getFilterDefinition(); + return ob instanceof ChartCollection && filterDefinition instanceof ReportDataDefinition && !(filterDefinition instanceof CustomDefinition); } /** diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java index 119d73bda6..fe02f67c04 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedCustomFieldComboBoxPane.java @@ -22,6 +22,10 @@ public class ExtendedCustomFieldComboBoxPane extends AbstractCustomFieldComboBox return new ExtendedCustomFieldNamePane(); } + @Override + protected boolean seriesComboBoxHasNone() { + return true; + } @Override public void populateBean(AbstractDataConfig ob) { diff --git a/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java b/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java index 6df855cd70..f20675066f 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/UIComboBoxWithNone.java @@ -41,7 +41,9 @@ public class UIComboBoxWithNone extends UIComboBox { public void setSelectedItem(Object anObject) { super.setSelectedItem(anObject); - if (getSelectedIndex() == -1) {//找不到的都选中无。中文的无 英文下是none。 + //找不到的都选中无。中文的无 英文下是none。 + //改正:找不到的且anObject不是null的 全部选中无。 + if (getSelectedIndex() == -1 && anObject != null) { super.setSelectedItem(getDefaultLocaleString()); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java index 5cec0753a7..5d254ebb6a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/area/VanChartAreaPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.area.AreaIndependentVanChart; import com.fr.plugin.chart.area.VanChartAreaPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/11/18. */ -public class VanChartAreaPlotPane extends AbstractVanChartTypePane { +public class VanChartAreaPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java index 83d1db2e96..811dde312c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bar/VanChartBarPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.bar.BarIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/10/20. */ -public class VanChartBarPlotPane extends AbstractVanChartTypePane { +public class VanChartBarPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java index 77b16b4993..25eb587d87 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/VanChartBoxTooltipContentPane.java @@ -1,19 +1,36 @@ package com.fr.van.chart.box; +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.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipCategoryFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataMaxFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataMedianFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataMinFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataNumberFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataOutlierFormat; +import com.fr.plugin.chart.base.format.AttrTooltipDataQ1Format; +import com.fr.plugin.chart.base.format.AttrTooltipDataQ3Format; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; +import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; import com.fr.plugin.chart.box.attr.AttrBoxTooltipContent; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; +import java.util.Map; public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { @@ -27,17 +44,28 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { private VanChartFormatPaneWithCheckBox min; private VanChartFormatPaneWithCheckBox outlier; + private VanChartFormatPaneWithoutCheckBox richTextNumber; + private VanChartFormatPaneWithoutCheckBox richTextMax; + private VanChartFormatPaneWithoutCheckBox richTextQ3; + private VanChartFormatPaneWithoutCheckBox richTextMedian; + private VanChartFormatPaneWithoutCheckBox richTextQ1; + private VanChartFormatPaneWithoutCheckBox richTextMin; + private VanChartFormatPaneWithoutCheckBox richTextOutlier; + private JPanel dataNumberPane; private JPanel dataOutlierPane; + private JPanel richTextNumberPane; + private JPanel richTextOutlierPane; + public VanChartBoxTooltipContentPane(VanChartStylePane parent, JPanel showOnPane, boolean isDetailed) { super(parent, showOnPane); checkFormatVisible(isDetailed); } protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new CategoryNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); number = new VanChartFormatPaneWithCheckBox(parent, showOnPane) { protected String getCheckBoxText() { @@ -76,7 +104,48 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { }; } - protected JPanel createCommonPanel() { + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + + richTextNumber = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Data_Number"); + } + }; + richTextMax = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Max_Value"); + } + }; + richTextQ3 = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Data_Q3"); + } + }; + richTextMedian = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Data_Median"); + } + }; + richTextQ1 = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Data_Q1"); + } + }; + richTextMin = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Min_Value"); + } + }; + richTextOutlier = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Outlier_Value"); + } + }; + } + + protected JPanel createCommonFormatPanel() { JPanel commonPanel = new JPanel(new BorderLayout()); commonPanel.add(createCateAndSeriesPane(), BorderLayout.NORTH); @@ -86,6 +155,30 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { return commonPanel; } + protected JPanel createRichFormatPanel() { + JPanel richFormatPanel = new JPanel(new BorderLayout()); + + richFormatPanel.add(createRichTextCateAndSeriesPane(), BorderLayout.NORTH); + richFormatPanel.add(createRichTextDataNumberPane(), BorderLayout.CENTER); + richFormatPanel.add(createRichTextDataDetailPane(), BorderLayout.SOUTH); + + return richFormatPanel; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{richTextNumber, null}, + new Component[]{richTextMax, null}, + new Component[]{richTextQ3, null}, + new Component[]{richTextMedian, null}, + new Component[]{richTextQ1, null}, + new Component[]{richTextMin, null}, + new Component[]{richTextOutlier, null} + }; + } + protected double[] getRowSize(double p) { return new double[]{p, p, p, p, p, p, p, p, p, p, p, p}; } @@ -93,13 +186,15 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { private JPanel createCateAndSeriesPane() { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, p}; - double[] rowSize = {p, p}; + double[] columnSize = {f, e}; + double[] rowSize = {p, p, p}; Component[][] cateAndSeries = new Component[][]{ - new Component[]{categoryNameFormatPane, null}, - new Component[]{seriesNameFormatPane, null} + new Component[]{null, null}, + new Component[]{null, getCategoryNameFormatPane()}, + new Component[]{null, getSeriesNameFormatPane()} }; return TableLayoutHelper.createTableLayoutPane(cateAndSeries, rowSize, columnSize); @@ -108,13 +203,14 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { private JPanel createDataNumberPane() { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; - double[] columnSize = {f, p}; + double[] columnSize = {f, e}; double[] rowSize = {p, p}; Component[][] dataNumber = new Component[][]{ new Component[]{null, null}, - new Component[]{number, null}, + new Component[]{null, number}, }; dataNumberPane = TableLayoutHelper.createTableLayoutPane(dataNumber, rowSize, columnSize); @@ -125,22 +221,24 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { private JPanel createDataDetailPane() { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; - double[] columnSize = {f, p}; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; JPanel detailPane = new JPanel(new BorderLayout()); Component[][] dataDetail = new Component[][]{ new Component[]{null, null}, - new Component[]{max, null}, - new Component[]{q3, null}, - new Component[]{median, null}, - new Component[]{q1, null}, - new Component[]{min, null} + new Component[]{null, max}, + new Component[]{new UILabel(getLabelContentTitle()), q3}, + new Component[]{null, median}, + new Component[]{null, q1}, + new Component[]{null, min} }; Component[][] dataOutlier = new Component[][]{ new Component[]{null, null}, - new Component[]{outlier, null}, + new Component[]{null, outlier}, }; dataOutlierPane = TableLayoutHelper.createTableLayoutPane(dataOutlier, new double[]{p, p}, columnSize); @@ -151,9 +249,75 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { return detailPane; } + private JPanel createRichTextCateAndSeriesPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p, p}; + + Component[][] cateAndSeries = new Component[][]{ + new Component[]{null, null}, + new Component[]{null, getRichTextCategoryNameFormatPane()}, + new Component[]{null, getRichTextSeriesNameFormatPane()} + }; + + return TableLayoutHelper.createTableLayoutPane(cateAndSeries, rowSize, columnSize); + } + + private JPanel createRichTextDataNumberPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p}; + + Component[][] dataNumber = new Component[][]{ + new Component[]{null, null}, + new Component[]{null, richTextNumber}, + }; + + richTextNumberPane = TableLayoutHelper.createTableLayoutPane(dataNumber, rowSize, columnSize); + + return richTextNumberPane; + } + + private JPanel createRichTextDataDetailPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + + JPanel detailPane = new JPanel(new BorderLayout()); + + Component[][] richTextDetail = new Component[][]{ + new Component[]{null, null}, + new Component[]{null, richTextMax}, + new Component[]{new UILabel(getLabelContentTitle()), richTextQ3}, + new Component[]{null, richTextMedian}, + new Component[]{null, richTextQ1}, + new Component[]{null, richTextMin} + }; + + Component[][] dataOutlier = new Component[][]{ + new Component[]{null, null}, + new Component[]{null, richTextOutlier}, + }; + + richTextOutlierPane = TableLayoutHelper.createTableLayoutPane(dataOutlier, new double[]{p, p}, columnSize); + + detailPane.add(TableLayoutHelper.createTableLayoutPane(richTextDetail, new double[]{p, p, p, p, p, p}, columnSize), BorderLayout.NORTH); + detailPane.add(richTextOutlierPane, BorderLayout.CENTER); + + return detailPane; + } + public boolean isDirty() { - return categoryNameFormatPane.isDirty() - || seriesNameFormatPane.isDirty() + return getCategoryNameFormatPane().isDirty() + || getSeriesNameFormatPane().isDirty() || number.isDirty() || max.isDirty() || q3.isDirty() @@ -164,8 +328,8 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { } public void setDirty(boolean isDirty) { - categoryNameFormatPane.setDirty(isDirty); - seriesNameFormatPane.setDirty(isDirty); + getCategoryNameFormatPane().setDirty(isDirty); + getSeriesNameFormatPane().setDirty(isDirty); number.setDirty(isDirty); max.setDirty(isDirty); q3.setDirty(isDirty); @@ -180,8 +344,8 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { } protected void populateFormatPane(AttrTooltipContent attrTooltipContent) { - categoryNameFormatPane.populate(attrTooltipContent.getCategoryFormat()); - seriesNameFormatPane.populate(attrTooltipContent.getSeriesFormat()); + getCategoryNameFormatPane().populate(attrTooltipContent.getCategoryFormat()); + getSeriesNameFormatPane().populate(attrTooltipContent.getSeriesFormat()); if (attrTooltipContent instanceof AttrBoxTooltipContent) { AttrBoxTooltipContent boxTooltipContent = (AttrBoxTooltipContent) attrTooltipContent; @@ -198,9 +362,68 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { } } + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + setRichTextAttr(new AttrTooltipRichText()); + Map params = getRichTextAttr().getParams(); + + AttrTooltipCategoryFormat categoryFormat = attrTooltipContent.getRichTextCategoryFormat(); + getRichTextCategoryNameFormatPane().populate(categoryFormat); + getRichTextCategoryNameFormatPane().updateFormatParams(params, categoryFormat.getJs()); + + AttrTooltipSeriesFormat seriesFormat = attrTooltipContent.getRichTextSeriesFormat(); + getRichTextSeriesNameFormatPane().populate(seriesFormat); + getRichTextSeriesNameFormatPane().updateFormatParams(params, seriesFormat.getJs()); + + if (attrTooltipContent instanceof AttrBoxTooltipContent) { + AttrBoxTooltipContent boxTooltipContent = (AttrBoxTooltipContent) attrTooltipContent; + + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = getFormatPaneGroup(); + AttrTooltipFormat[] formatGroup = getFormatGroup(boxTooltipContent); + + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); + } + } + + private VanChartFormatPaneWithoutCheckBox[] getFormatPaneGroup() { + if (detailed) { + return new VanChartFormatPaneWithoutCheckBox[]{ + richTextNumber, richTextMax, richTextQ3, richTextMedian, + richTextQ1, richTextMin, richTextOutlier + }; + } + + return new VanChartFormatPaneWithoutCheckBox[]{ + richTextMax, richTextQ3, richTextMedian, richTextQ1, richTextMin + }; + } + + private AttrTooltipFormat[] getFormatGroup(AttrBoxTooltipContent boxTooltipContent) { + AttrTooltipDataNumberFormat richTextNumber = boxTooltipContent.getRichTextNumber(); + AttrTooltipDataMaxFormat richTextMaxFormat = boxTooltipContent.getRichTextMax(); + AttrTooltipDataQ3Format richTextQ3Format = boxTooltipContent.getRichTextQ3(); + AttrTooltipDataMedianFormat richTextMedianFormat = boxTooltipContent.getRichTextMedian(); + AttrTooltipDataQ1Format richTextQ1Format = boxTooltipContent.getRichTextQ1(); + AttrTooltipDataMinFormat richTextMinFormat = boxTooltipContent.getRichTextMin(); + AttrTooltipDataOutlierFormat richTextOutlierFormat = boxTooltipContent.getRichTextOutlier(); + + if (detailed) { + return new AttrTooltipFormat[]{ + richTextNumber, richTextMaxFormat, richTextQ3Format, richTextMedianFormat, + richTextQ1Format, richTextMinFormat, richTextOutlierFormat + }; + } + + return new AttrTooltipFormat[]{ + richTextMaxFormat, richTextQ3Format, richTextMedianFormat, richTextQ1Format, richTextMinFormat + }; + } + protected void updateFormatPane(AttrTooltipContent attrTooltipContent) { - categoryNameFormatPane.update(attrTooltipContent.getCategoryFormat()); - seriesNameFormatPane.update(attrTooltipContent.getSeriesFormat()); + getCategoryNameFormatPane().update(attrTooltipContent.getCategoryFormat()); + getSeriesNameFormatPane().update(attrTooltipContent.getSeriesFormat()); if (attrTooltipContent instanceof AttrBoxTooltipContent) { AttrBoxTooltipContent boxTooltipContent = (AttrBoxTooltipContent) attrTooltipContent; @@ -217,10 +440,30 @@ public class VanChartBoxTooltipContentPane extends VanChartTooltipContentPane { } } + protected void updateRichEditor(AttrTooltipContent attrTooltipContent) { + getRichTextCategoryNameFormatPane().update(attrTooltipContent.getRichTextCategoryFormat()); + getRichTextSeriesNameFormatPane().update(attrTooltipContent.getRichTextSeriesFormat()); + + if (attrTooltipContent instanceof AttrBoxTooltipContent) { + AttrBoxTooltipContent boxTooltipContent = (AttrBoxTooltipContent) attrTooltipContent; + + richTextNumber.update(boxTooltipContent.getRichTextNumber()); + richTextMax.update(boxTooltipContent.getRichTextMax()); + richTextQ3.update(boxTooltipContent.getRichTextQ3()); + richTextMedian.update(boxTooltipContent.getRichTextMedian()); + richTextQ1.update(boxTooltipContent.getRichTextQ1()); + richTextMin.update(boxTooltipContent.getRichTextMin()); + richTextOutlier.update(boxTooltipContent.getRichTextOutlier()); + } + } + public void checkFormatVisible(boolean detailed) { this.detailed = detailed; dataNumberPane.setVisible(detailed); dataOutlierPane.setVisible(detailed); + + richTextNumberPane.setVisible(detailed); + richTextOutlierPane.setVisible(detailed); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java index cfd3ea8d5b..5af1fa4168 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/BoxPlotTableResultDataSeriesPane.java @@ -15,10 +15,10 @@ import com.fr.stable.StringUtils; import javax.swing.BorderFactory; import javax.swing.JPanel; +import java.util.List; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; -import java.util.List; public class BoxPlotTableResultDataSeriesPane extends AbstractTableDataContentPane { @@ -66,6 +66,7 @@ public class BoxPlotTableResultDataSeriesPane extends AbstractTableDataContentPa private JPanel createUIComboBoxPane(UIComboBox comboBox, String title) { UILabel label = new UILabel(title); label.setPreferredSize(new Dimension(80, 20)); + comboBox.setPreferredSize(new Dimension(100, 20)); JPanel panel = new JPanel(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/UIComboBoxWithEditLabel.java b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/UIComboBoxWithEditLabel.java index 3ba858364a..7b51fc5647 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/box/data/table/UIComboBoxWithEditLabel.java +++ b/designer-chart/src/main/java/com/fr/van/chart/box/data/table/UIComboBoxWithEditLabel.java @@ -31,6 +31,7 @@ public abstract class UIComboBoxWithEditLabel extends JPanel implements UIObserv editLabel.setPreferredSize(new Dimension(80, 20)); comboBox = new UIComboBox(); + comboBox.setPreferredSize(new Dimension(100, 20)); this.setLayout(new BorderLayout(4, 0)); this.add(editLabel, BorderLayout.WEST); diff --git a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java index 407c7758ba..ef90c8a017 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/bubble/VanChartBubblePlotPane.java @@ -12,15 +12,22 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.base.VanChartZoom; import com.fr.plugin.chart.bubble.BubbleIndependentVanChart; 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.scatter.VanChartScatterPlot; import com.fr.plugin.chart.scatter.attr.ScatterAttrLabel; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * Created by Mitisky on 16/3/31. */ @@ -32,6 +39,20 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { private static final float ALPHA = 0.7f; + private static Set forceExtendPlotIds = new HashSet<>(); + + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + + forceExtendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/bubble/images/bubble.png", @@ -122,16 +143,16 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { * @param chart */ @Override - protected void resetChartAttr4SamePlot(Chart chart) { + protected void resetChartAttr4SamePlot(VanChart chart) { //图表缩放新设计 恢复用注释。下面2行删除。 VanChartZoom vanChartZoom = new VanChartZoom(); - ((VanChart) chart).setVanChartZoom(vanChartZoom); + chart.setVanChartZoom(vanChartZoom); //图表缩放新设计 恢复用注释。下面一行取消注释。 //((VanChart) chart).setZoomAttribute(new ZoomAttribute()); //重置监控刷新选项 - resetRefreshMoreLabelAttr((VanChart) chart); + resetRefreshMoreLabelAttr(chart); } @Override @@ -147,4 +168,12 @@ public class VanChartBubblePlotPane extends AbstractVanChartTypePane { } return false; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + VanChartBubblePlot selectedClonedPlot = (VanChartBubblePlot) getSelectedClonedPlot(); + return selectedClonedPlot.isForceBubble() ? forceExtendPlotIds.contains(chart.getID()) : + extendPlotIds.contains(chart.getID()); + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnConditionPane.java index c4184f3b17..3f9978f75c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnConditionPane.java @@ -49,7 +49,7 @@ public class VanChartColumnConditionPane extends DataSeriesConditionPane{ classPaneMap.put(AttrBackground.class, new VanChartColumnSeriesColorConditionPane(this)); classPaneMap.put(AttrAlpha.class, new LabelAlphaPane(this)); classPaneMap.put(AttrBorder.class, new VanChartColumnLabelBorderPane(this)); - classPaneMap.put(AttrLabel.class, new VanChartLabelConditionPane(this, plot)); + classPaneMap.put(AttrLabel.class, new VanChartColumnLabelConditionPane(this, plot)); classPaneMap.put(AttrFloatColor.class, new VanChartFloatColorConditionPane(this)); classPaneMap.put(VanChartAttrTrendLine.class, new VanChartTrendLineConditionPane(this)); classPaneMap.put(AttrSeriesImageBackground.class, new VanChartSeriesImageBackgroundConditionPane(this)); diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnLabelConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnLabelConditionPane.java new file mode 100644 index 0000000000..ec870a98fe --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnLabelConditionPane.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.column; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.condition.ConditionAttributesPane; +import com.fr.van.chart.designer.other.condition.item.VanChartLabelConditionPane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelPane; + +public class VanChartColumnLabelConditionPane extends VanChartLabelConditionPane { + + public VanChartColumnLabelConditionPane(ConditionAttributesPane conditionAttributesPane, Plot plot) { + super(conditionAttributesPane, plot); + } + + protected VanChartPlotLabelPane createLabelPane() { + return new VanChartColumnPlotLabelNoCheckPane(getPlot(),null); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelDetailPane.java new file mode 100644 index 0000000000..a2be5f2905 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelDetailPane.java @@ -0,0 +1,77 @@ +package com.fr.van.chart.column; + +import com.fr.chart.chartattr.Plot; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.plugin.chart.base.AttrLabelDetail; +import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.van.chart.designer.component.VanChartLabelContentPane; +import com.fr.van.chart.designer.component.VanChartTooltipContentPane; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelDetailPane; + +public class VanChartColumnPlotLabelDetailPane extends VanChartPlotLabelDetailPane { + + public VanChartColumnPlotLabelDetailPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void initToolTipContentPane(Plot plot) { + VanChartLabelContentPane dataLabelContentPane = new VanChartLabelContentPane(getParentPane(), VanChartColumnPlotLabelDetailPane.this) { + protected void checkCardPane() { + super.checkCardPane(); + checkOrientationPane(); + } + }; + + setDataLabelContentPane(dataLabelContentPane); + } + + private void checkOrientationPane() { + VanChartLabelContentPane dataLabelContentPane = (VanChartLabelContentPane) getDataLabelContentPane(); + UIButtonGroup content = dataLabelContentPane.getContent(); + UIButtonGroup orientation = getOrientation(); + + if (content == null || orientation == null) { + return; + } + + if (content.getSelectedIndex() == VanChartTooltipContentPane.RICH_EDITOR_INDEX) { + orientation.setSelectedIndex(HORIZONTAL_INDEX); + orientation.setEnabled(false); + } else { + orientation.setEnabled(true); + } + } + + protected boolean hasLabelOrientationPane() { + return !((VanChartColumnPlot) this.getPlot()).isBar(); + } + + private void checkOrientationEnable(AttrLabelDetail detail) { + AttrTooltipContent content = detail.getContent(); + UIButtonGroup orientation = getOrientation(); + + if (orientation != null && content != null) { + if (content.isRichText()) { + + orientation.setSelectedIndex(HORIZONTAL_INDEX); + detail.setHorizontal(true); + + orientation.setEnabled(false); + } else { + orientation.setEnabled(true); + } + } + } + + public void populate(AttrLabelDetail detail) { + super.populate(detail); + checkOrientationEnable(detail); + } + + public void update(AttrLabelDetail detail) { + super.update(detail); + checkOrientationEnable(detail); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelNoCheckPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelNoCheckPane.java new file mode 100644 index 0000000000..b08734782a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelNoCheckPane.java @@ -0,0 +1,25 @@ +package com.fr.van.chart.column; + +import com.fr.chart.chartattr.Plot; +import com.fr.plugin.chart.base.AttrLabel; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import java.awt.BorderLayout; + +public class VanChartColumnPlotLabelNoCheckPane extends VanChartColumnPlotLabelPane { + + public VanChartColumnPlotLabelNoCheckPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void addComponents() { + this.setLayout(new BorderLayout()); + this.add(getLabelPane(), BorderLayout.CENTER); + } + + public void populate(AttrLabel attr) { + super.populate(attr); + getLabelShowCheckBox().setSelected(true); + getLabelPane().setVisible(true); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelPane.java new file mode 100644 index 0000000000..e80f6310d5 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotLabelPane.java @@ -0,0 +1,20 @@ +package com.fr.van.chart.column; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelPane; + +import java.awt.BorderLayout; + +public class VanChartColumnPlotLabelPane extends VanChartPlotLabelPane { + + public VanChartColumnPlotLabelPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void createLabelPane() { + VanChartColumnPlotLabelDetailPane labelDetailPane = new VanChartColumnPlotLabelDetailPane(getPlot(), getParentPane()); + setLabelDetailPane(labelDetailPane); + getLabelPane().add(labelDetailPane, BorderLayout.CENTER); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java index 40269cc15c..8b37e952c1 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartColumnPlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.column.ColumnIndependentVanChart; import com.fr.plugin.chart.column.VanChartColumnPlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/9/24. */ -public class VanChartColumnPlotPane extends AbstractVanChartTypePane { +public class VanChartColumnPlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java index ceb9bf4807..86766676b4 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/column/VanChartCustomStackAndAxisConditionPane.java @@ -6,18 +6,19 @@ import com.fr.data.condition.ListCondition; import com.fr.design.beans.BasicBeanPane; import com.fr.design.condition.LiteConditionPane; import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.utils.gui.GUICoreUtils; - import com.fr.plugin.chart.base.AttrSeriesStackAndAxis; import com.fr.van.chart.designer.style.series.VanChartSeriesConditionPane; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JPanel; +import javax.swing.ScrollPaneConstants; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; @@ -46,10 +47,13 @@ public class VanChartCustomStackAndAxisConditionPane extends BasicBeanPane customPlotList = plot.getCustomPlotList(); for (int i = 0; i < paneList.size() && i < customPlotList.size(); i++) { ConditionAttr attrList = customPlotList.get(i).getConditionCollection().getDefaultAttr(); - DataSeriesCondition attr = customPlotList.get(i).getAttrLabelFromConditionCollection(); - if (attr != null) { - attrList.remove(attr); - } VanChartPlotLabelPane labelPane = (VanChartPlotLabelPane) paneList.get(i); AttrLabel attrLabel = labelPane.update(); + DataSeriesCondition attr = customPlotList.get(i).getAttrLabelFromConditionCollection(); + if (attr != null) { + attrList.remove(attr); + } if (attrLabel != null) { attrList.addDataSeriesCondition(attrLabel); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java b/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java index d3e1adbb90..9ea26a5c5b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/PlotFactory.java @@ -7,6 +7,7 @@ import com.fr.design.gui.icombobox.UIComboBoxRenderer; import com.fr.design.gui.style.FormatPane; import com.fr.general.ComparatorUtils; 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; @@ -23,6 +24,7 @@ import com.fr.plugin.chart.structure.VanChartStructurePlot; import com.fr.plugin.chart.treemap.VanChartTreeMapPlot; import com.fr.plugin.chart.wordcloud.VanChartWordCloudPlot; import com.fr.van.chart.bubble.force.VanChartBubbleRefreshTooltipPane; +import com.fr.van.chart.column.VanChartColumnPlotLabelPane; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.VanChartRefreshTooltipContentPane; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; @@ -38,7 +40,7 @@ import com.fr.van.chart.designer.style.tooltip.VanChartPlotTooltipPane; import com.fr.van.chart.funnel.designer.style.VanChartFunnelLabelContentPane; import com.fr.van.chart.funnel.designer.style.VanChartFunnelRefreshTooltipContentPane; import com.fr.van.chart.funnel.designer.style.VanChartFunnelTooltipContentPane; -import com.fr.van.chart.gantt.designer.style.VanChartGanttLabelContentPane; +import com.fr.van.chart.gantt.designer.style.label.VanChartGanttPlotLabelPane; import com.fr.van.chart.gantt.designer.style.tooltip.VanChartGanttPlotTooltipPane; import com.fr.van.chart.gantt.designer.style.tooltip.VanChartGanttTooltipContentPane; import com.fr.van.chart.gauge.VanChartGaugePlotRefreshTooltipPane; @@ -53,10 +55,10 @@ import com.fr.van.chart.multilayer.style.VanChartMutiPieRefreshTooltipContentPan import com.fr.van.chart.scatter.VanChartScatterPlotTooltipPane; import com.fr.van.chart.scatter.VanChartScatterRefreshTooltipContentPane; import com.fr.van.chart.scatter.component.label.VanChartScatterPlotLabelPane; -import com.fr.van.chart.structure.desinger.style.VanChartStructureLabelContentPane; +import com.fr.van.chart.structure.desinger.style.VanChartStructurePlotLabelPane; import com.fr.van.chart.structure.desinger.style.VanChartStructureRefreshTooltipContentPane; import com.fr.van.chart.structure.desinger.style.VanChartStructureTooltipContentPane; -import com.fr.van.chart.wordcloud.designer.style.VanChartWordCloudRefreshTootipContentPane; +import com.fr.van.chart.wordcloud.designer.style.VanChartWordCloudRefreshTooltipContentPane; import com.fr.van.chart.wordcloud.designer.style.VanChartWordCloudTooltipContentPane; import javax.swing.BorderFactory; @@ -76,7 +78,7 @@ import java.util.Set; */ public class PlotFactory { - private static Set> autoAdjustLabelPlots = new HashSet>(); + private static Set> autoAdjustLabelPlots = new HashSet<>(); static { autoAdjustLabelPlots.add(VanChartColumnPlot.class); @@ -89,15 +91,31 @@ public class PlotFactory { return autoAdjustLabelPlots.contains(plot.getClass()); } + private static Set> borderAndBackgroundLabelPlots = new HashSet<>(); + + static { + borderAndBackgroundLabelPlots.add(PiePlot4VanChart.class); + borderAndBackgroundLabelPlots.add(VanChartColumnPlot.class); + borderAndBackgroundLabelPlots.add(VanChartLinePlot.class); + borderAndBackgroundLabelPlots.add(VanChartAreaPlot.class); + } + + public static boolean hasBorderAndBackgroundPlotLabel(Plot plot) { + return borderAndBackgroundLabelPlots.contains(plot.getClass()); + } + /** * 标签Map */ - private static Map, Class> labelMap = new HashMap, Class>(); + private static Map, Class> labelMap = new HashMap<>(); static { + labelMap.put(VanChartColumnPlot.class, VanChartColumnPlotLabelPane.class); labelMap.put(VanChartGaugePlot.class, VanChartGaugePlotLabelPane.class); labelMap.put(VanChartScatterPlot.class, VanChartScatterPlotLabelPane.class); labelMap.put(VanChartBubblePlot.class, VanChartScatterPlotLabelPane.class); + labelMap.put(VanChartGanttPlot.class, VanChartGanttPlotLabelPane.class); + labelMap.put(VanChartStructurePlot.class, VanChartStructurePlotLabelPane.class); } /** @@ -139,8 +157,6 @@ public class PlotFactory { labelContentMap.put(VanChartTreeMapPlot.class, VanChartMultiPieLabelContentPane.class); labelContentMap.put(VanChartFunnelPlot.class, VanChartFunnelLabelContentPane.class); labelContentMap.put(VanChartHeatMapPlot.class, VanChartMapLabelContentPane.class); - labelContentMap.put(VanChartGanttPlot.class, VanChartGanttLabelContentPane.class); - labelContentMap.put(VanChartStructurePlot.class, VanChartStructureLabelContentPane.class); } private static Map, Class> tooltipContentMap = new HashMap, Class>(); @@ -182,7 +198,7 @@ public class PlotFactory { refreshTooltipContentMap.put(VanChartMultiPiePlot.class, VanChartMutiPieRefreshTooltipContentPane.class); refreshTooltipContentMap.put(VanChartTreeMapPlot.class, VanChartMutiPieRefreshTooltipContentPane.class); refreshTooltipContentMap.put(VanChartFunnelPlot.class, VanChartFunnelRefreshTooltipContentPane.class); - refreshTooltipContentMap.put(VanChartWordCloudPlot.class, VanChartWordCloudRefreshTootipContentPane.class); + refreshTooltipContentMap.put(VanChartWordCloudPlot.class, VanChartWordCloudRefreshTooltipContentPane.class); refreshTooltipContentMap.put(VanChartStructurePlot.class, VanChartStructureRefreshTooltipContentPane.class); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java index e6bee7c550..40f85dcb49 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPane.java @@ -148,11 +148,12 @@ public class VanChartHtmlLabelPane extends JPanel{ double p = TableLayout.PREFERRED; double f = TableLayout.FILL; double[] columnSize = { p, f }; - double[] rowSize = { p, p}; + double[] rowSize = {p, p, p}; Component[][] components = new Component[][]{ new Component[]{isCustomWidth, customWidth}, new Component[]{isCustomHeight, customHeight}, + new Component[] {null, null} }; return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPaneWithBackGroundLabel.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPaneWithBackGroundLabel.java new file mode 100644 index 0000000000..f9c9f7d490 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartHtmlLabelPaneWithBackGroundLabel.java @@ -0,0 +1,27 @@ +package com.fr.van.chart.designer.component; + +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.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.JPanel; +import java.awt.Component; + +public class VanChartHtmlLabelPaneWithBackGroundLabel extends VanChartHtmlLabelPane { + + protected JPanel createWidthAndHeightPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double d = TableLayout4VanChartHelper.DESCRIPTION_AREA_WIDTH; + + JPanel panel = super.createWidthAndHeightPane(); + + Component[][] components = new Component[][]{ + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Background")), panel}, + }; + + return TableLayoutHelper.createTableLayoutPane(components, new double[]{p}, new double[]{d, f}); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java index 8586f21067..957fcdaf72 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartLabelContentPane.java @@ -1,5 +1,7 @@ package com.fr.van.chart.designer.component; +import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.type.TextAlign; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -13,6 +15,10 @@ public class VanChartLabelContentPane extends VanChartTooltipContentPane { } protected VanChartHtmlLabelPane createHtmlLabelPane() { - return new VanChartHtmlLabelPane(); + return new VanChartHtmlLabelPaneWithBackGroundLabel(); + } + + protected AttrTooltipContent createAttrTooltip() { + return new AttrTooltipContent(TextAlign.CENTER); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRefreshTooltipContentPane.java index 0c3b5a4548..7ecb797d6a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRefreshTooltipContentPane.java @@ -1,7 +1,9 @@ package com.fr.van.chart.designer.component; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -20,22 +22,45 @@ public class VanChartRefreshTooltipContentPane extends VanChartTooltipContentPan return new double[]{p,p,p,p,p,p}; } + protected boolean supportRichEditor() { + return false; + } + @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + setRichTextChangedValueFormatPane(new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextChangedPercentFormatPane(new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorDialog.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorDialog.java new file mode 100644 index 0000000000..a13208df56 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorDialog.java @@ -0,0 +1,32 @@ +package com.fr.van.chart.designer.component; + +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.BasicPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.utils.gui.GUICoreUtils; + +import java.awt.Dimension; +import java.awt.Frame; + +public class VanChartRichEditorDialog extends BasicDialog { + + public static final Dimension DEFAULT = new Dimension(960, 600); + + public VanChartRichEditorDialog(Frame parent, BasicPane pane) { + super(parent, pane); + + this.setTitle(Toolkit.i18nText("Fine-Design_Report_RichTextEditor")); + this.setBasicDialogSize(DEFAULT); + GUICoreUtils.centerWindow(this); + this.setResizable(true); + this.setModal(true); + } + + protected void applyEnterAction() { + + } + + public void checkValid() { + + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorPane.java new file mode 100644 index 0000000000..408b730b28 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartRichEditorPane.java @@ -0,0 +1,144 @@ +package com.fr.van.chart.designer.component; + +import com.fr.design.ui.ModernUIPane; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.type.TextAlign; +import com.fr.stable.StringUtils; +import com.teamdev.jxbrowser.chromium.Browser; +import com.teamdev.jxbrowser.chromium.JSValue; +import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; +import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; + +import java.util.Map; + +public class VanChartRichEditorPane { + + private static final String namespace = "Pool"; + private static final String variable = "data"; + private static final String richEditorPath = "/com/fr/design/editor/rich_editor.html"; + private static final String expression = "dispatch()"; + + private static ModernUIPane richEditorPane; + private static Browser browser; + + public static ModernUIPane createRichEditorPane(AttrTooltipRichText richEditor) { + RichEditorModel model = getRichEditorModel(richEditor); + + if (richEditorPane == null) { + richEditorPane = initPane(model); + } else if (browser != null) { + updatePane(browser, model); + } + + return richEditorPane; + } + + public static ModernUIPane initPane(RichEditorModel model) { + return new ModernUIPane.Builder() + .prepare(new ScriptContextAdapter() { + public void onScriptContextCreated(ScriptContextEvent event) { + browser = event.getBrowser(); + + JSValue ns = browser.executeJavaScriptAndReturnValue("window." + namespace); + ns.asObject().setProperty(variable, model); + } + }) + .withEMB(richEditorPath) + .namespace(namespace).build(); + } + + public static void updatePane(Browser browser, RichEditorModel model) { + JSValue ns = browser.executeJavaScriptAndReturnValue("window." + namespace); + ns.asObject().setProperty(variable, model); + browser.executeJavaScript("window." + namespace + "." + expression); + } + + public static RichEditorModel getRichEditorModel(AttrTooltipRichText richText) { + Map paramsMap = richText.getParams(); + StringBuilder paramsStr = new StringBuilder(StringUtils.EMPTY); + + if (paramsMap != null) { + for (Map.Entry entry : paramsMap.entrySet()) { + paramsStr.append(entry.getKey()).append(":").append(entry.getValue()); + paramsStr.append("-"); + } + } + + int len = paramsStr.length(); + + if (len > 0) { + paramsStr.deleteCharAt(len - 1); + } + + String content = richText.getContent(); + String initParams = StringUtils.EMPTY; + String align = StringUtils.EMPTY; + + if (content.contains("data-id") && !content.contains("class")) { + initParams = richText.getInitParamsContent(); + + String left = TextAlign.LEFT.getAlign(); + String center = TextAlign.CENTER.getAlign(); + + align = content.contains(left) ? left : center; + } + + return new RichEditorModel(content, richText.isAuto(), paramsStr.toString(), initParams, align); + } + + public static class RichEditorModel { + private String content; + private boolean auto; + private String params; + private String initParams; + private String align; + + public RichEditorModel(String content, boolean auto, String params, String initParams, String align) { + this.content = content; + this.auto = auto; + this.params = params; + this.initParams = initParams; + this.align = align; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public boolean isAuto() { + return auto; + } + + public void setAuto(boolean auto) { + this.auto = auto; + } + + public String getParams() { + return params; + } + + public void setParams(String params) { + this.params = params; + } + + public String getInitParams() { + return initParams; + } + + public void setInitParams(String initParams) { + this.initParams = initParams; + } + + public String getAlign() { + return align; + } + + public void setAlign(String align) { + this.align = align; + } + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java index 5920dd969f..d4ef4ac774 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/VanChartTooltipContentPane.java @@ -1,143 +1,509 @@ package com.fr.van.chart.designer.component; import com.fr.design.beans.BasicBeanPane; +import com.fr.design.dialog.BasicDialog; +import com.fr.design.dialog.DialogActionAdapter; +import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ibutton.UIButtonGroup; 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.DesignerContext; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.ui.ModernUIPane; +import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; +import com.fr.stable.StringUtils; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; +import javax.swing.JComponent; import javax.swing.JPanel; +import javax.swing.SwingUtilities; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; /** - * 内容界面 。数据点提示 + * 数据点提示内容界面,含有通用设置、富文本编辑器、自定义JS界面 */ public class VanChartTooltipContentPane extends BasicBeanPane { private static final long serialVersionUID = 8825929000117843641L; - protected UIButtonGroup content; - protected ValueFormatPaneWithCheckBox valueFormatPane; - protected PercentFormatPaneWithCheckBox percentFormatPane; - protected CategoryNameFormatPaneWithCheckBox categoryNameFormatPane; - protected SeriesNameFormatPaneWithCheckBox seriesNameFormatPane; + // 字符样式button + private static final int TEXT_ATTR_AUTO_INDEX = 0; + private static final int TEXT_ATTR_CUSTOM_INDEX = 1; + // 标签内容button + public static final int COMMON_INDEX = 0; + public static final int RICH_EDITOR_INDEX = 1; + public static final int CUSTOM_INDEX_WITH_RICH_EDITOR = 2; + public static final int CUSTOM_INDEX_WITHOUT_RICH_EDITOR = 1; + + private UIButtonGroup content; + + private CategoryNameFormatPaneWithCheckBox categoryNameFormatPane; + private SeriesNameFormatPaneWithCheckBox seriesNameFormatPane; + private ValueFormatPaneWithCheckBox valueFormatPane; + private PercentFormatPaneWithCheckBox percentFormatPane; //监控刷新时,自动数据点提示使用 - protected ChangedValueFormatPaneWithCheckBox changedValueFormatPane; - protected ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane; + private ChangedValueFormatPaneWithCheckBox changedValueFormatPane; + private ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane; - private JPanel centerPane; + private CategoryNameFormatPaneWithoutCheckBox richTextCategoryNameFormatPane; + private SeriesNameFormatPaneWithoutCheckBox richTextSeriesNameFormatPane; + private ValueFormatPaneWithoutCheckBox richTextValueFormatPane; + private PercentFormatPaneWithoutCheckBox richTextPercentFormatPane; + private ChangedValueFormatPaneWithoutCheckBox richTextChangedValueFormatPane; + private ChangedPercentFormatPaneWithoutCheckBox richTextChangedPercentFormatPane; + + private JPanel centerPanel; private JPanel commonPanel; + private JPanel editorPanel; + private JPanel htmlPanel; + private JPanel stylePanel; + private UIButtonGroup styleButton; + private ChartTextAttrPane textAttrPane; private VanChartHtmlLabelPane htmlLabelPane; private VanChartStylePane parent; private JPanel showOnPane; - public VanChartTooltipContentPane(VanChartStylePane parent, JPanel showOnPane){ + private AttrTooltipRichText richText; + + public VanChartTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { this.parent = parent; this.showOnPane = showOnPane; + this.richText = new AttrTooltipRichText(); + + initFormatPane(parent, showOnPane); + initRichTextFormatPane(parent, showOnPane); this.setLayout(new BorderLayout()); - this.add(createLabelContentPane(),BorderLayout.CENTER); + this.add(createLabelContentPane(), BorderLayout.CENTER); + } + + public CategoryNameFormatPaneWithCheckBox getCategoryNameFormatPane() { + return categoryNameFormatPane; + } + + public void setCategoryNameFormatPane(CategoryNameFormatPaneWithCheckBox categoryNameFormatPane) { + this.categoryNameFormatPane = categoryNameFormatPane; + } + + public SeriesNameFormatPaneWithCheckBox getSeriesNameFormatPane() { + return seriesNameFormatPane; + } + + public void setSeriesNameFormatPane(SeriesNameFormatPaneWithCheckBox seriesNameFormatPane) { + this.seriesNameFormatPane = seriesNameFormatPane; + } + + public ValueFormatPaneWithCheckBox getValueFormatPane() { + return valueFormatPane; + } + + public void setValueFormatPane(ValueFormatPaneWithCheckBox valueFormatPane) { + this.valueFormatPane = valueFormatPane; + } + + public PercentFormatPaneWithCheckBox getPercentFormatPane() { + return percentFormatPane; + } + + public void setPercentFormatPane(PercentFormatPaneWithCheckBox percentFormatPane) { + this.percentFormatPane = percentFormatPane; + } + + public ChangedValueFormatPaneWithCheckBox getChangedValueFormatPane() { + return changedValueFormatPane; + } + + public void setChangedValueFormatPane(ChangedValueFormatPaneWithCheckBox changedValueFormatPane) { + this.changedValueFormatPane = changedValueFormatPane; + } + + public ChangedPercentFormatPaneWithCheckBox getChangedPercentFormatPane() { + return changedPercentFormatPane; + } + + public void setChangedPercentFormatPane(ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane) { + this.changedPercentFormatPane = changedPercentFormatPane; + } + + public CategoryNameFormatPaneWithoutCheckBox getRichTextCategoryNameFormatPane() { + return richTextCategoryNameFormatPane; + } + + public void setRichTextCategoryNameFormatPane(CategoryNameFormatPaneWithoutCheckBox richTextCategoryNameFormatPane) { + this.richTextCategoryNameFormatPane = richTextCategoryNameFormatPane; + } + + public SeriesNameFormatPaneWithoutCheckBox getRichTextSeriesNameFormatPane() { + return richTextSeriesNameFormatPane; + } + + public void setRichTextSeriesNameFormatPane(SeriesNameFormatPaneWithoutCheckBox richTextSeriesNameFormatPane) { + this.richTextSeriesNameFormatPane = richTextSeriesNameFormatPane; + } + + public ValueFormatPaneWithoutCheckBox getRichTextValueFormatPane() { + return richTextValueFormatPane; + } + + public void setRichTextValueFormatPane(ValueFormatPaneWithoutCheckBox richTextValueFormatPane) { + this.richTextValueFormatPane = richTextValueFormatPane; + } + + public PercentFormatPaneWithoutCheckBox getRichTextPercentFormatPane() { + return richTextPercentFormatPane; + } + + public void setRichTextPercentFormatPane(PercentFormatPaneWithoutCheckBox richTextPercentFormatPane) { + this.richTextPercentFormatPane = richTextPercentFormatPane; + } + + public ChangedValueFormatPaneWithoutCheckBox getRichTextChangedValueFormatPane() { + return richTextChangedValueFormatPane; + } + + public void setRichTextChangedValueFormatPane(ChangedValueFormatPaneWithoutCheckBox richTextChangedValueFormatPane) { + this.richTextChangedValueFormatPane = richTextChangedValueFormatPane; + } + + public ChangedPercentFormatPaneWithoutCheckBox getRichTextChangedPercentFormatPane() { + return richTextChangedPercentFormatPane; + } + + public void setRichTextChangedPercentFormatPane(ChangedPercentFormatPaneWithoutCheckBox richTextChangedPercentFormatPane) { + this.richTextChangedPercentFormatPane = richTextChangedPercentFormatPane; + } + + public UIButtonGroup getContent() { + return content; + } + + public AttrTooltipRichText getRichTextAttr() { + return richText; + } + + public void setRichTextAttr(AttrTooltipRichText richText) { + this.richText = richText; } private JPanel createLabelContentPane() { - content = new UIButtonGroup(new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common"), - com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")}); + initDetailPane(); + initCenterPane(); - initFormatPane(parent, showOnPane); + JPanel content = new JPanel(new BorderLayout()); - double p = TableLayout.PREFERRED; - double f = TableLayout.FILL; - double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + content.add(createButtonPane(), BorderLayout.NORTH); + content.add(centerPanel, BorderLayout.CENTER); + content.add(stylePanel, BorderLayout.SOUTH); - commonPanel = createCommonPanel(); - htmlLabelPane = createHtmlLabelPane(); - htmlLabelPane.setParent(parent); + initContentListener(); - centerPane = new JPanel(new CardLayout()){ - @Override + return getLabelContentPane(content); + } + + private void initDetailPane() { + commonPanel = createCommonFormatPanel(); + editorPanel = createRichEditorPanel(); + htmlPanel = createHtmlPane(); + stylePanel = createCommonStylePane(); + } + + private void initCenterPane() { + if (supportRichEditor()) { + initCenterPaneWithRichEditor(); + } else { + initCenterPaneWithoutRichEditor(); + } + } + + private void initCenterPaneWithRichEditor() { + centerPanel = new JPanel(new CardLayout()) { public Dimension getPreferredSize() { - if(content.getSelectedIndex() == 0){ + if (content.getSelectedIndex() == COMMON_INDEX) { return commonPanel.getPreferredSize(); + } else if (content.getSelectedIndex() == RICH_EDITOR_INDEX) { + return editorPanel.getPreferredSize(); } else { - return new Dimension(commonPanel.getPreferredSize().width,htmlLabelPane.getPreferredSize().height); + return new Dimension(commonPanel.getPreferredSize().width, htmlLabelPane.getPreferredSize().height); } } }; - centerPane.add(htmlLabelPane, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Custom")); - centerPane.add(commonPanel,com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Common")); - double[] column = {f, e}; - double[] row = {p,p,p}; - Component[][] components = new Component[][]{ - new Component[]{null,null}, - new Component[]{new UILabel(getLabelContentTitle()),content}, - new Component[]{null,centerPane}, + centerPanel.add(commonPanel, Toolkit.i18nText("Fine-Design_Chart_Common")); + centerPanel.add(editorPanel, Toolkit.i18nText("Fine-Design_Chart_Rich_Text")); + centerPanel.add(htmlPanel, Toolkit.i18nText("Fine-Design_Chart_Custom")); + } + + private void initCenterPaneWithoutRichEditor() { + centerPanel = new JPanel(new CardLayout()) { + public Dimension getPreferredSize() { + if (content.getSelectedIndex() == COMMON_INDEX) { + return commonPanel.getPreferredSize(); + } else { + return new Dimension(commonPanel.getPreferredSize().width, htmlLabelPane.getPreferredSize().height); + } + } }; - initContentListener(); - JPanel contentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, column); - return getLabelContentPane(contentPane); + + centerPanel.add(commonPanel, Toolkit.i18nText("Fine-Design_Chart_Common")); + centerPanel.add(htmlPanel, Toolkit.i18nText("Fine-Design_Chart_Custom")); } - protected String getLabelContentTitle () { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Report_Text"); + protected String getLabelContentTitle() { + return Toolkit.i18nText("Fine-Design_Report_Text"); } protected JPanel getLabelContentPane(JPanel contentPane) { - return createTableLayoutPaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"), contentPane); + return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Content"), contentPane); } - protected VanChartHtmlLabelPane createHtmlLabelPane() { - return new VanChartHtmlLabelPaneWithOutWidthAndHeight(); + protected boolean supportRichEditor() { + return true; + } + + protected boolean hasTextStylePane() { + return true; + } + + private JPanel createButtonPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + double[] column = {f, p}; + double[] row = {p, p}; + + if (supportRichEditor()) { + content = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Common"), + Toolkit.i18nText("Fine-Design_Chart_Rich_Text"), + Toolkit.i18nText("Fine-Design_Chart_Custom") + }); + } else { + content = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Common"), + Toolkit.i18nText("Fine-Design_Chart_Custom") + }); + } + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{content, null} + }; + + return TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, column); + } + + protected JPanel createCommonFormatPanel() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + JPanel formatContent = TableLayoutHelper.createTableLayoutPane(getPaneComponents(), getRowSize(p), new double[]{f, p}); + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(getLabelContentTitle()), formatContent} + }; + + return TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p}, new double[]{f, e}); + } + + protected JPanel createCommonStylePane() { + styleButton = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Automatic"), + Toolkit.i18nText("Fine-Design_Chart_Custom") + }); + + textAttrPane = new ChartTextAttrPane() { + protected Component[][] getComponents(JPanel buttonPane) { + return new Component[][]{ + new Component[]{null, null}, + new Component[]{null, getFontNameComboBox()}, + new Component[]{null, buttonPane} + }; + } + }; + + JPanel buttonPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), styleButton); + + JPanel stylePanel = new JPanel(new BorderLayout()); + stylePanel.add(buttonPane, BorderLayout.CENTER); + stylePanel.add(textAttrPane, BorderLayout.SOUTH); + + initStyleButtonListener(); + + return stylePanel; + } + + private void initStyleButtonListener() { + styleButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + checkStylePane(); + } + }); + } + + private void checkStylePane() { + if (hasTextStylePane()) { + stylePanel.setVisible(true); + textAttrPane.setVisible(styleButton.getSelectedIndex() == TEXT_ATTR_CUSTOM_INDEX); + } else { + stylePanel.setVisible(false); + } } - protected JPanel createCommonPanel() { + private JPanel createRichEditorPanel() { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p, p}; + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Content_Style")), createRichEditorButton()}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Format")), createRichFormatPanel()} + }; + + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + } + + protected JPanel createRichFormatPanel() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + return TableLayoutHelper.createTableLayoutPane(getRichTextComponents(), getRowSize(p), new double[]{f, p}); + } + + private JComponent createRichEditorButton() { + UIButton contentTextArea = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Rich_Text_Edit")); + + contentTextArea.addMouseListener(new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + fireRichEditor(); + } + }); + + return contentTextArea; + } + + private void fireRichEditor() { + final ModernUIPane pane = VanChartRichEditorPane.createRichEditorPane(richText); + BasicDialog dialog = new VanChartRichEditorDialog(DesignerContext.getDesignerFrame(), pane); + + pane.populate(VanChartRichEditorPane.getRichEditorModel(richText)); + + dialog.addDialogActionListener(new DialogActionAdapter() { + + public void doOk() { + VanChartRichEditorPane.RichEditorModel model = pane.update(); + + String content = model.getContent(); + updateLocalRichText(content, model.isAuto()); + + SwingUtilities.getWindowAncestor(pane).setVisible(false); + } + + public void doCancel() { + SwingUtilities.getWindowAncestor(pane).setVisible(false); + } + }); + + dialog.setVisible(true); + + if (parent != null) { + parent.attributeChanged(); + } + } + + private JPanel createHtmlPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + + double[] column = {f, p}; + double[] row = {p, p}; - double[] columnSize = {f, p}; - double[] rowSize = getRowSize(p); + htmlLabelPane = createHtmlLabelPane(); + htmlLabelPane.setParent(parent); - return TableLayoutHelper.createTableLayoutPane(getPaneComponents(), rowSize, columnSize); + Component[][] htmlComponents = new Component[][]{ + new Component[]{null, null}, + new Component[]{htmlLabelPane, null} + }; + + return TableLayout4VanChartHelper.createGapTableLayoutPane(htmlComponents, row, column); } - protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane){ + protected VanChartHtmlLabelPane createHtmlLabelPane() { + return new VanChartHtmlLabelPaneWithOutWidthAndHeight(); + } + + protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane); seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); } + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + richTextCategoryNameFormatPane = new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane); + richTextSeriesNameFormatPane = new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane); + richTextValueFormatPane = new ValueFormatPaneWithoutCheckBox(parent, showOnPane); + richTextPercentFormatPane = new PercentFormatPaneWithoutCheckBox(parent, showOnPane); + } + protected JPanel createTableLayoutPaneWithTitle(String title, JPanel panel) { return TableLayout4VanChartHelper.createExpandablePaneWithTitle(title, panel); } - protected double[] getRowSize(double p){ - return new double[]{p,p,p,p}; + protected double[] getRowSize(double p) { + return new double[]{p, p, p, p}; + } + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{categoryNameFormatPane, null}, + new Component[]{seriesNameFormatPane, null}, + new Component[]{valueFormatPane, null}, + new Component[]{percentFormatPane, null}, + }; } - protected Component[][] getPaneComponents(){ + protected Component[][] getRichTextComponents() { return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{percentFormatPane,null}, + new Component[]{richTextCategoryNameFormatPane, null}, + new Component[]{richTextSeriesNameFormatPane, null}, + new Component[]{richTextValueFormatPane, null}, + new Component[]{richTextPercentFormatPane, null}, }; } @@ -145,22 +511,52 @@ public class VanChartTooltipContentPane extends BasicBeanPane lineColorButton; + private ColorSelectBox lineColorBox; + private MarkerComboBox borderShape; + private UISpinner borderRadius; + + private JPanel detailPane; + private JPanel colorBoxPane; + + public VanChartBorderWithShapePane() { + initComponents(); + createBorderPane(); + } + + private void initComponents() { + lineTypeBox = new LineComboBox(CoreConstants.STRIKE_LINE_STYLE_ARRAY_4_CHART); + lineColorButton = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Automatic"), + Toolkit.i18nText("Fine-Design_Chart_Custom") + }); + lineColorBox = new ColorSelectBox(100); + borderShape = new MarkerComboBox(MarkerFactory.getLabelShapeMarkers()); + borderRadius = new UISpinner(0, 1000, 1, 0); + } + + private void createBorderPane() { + this.setLayout(new BorderLayout()); + + detailPane = createDetailPane(); + + this.add(createLineTypePane(), BorderLayout.CENTER); + this.add(detailPane, BorderLayout.SOUTH); + + initLineTypeListener(); + initLineColorListener(); + initShapeListener(); + } + + private void initLineTypeListener() { + lineTypeBox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + checkDetailPane(); + } + }); + } + + private void checkDetailPane() { + detailPane.setVisible(lineTypeBox.getSelectedLineStyle() != Constants.LINE_NONE); + } + + private void initLineColorListener() { + lineColorButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + checkColorPane(); + } + }); + } + + private void checkColorPane() { + colorBoxPane.setVisible(lineColorButton.getSelectedIndex() == CUSTOM_COLOR); + } + + private void initShapeListener() { + borderShape.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + checkRadiusPane(); + } + }); + } + + private void checkRadiusPane() { + borderRadius.setEnabled(borderShape.getSelectedIndex() == RECTANGULAR_INDEX || borderShape.getSelectedIndex() == DIALOG_INDEX); + } + + private JPanel createLineTypePane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p}; + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_Line_Style")), + UIComponentUtils.wrapWithBorderLayoutPane(lineTypeBox)}}; + + return TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + } + + private JPanel createDetailPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p, p}; + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Shape")), + UIComponentUtils.wrapWithBorderLayoutPane(borderShape)}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Radius")), borderRadius} + }; + + JPanel center = createLineColorPane(); + JPanel south = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); + + JPanel panel = new JPanel(new BorderLayout()); + + panel.add(center, BorderLayout.CENTER); + panel.add(south, BorderLayout.SOUTH); + + return panel; + } + + private JPanel createLineColorPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + + double[] columnSize = {f, e}; + double[] rowSize = {p, p}; + + Component[][] center = new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Color")), lineColorButton} + }; + + Component[][] south = new Component[][]{ + new Component[]{null, null}, + new Component[]{null, lineColorBox} + }; + + colorBoxPane = TableLayout4VanChartHelper.createGapTableLayoutPane(south, rowSize, columnSize); + + JPanel panel = new JPanel(new BorderLayout()); + + panel.add(TableLayout4VanChartHelper.createGapTableLayoutPane(center, rowSize, columnSize), BorderLayout.CENTER); + panel.add(colorBoxPane, BorderLayout.SOUTH); + + return panel; + } + + protected String title4PopupWindow() { + return null; + } + + public void populate(AttrBorderWithShape border) { + if (border == null) { + return; + } + + lineTypeBox.setSelectedLineStyle(border.getBorderStyle()); + lineColorButton.setSelectedIndex(border.isAutoColor() ? AUTO_COLOR : CUSTOM_COLOR); + lineColorBox.setSelectObject(border.getBorderColor()); + borderShape.setSelectedMarker((Marker.createMarker(border.getShape()))); + borderRadius.setValue(border.getRoundRadius()); + + checkDetailPane(); + checkColorPane(); + checkRadiusPane(); + } + + public void update(AttrBorderWithShape border) { + if (border == null) { + return; + } + + border.setBorderStyle(lineTypeBox.getSelectedLineStyle()); + border.setAutoColor(lineColorButton.getSelectedIndex() == AUTO_COLOR); + border.setBorderColor(lineColorBox.getSelectObject()); + border.setShape(MarkerType.parse(borderShape.getSelectedMarkder().getMarkerType())); + border.setRoundRadius((int) borderRadius.getValue()); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..363fdd87e7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/CategoryNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class CategoryNameFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public CategoryNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Category_Use_Name"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedPercentFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedPercentFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..4190669ce7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedPercentFormatPaneWithoutCheckBox.java @@ -0,0 +1,21 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class ChangedPercentFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public ChangedPercentFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Change_Percent"); + } + + protected boolean isPercent() { + return true; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedValueFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedValueFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..5c436bc5d9 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ChangedValueFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class ChangedValueFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public ChangedValueFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Change_Value"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/MapAreaNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/MapAreaNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..a70f8c5562 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/MapAreaNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class MapAreaNameFormatPaneWithoutCheckBox extends CategoryNameFormatPaneWithoutCheckBox { + + public MapAreaNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Area_Name"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/PercentFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/PercentFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..82fa407cb7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/PercentFormatPaneWithoutCheckBox.java @@ -0,0 +1,21 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class PercentFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public PercentFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Use_Percent"); + } + + protected boolean isPercent() { + return true; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SeriesNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SeriesNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..54542cca60 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/SeriesNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class SeriesNameFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public SeriesNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Series_Name"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ValueFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ValueFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..e19b79c035 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/ValueFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class ValueFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public ValueFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Use_Value"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java index 3c8591bd63..6f5fc270ac 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithCheckBox.java @@ -5,8 +5,9 @@ import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.frpane.UIBubbleFloatPane; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.style.FormatPane; - +import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.stable.Constants; @@ -17,6 +18,7 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.text.Format; +import java.util.Map; /** * Created by Mitisky on 16/2/23. @@ -41,8 +43,14 @@ public abstract class VanChartFormatPaneWithCheckBox extends JPanel{ this.setLayout(new BorderLayout()); isSelectedBox = new UICheckBox(getCheckBoxText()); - formatButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Format")); - this.add(isSelectedBox, BorderLayout.CENTER); + formatButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Use_Format")); + + if (showSelectBox()) { + this.add(isSelectedBox, BorderLayout.CENTER); + } else { + this.add(new UILabel(getCheckBoxText()), BorderLayout.CENTER); + } + this.add(formatButton, BorderLayout.EAST); initFormatListener(); @@ -76,6 +84,10 @@ public abstract class VanChartFormatPaneWithCheckBox extends JPanel{ protected abstract String getCheckBoxText(); + protected boolean showSelectBox() { + return true; + } + protected boolean isPercent() { return false; } @@ -135,4 +147,12 @@ public abstract class VanChartFormatPaneWithCheckBox extends JPanel{ tooltipFormat.setFormat(format); tooltipFormat.setEnable(isSelectedBox.isSelected()); } + + public void updateFormatParams(Map paramMap, String value) { + String key = this.getCheckBoxText(); + + if (paramMap != null && !paramMap.containsKey(key)) { + paramMap.put(key, value); + } + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..35d475a555 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/VanChartFormatPaneWithoutCheckBox.java @@ -0,0 +1,16 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public abstract class VanChartFormatPaneWithoutCheckBox extends VanChartFormatPaneWithCheckBox { + + public VanChartFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected boolean showSelectBox() { + return false; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/XFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/XFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..da09d29dc2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/XFormatPaneWithoutCheckBox.java @@ -0,0 +1,16 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class XFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public XFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return "x"; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/YFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/YFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..b5422dd507 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/format/YFormatPaneWithoutCheckBox.java @@ -0,0 +1,16 @@ +package com.fr.van.chart.designer.component.format; + +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class YFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + + public YFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return "y"; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/GaugeLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/GaugeLabelContentPane.java index 94506858e1..690a6ab244 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/GaugeLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/GaugeLabelContentPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.designer.component.label; +import com.fr.design.i18n.Toolkit; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.style.VanChartStylePane; @@ -16,11 +17,18 @@ public class GaugeLabelContentPane extends VanChartLabelContentPane { } protected String getLabelContentTitle() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Content"); + return Toolkit.i18nText("Fine-Design_Chart_Content"); } protected JPanel getLabelContentPane(JPanel contentPane) { return contentPane; } + protected boolean supportRichEditor() { + return false; + } + + protected boolean hasTextStylePane() { + return false; + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCate.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCate.java index 982b0a3a7e..23133813c7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCate.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCate.java @@ -27,7 +27,7 @@ public class LabelContentPaneWithCate extends GaugeLabelContentPane { protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, + new Component[]{getCategoryNameFormatPane(),null}, }; } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCateValue.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCateValue.java index 1d2bbf5e49..4b8f8013df 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCateValue.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithCateValue.java @@ -27,8 +27,8 @@ public class LabelContentPaneWithCateValue extends GaugeLabelContentPane { protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{valueFormatPane,null}, + new Component[]{getCategoryNameFormatPane(),null}, + new Component[]{getValueFormatPane(),null}, }; } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithOutCate.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithOutCate.java index 45bcb3b83a..821fa1d722 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithOutCate.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithOutCate.java @@ -27,9 +27,9 @@ public class LabelContentPaneWithOutCate extends GaugeLabelContentPane { protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{seriesNameFormatPane, null}, - new Component[]{valueFormatPane, null}, - new Component[]{percentFormatPane, null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, }; } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithPercent.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithPercent.java index 0efbb9bb92..0c73f25e18 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithPercent.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/label/LabelContentPaneWithPercent.java @@ -26,7 +26,7 @@ public class LabelContentPaneWithPercent extends GaugeLabelContentPane { protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{percentFormatPane, null}, + new Component[]{getPercentFormatPane(), null}, }; } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java index 1774888ba5..ca7479cc05 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/RefreshTooltipContentPaneWithOutSeries.java @@ -1,7 +1,9 @@ package com.fr.van.chart.designer.component.tooltip; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -15,12 +17,24 @@ public class RefreshTooltipContentPaneWithOutSeries extends TooltipContentPaneWi super(null, showOnPane); } + protected boolean supportRichEditor() { + return false; + } + @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + setRichTextChangedValueFormatPane(new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextChangedPercentFormatPane(new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected double[] getRowSize(double p){ @@ -29,11 +43,21 @@ public class RefreshTooltipContentPaneWithOutSeries extends TooltipContentPaneWi protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getCategoryNameFormatPane(),null}, + new Component[]{getValueFormatPane(),null}, + new Component[]{getChangedValueFormatPane(),null}, + new Component[]{getPercentFormatPane(),null}, + new Component[]{getChangedPercentFormatPane(),null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java index 61216a57fd..8724429f3c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/component/tooltip/TooltipContentPaneWithOutSeries.java @@ -1,6 +1,10 @@ package com.fr.van.chart.designer.component.tooltip; +import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -23,9 +27,37 @@ public class TooltipContentPaneWithOutSeries extends VanChartTooltipContentPane protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{percentFormatPane,null}, + new Component[]{getCategoryNameFormatPane(),null}, + new Component[]{getValueFormatPane(),null}, + new Component[]{getPercentFormatPane(),null}, }; } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null} + }; + } + + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + getRichTextCategoryNameFormatPane(), + getRichTextValueFormatPane(), + getRichTextPercentFormatPane() + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + attrTooltipContent.getRichTextCategoryFormat(), + attrTooltipContent.getRichTextValueFormat(), + attrTooltipContent.getRichTextPercentFormat() + }; + + setRichTextAttr(new AttrTooltipRichText()); + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java index 49ed070239..885931cb93 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/other/VanChartInteractivePane.java @@ -29,6 +29,7 @@ import com.fr.plugin.chart.base.VanChartAttrMarker; import com.fr.plugin.chart.base.VanChartConstants; import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.base.VanChartZoom; +import com.fr.plugin.chart.gantt.attr.AttrGanttLabel; import com.fr.plugin.chart.map.line.condition.AttrLineEffect; import com.fr.plugin.chart.scatter.attr.ScatterAttrLabel; import com.fr.plugin.chart.vanchart.VanChart; @@ -436,6 +437,7 @@ public class VanChartInteractivePane extends AbstractVanChartScrollPane { conditionAttr.remove(AttrEffect.class); conditionAttr.remove(AttrLineEffect.class); conditionAttr.remove(AttrFloatColor.class); + conditionAttr.remove(AttrGanttLabel.class); VanChartAttrMarker attrMarker = conditionAttr.getExisted(VanChartAttrMarker.class); if (attrMarker != null && !attrMarker.isCommon()) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java index 69e2357a98..d5f866c818 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartAxisButtonPane.java @@ -8,7 +8,6 @@ import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.imenu.UIPopupMenu; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; - import com.fr.plugin.chart.VanChartAttrHelper; import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.plot.VanChartAxisPlot; @@ -18,6 +17,8 @@ import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.Icon; import javax.swing.JPanel; +import java.util.ArrayList; +import java.util.List; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; @@ -29,8 +30,6 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; /** * 坐标轴-上方按钮界面 @@ -41,9 +40,12 @@ public class VanChartAxisButtonPane extends BasicBeanPane { private static final int B_W = 56; private static final int B_H = 21; private static final int COL_COUNT = 3; + private static final int MAX_COUNT = 20; private UIButton addButton; private UIPopupMenu popupMenu; + private UIMenuItem itemX; + private UIMenuItem itemY; private List indexList_X = new ArrayList(); private List indexList_Y = new ArrayList(); @@ -51,7 +53,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane { private VanChartAxisPane parent; - public VanChartAxisButtonPane(VanChartAxisPane vanChartAxisPane){ + public VanChartAxisButtonPane(VanChartAxisPane vanChartAxisPane) { this.parent = vanChartAxisPane; this.setLayout(new BorderLayout()); @@ -66,6 +68,20 @@ public class VanChartAxisButtonPane extends BasicBeanPane { buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 10, 0)); this.add(buttonPane, BorderLayout.CENTER); + itemX = new UIMenuItem(VanChartAttrHelper.X_AXIS_PREFIX); + itemX.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + addXAxis(); + } + }); + itemY = new UIMenuItem(VanChartAttrHelper.Y_AXIS_PREFIX); + itemY.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + addYAxis(); + } + }); addButton.addActionListener(addListener); } @@ -92,12 +108,12 @@ public class VanChartAxisButtonPane extends BasicBeanPane { pane = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); buttonPane.add(pane); } - if(pane != null) { + if (pane != null) { pane.add(indexList_Y.get(i)); } } - if(popupMenu != null){ + if (popupMenu != null) { popupMenu.setVisible(false); } @@ -114,19 +130,19 @@ public class VanChartAxisButtonPane extends BasicBeanPane { indexList_X.clear(); indexList_Y.clear(); List xList = plot.getXAxisList(); - for(VanChartAxis axis : xList){ + for (VanChartAxis axis : xList) { ChartAxisButton x = new ChartAxisButton(plot.getXAxisName(axis)); x.setToolTipText(plot.getXAxisName(axis)); indexList_X.add(x); } List yList = plot.getYAxisList(); - for(VanChartAxis axis : yList){ + for (VanChartAxis axis : yList) { ChartAxisButton y = new ChartAxisButton(plot.getYAxisName(axis)); y.setToolTipText(plot.getYAxisName(axis)); indexList_Y.add(y); } - if(indexList_X.isEmpty()){ + if (indexList_X.isEmpty()) { this.removeAll(); } else { indexList_X.get(0).setSelected(true); @@ -143,7 +159,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane { return null; } - public String getNewChartName(List existList, String prefix){ + public String getNewChartName(List existList, String prefix) { int count = existList.size() + 1; while (true) { String name_test = prefix + count; @@ -165,31 +181,19 @@ public class VanChartAxisButtonPane extends BasicBeanPane { ActionListener addListener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if(popupMenu == null){ - popupMenu = new UIPopupMenu(); - UIMenuItem item_x = new UIMenuItem(VanChartAttrHelper.X_AXIS_PREFIX); - item_x.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - addXAxis(); - } - }); - UIMenuItem item_y = new UIMenuItem(VanChartAttrHelper.Y_AXIS_PREFIX); - item_y.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - addYAxis(); - } - }); - popupMenu.add(item_x); - popupMenu.add(item_y); + popupMenu = new UIPopupMenu(); + if (indexList_X.size() < MAX_COUNT) { + popupMenu.add(itemX); + } + if (indexList_Y.size() < MAX_COUNT) { + popupMenu.add(itemY); } popupMenu.setVisible(true); GUICoreUtils.showPopupMenu(popupMenu, addButton, addButton.getWidth() - popupMenu.getPreferredSize().width, addButton.getY() - 1 + addButton.getHeight()); } }; - private void addXAxis(){ + private void addXAxis() { String name = getNewChartName(indexList_X, VanChartAttrHelper.X_AXIS_PREFIX); ChartAxisButton button = new ChartAxisButton(name); @@ -199,7 +203,7 @@ public class VanChartAxisButtonPane extends BasicBeanPane { layoutPane(); } - private void addYAxis(){ + private void addYAxis() { String name = getNewChartName(indexList_Y, VanChartAttrHelper.Y_AXIS_PREFIX); ChartAxisButton button = new ChartAxisButton(name); @@ -216,9 +220,10 @@ public class VanChartAxisButtonPane extends BasicBeanPane { private class AddButton extends UIButton { - public AddButton(Icon icon){ + public AddButton(Icon icon) { super(icon); } + /** * 组件是否需要响应添加的观察者事件 * @@ -277,19 +282,19 @@ public class VanChartAxisButtonPane extends BasicBeanPane { } private void noSelected() { - for(ChartAxisButton button : indexList_X){ + for (ChartAxisButton button : indexList_X) { button.setSelected(false); } - for(ChartAxisButton button : indexList_Y){ + for (ChartAxisButton button : indexList_Y) { button.setSelected(false); } } private void checkMoveOn(boolean moveOn) { - for(ChartAxisButton button : indexList_X){ + for (ChartAxisButton button : indexList_X) { button.isMoveOn = false; } - for(ChartAxisButton button : indexList_Y){ + for (ChartAxisButton button : indexList_Y) { button.isMoveOn = false; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java index 64187f89b9..9a5c453828 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeCateOrPercentLabelDetailPane.java @@ -22,7 +22,7 @@ public class VanChartGaugeCateOrPercentLabelDetailPane extends VanChartGaugeLabe } protected double[] getLabelPaneRowSize(Plot plot, double p) { - if (hasLabelAlign(plot)) { + if (hasLabelAlignPane()) { return new double[]{p, p, p, p}; } @@ -37,10 +37,10 @@ public class VanChartGaugeCateOrPercentLabelDetailPane extends VanChartGaugeLabe switch (getGaugeStyle()) { case POINTER: case POINTER_SEMI: - dataLabelContentPane = new LabelContentPaneWithCate(parent, VanChartGaugeCateOrPercentLabelDetailPane.this); + setDataLabelContentPane(new LabelContentPaneWithCate(getParentPane(), VanChartGaugeCateOrPercentLabelDetailPane.this)); break; default: - dataLabelContentPane = new LabelContentPaneWithPercent(parent, VanChartGaugeCateOrPercentLabelDetailPane.this); + setDataLabelContentPane(new LabelContentPaneWithPercent(getParentPane(), VanChartGaugeCateOrPercentLabelDetailPane.this)); break; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java index bbdb6acb3d..665fdc2565 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeLabelDetailPane.java @@ -24,6 +24,8 @@ import javax.swing.SwingConstants; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; /** * Created by mengao on 2017/8/13. @@ -35,6 +37,8 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { private UIButtonGroup align; private JPanel alignPane; private Integer[] oldAlignValues; + private UIButtonGroup style; + private ChartTextAttrPane textFontPane; public VanChartGaugeLabelDetailPane(Plot plot, VanChartStylePane parent) { super(plot, parent); @@ -63,6 +67,15 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { return TableLayoutHelper.createTableLayoutPane(getLabelStyleComponents(plot), row, col); } + protected void initStyleListener() { + style.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + checkStyleUse(); + } + }); + } + protected boolean isFontSizeAuto() { return false; } @@ -101,8 +114,9 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { }; } - protected JPanel getLabelPositionPane(Component[][] comps, double[] row, double[] col) { - return TableLayoutHelper.createTableLayoutPane(comps, row, col); + // 仪表盘标签内无布局tab + protected JPanel getLabelLayoutPane(JPanel panel, String title) { + return panel; } protected JPanel createTableLayoutPaneWithTitle(String title, JPanel panel) { @@ -110,17 +124,20 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { } protected Component[][] getLabelPaneComponents(Plot plot, double p, double[] columnSize) { - if (hasLabelAlign(plot)) { + if (hasLabelAlignPane()) { return new Component[][]{ - new Component[]{dataLabelContentPane, null}, + new Component[]{getDataLabelContentPane(), null}, new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Vertical"), plot), null}, new Component[]{createLabelAlignPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Horizontal")), null}, new Component[]{createLabelStylePane(getLabelStyleRowSize(p), columnSize, plot), null}, }; } else { - return super.getLabelPaneComponents(plot, p, columnSize); + return new Component[][]{ + new Component[]{getDataLabelContentPane(), null}, + new Component[]{createLabelStylePane(getLabelStyleRowSize(p), columnSize, plot), null}, + }; } } @@ -170,8 +187,8 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { alignPane.setLayout(new BorderLayout()); alignPane.add(getLabelPositionPane(comps, row, col), BorderLayout.CENTER); - if (parent != null) { - parent.initListener(alignPane); + if (getParentPane() != null) { + getParentPane().initListener(alignPane); } } @@ -206,19 +223,29 @@ public class VanChartGaugeLabelDetailPane extends VanChartPlotLabelDetailPane { return getGaugeStyle() == GaugeStyle.THERMOMETER && !((VanChartGaugePlot) plot).getGaugeDetailStyle().isHorizontalLayout(); } + protected boolean hasLabelAlignPane() { + return getGaugeStyle() == GaugeStyle.THERMOMETER; + } + public void populate(AttrLabelDetail detail) { super.populate(detail); style.setSelectedIndex(1); + textFontPane.populate(detail.getTextAttr()); if (hasLabelAlign(this.getPlot()) && align != null) { align.setSelectedItem(detail.getAlign()); } + + checkStyleUse(); } public void update(AttrLabelDetail detail) { super.update(detail); detail.setCustom(true); + if (textFontPane != null) { + detail.setTextAttr(textFontPane.update()); + } if (align != null) { if (align.getSelectedItem() != null) { detail.setAlign(align.getSelectedItem()); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugePlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugePlotLabelPane.java index 0f81deefca..9bc21a0446 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugePlotLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugePlotLabelPane.java @@ -1,13 +1,15 @@ package com.fr.van.chart.designer.style.label; import com.fr.chart.chartattr.Plot; - +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.i18n.Toolkit; +import com.fr.plugin.chart.attr.GaugeDetailStyle; import com.fr.plugin.chart.base.AttrLabel; +import com.fr.plugin.chart.base.AttrLabelDetail; import com.fr.plugin.chart.gauge.VanChartGaugePlot; import com.fr.plugin.chart.type.GaugeStyle; import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.style.VanChartStylePane; -import com.fr.design.i18n.Toolkit; import javax.swing.JPanel; import java.awt.BorderLayout; @@ -18,6 +20,9 @@ import java.awt.BorderLayout; public class VanChartGaugePlotLabelPane extends VanChartPlotLabelPane { private static final long serialVersionUID = -322148616244458359L; + private UIButtonGroup orientation; + private JPanel layoutPane; + private VanChartPlotLabelDetailPane gaugeValueLabelPane; public VanChartGaugePlotLabelPane(Plot plot, VanChartStylePane parent) { @@ -25,10 +30,10 @@ public class VanChartGaugePlotLabelPane extends VanChartPlotLabelPane { } protected void createLabelPane() { - labelPane = new JPanel(new BorderLayout(0, 4)); - labelDetailPane = new VanChartGaugeCateOrPercentLabelDetailPane(this.plot, this.parent); - gaugeValueLabelPane = new VanChartGaugeValueLabelDetailPane(this.plot, this.parent); - GaugeStyle gaugeStyle = ((VanChartGaugePlot)this.plot).getGaugeStyle(); + setLabelPane(new JPanel(new BorderLayout(0, 4))); + setLabelDetailPane(new VanChartGaugeCateOrPercentLabelDetailPane(getPlot(), getParentPane())); + gaugeValueLabelPane = new VanChartGaugeValueLabelDetailPane(getPlot(), getParentPane()); + GaugeStyle gaugeStyle = ((VanChartGaugePlot)getPlot()).getGaugeStyle(); String cateTitle, valueTitle = Toolkit.i18nText("Fine-Design_Chart_Value_Label"); switch (gaugeStyle){ case POINTER: @@ -39,25 +44,67 @@ public class VanChartGaugePlotLabelPane extends VanChartPlotLabelPane { cateTitle = Toolkit.i18nText("Fine-Design_Chart_Percent_Label"); break; } - JPanel cateOrPercentPane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(cateTitle, labelDetailPane); + JPanel cateOrPercentPane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(cateTitle, getLabelDetailPane()); JPanel valuePane = TableLayout4VanChartHelper.createExpandablePaneWithTitle(valueTitle, gaugeValueLabelPane); - labelPane.add(cateOrPercentPane, BorderLayout.NORTH); - labelPane.add(valuePane, BorderLayout.SOUTH); + + layoutPane = createGaugeLabelLayoutPane(); + + getLabelPane().add(cateOrPercentPane, BorderLayout.NORTH); + getLabelPane().add(valuePane, BorderLayout.CENTER); + getLabelPane().add(layoutPane, BorderLayout.SOUTH); + + checkLayoutPaneVisible(); + } + + private void checkLayoutPaneVisible() { + layoutPane.setVisible(showLayoutPane()); + } + + private boolean showLayoutPane() { + VanChartGaugePlot plot = (VanChartGaugePlot) this.getPlot(); + GaugeDetailStyle gaugeDetailStyle = plot.getGaugeDetailStyle(); + + return plot.getGaugeStyle() == GaugeStyle.THERMOMETER && gaugeDetailStyle != null && gaugeDetailStyle.isHorizontalLayout(); + } + + // 试管仪表盘横行布局时,正常标签外增加布局tab,同时控制百分比和值标签的文本方向 + private JPanel createGaugeLabelLayoutPane() { + orientation = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), + Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), + }); + + JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Text_Orientation"), orientation); + + return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Form_Attr_Layout"), panel); } public void populate(AttrLabel attr) { super.populate(attr); if(gaugeValueLabelPane != null && attr != null){ - gaugeValueLabelPane.populate(attr.getGaugeValueLabelDetail()); + AttrLabelDetail labelDetail = attr.getGaugeValueLabelDetail(); + gaugeValueLabelPane.populate(labelDetail); + orientation.setSelectedIndex(labelDetail.isHorizontal() ? 0 : 1); + + checkLayoutPaneVisible(); } } public AttrLabel update() { AttrLabel attrLabel = super.update(); + if(gaugeValueLabelPane != null && attrLabel != null){ - gaugeValueLabelPane.update(attrLabel.getGaugeValueLabelDetail()); + AttrLabelDetail defaultLabelDetail = attrLabel.getAttrLabelDetail(); + AttrLabelDetail valueLabelDetail = attrLabel.getGaugeValueLabelDetail(); + + gaugeValueLabelPane.update(valueLabelDetail); + + boolean horizontal = orientation.getSelectedIndex() == 0; + defaultLabelDetail.setHorizontal(horizontal); + valueLabelDetail.setHorizontal(horizontal); } + return attrLabel; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeValueLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeValueLabelDetailPane.java index 01a21d3823..be528c9733 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeValueLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartGaugeValueLabelDetailPane.java @@ -24,10 +24,10 @@ public class VanChartGaugeValueLabelDetailPane extends VanChartGaugeLabelDetailP switch (getGaugeStyle()) { case POINTER: case POINTER_SEMI: - dataLabelContentPane = new LabelContentPaneWithOutCate(parent, VanChartGaugeValueLabelDetailPane.this); + setDataLabelContentPane(new LabelContentPaneWithOutCate(getParentPane(), VanChartGaugeValueLabelDetailPane.this)); break; default: - dataLabelContentPane = new LabelContentPaneWithCateValue(parent, VanChartGaugeValueLabelDetailPane.this); + setDataLabelContentPane(new LabelContentPaneWithCateValue(getParentPane(), VanChartGaugeValueLabelDetailPane.this)); break; } } @@ -44,7 +44,7 @@ public class VanChartGaugeValueLabelDetailPane extends VanChartGaugeLabelDetailP private Component[][] getLabelPaneComponentsWithBackground(Plot plot, double p, double[] columnSize) { return new Component[][]{ - new Component[]{dataLabelContentPane, null}, + new Component[]{getDataLabelContentPane(), null}, new Component[]{createLabelStylePane(new double[]{p}, columnSize, plot), null}, new Component[]{createBackgroundColorPane(), null}, }; diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartLabelPane.java index dfcd1a6443..96e2a7d24e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartLabelPane.java @@ -64,11 +64,14 @@ public class VanChartLabelPane extends AbstractVanChartScrollPane { return; } ConditionAttr attrList = chart.getPlot().getConditionCollection().getDefaultAttr(); + + // labelPane中颜色选择器会触发listener.doChange(),导致style界面update两次, + // 为了避免递归updateBean时,remove与add不匹配,调整一下labelPane.update()的位置 + AttrLabel attrLabel = labelPane.update(); DataSeriesCondition attr = ((VanChartPlot)chart.getPlot()).getAttrLabelFromConditionCollection(); if(attr != null) { attrList.remove(attr); } - AttrLabel attrLabel = labelPane.update(); if (attrLabel != null) { attrList.addDataSeriesCondition(attrLabel); } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java index c506d89ea1..1470951976 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelDetailPane.java @@ -7,12 +7,11 @@ import com.fr.design.dialog.BasicPane; import com.fr.design.gui.ibutton.UIButtonGroup; import com.fr.design.gui.ibutton.UIToggleButton; 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.style.ChartTextAttrPane; import com.fr.design.style.color.ColorSelectBox; -import com.fr.design.i18n.Toolkit; - import com.fr.general.ComparatorUtils; import com.fr.plugin.chart.attr.plot.VanChartLabelPositionPlot; import com.fr.plugin.chart.base.AttrLabelDetail; @@ -20,6 +19,8 @@ import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.stable.Constants; import com.fr.van.chart.designer.PlotFactory; import com.fr.van.chart.designer.TableLayout4VanChartHelper; +import com.fr.van.chart.designer.component.background.VanChartBackgroundWithOutImagePane; +import com.fr.van.chart.designer.component.border.VanChartBorderWithShapePane; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -28,9 +29,6 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * Created by Mitisky on 15/12/7. @@ -38,22 +36,27 @@ import java.awt.event.ActionListener; public class VanChartPlotLabelDetailPane extends BasicPane { private static final long serialVersionUID = -22438250307946275L; - protected BasicBeanPane dataLabelContentPane; + public static final int HORIZONTAL_INDEX = 0; - protected UIButtonGroup position; - protected UIButtonGroup autoAdjust; - protected UIToggleButton tractionLine; + private BasicBeanPane dataLabelContentPane; - protected UIButtonGroup style; - protected ChartTextAttrPane textFontPane; + private UIButtonGroup position; + private UIButtonGroup autoAdjust; + private UIButtonGroup orientation; + private UIToggleButton tractionLine; - protected ColorSelectBox backgroundColor; + private ColorSelectBox backgroundColor; + private VanChartBorderWithShapePane borderPane; + private VanChartBackgroundWithOutImagePane backgroundPane; private JPanel tractionLinePane; private JPanel positionPane; private Integer[] oldPositionValues; - protected VanChartStylePane parent; + private JPanel borderPaneWithTitle; + private JPanel backgroundPaneWithTitle; + + private VanChartStylePane parent; private Plot plot; public VanChartPlotLabelDetailPane(Plot plot, VanChartStylePane parent) { @@ -62,6 +65,18 @@ public class VanChartPlotLabelDetailPane extends BasicPane { initLabelDetailPane(plot); } + public BasicBeanPane getDataLabelContentPane() { + return dataLabelContentPane; + } + + public void setDataLabelContentPane(BasicBeanPane dataLabelContentPane) { + this.dataLabelContentPane = dataLabelContentPane; + } + + public VanChartStylePane getParentPane() { + return parent; + } + protected void initLabelDetailPane (Plot plot) { this.setLayout(new BorderLayout()); initToolTipContentPane(plot); @@ -73,6 +88,10 @@ public class VanChartPlotLabelDetailPane extends BasicPane { return plot; } + public UIButtonGroup getOrientation() { + return orientation; + } + //默认从factory中取 protected void initToolTipContentPane(Plot plot) { dataLabelContentPane = PlotFactory.createPlotLabelContentPane(plot, parent, VanChartPlotLabelDetailPane.this); @@ -91,17 +110,51 @@ public class VanChartPlotLabelDetailPane extends BasicPane { protected Component[][] getLabelPaneComponents(Plot plot, double p, double[] columnSize) { if(hasLabelPosition(plot)){ + + // 仅饼图、柱形图、条形图、折线图、面积图含有边框和背景 + if (hasBorderAndBackground(plot)) { + return new Component[][]{ + new Component[]{dataLabelContentPane,null}, + new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), plot), null}, + new Component[]{createLabelBorderPane(), null}, + new Component[]{createLabelBackgroundPane(), null} + }; + } + return new Component[][]{ new Component[]{dataLabelContentPane,null}, - new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), plot), null}, - new Component[]{createLabelStylePane(getLabelStyleRowSize(p), columnSize, plot),null}, - }; - } else { - return new Component[][]{ - new Component[]{dataLabelContentPane,null}, - new Component[]{createLabelStylePane(getLabelStyleRowSize(p), columnSize, plot),null}, + new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), plot), null} }; } + + return new Component[][]{ + new Component[]{dataLabelContentPane,null} + }; + } + + private JPanel createLabelBorderPane() { + borderPane = new VanChartBorderWithShapePane(); + borderPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane); + + return borderPaneWithTitle; + } + + private JPanel createLabelBackgroundPane() { + backgroundPane = new VanChartBackgroundWithOutImagePane(){ + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Fill")), typeComboBox}, + new Component[]{null, centerPane}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Report_Alpha")), transparent}, + }; + } + }; + + backgroundPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane); + + return backgroundPaneWithTitle; } protected double[] getLabelStyleRowSize(double p) { @@ -116,6 +169,10 @@ public class VanChartPlotLabelDetailPane extends BasicPane { return plot instanceof VanChartLabelPositionPlot; } + private boolean hasBorderAndBackground(Plot plot) { + return PlotFactory.hasBorderAndBackgroundPlotLabel(plot); + } + protected JPanel createTableLayoutPaneWithTitle(String title, JPanel panel) { return TableLayout4VanChartHelper.createExpandablePaneWithTitle(title, panel); } @@ -150,8 +207,11 @@ public class VanChartPlotLabelDetailPane extends BasicPane { positionPane = new JPanel(); checkPositionPane(title); - panel.add(positionPane, BorderLayout.CENTER); + panel.add(positionPane, BorderLayout.NORTH); + if (hasLabelOrientationPane()) { + panel.add(createLabelOrientationPane(), BorderLayout.CENTER); + } if (plot.isSupportLeadLine()) { tractionLine = new UIToggleButton(Toolkit.i18nText("Fine-Design_Chart_Show_Guideline")); @@ -161,7 +221,31 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } else if (PlotFactory.plotAutoAdjustLabelPosition(plot)) { panel.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Auto_Adjust"), autoAdjust), BorderLayout.SOUTH); } - return panel; + + return getLabelLayoutPane(panel, Toolkit.i18nText("Fine-Design_Form_Attr_Layout")); + } + + protected JPanel getLabelLayoutPane(JPanel panel, String title) { + return createTableLayoutPaneWithTitle(title, panel); + } + + protected boolean hasLabelOrientationPane() { + return false; + } + + private JPanel createLabelOrientationPane() { + orientation = new UIButtonGroup<>(new String[]{ + Toolkit.i18nText("Fine-Design_Chart_Direction_Horizontal"), + Toolkit.i18nText("Fine-Design_Chart_Direction_Vertical"), + }); + + orientation.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + checkOrientation(); + } + }); + + return TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Text_Orientation"), orientation); } protected void checkPositionPane(String title) { @@ -198,13 +282,10 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } } - protected JPanel getLabelPositionPane (Component[][] comps, double[] row, double[] col){ - JPanel panel = TableLayoutHelper.createTableLayoutPane(comps,row,col); - return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Form_Attr_Layout"), panel); + return TableLayoutHelper.createTableLayoutPane(comps, row, col); } - protected void initPositionListener() { position.addChangeListener(new ChangeListener() { @Override @@ -214,17 +295,6 @@ public class VanChartPlotLabelDetailPane extends BasicPane { }); } - protected JPanel createLabelStylePane(double[] row, double[] col, Plot plot) { - style = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Automatic"), - Toolkit.i18nText("Fine-Design_Chart_Custom")}); - textFontPane =initTextFontPane(); - - initStyleListener(); - - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(getLabelStyleComponents(plot),row,col); - return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel); - } - protected ChartTextAttrPane initTextFontPane () { return new ChartTextAttrPane(){ protected Component[][] getComponents(JPanel buttonPane) { @@ -237,24 +307,6 @@ public class VanChartPlotLabelDetailPane extends BasicPane { }; } - protected Component[][] getLabelStyleComponents(Plot plot) { - UILabel text = new UILabel(Toolkit.i18nText("Fine-Design_Chart_Character"), SwingConstants.LEFT); - return new Component[][]{ - new Component[]{null,null}, - new Component[]{text,style}, - new Component[]{textFontPane,null}, - }; - } - - protected void initStyleListener() { - style.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkStyleUse(); - } - }); - } - protected JPanel createBackgroundColorPane() { backgroundColor = new ColorSelectBox(100); return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundColor); @@ -265,22 +317,26 @@ public class VanChartPlotLabelDetailPane extends BasicPane { } private void checkAllUse() { - checkStyleUse(); if(tractionLine == null){ return; } checkPositionEnabled(); } - protected void checkStyleUse() { - textFontPane.setVisible(style.getSelectedIndex() == 1); - textFontPane.setPreferredSize(style.getSelectedIndex() == 1 ? new Dimension(0, 60) : new Dimension(0, 0)); - } - private void checkPosition() { tractionLine.setSelected(position.getSelectedItem() == Constants.OUTSIDE); checkPositionEnabled(); } + + private void checkOrientation() { + if (orientation != null && borderPaneWithTitle != null && backgroundPaneWithTitle != null) { + boolean horizontal = orientation.getSelectedIndex() == HORIZONTAL_INDEX; + + borderPaneWithTitle.setVisible(horizontal); + backgroundPaneWithTitle.setVisible(horizontal); + } + } + private void checkPositionEnabled() { tractionLinePane.setVisible(position.getSelectedItem() == Constants.OUTSIDE); } @@ -295,20 +351,28 @@ public class VanChartPlotLabelDetailPane extends BasicPane { if(position != null){ position.setSelectedItem(detail.getPosition()); } + if(orientation != null){ + orientation.setSelectedIndex(detail.isHorizontal() ? 0 : 1); + } if(tractionLine != null){ tractionLine.setSelected(detail.isShowGuidLine()); } if(autoAdjust != null){ - autoAdjust.setSelectedIndex(detail.isAutoAdjust() == true ? 0 : 1); + autoAdjust.setSelectedIndex(detail.isAutoAdjust() ? 0 : 1); } - style.setSelectedIndex(detail.isCustom() ? 1 : 0); - textFontPane.populate(detail.getTextAttr()); if(backgroundColor != null){ backgroundColor.setSelectObject(detail.getBackgroundColor()); } + if(borderPane != null){ + borderPane.populate(detail.getBorder()); + } + if(backgroundPane != null){ + backgroundPane.populate(detail.getBackground()); + } checkAllUse(); + checkOrientation(); } @@ -324,16 +388,21 @@ public class VanChartPlotLabelDetailPane extends BasicPane { detail.setAutoAdjust(autoAdjust != null && autoAdjust.getSelectedItem()); + if(orientation != null){ + detail.setHorizontal(orientation.getSelectedIndex() == 0); + } if(tractionLine != null){ detail.setShowGuidLine(tractionLine.isSelected() && detail.getPosition() == Constants.OUTSIDE); } - detail.setCustom(style.getSelectedIndex() == 1); - if(textFontPane != null){ - detail.setTextAttr(textFontPane.update()); - } if(backgroundColor != null){ detail.setBackgroundColor(backgroundColor.getSelectObject()); } + if(borderPane != null){ + borderPane.update(detail.getBorder()); + } + if(backgroundPane != null){ + backgroundPane.update(detail.getBackground()); + } } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelNoCheckPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelNoCheckPane.java index 95eb30204f..beb89e5d78 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelNoCheckPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelNoCheckPane.java @@ -19,12 +19,12 @@ public class VanChartPlotLabelNoCheckPane extends VanChartPlotLabelPane { protected void addComponents() { this.setLayout(new BorderLayout()); - this.add(labelPane,BorderLayout.CENTER); + this.add(getLabelPane(),BorderLayout.CENTER); } public void populate(AttrLabel attr) { super.populate(attr); - isLabelShow.setSelected(true); - labelPane.setVisible(true); + getLabelShowCheckBox().setSelected(true); + getLabelPane().setVisible(true); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java index e0a007dd25..f1fa6f0f1a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/label/VanChartPlotLabelPane.java @@ -3,6 +3,7 @@ package com.fr.van.chart.designer.style.label; import com.fr.chart.chartattr.Plot; import com.fr.design.dialog.BasicPane; import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; @@ -19,24 +20,52 @@ import java.awt.event.ActionListener; public class VanChartPlotLabelPane extends BasicPane { private static final long serialVersionUID = -1701936672446232396L; - protected UICheckBox isLabelShow; + private UICheckBox isLabelShow; - protected VanChartPlotLabelDetailPane labelDetailPane; + private VanChartPlotLabelDetailPane labelDetailPane; - protected VanChartStylePane parent; - protected Plot plot; + private VanChartStylePane parent; + private Plot plot; - protected JPanel labelPane; + private JPanel labelPane; public VanChartPlotLabelPane(Plot plot, VanChartStylePane parent) { this.parent = parent; this.plot = plot; - isLabelShow = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Use_Label")); + isLabelShow = new UICheckBox(Toolkit.i18nText("Fine-Design_Chart_Use_Label")); labelPane = new JPanel(new BorderLayout(0, 4)); createLabelPane(); addComponents(); } + public UICheckBox getLabelShowCheckBox() { + return isLabelShow; + } + + public VanChartPlotLabelDetailPane getLabelDetailPane() { + return labelDetailPane; + } + + public void setLabelDetailPane(VanChartPlotLabelDetailPane labelDetailPane) { + this.labelDetailPane = labelDetailPane; + } + + public VanChartStylePane getParentPane() { + return parent; + } + + public Plot getPlot() { + return plot; + } + + public JPanel getLabelPane() { + return labelPane; + } + + public void setLabelPane(JPanel labelPane) { + this.labelPane = labelPane; + } + protected void createLabelPane() { labelDetailPane = new VanChartPlotLabelDetailPane(this.plot, this.parent); labelPane.add(labelDetailPane, BorderLayout.CENTER); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotRefreshTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotRefreshTooltipPane.java index ade1d85bdb..0f71c9de69 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotRefreshTooltipPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotRefreshTooltipPane.java @@ -72,7 +72,6 @@ public class VanChartPlotRefreshTooltipPane extends VanChartPlotTooltipNoCheckPa Component[][] components = new Component[][]{ new Component[]{refreshTooltipContentPane,null}, new Component[]{initDurationPane(),null}, - new Component[]{createLabelStylePane(),null}, new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Border"),borderPane),null}, new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane),null}, diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java index 1c3ed4aa53..aa86fb9a73 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/tooltip/VanChartPlotTooltipPane.java @@ -7,8 +7,6 @@ import com.fr.design.gui.icheckbox.UICheckBox; 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.style.ChartTextAttrPane; - import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; import com.fr.plugin.chart.base.AttrTooltip; @@ -28,13 +26,11 @@ import java.awt.event.ActionListener; public class VanChartPlotTooltipPane extends BasicPane { private static final long serialVersionUID = 6087381131907589370L; + // todo 使用private protected UICheckBox isTooltipShow; protected VanChartTooltipContentPane tooltipContentPane; - protected UIButtonGroup style; - protected ChartTextAttrPane textFontPane; - protected VanChartBorderWithRadiusPane borderPane; protected VanChartBackgroundWithOutImagePane backgroundPane; @@ -95,7 +91,6 @@ public class VanChartPlotTooltipPane extends BasicPane { protected Component[][] createComponents(Plot plot) { Component[][] components = new Component[][]{ new Component[]{tooltipContentPane,null}, - new Component[]{createLabelStylePane(),null}, new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"),borderPane),null}, new Component[]{TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane),null}, new Component[]{createDisplayStrategy(plot),null}, @@ -108,38 +103,6 @@ public class VanChartPlotTooltipPane extends BasicPane { tooltipContentPane = PlotFactory.createPlotTooltipContentPane(plot, parent, VanChartPlotTooltipPane.this); } - protected JPanel createLabelStylePane() { - style = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Automatic"),Toolkit.i18nText("Fine-Design_Chart_Custom")}); - textFontPane = new ChartTextAttrPane() { - protected Component[][] getComponents(JPanel buttonPane) { - return new Component[][]{ - new Component[]{null, null}, - new Component[]{null, getFontNameComboBox()}, - new Component[]{null, buttonPane} - }; - } - }; - - JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Character"), style); - JPanel panel1 = new JPanel(new BorderLayout()); - panel1.add(panel, BorderLayout.CENTER); - panel1.add(textFontPane, BorderLayout.SOUTH); - - initStyleListener(); - - return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Widget_Style"), panel1); - } - - - private void initStyleListener() { - style.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - checkStyleUse(); - } - }); - } - protected JPanel createDisplayStrategy(Plot plot) { showAllSeries = new UICheckBox(getShowAllSeriesLabelText()); followMouse = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Follow_Mouse"), @@ -175,7 +138,6 @@ public class VanChartPlotTooltipPane extends BasicPane { private void checkAllUse() { checkBoxUse(); - checkStyleUse(); } /** * 检查box使用. @@ -184,10 +146,6 @@ public class VanChartPlotTooltipPane extends BasicPane { tooltipPane.setVisible(isTooltipShow.isSelected()); } - private void checkStyleUse() { - textFontPane.setVisible(style.getSelectedIndex() == 1); - } - protected AttrTooltip getAttrTooltip() { return new AttrTooltip(); } @@ -202,8 +160,6 @@ public class VanChartPlotTooltipPane extends BasicPane { tooltipContentPane.populateBean(attr.getContent()); } - style.setSelectedIndex(attr.isCustom() ? 1 : 0); - textFontPane.populate(attr.getTextAttr()); borderPane.populate(attr.getGeneralInfo()); backgroundPane.populate(attr.getGeneralInfo()); if(showAllSeries != null) { @@ -224,10 +180,6 @@ public class VanChartPlotTooltipPane extends BasicPane { attrTooltip.setContent(tooltipContentPane.updateBean()); } - attrTooltip.setCustom(style.getSelectedIndex() == 1); - if(textFontPane != null){ - attrTooltip.setTextAttr(textFontPane.update()); - } borderPane.update(attrTooltip.getGeneralInfo()); backgroundPane.update(attrTooltip.getGeneralInfo()); if(showAllSeries != null) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java new file mode 100644 index 0000000000..6babd6a2f2 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractRectanglePlotPane.java @@ -0,0 +1,90 @@ +package com.fr.van.chart.designer.type; + +import com.fr.chart.chartglyph.ConditionCollection; +import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.PiePlot4VanChart; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.attr.axis.VanChartAxis; +import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot; +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.scatter.VanChartScatterPlot; +import com.fr.plugin.chart.type.VanChartPlotType; +import com.fr.plugin.chart.vanchart.VanChart; +import com.fr.stable.StringUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-08-24 + */ +public abstract class AbstractRectanglePlotPane extends AbstractVanChartTypePane { + + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartScatterPlot.VAN_CHART_SCATTER_PLOT_ID); + extendPlotIds.add(PiePlot4VanChart.VAN_CHART_PIE_PLOT); + } + + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + VanChartRectanglePlot vanChartRectanglePlot = (VanChartRectanglePlot) newPlot; + VanChartRectanglePlot clonePlot = (VanChartRectanglePlot) oldPlot.clone(); + clonePlot.setVanChartPlotType(vanChartRectanglePlot.getVanChartPlotType()); + //自定义类型的图形要增加一个y2轴,并且增加系列中的堆积条件,反之则要去掉y2轴和条件 + if (clonePlot.isCustomChart()) { + List valueAxisList = clonePlot.getValueAxisList(); + valueAxisList.add(vanChartRectanglePlot.getValueAxisList().get(1)); + clonePlot.setStackAndAxisCondition(vanChartRectanglePlot.getStackAndAxisCondition()); + } else { + List xAxisList = clonePlot.getXAxisList(); + List yAxisList = clonePlot.getYAxisList(); + List newXAxisList = new ArrayList<>(); + List newYAxisList = new ArrayList<>(); + newXAxisList.add(xAxisList.get(0)); + newYAxisList.add(yAxisList.get(0)); + clonePlot.setXAxisList(newXAxisList); + clonePlot.setYAxisList(newYAxisList); + clonePlot.setStackAndAxisCondition(new ConditionCollection()); + } + + //百分比堆积图值轴的格式不保留 + if (clonePlot.getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT || + ((VanChartRectanglePlot) oldPlot).getVanChartPlotType() == VanChartPlotType.STACK_BY_PERCENT) { + VanChartAxis cloneAxis = clonePlot.getValueAxisList().get(0); + VanChartAxis vanChartAxis = vanChartRectanglePlot.getValueAxisList().get(0); + cloneAxis.setFormat(vanChartAxis.getFormat()); + cloneAxis.setPercentage(vanChartAxis.isPercentage()); + cloneAxis.setCommonValueFormat(vanChartAxis.isCommonValueFormat()); + cloneAxis.setHtmlLabel(vanChartAxis.getHtmlLabel()); + } + return clonePlot; + } catch (CloneNotSupportedException ex) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + if (StringUtils.equals(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID, chart.getID())) { + VanChartBubblePlot vanChartBubblePlot = chart.getPlot(); + return !vanChartBubblePlot.isForceBubble(); + } + return extendPlotIds.contains(chart.getID()); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java index 6189c347b4..9cf9165547 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/type/AbstractVanChartTypePane.java @@ -1,10 +1,13 @@ package com.fr.van.chart.designer.type; import com.fr.base.BaseUtils; +import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.base.AttrFillStyle; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Legend; import com.fr.chart.chartattr.Plot; +import com.fr.chart.chartdata.NormalReportDataDefinition; +import com.fr.chart.chartdata.NormalTableDataDefinition; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.chartglyph.DataSheet; @@ -37,7 +40,7 @@ import java.awt.Component; import java.awt.Dimension; import java.awt.event.ActionListener; -public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { +public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { private static final long serialVersionUID = 7743244512351499265L; private UICheckBox largeModelCheckBox; @@ -119,7 +122,7 @@ public abstract class AbstractVanChartTypePane extends AbstractChartTypePane children = root.children(); + Enumeration children = root.children(); if (children.hasMoreElements()) { - DefaultMutableTreeNode child = children.nextElement(); + DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement(); - if(GEOJSONTreeHelper.getInstance().isSelectableTreeNode(child)){ + if (GEOJSONTreeHelper.isSelectableTreeNode(child)) { selectTreeNode(child, m_model); - }else{ + } else { setFirstChildTreeNode(child, m_model); } } } - private void setFirstChildTreeNode(DefaultMutableTreeNode parent, DefaultTreeModel m_model){ - Enumeration children = parent.children(); - if (children.hasMoreElements()){ - DefaultMutableTreeNode node = children.nextElement(); + private void setFirstChildTreeNode(DefaultMutableTreeNode parent, DefaultTreeModel m_model) { + Enumeration children = parent.children(); + if (children.hasMoreElements()) { + DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement(); selectTreeNode(node, m_model); } } - public void changeRootNode(TreeNode node){ + public void changeRootNode(TreeNode node) { DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); m_model.setRoot(node); } public String getSelectNodeJSONPath() { - if(this.getLastSelectedPathComponent() == null){ + if (this.getLastSelectedPathComponent() == null) { return StringUtils.EMPTY; } - DefaultMutableTreeNode currentSel = (DefaultMutableTreeNode)this.getLastSelectedPathComponent(); + DefaultMutableTreeNode currentSel = (DefaultMutableTreeNode) this.getLastSelectedPathComponent(); return CompatibleGEOJSONHelper.getJsonUrlByPathIncludeParam(currentSel.getUserObject().toString()); } //根据路径精确查找 public DefaultMutableTreeNode setSelectNodePath(String jsonUrl) { - if(StringUtils.isEmpty(jsonUrl) || CompatibleGEOJSONHelper.isDeprecated(jsonUrl)){ + if (StringUtils.isEmpty(jsonUrl) || CompatibleGEOJSONHelper.isDeprecated(jsonUrl)) { return null; } DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot(); - Enumeration els = root.postorderEnumeration(); - while(els.hasMoreElements()){ - DefaultMutableTreeNode el = els.nextElement(); - if(el == null || el.getUserObject() == null){ + Enumeration els = root.postorderEnumeration(); + while (els.hasMoreElements()) { + DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement(); + if (el == null || el.getUserObject() == null) { return null; } String dirPath = el.getUserObject().toString(); - String url = CompatibleGEOJSONHelper.getJsonUrlByPathIncludeParam(dirPath); + String url = CompatibleGEOJSONHelper.getJsonUrlByPathIncludeParam(dirPath); //先equals再valid原因:valid 远程下实时去服务器看有没有json文件 if (ComparatorUtils.equals(jsonUrl, url) && GEOJSONTreeHelper.isValidDirPath(dirPath)) { selectTreeNode(el, m_model); @@ -115,14 +114,7 @@ public class MapDataTree extends JTree { DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode) value; String name = getPresentName(treeNode); this.setText(name); - - UILabel label = new UILabel(); - label.setText(getText()); - label.setIcon(getIcon()); - this.setSize(label.getPreferredSize()); - Dimension dim = label.getPreferredSize(); - dim.height += 2; - this.setPreferredSize(dim); + this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); this.setBackgroundNonSelectionColor(UIConstants.NORMAL_BACKGROUND); this.setForeground(UIConstants.FONT_COLOR); this.setBackgroundSelectionColor(UIConstants.FLESH_BLUE); @@ -131,25 +123,25 @@ public class MapDataTree extends JTree { }; protected String getPresentName(DefaultMutableTreeNode treeNode) { - if(treeNode == null || treeNode.getUserObject() == null){ + if (treeNode == null || treeNode.getUserObject() == null) { return StringUtils.EMPTY; } return ChartGEOJSONHelper.getPresentNameWithPath(treeNode.getUserObject().toString()); } //模糊搜索 深度优先. - public void search(String text){ - if(StringUtils.isEmpty(text)){ + public void search(String text) { + if (StringUtils.isEmpty(text)) { return; } DefaultTreeModel m_model = (DefaultTreeModel) this.getModel(); DefaultMutableTreeNode root = (DefaultMutableTreeNode) m_model.getRoot(); - Enumeration els = root.postorderEnumeration(); - while(els.hasMoreElements()){ + Enumeration els = root.postorderEnumeration(); + while (els.hasMoreElements()) { - DefaultMutableTreeNode el = els.nextElement(); - String path = el.getUserObject().toString(); + DefaultMutableTreeNode el = (DefaultMutableTreeNode) els.nextElement(); + String path = el.getUserObject().toString(); String fileName = ChartGEOJSONHelper.getPresentNameWithPath(path); if (StringUtils.contains(fileName, text) && GEOJSONTreeHelper.isValidDirPath(path)) { selectTreeNode(el, m_model); @@ -158,7 +150,7 @@ public class MapDataTree extends JTree { } } - public void selectTreeNode(DefaultMutableTreeNode node, DefaultTreeModel m_model){ + public void selectTreeNode(DefaultMutableTreeNode node, DefaultTreeModel m_model) { TreeNode[] nodes = m_model.getPathToRoot(node); TreePath treePath = new TreePath(nodes); setSelectionPath(treePath); diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/FunnelPercentFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/FunnelPercentFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..5495131b3a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/FunnelPercentFormatPaneWithoutCheckBox.java @@ -0,0 +1,18 @@ +package com.fr.van.chart.funnel.designer.style; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class FunnelPercentFormatPaneWithoutCheckBox extends PercentFormatPaneWithoutCheckBox { + + public FunnelPercentFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Value_Conversion"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java index e2382c6852..d7b9f9da47 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelLabelContentPane.java @@ -1,11 +1,18 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; +import com.fr.plugin.chart.type.TextAlign; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -25,24 +32,65 @@ public class VanChartFunnelLabelContentPane extends VanChartLabelContentPane { protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{percentFormatPane,null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null} }; } @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new CategoryNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new FunnelPercentFormatPaneWithoutCheckBox(parent, showOnPane)); + } + + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + getRichTextSeriesNameFormatPane(), + getRichTextValueFormatPane(), + getRichTextPercentFormatPane() + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + attrTooltipContent.getRichTextSeriesFormat(), + attrTooltipContent.getRichTextValueFormat(), + attrTooltipContent.getRichTextPercentFormat() + }; + + setRichTextAttr(new AttrTooltipRichText()); + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); } protected AttrTooltipContent createAttrTooltip() { - AttrTooltipContent attrTooltipContent = new AttrTooltipContent(); + AttrTooltipContent attrTooltipContent = new AttrTooltipContent(TextAlign.CENTER); + attrTooltipContent.getCategoryFormat().setEnable(false); + attrTooltipContent.getRichTextCategoryFormat().setEnable(false); + attrTooltipContent.setSeriesFormat(new AttrTooltipNameFormat()); + attrTooltipContent.setRichTextSeriesFormat(new AttrTooltipNameFormat()); + return attrTooltipContent; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRefreshTooltipContentPane.java index c98dfcce46..b7f817eb3c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelRefreshTooltipContentPane.java @@ -1,7 +1,9 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -14,12 +16,25 @@ public class VanChartFunnelRefreshTooltipContentPane extends VanChartFunnelToolt public VanChartFunnelRefreshTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { super(null, showOnPane); } + + protected boolean supportRichEditor() { + return false; + } + @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + setRichTextChangedValueFormatPane(new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextChangedPercentFormatPane(new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected double[] getRowSize(double p){ @@ -28,11 +43,21 @@ public class VanChartFunnelRefreshTooltipContentPane extends VanChartFunnelToolt protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java index 1a5199c091..247194ec40 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/funnel/designer/style/VanChartFunnelTooltipContentPane.java @@ -1,11 +1,17 @@ package com.fr.van.chart.funnel.designer.style; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -25,26 +31,69 @@ public class VanChartFunnelTooltipContentPane extends VanChartTooltipContentPane protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{percentFormatPane,null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null} }; } @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new CategoryNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new FunnelPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new FunnelPercentFormatPaneWithoutCheckBox(parent, showOnPane)); + } + + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + getRichTextSeriesNameFormatPane(), + getRichTextValueFormatPane(), + getRichTextPercentFormatPane() + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + attrTooltipContent.getRichTextSeriesFormat(), + attrTooltipContent.getRichTextValueFormat(), + attrTooltipContent.getRichTextPercentFormat() + }; + + setRichTextAttr(new AttrTooltipRichText()); + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); } protected AttrTooltipContent createAttrTooltip() { AttrTooltipContent attrTooltipContent = new AttrTooltipContent(); - attrTooltipContent.getCategoryFormat().setEnable(false); + attrTooltipContent.setSeriesFormat(new AttrTooltipNameFormat()); + attrTooltipContent.setRichTextSeriesFormat(new AttrTooltipNameFormat()); + + attrTooltipContent.getCategoryFormat().setEnable(false); attrTooltipContent.getSeriesFormat().setEnable(true); attrTooltipContent.getValueFormat().setEnable(true); + + attrTooltipContent.getRichTextCategoryFormat().setEnable(false); + attrTooltipContent.getRichTextSeriesFormat().setEnable(true); + attrTooltipContent.getRichTextValueFormat().setEnable(true); return attrTooltipContent; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/other/VanChartGanttConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/other/VanChartGanttConditionPane.java index 42428c6317..24a5d45fe9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/other/VanChartGanttConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/other/VanChartGanttConditionPane.java @@ -12,6 +12,7 @@ import com.fr.plugin.chart.gantt.attr.AttrGanttLabel; import com.fr.plugin.chart.gantt.attr.AttrGanttTooltip; import com.fr.plugin.chart.gantt.attr.AttrGanttTooltipContent; import com.fr.plugin.chart.type.ConditionKeyType; +import com.fr.van.chart.designer.PlotFactory; import com.fr.van.chart.designer.other.condition.item.VanChartLabelConditionPane; import com.fr.van.chart.designer.other.condition.item.VanChartSeriesColorConditionPane; import com.fr.van.chart.designer.other.condition.item.VanChartTooltipConditionPane; @@ -40,16 +41,18 @@ public class VanChartGanttConditionPane extends DataSeriesConditionPane { protected void addBasicAction() { classPaneMap.put(AttrBackground.class, new VanChartSeriesColorConditionPane(this)); classPaneMap.put(AttrAlpha.class, new LabelAlphaPane(this)); - classPaneMap.put(AttrGanttLabel.class, new VanChartLabelConditionPane(this, plot)); - classPaneMap.put(AttrGanttTooltip.class, new VanChartTooltipConditionPane(this, plot){ + if (!PlotFactory.largeDataModel(plot)) { + classPaneMap.put(AttrGanttLabel.class, new VanChartLabelConditionPane(this, plot)); + } + classPaneMap.put(AttrGanttTooltip.class, new VanChartTooltipConditionPane(this, plot) { @Override protected VanChartPlotTooltipPane createTooltipContentsPane() { - return new VanChartPlotTooltipNoCheckPane(getPlot(), null){ + return new VanChartPlotTooltipNoCheckPane(getPlot(), null) { @Override protected AttrTooltip getAttrTooltip() { AttrGanttTooltip attrGanttTooltip = new AttrGanttTooltip(); - ((AttrGanttTooltipContent)attrGanttTooltip.getContent()).getDurationFormat().setEnable(true); + ((AttrGanttTooltipContent) attrGanttTooltip.getContent()).getDurationFormat().setEnable(true); return attrGanttTooltip; } }; @@ -65,7 +68,7 @@ public class VanChartGanttConditionPane extends DataSeriesConditionPane { @Override protected ChartConditionPane createListConditionPane() { - return new ChartConditionPane(){ + return new ChartConditionPane() { @Override protected ConditionKeyType[] conditionKeyTypes() { return ConditionKeyType.Gantt_CONDITION_KEY_TYPES; @@ -75,6 +78,7 @@ public class VanChartGanttConditionPane extends DataSeriesConditionPane { /** * 返回图表class对象 + * * @return class对象 */ public Class class4Correspond() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/VanChartGanttLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/VanChartGanttLabelContentPane.java deleted file mode 100644 index fe4b2e80ae..0000000000 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/VanChartGanttLabelContentPane.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.fr.van.chart.gantt.designer.style; - -import com.fr.van.chart.designer.component.VanChartHtmlLabelPane; -import com.fr.van.chart.designer.style.VanChartStylePane; -import com.fr.van.chart.gantt.designer.style.tooltip.VanChartGanttTooltipContentPane; - -import javax.swing.JPanel; - -/** - * Created by hufan on 2017/1/13. - */ -public class VanChartGanttLabelContentPane extends VanChartGanttTooltipContentPane { - public VanChartGanttLabelContentPane(VanChartStylePane parent, JPanel showOnPane) { - super(parent, showOnPane); - } - - protected VanChartHtmlLabelPane createHtmlLabelPane() { - return new VanChartHtmlLabelPane(); - } -} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttLabelContentPane.java new file mode 100644 index 0000000000..cfb1e63a8a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttLabelContentPane.java @@ -0,0 +1,125 @@ +package com.fr.van.chart.gantt.designer.style.label; + +import com.fr.design.i18n.Toolkit; +import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.gantt.attr.AttrGanttTooltipContent; +import com.fr.van.chart.designer.component.VanChartLabelContentPane; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.gantt.designer.style.tooltip.VanChartDateFormatPaneWithCheckBox; +import com.fr.van.chart.gantt.designer.style.tooltip.VanChartFormatComBoxWithCheckBox; + +import javax.swing.JPanel; +import java.awt.Component; + +/** + * Created by hufan on 2017/1/13. + */ +public class VanChartGanttLabelContentPane extends VanChartLabelContentPane { + + private VanChartFormatPaneWithCheckBox processesFormatPane; + private VanChartDateFormatPaneWithCheckBox startTimeFormatPane; + private VanChartDateFormatPaneWithCheckBox endTimeFormatPane; + private VanChartFormatComBoxWithCheckBox durationFormatPane; + private VanChartFormatPaneWithCheckBox progressFormatPane; + + public VanChartGanttLabelContentPane(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { + processesFormatPane = new VanChartFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Project_Name"); + } + }; + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + startTimeFormatPane = new VanChartDateFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Start_Time"); + } + }; + endTimeFormatPane = new VanChartDateFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_End_Time"); + } + }; + durationFormatPane = new VanChartFormatComBoxWithCheckBox(); + progressFormatPane = new VanChartFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Process"); + } + }; + } + + protected boolean supportRichEditor() { + return false; + } + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{processesFormatPane, null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{startTimeFormatPane, null}, + new Component[]{endTimeFormatPane, null}, + new Component[]{durationFormatPane, null}, + new Component[]{progressFormatPane, null} + }; + } + + protected double[] getRowSize(double p) { + return new double[]{p, p, p, p, p, p}; + } + + @Override + protected void populateFormatPane(AttrTooltipContent attrTooltipContent) { + if (attrTooltipContent instanceof AttrGanttTooltipContent) { + AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; + processesFormatPane.populate(ganttTooltipContent.getProcessesFormat()); + getSeriesNameFormatPane().populate(ganttTooltipContent.getSeriesFormat()); + startTimeFormatPane.populate(ganttTooltipContent.getStartTimeFormat()); + endTimeFormatPane.populate(ganttTooltipContent.getEndTimeFormat()); + durationFormatPane.populate(ganttTooltipContent.getDurationFormat()); + progressFormatPane.populate(ganttTooltipContent.getProgressFormat()); + } + } + + protected void updateFormatPane(AttrTooltipContent attrTooltipContent) { + if (attrTooltipContent instanceof AttrGanttTooltipContent) { + AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; + processesFormatPane.update(ganttTooltipContent.getProcessesFormat()); + getSeriesNameFormatPane().update(ganttTooltipContent.getSeriesFormat()); + startTimeFormatPane.update(ganttTooltipContent.getStartTimeFormat()); + endTimeFormatPane.update(ganttTooltipContent.getEndTimeFormat()); + durationFormatPane.update(ganttTooltipContent.getDurationFormat()); + progressFormatPane.update(ganttTooltipContent.getProgressFormat()); + } + } + + public boolean isDirty() { + return processesFormatPane.isDirty() + || getSeriesNameFormatPane().isDirty() + || startTimeFormatPane.isDirty() + || endTimeFormatPane.isDirty() + || durationFormatPane.isDirty() + || progressFormatPane.isDirty(); + } + + public void setDirty(boolean isDirty) { + processesFormatPane.setDirty(isDirty); + getSeriesNameFormatPane().setDirty(isDirty); + startTimeFormatPane.setDirty(isDirty); + endTimeFormatPane.setDirty(isDirty); + durationFormatPane.setDirty(isDirty); + progressFormatPane.setDirty(isDirty); + } + + protected AttrTooltipContent createAttrTooltip() { + return new AttrGanttTooltipContent(); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelDetailPane.java new file mode 100644 index 0000000000..e00e0afd4e --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelDetailPane.java @@ -0,0 +1,16 @@ +package com.fr.van.chart.gantt.designer.style.label; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelDetailPane; + +public class VanChartGanttPlotLabelDetailPane extends VanChartPlotLabelDetailPane { + + public VanChartGanttPlotLabelDetailPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void initToolTipContentPane(Plot plot) { + setDataLabelContentPane(new VanChartGanttLabelContentPane(getParentPane(), VanChartGanttPlotLabelDetailPane.this)); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelPane.java new file mode 100644 index 0000000000..546f772dd8 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/label/VanChartGanttPlotLabelPane.java @@ -0,0 +1,20 @@ +package com.fr.van.chart.gantt.designer.style.label; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelPane; + +import java.awt.BorderLayout; + +public class VanChartGanttPlotLabelPane extends VanChartPlotLabelPane { + + public VanChartGanttPlotLabelPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void createLabelPane() { + VanChartGanttPlotLabelDetailPane labelDetailPane = new VanChartGanttPlotLabelDetailPane(getPlot(), getParentPane()); + setLabelDetailPane(labelDetailPane); + getLabelPane().add(labelDetailPane, BorderLayout.CENTER); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java index c17d97692c..9236773e71 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/series/VanChartGanttSeriesPane.java @@ -44,7 +44,8 @@ public class VanChartGanttSeriesPane extends VanChartAbstractPlotSeriesPane { Component[][] components = new Component[][]{ new Component[]{createGanntStylePane()}, new Component[]{createLinkLinePane()}, - new Component[]{createMarkerPane()} + new Component[]{createMarkerPane()}, + new Component[]{createLargeDataModelPane()} }; contentPane = TableLayoutHelper.createTableLayoutPane(components, row, col); diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithCheckBox.java new file mode 100644 index 0000000000..7ed6e93bc0 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithCheckBox.java @@ -0,0 +1,18 @@ +package com.fr.van.chart.gantt.designer.style.tooltip; + +import com.fr.design.gui.style.FormatPane; +import com.fr.van.chart.designer.PlotFactory; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public abstract class VanChartDateFormatPaneWithCheckBox extends VanChartFormatPaneWithCheckBox { + public VanChartDateFormatPaneWithCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected FormatPane createFormatPane(){ + return PlotFactory.createAutoFormatPane(); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..ee395284a7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartDateFormatPaneWithoutCheckBox.java @@ -0,0 +1,18 @@ +package com.fr.van.chart.gantt.designer.style.tooltip; + +import com.fr.design.gui.style.FormatPane; +import com.fr.van.chart.designer.PlotFactory; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public abstract class VanChartDateFormatPaneWithoutCheckBox extends VanChartFormatPaneWithoutCheckBox { + public VanChartDateFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected FormatPane createFormatPane() { + return PlotFactory.createAutoFormatPane(); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithCheckBox.java new file mode 100644 index 0000000000..95da8ea986 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithCheckBox.java @@ -0,0 +1,100 @@ +package com.fr.van.chart.gantt.designer.style.tooltip; + +import com.fr.design.gui.icheckbox.UICheckBox; +import com.fr.design.gui.icombobox.UIComboBox; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.i18n.Toolkit; +import com.fr.plugin.chart.base.format.AttrTooltipDurationFormat; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; +import com.fr.plugin.chart.base.format.IntervalTimeFormat; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.util.Map; + +public class VanChartFormatComBoxWithCheckBox extends JPanel { + private static final String LABEL_TEXT = Toolkit.i18nText("Fine-Design_Chart_Duration_Time"); + + private UICheckBox isSelectedBox; + private UIComboBox formatComBox; + + private boolean isDirty; + + public VanChartFormatComBoxWithCheckBox() { + this.setLayout(new BorderLayout()); + isSelectedBox = new UICheckBox(LABEL_TEXT); + formatComBox = new UIComboBox(IntervalTimeFormat.getFormats()); + isSelectedBox.addMouseListener(new MouseListener() { + @Override + public void mouseClicked(MouseEvent e) { + isDirty = true; + } + + @Override + public void mousePressed(MouseEvent e) { + + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + }); + formatComBox.setPreferredSize(new Dimension(40, 20)); + + if (showSelectBox()) { + this.add(isSelectedBox, BorderLayout.CENTER); + } else { + this.add(new UILabel(LABEL_TEXT), BorderLayout.CENTER); + } + + this.add(formatComBox, BorderLayout.EAST); + } + + protected boolean showSelectBox() { + return true; + } + + public boolean isDirty() { + return isDirty; + } + + public void setDirty(boolean isDirty) { + this.isDirty = isDirty; + } + + public void populate(AttrTooltipFormat tooltipFormat) { + if (tooltipFormat instanceof AttrTooltipDurationFormat) { + this.isSelectedBox.setSelected(tooltipFormat.isEnable()); + formatComBox.setSelectedItem(((AttrTooltipDurationFormat) tooltipFormat).getIntervalTimeFormat()); + } + } + + public void update(AttrTooltipFormat tooltipFormat) { + if (tooltipFormat instanceof AttrTooltipDurationFormat) { + tooltipFormat.setEnable(isSelectedBox.isSelected()); + ((AttrTooltipDurationFormat) tooltipFormat).setIntervalTimeFormat((IntervalTimeFormat) formatComBox.getSelectedItem()); + } + } + + public void updateFormatParams(Map paramMap, String value) { + String key = LABEL_TEXT; + + if (paramMap != null && !paramMap.containsKey(key)) { + paramMap.put(key, value); + } + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithoutCheckBox.java new file mode 100644 index 0000000000..20a74e3762 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartFormatComBoxWithoutCheckBox.java @@ -0,0 +1,8 @@ +package com.fr.van.chart.gantt.designer.style.tooltip; + +public class VanChartFormatComBoxWithoutCheckBox extends VanChartFormatComBoxWithCheckBox { + + protected boolean showSelectBox() { + return false; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java index 6bff1d5708..d724deff58 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gantt/designer/style/tooltip/VanChartGanttTooltipContentPane.java @@ -1,26 +1,25 @@ package com.fr.van.chart.gantt.designer.style.tooltip; -import com.fr.design.gui.icheckbox.UICheckBox; -import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.gui.style.FormatPane; - +import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; import com.fr.plugin.chart.base.format.AttrTooltipDurationFormat; -import com.fr.plugin.chart.base.format.AttrTooltipFormat; -import com.fr.plugin.chart.base.format.IntervalTimeFormat; +import com.fr.plugin.chart.base.format.AttrTooltipEndTimeFormat; +import com.fr.plugin.chart.base.format.AttrTooltipProcessesFormat; +import com.fr.plugin.chart.base.format.AttrTooltipProgressFormat; +import com.fr.plugin.chart.base.format.AttrTooltipSeriesFormat; +import com.fr.plugin.chart.base.format.AttrTooltipStartTimeFormat; import com.fr.plugin.chart.gantt.attr.AttrGanttTooltipContent; -import com.fr.van.chart.designer.PlotFactory; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; -import java.awt.BorderLayout; import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; +import java.util.Map; /** * Created by hufan on 2017/1/13. @@ -32,6 +31,12 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane private VanChartFormatComBoxWithCheckBox durationFormatPane; private VanChartFormatPaneWithCheckBox progressFormatPane; + private VanChartFormatPaneWithoutCheckBox richTextProcessesFormatPane; + private VanChartDateFormatPaneWithoutCheckBox richTextStartTimeFormatPane; + private VanChartDateFormatPaneWithoutCheckBox richTextEndTimeFormatPane; + private VanChartFormatComBoxWithoutCheckBox richTextDurationFormatPane; + private VanChartFormatPaneWithoutCheckBox richTextProgressFormatPane; + public VanChartGanttTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { super(parent, showOnPane); } @@ -40,27 +45,52 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane processesFormatPane = new VanChartFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Project_Name"); + return Toolkit.i18nText("Fine-Design_Chart_Project_Name"); } }; - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); startTimeFormatPane = new VanChartDateFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Start_Time"); + return Toolkit.i18nText("Fine-Design_Chart_Start_Time"); } }; endTimeFormatPane = new VanChartDateFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_End_Time"); + return Toolkit.i18nText("Fine-Design_Chart_End_Time"); } }; durationFormatPane = new VanChartFormatComBoxWithCheckBox(); progressFormatPane = new VanChartFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Process"); + return Toolkit.i18nText("Fine-Design_Chart_Process"); + } + }; + } + + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + richTextProcessesFormatPane = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane){ + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Project_Name"); + } + }; + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + richTextStartTimeFormatPane = new VanChartDateFormatPaneWithoutCheckBox(parent, showOnPane){ + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Start_Time"); + } + }; + richTextEndTimeFormatPane = new VanChartDateFormatPaneWithoutCheckBox(parent, showOnPane){ + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_End_Time"); + } + }; + richTextDurationFormatPane = new VanChartFormatComBoxWithoutCheckBox(); + richTextProgressFormatPane = new VanChartFormatPaneWithoutCheckBox(parent, showOnPane){ + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Process"); } }; } @@ -68,7 +98,7 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane protected Component[][] getPaneComponents(){ return new Component[][]{ new Component[]{processesFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, + new Component[]{getSeriesNameFormatPane(),null}, new Component[]{startTimeFormatPane,null}, new Component[]{endTimeFormatPane,null}, new Component[]{durationFormatPane, null}, @@ -76,16 +106,28 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane }; } + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{richTextProcessesFormatPane,null}, + new Component[]{getRichTextSeriesNameFormatPane(),null}, + new Component[]{richTextStartTimeFormatPane,null}, + new Component[]{richTextEndTimeFormatPane,null}, + new Component[]{richTextDurationFormatPane, null}, + new Component[]{richTextProgressFormatPane, null} + }; + } + protected double[] getRowSize(double p){ return new double[]{p,p,p,p,p,p}; } @Override protected void populateFormatPane(AttrTooltipContent attrTooltipContent) { + // fixme 当前的样式面板设计都是基于一个大而全的父类,在子类中组合需要的属性,导致父类的属性多是protected,且子类不能明确获取自己Model的type if (attrTooltipContent instanceof AttrGanttTooltipContent){ AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; processesFormatPane.populate(ganttTooltipContent.getProcessesFormat()); - seriesNameFormatPane.populate(ganttTooltipContent.getSeriesFormat()); + getSeriesNameFormatPane().populate(ganttTooltipContent.getSeriesFormat()); startTimeFormatPane.populate(ganttTooltipContent.getStartTimeFormat()); endTimeFormatPane.populate(ganttTooltipContent.getEndTimeFormat()); durationFormatPane.populate(ganttTooltipContent.getDurationFormat()); @@ -93,11 +135,48 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane } } + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + if(attrTooltipContent instanceof AttrGanttTooltipContent){ + setRichTextAttr(new AttrTooltipRichText()); + + AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; + Map params = getRichTextAttr().getParams(); + + AttrTooltipProcessesFormat processesFormat = ganttTooltipContent.getRichTextProcessesFormat(); + richTextProcessesFormatPane.populate(processesFormat); + richTextProcessesFormatPane.updateFormatParams(params, processesFormat.getJs()); + + AttrTooltipSeriesFormat seriesFormat = ganttTooltipContent.getRichTextSeriesFormat(); + getRichTextSeriesNameFormatPane().populate(seriesFormat); + getRichTextSeriesNameFormatPane().updateFormatParams(params, seriesFormat.getJs()); + + AttrTooltipStartTimeFormat startTimeFormat = ganttTooltipContent.getRichTextStartTimeFormat(); + richTextStartTimeFormatPane.populate(startTimeFormat); + richTextStartTimeFormatPane.updateFormatParams(params, startTimeFormat.getJs()); + + AttrTooltipEndTimeFormat endTimeFormat = ganttTooltipContent.getRichTextEndTimeFormat(); + richTextEndTimeFormatPane.populate(endTimeFormat); + richTextEndTimeFormatPane.updateFormatParams(params, endTimeFormat.getJs()); + + AttrTooltipDurationFormat durationFormat = ganttTooltipContent.getRichTextDurationFormat(); + richTextDurationFormatPane.populate(durationFormat); + richTextDurationFormatPane.updateFormatParams(params, durationFormat.getJs()); + + AttrTooltipProgressFormat progressFormat = ganttTooltipContent.getRichTextProgressFormat(); + richTextProgressFormatPane.populate(progressFormat); + richTextProgressFormatPane.updateFormatParams(params, progressFormat.getJs()); + + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); + } + } + protected void updateFormatPane(AttrTooltipContent attrTooltipContent) { if (attrTooltipContent instanceof AttrGanttTooltipContent){ AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; processesFormatPane.update(ganttTooltipContent.getProcessesFormat()); - seriesNameFormatPane.update(ganttTooltipContent.getSeriesFormat()); + getSeriesNameFormatPane().update(ganttTooltipContent.getSeriesFormat()); startTimeFormatPane.update(ganttTooltipContent.getStartTimeFormat()); endTimeFormatPane.update(ganttTooltipContent.getEndTimeFormat()); durationFormatPane.update(ganttTooltipContent.getDurationFormat()); @@ -105,9 +184,22 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane } } + protected void updateRichEditor(AttrTooltipContent attrTooltipContent) { + if(attrTooltipContent instanceof AttrGanttTooltipContent) { + AttrGanttTooltipContent ganttTooltipContent = (AttrGanttTooltipContent) attrTooltipContent; + + richTextProcessesFormatPane.update(ganttTooltipContent.getRichTextProcessesFormat()); + getRichTextSeriesNameFormatPane().update(ganttTooltipContent.getRichTextSeriesFormat()); + richTextStartTimeFormatPane.update(ganttTooltipContent.getRichTextStartTimeFormat()); + richTextEndTimeFormatPane.update(ganttTooltipContent.getRichTextEndTimeFormat()); + richTextDurationFormatPane.update(ganttTooltipContent.getRichTextDurationFormat()); + richTextProgressFormatPane.update(ganttTooltipContent.getRichTextProgressFormat()); + } + } + public boolean isDirty() { return processesFormatPane.isDirty() - || seriesNameFormatPane.isDirty() + || getSeriesNameFormatPane().isDirty() || startTimeFormatPane.isDirty() || endTimeFormatPane.isDirty() || durationFormatPane.isDirty() @@ -116,7 +208,7 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane public void setDirty(boolean isDirty) { processesFormatPane.setDirty(isDirty); - seriesNameFormatPane.setDirty(isDirty); + getSeriesNameFormatPane().setDirty(isDirty); startTimeFormatPane.setDirty(isDirty); endTimeFormatPane.setDirty(isDirty); durationFormatPane.setDirty(isDirty); @@ -126,79 +218,4 @@ public class VanChartGanttTooltipContentPane extends VanChartTooltipContentPane protected AttrTooltipContent createAttrTooltip() { return new AttrGanttTooltipContent(); } - - private abstract class VanChartDateFormatPaneWithCheckBox extends VanChartFormatPaneWithCheckBox { - public VanChartDateFormatPaneWithCheckBox(VanChartStylePane parent, JPanel showOnPane) { - super(parent, showOnPane); - } - - @Override - protected FormatPane createFormatPane(){ - return PlotFactory.createAutoFormatPane(); - } - } - - private class VanChartFormatComBoxWithCheckBox extends JPanel{ - private UICheckBox isSelectedBox; - private UIComboBox formatComBox; - - private boolean isDirty; - - private VanChartFormatComBoxWithCheckBox() { - this.setLayout(new BorderLayout()); - isSelectedBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Duration_Time")); - formatComBox = new UIComboBox(IntervalTimeFormat.getFormats()); - isSelectedBox.addMouseListener(new MouseListener() { - @Override - public void mouseClicked(MouseEvent e) { - isDirty = true; - } - - @Override - public void mousePressed(MouseEvent e) { - - } - - @Override - public void mouseReleased(MouseEvent e) { - - } - - @Override - public void mouseEntered(MouseEvent e) { - - } - - @Override - public void mouseExited(MouseEvent e) { - - } - }); - formatComBox.setPreferredSize(new Dimension(40,20)); - this.add(isSelectedBox, BorderLayout.CENTER); - this.add(formatComBox, BorderLayout.EAST); - } - - private boolean isDirty() { - return isDirty; - } - - private void setDirty(boolean isDirty) { - this.isDirty = isDirty; - } - - private void populate(AttrTooltipFormat tooltipFormat) { - if(tooltipFormat instanceof AttrTooltipDurationFormat) { - this.isSelectedBox.setSelected(tooltipFormat.isEnable()); - formatComBox.setSelectedItem(((AttrTooltipDurationFormat) tooltipFormat).getIntervalTimeFormat()); - } - } - - private void update(AttrTooltipFormat tooltipFormat) { - if(tooltipFormat instanceof AttrTooltipDurationFormat) { - tooltipFormat.setEnable(isSelectedBox.isSelected()); - ((AttrTooltipDurationFormat) tooltipFormat).setIntervalTimeFormat((IntervalTimeFormat) formatComBox.getSelectedItem()); - } - } - } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java index 1ede3efb39..3d979119c3 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/gauge/VanChartGaugePlotPane.java @@ -8,10 +8,13 @@ import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.GaugeColumnFieldCollection; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.attr.GaugeDetailStyle; import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.base.AttrLabel; import com.fr.plugin.chart.gauge.GaugeIndependentVanChart; import com.fr.plugin.chart.gauge.VanChartGaugePlot; import com.fr.plugin.chart.type.GaugeStyle; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; /** @@ -31,12 +34,12 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { }; } - protected Plot getSelectedClonedPlot(){ + protected Plot getSelectedClonedPlot() { VanChartGaugePlot newPlot = null; Chart[] GaugeChart = GaugeIndependentVanChart.GaugeVanChartTypes; - for(int i = 0, len = GaugeChart.length; i < len; i++){ - if(typeDemo.get(i).isPressing){ - newPlot = (VanChartGaugePlot)GaugeChart[i].getPlot(); + for (int i = 0, len = GaugeChart.length; i < len; i++) { + if (typeDemo.get(i).isPressing) { + newPlot = (VanChartGaugePlot) GaugeChart[i].getPlot(); } } @@ -44,8 +47,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { try { if (newPlot == null) { throw new IllegalArgumentException("newPlot con not be null"); - }else { - cloned = (Plot)newPlot.clone(); + } else { + cloned = (Plot) newPlot.clone(); } } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error("Error In GaugeChart"); @@ -56,16 +59,70 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { /** * 保存界面属性 */ - public void updateBean(Chart chart) { - boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer(); + public void updateBean(VanChart chart) { + boolean oldISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer(); super.updateBean(chart); - boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot)chart.getPlot()).isMultiPointer(); - if(oldISMulti != newISMulti){ + boolean newISMulti = chart.getPlot() instanceof VanChartGaugePlot && ((VanChartGaugePlot) chart.getPlot()).isMultiPointer(); + if (oldISMulti != newISMulti) { chart.setFilterDefinition(null); } } - protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException{ + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + VanChartGaugePlot vanChartNewPlot = (VanChartGaugePlot) newPlot; + VanChartGaugePlot vanChartOldPlot = (VanChartGaugePlot) oldPlot; + if (vanChartNewPlot.isMultiPointer() != vanChartOldPlot.isMultiPointer()) { + return super.cloneOldPlot2New(oldPlot, newPlot); + } + + VanChartGaugePlot clonePlot = (VanChartGaugePlot) vanChartOldPlot.clone(); + clonePlot.setGaugeStyle(vanChartNewPlot.getGaugeStyle()); + //都是多指针仪表盘,所有属性都一样 + if (clonePlot.isMultiPointer()) { + return clonePlot; + } + //超链和系列中的样式、布局不保留 + clonePlot.setHotHyperLink(vanChartNewPlot.getHotHyperLink()); + clonePlot.setRadius(vanChartNewPlot.getRadius()); + reductionDetail(clonePlot.getGaugeDetailStyle(), vanChartNewPlot.getGaugeDetailStyle()); + + //如果切换试管型仪表盘,部分属性不保留 + if (clonePlot.getGaugeStyle() == GaugeStyle.THERMOMETER || + vanChartOldPlot.getGaugeStyle() == GaugeStyle.THERMOMETER) { + clonePlot.setGaugeAxis(vanChartNewPlot.getGaugeAxis()); + clonePlot.getGaugeDetailStyle().setHorizontalLayout(vanChartNewPlot.getGaugeDetailStyle().isHorizontalLayout()); + clonePlot.getGaugeDetailStyle().setHotAreaColor(vanChartNewPlot.getGaugeDetailStyle().getHotAreaColor()); + + AttrLabel cloneLabel = clonePlot.getAttrLabelFromConditionCollection(); + AttrLabel newLabel = vanChartNewPlot.getAttrLabelFromConditionCollection(); + cloneLabel.getAttrLabelDetail().setPosition(newLabel.getAttrLabelDetail().getPosition()); + cloneLabel.getAttrLabelDetail().setAlign(newLabel.getAttrLabelDetail().getAlign()); + cloneLabel.getAttrLabelDetail().setTextAttr(newLabel.getAttrLabelDetail().getTextAttr()); + cloneLabel.getGaugeValueLabelDetail().setPosition(newLabel.getGaugeValueLabelDetail().getPosition()); + cloneLabel.getGaugeValueLabelDetail().setAlign(newLabel.getGaugeValueLabelDetail().getAlign()); + cloneLabel.getGaugeValueLabelDetail().setTextAttr(newLabel.getGaugeValueLabelDetail().getTextAttr()); + } + return clonePlot; + + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + private void reductionDetail(GaugeDetailStyle cloneDetail, GaugeDetailStyle newDetail) { + cloneDetail.setNeedleColor(newDetail.getNeedleColor()); + cloneDetail.setPaneBackgroundColor(newDetail.getPaneBackgroundColor()); + cloneDetail.setSlotBackgroundColor(newDetail.getSlotBackgroundColor()); + cloneDetail.setAntiClockWise(newDetail.isAntiClockWise()); + cloneDetail.setInnerPaneBackgroundColor(newDetail.getInnerPaneBackgroundColor()); + cloneDetail.setThermometerWidth(newDetail.getThermometerWidth()); + cloneDetail.setChutePercent(newDetail.getChutePercent()); + } + + protected void cloneOldConditionCollection(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException { } public Chart getDefaultChart() { @@ -74,8 +131,8 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { @Override protected void cloneHotHyperLink(Plot oldPlot, Plot newPlot) throws CloneNotSupportedException { - if(oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot){ - if(((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()){ + if (oldPlot instanceof VanChartGaugePlot && newPlot instanceof VanChartGaugePlot) { + if (((VanChartGaugePlot) oldPlot).isMultiPointer() == ((VanChartGaugePlot) newPlot).isMultiPointer()) { super.cloneHotHyperLink(oldPlot, newPlot); } } @@ -83,7 +140,7 @@ public class VanChartGaugePlotPane extends AbstractVanChartTypePane { @Override protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) { - if(definition instanceof AbstractDataDefinition) { + if (definition instanceof AbstractDataDefinition) { AbstractColumnFieldCollection columnFieldCollection = ((AbstractDataDefinition) definition).getColumnFieldCollection(); GaugeStyle gaugeStyle = ((VanChartGaugePlot) vanChartPlot).getGaugeStyle(); switch (gaugeStyle) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java index 43f03a13d3..8f4a72de2a 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/type/VanChartHeatMapTypePane.java @@ -10,6 +10,7 @@ import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.heatmap.HeatMapIndependentVanChart; import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.map.designer.type.VanChartMapPlotPane; import com.fr.van.chart.map.designer.type.VanChartMapSourceChoosePane; @@ -30,7 +31,7 @@ public class VanChartHeatMapTypePane extends VanChartMapPlotPane { } //适用一种图表只有一种类型的 - public void populateBean(Chart chart) { + public void populateBean(VanChart chart) { typeDemo.get(0).isPressing = true; VanChartHeatMapPlot plot = (VanChartHeatMapPlot)chart.getPlot(); populateSourcePane(plot); diff --git a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java index 49be523d62..7af9e6bb7f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/line/VanChartLinePlotPane.java @@ -5,12 +5,12 @@ import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.line.LineIndependentVanChart; import com.fr.plugin.chart.line.VanChartLinePlot; -import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import com.fr.van.chart.designer.type.AbstractRectanglePlotPane; /** * Created by Mitisky on 15/11/5. */ -public class VanChartLinePlotPane extends AbstractVanChartTypePane { +public class VanChartLinePlotPane extends AbstractRectanglePlotPane { @Override protected String[] getTypeIconPath() { diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/VanMapAreaPointAndLineGroupPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/VanMapAreaPointAndLineGroupPane.java index 569d0850cb..127ad29893 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/VanMapAreaPointAndLineGroupPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/VanMapAreaPointAndLineGroupPane.java @@ -1,10 +1,7 @@ package com.fr.van.chart.map.designer; - -import javax.swing.BorderFactory; import javax.swing.JPanel; -import javax.swing.border.Border; /** * Created by Mitisky on 16/5/20. @@ -19,9 +16,4 @@ public class VanMapAreaPointAndLineGroupPane extends VanChartGroupPane { public VanMapAreaPointAndLineGroupPane(final JPanel areaPane, final JPanel pointPane, final JPanel linePane){ super(new String[]{AREA_MAP_STRING, POINT_MAP_STRING, LINE_MAP_STRING}, new JPanel[]{areaPane, pointPane, linePane}); } - - @Override - protected Border getButtonGroupBorder () { - return BorderFactory.createEmptyBorder(0,8,0,18); - } -} +} \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java index c918088cac..95e2864584 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/label/VanChartMapLabelContentPane.java @@ -3,11 +3,16 @@ package com.fr.van.chart.map.designer.style.label; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipMapValueFormat; +import com.fr.plugin.chart.type.TextAlign; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.format.MapAreaNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.MapAreaNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -22,17 +27,27 @@ public class VanChartMapLabelContentPane extends VanChartLabelContentPane { @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new MapAreaNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new MapAreaNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new MapAreaNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane)); } @Override protected AttrTooltipContent createAttrTooltip() { - AttrTooltipContent content = new AttrTooltipContent(); + AttrTooltipContent content = new AttrTooltipContent(TextAlign.CENTER); content.setCategoryFormat(new AttrTooltipAreaNameFormat()); content.setValueFormat(new AttrTooltipMapValueFormat()); + content.setRichTextCategoryFormat(new AttrTooltipAreaNameFormat()); + content.setRichTextValueFormat(new AttrTooltipMapValueFormat()); return content; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapRefreshTooltipContentPane.java index 76bd33f59d..7dca0fb3bc 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapRefreshTooltipContentPane.java @@ -3,7 +3,9 @@ package com.fr.van.chart.map.designer.style.tooltip; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -17,25 +19,49 @@ public class VanChartMapRefreshTooltipContentPane extends VanChartMapTooltipCont super(null, showOnPane); } + protected double[] getRowSize(double p){ + return new double[]{p,p,p,p,p,p}; + } + + protected boolean supportRichEditor() { + return false; + } + @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); } - protected double[] getRowSize(double p){ - return new double[]{p,p,p,p,p,p}; + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + setRichTextChangedValueFormatPane(new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextChangedPercentFormatPane(new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java index 1a2b593a3b..12948b14dd 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/style/tooltip/VanChartMapTooltipContentPane.java @@ -5,9 +5,13 @@ import com.fr.plugin.chart.base.format.AttrTooltipAreaNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipMapValueFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.MapAreaNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.MapAreaNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -22,10 +26,18 @@ public class VanChartMapTooltipContentPane extends VanChartTooltipContentPane { @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new MapAreaNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new MapAreaNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new MapAreaNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane)); } @Override @@ -33,6 +45,8 @@ public class VanChartMapTooltipContentPane extends VanChartTooltipContentPane { AttrTooltipContent content = new AttrTooltipContent(); content.setCategoryFormat(new AttrTooltipAreaNameFormat()); content.setValueFormat(new AttrTooltipMapValueFormat()); + content.setRichTextCategoryFormat(new AttrTooltipAreaNameFormat()); + content.setRichTextValueFormat(new AttrTooltipMapValueFormat()); return content; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java index ba4158ed52..a4356be870 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/designer/type/VanChartMapPlotPane.java @@ -9,13 +9,18 @@ import com.fr.design.utils.gui.GUICoreUtils; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartTools; +import com.fr.plugin.chart.drillmap.VanChartDrillMapPlot; +import com.fr.plugin.chart.heatmap.VanChartHeatMapPlot; import com.fr.plugin.chart.map.MapIndependentVanChart; import com.fr.plugin.chart.map.VanChartMapPlot; import com.fr.plugin.chart.map.data.VanMapDefinition; import com.fr.plugin.chart.map.server.CompatibleGEOJSONHelper; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; import javax.swing.JPanel; +import java.util.HashSet; +import java.util.Set; import java.awt.Component; /** @@ -25,6 +30,14 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { private VanChartMapSourceChoosePane sourceChoosePane; + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartMapPlot.VAN_CHART_MAP_ID); + extendPlotIds.add(VanChartDrillMapPlot.VAN_CHART_DRILL_MAP_ID); + extendPlotIds.add(VanChartHeatMapPlot.VAN_CHART_HEAT_MAP_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/map/images/area-map.png", @@ -54,7 +67,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { /** * 更新界面内容 */ - public void populateBean(Chart chart) { + public void populateBean(VanChart chart) { for (ChartImagePane imagePane : typeDemo) { imagePane.isPressing = false; } @@ -80,7 +93,7 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { } } - public void updateBean(Chart chart) { + public void updateBean(VanChart chart) { super.updateBean(chart); Plot plot = chart.getPlot(); if (plot instanceof VanChartMapPlot) { @@ -154,4 +167,10 @@ public class VanChartMapPlotPane extends AbstractVanChartTypePane { protected boolean acceptDefinition(ChartDataDefinitionProvider definition, VanChartPlot vanChartPlot) { return definition instanceof MapChartDataDefinition; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/line/StartAndEndNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/map/line/StartAndEndNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..9630f9b12d --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/map/line/StartAndEndNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,17 @@ +package com.fr.van.chart.map.line; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class StartAndEndNameFormatPaneWithoutCheckBox extends CategoryNameFormatPaneWithoutCheckBox { + public StartAndEndNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Start_And_End"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapPlotTooltipNoCheckPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapPlotTooltipNoCheckPane.java index 49afb79ebc..88b72c5709 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapPlotTooltipNoCheckPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapPlotTooltipNoCheckPane.java @@ -33,4 +33,4 @@ public class VanChartLineMapPlotTooltipNoCheckPane extends VanChartLineMapPlotTo isTooltipShow.setSelected(true); tooltipPane.setEnabled(isTooltipShow.isSelected()); } -} \ No newline at end of file +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java index 66566c6bf3..9dbc696a68 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/map/line/VanChartLineMapTooltipContentPane.java @@ -5,8 +5,11 @@ import com.fr.plugin.chart.base.format.AttrTooltipStartAndEndNameFormat; import com.fr.plugin.chart.base.format.AttrTooltipValueFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -21,10 +24,18 @@ public class VanChartLineMapTooltipContentPane extends VanChartTooltipContentPan @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane){ - categoryNameFormatPane = new StartAndEndNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new StartAndEndNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new SeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new StartAndEndNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane)); } @Override @@ -32,6 +43,8 @@ public class VanChartLineMapTooltipContentPane extends VanChartTooltipContentPan AttrTooltipContent content = new AttrTooltipContent(); content.setCategoryFormat(new AttrTooltipStartAndEndNameFormat()); content.setValueFormat(new AttrTooltipValueFormat()); + content.setRichTextCategoryFormat(new AttrTooltipStartAndEndNameFormat()); + content.setRichTextValueFormat(new AttrTooltipValueFormat()); return content; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java index 555cca468d..7854ecd170 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/VanChartMultiPiePlotPane.java @@ -55,10 +55,10 @@ public class VanChartMultiPiePlotPane extends AbstractVanChartTypePane { return MultiPieIndependentVanChart.MultilayerVanChartTypes[0]; } - protected void resetChartAttr(Chart chart, Plot newPlot) { + protected void resetChartAttr(VanChart chart, VanChartPlot newPlot) { super.resetChartAttr(chart, newPlot); //重置工具栏选项 - VanChartTools tools = ((VanChart) chart).getVanChartTools(); + VanChartTools tools = chart.getVanChartTools(); if (tools != null) { tools.setSort(false); tools.setFullScreen(false); diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieLevelNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieLevelNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..71789e63ab --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieLevelNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,18 @@ +package com.fr.van.chart.multilayer.style; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class MultiPieLevelNameFormatPaneWithoutCheckBox extends CategoryNameFormatPaneWithoutCheckBox { + + public MultiPieLevelNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Level_Name"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieSeriesNameFormatPaneWithoutCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieSeriesNameFormatPaneWithoutCheckBox.java new file mode 100644 index 0000000000..95cf23f2e7 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/MultiPieSeriesNameFormatPaneWithoutCheckBox.java @@ -0,0 +1,18 @@ +package com.fr.van.chart.multilayer.style; + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; + +public class MultiPieSeriesNameFormatPaneWithoutCheckBox extends SeriesNameFormatPaneWithoutCheckBox { + + public MultiPieSeriesNameFormatPaneWithoutCheckBox(VanChartStylePane parent, JPanel showOnPane) { + super(parent, showOnPane); + } + + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java index 637279d134..09093b0993 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieLabelContentPane.java @@ -2,9 +2,12 @@ package com.fr.van.chart.multilayer.style; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.multilayer.style.AttrTooltipMultiLevelNameFormat; +import com.fr.plugin.chart.type.TextAlign; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -19,15 +22,24 @@ public class VanChartMultiPieLabelContentPane extends VanChartLabelContentPane { @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new MultiPieLevelNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new MultiPieSeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new MultiPieLevelNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new MultiPieSeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new MultiPieLevelNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new MultiPieSeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected AttrTooltipContent createAttrTooltip() { - AttrTooltipContent content = new AttrTooltipContent(); + AttrTooltipContent content = new AttrTooltipContent(TextAlign.CENTER); content.setCategoryFormat(new AttrTooltipMultiLevelNameFormat()); + content.setRichTextCategoryFormat(new AttrTooltipMultiLevelNameFormat()); return content; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java index 3c500d3bf8..1fbe0870a5 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMultiPieTooltipContentPane.java @@ -4,7 +4,9 @@ import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.multilayer.style.AttrTooltipMultiLevelNameFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -19,16 +21,25 @@ public class VanChartMultiPieTooltipContentPane extends VanChartTooltipContentPa @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new MultiPieLevelNameFormatPaneWithCheckBox(parent, showOnPane); - seriesNameFormatPane = new MultiPieSeriesNameFormatPaneWithCheckBox(parent, showOnPane); - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + setCategoryNameFormatPane(new MultiPieLevelNameFormatPaneWithCheckBox(parent, showOnPane)); + setSeriesNameFormatPane(new MultiPieSeriesNameFormatPaneWithCheckBox(parent, showOnPane)); + setValueFormatPane(new ValueFormatPaneWithCheckBox(parent, showOnPane)); + setPercentFormatPane(new PercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + setRichTextCategoryNameFormatPane(new MultiPieLevelNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextSeriesNameFormatPane(new MultiPieSeriesNameFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextValueFormatPane(new ValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextPercentFormatPane(new PercentFormatPaneWithoutCheckBox(parent, showOnPane)); } @Override protected AttrTooltipContent createAttrTooltip() { AttrTooltipContent content = new AttrTooltipContent(); content.setCategoryFormat(new AttrTooltipMultiLevelNameFormat()); + content.setRichTextCategoryFormat(new AttrTooltipMultiLevelNameFormat()); return content; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMutiPieRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMutiPieRefreshTooltipContentPane.java index 56893ec66b..f375fa78fa 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMutiPieRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/multilayer/style/VanChartMutiPieRefreshTooltipContentPane.java @@ -1,7 +1,9 @@ package com.fr.van.chart.multilayer.style; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -17,12 +19,24 @@ public class VanChartMutiPieRefreshTooltipContentPane extends VanChartMultiPieTo super(null, showOnPane); } + protected boolean supportRichEditor() { + return false; + } + @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedValueFormatPane(new ChangedValueFormatPaneWithCheckBox(parent, showOnPane)); + setChangedPercentFormatPane(new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane)); + } + + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + setRichTextChangedValueFormatPane(new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane)); + setRichTextChangedPercentFormatPane(new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane)); } protected double[] getRowSize(double p){ @@ -31,12 +45,23 @@ public class VanChartMutiPieRefreshTooltipContentPane extends VanChartMultiPieTo protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java index 9bbddbb039..27f10bfc8b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/pie/VanChartPiePlotPane.java @@ -5,9 +5,17 @@ import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.log.FineLoggerFactory; import com.fr.plugin.chart.PiePlot4VanChart; +import com.fr.plugin.chart.area.VanChartAreaPlot; +import com.fr.plugin.chart.attr.plot.VanChartPlot; +import com.fr.plugin.chart.column.VanChartColumnPlot; +import com.fr.plugin.chart.line.VanChartLinePlot; import com.fr.plugin.chart.pie.PieIndependentVanChart; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * 饼图(新特性) 属性表 选择类型 布局界面. */ @@ -15,6 +23,15 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { private static final long serialVersionUID = 6163246902689597259L; + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + } + @Override protected String[] getTypeIconPath() { return new String[]{"/com/fr/van/chart/pie/images/pie.png", @@ -44,7 +61,31 @@ public class VanChartPiePlotPane extends AbstractVanChartTypePane { return cloned; } + @Override + protected VanChartPlot cloneOldPlot2New(VanChartPlot oldPlot, VanChartPlot newPlot) { + try { + PiePlot4VanChart piePlot4VanChart = (PiePlot4VanChart) newPlot; + PiePlot4VanChart clonePlot = (PiePlot4VanChart) oldPlot.clone(); + clonePlot.setRoseType(piePlot4VanChart.getRoseType()); + return clonePlot; + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("Error in change plot"); + return newPlot; + } + } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } + public Chart getDefaultChart() { return PieIndependentVanChart.newPieChartTypes[0]; } + + //重置数据配置 + protected void resetFilterDefinition(Chart chart) { + resetMoreCateDefinition(chart); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java index 9c46cd8ef7..0d60f64de7 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarConditionPane.java @@ -53,7 +53,7 @@ public class VanChartRadarConditionPane extends DataSeriesConditionPane{ } else { classPaneMap.put(VanChartAttrMarker.class, new VanChartMarkerConditionPane(this)); classPaneMap.put(VanChartAttrLine.class, new VanChartLineWidthConditionPane(this)); - classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this)); + classPaneMap.put(AttrAreaSeriesFillColorBackground.class, new VanChartAreaFillColorConditionPane(this, plot)); classPaneMap.put(AttrEffect.class, new VanChartEffectConditionPane(this, EffectHelper.getRadarPlotDefaultEffect())); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java index a77c71bc90..e05bbe2422 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/radar/VanChartRadarPlotPane.java @@ -49,4 +49,8 @@ public class VanChartRadarPlotPane extends AbstractVanChartTypePane { return RadarIndependentVanChart.RadarVanChartTypes[0]; } + //重置数据配置 + protected void resetFilterDefinition(Chart chart) { + resetMoreCateDefinition(chart); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java index 72ab39c9ae..160cfb25ee 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterLabelContentPane.java @@ -1,6 +1,7 @@ package com.fr.van.chart.scatter; import com.fr.van.chart.designer.component.VanChartHtmlLabelPane; +import com.fr.van.chart.designer.component.VanChartHtmlLabelPaneWithBackGroundLabel; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -17,7 +18,7 @@ public class VanChartScatterLabelContentPane extends VanChartScatterTooltipCont @Override protected VanChartHtmlLabelPane createHtmlLabelPane() { - return new VanChartHtmlLabelPane(); + return new VanChartHtmlLabelPaneWithBackGroundLabel(); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java index f93051a747..9ef5155a77 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterPlotPane.java @@ -10,13 +10,21 @@ import com.fr.chartx.data.ChartDataDefinitionProvider; import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.BubbleColumnFieldCollection; import com.fr.log.FineLoggerFactory; +import com.fr.plugin.chart.area.VanChartAreaPlot; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.base.VanChartAttrLine; import com.fr.plugin.chart.base.VanChartTools; +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.scatter.ScatterIndependentVanChart; import com.fr.plugin.chart.scatter.VanChartScatterPlot; +import com.fr.plugin.chart.vanchart.VanChart; import com.fr.van.chart.designer.type.AbstractVanChartTypePane; +import java.util.HashSet; +import java.util.Set; + /** * Created by Mitisky on 16/2/16. */ @@ -29,6 +37,16 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { }; } + private static Set extendPlotIds = new HashSet<>(); + + static { + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_COLUMN_PLOT_ID); + extendPlotIds.add(VanChartColumnPlot.VAN_CHART_BAR_PLOT_ID); + extendPlotIds.add(VanChartLinePlot.VAN_CHART_LINE_PLOT); + extendPlotIds.add(VanChartAreaPlot.VAN_CHART_AREA_PLOT_ID); + extendPlotIds.add(VanChartBubblePlot.VAN_CHART_BUBBLE_PLOT_ID); + } + protected Plot getSelectedClonedPlot(){ VanChartScatterPlot newPlot = null; Chart[] scatterChart = ScatterIndependentVanChart.ScatterVanChartTypes; @@ -95,4 +113,10 @@ public class VanChartScatterPlotPane extends AbstractVanChartTypePane { } return false; } + + //是否支持属性的继承 + @Override + protected boolean supportExtendAttr(VanChart chart) { + return extendPlotIds.contains(chart.getID()); + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRefreshTooltipContentPane.java index 902f655172..db7ce4152f 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterRefreshTooltipContentPane.java @@ -1,9 +1,13 @@ package com.fr.van.chart.scatter; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.scatter.attr.ScatterAttrTooltipContent; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -15,7 +19,7 @@ import java.awt.Component; public class VanChartScatterRefreshTooltipContentPane extends VanChartScatterTooltipContentPane { private ChangedValueFormatPaneWithCheckBox changedSizeFormatPane; - + private ChangedValueFormatPaneWithoutCheckBox richTextChangedSizeFormatPane; public VanChartScatterRefreshTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { super(null, showOnPane); @@ -25,9 +29,21 @@ public class VanChartScatterRefreshTooltipContentPane extends VanChartScatterToo protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); changedSizeFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + setChangedPercentFormatPane(changedPercentFormatPane); } + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + richTextChangedSizeFormatPane = new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane); + ChangedPercentFormatPaneWithoutCheckBox richTextChangedPercentFormatPane = new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane); + setRichTextChangedPercentFormatPane(richTextChangedPercentFormatPane); + } + + protected boolean supportRichEditor() { + return false; + } protected double[] getRowSize(double p) { return new double[]{p, p, p, p, p, p}; @@ -35,12 +51,24 @@ public class VanChartScatterRefreshTooltipContentPane extends VanChartScatterToo protected Component[][] getPaneComponents() { return new Component[][]{ - new Component[]{seriesNameFormatPane, null}, - new Component[]{getxFormatPane(), null}, - new Component[]{getyFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getXFormatPane(), null}, + new Component[]{getYFormatPane(), null}, new Component[]{getSizeFormatPane(), null}, new Component[]{changedSizeFormatPane, null}, - new Component[]{changedPercentFormatPane, null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + @Override + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextXFormatPane(), null}, + new Component[]{getRichTextYFormatPane(), null}, + new Component[]{getRichTextSizeFormatPane(), null}, + new Component[]{richTextChangedSizeFormatPane, null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } @@ -51,18 +79,49 @@ public class VanChartScatterRefreshTooltipContentPane extends VanChartScatterToo if (attrTooltipContent instanceof ScatterAttrTooltipContent) { ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; changedSizeFormatPane.populate(scatterAttrTooltipContent.getChangeSizeFormat()); - changedPercentFormatPane.populate(scatterAttrTooltipContent.getChangedSizePercentFormat()); + getChangedPercentFormatPane().populate(scatterAttrTooltipContent.getChangedSizePercentFormat()); } } + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + super.populateRichEditor(attrTooltipContent); + + if (attrTooltipContent instanceof ScatterAttrTooltipContent) { + ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; + + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + richTextChangedSizeFormatPane, + getRichTextChangedPercentFormatPane() + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + scatterAttrTooltipContent.getRichTextChangeSizeFormat(), + scatterAttrTooltipContent.getRichTextChangedSizePercentFormat() + }; + + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + } + } + @Override protected void updateFormatPane(AttrTooltipContent attrTooltipContent) { super.updateFormatPane(attrTooltipContent); if (attrTooltipContent instanceof ScatterAttrTooltipContent) { ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; changedSizeFormatPane.update(scatterAttrTooltipContent.getChangeSizeFormat()); - changedPercentFormatPane.update(scatterAttrTooltipContent.getChangedSizePercentFormat()); + getChangedPercentFormatPane().update(scatterAttrTooltipContent.getChangedSizePercentFormat()); + } + } + + protected void updateRichEditor(AttrTooltipContent attrTooltipContent) { + super.updateRichEditor(attrTooltipContent); + + if (attrTooltipContent instanceof ScatterAttrTooltipContent) { + ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; + richTextChangedSizeFormatPane.update(scatterAttrTooltipContent.getRichTextChangeSizeFormat()); + getRichTextChangedPercentFormatPane().update(scatterAttrTooltipContent.getRichTextChangedSizePercentFormat()); } } @@ -70,13 +129,13 @@ public class VanChartScatterRefreshTooltipContentPane extends VanChartScatterToo public void setDirty(boolean isDirty) { super.setDirty(isDirty); changedSizeFormatPane.setDirty(isDirty); - changedPercentFormatPane.setDirty(isDirty); + getChangedPercentFormatPane().setDirty(isDirty); } @Override public boolean isDirty() { - return super.isDirty() || changedSizeFormatPane.isDirty() || changedPercentFormatPane.isDirty(); + return super.isDirty() || changedSizeFormatPane.isDirty() || getChangedPercentFormatPane().isDirty(); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java index 705ea1a0f6..0933ce8a5c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/VanChartScatterTooltipContentPane.java @@ -1,11 +1,17 @@ package com.fr.van.chart.scatter; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.scatter.attr.ScatterAttrTooltipContent; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.XFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.XFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.YFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.YFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -20,11 +26,15 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa private YFormatPaneWithCheckBox yFormatPane; private ValueFormatPaneWithCheckBox sizeFormatPane; - public XFormatPaneWithCheckBox getxFormatPane() { + private XFormatPaneWithoutCheckBox richTextXFormatPane; + private YFormatPaneWithoutCheckBox richTextYFormatPane; + private ValueFormatPaneWithoutCheckBox richTextSizeFormatPane; + + public XFormatPaneWithCheckBox getXFormatPane() { return xFormatPane; } - public YFormatPaneWithCheckBox getyFormatPane() { + public YFormatPaneWithCheckBox getYFormatPane() { return yFormatPane; } @@ -32,6 +42,18 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa return sizeFormatPane; } + public XFormatPaneWithoutCheckBox getRichTextXFormatPane() { + return richTextXFormatPane; + } + + public YFormatPaneWithoutCheckBox getRichTextYFormatPane() { + return richTextYFormatPane; + } + + public ValueFormatPaneWithoutCheckBox getRichTextSizeFormatPane() { + return richTextSizeFormatPane; + } + public VanChartScatterTooltipContentPane(VanChartStylePane parent, JPanel showOnPane){ super(parent, showOnPane); } @@ -45,16 +67,35 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa sizeFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); } + @Override + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + richTextXFormatPane = new XFormatPaneWithoutCheckBox(parent, showOnPane); + richTextYFormatPane = new YFormatPaneWithoutCheckBox(parent, showOnPane); + richTextSizeFormatPane = new ValueFormatPaneWithoutCheckBox(parent, showOnPane); + } + @Override protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{seriesNameFormatPane,null}, + new Component[]{getSeriesNameFormatPane(),null}, new Component[]{xFormatPane,null}, new Component[]{yFormatPane,null}, new Component[]{sizeFormatPane,null}, }; } + @Override + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{richTextXFormatPane, null}, + new Component[]{richTextYFormatPane, null}, + new Component[]{richTextSizeFormatPane, null} + }; + } + @Override protected void populateFormatPane(AttrTooltipContent attrTooltipContent) { super.populateFormatPane(attrTooltipContent); @@ -66,6 +107,32 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa } } + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + if (attrTooltipContent instanceof ScatterAttrTooltipContent) { + ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; + + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + getRichTextSeriesNameFormatPane(), + richTextXFormatPane, + richTextYFormatPane, + richTextSizeFormatPane + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + scatterAttrTooltipContent.getRichTextSeriesFormat(), + scatterAttrTooltipContent.getRichTextXFormat(), + scatterAttrTooltipContent.getRichTextYFormat(), + scatterAttrTooltipContent.getRichTextSizeFormat() + }; + + setRichTextAttr(new AttrTooltipRichText()); + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); + } + } + @Override protected void updateFormatPane(AttrTooltipContent attrTooltipContent) { super.updateFormatPane(attrTooltipContent); @@ -77,17 +144,28 @@ public class VanChartScatterTooltipContentPane extends VanChartTooltipContentPa } } + protected void updateRichEditor(AttrTooltipContent attrTooltipContent) { + super.updateRichEditor(attrTooltipContent); + + if (attrTooltipContent instanceof ScatterAttrTooltipContent) { + ScatterAttrTooltipContent scatterAttrTooltipContent = (ScatterAttrTooltipContent) attrTooltipContent; + richTextXFormatPane.update(scatterAttrTooltipContent.getRichTextXFormat()); + richTextYFormatPane.update(scatterAttrTooltipContent.getRichTextYFormat()); + richTextSizeFormatPane.update(scatterAttrTooltipContent.getRichTextSizeFormat()); + } + } + @Override public void setDirty(boolean isDirty) { xFormatPane.setDirty(isDirty); yFormatPane.setDirty(isDirty); sizeFormatPane.setDirty(isDirty); - seriesNameFormatPane.setDirty(isDirty); + getSeriesNameFormatPane().setDirty(isDirty); } @Override public boolean isDirty() { - return xFormatPane.isDirty() || yFormatPane.isDirty() || sizeFormatPane.isDirty() || seriesNameFormatPane.isDirty(); + return xFormatPane.isDirty() || yFormatPane.isDirty() || sizeFormatPane.isDirty() || getSeriesNameFormatPane().isDirty(); } @Override diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelDetailPane.java index d507934e6b..a78261f655 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelDetailPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelDetailPane.java @@ -19,6 +19,6 @@ public class VanChartScatterPlotLabelDetailPane extends VanChartPlotLabelDetailP @Override protected void initToolTipContentPane(Plot plot) { - dataLabelContentPane = new VanChartScatterLabelContentPane(parent,VanChartScatterPlotLabelDetailPane.this); + setDataLabelContentPane(new VanChartScatterLabelContentPane(getParentPane(),VanChartScatterPlotLabelDetailPane.this)); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelNoCheckPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelNoCheckPane.java index 71e783b061..a409180732 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelNoCheckPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelNoCheckPane.java @@ -19,12 +19,12 @@ public class VanChartScatterPlotLabelNoCheckPane extends VanChartScatterPlotLabe protected void addComponents() { this.setLayout(new BorderLayout()); - this.add(labelPane,BorderLayout.CENTER); + this.add(getLabelPane(), BorderLayout.CENTER); } public void populate(AttrLabel attr) { super.populate(attr); - isLabelShow.setSelected(true); - labelPane.setVisible(true); + getLabelShowCheckBox().setSelected(true); + getLabelPane().setVisible(true); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelPane.java index 632ce7f6f5..fb8be90163 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/scatter/component/label/VanChartScatterPlotLabelPane.java @@ -18,7 +18,8 @@ public class VanChartScatterPlotLabelPane extends VanChartPlotLabelPane { @Override protected void createLabelPane() { - labelDetailPane = new VanChartScatterPlotLabelDetailPane(this.plot, this.parent); - labelPane.add(labelDetailPane, BorderLayout.CENTER); + VanChartScatterPlotLabelDetailPane labelDetailPane = new VanChartScatterPlotLabelDetailPane(getPlot(), getParentPane()); + setLabelDetailPane(labelDetailPane); + getLabelPane().add(labelDetailPane, BorderLayout.CENTER); } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureLabelContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureLabelContentPane.java index af4d721756..4e20364653 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureLabelContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureLabelContentPane.java @@ -1,8 +1,10 @@ package com.fr.van.chart.structure.desinger.style; +import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.multilayer.style.AttrTooltipMultiLevelNameFormat; +import com.fr.plugin.chart.type.TextAlign; import com.fr.van.chart.designer.component.VanChartLabelContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; @@ -24,33 +26,42 @@ public class VanChartStructureLabelContentPane extends VanChartLabelContentPane @Override protected Component[][] getPaneComponents(){ return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null} + new Component[]{getCategoryNameFormatPane(),null}, + new Component[]{getSeriesNameFormatPane(),null}, + new Component[]{getValueFormatPane(),null} }; } @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane){ - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane){ + CategoryNameFormatPaneWithCheckBox categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Node_Name"); + return Toolkit.i18nText("Fine-Design_Chart_Node_Name"); } }; - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane){ + SeriesNameFormatPaneWithCheckBox seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane){ @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); } }; - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + ValueFormatPaneWithCheckBox valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); + PercentFormatPaneWithCheckBox percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + + setCategoryNameFormatPane(categoryNameFormatPane); + setSeriesNameFormatPane(seriesNameFormatPane); + setValueFormatPane(valueFormatPane); + setPercentFormatPane(percentFormatPane); + } + + protected boolean supportRichEditor() { + return false; } @Override protected AttrTooltipContent createAttrTooltip() { - AttrTooltipContent attrTooltipContent = new AttrTooltipContent(); + AttrTooltipContent attrTooltipContent = new AttrTooltipContent(TextAlign.CENTER); attrTooltipContent.setCategoryFormat(new AttrTooltipMultiLevelNameFormat()); return attrTooltipContent; } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelDetailPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelDetailPane.java new file mode 100644 index 0000000000..20e784c525 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelDetailPane.java @@ -0,0 +1,16 @@ +package com.fr.van.chart.structure.desinger.style; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelDetailPane; + +public class VanChartStructurePlotLabelDetailPane extends VanChartPlotLabelDetailPane { + + public VanChartStructurePlotLabelDetailPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void initToolTipContentPane(Plot plot) { + setDataLabelContentPane(new VanChartStructureLabelContentPane(getParentPane(), VanChartStructurePlotLabelDetailPane.this)); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelPane.java new file mode 100644 index 0000000000..e4cdc99e19 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructurePlotLabelPane.java @@ -0,0 +1,20 @@ +package com.fr.van.chart.structure.desinger.style; + +import com.fr.chart.chartattr.Plot; +import com.fr.van.chart.designer.style.VanChartStylePane; +import com.fr.van.chart.designer.style.label.VanChartPlotLabelPane; + +import java.awt.BorderLayout; + +public class VanChartStructurePlotLabelPane extends VanChartPlotLabelPane { + + public VanChartStructurePlotLabelPane(Plot plot, VanChartStylePane parent) { + super(plot, parent); + } + + protected void createLabelPane() { + VanChartStructurePlotLabelDetailPane labelDetailPane = new VanChartStructurePlotLabelDetailPane(getPlot(), getParentPane()); + setLabelDetailPane(labelDetailPane); + getLabelPane().add(labelDetailPane, BorderLayout.CENTER); + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRefreshTooltipContentPane.java index 5fa83be5b8..ea09ff3c83 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRefreshTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureRefreshTooltipContentPane.java @@ -1,7 +1,9 @@ package com.fr.van.chart.structure.desinger.style; import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -10,7 +12,7 @@ import java.awt.Component; /** * Created by mengao on 2017/6/9. */ -public class VanChartStructureRefreshTooltipContentPane extends VanChartStructureTooltipContentPane{ +public class VanChartStructureRefreshTooltipContentPane extends VanChartStructureTooltipContentPane { public VanChartStructureRefreshTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { super(null, showOnPane); } @@ -19,22 +21,48 @@ public class VanChartStructureRefreshTooltipContentPane extends VanChartStructur protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { super.initFormatPane(parent, showOnPane); - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + ChangedValueFormatPaneWithCheckBox changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane); + ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + + setChangedValueFormatPane(changedValueFormatPane); + setChangedPercentFormatPane(changedPercentFormatPane); + } + + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + ChangedValueFormatPaneWithoutCheckBox richTextChangedValueFormatPane = new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane); + ChangedPercentFormatPaneWithoutCheckBox richTextChangedPercentFormatPane = new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane); + + setRichTextChangedValueFormatPane(richTextChangedValueFormatPane); + setRichTextChangedPercentFormatPane(richTextChangedPercentFormatPane); } - protected double[] getRowSize(double p){ - return new double[]{p,p,p,p,p}; + protected boolean supportRichEditor() { + return false; } - @Override - protected Component[][] getPaneComponents(){ + protected double[] getRowSize(double p) { + return new double[]{p, p, p, p, p}; + } + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} }; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java index 63490eaffa..f5999391f0 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/structure/desinger/style/VanChartStructureTooltipContentPane.java @@ -1,13 +1,21 @@ package com.fr.van.chart.structure.desinger.style; +import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.base.AttrTooltipContent; +import com.fr.plugin.chart.base.AttrTooltipRichText; +import com.fr.plugin.chart.base.format.AttrTooltipFormat; import com.fr.plugin.chart.multilayer.style.AttrTooltipMultiLevelNameFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.VanChartFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -22,36 +30,91 @@ public class VanChartStructureTooltipContentPane extends VanChartTooltipContentP } @Override - protected Component[][] getPaneComponents(){ + protected Component[][] getPaneComponents() { return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null} + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null} }; } @Override - protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane){ - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane){ + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null} + }; + } + + @Override + protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { + CategoryNameFormatPaneWithCheckBox categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane) { @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Node_Name"); + return Toolkit.i18nText("Fine-Design_Chart_Node_Name"); } }; - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane){ + SeriesNameFormatPaneWithCheckBox seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane) { @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + } + }; + ValueFormatPaneWithCheckBox valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); + PercentFormatPaneWithCheckBox percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + + setCategoryNameFormatPane(categoryNameFormatPane); + setSeriesNameFormatPane(seriesNameFormatPane); + setValueFormatPane(valueFormatPane); + setPercentFormatPane(percentFormatPane); + } + + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + CategoryNameFormatPaneWithoutCheckBox richTextCategoryNameFormatPane = new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Node_Name"); } }; - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane); - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + SeriesNameFormatPaneWithoutCheckBox richTextSeriesNameFormatPane = new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + } + }; + ValueFormatPaneWithoutCheckBox richTextValueFormatPane = new ValueFormatPaneWithoutCheckBox(parent, showOnPane); + PercentFormatPaneWithoutCheckBox richTextPercentFormatPane = new PercentFormatPaneWithoutCheckBox(parent, showOnPane); + + setRichTextCategoryNameFormatPane(richTextCategoryNameFormatPane); + setRichTextSeriesNameFormatPane(richTextSeriesNameFormatPane); + setRichTextValueFormatPane(richTextValueFormatPane); + setRichTextPercentFormatPane(richTextPercentFormatPane); + } + + protected void populateRichEditor(AttrTooltipContent attrTooltipContent) { + VanChartFormatPaneWithoutCheckBox[] formatPaneGroup = new VanChartFormatPaneWithoutCheckBox[]{ + getRichTextCategoryNameFormatPane(), + getRichTextSeriesNameFormatPane(), + getRichTextValueFormatPane() + }; + + AttrTooltipFormat[] formatGroup = new AttrTooltipFormat[]{ + attrTooltipContent.getRichTextCategoryFormat(), + attrTooltipContent.getRichTextSeriesFormat(), + attrTooltipContent.getRichTextValueFormat() + }; + + setRichTextAttr(new AttrTooltipRichText()); + populateRichTextFormat(formatPaneGroup, formatGroup); + populateRichText(attrTooltipContent.getRichTextAttr()); + + checkRichEditorState(attrTooltipContent); } @Override protected AttrTooltipContent createAttrTooltip() { AttrTooltipContent attrTooltipContent = new AttrTooltipContent(); attrTooltipContent.setCategoryFormat(new AttrTooltipMultiLevelNameFormat()); + attrTooltipContent.setRichTextCategoryFormat(new AttrTooltipMultiLevelNameFormat()); return attrTooltipContent; } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTooltipContentPane.java new file mode 100644 index 0000000000..cab4d85584 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTooltipContentPane.java @@ -0,0 +1,83 @@ +package com.fr.van.chart.wordcloud.designer.style; + + +import com.fr.design.i18n.Toolkit; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithoutCheckBox; +import com.fr.van.chart.designer.style.VanChartStylePane; + +import javax.swing.JPanel; +import java.awt.Component; + +/** + * Created by mengao on 2017/6/9. + */ +public class VanChartWordCloudRefreshTooltipContentPane extends VanChartWordCloudTooltipContentPane { + public VanChartWordCloudRefreshTooltipContentPane(VanChartStylePane parent, JPanel showOnPane) { + super(null, showOnPane); + } + + @Override + protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initFormatPane(parent, showOnPane); + + ChangedValueFormatPaneWithCheckBox changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane) { + @Override + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Change_Word_Value"); + } + }; + + ChangedPercentFormatPaneWithCheckBox changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); + + setChangedValueFormatPane(changedValueFormatPane); + setChangedPercentFormatPane(changedPercentFormatPane); + } + + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + super.initRichTextFormatPane(parent, showOnPane); + + ChangedValueFormatPaneWithoutCheckBox richTextChangedValueFormatPane = new ChangedValueFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Change_Word_Value"); + } + }; + + ChangedPercentFormatPaneWithoutCheckBox richTextChangedPercentFormatPane = new ChangedPercentFormatPaneWithoutCheckBox(parent, showOnPane); + + setRichTextChangedValueFormatPane(richTextChangedValueFormatPane); + setRichTextChangedPercentFormatPane(richTextChangedPercentFormatPane); + } + + protected boolean supportRichEditor() { + return false; + } + + protected double[] getRowSize(double p) { + return new double[]{p, p, p, p, p, p}; + } + + protected Component[][] getPaneComponents() { + return new Component[][]{ + new Component[]{getCategoryNameFormatPane(), null}, + new Component[]{getSeriesNameFormatPane(), null}, + new Component[]{getValueFormatPane(), null}, + new Component[]{getChangedValueFormatPane(), null}, + new Component[]{getPercentFormatPane(), null}, + new Component[]{getChangedPercentFormatPane(), null}, + }; + } + + protected Component[][] getRichTextComponents() { + return new Component[][]{ + new Component[]{getRichTextCategoryNameFormatPane(), null}, + new Component[]{getRichTextSeriesNameFormatPane(), null}, + new Component[]{getRichTextValueFormatPane(), null}, + new Component[]{getRichTextChangedValueFormatPane(), null}, + new Component[]{getRichTextPercentFormatPane(), null}, + new Component[]{getRichTextChangedPercentFormatPane(), null} + }; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTootipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTootipContentPane.java deleted file mode 100644 index 4f748214f8..0000000000 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudRefreshTootipContentPane.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.fr.van.chart.wordcloud.designer.style; - - -import com.fr.van.chart.designer.component.format.ChangedPercentFormatPaneWithCheckBox; -import com.fr.van.chart.designer.component.format.ChangedValueFormatPaneWithCheckBox; -import com.fr.van.chart.designer.style.VanChartStylePane; - -import javax.swing.JPanel; -import java.awt.Component; - -/** - * Created by mengao on 2017/6/9. - */ -public class VanChartWordCloudRefreshTootipContentPane extends VanChartWordCloudTooltipContentPane { - public VanChartWordCloudRefreshTootipContentPane(VanChartStylePane parent, JPanel showOnPane) { - super(null, showOnPane); - } - - @Override - protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - super.initFormatPane(parent, showOnPane); - - changedValueFormatPane = new ChangedValueFormatPaneWithCheckBox(parent, showOnPane){ - @Override - protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Change_Word_Value"); - } - }; - - changedPercentFormatPane = new ChangedPercentFormatPaneWithCheckBox(parent, showOnPane); - } - - protected double[] getRowSize(double p){ - return new double[]{p,p,p,p,p,p}; - } - - protected Component[][] getPaneComponents(){ - return new Component[][]{ - new Component[]{categoryNameFormatPane,null}, - new Component[]{seriesNameFormatPane,null}, - new Component[]{valueFormatPane,null}, - new Component[]{changedValueFormatPane,null}, - new Component[]{percentFormatPane,null}, - new Component[]{changedPercentFormatPane,null}, - }; - } -} diff --git a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java index 08845b2b7a..c0e9ac6c37 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/wordcloud/designer/style/VanChartWordCloudTooltipContentPane.java @@ -1,13 +1,18 @@ package com.fr.van.chart.wordcloud.designer.style; +import com.fr.design.i18n.Toolkit; import com.fr.plugin.chart.base.AttrTooltipContent; import com.fr.plugin.chart.base.format.AttrTooltipNameFormat; import com.fr.van.chart.designer.component.VanChartTooltipContentPane; import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.CategoryNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.PercentFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.PercentFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.SeriesNameFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.component.format.ValueFormatPaneWithCheckBox; +import com.fr.van.chart.designer.component.format.ValueFormatPaneWithoutCheckBox; import com.fr.van.chart.designer.style.VanChartStylePane; import javax.swing.JPanel; @@ -22,31 +27,61 @@ public class VanChartWordCloudTooltipContentPane extends VanChartTooltipContentP @Override protected void initFormatPane(VanChartStylePane parent, JPanel showOnPane) { - categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane){ + CategoryNameFormatPaneWithCheckBox categoryNameFormatPane = new CategoryNameFormatPaneWithCheckBox(parent, showOnPane) { @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); } }; - seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane){ + SeriesNameFormatPaneWithCheckBox seriesNameFormatPane = new SeriesNameFormatPaneWithCheckBox(parent, showOnPane) { @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Word_Name"); + return Toolkit.i18nText("Fine-Design_Chart_Word_Name"); } }; - valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane){ + ValueFormatPaneWithCheckBox valueFormatPane = new ValueFormatPaneWithCheckBox(parent, showOnPane) { @Override protected String getCheckBoxText() { - return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Word_Value"); + return Toolkit.i18nText("Fine-Design_Chart_Word_Value"); } }; - percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + PercentFormatPaneWithCheckBox percentFormatPane = new PercentFormatPaneWithCheckBox(parent, showOnPane); + + setCategoryNameFormatPane(categoryNameFormatPane); + setSeriesNameFormatPane(seriesNameFormatPane); + setValueFormatPane(valueFormatPane); + setPercentFormatPane(percentFormatPane); + } + + protected void initRichTextFormatPane(VanChartStylePane parent, JPanel showOnPane) { + CategoryNameFormatPaneWithoutCheckBox richTextCategoryNameFormatPane = new CategoryNameFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"); + } + }; + SeriesNameFormatPaneWithoutCheckBox richTextSeriesNameFormatPane = new SeriesNameFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Word_Name"); + } + }; + ValueFormatPaneWithoutCheckBox richTextValueFormatPane = new ValueFormatPaneWithoutCheckBox(parent, showOnPane) { + protected String getCheckBoxText() { + return Toolkit.i18nText("Fine-Design_Chart_Word_Value"); + } + }; + PercentFormatPaneWithoutCheckBox richTextPercentFormatPane = new PercentFormatPaneWithoutCheckBox(parent, showOnPane); + + setRichTextCategoryNameFormatPane(richTextCategoryNameFormatPane); + setRichTextSeriesNameFormatPane(richTextSeriesNameFormatPane); + setRichTextValueFormatPane(richTextValueFormatPane); + setRichTextPercentFormatPane(richTextPercentFormatPane); } @Override protected AttrTooltipContent createAttrTooltip() { AttrTooltipContent attrTooltipContent = new AttrTooltipContent(); attrTooltipContent.setSeriesFormat(new AttrTooltipNameFormat()); + attrTooltipContent.setRichTextSeriesFormat(new AttrTooltipNameFormat()); return attrTooltipContent; } } diff --git a/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.css b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.css new file mode 100644 index 0000000000..27eb74d9b2 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.css @@ -0,0 +1,22 @@ +.editor-insert-param-inactivated-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.editor-insert-param-inactivated-font .b-font:before { + content: "\e6ea"; + color: inherit; +} +.editor-insert-param-inactivated-font.disabled .b-font:before { + content: "\e6ea"; + color: inherit; +} +.editor-insert-param-active-font .b-font { + *zoom: expression( this.runtimeStyle['zoom'] = '1',this.innerHTML = ''); +} +.editor-insert-param-active-font .b-font:before { + content: "\e6ea"; + color: #23beef; +} +.editor-insert-param-active-font.disabled .b-font:before { + content: "\e6ea"; + color: #23beef; +} \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html new file mode 100644 index 0000000000..07fbb3ec72 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/rich_editor.html @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.constant.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.constant.js new file mode 100644 index 0000000000..3642aed285 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.constant.js @@ -0,0 +1,6 @@ +!(function () { + + BI.constant("bi.constant.design.chart.common.editor.placeholder_style", { + fontColor: "#c4c9d1" + }); +}()); \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js new file mode 100644 index 0000000000..e8d9e9a56e --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.js @@ -0,0 +1,257 @@ +!(function () { + var Widget = BI.inherit(BI.Widget, { + props: { + baseCls: "bi-design-chart-common-editor", + isAuto: true, + content: "", + placeholder: "", + fontStyle: {}, + dimensionIds: [], + toolbar: { + buttons: [] + }, + textAlign: "center" + }, + + _store: function () { + var o = this.options; + + return BI.Models.getModel("bi.model.design.chart.common.editor", { + dimensionIds: o.dimensionIds, + isAuto: o.isAuto + }); + }, + + render: function () { + var self = this, o = this.options; + this.editor = BI.createWidget({ + type: "bi.nic_editor", + $value: "chart-common-editor", + cls: "editor bi-border bi-focus-shadow " + (o.textAlign === "center" ? "editor-center-text" : ""), + listeners: [{ + eventName: BI.NicEditor.EVENT_FOCUS, + action: function () { + self.clearPlaceholder(); + self.store.setEditorBlurState(false); + } + }, { + eventName: BI.NicEditor.EVENT_BLUR, + action: function () { + self.setPlaceholder(); + self.store.setEditorBlurState(true); + } + }] + }); + + return { + type: "bi.vtape", + ref: function (_ref) { + self.bar = _ref; + }, + items: [{ + type: "bi.htape", + items: [{ + type: "bi.label", + text: "字体样式: ", + textAlign: "left", + width: 70 + }, { + type: "bi.button_group", + items: this.model.fontStyleItems, + ref: function (_ref) { + self.fontStyleGroup = _ref; + }, + listeners: [{ + eventName: BI.ButtonGroup.EVENT_CHANGE, + action: function () { + var isAuto = this.getValue()[0]; + self.store.changeIsAuto(isAuto); + self.changeFontStyleMode(isAuto); + } + }], + layouts: [{ + type: "bi.left", + rgap: 5 + }], + value: this.model.mode, + width: 125 + }, this._getToolBar()], + height: 24 + }, { + el: this.editor, + tgap: 10 + }] + }; + }, + + _getToolBar: function () { + var self = this; + return { + type: "bi.design.chart.common.editor.toolbar", + cls: "toolbar-region", + wId: this.options.wId, + editor: this.editor, + buttons: this.options.toolbar.buttons, + ref: function (_ref) { + self.toolbar = _ref; + } + }; + }, + + mounted: function () { + this.editor.bindToolbar(this.bar); + this.editor.setValue(this._formatContent(this.options.content)); + this.setFocus(); + }, + + _cleanHtml: function (value) { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + var dimensionIds = this.model.dimensionIds; + var dataIdMap = {}; + + for (var i = 0, len = dimensionIds.length; i < len; i++) { + var dimensionId = dimensionIds[i]; + var key = BI.keys(dimensionId)[0]; + + dataIdMap[key] = dimensionId[key]; + } + + var result = BI.replaceAll(value, "

", ""); + // 去掉image的src属性,因为数据太大了 + result = value.replaceAll("", function (imageStr) { + var attrs = editorService.getImageAttr(imageStr); + var str = ""; + }); + + return result; + }, + + getValue: function () { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + var value = this._cleanHtml(this.editor.getValue(BI.NicEditor.FormatType.ESCAPE)); + // BI.each(this.model.dimensionIds, function (idx, dId) { + // var fullName = BI.Utils.getNotGeoDimensionFullName(dId); + // value = editorService.appendImageAttr(value, fullName, BICst.RICH_TEXT_INFO.DATA_ID, dId); + // }); + + if (editorService.isEmptyRichText(value)) { + value = ""; + } + + if (BI.isNotEmptyString(this.options.placeholder) && editorService.isRichTextEqual(value, this.options.placeholder)) { + value = null; + } + + return { + isAuto: this.model.isAuto, + content: BI.NicEditor.htmlDecode(value) + }; + }, + + setValue: function (obj) { + var keys = BI.keys(obj); + if (BI.contains(keys, "content")) { + this.editor.setValue(this._formatContent(obj.content)); + } + if (BI.contains(keys, "isAuto")) { + this.store.changeIsAuto(obj.isAuto); + this.fontStyleGroup.setValue(obj.isAuto); + } + if (BI.contains(keys, "dimensionIds")) { + this.store.changeDimensionIds(obj.dimensionIds); + } + }, + + _formatContent: function (content) { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + + content = editorService.setImageSrc(content); + + if (editorService.isBlankRichText(content) + || editorService.isRichTextEqual(content, this.options.placeholder)) { + content = this.options.placeholder || ""; + } + + return content; + }, + + // 切换到“自动”时的处理方法 + _switchToAutoStyle: function () { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"), + content = this.editor.getValue(BI.NicEditor.FormatType.ESCAPE), + isEqualToPlaceholder = editorService.isRichTextEqual(content, this.options.placeholder); + + var HTML_ONLY_STYLE_TAG = "|||||||||||||||||"; + + if (!isEqualToPlaceholder) { + content = content.replaceAll(HTML_ONLY_STYLE_TAG, ""); + } + + return content; + }, + + clearPlaceholder: function () { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + var content = this.editor.getValue(BI.NicEditor.FormatType.ESCAPE); + var isSameContent = editorService.isRichTextEqual(content, this.options.placeholder); + + if (isSameContent) { + content = editorService.convertText2RichText("", this.options.fontStyle); + this.editor.setValue(content); + this.setFocus(); + } + }, + + setPlaceholder: function () { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + var content = this.editor.getValue(BI.NicEditor.FormatType.ESCAPE); + var isSameContent = editorService.isBlankRichText(content); + + if (isSameContent) { + this.editor.setValue(this.options.placeholder); + } + }, + + // 字体样式切换 + changeFontStyleMode: function (isAuto) { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + var switchFn = this.options.switchFn, + content = this.editor.getValue(BI.NicEditor.FormatType.ESCAPE), + origin = content; + if (isAuto) { + content = this._switchToAutoStyle(); + this.setFocus(); + } else if (editorService.isRichTextEqual(content, this.options.placeholder)) { + content = ""; + } + if (BI.isFunction(switchFn)) { + content = switchFn(isAuto, content); + } + if (content !== origin) { + this.editor.setValue(content); + } + }, + + setFocus: function () { + var instance = this.editor.instance; + instance && instance.initSelection(); + } + }); + + Widget.EVENT_CHANGE = "EVENT_CHANGE"; + + BI.shortcut("bi.design.chart.common.editor", Widget); + +}()); diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js new file mode 100644 index 0000000000..f430fea6c5 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.model.js @@ -0,0 +1,57 @@ +!(function () { + + var Model = BI.inherit(Fix.Model, { + childContext: ["isAuto", "dimensionIds"], + + state: function () { + var o = this.options; + + return { + isAuto: o.isAuto, + dimensionIds: o.dimensionIds, + isEditorBlur: true + }; + }, + + computed: { + fontStyleItems: function () { + return [{ + type: "bi.single_select_radio_item", + text: "自动", + hgap: 5, + logic: { + dynamic: true + }, + value: true, + selected: this.options.isAuto + }, { + type: "bi.single_select_radio_item", + text: "自定义", + hgap: 5, + logic: { + dynamic: true + }, + value: false, + selected: !this.options.isAuto + }]; + } + }, + + actions: { + changeIsAuto: function (isAuto) { + this.model.isAuto = isAuto; + }, + + changeDimensionIds: function (dimensionIds) { + this.model.dimensionIds = dimensionIds; + }, + + setEditorBlurState: function (isBlur) { + this.model.isEditorBlur = isBlur; + } + } + }); + + BI.model("bi.model.design.chart.common.editor", Model); + +}()); diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/editor.service.js b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.service.js new file mode 100644 index 0000000000..87fa2bdf62 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/editor.service.js @@ -0,0 +1,562 @@ +!(function () { + + /** + * HTML解析类,使用方法: + * new HTMLParser().parse(htmlText, { + * startTag: function (tagName, attrs) {}, + * endTag: function (tagName) {}, + * text: function (text) {} + * }) + */ + function HTMLParser () { + + } + + HTMLParser.prototype = { + constructor: HTMLParser, + + startTagPattern: /<([-\w\d_]+)\s*([^>]*)\s*(\/?)>/, + endTagPattern: /^<\/([-\w\d_]+)[^>]*>/, + attrPattern: /([-\w\d_]+)\s*=\s*["']([^"']*)["']/g, + // 特殊的字符 + specialCharsPatterns: [{ + pattern: / /g, + subStr: " " + }, { + pattern: /</g, + subStr: "<" + }, { + pattern: />/g, + subStr: ">" + }, { + pattern: /&/g, + subStr: "&" + }], + + handle: { + // 以下为处理开始标签和文本的时候触发的函数,可以自定义 + startTag: function () { + }, + endTag: function () { + }, + text: function () { + } + }, + + /** + * + * @param html + * @param handle + * @param isReplaceSpecialChars 是否需要替换HTML中的特殊字符 + */ + parse: function (html, handle, isReplaceSpecialChars) { + var index, isText = false, + match, last = html, + me = this; + + isReplaceSpecialChars = isReplaceSpecialChars !== null ? isReplaceSpecialChars : true; + + if (BI.isPlainObject(handle)) { + BI.isFunction(handle.startTag) && (this.handle.startTag = handle.startTag); + BI.isFunction(handle.endTag) && (this.handle.endTag = handle.endTag); + BI.isFunction(handle.text) && (this.handle.text = handle.text); + } + + while (html) { + isText = true; + + // 结束标签 + if (html.indexOf("'$%{}"]/.test(params)) { + return window.encodeURIComponent(params).replace(/'/g, escape); + } + return params; + }, + + decode: function (params) { + try { + var result = window.decodeURIComponent(params); + if (/[<>'$%{}"]/.test(result)) { + return result; + } + return params; + } catch (e) { + return params; + } + }, + + HTMLParser: HTMLParser, + + getImageAttr: getImageAttr, + + /** + * 构造一个富文本中的参数图片 + */ + getEditorParamImage: function (param, fillStyle) { + var attr = BI.DOM.getImage(param, fillStyle); + return "" + this.encode(attr.param)
+                + ""; + }, + + /** + * 给image设置属性 + */ + appendImageAttr: function (html, altValue, attrName, attrValue, isCovered) { + altValue = this.encode(altValue); + attrName = this.encode(attrName); + attrValue = this.encode(attrValue); + isCovered = isCovered || false; // 属性是否可以覆盖 + + return html.replaceAll("", function (imageStr) { + var attrs = getImageAttr(imageStr); + + if (attrs && attrs["alt"] === altValue && (BI.isNull(attrs[attrName]) || isCovered)) { + attrs[attrName] = attrValue; + imageStr = ""; + }); + + return { + startHtml: startHtml, + endHtml: endHtml + }; + }, + + /** + * 将富文本HTML转化成普通的文本,不需要记录fontStyle + */ + convertRichText2Text: function (html) { + var content = "", + line = "", + htmlFragments = []; + + new HTMLParser().parse(html, { + startTag: function (tagName, attrs) { + // 只关心br、img + switch (tagName) { + case "br": + line += "\n"; + htmlFragments.push(tagName); + break; + case "img": + BI.each(attrs, function (idx, obj) { + if (obj.name === "alt") { + line += "${" + obj.value + "}"; + } + }); + break; + default: + break; + } + }, + endTag: function (tagName) { + if (tagName === "div") { + //

这样的情况下应该只代表一个回车符 + htmlFragments[htmlFragments.length - 1] !== "br" && (line += "\n"); + htmlFragments = []; + } + + content += line; + line = ""; + }, + text: function (text) { + htmlFragments.push(text); + line += text; + } + }); + + // 去掉最后的换行符 + content = content.replace(/\n$/, ""); + + return content; + }, + + convertImage2Text: function (html) { + if (BI.isNull(html)) { + return html; + } + return html.replaceAll("", function (imageStr) { + var matched = imageStr.match(/alt="(.*?)"/); + var startHtml = ""; + var endHtml = ""; + return startHtml + (matched ? matched[1] : imageStr) + endHtml; + }); + }, + + isRichTextEqual: function (html1, html2) { + if (BI.isNotNull(html1)) { + html1 = this.convertImage2Text(html1); + } + if (BI.isNotNull(html2)) { + html2 = this.convertImage2Text(html2); + } + + return html1 === html2; + }, + + isRichTextNotEqual: function (html1, html2) { + return !this.isRichTextEqual(html1, html2); + }, + + isBlankRichText: function (html) { + html = html || ""; + html = this.convertRichText2Text(html); + return BI.trim(html).length === 0; + }, + + // 显示整个富文本中缺失的字段 + showMissingFields: function (html, validDimensionIds) { + var self = this; + + return html.replaceAll("", function (imageStr) { + var attrs = getImageAttr(imageStr); + return attrs && BI.contains(validDimensionIds, attrs[BICst.RICH_TEXT_INFO.DATA_ID]) + ? imageStr + : self.getMissingFieldImage( + attrs[BICst.RICH_TEXT_INFO.DATA_ID], + attrs[BICst.RICH_TEXT_INFO.DATA_NAME], + attrs[BICst.RICH_TEXT_INFO.ALT] + ); + }); + }, + + // 获取缺失元素的图片 + getMissingFieldImage: function (dId, name, fullName) { + var missingText = ""; + var missingImage = BI.DOM.getImage(missingText, "#ff0000"); + var html = this.getEditorParamImage(fullName, "#ff0000"); + + // 将原来的dId、name、fullName保存起来 + html = this.appendImageAttr(html, fullName, BICst.RICH_TEXT_INFO.DATA_ORIGIN_ID, dId); + html = this.appendImageAttr(html, fullName, BICst.RICH_TEXT_INFO.DATA_ORIGIN_NAME, name); + html = this.appendImageAttr(html, fullName, BICst.RICH_TEXT_INFO.DATA_ORIGIN_FULL_NAME, fullName); + html = this.appendImageAttr(html, fullName, BICst.RICH_TEXT_INFO.SRC, missingImage.src, true); + // 标记出这个参数是一个“缺失元素” + html = this.appendImageAttr(html, fullName, BICst.RICH_TEXT_INFO.DATA_IS_MISSING_FIELD, "true", true); + html = this.appendImageAttr(html, fullName, "style", missingImage.style, true); + return html; + }, + + // 将“缺失元素”替换成原来的字段 + restoreMissingField: function (html) { + var self = this; + + return html.replaceAll("", function (imageStr) { + var attrs = getImageAttr(imageStr); + + if (attrs && attrs[BICst.RICH_TEXT_INFO.DATA_ORIGIN_ID]) { + var fullName = attrs[BICst.RICH_TEXT_INFO.DATA_ORIGIN_FULL_NAME]; + var image = self.getEditorParamImage(fullName); + + image = self.appendImageAttr(image, fullName, BICst.RICH_TEXT_INFO.DATA_ID, attrs[BICst.RICH_TEXT_INFO.DATA_ORIGIN_ID]); + image = self.appendImageAttr(image, fullName, BICst.RICH_TEXT_INFO.DATA_NAME, attrs[BICst.RICH_TEXT_INFO.DATA_ORIGIN_NAME]); + return image; + } + + if (attrs + && attrs[BICst.RICH_TEXT_INFO.DATA_IS_INSERT_PARAM] + && !attrs[BICst.RICH_TEXT_INFO.DATA_ID] + ) { + imageStr = self.appendImageAttr( + imageStr, + attrs[BICst.RICH_TEXT_INFO.ALT], + BICst.RICH_TEXT_INFO.DATA_UN_VALID, + "true", + true + ); + } + + return imageStr; + }); + }, + + // 将富文本字符串中由用户主动插入的字段参数标记出来 + markTheInsertParamImages: function (html) { + return html.replaceAll("", function (imageStr) { + var attrs = getImageAttr(imageStr); + + // "缺失元素"和普通的字段参数直接过滤(从富文本编辑器中插入的参数只有data-id属性) + if (BI.has(attrs, BICst.RICH_TEXT_INFO.DATA_NAME) + || BI.has(attrs, BICst.RICH_TEXT_INFO.DATA_ORIGIN_ID)) { + return imageStr; + } + + attrs[BICst.RICH_TEXT_INFO.DATA_IS_INSERT_PARAM] = "true"; + imageStr = "", function (imageStr) { + var attrs = self.getImageAttr(imageStr); + // 已有src + if (BI.has(attrs, BICst.RICH_TEXT_INFO.SRC) && attrs[BICst.RICH_TEXT_INFO.SRC]) { + return imageStr; + } + var alt = self.decode(attrs[BICst.RICH_TEXT_INFO.ALT]); + var image = BI.DOM.getImage(alt); + imageStr = self.appendImageAttr(imageStr, alt, BICst.RICH_TEXT_INFO.SRC, image.src, true); + imageStr = self.appendImageAttr(imageStr, alt, "style", image.style, true); + return imageStr; + }); + }, + + isEmptyRichText: function (html) { + return "" === html.replaceAll("|

|
", ""); + }, + + // BI-23091 设置显示名之后更新参数名称 + getNewParamNameRichText: function (content) { + if (!content) { + return content; + } + var self = this; + return content.replaceAll("", function (imageStr) { + var attrs = self.getImageAttr(imageStr); + // 缺失元素 + if (attrs[BICst.RICH_TEXT_INFO.DATA_IS_MISSING_FIELD]) { + return imageStr; + } + var alt = attrs[BICst.RICH_TEXT_INFO.ALT], + dId = attrs[BICst.RICH_TEXT_INFO.DATA_ID], + name = BI.Utils.getNotGeoDimensionFullName(dId); + + if (name !== alt) { + imageStr = self.appendImageAttr(imageStr, alt, BICst.RICH_TEXT_INFO.ALT, name, true); + } + return imageStr; + }); + } + }); + + BI.service("bi.service.design.chart.common.editor", Service); + +}()); diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.js b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.js new file mode 100644 index 0000000000..36c02fedaf --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.js @@ -0,0 +1,106 @@ +!(function () { + var Widget = BI.inherit(BI.RichEditorParamAction, { + props: { + baseCls: "bi-design-chart-common-editor-insert-param", + dimensionIds: [], + editor: null + }, + + _store: function () { + return BI.Models.getModel("bi.model.design.chart.common.editor.insert_param"); + }, + + watch: { + isSelectedParam: function () { + var editorService = BI.Services.getService("bi.service.design.chart.common.editor"); + this.addParam(this.model.param, editorService.encode); + this.combo.hideView(); + // this._restorePosition(); + }, + items: function () { + this.adapter.populate(this.model.items); + } + }, + + render: function () { + var self = this; + + this.adapter = BI.createWidget({ + type: "bi.button_group", + items: this.model.items, + chooseType: BI.ButtonGroup.CHOOSE_TYPE_SINGLE, + behaviors: {}, + width: 200, + layouts: [{ + type: "bi.vertical" + }], + listeners: [{ + eventName: BI.ButtonGroup.EVENT_CHANGE, + action: function () { + self._savePosition(); + self.store.changeParam(this.getValue()[0]); + } + }] + }); + + var searchPopup = { + type: "bi.vertical", + cls: "bi-border", + tgap: 10, + bgap: 10, + items: [this.adapter] + }; + + return { + type: "bi.combo", + direction: "bottom,left", + isNeedAdjustWidth: true, + el: { + type: "bi.vertical_adapt", + items: [{ + type: "bi.icon_change_button", + iconCls: "editor-insert-param-inactivated-font", + iconWidth: 24, + iconHeight: 24, + ref: function (_ref) { + self.iconButtonTrigger = _ref; + } + }] + }, + popup: { + el: searchPopup + }, + ref: function (_ref) { + self.combo = _ref; + }, + listeners: [{ + eventName: BI.Combo.EVENT_AFTER_POPUPVIEW, + action: function () { + self.iconButtonTrigger.setIcon("editor-insert-param-active-font"); + } + }, { + eventName: BI.Combo.EVENT_BEFORE_HIDEVIEW, + action: function () { + self.iconButtonTrigger.setIcon("editor-insert-param-inactivated-font"); + } + }] + }; + }, + + _savePosition: function () { + var instance = this._getInstance(); + instance.saveRng(); + }, + + _restorePosition: function () { + var instance = this._getInstance(); + instance.initSelection(); + }, + + _getInstance: function () { + return this.options.editor.selectedInstance || this.options.editor.getInstance(); + } + }); + + BI.shortcut("bi.design.chart.common.editor.insert_param", Widget); +}()); \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.model.js b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.model.js new file mode 100644 index 0000000000..10db72cd0e --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/combo.insert_param.model.js @@ -0,0 +1,40 @@ +/* + * @Maintainers: xiaofu.qin + */ +!(function () { + + var Model = BI.inherit(Fix.Model, { + context: ["dimensionIds"], + + state: function () { + return { + param: "", + isSelectedParam: false + }; + }, + + computed: { + items: function () { + return BI.map(this.model.dimensionIds, function (idx, dId) { + var key = BI.keys(dId)[0]; + + return { + type: "bi.design.chart.common.editor.search", + text: key, + value: key + }; + }); + } + }, + + actions: { + changeParam: function (param) { + this.model.isSelectedParam = !this.model.isSelectedParam; + this.model.param = param; + } + } + }); + + BI.model("bi.model.design.chart.common.editor.insert_param", Model); + +} ()); diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/item/item.js b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/item/item.js new file mode 100644 index 0000000000..bfd5644414 --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/insertcombo/item/item.js @@ -0,0 +1,38 @@ +!(function () { + + var Widget = BI.inherit(BI.BasicButton, { + props: { + text: "", + iconCls: "", + extraCls: "bi-list-item-active" + }, + + render: function () { + var o = this.options; + return { + type: "bi.vertical_adapt", + height: 25, + items: [{ + type: "bi.center_adapt", + cls: o.iconCls, + items: [{ + type: "bi.icon", + width: 16, + height: 16 + }], + width: 16, + height: 16 + }, { + type: "bi.label", + textAlign: "left", + lgap: 5, + text: o.text, + value: o.text + }] + }; + } + }); + + BI.shortcut("bi.design.chart.common.editor.search", Widget); + +}()); \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/disabled_bar_wrapper.js b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/disabled_bar_wrapper.js new file mode 100644 index 0000000000..5b07ea39ff --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/disabled_bar_wrapper.js @@ -0,0 +1,22 @@ +/** + * 灰化toolbar的item + */ +!(function () { + + var Widget = BI.inherit(BI.Single, { + props: { + button: null + }, + + render: function () { + return { + type: "bi.vertical_adapt", + disabled: true, + items: [this.options.button] + }; + } + }); + + BI.shortcut("bi.design.chart.common.editor.toolbar.disabled_item_wrapper", Widget); + +}()); \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.js b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.js new file mode 100644 index 0000000000..4246ec9bcb --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.js @@ -0,0 +1,124 @@ +!(function () { + var RichEditorTextToolbar = BI.inherit(BI.Widget, { + + props: { + baseCls: "bi-rich-editor-text-toolbar", + height: 25, + editor: null, + buttons: [ + {type: "bi.rich_editor_font_chooser"}, + {type: "bi.rich_editor_size_chooser"}, + {type: "bi.rich_editor_bold_button"}, + {type: "bi.rich_editor_italic_button"}, + {type: "bi.rich_editor_underline_button"}, + {type: "bi.rich_editor_color_chooser"}, + {type: "bi.rich_editor_align_left_button"}, + {type: "bi.rich_editor_align_center_button"}, + {type: "bi.rich_editor_align_right_button"}, + {type: "bi.design.chart.common.editor.insert_param"} + ] + }, + + _store: function () { + return BI.Models.getModel("bi.model.design.chart.common.editor.toolbar"); + }, + + watch: { + isAuto: function (isAuto) { + this[isAuto ? "hideCustomFontTool" : "showCustomFontTool"](); + } + }, + + render: function () { + var self = this, + o = this.options; + + this.hasInsertCombo = o.buttons[o.buttons.length - 1].type === "bi.design.chart.common.editor.insert_param"; + + this.buttons = BI.createWidgets(BI.map(o.buttons, function (i, btn) { + return BI.extend(btn, { + editor: o.editor + }); + })); + + if (this.hasInsertCombo) { + var leftItems = BI.filter(this.buttons, function (idx) { + return idx !== self.buttons.length - 1; + }); + return { + type: "bi.left_right_vertical_adapt", + lrgap: 10, + items: { + left: this._getButtons(leftItems), + right: [this.buttons[this.buttons.length - 1]] + } + }; + } + + return { + type: "bi.vertical_adapt", + rgap: 10, + items: this._getButtons(this.buttons) + }; + }, + + mounted: function () { + var self = this; + if (BI.isIE9Below()) {// IE8下必须要设置unselectable才能不blur输入框 + this.element.mousedown(function () { + self._noSelect(self.element[0]); + }); + this._noSelect(this.element[0]); + } + + this.model.isAuto && this.hideCustomFontTool(); + }, + + _noSelect: function (element) { + if (element.setAttribute && element.nodeName.toLowerCase() !== "input" && element.nodeName.toLowerCase() !== "textarea") { + element.setAttribute("unselectable", "on"); + } + for (var i = 0; i < element.childNodes.length; i++) { + this._noSelect(element.childNodes[i]); + } + }, + + hideCustomFontTool: function () { + var self = this; + BI.each(this.buttons, function (idx, button) { + if (self.hasInsertCombo) { + idx !== self.buttons.length - 1 && button.setVisible(false); + } else { + button.setVisible(false); + } + }); + }, + + showCustomFontTool: function () { + var self = this; + BI.each(this.buttons, function (idx, button) { + if (self.hasInsertCombo) { + idx !== self.buttons.length - 1 && button.setVisible(true); + } else { + button.setVisible(true); + } + }); + }, + + _getButtons: function (buttons) { + return BI.map(buttons, function (idx, button) { + if (button.options.used === false) { + return { + type: "bi.design.chart.common.editor.toolbar.disabled_item_wrapper", + button: button, + title: button.options.title + }; + } + + return button; + }); + } + }); + + BI.shortcut("bi.design.chart.common.editor.toolbar", RichEditorTextToolbar); +})(); \ No newline at end of file diff --git a/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.model.js b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.model.js new file mode 100644 index 0000000000..96e30eee4d --- /dev/null +++ b/designer-chart/src/main/resources/com/fr/design/editor/script/toolbar/toolbar.model.js @@ -0,0 +1,12 @@ +/* + * @Maintainers: xiaofu.qin + */ +!(function () { + + var Model = BI.inherit(Fix.Model, { + context: ["isAuto", "wId", "dimensionIds"] + }); + + BI.model("bi.model.design.chart.common.editor.toolbar", Model); + +} ()); \ 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 ff89f059ba..0f673e30ae 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 @@ -15,6 +15,7 @@ import com.fr.design.designer.creator.XWAbsoluteBodyLayout; import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.designer.creator.cardlayout.XWCardLayout; import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; @@ -77,12 +78,13 @@ public class SelectionModel { * @param e 鼠标事件 */ public void selectACreatorAtMouseEvent(MouseEvent e) { + //单选因为要先从已选择的组件中筛选一遍,所以先选择再reset + XCreator comp = designer.getComponentAt(e); if (e.getButton() == MouseEvent.BUTTON3 || (!InputEventBaseOnOS.isControlDown(e) && !e.isShiftDown())) { // 如果Ctrl或者Shift键盘没有按下,则清除已经选择的组件 selection.reset(); } else { //按下Ctrl或者shift键时鼠标可以进行多选,两次点击同一控件就取消选中 - XCreator comp = designer.getComponentAt(e); XLayoutContainer topLayout = XCreatorUtils.getHotspotContainer(comp).getTopLayout(); if (topLayout != null && !topLayout.isEditable()) { comp = topLayout; @@ -93,9 +95,9 @@ public class SelectionModel { selection.removeCreator(selected); } } + comp = designer.getComponentAt(e); } // 获取e所在的组件 - XCreator comp = designer.getComponentAt(e); selectACreator(comp); } @@ -110,7 +112,7 @@ public class SelectionModel { if (comp != designer.getRootComponent() && comp != designer.getParaComponent()) { XCreator parentContainer = (XCreator) comp.getParent(); if (parentContainer != null) { - comp = parentContainer.isDedicateContainer() ? parentContainer : comp; + comp = parentContainer.isDedicateContainer() || comp instanceof XCardSwitchButton ? parentContainer : comp; } } if (selection.removeSelectedCreator(comp) || selection.addSelectedCreator(comp)) { diff --git a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java index 1e7badb8a3..c5150baa56 100644 --- a/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java +++ b/designer-form/src/main/java/com/fr/design/designer/beans/models/StateModel.java @@ -300,6 +300,13 @@ public class StateModel { int y = getMouseXY(e).y; Rectangle bounds = createCurrentBounds(x, y); + // 有参数面板时 要考虑下参数面板的高度影响 + int yOffset = 0; + XLayoutContainer paramComponent = designer.getParaComponent(); + if (paramComponent != null) { + yOffset = paramComponent.getHeight(); + } + bounds.y = Math.max(bounds.y - yOffset, 0); if ((x != currentX) || (y != currentY)) { ArrayList creators = getHotspotCreators(bounds, designer.getRootComponent()); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java index 44996df8cd..9a627ab2c0 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XButton.java @@ -308,5 +308,4 @@ public class XButton extends XWidgetCreator { } } - } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java index b0f6e11589..c002bceb38 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XChartEditor.java @@ -229,6 +229,9 @@ public class XChartEditor extends XBorderStyleWidgetCreator { */ public void paint(Graphics g) { designerEditor.paintEditor(g, this.getSize()); + if (coverPanel != null) { + coverPanel.setSize(this.getSize()); + } super.paint(g); if (isEditing) { g.setColor(INNER_BORDER_COLOR); @@ -258,6 +261,7 @@ public class XChartEditor extends XBorderStyleWidgetCreator { (e.getClickCount() == 2 || designer.getCursor().getType() == Cursor.HAND_CURSOR); displayCoverPane(!isEditing); selectionModel.selectACreatorAtMouseEvent(e); + editingMouseListener.refreshTopXCreator(isEditing); if (editingMouseListener.stopEditing()) { if (this != (XCreator) designer.getRootComponent()) { @@ -357,4 +361,5 @@ public class XChartEditor extends XBorderStyleWidgetCreator { public boolean supportMobileStyle() { return false; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java index dcb6938836..ec83a1f9a5 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XCreator.java @@ -539,6 +539,8 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); + if (editingMouseListener.stopEditing() && this != designer.getRootComponent()) { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); editingMouseListener.startEditing(this, adapter.getDesignerEditor(), adapter); @@ -798,10 +800,16 @@ public abstract class XCreator extends JPanel implements XComponent, XCreatorToo /** * 是否支持共享-现只支持报表块、图表、tab块、绝对布局 - * @return */ public boolean isSupportShared() { return false; } + /** + * 是否支持置顶显示 + */ + public boolean isTopable() { + return true; + } + } 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 42069e4d8a..260318023e 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 @@ -336,4 +336,25 @@ public class XCreatorUtils { } return IOUtils.readIcon(iconPath); } + + public static boolean containComponent(Container ancestor, Container xCreator) { + while (xCreator != null && xCreator.getParent() != ancestor) { + xCreator = xCreator.getParent(); + } + return xCreator != null; + } + + /** + * 获取组件的上一层的XMainBorderLayout,没有则返回null + * */ + @Nullable + public static XWCardMainBorderLayout getTopXMainBorderLayout(Container creator) { + while (creator != null) { + if (creator instanceof XWCardMainBorderLayout) { + return (XWCardMainBorderLayout) creator; + } + creator = creator.getParent(); + } + return null; + } } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java index ec06a1597d..718c30aeb6 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XElementCase.java @@ -319,6 +319,7 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public void respondClick(EditingMouseListener editingMouseListener,MouseEvent e){ HelpDialogManager.getInstance().setPane(coverPanel); super.respondClick(editingMouseListener, e); + editingMouseListener.refreshTopXCreator(); if (this.isHelpBtnOnFocus()) { coverPanel.setMsgDisplay(e); } else { @@ -370,4 +371,5 @@ public class XElementCase extends XBorderStyleWidgetCreator implements FormEleme public boolean isSupportShared() { return true; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java index 2671017878..0f78c5739d 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XNameWidget.java @@ -68,9 +68,6 @@ public class XNameWidget extends XWidgetCreator { Widget widget; if (wc != null && (widget= wc.toWidget()) != null) { editor = XCreatorUtils.createXCreator(widget); - Widget currentWidget = toData(); - currentWidget.setVisible(widget.isVisible()); - currentWidget.setEnabled(widget.isEnabled()); this.setBorder(null); } else { this.setBorder(DEFALUTBORDER); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java index 6190ffaebb..2c88e62525 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteBodyLayout.java @@ -130,4 +130,9 @@ public class XWAbsoluteBodyLayout extends XWAbsoluteLayout { public boolean isSupportShared() { return false; } + + @Override + public boolean isTopable() { + return false; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java index 7c852f2820..da268b0e6c 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWAbsoluteLayout.java @@ -433,7 +433,11 @@ public class XWAbsoluteLayout extends XLayoutContainer { @Override public XLayoutContainer getTopLayout() { - XLayoutContainer xTopLayout = XCreatorUtils.getParentXLayoutContainer(this).getTopLayout(); + XLayoutContainer parentXLayoutContainer = XCreatorUtils.getParentXLayoutContainer(this); + if (parentXLayoutContainer == null) { + return this; + } + XLayoutContainer xTopLayout = parentXLayoutContainer.getTopLayout(); if (xTopLayout != null && !xTopLayout.isEditable()) { return xTopLayout; } else { @@ -538,6 +542,7 @@ public class XWAbsoluteLayout extends XLayoutContainer { selectionModel.selectACreatorAtMouseEvent(e); designer.repaint(); + editingMouseListener.refreshTopXCreator(isEditing); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { @@ -602,4 +607,5 @@ public class XWAbsoluteLayout extends XLayoutContainer { return super.getWidgetPropertyUIProviders(); } } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java index 06aca3c1b3..3e425b4cd9 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWFitLayout.java @@ -1222,6 +1222,11 @@ public class XWFitLayout extends XLayoutContainer { return false; } + @Override + public boolean isTopable() { + return false; + } + public boolean switch2FitBodyLayout(XCreator creator) { try { XWFitLayout xfl = (XWFitLayout) creator.getBackupParent(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java index cb288c98cc..1d37024d98 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWParameterLayout.java @@ -251,4 +251,8 @@ public class XWParameterLayout extends XWAbsoluteLayout { return false; } + @Override + public boolean isTopable() { + return false; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java index 2cc56ee9ba..964f0aa03d 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/XWTitleLayout.java @@ -189,4 +189,5 @@ public class XWTitleLayout extends DedicateLayoutContainer { XCreator creator = getPropertyDescriptorCreator(); return creator.getWidgetPropertyUIProviders(); } + } \ No newline at end of file diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java index 6909207c35..7718e266f2 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java @@ -86,7 +86,6 @@ public class XCardAddButton extends XButton { @Override public void respondClick(EditingMouseListener editingMouseListener, MouseEvent e){ FormDesigner designer = editingMouseListener.getDesigner(); - designer.fireTargetModified(); // addbutton对应的XWCardLayout和XWCardTagLayout暂未存入到xml中,重新打开之后先根据父子层获取 if(cardLayout == null && tagLayout ==null ){ @@ -112,6 +111,8 @@ public class XCardAddButton extends XButton { showNewTab(editingMouseListener,index); tagLayout.setTabsAndAdjust(); LayoutUtils.layoutRootContainer(designer.getRootComponent()); + + designer.fireTargetModified(); } @Override diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java index bce26eb3f3..1c335efa62 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardSwitchButton.java @@ -259,10 +259,25 @@ public class XCardSwitchButton extends XButton { int ey = e.getY(); //获取tab布局的位置,鼠标相对于tab按钮的位置 - XLayoutContainer mainLayout = cardLayout.getBackupParent(); + Container mainLayout = cardLayout.getBackupParent(); Point point = mainLayout.getLocation(); - double mainX = point.getX(); - double mainY = point.getY(); + int y = 0; + int x = 0; + //遍历一下,不然是相对位置,嵌套后位置不对 + while (mainLayout.getParent() != null){ + if(mainLayout instanceof XWCardLayout){ + y += mainLayout.getY(); + } + + mainLayout = mainLayout.getParent(); + + if(mainLayout instanceof XWCardMainBorderLayout){ + x += mainLayout.getX(); + y += mainLayout.getY(); + } + } + double mainX = point.getX() + x; + double mainY = point.getY() + y; // 参数界面对坐标的影响 JForm jform = (JForm) HistoryTemplateListPane.getInstance().getCurrentEditingTemplate(); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java index 25da3e7754..5b37ad313f 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardMainBorderLayout.java @@ -16,10 +16,7 @@ import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWidgetCreator; -import com.fr.design.designer.properties.mobile.MobileBooKMarkUsePropertyUI; -import com.fr.design.form.util.FormDesignerUtils; import com.fr.design.form.util.XCreatorConstants; -import com.fr.design.fun.WidgetPropertyUIProvider; import com.fr.design.icon.IconPathConstants; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.EditingMouseListener; @@ -438,6 +435,7 @@ public class XWCardMainBorderLayout extends XWBorderLayout { setEditable(isEditing); selectionModel.selectACreatorAtMouseEvent(e); + editingMouseListener.refreshTopXCreator(isEditing); designer.repaint(); if (editingMouseListener.stopEditing()) { @@ -514,4 +512,5 @@ public class XWCardMainBorderLayout extends XWBorderLayout { public boolean isSupportShared() { return true; } + } diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java index dc8bb90801..010a382178 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTagLayout.java @@ -143,7 +143,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { fitLayout.setInitialBackground(layout.getTemplateStyle().getTabDefaultBackground()); fitLayout.setCustomStyle(true); } - tabFitLayout.setxCardSwitchButton((XCardSwitchButton)this.getComponent(0)); + tabFitLayout.setxCardSwitchButton((XCardSwitchButton)this.getComponent(index)); tabFitLayout.checkButonType(); tabFitLayout.setBackupParent(cardLayout); cardLayout.add(tabFitLayout, widgetName); @@ -248,6 +248,7 @@ public class XWCardTagLayout extends XWHorizontalBoxLayout { if (e.getClickCount() <= 1) { selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, this); diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java index babc54b316..f6f6b2b411 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWCardTitleLayout.java @@ -204,6 +204,7 @@ public class XWCardTitleLayout extends XWBorderLayout { if (e.getClickCount() <= 1) { selectionModel.selectACreatorAtMouseEvent(e); } + editingMouseListener.refreshTopXCreator(); if (editingMouseListener.stopEditing()) { if (this != designer.getRootComponent()) { diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java index 8d5d232fa6..a706674c7b 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XWTabFitLayout.java @@ -639,4 +639,8 @@ public class XWTabFitLayout extends XWFitLayout { checkVisible(); } + @Override + public boolean isTopable() { + return true; + } } diff --git a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java index 16ec4405df..48938dceee 100644 --- a/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java +++ b/designer-form/src/main/java/com/fr/design/designer/treeview/ComponentTreeCellRenderer.java @@ -3,54 +3,53 @@ package com.fr.design.designer.treeview; import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XCreatorUtils; -import com.fr.design.gui.ilable.UILabel; +import com.fr.log.FineLoggerFactory; +import javax.swing.BorderFactory; import javax.swing.Icon; import javax.swing.JTree; import javax.swing.tree.DefaultTreeCellRenderer; import java.awt.Component; -import java.awt.Dimension; public class ComponentTreeCellRenderer extends DefaultTreeCellRenderer { - public ComponentTreeCellRenderer() { - } - - @Override - public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, - boolean leaf, int row, boolean hasFocus) { - super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); - if (value instanceof XCreator) { - String name = ((XCreator) value).toData().getWidgetName(); - setText(name); - Icon icon = XCreatorUtils.getCreatorIcon((XCreator) value); - if (icon != null) { - setIcon(icon); - } - } - UILabel label = new UILabel(); - label.setText(getText()); - label.setIcon(getIcon()); - Dimension dim = label.getPreferredSize(); - dim.height += 2; - this.setSize(dim); - this.setPreferredSize(dim); - this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); - return this; - } - - @Override - public Icon getClosedIcon() { - return getIcon(); - } - - @Override - public Icon getLeafIcon() { - return getIcon(); - } - - @Override - public Icon getOpenIcon() { - return getIcon(); - } -} \ No newline at end of file + public ComponentTreeCellRenderer() { + } + + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, + boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); + if (value instanceof XCreator) { + String name = ((XCreator) value).toData().getWidgetName(); + setText(name); + Icon icon = null; + try { + icon = XCreatorUtils.getCreatorIcon((XCreator) value); + } catch (Exception e) { + FineLoggerFactory.getLogger().info("{} has not icon or has been deleted", name); + } + if (icon != null) { + setIcon(icon); + } + } + this.setBorder(BorderFactory.createEmptyBorder(1, 0, 1, 0)); + this.setBackgroundNonSelectionColor(UIConstants.TREE_BACKGROUND); + return this; + } + + @Override + public Icon getClosedIcon() { + return getIcon(); + } + + @Override + public Icon getLeafIcon() { + return getIcon(); + } + + @Override + public Icon getOpenIcon() { + return getIcon(); + } +} diff --git a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java index 8956125eb3..8d13f3ab42 100644 --- a/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java +++ b/designer-form/src/main/java/com/fr/design/form/parameter/FormParaDesigner.java @@ -30,6 +30,7 @@ import com.fr.design.mainframe.EastRegionContainerPane; import com.fr.design.mainframe.FormArea; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.FormDesignerModeForSpecial; +import com.fr.design.mainframe.FormDesignerUI; import com.fr.design.mainframe.FormParaPane; import com.fr.design.mainframe.FormWidgetDetailPane; import com.fr.design.mainframe.JTemplate; @@ -58,6 +59,7 @@ import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.Rectangle; +import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -467,6 +469,21 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return ((FormParameterUI) getTarget()).getDesignSize(); } + /** + * 设置其UI类为DesignerUI,负责渲染 + */ + @Override + public void updateUI() { + setUI(new FormDesignerUI(){ + @Override + protected Rectangle getFitPaintBounds(Component component, Component parent) { + return new Rectangle(0, 0, parent.getSize().width, parent.getSize().height); + } + + }); + } + + /** * 设置高度 * @@ -722,4 +739,11 @@ public class FormParaDesigner extends FormDesigner implements ParameterDesignerP return new JComponent[]{new CutAction(this).createToolBarComponent(), new CopyAction(this).createToolBarComponent(), new PasteAction(this).createToolBarComponent(), new FormDeleteAction(this).createToolBarComponent()}; } + + @Override + public boolean checkIfBeyondValidArea(MouseEvent e){ + return false; + } + + } diff --git a/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java index 85ec9474db..3e248f3bae 100644 --- a/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java +++ b/designer-form/src/main/java/com/fr/design/form/util/FormDesignerUtils.java @@ -1,5 +1,9 @@ package com.fr.design.form.util; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWAbsoluteLayout; +import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.file.HistoryTemplateListCache; import com.fr.design.mainframe.FormDesigner; import com.fr.design.mainframe.JTemplate; @@ -7,6 +11,7 @@ import com.fr.design.mainframe.template.info.ComponentCreateOperate; import com.fr.design.mainframe.template.info.ComponentDeleteOperate; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WFitLayout; +import java.awt.Container; public class FormDesignerUtils { @@ -17,6 +22,9 @@ public class FormDesignerUtils { * @return */ public static boolean isAppRelayout(FormDesigner designer) { + if (!designer.getRootComponent().acceptType(XWFitLayout.class)) { + return false; + } return ((WFitLayout) designer.getRootComponent().toData()).isAppRelayout(); } @@ -42,4 +50,21 @@ public class FormDesignerUtils { jTemplate.getProcessInfo().updateTemplateOperationInfo(new ComponentDeleteOperate(widget)); } + /** + * 判断当前UI组件是否在绝对画布块中 + * + * @param xCreator + * @return + */ + public static boolean isInAbsoluteLayout(XCreator xCreator) { + Container parent = xCreator.getParent(); + while (parent != null) { + if (parent instanceof XWAbsoluteLayout && !(parent instanceof XWAbsoluteBodyLayout)) { + return true; + } + parent = parent.getParent(); + } + return false; + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java index a2f295f87d..ee667fd38c 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/ComponentTree.java @@ -2,7 +2,11 @@ package com.fr.design.mainframe; import com.fr.design.constants.UIConstants; import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; import com.fr.design.designer.creator.XLayoutContainer; +import com.fr.design.designer.creator.XWAbsoluteBodyLayout; +import com.fr.design.designer.creator.XWFitLayout; +import com.fr.design.designer.creator.cardlayout.XCardSwitchButton; import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.gui.itree.UITreeUI; @@ -15,7 +19,9 @@ import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.SwingUtilities; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.BorderLayout; @@ -30,6 +36,9 @@ import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Vector; public class ComponentTree extends JTree { @@ -129,6 +138,7 @@ public class ComponentTree extends JTree { setSelectionPaths(treepath); if (treepath.length > 0) { scrollPathToVisible(treepath[0]); + //expandPath(treepath[0]); } } @@ -228,6 +238,52 @@ public class ComponentTree extends JTree { repaint(); } + /** + * 获得树的展开路径 + * */ + public void getExpandNodes(List searchList) { + getExpandNodes((XLayoutContainer)designer.getTopContainer(),searchList); + } + + public void getExpandNodes(XLayoutContainer container, List searchList) { + TreePath treePath = buildTreePath(container); + if (isExpanded(treePath)) { + searchList.add(treePath); + for (int i = 0, size = container.getXCreatorCount(); i < size; i++) { + XCreator creator = container.getXCreator(i); + if (creator.acceptType(XLayoutContainer.class) || creator.acceptType(XCardSwitchButton.class)) { + getExpandNodes((XLayoutContainer) creator.getXCreator(), searchList); + } + } + } + //对绝对布局做特殊处理 + if (container.acceptType(XWFitLayout.class)) { + XWFitLayout bodyFitLayout = (XWFitLayout) container; + for (int j = 0; j < bodyFitLayout.getXCreatorCount(); j++) { + //类型是绝对布局并且还是body + if (bodyFitLayout.getXCreator(j).acceptType(XWAbsoluteBodyLayout.class)) { + container = (XLayoutContainer) bodyFitLayout.getXCreator(j); + getExpandNodes(container, searchList); + } + } + } + } + + /** + * 将树按照展开路径进行展开 + * */ + public void expandNodes(List list){ + for(TreePath treePath:list) { + if (treePath.getLastPathComponent() instanceof XLayoutContainer) { + XLayoutContainer creator= (XLayoutContainer) treePath.getLastPathComponent(); + if (XCreatorUtils.getParentXLayoutContainer(creator) == null) { + continue; + } + expandPath(treePath); + } + } + } + private TreePath buildTreePath(Component comp) { ArrayList path = new ArrayList(); Component parent = comp; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java b/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java index d692eaa5ea..a4c4014408 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/CoverPane.java @@ -8,7 +8,7 @@ import com.fr.general.IOUtils; import com.fr.stable.Constants; -import javax.swing.JPanel; +import javax.swing.JComponent; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Component; @@ -28,7 +28,7 @@ import java.awt.Rectangle; * Date: 14-7-24 * Time: 上午9:09 */ -public class CoverPane extends JPanel { +public class CoverPane extends JComponent { private UIButton editButton; private AlphaComposite composite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f); diff --git a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java index 7d2ba0cc92..524dd8bf14 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java @@ -166,7 +166,7 @@ public class EditingMouseListener extends MouseInputAdapter { // 获取焦点,以便获取热键 designer.requestFocus(); } - if (e.getButton() == MouseEvent.BUTTON1 && !beyondValidArea(e)) { + if (e.getButton() == MouseEvent.BUTTON1 && !designer.checkIfBeyondValidArea(e)) { Direction dir = selectionModel.getDirectionAt(e); if (!DesignerMode.isAuthorityEditing()) { @@ -177,7 +177,6 @@ public class EditingMouseListener extends MouseInputAdapter { if (designer.isDrawLineMode()) { designer.updateDrawLineMode(e); } else { - if (selectionModel.hasSelectionComponent() && selectionModel.getSelection().getRelativeBounds().contains( designer.getHorizontalScaleValue() + e.getX(), @@ -195,16 +194,6 @@ public class EditingMouseListener extends MouseInputAdapter { e.translatePoint(oldX - e.getX(), oldY - e.getY()); } - private boolean beyondValidArea(MouseEvent e) { - if (e.getX() < 0 || e.getY() < 0 || - e.getX() > designer.getRootComponent().getWidth() || - e.getY() > (designer.getRootComponent().getHeight() + designer.getParaHeight())) { - return true; - } - return false; - } - - private void offsetEventPoint(MouseEvent e){ int x = designer.getRelativeX(e.getX()); int y = designer.getRelativeY(e.getY()); @@ -371,7 +360,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } // component.getParent() 是报表块所在的XWTitleLayout int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue(); - int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue(); + int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xElementCase.getY(); if (e.getX() + GAP - xElementCase.getInsets().left > minX && e.getX() - GAP - xElementCase.getInsets().left < minX + button.getWidth()) { if (e.getY() + GAP - xElementCase.getInsets().top > minY && e.getY() - GAP - xElementCase.getInsets().top < minY + button.getHeight()) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -386,7 +375,7 @@ public class EditingMouseListener extends MouseInputAdapter { if (component.getCoverPane().getComponentCount() > 1) { JComponent button1 = (JComponent) component.getCoverPane().getComponent(1); int minX1 = button1.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue(); - int minY1 = button1.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue(); + int minY1 = button1.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + component.getY(); if (e.getX() + GAP - component.getInsets().left > minX1 && e.getX() - GAP - component.getInsets().left < minX1 + button1.getWidth()) { if (e.getY() + GAP - component.getInsets().top > minY1 && e.getY() - GAP - component.getInsets().top < minY1 + button1.getHeight()) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -413,16 +402,7 @@ public class EditingMouseListener extends MouseInputAdapter { } private void setCoverPaneNotDisplay(XCreator component, MouseEvent e, boolean isLinkedHelpDialog) { - if (xElementCase != null) { - int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); - int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); - Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight()); - if (rect.contains(e.getPoint())) { - return; - } - xElementCase.displayCoverPane(false); - } if (xChartEditor != null) { xChartEditor.displayCoverPane(false); } @@ -433,6 +413,15 @@ public class EditingMouseListener extends MouseInputAdapter { if (xTopLayoutContainer != null) { xTopLayoutContainer.setMouseEnter(false); } + //不知道为什么要对XElementCase进行判断,但是直接return会有bug,所以把他放在最后 + if (xElementCase != null) { + int x = getParentPositionX(xElementCase, 0) - designer.getArea().getHorizontalValue(); + int y = getParentPositionY(xElementCase, 0) - designer.getArea().getVerticalValue(); + Rectangle rect = new Rectangle(x, y, xElementCase.getWidth(), xElementCase.getHeight()); + if (!rect.contains(e.getPoint())) { + xElementCase.displayCoverPane(false); + } + } designer.repaint(); } @@ -470,7 +459,7 @@ public class EditingMouseListener extends MouseInputAdapter { designer.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } int minX = button.getX() + getParentPositionX(component, 0) - designer.getHorizontalScaleValue(); - int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue(); + int minY = button.getY() + getParentPositionY(component, 0) - designer.getVerticalScaleValue() + xChartEditor.getY(); if (e.getX() + GAP > minX && e.getX() - GAP < minX + button.getWidth()) { if (e.getY() + GAP > minY && e.getY() - GAP < minY + button.getHeight()) { designer.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); @@ -708,6 +697,7 @@ public class EditingMouseListener extends MouseInputAdapter { currentXCreator.stopEditing(); currentXCreator = null; currentEditor = null; + refreshTopXCreator(); return true; } return true; @@ -735,4 +725,19 @@ public class EditingMouseListener extends MouseInputAdapter { } currentEditor.getEditorTarget().setBounds(bounds); } + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(boolean isEditing){ + designer.refreshTopXCreator(isEditing); + } + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(){ + refreshTopXCreator(false); + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java index e5ce0f726f..62c89b9cae 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesigner.java @@ -36,6 +36,8 @@ import com.fr.design.designer.creator.XWAbsoluteBodyLayout; import com.fr.design.designer.creator.XWAbsoluteLayout; import com.fr.design.designer.creator.XWBorderLayout; import com.fr.design.designer.creator.XWParameterLayout; +import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; +import com.fr.design.designer.creator.cardlayout.XWTabFitLayout; import com.fr.design.designer.properties.FormWidgetAuthorityEditPane; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.event.DesignerOpenedListener; @@ -121,6 +123,7 @@ public class FormDesigner extends TargetComponent
implements TreeSelection private FormArea formArea; private ConnectorHelper connectorHelper; private boolean isReportBlockEditing = false; + private TopXCreators topXCreators; //组件重叠 private boolean isWidgetsIntersect = false; @@ -184,6 +187,8 @@ public class FormDesigner extends TargetComponent implements TreeSelection new FormDesignerDropTarget(this);// 添加Drag and Drop. this.switchAction = switchAction; + topXCreators=new TopXCreators(this); + topXCreators.setVisible(true); // 必须刷新"参数/控件树"面板,否则,若最近一次打开模版为 cpt,重启设计器,打开 frm,控件树消失 populateParameterPropertyPane(); @@ -614,8 +619,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection if (paraComponent != null && paraComponent.acceptType(XWParameterLayout.class)) { return true; } else { - if (this.getSelectionModel().getSelection().getSelectedCreator().getParent() != null - && ((XLayoutContainer) this.getSelectionModel().getSelection().getSelectedCreator().getParent()).acceptType(XWAbsoluteLayout.class)) { + XCreator creator = this.getSelectionModel().getSelection().getSelectedCreator(); + if (creator != null && creator.getParent() != null + && ((XLayoutContainer) creator.getParent()).acceptType(XWAbsoluteLayout.class)) { return true; } } @@ -825,6 +831,81 @@ public class FormDesigner extends TargetComponent implements TreeSelection return null; } + /** + * 从已选择的组件中找x,y所在的组件 + */ + private XCreator xCreatorAt(int x, int y, XCreator root) { + XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators(); + for (XCreator creator : xCreators) { + boolean shouldContinue = creator == null + || !creator.isVisible() + || !XCreatorUtils.containComponent(root, creator); + if (shouldContinue) { + continue; + } + //获取当前组件父组件相对于rootComponent或者paraComponent的距离 + int relativeParentX = getRelativeParentX(creator.getParent()); + int relativeParentY = getRelativeParentY(creator.getParent()); + + //如果不是布局容器,直接进行对比 + if (!(creator instanceof XLayoutContainer)) { + int newX = x - relativeParentX - creator.getX(); + int newY = y - relativeParentY - creator.getY(); + Rectangle rect = ComponentUtils.computeVisibleRect(creator); + // 判断是否处于交叉区域 + if (isIntersectArea(newX, newY, rect)) { + return creator; + } + } + + //如果是布局容器,从布局容器向下找 + if (creator instanceof XLayoutContainer) { + XCreator result = xCreatorAt(x - relativeParentX, y - relativeParentY, creator, null); + if (result != null) { + return result; + } + } + + //最后,如果组件为Tab容器中的子组件,再从Tab容器中去找 + XWCardMainBorderLayout borderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); + if (borderLayout != null) { + relativeParentX = getRelativeParentX(borderLayout.getParent()); + relativeParentY = getRelativeParentY(borderLayout.getParent()); + return xCreatorAt(x - relativeParentX, y - relativeParentY, borderLayout, null); + } + } + return null; + } + + /** + * 获取当前组件相对于rootComponent或者paraComponent的横向距离 + */ + private int getRelativeParentX(Container container) { + return returnZero(container) ? 0 : container.getX() + getRelativeParentX(container.getParent()); + } + + /** + * 获取当前组件相对于rootComponent或者paraComponent的纵向距离 + */ + private int getRelativeParentY(Container container) { + return returnZero(container) ? 0 : container.getY() + getRelativeParentY(container.getParent()); + } + + private boolean returnZero(Container container) { + return !(container instanceof XLayoutContainer) + || container == rootComponent + || (paraComponent != null && container == paraComponent); + } + + + /** + * 刷新顶层组件 + * */ + public void refreshTopXCreator(boolean isEditing){ + topXCreators.refresh(); + topXCreators.setVisible(!isEditing); + } + private boolean isIntersectArea(int x, int y, Rectangle rect) { return x >= rect.getX() && (x <= (rect.getX() + rect.getWidth())) && (y >= rect.getY()) && (y <= (rect.getY() + rect.getHeight())); @@ -984,6 +1065,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection invalidateLayout(); } + public TopXCreators getTopXCreators() { + return topXCreators; + } + public StateModel getStateModel() { return stateModel; } @@ -1001,9 +1086,19 @@ public class FormDesigner extends TargetComponent implements TreeSelection return getComponentAt(p.x, p.y); } + /** + * 先从已选择则的组件中去找,再遍历root去找 + * */ @Override public XCreator getComponentAt(int x, int y) { - return getComponentAt(x, y, null); + XLayoutContainer container = y < paraHeight - formArea.getVerticalValue() ? paraComponent : rootComponent; + if (container == null) { + container = rootComponent; + } + int relativeX = x + (int) (formArea.getHorizontalValue() / scale) - container.getX(); + int relativeY = y + (int) (formArea.getVerticalValue() / scale) - container.getY(); + XCreator result = xCreatorAt(relativeX, relativeY, container); + return result == null ? getComponentAt(x, y, null) : result; } @Nullable @@ -1243,6 +1338,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection // 当前选中控件可以上移一层吗? public boolean isCurrentComponentMovableUp() { XCreator creator = getSelectionModel().getSelection().getSelectedCreator(); + if (null == creator) { + return false; + } XLayoutContainer container = (XLayoutContainer) creator.getParent(); if (container == null || !container.supportInnerOrderChangeActions()) { return false; @@ -1253,6 +1351,9 @@ public class FormDesigner extends TargetComponent implements TreeSelection // 当前选中控件可以下移一层吗? public boolean isCurrentComponentMovableDown() { XCreator creator = getSelectionModel().getSelection().getSelectedCreator(); + if (null == creator) { + return false; + } XLayoutContainer container = (XLayoutContainer) creator.getParent(); if (container == null || !container.supportInnerOrderChangeActions()) { return false; @@ -1311,6 +1412,10 @@ public class FormDesigner extends TargetComponent implements TreeSelection } } + public void paintTopCreators(Graphics clipg){ + topXCreators.paint(clipg); + } + /** * 重置组件边界 */ @@ -1628,4 +1733,13 @@ public class FormDesigner extends TargetComponent implements TreeSelection return (int) (this.getArea().getVerticalValue() / this.scale); } + public boolean checkIfBeyondValidArea(MouseEvent e){ + if (e.getX() < 0 || e.getY() < 0 || + e.getX() > this.getRootComponent().getWidth() || + e.getY() > (this.getRootComponent().getHeight() + this.getParaHeight())) { + return true; + } + return false; + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java index 26547229bb..a21a2efad5 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormDesignerUI.java @@ -22,10 +22,12 @@ import com.fr.form.main.parameter.FormParameterUI; import com.fr.page.WatermarkPainter; import com.fr.report.core.ReportUtils; import com.fr.stable.ArrayUtils; +import com.fr.stable.Constants; import javax.swing.*; import javax.swing.plaf.ComponentUI; import java.awt.AlphaComposite; +import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; @@ -41,6 +43,8 @@ import java.util.ArrayList; */ public class FormDesignerUI extends ComponentUI { + private static final Color DESIGNER_BORDER_COLOR = new Color(198, 198, 198); + // 当前的设计器 private FormDesigner designer; private SelectionModel selectionModel; @@ -84,12 +88,13 @@ public class FormDesignerUI extends ComponentUI { // 设计参数面板 repaintPara(g, paraComponent, c); } + paintTopXCreators(g); if (designer.isDrawLineMode() && designer.getDrawLineHelper().drawLining()) { designer.getDrawLineHelper().drawAuxiliaryLine(g); return; } - + paintBorder(g); paintSelection(g); if (DesignerMode.isAuthorityEditing()) { @@ -274,6 +279,19 @@ public class FormDesignerUI extends ComponentUI { clipg.dispose(); } + public void paintBorder(Graphics g) { + Rectangle bounds = designer.getTopContainer().getBounds(); + bounds.x = -designer.getHorizontalScaleValue(); + bounds.y = -designer.getVerticalScaleValue(); + Graphics clipg = g.create(); + clipg.clipRect(bounds.x, bounds.y, bounds.width, bounds.height); + Color oldColor = g.getColor(); + g.setColor(DESIGNER_BORDER_COLOR); + GraphHelper.draw(g, bounds, Constants.LINE_THIN); + clipg.dispose(); + g.setColor(oldColor); + } + /** * 画出当前选择、拖拽状态框 * @@ -406,12 +424,8 @@ public class FormDesignerUI extends ComponentUI { // 禁止双缓冲 ComponentUtils.disableBuffer(component, dbcomponents); Graphics clipg; - clipg = g.create( - -designer.getHorizontalScaleValue(), - -designer.getVerticalScaleValue() + designer.getParaHeight(), - parent.getSize().width + designer.getHorizontalScaleValue(), - parent.getSize().height + designer.getVerticalScaleValue()); - + Rectangle clipgBounds = getFitPaintBounds(component, parent); + clipg = g.create(clipgBounds.x, clipgBounds.y, clipgBounds.width, clipgBounds.height); designer.paintContent(clipg); paintWatermark((Graphics2D) clipg); clipg.dispose(); @@ -421,6 +435,13 @@ public class FormDesignerUI extends ComponentUI { designer.resetEditorComponentBounds(); } + protected Rectangle getFitPaintBounds(Component component, Component parent) { + return new Rectangle(-designer.getHorizontalScaleValue(), + -designer.getVerticalScaleValue() + designer.getParaHeight(), + component.getSize().width + designer.getHorizontalScaleValue(), + component.getSize().height + designer.getVerticalScaleValue()); + } + /** * 画参数面板 */ @@ -435,7 +456,7 @@ public class FormDesignerUI extends ComponentUI { Graphics clipg1; clipg1 = g.create(-designer.getHorizontalScaleValue(), -designer.getVerticalScaleValue(), - parent.getSize().width + designer.getHorizontalScaleValue(), + component.getSize().width + designer.getHorizontalScaleValue(), designer.getParaHeight() + designer.getVerticalScaleValue()); designer.paintPara(clipg1); @@ -445,4 +466,8 @@ public class FormDesignerUI extends ComponentUI { ComponentUtils.resetBuffer(dbcomponents); } + private void paintTopXCreators(Graphics g){ + designer.paintTopCreators(g); + } + } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java index 6822422b29..f94475a768 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/FormHierarchyTreePane.java @@ -24,12 +24,14 @@ import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.SwingUtilities; +import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.ArrayList; +import java.util.List; /** @@ -89,10 +91,13 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree /** * 刷新 */ + //TODO 太乱了,需要重写,监听器里加了监听器是什么意思,每次调用该方法都会添加一个新的监听器 public void refreshDockingView() { FormDesigner formDesigner = this.getEditingFormDesigner(); + List list = new ArrayList<>(); removeAll(); if (this.componentTree != null) { + componentTree.getExpandNodes(list); this.componentTree.removeAll(); } if (formDesigner == null) { @@ -100,6 +105,8 @@ public class FormHierarchyTreePane extends FormDockView implements HierarchyTree return; } componentTree = new ComponentTree(formDesigner); + //保证删除组件后组件树不收起 + componentTree.expandNodes(list); formDesigner.addDesignerEditListener(new DesignerEditListener() { @Override public void fireCreatorModified(DesignerEvent evt) { diff --git a/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java new file mode 100644 index 0000000000..72541a1fe6 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreator.java @@ -0,0 +1,68 @@ +package com.fr.design.mainframe; + +import com.fr.design.designer.creator.XCreator; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.mainframe.FormDesigner; +import com.fr.design.mainframe.WidgetPropertyPane; +import com.fr.design.utils.ComponentUtils; +import com.fr.stable.CoreGraphHelper; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.util.ArrayList; + +/** + * @Author: Yuan.Wang + * @Date: 2020/8/31 + */ +public class TopXCreator extends JComponent { + private final FormDesigner designer; + private final XCreator creator; + + public TopXCreator(FormDesigner designer, XCreator creator) { + this.designer = designer; + this.creator = creator; + init(); + } + + private void init() { + setOpaque(false); + setBackground(null); + setLayout(null); + setBounds(calculateBounds()); + } + + + /** + * 重新设置组件大小 + * */ + public void resizeTopXCreator() { + setBounds(calculateBounds()); + } + + /** + * 计算显示大小 + * */ + private Rectangle calculateBounds() { + Rectangle rect = ComponentUtils.getRelativeBounds(creator); + Rectangle bounds = new Rectangle(0, 0, creator.getWidth(), creator.getHeight()); + bounds.x += (rect.x - designer.getHorizontalScaleValue()); + bounds.y += (rect.y - designer.getVerticalScaleValue()); + return bounds; + } + + + @Override + public void paint(Graphics g) { + super.paint(g); + ArrayList dbcomponents = new ArrayList(); + // 禁止双缓冲 + ComponentUtils.disableBuffer(creator, dbcomponents); + creator.paint(g); + // 恢复双缓冲 + ComponentUtils.resetBuffer(dbcomponents); + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java new file mode 100644 index 0000000000..2bc126f5b9 --- /dev/null +++ b/designer-form/src/main/java/com/fr/design/mainframe/TopXCreators.java @@ -0,0 +1,82 @@ +package com.fr.design.mainframe; + +import com.fr.design.designer.beans.events.DesignerEvent; +import com.fr.design.designer.beans.models.SelectionModel; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.designer.creator.cardlayout.XWCardMainBorderLayout; + +import javax.swing.*; +import java.awt.*; + + +/** + * 需要显示顶层的组件层 + * + * @Author: Yuan.Wang + * @Date: 2020/8/25 + */ +public class TopXCreators extends JComponent { + final private FormDesigner designer; + + public TopXCreators(FormDesigner designer) { + this.designer = designer; + init(); + } + + private void init() { + setLayout(null); + setVisible(false); + setBackground(null); + setOpaque(false); + designer.addDesignerEditListener(e -> { + if (e.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED || e.getCreatorEventID() == DesignerEvent.CREATOR_CUTED) { + refresh(); + } + }); + } + + /** + * 选中的组件有变化时刷新 + */ + public void refresh() { + removeAll(); + addXCreators(); + } + + @Override + public void paint(Graphics g) { + setSize(designer.getSize()); + resizeTopXCreators(); + super.paint(g); + } + + /** + * 加入被选择的组件 + */ + private void addXCreators() { + SelectionModel selectionModel = designer.getSelectionModel(); + XCreator[] xCreators = selectionModel.getSelection().getSelectedCreators(); + for (XCreator creator : xCreators) { + if (!creator.isTopable()) { + continue; + } + XWCardMainBorderLayout topXMainBorderLayout = XCreatorUtils.getTopXMainBorderLayout(creator); + add(new TopXCreator(designer, creator)); + if (topXMainBorderLayout != null) { + add(new TopXCreator(designer, topXMainBorderLayout)); + } + + } + } + + /** + * 更新顶层组件的位置和大小 + */ + private void resizeTopXCreators() { + for (int i = 0, count = getComponentCount(); i < count; i++) { + TopXCreator topXCreator = (TopXCreator) getComponent(i); + topXCreator.resizeTopXCreator(); + } + } +} diff --git a/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java b/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java index 4a59484e1d..aab50fbcc3 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/widget/UITreeComboBox.java @@ -3,16 +3,8 @@ package com.fr.design.mainframe.widget; /** * Created by xiaxiang on 2016/9/30. */ -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.*; -import javax.swing.plaf.metal.*; -import javax.swing.tree.*; - import com.fr.design.constants.UIConstants; -import com.fr.design.designer.beans.*; +import com.fr.design.designer.beans.AdapterBus; import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.creator.XCreator; @@ -20,8 +12,36 @@ import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.gui.icombobox.UIComboBoxUI; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.mainframe.ComponentTree; -import com.sun.java.swing.plaf.motif.*; -import com.sun.java.swing.plaf.windows.*; +import com.sun.java.swing.plaf.motif.MotifComboBoxUI; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTree; +import javax.swing.ListCellRenderer; +import javax.swing.MenuSelectionManager; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.plaf.ComboBoxUI; +import javax.swing.plaf.basic.ComboPopup; +import javax.swing.plaf.metal.MetalComboBoxUI; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreePath; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionAdapter; +import java.awt.event.MouseMotionListener; /** * 控件树下拉列表框 @@ -111,12 +131,6 @@ public class UITreeComboBox extends UIComboBox { } } - class WindowsJTreeComboBoxUI extends WindowsComboBoxUI{ - protected ComboPopup createPopup() { - return new TreePopup(comboBox); - } - } - class UIJTreeComboBoxUI extends UIComboBoxUI { protected ComboPopup createPopup() { return new TreePopup(comboBox); diff --git a/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java b/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java index d4ebf74ee7..1c30b1a557 100644 --- a/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java +++ b/designer-form/src/main/java/com/fr/design/widget/ui/designer/LabelDefinePane.java @@ -1,6 +1,7 @@ package com.fr.design.widget.ui.designer; import com.fr.base.BaseUtils; +import com.fr.design.constants.LayoutConstants; import com.fr.design.designer.IntervalConstants; import com.fr.design.designer.creator.XCreator; import com.fr.design.foldablepane.UIExpandablePane; @@ -58,7 +59,8 @@ public class LabelDefinePane extends AbstractDataModify