org.eclipse.birt.report.designer.internal.ui.dialogs.BindingDialogHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.internal.ui.dialogs.BindingDialogHelper.java

Source

/*******************************************************************************
 * Copyright (c) 2004 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.report.designer.internal.ui.dialogs;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.birt.core.data.ExpressionUtil;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.data.engine.api.aggregation.AggregationManager;
import org.eclipse.birt.data.engine.api.aggregation.IAggrFunction;
import org.eclipse.birt.data.engine.api.aggregation.IParameterDefn;
import org.eclipse.birt.report.data.adapter.api.AdapterException;
import org.eclipse.birt.report.data.adapter.api.DataAdapterUtil;
import org.eclipse.birt.report.designer.core.model.SessionHandleAdapter;
import org.eclipse.birt.report.designer.data.ui.dataset.DataSetUIUtil;
import org.eclipse.birt.report.designer.data.ui.util.DataUtil;
import org.eclipse.birt.report.designer.internal.ui.dialogs.expression.ExpressionButton;
import org.eclipse.birt.report.designer.internal.ui.extension.ExtendedDataModelUIAdapterHelper;
import org.eclipse.birt.report.designer.internal.ui.extension.IExtendedDataModelUIAdapter;
import org.eclipse.birt.report.designer.internal.ui.swt.custom.CLabel;
import org.eclipse.birt.report.designer.internal.ui.util.ExceptionHandler;
import org.eclipse.birt.report.designer.internal.ui.util.ExpressionButtonUtil;
import org.eclipse.birt.report.designer.internal.ui.util.UIUtil;
import org.eclipse.birt.report.designer.internal.ui.util.WidgetUtil;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.ui.ReportPlatformUIImages;
import org.eclipse.birt.report.designer.ui.dialogs.BindingExpressionProvider;
import org.eclipse.birt.report.designer.ui.views.attributes.providers.ChoiceSetFactory;
import org.eclipse.birt.report.designer.util.AlphabeticallyComparator;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.model.api.AggregationArgumentHandle;
import org.eclipse.birt.report.model.api.CachedMetaDataHandle;
import org.eclipse.birt.report.model.api.ComputedColumnHandle;
import org.eclipse.birt.report.model.api.DataItemHandle;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.Expression;
import org.eclipse.birt.report.model.api.ExpressionHandle;
import org.eclipse.birt.report.model.api.ExpressionType;
import org.eclipse.birt.report.model.api.GridHandle;
import org.eclipse.birt.report.model.api.GroupHandle;
import org.eclipse.birt.report.model.api.IResourceLocator;
import org.eclipse.birt.report.model.api.LibraryHandle;
import org.eclipse.birt.report.model.api.ListGroupHandle;
import org.eclipse.birt.report.model.api.ListHandle;
import org.eclipse.birt.report.model.api.ListingHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.StructureFactory;
import org.eclipse.birt.report.model.api.TableGroupHandle;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.AggregationArgument;
import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
import org.eclipse.birt.report.model.api.elements.structures.ResultSetColumn;
import org.eclipse.birt.report.model.api.metadata.IChoice;
import org.eclipse.birt.report.model.api.metadata.IChoiceSet;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Layout;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;

/**
 * 
 */

public class BindingDialogHelper extends AbstractBindingDialogHelper {

    protected static final String NAME = Messages.getString("BindingDialogHelper.text.Name"); //$NON-NLS-1$
    protected static final String DATA_TYPE = Messages.getString("BindingDialogHelper.text.DataType"); //$NON-NLS-1$
    protected static final String FUNCTION = Messages.getString("BindingDialogHelper.text.Function"); //$NON-NLS-1$
    protected static final String DATA_FIELD = Messages.getString("BindingDialogHelper.text.DataField"); //$NON-NLS-1$
    protected static final String FILTER_CONDITION = Messages.getString("BindingDialogHelper.text.Filter"); //$NON-NLS-1$
    protected static final String AGGREGATE_ON = Messages.getString("BindingDialogHelper.text.AggOn"); //$NON-NLS-1$
    protected static final String TABLE = Messages.getString("BindingDialogHelper.text.Table"); //$NON-NLS-1$
    protected static final String LIST = Messages.getString("BindingDialogHelper.text.List"); //$NON-NLS-1$
    protected static final String GRID = Messages.getString("BindingDialogHelper.text.Grid"); //$NON-NLS-1$
    protected static final String ALL = Messages.getString("CrosstabBindingDialogHelper.AggOn.All"); //$NON-NLS-1$
    protected static final String GROUP = Messages.getString("BindingDialogHelper.text.Group"); //$NON-NLS-1$
    protected static final String EXPRESSION = Messages.getString("BindingDialogHelper.text.Expression"); //$NON-NLS-1$
    protected static final String DISPLAY_NAME = Messages.getString("BindingDialogHelper.text.displayName"); //$NON-NLS-1$
    protected static final String ALLOW_EXPORT_LABEL = Messages.getString("BindingDialogHelper.text.allowExport"); //$NON-NLS-1$
    protected static final String ALLOW_EXPORT_BUTTON = Messages
            .getString("BindingDialogHelper.text.allowExport.button"); //$NON-NLS-1$
    protected static final String DISPLAY_NAME_ID = Messages.getString("BindingDialogHelper.text.displayNameID"); //$NON-NLS-1$

    protected static final String DEFAULT_ITEM_NAME = Messages
            .getString("BindingDialogHelper.bindingName.dataitem"); //$NON-NLS-1$
    protected static final String DEFAULT_AGGREGATION_NAME = Messages
            .getString("BindingDialogHelper.bindingName.aggregation"); //$NON-NLS-1$
    protected static final String NAME_LABEL = Messages.getString("BindingDialogHelper.error.text.Name"); //$NON-NLS-1$

    protected static final IChoiceSet DATA_TYPE_CHOICE_SET = DEUtil.getMetaDataDictionary()
            .getStructure(ComputedColumn.COMPUTED_COLUMN_STRUCT).getMember(ComputedColumn.DATA_TYPE_MEMBER)
            .getAllowedChoices();
    protected static final IChoice[] DATA_TYPE_CHOICES = DATA_TYPE_CHOICE_SET.getChoices(null);
    protected String[] dataTypes = ChoiceSetFactory.getDisplayNamefromChoiceSet(DATA_TYPE_CHOICE_SET);
    protected Button btnTable;

    protected Text txtName, txtFilter, txtExpression;
    protected Combo cmbType, cmbFunction, cmbGroup;
    protected Button btnGroup, btnDisplayNameID, btnRemoveDisplayNameID;
    protected Composite paramsComposite;

    protected Map<String, Control> paramsMap = new LinkedHashMap<String, Control>();
    protected Map<String, String[]> paramsValueMap = new HashMap<String, String[]>();

    protected Composite composite;
    protected Text txtDisplayName, txtDisplayNameID;
    private ComputedColumn newBinding;
    private CLabel messageLine;
    private Combo cmbName;
    private Label lbName, lbDisplayNameID;

