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

Java tutorial

Introduction

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

Source

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

package org.eclipse.birt.report.designer.internal.ui.dialogs;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.eclipse.birt.report.data.adapter.api.DataModelAdapterStatus;
import org.eclipse.birt.report.data.adapter.api.DataModelAdapterUtil;
import org.eclipse.birt.report.designer.data.ui.util.DataUtil;
import org.eclipse.birt.report.designer.internal.ui.extension.ExtendedDataModelUIAdapterHelper;
import org.eclipse.birt.report.designer.internal.ui.util.ExceptionHandler;
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.dialogs.BaseDialog;
import org.eclipse.birt.report.designer.ui.dialogs.ExpressionProvider;
import org.eclipse.birt.report.designer.ui.views.ElementAdapterManager;
import org.eclipse.birt.report.designer.ui.views.ProviderFactory;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.model.api.ComputedColumnHandle;
import org.eclipse.birt.report.model.api.DataItemHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.ReportItemHandle;
import org.eclipse.birt.report.model.api.TableHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;

/**
 * DataColumnBindingDialog
 */
public class DataColumnBindingDialog extends BaseDialog {

    protected static final String DEFAULT_ITEM_NAME = "data column"; //$NON-NLS-1$

    protected static final String NEW_DATAITEM_TITLE = Messages
            .getString("DataColumBindingDialog.title.CreateNewDataBinding"); //$NON-NLS-1$

    protected static final String EDIT_DATAITEM_TITLE = Messages
            .getString("DataColumBindingDialog.title.EditDataBinding"); //$NON-NLS-1$

    protected static final String AGG_BUILDER_TITLE = Messages.getString("DataColumBindingDialog.title.AggBuilder"); //$NON-NLS-1$
    protected static final String TIMEPERIOD_BUILDER_TITLE = Messages
            .getString("DataColumnBindingDialog.title.TimePeriodBuild"); //$NON-NLS-1$

    IBindingDialogHelper dialogHelper;

    private ReportItemHandle bindingObject;

    private ComputedColumnHandle bindingColumn;

    private ExpressionProvider expressionProvider;

    private boolean isAggregate;
    private boolean isMeasure;
    private boolean isTimePeriod;

    private boolean needPrompt = true;

    private boolean isLinkModelTimePeriod = false;

    public boolean isNeedPrompt() {
        return needPrompt;
    }

    public void setNeedPrompt(boolean needPrompt) {
        this.needPrompt = needPrompt;
    }

    private boolean bindSelf = false;

    public DataColumnBindingDialog(boolean isCreateNew) {
        super(isCreateNew == true ? NEW_DATAITEM_TITLE : EDIT_DATAITEM_TITLE);
    }

    public DataColumnBindingDialog(boolean isCreateNew, boolean bindSelf) {
        super(isCreateNew == true ? NEW_DATAITEM_TITLE : EDIT_DATAITEM_TITLE);
        this.bindSelf = bindSelf;
    }

    public void setInput(ReportItemHandle input) {
        setInput(input, null);
    }

    public DesignElementHandle getBindingObject() {
        return bindingObject;
    }

    public ComputedColumnHandle getBindingColumn() {
        return this.bindingColumn;
    }

