Browse Source
* commit '94251dc0e256e04d3aa69a27ebb475f46eda89cf': CHART-9141 filter界面&xml、processor不合理改成枚举、result流程一部分 CHART-4798 数据集数据源 CHART-9141 删除图表设计器相关代码 CHART-9141 replace chart with chartProvider(eg:typePane) && 图表公式相关接口 && 删除图表内部对datamodel的cache(和engine确认过) CHART-9141 ChartRequestService新增+chart service move to chart module+chartdata remove from engine-cross xchart rename to chartProvider CHART-9141 se.cellCC && floatCC 调用图表统一接口 删除BaseChart 各resultProcessor 初步的流程走通 多层饼图 增加词云的数据配置 有助于理解计算的开发工作 柱形图数据配置界面少了一点 上次处理代码质量出的bug update 代码质量 代码质量 update CHART-4027 系列+值 自定义相关celldata design CHART-4027 系列+值 自定义相关 design CHART-4027 图表数据设计器界面research/10.0
zheng
5 years ago
81 changed files with 3423 additions and 1476 deletions
@ -1,128 +0,0 @@
|
||||
package com.fr.design.chart; |
||||
|
||||
import com.fr.chart.chartattr.Chart; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.controlpane.JListControlPane; |
||||
import com.fr.design.gui.controlpane.NameObjectCreator; |
||||
import com.fr.design.gui.controlpane.NameableCreator; |
||||
import com.fr.design.layout.FRGUIPaneFactory; |
||||
|
||||
import com.fr.general.NameObject; |
||||
import com.fr.stable.Nameable; |
||||
|
||||
import java.awt.*; |
||||
import java.util.HashMap; |
||||
|
||||
/** |
||||
* 管理图表类型Pane |
||||
* @author kunsnat: ChartComponent移出. |
||||
*/ |
||||
public class ChartControlPane extends JListControlPane { |
||||
private static final long serialVersionUID = 7336270815128413184L; |
||||
|
||||
public ChartControlPane() { |
||||
super(); |
||||
// 重新设定大小. 因为JControlPane默认的(450,450) 不适合图表这边 @ChartSize
|
||||
// this.setPreferredSize(new Dimension(770, 520));
|
||||
} |
||||
|
||||
@Override |
||||
public NameableCreator[] createNameableCreators() { |
||||
return new NameableCreator[] { |
||||
new NameObjectCreator(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Chart"), Chart.class, ChartTypeUpdatePane.class) |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Manage_Chart_Type"); |
||||
} |
||||
|
||||
public void populate(ChartCollection cc) { |
||||
if(cc == null)return; |
||||
|
||||
NameObject[] nameObjects = new NameObject[cc.getChartCount()]; |
||||
for (int i = 0; i < nameObjects.length; i++) { |
||||
nameObjects[i] = new NameObject(cc.getChartName(i), cc.getChart(i)); |
||||
} |
||||
|
||||
populate(nameObjects); |
||||
// kunsnat: 选中当前图表选中的name
|
||||
String chartSelectedName = cc.getChartName(cc.getSelectedIndex() < cc.getChartCount() ? cc.getSelectedIndex() : 0); |
||||
setSelectedName(chartSelectedName); |
||||
} |
||||
|
||||
public void update(ChartCollection cc) { |
||||
HashMap namesChart = new HashMap();// 暂存判断是否有必要更新
|
||||
for(int i = 0; i < cc.getChartCount(); i++) { |
||||
try { |
||||
namesChart.put(cc.getChartName(i), cc.getChart(i).clone()); |
||||
} catch (CloneNotSupportedException e) { |
||||
|
||||
} |
||||
} |
||||
|
||||
Nameable[] nameables = update(); |
||||
if (nameables.length == 0 || cc == null) { |
||||
return; |
||||
} |
||||
|
||||
cc.removeAllNameObject(); |
||||
String select = getSelectedName(); |
||||
for (int i = 0; i < nameables.length; i++) { |
||||
if (nameables[i] instanceof NameObject && ((NameObject)nameables[i]).getObject() instanceof Chart) { |
||||
NameObject no = (NameObject)nameables[i]; |
||||
|
||||
String name = no.getName(); |
||||
Chart chart = (Chart)no.getObject(); |
||||
if(namesChart.containsKey(name)) { |
||||
Chart tmpChart = (Chart)namesChart.get(name); |
||||
if(chart.getPlot() != null && tmpChart.getPlot() != null |
||||
&& chart.getPlot().match4GUI(tmpChart.getPlot())) { |
||||
chart = tmpChart;// 代替之前做过编辑的Chart
|
||||
} |
||||
} |
||||
cc.addNamedChart(name, chart); |
||||
if(no.getName().equals(select)) { |
||||
cc.setSelectedIndex(i); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* |
||||
* alex:继承UpdatePane的ChartTypePane |
||||
*/ |
||||
public static class ChartTypeUpdatePane extends BasicBeanPane<Chart> { |
||||
private static final long serialVersionUID = -7058348930816218415L; |
||||
private Chart editing; |
||||
|
||||
private ChartTypePane typePane; |
||||
|
||||
public ChartTypeUpdatePane() { |
||||
this.setLayout(FRGUIPaneFactory.createBorderLayout()); |
||||
|
||||
typePane = new ChartTypePane(); |
||||
this.add(typePane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return "Chart Type"; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(Chart ob) { |
||||
editing = ob; |
||||
typePane.populate(ob); |
||||
} |
||||
|
||||
@Override |
||||
public Chart updateBean() { |
||||
typePane.update(editing); |
||||
|
||||
return editing; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,58 @@
|
||||
package com.fr.design.chartx; |
||||
|
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.chartx.data.ChartDataDefinitionProvider; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.plugin.chart.vanchart.VanChart; |
||||
|
||||
import java.awt.BorderLayout; |
||||
|
||||
/** |
||||
* Created by shine on 2019/4/15. |
||||
*/ |
||||
public abstract class AbstractChartDataPane<T extends ChartDataDefinitionProvider> extends ChartDataPane { |
||||
|
||||
public AbstractChartDataPane(AttributeChangeListener listener) { |
||||
super(listener); |
||||
} |
||||
|
||||
protected abstract void populate(T t); |
||||
|
||||
protected abstract T update(); |
||||
|
||||
@Override |
||||
public void populate(ChartCollection collection) { |
||||
if (collection == null) { |
||||
return; |
||||
} |
||||
VanChart chart = collection.getSelectedChart(VanChart.class); |
||||
if (chart == null) { |
||||
return; |
||||
} |
||||
|
||||
this.removeAll(); |
||||
this.add(createContentPane(), BorderLayout.CENTER); |
||||
|
||||
ChartDataDefinitionProvider dataSetCollection = chart.getChartDataDefinition(); |
||||
|
||||
populate((T) dataSetCollection); |
||||
|
||||
this.initAllListeners(); |
||||
this.validate(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void update(ChartCollection collection) { |
||||
if (collection == null) { |
||||
return; |
||||
} |
||||
VanChart chart = collection.getSelectedChart(VanChart.class); |
||||
if (chart == null) { |
||||
return; |
||||
} |
||||
|
||||
chart.setChartDataDefinition(update()); |
||||
} |
||||
} |
@ -0,0 +1,39 @@
|
||||
package com.fr.design.chartx; |
||||
|
||||
import com.fr.chartx.data.GanttChartDataDefinition; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
import com.fr.van.chart.map.designer.VanChartGroupPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/22. |
||||
*/ |
||||
public class GanttChartDataPane extends AbstractChartDataPane<GanttChartDataDefinition> { |
||||
|
||||
private MultiCategoryChartDataPane dataPane; |
||||
private MultiCategoryChartDataPane linkPane; |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
dataPane = new MultiCategoryChartDataPane(listener); |
||||
linkPane = new MultiCategoryChartDataPane(listener); |
||||
return new VanChartGroupPane(new String[]{"data", "link"}, new JPanel[]{dataPane, linkPane}) { |
||||
}; |
||||
} |
||||
|
||||
public GanttChartDataPane(AttributeChangeListener listener) { |
||||
super(listener); |
||||
} |
||||
|
||||
@Override |
||||
protected void populate(GanttChartDataDefinition ganttChartDataDefinition) { |
||||
dataPane.populate(ganttChartDataDefinition.getDataDefinition()); |
||||
linkPane.populate(ganttChartDataDefinition.getLinkDefinition()); |
||||
} |
||||
|
||||
@Override |
||||
protected GanttChartDataDefinition update() { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,43 @@
|
||||
package com.fr.design.chartx; |
||||
|
||||
import com.fr.chartx.data.AbstractDataDefinition; |
||||
import com.fr.design.chartx.fields.diff.MultiCategoryCellDataFieldsPane; |
||||
import com.fr.design.chartx.fields.diff.MultiCategoryDataSetFieldsPane; |
||||
import com.fr.design.chartx.single.SingleDataPane; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
|
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/22. |
||||
*/ |
||||
public class MultiCategoryChartDataPane extends AbstractChartDataPane<AbstractDataDefinition> { |
||||
|
||||
private SingleDataPane singleDataPane; |
||||
|
||||
public MultiCategoryChartDataPane(AttributeChangeListener listener) { |
||||
super(listener); |
||||
} |
||||
|
||||
@Override |
||||
protected void populate(AbstractDataDefinition dataDefinition) { |
||||
singleDataPane.populateBean(dataDefinition); |
||||
} |
||||
|
||||
@Override |
||||
protected AbstractDataDefinition update() { |
||||
return singleDataPane.updateBean(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
singleDataPane = createSingleDataPane(); |
||||
return singleDataPane; |
||||
} |
||||
|
||||
protected SingleDataPane createSingleDataPane() { |
||||
return new SingleDataPane(new MultiCategoryDataSetFieldsPane(), new MultiCategoryCellDataFieldsPane()); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,21 @@
|
||||
package com.fr.design.chartx; |
||||
|
||||
import com.fr.design.chartx.fields.diff.MultiPieCellDataFieldsPane; |
||||
import com.fr.design.chartx.fields.diff.MultiPieDataSetFieldsPane; |
||||
import com.fr.design.chartx.single.SingleDataPane; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class MultiPieChartDataPane extends MultiCategoryChartDataPane { |
||||
|
||||
public MultiPieChartDataPane(AttributeChangeListener listener) { |
||||
super(listener); |
||||
} |
||||
|
||||
@Override |
||||
protected SingleDataPane createSingleDataPane() { |
||||
return new SingleDataPane(new MultiPieDataSetFieldsPane(), new MultiPieCellDataFieldsPane()); |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fr.design.chartx; |
||||
|
||||
import com.fr.design.chartx.fields.diff.WordCloudCellDataFieldsPane; |
||||
import com.fr.design.chartx.fields.diff.WordCloudDataSetFieldsPane; |
||||
import com.fr.design.chartx.single.SingleDataPane; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/22. |
||||
*/ |
||||
public class WordCloudChartDataPane extends MultiCategoryChartDataPane { |
||||
public WordCloudChartDataPane(AttributeChangeListener listener) { |
||||
super(listener); |
||||
} |
||||
|
||||
@Override |
||||
protected SingleDataPane createSingleDataPane() { |
||||
return new SingleDataPane(new WordCloudDataSetFieldsPane(), new WordCloudCellDataFieldsPane()); |
||||
} |
||||
} |
@ -0,0 +1,252 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.data.util.function.AbstractDataFunction; |
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.chartx.component.correlation.AbstractCorrelationPane; |
||||
import com.fr.design.chartx.component.correlation.CalculateComboBoxEditorComponent; |
||||
import com.fr.design.chartx.component.correlation.FieldEditorComponentWrapper; |
||||
import com.fr.design.chartx.component.correlation.UIComboBoxEditorComponent; |
||||
import com.fr.design.chartx.component.correlation.UITextFieldEditorComponent; |
||||
import com.fr.design.gui.frpane.UIComboBoxPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; |
||||
import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; |
||||
import com.fr.extended.chart.UIComboBoxWithNone; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2018/9/12. |
||||
* 系列名使用字段名or字段值的抽象的pane 支持多种属性结构的存取 |
||||
*/ |
||||
public abstract class AbstractCustomFieldComboBoxPane<T> extends UIComboBoxPane<T> { |
||||
|
||||
private AbstractUseFieldValuePane useFieldValuePane; |
||||
|
||||
private AbstractCustomFieldNamePane customFieldNamePane; |
||||
|
||||
private List<String> fieldList = new ArrayList<String>(); |
||||
|
||||
@Override |
||||
protected void initLayout() { |
||||
this.setLayout(new BorderLayout(0, 6)); |
||||
JPanel northPane = new JPanel(new BorderLayout()); |
||||
northPane.add(jcb, BorderLayout.CENTER); |
||||
UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Series_Name_From")); |
||||
label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, 20)); |
||||
northPane.add(label, BorderLayout.WEST); |
||||
this.add(northPane, BorderLayout.NORTH); |
||||
this.add(cardPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
protected List<FurtherBasicBeanPane<? extends T>> initPaneList() { |
||||
useFieldValuePane = createUseFieldValuePane(); |
||||
customFieldNamePane = createCustomFieldNamePane(); |
||||
List<FurtherBasicBeanPane<? extends T>> list = new ArrayList<FurtherBasicBeanPane<? extends T>>(); |
||||
list.add(useFieldValuePane); |
||||
list.add(paneWrapper()); |
||||
return list; |
||||
} |
||||
|
||||
private FurtherBasicBeanPane<? extends T> paneWrapper() { |
||||
FurtherBasicBeanPane pane = new FurtherBasicBeanPane() { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Name"); |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(Object ob) { |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(Object ob) { |
||||
} |
||||
|
||||
@Override |
||||
public Object updateBean() { |
||||
return null; |
||||
} |
||||
}; |
||||
pane.setLayout(new BorderLayout(0, 6)); |
||||
pane.add(customFieldNamePane, BorderLayout.CENTER); |
||||
return pane; |
||||
} |
||||
|
||||
protected abstract AbstractUseFieldValuePane createUseFieldValuePane(); |
||||
|
||||
protected abstract AbstractCustomFieldNamePane createCustomFieldNamePane(); |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
protected boolean valueComboBoxHasNone() { |
||||
return false; |
||||
} |
||||
|
||||
public void checkBoxUse(boolean hasUse) { |
||||
jcb.setEnabled(hasUse); |
||||
useFieldValuePane.checkBoxUse(hasUse); |
||||
} |
||||
|
||||
public void clearAllBoxList() { |
||||
useFieldValuePane.clearAllBoxList(); |
||||
fieldList.clear(); |
||||
} |
||||
|
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
useFieldValuePane.refreshBoxListWithSelectTableData(columnNameList); |
||||
fieldList = columnNameList; |
||||
} |
||||
|
||||
protected void populateCustomFieldNamePane(T t) { |
||||
customFieldNamePane.populateBean(t); |
||||
} |
||||
|
||||
protected void updateCustomFieldNamePane(T t) { |
||||
customFieldNamePane.updateBean(t); |
||||
} |
||||
|
||||
protected void populateUseFieldValuePane(T t) { |
||||
useFieldValuePane.populateBean(t); |
||||
} |
||||
|
||||
protected void updateUseFieldValuePane(T t) { |
||||
useFieldValuePane.updateBean(t); |
||||
} |
||||
|
||||
protected abstract class AbstractUseFieldValuePane extends FurtherBasicBeanPane<T> { |
||||
private UIComboBox series; |
||||
private UIComboBox value; |
||||
private CalculateComboBox function; |
||||
|
||||
public AbstractUseFieldValuePane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
private void initComponents() { |
||||
|
||||
series = new UIComboBox(); |
||||
value = valueComboBoxHasNone() ? new UIComboBoxWithNone() : new UIComboBox(); |
||||
|
||||
function = new CalculateComboBox(); |
||||
|
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Series_Name"), SwingConstants.LEFT), series}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Use_Value"), SwingConstants.LEFT), value}, |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Summary_Method"), SwingConstants.LEFT), function}, |
||||
}; |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double[] columnSize = {78, 122}; |
||||
double[] rowSize = {p, p, p}; |
||||
|
||||
JPanel panel = TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); |
||||
|
||||
this.setLayout(new BorderLayout(0, 6)); |
||||
this.add(panel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
public void checkBoxUse(boolean hasUse) { |
||||
series.setEnabled(hasUse); |
||||
value.setEnabled(hasUse); |
||||
function.setEnabled(hasUse); |
||||
} |
||||
|
||||
public void clearAllBoxList() { |
||||
DataPaneHelper.clearBoxItems(series); |
||||
DataPaneHelper.clearBoxItems(value); |
||||
} |
||||
|
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
DataPaneHelper.refreshBoxItems(series, columnNameList); |
||||
DataPaneHelper.refreshBoxItems(value, columnNameList); |
||||
} |
||||
|
||||
protected void populateSeries(String item) { |
||||
series.setSelectedItem(item); |
||||
} |
||||
|
||||
protected void populateValue(String item) { |
||||
value.setSelectedItem(item); |
||||
} |
||||
|
||||
protected void populateFunction(AbstractDataFunction _function) { |
||||
function.populateBean(_function); |
||||
} |
||||
|
||||
protected String updateSeries() { |
||||
return GeneralUtils.objectToString(series.getSelectedItem()); |
||||
} |
||||
|
||||
protected String updateValue() { |
||||
return GeneralUtils.objectToString(value.getSelectedItem()); |
||||
} |
||||
|
||||
protected AbstractDataFunction updateFunction() { |
||||
return function.updateBean(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(Object ob) { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
} |
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Enable_Field_Value"); |
||||
} |
||||
|
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
protected abstract class AbstractCustomFieldNamePane extends AbstractCorrelationPane<T> { |
||||
|
||||
@Override |
||||
protected FieldEditorComponentWrapper[] createFieldEditorComponentWrappers() { |
||||
return new FieldEditorComponentWrapper[]{ |
||||
new UIComboBoxEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Field_Name")) { |
||||
@Override |
||||
protected List<String> items() { |
||||
return fieldList; |
||||
} |
||||
}, |
||||
new UITextFieldEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), |
||||
new CalculateComboBoxEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Summary_Method")) |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected Object[] createLine() { |
||||
return new String[]{StringUtils.EMPTY, StringUtils.EMPTY, Toolkit.i18nText("Fine-Design_Chart_Use_None")}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,168 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.gui.ilable.BoldFontTextLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.general.IOUtils; |
||||
|
||||
import javax.swing.BoxLayout; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.awt.FlowLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* Created by shine on 2019/4/10. |
||||
* 一列组件<T extends JComponent> 可增可删,通过JComponent后面的加减button增删。 |
||||
*/ |
||||
public abstract class AbstractMultiComponentPane<T extends JComponent> extends JPanel { |
||||
private static final int COM_W = 96; |
||||
private static final int H = 20; |
||||
private static final int ICON_W = 20; |
||||
|
||||
private JPanel boxPane; |
||||
private UIButton addButton; |
||||
|
||||
private T firstFieldComponent; |
||||
|
||||
private List<T> categoryComponentList = new ArrayList<T>(); |
||||
|
||||
|
||||
protected abstract T createFirstFieldComponent(); |
||||
|
||||
protected abstract T createOtherFieldComponent(); |
||||
|
||||
protected abstract void populateField(T component, ColumnField field); |
||||
|
||||
protected abstract void updateField(T component, ColumnField field); |
||||
|
||||
public AbstractMultiComponentPane() { |
||||
|
||||
UILabel label = new BoldFontTextLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Category")); |
||||
label.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); |
||||
|
||||
firstFieldComponent = createFirstFieldComponent(); |
||||
firstFieldComponent.setPreferredSize(new Dimension(COM_W, H)); |
||||
|
||||
addButton = new UIButton(IOUtils.readIcon("/com/fr/design/images/buttonicon/add.png")); |
||||
addButton.setPreferredSize(new Dimension(ICON_W, H)); |
||||
addButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
if (canAdd()) { |
||||
addNewComboBox(); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
final JPanel panel = new JPanel(); |
||||
panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); |
||||
|
||||
panel.add(label); |
||||
panel.add(firstFieldComponent); |
||||
panel.add(addButton); |
||||
|
||||
boxPane = new JPanel(); |
||||
boxPane.setLayout(new BoxLayout(boxPane, BoxLayout.Y_AXIS)); |
||||
|
||||
this.setLayout(new BorderLayout(4, 0)); |
||||
this.add(panel, BorderLayout.NORTH); |
||||
this.add(boxPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private JPanel addComboBoxAndButtonToBox(T uiComboBox, UIButton uiButton) { |
||||
final JPanel panel = new JPanel(); |
||||
panel.setLayout(new FlowLayout(FlowLayout.RIGHT, 0, 2)); |
||||
|
||||
panel.add(uiComboBox); |
||||
panel.add(uiButton); |
||||
|
||||
boxPane.add(panel); |
||||
categoryComponentList.add(uiComboBox); |
||||
|
||||
return panel; |
||||
} |
||||
|
||||
private void addNewComboBox() { |
||||
final T comboBox = createOtherFieldComponent(); |
||||
comboBox.setPreferredSize(new Dimension(COM_W, H)); |
||||
|
||||
UIButton delButton = new UIButton(IOUtils.readIcon("com/fr/design/images/toolbarbtn/close.png")); |
||||
delButton.setPreferredSize(new Dimension(ICON_W, H)); |
||||
|
||||
final JPanel panel = addComboBoxAndButtonToBox(comboBox, delButton); |
||||
|
||||
delButton.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
boxPane.remove(panel); |
||||
categoryComponentList.remove(comboBox); |
||||
checkAddButton(); |
||||
relayoutPane(); |
||||
} |
||||
}); |
||||
|
||||
relayoutPane(); |
||||
checkAddButton(); |
||||
} |
||||
|
||||
private void relayoutPane() { |
||||
this.revalidate(); |
||||
} |
||||
|
||||
private void checkAddButton() { |
||||
addButton.setEnabled(canAdd()); |
||||
} |
||||
|
||||
private boolean canAdd() { |
||||
return categoryComponentList.size() < 3; |
||||
} |
||||
|
||||
public List<T> componentList() { |
||||
List<T> list = new ArrayList<>(categoryComponentList); |
||||
list.add(firstFieldComponent); |
||||
return list; |
||||
} |
||||
|
||||
public void populate(List<ColumnField> categoryList) { |
||||
int comboBoxSize = categoryComponentList.size(), |
||||
len = categoryList.size(); |
||||
|
||||
if (len > 0) { |
||||
populateField(firstFieldComponent, categoryList.get(0)); |
||||
} |
||||
|
||||
for (int i = 1; i < len; i++) { |
||||
if (i > comboBoxSize) { |
||||
addNewComboBox(); |
||||
} |
||||
T comboBox = categoryComponentList.get(i - 1); |
||||
populateField(comboBox, categoryList.get(i)); |
||||
} |
||||
|
||||
checkAddButton(); |
||||
relayoutPane(); |
||||
} |
||||
|
||||
public void update(List<ColumnField> categoryList) { |
||||
categoryList.clear(); |
||||
|
||||
ColumnField temp1 = new ColumnField(); |
||||
categoryList.add(temp1); |
||||
updateField(firstFieldComponent, temp1); |
||||
|
||||
for (T comboBox : categoryComponentList) { |
||||
ColumnField temp = new ColumnField(); |
||||
categoryList.add(temp); |
||||
updateField(comboBox, temp); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,150 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.ispinner.UISpinner; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
|
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
* 一列组件<T extends JComponent> 可增可删,通过UISpinner增删。 |
||||
*/ |
||||
public abstract class AbstractMultiComponentPaneWithUISpinner<T extends JComponent> extends JPanel { |
||||
|
||||
private UISpinner levelNumSpinner; |
||||
|
||||
private List<T> levelComponentList = new ArrayList<T>(); |
||||
|
||||
private JPanel levelPane; |
||||
|
||||
private int currentNum = 3; |
||||
|
||||
public AbstractMultiComponentPaneWithUISpinner() { |
||||
initComps(); |
||||
} |
||||
|
||||
public List<T> getComponentList() { |
||||
return levelComponentList; |
||||
} |
||||
|
||||
protected abstract T createJComponent(); |
||||
|
||||
protected abstract void populateField(T component, ColumnField field); |
||||
|
||||
protected abstract void updateField(T component, ColumnField field); |
||||
|
||||
protected void initComps() { |
||||
|
||||
this.setLayout(new BorderLayout(0, 6)); |
||||
|
||||
levelNumSpinner = new UISpinner(1, 15, 1, currentNum) { |
||||
@Override |
||||
protected void fireStateChanged() { |
||||
//先处理自身的空间布局
|
||||
refreshLevelPane(); |
||||
//然后更新数据
|
||||
super.fireStateChanged(); |
||||
} |
||||
|
||||
@Override |
||||
public void setTextFieldValue(double value) { |
||||
//如果为0,则没有改变值
|
||||
if (value == 0) { |
||||
return; |
||||
} |
||||
super.setTextFieldValue(value); |
||||
} |
||||
}; |
||||
|
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level_Number")), levelNumSpinner}, |
||||
}; |
||||
|
||||
JPanel northPane = TableLayoutHelper.createGapTableLayoutPane(components, new double[]{TableLayout.PREFERRED}, new double[]{ChartDataPane.LABEL_WIDTH, 122}, 0, 6); |
||||
|
||||
this.add(northPane, BorderLayout.NORTH); |
||||
|
||||
initLevelPane(); |
||||
} |
||||
|
||||
private void initLevelPane() { |
||||
double[] rows = new double[currentNum]; |
||||
|
||||
Component[][] components = new Component[currentNum][2]; |
||||
|
||||
List<T> newList = new ArrayList<T>(); |
||||
|
||||
int maxSize = levelComponentList.size(); |
||||
for (int i = 0; i < currentNum; i++) { |
||||
rows[i] = TableLayout.PREFERRED; |
||||
T component = i < maxSize ? levelComponentList.get(i) : createJComponent(); |
||||
newList.add(component); |
||||
|
||||
components[i] = new Component[]{ |
||||
new UILabel(Toolkit.i18nText("Fine-Design_Chart_Level") + String.valueOf(i + 1)), |
||||
component |
||||
}; |
||||
} |
||||
|
||||
levelComponentList = newList; |
||||
|
||||
levelPane = TableLayoutHelper.createGapTableLayoutPane(components, rows, new double[]{ChartDataPane.LABEL_WIDTH, 122}, 0, 6); |
||||
|
||||
this.add(levelPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private void refreshLevelPane() { |
||||
if (levelNumSpinner == null) { |
||||
return; |
||||
} |
||||
|
||||
int newNum = (int) levelNumSpinner.getValue(); |
||||
|
||||
if (newNum != currentNum) { |
||||
currentNum = newNum; |
||||
this.remove(levelPane); |
||||
this.initLevelPane(); |
||||
} |
||||
|
||||
refreshPane(); |
||||
} |
||||
|
||||
private void refreshPane() { |
||||
this.validate(); |
||||
this.repaint(); |
||||
this.revalidate(); |
||||
} |
||||
|
||||
public void populate(List<ColumnField> categoryList) { |
||||
int len = categoryList.size(); |
||||
levelNumSpinner.setValue(len); |
||||
|
||||
refreshLevelPane(); |
||||
|
||||
for (int i = 0; i < len; i++) { |
||||
ColumnField columnField = categoryList.get(i); |
||||
T component = levelComponentList.get(i); |
||||
populateField(component, columnField); |
||||
} |
||||
} |
||||
|
||||
public void update(List<ColumnField> categoryList) { |
||||
categoryList.clear(); |
||||
|
||||
for (T comboBox : levelComponentList) { |
||||
ColumnField temp = new ColumnField(); |
||||
categoryList.add(temp); |
||||
updateField(comboBox, temp); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,171 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.base.Utils; |
||||
import com.fr.chartx.data.field.DataFilterProperties; |
||||
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; |
||||
import com.fr.design.gui.icheckbox.UICheckBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.mainframe.chart.gui.data.PresentComboBox; |
||||
import com.fr.design.mainframe.chart.gui.style.AbstractChartTabPane; |
||||
import com.fr.van.chart.designer.TableLayout4VanChartHelper; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
|
||||
/** |
||||
* Created by shine on 2019/07/18. |
||||
*/ |
||||
public abstract class AbstractSingleFilterPane extends AbstractChartTabPane<DataFilterProperties> { |
||||
|
||||
private static final int FIL_HEIGHT = 150; |
||||
|
||||
private UICheckBox useTopCheckBox; |
||||
|
||||
private UITextField topNumTextField; |
||||
private UICheckBox hideNullCheckBox; |
||||
private UICheckBox mergeOtherCheckBox; |
||||
|
||||
private PresentComboBox present; |
||||
|
||||
private AbstractAttrNoScrollPane parent; |
||||
|
||||
private JPanel topPane; |
||||
|
||||
public AbstractSingleFilterPane() { |
||||
super(true); |
||||
//todo@shinerefactor present的时候这边可以整理下
|
||||
// this.parent = parent;
|
||||
} |
||||
|
||||
@Override |
||||
public Dimension getPreferredSize() { |
||||
Dimension dim = super.getPreferredSize(); |
||||
dim.height = FIL_HEIGHT; |
||||
return dim; |
||||
} |
||||
|
||||
|
||||
protected void layoutContentPane() { |
||||
super.layoutContentPane(); |
||||
leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); |
||||
} |
||||
|
||||
public void reloaPane(JPanel pane) { |
||||
super.reloaPane(pane); |
||||
leftcontentPane.setBorder(BorderFactory.createEmptyBorder()); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
this.setLayout(new BorderLayout()); |
||||
JPanel pane = initPane(); |
||||
this.add(pane, BorderLayout.NORTH); |
||||
return pane; |
||||
} |
||||
|
||||
|
||||
private JPanel initPane() { |
||||
useTopCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Only_Use_Before_Records")); |
||||
JPanel panel1 = new JPanel(new BorderLayout()); |
||||
JPanel panel2 = new JPanel(new BorderLayout()); |
||||
panel1.add(useTopCheckBox, BorderLayout.NORTH); |
||||
topNumTextField = new UITextField(); |
||||
UILabel label = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Records_Num")); |
||||
mergeOtherCheckBox = new UICheckBox(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_CombineOther")); |
||||
mergeOtherCheckBox.setSelected(true); |
||||
double p = TableLayout.PREFERRED; |
||||
double f = TableLayout.FILL; |
||||
double[] columnSize = {p, f}; |
||||
double[] rowSize = {p, p}; |
||||
Component[][] components = new Component[][]{ |
||||
new Component[]{label, topNumTextField}, |
||||
new Component[]{mergeOtherCheckBox, null} |
||||
}; |
||||
|
||||
topPane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, rowSize, columnSize); |
||||
topPane.setBorder(BorderFactory.createEmptyBorder(10, 15, 0, 0)); |
||||
//默认不显示
|
||||
topPane.setVisible(false); |
||||
panel1.add(topPane, BorderLayout.CENTER); |
||||
hideNullCheckBox = new UICheckBox(title4PopupWindow() + " is null, hidden"); |
||||
panel2.add(hideNullCheckBox, BorderLayout.NORTH); |
||||
|
||||
useTopCheckBox.addChangeListener(new ChangeListener() { |
||||
public void stateChanged(ChangeEvent e) { |
||||
checkBoxUse(); |
||||
} |
||||
}); |
||||
|
||||
present = new PresentComboBox() { |
||||
protected void fireChange() { |
||||
fire(); |
||||
} |
||||
}; |
||||
JPanel presentPane = TableLayout4VanChartHelper.createGapTableLayoutPane(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Present"), present); |
||||
panel2.add(presentPane, BorderLayout.SOUTH); |
||||
|
||||
double[] column = {f}; |
||||
double[] row = {p, p}; |
||||
Component[][] coms = new Component[][]{ |
||||
new Component[]{panel1}, |
||||
new Component[]{panel2} |
||||
}; |
||||
return TableLayout4VanChartHelper.createGapTableLayoutPane(coms, row, column); |
||||
} |
||||
|
||||
|
||||
private void fire() { |
||||
if (this.parent != null) { |
||||
parent.attributeChanged(); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 检查Box是否可用 |
||||
*/ |
||||
public void checkBoxUse() { |
||||
topPane.setVisible(useTopCheckBox.isSelected()); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(DataFilterProperties ob) { |
||||
useTopCheckBox.setSelected(ob.isUseTop()); |
||||
|
||||
topNumTextField.setText(String.valueOf(ob.getTop())); |
||||
|
||||
hideNullCheckBox.setSelected(ob.isHideNull()); |
||||
|
||||
mergeOtherCheckBox.setSelected(ob.isMerge()); |
||||
|
||||
present.populate(ob.getPresent()); |
||||
|
||||
checkBoxUse(); |
||||
} |
||||
|
||||
@Override |
||||
public DataFilterProperties updateBean() { |
||||
DataFilterProperties dataFilterProperties = new DataFilterProperties(); |
||||
|
||||
dataFilterProperties.setUseTop(useTopCheckBox.isSelected()); |
||||
|
||||
Number number = Utils.objectToNumber(topNumTextField.getText(), true); |
||||
if (number != null) { |
||||
dataFilterProperties.setTop(number.intValue()); |
||||
} |
||||
dataFilterProperties.setHideNull(hideNullCheckBox.isSelected()); |
||||
|
||||
dataFilterProperties.setMerge(mergeOtherCheckBox.isSelected()); |
||||
|
||||
dataFilterProperties.setPresent(present.update()); |
||||
|
||||
return dataFilterProperties; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; |
||||
import com.fr.chartx.data.field.SeriesValueField; |
||||
import com.fr.design.chartx.component.correlation.AbstractCorrelationPane; |
||||
import com.fr.design.chartx.component.correlation.FieldEditorComponentWrapper; |
||||
import com.fr.design.chartx.component.correlation.TinyFormulaPaneEditorComponent; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.general.GeneralUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/4. |
||||
*/ |
||||
public class CellDataSeriesValueCorrelationPane extends AbstractCorrelationPane<SeriesValueCorrelationDefinition> { |
||||
|
||||
@Override |
||||
protected FieldEditorComponentWrapper[] createFieldEditorComponentWrappers() { |
||||
return new FieldEditorComponentWrapper[]{ |
||||
new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Name")), |
||||
new TinyFormulaPaneEditorComponent(Toolkit.i18nText("Fine-Design_Chart_Series_Value")) |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected List<Object[]> covertTBeanToTableModelList(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { |
||||
List<Object[]> result = new ArrayList<Object[]>(); |
||||
|
||||
List<SeriesValueField> seriesValueFieldList = seriesValueCorrelationDefinition.getSeriesValueFieldList(); |
||||
for (SeriesValueField seriesValueField : seriesValueFieldList) { |
||||
Object[] array = new Object[]{seriesValueField.getSeries().getFieldName(), seriesValueField.getValue().getFieldName()}; |
||||
result.add(array); |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
protected void setTableModelListToTBean(List<Object[]> tableValues, SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { |
||||
List<SeriesValueField> seriesValueFieldList = new ArrayList<SeriesValueField>(); |
||||
|
||||
for (Object[] oneLine : tableValues) { |
||||
SeriesValueField seriesValueField = new SeriesValueField(); |
||||
ColumnField series = new ColumnField(GeneralUtils.objectToString(oneLine[0])); |
||||
ColumnField value = new ColumnField(GeneralUtils.objectToString(oneLine[1])); |
||||
seriesValueField.setSeries(series); |
||||
seriesValueField.setValue(value); |
||||
seriesValueFieldList.add(seriesValueField); |
||||
} |
||||
|
||||
seriesValueCorrelationDefinition.setSeriesValueFieldList(seriesValueFieldList); |
||||
} |
||||
} |
@ -0,0 +1,40 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.extended.chart.UIComboBoxWithNone; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/4/12. |
||||
*/ |
||||
public class MultiComboBoxPane extends AbstractMultiComponentPane<UIComboBox> { |
||||
private List currentBoxItems = new ArrayList(); |
||||
|
||||
public void setCurrentBoxItems(List currentBoxItems) { |
||||
this.currentBoxItems = currentBoxItems; |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox createFirstFieldComponent() { |
||||
return new UIComboBoxWithNone(); |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox createOtherFieldComponent() { |
||||
return new UIComboBox(currentBoxItems.toArray(new Object[currentBoxItems.size()])); |
||||
} |
||||
|
||||
@Override |
||||
protected void populateField(UIComboBox component, ColumnField field) { |
||||
AbstractDataSetFieldsPane.populateField(component, field); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateField(UIComboBox component, ColumnField field) { |
||||
AbstractDataSetFieldsPane.updateField(component, field); |
||||
} |
||||
} |
@ -0,0 +1,40 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class MultiComboBoxPaneWithUISpinner extends AbstractMultiComponentPaneWithUISpinner<UIComboBox> { |
||||
private List currentBoxList = new ArrayList(); |
||||
|
||||
@Override |
||||
protected void initComps() { |
||||
currentBoxList = new ArrayList(); |
||||
super.initComps(); |
||||
} |
||||
|
||||
public void setCurrentBoxList(List currentBoxList) { |
||||
this.currentBoxList = currentBoxList; |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox createJComponent() { |
||||
return new UIComboBox(currentBoxList.toArray(new Object[currentBoxList.size()])); |
||||
} |
||||
|
||||
@Override |
||||
protected void populateField(UIComboBox component, ColumnField field) { |
||||
AbstractDataSetFieldsPane.populateField(component, field); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateField(UIComboBox component, ColumnField field) { |
||||
AbstractDataSetFieldsPane.updateField(component, field); |
||||
} |
||||
} |
@ -0,0 +1,31 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
|
||||
/** |
||||
* Created by shine on 2019/4/12. |
||||
*/ |
||||
public class MultiTinyFormulaPane extends AbstractMultiComponentPane<TinyFormulaPane> { |
||||
@Override |
||||
protected TinyFormulaPane createFirstFieldComponent() { |
||||
return new TinyFormulaPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected TinyFormulaPane createOtherFieldComponent() { |
||||
return new TinyFormulaPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected void populateField(TinyFormulaPane component, ColumnField field) { |
||||
AbstractCellDataFieldsPane.populateField(component, field); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateField(TinyFormulaPane component, ColumnField field) { |
||||
AbstractCellDataFieldsPane.updateField(component, field); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,25 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/19. |
||||
*/ |
||||
public class MultiTinyFormulaPaneWithUISpinner extends AbstractMultiComponentPaneWithUISpinner<TinyFormulaPane> { |
||||
@Override |
||||
protected TinyFormulaPane createJComponent() { |
||||
return new TinyFormulaPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected void populateField(TinyFormulaPane component, ColumnField field) { |
||||
AbstractCellDataFieldsPane.populateField(component, field); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateField(TinyFormulaPane component, ColumnField field) { |
||||
AbstractCellDataFieldsPane.updateField(component, field); |
||||
} |
||||
} |
@ -0,0 +1,107 @@
|
||||
package com.fr.design.chartx.component; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; |
||||
import com.fr.chartx.data.field.SeriesValueField; |
||||
import com.fr.data.util.function.AbstractDataFunction; |
||||
import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; |
||||
import com.fr.general.GeneralUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/17. |
||||
*/ |
||||
public class SeriesValueFieldComboBoxPane extends AbstractCustomFieldComboBoxPane<SeriesValueCorrelationDefinition> { |
||||
|
||||
@Override |
||||
protected AbstractUseFieldValuePane createUseFieldValuePane() { |
||||
return new UseFieldValuePane(); |
||||
} |
||||
|
||||
@Override |
||||
protected AbstractCustomFieldNamePane createCustomFieldNamePane() { |
||||
return new CustomFieldNamePane(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(SeriesValueCorrelationDefinition ob) { |
||||
if (ob.isCustomFieldValue()) { |
||||
populateCustomFieldNamePane(ob); |
||||
jcb.setSelectedIndex(1); |
||||
} else { |
||||
populateUseFieldValuePane(ob); |
||||
jcb.setSelectedIndex(0); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(SeriesValueCorrelationDefinition ob) { |
||||
if (jcb.getSelectedIndex() == 0) { |
||||
ob.setCustomFieldValue(false); |
||||
updateUseFieldValuePane(ob); |
||||
} else { |
||||
ob.setCustomFieldValue(true); |
||||
updateCustomFieldNamePane(ob); |
||||
} |
||||
} |
||||
|
||||
private class UseFieldValuePane extends AbstractUseFieldValuePane { |
||||
|
||||
@Override |
||||
public void populateBean(SeriesValueCorrelationDefinition ob) { |
||||
List<SeriesValueField> list = ob.getSeriesValueFieldList(); |
||||
if (list != null && list.size() > 0) { |
||||
populateSeries(list.get(0).getSeries().getFieldName()); |
||||
populateValue(list.get(0).getValue().getFieldName()); |
||||
populateFunction((AbstractDataFunction) list.get(0).getValue().getDataFunction()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(SeriesValueCorrelationDefinition ob) { |
||||
List<SeriesValueField> list = new ArrayList<SeriesValueField>(); |
||||
SeriesValueField seriesValueField = new SeriesValueField(); |
||||
ColumnField series = new ColumnField(updateSeries()); |
||||
ColumnField value = new ColumnField(updateValue()); |
||||
value.setDataFunction(updateFunction()); |
||||
seriesValueField.setValue(value); |
||||
seriesValueField.setSeries(series); |
||||
list.add(seriesValueField); |
||||
ob.setSeriesValueFieldList(list); |
||||
} |
||||
} |
||||
|
||||
private class CustomFieldNamePane extends AbstractCustomFieldNamePane { |
||||
@Override |
||||
protected List<Object[]> covertTBeanToTableModelList(SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { |
||||
List<Object[]> list = new ArrayList<Object[]>(); |
||||
for (SeriesValueField seriesValueField : seriesValueCorrelationDefinition.getSeriesValueFieldList()) { |
||||
Object[] array = new Object[]{ |
||||
seriesValueField.getValue().getFieldName(), |
||||
seriesValueField.getSeries().getFieldName(), |
||||
DataPaneHelper.getFunctionString(seriesValueField.getValue().getDataFunction()) |
||||
}; |
||||
list.add(array); |
||||
} |
||||
return list; |
||||
} |
||||
|
||||
@Override |
||||
protected void setTableModelListToTBean(List<Object[]> tableValues, SeriesValueCorrelationDefinition seriesValueCorrelationDefinition) { |
||||
List<SeriesValueField> seriesValueFields = new ArrayList<SeriesValueField>(); |
||||
for (Object[] line : tableValues) { |
||||
ColumnField value = new ColumnField(GeneralUtils.objectToString(line[0])); |
||||
ColumnField series = new ColumnField(GeneralUtils.objectToString(line[1])); |
||||
value.setDataFunction(DataPaneHelper.getFunctionByName(GeneralUtils.objectToString(line[2]))); |
||||
SeriesValueField seriesValueField = new SeriesValueField(); |
||||
seriesValueField.setValue(value); |
||||
seriesValueField.setSeries(series); |
||||
seriesValueFields.add(seriesValueField); |
||||
} |
||||
seriesValueCorrelationDefinition.setSeriesValueFieldList(seriesValueFields); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,130 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
import com.fr.design.gui.itable.UITable; |
||||
import com.fr.design.gui.itable.UITableEditor; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.JTable; |
||||
import javax.swing.event.ChangeEvent; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/4. |
||||
* 自定义editorComponent + 支持多种数据格式 |
||||
*/ |
||||
public abstract class AbstractCorrelationPane<T> extends BasicBeanPane<T> { |
||||
private FieldEditorComponentWrapper[] editorComponents; |
||||
|
||||
private UICorrelationPane correlationPane; |
||||
|
||||
public AbstractCorrelationPane() { |
||||
|
||||
this.editorComponents = createFieldEditorComponentWrappers(); |
||||
|
||||
String[] headers = new String[editorComponents.length]; |
||||
|
||||
for (int i = 0, len = editorComponents.length; i < len; i++) { |
||||
headers[i] = editorComponents[i].headerName(); |
||||
} |
||||
|
||||
initComps(headers); |
||||
} |
||||
|
||||
protected abstract FieldEditorComponentWrapper[] createFieldEditorComponentWrappers(); |
||||
|
||||
@Override |
||||
public void populateBean(T ob) { |
||||
correlationPane.populateBean(covertTBeanToTableModelList(ob)); |
||||
} |
||||
|
||||
@Override |
||||
public void updateBean(T ob) { |
||||
setTableModelListToTBean(correlationPane.updateBean(), ob); |
||||
} |
||||
|
||||
@Override |
||||
public T updateBean() { |
||||
return null; |
||||
} |
||||
|
||||
protected abstract List<Object[]> covertTBeanToTableModelList(T t); |
||||
|
||||
protected abstract void setTableModelListToTBean(List<Object[]> tableValues, T t); |
||||
|
||||
private void initComps(String[] headers) { |
||||
correlationPane = new UICorrelationPane(headers) { |
||||
public UITableEditor createUITableEditor() { |
||||
return new Editor(); |
||||
} |
||||
|
||||
protected UITable initUITable() { |
||||
return new UITable(columnCount) { |
||||
|
||||
public UITableEditor createTableEditor() { |
||||
return createUITableEditor(); |
||||
} |
||||
|
||||
public void tableCellEditingStopped(ChangeEvent e) { |
||||
stopPaneEditing(e); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
protected ActionListener getAddButtonListener() { |
||||
return new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
tablePane.addLine(createLine()); |
||||
fireTargetChanged(); |
||||
} |
||||
}; |
||||
} |
||||
}; |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(correlationPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
protected Object[] createLine() { |
||||
return new Object[this.editorComponents.length]; |
||||
} |
||||
|
||||
|
||||
private class Editor extends UITableEditor { |
||||
|
||||
private Component currentComponent; |
||||
private FieldEditorComponentWrapper currentEditorWrapper; |
||||
|
||||
public Object getCellEditorValue() { |
||||
return currentEditorWrapper.getValue(currentComponent); |
||||
} |
||||
|
||||
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { |
||||
if (column == table.getModel().getColumnCount()) { |
||||
return null; |
||||
} |
||||
|
||||
correlationPane.stopCellEditing(); |
||||
|
||||
currentEditorWrapper = AbstractCorrelationPane.this.editorComponents[column]; |
||||
|
||||
currentComponent = currentEditorWrapper.getTableCellEditorComponent(correlationPane, table, isSelected, row, column); |
||||
currentEditorWrapper.setValue(currentComponent, value); |
||||
|
||||
return currentComponent; |
||||
} |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,19 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/10. |
||||
*/ |
||||
public abstract class AbstractEditorComponent<T extends Component> implements FieldEditorComponentWrapper<T> { |
||||
private String header; |
||||
|
||||
public AbstractEditorComponent(String header) { |
||||
this.header = header; |
||||
} |
||||
|
||||
@Override |
||||
public String headerName() { |
||||
return this.header; |
||||
} |
||||
} |
@ -0,0 +1,45 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; |
||||
|
||||
import javax.swing.JTable; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/10. |
||||
*/ |
||||
public class CalculateComboBoxEditorComponent extends AbstractEditorComponent<CalculateComboBox> { |
||||
|
||||
public CalculateComboBoxEditorComponent(String header) { |
||||
super(header); |
||||
} |
||||
|
||||
@Override |
||||
public CalculateComboBox getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, int row, int column) { |
||||
|
||||
CalculateComboBox calculateComboBox = new CalculateComboBox(); |
||||
|
||||
calculateComboBox.addItemListener(new ItemListener() { |
||||
public void itemStateChanged(ItemEvent e) { |
||||
parent.stopCellEditing(); |
||||
parent.fireTargetChanged(); |
||||
} |
||||
}); |
||||
return calculateComboBox; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValue(CalculateComboBox calculateComboBox) { |
||||
return calculateComboBox.getSelectedItem(); |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(CalculateComboBox calculateComboBox, Object o) { |
||||
|
||||
if (o != null) { |
||||
calculateComboBox.setSelectedItem(o); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
|
||||
import javax.swing.JTable; |
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/4. |
||||
*/ |
||||
public interface FieldEditorComponentWrapper<T extends Component> { |
||||
|
||||
String headerName(); |
||||
|
||||
T getTableCellEditorComponent(UICorrelationPane parent, JTable table, boolean isSelected, final int row, int column); |
||||
|
||||
Object getValue(T t); |
||||
|
||||
void setValue(T t, Object o); |
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.base.BaseFormula; |
||||
import com.fr.base.Utils; |
||||
import com.fr.design.constants.UIConstants; |
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
|
||||
import javax.swing.JTable; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/4. |
||||
*/ |
||||
public class TinyFormulaPaneEditorComponent extends AbstractEditorComponent<TinyFormulaPane> { |
||||
|
||||
public TinyFormulaPaneEditorComponent(String header) { |
||||
super(header); |
||||
} |
||||
|
||||
@Override |
||||
public TinyFormulaPane getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, final int row, int column) { |
||||
TinyFormulaPane editorComponent = new TinyFormulaPane() { |
||||
@Override |
||||
public void okEvent() { |
||||
parent.stopCellEditing(); |
||||
parent.fireTargetChanged(); |
||||
} |
||||
|
||||
@Override |
||||
protected void populateTextField(BaseFormula fm) { |
||||
formulaTextField.setText(fm.getContent()); |
||||
} |
||||
}; |
||||
editorComponent.setBackground(UIConstants.FLESH_BLUE); |
||||
|
||||
editorComponent.getUITextField().registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
parent.fireTargetChanged(); |
||||
} |
||||
}); |
||||
|
||||
return editorComponent; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValue(TinyFormulaPane formulaPane) { |
||||
return formulaPane.getUITextField().getText(); |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(TinyFormulaPane formulaPane, Object o) { |
||||
formulaPane.getUITextField().setText(Utils.objectToString(o)); |
||||
} |
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.itable.UITable; |
||||
|
||||
import javax.swing.JTable; |
||||
import java.awt.event.ItemEvent; |
||||
import java.awt.event.ItemListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/10. |
||||
*/ |
||||
public class UIComboBoxEditorComponent extends AbstractEditorComponent<UIComboBox> { |
||||
|
||||
public UIComboBoxEditorComponent(String header) { |
||||
super(header); |
||||
} |
||||
|
||||
protected List<String> items() { |
||||
return new ArrayList<String>(); |
||||
} |
||||
|
||||
@Override |
||||
public UIComboBox getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, final int row, int column) { |
||||
UIComboBox uiComboBox = new UIComboBox(items().toArray()); |
||||
|
||||
uiComboBox.addItemListener(new ItemListener() { |
||||
public void itemStateChanged(ItemEvent e) { |
||||
parent.stopCellEditing(); |
||||
parent.fireTargetChanged(); |
||||
UITable table = parent.getTable(); |
||||
Object object = table.getValueAt(row, 0); |
||||
if (object != null) { |
||||
table.setValueAt(object, row, 1); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
return uiComboBox; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Object getValue(UIComboBox uiComboBox) { |
||||
return uiComboBox.getSelectedItem(); |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(UIComboBox uiComboBox, Object o) { |
||||
uiComboBox.getModel().setSelectedItem(o); |
||||
} |
||||
} |
@ -0,0 +1,41 @@
|
||||
package com.fr.design.chartx.component.correlation; |
||||
|
||||
import com.fr.design.event.UIObserverListener; |
||||
import com.fr.design.gui.frpane.UICorrelationPane; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.general.GeneralUtils; |
||||
|
||||
import javax.swing.JTable; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/10. |
||||
*/ |
||||
public class UITextFieldEditorComponent extends AbstractEditorComponent<UITextField> { |
||||
public UITextFieldEditorComponent(String header) { |
||||
super(header); |
||||
} |
||||
|
||||
@Override |
||||
public UITextField getTableCellEditorComponent(final UICorrelationPane parent, JTable table, boolean isSelected, int row, int column) { |
||||
UITextField uiTextField = new UITextField(); |
||||
|
||||
uiTextField.registerChangeListener(new UIObserverListener() { |
||||
@Override |
||||
public void doChange() { |
||||
parent.fireTargetChanged(); |
||||
} |
||||
}); |
||||
|
||||
return uiTextField; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValue(UITextField uiTextField) { |
||||
return uiTextField.getText(); |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(UITextField uiTextField, Object o) { |
||||
uiTextField.setText(GeneralUtils.objectToString(o)); |
||||
} |
||||
} |
@ -0,0 +1,97 @@
|
||||
package com.fr.design.chartx.fields; |
||||
|
||||
import com.fr.chartx.data.field.AbstractColumnFieldCollection; |
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.util.Arrays; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/16. |
||||
* 单元格数据源 具体有哪些字段的一个抽象pane |
||||
*/ |
||||
public abstract class AbstractCellDataFieldsPane<T extends AbstractColumnFieldCollection> extends BasicBeanPane<T> { |
||||
|
||||
public AbstractCellDataFieldsPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
|
||||
this.setLayout(new BorderLayout(0, 6)); |
||||
|
||||
this.add(createNorthPane(), BorderLayout.NORTH); |
||||
this.add(createCenterPane(), BorderLayout.CENTER); |
||||
this.add(createSouthPane(), BorderLayout.SOUTH); |
||||
|
||||
this.setBorder(BorderFactory.createEmptyBorder(0, 15, 0, 8)); |
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
String[] labels = fieldLabels(); |
||||
Component[] formulaPanes = fieldComponents(); |
||||
|
||||
int len = Math.min(labels.length, formulaPanes.length); |
||||
|
||||
if (len == 0) { |
||||
return null; |
||||
} |
||||
|
||||
Component[][] components = new Component[len][2]; |
||||
for (int i = 0; i < len; i++) { |
||||
components[i] = new Component[]{new UILabel(labels[i], SwingConstants.LEFT), formulaPanes[i]}; |
||||
} |
||||
|
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double[] columnSize = {ChartDataPane.LABEL_WIDTH, 124}; |
||||
double[] rowSize = new double[len]; |
||||
Arrays.fill(rowSize, p); |
||||
|
||||
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); |
||||
} |
||||
|
||||
|
||||
protected JPanel createNorthPane() { |
||||
return new JPanel(); |
||||
} |
||||
|
||||
protected JPanel createSouthPane() { |
||||
return new JPanel(); |
||||
} |
||||
|
||||
protected Component[] fieldComponents() { |
||||
return formulaPanes(); |
||||
} |
||||
|
||||
protected abstract String[] fieldLabels(); |
||||
|
||||
protected abstract TinyFormulaPane[] formulaPanes(); |
||||
|
||||
@Override |
||||
public abstract T updateBean(); |
||||
|
||||
public static void populateField(TinyFormulaPane formulaPane, ColumnField field) { |
||||
formulaPane.populateBean(field.getFieldName()); |
||||
} |
||||
|
||||
public static void updateField(TinyFormulaPane formulaPane, ColumnField field) { |
||||
field.setFieldName(formulaPane.updateBean()); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
} |
@ -0,0 +1,149 @@
|
||||
package com.fr.design.chartx.fields; |
||||
|
||||
import com.fr.chartx.data.field.AbstractColumnFieldCollection; |
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.data.util.function.AbstractDataFunction; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.layout.TableLayout; |
||||
import com.fr.design.layout.TableLayoutHelper; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; |
||||
import com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper; |
||||
import com.fr.general.GeneralUtils; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingConstants; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.util.Arrays; |
||||
import java.util.List; |
||||
|
||||
import static com.fr.design.mainframe.chart.gui.data.table.DataPaneHelper.refreshBoxItems; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/16. |
||||
* 数据集数据源 具体有哪些字段的一个抽象pane |
||||
*/ |
||||
public abstract class AbstractDataSetFieldsPane<T extends AbstractColumnFieldCollection> extends BasicBeanPane<T> { |
||||
|
||||
public AbstractDataSetFieldsPane() { |
||||
initComponents(); |
||||
} |
||||
|
||||
protected void initComponents() { |
||||
|
||||
this.setLayout(new BorderLayout(0, 4)); |
||||
this.setBorder(BorderFactory.createEmptyBorder(2, 24, 0, 15)); |
||||
|
||||
JPanel north = createNorthPane(), |
||||
center = createCenterPane(), |
||||
south = createSouthPane(); |
||||
|
||||
if (north != null) { |
||||
this.add(north, BorderLayout.NORTH); |
||||
} |
||||
|
||||
if (center != null) { |
||||
this.add(center, BorderLayout.CENTER); |
||||
} |
||||
|
||||
if (south != null) { |
||||
this.add(south, BorderLayout.SOUTH); |
||||
} |
||||
} |
||||
|
||||
protected JPanel createNorthPane() { |
||||
return null; |
||||
} |
||||
|
||||
protected JPanel createCenterPane() { |
||||
String[] labels = fieldLabels(); |
||||
Component[] fieldComponents = fieldComponents(); |
||||
|
||||
int len = Math.min(labels.length, fieldComponents.length); |
||||
|
||||
if (len == 0) { |
||||
return null; |
||||
} |
||||
|
||||
Component[][] components = new Component[len][2]; |
||||
for (int i = 0; i < len; i++) { |
||||
components[i] = new Component[]{new UILabel(labels[i], SwingConstants.LEFT), fieldComponents[i]}; |
||||
} |
||||
|
||||
double p = TableLayout.PREFERRED; |
||||
double[] columnSize = {ChartDataPane.LABEL_WIDTH, 122}; |
||||
double[] rowSize = new double[len]; |
||||
Arrays.fill(rowSize, p); |
||||
|
||||
return TableLayoutHelper.createGapTableLayoutPane(components, rowSize, columnSize, 0, 6); |
||||
} |
||||
|
||||
protected JPanel createSouthPane() { |
||||
return null; |
||||
} |
||||
|
||||
protected Component[] fieldComponents() { |
||||
return filedComboBoxes(); |
||||
} |
||||
|
||||
protected abstract String[] fieldLabels(); |
||||
|
||||
protected abstract UIComboBox[] filedComboBoxes(); |
||||
|
||||
public void checkBoxUse(boolean hasUse) { |
||||
for (Component component : fieldComponents()) { |
||||
component.setEnabled(hasUse); |
||||
} |
||||
} |
||||
|
||||
public void clearAllBoxList() { |
||||
for (UIComboBox comboBox : filedComboBoxes()) { |
||||
DataPaneHelper.clearBoxItems(comboBox); |
||||
} |
||||
} |
||||
|
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
for (UIComboBox comboBox : filedComboBoxes()) { |
||||
refreshBoxItems(comboBox, columnNameList); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public abstract T updateBean(); |
||||
|
||||
public static void populateField(UIComboBox comboBox, ColumnField field) { |
||||
populateFunctionField(comboBox, null, field); |
||||
} |
||||
|
||||
public static void updateField(UIComboBox comboBox, ColumnField field) { |
||||
updateFunctionField(comboBox, null, field); |
||||
} |
||||
|
||||
protected static void populateFunctionField(UIComboBox comboBox, CalculateComboBox calculateComboBox, ColumnField field) { |
||||
comboBox.setSelectedItem(field.getFieldName()); |
||||
if (calculateComboBox != null) { |
||||
calculateComboBox.populateBean((AbstractDataFunction) field.getDataFunction()); |
||||
} |
||||
} |
||||
|
||||
protected static void updateFunctionField(UIComboBox comboBox, CalculateComboBox calculateComboBox, ColumnField field) { |
||||
field.setFieldName(GeneralUtils.objectToString(comboBox.getSelectedItem())); |
||||
if (calculateComboBox != null) { |
||||
field.setDataFunction(calculateComboBox.updateBean()); |
||||
} else { |
||||
field.setDataFunction(null); |
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return StringUtils.EMPTY; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,41 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithSeriesValue; |
||||
import com.fr.design.chartx.component.CellDataSeriesValueCorrelationPane; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/4. |
||||
*/ |
||||
public abstract class AbstractCellDataFieldsWithSeriesValuePane<T extends AbstractColumnFieldCollectionWithSeriesValue> |
||||
extends AbstractCellDataFieldsPane<T> { |
||||
|
||||
private CellDataSeriesValueCorrelationPane seriesValueFieldsPane; |
||||
|
||||
@Override |
||||
protected JPanel createCenterPane() { |
||||
JPanel normalCenter = super.createCenterPane(); |
||||
seriesValueFieldsPane = new CellDataSeriesValueCorrelationPane(); |
||||
|
||||
if (normalCenter != null) { |
||||
JPanel panel = new JPanel(new BorderLayout()); |
||||
panel.add(normalCenter, BorderLayout.CENTER); |
||||
panel.add(seriesValueFieldsPane, BorderLayout.SOUTH); |
||||
return panel; |
||||
} else { |
||||
return seriesValueFieldsPane; |
||||
} |
||||
} |
||||
|
||||
protected void populateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue fieldCollectionWithSeriesValue) { |
||||
seriesValueFieldsPane.populateBean(fieldCollectionWithSeriesValue.getSeriesValueCorrelationDefinition()); |
||||
} |
||||
|
||||
protected void updateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue fieldCollectionWithSeriesValue) { |
||||
seriesValueFieldsPane.updateBean(fieldCollectionWithSeriesValue.getSeriesValueCorrelationDefinition()); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,60 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.AbstractColumnFieldCollectionWithSeriesValue; |
||||
import com.fr.design.chartx.component.SeriesValueFieldComboBoxPane; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/16. |
||||
* 带有 自定义系列名(fr表现为 系列名使用字段名) 的字段集合 的一个pane |
||||
*/ |
||||
public abstract class AbstractDataSetFieldsWithSeriesValuePane<T extends AbstractColumnFieldCollectionWithSeriesValue> |
||||
extends AbstractDataSetFieldsPane<T> { |
||||
|
||||
private SeriesValueFieldComboBoxPane seriesValueFieldComboBoxPane; |
||||
|
||||
@Override |
||||
protected JPanel createCenterPane() { |
||||
JPanel normalCenter = super.createCenterPane(); |
||||
seriesValueFieldComboBoxPane = new SeriesValueFieldComboBoxPane(); |
||||
|
||||
if (normalCenter != null) { |
||||
JPanel panel = new JPanel(new BorderLayout()); |
||||
panel.add(normalCenter, BorderLayout.CENTER); |
||||
panel.add(seriesValueFieldComboBoxPane, BorderLayout.SOUTH); |
||||
return panel; |
||||
} else { |
||||
return seriesValueFieldComboBoxPane; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void checkBoxUse(boolean hasUse) { |
||||
super.checkBoxUse(hasUse); |
||||
seriesValueFieldComboBoxPane.checkBoxUse(hasUse); |
||||
} |
||||
|
||||
@Override |
||||
public void clearAllBoxList() { |
||||
super.clearAllBoxList(); |
||||
seriesValueFieldComboBoxPane.clearAllBoxList(); |
||||
} |
||||
|
||||
@Override |
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
super.refreshBoxListWithSelectTableData(columnNameList); |
||||
seriesValueFieldComboBoxPane.refreshBoxListWithSelectTableData(columnNameList); |
||||
} |
||||
|
||||
protected void populateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue fieldCollectionWithSeriesValue) { |
||||
seriesValueFieldComboBoxPane.populateBean(fieldCollectionWithSeriesValue.getSeriesValueCorrelationDefinition()); |
||||
} |
||||
|
||||
protected void updateSeriesValuePane(AbstractColumnFieldCollectionWithSeriesValue fieldCollectionWithSeriesValue) { |
||||
seriesValueFieldComboBoxPane.updateBean(fieldCollectionWithSeriesValue.getSeriesValueCorrelationDefinition()); |
||||
} |
||||
} |
@ -0,0 +1,115 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; |
||||
import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; |
||||
import com.fr.design.chartx.component.AbstractSingleFilterPane; |
||||
import com.fr.design.chartx.component.MultiTinyFormulaPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.van.chart.map.designer.VanChartGroupPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/4/12. |
||||
*/ |
||||
public class MultiCategoryCellDataFieldsPane extends AbstractCellDataFieldsWithSeriesValuePane<MultiCategoryColumnFieldCollection> { |
||||
|
||||
private MultiTinyFormulaPane multiCategoryPane; |
||||
|
||||
private AbstractSingleFilterPane seriesFilterPane; |
||||
private AbstractSingleFilterPane categoryFilterPane; |
||||
|
||||
private void createMultiFormulaPane() { |
||||
if (multiCategoryPane == null) { |
||||
multiCategoryPane = new MultiTinyFormulaPane(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createNorthPane() { |
||||
|
||||
createMultiFormulaPane(); |
||||
|
||||
return multiCategoryPane; |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createSouthPane() { |
||||
if (seriesFilterPane == null) { |
||||
seriesFilterPane = new AbstractSingleFilterPane() { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
//todo@shinerefactor
|
||||
return "series"; |
||||
} |
||||
}; |
||||
categoryFilterPane = new AbstractSingleFilterPane() { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return "category"; |
||||
} |
||||
}; |
||||
} |
||||
return new VanChartGroupPane(new String[]{seriesFilterPane.title4PopupWindow(), categoryFilterPane.title4PopupWindow()} |
||||
, new JPanel[]{seriesFilterPane, categoryFilterPane}) { |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[0]; |
||||
} |
||||
|
||||
@Override |
||||
protected TinyFormulaPane[] formulaPanes() { |
||||
|
||||
createMultiFormulaPane(); |
||||
|
||||
List<TinyFormulaPane> list = multiCategoryPane.componentList(); |
||||
return list.toArray(new TinyFormulaPane[list.size()]); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MultiCategoryColumnFieldCollection multiCategoryColumnFieldCollection) { |
||||
|
||||
List<ColumnField> categoryList = multiCategoryColumnFieldCollection.getCategoryList(); |
||||
|
||||
multiCategoryPane.populate(categoryList); |
||||
|
||||
populateSeriesValuePane(multiCategoryColumnFieldCollection); |
||||
|
||||
SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = multiCategoryColumnFieldCollection.getSeriesValueCorrelationDefinition(); |
||||
if (seriesValueCorrelationDefinition != null) { |
||||
seriesFilterPane.populateBean(seriesValueCorrelationDefinition.getFilterProperties()); |
||||
|
||||
} |
||||
|
||||
if (categoryList != null && !categoryList.isEmpty()) { |
||||
categoryFilterPane.populateBean(categoryList.get(0).getFilterProperties()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public MultiCategoryColumnFieldCollection updateBean() { |
||||
|
||||
MultiCategoryColumnFieldCollection fieldCollection = new MultiCategoryColumnFieldCollection(); |
||||
List<ColumnField> categoryList = fieldCollection.getCategoryList(); |
||||
|
||||
multiCategoryPane.update(categoryList); |
||||
|
||||
updateSeriesValuePane(fieldCollection); |
||||
|
||||
SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = fieldCollection.getSeriesValueCorrelationDefinition(); |
||||
if (seriesValueCorrelationDefinition != null) { |
||||
seriesValueCorrelationDefinition.setFilterProperties(seriesFilterPane.updateBean()); |
||||
} |
||||
|
||||
if (categoryList != null && !categoryList.isEmpty()) { |
||||
categoryList.get(0).setFilterProperties(categoryFilterPane.updateBean()); |
||||
} |
||||
|
||||
return fieldCollection; |
||||
} |
||||
} |
@ -0,0 +1,116 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.ColumnField; |
||||
import com.fr.chartx.data.field.SeriesValueCorrelationDefinition; |
||||
import com.fr.chartx.data.field.diff.MultiCategoryColumnFieldCollection; |
||||
import com.fr.design.chartx.component.AbstractSingleFilterPane; |
||||
import com.fr.design.chartx.component.MultiComboBoxPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.van.chart.map.designer.VanChartGroupPane; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.util.List; |
||||
|
||||
|
||||
/** |
||||
* Created by shine on 2019/4/10. |
||||
*/ |
||||
public class MultiCategoryDataSetFieldsPane extends AbstractDataSetFieldsWithSeriesValuePane<MultiCategoryColumnFieldCollection> { |
||||
|
||||
private MultiComboBoxPane multiCategoryPane; |
||||
|
||||
private AbstractSingleFilterPane seriesFilterPane; |
||||
private AbstractSingleFilterPane categoryFilterPane; |
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[0]; |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox[] filedComboBoxes() { |
||||
List<UIComboBox> list = initMultiCategoryPane().componentList(); |
||||
return list.toArray(new UIComboBox[list.size()]); |
||||
} |
||||
|
||||
private MultiComboBoxPane initMultiCategoryPane() { |
||||
if (multiCategoryPane == null) { |
||||
multiCategoryPane = new MultiComboBoxPane(); |
||||
} |
||||
return multiCategoryPane; |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createNorthPane() { |
||||
return initMultiCategoryPane(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createSouthPane() { |
||||
if (seriesFilterPane == null) { |
||||
seriesFilterPane = new AbstractSingleFilterPane() { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
//todo@shinerefactor
|
||||
return "series"; |
||||
} |
||||
}; |
||||
categoryFilterPane = new AbstractSingleFilterPane() { |
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return "category"; |
||||
} |
||||
}; |
||||
} |
||||
return new VanChartGroupPane(new String[]{seriesFilterPane.title4PopupWindow(), categoryFilterPane.title4PopupWindow()} |
||||
, new JPanel[]{seriesFilterPane, categoryFilterPane}) { |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
super.refreshBoxListWithSelectTableData(columnNameList); |
||||
multiCategoryPane.setCurrentBoxItems(columnNameList); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MultiCategoryColumnFieldCollection multiCategoryColumnFieldCollection) { |
||||
List<ColumnField> categoryList = multiCategoryColumnFieldCollection.getCategoryList(); |
||||
|
||||
multiCategoryPane.populate(categoryList); |
||||
|
||||
populateSeriesValuePane(multiCategoryColumnFieldCollection); |
||||
|
||||
SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = multiCategoryColumnFieldCollection.getSeriesValueCorrelationDefinition(); |
||||
if (seriesValueCorrelationDefinition != null) { |
||||
seriesFilterPane.populateBean(seriesValueCorrelationDefinition.getFilterProperties()); |
||||
|
||||
} |
||||
|
||||
if (categoryList != null && !categoryList.isEmpty()) { |
||||
categoryFilterPane.populateBean(categoryList.get(0).getFilterProperties()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public MultiCategoryColumnFieldCollection updateBean() { |
||||
|
||||
MultiCategoryColumnFieldCollection columnFieldCollection = new MultiCategoryColumnFieldCollection(); |
||||
List<ColumnField> categoryList = columnFieldCollection.getCategoryList(); |
||||
|
||||
multiCategoryPane.update(categoryList); |
||||
|
||||
updateSeriesValuePane(columnFieldCollection); |
||||
|
||||
SeriesValueCorrelationDefinition seriesValueCorrelationDefinition = columnFieldCollection.getSeriesValueCorrelationDefinition(); |
||||
if (seriesValueCorrelationDefinition != null) { |
||||
seriesValueCorrelationDefinition.setFilterProperties(seriesFilterPane.updateBean()); |
||||
} |
||||
|
||||
if (categoryList != null && !categoryList.isEmpty()) { |
||||
categoryList.get(0).setFilterProperties(categoryFilterPane.updateBean()); |
||||
} |
||||
|
||||
return columnFieldCollection; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.MultiPieColumnFieldCollection; |
||||
import com.fr.design.chartx.component.MultiTinyFormulaPaneWithUISpinner; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.i18n.Toolkit; |
||||
|
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class MultiPieCellDataFieldsPane extends AbstractCellDataFieldsPane<MultiPieColumnFieldCollection> { |
||||
|
||||
private UITextField nameField;//指标名称
|
||||
|
||||
private MultiTinyFormulaPaneWithUISpinner levelPane; |
||||
|
||||
private TinyFormulaPane value; |
||||
|
||||
@Override |
||||
protected void initComponents() { |
||||
nameField = new UITextField(); |
||||
levelPane = new MultiTinyFormulaPaneWithUISpinner(); |
||||
value = new TinyFormulaPane(); |
||||
super.initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createNorthPane() { |
||||
return levelPane; |
||||
} |
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_Use_Value"), |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected TinyFormulaPane[] formulaPanes() { |
||||
return new TinyFormulaPane[]{ |
||||
value |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MultiPieColumnFieldCollection ob) { |
||||
nameField.setText(ob.getTargetName()); |
||||
levelPane.populate(ob.getLevels()); |
||||
populateField(value, ob.getValue()); |
||||
} |
||||
|
||||
@Override |
||||
public MultiPieColumnFieldCollection updateBean() { |
||||
MultiPieColumnFieldCollection result = new MultiPieColumnFieldCollection(); |
||||
|
||||
result.setTargetName(nameField.getText()); |
||||
levelPane.update(result.getLevels()); |
||||
updateField(value, result.getValue()); |
||||
|
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,94 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.MultiPieColumnFieldCollection; |
||||
import com.fr.design.chartx.component.MultiComboBoxPaneWithUISpinner; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; |
||||
|
||||
import javax.swing.JPanel; |
||||
import java.awt.Component; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class MultiPieDataSetFieldsPane extends AbstractDataSetFieldsPane<MultiPieColumnFieldCollection> { |
||||
private UITextField nameField; |
||||
|
||||
private MultiComboBoxPaneWithUISpinner levelComboBoxPane; |
||||
|
||||
private UIComboBox value; |
||||
|
||||
private CalculateComboBox function; |
||||
|
||||
@Override |
||||
protected void initComponents() { |
||||
nameField = new UITextField(); |
||||
levelComboBoxPane = new MultiComboBoxPaneWithUISpinner(); |
||||
value = new UIComboBox(); |
||||
function = new CalculateComboBox(); |
||||
super.initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createNorthPane() { |
||||
return levelComboBoxPane; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_Use_Value"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Summary_Method") |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected Component[] fieldComponents() { |
||||
return new UIComboBox[]{ |
||||
value, |
||||
function |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox[] filedComboBoxes() { |
||||
List<UIComboBox> list = levelComboBoxPane.getComponentList(); |
||||
|
||||
int len = list.size(); |
||||
UIComboBox[] result = new UIComboBox[len + 1]; |
||||
for (int i = 0; i < len; i++) { |
||||
result[i] = list.get(i); |
||||
} |
||||
result[len] = value; |
||||
|
||||
return result; |
||||
} |
||||
|
||||
@Override |
||||
public void refreshBoxListWithSelectTableData(List columnNameList) { |
||||
super.refreshBoxListWithSelectTableData(columnNameList); |
||||
levelComboBoxPane.setCurrentBoxList(columnNameList); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(MultiPieColumnFieldCollection ob) { |
||||
levelComboBoxPane.populate(ob.getLevels()); |
||||
populateFunctionField(value, function, ob.getValue()); |
||||
} |
||||
|
||||
@Override |
||||
public MultiPieColumnFieldCollection updateBean() { |
||||
MultiPieColumnFieldCollection result = new MultiPieColumnFieldCollection(); |
||||
|
||||
levelComboBoxPane.update(result.getLevels()); |
||||
|
||||
updateFunctionField(value, function, result.getValue()); |
||||
|
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,70 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.WordCloudColumnFieldCollection; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.formula.TinyFormulaPane; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.i18n.Toolkit; |
||||
|
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class WordCloudCellDataFieldsPane extends AbstractCellDataFieldsPane<WordCloudColumnFieldCollection> { |
||||
|
||||
private UITextField name; |
||||
private TinyFormulaPane wordName; |
||||
private TinyFormulaPane wordValue; |
||||
|
||||
@Override |
||||
protected void initComponents() { |
||||
name = new UITextField(); |
||||
wordName = new TinyFormulaPane(); |
||||
wordValue = new TinyFormulaPane(); |
||||
|
||||
super.initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Word_Name"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Word_Value") |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected TinyFormulaPane[] formulaPanes() { |
||||
return new TinyFormulaPane[]{ |
||||
wordName, |
||||
wordValue |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected Component[] fieldComponents() { |
||||
return new Component[]{ |
||||
name, |
||||
wordName, |
||||
wordValue |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WordCloudColumnFieldCollection ob) { |
||||
name.setText(ob.getTargetName()); |
||||
populateField(wordName, ob.getWordName()); |
||||
populateField(wordValue, ob.getWordValue()); |
||||
} |
||||
|
||||
@Override |
||||
public WordCloudColumnFieldCollection updateBean() { |
||||
WordCloudColumnFieldCollection result = new WordCloudColumnFieldCollection(); |
||||
result.setTargetName(name.getText()); |
||||
updateField(wordName, result.getWordName()); |
||||
populateField(wordValue, result.getWordValue()); |
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,74 @@
|
||||
package com.fr.design.chartx.fields.diff; |
||||
|
||||
import com.fr.chartx.data.field.diff.WordCloudColumnFieldCollection; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.gui.icombobox.UIComboBox; |
||||
import com.fr.design.gui.itextfield.UITextField; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.chart.gui.data.CalculateComboBox; |
||||
|
||||
import java.awt.Component; |
||||
|
||||
/** |
||||
* Created by shine on 2019/6/18. |
||||
*/ |
||||
public class WordCloudDataSetFieldsPane extends AbstractDataSetFieldsPane<WordCloudColumnFieldCollection> { |
||||
private UITextField name; |
||||
private UIComboBox wordName; |
||||
private UIComboBox wordValue; |
||||
private CalculateComboBox calculateCombox; |
||||
|
||||
@Override |
||||
protected void initComponents() { |
||||
name = new UITextField(); |
||||
wordName = new UIComboBox(); |
||||
wordValue = new UIComboBox(); |
||||
calculateCombox = new CalculateComboBox(); |
||||
|
||||
super.initComponents(); |
||||
} |
||||
|
||||
@Override |
||||
protected String[] fieldLabels() { |
||||
return new String[]{ |
||||
Toolkit.i18nText("Fine-Design_Chart_MultiPie_Series_Name"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Word_Name"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Word_Value"), |
||||
Toolkit.i18nText("Fine-Design_Chart_Summary_Method") |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected UIComboBox[] filedComboBoxes() { |
||||
return new UIComboBox[]{ |
||||
wordName, |
||||
wordValue |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
protected Component[] fieldComponents() { |
||||
return new Component[]{ |
||||
name, |
||||
wordName, |
||||
wordValue, |
||||
calculateCombox |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(WordCloudColumnFieldCollection ob) { |
||||
name.setText(ob.getTargetName()); |
||||
populateField(wordName, ob.getWordName()); |
||||
populateFunctionField(wordValue, calculateCombox, ob.getWordValue()); |
||||
} |
||||
|
||||
@Override |
||||
public WordCloudColumnFieldCollection updateBean() { |
||||
WordCloudColumnFieldCollection result = new WordCloudColumnFieldCollection(); |
||||
result.setTargetName(name.getText()); |
||||
updateField(wordName, result.getWordName()); |
||||
updateFunctionField(wordValue, calculateCombox, result.getWordValue()); |
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,56 @@
|
||||
package com.fr.design.chartx.single; |
||||
|
||||
import com.fr.chartx.data.CellDataDefinition; |
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.i18n.Toolkit; |
||||
|
||||
import java.awt.BorderLayout; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/21. |
||||
*/ |
||||
public class CellDataPane extends FurtherBasicBeanPane<CellDataDefinition> { |
||||
|
||||
private AbstractCellDataFieldsPane cellDataFieldsPane; |
||||
|
||||
public CellDataPane(AbstractCellDataFieldsPane cellDataFieldsPane) { |
||||
initComps(cellDataFieldsPane); |
||||
} |
||||
|
||||
private void initComps(AbstractCellDataFieldsPane cellDataFieldsPane) { |
||||
this.cellDataFieldsPane = cellDataFieldsPane; |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(cellDataFieldsPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_Cell_Data"); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public boolean accept(Object ob) { |
||||
return ob instanceof CellDataDefinition; |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
this.removeAll(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(CellDataDefinition ob) { |
||||
cellDataFieldsPane.populateBean(ob.getColumnFieldCollection()); |
||||
} |
||||
|
||||
@Override |
||||
public CellDataDefinition updateBean() { |
||||
CellDataDefinition cellDataDefinition = new CellDataDefinition(); |
||||
cellDataDefinition.setColumnFieldCollection(cellDataFieldsPane.updateBean()); |
||||
|
||||
return cellDataDefinition; |
||||
} |
||||
} |
@ -0,0 +1,121 @@
|
||||
package com.fr.design.chartx.single; |
||||
|
||||
import com.fr.chartx.data.DataSetDefinition; |
||||
import com.fr.data.impl.NameTableData; |
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.data.tabledata.wrapper.TableDataWrapper; |
||||
import com.fr.design.gui.ilable.BoldFontTextLabel; |
||||
import com.fr.design.gui.ilable.UILabel; |
||||
import com.fr.design.i18n.Toolkit; |
||||
import com.fr.design.mainframe.chart.gui.ChartDataPane; |
||||
import com.fr.design.mainframe.chart.gui.data.DatabaseTableDataPane; |
||||
import com.fr.design.utils.gui.UIComponentUtils; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.Dimension; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/21. |
||||
*/ |
||||
public class DataSetPane extends FurtherBasicBeanPane<DataSetDefinition> { |
||||
private static final int TABLE_DATA_LABEL_LINE_WRAP_WIDTH = 65; |
||||
private static final int TABLE_DATA_PANE_WIDTH = 246; |
||||
|
||||
private DatabaseTableDataPane tableDataPane; |
||||
|
||||
private AbstractDataSetFieldsPane dataSetFieldsPane; |
||||
|
||||
public DataSetPane(AbstractDataSetFieldsPane dataSetFieldsPane) { |
||||
initComps(dataSetFieldsPane); |
||||
} |
||||
|
||||
private void initComps(AbstractDataSetFieldsPane dataSetFieldsPane) { |
||||
UILabel label = new BoldFontTextLabel(Toolkit.i18nText("Fine-Design_Chart_Table_Data")); |
||||
UIComponentUtils.setLineWrap(label, TABLE_DATA_LABEL_LINE_WRAP_WIDTH); |
||||
UIComponentUtils.setPreferedWidth(label, ChartDataPane.LABEL_WIDTH); |
||||
|
||||
tableDataPane = new DatabaseTableDataPane(label) { |
||||
@Override |
||||
protected void userEvent() { |
||||
refreshBoxList(); |
||||
checkBoxUse(); |
||||
} |
||||
}; |
||||
tableDataPane.setPreferredSize(new Dimension(TABLE_DATA_PANE_WIDTH, tableDataPane.getPreferredSize().height)); |
||||
|
||||
this.dataSetFieldsPane = dataSetFieldsPane; |
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(tableDataPane, BorderLayout.NORTH); |
||||
this.add(dataSetFieldsPane, BorderLayout.CENTER); |
||||
} |
||||
|
||||
/** |
||||
* 检查box是否可用. |
||||
*/ |
||||
public void checkBoxUse() { |
||||
TableDataWrapper dataWrap = tableDataPane.getTableDataWrapper(); |
||||
|
||||
if (dataSetFieldsPane != null) { |
||||
dataSetFieldsPane.checkBoxUse(dataWrap != null); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 刷新字段下拉列表 |
||||
*/ |
||||
private void refreshBoxList() { |
||||
TableDataWrapper dataWrap = tableDataPane.getTableDataWrapper(); |
||||
|
||||
if (dataWrap == null) { |
||||
return; |
||||
} |
||||
|
||||
List<String> columnNameList = dataWrap.calculateColumnNameList(); |
||||
|
||||
if (dataSetFieldsPane != null) { |
||||
dataSetFieldsPane.refreshBoxListWithSelectTableData(columnNameList); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public boolean accept(Object ob) { |
||||
return ob instanceof DataSetDefinition; |
||||
} |
||||
|
||||
@Override |
||||
public String title4PopupWindow() { |
||||
return Toolkit.i18nText("Fine-Design_Chart_TableData"); |
||||
} |
||||
|
||||
@Override |
||||
public void reset() { |
||||
this.removeAll(); |
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(DataSetDefinition ob) { |
||||
refreshBoxList(); |
||||
checkBoxUse(); |
||||
|
||||
tableDataPane.populateBean(ob.getNameTableData()); |
||||
|
||||
dataSetFieldsPane.populateBean(ob.getColumnFieldCollection()); |
||||
} |
||||
|
||||
@Override |
||||
public DataSetDefinition updateBean() { |
||||
DataSetDefinition dataSetDefinition = new DataSetDefinition(); |
||||
|
||||
TableDataWrapper tableDataWrapper = tableDataPane.getTableDataWrapper(); |
||||
if (tableDataWrapper != null) { |
||||
dataSetDefinition.setNameTableData(new NameTableData(tableDataWrapper.getTableDataName())); |
||||
} |
||||
|
||||
dataSetDefinition.setColumnFieldCollection(dataSetFieldsPane.updateBean()); |
||||
|
||||
return dataSetDefinition; |
||||
} |
||||
} |
@ -0,0 +1,90 @@
|
||||
package com.fr.design.chartx.single; |
||||
|
||||
import com.fr.chartx.data.AbstractDataDefinition; |
||||
import com.fr.design.beans.BasicBeanPane; |
||||
import com.fr.design.beans.FurtherBasicBeanPane; |
||||
import com.fr.design.chartx.fields.AbstractCellDataFieldsPane; |
||||
import com.fr.design.chartx.fields.AbstractDataSetFieldsPane; |
||||
import com.fr.design.constants.LayoutConstants; |
||||
import com.fr.design.gui.frpane.UIComboBoxPane; |
||||
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.BorderFactory; |
||||
import javax.swing.JPanel; |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* Created by shine on 2019/5/21. |
||||
*/ |
||||
public class SingleDataPane extends BasicBeanPane<AbstractDataDefinition> { |
||||
|
||||
private UIComboBoxPane<AbstractDataDefinition> comboBoxPane; |
||||
|
||||
private DataSetPane dataSetPane; |
||||
|
||||
private CellDataPane cellDataPane; |
||||
|
||||
public SingleDataPane(AbstractDataSetFieldsPane dataSetFieldsPane, AbstractCellDataFieldsPane cellDataFieldsPane) { |
||||
initComps(dataSetFieldsPane, cellDataFieldsPane); |
||||
} |
||||
|
||||
private void initComps(AbstractDataSetFieldsPane dataSetFieldsPane, AbstractCellDataFieldsPane cellDataFieldsPane) { |
||||
|
||||
cellDataPane = new CellDataPane(cellDataFieldsPane); |
||||
dataSetPane = new DataSetPane(dataSetFieldsPane); |
||||
|
||||
comboBoxPane = new UIComboBoxPane<AbstractDataDefinition>() { |
||||
@Override |
||||
protected List<FurtherBasicBeanPane<? extends AbstractDataDefinition>> initPaneList() { |
||||
List<FurtherBasicBeanPane<? extends AbstractDataDefinition>> list = new ArrayList<FurtherBasicBeanPane<? extends AbstractDataDefinition>>(); |
||||
list.add(dataSetPane); |
||||
list.add(cellDataPane); |
||||
return list; |
||||
} |
||||
|
||||
protected void initLayout() { |
||||
this.setLayout(new BorderLayout(LayoutConstants.HGAP_LARGE, 6)); |
||||
JPanel northPane = new JPanel(new BorderLayout(LayoutConstants.HGAP_LARGE, 0)); |
||||
northPane.add(jcb, BorderLayout.CENTER); |
||||
UILabel label1 = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Data_Source")); |
||||
label1.setPreferredSize(new Dimension(ChartDataPane.LABEL_WIDTH, ChartDataPane.LABEL_HEIGHT)); |
||||
northPane.add(GUICoreUtils.createBorderLayoutPane(new Component[]{jcb, null, null, label1, null})); |
||||
northPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 8)); |
||||
this.add(northPane, BorderLayout.NORTH); |
||||
this.add(cardPane, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
}; |
||||
|
||||
|
||||
this.setLayout(new BorderLayout()); |
||||
this.add(comboBoxPane, BorderLayout.CENTER); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void populateBean(AbstractDataDefinition ob) { |
||||
comboBoxPane.populateBean(ob); |
||||
} |
||||
|
||||
@Override |
||||
public AbstractDataDefinition updateBean() { |
||||
return comboBoxPane.updateBean(); |
||||
} |
||||
|
||||
@Override |
||||
protected String title4PopupWindow() { |
||||
return null; |
||||
} |
||||
} |
@ -1,65 +0,0 @@
|
||||
/* |
||||
* Copyright (c) 2001-2014,FineReport Inc, All Rights Reserved. |
||||
*/ |
||||
|
||||
package com.fr.design.mainframe.chart.gui; |
||||
|
||||
import com.fr.design.mainframe.chart.gui.other.ChartDesignerConditionAttrPane; |
||||
import com.fr.design.mainframe.chart.gui.other.ChartDesignerInteractivePane; |
||||
import com.fr.design.dialog.BasicPane; |
||||
|
||||
|
||||
import javax.swing.*; |
||||
import java.awt.*; |
||||
import java.util.*; |
||||
|
||||
/** |
||||
* 图表设计器的图标属性表高级tab |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-16 |
||||
* Time: 下午2:04 |
||||
*/ |
||||
public class ChartDesignerOtherPane extends ChartOtherPane { |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
JPanel content = new JPanel(new BorderLayout()); |
||||
otherPane = new ChartTabPane(); |
||||
content.add(otherPane, BorderLayout.CENTER); |
||||
return content; |
||||
} |
||||
|
||||
/** |
||||
* 界面标题 |
||||
* |
||||
* @return 返回标题. |
||||
*/ |
||||
public String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Advanced"); |
||||
} |
||||
|
||||
private boolean isHaveCondition() { |
||||
return hasCondition; |
||||
} |
||||
|
||||
|
||||
private class ChartTabPane extends TabPane { |
||||
|
||||
@Override |
||||
protected java.util.List<BasicPane> initPaneList() { |
||||
java.util.List<BasicPane> paneList = new ArrayList<BasicPane>(); |
||||
interactivePane = new ChartDesignerInteractivePane(ChartDesignerOtherPane.this); |
||||
|
||||
paneList.add(interactivePane); |
||||
|
||||
if (ChartDesignerOtherPane.this.isHaveCondition()) { |
||||
conditionAttrPane = new ChartDesignerConditionAttrPane(); |
||||
paneList.add(conditionAttrPane); |
||||
} |
||||
return paneList; |
||||
} |
||||
|
||||
} |
||||
} |
@ -1,33 +0,0 @@
|
||||
package com.fr.design.mainframe.chart.gui; |
||||
|
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.gui.frpane.AttributeChangeListener; |
||||
import com.fr.design.mainframe.chart.gui.style.series.ChartSeriesPane; |
||||
import com.fr.design.mainframe.chart.gui.style.series.SeriesPane4ChartDesigner; |
||||
|
||||
/** |
||||
* 图表设计器的样式面板 |
||||
* Created by IntelliJ IDEA. |
||||
* Author : daisy |
||||
* Version: 6.5.6 |
||||
* Date: 14-10-25 |
||||
* Time: 下午6:56 |
||||
*/ |
||||
public class StylePane4Chart extends ChartStylePane { |
||||
|
||||
public StylePane4Chart(AttributeChangeListener listener, boolean isNeedFormula) { |
||||
super(listener, isNeedFormula); |
||||
} |
||||
|
||||
public void update(ChartCollection collection) { |
||||
int selectIndex = collection.getSelectedIndex(); |
||||
super.update(collection); |
||||
collection.getSelectedChart().setStyleGlobal(false); |
||||
collection.setChartName(selectIndex, collection.getSelectedChart().getTitle().getTextObject().toString()); |
||||
} |
||||
|
||||
protected ChartSeriesPane createChartSeriesPane(){ |
||||
return new SeriesPane4ChartDesigner(StylePane4Chart.this); |
||||
} |
||||
|
||||
} |
@ -1,94 +0,0 @@
|
||||
package com.fr.design.mainframe.chart.gui.other; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
|
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
import com.fr.design.chart.ChartControlPane; |
||||
import com.fr.chart.chartattr.ChartCollection; |
||||
import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; |
||||
import com.fr.design.gui.ibutton.UIButton; |
||||
import com.fr.design.mainframe.chart.ChartEditPane; |
||||
import com.fr.design.mainframe.chart.PaneTitleConstants; |
||||
import com.fr.design.dialog.BasicDialog; |
||||
import com.fr.design.dialog.DialogActionAdapter; |
||||
|
||||
|
||||
public class ChartSwitchPane extends AbstractAttrNoScrollPane{ |
||||
|
||||
private UIButton changeButton; |
||||
|
||||
private ChartCollection editingChartCollection; |
||||
|
||||
private ChartEditPane currentChartEditPane; |
||||
|
||||
public ChartSwitchPane() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected JPanel createContentPane() { |
||||
JPanel pane = new JPanel(); |
||||
pane.setLayout(new BorderLayout()); |
||||
|
||||
changeButton = new UIButton(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Switch")); |
||||
|
||||
pane.add(changeButton, BorderLayout.NORTH); |
||||
|
||||
changeButton.addActionListener(new ActionListener() { |
||||
public void actionPerformed(ActionEvent e) { |
||||
final ChartControlPane chartTypeManager = new ChartControlPane(); |
||||
chartTypeManager.populate(editingChartCollection); |
||||
|
||||
BasicDialog dlg = chartTypeManager.showWindow4ChartType(SwingUtilities.getWindowAncestor(new JPanel()), new DialogActionAdapter() { |
||||
public void doOk() { |
||||
chartTypeManager.update(editingChartCollection);//kunsnat: 确定刷新"chartSelectIndex"
|
||||
|
||||
if(currentChartEditPane != null) { |
||||
currentChartEditPane.populate(editingChartCollection);// 选中新Plot之后 刷新对应界面, 比如超级链接等, 然后才能update.
|
||||
currentChartEditPane.gotoPane(PaneTitleConstants.CHART_TYPE_TITLE); |
||||
currentChartEditPane.gotoPane(PaneTitleConstants.CHART_OTHER_TITLE, PaneTitleConstants.CHART_OTHER_TITLE_CHANGE); |
||||
currentChartEditPane.fire(); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
dlg.setVisible(true); |
||||
} |
||||
}); |
||||
|
||||
return pane; |
||||
} |
||||
|
||||
/** |
||||
* 注册 切换事件的改变 和超链不同. |
||||
* @param listener |
||||
*/ |
||||
public void registerChartEditPane(ChartEditPane currentChartEditPane) { |
||||
this.currentChartEditPane = currentChartEditPane; |
||||
} |
||||
|
||||
public void populateBean(ChartCollection c) { |
||||
this.editingChartCollection = c; |
||||
} |
||||
|
||||
public void updateBean(ChartCollection c) { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 界面标题 |
||||
* @param 返回标题 |
||||
*/ |
||||
public String title4PopupWindow() { |
||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Switch_Chart"); |
||||
} |
||||
|
||||
@Override |
||||
public String getIconPath() { |
||||
return null; |
||||
} |
||||
} |
@ -0,0 +1,409 @@
|
||||
package com.fr.design.mainframe.chart.gui.type; |
||||
|
||||
import com.fr.base.ChartColorMatching; |
||||
import com.fr.base.ChartPreStyleConfig; |
||||
import com.fr.base.background.ColorBackground; |
||||
import com.fr.chart.base.AttrContents; |
||||
import com.fr.chart.base.AttrFillStyle; |
||||
import com.fr.chart.base.ChartConstants; |
||||
import com.fr.chart.base.ChartUtils; |
||||
import com.fr.chart.base.DataSeriesCondition; |
||||
import com.fr.chart.base.TextAttr; |
||||
import com.fr.chart.chartattr.Axis; |
||||
import com.fr.chart.chartattr.CategoryPlot; |
||||
import com.fr.chart.chartattr.Chart; |
||||
import com.fr.chart.chartattr.Legend; |
||||
import com.fr.chart.chartattr.Plot; |
||||
import com.fr.chart.chartattr.Title; |
||||
import com.fr.chart.chartglyph.ConditionAttr; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.general.FRFont; |
||||
import com.fr.js.NameJavaScriptGroup; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.Constants; |
||||
|
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
|
||||
/** |
||||
* Created by shine on 2019/7/1. |
||||
*/ |
||||
public abstract class AbstractDeprecatedChartTypePane extends AbstractChartTypePane<Chart> { |
||||
|
||||
protected void changePlotWithClone(Chart chart, Plot plot) { |
||||
try { |
||||
chart.switchPlot((Plot) plot.clone()); |
||||
} catch (CloneNotSupportedException e) { |
||||
FineLoggerFactory.getLogger().error("Error in change plot"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 更新界面属性 |
||||
*/ |
||||
public void populateBean(Chart chart) { |
||||
for (ChartImagePane imagePane : typeDemo) { |
||||
imagePane.isPressing = false; |
||||
} |
||||
for (ChartImagePane imagePane : styleList) { |
||||
imagePane.isPressing = false; |
||||
} |
||||
|
||||
if (styleList != null && !styleList.isEmpty()) { |
||||
int plotStyle = chart.getPlot().getPlotStyle(); |
||||
String styleName = chart.getPlot().getPlotFillStyle().getFillStyleName(); |
||||
|
||||
switch (plotStyle) { |
||||
case ChartConstants.STYLE_SHADE: |
||||
if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"), styleName)) { |
||||
styleList.get(STYLE_SHADE).isPressing = true; |
||||
lastStyleIndex = STYLE_SHADE; |
||||
} |
||||
break; |
||||
case ChartConstants.STYLE_TRANSPARENT: |
||||
if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"), styleName)) { |
||||
styleList.get(STYLE_TRANSPARENT).isPressing = true; |
||||
lastStyleIndex = STYLE_TRANSPARENT; |
||||
} |
||||
break; |
||||
case ChartConstants.STYLE_3D: |
||||
if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)) { |
||||
styleList.get(STYLE_PLANE3D).isPressing = true; |
||||
lastStyleIndex = STYLE_PLANE3D; |
||||
} |
||||
break; |
||||
case ChartConstants.STYLE_OUTER: |
||||
if (ComparatorUtils.equals(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"), styleName)) { |
||||
styleList.get(STYLE_HIGHLIGHT).isPressing = true; |
||||
lastStyleIndex = STYLE_HIGHLIGHT; |
||||
} |
||||
break; |
||||
default: |
||||
lastStyleIndex = -1; |
||||
break; |
||||
} |
||||
stylePane.setVisible(!(chart.getPlot().isSupport3D())); |
||||
this.repaint(); |
||||
} |
||||
} |
||||
|
||||
public void updateBean(Chart chart) { |
||||
Plot oldPlot = chart.getPlot(); |
||||
Plot newPlot = this.setSelectedClonedPlotWithCondition(oldPlot); |
||||
checkTypeChange(oldPlot);//判断图表的类型是否发生变化
|
||||
if (styleList != null && !styleList.isEmpty()) { |
||||
if (styleList.get(STYLE_SHADE).isPressing && lastStyleIndex != STYLE_SHADE) { |
||||
lastStyleIndex = STYLE_SHADE; |
||||
chart.setPlot(newPlot); |
||||
chart.getPlot().setPlotStyle(ChartConstants.STYLE_SHADE); |
||||
resetChart(chart); |
||||
createCondition4Shade(chart); |
||||
setPlotFillStyle(chart); |
||||
} else if (styleList.get(STYLE_TRANSPARENT).isPressing && lastStyleIndex != STYLE_TRANSPARENT) { |
||||
lastStyleIndex = STYLE_TRANSPARENT; |
||||
chart.setPlot(newPlot); |
||||
chart.getPlot().setPlotStyle(ChartConstants.STYLE_TRANSPARENT); |
||||
resetChart(chart); |
||||
createCondition4Transparent(chart); |
||||
setPlotFillStyle(chart); |
||||
} else if (styleList.get(STYLE_PLANE3D).isPressing && lastStyleIndex != STYLE_PLANE3D) { |
||||
lastStyleIndex = STYLE_PLANE3D; |
||||
chart.setPlot(newPlot); |
||||
chart.getPlot().setPlotStyle(ChartConstants.STYLE_3D); |
||||
resetChart(chart); |
||||
createCondition4Plane3D(chart); |
||||
setPlotFillStyle(chart); |
||||
} else if (styleList.get(STYLE_HIGHLIGHT).isPressing && lastStyleIndex != STYLE_HIGHLIGHT) { |
||||
lastStyleIndex = STYLE_HIGHLIGHT; |
||||
chart.setPlot(newPlot); |
||||
chart.getPlot().setPlotStyle(ChartConstants.STYLE_OUTER); |
||||
resetChart(chart); |
||||
createCondition4HighLight(chart); |
||||
setPlotFillStyle(chart); |
||||
} else if (lastStyleIndex >= STYLE_SHADE && lastStyleIndex <= STYLE_HIGHLIGHT) { |
||||
if (styleList.get(lastStyleIndex).isDoubleClicked || typeChanged) { |
||||
chart.setPlot(newPlot); |
||||
resetChart(chart); |
||||
styleList.get(lastStyleIndex).isPressing = false; |
||||
checkDemosBackground(); |
||||
lastStyleIndex = -1; |
||||
} |
||||
} |
||||
|
||||
stylePane.setVisible(!(chart.getPlot().isSupport3D())); |
||||
this.repaint(); |
||||
} |
||||
} |
||||
|
||||
private Plot setSelectedClonedPlotWithCondition(Plot oldPlot) { |
||||
Plot newPlot = getSelectedClonedPlot(); |
||||
if (oldPlot != null && ComparatorUtils.equals(newPlot.getClass(), oldPlot.getClass())) { |
||||
if (oldPlot.getHotHyperLink() != null) { |
||||
NameJavaScriptGroup hotHyper = oldPlot.getHotHyperLink(); |
||||
try { |
||||
newPlot.setHotHyperLink((NameJavaScriptGroup) hotHyper.clone()); |
||||
} catch (CloneNotSupportedException e) { |
||||
FineLoggerFactory.getLogger().error("Error in Hyperlink, Please Check it.", e); |
||||
} |
||||
} |
||||
newPlot.setConditionCollection(oldPlot.getConditionCollection()); |
||||
newPlot.setSeriesDragEnable(oldPlot.isSeriesDragEnable()); |
||||
if (newPlot.isSupportZoomCategoryAxis() && newPlot.getxAxis() != null) { |
||||
newPlot.getxAxis().setZoom(oldPlot.getxAxis().isZoom()); |
||||
} |
||||
if (newPlot.isSupportTooltipInInteractivePane()) { |
||||
newPlot.setHotTooltipStyle(oldPlot.getHotTooltipStyle()); |
||||
} |
||||
|
||||
if (newPlot.isSupportAutoRefresh()) { |
||||
newPlot.setAutoRefreshPerSecond(oldPlot.getAutoRefreshPerSecond()); |
||||
} |
||||
|
||||
if (newPlot.isSupportAxisTip()) { |
||||
newPlot.setInteractiveAxisTooltip(oldPlot.isInteractiveAxisTooltip()); |
||||
} |
||||
} |
||||
return newPlot; |
||||
} |
||||
|
||||
//平面3D的默认属性设置
|
||||
private void createCondition4Plane3D(Chart chart) { |
||||
if (chart != null) { |
||||
//标题
|
||||
Title title = new Title(chart.getTitle().getTextObject()); |
||||
chart.setTitle(title); |
||||
title.setTitleVisible(true); |
||||
TextAttr textAttr = title.getTextAttr(); |
||||
if (textAttr == null) { |
||||
textAttr = new TextAttr(); |
||||
title.setTextAttr(textAttr); |
||||
} |
||||
title.setPosition(Constants.CENTER); |
||||
textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 16f, new Color(51, 51, 51))); |
||||
|
||||
//图例
|
||||
Legend legend = new Legend(); |
||||
legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128, 128, 128))); |
||||
legend.setPosition(Constants.TOP); |
||||
chart.getPlot().setLegend(legend); |
||||
|
||||
//分类轴,现在只有柱形图,条形图,面积图
|
||||
if (chart.getPlot() instanceof CategoryPlot) { |
||||
CategoryPlot plot = (CategoryPlot) chart.getPlot(); |
||||
//分类轴设置
|
||||
Axis cateAxis = plot.getxAxis(); |
||||
cateAxis.setAxisStyle(Constants.LINE_THICK); |
||||
cateAxis.setAxisColor(new Color(57, 57, 57)); |
||||
cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setShowAxisLabel(true); |
||||
cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(57, 57, 57))); |
||||
|
||||
//值轴设置
|
||||
Axis valueAxis = plot.getyAxis(); |
||||
valueAxis.setAxisStyle(Constants.LINE_NONE); |
||||
valueAxis.setTickMarkType(Constants.TICK_MARK_NONE); |
||||
valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
valueAxis.setShowAxisLabel(false); |
||||
|
||||
//绘图区
|
||||
plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); |
||||
plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); |
||||
chart.setBorderStyle(Constants.LINE_NONE); |
||||
|
||||
//数据标签
|
||||
ConditionAttr attrList = plot.getConditionCollection().getDefaultAttr(); |
||||
DataSeriesCondition attr = attrList.getExisted(AttrContents.class); |
||||
if (attr != null) { |
||||
attrList.remove(attr); |
||||
} |
||||
AttrContents attrContents = new AttrContents(); |
||||
attrContents.setPosition(Constants.OUTSIDE); |
||||
attrContents.setSeriesLabel(ChartConstants.VALUE_PARA); |
||||
attrContents.setTextAttr(new TextAttr(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(51, 51, 51)))); |
||||
attrList.addDataSeriesCondition(attrContents); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//透明风格的默认属性设置
|
||||
private void createCondition4Transparent(Chart chart) { |
||||
if (chart != null) { |
||||
//标题
|
||||
Title title = new Title(chart.getTitle().getTextObject()); |
||||
chart.setTitle(title); |
||||
title.setTitleVisible(true); |
||||
TextAttr textAttr = title.getTextAttr(); |
||||
if (textAttr == null) { |
||||
textAttr = new TextAttr(); |
||||
title.setTextAttr(textAttr); |
||||
} |
||||
title.setPosition(Constants.LEFT); |
||||
textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(192, 192, 192))); |
||||
|
||||
//图例
|
||||
Legend legend = new Legend(); |
||||
legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138, 140, 139))); |
||||
legend.setPosition(Constants.RIGHT_TOP); |
||||
chart.getPlot().setLegend(legend); |
||||
|
||||
Plot plot = chart.getPlot(); |
||||
//绘图区
|
||||
chart.setBackground(ColorBackground.getInstance(new Color(51, 51, 51))); |
||||
|
||||
//分类轴,现在只有柱形图,条形图,面积图
|
||||
if (plot instanceof CategoryPlot) { |
||||
//边框
|
||||
plot.setBorderStyle(Constants.LINE_THIN); |
||||
plot.setBorderColor(new Color(65, 65, 65)); |
||||
|
||||
//分类轴设置
|
||||
Axis cateAxis = plot.getxAxis(); |
||||
cateAxis.setAxisStyle(Constants.LINE_THICK); |
||||
cateAxis.setAxisColor(new Color(192, 192, 192)); |
||||
cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setShowAxisLabel(true); |
||||
cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(150, 150, 150))); |
||||
|
||||
//值轴
|
||||
Axis valueAxis = plot.getyAxis(); |
||||
valueAxis.setShowAxisLabel(true); |
||||
valueAxis.setAxisStyle(Constants.LINE_NONE); |
||||
valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(150, 150, 150))); |
||||
valueAxis.setMainGridStyle(Constants.LINE_THIN); |
||||
valueAxis.setMainGridColor(new Color(63, 62, 62)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//渐变的默认属性设置
|
||||
private void createCondition4Shade(Chart chart) { |
||||
if (chart != null) { |
||||
//标题
|
||||
Title title = new Title(chart.getTitle().getTextObject()); |
||||
chart.setTitle(title); |
||||
title.setTitleVisible(true); |
||||
TextAttr textAttr = title.getTextAttr(); |
||||
if (textAttr == null) { |
||||
textAttr = new TextAttr(); |
||||
title.setTextAttr(textAttr); |
||||
} |
||||
title.setPosition(Constants.CENTER); |
||||
textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(0, 51, 102))); |
||||
|
||||
//图例
|
||||
Legend legend = new Legend(); |
||||
legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(128, 128, 128))); |
||||
legend.setPosition(Constants.BOTTOM); |
||||
chart.getPlot().setLegend(legend); |
||||
|
||||
//分类轴,现在只有柱形图,条形图,面积图
|
||||
if (chart.getPlot() instanceof CategoryPlot) { |
||||
CategoryPlot plot = (CategoryPlot) chart.getPlot(); |
||||
|
||||
//分类轴设置
|
||||
Axis cateAxis = plot.getxAxis(); |
||||
cateAxis.setAxisStyle(Constants.LINE_THICK); |
||||
cateAxis.setAxisColor(new Color(73, 100, 117)); |
||||
cateAxis.setTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setShowAxisLabel(true); |
||||
cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(128, 128, 128))); |
||||
|
||||
//值轴
|
||||
Axis valueAxis = plot.getyAxis(); |
||||
valueAxis.setShowAxisLabel(true); |
||||
valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(128, 128, 128))); |
||||
valueAxis.setAxisStyle(Constants.LINE_NONE); |
||||
|
||||
//绘图区
|
||||
plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); |
||||
plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); |
||||
plot.setHorizontalIntervalBackgroundColor(new Color(243, 243, 243)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
//高光渐变的默认属性设置
|
||||
private void createCondition4HighLight(Chart chart) { |
||||
if (chart != null) { |
||||
//标题
|
||||
Title title = new Title(chart.getTitle().getTextObject()); |
||||
chart.setTitle(title); |
||||
title.setTitleVisible(true); |
||||
TextAttr textAttr = title.getTextAttr(); |
||||
if (textAttr == null) { |
||||
textAttr = new TextAttr(); |
||||
title.setTextAttr(textAttr); |
||||
} |
||||
title.setPosition(Constants.LEFT); |
||||
textAttr.setFRFont(FRFont.getInstance("Microsoft YaHei", Font.BOLD, 16f, new Color(51, 51, 51))); |
||||
|
||||
//图例
|
||||
Legend legend = new Legend(); |
||||
legend.setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 9f, new Color(138, 140, 139))); |
||||
legend.setPosition(Constants.RIGHT_TOP); |
||||
chart.getPlot().setLegend(legend); |
||||
|
||||
//分类轴,现在只有柱形图,条形图,面积图
|
||||
if (chart.getPlot() instanceof CategoryPlot) { |
||||
CategoryPlot plot = (CategoryPlot) chart.getPlot(); |
||||
|
||||
//分类轴设置
|
||||
Axis cateAxis = plot.getxAxis(); |
||||
cateAxis.setAxisStyle(Constants.LINE_THICK); |
||||
cateAxis.setAxisColor(new Color(204, 220, 228)); |
||||
cateAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); |
||||
cateAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
cateAxis.setShowAxisLabel(true); |
||||
cateAxis.getTextAttr().setFRFont(FRFont.getInstance("Microsoft YaHei", Font.PLAIN, 10f, new Color(138, 140, 139))); |
||||
|
||||
//值轴
|
||||
Axis valueAxis = plot.getyAxis(); |
||||
valueAxis.setAxisStyle(Constants.NONE); |
||||
valueAxis.setAxisColor(null); |
||||
valueAxis.setTickMarkType(Constants.TICK_MARK_INSIDE); |
||||
valueAxis.setSecTickMarkType(Constants.TICK_MARK_NONE); |
||||
valueAxis.setShowAxisLabel(true); |
||||
valueAxis.getTextAttr().setFRFont(FRFont.getInstance("SimSun", Font.PLAIN, 10f, new Color(138, 140, 139))); |
||||
|
||||
//绘图区
|
||||
plot.setBorderStyle(Constants.LINE_THIN); |
||||
plot.setBorderColor(new Color(204, 220, 228)); |
||||
plot.setBackground(ColorBackground.getInstance(new Color(248, 247, 245))); |
||||
plot.getyAxis().setMainGridStyle(Constants.LINE_THIN); |
||||
plot.getyAxis().setMainGridColor(new Color(192, 192, 192)); |
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
private void setPlotFillStyle(Chart chart) { |
||||
ChartPreStyleConfig manager = ChartPreStyleConfig.getInstance(); |
||||
Plot plot = chart.getPlot(); |
||||
Object preStyle = null; |
||||
String name = ""; |
||||
if (styleList.get(STYLE_SHADE).isPressing) { |
||||
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Retro"); |
||||
preStyle = manager.getPreStyle(name); |
||||
} else if (styleList.get(STYLE_TRANSPARENT).isPressing) { |
||||
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Fresh"); |
||||
preStyle = manager.getPreStyle(name); |
||||
} else if (styleList.get(STYLE_PLANE3D).isPressing) { |
||||
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); |
||||
preStyle = manager.getPreStyle(name); |
||||
} else if (styleList.get(STYLE_HIGHLIGHT).isPressing) { |
||||
name = com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Chart_Style_Bright"); |
||||
preStyle = manager.getPreStyle(name); |
||||
} |
||||
if (preStyle == null) { |
||||
plot.getPlotFillStyle().setColorStyle(ChartConstants.COLOR_DEFAULT); |
||||
} else { |
||||
AttrFillStyle fillStyle = ChartUtils.chartColorMatching2AttrFillStyle((ChartColorMatching) preStyle); |
||||
fillStyle.setFillStyleName(name); |
||||
plot.setPlotFillStyle(fillStyle); |
||||
} |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue