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

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.ui.dialogs.InputParameterDialog.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.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

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.report.designer.internal.ui.util.IHelpContextIds;
import org.eclipse.birt.report.designer.internal.ui.util.UIUtil;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.ui.parameters.AbstractParameterGroup;
import org.eclipse.birt.report.designer.ui.parameters.CascadingParameterGroup;
import org.eclipse.birt.report.designer.ui.parameters.CheckBoxParameter;
import org.eclipse.birt.report.designer.ui.parameters.ComboBoxParameter;
import org.eclipse.birt.report.designer.ui.parameters.IParameter;
import org.eclipse.birt.report.designer.ui.parameters.IParameterAdapter;
import org.eclipse.birt.report.designer.ui.parameters.IParameterGroup;
import org.eclipse.birt.report.designer.ui.parameters.ListingParameter;
import org.eclipse.birt.report.designer.ui.parameters.ParameterUtil;
import org.eclipse.birt.report.designer.ui.parameters.RadioParameter;
import org.eclipse.birt.report.designer.ui.parameters.ScalarParameter;
import org.eclipse.birt.report.designer.ui.parameters.StaticTextParameter;
import org.eclipse.birt.report.engine.api.IParameterSelectionChoice;
import org.eclipse.birt.report.model.api.FormatValueHandle;
import org.eclipse.birt.report.model.api.PropertyHandle;
import org.eclipse.birt.report.model.api.ScalarParameterHandle;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.FormatValue;
import org.eclipse.birt.report.model.api.util.StringUtil;
import org.eclipse.birt.report.model.elements.interfaces.IScalarParameterModel;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import com.ibm.icu.util.ULocale;

/**
 * The dialog for inputting report parameter values when previewing report in
 * new preview prototype
 */
public class InputParameterDialog extends BaseDialog {

    private Composite contentPane;
    private ScrolledComposite scrollPane;

    private List params;
    private Map<String, Object> paramValues = new HashMap<String, Object>();
    private List<IParameterAdapter> paramAdatpers = new ArrayList();

    private List<IParameterControlHelper> controlHelpers = new ArrayList<IParameterControlHelper>();
    private Map<IParameter, SelectionParameterControlHelper> postCascadeParamLists = new HashMap<IParameter, SelectionParameterControlHelper>();

    public InputParameterDialog(Shell parentShell, List params, Map paramValues) {
        super(parentShell, Messages.getString("InputParameterDialog.msg.title")); //$NON-NLS-1$

        this.params = params;
        if (paramValues != null) {
            this.paramValues.putAll(paramValues);
        }
    }

    protected void okPressed() {

        if (!validateParameters()) {
            return;
        }

        if (!validateAdapters()) {
            return;
        }
        super.okPressed();
    }

    private boolean validateParameters() {
        for (IParameterControlHelper helper : controlHelpers) {
            if (!helper.validate()) {
                return false;
            }
        }
        return true;
    }

    private boolean validateAdapters() {
        for (IParameterAdapter adapter : this.paramAdatpers) {
            try {
                adapter.validate();
            } catch (BirtException e) {
                MessageDialog.openError(getShell(),
                        Messages.getString("InputParameterDialog.err.invalidValueTitle"), //$NON-NLS-1$
                        e.getMessage());
                return false;
            }
        }
        return true;
    }

    protected Control createDialogArea(Composite parent) {
        Composite composite = new Composite(parent, 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);
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
        applyDialogFont(composite);

        new Label(composite, SWT.NONE).setText(Messages.getString("InputParameterDialog.msg.requiredParam")); //$NON-NLS-1$

        scrollPane = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL);
        scrollPane.setExpandHorizontal(true);
        scrollPane.setExpandVertical(true);

        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 400;
        gd.heightHint = 400;
        scrollPane.setLayoutData(gd);

        createParameters();

        UIUtil.bindHelp(parent, IHelpContextIds.INPUT_PARAMETERS_DIALOG_ID);

