From 46f00406e9a866479003af3de985249164b9a4e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E7=A3=8A?= <294531121@qq.com> Date: Tue, 18 Jan 2022 16:33:55 +0800 Subject: [PATCH] =?UTF-8?q?CHART-22531=20=E5=A4=9A=E5=88=86=E7=B1=BB?= =?UTF-8?q?=E8=BD=B4=E5=88=86=E5=B1=82=E8=AE=BE=E7=BD=AE=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E2=80=94=E8=AE=BE=E8=AE=A1=E5=99=A8=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...goryPlotMoreCateReportDataContentPane.java | 35 ++- ...egoryPlotMoreCateTableDataContentPane.java | 44 ++-- ...VanChartMoreCateReportDataContentPane.java | 7 +- .../VanChartMoreCateTableDataContentPane.java | 7 +- .../designer/style/axis/VanChartAxisPane.java | 6 + .../axis/VanChartAxisStyleSettingPane.java | 158 ++++++++++++ .../style/axis/VanChartBaseAxisPane.java | 242 +++++++++++++++++- ...VanChartCategoryStylePaneWithCheckBox.java | 102 ++++++++ 8 files changed, 563 insertions(+), 38 deletions(-) create mode 100644 designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java create mode 100644 designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartCategoryStylePaneWithCheckBox.java diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java index d4e1f64e7..cbaf8b0c1 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/report/CategoryPlotMoreCateReportDataContentPane.java @@ -7,6 +7,7 @@ import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.NormalReportDataDefinition; +import com.fr.decision.base.util.UUIDUtil; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.formula.TinyFormulaPane; @@ -19,14 +20,14 @@ import com.fr.van.chart.designer.TableLayout4VanChartHelper; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JPanel; -import java.util.ArrayList; -import java.util.List; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.LinkedHashMap; +import java.util.Map; /** @@ -40,10 +41,10 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor private JPanel boxPane; private UIButton addButton; - private ArrayList formualList = new ArrayList(); + private Map formualList = new LinkedHashMap<>(); private UIObserverListener uiobListener = null; - public List getFormualList() { + public Map getFormualList() { return formualList; } @@ -99,12 +100,17 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor } private TinyFormulaPane addNewCatePane() { + String uuid = UUIDUtil.generate(); + return addNewCatePane(uuid); + } + + private TinyFormulaPane addNewCatePane(String uuid) { final TinyFormulaPane pane = initCategoryBox(StringUtils.EMPTY); pane.setPreferredSize(new Dimension(100, 16)); pane.registerChangeListener(uiobListener); - formualList.add(pane); + formualList.put(uuid, pane); final JPanel newButtonPane = new JPanel(); newButtonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 0)); @@ -119,7 +125,7 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor @Override public void actionPerformed(ActionEvent e) { boxPane.remove(newButtonPane); - formualList.remove(pane); + formualList.remove(uuid); checkComponent(); relayoutPane(); } @@ -171,11 +177,11 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor TopDefinitionProvider definition = collection.getSelectedChart().getFilterDefinition(); if (definition instanceof NormalReportDataDefinition) { NormalReportDataDefinition reportDefinition = (NormalReportDataDefinition) definition; - int size = reportDefinition.getMoreCateSize(); - if (reportDefinition.getCategoryName() != null && size > 0) { - for(int i = 0; i < size; i++) { - TinyFormulaPane pane = addNewCatePane(); - pane.populateBean(Utils.objectToString(reportDefinition.getMoreCateWithIndex(i))); + Map moreCateLabels = reportDefinition.getMoreCateLabels(); + if (reportDefinition.getCategoryName() != null && !moreCateLabels.isEmpty()) { + for (Map.Entry entry : moreCateLabels.entrySet()) { + TinyFormulaPane pane = addNewCatePane(entry.getKey()); + pane.populateBean(Utils.objectToString(entry.getValue())); } } } @@ -198,9 +204,10 @@ public class CategoryPlotMoreCateReportDataContentPane extends CategoryPlotRepor } protected void updateMoreCate(NormalReportDataDefinition reportDefinition, Plot plot) { - for (int i = 0, size = formualList.size(); i < size; i++) { - TinyFormulaPane pane = formualList.get(i); - reportDefinition.addMoreCate(canBeFormula(pane.updateBean())); + for (Map.Entry entry : formualList.entrySet()) { + String uuid = entry.getKey(); + TinyFormulaPane pane = entry.getValue(); + reportDefinition.addMoreCate(uuid, canBeFormula(pane.updateBean())); } } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java index 3bf0225ef..29f18002c 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/data/table/CategoryPlotMoreCateTableDataContentPane.java @@ -6,6 +6,7 @@ import com.fr.chart.chartattr.Bar2DPlot; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.NormalTableDataDefinition; +import com.fr.decision.base.util.UUIDUtil; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; import com.fr.design.gui.ibutton.UIButton; @@ -15,15 +16,20 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.utils.gui.GUICoreUtils; - -import javax.swing.*; -import java.awt.*; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; -import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * 多分类轴 的数据集定义界面. @@ -39,12 +45,12 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD private JPanel boxPane; - private ArrayList boxList = new ArrayList(); + private Map boxList = new LinkedHashMap<>(); private UIButton addButton; private UIObserverListener uiobListener = null; - public List getBoxList() { + public Map getBoxList() { return boxList; } @@ -108,6 +114,11 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD } private UIComboBox addNewCombox() { + String uuid = UUIDUtil.generate(); + return addNewCombox(uuid); + } + + private UIComboBox addNewCombox(String uuid) { final JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); @@ -134,7 +145,7 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD UIButton delButton = new UIButton(BaseUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); buttonPane.add(delButton); boxPane.add(buttonPane); - boxList.add(combox); + boxList.put(uuid, combox); checkComponent(); @@ -142,7 +153,7 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD @Override public void actionPerformed(ActionEvent e) { boxPane.remove(buttonPane); - boxList.remove(combox); + boxList.remove(uuid); checkComponent(); relayoutPane(); } @@ -216,10 +227,10 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD TopDefinitionProvider top = collection.getSelectedChart().getFilterDefinition(); if (top instanceof NormalTableDataDefinition) { NormalTableDataDefinition normal = (NormalTableDataDefinition) top; - int size = normal.getMoreCateSize(); - for (int i = 0; i < size; i++) { - UIComboBox box = addNewCombox(); - box.setSelectedItem(normal.getMoreCateWithIndex(i)); + Map moreCateLabels = normal.getMoreCateLabels(); + for(Map.Entry entry : moreCateLabels.entrySet()) { + UIComboBox box = addNewCombox(entry.getKey()); + box.setSelectedItem(entry.getValue()); } } @@ -245,10 +256,11 @@ public class CategoryPlotMoreCateTableDataContentPane extends CategoryPlotTableD } protected void updateMoreCate(NormalTableDataDefinition normal, Plot plot) { - for (int i = 0, size = boxList.size(); i < size; i++) { - UIComboBox box = boxList.get(i); - if (box.getSelectedItem() != null) { - normal.addMoreCate(box.getSelectedItem().toString()); + for (Map.Entry entry : boxList.entrySet()) { + String uuid = entry.getKey(); + UIComboBox comboBox = entry.getValue(); + if (comboBox != null && comboBox.getSelectedItem() != null) { + normal.addMoreCate(uuid, comboBox.getSelectedItem().toString()); } } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateReportDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateReportDataContentPane.java index 2ffb094e0..08419faed 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateReportDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateReportDataContentPane.java @@ -3,11 +3,14 @@ package com.fr.van.chart.designer.data; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.NormalReportDataDefinition; +import com.fr.design.formula.TinyFormulaPane; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.report.CategoryPlotMoreCateReportDataContentPane; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot; +import java.util.Map; + /** * Created by mengao on 2017/7/3. */ @@ -41,8 +44,8 @@ public class VanChartMoreCateReportDataContentPane extends CategoryPlotMoreCateR private void checkBoxList(boolean isSupportMulticategory) { if (getFormualList().size() != 0) { - for (int i = 0; i < getFormualList().size(); i++) { - getFormualList().get(i).setEnabled(isSupportMulticategory); + for (Map.Entry entry : getFormualList().entrySet()) { + entry.getValue().setEnabled(isSupportMulticategory); } } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateTableDataContentPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateTableDataContentPane.java index dcf160aec..ce6e7a16c 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateTableDataContentPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/data/VanChartMoreCateTableDataContentPane.java @@ -3,11 +3,14 @@ package com.fr.van.chart.designer.data; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartdata.NormalTableDataDefinition; +import com.fr.design.gui.icombobox.UIComboBox; import com.fr.design.mainframe.chart.gui.ChartDataPane; import com.fr.design.mainframe.chart.gui.data.table.CategoryPlotMoreCateTableDataContentPane; import com.fr.plugin.chart.attr.plot.VanChartPlot; import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot; +import java.util.Map; + /** * Created by mengao on 2017/7/3. */ @@ -43,8 +46,8 @@ public class VanChartMoreCateTableDataContentPane extends CategoryPlotMoreCateTa private void checkBoxList(boolean isSupportMulticategory) { if (getBoxList().size() != 0) { - for (int i = 0; i < getBoxList().size(); i++) { - getBoxList().get(i).setEnabled(isSupportMulticategory); + for (Map.Entry entry : getBoxList().entrySet()) { + entry.getValue().setEnabled(isSupportMulticategory); } } } diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisPane.java index e8379e78b..11841813d 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisPane.java @@ -1,5 +1,6 @@ package com.fr.van.chart.designer.style.axis; +import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; @@ -41,6 +42,7 @@ public class VanChartAxisPane extends BasicBeanPane { protected VanChartAxisPlot editingPlot; protected VanChartStylePane parent; + private Chart chart; public VanChartAxisPane(VanChartAxisPlot plot, VanChartStylePane parent){ this.editingPlot = plot; @@ -188,6 +190,7 @@ public class VanChartAxisPane extends BasicBeanPane { if(chart == null){ return; } + this.chart = chart; Plot plot = chart.getPlot(); populateBean(plot); @@ -208,10 +211,12 @@ public class VanChartAxisPane extends BasicBeanPane { } for(VanChartAxis axis : editingPlot.getXAxisList()){ + axis.setChart(chart); VanChartXYAxisPaneInterface axisPane = xAxisPaneMap.get(axis.getAxisName()); axisPane.populate(axis); } for(VanChartAxis axis : editingPlot.getYAxisList()){ + axis.setChart(chart); VanChartXYAxisPaneInterface axisPane = yAxisPaneMap.get(axis.getAxisName()); axisPane.populate(axis); } @@ -237,6 +242,7 @@ public class VanChartAxisPane extends BasicBeanPane { if(chart == null){ return; } + this.chart = chart; Plot plot = chart.getPlot(); diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java new file mode 100644 index 000000000..94a9e4a0c --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartAxisStyleSettingPane.java @@ -0,0 +1,158 @@ +package com.fr.van.chart.designer.style.axis; + +import com.fr.base.BaseFormula; +import com.fr.chart.base.TextAttr; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.gui.frpane.UINumberDragPane; +import com.fr.design.gui.ibutton.UIButtonGroup; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; +import com.fr.design.layout.TableLayout; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPane; +import com.fr.design.mainframe.chart.gui.style.ChartTextAttrPaneWithThemeStyle; +import com.fr.design.mainframe.chart.mode.ChartEditContext; +import com.fr.design.utils.gui.UIComponentUtils; +import com.fr.design.widget.FRWidgetFactory; +import com.fr.plugin.chart.VanChartAxisCategoryStyle; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; +import com.fr.van.chart.designer.style.axis.component.AxisLabelDisplayComboBox; + +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class VanChartAxisStyleSettingPane extends BasicBeanPane { + private static final double ROTATION_MAX = 90.0; + + private AxisLabelDisplayComboBox labelDisplayComboBox; + private ChartTextAttrPane labelTextAttrPane; + private UINumberDragPane labelTextRotation; + private UIButtonGroup labelGapStyle; + private UITextField labelGapValue; + private JPanel labelGapPane; + private JPanel labelGapValuePane; + private JPanel contentPane; + + public VanChartAxisStyleSettingPane() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double s = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; + double[] column = {f, s}; + double[] row = {p, p, p}; + + labelDisplayComboBox = new AxisLabelDisplayComboBox(); + JPanel labelDisplayPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Show"), labelDisplayComboBox, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); + labelTextAttrPane = getChartTextAttrPane(); + labelTextRotation = new UINumberDragPane(-ROTATION_MAX, ROTATION_MAX); + labelGapStyle = new UIButtonGroup<>(new String[]{Toolkit.i18nText("Fine-Design_Chart_Automatic"), Toolkit.i18nText("Fine-Design_Chart_Fixed")}); + labelGapValue = new UITextField(); + labelGapPane = createLabelGapPane(row, column); + + this.setLayout(new BorderLayout()); + contentPane = new JPanel(new BorderLayout()); + contentPane.add(labelDisplayPane, BorderLayout.NORTH); + contentPane.add(labelTextAttrPane, BorderLayout.CENTER); + contentPane.add(labelGapPane, BorderLayout.SOUTH); + this.add(contentPane, BorderLayout.NORTH); + initListner(); + } + + @Override + public Dimension getPreferredSize() { + Dimension defaultSize = super.getPreferredSize(); + return new Dimension(defaultSize.width, contentPane.getPreferredSize().height); + } + + private void initListner() { + labelDisplayComboBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + labelGapPane.setVisible(labelDisplayComboBox.getSelectedIndex() == 0); + } + }); + + labelGapStyle.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + labelGapValuePane.setVisible(labelGapStyle.getSelectedIndex() == 1); + } + }); + } + + @Override + public void populateBean(VanChartAxisCategoryStyle style) { + labelDisplayComboBox.populateBean(style.getLabelDisplay()); + labelTextAttrPane.populate(style.getTextAttr()); + labelTextRotation.populateBean((double) style.getTextAttr().getRotation()); + labelGapStyle.setSelectedIndex(style.isAutoLabelGap() ? 0 : 1); + labelGapValue.setText(style.getLabelIntervalNumber().getContent()); + + labelGapPane.setVisible(labelDisplayComboBox.getSelectedIndex() == 0); + labelGapValuePane.setVisible(labelGapStyle.getSelectedIndex() == 1); + } + + @Override + public VanChartAxisCategoryStyle updateBean() { + VanChartAxisCategoryStyle style = new VanChartAxisCategoryStyle(); + style.setLabelDisplay(labelDisplayComboBox.updateBean()); + TextAttr textAttr = style.getTextAttr(); + labelTextAttrPane.update(textAttr); + textAttr.setRotation(labelTextRotation.updateBean().intValue()); + style.setTextAttr(textAttr); + style.setAutoLabelGap(labelGapStyle.getSelectedIndex() == 0); + if (style.isAutoLabelGap()) { + style.setLabelIntervalNumber(BaseFormula.createFormulaBuilder().build("0")); + } else { + style.setLabelIntervalNumber(BaseFormula.createFormulaBuilder().build(labelGapValue.getText())); + } + return style; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + private JPanel createLabelGapPane(double[] row, double[] col) { + Component[][] gapComponents = new Component[][]{ + new Component[]{null, null}, + new Component[]{ + FRWidgetFactory.createLineWrapLabel(Toolkit.i18nText("Fine-Design_Chart_TextRotation")), + UIComponentUtils.wrapWithBorderLayoutPane(labelTextRotation) + }, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Label_Interval")), labelGapStyle} + }; + + JPanel gapDetailPane = TableLayout4VanChartHelper.createGapTableLayoutPane(gapComponents, row, col); + labelGapValuePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText(""), labelGapValue, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); + + JPanel panel = new JPanel(new BorderLayout()); + panel.add(gapDetailPane, BorderLayout.CENTER); + panel.add(labelGapValuePane, BorderLayout.SOUTH); + + return panel; + } + + protected ChartTextAttrPane getChartTextAttrPane() { + return ChartEditContext.supportTheme() ? new ChartTextAttrPaneWithThemeStyle() { + protected double getEdithAreaWidth() { + return TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; + } + } : new ChartTextAttrPane() { + @Override + protected JPanel getContentPane(JPanel buttonPane) { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH; + double[] columnSize = {f, e}; + double[] rowSize = {p, p, p}; + + return TableLayout4VanChartHelper.createGapTableLayoutPane(getComponents(buttonPane), rowSize, columnSize); + } + }; + } +} diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java index aff9d64c3..407adf92b 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/VanChartBaseAxisPane.java @@ -3,8 +3,12 @@ package com.fr.van.chart.designer.style.axis; import com.fr.base.BaseFormula; import com.fr.base.BaseUtils; import com.fr.base.Utils; +import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.base.TextAttr; +import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Title; +import com.fr.chart.chartdata.NormalReportDataDefinition; +import com.fr.chart.chartdata.NormalTableDataDefinition; import com.fr.design.beans.FurtherBasicBeanPane; import com.fr.design.formula.TinyFormulaPane; import com.fr.design.gui.frpane.UINumberDragPane; @@ -25,6 +29,7 @@ import com.fr.design.mainframe.chart.gui.style.ColorSelectBoxWithThemeStyle; import com.fr.design.mainframe.chart.mode.ChartEditContext; import com.fr.design.utils.gui.UIComponentUtils; import com.fr.design.widget.FRWidgetFactory; +import com.fr.plugin.chart.VanChartAxisCategoryStyle; import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.base.OverlapHandleType; import com.fr.plugin.chart.base.VanChartConstants; @@ -37,6 +42,7 @@ import com.fr.van.chart.designer.TableLayout4VanChartHelper; import com.fr.van.chart.designer.component.VanChartHtmlLabelPane; import com.fr.van.chart.designer.style.VanChartStylePane; import com.fr.van.chart.designer.style.axis.component.AxisLabelDisplayComboBox; +import com.fr.van.chart.designer.style.axis.component.VanChartCategoryStylePaneWithCheckBox; import javax.swing.BorderFactory; import javax.swing.Icon; @@ -49,14 +55,20 @@ import java.awt.CardLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; /** * 坐标轴的基础配置项。分类,时间,值等公共的部分。 */ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { - private static final long serialVersionUID = -5717246802333308973L; private static final double ROTATION_MAX = 90.0; + private static final String WHOLE_DISPLAY = "wholeDisplay"; // 整体显示 + private static final String LAYER_DISPLAY = "layerDisplay"; // 分层显示 + protected UIButtonGroup showTitle; protected TinyFormulaPane titleContent; protected UIButtonGroup titleAlignPane; @@ -66,6 +78,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected JPanel titlePane; protected UIButtonGroup showLabel; + protected UIButtonGroup showLogic; protected ChartTextAttrPane labelTextAttrPane; protected UINumberDragPane labelTextRotation; @@ -80,10 +93,14 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { //protected UISpinner labelGapValue; protected JPanel labelPanel; + private JPanel labelStylePane; + private JPanel showLogicPane; private JPanel labelGapPane; private JPanel labelGapStylePane; private JPanel labelGapValuePane; private JPanel labelDisplayPane; + private JPanel categoryStylePane; + private List categoryStyles = new ArrayList<>(); protected LineComboBox axisLineStyle; @@ -107,6 +124,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected JPanel centerPane; private VanChartHtmlLabelPane htmlLabelPane; + private VanChartStylePane parent; + public VanChartBaseAxisPane() { this(true); } @@ -117,6 +136,7 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } public void setParentPane(VanChartStylePane parent) { + this.parent = parent; htmlLabelPane.setParent(parent); } @@ -220,16 +240,19 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { addComponentsListener(); JPanel showLabelPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label"), showLabel); + JPanel showLogicPane = createShowLogicPane(); JPanel labelPane = new JPanel(new BorderLayout()); labelPane.add(showLabelPane, BorderLayout.NORTH); - labelPane.add(labelPanel, BorderLayout.CENTER); + labelPane.add(showLogicPane, BorderLayout.CENTER); return TableLayout4VanChartHelper.createExpandablePaneWithTitle(PaneTitleConstants.CHART_STYLE_LABEL_TITLE, labelPane); } private void initLabelComponents() { showLabel = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Use_Show"), Toolkit.i18nText("Fine-Design_Chart_Hidden")}); + showLogic = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_Axis_Style_Whole_Display"), Toolkit.i18nText("Fine-Design_Chart_Axis_Style_Layer_Display")}); + initButtonGroupListener(); labelDisplayComboBox = new AxisLabelDisplayComboBox(); labelDisplayPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Show"), labelDisplayComboBox, TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH); @@ -241,6 +264,51 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { labelGapValue = new UITextField(); } + private void initButtonGroupListener() { + showLogic.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + showLabelStyleCard(); + } + }); + } + + private void showLabelStyleCard() { + CardLayout layout = (CardLayout) labelStylePane.getLayout(); + if (showLogic.getSelectedIndex() == 0) { + layout.show(labelStylePane, WHOLE_DISPLAY); + } else { + layout.show(labelStylePane, LAYER_DISPLAY); + } + labelStylePane.revalidate(); + } + + /** + * 创建显示逻辑以及其下面面板 + * + * @return + */ + private JPanel createShowLogicPane() { + showLogicPane = new JPanel(new BorderLayout()); + labelStylePane = new JPanel(new CardLayout()); + labelStylePane.add(labelPanel, WHOLE_DISPLAY); + labelStylePane.add(createCategoryStylePane(), LAYER_DISPLAY); + showLogicPane.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Axis_Label_Show_Logic"), showLogic), BorderLayout.NORTH); + showLogicPane.add(labelStylePane, BorderLayout.CENTER); + return showLogicPane; + } + + /** + * 创建多分类轴标签设置面板 + * + * @return + */ + private JPanel createCategoryStylePane() { + categoryStylePane = new JPanel(new BorderLayout()); + categoryStylePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); + return categoryStylePane; + } + private JPanel createLabelGapPane(double[] row, double[] col) { Component[][] gapComponents = new Component[][]{ new Component[]{null, null}, @@ -570,8 +638,8 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { protected void checkLabelPane() { if (showLabel != null) { boolean enabled = showLabel.getSelectedIndex() == 0; - if (labelPanel != null) { - labelPanel.setVisible(enabled); + if (showLogicPane != null) { + showLogicPane.setVisible(enabled); } if (enabled) { //轴标签缩略间隔显示 恢复用注释。下面1行删除。 @@ -698,6 +766,24 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { if (showLabel != null) { showLabel.setSelectedIndex(axis.isShowAxisLabel() ? 0 : 1); } + + populateShowLogicPane(axis); + } + + private void populateShowLogicPane(VanChartAxis axis) { + if (showLogic != null) { + showLogic.setSelectedIndex(axis.getLabelDisplayMode()); + } + populateWholeDisplayPane(axis); + populateLayerDisplayPane(axis); + showLabelStyleCard(); + labelStylePane.revalidate(); + } + + /** + * populate整体显示那个card面板 + */ + private void populateWholeDisplayPane(VanChartAxis axis) { TextAttr labelTextAttr = axis.getTextAttr(); if (labelTextAttrPane != null) { labelTextAttrPane.populate(labelTextAttr); @@ -723,6 +809,124 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } } + /** + * populate分层显示那个card面板 + * + * @param axis + */ + private void populateLayerDisplayPane(VanChartAxis axis) { + Chart chart = axis.getChart(); + if (chart == null) { + return; + } + categoryStylePane.removeAll(); + categoryStyles.clear(); + populateDefaultCateLabelStyle(axis); + populateMoreCateLabelStyle(axis); + + categoryStylePane.revalidate(); + } + + /** + * 默认一定会有一个分类标签,就populate这个 + */ + private void populateDefaultCateLabelStyle(VanChartAxis axis) { + populateCategoryStyles(axis, VanChartAxis.DEFAULT_CATEGORY_UUID, 0); + } + + /** + * populate其余的分类标签 + * + * @param axis + */ + private void populateMoreCateLabelStyle(VanChartAxis axis) { + Chart chart = axis.getChart(); + Map moreCateLabels = new LinkedHashMap<>(); + TopDefinitionProvider definition = chart.getFilterDefinition(); + if (definition == null) { + return; + } + if (definition instanceof NormalTableDataDefinition) { + NormalTableDataDefinition tableDataDefinition = (NormalTableDataDefinition) definition; + moreCateLabels.putAll(tableDataDefinition.getMoreCateLabels()); + } else if (definition instanceof NormalReportDataDefinition) { + NormalReportDataDefinition reportDataDefinition = (NormalReportDataDefinition) definition; + for (Map.Entry entry : reportDataDefinition.getMoreCateLabels().entrySet()) { + String uuid = entry.getKey(); + String cateLabel = Utils.objectToString(entry.getValue()); + moreCateLabels.put(uuid, cateLabel); + } + } + + int i = 1; + List uuids = new ArrayList<>(); + for (Map.Entry entry : moreCateLabels.entrySet()) { + String uuid = entry.getKey(); + uuids.add(uuid); + populateCategoryStyles(axis, uuid, i); + i++; + } + axis.retainUsefulCategoryStyles(uuids); + } + + private void populateCategoryStyles(VanChartAxis axis, String uuid, int index) { + VanChartCategoryStylePaneWithCheckBox pane = new VanChartCategoryStylePaneWithCheckBox(parent, this, Toolkit.i18nText("Fine-Design_Chart_Style_Category") + (index + 1)); + VanChartAxisCategoryStyle style = populateAxisCategoryStyles(axis, uuid, index); + pane.populate(style, uuid); + categoryStyles.add(pane); + categoryStylePane.add(createCateLableStylePanel(), BorderLayout.NORTH); + + } + + private VanChartAxisCategoryStyle populateAxisCategoryStyles(VanChartAxis axis, String uuid, int index) { + VanChartAxisCategoryStyle style; + if (axis.getCategoryStyle(uuid) != null) { + style = axis.getCategoryStyle(uuid); + } else { + style = axis.getCategoryStyleByIndex(index); + if (style == null) { + style = new VanChartAxisCategoryStyle(); + } + axis.addCategoryStyle(uuid, style); + } + return style; + } + + private JPanel createCateLableStylePanel() { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + double[] row = getCateLableStylePaneRow(); + double[] column = {f, p}; + + JPanel content = TableLayoutHelper.createTableLayoutPane(getCateLabelStyleComponents(), row, column); + + Component[][] components = new Component[][]{ + new Component[]{null, null}, + new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Style_Category")), content} + }; + + return TableLayoutHelper.createTableLayoutPane(components, new double[]{p, p}, new double[]{f, e}); + } + + private Component[][] getCateLabelStyleComponents() { + Component[][] components = new Component[categoryStyles.size()][]; + for (int i = 0; i < categoryStyles.size(); i++) { + components[i] = new Component[2]; + components[i][0] = categoryStyles.get(i); + components[i][1] = null; + } + return components; + } + + private double[] getCateLableStylePaneRow() { + double[] row = new double[categoryStyles.size()]; + for (int i = 0; i < categoryStyles.size(); i++) { + row[i] = TableLayout.PREFERRED; + } + return row; + } + //轴线样式 private void populateLineStyle(VanChartAxis axis) { if (axisLineStyle != null) { @@ -837,6 +1041,22 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { if (showLabel != null) { axis.setShowAxisLabel(showLabel.getSelectedIndex() == 0); } + updateShowLogicPane(axis); + } + + private void updateShowLogicPane(VanChartAxis axis) { + if (showLogic != null) { + axis.setLabelDisplayMode(showLogic.getSelectedIndex()); + } + + updateWholeDisplayPane(axis); + updateLayerDisplayPane(axis); + } + + /** + * update整体显示那个card面板 + */ + private void updateWholeDisplayPane(VanChartAxis axis) { TextAttr labelTextAttr = axis.getTextAttr(); if (labelTextAttrPane != null) { labelTextAttrPane.update(labelTextAttr); @@ -866,6 +1086,20 @@ public class VanChartBaseAxisPane extends FurtherBasicBeanPane { } } + /** + * update分层显示那个card面板 + * + * @param axis + */ + private void updateLayerDisplayPane(VanChartAxis axis) { + for (VanChartCategoryStylePaneWithCheckBox categoryStyle : categoryStyles) { + Map styleMap = categoryStyle.update(); + for (Map.Entry entry : styleMap.entrySet()) { + axis.addCategoryStyle(entry.getKey(), entry.getValue()); + } + } + } + //轴线样式 private void updateLineStyle(VanChartAxis axis) { if (axisLineStyle != null) { diff --git a/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartCategoryStylePaneWithCheckBox.java b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartCategoryStylePaneWithCheckBox.java new file mode 100644 index 000000000..71b2b2948 --- /dev/null +++ b/designer-chart/src/main/java/com/fr/van/chart/designer/style/axis/component/VanChartCategoryStylePaneWithCheckBox.java @@ -0,0 +1,102 @@ +package com.fr.van.chart.designer.style.axis.component; + +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.i18n.Toolkit; +import com.fr.plugin.chart.VanChartAxisCategoryStyle; +import com.fr.stable.Constants; +import com.fr.van.chart.designer.style.axis.VanChartAxisStyleSettingPane; + +import javax.swing.BorderFactory; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.LinkedHashMap; +import java.util.Map; + +public class VanChartCategoryStylePaneWithCheckBox extends JPanel { + private UICheckBox checkBox; // 复选框 + private UIButton settingButton; // 设置按钮 + private VanChartAxisStyleSettingPane settingPane; // 设置弹窗面板 + + private JPanel showOnPane; + private AbstractAttrNoScrollPane parent; + + private String axisId; + private VanChartAxisCategoryStyle axis; + + public VanChartCategoryStylePaneWithCheckBox(AbstractAttrNoScrollPane parent, JPanel showOnPane, String checkBoxName) { + this.parent = parent; + this.showOnPane = showOnPane; + + this.setLayout(new BorderLayout()); + checkBox = new UICheckBox(checkBoxName); + checkBox.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + checkBox.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + /* 为什么需要这句话呢?因为这个checkBox是动态加上去的,没有走最上层父组件ChartStylePane的initAllListener方法, + * 所以不会触发update监听,下面的bubble弹窗则是不属于ChartStylePane的单独悬浮组件,也只能这样触发update监听 + */ + if(parent != null){ + parent.attributeChanged(); + } + } + }); + settingButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_Axis_Style_Setting")); + + this.add(checkBox, BorderLayout.CENTER); + this.add(settingButton, BorderLayout.EAST); + + initListener(); + } + + private void initListener() { + if(settingButton != null) { + settingButton.addMouseListener(new MouseAdapter() { + @Override + public void mouseReleased(MouseEvent e) { + if (settingPane == null) { + settingPane = new VanChartAxisStyleSettingPane(); + } + + Point comPoint = settingButton.getLocationOnScreen(); + Point arrowPoint = new Point(comPoint.x +settingButton.getWidth() - 25, comPoint.y + settingButton.getHeight()); + Dimension size = settingPane.getPreferredSize(); + UIBubbleFloatPane pane = new UIBubbleFloatPane(Constants.LEFT, arrowPoint, settingPane, size.width, 216) { + + @Override + public void updateContentPane() { + axis = settingPane.updateBean(); + if(parent != null){//条件属性没有parent + parent.attributeChanged(); + } + } + }; + pane.show(showOnPane, axis); + super.mouseReleased(e); + } + }); + } + } + + public void populate(VanChartAxisCategoryStyle style, String uuid) { + this.axis = style; + this.axisId = uuid; + checkBox.setSelected(axis.isAvailable()); + } + + public Map update() { + axis.setAvailable(checkBox.isSelected()); + Map map = new LinkedHashMap<>(); + map.put(axisId, axis); + return map; + } +}