帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

470 lines
18 KiB

package com.fr.van.chart.designer.other;
import com.fr.base.BaseFormula;
import com.fr.base.Utils;
import com.fr.chart.chartattr.Chart;
import com.fr.chart.chartattr.Plot;
import com.fr.design.formula.TinyFormulaPane;
import com.fr.design.gui.ibutton.UIButtonGroup;
import com.fr.design.gui.ibutton.UIToggleButton;
import com.fr.design.gui.icheckbox.UICheckBox;
import com.fr.design.gui.ilable.UILabel;
import com.fr.design.layout.TableLayout;
import com.fr.design.layout.TableLayoutHelper;
import com.fr.general.Inter;
import com.fr.plugin.chart.attr.axis.VanChartAxis;
import com.fr.plugin.chart.attr.plot.VanChartPlot;
import com.fr.plugin.chart.attr.plot.VanChartRectanglePlot;
import com.fr.plugin.chart.axis.type.AxisPlotType;
import com.fr.plugin.chart.base.RefreshMoreLabel;
import com.fr.plugin.chart.base.VanChartConstants;
import com.fr.plugin.chart.base.VanChartTools;
import com.fr.plugin.chart.base.VanChartZoom;
import com.fr.plugin.chart.vanchart.VanChart;
import com.fr.stable.StableUtils;
import com.fr.van.chart.custom.component.VanChartHyperLinkPane;
import com.fr.van.chart.designer.AbstractVanChartScrollPane;
import com.fr.van.chart.designer.PlotFactory;
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.event.ActionEvent;
import java.awt.event.ActionListener;
public class VanChartInteractivePane extends AbstractVanChartScrollPane<Chart> {
private static final long serialVersionUID = 8135452818502145597L;
private static final int AUTO_REFRESH_LEFT_GAP = 18;
protected UICheckBox isSort;
protected UICheckBox exportImages;
protected UICheckBox fullScreenDisplay;
protected UIToggleButton collapse;
protected UIButtonGroup isChartAnimation;
//坐标轴翻转属性
private UIButtonGroup<Integer> axisRotation;
private AutoRefreshPane autoRefreshPane;
private UIButtonGroup zoomWidget;
protected UIButtonGroup zoomGesture;//地图手势缩放
private UIButtonGroup zoomResize;
private TinyFormulaPane from;
private TinyFormulaPane to;
private UIButtonGroup<String> zoomType;
private JPanel changeEnablePane;
private JPanel zoomTypePane;
protected VanChartHyperLinkPane superLink;
protected Chart chart;
protected JPanel interactivePane;
/**
* 界面标题.
* @return 返回标题.
*/
public String title4PopupWindow() {
return Inter.getLocText("Chart-Interactive_Tab");
}
@Override
protected JPanel createContentPane() {
return new JPanel();
}
private void reLayoutContentPane(VanChartPlot plot){
if (interactivePane != null) {
interactivePane.removeAll();
}
interactivePane = getInteractivePane(plot);
reloaPane(interactivePane);
}
protected JPanel getInteractivePane(VanChartPlot plot){
double p = TableLayout.PREFERRED;
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH;
double[] columnSize = {f, e};
double[] rowSize = {p,p,p,p,p,p};
Component[][] components = new Component[][]{
new Component[]{createToolBarPane(getToolBarRowSize(), columnSize),null},
new Component[]{createAnimationPane(),null},
new Component[]{createAxisRotationPane(new double[]{p,p}, columnSize, plot),null},
new Component[]{createZoomPane(new double[]{p,p,p}, columnSize, plot),null},
new Component[]{createAutoRefreshPane(plot),null},
new Component[]{createHyperlinkPane(),null}
};
return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize);
}
protected JPanel createZoomPane(double[] row, double[] col, VanChartPlot plot) {
if (!plot.isSupportZoomDirection()) {
return null;
}
zoomWidget = new UIButtonGroup(new String[]{Inter.getLocText("Plugin-ChartF_Open"), Inter.getLocText("Plugin-ChartF_Close")});
zoomResize = new UIButtonGroup(new String[]{Inter.getLocText("Plugin-ChartF_Change"), Inter.getLocText("Plugin-ChartF_Non_Adjustment")});
from = new TinyFormulaPane();
to = new TinyFormulaPane();
zoomType = new UIButtonGroup(getNameArray(), getValueArray());
zoomGesture = new UIButtonGroup(new String[]{Inter.getLocText("Plugin-ChartF_Open"), Inter.getLocText("Plugin-ChartF_Close")});
JPanel zoomWidgetPane = TableLayout4VanChartHelper.createGapTableLayoutPane(Inter.getLocText("Plugin-ChartF_ZoomWidget"), zoomWidget);
JPanel zoomGesturePane = TableLayout4VanChartHelper.createGapTableLayoutPane(Inter.getLocText("Plugin-ChartF_ZoomGesture"), zoomGesture);
Component[][] components = new Component[][]{
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_WidgetBoundary")), zoomResize},
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_From")), from},
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_To")), to},
};
double f = TableLayout.FILL;
double e = TableLayout4VanChartHelper.SECOND_EDIT_AREA_WIDTH;
double[] columnSize = {f, e};
changeEnablePane = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, columnSize);
changeEnablePane.setBorder(BorderFactory.createEmptyBorder(10,12,0,0));
zoomTypePane = getzoomTypePane(zoomType);
JPanel panel = createZoomPaneContent(zoomWidgetPane, zoomGesturePane, changeEnablePane, zoomTypePane, plot);
zoomWidget.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
checkZoomPane();
}
});
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("Chart-Use_Zoom"), panel);
}
protected JPanel getzoomTypePane(UIButtonGroup zoomType) {
return TableLayout4VanChartHelper.createGapTableLayoutPane(Inter.getLocText("Plugin-ChartF_ZoomType"), zoomType);
}
protected JPanel createZoomPaneContent(JPanel zoomWidgetPane, JPanel zoomGesturePane, JPanel changeEnablePane, JPanel zoomTypePane, VanChartPlot plot) {
JPanel panel = new JPanel(new BorderLayout(0, 4));
if (plot.isSupportZoomCategoryAxis()) {//支持缩放控件
panel.add(zoomWidgetPane, BorderLayout.NORTH);
panel.add(changeEnablePane, BorderLayout.CENTER);
}
panel.add(zoomTypePane, BorderLayout.SOUTH);
return panel;
}
private JPanel createAxisRotationPane(double[] row, double[] col, VanChartPlot plot){
if (!(plot.getAxisPlotType() == AxisPlotType.RECTANGLE)){
return null;
}
axisRotation = new UIButtonGroup<Integer>(new String[]{Inter.getLocText("Plugin-ChartF_Open"),
Inter.getLocText("Plugin-ChartF_Close")});
axisRotation.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
checkZoomEnabled();
}
});
Component[][] components = new Component[][]{
new Component[]{null,null},
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_Reversal")),axisRotation}
};
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("Plugin-ChartF_Axis"), panel);
}
private void checkZoomEnabled() {
if (zoomWidget != null && axisRotation != null) {
zoomWidget.setSelectedIndex(1);
checkZoomPane();
zoomWidget.setEnabled(axisRotation.getSelectedIndex() == 1);
}
}
protected String[] getNameArray() {
return new String[]{Inter.getLocText("ChartF-X_Axis"), Inter.getLocText("ChartF-Y_Axis")
,Inter.getLocText("Plugin-ChartF_XYAxis"),Inter.getLocText("Chart-Use_None")};
}
protected String[] getValueArray() {
return new String[]{VanChartConstants.ZOOM_TYPE_X, VanChartConstants.ZOOM_TYPE_Y
,VanChartConstants.ZOOM_TYPE_XY, VanChartConstants.ZOOM_TYPE_NONE};
}
protected JPanel createToolBarPane(double[] row, double[] col){
isSort = new UICheckBox(Inter.getLocText("Plugin-ChartF_Sort"));
exportImages = new UICheckBox(Inter.getLocText("Plugin-ChartF_ExportImage"));
fullScreenDisplay = new UICheckBox(Inter.getLocText("Plugin-ChartF_FullScreenDisplay"));
collapse = new UIToggleButton(Inter.getLocText("Plugin-ChartF_Collapse"));
Component[][] components = createToolBarComponents();
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(components, row, col);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("Plugin-ChartF_ToolBar"), panel);
}
protected double[] getToolBarRowSize () {
double p = TableLayout.PREFERRED;
return new double[]{p,p,p,p,p};
}
protected Component[][] createToolBarComponents() {
return new Component[][]{
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_Content")),isSort},
new Component[]{null, exportImages},
new Component[]{null, fullScreenDisplay},
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_layout")),collapse},
};
}
protected Component[][] createToolBarComponentsWithOutSort() {
return new Component[][]{
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_Content")), exportImages},
new Component[]{null, fullScreenDisplay},
new Component[]{new UILabel(Inter.getLocText("Plugin-ChartF_layout")),collapse}
};
}
protected JPanel createAnimationPane(){
isChartAnimation = new UIButtonGroup(new String[]{Inter.getLocText("Plugin-ChartF_Open"), Inter.getLocText("Plugin-ChartF_Close")});
JPanel panel = TableLayout4VanChartHelper.createGapTableLayoutPane(Inter.getLocText("Plugin-ChartF_Animation_Effects"), isChartAnimation);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("Plugin-ChartF_Animation"), panel);
}
protected JPanel createAutoRefreshPane(VanChartPlot plot){
autoRefreshPane = getMoreLabelPane(plot);
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("Plugin-ChartF_Moniter_refresh"), autoRefreshPane);
}
protected AutoRefreshPane getMoreLabelPane(VanChartPlot plot) {
boolean isLargeModel = largeModel(plot);
return new AutoRefreshPane((VanChart) chart, isLargeModel);
}
protected JPanel createHyperlinkPane() {
superLink = new VanChartHyperLinkPane();
return TableLayout4VanChartHelper.createExpandablePaneWithTitle(Inter.getLocText("M_Insert-Hyperlink"), superLink);
}
private void checkZoomPane() {
boolean zoomWidgetEnabled = zoomWidget.getSelectedIndex() == 0;
changeEnablePane.setVisible(zoomWidgetEnabled);
zoomType.setEnabled(!zoomWidgetEnabled);
}
@Override
public void populateBean(Chart chart) {
if (chart == null || chart.getPlot() == null) {
return;
}
this.chart = chart;
VanChartPlot plot = (VanChartPlot)chart.getPlot();
if(interactivePane == null){
this.remove(leftcontentPane);
reLayoutContentPane(plot);
}
if(plot.isSupportZoomDirection()){//支持缩放方向=方向+控件
populateChartZoom((VanChart)chart);
checkZoomPane();
}
if (plot.getAxisPlotType() == AxisPlotType.RECTANGLE){
populateChartAxisRotation(plot);
}
populateChartTools((VanChart) chart);
populateChartAnimate(chart, plot);
populateAutoRefresh((VanChart)chart);
populateHyperlink(plot);
checkZoomEnabled();
}
protected void populateHyperlink(Plot plot) {
superLink.populate(plot);
}
private void populateChartTools(VanChart chart) {
VanChartTools vanChartTools = chart.getVanChartTools();
isSort.setSelected(vanChartTools.isSort());
exportImages.setSelected(vanChartTools.isExport());
fullScreenDisplay.setSelected(vanChartTools.isFullScreen());
collapse.setSelected(vanChartTools.isHidden());
}
private void populateChartZoom(VanChart chart) {
VanChartZoom zoom = chart.getVanChartZoom();
if(zoom == null){
zoom = new VanChartZoom();
}
zoomWidget.setSelectedIndex(zoom.isZoomVisible() ? 0 : 1);
zoomGesture.setSelectedIndex(zoom.isZoomGesture() ? 0 : 1);
zoomResize.setSelectedIndex(zoom.isZoomResize() ? 0 : 1);
if (zoom.getFrom() instanceof BaseFormula) {
from.populateBean(((BaseFormula) zoom.getFrom()).getContent());
} else {
from.populateBean(Utils.objectToString(zoom.getFrom()));
}
if (zoom.getTo() instanceof BaseFormula) {
to.populateBean(((BaseFormula) zoom.getTo()).getContent());
} else {
to.populateBean(Utils.objectToString(zoom.getTo()));
}
zoomType.setSelectedItem(zoom.getZoomType());
}
private void populateChartAxisRotation(VanChartPlot plot) {
axisRotation.setSelectedIndex(plot.isAxisRotation() ? 0 : 1);
}
private void populateChartAnimate(Chart chart, Plot plot) {
if(plot.isSupportAnimate()) {
isChartAnimation.setSelectedIndex(chart.isJSDraw() ? 0 : 1);
isChartAnimation.setEnabled(!largeModel(plot));
}
}
protected boolean largeModel(Plot plot) {
return PlotFactory.largeDataModel(plot);
}
protected void populateAutoRefresh(VanChart chart) {
VanChartPlot plot = (VanChartPlot)chart.getPlot();
RefreshMoreLabel refreshMoreLabel = chart.getRefreshMoreLabel();
if(refreshMoreLabel == null) {
refreshMoreLabel = new RefreshMoreLabel(((VanChartPlot)chart.getPlot()).getAutoAttrTooltip());
}
autoRefreshPane.populateBean(refreshMoreLabel);
}
@Override
public void updateBean(Chart chart) {
if (chart == null || chart.getPlot() == null) {
return;
}
VanChartPlot plot = (VanChartPlot)chart.getPlot();
if(plot.isSupportZoomDirection()){
updateChartZoom((VanChart)chart);
}
if(plot.getAxisPlotType() == AxisPlotType.RECTANGLE){
updateChartAxisRotation((VanChart)chart);
}
updateChartTools((VanChart)chart);
updateChartAnimate(chart, plot);
updateAutoRefresh((VanChart)chart);
updateHyperlink(plot);
}
protected void updateHyperlink(Plot plot){
superLink.update(plot);
}
private void updateChartTools(VanChart chart) {
VanChartTools vanChartTools = new VanChartTools();
vanChartTools.setExport(exportImages.isSelected());
vanChartTools.setFullScreen(fullScreenDisplay.isSelected());
vanChartTools.setSort(isSort.isSelected());
vanChartTools.setHidden(collapse.isSelected());
chart.setVanChartTools(vanChartTools);
}
private void updateChartZoom(VanChart chart) {
VanChartZoom zoom = chart.getVanChartZoom();
if(zoom == null){
zoom = new VanChartZoom();
chart.setVanChartZoom(zoom);
}
zoom.setZoomVisible(zoomWidget.getSelectedIndex() == 0);
zoom.setZoomGesture(zoomGesture.getSelectedIndex() == 0);
zoom.setZoomResize(zoomResize.getSelectedIndex() == 0);
String fromString = from.updateBean();
Object fromObject;
if (StableUtils.maybeFormula(fromString)) {
fromObject = BaseFormula.createFormulaBuilder().build(fromString);
} else {
fromObject = fromString;
}
zoom.setFrom(fromObject);
String toString = to.updateBean();
Object toObject;
if (StableUtils.maybeFormula(toString)) {
toObject = BaseFormula.createFormulaBuilder().build(toString);
} else {
toObject = toString;
}
zoom.setTo(toObject);
zoom.setZoomType(zoomType.getSelectedItem());
}
private void updateChartAxisRotation(VanChart chart) {
//坐标轴和plot都需要这个属性,因为坐标轴和plot是分开画的
VanChartPlot plot = (VanChartPlot) chart.getPlot();
plot.setAxisRotation(axisRotation.getSelectedIndex() == 0);
//同时更新坐标轴旋转属性
for (VanChartAxis axis : ((VanChartRectanglePlot) plot).getXAxisList()) {
axis.setRotation(plot.isAxisRotation());
}
for (VanChartAxis axis : ((VanChartRectanglePlot) plot).getYAxisList()) {
axis.setRotation(plot.isAxisRotation());
}
//更新数据表属性
if (plot.isAxisRotation()){
plot.getDataSheet().setVisible(false);
}
}
private void updateChartAnimate(Chart chart, Plot plot) {
if(plot.isSupportAnimate()) {
chart.setJSDraw(isChartAnimation.getSelectedIndex()==0);
}
}
private void updateAutoRefresh(VanChart chart) {
RefreshMoreLabel refreshMoreLabel = chart.getRefreshMoreLabel();
if(refreshMoreLabel == null) {
refreshMoreLabel = new RefreshMoreLabel(((VanChartPlot)chart.getPlot()).getAutoAttrTooltip());
chart.setRefreshMoreLabel(refreshMoreLabel);
}
autoRefreshPane.updateBean(refreshMoreLabel);
}
@Override
public Chart updateBean() {
return null;
}
/**
* 组件是否需要响应添加的观察者事件
*
* @return 如果需要响应观察者事件则返回true,否则返回false
*/
public boolean shouldResponseChangeListener() {
return true;
}
}