    public void setInput(ReportItemHandle bindingObject, ComputedColumnHandle bindingColumn, Object container) {
        this.bindingObject = bindingObject;
        // setAggregateOns( DEUtil.getGroups( input ) );
        // setDataTypes( ChoiceSetFactory.getDisplayNamefromChoiceSet(
        // DATA_TYPE_CHOICE_SET ) );
        this.bindingColumn = bindingColumn;
        // try
        // {
        // if ( isCreateNew || bindingColumn == null )
        // {
        // createColumnName( input, DEFAULT_ITEM_NAME );
        // setTypeSelect( dataTypes[0] );
        // }
        // else
        // {
        // // Add data set items.
        //
        // setName( bindingColumn.getName( ) );
        // setDisplayName( bindingColumn.getDisplayName( ) );
        // setTypeSelect( DATA_TYPE_CHOICE_SET.findChoice(
        // bindingColumn.getDataType( ) )
        // .getDisplayName( ) );
        // setExpression( bindingColumn.getExpression( ) );
        // //setAggregateOnSelect( bindingColumn.getAggregateOn( ) );
        // }
        //
        // }
        // catch ( Exception e )
        // {
        // ExceptionHandler.handle( e );
        // }

        dialogHelper = (IBindingDialogHelper) ElementAdapterManager
                .getAdapter(DEUtil.getBindingHolder(bindingObject), IBindingDialogHelper.class);

        isTableAddTimeDemision(bindingObject, bindingColumn);
        if (isLinkModelTimePeriod) {
            dialogHelper = (IBindingDialogHelper) ElementAdapterManager.getAdapter(this,
                    IBindingDialogHelper.class);
        }
        if (dialogHelper == null) {
            // use default helper.
            dialogHelper = new BindingDialogHelper();
        }

        IBindingDialogHelper helperHelper = (IBindingDialogHelper) ElementAdapterManager.getAdapter(dialogHelper,
                IBindingDialogHelper.class);
        if (helperHelper != null) {
            dialogHelper = helperHelper;
        }

        dialogHelper.setEditModal(isEditModal());

        if (!bindSelf)
            dialogHelper.setBindingHolder(DEUtil.getBindingHolder(bindingObject));
        else
            dialogHelper.setBindingHolder(bindingObject);
        dialogHelper.setBinding(bindingColumn);
        dialogHelper.setContainer(container);
        dialogHelper.setDialog(this);
        if (isAggregate) {
            dialogHelper.setAggregate(isAggregate);
        }
        if (isMeasure) {
            dialogHelper.setMeasure(isMeasure);
        }

        if (isAggregate
                || (bindingColumn != null && bindingColumn.getAggregateFunction() != null
                        && !bindingColumn.getAggregateFunction().equals("")) //$NON-NLS-1$
                || (bindingColumn != null && bindingColumn.getAggregateOn() != null
                        && !bindingColumn.getAggregateOn().equals(""))) //$NON-NLS-1$
        {
            setTitle(AGG_BUILDER_TITLE);
        }
        if (isTimePeriod) {
            dialogHelper.setTimePeriod(isTimePeriod);

        }

        if (isTimePeriod || isEditTimePeriod()) {
            setTitle(TIMEPERIOD_BUILDER_TITLE);
        }
    }

    private void isTableAddTimeDemision(ReportItemHandle bindingObject, ComputedColumnHandle bindingColumn) {
        if (DEUtil.getBindingHolder(bindingObject) instanceof TableHandle) {
            if (bindingColumn != null && bindingColumn.getTimeDimension() != null
                    && !"".equals(bindingColumn.getTimeDimension())) {
                isLinkModelTimePeriod = true;
            }
        }
    }

    private boolean isEditTimePeriod() {
        return (bindingColumn != null && bindingColumn.getTimeDimension() != null
                && !bindingColumn.getTimeDimension().equals("")); //$NON-NLS-1$
    }

    public void setInput(ReportItemHandle bindingObject, ComputedColumnHandle bindingColumn) {
        this.setInput(bindingObject, bindingColumn, null);
    }

    public void setAggreate(boolean isAggregate) {
        this.isAggregate = isAggregate;
        if (isAggregate) {
            setTitle(AGG_BUILDER_TITLE);
        }
        if (this.dialogHelper != null) {
            this.dialogHelper.setAggregate(isAggregate);
        }
    }

    public void setMeasure(boolean isMeasure) {
        this.isMeasure = isMeasure;
        if (isMeasure) {
            setTitle(AGG_BUILDER_TITLE);
        }
        if (this.dialogHelper != null) {
            this.dialogHelper.setMeasure(isMeasure);
        }
    }

