org.eclipse.birt.report.designer.ui.dialogs.CascadingParametersDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.ui.dialogs.CascadingParametersDialog.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.ui.dialogs;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;

import org.eclipse.birt.core.data.DataTypeUtil;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.format.DateFormatter;
import org.eclipse.birt.core.format.NumberFormatter;
import org.eclipse.birt.core.format.StringFormatter;
import org.eclipse.birt.core.script.JavascriptEvalUtil;
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.SelectValueFetcher;
import org.eclipse.birt.report.designer.internal.ui.dialogs.expression.ExpressionButton;
import org.eclipse.birt.report.designer.internal.ui.dialogs.expression.ExpressionEditor;
import org.eclipse.birt.report.designer.internal.ui.dialogs.expression.IExpressionHelper;
import org.eclipse.birt.report.designer.internal.ui.expressions.ExpressionContextFactoryImpl;
import org.eclipse.birt.report.designer.internal.ui.expressions.IExpressionContextFactory;
import org.eclipse.birt.report.designer.internal.ui.util.DataUtil;
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.IHelpContextIds;
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.newelement.DesignElementFactory;
import org.eclipse.birt.report.designer.ui.views.attributes.providers.ChoiceSetFactory;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.model.api.CachedMetaDataHandle;
import org.eclipse.birt.report.model.api.CascadingParameterGroupHandle;
import org.eclipse.birt.report.model.api.CommandStack;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.Expression;
import org.eclipse.birt.report.model.api.ExpressionType;
import org.eclipse.birt.report.model.api.FormatValueHandle;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.ModuleUtil;
import org.eclipse.birt.report.model.api.PropertyHandle;
import org.eclipse.birt.report.model.api.ResultSetColumnHandle;
import org.eclipse.birt.report.model.api.ScalarParameterHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.command.ContentException;
import org.eclipse.birt.report.model.api.command.NameException;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.ReportDesignConstants;
import org.eclipse.birt.report.model.api.elements.structures.FormatValue;
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.ParameterValidationUtil;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.birt.report.model.elements.interfaces.IScalarParameterModel;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
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.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISharedImages;

import com.ibm.icu.util.ULocale;

/**
 * Cascading Parameter Dialog.
 */

public class CascadingParametersDialog extends BaseDialog {

    private Composite sorttingArea;
    private Label sortKeyLabel, sortDirectionLabel;
    private Combo sortDirectionChooser, sortKeyChooser;
    private static final String LABEL_SORT_GROUP = Messages.getString("ParameterDialog.Label.SortGroup"); //$NON-NLS-1$
    private static final String LABEL_SORT_KEY = Messages.getString("ParameterDialog.Label.SortKey"); //$NON-NLS-1$
    private static final String CHOICE_NONE = Messages.getString("ParameterDialog.Label.None"); //$NON-NLS-1$
    private static final String LABEL_SORT_DIRECTION = Messages.getString("ParameterDialog.Label.SortDirection"); //$NON-NLS-1$
    private static final String CHOICE_ASCENDING = Messages.getString("ParameterDialog.Choice.ASCENDING"); //$NON-NLS-1$
    private static final String CHOICE_DESCENDING = Messages.getString("ParameterDialog.Choice.DESCENDING"); //$NON-NLS-1$

    private static final Image ERROR_ICON = ReportPlatformUIImages.getImage(ISharedImages.IMG_OBJS_ERROR_TSK);

    private static final String CHOICE_NULL_VALUE = Messages
            .getString("CascadingParametersDialog.Choice.NullValue"); //$NON-NLS-1$

    private static final String CHOICE_BLANK_VALUE = Messages
            .getString("CascadingParametersDialog.Choice.BlankValue"); //$NON-NLS-1$

    private static final String CHOICE_SELECT_VALUE = Messages
            .getString("CascadingParametersDialog.Choice.SelectValue"); //$NON-NLS-1$

    private static final String LABEL_PARAMTER_PROMPT_TEXT = Messages
            .getString("CascadingParametersDialog.Label.parameterPromptText"); //$NON-NLS-1$

    private static final String LABEL_VALUES = Messages.getString("CascadingParametersDialog.Label.values"); //$NON-NLS-1$

    private static final String LABEL_GROUP_GENERAL = Messages
            .getString("CascadingParametersDialog.Label.group.general"); //$NON-NLS-1$

    private static final String LABEL_CASCADING_PARAMETER_NAME = Messages
            .getString("CascadingParametersDialog.Label.cascadingParam.name"); //$NON-NLS-1$

    private static final String LABEL_GROUP_PROMPT_TEXT = Messages
            .getString("CascadingParametersDialog.Label.groupPromptText"); //$NON-NLS-1$

    private static final String ERROR_MSG_MISMATCH_DATA_TYPE = Messages
            .getString("ParameterDialog.ErrorMessage.MismatchDataType"); //$NON-NLS-1$

    // private static final String LABEL_GROUP_PROMPT_TEXT = Messages.getString(
    // "CascadingParametersDialog.Label.promptText" ); //$NON-NLS-1$

    // private static final String LABEL_DATA_SETS = Messages.getString(
    // "CascadingParametersDialog.Label.dataSets" ); //$NON-NLS-1$

    // private static final String LABEL_BUTTON_CREATE_NEW_DATASET =
    // Messages.getString(
    // "CascadingParametersDialog.Label.button.createNew.dataset" );
    // //$NON-NLS-1$

    private static final String LABEL_PARAMETERS = Messages.getString("CascadingParametersDialog.Label.parameters"); //$NON-NLS-1$

    private static final String LABEL_GROUP_PROPERTIES = Messages
            .getString("CascadingParametersDialog.Label.group.properties"); //$NON-NLS-1$

    private static final String LABEL_PARAM_NAME = Messages.getString("CascadingParametersDialog.Label.param.name"); //$NON-NLS-1$

    private static final String LABEL_LIST_LIMIT = Messages.getString("CascadingParametersDialog.Label.listLimit"); //$NON-NLS-1$

    private static final String LABEL_DATA_TYPE = Messages.getString("CascadingParametersDialog.Label.dataType"); //$NON-NLS-1$

    private static final String LABEL_DISPLAY_TYPE = Messages
            .getString("CascadingParametersDialog.Label.displayType"); //$NON-NLS-1$

    private static final String LABEL_DEFAULT_VALUE = Messages
            .getString("CascadingParametersDialog.Label.defaultValue"); //$NON-NLS-1$

    private static final String LABEL_GROUP_MORE_OPTIONS = Messages
            .getString("CascadingParametersDialog.Label.group.moreOptions"); //$NON-NLS-1$

    private static final String LABEL_HELP_TEXT = Messages.getString("CascadingParametersDialog.Label.helpText"); //$NON-NLS-1$

    private static final String LABEL_FORMAT_AS = Messages.getString("CascadingParametersDialog.Label.formatAs"); //$NON-NLS-1$

    private static final String LABEL_CHANGE_FORMAT_BUTTON = Messages
            .getString("CascadingParametersDialog.Label.button.changeFormat"); //$NON-NLS-1$

    private static final String LABEL_PREVIEW_WITH_FORMAT = Messages
            .getString("CascadingParametersDialog.Label.preview"); //$NON-NLS-1$

    // private static final String LABEL_CREATE_NEW_PARAMETER =
    // Messages.getString( "CascadingParametersDialog.Label.createNewParam" );
    // //$NON-NLS-1$

    private static final String LABEL_SELECT_DATA_SET = Messages
            .getString("CascadingParametersDialog.Label.selectDataSet"); //$NON-NLS-1$

    private static final String LABEL_SELECT_DISPLAY_COLUMN = Messages
            .getString("CascadingParametersDialog.Label.selectDisplayColumn"); //$NON-NLS-1$

    private static final String LABEL_SELECT_VALUE_COLUMN = Messages
            .getString("CascadingParametersDialog.Label.selectValueColumn"); //$NON-NLS-1$

    private static final String LABEL_NO_COLUMN_AVAILABLE = Messages
            .getString("CascadingParametersDialog.Label.NoColumnAvailable"); //$NON-NLS-1$

    private static final String BUTTON_IS_REQUIRED = Messages
            .getString("CascadingParametersDialog.Button.isRequired"); //$NON-NLS-1$

    // private static final String LABEL_SELECT_DATA_SET_MODE =
    // Messages.getString( "CascadingParametersDialog.Label.SelectDataSetMode"
    // ); //$NON-NLS-1$

    private static final String RADIO_SINGLE = Messages.getString("CascadingParametersDialog.Radio.Single"); //$NON-NLS-1$

    private static final String RADIO_MULTIPLE = Messages.getString("CascadingParametersDialog.Radio.Mutli"); //$NON-NLS-1$

    private static final String COLUMN_NAME = Messages.getString("CascadingParametersDialog.Label.column.name"); //$NON-NLS-1$

    private static final String COLUMN_DATA_SET = Messages
            .getString("CascadingParametersDialog.Label.column.dataSet"); //$NON-NLS-1$

    private static final String COLUMN_VALUE = Messages.getString("CascadingParametersDialog.Label.column.value"); //$NON-NLS-1$

    private static final String COLUMN_DISPLAY_TEXT = Messages
            .getString("CascadingParametersDialog.Label.column.displayText"); //$NON-NLS-1$

    private static final String PARAM_CONTROL_LIST = DesignChoiceConstants.PARAM_CONTROL_LIST_BOX + "/List"; //$NON-NLS-1$

    private static final String PARAM_CONTROL_COMBO = DesignChoiceConstants.PARAM_CONTROL_LIST_BOX + "/Combo"; //$NON-NLS-1$

    private static final String DISPLAY_NAME_CONTROL_LIST = Messages
            .getString("CascadingParametersDialog.display.controlType.listBox"); //$NON-NLS-1$

    private static final String DISPLAY_NAME_CONTROL_COMBO = Messages
            .getString("CascadingParametersDialog.display.controlType.comboBox"); //$NON-NLS-1$

    private static final double DEFAULT_PREVIEW_NUMBER = Double.parseDouble("1234.56"); //$NON-NLS-1$

    private static final int DEFAULT_PREVIEW_INTEGER_NUMBER = 123456;

    private static final String STANDARD_DATE_TIME_PATTERN = "MM/dd/yyyy hh:mm:ss a"; //$NON-NLS-1$

    private static final String DEFAULT_PREVIEW_STRING = Messages
            .getString("CascadingParametersDialog.default.preview.string"); //$NON-NLS-1$

    private static final String ERROR_TITLE_INVALID_LIST_LIMIT = Messages
            .getString("ParameterDialog.ErrorTitle.InvalidListLimit"); //$NON-NLS-1$

    private static final String ERROR_MSG_INVALID_LIST_LIMIT = Messages
            .getString("ParameterDialog.ErrorMessage.InvalidListLimit"); //$NON-NLS-1$

    private Group optionsGroup;
    private Group propertiesGroup;

    private Text cascadingNameEditor;
    private Text promptTextEditor;
    private Text paramNameEditor;
    private Text helpTextEditor;
    // private Text defaultValueEditor;
    private Combo defaultValueChooser;
    private Text formatField;

    private Text listLimit;
    private Text promptText;

    private Combo dataTypeChooser;
    private Combo displayTypeChooser;

    private Button changeFormat;

    private Button singleDataSet, multiDataSet;

    private CLabel previewLable;

    private Table table;
    private TableViewer valueTable;
    private Button addBtn, editBtn, delBtn;

    private List<Expression> defaultValueList;

    private static final IChoiceSet DATA_TYPE_CHOICE_SET = DEUtil.getMetaDataDictionary()
            .getElement(ReportDesignConstants.SCALAR_PARAMETER_ELEMENT)
            .getProperty(ScalarParameterHandle.DATA_TYPE_PROP).getAllowedChoices();

    private CascadingParameterGroupHandle inputParameterGroup;

    private ScalarParameterHandle selectedParameter;

    // private String lastDataType;

    private String formatPattern;

    private String formatCategroy;

    private ULocale formatLocale;

    private Button isRequired;

    private int maxStrLengthProperty;

    private int maxStrLengthOption;

    private String PROPERTY_LABEL_STRING[] = { LABEL_PARAM_NAME, LABEL_GROUP_PROMPT_TEXT,
            LABEL_PARAMTER_PROMPT_TEXT, LABEL_DATA_TYPE, LABEL_DISPLAY_TYPE, LABEL_DEFAULT_VALUE };

