From 308bfc7e7fca8aca75004873579010c58165f9b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Wed, 17 Jun 2020 09:28:13 +0800 Subject: [PATCH] =?UTF-8?q?CHART-13666=20=E5=9B=BE=E8=A1=A8=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=B1=BB=E5=9E=8B=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/ExtraDesignClassManager.java | 37 + .../design/fun/ChartWidgetOptionProvider.java | 14 + .../AbstractChartWidgetOptionProvider.java | 30 + .../fr/design/images/m_insert/auto_chart.png | Bin 135 -> 423 bytes .../fr/design/ChartTypeInterfaceManager.java | 12 +- .../com/fr/design/chart/AutoChartDialog.java | 24 + .../java/com/fr/design/chart/ChartDialog.java | 7 +- .../mainframe/chart/gui/ChartTypePane.java | 650 +++++++++--------- .../chart/gui/type/AbstractChartTypePane.java | 5 + .../chart/custom/VanChartCustomPlotPane.java | 3 +- .../type/AbstractVanChartTypePane.java | 95 ++- .../designer/type/VanChartMapPlotPane.java | 1 + .../designer/creator/XAutoChartCreator.java | 18 +- .../designer/creator/XCreatorUtils.java | 3 +- .../design/mainframe/FormParaWidgetPane.java | 16 +- .../design/form/images/auto_chart_preview.png | Bin 0 -> 20608 bytes .../insert/cell/AutoChartCellAction.java | 3 +- .../cell/editor/AutoChartCellEditor.java | 2 + .../fr/design/mainframe/ElementCasePane.java | 7 +- .../fr/start/module/DesignerActivator.java | 3 + 20 files changed, 553 insertions(+), 377 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java create mode 100644 designer-form/src/main/resources/com/fr/design/form/images/auto_chart_preview.png diff --git a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java index 656a7a6a7..4aa48591f 100644 --- a/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java +++ b/designer-base/src/main/java/com/fr/design/ExtraDesignClassManager.java @@ -8,6 +8,7 @@ import com.fr.base.BaseUtils; import com.fr.common.annotations.Open; import com.fr.design.data.datapane.TableDataNameObjectCreator; import com.fr.design.fun.CellWidgetOptionProvider; +import com.fr.design.fun.ChartWidgetOptionProvider; import com.fr.design.fun.FormWidgetOptionProvider; import com.fr.design.fun.MobileWidgetStyleProvider; import com.fr.design.fun.ParameterWidgetOptionProvider; @@ -193,6 +194,42 @@ public class ExtraDesignClassManager extends AbstractExtraClassManager implement return result.toArray(new WidgetOption[result.size()]); } + public Map, Class> getChartWidgetOptionsMap() { + Set set = getArray(ChartWidgetOptionProvider.XML_TAG); + Map, Class> map = new HashMap<>(); + for (ChartWidgetOptionProvider provider : set) { + map.put(provider.classForWidget(), provider.appearanceForWidget()); + } + return map; + } + + public WidgetOption[] getBeforeChartWidgetOptions() { + return getChartUnits(true); + } + + public WidgetOption[] getAfterChartWidgetOptions() { + return getChartUnits(false); + } + + private WidgetOption[] getChartUnits(boolean isBefore) { + Set set = getArray(ChartWidgetOptionProvider.XML_TAG); + if (set.isEmpty()) { + return new WidgetOption[0]; + } + Set result = new HashSet<>(); + for (ChartWidgetOptionProvider provider : set) { + if (provider.isBefore() == isBefore) { + WidgetOption option = WidgetOptionFactory.createByWidgetClass( + provider.nameForWidget(), + BaseUtils.readIcon(provider.iconPathForWidget()), + provider.classForWidget() + ); + result.add(option); + } + } + return result.toArray(new WidgetOption[result.size()]); + } + public WidgetOption[] getCellWidgetOptions() { Set set = getArray(CellWidgetOptionProvider.XML_TAG); diff --git a/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java new file mode 100644 index 000000000..3deb9947b --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/ChartWidgetOptionProvider.java @@ -0,0 +1,14 @@ +package com.fr.design.fun; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-12 + */ +public interface ChartWidgetOptionProvider extends ParameterWidgetOptionProvider { + + String XML_TAG = "ChartWidgetOptionProvider"; + + //在图表区域的开头还是结尾插入 + boolean isBefore(); +} diff --git a/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java new file mode 100644 index 000000000..6669d873a --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/fun/impl/AbstractChartWidgetOptionProvider.java @@ -0,0 +1,30 @@ +package com.fr.design.fun.impl; + +import com.fr.design.fun.ChartWidgetOptionProvider; +import com.fr.design.fun.FormWidgetOptionProvider; +import com.fr.stable.fun.impl.AbstractProvider; +import com.fr.stable.fun.mark.API; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2020-06-12 + */ +@API(level = FormWidgetOptionProvider.CURRENT_LEVEL) +public abstract class AbstractChartWidgetOptionProvider extends AbstractProvider implements ChartWidgetOptionProvider { + + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } + + @Override + public boolean isBefore() { + return false; + } + +} diff --git a/designer-base/src/main/resources/com/fr/design/images/m_insert/auto_chart.png b/designer-base/src/main/resources/com/fr/design/images/m_insert/auto_chart.png index c6de0fe5e05a697ee5ae011930c47bd18ea5ecfc..9413cf93971adab5f50b97c3303812659c2c5363 100644 GIT binary patch delta 383 zcmZo?T+Tefu-+v#!ZXd+mqCkxfq{d8u|1Q41;}CqVksbIU|?Rr$iNJw89`zTnBcMk z3z!jXkV2Et!cRbDf}SppAr^wk2@3=alwO;gnf>fPqkhD$`Wuh3u%fHV$;pqHW<-fi z;5Fd0lAiunp?>+{CmP?FZm=p`p5WU$v#-~!OxHthIkyAXMbTtqf#r-Rx;9E4J8?pw z^C43X*F;{YRO5}3(zE4`zh-iCJ9b{d*Ws6)lksDd;NW0pwzmJqjY+#dN*y?IM1m{i z&7ot*vKUQLj86!Zm0del|Nq~5Mx*{8zpBg+Br~dX$_N{nU5Ku@UjOgU->JR5M|qb# zyS_etb3@*v2Tz`KWMyRhVD}T);Up~)U_5ii468=7cdW1ea$MQ*_W%F-r4G|A=h)T$ zk~rZ|(Zy6)z_`FXrLpY|^QqMgrs52y{zsOIEw{KJz$q-e*`kD%LEv17((T-{0ia;= MboFyt=akR{0RG{M3;+NC delta 93 zcmZ3^+|D?`FwD`@#WBP}Fgam?fWf0n`8heC^5FAwd8D diff --git a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java index 014778cac..8480d2464 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -104,6 +104,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.awt.event.ActionListener; import static com.fr.chart.charttypes.ChartTypeManager.DEFAULT_PRIORITY; import static com.fr.chart.charttypes.ChartTypeManager.DEPRECATED_CHART_PRIORITY; @@ -259,17 +260,21 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr * * @param paneList pane容器 */ - public void addPlotTypePaneList(List> paneList, Map>> allChartTypePane) { + public void addPlotTypePaneList(List> paneList, + Map>> allChartTypePane, + ActionListener autoButtonListener) { List priorityList = getPriorityInOrder(); for (Integer aPriorityList : priorityList) { String priority = String.valueOf(aPriorityList); - addPlotTypePaneList(priority, paneList, allChartTypePane); + addPlotTypePaneList(priority, paneList, allChartTypePane, autoButtonListener); } } - public void addPlotTypePaneList(String priority, List> paneList, Map>> allChartTypePane) { + public void addPlotTypePaneList(String priority, List> paneList, + Map>> allChartTypePane, + ActionListener autoButtonListener) { if (chartTypeInterfaces != null && chartTypeInterfaces.containsKey(priority)) { @@ -286,6 +291,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr continue; } pane.reLayout(plotID); + pane.registerButtonListener(autoButtonListener); paneList.add(pane); if (allChartTypePane.get(priority) == null) { diff --git a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java index 4f8a1d033..583889da6 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/AutoChartDialog.java @@ -1,7 +1,11 @@ package com.fr.design.chart; import com.fr.base.chart.BaseChartCollection; +import com.fr.base.chart.chartdata.TopDefinitionProvider; import com.fr.chart.chartattr.ChartCollection; +import com.fr.chartx.TwoTuple; +import com.fr.design.i18n.Toolkit; +import com.fr.plugin.chart.vanchart.VanChart; import java.awt.Component; import java.awt.Dialog; @@ -46,10 +50,30 @@ public class AutoChartDialog extends ChartDialog { }; } + protected String getDialogTitle() { + return Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type"); + } + /** * 更新新建的图表 ChartCollection */ public void populate(BaseChartCollection cc) { super.populate(cc); + ChartCollection chartCollection = (ChartCollection) getChartCollection(); + VanChart vanChart = chartCollection.getSelectedChartProvider(VanChart.class); + if (vanChart == null) { + return; + } + TopDefinitionProvider filterDefinition = vanChart.getFilterDefinition(); + if (filterDefinition == null) { + return; + } + TwoTuple tableNameAndDataFields = filterDefinition.getTableNameAndDataFields(); + if (tableNameAndDataFields == null) { + return; + } + String tableName = tableNameAndDataFields.getFirst(); + String[] dataFields = tableNameAndDataFields.getSecond(); + autoChartTypePane.populate(tableName, dataFields); } } diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java index 9c2b730ab..9251bdbc8 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartDialog.java @@ -5,6 +5,7 @@ import com.fr.chart.chartattr.ChartCollection; import com.fr.design.dialog.BasicDialog; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.gui.ibutton.UIButton; +import com.fr.design.i18n.Toolkit; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.third.joda.time.DateTime; @@ -46,7 +47,7 @@ public class ChartDialog extends MiddleChartDialog { createTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); this.setModal(true); this.setLayout(new BorderLayout()); - setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_M_Popup_Chart_Type")); + setTitle(getDialogTitle()); this.applyClosingAction(); this.applyEscapeAction(); @@ -73,6 +74,10 @@ public class ChartDialog extends MiddleChartDialog { GUICoreUtils.setWindowCenter(getOwner(), this); } + protected String getDialogTitle() { + return Toolkit.i18nText("Fine-Design_Chart_M_Popup_Chart_Type"); + } + protected Component initCenterPane() { chartTypePane = new ChartTypePane(); return chartTypePane; diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index 6719401bb..b363dc5f6 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -9,9 +9,7 @@ import com.fr.design.dialog.BasicScrollPane; import com.fr.design.dialog.DialogActionAdapter; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.gui.frpane.UIComboBoxPane; -import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icombobox.UIComboBox; -import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.chart.AbstractChartAttrPane; import com.fr.design.mainframe.chart.ChartEditPane; @@ -39,364 +37,366 @@ import java.awt.event.ItemListener; /** * 图表 属性表, 类型选择 界面. -* @author kunsnat E-mail:kunsnat@gmail.com -* @version 创建时间:2012-12-26 上午10:56:51 + * + * @author kunsnat E-mail:kunsnat@gmail.com + * @version 创建时间:2012-12-26 上午10:56:51 */ -public class ChartTypePane extends AbstractChartAttrPane{ - private ComboBoxPane chartTypeComBox; - private ChartTypeButtonPane buttonPane; +public class ChartTypePane extends AbstractChartAttrPane { + private ComboBoxPane chartTypeComBox; + private ChartTypeButtonPane buttonPane; private ChartEditPane editPane; private ChartCollection editingCollection; - private UIButton autoButton; - - @Override - protected JPanel createContentPane() { - JPanel content = new JPanel(new BorderLayout()); - - buttonPane = new ChartTypeButtonPane(this); - content.add(buttonPane, BorderLayout.NORTH); - - if (editingCollection != null) { - relayoutChartTypePane(editingCollection); - }else { - chartTypeComBox = new ComboBoxPane(); - } - - BasicScrollPane scrollPane = new BasicScrollPane() { - @Override - protected JPanel createContentPane() { - return chartTypeComBox; - } - - @Override - protected void layoutContentPane() { - - leftcontentPane = createContentPane(); - this.add(leftcontentPane); - } - - @Override - public void populateBean(Object ob) { - } - - @Override - protected String title4PopupWindow() { - return null; - } - }; - content.add(scrollPane, BorderLayout.CENTER); - - buttonPane.setEditingChartPane(chartTypeComBox); - - if(ChartTypeManager.AUTO_CHART) { - initAutoButton(); - content.add(autoButton, BorderLayout.SOUTH); - } - - return content; - } - - /** - * 界面做为按钮时的图片位置. design_base - */ - public String getIconPath() { - return "com/fr/design/images/chart/ChartType.png"; - } - - /** - * 界面标题 + private ActionListener autoButtonListener; + + @Override + protected JPanel createContentPane() { + initButtonListener(); + JPanel content = new JPanel(new BorderLayout()); + + buttonPane = new ChartTypeButtonPane(this); + content.add(buttonPane, BorderLayout.NORTH); + + if (editingCollection != null) { + relayoutChartTypePane(editingCollection); + } else { + chartTypeComBox = new ComboBoxPane(); + } + + BasicScrollPane scrollPane = new BasicScrollPane() { + @Override + protected JPanel createContentPane() { + return chartTypeComBox; + } + + @Override + protected void layoutContentPane() { + + leftcontentPane = createContentPane(); + this.add(leftcontentPane); + } + + @Override + public void populateBean(Object ob) { + } + + @Override + protected String title4PopupWindow() { + return null; + } + }; + content.add(scrollPane, BorderLayout.CENTER); + + buttonPane.setEditingChartPane(chartTypeComBox); + + return content; + } + + /** + * 界面做为按钮时的图片位置. design_base + */ + public String getIconPath() { + return "com/fr/design/images/chart/ChartType.png"; + } + + /** + * 界面标题 + * * @return 界面标题 - */ - public String title4PopupWindow() { - return PaneTitleConstants.CHART_TYPE_TITLE; - } - - private void initAutoButton(){ - //TODO @Bjorn 视觉样式优化 - autoButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type")); - autoButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - final MiddleChartDialog autoChartDialog = DesignModuleFactory.getAutoChartDialog(DesignerContext.getDesignerFrame()); - autoChartDialog.populate(editingCollection); - autoChartDialog.addDialogActionListener(new DialogActionAdapter() { - @Override - public void doOk() { - populate(editingCollection); - } - }); - autoChartDialog.setVisible(true); - } - }); - } - - class ComboBoxPane extends UIComboBoxPane { - private Map>> allChartTypePane; - - @Override - protected List> initPaneList() { - List> paneList = new ArrayList>(); - allChartTypePane = new LinkedHashMap>>(); - ChartTypeInterfaceManager.getInstance().addPlotTypePaneList(paneList, allChartTypePane); - return paneList; - } - - @Override - protected String title4PopupWindow() { - return null; - } - - /** - * 不同图表切换分同一个selected的不同图表切换和不同selected的不同图表切换 - * 如果是切换图表的某个图表发生变化,则collection的选择下标不会变 - * 如果是切换图表的不同图表之间切换,则collection的选择下标会改变 - * @param chart - */ - public void updateBean(ChartProvider chart) { - - String lastPlotID = chart.getID(); - - try{ - AbstractChartTypePane selectedPane = (AbstractChartTypePane) getSelectedPane(); - ChartProvider newDefaultChart =(ChartProvider) ChartTypeManager.getInstanceWithCheck().getCharts(selectedPane.getPlotID())[0].clone(); - if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { - //vanChart 和 chart 之间切换 - //不同chart之间切换 + */ + public String title4PopupWindow() { + return PaneTitleConstants.CHART_TYPE_TITLE; + } + + public void initButtonListener() { + autoButtonListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + final MiddleChartDialog autoChartDialog = DesignModuleFactory.getAutoChartDialog(DesignerContext.getDesignerFrame()); + autoChartDialog.populate(editingCollection); + autoChartDialog.addDialogActionListener(new DialogActionAdapter() { + @Override + public void doOk() { + populate(editingCollection); + } + }); + autoChartDialog.setVisible(true); + } + }; + } + + class ComboBoxPane extends UIComboBoxPane { + private Map>> allChartTypePane; + + @Override + protected List> initPaneList() { + List> paneList = new ArrayList>(); + allChartTypePane = new LinkedHashMap>>(); + ChartTypeInterfaceManager.getInstance().addPlotTypePaneList(paneList, allChartTypePane, autoButtonListener); + return paneList; + } + + @Override + protected String title4PopupWindow() { + return null; + } + + /** + * 不同图表切换分同一个selected的不同图表切换和不同selected的不同图表切换 + * 如果是切换图表的某个图表发生变化,则collection的选择下标不会变 + * 如果是切换图表的不同图表之间切换,则collection的选择下标会改变 + * + * @param chart + */ + public void updateBean(ChartProvider chart) { + + String lastPlotID = chart.getID(); + + try { + AbstractChartTypePane selectedPane = (AbstractChartTypePane) getSelectedPane(); + ChartProvider newDefaultChart = (ChartProvider) ChartTypeManager.getInstanceWithCheck().getCharts(selectedPane.getPlotID())[0].clone(); + if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { + //vanChart 和 chart 之间切换 + //不同chart之间切换 editingCollection.removeNameObject(editingCollection.getSelectedIndex()); editingCollection.addChart(newDefaultChart); chart = newDefaultChart; } - }catch (CloneNotSupportedException e){ + } catch (CloneNotSupportedException e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } - //这一步会替换plot - ((AbstractChartTypePane)getSelectedPane()).updateBean(chart); - - String chartID = chart.getID(); - - //chartID改变的话图表类型就算改变了 - if (StringUtils.isNotEmpty(chartID)) { - - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); - - if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { - editPane.reLayout(chart); - } - } - } - - protected UIComboBox createComboBox() { - return new FlexibleComboBox(); - } - - @Override - protected void addItemChangeEvent() { - jcb.addItemListener(new ItemListener() { - @Override - public void itemStateChanged(ItemEvent e) { - FlexibleComboBox fcb = (FlexibleComboBox)jcb; - if (fcb.isReactor()){ - return; - } - comboBoxItemStateChanged(); - CardLayout cl = (CardLayout)cardPane.getLayout(); - cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); - } - }); - } - - private void addAllCards() { - Iterator iterator = allChartTypePane.keySet().iterator(); - - while (iterator.hasNext()) { - addOnePriorityCards(iterator.next(), false); - } - } - - private void addOnePriorityCards(String priority) { - addOnePriorityCards(priority, true); - } - - private void addOnePriorityCards(String priority, boolean ignore) { - - Map> map = allChartTypePane.get(priority); - - Iterator>> iterator = map.entrySet().iterator(); - - while (iterator.hasNext()) { - Map.Entry> entry = iterator.next(); - String plotID = entry.getKey(); - if (ignore || ChartTypeManager.enabledChart(plotID)) { - cards.add(entry.getValue()); - } - } - - } - - private void addOnePlotIDCards(String priority, String plotID) { - cards.add(allChartTypePane.get(priority).get(plotID)); - } - - //因为饼图(新特性)把(新特性)去掉了,和老的饼图同名,下拉框选项和typePane不能一一对应了 - //处理办法:这边除了重构 下拉项选项和cardNames 还需要把cards重构下(不需要init pane,只需要我需要的拿出来就好了) - private void relayout(ChartCollection collection){ - //重构需要重构下拉框选项和cardNames - ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); - String chartID = chart.getID(); - String priority = ChartTypeManager.getInstanceWithCheck().getPriority(chartID); - boolean enabledChart = ChartTypeManager.enabledChart(chartID); - String item = ChartTypeInterfaceManager.getInstance().getName(chartID); - - //第一步就是重构cards - cards.clear(); - if (enabledChart) { - if (collection.getChartCount() == 1) { - addAllCards(); - } else { - addOnePriorityCards(priority); - } - } else { - addOnePlotIDCards(priority, chartID); - } - - //下拉框重构开始。为了防止重构是触发update - ((FlexibleComboBox)jcb).setItemEvenType(ItemEventType.REACTOR); - //重构下拉框选项 - cardNames = new String[cards.size()]; - cardPane.removeAll(); - jcb.removeAllItems(); - for (int i = 0; i < this.cards.size(); i++) { - String name = this.cards.get(i).title4PopupWindow();// Name从各自的pane里面获取 - cardNames[i] = name; - cardPane.add(this.cards.get(i), cardNames[i]); - addComboBoxItem(cards, i); - } - //重新选择选中的下拉项 - jcb.setSelectedItem(item); - jcb.setEnabled(enabledChart); - //下拉框重构结束 - ((FlexibleComboBox)jcb).setItemEvenType(ItemEventType.DEFAULT); - //重新选中 - checkPlotPane(); - } - - private void checkPlotPane() { - CardLayout cl = (CardLayout)cardPane.getLayout(); - cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); - } - - @Override - public void populateBean(ChartProvider ob) { - for (int i = 0; i < this.cards.size(); i++) { - FurtherBasicBeanPane pane = cards.get(i); - if (pane.accept(ob)) { - pane.populateBean(ob); - Object item = pane.title4PopupWindow(); - for (int j = 0; j < cardNames.length; j++) { - if (ComparatorUtils.equals(item, cardNames[j])) { - jcb.setSelectedIndex(j); - } - } - return; - } - } - } - - @Override - public ChartProvider updateBean() { - return getSelectedPane().updateBean(); - } - - @Override - public FurtherBasicBeanPane getSelectedPane() { - Object item = jcb.getSelectedItem(); - for (int i = 0; i < cards.size(); i++){ - if (ComparatorUtils.equals(item, cards.get(i).title4PopupWindow())){ - return cards.get(i); - } - } - return cards.get(0); - } - - } - - - /** - * 面板重构 - * @param lastPlotID - * @param collection - */ - public void reLayoutEditPane(String lastPlotID, ChartCollection collection){ - if (editPane == null) { - return; - } - ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); - String plotID = chart.getID(); - boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); - if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))) { - editPane.reLayout(chart); - } - } - - - public void relayoutChartTypePane(ChartCollection collection){ - chartTypeComBox.relayout(collection); - } - - /** - * 更新界面属性 用于展示 - */ - public void populate(ChartCollection collection) { - editingCollection = collection; - - ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); - this.remove(leftContentPane); - initContentPane(); - - buttonPane.populateBean(collection); - chartTypeComBox.populateBean(chart); - - buttonPane.setVisible(ChartTypeInterfaceManager.getInstance().needChartChangePane(chart)); - - this.initAllListeners(); - } - - /** - * 保存界面属性 - */ - public void update(ChartCollection collection) { + //这一步会替换plot + ((AbstractChartTypePane) getSelectedPane()).updateBean(chart); + + String chartID = chart.getID(); + + //chartID改变的话图表类型就算改变了 + if (StringUtils.isNotEmpty(chartID)) { + + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(chartID); + + if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, chartID))) { + editPane.reLayout(chart); + } + } + } + + protected UIComboBox createComboBox() { + return new FlexibleComboBox(); + } + + @Override + protected void addItemChangeEvent() { + jcb.addItemListener(new ItemListener() { + @Override + public void itemStateChanged(ItemEvent e) { + FlexibleComboBox fcb = (FlexibleComboBox) jcb; + if (fcb.isReactor()) { + return; + } + comboBoxItemStateChanged(); + CardLayout cl = (CardLayout) cardPane.getLayout(); + cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); + } + }); + } + + private void addAllCards() { + Iterator iterator = allChartTypePane.keySet().iterator(); + + while (iterator.hasNext()) { + addOnePriorityCards(iterator.next(), false); + } + } + + private void addOnePriorityCards(String priority) { + addOnePriorityCards(priority, true); + } + + private void addOnePriorityCards(String priority, boolean ignore) { + + Map> map = allChartTypePane.get(priority); + + Iterator>> iterator = map.entrySet().iterator(); + + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + String plotID = entry.getKey(); + if (ignore || ChartTypeManager.enabledChart(plotID)) { + cards.add(entry.getValue()); + } + } + + } + + private void addOnePlotIDCards(String priority, String plotID) { + cards.add(allChartTypePane.get(priority).get(plotID)); + } + + //因为饼图(新特性)把(新特性)去掉了,和老的饼图同名,下拉框选项和typePane不能一一对应了 + //处理办法:这边除了重构 下拉项选项和cardNames 还需要把cards重构下(不需要init pane,只需要我需要的拿出来就好了) + private void relayout(ChartCollection collection) { + //重构需要重构下拉框选项和cardNames + ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); + String chartID = chart.getID(); + String priority = ChartTypeManager.getInstanceWithCheck().getPriority(chartID); + boolean enabledChart = ChartTypeManager.enabledChart(chartID); + String item = ChartTypeInterfaceManager.getInstance().getName(chartID); + + //第一步就是重构cards + cards.clear(); + if (enabledChart) { + if (collection.getChartCount() == 1) { + addAllCards(); + } else { + addOnePriorityCards(priority); + } + } else { + addOnePlotIDCards(priority, chartID); + } + + //下拉框重构开始。为了防止重构是触发update + ((FlexibleComboBox) jcb).setItemEvenType(ItemEventType.REACTOR); + //重构下拉框选项 + cardNames = new String[cards.size()]; + cardPane.removeAll(); + jcb.removeAllItems(); + for (int i = 0; i < this.cards.size(); i++) { + String name = this.cards.get(i).title4PopupWindow();// Name从各自的pane里面获取 + cardNames[i] = name; + cardPane.add(this.cards.get(i), cardNames[i]); + addComboBoxItem(cards, i); + } + //重新选择选中的下拉项 + jcb.setSelectedItem(item); + jcb.setEnabled(enabledChart); + //下拉框重构结束 + ((FlexibleComboBox) jcb).setItemEvenType(ItemEventType.DEFAULT); + //重新选中 + checkPlotPane(); + } + + private void checkPlotPane() { + CardLayout cl = (CardLayout) cardPane.getLayout(); + cl.show(cardPane, cardNames[jcb.getSelectedIndex()]); + } + + @Override + public void populateBean(ChartProvider ob) { + for (int i = 0; i < this.cards.size(); i++) { + FurtherBasicBeanPane pane = cards.get(i); + if (pane.accept(ob)) { + pane.populateBean(ob); + Object item = pane.title4PopupWindow(); + for (int j = 0; j < cardNames.length; j++) { + if (ComparatorUtils.equals(item, cardNames[j])) { + jcb.setSelectedIndex(j); + } + } + return; + } + } + } + + @Override + public ChartProvider updateBean() { + return getSelectedPane().updateBean(); + } + + @Override + public FurtherBasicBeanPane getSelectedPane() { + Object item = jcb.getSelectedItem(); + for (int i = 0; i < cards.size(); i++) { + if (ComparatorUtils.equals(item, cards.get(i).title4PopupWindow())) { + return cards.get(i); + } + } + return cards.get(0); + } + + } + + + /** + * 面板重构 + * + * @param lastPlotID + * @param collection + */ + public void reLayoutEditPane(String lastPlotID, ChartCollection collection) { + if (editPane == null) { + return; + } + ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); + String plotID = chart.getID(); + boolean isUseDefault = ChartTypeInterfaceManager.getInstance().isUseDefaultPane(plotID); + if (editPane.isDefaultPane() != isUseDefault || (!isUseDefault && !ComparatorUtils.equals(lastPlotID, plotID))) { + editPane.reLayout(chart); + } + } + + + public void relayoutChartTypePane(ChartCollection collection) { + chartTypeComBox.relayout(collection); + } + + /** + * 更新界面属性 用于展示 + */ + public void populate(ChartCollection collection) { + editingCollection = collection; + + ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); + this.remove(leftContentPane); + initContentPane(); + + buttonPane.populateBean(collection); + chartTypeComBox.populateBean(chart); + + buttonPane.setVisible(ChartTypeInterfaceManager.getInstance().needChartChangePane(chart)); + + this.initAllListeners(); + } + + /** + * 保存界面属性 + */ + public void update(ChartCollection collection) { editingCollection = collection; - buttonPane.update(collection);// 内部操作时 已经做过处理. - ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); - chartTypeComBox.updateBean(chart); - } + buttonPane.update(collection);// 内部操作时 已经做过处理. + ChartProvider chart = collection.getSelectedChartProvider(ChartProvider.class); + chartTypeComBox.updateBean(chart); + } /** * 所有图表的类型界面 + * * @return 类型界面 */ - public FurtherBasicBeanPane[] getPaneList(){ + public FurtherBasicBeanPane[] getPaneList() { return chartTypeComBox.getCards().toArray(new FurtherBasicBeanPane[0]); } /** * 当前选中的图表的index + * * @return 当前选中的图表的index */ - public int getSelectedIndex(){ + public int getSelectedIndex() { return chartTypeComBox.getSelectedIndex(); } /** * 返回选中的图表的index + * * @return 选中的图标的序号 */ - public int getSelectedChartIndex(){ + public int getSelectedChartIndex() { return chartTypeComBox.getSelectedIndex(); } /** * 设置下编辑的面板 + * * @param currentEditPane 设置下编辑的面板 */ public void registerChartEditPane(ChartEditPane currentEditPane) { diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java index eee0e322e..4f3f02510 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/type/AbstractChartTypePane.java @@ -22,6 +22,7 @@ import java.util.List; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.event.ActionListener; public abstract class AbstractChartTypePane extends FurtherBasicBeanPane { @@ -240,4 +241,8 @@ public abstract class AbstractChartTypePane extends Fur public ChartProvider getDefaultChart() { return BarIndependentChart.barChartTypes[0]; } + + public void registerButtonListener(ActionListener autoButtonListener) { + + } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java index a4b43843e..6bace5ef9 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java +++ b/designer-chart/src/main/java/com/fr/van/chart/custom/VanChartCustomPlotPane.java @@ -61,7 +61,8 @@ public class VanChartCustomPlotPane extends AbstractVanChartTypePane { return new Component[][]{ new Component[]{typePane}, new Component[]{stylePane}, - new Component[]{contentPane} + new Component[]{contentPane}, + new Component[]{buttonPane}, }; } 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 c2406e0d2..577a04664 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,5 +1,6 @@ package com.fr.van.chart.designer.type; +import com.fr.base.BaseUtils; import com.fr.chart.base.AttrFillStyle; import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.Legend; @@ -7,13 +8,16 @@ import com.fr.chart.chartattr.Plot; import com.fr.chart.chartglyph.ConditionAttr; import com.fr.chart.chartglyph.ConditionCollection; import com.fr.chart.chartglyph.DataSheet; +import com.fr.chart.charttypes.ChartTypeManager; import com.fr.chartx.data.AbstractDataDefinition; import com.fr.chartx.data.ChartDataDefinitionProvider; import com.fr.chartx.data.field.AbstractColumnFieldCollection; import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; import com.fr.design.ChartTypeInterfaceManager; +import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icheckbox.UICheckBox; import com.fr.design.gui.ilable.MultilineLabel; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.chart.gui.type.AbstractChartTypePane; import com.fr.design.mainframe.chart.gui.type.ChartImagePane; import com.fr.design.mainframe.chart.info.ChartInfoCollector; @@ -25,21 +29,53 @@ import com.fr.plugin.chart.base.VanChartTools; import com.fr.plugin.chart.base.VanChartZoom; import com.fr.plugin.chart.vanchart.VanChart; +import javax.swing.BorderFactory; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; +import java.awt.Dimension; +import java.awt.event.ActionListener; public abstract class AbstractVanChartTypePane extends AbstractChartTypePane { private static final long serialVersionUID = 7743244512351499265L; private UICheckBox largeModelCheckBox; + protected JPanel buttonPane; + + protected UIButton autoButton; + private boolean samePlot; protected boolean isSamePlot() { return samePlot; } + public AbstractVanChartTypePane() { + buttonPane = new JPanel(); + buttonPane.setLayout(new BorderLayout()); + if (ChartTypeManager.AUTO_CHART) { + autoButton = new UIButton(Toolkit.i18nText("Fine-Design_Chart_M_Popup_Auto_Chart_Type"), + BaseUtils.readIcon("/com/fr/design/images/m_insert/auto_chart.png")) { + @Override + public Dimension getPreferredSize() { + return new Dimension((int) super.getPreferredSize().getWidth(), 25); + } + }; + buttonPane.setBorder((BorderFactory.createEmptyBorder(5, 0, 0, 0))); + buttonPane.add(autoButton); + } + } + + @Override + protected Component[][] getPaneComponents(JPanel typePane) { + return new Component[][]{ + new Component[]{typePane}, + new Component[]{buttonPane}, + new Component[]{stylePane}, + }; + } + //新图表暂时还没有平面3d,渐变高光等布局。 @Override protected String[] getTypeLayoutPath() { @@ -66,7 +102,7 @@ public abstract class AbstractVanChartTypePane extends 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 Q26XzLr>mdKI;Vst0C}8TlmGw# literal 0 HcmV?d00001 diff --git a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/AutoChartCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/AutoChartCellAction.java index 6ee1a74c4..c24ea2367 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/insert/cell/AutoChartCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/insert/cell/AutoChartCellAction.java @@ -2,6 +2,7 @@ package com.fr.design.actions.insert.cell; import com.fr.base.BaseUtils; import com.fr.chart.chartattr.AutoChartCollection; +import com.fr.common.annotations.Open; import com.fr.design.actions.core.WorkBookSupportable; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.ElementCasePane; @@ -14,6 +15,7 @@ import javax.swing.KeyStroke; * @version 10.0 * Created by Bjorn on 2020-05-28 */ +@Open public class AutoChartCellAction extends AbstractCellAction implements WorkBookSupportable { public AutoChartCellAction() { @@ -29,7 +31,6 @@ public class AutoChartCellAction extends AbstractCellAction implements WorkBookS this.setMenuKeySet(INSERT_AUTO_CHART); this.setName(getMenuKeySet().getMenuKeySetName() + "..."); this.setMnemonic(getMenuKeySet().getMnemonic()); - //TODO @Bjorn 视觉样式优化icon this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/auto_chart.png")); } diff --git a/designer-realize/src/main/java/com/fr/design/cell/editor/AutoChartCellEditor.java b/designer-realize/src/main/java/com/fr/design/cell/editor/AutoChartCellEditor.java index 410248766..8dbbecca0 100644 --- a/designer-realize/src/main/java/com/fr/design/cell/editor/AutoChartCellEditor.java +++ b/designer-realize/src/main/java/com/fr/design/cell/editor/AutoChartCellEditor.java @@ -1,5 +1,6 @@ package com.fr.design.cell.editor; +import com.fr.common.annotations.Open; import com.fr.design.gui.chart.MiddleChartDialog; import com.fr.design.mainframe.ElementCasePane; import com.fr.design.module.DesignModuleFactory; @@ -12,6 +13,7 @@ import java.awt.Window; * @version 10.0 * Created by Bjorn on 2020-05-28 */ +@Open public class AutoChartCellEditor extends ChartCellEditor { public AutoChartCellEditor(ElementCasePane ePane) { diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java index 24178bcfd..9fc0b7b52 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/ElementCasePane.java @@ -9,7 +9,6 @@ import com.fr.base.Formula; import com.fr.base.ScreenResolution; import com.fr.base.Style; import com.fr.base.vcs.DesignerMode; -import com.fr.chart.chartattr.AutoChartCollection; import com.fr.design.DesignState; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; @@ -53,8 +52,6 @@ import com.fr.design.cell.bar.DynamicScrollBar; import com.fr.design.cell.clipboard.CellElementsClip; import com.fr.design.cell.clipboard.ElementsTransferable; import com.fr.design.cell.clipboard.FloatElementsClip; -import com.fr.design.cell.editor.AutoChartCellEditor; -import com.fr.design.cell.editor.AutoChartFloatEditor; import com.fr.design.cell.editor.BiasTextPainterCellEditor; import com.fr.design.cell.editor.CellEditor; import com.fr.design.cell.editor.ChartCellEditor; @@ -402,8 +399,6 @@ public abstract class ElementCasePane extends Tar grid.setDefaultFloatEditor(chartClass, new ChartFloatEditor()); } - grid.setDefaultCellEditor(AutoChartCollection.class, new AutoChartCellEditor(this)); - grid.setDefaultFloatEditor(AutoChartCollection.class, new AutoChartFloatEditor()); addExtraCellEditor(grid); @@ -427,7 +422,7 @@ public abstract class ElementCasePane extends Tar editor = (CellEditor) c.newInstance(); } catch (NoSuchMethodException e) { try { - c = clazz.getConstructor(ElementCase.class); + c = clazz.getConstructor(ElementCasePane.class); editor = (CellEditor) c.newInstance(this); } catch (Exception e1) { FineLoggerFactory.getLogger().error(e1.getMessage(), e1); diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index c0a979d6e..3f1aa2663 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -350,6 +350,9 @@ public class DesignerActivator extends Activator { Set providers = ExtraDesignClassManager.getInstance().getArray(ElementUIProvider.MARK_STRING); for (ElementUIProvider provider : providers) { try { + if (provider.quickEditor() == null) { + continue; + } ActionFactory.registerCellEditor(provider.targetObjectClass(), provider.quickEditor().newInstance()); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e);