    private boolean isCreate;
    protected boolean isRef;
    private Object container;

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

    public void createContent(Composite parent) {

        isCreate = getBinding() == null;
        isRef = getBindingHolder().getDataBindingType() == ReportItemHandle.DATABINDING_TYPE_REPORT_ITEM_REF;
        composite = parent;

        ((GridLayout) composite.getLayout()).numColumns = 4;

        lbName = new Label(composite, SWT.NONE);
        lbName.setText(NAME);

        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 3;
        gd.widthHint = 200;

        if (isRef) {
            cmbName = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
            cmbName.setLayoutData(gd);
            cmbName.setVisibleItemCount(30);
            cmbName.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent e) {
                    modifyDialogContent();

                    String bindingName = cmbName.getItem(cmbName.getSelectionIndex());

                    for (Iterator iterator = getBindingHolder().getDataBindingReference().getColumnBindings()
                            .iterator(); iterator.hasNext();) {
                        ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator.next();
                        if (computedColumn.getName().equals(bindingName)) {
                            setBinding(computedColumn);
                            initDialog();
                            return;
                        }
                    }
                }
            });
        } else {
            txtName = new Text(composite, SWT.BORDER);
            txtName.setLayoutData(gd);
            txtName.addModifyListener(new ModifyListener() {

                public void modifyText(ModifyEvent e) {
                    modifyDialogContent();
                    validate();
                }

            });
        }
        // WidgetUtil.createGridPlaceholder( composite, 1, false );

        lbDisplayNameID = new Label(composite, SWT.NONE);
        lbDisplayNameID.setText(DISPLAY_NAME_ID);
        lbDisplayNameID.addTraverseListener(new TraverseListener() {

            public void keyTraversed(TraverseEvent e) {
                if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
                    e.detail = SWT.TRAVERSE_NONE;
                    if (btnDisplayNameID.isEnabled()) {
                        openKeySelectionDialog();
                    }
                }
            }
        });
        txtDisplayNameID = new Text(composite, SWT.BORDER | SWT.READ_ONLY);
        txtDisplayNameID.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        btnDisplayNameID = new Button(composite, SWT.NONE);
        btnDisplayNameID.setEnabled(
                getAvailableResourceUrls() != null && getAvailableResourceUrls().length > 0 ? true : false);
        btnDisplayNameID.setText("..."); //$NON-NLS-1$
        btnDisplayNameID.setToolTipText(Messages.getString("ResourceKeyDescriptor.button.browse.tooltip")); //$NON-NLS-1$
        btnDisplayNameID.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent event) {
                openKeySelectionDialog();
            }
        });

        btnRemoveDisplayNameID = new Button(composite, SWT.NONE);
        btnRemoveDisplayNameID.setImage(ReportPlatformUIImages.getImage(ISharedImages.IMG_TOOL_DELETE));
        btnRemoveDisplayNameID.setToolTipText(Messages.getString("ResourceKeyDescriptor.button.reset.tooltip")); //$NON-NLS-1$
        btnRemoveDisplayNameID.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent event) {
                txtDisplayNameID.setText(EMPTY_STRING);
                txtDisplayName.setText(EMPTY_STRING);

                modifyDialogContent();

                updateRemoveBtnState();
            }
        });

        new Label(composite, SWT.NONE).setText(DISPLAY_NAME);
        txtDisplayName = new Text(composite, SWT.BORDER);
        txtDisplayName.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                modifyDialogContent();
            }

        });
        txtDisplayName.setLayoutData(gd);
        // WidgetUtil.createGridPlaceholder( composite, 1, false );

        new Label(composite, SWT.NONE).setText(DATA_TYPE);
        cmbType = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
        cmbType.setLayoutData(gd);
        cmbType.setVisibleItemCount(30);
        cmbType.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent arg0) {
                validate();
            }

            public void widgetSelected(SelectionEvent arg0) {
                modifyDialogContent();

                validate();
            }
        });

        Label allowExportLabel = new Label(composite, SWT.NONE);
        allowExportLabel.setText(ALLOW_EXPORT_LABEL);
        btnAllowExport = new Button(composite, SWT.CHECK);
        btnAllowExport.setText(ALLOW_EXPORT_BUTTON);
        btnAllowExport.setSelection(true);

        GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
        gd1.horizontalSpan = 3;
        gd1.widthHint = 200;
        gd1.heightHint = cmbType.computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
        btnAllowExport.setLayoutData(gd1);

        btnAllowExport.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
            }
        });

        // WidgetUtil.setExcludeGridData( allowExportLabel, true );
        // WidgetUtil.setExcludeGridData( btnAllowExport, true );

        if (isAggregate()) {
            createAggregateSection(composite);
        } else {
            createCommonSection(composite);
        }

        createMessageSection(composite);

        gd = new GridData(GridData.FILL_BOTH);
        composite.setLayoutData(gd);
        setContentSize(composite);
    }

    private void openKeySelectionDialog() {
        ResourceEditDialog dlg = new ResourceEditDialog(composite.getShell(),
                Messages.getString("ResourceKeyDescriptor.title.SelectKey")); //$NON-NLS-1$

        dlg.setResourceURLs(getResourceURLs());

        if (dlg.open() == Window.OK) {
            String[] result = (String[]) dlg.getDetailResult();
            if (result != null && result.length > 1) {
                txtDisplayNameID.setText(DEUtil.resolveNull(result[0]));
                txtDisplayName.setText(DEUtil.resolveNull(result[1]));
                modifyDialogContent();
                updateRemoveBtnState();
            }
        }
    }

    private boolean hasInitDialog = false;

    public void initDialog() {
        cmbType.setItems(dataTypes);
        // txtDisplayName.setFocus( );
        // initiate function firstly then data type field.
        // Expression gets the comment.
        if (txtExpression != null && !txtExpression.isDisposed())// add
        // if/else
        // block to
        // fix TED
        // 52776:NPE
        // thrown
        {
            txtExpression.setFocus();
        } else {
            txtDisplayName.setFocus();
        }
        if (isAggregate()) {
            initFunction();
            initFilter();
            initGroups();
        }

        if (isCreate)// create
        {
            if (isRef) {
                if (getBinding() == null) {
                    for (Iterator iterator = getBindingHolder().getDataBindingReference().getColumnBindings()
                            .iterator(); iterator.hasNext();) {
                        ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator.next();
                        if (isAggregate()) {
                            if (computedColumn.getAggregateFunction() == null
                                    || computedColumn.getAggregateFunction().equals("")) //$NON-NLS-1$
                                continue;
                        } else {
                            if (computedColumn.getAggregateFunction() != null
                                    && !computedColumn.getAggregateFunction().equals("")) //$NON-NLS-1$
                                continue;
                        }
                        cmbName.add(computedColumn.getName());
                    }
                } else {
                    setDisplayName(getBinding().getDisplayName());
                    setDisplayNameID(getBinding().getDisplayNameID());
                    setAllowExport(getBinding().allowExport());
                    for (int i = 0; i < DATA_TYPE_CHOICES.length; i++) {
                        if (DATA_TYPE_CHOICES[i].getName().equals(getBinding().getDataType())) {
                            setTypeSelect(DATA_TYPE_CHOICES[i].getDisplayName());
                            break;
                        }
                    }
                    setDataFieldExpression(getBinding());
                }
            } else {
                this.newBinding = StructureFactory.newComputedColumn(getBindingHolder(),
                        isAggregate() ? DEFAULT_AGGREGATION_NAME : DEFAULT_ITEM_NAME);
                setName(this.newBinding.getName());
                setAllowExport(this.newBinding.allowExport());
                if (!isAggregate()) {
                    setTypeSelect(getDataTypeDisplayName(DesignChoiceConstants.COLUMN_DATA_TYPE_STRING));
                }
            }
        } else {
            if (isRef) {
                int i = 0;
                for (Iterator iterator = getBindingHolder().getDataBindingReference().getColumnBindings()
                        .iterator(); iterator.hasNext();) {
                    ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator.next();
                    if (isAggregate()) {
                        if (computedColumn.getAggregateFunction() == null
                                || computedColumn.getAggregateFunction().equals("")) //$NON-NLS-1$
                            continue;
                    } else {
                        if (computedColumn.getAggregateFunction() != null
                                && !computedColumn.getAggregateFunction().equals("")) //$NON-NLS-1$
                            continue;
                    }
                    cmbName.add(computedColumn.getName());
                    if (getBinding().getName().equals(computedColumn.getName()))
                        cmbName.select(i);
                    i++;
                }
                setDisplayName(getBinding().getDisplayName());
                setDisplayNameID(getBinding().getDisplayNameID());
                setAllowExport(getBinding().allowExport());
                for (i = 0; i < DATA_TYPE_CHOICES.length; i++) {
                    if (DATA_TYPE_CHOICES[i].getName().equals(getBinding().getDataType())) {
                        setTypeSelect(DATA_TYPE_CHOICES[i].getDisplayName());
                        break;
                    }
                }
                setDataFieldExpression(getBinding());
            } else {
                setName(getBinding().getName());
                setDisplayName(getBinding().getDisplayName());
                setDisplayNameID(getBinding().getDisplayNameID());
                setAllowExport(getBinding().allowExport());
                if (getBinding().getDataType() != null) {
                    if (DATA_TYPE_CHOICE_SET.findChoice(getBinding().getDataType()) != null)
                        setTypeSelect(DATA_TYPE_CHOICE_SET.findChoice(getBinding().getDataType()).getDisplayName());
                    else
                        // the old type 'any'
                        cmbType.setText(""); //$NON-NLS-1$
                }
                setDataFieldExpression(getBinding());
            }
        }

        if (!isCreate) {
            if (isRef) {
                this.cmbName.setEnabled(true);
            } else {
                this.txtName.setEnabled(false);
            }
        }

        validate();

        hasInitDialog = true;
    }

    private void initExpressionButton(ExpressionHandle expressionHandle, Text text) {
        ExpressionButtonUtil.initExpressionButtonControl(text, expressionHandle);
    }

    private void initFilter() {
        if (binding != null) {
            ExpressionHandle expressionHandle = binding.getExpressionProperty(ComputedColumn.FILTER_MEMBER);
            initExpressionButton(expressionHandle, txtFilter);
        }
    }

    private void initFunction() {
        cmbFunction.setItems(getFunctionDisplayNames());
        // cmbFunction.add( NULL, 0 );
        if (binding == null) {
            cmbFunction.select(0);
            handleFunctionSelectEvent();
            return;
        }
        try {
            String functionString = getFunctionDisplayName(
                    DataAdapterUtil.adaptModelAggregationType(binding.getAggregateFunction()));
            int itemIndex = getItemIndex(getFunctionDisplayNames(), functionString);
            cmbFunction.select(itemIndex);
            handleFunctionSelectEvent();
        } catch (AdapterException e) {
            ExceptionHandler.handle(e);
        }
        // List args = getFunctionArgs( functionString );
        // bindingColumn.argumentsIterator( )

        // FIXME backforward compatible with binding getExpression
        for (Iterator iterator = binding.argumentsIterator(); iterator.hasNext();) {
            AggregationArgumentHandle arg = (AggregationArgumentHandle) iterator.next();
            String argName = DataAdapterUtil.adaptArgumentName(arg.getName());
            if (paramsMap.containsKey(argName)) {
                if (arg.getValue() != null) {
                    Control control = paramsMap.get(argName);
                    if (control instanceof Text) {
                        ((Text) control).setText(arg.getValue());
                    } else if (control instanceof Combo) {
                        ((Combo) control).setText(arg.getValue());
                    }
                }
            }
        }
    }

    private String[] getFunctionDisplayNames() {
        IAggrFunction[] choices = getFunctions();
        if (choices == null)
            return new String[0];

        String[] displayNames = new String[choices.length];
        for (int i = 0; i < choices.length; i++) {
            displayNames[i] = choices[i].getDisplayName();
        }
        java.util.Arrays.sort(displayNames, new AlphabeticallyComparator());
        return displayNames;
    }

    protected IAggrFunction getFunctionByDisplayName(String displayName) {
        IAggrFunction[] choices = getFunctions();
        if (choices == null)
            return null;

        for (int i = 0; i < choices.length; i++) {
            if (choices[i].getDisplayName().equals(displayName)) {
                return choices[i];
            }
        }
        return null;
    }

    protected String getFunctionDisplayName(String function) {
        try {
            return DataUtil.getAggregationManager().getAggregation(function).getDisplayName();
        } catch (BirtException e) {
            ExceptionHandler.handle(e);
            return null;
        }
    }

    private IAggrFunction[] getFunctions() {
        try {
            List aggrInfoList = DataUtil.getAggregationManager().getAggregations(AggregationManager.AGGR_TABULAR);
            return (IAggrFunction[]) aggrInfoList.toArray(new IAggrFunction[0]);
        } catch (BirtException e) {
            ExceptionHandler.handle(e);
            return new IAggrFunction[0];
        }
    }

    protected void initTextField(Text txtParam, IParameterDefn param) {
        if (paramsValueMap.containsKey(param.getName())) {
            txtParam.setText(paramsValueMap.get(param.getName())[0]);
            txtParam.setData(ExpressionButtonUtil.EXPR_TYPE, paramsValueMap.get(param.getName())[1]);
            ExpressionButton button = (ExpressionButton) txtParam.getData(ExpressionButtonUtil.EXPR_BUTTON);
            if (button != null)
                button.refresh();
            return;
        }
        if (binding != null) {
            for (Iterator iterator = binding.argumentsIterator(); iterator.hasNext();) {
                AggregationArgumentHandle arg = (AggregationArgumentHandle) iterator.next();
                if (arg.getName().equals(param.getName())) {
                    ExpressionButtonUtil.initExpressionButtonControl(txtParam, arg,
                            AggregationArgument.VALUE_MEMBER);
                    return;
                }
            }
        }
    }

    /**
     * fill the cmbDataField with binding holder's bindings
     * 
     * @param param
     */
    protected void initDataFields(Combo cmbDataField, IParameterDefn param) {
        cmbDataField.setItems(getColumnBindings());
        if (paramsValueMap.containsKey(param.getName())) {
            cmbDataField.setText(paramsValueMap.get(param.getName())[0]);
            cmbDataField.setData(ExpressionButtonUtil.EXPR_TYPE, paramsValueMap.get(param.getName())[1]);
            ExpressionButton button = (ExpressionButton) cmbDataField.getData(ExpressionButtonUtil.EXPR_BUTTON);
            if (button != null)
                button.refresh();
            return;
        }
        if (binding != null) {
            ExpressionHandle expressionHandle = null;
            for (Iterator iterator = binding.argumentsIterator(); iterator.hasNext();) {
                AggregationArgumentHandle arg = (AggregationArgumentHandle) iterator.next();
                if (arg.getName().equals(param.getName())) {
                    ExpressionHandle value = arg.getExpressionProperty(AggregationArgument.VALUE_MEMBER);

                    expressionHandle = value;

                    break;
                }
            }

            if (expressionHandle == null)
                expressionHandle = binding.getExpressionProperty(ComputedColumn.EXPRESSION_MEMBER);

            ExpressionButtonUtil.initExpressionButtonControl(cmbDataField, expressionHandle);
        }

        Object button = cmbDataField.getData(ExpressionButtonUtil.EXPR_BUTTON);
        if (button instanceof ExpressionButton) {
            if (!((ExpressionButton) button).isSupportType(ExpressionType.JAVASCRIPT)) {
                cmbDataField.removeAll();
            }
        }
    }

    protected String[] getColumnBindings() {
        List elementsList = DEUtil.getVisiableColumnBindingsList(getBindingHolder());
        String[] bindings = new String[elementsList.size()];
        for (int i = 0; i < bindings.length; i++) {
            bindings[i] = ((ComputedColumnHandle) elementsList.get(i)).getName();
        }
        return bindings;
    }

    protected void initGroups() {
        String[] groups = getGroups();
        if (groups.length > 0) {
            cmbGroup.setItems(groups);
            if (binding != null && binding.getAggregateOn() != null) {
                btnGroup.setSelection(true);
                btnTable.setSelection(false);
                if (!isRef)
                    cmbGroup.setEnabled(true);
                for (int i = 0; i < groups.length; i++) {
                    if (groups[i].equals(binding.getAggregateOn())) {
                        cmbGroup.select(i);
                        return;
                    }
                }
            } else {
                // BUG 201963
                if (this.container instanceof DesignElementHandle && ((DesignElementHandle) this.container)
                        .getContainer().getContainer() instanceof TableGroupHandle) {
                    TableGroupHandle groupHandle = (TableGroupHandle) ((DesignElementHandle) this.container)
                            .getContainer().getContainer();
                    for (int i = 0; i < groups.length; i++) {
                        if (groups[i].equals(groupHandle.getName())) {
                            cmbGroup.select(i);
                        }
                    }
                    btnTable.setSelection(false);
                    btnGroup.setSelection(true);
                } else if (this.container instanceof ListGroupHandle) {
                    ListGroupHandle groupHandle = (ListGroupHandle) this.container;
                    for (int i = 0; i < groups.length; i++) {
                        if (groups[i].equals(groupHandle.getName())) {
                            cmbGroup.select(i);
                        }
                    }
                    btnTable.setSelection(false);
                    btnGroup.setSelection(true);
                } else {
                    btnTable.setSelection(true);
                    btnGroup.setSelection(false);
                    cmbGroup.select(0);
                    cmbGroup.setEnabled(false);
                }
            }
        } else {
            btnGroup.setEnabled(false);
            cmbGroup.setEnabled(false);
            btnTable.setSelection(true);
        }
    }

    public String[] getGroups() {
        if (getBindingHolder() instanceof ListingHandle) {
            ListingHandle listingHandle = (ListingHandle) getBindingHolder();
            List groupNames = new ArrayList();
            for (int i = 0; i < listingHandle.getGroups().getCount(); i++) {
                String groupName = ((GroupHandle) listingHandle.getGroups().get(i)).getName();
                if (groupName != null)
                    groupNames.add(groupName);
            }
            return (String[]) groupNames.toArray(new String[0]);
        } else {
            return super.getGroups();
        }
    }

    private void setDataFieldExpression(ComputedColumnHandle binding) {
        if (binding != null) {
            if (txtExpression != null && !txtExpression.isDisposed()) {
                ExpressionButtonUtil.initExpressionButtonControl(txtExpression, binding,
                        ComputedColumn.EXPRESSION_MEMBER);
            }
        }
    }

    private void setName(String name) {
        if (name != null && txtName != null)
            txtName.setText(name);
    }

    private void setDisplayName(String displayName) {
        if (displayName != null && txtDisplayName != null)
            txtDisplayName.setText(displayName);
    }

    private void setDisplayNameID(String displayNameID) {
        if (displayNameID != null && txtDisplayNameID != null)
            txtDisplayNameID.setText(displayNameID);
    }

    private void setAllowExport(boolean allowExport) {
        if (btnAllowExport != null)
            btnAllowExport.setSelection(allowExport);
    }

    private void setTypeSelect(String typeSelect) {
        if (dataTypes != null && cmbType != null) {
            if (typeSelect != null)
                cmbType.select(getItemIndex(cmbType.getItems(), typeSelect));
            else
                cmbType.select(0);
        }
    }

    private int getItemIndex(String[] items, String item) {
        for (int i = 0; i < items.length; i++) {
            if (items[i].equals(item))
                return i;
        }
        return -1;
    }

    protected void createAggregateSection(Composite composite) {

        new Label(composite, SWT.NONE).setText(FUNCTION);
        cmbFunction = new Combo(composite, SWT.BORDER | SWT.READ_ONLY);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 3;
        cmbFunction.setLayoutData(gd);
        cmbFunction.setVisibleItemCount(30);
        // WidgetUtil.createGridPlaceholder( composite, 1, false );

        cmbFunction.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
                handleFunctionSelectEvent();
                validate();
            }
        });

        paramsComposite = new Composite(composite, SWT.NONE);
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalIndent = 0;
        gridData.horizontalSpan = 4;
        gridData.exclude = true;
        paramsComposite.setLayoutData(gridData);
        GridLayout layout = new GridLayout();
        // layout.horizontalSpacing = layout.verticalSpacing = 0;
        layout.marginWidth = layout.marginHeight = 0;
        layout.numColumns = 3;
        Layout parentLayout = paramsComposite.getParent().getLayout();
        if (parentLayout instanceof GridLayout)
            layout.horizontalSpacing = ((GridLayout) parentLayout).horizontalSpacing;
        paramsComposite.setLayout(layout);

        createFilterCondition(composite, gd);

        final Label lblAggOn = new Label(composite, SWT.NONE);
        lblAggOn.setText(AGGREGATE_ON);
        gridData = new GridData();
        gridData.verticalAlignment = GridData.BEGINNING;
        lblAggOn.setLayoutData(gridData);

        Composite aggOnComposite = new Composite(composite, SWT.NONE);
        gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalSpan = 3;
        aggOnComposite.setLayoutData(gridData);

        layout = new GridLayout();
        layout.horizontalSpacing = layout.verticalSpacing = 0;
        layout.marginWidth = layout.marginHeight = 0;
        layout.numColumns = 2;
        aggOnComposite.setLayout(layout);

        btnTable = new Button(aggOnComposite, SWT.RADIO);
        if (getBindingHolder() instanceof TableHandle)
            btnTable.setText(TABLE);
        else if (getBindingHolder() instanceof ListHandle)
            btnTable.setText(LIST);
        else if (getBindingHolder() instanceof GridHandle)
            btnTable.setText(GRID);
        else
            btnTable.setText(ALL);

        btnTable.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
                cmbGroup.setEnabled(false);
            }
        });

        btnTable.getAccessible().addAccessibleListener(new AccessibleAdapter() {

            public void getName(AccessibleEvent e) {
                e.result = UIUtil.stripMnemonic(lblAggOn.getText()) + UIUtil.stripMnemonic(btnTable.getText());
            }
        });

        WidgetUtil.createGridPlaceholder(aggOnComposite, 1, false);

        btnGroup = new Button(aggOnComposite, SWT.RADIO);
        btnGroup.setText(GROUP);
        btnGroup.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
                cmbGroup.setEnabled(true);
            }
        });

        btnGroup.getAccessible().addAccessibleListener(new AccessibleAdapter() {

            public void getName(AccessibleEvent e) {
                e.result = UIUtil.stripMnemonic(lblAggOn.getText()) + UIUtil.stripMnemonic(btnGroup.getText());
            }
        });

        cmbGroup = new Combo(aggOnComposite, SWT.BORDER | SWT.READ_ONLY);
        cmbGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        cmbGroup.setVisibleItemCount(30);
        cmbGroup.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
            }
        });
        cmbFunction.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                modifyDialogContent();
            }
        });

        if (isRef) {
            txtDisplayName.setEnabled(false);
            txtDisplayNameID.setEnabled(false);
            btnDisplayNameID.setEnabled(false);
            cmbType.setEnabled(false);
            cmbFunction.setEnabled(false);
            // cmbDataField.setEnabled( false );
            txtFilter.setEnabled(false);
            paramsComposite.setEnabled(false);
            cmbGroup.setEnabled(false);
            btnTable.setEnabled(false);
            btnGroup.setEnabled(false);
        }
    }

    protected void createFilterCondition(Composite composite, GridData gd) {
        new Label(composite, SWT.NONE).setText(FILTER_CONDITION);
        txtFilter = new Text(composite, SWT.BORDER | SWT.MULTI);
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = txtFilter.computeSize(SWT.DEFAULT, SWT.DEFAULT).y - txtFilter.getBorderWidth() * 2;
        gd.horizontalSpan = 2;
        txtFilter.setLayoutData(gd);

        txtFilter.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent arg0) {
                modifyDialogContent();
                validate();
            }
        });
        createExpressionButton(composite, txtFilter);
    }

    private void createCommonSection(Composite composite) {
        new Label(composite, SWT.NONE).setText(EXPRESSION);

        txtExpression = new Text(composite, SWT.BORDER | SWT.MULTI);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        gd.heightHint = txtExpression.computeSize(SWT.DEFAULT, SWT.DEFAULT).y - txtExpression.getBorderWidth() * 2;
        txtExpression.setLayoutData(gd);
        createExpressionButton(composite, txtExpression);
        txtExpression.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                modifyDialogContent();
                validate();
            }

        });
        if (isRef) {
            txtDisplayName.setEnabled(false);
            txtDisplayNameID.setEnabled(false);
            btnDisplayNameID.setEnabled(false);
            cmbType.setEnabled(false);
            txtExpression.setEnabled(false);
        }
    }

    private void createMessageSection(Composite composite) {
        messageLine = new CLabel(composite, SWT.LEFT);
        GridData layoutData = new GridData(GridData.FILL_HORIZONTAL);
        layoutData.horizontalSpan = 4;
        messageLine.setLayoutData(layoutData);
    }

    public void setMessage(String message) {
        this.messageLine.setText(message);
        this.messageLine.setImage(null);
    }

    public void setErrorMessage(String message) {
        this.messageLine.setText(message);
        this.messageLine
                .setImage(PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJS_ERROR_TSK));
    }

    private void verifyInput() {
        if (isRef) {
            if (cmbName.getText() == null || cmbName.getText().equals("")) //$NON-NLS-1$
            {
                dialog.setCanFinish(false);
            } else {
                dialogCanFinish();
            }
            return;
        }

        if (txtName != null && (txtName.getText() == null || txtName.getText().trim().equals(""))) //$NON-NLS-1$
        {
            setErrorMessage(Messages.getFormattedString("BindingDialogHelper.error.empty", //$NON-NLS-1$
                    new Object[] { NAME_LABEL }));
            dialog.setCanFinish(false);
            return;
        }

        if (cmbType.getText() == null || cmbType.getText().equals("")) //$NON-NLS-1$
        {
            dialog.setCanFinish(false);
            return;
        }

        if (this.binding == null)// create bindnig, we should check if the
        // binding name already exists.
        {
            for (Iterator iterator = this.bindingHolder.getColumnBindings().iterator(); iterator.hasNext();) {
                ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator.next();
                if (computedColumn.getName().equals(txtName.getText())) {
                    dialog.setCanFinish(false);
                    setErrorMessage(Messages.getFormattedString("BindingDialogHelper.error.nameduplicate", //$NON-NLS-1$
                            new Object[] { txtName.getText() }));
                    return;
                }
            }
        }

        setMessage(""); //$NON-NLS-1$

        if (txtExpression != null && (txtExpression.getText() == null || txtExpression.getText().trim().equals(""))) //$NON-NLS-1$
        {
            // This is a special calse if the item is data item,and the
            // container is LibraryHandle,allow the empty expression
            if (!isAllowEmyptExpression()) {
                dialog.setCanFinish(false);
                return;
            }
        }

        // check non optional parameter is not empty
        if (isAggregate()) {
            try {
                IAggrFunction aggregation = DataUtil.getAggregationManager()
                        .getAggregation(getFunctionByDisplayName(cmbFunction.getText()).getName());

                if (aggregation.getParameterDefn().length > 0) {
                    IParameterDefn[] parameters = aggregation.getParameterDefn();
                    for (IParameterDefn param : parameters) {
                        if (!param.isOptional()) {
                            Control control = paramsMap.get(param.getName());
                            String paramValue = null;
                            if (control instanceof Text) {
                                paramValue = ((Text) control).getText();
                            }
                            if (control instanceof Combo) {
                                paramValue = ((Combo) control).getText();
                            }
                            if (paramValue == null || paramValue.trim().equals("")) //$NON-NLS-1$
                            {
                                dialog.setCanFinish(false);
                                setErrorMessage(Messages.getFormattedString("BindingDialogHelper.error.empty", //$NON-NLS-1$
                                        new String[] { param.getDisplayName().replaceAll("\\(&[a-zA-Z0-9]\\)", "")
                                                .replaceAll("&", "") }));
                                return;
                            }
                        }
                    }
                }
            } catch (BirtException e) {
                // TODO show error message in message panel
            }
        }
        dialogCanFinish();
    }

    private boolean isAllowEmyptExpression() {
        ReportItemHandle itemHandle = getBindingHolder();
        return itemHandle instanceof DataItemHandle && itemHandle.getDataSet() == null
                && itemHandle.getContainer() instanceof LibraryHandle;
    }

    private void dialogCanFinish() {
        if (!isAllowEmyptExpression() && !hasModified && isEditModal())
            dialog.setCanFinish(false);
        else
            dialog.setCanFinish(true);
    }

    /**
     * Create function parameters area. If parameter is data field type, create
     * a combo box filled with binding holder's computed column.
     */
    protected void handleFunctionSelectEvent() {
        if (isRef)
            return;
        Control[] children = paramsComposite.getChildren();
        for (int i = 0; i < children.length; i++) {
            children[i].dispose();
        }

        IAggrFunction function = getFunctionByDisplayName(cmbFunction.getText());
        if (function != null) {
            paramsMap.clear();
            IParameterDefn[] params = function.getParameterDefn();
            if (params.length > 0) {
                ((GridData) paramsComposite.getLayoutData()).exclude = false;
                ((GridData) paramsComposite.getLayoutData()).heightHint = SWT.DEFAULT;

                int width = 0;
                if (paramsComposite.getParent().getLayout() instanceof GridLayout) {
                    Control[] controls = paramsComposite.getParent().getChildren();
                    for (int i = 0; i < controls.length; i++) {
                        if (controls[i] instanceof Label
                                && ((GridData) controls[i].getLayoutData()).horizontalSpan == 1) {
                            int labelWidth = controls[i].getBounds().width - controls[i].getBorderWidth() * 2;
                            if (labelWidth > width)
                                width = labelWidth;
                        }
                    }
                }

                for (final IParameterDefn param : params) {
                    Label lblParam = new Label(paramsComposite, SWT.NONE);
                    lblParam.setText(param.getDisplayName() + Messages.getString("BindingDialogHelper.text.Colon")); //$NON-NLS-1$
                    GridData gd = new GridData();
                    gd.widthHint = lblParam.computeSize(SWT.DEFAULT, SWT.DEFAULT).x;
                    if (gd.widthHint < width)
                        gd.widthHint = width;
                    lblParam.setLayoutData(gd);

                    if (param.isDataField()) {
                        final Combo cmbDataField = new Combo(paramsComposite, SWT.BORDER);
                        cmbDataField
                                .setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
                        cmbDataField.setVisibleItemCount(30);
                        createExpressionButton(paramsComposite, cmbDataField);

                        initDataFields(cmbDataField, param);

                        cmbDataField.addModifyListener(new ModifyListener() {

                            public void modifyText(ModifyEvent e) {
                                modifyDialogContent();
                                ;
                                validate();
                                paramsValueMap.put(param.getName(), new String[] { cmbDataField.getText(),
                                        (String) cmbDataField.getData(ExpressionButtonUtil.EXPR_TYPE) });
                            }
                        });

                        cmbDataField.addSelectionListener(new SelectionAdapter() {

                            public void widgetSelected(SelectionEvent e) {
                                String expr = getColumnBindingExpressionByName(cmbDataField);
                                if (expr != null) {
                                    cmbDataField.setText(expr);
                                }
                                // cmbDataField.setData(
                                // ExpressionButtonUtil.EXPR_TYPE,
                                // ExpressionType.JAVASCRIPT );
                                // ExpressionButton button = (ExpressionButton)
                                // cmbDataField.getData(
                                // ExpressionButtonUtil.EXPR_BUTTON );
                                // if ( button != null )
                                // button.refresh( );
                            }
                        });

                        paramsMap.put(param.getName(), cmbDataField);
                    } else {
                        final Text txtParam = new Text(paramsComposite, SWT.BORDER | SWT.MULTI);
                        txtParam.addModifyListener(new ModifyListener() {

                            public void modifyText(ModifyEvent e) {
                                modifyDialogContent();
                                validate();
                                paramsValueMap.put(param.getName(), new String[] { txtParam.getText(),
                                        (String) txtParam.getData(ExpressionButtonUtil.EXPR_TYPE) });
                            }
                        });
                        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
                        gridData.heightHint = txtParam.computeSize(SWT.DEFAULT, SWT.DEFAULT).y
                                - txtParam.getBorderWidth() * 2;
                        gridData.horizontalIndent = 0;
                        txtParam.setLayoutData(gridData);
                        createExpressionButton(paramsComposite, txtParam);
                        paramsMap.put(param.getName(), txtParam);
                        initTextField(txtParam, param);

                    }
                }
            } else {
                ((GridData) paramsComposite.getLayoutData()).heightHint = 0;
                ((GridData) paramsComposite.getLayoutData()).exclude = true;
            }

            try {
                cmbType.setText(getDataTypeDisplayName(DataAdapterUtil.adapterToModelDataType(
                        DataUtil.getAggregationManager().getAggregation(function.getName()).getDataType())));
            } catch (BirtException e) {
                ExceptionHandler.handle(e);
            }
        } else {
            ((GridData) paramsComposite.getLayoutData()).heightHint = 0;
            ((GridData) paramsComposite.getLayoutData()).exclude = true;
            // new Label( argsComposite, SWT.NONE ).setText( "no args" );
        }
        paramsComposite.layout(true, true);
        paramsComposite.getParent().layout(true, true);
        setContentSize(composite);
    }

    protected void createExpressionButton(Composite parent, final Control control) {
        Listener listener = new Listener() {

            public void handleEvent(Event event) {
                modifyDialogContent();
                validate();
            }

        };

        if (expressionProvider == null) {
            IExtendedDataModelUIAdapter adapter = ExtendedDataModelUIAdapterHelper.getInstance().getAdapter();
            if (adapter != null && adapter.getBoundExtendedData(this.bindingHolder) != null) {
                expressionProvider = adapter.getBindingExpressionProvider(this.bindingHolder, this.binding);
            } else {
                expressionProvider = new BindingExpressionProvider(this.bindingHolder, this.binding);
            }
        }

        ExpressionButton button = ExpressionButtonUtil.createExpressionButton(parent, control, expressionProvider,
                this.bindingHolder, listener);
        if (isRef) {
            button.setEnabled(false);
        }
    }

    protected String getColumnBindingExpressionByName(Combo combo) {
        List elementsList = DEUtil.getVisiableColumnBindingsList(this.bindingHolder);
        for (Iterator iterator = elementsList.iterator(); iterator.hasNext();) {
            ComputedColumnHandle binding = (ComputedColumnHandle) iterator.next();
            if (binding.getName().equals(combo.getText()))
                return ExpressionButtonUtil.getCurrentExpressionConverter(combo)
                        .getBindingExpression(combo.getText());
        }
        return null;
    }

    public void validate() {
        verifyInput();
        updateRemoveBtnState();
    }

    public boolean differs(ComputedColumnHandle binding) {
        if (isAggregate()) {
            if (txtName != null && !strEquals(txtName.getText(), binding.getName()))
                return true;
            if (cmbName != null && !strEquals(cmbName.getText(), binding.getName()))
                return true;
            if (btnAllowExport.getSelection() != binding.allowExport())
                return true;
            if (!strEquals(binding.getDisplayName(), txtDisplayName.getText()))
                return true;
            if (!strEquals(binding.getDisplayNameID(), txtDisplayNameID.getText()))
                return true;
            if (!strEquals(binding.getDataType(), getDataType()))
                return true;
            try {
                if (!strEquals(DataAdapterUtil.adaptModelAggregationType(binding.getAggregateFunction()),
                        getFunctionByDisplayName(cmbFunction.getText()).getName()))
                    return true;
            } catch (AdapterException e) {
            }

            if (!expressionEquals(binding.getExpressionProperty(ComputedColumn.FILTER_MEMBER), txtFilter))
                return true;
            if (btnTable.getSelection() == (binding.getAggregateOn() != null))
                return true;
            if (!btnTable.getSelection() && !binding.getAggregateOn().equals(cmbGroup.getText()))
                return true;

            boolean hasArguments = false;

            for (Iterator iterator = binding.argumentsIterator(); iterator.hasNext();) {
                AggregationArgumentHandle handle = (AggregationArgumentHandle) iterator.next();
                if (paramsMap.containsKey(handle.getName())) {
                    String[] paramValue = getControlValue(paramsMap.get(handle.getName()));
                    if (!expressionEquals(handle.getExpressionProperty(AggregationArgument.VALUE_MEMBER),
                            paramValue)) {
                        return true;
                    }
                } else {
                    return true;
                }
                hasArguments = true;
            }

            if (!hasArguments && !paramsMap.isEmpty())
                return true;
        } else {
            if (txtName != null && !strEquals(txtName.getText(), binding.getName()))
                return true;
            if (cmbName != null && !strEquals(cmbName.getText(), binding.getName()))
                return true;
            if (!strEquals(txtDisplayName.getText(), binding.getDisplayName()))
                return true;
            if (!strEquals(txtDisplayNameID.getText(), binding.getDisplayNameID()))
                return true;
            if (btnAllowExport.getSelection() != binding.allowExport())
                return true;
            if (!strEquals(getDataType(), binding.getDataType()))
                return true;
            if (!expressionEquals(binding.getExpressionProperty(ComputedColumn.EXPRESSION_MEMBER), txtExpression))
                return true;
        }
        return false;
    }

    private boolean expressionEquals(ExpressionHandle expressionHandle, Text text) {
        if (expressionHandle == null) {
            if (text.getText().trim().length() == 0)
                return true;
        } else {
            if (strEquals(expressionHandle.getStringExpression(), text.getText())
                    && strEquals(expressionHandle.getType(), (String) text.getData(ExpressionButtonUtil.EXPR_TYPE)))
                return true;
        }
        return false;
    }

    private boolean expressionEquals(ExpressionHandle expressionHandle, String[] strs) {
        if (expressionHandle == null) {
            if (strs == null || strs[0].trim().length() == 0)
                return true;
        } else {
            if (strs != null && strEquals(expressionHandle.getStringExpression(), strs[0])
                    && strEquals(expressionHandle.getType(), strs[1]))
                return true;
        }
        return false;
    }

    protected String[] getControlValue(Control control) {
        if (control instanceof Text) {
            return new String[] { ((Text) control).getText(),
                    (String) control.getData(ExpressionButtonUtil.EXPR_TYPE) };
        } else if (control instanceof Combo) {
            return new String[] { ((Combo) control).getText(),
                    (String) control.getData(ExpressionButtonUtil.EXPR_TYPE) };
        }
        return null;
    }

    private boolean strEquals(String left, String right) {
        if (left == right)
            return true;
        if (left == null)
            return "".equals(right); //$NON-NLS-1$
        if (right == null)
            return "".equals(left); //$NON-NLS-1$
        return left.equals(right);
    }

    protected String getDataTypeDisplayName(String dataType) {
        for (int i = 0; i < DATA_TYPE_CHOICES.length; i++) {
            if (dataType.equals(DATA_TYPE_CHOICES[i].getName())) {
                return DATA_TYPE_CHOICES[i].getDisplayName();
            }
        }
        return ""; //$NON-NLS-1$
    }

    private String getDataType() {
        for (int i = 0; i < DATA_TYPE_CHOICES.length; i++) {
            if (DATA_TYPE_CHOICES[i].getDisplayName().equals(cmbType.getText())) {
                return DATA_TYPE_CHOICES[i].getName();
            }
        }
        return ""; //$NON-NLS-1$
    }

    public ComputedColumnHandle editBinding(ComputedColumnHandle binding) throws SemanticException {
        if (isRef)
            return getBindingColumn();
        if (isAggregate()) {
            binding.setDisplayName(txtDisplayName.getText());
            binding.setDisplayNameID(txtDisplayNameID.getText());
            for (int i = 0; i < DATA_TYPE_CHOICES.length; i++) {
                if (DATA_TYPE_CHOICES[i].getDisplayName().equals(cmbType.getText())) {
                    binding.setDataType(DATA_TYPE_CHOICES[i].getName());
                    break;
                }
            }
            binding.setAllowExport(btnAllowExport.getSelection());
            // binding.setExpression( cmbDataField.getText( ) );
            binding.setAggregateFunction(getFunctionByDisplayName(cmbFunction.getText()).getName());

            ExpressionButtonUtil.saveExpressionButtonControl(txtFilter, binding, ComputedColumn.FILTER_MEMBER);

            if (btnTable.getSelection()) {
                binding.setAggregateOn(null);
            } else {
                binding.setAggregateOn(cmbGroup.getText());
            }

            // remove expression created in old version.
            binding.setExpression(null);
            binding.clearArgumentList();

            for (Iterator iterator = paramsMap.keySet().iterator(); iterator.hasNext();) {
                String arg = (String) iterator.next();
                String[] value = getControlValue(paramsMap.get(arg));
                if (value != null) {
                    AggregationArgument argHandle = StructureFactory.createAggregationArgument();
                    argHandle.setName(arg);
                    argHandle.setExpressionProperty(AggregationArgument.VALUE_MEMBER,
                            new Expression(value[0], value[1]));
                    binding.addArgument(argHandle);
                }
            }
        } else {
            for (int i = 0; i < DATA_TYPE_CHOICES.length; i++) {
                if (DATA_TYPE_CHOICES[i].getDisplayName().equals(cmbType.getText())) {
                    binding.setDataType(DATA_TYPE_CHOICES[i].getName());
                    break;
                }
            }
            binding.setDisplayName(txtDisplayName.getText());
            binding.setDisplayNameID(txtDisplayNameID.getText());
            binding.setAllowExport(btnAllowExport.getSelection());
            ExpressionButtonUtil.saveExpressionButtonControl(txtExpression, binding,
                    ComputedColumn.EXPRESSION_MEMBER);
        }
        return binding;
    }

    public ComputedColumnHandle newBinding(ReportItemHandle bindingHolder, String name) throws SemanticException {
        if (isRef)
            return getBindingColumn();
        ComputedColumn column = StructureFactory.newComputedColumn(bindingHolder,
                name == null ? txtName.getText() : name);
        ComputedColumnHandle binding = DEUtil.addColumn(bindingHolder, column, true);
        return editBinding(binding);
    }

    public void setContainer(Object container) {
        this.container = container;
    }

    public boolean canProcessWithWarning() {

        if (!isAggregate()) {
            return true;
        }

        try {
            // check function type
            // if datatype in DTE is any, here will return '', for any is
            // deprecated.
            String type = getDataTypeDisplayName(DataAdapterUtil.adapterToModelDataType(DataUtil
                    .getAggregationManager()
                    .getAggregation(getFunctionByDisplayName(cmbFunction.getText()).getName()).getDataType()));
            if (!StringUtil.isEmpty(type) && !type.equals(cmbType.getText())) {
                if (!canProcessFunctionTypeError(cmbFunction.getText(), cmbType.getText(), type)) {
                    return false;
                }
            }
            // check expression is vaid for parameter type
            // first get expression column or binding.
            IAggrFunction function = getFunctionByDisplayName(cmbFunction.getText());
            if (function != null) {
                DataSetHandle dataSetHandle = DEUtil.getFirstDataSet(this.bindingHolder);
                List<ResultSetColumn> columnList = null;
                if (dataSetHandle != null) {
                    CachedMetaDataHandle meta = dataSetHandle.getCachedMetaDataHandle();
                    if (meta == null) {
                        DataSetUIUtil.updateColumnCache(dataSetHandle);
                        meta = dataSetHandle.getCachedMetaDataHandle();
                    }
                    columnList = meta.getResultSet().getListValue();
                }

                List<ComputedColumnHandle> bindingList = DEUtil.getAllColumnBindingList(this.bindingHolder, true);

                loop: for (IParameterDefn param : function.getParameterDefn()) {
                    if (param.isDataField()) {
                        String[] expression = getControlValue(paramsMap.get(param.getName()));
                        if (expression != null) {
                            if (bindingList != null) {
                                String bindingName = ExpressionUtil.getColumnBindingName(expression[0]);
                                if (bindingName != null)
                                    for (ComputedColumnHandle bindingHandle : bindingList) {
                                        if (bindingHandle.getName().equals(bindingName)) {
                                            if (!param.supportDataType(DataAdapterUtil
                                                    .adaptModelDataType(bindingHandle.getDataType()))) {
                                                if (!canProcessParamTypeError(expression[0],
                                                        param.getDisplayName())) {
                                                    return false;
                                                }
                                                continue loop;
                                            }
                                        }
                                    }
                            }

                            if (columnList != null) {
                                String columnName = ExpressionUtil.getColumnName(expression[0]);
                                if (columnName != null)
                                    for (ResultSetColumn column : columnList) {
                                        if (column.getColumnName().equals(columnName)) {
                                            if (!param.supportDataType(
                                                    DataAdapterUtil.adaptModelDataType(column.getDataType()))) {
                                                if (!canProcessParamTypeError(expression[0],
                                                        param.getDisplayName())) {
                                                    return false;
                                                }
                                                continue loop;
                                            }
                                        }
                                    }
                            }
                        }
                    }
                }
            }

        } catch (BirtException e) {
        }
        return true;
    }

    private boolean canProcessFunctionTypeError(String function, String type, String recommended) {
        MessageDialog dialog = new MessageDialog(UIUtil.getDefaultShell(), Messages.getString("Warning"), //$NON-NLS-1$
                null, Messages.getFormattedString("BindingDialogHelper.warning.function", //$NON-NLS-1$
                        new String[] { recommended }),
                MessageDialog.WARNING,
                new String[] { Messages.getString(Messages.getString("BindingDialogHelper.warning.button.yes")), //$NON-NLS-1$
                        Messages.getString(Messages.getString("BindingDialogHelper.warning.button.no")) //$NON-NLS-1$
                }, 0);
        return dialog.open() == 0;
    }

    private boolean canProcessParamTypeError(String expression, String parameter) {
        MessageDialog dialog = new MessageDialog(UIUtil.getDefaultShell(), Messages.getString("Warning"), //$NON-NLS-1$
                null, Messages.getFormattedString("BindingDialogHelper.warning.parameter", //$NON-NLS-1$
                        new String[] { expression, parameter }),
                MessageDialog.WARNING, new String[] { Messages.getString("BindingDialogHelper.warning.button.yes"), //$NON-NLS-1$
                        Messages.getString("BindingDialogHelper.warning.button.no") //$NON-NLS-1$
                }, 0);
        return dialog.open() == 0;
    }

    private String[] getBaseNames() {
        List<String> resources = SessionHandleAdapter.getInstance().getReportDesignHandle().getIncludeResources();
        if (resources == null)
            return null;
        else
            return resources.toArray(new String[0]);
    }

    private URL[] getAvailableResourceUrls() {
        List<URL> urls = new ArrayList<URL>();
        String[] baseNames = getBaseNames();
        if (baseNames == null)
            return urls.toArray(new URL[0]);
        else {
            for (int i = 0; i < baseNames.length; i++) {
                URL url = SessionHandleAdapter.getInstance().getReportDesignHandle().findResource(baseNames[i],
                        IResourceLocator.MESSAGE_FILE);
                if (url != null)
                    urls.add(url);
            }
            return urls.toArray(new URL[0]);
        }
    }

    private URL[] getResourceURLs() {
        String[] baseNames = getBaseNames();
        if (baseNames == null)
            return null;
        else {
            URL[] urls = new URL[baseNames.length];
            for (int i = 0; i < baseNames.length; i++) {
                urls[i] = SessionHandleAdapter.getInstance().getReportDesignHandle().findResource(baseNames[i],
                        IResourceLocator.MESSAGE_FILE);
            }
            return urls;
        }
    }

    private void updateRemoveBtnState() {
        btnRemoveDisplayNameID.setEnabled(txtDisplayNameID.getText().equals(EMPTY_STRING) ? false : true);
    }

    private boolean isEditModal = false;

    public void setEditModal(boolean isEditModal) {
        this.isEditModal = isEditModal;
    }

    public boolean isEditModal() {
        return isEditModal;
    }

    public void modifyDialogContent() {
        if (hasInitDialog && isEditModal() && hasModified == false) {
            hasModified = true;
            validate();
        }
    }

    private boolean hasModified = false;
    protected Button btnAllowExport;
}