org.eclipse.birt.chart.reportitem.ui.StandardChartDataSheet.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.chart.reportitem.ui.StandardChartDataSheet.java

Source

/*******************************************************************************
 * Copyright (c) 2007 Actuate Corporation.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *  Actuate Corporation  - initial API and implementation
 *******************************************************************************/

package org.eclipse.birt.chart.reportitem.ui;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.eclipse.birt.chart.exception.ChartException;
import org.eclipse.birt.chart.model.Chart;
import org.eclipse.birt.chart.model.ChartWithAxes;
import org.eclipse.birt.chart.model.DialChart;
import org.eclipse.birt.chart.model.component.Series;
import org.eclipse.birt.chart.model.data.Query;
import org.eclipse.birt.chart.model.data.SeriesDefinition;
import org.eclipse.birt.chart.model.type.BubbleSeries;
import org.eclipse.birt.chart.model.type.DifferenceSeries;
import org.eclipse.birt.chart.model.type.GanttSeries;
import org.eclipse.birt.chart.model.type.StockSeries;
import org.eclipse.birt.chart.plugin.ChartEnginePlugin;
import org.eclipse.birt.chart.reportitem.ChartReportItemUtil;
import org.eclipse.birt.chart.reportitem.api.ChartCubeUtil;
import org.eclipse.birt.chart.reportitem.api.ChartItemUtil;
import org.eclipse.birt.chart.reportitem.api.ChartReportItemHelper;
import org.eclipse.birt.chart.reportitem.ui.ChartExpressionButtonUtil.ExpressionDescriptor;
import org.eclipse.birt.chart.reportitem.ui.ChartExpressionButtonUtil.IExpressionDescriptor;
import org.eclipse.birt.chart.reportitem.ui.ReportDataServiceProvider.DataSetInfo;
import org.eclipse.birt.chart.reportitem.ui.dialogs.ChartColumnBindingDialog;
import org.eclipse.birt.chart.reportitem.ui.dialogs.ExtendedItemFilterDialog;
import org.eclipse.birt.chart.reportitem.ui.dialogs.ReportItemParametersDialog;
import org.eclipse.birt.chart.reportitem.ui.i18n.Messages;
import org.eclipse.birt.chart.reportitem.ui.views.attributes.provider.ChartCubeFilterHandleProvider;
import org.eclipse.birt.chart.reportitem.ui.views.attributes.provider.ChartFilterProviderDelegate;
import org.eclipse.birt.chart.ui.swt.ColorPalette;
import org.eclipse.birt.chart.ui.swt.ColumnBindingInfo;
import org.eclipse.birt.chart.ui.swt.CustomPreviewTable;
import org.eclipse.birt.chart.ui.swt.DataDefinitionTextManager;
import org.eclipse.birt.chart.ui.swt.DefaultChartDataSheet;
import org.eclipse.birt.chart.ui.swt.SimpleTextTransfer;
import org.eclipse.birt.chart.ui.swt.composites.DataItemCombo;
import org.eclipse.birt.chart.ui.swt.interfaces.IChartDataSheet;
import org.eclipse.birt.chart.ui.swt.interfaces.IDataServiceProvider;
import org.eclipse.birt.chart.ui.swt.interfaces.IExpressionButton;
import org.eclipse.birt.chart.ui.swt.interfaces.ISelectDataComponent;
import org.eclipse.birt.chart.ui.swt.interfaces.ISelectDataCustomizeUI;
import org.eclipse.birt.chart.ui.swt.wizard.ChartAdapter;
import org.eclipse.birt.chart.ui.swt.wizard.ChartWizard;
import org.eclipse.birt.chart.ui.swt.wizard.data.SelectDataDynamicArea;
import org.eclipse.birt.chart.ui.swt.wizard.preview.ChartLivePreviewThread;
import org.eclipse.birt.chart.ui.swt.wizard.preview.LivePreviewTask;
import org.eclipse.birt.chart.ui.util.ChartUIConstants;
import org.eclipse.birt.chart.ui.util.ChartUIUtil;
import org.eclipse.birt.chart.ui.util.UIHelper;
import org.eclipse.birt.chart.util.ChartExpressionUtil.ExpressionCodec;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.ui.frameworks.taskwizard.WizardBase;
import org.eclipse.birt.core.ui.frameworks.taskwizard.interfaces.ITask;
import org.eclipse.birt.report.designer.internal.ui.data.DataService;
import org.eclipse.birt.report.designer.internal.ui.views.ViewsTreeProvider;
import org.eclipse.birt.report.designer.internal.ui.views.attributes.provider.AbstractFilterHandleProvider;
import org.eclipse.birt.report.designer.ui.cubebuilder.action.NewCubeAction;
import org.eclipse.birt.report.designer.ui.dialogs.ColumnBindingDialog;
import org.eclipse.birt.report.designer.ui.dialogs.ExpressionProvider;
import org.eclipse.birt.report.designer.ui.expressions.ExpressionFilter;
import org.eclipse.birt.report.designer.ui.util.UIUtil;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.item.crosstab.core.de.CrosstabReportItemHandle;
import org.eclipse.birt.report.model.api.ComputedColumnHandle;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.ExtendedItemHandle;
import org.eclipse.birt.report.model.api.LevelAttributeHandle;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.MultiViewsHandle;
import org.eclipse.birt.report.model.api.ReportElementHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.metadata.IClassInfo;
import org.eclipse.birt.report.model.api.olap.CubeHandle;
import org.eclipse.birt.report.model.api.olap.LevelHandle;
import org.eclipse.birt.report.model.api.olap.MeasureHandle;
import org.eclipse.birt.report.model.elements.interfaces.ITableItemModel;
import org.eclipse.birt.report.model.elements.olap.Level;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DragSource;
import org.eclipse.swt.dnd.DragSourceEvent;
import org.eclipse.swt.dnd.DragSourceListener;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MenuDetectEvent;
import org.eclipse.swt.events.MenuDetectListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;

/**
 * Data sheet implementation for Standard Chart
 */

public class StandardChartDataSheet extends DefaultChartDataSheet implements Listener {

    private static final String KEY_PREVIEW_DATA = "Preview Data"; //$NON-NLS-1$
    final protected ExtendedItemHandle itemHandle;
    final protected ReportDataServiceProvider dataProvider;

    private Button btnInherit = null;
    private Button btnUseData = null;
    private boolean bIsInheritSelected = true;

    private CCombo cmbInherit = null;
    private DataItemCombo cmbDataItems = null;

    protected StackLayout stackLayout = null;
    protected Composite cmpStack = null;
    protected Composite cmpCubeTree = null;
    private Composite cmpDataPreview = null;
    protected Composite cmpColumnsList = null;

    private CustomPreviewTable tablePreview = null;
    protected TreeViewer treeViewer = null;

    private Button btnFilters = null;
    private Button btnParameters = null;
    private Button btnBinding = null;
    private Object currentDataReference = null;
    private Object previousDataReference = null;

    public static final int SELECT_NONE = 1;
    public static final int SELECT_NEXT = 2;
    public static final int SELECT_DATA_SET = 4;
    public static final int SELECT_DATA_CUBE = 8;
    public static final int SELECT_REPORT_ITEM = 16;
    public static final int SELECT_NEW_DATASET = 32;
    public static final int SELECT_NEW_DATACUBE = 64;

    private final int iSupportedDataItems;

    private List<Integer> selectDataTypes = new ArrayList<Integer>();
    private Button btnShowDataPreviewA;
    private Button btnShowDataPreviewB;
    private TableViewer tableViewerColumns;
    protected Label columnListDescription;
    private Label dataPreviewDescription;
    protected ExpressionCodec exprCodec = null;
    protected ChartReportItemHelper chartItemHelper = ChartReportItemHelper.instance();

    private static final String HEAD_INFO = "HeaderInfo"; //$NON-NLS-1$

    private static final String DATA_LIST = "DataList"; //$NON-NLS-1$

    private Composite parentComposite;
    protected Label treeViewerTitle;
    protected Label treeViewerDescription;

    public StandardChartDataSheet(ExtendedItemHandle itemHandle, ReportDataServiceProvider dataProvider,
            int iSupportedDataItems) {
        this.itemHandle = itemHandle;
        this.dataProvider = dataProvider;
        this.iSupportedDataItems = iSupportedDataItems;
        this.exprCodec = chartItemHelper.createExpressionCodec(itemHandle);

        addListener(this);
    }

    public StandardChartDataSheet(ExtendedItemHandle itemHandle, ReportDataServiceProvider dataProvider) {
        this(itemHandle, dataProvider, 0);
    }