    public void setTimePeriod(boolean timePeriod) {
        this.isTimePeriod = timePeriod;
        if (isTimePeriod) {
            dialogHelper.setTimePeriod(isTimePeriod);
            setTitle(TIMEPERIOD_BUILDER_TITLE);
        }
        if (this.dialogHelper != null) {
            this.dialogHelper.setTimePeriod(timePeriod);
        }
    }

    public void setExpressionProvider(ExpressionProvider expressionProvider) {
        this.expressionProvider = expressionProvider;
    }

    protected boolean isForceBinding() {
        return true;
    }

    protected Control createDialogArea(Composite parent) {

        Composite composite = (Composite) super.createDialogArea(parent);
        ScrolledComposite sc = new ScrolledComposite(composite, SWT.V_SCROLL);
        sc.setAlwaysShowScrollBars(false);
        sc.setExpandHorizontal(true);
        sc.setLayoutData(new GridData(GridData.FILL_BOTH));

        Composite content = new Composite(sc, SWT.NONE);
        sc.setContent(content);
        content.setLayout(new GridLayout());

        // sc.setBackground( Display.getCurrent( ).getSystemColor(
        // SWT.COLOR_BLACK ) );
        // content.setBackground( Display.getCurrent( ).getSystemColor(
        // SWT.COLOR_BLUE ) );
        // composite.setBackground( Display.getCurrent( ).getSystemColor(
        // SWT.COLOR_RED ) );

        dialogHelper.setExpressionProvider(expressionProvider);
        dialogHelper.createContent(content);
        UIUtil.bindHelp(content, isTimePeriod || isEditTimePeriod() ? IHelpContextIds.RELATIVE_TIME_PERIOD_DIALOG
                : IHelpContextIds.DATA_COLUMN_BINDING_DIALOG);
        return content;
    }

    protected void okPressed() {
        try {
            ComputedColumnHandle newBindingColumn = null;
            if (bindingColumn != null) {
                if (dialogHelper.differs(bindingColumn)) {
                    if (isNeedPrompt() && isBindingMultipleReferenced()) {
                        MessageDialog dialog = new MessageDialog(UIUtil.getDefaultShell(),
                                Messages.getString("DataColumnBindingDialog.NewBindingDialogTitle"), //$NON-NLS-1$
                                null, Messages.getString("DataColumnBindingDialog.NewBindingDialogMessage"), //$NON-NLS-1$
                                MessageDialog.QUESTION,
                                new String[] {
                                        Messages.getString("DataColumnBindingDialog.NewBindingDialogButtonYes"), //$NON-NLS-1$
                                        Messages.getString("DataColumnBindingDialog.NewBindingDialogButtonNo"), //$NON-NLS-1$
                                        Messages.getString("DataColumnBindingDialog.NewBindingDialogButtonCancel") //$NON-NLS-1$
                                }, 0);
                        int dialogClick = dialog.open();
                        if (dialogClick == 0) {
                            InputDialog inputDialog = new InputDialog(UIUtil.getDefaultShell(),
                                    Messages.getString("DataColumnBindingDialog.NewBindingDialogInputNewNameTitle"), //$NON-NLS-1$
                                    Messages.getString(
                                            "DataColumnBindingDialog.NewBindingDialogInputNewNameMessage"), //$NON-NLS-1$
                                    "", //$NON-NLS-1$
                                    new IInputValidator() {

                                        public String isValid(String newText) {

                                            for (Iterator iterator = DEUtil.getBindingHolder(bindingObject)
                                                    .getColumnBindings().iterator(); iterator.hasNext();) {
                                                ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator
                                                        .next();
                                                if (computedColumn.getName().equals(newText)) {
                                                    return Messages.getFormattedString(
                                                            "BindingDialogHelper.error.nameduplicate", //$NON-NLS-1$
                                                            new Object[] { newText });
                                                }
                                            }
                                            return null;
                                        }
                                    });
                            if (inputDialog.open() == Window.OK) {
                                bindingColumn = dialogHelper.newBinding(DEUtil.getBindingHolder(bindingObject),
                                        inputDialog.getValue());
                                super.okPressed();
                                return;
                            } else {
                                return;
                            }
                        } else if (dialogClick == 2) {
                            return;
                        }
                    }
                    if (!dialogHelper.canProcessWithWarning())
                        return;
                    bindingColumn = dialogHelper.editBinding(bindingColumn);
                }
            } else {
                if (!dialogHelper.canProcessWithWarning())
                    return;
                if (bindSelf)
                    bindingColumn = dialogHelper.newBinding(bindingObject, null);
                else
                    bindingColumn = dialogHelper.newBinding(DEUtil.getBindingHolder(bindingObject), null);
                newBindingColumn = bindingColumn;
            }
            if (ExtendedDataModelUIAdapterHelper.isBoundToExtendedData(DEUtil.getBindingHolder(bindingObject))) {
                DataModelAdapterStatus status = DataModelAdapterUtil
                        .validateRelativeTimePeriod(DEUtil.getBindingHolder(bindingObject), bindingColumn);
                if (status.getStatus() == DataModelAdapterStatus.Status.FAIL) {
                    MessageDialog.openError(UIUtil.getDefaultShell(), null, status.getMessage());
                    removeColumnBinding(newBindingColumn);
                    return;
                }
            }
            super.okPressed();
        } catch (Exception e) {
            ExceptionHandler.handle(e);
        }
    }

