package com.fr.van.chart.designer.style.label; import com.fr.chart.chartattr.Plot; import com.fr.chartx.TwoTuple; import com.fr.design.beans.BasicBeanPane; 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.general.ComparatorUtils; import com.fr.plugin.chart.attr.plot.VanChartLabelPositionPlot; import com.fr.plugin.chart.base.AttrLabelDetail; 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.BorderFactory; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Component; /** * Created by Mitisky on 15/12/7. */ public class VanChartPlotLabelDetailPane extends BasicPane { private static final long serialVersionUID = -22438250307946275L; public static final int HORIZONTAL_INDEX = 0; private BasicBeanPane dataLabelContentPane; private UIButtonGroup position; private UIButtonGroup autoAdjust; private UIButtonGroup orientation; private UIToggleButton tractionLine; private ColorSelectBox backgroundColor; private VanChartBorderWithShapePane borderPane; private VanChartBackgroundWithOutImagePane backgroundPane; private JPanel tractionLinePane; private JPanel positionPane; private Integer[] oldPositionValues; private JPanel borderPaneWithTitle; private JPanel backgroundPaneWithTitle; private VanChartStylePane parent; private Plot plot; private boolean inCondition; public VanChartPlotLabelDetailPane(Plot plot, VanChartStylePane parent, boolean inCondition) { this.inCondition = inCondition; this.parent = parent; this.plot = plot; initLabelDetailPane(plot); } public boolean isInCondition() { return inCondition; } public BasicBeanPane getDataLabelContentPane() { return dataLabelContentPane; } public void setDataLabelContentPane(BasicBeanPane dataLabelContentPane) { this.dataLabelContentPane = dataLabelContentPane; } public VanChartStylePane getParentPane() { return parent; } public void setPosition(UIButtonGroup position) { this.position = position; } public void setBorderPane(VanChartBorderWithShapePane borderPane) { this.borderPane = borderPane; } public void setBackgroundPane(VanChartBackgroundWithOutImagePane backgroundPane) { this.backgroundPane = backgroundPane; } protected void initLabelDetailPane(Plot plot) { this.setLayout(new BorderLayout()); initToolTipContentPane(plot); JPanel contentPane = createLabelPane(plot); this.add(contentPane, BorderLayout.CENTER); } public Plot getPlot() { return plot; } public UIButtonGroup getOrientation() { return orientation; } //默认从factory中取 protected void initToolTipContentPane(Plot plot) { dataLabelContentPane = PlotFactory.createPlotLabelContentPane(plot, parent, VanChartPlotLabelDetailPane.this, inCondition); } private JPanel createLabelPane(Plot plot) { double p = TableLayout.PREFERRED; double f = TableLayout.FILL; double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; double[] columnSize = {f, e}; double[] rowSize = getLabelPaneRowSize(plot, p); Component[][] components = getLabelPaneComponents(plot, p, columnSize); return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); } 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[]{createBorderAndBackgroundPane(), null}, }; } return new Component[][]{ new Component[]{dataLabelContentPane, null}, new Component[]{createLabelPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position"), plot), null} }; } return new Component[][]{ new Component[]{dataLabelContentPane, null} }; } protected JPanel createBorderAndBackgroundPane() { JPanel jPanel = new JPanel(); jPanel.setLayout(new BorderLayout(0, 5)); jPanel.add(createLabelBorderPane(), BorderLayout.NORTH); jPanel.add(createLabelBackgroundPane(), BorderLayout.CENTER); return jPanel; } protected JPanel createLabelBorderPane() { borderPane = new VanChartBorderWithShapePane(); borderPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Border"), borderPane); return borderPaneWithTitle; } protected 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[]{getTransparentLabel(), transparent}, }; } }; backgroundPaneWithTitle = TableLayout4VanChartHelper.createExpandablePaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundPane); return backgroundPaneWithTitle; } protected double[] getLabelStyleRowSize(double p) { return new double[]{p, p, p}; } protected double[] getLabelPaneRowSize(Plot plot, double p) { return hasLabelPosition(plot) ? new double[]{p, p, p, p, p} : new double[]{p, p, p}; } protected boolean hasLabelPosition(Plot plot) { 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); } protected TwoTuple getPositionNamesAndValues() { if (plot instanceof VanChartLabelPositionPlot) { String[] names = ((VanChartLabelPositionPlot) plot).getLabelLocationNameArray(); Integer[] values = ((VanChartLabelPositionPlot) plot).getLabelLocationValueArray(); if (names == null || names.length == 0) { return null; } if (values == null || values.length == 0) { return null; } return new TwoTuple<>(names, values); } return null; } protected JPanel createLabelPositionPane(String title, Plot plot) { if (getPositionNamesAndValues() == null) { return new JPanel(); } autoAdjust = new UIButtonGroup(new String[]{Toolkit.i18nText("Fine-Design_Chart_On"), Toolkit.i18nText("Fine-Design_Chart_Off")}, new Boolean[]{true, false}); JPanel panel = new JPanel(new BorderLayout()); positionPane = new JPanel(); checkPositionPane(title); 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")); tractionLinePane = TableLayout4VanChartHelper.createGapTableLayoutPane("", tractionLine); tractionLinePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0)); panel.add(tractionLinePane, BorderLayout.SOUTH); initPositionListener(); } else if (PlotFactory.plotAutoAdjustLabelPosition(plot)) { panel.add(TableLayout4VanChartHelper.createGapTableLayoutPane(Toolkit.i18nText("Fine-Design_Chart_Auto_Adjust"), autoAdjust), BorderLayout.SOUTH); } 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) { if (positionPane == null) { return; } TwoTuple result = getPositionNamesAndValues(); if (result == null) { return; } Integer[] values = result.getSecond(); if (ComparatorUtils.equals(values, oldPositionValues)) { return; } oldPositionValues = values; position = new UIButtonGroup(result.getFirst(), values); Component[][] comps = new Component[2][2]; comps[0] = new Component[]{null, null}; comps[1] = new Component[]{new UILabel(title, SwingConstants.LEFT), position}; double[] row = new double[]{TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED}; double[] col = new double[]{TableLayout.FILL, TableLayout4VanChartHelper.EDIT_AREA_WIDTH}; positionPane.removeAll(); positionPane.setLayout(new BorderLayout()); positionPane.add(getLabelPositionPane(comps, row, col), BorderLayout.CENTER); if (parent != null) { parent.initListener(positionPane); } } protected JPanel getLabelPositionPane(Component[][] comps, double[] row, double[] col) { return TableLayoutHelper.createTableLayoutPane(comps, row, col); } protected void initPositionListener() { position.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { checkPosition(); } }); } protected ChartTextAttrPane initTextFontPane() { return new ChartTextAttrPane() { protected Component[][] getComponents(JPanel buttonPane) { return new Component[][]{ new Component[]{null, null}, new Component[]{null, getFontNameComboBox()}, new Component[]{null, buttonPane} }; } }; } protected JPanel createBackgroundColorPane() { backgroundColor = new ColorSelectBox(100); return createTableLayoutPaneWithTitle(Toolkit.i18nText("Fine-Design_Chart_Background"), backgroundColor); } protected String title4PopupWindow() { return null; } private void checkAllUse() { if (tractionLine == null) { return; } checkPositionEnabled(); } private void checkPosition() { tractionLine.setSelected(position.getSelectedItem() != null && position.getSelectedItem() == Constants.OUTSIDE); checkPositionEnabled(); } protected 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() != null && position.getSelectedItem() == Constants.OUTSIDE); } protected void checkPane() { checkPositionPane(Toolkit.i18nText("Fine-Design_Chart_Layout_Position")); } public void populate(AttrLabelDetail detail) { checkPane(); dataLabelContentPane.populateBean(detail.getContent()); 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() ? 0 : 1); } if (backgroundColor != null) { backgroundColor.setSelectObject(detail.getBackgroundColor()); } if (borderPane != null) { borderPane.populate(detail.getBorder()); } if (backgroundPane != null) { backgroundPane.populate(detail.getBackground()); } checkAllUse(); checkOrientation(); } public void update(AttrLabelDetail detail) { detail.setContent(dataLabelContentPane.updateBean()); if (position != null && position.getSelectedItem() != null) { detail.setPosition(position.getSelectedItem()); } else if (position != null) { position.setSelectedItem(detail.getPosition()); } 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); } if (backgroundColor != null) { detail.setBackgroundColor(backgroundColor.getSelectObject()); } if (borderPane != null) { borderPane.update(detail.getBorder()); } if (backgroundPane != null) { backgroundPane.update(detail.getBackground()); } } }