    CLabel errorMessageLine;

    private String OPTION_LABEL_STRING[] = { LABEL_HELP_TEXT, LABEL_FORMAT_AS, LABEL_LIST_LIMIT };
    private Button isMultiple;

    protected IStructuredContentProvider tableContentProvider = new IStructuredContentProvider() {

        public void dispose() {
        }

        public Object[] getElements(Object inputElement) {
            if (inputElement == null) {
                return new Object[0];
            } else if (inputElement instanceof List) {
                return ((List) inputElement).toArray();
            }
            return null;
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }
    };

    protected ITableLabelProvider tableLableProvier = new ITableLabelProvider() {

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            if (columnIndex == 0) {
                if (element instanceof Expression) {
                    return ((Expression) element).getStringExpression();
                }
                return element.toString();
            }
            return ""; //$NON-NLS-1$
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }
    };

    protected int getMaxStrLength(String string[], Control control) {
        int len = UIUtil.getMaxStringWidth(string, control);
        return len;
    }

    /**
     * 
     * Constructor.
     * 
     * @param parentShell
     * @param title
     */
    public CascadingParametersDialog(Shell parentShell, String title) {
        super(parentShell, title);
    }

    /**
     * Constructor.
     * 
     * @param title
     */
    public CascadingParametersDialog(String title) {
        super(title);
    }

    protected Control createDialogArea(Composite parent) {
        // Composite composite = (Composite) super.createDialogArea( parent );

        ScrolledComposite sc = new ScrolledComposite((Composite) super.createDialogArea(parent),
                SWT.H_SCROLL | SWT.V_SCROLL);
        sc.setLayout(new FillLayout());
        sc.setLayoutData(new GridData(GridData.FILL_BOTH));
        applyDialogFont(sc);

        mainContent = new Composite(sc, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
        mainContent.setLayout(layout);

        UIUtil.bindHelp(parent, IHelpContextIds.CASCADING_PARAMETER_DIALOG_ID);

        GridData data = new GridData(GridData.FILL_BOTH);

        maxStrLengthProperty = getMaxStrLength(PROPERTY_LABEL_STRING, mainContent);

        maxStrLengthOption = getMaxStrLength(OPTION_LABEL_STRING, mainContent);

        mainContent.setLayoutData(data);

        createGeneralPart(mainContent);

        createChoicePart(mainContent);

        createDynamicParamsPart(mainContent);

        createPropertiesPart(mainContent);

        createSortingArea(mainContent);

        createOptionsPart(mainContent);

        createLabel(mainContent, null);
        errorMessageLine = new CLabel(mainContent, SWT.NONE);
        GridData msgLineGridData = new GridData(GridData.FILL_HORIZONTAL);
        msgLineGridData.horizontalSpan = 2;
        errorMessageLine.setLayoutData(msgLineGridData);

        sc.setContent(mainContent);
        sc.setExpandHorizontal(true);
        // sc.setExpandVertical( true );
        sc.setMinWidth(500);
        // sc.setMinHeight( 570 );

        Point size = mainContent.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        mainContent.setSize(size);

        return sc;
    }

    private String validateDefaultValue() {
        if (selectedParameter == null) {
            return null;
        }
        String tempDefaultValue = defaultValueChooser.getText();

        String tempType = DATA_TYPE_CHOICE_SET.findChoiceByDisplayName(dataTypeChooser.getText()).getName();

        if (DesignChoiceConstants.PARAM_TYPE_STRING.endsWith(tempType)
                || DesignChoiceConstants.PARAM_TYPE_BOOLEAN.endsWith(tempType)) {
            return null;
        }

        if (tempDefaultValue.length() > 0) {
            try {

                if (!((DesignChoiceConstants.PARAM_TYPE_STRING.endsWith(getSelectedDataType()))
                        || (DesignChoiceConstants.PARAM_TYPE_BOOLEAN.endsWith(getSelectedDataType())))) {
                    if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(getSelectedDataType())) {
                        tempDefaultValue = convertToStandardFormat(DataTypeUtil.toDate(tempDefaultValue));
                    } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(getSelectedDataType())) {
                        tempDefaultValue = convertToStandardFormat(DataTypeUtil.toSqlDate(tempDefaultValue));
                    } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(getSelectedDataType())) {
                        tempDefaultValue = convertToStandardFormat(DataTypeUtil.toSqlTime(tempDefaultValue));
                    }

                    ParameterValidationUtil.validate(getSelectedDataType(), STANDARD_DATE_TIME_PATTERN,
                            tempDefaultValue, ULocale.getDefault());

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

        return null;
    }

    private String convertToStandardFormat(Date date) {
        if (date == null) {
            return null;
        }
        return new DateFormatter(STANDARD_DATE_TIME_PATTERN, ULocale.getDefault()).format(date);
    }

    private void updateMessageLine() {
        String errorMessage = validateDefaultValue();

        if (errorMessage != null) {
            errorMessageLine.setText(errorMessage);
            errorMessageLine.setImage(ERROR_ICON);
        } else {
            errorMessageLine.setText(""); //$NON-NLS-1$
            errorMessageLine.setImage(null);
        }
        updateButtons();
    }

    private void createLabel(Composite parent, String content) {
        Label label = new Label(parent, SWT.NONE);
        if (content != null) {
            label.setText(content);
        }
        GridData gd = new GridData();
        if (label.getText().equals(LABEL_VALUES)) {
            gd.verticalAlignment = GridData.BEGINNING;
        }
        label.setLayoutData(gd);
    }

    private void createGeneralPart(Composite parent) {
        Group group = new Group(parent, SWT.NULL);
        group.setText(LABEL_GROUP_GENERAL);
        group.setLayout(new GridLayout(2, false));
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(group, SWT.NULL).setText(LABEL_CASCADING_PARAMETER_NAME);

        cascadingNameEditor = new Text(group, SWT.BORDER);
        cascadingNameEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        new Label(group, SWT.NULL).setText(LABEL_GROUP_PROMPT_TEXT);
        promptTextEditor = new Text(group, SWT.BORDER);
        promptTextEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

    }

    private void updateDataSets() {
        ArrayList elementsList = new ArrayList(inputParameterGroup.getParameters().getContents());
        if (elementsList == null || elementsList.size() == 0) {
            return;
        }

        DataSetHandle dataSet = inputParameterGroup.getDataSet();
        for (Iterator iter = elementsList.iterator(); iter.hasNext();) {
            ScalarParameterHandle handle = (ScalarParameterHandle) iter.next();
            try {
                handle.setDataSet(dataSet);
            } catch (SemanticException e1) {

            }
        }
    }

    private void createChoicePart(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        composite.setLayout(new GridLayout(2, true));

        // new Label( composite, SWT.NONE ).setText( LABEL_SELECT_DATA_SET_MODE
        // );

        singleDataSet = new Button(composite, SWT.RADIO);
        singleDataSet.setText(RADIO_SINGLE);
        singleDataSet.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {

                updateDataSets();
                refreshValueTable();
                updateButtons();
            }
        });

        multiDataSet = new Button(composite, SWT.RADIO);
        multiDataSet.setText(RADIO_MULTIPLE);
        multiDataSet.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                refreshValueTable();
                updateButtons();
            }
        });

    }

    private void createDynamicParamsPart(Composite parent) {
        Composite comp = new Composite(parent, SWT.NULL);
        GridLayout layout = UIUtil.createGridLayoutWithoutMargin();
        layout.numColumns = 2;
        comp.setLayout(layout);
        comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label label = new Label(comp, SWT.NULL);
        label.setText(LABEL_PARAMETERS);

        // creat dummy label
        new Label(comp, SWT.NULL);

        table = new Table(comp, SWT.FULL_SELECTION | SWT.BORDER);

        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.heightHint = 100;
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.addKeyListener(new KeyAdapter() {

            public void keyReleased(KeyEvent e) {
                // If Delete pressed, delete the selected row
                if (e.keyCode == SWT.DEL) {
                    deleteRow();
                }
            }
        });

        int[] columnWidths = new int[] { 120, 100, 120, 135, };
        String[] columns = new String[] { COLUMN_NAME, COLUMN_DATA_SET, COLUMN_VALUE, COLUMN_DISPLAY_TEXT };

        for (int i = 0; i < columns.length; i++) {
            TableColumn column = new TableColumn(table, SWT.LEFT);
            column.setResizable(true);
            column.setText(columns[i]);
            column.setWidth(columnWidths[i]);
        }
        table.setLayoutData(data);
        table.addFocusListener(new FocusListener() {

            public void focusGained(FocusEvent e) {
                int index = table.getSelectionIndex();
                boolean setBtnEnable = true;
                if (index == -1) {
                    setBtnEnable = false;
                }

                editBtn.setEnabled(setBtnEnable);
                delBtn.setEnabled(setBtnEnable);

            }

            public void focusLost(FocusEvent e) {
                int index = table.getSelectionIndex();
                boolean setBtnEnable = true;
                if (index == -1) {
                    setBtnEnable = false;
                }

                editBtn.setEnabled(setBtnEnable);
                delBtn.setEnabled(setBtnEnable);
            }

        });

        valueTable = new TableViewer(table);

        valueTable.setColumnProperties(columns);
        valueTable.setContentProvider(contentProvider);
        valueTable.setLabelProvider(labelProvider);

        valueTable.addSelectionChangedListener(new ISelectionChangedListener() {

            public void selectionChanged(SelectionChangedEvent event) {
                ISelection selection = event.getSelection();
                Object param = ((StructuredSelection) selection).getFirstElement();
                if (param != selectedParameter) {
                    if (param instanceof ScalarParameterHandle) {
                        try {
                            saveParameterProperties();
                            saveSortingProperties();
                            selectedParameter = (ScalarParameterHandle) param;
                            defaultValueList = selectedParameter.getDefaultValueList();
                        } catch (SemanticException e) {
                            ExceptionHandler.handle(e);
                            valueTable.setSelection(new StructuredSelection(selectedParameter));
                        }
                        refreshParameterProperties();
                        initSorttingArea();
                        updateButtons();
                    }
                }
            }
        });

        valueTable.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                editParameter(selectedParameter);

            }

        });

        // create Add, edit, and delete buttons.
        Composite composite = new Composite(comp, SWT.NULL);
        composite.setLayout(new GridLayout());
        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));

        addBtn = new Button(composite, SWT.NONE);
        addBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        addBtn.setText(Messages.getString("CascadingParametersDialog.Button.Add")); //$NON-NLS-1$
        addBtn.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                AddEditCascadingParameterDialog dialog = new AddEditCascadingParameterDialog(
                        Messages.getString("CascadingParametersDialog.Title.AddCascadingParameter")); //$NON-NLS-1$
                if (dialog.open() != Dialog.OK) {
                    return;
                }
                try {
                    inputParameterGroup.getParameters().add(dialog.getParameter());
                    for (int i = 0; i < inputParameterGroup.getParameters().getCount() - 1; i++) {
                        ScalarParameterHandle parameter = (ScalarParameterHandle) inputParameterGroup
                                .getParameters().get(i);
                        parameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_SIMPLE);
                        List valueLisit = parameter.getDefaultValueList();
                        if (valueLisit != null && valueLisit.size() > 0) {
                            Object expression = valueLisit.get(0);
                            valueLisit.clear();
                            valueLisit.add(expression);
                        }
                        parameter.setDefaultValueList(valueLisit);
                    }
                } catch (ContentException e1) {
                    ExceptionHandler.handle(e1);
                } catch (NameException e1) {
                    ExceptionHandler.handle(e1);
                } catch (SemanticException e1) {
                    ExceptionHandler.handle(e1);
                }

                refreshValueTable();
                valueTable.setSelection(new StructuredSelection(dialog.getParameter()));
                updateButtons();
            }
        });

        editBtn = new Button(composite, SWT.NONE);
        editBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        editBtn.setText(Messages.getString("CascadingParametersDialog.Button.Edit")); //$NON-NLS-1$
        editBtn.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                editParameter(selectedParameter);
            }
        });

        delBtn = new Button(composite, SWT.NONE);
        delBtn.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        delBtn.setText(Messages.getString("CascadingParametersDialog.Button.Delete")); //$NON-NLS-1$
        delBtn.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                deleteRow();
                updateButtons();
            }
        });

    }

    protected void editParameter(ScalarParameterHandle param) {
        if (param == null) {
            return;
        }

        CommandStack cmdStack = SessionHandleAdapter.getInstance().getReportDesignHandle().getCommandStack();
        cmdStack.startTrans(Messages.getString("CascadingParametersDialog.Title.EditCascadingParameter")); //$NON-NLS-1$

        AddEditCascadingParameterDialog dialog = new AddEditCascadingParameterDialog(
                Messages.getString("CascadingParametersDialog.Title.EditCascadingParameter")); //$NON-NLS-1$
        dialog.setParameter(param);
        if (dialog.open() != Dialog.OK) {
            cmdStack.rollback();
            return;
        }
        cmdStack.commit();

        refreshValueTable();
        refreshParameterProperties();
        initSorttingArea();
        updateButtons();
    }

    private void createPropertiesPart(Composite parent) {
        propertiesGroup = new Group(parent, SWT.NULL);
        propertiesGroup.setText(LABEL_GROUP_PROPERTIES);
        propertiesGroup.setLayout(new GridLayout(2, false));
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        propertiesGroup.setLayoutData(gd);

        createLabel(propertiesGroup, LABEL_PARAM_NAME, maxStrLengthProperty);

        paramNameEditor = new Text(propertiesGroup, SWT.BORDER | SWT.READ_ONLY);
        paramNameEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        paramNameEditor.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                valueTable.refresh(selectedParameter);
            }

        });

        createLabel(propertiesGroup, LABEL_PARAMTER_PROMPT_TEXT, maxStrLengthProperty);

        promptText = new Text(propertiesGroup, SWT.BORDER);
        promptText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        createLabel(propertiesGroup, LABEL_DATA_TYPE, maxStrLengthProperty);
        dataTypeChooser = new Combo(propertiesGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
        dataTypeChooser.setVisibleItemCount(30);
        dataTypeChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        dataTypeChooser.setItems(ChoiceSetFactory.getDisplayNamefromChoiceSet(DATA_TYPE_CHOICE_SET));
        dataTypeChooser.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (selectedParameter != null) {
                    changeDataType(
                            DATA_TYPE_CHOICE_SET.findChoiceByDisplayName(dataTypeChooser.getText()).getName());
                    try {
                        selectedParameter.setDataType(
                                DATA_TYPE_CHOICE_SET.findChoiceByDisplayName(dataTypeChooser.getText()).getName());
                    } catch (SemanticException e1) {
                        ExceptionHandler.handle(e1);
                    }
                }
                updateMessageLine();
            }
        });

        createLabel(propertiesGroup, LABEL_DISPLAY_TYPE, maxStrLengthProperty);
        displayTypeChooser = new Combo(propertiesGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
        displayTypeChooser.setVisibleItemCount(30);
        displayTypeChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        displayTypeChooser.setItems(new String[] { DISPLAY_NAME_CONTROL_LIST, DISPLAY_NAME_CONTROL_COMBO });
        displayTypeChooser.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (selectedParameter != null) {
                    try {
                        String newControlType = getSelectedDisplayType();
                        if (PARAM_CONTROL_COMBO.equals(newControlType)) {
                            newControlType = DesignChoiceConstants.PARAM_CONTROL_LIST_BOX;
                            // selectedParameter.setMustMatch( true );
                            selectedParameter.setMustMatch(false);
                            isMultiple.setEnabled(false);
                            isMultiple.setSelection(false);
                            selectedParameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_SIMPLE);
                            simpleDefaultValueList();
                        } else if (PARAM_CONTROL_LIST.equals(newControlType)) {
                            newControlType = DesignChoiceConstants.PARAM_CONTROL_LIST_BOX;
                            // selectedParameter.setMustMatch( false );
                            selectedParameter.setMustMatch(true);
                            if (selectedParameter == inputParameterGroup.getParameters()
                                    .get(inputParameterGroup.getParameters().getCount() - 1)) {
                                isMultiple.setEnabled(true);
                                if (isMultiple.getSelection())
                                    selectedParameter
                                            .setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_MULTI_VALUE);
                                else {
                                    selectedParameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_SIMPLE);
                                    simpleDefaultValueList();
                                }
                            } else {
                                isMultiple.setEnabled(false);
                                isMultiple.setSelection(false);
                                selectedParameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_SIMPLE);
                                simpleDefaultValueList();
                            }
                        } else {
                            selectedParameter.setProperty(ScalarParameterHandle.MUCH_MATCH_PROP, null);
                        }
                        selectedParameter.setControlType(newControlType);
                        initDefaultValueViewer();
                    } catch (SemanticException e1) {
                        ExceptionHandler.handle(e1);
                    }
                }
            }
        });

        createLabel(propertiesGroup, LABEL_DEFAULT_VALUE, maxStrLengthProperty);

        Composite composite = new Composite(propertiesGroup, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        GridLayout layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;
        layout.numColumns = 3;
        composite.setLayout(layout);

        defaultValueChooser = new Combo(composite, SWT.BORDER);
        defaultValueChooser.setVisibleItemCount(30);
        defaultValueChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        defaultValueChooser.add(CHOICE_SELECT_VALUE);
        defaultValueChooser.addVerifyListener(new VerifyListener() {

            public void verifyText(VerifyEvent e) {
                // TODO Auto-generated method stub
                String selection = e.text;
                if (defaultValueChooser.indexOf(selection) == -1) {
                    e.doit = true;
                    return;
                }
                if (selection.equals(CHOICE_SELECT_VALUE)) {
                    e.doit = false;
                } else {
                    e.doit = true;
                }

            }
        });
        defaultValueChooser.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (defaultValueChooser.getSelectionIndex() == -1)
                    return;
                String selection = defaultValueChooser.getItem(defaultValueChooser.getSelectionIndex());
                if (selection.equals(CHOICE_SELECT_VALUE)) {
                    // defaultValueChooser.setText( "" ); //$NON-NLS-1$

                    List columnValueList = getColumnValueList();
                    if (columnValueList.isEmpty())
                        return;
                    SelectParameterDefaultValueDialog dialog = new SelectParameterDefaultValueDialog(
                            Display.getCurrent().getActiveShell(),
                            Messages.getString("SelectParameterDefaultValueDialog.Title")); //$NON-NLS-1$
                    dialog.setColumnValueList(columnValueList, getSelectedDataType());
                    int status = dialog.open();
                    if (status == Window.OK) {
                        String[] selectedValues = dialog.getSelectedValue();
                        if (selectedValues != null) {
                            for (int i = 0; i < selectedValues.length; i++) {
                                String selectedValue = selectedValues[i];
                                if (ExpressionType.JAVASCRIPT
                                        .equals(defaultValueChooser.getData(ExpressionButtonUtil.EXPR_TYPE)))
                                    selectedValue = getSelectedExprValue(selectedValue);
                                defaultValueChooser.setText(DEUtil.resolveNull(selectedValue));
                                addDynamicDefaultValue();
                            }
                        }
                    } else if (status == Window.CANCEL) {
                        // defaultValueChooser.setText( "" ); //$NON-NLS-1$
                    }
                }

            }
        });

        defaultValueChooser.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                if (!(isMultiple.isEnabled() && isMultiple.getSelection())) {
                    String value = defaultValueChooser.getText();
                    String type = (String) defaultValueChooser.getData(ExpressionButtonUtil.EXPR_TYPE);
                    if (defaultValueList != null)
                        defaultValueList.clear();
                    String modelValue = UIUtil.convertToModelString(value, false);
                    if (modelValue != null) {
                        setFirstDefaultValue(modelValue, type);
                    }
                } else {
                    updateDynamicTableButtons();
                }
                updateMessageLine();
            }

        });

        IExpressionHelper helper = new IExpressionHelper() {

            public String getExpression() {
                if (defaultValueChooser != null)
                    return defaultValueChooser.getText();
                else
                    return ""; //$NON-NLS-1$
            }

            public void setExpression(String expression) {
                if (defaultValueChooser != null)
                    defaultValueChooser.setText(expression);
            }

            public void notifyExpressionChangeEvent(String oldExpression, String newExpression) {
                if (defaultValueChooser != null)
                    defaultValueChooser.setFocus();
                if (newExpression != null && newExpression.trim().length() > 0
                        && !newExpression.equals(oldExpression)) {
                    addDynamicDefaultValue();
                    updateDynamicTableButtons();
                }
            }

            public IExpressionProvider getExpressionProvider() {
                return new ExpressionProvider(selectedParameter);
            }

            public String getExpressionType() {
                return (String) defaultValueChooser.getData(ExpressionButtonUtil.EXPR_TYPE);
            }

            public void setExpressionType(String exprType) {
                defaultValueChooser.setData(ExpressionButtonUtil.EXPR_TYPE, exprType);
                defaultValueChooser.notifyListeners(SWT.Modify, new Event());
            }

            public Object getContextObject() {
                return selectedParameter;
            }

            public IExpressionContextFactory getExpressionContextFactory() {
                return new ExpressionContextFactoryImpl(selectedParameter, getExpressionProvider());
            }

        };
        expressionButton = UIUtil.createExpressionButton(composite, SWT.PUSH);
        expressionButton.setExpressionHelper(helper);
        defaultValueChooser.setData(ExpressionButtonUtil.EXPR_BUTTON, expressionButton);
        defaultValueChooser.setData(ExpressionButtonUtil.EXPR_TYPE, ExpressionType.CONSTANT);
        expressionButton.refresh();

        addValueButton = new Button(composite, SWT.PUSH);
        addValueButton.setText(Messages.getString("CascadingParametersDialog.DefalutValue.Add")); //$NON-NLS-1$
        gd = new GridData();
        gd.horizontalAlignment = SWT.FILL;
        addValueButton.setLayoutData(gd);
        addValueButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                addDynamicDefaultValue();
                updateDynamicTableButtons();
            }

        });

        createMulitipleValueListComposite(composite);

        initDefaultValueViewer();
    }

    private void createMulitipleValueListComposite(Composite parent) {
        int tableStyle = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
        Table table = new Table(parent, tableStyle);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.horizontalSpan = 2;
        data.heightHint = 100;
        table.setLayoutData(data);
        table.setHeaderVisible(false);
        table.setLinesVisible(true);
        TableColumn column;
        int i;
        String[] columNames = new String[] { Messages.getString("FilterConditionBuilder.list.item1"), //$NON-NLS-1$
        };
        int[] columLength = new int[] { 288 };
        for (i = 0; i < columNames.length; i++) {
            column = new TableColumn(table, SWT.NONE, i);
            column.setText(columNames[i]);
            column.setWidth(columLength[i]);
        }
        table.addSelectionListener(new SelectionAdapter() {

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

        table.addKeyListener(new KeyListener() {

            public void keyPressed(KeyEvent e) {
                if (e.keyCode == SWT.DEL) {
                    delTableValue();
                }

            }

            public void keyReleased(KeyEvent e) {
            }

        });
        table.addMouseListener(new MouseAdapter() {

            public void mouseDoubleClick(MouseEvent e) {
                editTableValue();
            }
        });

        defaultValueViewer = new TableViewer(table);
        defaultValueViewer.setUseHashlookup(true);
        defaultValueViewer.setColumnProperties(columNames);
        defaultValueViewer.setLabelProvider(tableLableProvier);
        defaultValueViewer.setContentProvider(tableContentProvider);

        rightButtonsPart = new Composite(parent, SWT.NONE);
        data = new GridData(GridData.FILL_VERTICAL);
        rightButtonsPart.setLayoutData(data);
        GridLayout layout = new GridLayout();
        layout.marginWidth = layout.marginHeight = 0;
        rightButtonsPart.setLayout(layout);

        editValueBtn = new Button(rightButtonsPart, SWT.PUSH);
        editValueBtn.setText(Messages.getString("FilterConditionBuilder.button.edit")); //$NON-NLS-1$
        editValueBtn.setToolTipText(Messages.getString("FilterConditionBuilder.button.edit.tooltip")); //$NON-NLS-1$
        setButtonLayoutData(editValueBtn);
        editValueBtn.addSelectionListener(new SelectionAdapter() {

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

        });

        delValueBtn = new Button(rightButtonsPart, SWT.PUSH);
        delValueBtn.setText(Messages.getString("FilterConditionBuilder.button.delete")); //$NON-NLS-1$
        delValueBtn.setToolTipText(Messages.getString("FilterConditionBuilder.button.delete.tooltip")); //$NON-NLS-1$
        setButtonLayoutData(delValueBtn);
        delValueBtn.addSelectionListener(new SelectionAdapter() {

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

        });

        delAllValuesBtn = new Button(rightButtonsPart, SWT.PUSH);
        delAllValuesBtn.setText(Messages.getString("FilterConditionBuilder.button.deleteall")); //$NON-NLS-1$
        delAllValuesBtn.setToolTipText(Messages.getString("FilterConditionBuilder.button.deleteall.tooltip")); //$NON-NLS-1$
        setButtonLayoutData(delAllValuesBtn);
        delAllValuesBtn.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                int count = defaultValueList.size();
                if (count > 0) {
                    defaultValueList.clear();
                    defaultValueViewer.refresh();
                    updateDynamicTableButtons();
                } else {
                    delAllValuesBtn.setEnabled(false);
                }
            }

        });
    }

    protected void delTableValue() {
        int index = defaultValueViewer.getTable().getSelectionIndex();
        if (index > -1) {
            defaultValueList.remove(index);
            defaultValueViewer.refresh();
            if (defaultValueList.size() > 0) {
                if (defaultValueList.size() <= index) {
                    index = index - 1;
                }
                defaultValueViewer.getTable().select(index);
            }
            updateDynamicTableButtons();
        } else {
            delValueBtn.setEnabled(false);
        }
    }

    protected void editTableValue() {

        IStructuredSelection selection = (IStructuredSelection) defaultValueViewer.getSelection();
        if (selection.getFirstElement() != null && selection.getFirstElement() instanceof Expression) {
            Expression expression = (Expression) selection.getFirstElement();

            ExpressionProvider provider = new ExpressionProvider(selectedParameter);

            ExpressionEditor editor = new ExpressionEditor(
                    Messages.getString("CascadingParametersDialog.ExpressionEditor.Title")); //$NON-NLS-1$
            editor.setInput(selectedParameter, provider, true);
            editor.setExpression(expression);
            if (editor.open() == OK) {
                Expression value = editor.getExpression();
                if (DEUtil.resolveNull(value.getStringExpression()).length() == 0) {
                    MessageDialog.openInformation(getShell(),
                            Messages.getString("MapRuleBuilderDialog.MsgDlg.Title"), //$NON-NLS-1$ 
                            Messages.getString("MapRuleBuilderDialog.MsgDlg.Msg")); //$NON-NLS-1$ 
                    return;
                }
                int index = defaultValueViewer.getTable().getSelectionIndex();
                defaultValueList.remove(index);
                defaultValueList.add(index, value);
                defaultValueViewer.refresh();
                defaultValueViewer.getTable().select(index);
            }
            updateDynamicTableButtons();
        } else {
            editValueBtn.setEnabled(false);
        }

    }

    private void initDefaultValueViewer() {
        if (defaultValueViewer != null) {
            if (isMultiple != null && isMultiple.isEnabled()) {
                WidgetUtil.setExcludeGridData(defaultValueViewer.getTable(), !isMultiple.getSelection());
                WidgetUtil.setExcludeGridData(rightButtonsPart, !isMultiple.getSelection());
                WidgetUtil.setExcludeGridData(addValueButton, !isMultiple.getSelection());
                if (isMultiple.getSelection()) {
                    defaultValueViewer.setInput(defaultValueList);
                    updateDynamicTableButtons();
                }
            } else {
                WidgetUtil.setExcludeGridData(defaultValueViewer.getTable(), true);
                WidgetUtil.setExcludeGridData(rightButtonsPart, true);
                WidgetUtil.setExcludeGridData(addValueButton, true);
            }

            addValueButton.getParent().layout();
            defaultValueViewer.getTable().getParent().layout();

            Point size = mainContent.computeSize(SWT.DEFAULT, SWT.DEFAULT);
            mainContent.setSize(size);

            mainContent.getParent().layout();

            int y = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT).y;
            int screecY = Display.getDefault().getClientArea().height;
            if (y < screecY) {
                if (isMultiple != null && isMultiple.isEnabled() && isMultiple.getSelection()) {
                    getShell().pack();

                    int realY = getShell().toDisplay(getShell().getBounds().width, getShell().getBounds().height).y;
                    if (realY > screecY) {
                        getShell().setLocation(getShell().getLocation().x,
                                getShell().getLocation().y + screecY - realY);
                    }
                }
            }

        }
    }

    private List getColumnList() {
        List columnList = new ArrayList();
        DataSetHandle dataSetHandle = getDataSet(selectedParameter);
        try {
            columnList = DataUtil.getColumnList(dataSetHandle);
        } catch (SemanticException e) {
            ExceptionHandler.handle(e);
        }
        return (columnList.isEmpty()) ? Collections.EMPTY_LIST : columnList;
    }

    private List getColumnValueList() {
        ArrayList valueList = new ArrayList();

        DataSetHandle dataSet = getDataSet(selectedParameter);

        try {
            String queryExpr = selectedParameter.getValueExpr();

            valueList.addAll(SelectValueFetcher.getSelectValueList(queryExpr, dataSet));

        } catch (Exception e) {
            ExceptionHandler.handle(e);
            return Collections.EMPTY_LIST;
        }
        java.util.Collections.sort(valueList);
        return valueList;
    }

    private void createOptionsPart(Composite parent) {
        optionsGroup = new Group(parent, SWT.NULL);
        optionsGroup.setText(LABEL_GROUP_MORE_OPTIONS);
        optionsGroup.setLayout(new GridLayout(2, false));
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        optionsGroup.setLayoutData(gd);

        createLabel(optionsGroup, LABEL_HELP_TEXT, maxStrLengthOption);

        helpTextEditor = new Text(optionsGroup, SWT.BORDER);
        helpTextEditor.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Label lable = new Label(optionsGroup, SWT.NULL);
        lable.setText(LABEL_FORMAT_AS);
        lable.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));

        Composite formatArea = new Composite(optionsGroup, SWT.NONE);
        formatArea.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false));
        formatArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        formatField = new Text(formatArea, SWT.BORDER | SWT.SINGLE | SWT.READ_ONLY);
        formatField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        changeFormat = new Button(formatArea, SWT.PUSH);
        changeFormat.setText(LABEL_CHANGE_FORMAT_BUTTON);
        setButtonLayoutData(changeFormat);
        changeFormat.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                popupFormatBuilder(true);
            }

        });

        Group preview = new Group(formatArea, SWT.NULL);
        preview.setText(LABEL_PREVIEW_WITH_FORMAT);
        preview.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        preview.setLayout(new GridLayout());
        previewLable = new CLabel(preview, SWT.CENTER | SWT.HORIZONTAL | SWT.VIRTUAL);
        previewLable.setText(""); //$NON-NLS-1$
        previewLable.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        createLabel(optionsGroup, LABEL_LIST_LIMIT, maxStrLengthOption);

        Composite composite = new Composite(optionsGroup, SWT.NULL);
        composite.setLayout(UIUtil.createGridLayoutWithoutMargin(3, false));
        composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Composite limitArea = new Composite(composite, SWT.NULL);
        limitArea.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false));
        limitArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        listLimit = new Text(limitArea, SWT.BORDER);
        GridData gridData = new GridData();
        gridData.widthHint = 80;
        listLimit.setLayoutData(gridData);

        listLimit.addVerifyListener(new VerifyListener() {

            public void verifyText(VerifyEvent e) {
                e.doit = ("0123456789\0\b\u007f".indexOf(e.character) != -1); //$NON-NLS-1$
            }
        });
        listLimit.addModifyListener(new ModifyListener() {

            private String oldValue = ""; //$NON-NLS-1$

            public void modifyText(ModifyEvent e) {
                try {
                    if (!StringUtil.isBlank(listLimit.getText())) {
                        Integer.parseInt(listLimit.getText());
                        oldValue = listLimit.getText();
                    }
                } catch (NumberFormatException e1) {
                    ExceptionHandler.openErrorMessageBox(ERROR_TITLE_INVALID_LIST_LIMIT, MessageFormat.format(
                            ERROR_MSG_INVALID_LIST_LIMIT, new Object[] { Integer.toString(Integer.MAX_VALUE) }));
                    listLimit.setText(oldValue);
                }
            }
        });
        new Label(limitArea, SWT.NONE).setText(LABEL_VALUES);

        isRequired = new Button(composite, SWT.CHECK);
        isRequired.setText(BUTTON_IS_REQUIRED);
        isRequired.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        isRequired.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                isRequiredChange(isRequired.getSelection());
                if (selectedParameter != null) {
                    try {
                        selectedParameter.setIsRequired(isRequired.getSelection());
                    } catch (SemanticException e1) {
                        ExceptionHandler.handle(e1);
                    }
                }

            }

        });

        isMultiple = new Button(composite, SWT.CHECK);
        isMultiple.setText(Messages.getString("CascadingParametersDialog.Button.IsMultiple")); //$NON-NLS-1$
        isMultiple.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        isMultiple.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                if (selectedParameter != null) {
                    try {
                        if (isMultiple.getSelection())
                            selectedParameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_MULTI_VALUE);
                        else
                            selectedParameter.setParamType(DesignChoiceConstants.SCALAR_PARAM_TYPE_SIMPLE);

                        if (!isMultiple.getSelection()) {
                            if (defaultValueList != null && defaultValueList.size() > 0) {
                                Expression expression = getFirstDefaultValue();
                                defaultValueList.clear();
                                defaultValueList.add(expression);
                            }
                        }
                        initDefaultValueViewer();
                    } catch (SemanticException e1) {
                        ExceptionHandler.handle(e1);
                    }
                }

            }

        });
    }

    private void isRequiredChange(boolean isRequired) {
        if (getSelectedDataType().equals(DesignChoiceConstants.PARAM_TYPE_STRING)) {
            clearDefaultValueChooser(isRequired);
        }
    }

    private void clearDefaultValueChooser(boolean isChecked) {
        if (isChecked) {
            clearDefaultValueText();
            clearDefaultValueChooserSelections();
        } else {
            if (defaultValueChooser == null || defaultValueChooser.isDisposed()
                    || defaultValueChooser.getItemCount() > 0)
                return;
            // defaultValueChooser.add( CHOICE_NULL_VALUE );
            // defaultValueChooser.add( CHOICE_BLANK_VALUE );
        }
    }

    private void createLabel(Composite parent, String content, int width) {
        Label label = new Label(parent, SWT.NONE);
        setLabelLayoutData(label, width);
        if (content != null) {
            label.setText(content);
        }
    }

    private void setLabelLayoutData(Control control, int width) {
        GridData gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        gd.widthHint = width;
        control.setLayoutData(gd);
    }

    /*
     * set input for dialog
     */
    public void setInput(Object input) {
        Assert.isLegal(input instanceof CascadingParameterGroupHandle);
        inputParameterGroup = (CascadingParameterGroupHandle) input;
    }

    // initiate dialog
    protected boolean initDialog() {
        cascadingNameEditor.setText(inputParameterGroup.getName());
        promptTextEditor.setText(UIUtil.convertToGUIString(inputParameterGroup.getPromptText()));

        if (DesignChoiceConstants.DATA_SET_MODE_MULTIPLE.equals(inputParameterGroup.getDataSetMode())) {
            multiDataSet.setSelection(true);
        } else {
            singleDataSet.setSelection(true);
        }

        valueTable.setInput(inputParameterGroup);

        initSorttingArea();
        updateButtons();

        refreshParameterProperties();

        Point size = mainContent.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        mainContent.setSize(size);

        return true;
    }

    private void validateDefaultValues() throws BirtException {
        ArrayList elementsList = new ArrayList(inputParameterGroup.getParameters().getContents());
        if (elementsList == null || elementsList.size() == 0) {
            return;
        }

        for (Iterator iter = elementsList.iterator(); iter.hasNext();) {
            ScalarParameterHandle handle = (ScalarParameterHandle) iter.next();
            String tempDefaultValue = handle.getDefaultValue();
            String tempType = handle.getDataType();

            if (DesignChoiceConstants.PARAM_TYPE_STRING.endsWith(tempType)
                    || DesignChoiceConstants.PARAM_TYPE_BOOLEAN.endsWith(tempType)) {
                continue;
            }

            if (!((DesignChoiceConstants.PARAM_TYPE_STRING.endsWith(tempType))
                    || (DesignChoiceConstants.PARAM_TYPE_BOOLEAN.endsWith(tempType)))) {
                if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(tempType)) {
                    tempDefaultValue = convertToStandardFormat(DataTypeUtil.toDate(tempDefaultValue));
                } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(tempType)) {
                    tempDefaultValue = convertToStandardFormat(DataTypeUtil.toSqlDate(tempDefaultValue));
                } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(tempType)) {
                    tempDefaultValue = convertToStandardFormat(DataTypeUtil.toSqlTime(tempDefaultValue));
                }

                ParameterValidationUtil.validate(tempType, STANDARD_DATE_TIME_PATTERN, tempDefaultValue,
                        ULocale.getDefault());

            }

        }
    }

    // ok pressed
    protected void okPressed() {
        try {
            saveParameterProperties();
            saveSortingProperties();
            // Validate default value first -- begin -- bug 164765
            validateDefaultValues();
            // Validate default value first -- end --
            inputParameterGroup.setName(UIUtil.convertToModelString(cascadingNameEditor.getText(), true));
            inputParameterGroup.setPromptText(promptTextEditor.getText());

            if (isSingle()) {
                inputParameterGroup.setDataSetMode(DesignChoiceConstants.DATA_SET_MODE_SINGLE);
            } else {
                inputParameterGroup.setDataSetMode(DesignChoiceConstants.DATA_SET_MODE_MULTIPLE);
            }
        } catch (BirtException e) {
            ExceptionHandler.handle(e);
            refreshParameterProperties();
            initSorttingArea();
            return;
        }
        setResult(inputParameterGroup);
        super.okPressed();

    }

    private void deleteRow() {
        int index = valueTable.getTable().getSelectionIndex();
        boolean setBtnEnable = true;
        if (index == -1) {
            setBtnEnable = false;
        }

        editBtn.setEnabled(setBtnEnable);
        delBtn.setEnabled(setBtnEnable);

        ScalarParameterHandle choice = (ScalarParameterHandle) ((IStructuredSelection) valueTable.getSelection())
                .getFirstElement();

        if (choice == null) {
            return;
        }
        try {
            inputParameterGroup.getParameters().drop(choice);
        } catch (SemanticException e) {
            ExceptionHandler.handle(e);
            return;
        }
        refreshValueTable();

        index--;
        if (index < 0 && valueTable.getTable().getItemCount() > 1) {
            index = 0;
        }
        StructuredSelection selection = null;
        if (index != -1) {
            selection = new StructuredSelection(valueTable.getTable().getItem(index).getData());
            this.selectedParameter = (ScalarParameterHandle) ((IStructuredSelection) valueTable.getSelection())
                    .getFirstElement();
        } else {
            selection = StructuredSelection.EMPTY;
            this.selectedParameter = null;
        }
        valueTable.setSelection(selection);

        refreshParameterProperties();
        initSorttingArea();
        updateButtons();
    }

    private String[] getDataSetColumns(ScalarParameterHandle handle, boolean needFilter) {

        DataSetHandle dataSet = getDataSet(handle);
        if (dataSet == null) {
            return new String[0];
        }
        CachedMetaDataHandle metaHandle = dataSet.getCachedMetaDataHandle();
        if (metaHandle == null) {
            try {
                metaHandle = DataSetUIUtil.getCachedMetaDataHandle(dataSet);
            } catch (SemanticException e) {
                ExceptionHandler.handle(e);
                return new String[0];
            }
        }
        if (metaHandle == null || metaHandle.getResultSet() == null) {
            return new String[0];
        }
        ArrayList valueList = new ArrayList();
        List dataTypeList = new ArrayList();
        for (Iterator iter = metaHandle.getResultSet().iterator(); iter.hasNext();) {
            ResultSetColumnHandle columnHandle = (ResultSetColumnHandle) iter.next();
            if (!needFilter || matchDataType(handle, columnHandle)) {
                valueList.add(columnHandle.getColumnName());
                dataTypeList.add(columnHandle.getDataType());
            }
        }
        return (String[]) valueList.toArray(new String[0]);
    }

    private DataSetHandle getDataSet(ScalarParameterHandle handle) {
        if (!isSingle()) {
            if (handle != null && handle.getDataSet() != null) {
                return handle.getDataSet();
            }
            return null;
        }
        return inputParameterGroup.getDataSet();
    }

    private IStructuredContentProvider contentProvider = new IStructuredContentProvider() {

        public Object[] getElements(Object inputElement) {
            ArrayList elementsList = new ArrayList(inputParameterGroup.getParameters().getContents());
            for (Iterator iter = elementsList.iterator(); iter.hasNext();) {
                ScalarParameterHandle handle = (ScalarParameterHandle) iter.next();

                String[] columns = getDataSetColumns(handle, false);
                boolean found = false;
                for (int i = 0; i < columns.length; i++) {
                    if (DEUtil.getColumnExpression(columns[i]).equals(handle.getValueExpr())
                            || DEUtil.getResultSetColumnExpression(columns[i]).equals(handle.getValueExpr())) {
                        found = true;
                        break;
                    }
                }
                if (!found) {
                    try {
                        handle.setValueExpr(null);
                    } catch (SemanticException e) {
                        ExceptionHandler.handle(e);
                    }
                }
            }
            return elementsList.toArray();
        }

        public void dispose() {
        }

        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        }

    };

    private ITableLabelProvider labelProvider = new ITableLabelProvider() {

        public Image getColumnImage(Object element, int columnIndex) {
            return null;
        }

        public String getColumnText(Object element, int columnIndex) {
            String value = null;
            ScalarParameterHandle paramHandle = null;

            if (element instanceof ScalarParameterHandle) {
                paramHandle = (ScalarParameterHandle) element;
            }

            {
                switch (columnIndex) {
                case 0: {

                    String paramName;
                    if (paramHandle != selectedParameter) {
                        paramName = paramHandle.getName();
                    } else {
                        paramName = paramNameEditor.getText().trim();
                    }
                    value = getDummyText(paramHandle) + paramName;

                    break;
                }
                case 1: {
                    DataSetHandle dataSet = null;
                    if (isSingle()) {
                        if (paramHandle != getFirstParameter()) {
                            break;
                        }
                        dataSet = inputParameterGroup.getDataSet();
                    } else {
                        dataSet = getDataSet(paramHandle);
                    }
                    if (dataSet == null) {
                        value = LABEL_SELECT_DATA_SET;
                    } else {
                        value = dataSet.getName();
                    }
                    break;
                }
                case 2: {
                    if (paramHandle.getValueExpr() != null) {
                        value = getColumnName(paramHandle, COLUMN_VALUE);
                    } else if (getDataSetColumns(paramHandle, true).length > 0) {
                        value = LABEL_SELECT_VALUE_COLUMN;
                    } else {
                        value = LABEL_NO_COLUMN_AVAILABLE;
                    }
                    break;
                }
                case 3: {
                    value = getColumnName(paramHandle, COLUMN_DISPLAY_TEXT);
                    if (value == null) {
                        if (getDataSetColumns(paramHandle, false).length > 0) {
                            value = LABEL_SELECT_DISPLAY_COLUMN;
                        } else {
                            value = LABEL_NO_COLUMN_AVAILABLE;
                        }

                    }
                    break;
                }
                }
            }

            if (value == null) {
                value = ""; //$NON-NLS-1$
            }
            return value;
        }

        private String getDummyText(Object element) {
            //String dummyText = ""; //$NON-NLS-1$
            StringBuffer buffer = new StringBuffer();
            int index = getTableIndex(element);
            for (int i = 0; i < index; i++) {
                buffer.append("    "); //$NON-NLS-1$
            }

            return buffer.toString();
        }

        public void addListener(ILabelProviderListener listener) {
        }

        public void dispose() {
        }

        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        public void removeListener(ILabelProviderListener listener) {
        }

    };
    private Composite mainContent;
    private TableViewer defaultValueViewer;
    private Button addValueButton;
    private Button editValueBtn;
    private Button delValueBtn;
    private Button delAllValuesBtn;
    private ExpressionButton expressionButton;
    private Composite rightButtonsPart;

    protected int getTableIndex(Object element) {
        Object[] input = ((IStructuredContentProvider) valueTable.getContentProvider())
                .getElements(valueTable.getInput());

        int index = 0;

        for (int i = 0; i < input.length; i++) {
            if (element == input[i]) {
                index = i;
                break;
            }
        }

        return index;
    }

    private void refreshValueTable() {
        if (valueTable != null && !valueTable.getTable().isDisposed()) {
            valueTable.refresh();
        }
    }

    private void refreshParameterProperties() {
        if (selectedParameter == null) {
            clearParamProperties();
            setControlEnabled(false);
            initDefaultValueViewer();
            return;
        }

        setControlEnabled(true);

        paramNameEditor.setText(selectedParameter.getName());

        if (selectedParameter.getPromptText() == null) {
            promptText.setText(""); //$NON-NLS-1$
        } else {
            promptText.setText(selectedParameter.getPromptText());
        }

        dataTypeChooser.setText(DATA_TYPE_CHOICE_SET.findChoice(selectedParameter.getDataType()).getDisplayName());

        if (getInputDisplayName() == null) {
            displayTypeChooser.clearSelection();
        } else {
            displayTypeChooser.setText(getInputDisplayName());
        }

        Expression expression = getFirstDefaultValue();
        String defaultValue = expression == null ? null : expression.getStringExpression();
        String expressionType = expression == null ? null : expression.getType();

        if (expressionType != null) {
            defaultValueChooser.setData(ExpressionButtonUtil.EXPR_TYPE, expressionType);
            ExpressionButton button = (ExpressionButton) defaultValueChooser
                    .getData(ExpressionButtonUtil.EXPR_BUTTON);
            if (button != null)
                button.refresh();
        }

        if (getSelectedDataType().equals(DesignChoiceConstants.PARAM_TYPE_STRING)) {
            defaultValueChooser.setText(DEUtil.resolveNull(defaultValue));

        } else if (defaultValue != null) {
            defaultValueChooser.setText(defaultValue);
        } else {
            defaultValueChooser.setText("");
        }

        helpTextEditor.setText(UIUtil.convertToGUIString(selectedParameter.getHelpText()));

        if (selectedParameter.getPropertyHandle(ScalarParameterHandle.LIST_LIMIT_PROP).isSet()) {
            listLimit.setText(String.valueOf(selectedParameter.getListlimit()));
        } else {
            listLimit.setText(""); //$NON-NLS-1$
        }

        // allowNull.setSelection( selectedParameter.allowNull( ) );
        isRequired.setSelection(selectedParameter.isRequired());

        if (selectedParameter == inputParameterGroup.getParameters()
                .get(inputParameterGroup.getParameters().getCount() - 1) && selectedParameter.isMustMatch())//Add isMustMatch expression to control isMultiple disable if display type is combo box when parameter selected.
        {
            isMultiple.setEnabled(true);
            isMultiple.setSelection(
                    DesignChoiceConstants.SCALAR_PARAM_TYPE_MULTI_VALUE.equals(selectedParameter.getParamType()));

        } else {
            isMultiple.setEnabled(false);
            isMultiple.setSelection(false);
        }

        defaultValueList = selectedParameter.getDefaultValueList();
        initDefaultValueViewer();

        changeDataType(selectedParameter.getDataType());

        formatCategroy = selectedParameter.getCategory();
        formatPattern = selectedParameter.getPattern();
        updateFormatField();
    }

    private void clearParamProperties() {
        paramNameEditor.setText(""); //$NON-NLS-1$
        promptText.setText(""); //$NON-NLS-1$
        dataTypeChooser.select(-1);
        displayTypeChooser.select(-1);
        defaultValueChooser.setText(""); //$NON-NLS-1$
        helpTextEditor.setText(""); //$NON-NLS-1$
        formatField.setText(""); //$NON-NLS-1$
        listLimit.setText(""); //$NON-NLS-1$

        previewLable.setText(""); //$NON-NLS-1$
        // allowNull.setSelection( false );
        isRequired.setSelection(false);
    }

    private void setControlEnabled(boolean enable) {
        paramNameEditor.setEnabled(enable);
        promptText.setEnabled(enable);
        dataTypeChooser.setEnabled(enable);
        displayTypeChooser.setEnabled(enable);
        defaultValueChooser.setEnabled(enable);
        helpTextEditor.setEnabled(enable);
        formatField.setEnabled(enable);
        listLimit.setEnabled(enable);
        changeFormat.setEnabled(enable);
        isRequired.setEnabled(enable);
        isMultiple.setEnabled(enable);
        if (!isMultiple.isEnabled())
            isMultiple.setSelection(false);
        expressionButton.setEnabled(enable);
    }

    private void changeDataType(String type) {
        // if ( type.equals( lastDataType ) )
        // return;
        if (type.equals(DesignChoiceConstants.PARAM_TYPE_STRING)) {
            clearDefaultValueChooser(isRequired.getSelection());
        } else {
            clearDefaultValueText();
            clearDefaultValueChooserSelections();
        }
        // lastDataType = type;
        initFormatField(type);
        refreshValueTable();
        updateButtons();
    }

    private void clearDefaultValueText() {
        if (defaultValueChooser == null || defaultValueChooser.isDisposed())
            return;
        String textValue = defaultValueChooser.getText();
        if (textValue != null && (textValue.equals(CHOICE_NULL_VALUE) || textValue.equals(CHOICE_BLANK_VALUE))) {
            defaultValueChooser.setText(""); //$NON-NLS-1$
        }
    }

    private void clearDefaultValueChooserSelections() {
        if (defaultValueChooser == null || defaultValueChooser.isDisposed())
            return;
        if (defaultValueChooser.getItemCount() > 1) {
            defaultValueChooser.remove(1, defaultValueChooser.getItemCount() - 1);
        }
    }

    private void initFormatField(String selectedDataType) {
        IChoiceSet choiceSet = getFormatChoiceSet(selectedDataType);
        if (choiceSet == null) {
            formatCategroy = formatPattern = null;
        } else {
            if ((formatCategroy != null && choiceSet.findChoice(formatCategroy) == null)
                    || (selectedParameter.getCategory() == null && selectedParameter.getPattern() == null)) {
                if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(selectedDataType)) {
                    formatCategroy = choiceSet.findChoice(DesignChoiceConstants.STRING_FORMAT_TYPE_UNFORMATTED)
                            .getName();
                } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(selectedDataType)) {
                    formatCategroy = choiceSet.findChoice(DesignChoiceConstants.DATETIEM_FORMAT_TYPE_UNFORMATTED)
                            .getName();
                } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(selectedDataType)) {
                    formatCategroy = choiceSet.findChoice(DesignChoiceConstants.DATE_FORMAT_TYPE_UNFORMATTED)
                            .getName();
                } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(selectedDataType)) {
                    formatCategroy = choiceSet.findChoice(DesignChoiceConstants.DATE_FORMAT_TYPE_UNFORMATTED)
                            .getName();
                } else if (DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals(selectedDataType)
                        || DesignChoiceConstants.PARAM_TYPE_FLOAT.equals(selectedDataType)
                        || DesignChoiceConstants.PARAM_TYPE_INTEGER.equals(selectedDataType)) {
                    formatCategroy = choiceSet.findChoice(DesignChoiceConstants.NUMBER_FORMAT_TYPE_UNFORMATTED)
                            .getName();
                }
                formatPattern = null;
            } else {
                formatCategroy = selectedParameter.getCategory();
                if (formatCategroy == null) {// back compatible
                    formatCategroy = DesignChoiceConstants.STRING_FORMAT_TYPE_UNFORMATTED;
                }
                formatPattern = selectedParameter.getPattern();

                Object formatValue = selectedParameter.getProperty(IScalarParameterModel.FORMAT_PROP);
                if (formatValue instanceof FormatValue) {
                    PropertyHandle propHandle = selectedParameter
                            .getPropertyHandle(IScalarParameterModel.FORMAT_PROP);
                    FormatValue formatValueToSet = (FormatValue) formatValue;
                    FormatValueHandle formatHandle = (FormatValueHandle) formatValueToSet.getHandle(propHandle);
                    formatLocale = formatHandle.getLocale();
                }
            }
        }
        updateFormatField();
    }

    private String getInputDisplayName() {
        String displayName = null;
        if (DesignChoiceConstants.PARAM_CONTROL_LIST_BOX.equals(selectedParameter.getControlType())) {
            if (selectedParameter.isMustMatch()) {
                // displayName = DISPLAY_NAME_CONTROL_COMBO;
                displayName = DISPLAY_NAME_CONTROL_LIST;
            } else {
                // displayName = DISPLAY_NAME_CONTROL_LIST;
                displayName = DISPLAY_NAME_CONTROL_COMBO;
            }
        }
        return displayName;
    }

    private IChoiceSet getFormatChoiceSet(String type) {
        IChoiceSet choiceSet = null;
        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(type)) {
            choiceSet = DEUtil.getMetaDataDictionary()
                    .getChoiceSet(DesignChoiceConstants.CHOICE_STRING_FORMAT_TYPE);
        } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(type)) {
            choiceSet = DEUtil.getMetaDataDictionary()
                    .getChoiceSet(DesignChoiceConstants.CHOICE_DATETIME_FORMAT_TYPE);
        } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(type)) {
            choiceSet = DEUtil.getMetaDataDictionary().getChoiceSet(DesignChoiceConstants.CHOICE_DATE_FORMAT_TYPE);
        } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(type)) {
            choiceSet = DEUtil.getMetaDataDictionary().getChoiceSet(DesignChoiceConstants.CHOICE_TIME_FORMAT_TYPE);
        } else if (DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals(type)
                || DesignChoiceConstants.PARAM_TYPE_FLOAT.equals(type)
                || DesignChoiceConstants.PARAM_TYPE_INTEGER.equals(type)) {
            choiceSet = DEUtil.getMetaDataDictionary()
                    .getChoiceSet(DesignChoiceConstants.CHOICE_NUMBER_FORMAT_TYPE);
        }
        return choiceSet;
    }

    private String getSelectedDataType() {
        String type = null;
        if (StringUtil.isBlank(dataTypeChooser.getText())) {
            if (selectedParameter != null) {
                type = selectedParameter.getDataType();
            } else {
                type = DesignChoiceConstants.PARAM_TYPE_STRING;
            }
        } else {
            IChoice choice = DATA_TYPE_CHOICE_SET.findChoiceByDisplayName(dataTypeChooser.getText());
            type = choice.getName();
        }
        return type;
    }

    /**
     * Gets the internal name of the control type from the display name
     */
    private String getSelectedDisplayType() {
        String displayText = displayTypeChooser.getText();
        if (displayText.length() == 0) {
            return null;
        }
        if (DISPLAY_NAME_CONTROL_COMBO.equals(displayText)) {
            return PARAM_CONTROL_COMBO;
        }
        if (DISPLAY_NAME_CONTROL_LIST.equals(displayText)) {
            return PARAM_CONTROL_LIST;
        }
        return null;
    }

    private void popupFormatBuilder(boolean refresh) {
        String dataType = getSelectedDataType();
        int formatType;
        if (DesignChoiceConstants.PARAM_TYPE_BOOLEAN.equals(dataType)) {
            return;
        }
        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(dataType)) {
            formatType = FormatBuilder.STRING;
        } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(dataType)) {
            formatType = FormatBuilder.DATETIME;
        } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(dataType)) {
            formatType = FormatBuilder.DATE;
        } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(dataType)) {
            formatType = FormatBuilder.TIME;
        } else {
            formatType = FormatBuilder.NUMBER;
        }
        FormatBuilder formatBuilder = new FormatBuilder(formatType);
        formatBuilder.setInputFormat(formatCategroy, formatPattern, formatLocale);
        // formatBuilder.setPreviewText( defaultValue );
        if (formatBuilder.open() == OK) {
            formatCategroy = (String) ((Object[]) formatBuilder.getResult())[0];
            formatPattern = (String) ((Object[]) formatBuilder.getResult())[1];
            formatLocale = (ULocale) ((Object[]) formatBuilder.getResult())[2];
            updateFormatField();
            try {
                saveParameterProperties();
            } catch (SemanticException e) {
                ExceptionHandler.handle(e);
            }
        }
    }

    private void updateFormatField() {
        String displayFormat;
        IChoiceSet choiceSet = getFormatChoiceSet(getSelectedDataType());
        if (choiceSet == null) {// Boolean type;
            displayFormat = DEUtil.getMetaDataDictionary()
                    .getChoiceSet(DesignChoiceConstants.CHOICE_STRING_FORMAT_TYPE)
                    .findChoice(DesignChoiceConstants.STRING_FORMAT_TYPE_UNFORMATTED).getDisplayName();
        } else {
            if (formatCategroy == null || choiceSet.findChoice(formatCategroy) == null)
                return;
            displayFormat = choiceSet.findChoice(formatCategroy).getDisplayName();
            if (isCustom()) {
                displayFormat += ":  " + formatPattern; //$NON-NLS-1$
            }
        }
        formatField.setText("" + displayFormat); //$NON-NLS-1$
        changeFormat.setEnabled(choiceSet != null);

        if (selectedParameter != null) {
            ULocale locale = formatLocale;
            if (locale == null)
                locale = ULocale.getDefault();
            doPreview(isCustom() ? formatPattern : formatCategroy, locale);
        }
    }

    private boolean isCustom() {
        if (DesignChoiceConstants.STRING_FORMAT_TYPE_CUSTOM.equals(formatCategroy)
                || DesignChoiceConstants.NUMBER_FORMAT_TYPE_CUSTOM.equals(formatCategroy)
                || DesignChoiceConstants.DATETIEM_FORMAT_TYPE_CUSTOM.equals(formatCategroy)
                || DesignChoiceConstants.DATE_FORMAT_TYPE_CUSTOM.equals(formatCategroy)
                || DesignChoiceConstants.TIME_FORMAT_TYPE_CUSTOM.equals(formatCategroy)
                || DesignChoiceConstants.NUMBER_FORMAT_TYPE_CURRENCY.equals(formatCategroy)) {
            return true;
        }
        return false;
    }

    private void doPreview(String pattern, ULocale locale) {
        String type = getSelectedDataType();

        String formatStr = ""; //$NON-NLS-1$
        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(type)) {
            formatStr = new StringFormatter(pattern, locale).format(DEFAULT_PREVIEW_STRING);
        } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(type)) {
            pattern = pattern.equals(DesignChoiceConstants.DATETIEM_FORMAT_TYPE_UNFORMATTED)
                    ? DateFormatter.DATETIME_UNFORMATTED
                    : pattern;
            formatStr = new DateFormatter(pattern, locale).format(new Date());
        } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(type)) {
            pattern = pattern.equals(DesignChoiceConstants.DATE_FORMAT_TYPE_UNFORMATTED)
                    ? DateFormatter.DATE_UNFORMATTED
                    : pattern;
            formatStr = new DateFormatter(pattern, locale).format(new Date());
        } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(type)) {
            pattern = pattern.equals("Unformatted") ? DateFormatter.TIME_UNFORMATTED //$NON-NLS-1$
                    : pattern;
            formatStr = new DateFormatter(pattern, locale).format(new Date());
        } else if (DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals(type)
                || DesignChoiceConstants.PARAM_TYPE_FLOAT.equals(type)) {
            formatStr = new NumberFormatter(pattern, locale).format(DEFAULT_PREVIEW_NUMBER);
        } else if (DesignChoiceConstants.PARAM_TYPE_INTEGER.equals(type)) {
            formatStr = new NumberFormatter(pattern, locale).format(DEFAULT_PREVIEW_INTEGER_NUMBER);
        }
        previewLable.setText(UIUtil.convertToGUIString(formatStr));
    }

    private String getColumnName(ScalarParameterHandle handle, String column) {
        CachedMetaDataHandle cmdh = null;
        try {
            DataSetHandle dataSet = getDataSet(handle);
            if (dataSet == null) {
                return null;
            }
            cmdh = DataSetUIUtil.getCachedMetaDataHandle(dataSet);
        } catch (SemanticException e) {
        }
        String value = null;
        if (COLUMN_VALUE.equals(column)) {
            value = handle.getValueExpr();
        } else {
            value = handle.getLabelExpr();
        }
        if (cmdh != null) {
            for (Iterator iter = cmdh.getResultSet().iterator(); iter.hasNext();) {
                ResultSetColumnHandle element = (ResultSetColumnHandle) iter.next();
                if (DEUtil.getColumnExpression(element.getColumnName()).equalsIgnoreCase(value)
                        || DEUtil.getResultSetColumnExpression(element.getColumnName()).equalsIgnoreCase(value)) {
                    return element.getColumnName();
                }
            }
        }

        return null;
    }

    private void updateButtons() {
        int index = valueTable.getTable().getSelectionIndex();
        boolean setBtnEnable = true;
        if (index == -1) {
            setBtnEnable = false;
        }

        editBtn.setEnabled(setBtnEnable);
        delBtn.setEnabled(setBtnEnable);

        boolean okEnable = true;

        if (errorMessageLine != null && !errorMessageLine.isDisposed()) {
            okEnable = (errorMessageLine.getImage() == null);
            if (okEnable == false) {
                getOkButton().setEnabled(okEnable);
                return;
            }
        }

        Iterator iter = inputParameterGroup.getParameters().iterator();
        if (!iter.hasNext()) {
            okEnable = false;
        } else {
            int count = 0;
            while (iter.hasNext()) {
                Object obj = iter.next();
                if (obj instanceof ScalarParameterHandle) {
                    ScalarParameterHandle param = (ScalarParameterHandle) obj;
                    count++;
                    if (!checkParameter(param)) {
                        okEnable = false;
                        break;
                    }
                }
            }
            okEnable &= (count != 0);
        }

        getOkButton().setEnabled(okEnable);

    }

    private boolean matchDataType(ScalarParameterHandle handle, ResultSetColumnHandle columnHandle) {
        String type = handle.getDataType();
        if (handle == selectedParameter && dataTypeChooser.isEnabled()) {
            type = getSelectedDataType();
        }
        if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(type)
                || DesignChoiceConstants.COLUMN_DATA_TYPE_ANY.equals(columnHandle.getDataType())) {
            return true;
        } else if (DesignChoiceConstants.PARAM_TYPE_BOOLEAN.equals(type)) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_BOOLEAN.equals(columnHandle.getDataType());
        } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(type)) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_DATETIME.equals(columnHandle.getDataType());
        } else if (DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals(type)) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL.equals(columnHandle.getDataType());
        } else if (DesignChoiceConstants.PARAM_TYPE_FLOAT.equals(type)) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT.equals(columnHandle.getDataType());
        } else if (DesignChoiceConstants.PARAM_TYPE_INTEGER.equals(type)) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER.equals(columnHandle.getDataType());
        } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(columnHandle.getDataType())) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_DATE.equals(type);
        } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(columnHandle.getDataType())) {
            return DesignChoiceConstants.COLUMN_DATA_TYPE_TIME.equals(type);
        }
        return false;
    }

    private void saveParameterProperties() throws SemanticException {
        if (selectedParameter != null) {
            selectedParameter.setPromptText(UIUtil.convertToModelString(promptText.getText(), false));
            selectedParameter.setHelpText(UIUtil.convertToModelString(helpTextEditor.getText(), true));

            selectedParameter.setDefaultValueList(defaultValueList);

            if (StringUtil.isBlank(listLimit.getText())) {
                selectedParameter.setProperty(ScalarParameterHandle.LIST_LIMIT_PROP, null);
            } else {
                selectedParameter.setListlimit(Integer.parseInt(listLimit.getText()));
            }
            // selectedParameter.setAllowNull( allowNull.getSelection( ) );
            selectedParameter.setIsRequired(isRequired.getSelection());
            selectedParameter.setName(UIUtil.convertToModelString(paramNameEditor.getText(), true));

            selectedParameter.setCategory(formatCategroy);
            selectedParameter.setPattern(formatPattern);

            Object value = selectedParameter.getProperty(IScalarParameterModel.FORMAT_PROP);
            if (value instanceof FormatValue) {
                PropertyHandle propHandle = selectedParameter.getPropertyHandle(IScalarParameterModel.FORMAT_PROP);
                FormatValue formatValueToSet = (FormatValue) value;
                FormatValueHandle formatHandle = (FormatValueHandle) formatValueToSet.getHandle(propHandle);
                formatHandle.setLocale(formatLocale);
            }

            refreshValueTable();
        }
        ;
    }

    private boolean isSingle() {
        return singleDataSet.getSelection();
    }

    private ScalarParameterHandle getFirstParameter() {
        if (inputParameterGroup.getParameters().getCount() > 0) {
            return (ScalarParameterHandle) inputParameterGroup.getParameters().get(0);
        }
        return null;
    }

    private boolean checkParameter(ScalarParameterHandle paramHandle) {
        if (paramHandle.getValueExpr() == null || getColumnName(paramHandle, COLUMN_VALUE) == null) {
            return false;
        }
        return true;
    }

    class AddEditCascadingParameterDialog extends BaseDialog {

        public final String DATASET_NONE = Messages.getString("CascadingParametersDialog.items.None"); //$NON-NLS-1$

        public final String DISPLAY_TEXT_NONE = Messages.getString("CascadingParametersDialog.items.None"); //$NON-NLS-1$

        private final String ERROR_MSG_DUPLICATED_NAME = Messages
                .getString("ParameterDialog.ErrorMessage.DuplicatedName"); //$NON-NLS-1$

        Text name;
        Combo dataset, value, displayText;
        private String[] dataTypes;
        protected ScalarParameterHandle parameter = null;
        protected CLabel editErrorMessage;

        public ScalarParameterHandle getParameter() {
            return parameter;
        }

        protected AddEditCascadingParameterDialog(String title) {
            super(title);
        }

        protected AddEditCascadingParameterDialog(Shell parentShell, String title) {
            super(parentShell, title);
        }

        protected void updateButtons() {
            if (editErrorMessage != null && !editErrorMessage.isDisposed()) {
                if (editErrorMessage.getImage() != null) {
                    getOkButton().setEnabled(false);
                    return;
                }
            }

            if ((dataset.getItemCount() == 1 && dataset.getItem(0).equals(DATASET_NONE))
                    || value.getText().length() == 0) {
                getOkButton().setEnabled(false);
            } else {
                getOkButton().setEnabled(true);
            }

        }

        protected void okPressed() {
            if (name.getText().trim().length() != 0) {
                try {
                    parameter.setName(name.getText().trim());
                } catch (NameException e) {
                    // TODO Auto-generated catch block
                    ExceptionHandler.handle(e);
                }
            }

            super.okPressed();
        }

        public void setParameter(ScalarParameterHandle param) {
            parameter = param;
        }

        protected Control createDialogArea(Composite parent) {
            UIUtil.bindHelp(parent, IHelpContextIds.ADD_EDIT_CASCADING_PARAMETER_DIALOG_ID);
            Composite topComposite = (Composite) super.createDialogArea(parent);

            Composite composite = new Composite(topComposite, SWT.NONE);
            composite.setLayout(UIUtil.createGridLayoutWithoutMargin(2, false));
            composite.setLayoutData(new GridData(GridData.FILL_BOTH));

            Label labelName = new Label(composite, SWT.NONE);
            labelName.setText(Messages.getString("AddEditCascadingParameterDialog.label.name")); //$NON-NLS-1$
            name = new Text(composite, SWT.BORDER);
            GridData gd = new GridData(GridData.FILL_HORIZONTAL);
            gd.minimumWidth = 250;
            name.setLayoutData(gd);
            name.addModifyListener(new ModifyListener() {

                public void modifyText(ModifyEvent e) {
                    updateEditErrorMsg();
                    updateButtons();
                }

            });

            Label labelDataset = new Label(composite, SWT.NONE);
            labelDataset.setText(Messages.getString("AddEditCascadingParameterDialog.label.dataset")); //$NON-NLS-1$
            dataset = new Combo(composite, SWT.READ_ONLY);
            dataset.setVisibleItemCount(30);
            dataset.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            dataset.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent e) {
                    if (dataset.getSelectionIndex() == -1
                            || (dataset.getItemCount() == 1 && dataset.getText().equals(DATASET_NONE))) {
                        value.setEnabled(false);
                        displayText.setEnabled(false);
                    } else {
                        try {
                            parameter.setDataSet(DataUtil.findDataSet(dataset.getText()));
                            if (parameter.getDataSet() != null) {
                                if (getFirstParameter() == null || parameter == getFirstParameter()) {
                                    inputParameterGroup.setDataSet(parameter.getDataSet());
                                }

                                updateComboFromDataSet();
                            }
                        } catch (SemanticException e1) {

                        }

                    }
                    updateButtons();
                }
            });

            Label labelValue = new Label(composite, SWT.NONE);
            labelValue.setText(Messages.getString("AddEditCascadingParameterDialog.label.value")); //$NON-NLS-1$
            value = new Combo(composite, SWT.READ_ONLY);
            value.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            value.setVisibleItemCount(30);
            value.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent e) {
                    try {
                        parameter.setValueExpr(DEUtil.getColumnExpression(value.getText()));
                        if (dataTypes.length == value.getItemCount() && value.getSelectionIndex() > -1) {
                            parameter.setDataType(dataTypes[value.getSelectionIndex()]);
                        }
                    } catch (SemanticException e1) {
                    }
                    updateButtons();
                }
            });

            Label labelDisplayText = new Label(composite, SWT.NONE);
            labelDisplayText.setText(Messages.getString("AddEditCascadingParameterDialog.label.displaytext")); //$NON-NLS-1$
            displayText = new Combo(composite, SWT.READ_ONLY);
            displayText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
            displayText.setVisibleItemCount(30);
            displayText.addSelectionListener(new SelectionAdapter() {

                public void widgetSelected(SelectionEvent e) {
                    try {
                        if (displayText.getSelectionIndex() == 0) // it
                        // means
                        // DISPLAY_TEXT_NONE
                        {
                            parameter.setLabelExpr(null);
                        } else {
                            parameter.setLabelExpr(DEUtil.getColumnExpression(displayText.getText()));
                        }

                    } catch (SemanticException e1) {
                        ExceptionHandler.handle(e1);
                    }
                    updateButtons();
                }
            });

            createLabel(composite, null);
            editErrorMessage = new CLabel(composite, SWT.NONE);
            GridData msgLineGridData = new GridData(GridData.FILL_HORIZONTAL);
            msgLineGridData.horizontalSpan = 2;
            editErrorMessage.setLayoutData(msgLineGridData);

            return topComposite;
        }

        protected void updateEditErrorMsg() {
            String errorMsg = null;
            String paraName = name.getText().trim();
            if (!paraName.equals(parameter.getName())
                    && parameter.getModuleHandle().findParameter(paraName) != null) {
                errorMsg = ERROR_MSG_DUPLICATED_NAME;
            }
            if (errorMsg != null) {
                editErrorMessage.setText(errorMsg);
                editErrorMessage.setImage(ERROR_ICON);
            } else {
                editErrorMessage.setText(""); //$NON-NLS-1$
                editErrorMessage.setImage(null);
            }
        }

        protected boolean initDialog() {
            dataset.setItems(ChoiceSetFactory.getDataSets());
            if (dataset.getItemCount() == 0) {
                dataset.add(DATASET_NONE);
                dataset.select(0);
            }
            if (isSingle() && (getFirstParameter() != null && getFirstParameter() != parameter)) {
                if (inputParameterGroup.getDataSet() != null) {
                    dataset.select(dataset.indexOf(inputParameterGroup.getDataSet().getName()));
                    dataset.setEnabled(false);
                }
            }

            updateComboFromDataSet();
            if (parameter.getName().trim().length() != 0) {
                name.setText(parameter.getName());
            }
            updateButtons();
            return super.initDialog();
        }

        private String[] getDataSetColumns(ScalarParameterHandle handle, boolean needFilter) {

            DataSetHandle dataSet = getDataSet(handle);
            if (dataSet == null) {
                return new String[0];
            }
            CachedMetaDataHandle metaHandle = dataSet.getCachedMetaDataHandle();
            if (metaHandle == null) {
                try {
                    metaHandle = DataSetUIUtil.getCachedMetaDataHandle(dataSet);
                } catch (SemanticException e) {
                    ExceptionHandler.handle(e);
                    return new String[0];
                }
            }
            if (metaHandle == null || metaHandle.getResultSet() == null) {
                return new String[0];
            }
            ArrayList valueList = new ArrayList();
            List dataTypeList = new ArrayList();
            for (Iterator iter = metaHandle.getResultSet().iterator(); iter.hasNext();) {
                ResultSetColumnHandle columnHandle = (ResultSetColumnHandle) iter.next();
                valueList.add(columnHandle.getColumnName());
                dataTypeList.add(ModuleUtil.convertColumnTypeToParamType(columnHandle.getDataType()));
            }

            dataTypes = (String[]) dataTypeList.toArray(new String[0]);
            return (String[]) valueList.toArray(new String[0]);
        }

        private void updateComboFromDataSet() {
            value.setEnabled(false);
            displayText.setEnabled(false);
            if (parameter != null) {
                DataSetHandle dataSet = getDataSet(parameter);
                if (dataSet != null) {
                    // name.setText( parameter.getName( ) );
                    dataset.select(dataset.indexOf(dataSet.getName()));
                    value.setItems(getDataSetColumns(parameter, true));
                    displayText.removeAll();
                    displayText.setItems(getDataSetColumns(parameter, false));
                    displayText.add(DISPLAY_TEXT_NONE, 0);

                    value.setEnabled(true);
                    String temp = getColumnName(parameter, COLUMN_VALUE);
                    if (temp != null) {
                        value.select(value.indexOf(temp));
                    }

                    displayText.setEnabled(true);
                    temp = getColumnName(parameter, COLUMN_DISPLAY_TEXT);
                    if (temp != null) {
                        displayText.select(displayText.indexOf(temp));
                    } else {
                        displayText.select(0);
                    }

                }
            } else
            // ( newParameter == null )
            {
                parameter = DesignElementFactory.getInstance().newScalarParameter(null);
                try {
                    parameter.setControlType(DesignChoiceConstants.PARAM_CONTROL_LIST_BOX);
                    parameter.setValueType(DesignChoiceConstants.PARAM_VALUE_TYPE_DYNAMIC);
                } catch (SemanticException e) {
                    ExceptionHandler.handle(e);
                }

                // name.setText( parameter.getName( ) );
                if (getFirstParameter() != null && !(multiDataSet.isEnabled() && multiDataSet.getSelection())) {
                    try {
                        parameter.setDataSet(inputParameterGroup.getDataSet());
                        value.setItems(getDataSetColumns(parameter, true));
                        displayText.setItems(getDataSetColumns(parameter, false));
                        displayText.add(DISPLAY_TEXT_NONE, 0);
                        value.setEnabled(true);
                        displayText.setEnabled(true);

                        String temp = getColumnName(parameter, COLUMN_DISPLAY_TEXT);
                        if (temp != null) {
                            displayText.select(displayText.indexOf(temp));
                        } else {
                            displayText.select(0);
                        }
                    } catch (SemanticException e) {
                        logger.log(Level.SEVERE, e.getMessage(), e);
                    }

                }

            }

        }
    }

    private void createSortingArea(Composite parent) {
        // Sorting conditions here
        sorttingArea = new Composite(parent, SWT.NONE);
        GridData sorttingAreaGridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_END);
        sorttingAreaGridData.horizontalSpan = 2;
        sorttingArea.setLayoutData(sorttingAreaGridData);
        sorttingArea.setLayout(UIUtil.createGridLayoutWithoutMargin(1, false));

        Group sortGroup = new Group(sorttingArea, SWT.NONE);
        sortGroup.setText(LABEL_SORT_GROUP);
        sortGroup.setLayout(new GridLayout(2, false));
        sortGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        Composite sortKeyArea = new Composite(sortGroup, SWT.NONE);
        sortKeyArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sortKeyArea.setLayout(new GridLayout(2, false));
        // createLabel( sortKeyArea, LABEL_SORT_KEY );
        sortKeyLabel = new Label(sortKeyArea, SWT.NONE);
        sortKeyLabel.setText(LABEL_SORT_KEY);
        sortKeyChooser = new Combo(sortKeyArea, SWT.BORDER | SWT.READ_ONLY);
        sortKeyChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sortKeyChooser.setVisibleItemCount(30);
        // sortKeyChooser.add( CHOICE_NONE );
        // sortKeyChooser.add( CHOICE_DISPLAY_TEXT );
        // sortKeyChooser.add( CHOICE_VALUE_COLUMN );
        // sortKeyChooser.setText( CHOICE_NONE );
        sortKeyChooser.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                if (!((Combo) e.widget).getText().equals(CHOICE_NONE)) {
                    sortDirectionLabel.setEnabled(true);
                    sortDirectionChooser.setEnabled(true);
                } else {
                    sortDirectionLabel.setEnabled(false);
                    sortDirectionChooser.setEnabled(false);
                }
            }

        });

        Composite sortDirectionArea = new Composite(sortGroup, SWT.NONE);
        sortDirectionArea.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sortDirectionArea.setLayout(new GridLayout(2, false));
        // createLabel( sortDirectionArea, LABEL_SORT_DIRECTION );
        sortDirectionLabel = new Label(sortDirectionArea, SWT.NONE);
        sortDirectionLabel.setText(LABEL_SORT_DIRECTION);
        sortDirectionChooser = new Combo(sortDirectionArea, SWT.BORDER | SWT.READ_ONLY);
        sortDirectionChooser.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        sortDirectionChooser.setVisibleItemCount(30);
        sortDirectionChooser.add(CHOICE_ASCENDING);
        sortDirectionChooser.add(CHOICE_DESCENDING);
        sortDirectionChooser.setText(CHOICE_ASCENDING);
    }

    private void setSortingDefault() {
        sortKeyChooser.setText(CHOICE_NONE);
        sortDirectionChooser.setText(CHOICE_ASCENDING);
    }

    private void initSorttingArea() {
        refreshSortItems();
        if (selectedParameter == null) {
            setSortingDefault();
            sortKeyLabel.setEnabled(false);
            sortKeyChooser.setEnabled(false);
            sortDirectionLabel.setEnabled(false);
            sortDirectionChooser.setEnabled(false);
            return;
        }

        if (!selectedParameter.isFixedOrder()) {
            sortKeyLabel.setEnabled(true);
            sortKeyChooser.setEnabled(true);
            sortDirectionLabel.setEnabled(true);
            sortDirectionChooser.setEnabled(true);

            // String sortKey = selectedParameter.getSortBy( );
            // if ( sortKey == null
            // || sortKey.equals( DesignChoiceConstants.PARAM_SORT_VALUES_LABEL
            // ) )
            // {
            // sortKeyChooser.setText( CHOICE_DISPLAY_TEXT );
            // }
            // else
            // {
            // sortKeyChooser.setText( CHOICE_VALUE_COLUMN );
            // }
            String columnExp = selectedParameter.getSortByColumn();
            String columnName = getColumnName(columnExp);
            if (columnName != null && sortKeyChooser.indexOf(columnName) >= 0) {
                sortKeyChooser.setText(columnName);
            } else {
                sortKeyChooser.select(0);
            }

            String sortDirection = selectedParameter.getSortDirection();
            if (sortDirection == null || sortDirection.equals(DesignChoiceConstants.SORT_DIRECTION_ASC)) {
                sortDirectionChooser.setText(CHOICE_ASCENDING);
            } else {
                sortDirectionChooser.setText(CHOICE_DESCENDING);
            }
        } else {
            setSortingDefault();

            sortKeyLabel.setEnabled(true);
            sortKeyChooser.setEnabled(true);
            sortDirectionLabel.setEnabled(false);
            sortDirectionChooser.setEnabled(false);
        }
    }

    private void saveSortingProperties() {

        if (selectedParameter == null) {
            return;
        }

        if (sorttingArea != null && !sorttingArea.isDisposed() && sorttingArea.isVisible()) {
            try {

                if (sortKeyChooser.getText().equals(CHOICE_NONE)) {
                    selectedParameter.setFixedOrder(true);
                    selectedParameter.setSortBy(null);
                    selectedParameter.setSortDirection(null);
                    selectedParameter.setSortByColumn(null);
                } else {

                    selectedParameter.setFixedOrder(false);
                    selectedParameter.setSortBy(null);

                    selectedParameter.setSortByColumn(getExpression(sortKeyChooser.getText()));

                    if (sortDirectionChooser.getText().equals(CHOICE_ASCENDING)) {
                        selectedParameter.setSortDirection(DesignChoiceConstants.SORT_DIRECTION_ASC);
                    } else if (sortDirectionChooser.getText().equals(CHOICE_DESCENDING)) {
                        selectedParameter.setSortDirection(DesignChoiceConstants.SORT_DIRECTION_DESC);
                    }
                }
            } catch (SemanticException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else {
            try {
                selectedParameter.setProperty(ScalarParameterHandle.FIXED_ORDER_PROP, null);
            } catch (SemanticException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private String getExpression(String columnName) {
        if (columnName.equals(CHOICE_NONE)) {
            return null;
        }
        List columnList = getColumnList();
        for (Iterator iter = columnList.iterator(); iter.hasNext();) {
            ResultSetColumnHandle cachedColumn = (ResultSetColumnHandle) iter.next();
            if (cachedColumn.getColumnName().equals(columnName)) {
                return DEUtil.getExpression(cachedColumn);
            }
        }
        // return null;
        return columnName;
    }

    protected void refreshSortItems() {
        if (sortDirectionChooser == null || sortDirectionChooser.isDisposed()) {
            return;
        }
        sortKeyChooser.removeAll();
        sortKeyChooser.add(CHOICE_NONE);
        List columnList = getColumnList();
        for (Iterator iter = columnList.iterator(); iter.hasNext();) {
            ResultSetColumnHandle cachedColumn = (ResultSetColumnHandle) iter.next();
            sortKeyChooser.add(cachedColumn.getColumnName());
        }

    }

    private String getColumnName(String expression) {
        List columnList = getColumnList();
        for (Iterator iter = columnList.iterator(); iter.hasNext();) {
            ResultSetColumnHandle cachedColumn = (ResultSetColumnHandle) iter.next();
            if (DEUtil.getExpression(cachedColumn).equals(expression)) {
                return cachedColumn.getColumnName();
            }
        }
        // return null;
        return expression;
    }

    public String getSelectedExprValue(String value) {
        String exprValue = null;

        if (value == null) {
            return "null"; //$NON-NLS-1$
        } else {
            String dataType = getSelectedDataType();
            if (dataType == null)
                return "null"; //$NON-NLS-1$
            if (DesignChoiceConstants.COLUMN_DATA_TYPE_BOOLEAN.equals(dataType)
                    || DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER.equals(dataType)
                    || DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT.equals(dataType)) {
                exprValue = value;
            } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL.equals(dataType)) {
                exprValue = "new java.math.BigDecimal(\"" + value + "\")"; //$NON-NLS-1$ //$NON-NLS-2$
            } else {
                exprValue = "\"" //$NON-NLS-1$
                        + JavascriptEvalUtil.transformToJsConstants(value) + "\""; //$NON-NLS-1$
            }
        }

        return exprValue;
    }

    private void addDynamicDefaultValue() {
        if (isMultiple.isEnabled() && isMultiple.getSelection()) {
            String type = (String) defaultValueChooser.getData(ExpressionButtonUtil.EXPR_TYPE);
            String value = UIUtil.convertToModelString(defaultValueChooser.getText(), false);
            setFirstDefaultValue(value, type);
            refreshDynamicValueTable();
            defaultValueChooser.setFocus();
            defaultValueChooser.setText("");
        }
    }

    private void updateDynamicTableButtons() {
        StructuredSelection selection = (StructuredSelection) defaultValueViewer.getSelection();
        boolean enable = (selection.size() == 1);
        editValueBtn.setEnabled(enable);
        delValueBtn.setEnabled(!selection.isEmpty());
        delAllValuesBtn.setEnabled(defaultValueViewer.getTable().getItemCount() > 0);

        Expression expression = ExpressionButtonUtil.getExpression(defaultValueChooser);
        if (defaultValueChooser.getText().trim().length() == 0) {
            addValueButton.setEnabled(false);
        } else {
            if (defaultValueList != null && defaultValueList.contains(expression))
                addValueButton.setEnabled(false);
            else
                addValueButton.setEnabled(true);
        }
    }

    private void refreshDynamicValueTable() {
        if (defaultValueViewer != null && !defaultValueViewer.getTable().isDisposed()) {
            defaultValueViewer.refresh();
            updateDynamicTableButtons();
        }
    }

    private Expression getFirstDefaultValue() {
        if (defaultValueList != null && defaultValueList.size() > 0)
            return defaultValueList.get(0);
        return null;
    }

    private void setFirstDefaultValue(String value, String type) {
        if (defaultValueList == null) {
            defaultValueList = new ArrayList<Expression>();
            initDefaultValueViewer();
        }
        Expression expression = null;
        if (value != null)
            expression = new Expression(value, type);
        if (!defaultValueList.contains(expression))
            defaultValueList.add(0, expression);
        updateMessageLine();
        updateFormatField();
    }

    private void simpleDefaultValueList() {
        if (defaultValueList != null && defaultValueList.size() > 0) {
            Expression expression = getFirstDefaultValue();
            defaultValueList.clear();
            defaultValueList.add(expression);
        }
    }
}