    private void removeColumnBinding(ComputedColumnHandle removeBindingColumn) throws SemanticException {
        if (removeBindingColumn == null) {
            return;
        }
        if (bindSelf) {
            bindingObject.removedColumnBinding(removeBindingColumn.getName());
        } else {
            DEUtil.getBindingHolder(bindingObject).removedColumnBinding(removeBindingColumn.getName());
        }
        bindingColumn = null;
    }

    private boolean isBindingMultipleReferenced() {
        // get referenced bindings
        List bindings = new ArrayList();
        ReportItemHandle holder = DEUtil.getBindingHolder(bindingObject);
        for (Iterator iterator = holder.getColumnBindings().iterator(); iterator.hasNext();) {
            ComputedColumnHandle computedColumn = (ComputedColumnHandle) iterator.next();
            bindings.add(computedColumn);
        }
        Set referencedBindings = DataUtil.getReferencedBindings(bindingColumn, bindings);
        referencedBindings.add(bindingColumn);
        return isBindingUsed(holder, referencedBindings, bindingObject);
    }

    private boolean isBindingUsed(Object obj, Set bindings, ReportItemHandle excepted) {
        if (obj instanceof DataItemHandle && !obj.equals(excepted)) {
            for (Iterator iterator = bindings.iterator(); iterator.hasNext();) {
                ComputedColumnHandle binding = (ComputedColumnHandle) iterator.next();
                if (binding.getName().equals(((DataItemHandle) obj).getResultSetColumn()))
                    return true;
            }
        }

        Object[] children = ProviderFactory.createProvider(obj).getChildren(obj);
        for (int i = 0; i < children.length; i++) {
            if (children[i] instanceof ReportItemHandle && (((ReportItemHandle) children[i]).getDataSet() != null
                    || ((ReportItemHandle) children[i]).getDataBindingReference() != null))
                continue;
            if (isBindingUsed(children[i], bindings, excepted))
                return true;
        }
        return false;
    }

    protected void createButtonsForButtonBar(Composite parent) {
        super.createButtonsForButtonBar(parent);
        dialogHelper.validate();
    }

    protected boolean initDialog() {
        dialogHelper.initDialog();
        return super.initDialog();
    }

    public void setCanFinish(boolean canFinish) {
        if (getOkButton() != null)
            getOkButton().setEnabled(canFinish);
    }

    private boolean isEditModal = false;

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

    public boolean isEditModal() {
        return isEditModal;
    }

    public void setLinkedModelTimePeriod(boolean isLinkModelTimePeriod) {
        this.isLinkModelTimePeriod = isLinkModelTimePeriod;
    }
}