        return composite;
    }

    private void createParameters() {
        if (contentPane != null && !contentPane.isDisposed()) {
            contentPane.dispose();
        }

        contentPane = new Composite(scrollPane, SWT.NONE);
        scrollPane.setContent(contentPane);
        contentPane.setLayoutData(new GridData(GridData.FILL_BOTH));
        contentPane.setLayout(new GridLayout());

        createParametersSection(params, contentPane);

        scrollPane.setMinSize(contentPane.computeSize(400, SWT.DEFAULT));
    }

    private void createParametersSection(List children, Composite parent) {
        Iterator iterator = children.iterator();
        while (iterator.hasNext()) {
            Object obj = iterator.next();
            if ((obj instanceof ScalarParameter && !((ScalarParameter) obj).getHandle().isHidden())) {
                ScalarParameter param = (ScalarParameter) obj;
                createParamSection(param, parent);
            } else if (obj instanceof IParameterAdapter) {
                IParameterAdapter adapterObj = (IParameterAdapter) obj;
                adapterObj.createControl(parent);
                paramAdatpers.add(adapterObj);
            } else if (obj instanceof AbstractParameterGroup) {
                AbstractParameterGroup group = (AbstractParameterGroup) obj;
                createParametersSection(group.getChildren(), createParamGroupSection(group, parent));
            }
        }
    }

    private Composite createParamGroupSection(AbstractParameterGroup paramGroup, Composite parent) {
        Group group = new Group(parent, SWT.NONE);
        group.setText(paramGroup.getHandle().getDisplayLabel());
        group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
        group.setLayout(new GridLayout());
        return group;
    }

    private Composite createParamSection(ScalarParameter param, Composite parent) {

        Composite container = createParamSectionContainer(parent);
        IParameterControlHelper helper = null;
        if (param instanceof StaticTextParameter) {
            helper = new StaticTextParameterControlHelper(this);

        } else if (param instanceof RadioParameter) {
            helper = new RadioParameterControlHelper(this);
        } else if (param instanceof CheckBoxParameter) {
            helper = new CheckBoxParameterControlHelper(this);
        } else if (param instanceof ListingParameter) {
            final ListingParameter listParam = (ListingParameter) param;
            if (DesignChoiceConstants.SCALAR_PARAM_TYPE_MULTI_VALUE.equals(listParam.getHandle().getParamType())) {
                helper = new ListParameterControlHelper(this);
            } else {
                helper = new ComboParameterControlHelper(this);
            }

        }

        helper.createControl(container, param, paramValues.get(param.getHandle().getName()));

        controlHelpers.add(helper);
        return container;
    }

    private Composite createParamSectionContainer(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        GridLayout layout = new GridLayout();
        container.setLayout(layout);

        return parent;
    }

    public Map getParameters() {
        for (IParameterControlHelper helper : controlHelpers) {
            this.paramValues.putAll(helper.getResults());
        }

        for (IParameterAdapter adapter : this.paramAdatpers) {
            this.paramValues.put(adapter.getName(), adapter.getValue());
        }
        return this.paramValues;
    }

    public Map<IParameter, SelectionParameterControlHelper> getPostParamLists() {
        return this.postCascadeParamLists;
    }

    public void addPostParamter(IParameter parameter, SelectionParameterControlHelper helper) {
        this.postCascadeParamLists.put(parameter, helper);
    }
}

class InternalParameterSelectionChoice implements IParameterSelectionChoice {

    private String _label;
    private Object _value;

    public InternalParameterSelectionChoice(String label, Object value) {
        this._label = label;
        this._value = value;
    }

    public Object getValue() {
        return _value;
    }

    public String getLabel() {
        return _label;
    }

}

enum InputParameterSelectionChoice implements IParameterSelectionChoice {
    NULLVALUECHOICE(IParameterControlHelper.NULL_VALUE_STR, null), BLANKVALUECHOICE(
            IParameterControlHelper.EMPTY_VALUE_STR, IParameterControlHelper.EMPTY_VALUE_STR);

    private final String _label;
    private final Object _value;

    InputParameterSelectionChoice(String label, Object value) {
        _label = label;
        _value = value;
    }

    public Object getValue() {
        return _value;
    }

    public String getLabel() {
        return _label;
    }
}

interface IParameterControlHelper {

    public static final String NULL_VALUE_STR = ParameterUtil.LABEL_NULL;
    public static final String EMPTY_VALUE_STR = "";//$NON-NLS-1$

    void createControl(Composite parent, Object parameter, Object lastValue);

    Map<String, Object> getResults();

    boolean validate();
}

abstract class AbstractParameterControlHelper implements IParameterControlHelper {

    protected Composite parent;
    protected ScalarParameter parameter;

    protected boolean isRequired = false;
    protected boolean needTypeCheck = false;
    protected String paramterHandleName;
    protected boolean isStringType = false;

    protected Map<String, Object> lastConfigValues = new HashMap<String, Object>();
    protected Object defaultValue;

    protected Label controlLabel;

    protected InputParameterDialog parameterDialog;

    public AbstractParameterControlHelper(InputParameterDialog dialog) {
        this.parameterDialog = dialog;
    }

    public void createControl(Composite parent, Object para, Object lastValue) {
        this.parent = parent;
        init(para, lastValue);

        prepare();

        createControlLabel();
        createParameterControl();
    }

    protected abstract void createParameterControl();

    protected void prepare() {

    }

    private void initLastValue(Object lastValue) {
        if (lastValue != null) {
            putConfigValue(paramterHandleName, lastValue);
        }
    }

    public Map<String, Object> getResults() {
        return lastConfigValues;
    }

    public boolean validate() {
        return validateRequiredItem() && validateDataType();
    }

    protected void putConfigValue(String key, Object value) {
        lastConfigValues.put(key, value);
    }

    protected void removeConfigValue(String key) {
        lastConfigValues.remove(key);
    }

    private boolean validateRequiredItem() {
        if (isRequired) {
            Object paramterValue = lastConfigValues.get(paramterHandleName);
            if (paramterValue == null
                    || (paramterValue instanceof String && StringUtil.isBlank((String) paramterValue))
                    || (paramterValue instanceof Object[] && ((Object[]) paramterValue).length == 0)) {
                MessageDialog.openError(parent.getShell(), "Error", Messages.getFormattedString(
                        "InputParameterDialog.err.requiredParam", new String[] { paramterHandleName })); //$NON-NLS-1$ //$NON-NLS-2$
                return false;
            }
        }
        return true;
    }

    private boolean validateDataType() {
        if (needTypeCheck) {
            Object paramValue = lastConfigValues.get(paramterHandleName);
            try {
                Object obj = parameter.converToDataType(paramValue);
                putConfigValue(paramterHandleName, obj);
            } catch (BirtException e) {
                MessageDialog.openError(parent.getShell(),
                        Messages.getString("InputParameterDialog.err.invalidValueTitle"), //$NON-NLS-1$
                        Messages.getFormattedString("InputParameterDialog.err.invalidValue", //$NON-NLS-1$
                                new String[] { paramValue.toString(), parameter.getHandle().getDataType() }));
                return false;
            }
        }
        return true;
    }

    private void init(Object para, Object lastValue) {
        parameter = (ScalarParameter) para;
        paramterHandleName = parameter.getHandle().getName();
        isRequired = parameter.getHandle().isRequired();
        isStringType = parameter.getHandle().getDataType().equals(DesignChoiceConstants.PARAM_TYPE_STRING);

        initLastValue(lastValue);
        prepareControlDefaultValue();
    }

    private void createControlLabel() {
        controlLabel = new Label(parent, SWT.NONE);
        controlLabel.setText(parameter.getHandle().getDisplayLabel() + (isRequired ? ": *" : ":")); //$NON-NLS-1$ //$NON-NLS-2$
    }

    private void prepareControlDefaultValue() {
        defaultValue = getPreSetValue();
    }

    /**
     * Only get first value,if default is Multiple values,should not use this
     * 
     * @param param
     * @return
     */
    private Object getPreSetValue() {
        Object value = null;

        if (parameter.getDefaultValues().size() > 0) {
            value = parameter.getDefaultValues().get(0);
        }

        if (lastConfigValues.containsKey(paramterHandleName)) {
            value = lastConfigValues.get(paramterHandleName);

            if (value != null) {
                parameter.setSelectionValue(value);
            }
        }

        return value;
    }

    protected String getFormatLabelString(IParameterSelectionChoice choice, ScalarParameter para) {
        Object value = choice.getValue();
        String label = choice.getLabel();
        if (label == null && value != null) {
            if (value instanceof Date) {
                label = formatDate2String(value);
            } else {
                label = String.valueOf(value);
            }
        }
        label = formatString(label, para);
        return label;
    }

    private String formatDate2String(Object value) {
        String result = value.toString();
        try {
            result = DataTypeUtil.toString(value);
        } catch (BirtException e) {
        }
        return result;
    }

    protected String formatString(String str, ScalarParameter para) {

        if (StringUtil.isBlank(str)) {
            return EMPTY_VALUE_STR;
        }

        ScalarParameterHandle paraHandle = para.getHandle();

        String formatPattern = convertFormatPattern(paraHandle);
        ULocale formatLocale = cvonvertFormatLocale(paraHandle);
        String type = paraHandle.getDataType();

        if (formatPattern == null) {
            return str;
        }
        String formatStr = EMPTY_VALUE_STR;
        try {
            if (DesignChoiceConstants.PARAM_TYPE_STRING.equals(type)) {
                formatStr = new StringFormatter(formatPattern, formatLocale).format(str);
            } else if (DesignChoiceConstants.PARAM_TYPE_DATETIME.equals(type)) {
                formatPattern = formatPattern.equals(DesignChoiceConstants.DATETIEM_FORMAT_TYPE_UNFORMATTED)
                        ? DateFormatter.DATETIME_UNFORMATTED
                        : formatPattern;
                formatStr = new DateFormatter(formatPattern, formatLocale)
                        .format((Date) para.converToDataType(str));
            } else if (DesignChoiceConstants.PARAM_TYPE_DATE.equals(type)) {
                formatPattern = formatPattern.equals(DesignChoiceConstants.DATE_FORMAT_TYPE_UNFORMATTED)
                        ? DateFormatter.DATE_UNFORMATTED
                        : formatPattern;
                formatStr = new DateFormatter(formatPattern, formatLocale)
                        .format((Date) para.converToDataType(str));
            } else if (DesignChoiceConstants.PARAM_TYPE_TIME.equals(type)) {
                formatPattern = formatPattern.equals("Unformatted") ? DateFormatter.TIME_UNFORMATTED //$NON-NLS-1$
                        : formatPattern;
                formatStr = new DateFormatter(formatPattern, formatLocale)
                        .format((Date) para.converToDataType(str));
            } else if (DesignChoiceConstants.PARAM_TYPE_DECIMAL.equals(type)
                    || DesignChoiceConstants.PARAM_TYPE_FLOAT.equals(type)) {
                double value = Double.parseDouble(str);
                if (Double.isInfinite(value))
                    formatStr = str;
                else {
                    if (DesignChoiceConstants.NUMBER_FORMAT_TYPE_UNFORMATTED.equals(formatPattern)) {
                        formatPattern = null;
                    }
                    formatStr = new NumberFormatter(formatPattern, formatLocale).format(value);
                }
            } else if (DesignChoiceConstants.PARAM_TYPE_INTEGER.equals(type)) {
                int value = Integer.parseInt(str);
                formatStr = new NumberFormatter(formatPattern, formatLocale).format(value);
            }
        } catch (Exception e) {
            formatStr = str;
        }
        if (formatStr == null) {
            return str;
        }
        return UIUtil.convertToGUIString(formatStr);
    }

    private String convertFormatPattern(ScalarParameterHandle paraHandle) {
        String formatCategroy = paraHandle.getCategory();
        String formatPattern = paraHandle.getPattern();

        formatPattern = isCustom(formatCategroy) ? formatPattern : formatCategroy;
        return formatPattern;
    }

    private ULocale cvonvertFormatLocale(ScalarParameterHandle paraHandle) {
        ULocale formatLocale = null;
        Object formatValue = paraHandle.getProperty(IScalarParameterModel.FORMAT_PROP);
        if (formatValue instanceof FormatValue) {
            PropertyHandle propHandle = paraHandle.getPropertyHandle(IScalarParameterModel.FORMAT_PROP);
            FormatValue formatValueToSet = (FormatValue) formatValue;
            FormatValueHandle formatHandle = (FormatValueHandle) formatValueToSet.getHandle(propHandle);
            formatLocale = formatHandle.getLocale();
        }
        if (formatLocale == null) {
            formatLocale = ULocale.getDefault();
        }
        return formatLocale;
    }

    private boolean isCustom(String formatCategroy) {
        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;
    }
}

class StaticTextParameterControlHelper extends AbstractParameterControlHelper {

    public StaticTextParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    private Text input = null;

    protected void prepare() {
        needTypeCheck = true;
    }

    protected void createParameterControl() {
        createText();
    }

    private void createText() {
        input = new Text(parent, parameter.getHandle().isConcealValue() ? SWT.BORDER | SWT.PASSWORD : SWT.BORDER);
        input.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        input.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                Text input = (Text) e.getSource();
                putConfigValue(paramterHandleName, input.getText());
            }
        });
        input.setText(getTextDefaultValue());
    }

    private String getTextDefaultValue() {
        String result = EMPTY_VALUE_STR;
        try {
            result = DataTypeUtil.toString(defaultValue);
        } catch (BirtException e) {
        }
        return formatString(result, parameter);
    }

}

class CheckBoxParameterControlHelper extends AbstractParameterControlHelper {

    public CheckBoxParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    protected void createParameterControl() {
        createCheckBox();
    }

    private void createCheckBox() {
        parent.setLayout(GridLayoutFactory.fillDefaults().numColumns(2).create());
        controlLabel.setLayoutData(GridDataFactory.fillDefaults().span(2, 1).create());

        Button btnCheck = new Button(parent, SWT.CHECK);
        btnCheck.setText(Messages.getString("InputParameterDialog.boolean.checked"));
        btnCheck.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                Button button = (Button) e.getSource();
                putConfigValue(paramterHandleName, button.getSelection());
            }
        });

        if (isTrue(defaultValue)) {
            btnCheck.setSelection(true);
        }

        putConfigValue(paramterHandleName, btnCheck.getSelection());
    }

    private boolean isTrue(Object value) {
        if (value == null) {
            return false;
        }
        return Boolean.valueOf(value.toString());
    }
}

class RadioParameterControlHelper extends AbstractParameterControlHelper {

    public RadioParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    protected void createParameterControl() {
        doCreateRadioParameter();
    }

    protected void prepare() {
        needTypeCheck = true;
        list = parameter.getValueList();

        boolean isContainNull = false;
        for (IParameterSelectionChoice choice : list) {
            if (InputParameterSelectionChoice.BLANKVALUECHOICE.getValue().equals(choice.getValue())) {
                isContainNull = true;
            }
        }

        if (!isRequired && !isContainNull) {
            list.add(InputParameterSelectionChoice.NULLVALUECHOICE);
        }
    }

    private List<IParameterSelectionChoice> list;
    private List<Button> radioItems = new ArrayList<Button>();

    private void doCreateRadioParameter() {
        for (int i = 0; i < list.size(); i++) {
            if (i > 0) {
                new Label(parent, SWT.NONE);
            }
            IParameterSelectionChoice choice = list.get(i);
            String choiceLabel = getChoiceLabel(choice);
            Button button = createRadioButton(choiceLabel, choice.getValue());
            initRadioButton(button, choice, choiceLabel);

        }
    }

    private void initRadioButton(Button button, IParameterSelectionChoice choice, String choiceLabel) {
        if ((choice.getValue() == defaultValue)
                || (choice.getValue() != null && choice.getValue().equals(defaultValue))) {
            button.setSelection(true);
            putConfigValue(paramterHandleName, button.getData());
            clearSelectRadio(radioItems);
        } else if (defaultValue == null && choiceLabel.equals(InputParameterSelectionChoice.NULLVALUECHOICE)) {
            button.setSelection(true);
            removeConfigValue(paramterHandleName);
            clearSelectRadio(radioItems);
        }
        radioItems.add(button);
    }

    private String getChoiceLabel(IParameterSelectionChoice choice) {
        String choiceLabel = choice.getLabel();
        if (choiceLabel == null) {
            choiceLabel = choice.getValue() == null ? NULL_VALUE_STR : getFormatLabelString(choice, parameter);
        }
        return choiceLabel;
    }

    private Button createRadioButton(String labelText, Object buttonData) {
        Button button = new Button(parent, SWT.RADIO);
        button.setText(labelText);
        button.setData(buttonData);
        button.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                Button button = (Button) e.getSource();
                putConfigValue(paramterHandleName, button.getData());
            }
        });
        return button;
    }

    private void clearSelectRadio(List<Button> radioItems) {
        for (Button b : radioItems) {
            b.setSelection(false);
        }
    }
}

abstract class SelectionParameterControlHelper extends AbstractParameterControlHelper {

    private boolean performed = false;
    boolean isCascade = false;

    protected List<IParameterSelectionChoice> valueList = new ArrayList<IParameterSelectionChoice>();
    private boolean isCascadeGroup;
    private CascadingParameterGroup cascadeGroup;

    protected List<String> controlResetItems = new ArrayList<String>();

    public SelectionParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    abstract Control getControl();

    protected void prepare() {
        super.prepare();
        prepareValueList();
        initCascadeGroup();
    }

    private void initCascadeGroup() {
        if (parameter.getParentGroup() instanceof CascadingParameterGroup) {
            isCascadeGroup = true;
            cascadeGroup = (CascadingParameterGroup) parameter.getParentGroup();
        }
    }

    protected void cascadingParamValueChanged(CascadingParameterGroup group, ScalarParameter listParam) {

        if (listParam == null) {
            return;
        }

        if (getPostParamList().containsKey(listParam)) {
            copeWithCurrentParameter(listParam);
            ScalarParameter postParam = copeWithNextParameter(group, listParam);
            cascadingParamValueChanged(group, postParam);
        }
    }

    private void copeWithCurrentParameter(ScalarParameter currentParam) {
        Object value = lastConfigValues.get(currentParam.getHandle().getName());
        currentParam.setSelectionValue(value);
    }

    private ScalarParameter copeWithNextParameter(CascadingParameterGroup group, ScalarParameter listParam) {
        ScalarParameter postParam = (ListingParameter) group.getPostParameter(listParam);
        if (postParam == null) {
            return null;
        }
        SelectionParameterControlHelper helper = getPostParamList().get(listParam);
        helper.emptyControlItem();

        Control control = helper.getControl();
        int itemIndex = 0;
        for (Iterator iterator = postParam.getValueList().iterator(); iterator.hasNext();) {
            IParameterSelectionChoice choice = (IParameterSelectionChoice) iterator.next();
            if (choice.getValue() == null) {
                continue;
            }

            String label = getFormatLabelString(choice, listParam);
            if (label != null) {
                itemIndex = addControlItem(control, label);
                if (control instanceof Combo) {
                    control.setData(String.valueOf(itemIndex), choice.getValue());
                } else {
                    control.setData(label, choice.getValue());
                }
            }
        }

        processPostParator(postParam, control);
        return postParam;
    }

    private int addControlItem(Control control, String item) {
        int itemIndex = 0;
        if (control instanceof Combo) {
            ((Combo) control).add(item);
            itemIndex = ((Combo) control).getItemCount() - 1;
        }
        if (control instanceof org.eclipse.swt.widgets.List) {
            ((org.eclipse.swt.widgets.List) control).add(item);
            itemIndex = ((org.eclipse.swt.widgets.List) control).getItemCount() - 1;
        }
        return itemIndex;
    }

    private void processPostParator(ScalarParameter listParam, Control control) {
        Object value = lastConfigValues.get(listParam.getHandle().getName());
        boolean found = false;
        if (control instanceof Combo) {
            Combo combo = (Combo) control;
            found = dealWithValueInComboList(-1, value, combo, listParam);

            if (!found) {
                try {
                    Object obj = listParam.converToDataType(listParam.getDefaultObject());
                    if (obj == null) {
                        listParam.setSelectionValue(null);
                        putConfigValue(listParam.getHandle().getName(), null);
                    } else {
                        boolean isCascade = isCascadeParameter(listParam);
                        dealWithValueNotInComboList(obj, combo, listParam, isCascade, combo.getItems());
                    }
                } catch (BirtException e) {
                    //
                }

            }
        }
        if (control instanceof org.eclipse.swt.widgets.List) {
            org.eclipse.swt.widgets.List list = (org.eclipse.swt.widgets.List) control;
            initListValue(value, list, listParam);
        }
    }

    /**
     * If the combo is cascade then: If the value in the combo data list: then
     * select the value else: then select the first item if items exists else :
     * then set the value to combo
     * 
     * @param value
     * @param combo
     * @param listParam
     * @param isCascade
     * @param comboData
     */
    private void dealWithValueNotInComboList(Object value, Combo combo, ScalarParameter listParam,
            boolean isCascade, Object comboData) {
        if (!isCascade || (isCascade && isContainValue(listParam.getDefaultObject(), comboData))) {
            combo.setText(value == null ? NULL_VALUE_STR : value.toString());
            listParam.setSelectionValue(combo.getText());
            putConfigValue(listParam.getHandle().getName(), combo.getText());
        } else {
            if (combo.getItemCount() > 0) {
                combo.select(0);
                listParam.setSelectionValue(combo.getText());
                putConfigValue(listParam.getHandle().getName(),
                        combo.getData(String.valueOf(combo.getSelectionIndex())));
            } else {
                putConfigValue(listParam.getHandle().getName(), null);
            }

        }
    }

    /**
     * 
     * set the default selected item in combo
     * 
     * @param selectIndex
     *            :indicate which item will be selected
     * @param combo
     *            : Combo
     * 
     */
    protected void setSelectValueAfterInitCombo(int selectIndex, Combo combo) {
        boolean found = dealWithValueInComboList(selectIndex, defaultValue, combo, parameter);
        if (!found) {
            dealWithValueNotInComboList(defaultValue, combo, parameter, isCascade, valueList);
        }
    }

    /**
     * If value in combo data list ,then select it and return true; else do
     * nothing and return false
     * 
     * @param selectIndex
     *            : indicate which item will be selected
     * @param value
     *            : the value which will be selected
     * @param combo
     * @param listParam
     * @return
     */

    private boolean dealWithValueInComboList(int selectIndex, Object value, Combo combo,
            ScalarParameter listParam) {
        boolean found = false;
        if (selectIndex > 0) {
            combo.select(selectIndex);
            putConfigValue(listParam.getHandle().getName(),
                    combo.getData(String.valueOf(combo.getSelectionIndex())));
            listParam.setSelectionValue(lastConfigValues.get(listParam.getHandle().getName()));
            found = true;
            return found;
        }
        for (int i = 0; i < combo.getItemCount(); i++) {
            Object data = combo.getData(String.valueOf(i));
            if (value == data || (value != null && value.equals(data))) {
                combo.select(i);
                putConfigValue(listParam.getHandle().getName(),
                        combo.getData(String.valueOf(combo.getSelectionIndex())));
                listParam.setSelectionValue(lastConfigValues.get(listParam.getHandle().getName()));
                found = true;
                break;
            }
        }
        return found;
    }

    protected void initListValue(Object value, org.eclipse.swt.widgets.List list, ScalarParameter listParam) {
        List<Object> newValueList = new ArrayList<Object>();
        List<Object> oldvalueList = new ArrayList<Object>();

        if (value instanceof Object[]) {
            oldvalueList = Arrays.asList((Object[]) value);
        } else {
            oldvalueList.add(value);
        }

        for (int i = 0; i < list.getItemCount(); i++) {
            Object item = list.getData(list.getItem(i));
            if (oldvalueList.indexOf(item) >= 0) {
                list.select(i);
                newValueList.add(list.getData(list.getItem(i)));
            }
        }
        putConfigValue(listParam.getHandle().getName(), newValueList.toArray(new Object[newValueList.size()]));
    }

    protected void doWithCascadeGroup() {
        if (isCascadeGroup) {
            if (cascadeGroup.getPostParameter(parameter) != null) {
                cascadingParamValueChanged(cascadeGroup, parameter);
            }
        }
    }

    protected void prepareValueList() {
        boolean containsBlank = false;
        boolean containsNull = false;

        for (Object o : parameter.getValueList()) {
            Object choiceValue = ((IParameterSelectionChoice) o).getValue();
            if (InputParameterSelectionChoice.BLANKVALUECHOICE.getValue().equals(choiceValue))
                containsBlank = true;
            if (null == choiceValue)
                containsNull = true;
        }

        if (isStringType && !isRequired && !containsBlank) {
            valueList.add(InputParameterSelectionChoice.BLANKVALUECHOICE);
        }
        valueList.addAll(parameter.getValueList());

        dealCascade();

        if (!isRequired && !containsNull) {
            valueList.add(InputParameterSelectionChoice.NULLVALUECHOICE);
        }
    }

    /**
     * If parameter is in cascade group and the parameter not the first item in
     * group : then do nothing; else then if default value not in value
     * list,then add it to value list.
     */
    private void dealCascade() {
        isCascade = isCascadeParameter(parameter);
        if (!isCascade) {
            addDefaultToValueList(formatString(parameter.getDefaultValue(), parameter),
                    parameter.getDefaultObject(), valueList);
        }
    }

    /**
     * If defaultValue is not null and it is in the list, then construct a new
     * SelectionChoice with defaultValue and add it to the list
     * 
     * @param defaultValueLabel
     * @param defaultValue
     * @param list
     */
    private void addDefaultToValueList(final String defaultValueLabel, final Object defaultValue, List list) {
        if (performed) {
            return;
        }
        boolean contains = isContainValue(defaultValue, list);

        if (!contains && defaultValue != null) {
            IParameterSelectionChoice choice = new InternalParameterSelectionChoice(defaultValueLabel,
                    defaultValue);
            list.add(choice);
        }
        performed = true;
    }

    /**
     * To check that whether the defaultValue is in the value list If in
     * list,return true;else return false.
     * 
     * @param defaultValue
     * @param list
     * @return
     */
    private boolean isContainValue(Object defaultValue, List list) {
        boolean result = false;
        for (int i = 0; i < list.size(); i++) {
            Object obj = ((IParameterSelectionChoice) (list.get(i))).getValue();
            if (obj != null && obj.equals(defaultValue)) {
                result = true;
                break;
            }
        }
        return result;
    }

    private boolean isContainValue(Object defaultValue, String[] items) {
        for (int i = 0; i < items.length; i++) {
            if (defaultValue == items[i] || defaultValue.equals(items[i])) {
                return true;
            }
        }
        return false;
    }

    /**
     * If the value is in the data,return true;else return false
     * 
     * @param value
     * @param comboData
     * @return
     */
    protected boolean isContainValue(Object value, Object data) {
        boolean result = false;
        if (data instanceof List) {
            result = isContainValue(value, (List) data);
        } else if (data instanceof String[]) {
            result = isContainValue(value, (String[]) data);
        }
        return result;

    }

    /**
     * test whether this ScalarParameter is used in cascade group If the param
     * is the first item of group,then return false.
     * 
     * @param listParam
     * @return
     */
    private boolean isCascadeParameter(ScalarParameter param) {
        boolean result = false;
        IParameterGroup group = param.getParentGroup();
        if (group != null && group instanceof CascadingParameterGroup) {
            List child = param.getParentGroup().getChildren();
            if (child != null && child.size() > 1) {
                for (int i = 1; i < child.size(); i++) {
                    if (param.equals(child.get(i))) {
                        result = true;
                        break;
                    }
                }
            }
        }
        return result;
    }

    protected void addCascadeParamterRelation() {
        if (isCascadeGroup) {
            if (cascadeGroup.getPreParameter(parameter) != null) {
                parameterDialog.addPostParamter(cascadeGroup.getPreParameter(parameter), this);
            }
        }
    }

    private Map<IParameter, SelectionParameterControlHelper> getPostParamList() {
        return parameterDialog.getPostParamLists();
    }

    protected void addItemForControlReset(String data) {
        if (EMPTY_VALUE_STR.equals(data) || NULL_VALUE_STR.equals(data)) {
            controlResetItems.add(0, data);
        }
    }

    private void emptyControlItem() {
        if (getControl() instanceof Combo) {
            ((Combo) getControl()).setItems(controlResetItems.toArray(new String[controlResetItems.size()]));
        } else if (getControl() instanceof org.eclipse.swt.widgets.List) {
            ((org.eclipse.swt.widgets.List) getControl())
                    .setItems(controlResetItems.toArray(new String[controlResetItems.size()]));
        }
    }
}

class ComboParameterControlHelper extends SelectionParameterControlHelper {

    public ComboParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    private Combo combo;

    Control getControl() {
        return combo;
    }

    protected void createParameterControl() {
        createCombo();
    }

    private void createCombo() {
        createRawCombo();
        initCombo();
    }

    private void createRawCombo() {
        int style = SWT.BORDER;
        if (!(parameter instanceof ComboBoxParameter)) {
            style |= SWT.READ_ONLY;
        }
        combo = new Combo(parent, style);
        combo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        combo.setVisibleItemCount(30);

        combo.addFocusListener(new FocusListener() {

            public void focusGained(FocusEvent e) {

            }

            public void focusLost(FocusEvent e) {
                if (!(parameter instanceof ComboBoxParameter)) {
                    return;
                }
                Combo combo = (Combo) e.getSource();
                if (combo.indexOf(combo.getText()) < 0) {
                    try {
                        putConfigValue(paramterHandleName, parameter.converToDataType(combo.getText()));
                    } catch (BirtException e1) {
                        MessageDialog.openError(combo.getShell(),
                                Messages.getString("InputParameterDialog.err.invalidValueTitle"), //$NON-NLS-1$
                                Messages.getFormattedString("InputParameterDialog.err.invalidValue", //$NON-NLS-1$
                                        new String[] { combo.getText(), parameter.getHandle().getDataType() }));
                        return;
                    }
                } else {
                    putConfigValue(paramterHandleName,
                            combo.getData(String.valueOf(combo.indexOf(combo.getText()))));
                }

                // doWithCascadeGroup();
            }
        });

        combo.addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                Combo combo = (Combo) e.getSource();
                if (combo.getSelectionIndex() != -1) {
                    putConfigValue(paramterHandleName, combo.getData(String.valueOf(combo.getSelectionIndex())));
                }
                doWithCascadeGroup();
            }
        });
    }

    private void initCombo() {
        int selectIndex = -1;
        boolean nullAdded = false;

        // add data to combo,compare whether the default value in data list
        for (IParameterSelectionChoice choice : valueList) {
            String label = getFormatLabelString(choice, parameter);
            if (choice.getValue() == null && choice.getLabel() == null) {
                if (!isRequired && !nullAdded) {
                    combo.add(NULL_VALUE_STR);
                    combo.setData(String.valueOf(combo.getItemCount() - 1), null);
                    addItemForControlReset(NULL_VALUE_STR);
                    nullAdded = true;
                }
            } else {
                combo.add(label);
                combo.setData(String.valueOf(combo.getItemCount() - 1), choice.getValue());

                addItemForControlReset(label);
                // If this choice is the default value,mark current choice index
                if (choice.getValue() != null && choice.getValue().equals(defaultValue) && choice.getLabel() != null
                        && !choice.getLabel().equals(InputParameterSelectionChoice.BLANKVALUECHOICE.getValue())) {
                    selectIndex = combo.getItemCount() - 1;
                }
            }
        }

        if (defaultValue == null) {
            if (!isRequired) {
                combo.select(combo.getItemCount() - 1);
            }
            parameter.setSelectionValue(null);
            putConfigValue(paramterHandleName, null);
        } else {
            setSelectValueAfterInitCombo(selectIndex, combo);
        }

        // deal cascade
        addCascadeParamterRelation();
    }

}

class ListParameterControlHelper extends SelectionParameterControlHelper {

    private ListViewer listViewer;

    Control getControl() {
        return listViewer.getList();
    }

    public ListParameterControlHelper(InputParameterDialog dialog) {
        super(dialog);
    }

    protected void createParameterControl() {
        initControlLabelLayout();
        createListParamer();
    }

    public void createListParamer() {
        createRawListViewer();
        initListViewer();
    }

    private void initControlLabelLayout() {
        GridData labelLayout = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
        controlLabel.setLayoutData(labelLayout);
    }

    private void createRawListViewer() {
        listViewer = new ListViewer(parent);
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.heightHint = 70;
        listViewer.getList().setLayoutData(gd);

        listViewer.getList().addSelectionListener(new SelectionListener() {

            public void widgetDefaultSelected(SelectionEvent e) {
            }

            public void widgetSelected(SelectionEvent e) {
                org.eclipse.swt.widgets.List list = (org.eclipse.swt.widgets.List) e.getSource();

                String[] strs = list.getSelection();
                if (strs != null && strs.length > 0) {
                    Object[] selectDatas = new Object[strs.length];
                    for (int i = 0; i < strs.length; i++) {
                        selectDatas[i] = list.getData(strs[i]);
                    }
                    putConfigValue(paramterHandleName, selectDatas);
                } else {
                    removeConfigValue(paramterHandleName);
                }

                doWithCascadeGroup();
            }
        });
    }

    private void initListViewer() {
        for (Iterator iterator = valueList.iterator(); iterator.hasNext();) {
            IParameterSelectionChoice choice = (IParameterSelectionChoice) iterator.next();
            String label = getFormatLabelString(choice, parameter);
            if (label != null) {
                listViewer.getList().add(label);
                listViewer.getList().setData(label, choice.getValue());
                addItemForControlReset(label);
            }
        }

        if (defaultValue == null && !isRequired) {
            listViewer.getList().select(listViewer.getList().getItemCount() - 1);
        } else {
            initListValue(defaultValue, listViewer.getList(), parameter);
        }

        addCascadeParamterRelation();
    }
}