    @Override
    public Composite createActionButtons(Composite parent) {
        Composite composite = ChartUIUtil.createCompositeWrapper(parent);
        {
            composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END));
        }

        btnFilters = new Button(composite, SWT.NONE);
        {
            btnFilters.setAlignment(SWT.CENTER);
            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
            btnFilters.setLayoutData(gridData);
            btnFilters.setText(Messages.getString("StandardChartDataSheet.Label.Filters")); //$NON-NLS-1$
            btnFilters.addListener(SWT.Selection, this);
        }

        btnParameters = new Button(composite, SWT.NONE);
        {
            btnParameters.setAlignment(SWT.CENTER);
            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
            btnParameters.setLayoutData(gridData);
            btnParameters.setText(Messages.getString("StandardChartDataSheet.Label.Parameters")); //$NON-NLS-1$
            btnParameters.addListener(SWT.Selection, this);
        }

        btnBinding = new Button(composite, SWT.NONE);
        {
            btnBinding.setAlignment(SWT.CENTER);
            GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
            btnBinding.setLayoutData(gridData);
            btnBinding.setText(Messages.getString("StandardChartDataSheet.Label.DataBinding")); //$NON-NLS-1$
            btnBinding.addListener(SWT.Selection, this);
        }

        setEnabledForButtons();
        return composite;
    }

    private void setEnabledForButtons() {
        if (isCubeMode()) {
            // Inherit xtab means container has cube but chart has no cube
            boolean inheritXTab = getDataServiceProvider().checkState(IDataServiceProvider.INHERIT_CUBE)
                    && !(getDataServiceProvider().checkState(IDataServiceProvider.HAS_CUBE)
                            && !getDataServiceProvider().checkState(IDataServiceProvider.IN_MULTI_VIEWS));
            if (inheritXTab) {
                btnFilters.setEnabled(false);
                btnBinding.setEnabled(false);
            } else {
                boolean disabled = getDataServiceProvider().isInXTabAggrCell()
                        || getDataServiceProvider().isInXTabMeasureCell();
                btnFilters
                        .setEnabled(!disabled && (getDataServiceProvider().checkState(IDataServiceProvider.HAS_CUBE)
                                || !getDataServiceProvider().isInheritColumnsGroups()));
                btnBinding.setEnabled((getDataServiceProvider().checkState(IDataServiceProvider.HAS_CUBE)
                        || !getDataServiceProvider().isInheritColumnsGroups())
                        && getDataServiceProvider().isInvokingSupported()
                        || getDataServiceProvider().isSharedBinding());
            }
            btnParameters.setEnabled(false);
        } else {
            boolean shareTable = getDataServiceProvider().checkState(IDataServiceProvider.SHARE_TABLE_QUERY);
            if (shareTable) {
                btnFilters.setEnabled(false);
                btnBinding.setEnabled(false);
            } else {
                btnFilters.setEnabled(hasDataSet() && !getDataServiceProvider().isInheritColumnsGroups());
                btnBinding.setEnabled(hasDataSet() && !getDataServiceProvider().isInheritColumnsGroups()
                        && (getDataServiceProvider().isInvokingSupported()
                                || getDataServiceProvider().isSharedBinding()));
            }
            // Bugzilla#177704 Chart inheriting data from container doesn't
            // support parameters due to limitation in DtE
            btnParameters.setEnabled(getDataServiceProvider().getDataSet() != null
                    && getDataServiceProvider().isInvokingSupported());
        }
    }

    private boolean hasDataSet() {
        return getDataServiceProvider().getInheritedDataSet() != null
                || getDataServiceProvider().getDataSet() != null;
    }

    void fireEvent(Widget widget, int eventType) {
        Event event = new Event();
        event.data = this;
        event.widget = widget;
        event.type = eventType;
        notifyListeners(event);
    }

    private Composite createTreeViewComposite(Composite parent) {
        Composite cubeTreeComp = ChartUIUtil.createCompositeWrapper(parent);
        treeViewerTitle = new Label(cubeTreeComp, SWT.NONE);
        {
            treeViewerTitle.setText(Messages.getString("StandardChartDataSheet.Label.CubeTree")); //$NON-NLS-1$
            treeViewerTitle.setFont(JFaceResources.getBannerFont());
        }

        if (!dataProvider.isInXTabMeasureCell() && !dataProvider.isInMultiView()) {
            // No description if dnd is disabled
            treeViewerDescription = new Label(cubeTreeComp, SWT.WRAP);
            {
                GridData gd = new GridData(GridData.FILL_HORIZONTAL);
                treeViewerDescription.setLayoutData(gd);
                treeViewerDescription.setText(getCubeTreeViewNote());
            }
        }

        treeViewer = new TreeViewer(cubeTreeComp, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        treeViewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
        ((GridData) treeViewer.getTree().getLayoutData()).heightHint = 120;

        ViewsTreeProvider provider = createCubeViewProvider();
        treeViewer.setLabelProvider(provider);
        treeViewer.setContentProvider(provider);
        treeViewer.setInput(getCube());

        if (!Platform.getOS().equals(Platform.OS_MACOSX)) {
            final DragSource dragSource = new DragSource(treeViewer.getTree(), DND.DROP_COPY);
            dragSource.setTransfer(new Transfer[] { SimpleTextTransfer.getInstance() });
            dragSource.addDragListener(new DragSourceListener() {

                private String text = null;

                public void dragFinished(DragSourceEvent event) {
                    // TODO Auto-generated method stub

                }

                public void dragSetData(DragSourceEvent event) {
                    event.data = text;
                }

                public void dragStart(DragSourceEvent event) {
                    text = getDraggableCubeExpression();
                    if (text == null) {
                        event.doit = false;
                    }
                }
            });
        }

        treeViewer.getTree().addListener(SWT.MouseDown, new Listener() {

            public void handleEvent(Event event) {
                if (event.button == 3 && event.widget instanceof Tree) {
                    Tree tree = (Tree) event.widget;
                    TreeItem treeItem = tree.getSelection()[0];
                    if (dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {
                        tree.setMenu(null);
                    } else {
                        tree.setMenu(createMenuManager(getHandleFromSelection(treeItem.getData()))
                                .createContextMenu(tree));
                        // tree.getMenu( ).setVisible( true );
                    }

                }
            }
        });

        return cubeTreeComp;
    }

    private Composite createTableViewComposite(Composite parent) {
        Composite tabularDataViewComp = ChartUIUtil.createCompositeWrapper(parent);
        Label label = new Label(tabularDataViewComp, SWT.NONE);
        {
            label.setText(Messages.getString("StandardChartDataSheet.Label.DataPreview")); //$NON-NLS-1$
            label.setFont(JFaceResources.getBannerFont());
        }

        if (!dataProvider.isInXTabMeasureCell() && !dataProvider.isInMultiView()) {
            dataPreviewDescription = new Label(tabularDataViewComp, SWT.WRAP);
            {
                GridData gd = new GridData(GridData.FILL_HORIZONTAL);
                dataPreviewDescription.setLayoutData(gd);
                dataPreviewDescription.setText(getDataPreviewDescription());
            }
        }

        btnShowDataPreviewA = new Button(tabularDataViewComp, SWT.CHECK);
        btnShowDataPreviewA.setText(Messages.getString("StandardChartDataSheet.Label.ShowDataPreview")); //$NON-NLS-1$
        btnShowDataPreviewA.addListener(SWT.Selection, this);

        tablePreview = new CustomPreviewTable(tabularDataViewComp,
                SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        {
            GridData gridData = new GridData(GridData.FILL_BOTH);
            gridData.widthHint = 400;
            gridData.heightHint = 120;
            tablePreview.setLayoutData(gridData);
            tablePreview.setHeaderAlignment(SWT.LEFT);
            tablePreview.addListener(CustomPreviewTable.MOUSE_RIGHT_CLICK_TYPE, this);
        }

        return tabularDataViewComp;
    }

    private Composite createColumnListViewComposite(Composite parent) {
        Composite columnsListDataViewComp = ChartUIUtil.createCompositeWrapper(parent);

        Label label = new Label(columnsListDataViewComp, SWT.NONE);
        {
            label.setText(Messages.getString("StandardChartDataSheet.Label.DataPreview")); //$NON-NLS-1$
            label.setFont(JFaceResources.getBannerFont());
        }

        if (!dataProvider.isInXTabMeasureCell()) {
            columnListDescription = new Label(columnsListDataViewComp, SWT.WRAP);
            {
                GridData gd = new GridData(GridData.FILL_HORIZONTAL);
                columnListDescription.setLayoutData(gd);
                columnListDescription.setText(getDataPreviewDescription());
            }
        }

        btnShowDataPreviewB = new Button(columnsListDataViewComp, SWT.CHECK);
        btnShowDataPreviewB.setText(Messages.getString("StandardChartDataSheet.Label.ShowDataPreview")); //$NON-NLS-1$
        btnShowDataPreviewB.addListener(SWT.Selection, this);

        // Add a list to display all columns.
        final Table table = new Table(columnsListDataViewComp,
                SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
        GridData gd = new GridData(GridData.FILL_BOTH);
        table.setLayoutData(gd);
        table.setLinesVisible(true);
        tableViewerColumns = new TableViewer(table);
        tableViewerColumns.setUseHashlookup(true);
        new TableColumn(table, SWT.LEFT);

        table.addMouseMoveListener(new MouseMoveListener() {

            @SuppressWarnings("unchecked")
            public void mouseMove(MouseEvent e) {
                if (!dataProvider.isLivePreviewEnabled()) {
                    table.setToolTipText(null);
                    return;
                }

                String tooltip = null;
                TableItem item = ((Table) e.widget).getItem(new Point(e.x, e.y));
                if (item != null) {
                    List<Object[]> data = (List<Object[]>) tableViewerColumns.getData(KEY_PREVIEW_DATA);
                    if (data != null) {
                        StringBuilder sb = new StringBuilder();

                        int index = ((Table) e.widget).indexOf(item);
                        int i = 0;
                        for (; i < data.size(); i++) {
                            if (sb.length() > 45) {
                                break;
                            }
                            if (data.get(i)[index] != null) {
                                if (i != 0)
                                    sb.append("; "); //$NON-NLS-1$
                                sb.append(String.valueOf(data.get(i)[index]));
                            }
                        }

                        if (i == 1 && sb.length() > 45) {
                            sb = new StringBuilder(sb.substring(0, 45));
                            sb.append("...");//$NON-NLS-1$
                        } else if (i < data.size()) {
                            sb.append(";..."); //$NON-NLS-1$
                        }

                        tooltip = sb.toString();
                    }

                }
                table.setToolTipText(tooltip);

            }
        });

        table.addMenuDetectListener(new MenuDetectListener() {

            public void menuDetected(MenuDetectEvent arg0) {
                if (isCubeMode()) {
                    // share cube
                    table.setMenu(null);
                } else {
                    TableItem item = table.getSelection()[0];
                    if (item == null) {
                        tableViewerColumns.getTable().select(-1);
                    }
                    // Bind context menu to each header button
                    boolean isSharingChart = dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY);
                    if (item != null && !isSharingChart) {
                        if (table.getMenu() != null) {
                            table.getMenu().dispose();
                        }
                        table.setMenu(createMenuManager(item.getData()).createContextMenu(table));
                    } else {
                        table.setMenu(null);
                    }

                    if (table.getMenu() != null && !isSharingChart) {
                        table.getMenu().setVisible(true);
                    }
                }

            }
        });

        table.addListener(SWT.Resize, new Listener() {

            public void handleEvent(Event event) {
                Table table = (Table) event.widget;
                int totalWidth = table.getClientArea().width;
                table.getColumn(0).setWidth(totalWidth);
            }
        });

        if (!Platform.getOS().equals(Platform.OS_MACOSX)) {
            // Set drag/drop.
            DragSource ds = new DragSource(table, DND.DROP_COPY | DND.DROP_MOVE);
            ds.setTransfer(new Transfer[] { SimpleTextTransfer.getInstance() });
            ColumnNamesTableDragListener dragSourceAdapter = new ColumnNamesTableDragListener(table, itemHandle);
            ds.addDragListener(dragSourceAdapter);
        }

        tableViewerColumns.setContentProvider(new IStructuredContentProvider() {

            /**
             * Gets the food items for the list
             * 
             * @param arg0
             *            the data model
             * @return Object[]
             */
            public Object[] getElements(Object arg0) {
                if (arg0 == null)
                    return null;
                return (ColumnBindingInfo[]) arg0;
            }

            /**
             * Disposes any created resources
             */
            public void dispose() {
                // Do nothing
            }

            /**
             * Called when the input changes
             * 
             * @param arg0
             *            the viewer
             * @param arg1
             *            the old input
             * @param arg2
             *            the new input
             */
            public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
                // Do nothing
            }
        });
        tableViewerColumns.setLabelProvider(new ILabelProvider() {

            /**
             * images
             * 
             * @param arg0
             *            the element
             * @return Image
             */
            public Image getImage(Object arg0) {
                String imageName = ((ColumnBindingInfo) arg0).getImageName();
                if (imageName == null)
                    return null;
                return UIHelper.getImage(imageName);
            }

            /**
             * Gets the text for an element
             * 
             * @param arg0
             *            the element
             * @return String
             */
            public String getText(Object arg0) {
                return ((ColumnBindingInfo) arg0).getName();
            }

            /**
             * Adds a listener
             * 
             * @param arg0
             *            the listener
             */
            public void addListener(ILabelProviderListener arg0) {
                // Throw it away
            }

            /**
             * Disposes any resources
             */
            public void dispose() {
                // Nothing to dispose
            }

            /**
             * Returns whether changing the specified property for the specified
             * element affect the label
             * 
             * @param arg0
             *            the element
             * @param arg1
             *            the property
             * @return boolean
             */
            public boolean isLabelProperty(Object arg0, String arg1) {
                return false;
            }

            /**
             * Removes a listener
             * 
             * @param arg0
             *            the listener
             */
            public void removeListener(ILabelProviderListener arg0) {
                // Ignore
            }
        });

        return columnsListDataViewComp;
    }

    @Override
    public Composite createDataDragSource(Composite parent) {
        cmpStack = new Composite(parent, SWT.NONE);
        cmpStack.setLayoutData(new GridData(GridData.FILL_BOTH));
        stackLayout = new StackLayout();
        stackLayout.marginHeight = 0;
        stackLayout.marginWidth = 0;
        cmpStack.setLayout(stackLayout);

        cmpCubeTree = this.createTreeViewComposite(cmpStack);
        cmpDataPreview = this.createTableViewComposite(cmpStack);
        cmpColumnsList = this.createColumnListViewComposite(cmpStack);

        updateDragDataSource();
        return cmpStack;
    }

    protected ViewsTreeProvider createCubeViewProvider() {
        ViewsTreeProvider provider = new ViewsTreeProvider() {

            @Override
            public Color getBackground(Object element) {
                if (element instanceof ReportElementHandle) {
                    String key = getBindingNameFrom((ReportElementHandle) element);
                    return ColorPalette.getInstance().getColor(key);
                }
                return super.getBackground(element);
            }
        };
        return provider;
    }

    /**
     * Returns a note for cube tree view.
     * 
     * @return
     */
    protected String getCubeTreeViewNote() {
        return Messages.getString("StandardChartDataSheet.Label.DragCube"); //$NON-NLS-1$
    }

    private void updateDragDataSource() {
        updateDataPreviewDescComposite();

        if (isCubeMode()) {
            updateDragDataSourceWithCubeData();
        } else {
            updateDragDataSourceWithTabularData();
        }
    }

    private void updateDataPreviewDescComposite() {
        if (dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {// hide the description if share chart
            if (columnListDescription != null) {
                ((GridData) columnListDescription.getLayoutData()).exclude = true;
                columnListDescription.setVisible(false);
                cmpColumnsList.layout();
            }
            if (dataPreviewDescription != null) {
                ((GridData) dataPreviewDescription.getLayoutData()).exclude = true;
                dataPreviewDescription.setVisible(false);
                cmpDataPreview.layout();
            }

        }
    }

    protected void updateDragDataSourceWithTabularData() {
        if (columnListDescription != null) {
            if (!dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {
                ((GridData) columnListDescription.getLayoutData()).exclude = false;
                columnListDescription.setVisible(true);
                columnListDescription.setText(getDataPreviewDescription());
                cmpColumnsList.layout();
            }
        }
        btnShowDataPreviewB.setEnabled(true);

        // Clear data preview setting if current data item was changed.
        Object pValue = (previousDataReference == null) ? "" : previousDataReference; //$NON-NLS-1$
        Object cValue = (currentDataReference == null) ? "" : currentDataReference; //$NON-NLS-1$
        if (!pValue.equals(cValue)) {
            getContext().setShowingDataPreview(null);
        }
        previousDataReference = currentDataReference;

        try {
            // If it is initial state and the columns are equal and greater
            // than 6, do not use data preview, just use columns list view.
            if (!getContext().isSetShowingDataPreview()
                    && getDataServiceProvider().getPreviewHeadersInfo().length >= 6) {
                getContext().setShowingDataPreview(Boolean.FALSE);
            }
            ChartWizard.removeException(ChartWizard.StaChartDSh_gHeaders_ID);
        } catch (NullPointerException e) {
            // Do not do anything.
        } catch (ChartException e) {
            ChartWizard.showException(ChartWizard.StaChartDSh_gHeaders_ID, e.getMessage());
        }

        btnShowDataPreviewA.setSelection(getContext().isShowingDataPreview());
        btnShowDataPreviewB.setSelection(getContext().isShowingDataPreview());

        if (getContext().isShowingDataPreview()) {
            stackLayout.topControl = cmpDataPreview;
        } else {
            stackLayout.topControl = cmpColumnsList;
        }

        refreshDataPreviewPane();

        cmpStack.layout();
    }

    private void updateDragDataSourceWithCubeData() {
        treeViewerTitle.setText(Messages.getString("StandardChartDataSheet.Label.CubeTree")); //$NON-NLS-1$
        if (treeViewerDescription != null) {
            treeViewerDescription.setText(getCubeTreeViewNote());
        }
        if (getDataServiceProvider().checkState(IDataServiceProvider.SHARE_CROSSTAB_QUERY)) {// share cube

            if (!getDataServiceProvider().checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {
                ((GridData) columnListDescription.getLayoutData()).exclude = false;
                columnListDescription.setVisible(true);
                columnListDescription.setText(Messages.getString("StandardChartDataSheet.Label.ShareCrossTab")); //$NON-NLS-1$
                cmpColumnsList.layout();
            }

            getContext().setShowingDataPreview(Boolean.FALSE);
            btnShowDataPreviewB.setSelection(false);
            btnShowDataPreviewB.setEnabled(false);

            stackLayout.topControl = cmpColumnsList;
            refreshDataPreviewPane();
        } else if (getDataServiceProvider().checkState(IDataServiceProvider.INHERIT_CUBE)) {// inheritance
            stackLayout.topControl = cmpColumnsList;
            getContext().setShowingDataPreview(Boolean.FALSE);
            btnShowDataPreviewB.setSelection(false);
            btnShowDataPreviewB.setEnabled(false);
            refreshDataPreviewPane();
        } else {
            stackLayout.topControl = cmpCubeTree;
            ViewsTreeProvider provider = createCubeViewProvider();
            treeViewer.setLabelProvider(provider);
            treeViewer.setContentProvider(provider);
            treeViewer.setInput(getCube());
        }

        cmpStack.layout();
        ChartWizard.removeException(ChartWizard.StaChartDSh_dPreview_ID);
    }

    /**
     * Check if chart is direct consuming cube, should exclude sharing
     * cube/inheriting cube/xtab-chart with cube/multiview with cube cases.
     * 
     * @return
     */
    protected boolean isCubeTreeView() {
        boolean bCube = this.getDataServiceProvider().getBindingCubeHandle() != null;
        if (bCube) {
            int selectedIndex = cmbDataItems.getSelectionIndex();
            if (selectedIndex < 0) {
                return false;
            }
            Integer selectState = selectDataTypes.get(selectedIndex);
            return selectState.intValue() == SELECT_DATA_CUBE;
        }
        return false;
    }

    /**
     * 
     */
    private void refreshDataPreviewPane() {
        if (isCubeTreeView()) {
            return;
        }
        if (getContext().isShowingDataPreview()) {
            refreshTablePreview();
        } else {
            refreshDataPreview();
        }
    }

    private void refreshDataPreview() {
        final boolean isTablePreview = getContext().isShowingDataPreview();
        LivePreviewTask lpt = new LivePreviewTask(Messages.getString("StandardChartDataSheet.Message.RetrieveData"), //$NON-NLS-1$
                null);
        // Add a task to retrieve data and bind data to chart.
        lpt.addTask(new LivePreviewTask() {

            public void run() {
                ColumnBindingInfo[] headers = null;
                List<?> dataList = null;
                try {
                    // Get header and data in other thread.
                    headers = getDataServiceProvider().getPreviewHeadersInfo();
                    // Only when live preview is enabled, it retrieves data.
                    if (!isCubeMode() && dataProvider.isLivePreviewEnabled()) {
                        dataList = getPreviewData();
                    }

                    this.setParameter(HEAD_INFO, headers);
                    this.setParameter(DATA_LIST, dataList);
                } catch (Exception e) {
                    final ColumnBindingInfo[] headerInfo = headers;
                    final List<?> data = dataList;

                    // Catch any exception.
                    final String message = e.getLocalizedMessage();
                    Display.getDefault().syncExec(new Runnable() {

                        /*
                         * (non-Javadoc)
                         * 
                         * @see java.lang.Runnable#run()
                         */
                        public void run() {
                            if (isTablePreview) {
                                // Still update table preview in here to ensure
                                // the
                                // column headers of table preview can be
                                // updated
                                // and user can select expression from table
                                // preview
                                // even if there is no preview data.
                                updateTablePreview(headerInfo, data);
                            } else {
                                updateColumnsTableViewer(headerInfo, data);
                            }
                            ChartWizard.showException(ChartWizard.StaChartDSh_dPreview_ID, message);
                        }
                    });
                }
            }
        });

        // Add a task to render chart.
        lpt.addTask(new LivePreviewTask() {

            public void run() {

                final ColumnBindingInfo[] headerInfo = (ColumnBindingInfo[]) this.getParameter(HEAD_INFO);
                if (headerInfo == null) {
                    return;
                }

                final List<?> data = (List<?>) this.getParameter(DATA_LIST);
                // Execute UI operation in UI thread.
                Display.getDefault().syncExec(new Runnable() {

                    public void run() {
                        if (isTablePreview) {
                            updateTablePreview(headerInfo, data);
                        } else {
                            updateColumnsTableViewer(headerInfo, data);
                        }
                        ChartWizard.removeException(ChartWizard.StaChartDSh_dPreview_ID);
                    }

                });
            }
        });

        // Add live preview tasks to live preview thread.
        ((ChartLivePreviewThread) context.getLivePreviewThread()).setParentShell(parentComposite.getShell());
        ((ChartLivePreviewThread) context.getLivePreviewThread()).add(lpt);
    }

    /**
     * @param headerInfo
     * @param data
     */
    private void updateColumnsTableViewer(final ColumnBindingInfo[] headerInfo, final List<?> data) {
        if (tableViewerColumns.getTable().isDisposed()) {
            return;
        }
        // Set input.
        tableViewerColumns.setInput(headerInfo);
        tableViewerColumns.setData(KEY_PREVIEW_DATA, data);

        // Make the selected column visible and active.
        int index = tablePreview.getCurrentColumnIndex();
        if (index >= 0) {
            tableViewerColumns.getTable().setFocus();
            tableViewerColumns.getTable().select(index);
            tableViewerColumns.getTable().showSelection();
        }

        updateColumnsTableViewerColor();
    }

    @Override
    public Composite createDataSelector(Composite parent) {
        parentComposite = parent;
        // select the only data set
        if (itemHandle.getDataBindingType() == ReportItemHandle.DATABINDING_TYPE_NONE
                && itemHandle.getContainer() instanceof ModuleHandle) {
            DataSetInfo[] dataSets = dataProvider.getAllDataSets();
            if (dataProvider.getAllDataCubes().length == 0 && dataSets.length == 1) {
                dataProvider.setDataSet(dataSets[0]);
            }
        }

        Composite cmpDataSet = ChartUIUtil.createCompositeWrapper(parent);
        {
            cmpDataSet.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        }

        Label label = new Label(cmpDataSet, SWT.NONE);
        {
            label.setText(Messages.getString("StandardChartDataSheet.Label.SelectDataSet")); //$NON-NLS-1$
            label.setFont(JFaceResources.getBannerFont());
        }

        Composite cmpDetail = new Composite(cmpDataSet, SWT.NONE);
        {
            GridLayout gridLayout = new GridLayout(2, false);
            gridLayout.marginWidth = 10;
            gridLayout.marginHeight = 0;
            cmpDetail.setLayout(gridLayout);
            cmpDetail.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        }

        Composite compRadios = ChartUIUtil.createCompositeWrapper(cmpDetail);
        {
            GridData gd = new GridData();
            gd.verticalSpan = 2;
            compRadios.setLayoutData(gd);
        }

        btnInherit = new Button(compRadios, SWT.RADIO);
        btnInherit.setText(Messages.getString("StandardChartDataSheet.Label.UseReportData")); //$NON-NLS-1$
        btnInherit.addListener(SWT.Selection, this);

        btnUseData = new Button(compRadios, SWT.RADIO);
        btnUseData.setText(Messages.getString("StandardChartDataSheet.Label.UseDataSet")); //$NON-NLS-1$
        btnUseData.addListener(SWT.Selection, this);

        cmbInherit = new CCombo(cmpDetail, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER);
        cmbInherit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        cmbInherit.addListener(SWT.Selection, this);

        cmbDataItems = new DataItemCombo(cmpDetail, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER) {

            @Override
            public boolean triggerSelection(int index) {
                int selectState = selectDataTypes.get(index).intValue();
                if (selectState == SELECT_NEW_DATASET || selectState == SELECT_NEW_DATACUBE) {
                    return false;
                }
                return true;
            }

            @Override
            public boolean skipSelection(int index) {
                //skip out of boundary selection
                if (index >= 0) {
                    int selectState = selectDataTypes.get(index).intValue();
                    if (selectState == SELECT_NEXT) {
                        return true;
                    }
                }

                return false;
            }
        };
        cmbDataItems.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        cmbDataItems.addListener(SWT.Selection, this);
        cmbDataItems.setVisibleItemCount(30);

        initDataSelector();
        updatePredefinedQueries();
        checkDataBinding();
        if (dataProvider.checkState(IDataServiceProvider.IN_MULTI_VIEWS)) {
            autoSelect(false);
        }
        return cmpDataSet;
    }

    int invokeNewDataSet() {
        int count = getDataServiceProvider().getAllDataSets().length;
        DataService.getInstance().createDataSet();

        if (getDataServiceProvider().getAllDataSets().length == count) {
            // user cancel this operation
            return Window.CANCEL;
        }

        return Window.OK;
    }

    int invokeEditFilter() {
        ExtendedItemHandle handle = getItemHandle();
        handle.getModuleHandle().getCommandStack().startTrans(null);
        ExtendedItemFilterDialog page = new ExtendedItemFilterDialog(handle);

        AbstractFilterHandleProvider provider = ChartFilterProviderDelegate.createFilterProvider(handle, handle,
                dataProvider);
        if (provider instanceof ChartCubeFilterHandleProvider) {
            ((ChartCubeFilterHandleProvider) provider).setContext(getContext());
        }
        page.setFilterHandleProvider(provider);

        int openStatus = page.open();
        if (openStatus == Window.OK) {
            handle.getModuleHandle().getCommandStack().commit();
        } else {
            handle.getModuleHandle().getCommandStack().rollback();
        }

        return openStatus;
    }

    int invokeEditParameter() {
        ReportItemParametersDialog page = new ReportItemParametersDialog(getItemHandle());
        return page.open();
    }

    int invokeDataBinding() {
        Shell shell = new Shell(Display.getDefault(), SWT.DIALOG_TRIM | SWT.RESIZE | SWT.APPLICATION_MODAL);
        // #194163: Do not register CS help in chart since it's registered in
        // super column binding dialog.
        // ChartUIUtil.bindHelp( shell,
        // ChartHelpContextIds.DIALOG_DATA_SET_COLUMN_BINDING );
        ExtendedItemHandle handle = getItemHandle();

        handle.getModuleHandle().getCommandStack().startTrans(null);
        ColumnBindingDialog page = new ChartColumnBindingDialog(handle, shell, getContext());

        ExpressionProvider ep = new ExpressionProvider(getItemHandle());
        ep.addFilter(new ExpressionFilter() {

            @Override
            public boolean select(Object parentElement, Object element) {
                // Remove unsupported expression. See bugzilla#132768
                return !(parentElement.equals(ExpressionProvider.BIRT_OBJECTS) && element instanceof IClassInfo
                        && ((IClassInfo) element).getName().equals("Total")); //$NON-NLS-1$
            }
        });

        // Add this filer to disable the reference of DataSet category and Cube
        // category.
        ep.addFilter(new ExpressionFilter() {

            @Override
            public boolean select(Object parentElement, Object element) {
                if (!ExpressionFilter.CATEGORY.equals(parentElement)) {
                    return true;
                }

                if (element instanceof String) {
                    if (ExpressionProvider.DATASETS.equals(element)
                            || ExpressionProvider.CURRENT_CUBE.equals(element)) {
                        return false;
                    }
                    return true;
                }

                return true;
            }
        });
        page.setExpressionProvider(ep);

        // Make all bindings under share binding case read-only.
        ((ChartColumnBindingDialog) page).setReadOnly(
                getDataServiceProvider().isSharedBinding() || getDataServiceProvider().isInheritanceOnly()
                        || getDataServiceProvider().checkState(IDataServiceProvider.HAS_CUBE));

        int openStatus = page.open();
        if (openStatus == Window.OK) {
            handle.getModuleHandle().getCommandStack().commit();
            updatePredefinedQueries();
            checkDataBinding();
        } else {
            handle.getModuleHandle().getCommandStack().rollback();
        }

        return openStatus;
    }

    private void initDataSelector() {
        boolean isInheritingSummaryTable = isInheritingSummaryTable();

        // create Combo items
        cmbInherit.setItems(new String[] { Messages.getString("StandardChartDataSheet.Combo.InheritColumnsGroups"), //$NON-NLS-1$ 
                Messages.getString("StandardChartDataSheet.Combo.InheritColumnsOnly") //$NON-NLS-1$ 
        });

        if (isInheritingSummaryTable) {
            cmbInherit.select(0);
            getContext().setInheritColumnsOnly(true);
        } else if (dataProvider.isInheritColumnsSet()) {
            cmbInherit.select(dataProvider.isInheritColumnsOnly() ? 1 : 0);
        } else {
            // Set default inheritance value
            if (ChartItemUtil.hasAggregation(getChartModel())) {
                // If aggregations found, set inherit columns only
                cmbInherit.select(1);
                getContext().setInheritColumnsOnly(true);
            } else {
                // Default value is set as Inherit groups
                cmbInherit.select(0);
                getContext().setInheritColumnsOnly(false);
            }
        }
        cmbInherit.setEnabled(false);

        List<Object> dataItems = new ArrayList<Object>();
        cmbDataItems.setItems(createDataComboItems(dataItems));
        cmbDataItems.setData(dataItems);

        // Select report item reference
        // Since handle may have data set or data cube besides reference, always
        // check reference first
        String sItemRef = getDataServiceProvider().getReportItemReference();
        if (sItemRef != null) {
            btnUseData.setSelection(true);
            bIsInheritSelected = false;
            cmbDataItems.setText(sItemRef);
            currentDataReference = sItemRef;
            return;
        }

        // Select data set
        DataSetInfo sDataSet = getDataServiceProvider().getDataSetInfo();
        if (sDataSet != null && !getDataServiceProvider().isInheritanceOnly()) {
            btnUseData.setSelection(true);
            bIsInheritSelected = false;
            cmbDataItems.setText(sDataSet.getDisplayName());
            currentDataReference = sDataSet;
            return;
        }

        // Select data cube
        String sDataCube = getDataServiceProvider().getDataCube();
        if (sDataCube != null && !getDataServiceProvider().isInheritanceOnly()) {
            btnUseData.setSelection(true);
            bIsInheritSelected = false;
            cmbDataItems.setText(sDataCube);
            currentDataReference = sDataCube;
            return;
        }

        cmbInherit.setEnabled(!isInheritingSummaryTable && getDataServiceProvider().getInheritedDataSet() != null
                && ChartItemUtil.isContainerInheritable(itemHandle));
        if (!cmbInherit.isEnabled()) {
            if (itemHandle.getContainer() instanceof MultiViewsHandle
                    || itemHandle.getDataBindingReference() != null) {
                // If sharing or multi view, set inherit column groups.
                cmbInherit.select(0);
            } else {
                // If container is grid or anything else, set inherit columns
                // only.
                cmbInherit.select(1);
            }
        }
        btnInherit.setSelection(true);
        bIsInheritSelected = true;
        if (getDataServiceProvider().isInheritanceOnly()) {
            btnUseData.setSelection(false);
            btnUseData.setEnabled(false);
        }
        cmbDataItems.select(0);
        currentDataReference = null;
        cmbDataItems.setEnabled(false);
        // Initializes column bindings from container
        getDataServiceProvider().setDataSet(null);
    }

    /**
     * 
     */
    private boolean isInheritingSummaryTable() {
        if (ChartItemUtil.isContainerInheritable(itemHandle)) {
            // Copy aggregations from table container to chart
            TableHandle table = null;
            DesignElementHandle container = itemHandle.getContainer();
            while (container != null) {
                if (container instanceof TableHandle) {
                    table = (TableHandle) container;
                    break;
                }
                container = container.getContainer();
            }
            if (table != null) {
                return table.getBooleanProperty(ITableItemModel.IS_SUMMARY_TABLE_PROP);
            }
        }
        return false;
    }

    @SuppressWarnings("unchecked")
    public void handleEvent(Event event) {
        // When user select expression in drop&down list of live preview
        // area, the event will be handled to update related column color.
        if (event.type == IChartDataSheet.EVENT_QUERY) {
            if (event.detail == IChartDataSheet.DETAIL_UPDATE_COLOR_AND_TEXT) {
                updateColorAndText();
            } else if (event.detail == IChartDataSheet.DETAIL_UPDATE_COLOR
                    && event.data instanceof ISelectDataComponent) {
                refreshTableColor();
            }
            return;
        }
        // Right click to display the menu. Menu display by clicking
        // application key is triggered by os, so do nothing.
        // bug 261340, now we use the field doit to indicate whether it's menu
        // initialization or event triggering.
        if (event.type == CustomPreviewTable.MOUSE_RIGHT_CLICK_TYPE) {
            if (getDataServiceProvider().getDataSet() != null
                    || getDataServiceProvider().getInheritedDataSet() != null) {
                if (event.widget instanceof Button) {
                    Button header = (Button) event.widget;

                    // Bind context menu to each header button
                    boolean isSharingChart = dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY);
                    if (header.getMenu() == null && !isSharingChart) {
                        header.setMenu(createMenuManager(event.data).createContextMenu(tablePreview));
                    }

                    if (event.doit && !isSharingChart) {
                        header.getMenu().setVisible(true);
                    }
                }
            }

        } else if (event.type == SWT.Selection) {
            if (event.widget instanceof MenuItem) {
                MenuItem item = (MenuItem) event.widget;
                IAction action = (IAction) item.getData();
                action.setChecked(!action.isChecked());
                action.run();
            } else if (event.widget == btnFilters) {
                if (invokeEditFilter() == Window.OK) {
                    refreshDataPreviewPane();
                    // Update preview via event
                    fireEvent(btnFilters, EVENT_PREVIEW);
                }
            } else if (event.widget == btnParameters) {
                if (invokeEditParameter() == Window.OK) {
                    refreshDataPreviewPane();
                    // Update preview via event
                    fireEvent(btnParameters, EVENT_PREVIEW);
                }
            } else if (event.widget == btnBinding) {
                if (invokeDataBinding() == Window.OK) {
                    refreshDataPreviewPane();
                    // Update preview via event
                    fireEvent(btnBinding, EVENT_PREVIEW);
                }
            }

            try {
                if (event.widget == btnInherit) {
                    ColorPalette.getInstance().restore();

                    // Skip when selection is false
                    if (!btnInherit.getSelection()) {
                        return;
                    }

                    // Avoid duplicate loading data set.
                    if (bIsInheritSelected) {
                        return;
                    }

                    bIsInheritSelected = true;

                    getDataServiceProvider().setReportItemReference(null);
                    getDataServiceProvider().setDataCube(null);
                    getDataServiceProvider().setDataSet(null);
                    switchDataSet();

                    cmbDataItems.select(0);
                    currentDataReference = null;
                    cmbDataItems.setEnabled(false);
                    cmbInherit.setEnabled(
                            !isInheritingSummaryTable() && getDataServiceProvider().getInheritedDataSet() != null
                                    && ChartItemUtil.isContainerInheritable(itemHandle));
                    setEnabledForButtons();
                    updateDragDataSource();
                    updatePredefinedQueries();
                } else if (event.widget == btnUseData) {
                    // Skip when selection is false
                    if (!btnUseData.getSelection()) {
                        return;
                    }

                    // Avoid duplicate loading data set.
                    if (!bIsInheritSelected) {
                        return;
                    }

                    bIsInheritSelected = false;

                    getDataServiceProvider().setReportItemReference(null);
                    getDataServiceProvider().setDataSet(null);
                    selectDataSet();
                    cmbDataItems.setEnabled(true);
                    cmbInherit.setEnabled(false);
                    setEnabledForButtons();
                    updateDragDataSource();
                    updatePredefinedQueries();
                } else if (event.widget == cmbInherit) {
                    getContext().setInheritColumnsOnly(cmbInherit.getSelectionIndex() == 1);
                    setEnabledForButtons();

                    // Fire event to update outside UI
                    fireEvent(btnBinding, EVENT_QUERY);
                    refreshDataPreviewPane();
                } else if (event.widget == cmbDataItems) {
                    ColorPalette.getInstance().restore();
                    int selectedIndex = cmbDataItems.getSelectionIndex();
                    Integer selectState = selectDataTypes.get(selectedIndex);
                    switch (selectState.intValue()) {
                    case SELECT_NONE:
                        // Inherit data from container
                        btnInherit.setSelection(true);
                        btnUseData.setSelection(false);
                        btnInherit.notifyListeners(SWT.Selection, new Event());
                        break;
                    case SELECT_NEXT:
                        selectedIndex++;
                        selectState = selectDataTypes.get(selectedIndex);
                        cmbDataItems.select(selectedIndex);
                        break;
                    }
                    switch (selectState.intValue()) {
                    case SELECT_DATA_SET:
                        DataSetInfo dataInfo = (DataSetInfo) ((List<Object>) cmbDataItems.getData())
                                .get(selectedIndex);

                        if (getDataServiceProvider().getReportItemReference() == null
                                && getDataServiceProvider().getDataSet() != null
                                && getDataServiceProvider().getDataSetInfo().equals(dataInfo)) {
                            return;
                        }
                        getDataServiceProvider().setDataSet(dataInfo);
                        currentDataReference = dataInfo;
                        switchDataSet();
                        setEnabledForButtons();
                        updateDragDataSource();
                        break;
                    case SELECT_DATA_CUBE:
                        getDataServiceProvider().setDataCube(cmbDataItems.getText());
                        currentDataReference = cmbDataItems.getText();
                        // Since cube has no group, it needs to clear group
                        // flag in category and optional Y of chart model.
                        clearGrouping();
                        updateDragDataSource();
                        setEnabledForButtons();
                        // Update preview via event
                        DataDefinitionTextManager.getInstance().refreshAll();
                        fireEvent(tablePreview, EVENT_PREVIEW);
                        break;
                    case SELECT_REPORT_ITEM:
                        if (cmbDataItems.getText().equals(getDataServiceProvider().getReportItemReference())) {
                            return;
                        }
                        if (getDataServiceProvider().isNoNameItem(cmbDataItems.getText())) {
                            MessageDialog dialog = new MessageDialog(UIUtil.getDefaultShell(),
                                    org.eclipse.birt.report.designer.nls.Messages
                                            .getString("dataBinding.title.haveNoName"), //$NON-NLS-1$
                                    null,
                                    org.eclipse.birt.report.designer.nls.Messages
                                            .getString("dataBinding.message.haveNoName"), //$NON-NLS-1$
                                    MessageDialog.QUESTION,
                                    new String[] { org.eclipse.birt.report.designer.nls.Messages
                                            .getString("dataBinding.button.OK")//$NON-NLS-1$
                                    }, 0);
                            dialog.open();
                            btnInherit.setSelection(true);
                            btnUseData.setSelection(false);
                            btnInherit.notifyListeners(SWT.Selection, new Event());
                            return;
                        }
                        getDataServiceProvider().setReportItemReference(cmbDataItems.getText());

                        // TED 10163
                        // Following calls will revise chart model for
                        // report item sharing case, in older version of
                        // chart, it is allowed to set grouping on category
                        // series when sharing report item, but now it isn't
                        // allowed, so this calls will revise chart model to
                        // remove category series grouping flag for the
                        // case.
                        ChartReportItemUtil.reviseChartModel(ChartReportItemUtil.REVISE_REFERENCE_REPORT_ITEM,
                                this.getContext().getModel(), itemHandle);

                        // Bugzilla 265077.
                        if (this.getDataServiceProvider().checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {
                            ChartAdapter.beginIgnoreNotifications();
                            this.getDataServiceProvider().update(ChartUIConstants.COPY_SERIES_DEFINITION, null);
                            ChartAdapter.endIgnoreNotifications();
                        }

                        currentDataReference = cmbDataItems.getText();
                        // selectDataSet( );
                        // switchDataSet( cmbDataItems.getText( ) );

                        // Update preview via event
                        DataDefinitionTextManager.getInstance().refreshAll();
                        fireEvent(tablePreview, EVENT_PREVIEW);

                        setEnabledForButtons();
                        updateDragDataSource();
                        break;
                    case SELECT_NEW_DATASET:
                        // Bring up the dialog to create a dataset
                        int result = invokeNewDataSet();
                        if (result == Window.CANCEL) {
                            if (currentDataReference == null) {
                                cmbDataItems.select(0);
                            } else {
                                cmbDataItems.setText(getDataSetName(currentDataReference));
                            }
                            return;
                        }

                        cmbDataItems.removeAll();
                        List<Object> dataItems = new ArrayList<Object>();
                        cmbDataItems.setItems(createDataComboItems(dataItems));
                        List<Object> oldDataItems = (List<Object>) cmbDataItems.getData();
                        cmbDataItems.setData(dataItems);

                        // select the newly created data set for user
                        DataSetInfo[] datasets = getDataServiceProvider().getAllDataSets();
                        int index = 0;
                        for (index = datasets.length - 1; index >= 0; index--) {
                            if (!oldDataItems.contains(datasets[index])) {
                                break;
                            }
                        }
                        currentDataReference = datasets[index];
                        getDataServiceProvider().setDataSet((DataSetInfo) currentDataReference);
                        cmbDataItems.setText(getDataSetName(currentDataReference));
                        setEnabledForButtons();
                        updateDragDataSource();
                        break;
                    case SELECT_NEW_DATACUBE:
                        if (getDataServiceProvider().getAllDataSets().length == 0) {
                            invokeNewDataSet();
                        }
                        int count = getDataServiceProvider().getAllDataCubes().length;
                        if (getDataServiceProvider().getAllDataSets().length != 0) {
                            new NewCubeAction().run();
                        }

                        String[] datacubes = getDataServiceProvider().getAllDataCubes();
                        cmbDataItems.removeAll();
                        dataItems = new ArrayList<Object>();
                        cmbDataItems.setItems(createDataComboItems(dataItems));
                        cmbDataItems.setData(dataItems);
                        if (datacubes.length == count) {
                            if (currentDataReference == null) {
                                cmbDataItems.select(0);
                            } else {
                                cmbDataItems.setText(getDataSetName(currentDataReference));
                            }
                            return;
                        }

                        // select the newly created data cube for user.
                        currentDataReference = datacubes[datacubes.length - 1];
                        getDataServiceProvider().setDataCube(currentDataReference.toString());
                        cmbDataItems.setText(getDataSetName(currentDataReference));
                        updateDragDataSource();
                        setEnabledForButtons();
                        // Update preview via event
                        DataDefinitionTextManager.getInstance().refreshAll();
                        fireEvent(tablePreview, EVENT_PREVIEW);
                        break;
                    }
                    updatePredefinedQueries();
                    // autoSelect( true );
                } else if (event.widget == btnShowDataPreviewA || event.widget == btnShowDataPreviewB) {
                    Button w = (Button) event.widget;
                    getContext().setShowingDataPreview(Boolean.valueOf(w.getSelection()));
                    updateDragDataSource();
                }
                checkDataBinding();
                ChartWizard.removeException(ChartWizard.StaChartDSh_switch_ID);
            } catch (ChartException e1) {
                ChartWizard.showException(ChartWizard.StaChartDSh_switch_ID, e1.getLocalizedMessage());
            }
        }
    }

    private String getDataSetName(Object dataRef) {
        if (dataRef instanceof DataSetInfo) {
            return ((DataSetInfo) currentDataReference).getDisplayName();
        } else {
            return dataRef.toString();
        }
    }

    /**
     * This method clears the flag of category grouping and optional Y grouping.
     */
    private void clearGrouping() {
        SeriesDefinition sd = ChartUIUtil.getBaseSeriesDefinitions(getChartModel()).get(0);
        if (sd.getGrouping() != null && sd.getGrouping().isEnabled())
            sd.getGrouping().unsetEnabled();
        for (SeriesDefinition s : ChartUIUtil.getAllOrthogonalSeriesDefinitions(getChartModel())) {
            if (s.getQuery() != null && s.getQuery().getGrouping() != null
                    && s.getQuery().getGrouping().isEnabled())
                s.getQuery().getGrouping().unsetEnabled();
        }
    }

    private void autoSelect(boolean force) {
        if (dataProvider.checkState(IDataServiceProvider.SHARE_CROSSTAB_QUERY)
                && !dataProvider.checkState(IDataServiceProvider.SHARE_CHART_QUERY)) {
            // if only one item,select it for user
            Query query = ChartUIUtil.getAllOrthogonalSeriesDefinitions(getContext().getModel()).get(0)
                    .getDesignTimeSeries().getDataDefinition().get(0);

            Object[] valueExprs = getContext().getPredefinedQuery(ChartUIConstants.QUERY_VALUE);

            if ((force || query.getDefinition() == null || query.getDefinition().trim().length() == 0)
                    && valueExprs != null && valueExprs.length == 1) {
                boolean isCube = true;
                IExpressionDescriptor desc = ExpressionDescriptor.getInstance(valueExprs[0], isCube);
                if (desc != null) {
                    String expr = desc.getExpression();
                    query.setDefinition(expr);
                    if (dataProvider.update(ChartUIConstants.QUERY_VALUE, expr)) {
                        Event e = new Event();
                        e.type = IChartDataSheet.EVENT_QUERY;
                        this.notifyListeners(e);
                    }
                    if (force) {
                        fireEvent(tablePreview, EVENT_PREVIEW);
                    }
                }
            }
        }
    }

    private void selectDataSet() {
        DataSetInfo currentDS = getDataServiceProvider().getDataSetInfo();
        if (currentDS == null) {
            cmbDataItems.select(0);
            currentDataReference = null;
        } else {
            cmbDataItems.setText(currentDS.getDisplayName());
            currentDataReference = currentDS;
        }
    }

    private void refreshTablePreview() {
        if (dataProvider.getDataSetFromHandle() == null) {
            return;
        }
        tablePreview.clearContents();
        switchDataTable();
        tablePreview.layout();
    }

    private void switchDataSet() throws ChartException {
        if (isCubeMode()) {
            return;
        }
        try {
            // Clear old dataset and preview data
            tablePreview.clearContents();
            tableViewerColumns.setInput(null);

            tablePreview.createDummyTable();
            tablePreview.layout();
        } catch (Throwable t) {
            throw new ChartException(ChartEnginePlugin.ID, ChartException.DATA_BINDING, t);
        }

        DataDefinitionTextManager.getInstance().refreshAll();
        // Update preview via event
        fireEvent(tablePreview, EVENT_PREVIEW);
    }

    /**
     * Update column headers and data to table.
     * 
     * @param headers
     * @param dataList
     */
    private void updateTablePreview(final ColumnBindingInfo[] headers, final List<?> dataList) {
        fireEvent(tablePreview, EVENT_QUERY);

        if (tablePreview.isDisposed()) {
            return;
        }

        if (headers == null || headers.length == 0) {
            tablePreview.setEnabled(false);
            tablePreview.createDummyTable();
        } else {
            tablePreview.setEnabled(true);
            tablePreview.setColumns(headers);

            refreshTableColor();

            // Add data value
            if (dataList != null) {
                for (Iterator<?> iterator = dataList.iterator(); iterator.hasNext();) {
                    String[] dataRow = (String[]) iterator.next();
                    for (int i = 0; i < dataRow.length; i++) {
                        tablePreview.addEntry(dataRow[i], i);
                    }
                }
            }
        }
        tablePreview.layout();

        // Make the selected column visible and active.
        int index = tableViewerColumns.getTable().getSelectionIndex();
        if (index >= 0) {
            tablePreview.moveTo(index);
        }
    }

    private synchronized List<?> getPreviewData() throws ChartException {
        return getDataServiceProvider().getPreviewData();
    }

    private void switchDataTable() {
        if (isCubeMode()) {
            return;
        }
        refreshDataPreview();
    }

    private void refreshTableColor() {
        if (isCubeMode()) {
            return;
        }
        // Reset column color
        if (getContext().isShowingDataPreview()) {
            for (int i = 0; i < tablePreview.getColumnNumber(); i++) {
                tablePreview.setColumnColor(i,
                        ColorPalette.getInstance().getColor(tablePreview.getColumnHeading(i)));
            }
        } else {
            updateColumnsTableViewerColor();
        }
    }

    private static Collection<TreeItem> getAllItems(TreeItem[] items) {
        List<TreeItem> list = new LinkedList<TreeItem>();

        for (TreeItem item : items) {
            list.add(item);
            list.addAll(getAllItems(item.getItems()));
        }

        return list;
    }

    private static Collection<TreeItem> getAllItems(Tree tree) {
        if (tree == null) {
            return Collections.emptyList();
        }
        List<TreeItem> list = new LinkedList<TreeItem>();
        list.addAll(getAllItems(tree.getItems()));
        return list;
    }

    private void refreshTreeViewColor() {
        if (treeViewer == null) {
            return;
        }

        Collection<TreeItem> items = getAllItems(treeViewer.getTree());

        for (TreeItem item : items) {
            String key = getBindingNameFrom(item);
            Color color = ColorPalette.getInstance().getColor(key);
            item.setBackground(color);
        }
        treeViewer.refresh();
    }

    /**
     * 
     */
    private void updateColumnsTableViewerColor() {
        for (TableItem item : tableViewerColumns.getTable().getItems()) {
            ColumnBindingInfo cbi = (ColumnBindingInfo) item.getData();
            Color c = ColorPalette.getInstance().getColor(cbi.getName());
            if (c == null) {
                c = Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
            }
            item.setBackground(c);
        }
    }

    /**
     * Returns actual expression for common and sharing query case.
     * 
     * @param query
     * @param expr
     * @return
     */
    private String getActualExpression(String expr) {
        if (!dataProvider.checkState(IDataServiceProvider.SHARE_QUERY)) {
            return expr;
        }

        // Convert to actual expression.
        Object obj = getCurrentColumnHeadObject();
        if (obj instanceof ColumnBindingInfo) {
            ColumnBindingInfo cbi = (ColumnBindingInfo) obj;
            int type = cbi.getColumnType();
            if (type == ColumnBindingInfo.GROUP_COLUMN || type == ColumnBindingInfo.AGGREGATE_COLUMN) {
                return cbi.getExpression();
            }
        }

        return expr;
    }

    protected void manageColorAndQuery(Query query, String expr) {
        // If it's not used any more, remove color binding
        if (DataDefinitionTextManager.getInstance().getNumberOfSameDataDefinition(query.getDefinition()) == 1) {
            ColorPalette.getInstance().retrieveColor(query.getDefinition());
        }

        // Update query, if it is sharing binding case, the specified expression
        // will be converted and set to query, else directly set specified
        // expression to query.
        // DataDefinitionTextManager.getInstance( ).updateQuery( query, expr );
        query.setDefinition(getActualExpression(expr));

        // Refresh all data definition text
        DataDefinitionTextManager.getInstance().refreshAll();

        // Reset table column color
        refreshTableColor();
        refreshTreeViewColor();
    }

    /**
     * To refresh all color and text
     */
    protected void updateColorAndText() {
        // Refresh all data definition text
        DataDefinitionTextManager.getInstance().refreshAll();

        // Reset table column color
        refreshTableColor();
        refreshTreeViewColor();
    }

    private class CategoryXAxisAction extends Action {

        private final IExpressionButton eb;
        private final String bindingName;

        CategoryXAxisAction(String bindingName) {
            super(getBaseSeriesTitle(getChartModel()));
            SeriesDefinition seriesDefintion = ChartUIUtil.getBaseSeriesDefinitions(getChartModel()).get(0);
            Query query = seriesDefintion.getDesignTimeSeries().getDataDefinition().get(0);
            this.bindingName = bindingName;

            this.eb = DataDefinitionTextManager.getInstance().findExpressionButton(query);

            if (eb != null) {
                exprCodec.setType(eb.getExpressionType());
                exprCodec.setBindingName(bindingName, eb.isCube());
            }

            setEnabled(eb != null && DataDefinitionTextManager.getInstance().isAcceptableExpression(query,
                    exprCodec.getExpression(),
                    dataProvider.isSharedBinding() || dataProvider.isInheritColumnsGroups()));
        }

        @Override
        public void run() {
            if (eb != null) {
                eb.setBindingName(bindingName, true);
            }
        }
    }

    private class GroupYSeriesAction extends Action {

        private final IExpressionButton eb;
        private final String bindingName;
        private final String expr;

        GroupYSeriesAction(Query query, String bindingName, SeriesDefinition seriesDefinition) {
            super(getGroupSeriesTitle(getChartModel()));

            this.bindingName = bindingName;
            this.eb = DataDefinitionTextManager.getInstance().findExpressionButton(query);

            if (eb != null) {
                exprCodec.setType(eb.getExpressionType());
                exprCodec.setBindingName(bindingName, eb.isCube());
                this.expr = exprCodec.getExpression();
            } else {
                this.expr = null;
            }
            boolean enabled = eb != null && DataDefinitionTextManager.getInstance().isAcceptableExpression(query,
                    expr, dataProvider.isSharedBinding() || dataProvider.isInheritColumnsGroups());
            setEnabled(enabled);
        }

        @Override
        public void run() {
            // Use the first group, and copy to the all groups
            ChartAdapter.beginIgnoreNotifications();
            ChartUIUtil.setAllGroupingQueryExceptFirst(getChartModel(), expr);
            ChartAdapter.endIgnoreNotifications();

            if (eb != null) {
                eb.setBindingName(bindingName, true);
            }
        }
    }

    private class ValueYSeriesAction extends Action {

        private final Query query;
        private final IExpressionButton eb;
        private final String bindingName;

        ValueYSeriesAction(Query query, String bindingName) {
            super(getOrthogonalSeriesTitle(getChartModel()));

            this.bindingName = bindingName;
            this.eb = DataDefinitionTextManager.getInstance().findExpressionButton(query);
            this.query = query;
            // Grouping expressions can't be set on value series.
            boolean enabled = true;
            if (dataProvider.isSharedBinding() || dataProvider.isInheritColumnsGroups()) {
                Object obj = getCurrentColumnHeadObject();
                if (obj instanceof ColumnBindingInfo
                        && ((ColumnBindingInfo) obj).getColumnType() == ColumnBindingInfo.GROUP_COLUMN) {
                    enabled = false;
                }
            }

            setEnabled(enabled);
        }

        @Override
        public void run() {
            if (eb != null) {
                eb.setBindingName(bindingName, true);
            } else {
                exprCodec.setBindingName(bindingName, isCubeMode());
                query.setDefinition(exprCodec.encode());
                ColorPalette.getInstance().putColor(bindingName);
                updateColorAndText();
            }

        }
    }

    Object getCurrentColumnHeadObject() {
        if (getContext().isShowingDataPreview()) {
            return tablePreview.getCurrentColumnHeadObject();
        }
        int index = tableViewerColumns.getTable().getSelectionIndex();
        if (index < 0)
            return null;
        return tableViewerColumns.getTable().getItem(index).getData();
    }

    static class HeaderShowAction extends Action {

        HeaderShowAction(String header) {
            super(header);
            setEnabled(false);
        }
    }

    ExtendedItemHandle getItemHandle() {
        return this.itemHandle;
    }

    protected ReportDataServiceProvider getDataServiceProvider() {
        return this.dataProvider;
    }

    protected List<Object> getActionsForTableHead(String expr) {
        List<Object> actions = new ArrayList<Object>(3);
        actions.add(getBaseSeriesMenu(getChartModel(), expr));
        actions.add(getOrthogonalSeriesMenu(getChartModel(), expr));
        actions.add(getGroupSeriesMenu(getChartModel(), expr));
        return actions;
    }

    protected Object getMenuForMeasure(Chart chart, String expr) {
        return getOrthogonalSeriesMenu(getChartModel(), expr);
    }

    protected Object getMenuForDimension(Chart chart, String expr) {
        List<Object> menus = new ArrayList<Object>(2);
        // bug#220724
        if (((Boolean) dataProvider.checkData(ChartUIConstants.QUERY_CATEGORY, expr)).booleanValue()) {
            menus.add(getBaseSeriesMenu(getChartModel(), expr));
        }

        if (dataProvider.checkState(IDataServiceProvider.MULTI_CUBE_DIMENSIONS)
                && ((Boolean) dataProvider.checkData(ChartUIConstants.QUERY_OPTIONAL, expr)).booleanValue()) {
            menus.add(getGroupSeriesMenu(getChartModel(), expr));
        }

        return menus;
    }

    protected MenuManager createMenuManager(final Object data) {
        MenuManager menuManager = new MenuManager();
        menuManager.setRemoveAllWhenShown(true);
        menuManager.addMenuListener(new IMenuListener() {

            public void menuAboutToShow(IMenuManager manager) {
                if (data instanceof ColumnBindingInfo) {
                    // Menu for columns table.
                    addMenu(manager, new HeaderShowAction(((ColumnBindingInfo) data).getName()));
                    // String expr = ExpressionUtil.createJSRowExpression(
                    // ((ColumnBindingInfo)data).getName( ) );
                    List<Object> actions = getActionsForTableHead(((ColumnBindingInfo) data).getName());
                    for (Object act : actions) {
                        addMenu(manager, act);
                    }
                } else if (data instanceof Integer) {
                    // Menu for table
                    addMenu(manager, new HeaderShowAction(tablePreview.getCurrentColumnHeading()));
                    String expr = tablePreview.getCurrentColumnHeading();
                    List<Object> actions = getActionsForTableHead(expr);
                    for (Object act : actions) {
                        addMenu(manager, act);
                    }
                } else if (data instanceof MeasureHandle) {
                    // Menu for Measure
                    String expr = createCubeExpression();
                    if (expr != null) {
                        addMenu(manager, getMenuForMeasure(getChartModel(), expr));
                    }
                } else if (data instanceof LevelHandle) {
                    // Menu for Level
                    String expr = createCubeExpression();
                    if (expr != null) {
                        addMenu(manager, getMenuForDimension(getChartModel(), expr));
                    }
                } else if (data instanceof LevelAttributeHandle) {
                    // Menu for LevelAttribute
                    String expr = createCubeExpression();
                    if (expr != null) {
                        addMenu(manager, getMenuForDimension(getChartModel(), expr));
                    }
                }
            }

            private void addMenu(IMenuManager manager, Object item) {
                if (item instanceof IAction) {
                    manager.add((IAction) item);
                } else if (item instanceof IContributionItem) {
                    manager.add((IContributionItem) item);
                } else if (item instanceof List<?>) {
                    for (Object o : (List<?>) item) {
                        addMenu(manager, o);
                    }
                }

                // Do not allow customized query in xtab
                if (getDataServiceProvider().isPartChart()) {
                    if (item instanceof IAction) {
                        ((IAction) item).setEnabled(false);
                    }
                }
            }

        });
        return menuManager;
    }

    protected Object getBaseSeriesMenu(Chart chart, String expr) {
        EList<SeriesDefinition> sds = ChartUIUtil.getBaseSeriesDefinitions(chart);
        if (sds.size() == 1) {
            return new CategoryXAxisAction(expr);
        }
        return null;
    }

    protected Object getGroupSeriesMenu(Chart chart, String expr) {
        IMenuManager topManager = new MenuManager(getGroupSeriesTitle(getChartModel()));
        int axisNum = ChartUIUtil.getOrthogonalAxisNumber(chart);
        for (int axisIndex = 0; axisIndex < axisNum; axisIndex++) {
            List<SeriesDefinition> sds = ChartUIUtil.getOrthogonalSeriesDefinitions(chart, axisIndex);
            if (!sds.isEmpty()) {
                SeriesDefinition sd = sds.get(0);
                IAction action = new GroupYSeriesAction(sd.getQuery(), expr, sd);
                // ONLY USE FIRST GROUPING SERIES FOR CHART ENGINE SUPPORT
                // if ( axisNum == 1 && sds.size( ) == 1 )
                {
                    // Simply cascade menu
                    return action;
                }
                // action.setText( getSecondMenuText( axisIndex,
                // i,
                // sd.getDesignTimeSeries( ) ) );
                // topManager.add( action );
            }
        }
        return topManager;
    }

    protected Object getOrthogonalSeriesMenu(Chart chart, String expr) {
        IMenuManager topManager = new MenuManager(getOrthogonalSeriesTitle(getChartModel()));
        int axisNum = ChartUIUtil.getOrthogonalAxisNumber(chart);
        for (int axisIndex = 0; axisIndex < axisNum; axisIndex++) {
            List<SeriesDefinition> sds = ChartUIUtil.getOrthogonalSeriesDefinitions(chart, axisIndex);
            for (int i = 0; i < sds.size(); i++) {
                Series series = sds.get(i).getDesignTimeSeries();
                EList<Query> dataDefns = series.getDataDefinition();

                if (series instanceof StockSeries) {
                    IMenuManager secondManager = new MenuManager(getSecondMenuText(axisIndex, i, series));
                    topManager.add(secondManager);
                    for (int j = 0; j < dataDefns.size(); j++) {
                        IAction action = new ValueYSeriesAction(dataDefns.get(j), expr);
                        action.setText(ChartUIUtil.getStockTitle(j)
                                + Messages.getString("StandardChartDataSheet.Label.Component")); //$NON-NLS-1$
                        secondManager.add(action);
                    }
                } else if (series instanceof BubbleSeries) {
                    IMenuManager secondManager = new MenuManager(getSecondMenuText(axisIndex, i, series));
                    topManager.add(secondManager);
                    for (int j = 0; j < dataDefns.size(); j++) {
                        IAction action = new ValueYSeriesAction(dataDefns.get(j), expr);
                        action.setText(ChartUIUtil.getBubbleTitle(j)
                                + Messages.getString("StandardChartDataSheet.Label.Component")); //$NON-NLS-1$
                        secondManager.add(action);
                    }
                } else if (series instanceof DifferenceSeries) {
                    IMenuManager secondManager = new MenuManager(getSecondMenuText(axisIndex, i, series));
                    topManager.add(secondManager);
                    for (int j = 0; j < dataDefns.size(); j++) {
                        IAction action = new ValueYSeriesAction(dataDefns.get(j), expr);
                        action.setText(ChartUIUtil.getDifferenceTitle(j)
                                + Messages.getString("StandardChartDataSheet.Label.Component")); //$NON-NLS-1$
                        secondManager.add(action);
                    }
                } else if (series instanceof GanttSeries) {
                    IMenuManager secondManager = new MenuManager(getSecondMenuText(axisIndex, i, series));
                    topManager.add(secondManager);
                    for (int j = 0; j < dataDefns.size(); j++) {
                        IAction action = new ValueYSeriesAction(dataDefns.get(j), expr);
                        action.setText(ChartUIUtil.getGanttTitle(j)
                                + Messages.getString("StandardChartDataSheet.Label.Component")); //$NON-NLS-1$
                        secondManager.add(action);
                    }
                } else {
                    IAction action = new ValueYSeriesAction(dataDefns.get(0), expr);
                    if (axisNum == 1 && sds.size() == 1) {
                        // Simplify cascade menu
                        return action;
                    }
                    action.setText(getSecondMenuText(axisIndex, i, series));
                    topManager.add(action);
                }
            }
        }
        return topManager;
    }

    private String getSecondMenuText(int axisIndex, int seriesIndex, Series series) {
        StringBuffer sb = new StringBuffer();
        if (ChartUIUtil.getOrthogonalAxisNumber(getChartModel()) > 1) {
            sb.append(Messages.getString("StandardChartDataSheet.Label.Axis")); //$NON-NLS-1$
            sb.append(axisIndex + 1);
            sb.append(" - "); //$NON-NLS-1$
        }
        sb.append(Messages.getString("StandardChartDataSheet.Label.Series") //$NON-NLS-1$
                + (seriesIndex + 1) + " (" + series.getDisplayName() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
        return sb.toString();
    }

    protected String getBaseSeriesTitle(Chart chart) {
        if (chart instanceof ChartWithAxes) {
            return Messages.getString("StandardChartDataSheet.Label.UseAsCategoryXAxis"); //$NON-NLS-1$
        }
        return Messages.getString("StandardChartDataSheet.Label.UseAsCategorySeries"); //$NON-NLS-1$
    }

    protected String getOrthogonalSeriesTitle(Chart chart) {
        if (chart instanceof ChartWithAxes) {
            return Messages.getString("StandardChartDataSheet.Label.PlotAsValueYSeries"); //$NON-NLS-1$
        } else if (chart instanceof DialChart) {
            return Messages.getString("StandardChartDataSheet.Label.PlotAsGaugeValue"); //$NON-NLS-1$
        }
        return Messages.getString("StandardChartDataSheet.Label.PlotAsValueSeries"); //$NON-NLS-1$
    }

    private String getGroupSeriesTitle(Chart chart) {
        if (chart instanceof ChartWithAxes) {
            return Messages.getString("StandardChartDataSheet.Label.UseToGroupYSeries"); //$NON-NLS-1$
        }
        return Messages.getString("StandardChartDataSheet.Label.UseToGroupValueSeries"); //$NON-NLS-1$
    }

    protected boolean isCubeMode() {
        boolean bCube = this.getDataServiceProvider().getBindingCubeHandle() != null;
        if (bCube) {
            // If current item doesn't support cube, referenced cube should be
            // invalid.
            return isDataItemSupported(SELECT_DATA_CUBE);
        }
        return false;
    }

    private CubeHandle getCube() {
        return getDataServiceProvider().getBindingCubeHandle();
    }

    private String getBindingNameFrom(ReportElementHandle handle) {
        String expr = null;
        ComputedColumnHandle binding = null;
        if (handle instanceof LevelHandle) {
            LevelHandle level = (LevelHandle) handle;
            String dimensionName = level.getContainer().getContainer().getName();
            binding = ChartCubeUtil.findLevelBinding(itemHandle, dimensionName, level.getName());
        } else if (handle instanceof MeasureHandle) {
            MeasureHandle measure = (MeasureHandle) handle;
            binding = ChartCubeUtil.findMeasureBinding(itemHandle, measure.getName());
        }
        if (binding != null) {
            expr = binding.getName();
        }

        return expr;
    }

    private String getBindingNameFrom(TreeItem treeItem) {
        Object selection = getHandleFromSelection(treeItem.getData());
        if (selection instanceof ReportElementHandle) {
            return getBindingNameFrom((ReportElementHandle) selection);
        } else if (selection instanceof LevelAttributeHandle) {
            LevelAttributeHandle la = (LevelAttributeHandle) selection;
            LevelHandle level = (LevelHandle) ((Level) la.getContext().getValueContainer())
                    .getHandle(la.getModule());
            String dimensionName = level.getContainer().getContainer().getName();
            ComputedColumnHandle binding = ChartCubeUtil.findLevelAttrBinding(itemHandle, dimensionName,
                    level.getName(), la.getName());
            if (binding != null) {
                return binding.getName();
            }
        }

        return null;
    }

    protected Object getHandleFromSelection(Object selection) {
        if (selection instanceof LevelHandle || selection instanceof MeasureHandle
                || selection instanceof LevelAttributeHandle) {
            return selection;
        }
        return null;
    }

    /**
     * This method returns a cube expression that is draggable.
     * 
     * @return
     */
    protected String getDraggableCubeExpression() {
        return createCubeExpression();
    }

    /**
     * Creates the cube expression
     * 
     * @return expression
     */
    protected String createCubeExpression() {
        if (treeViewer == null) {
            return null;
        }
        TreeItem[] selection = treeViewer.getTree().getSelection();
        String expr = null;
        if (selection.length > 0 && !dataProvider.isSharedBinding() && !dataProvider.isPartChart()) {
            TreeItem treeItem = selection[0];
            expr = getBindingNameFrom(treeItem);
        }
        return expr;
    }

    private boolean isDataItemSupported(int type) {
        return iSupportedDataItems == 0 || (iSupportedDataItems & type) == type;
    }

    private String[] createDataComboItems(List<Object> dataItems) {
        List<Object> items = new ArrayList<Object>();
        if (dataItems == null) {
            dataItems = new ArrayList<Object>();
        }
        dataItems.clear();

        selectDataTypes.clear();

        if (isDataItemSupported(SELECT_NONE)) {
            String item = null;
            if (DEUtil.getDataSetList(itemHandle.getContainer()).size() > 0) {
                item = Messages.getString("ReportDataServiceProvider.Option.Inherits", //$NON-NLS-1$
                        ((DataSetHandle) DEUtil.getDataSetList(itemHandle.getContainer()).get(0)).getName());
            } else {
                item = ReportDataServiceProvider.OPTION_NONE;
            }
            items.add(item);
            dataItems.add(item);
            selectDataTypes.add(Integer.valueOf(SELECT_NONE));
        }

        if (isDataItemSupported(SELECT_DATA_SET)) {
            DataSetInfo[] dataSets = getDataServiceProvider().getAllDataSets();
            if (dataSets.length > 0) {
                if (isDataItemSupported(SELECT_NEXT)) {
                    items.add(Messages.getString("StandardChartDataSheet.Combo.DataSets")); //$NON-NLS-1$
                    dataItems.add(Messages.getString("StandardChartDataSheet.Combo.DataSets")); //$NON-NLS-1$
                    selectDataTypes.add(Integer.valueOf(SELECT_NEXT));
                }

                for (int i = 0; i < dataSets.length; i++) {
                    items.add(dataSets[i].getDisplayName());
                    dataItems.add(dataSets[i]);
                    selectDataTypes.add(Integer.valueOf(SELECT_DATA_SET));
                }
            }
            if (isDataItemSupported(SELECT_NEW_DATASET)) {
                items.add(Messages.getString("StandardChartDataSheet.NewDataSet")); //$NON-NLS-1$
                dataItems.add(Messages.getString("StandardChartDataSheet.NewDataSet")); //$NON-NLS-1$
                selectDataTypes.add(Integer.valueOf(SELECT_NEW_DATASET));
            }
        }

        if (isDataItemSupported(SELECT_DATA_CUBE)) {
            String[] dataCubes = getDataServiceProvider().getAllDataCubes();
            if (dataCubes.length > 0) {
                if (isDataItemSupported(SELECT_NEXT)) {
                    items.add(Messages.getString("StandardChartDataSheet.Combo.DataCubes")); //$NON-NLS-1$
                    dataItems.add(Messages.getString("StandardChartDataSheet.Combo.DataCubes")); //$NON-NLS-1$
                    selectDataTypes.add(Integer.valueOf(SELECT_NEXT));
                }
                for (int i = 0; i < dataCubes.length; i++) {
                    items.add(dataCubes[i]);
                    dataItems.add(dataCubes[i]);
                    selectDataTypes.add(Integer.valueOf(SELECT_DATA_CUBE));
                }
            }
            if (isDataItemSupported(SELECT_NEW_DATACUBE)) {
                items.add(Messages.getString("StandardChartDataSheet.NewDataCube")); //$NON-NLS-1$
                dataItems.add(Messages.getString("StandardChartDataSheet.NewDataCube")); //$NON-NLS-1$
                selectDataTypes.add(Integer.valueOf(SELECT_NEW_DATACUBE));
            }
        }

        if (isDataItemSupported(SELECT_REPORT_ITEM)) {
            String[] dataRefs = getDataServiceProvider().getAllReportItemReferences();
            if (dataRefs.length > 0) {
                int curSize = items.size();
                if (isDataItemSupported(SELECT_NEXT)) {
                    items.add(Messages.getString("StandardChartDataSheet.Combo.ReportItems")); //$NON-NLS-1$
                    dataItems.add(Messages.getString("StandardChartDataSheet.Combo.ReportItems")); //$NON-NLS-1$
                    selectDataTypes.add(Integer.valueOf(SELECT_NEXT));
                }
                for (int i = 0; i < dataRefs.length; i++) {
                    // if cube is not supported, do not list the report item
                    // consuming a cube
                    if (!isDataItemSupported(SELECT_DATA_CUBE)) {
                        if (((ReportItemHandle) getDataServiceProvider().getReportDesignHandle()
                                .findElement(dataRefs[i])).getCube() != null) {
                            continue;
                        }
                    }
                    items.add(dataRefs[i]);
                    dataItems.add(dataRefs[i]);
                    selectDataTypes.add(Integer.valueOf(SELECT_REPORT_ITEM));
                }
                // didn't add any reportitem reference
                if (items.size() == curSize + 1) {
                    items.remove(curSize);
                    dataItems.remove(curSize);
                    selectDataTypes.remove(curSize);
                }
            }
        }
        return items.toArray(new String[items.size()]);
    }

    @SuppressWarnings("unchecked")
    protected void updatePredefinedQueriesForInheritXTab() {
        // Get all column bindings.
        List<String> dimensionExprs = new ArrayList<String>();
        List<String> measureExprs = new ArrayList<String>();
        ReportItemHandle reportItemHandle = dataProvider.getReportItemHandle();
        for (Iterator<ComputedColumnHandle> iter = reportItemHandle.getColumnBindings().iterator(); iter
                .hasNext();) {
            ComputedColumnHandle cch = iter.next();
            ChartItemUtil.loadExpression(exprCodec, cch);
            if (exprCodec.isDimensionExpresion()) {
                dimensionExprs.add(cch.getName());
            } else if (exprCodec.isMeasureExpresion()) {
                measureExprs.add(cch.getName());
            }
        }

        String[] valueExprs = measureExprs.toArray(new String[measureExprs.size()]);

        getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, null);
        getContext().addPredefinedQuery(ChartUIConstants.QUERY_OPTIONAL, null);
        getContext().addPredefinedQuery(ChartUIConstants.QUERY_VALUE, valueExprs);
    }

    @SuppressWarnings("unchecked")
    protected void updatePredefinedQueriesForSharingCube() {
        // Get all column bindings.
        List<String> dimensionExprs = new ArrayList<String>();
        List<String> measureExprs = new ArrayList<String>();
        ReportItemHandle reportItemHandle = dataProvider.getReportItemHandle();
        for (Iterator<ComputedColumnHandle> iter = reportItemHandle.getColumnBindings().iterator(); iter
                .hasNext();) {
            ComputedColumnHandle cch = iter.next();
            // String dataExpr = ExpressionUtil.createJSDataExpression(
            // cch.getName( ) );
            chartItemHelper.loadExpression(exprCodec, cch);
            if (exprCodec.isDimensionExpresion()) {
                dimensionExprs.add(cch.getName());
            } else if (exprCodec.isMeasureExpresion()) {
                // Fixed issue ED 28.
                // Underlying code was reverted to the earlier than
                // bugzilla 246683, since we have enhanced it to
                // support all available measures defined in shared
                // item.

                // Bugzilla 246683.
                // Here if it is sharing with crosstab or
                // multi-view, we just put the measure expression
                // whose aggregate-ons is most into prepared
                // expression query. It will keep correct value to
                // shared crosstab or multi-view.
                measureExprs.add(cch.getName());
            } else if (exprCodec.isCubeBinding(true)) {
                // Just it is under multiple view case, we add those computed measure bindings.
                String dataType = cch.getDataType();
                if (org.eclipse.birt.report.model.api.elements.DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL
                        .equals(dataType)
                        || org.eclipse.birt.report.model.api.elements.DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT
                                .equals(dataType)
                        || org.eclipse.birt.report.model.api.elements.DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER
                                .equals(dataType)) {
                    // It is computed measure binding.
                    measureExprs.add(cch.getName());
                }
            }
        }
        String[] categoryExprs = dimensionExprs.toArray(new String[dimensionExprs.size()]);
        String[] yOptionalExprs = categoryExprs;
        String[] valueExprs = measureExprs.toArray(new String[measureExprs.size()]);

        ReportItemHandle referenceHandle = ChartItemUtil.getReportItemReference(itemHandle);
        ReportDataServiceProvider rdsp = this.getDataServiceProvider();
        if (referenceHandle instanceof ExtendedItemHandle && rdsp.isChartReportItemHandle(referenceHandle)) {
            // If the final reference handle is cube with other
            // chart, the valid category and Y optional expressions
            // only allow those expressions defined in shared chart.
            Object referenceCM = ChartItemUtil.getChartFromHandle((ExtendedItemHandle) referenceHandle);
            categoryExprs = rdsp.getSeriesExpressionsFrom(referenceCM, ChartUIConstants.QUERY_CATEGORY);
            yOptionalExprs = rdsp.getSeriesExpressionsFrom(referenceCM, ChartUIConstants.QUERY_OPTIONAL);
            valueExprs = rdsp.getSeriesExpressionsFrom(referenceCM, ChartUIConstants.QUERY_VALUE);

            Chart cm = this.getContext().getModel();
            if (categoryExprs.length > 0) {
                updateCategoryExpression(cm, categoryExprs[0]);
            }
            if (yOptionalExprs.length > 0) {
                updateYOptionalExpressions(cm, yOptionalExprs[0]);
            }
        } else if (dataProvider.checkState(IDataServiceProvider.SHARE_CROSSTAB_QUERY)) {
            // In sharing query with crosstab, the category
            // expression and Y optional expression is decided by
            // value series expression, so here set them to null.
            // And in UI, when the value series expression is
            // selected, it will trigger to set correct category and
            // Y optional expressions.
            categoryExprs = null;
            yOptionalExprs = null;
        }

        getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, categoryExprs);
        getContext().addPredefinedQuery(ChartUIConstants.QUERY_OPTIONAL, yOptionalExprs);
        getContext().addPredefinedQuery(ChartUIConstants.QUERY_VALUE, valueExprs);
    }

    private void updatePredefinedQueries() {
        if (dataProvider.isInXTabMeasureCell()) {
            try {
                CrosstabReportItemHandle xtab = ChartCubeUtil.getXtabContainerCell(itemHandle).getCrosstab();

                if (dataProvider.isPartChart()) {
                    List<String> levels = ChartCubeUtil.getAllLevelsBindingName(xtab);
                    String[] exprs = levels.toArray(new String[levels.size()]);
                    if (exprs.length == 2 && dataProvider.isInXTabAggrCell()) {
                        // Only one direction is valid for chart in total cell
                        if (((ChartWithAxes) getChartModel()).isTransposed()) {
                            exprs = new String[] { exprs[1] };
                        } else {
                            exprs = new String[] { exprs[0] };
                        }
                    }
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, exprs);
                } else {
                    Iterator<ComputedColumnHandle> columnBindings = ChartItemUtil
                            .getAllColumnBindingsIterator(itemHandle);
                    List<String> levels = ChartCubeUtil.getAllLevelsBindingName(columnBindings);
                    String[] exprs = levels.toArray(new String[levels.size()]);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, exprs);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_OPTIONAL, exprs);

                    columnBindings = ChartItemUtil.getAllColumnBindingsIterator(itemHandle);
                    List<String> measures = ChartCubeUtil.getAllMeasuresBindingName(columnBindings);
                    exprs = measures.toArray(new String[measures.size()]);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_VALUE, exprs);
                }

            } catch (BirtException e) {
                WizardBase.displayException(e);
            }
        } else {
            if (getCube() == null) {
                try {
                    ColumnBindingInfo[] headers = dataProvider.getPreviewHeadersInfo();
                    getDataServiceProvider().setPredefinedExpressions(headers);
                } catch (ChartException e) {
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, null);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_VALUE, null);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_OPTIONAL, null);
                }

            } else if (isDataItemSupported(SELECT_DATA_CUBE)) {
                if (dataProvider.isInheritanceOnly() || dataProvider.isSharedBinding()) {
                    updatePredefinedQueriesForSharingCube();
                } else if (dataProvider.isInXTabNonAggrCell() && dataProvider.isInheritCube()) {
                    updatePredefinedQueriesForInheritXTab();
                }
                // TODO do we need to handle xtab inheritance case? currently we
                // just inherit the cube from xtab essentially
                // else if ( ChartXTabUIUtil.isInheritXTabCell( itemHandle ) )
                // {
                // // Chart in xtab cell and inherits its cube
                // List<String> measureExprs = new ArrayList<String>( );
                // for ( Iterator<ComputedColumnHandle> iter =
                // ChartReportItemUtil.getBindingHolder( itemHandle )
                // .getColumnBindings( )
                // .iterator( ); iter.hasNext( ); )
                // {
                // ComputedColumnHandle cch = iter.next( );
                // if ( ChartCubeUtil.isMeasureExpresion( cch.getExpression( ) )
                // )
                // {
                // measureExprs.add( ExpressionUtil.createJSDataExpression(
                // cch.getName( ) ) );
                // }
                // }
                // String[] valueExprs = measureExprs.toArray( new
                // String[measureExprs.size( )] );
                // getContext( ).addPredefinedQuery(
                // ChartUIConstants.QUERY_CATEGORY,
                // null );
                // getContext( ).addPredefinedQuery(
                // ChartUIConstants.QUERY_OPTIONAL,
                // null );
                // getContext( ).addPredefinedQuery(
                // ChartUIConstants.QUERY_VALUE,
                // valueExprs );
                // }
                else {
                    // Updates cube bindings before updating available bindings
                    // for chart.
                    getDataServiceProvider().update(ChartUIConstants.UPDATE_CUBE_BINDINGS, null);

                    Iterator<ComputedColumnHandle> columnBindings = ChartItemUtil
                            .getAllColumnBindingsIterator(itemHandle);
                    List<String> levels = ChartCubeUtil.getAllLevelsBindingName(columnBindings);
                    String[] exprs = levels.toArray(new String[levels.size()]);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_CATEGORY, exprs);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_OPTIONAL, exprs);

                    columnBindings = ChartItemUtil.getAllColumnBindingsIterator(itemHandle);
                    List<String> measures = ChartCubeUtil.getAllMeasuresBindingName(columnBindings);
                    exprs = measures.toArray(new String[measures.size()]);
                    getContext().addPredefinedQuery(ChartUIConstants.QUERY_VALUE, exprs);
                }
            }
        }

        // Fire event to update predefined queries in outside UI
        fireEvent(btnBinding, EVENT_QUERY);
    }

    /**
     * Update Y Optional expression with specified expression if current Y
     * optional expression is null or empty.
     * 
     * @param cm
     *            chart model.
     * @param expr
     *            specified expression.
     */
    protected void updateYOptionalExpressions(Chart cm, String expr) {
        this.dataProvider.update(ChartUIConstants.QUERY_OPTIONAL, expr);
    }

    /**
     * Update category expression with specified expression if current category
     * expression is null or empty.
     * 
     * @param cm
     *            chart model.
     * @param expr
     *            specified expression.
     */
    protected void updateCategoryExpression(Chart cm, String expr) {
        this.dataProvider.update(ChartUIConstants.QUERY_CATEGORY, expr);
    }

    @SuppressWarnings("unchecked")
    protected void checkDataBinding() {
        if (getCube() != null && !chartItemHelper.checkCubeBindings(itemHandle,
                DEUtil.getBindingColumnIterator(DEUtil.getBindingHolder(itemHandle)))) {
            ChartWizard.showException(ChartWizard.StaChartDSh_checCube_ID,
                    Messages.getString("StandardChartDataSheet.CheckCubeWarning")); //$NON-NLS-1$
        } else {
            ChartWizard.removeException(ChartWizard.StaChartDSh_checCube_ID);
        }
    }

    @Override
    public ISelectDataCustomizeUI createCustomizeUI(ITask task) {
        return new SelectDataDynamicArea(task);
    }

    @Override
    public List<String> getAllValueDefinitions() {
        List<String> dataDefinitions = new ArrayList<String>(2);
        for (SeriesDefinition sd : ChartUIUtil.getAllOrthogonalSeriesDefinitions(getChartModel())) {
            for (Query query : sd.getDesignTimeSeries().getDataDefinition()) {
                String name = exprCodec.getBindingName(query.getDefinition());
                if (name != null) {
                    dataDefinitions.add(name);
                }
            }
        }

        return dataDefinitions;
    }

    protected String getDataPreviewDescription() {
        return Messages.getString("StandardChartDataSheet.Label.ToBindADataColumn"); //$NON-NLS-1$
    }
}