org.eclipse.birt.report.designer.data.ui.dataset.OutputColumnsPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.data.ui.dataset.OutputColumnsPage.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2008 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.data.ui.dataset;

import java.beans.IntrospectionException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.report.data.adapter.api.DataAdapterUtil;
import org.eclipse.birt.report.data.adapter.api.DataRequestSession;
import org.eclipse.birt.report.data.adapter.api.DataSessionContext;
import org.eclipse.birt.report.data.adapter.impl.DataSetMetaDataHelper;
import org.eclipse.birt.report.designer.core.model.SessionHandleAdapter;
import org.eclipse.birt.report.designer.data.ui.property.AbstractDescriptionPropertyPage;
import org.eclipse.birt.report.designer.data.ui.util.ControlProvider;
import org.eclipse.birt.report.designer.data.ui.util.DataSetExceptionHandler;
import org.eclipse.birt.report.designer.data.ui.util.DataSetProvider;
import org.eclipse.birt.report.designer.data.ui.util.DummyEngineTask;
import org.eclipse.birt.report.designer.data.ui.util.IHelpConstants;
import org.eclipse.birt.report.designer.data.ui.util.Utility;
import org.eclipse.birt.report.designer.internal.ui.dialogs.ResourceEditDialog;
import org.eclipse.birt.report.designer.internal.ui.util.ExceptionHandler;
import org.eclipse.birt.report.designer.nls.Messages;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineConstants;
import org.eclipse.birt.report.engine.api.impl.ReportEngine;
import org.eclipse.birt.report.engine.api.impl.ReportEngineFactory;
import org.eclipse.birt.report.engine.api.impl.ReportEngineHelper;
import org.eclipse.birt.report.model.api.ColumnHintHandle;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.DesignElementHandle;
import org.eclipse.birt.report.model.api.IResourceLocator;
import org.eclipse.birt.report.model.api.JointDataSetHandle;
import org.eclipse.birt.report.model.api.ModuleHandle;
import org.eclipse.birt.report.model.api.OdaDataSetHandle;
import org.eclipse.birt.report.model.api.PropertyHandle;
import org.eclipse.birt.report.model.api.ReportDesignHandle;
import org.eclipse.birt.report.model.api.ResultSetColumnHandle;
import org.eclipse.birt.report.model.api.activity.NotificationEvent;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.core.Listener;
import org.eclipse.birt.report.model.api.elements.DesignChoiceConstants;
import org.eclipse.birt.report.model.api.elements.structures.ColumnHint;
import org.eclipse.birt.report.model.api.elements.structures.ComputedColumn;
import org.eclipse.birt.report.model.api.metadata.IChoiceSet;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.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.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;

/**
 * Property page to edit output columns for all oda data sets.
 */
public class OutputColumnsPage extends AbstractDescriptionPropertyPage implements Listener {

    protected transient PropertyHandleTableViewer viewer = null;
    // to indicate the status of dataset handle
    private transient boolean modelChanged = true;
    protected boolean isNewlyCreated = false;
    private boolean pageActivated = false;

    protected String sourceQueryText = null;
    protected boolean getDefaultAnalysisForNullValue = true;

    protected String originalAlias = ""; //$NON-NLS-1$
    protected String originalDisplayName = ""; //$NON-NLS-1$
    protected String originalDisplayNameKey = ""; //$NON-NLS-1$

    protected static String[] cellLabels = new String[] { Messages.getString("dataset.editor.title.name"), //$NON-NLS-1$
            Messages.getString("dataset.editor.title.type"), //$NON-NLS-1$
            Messages.getString("dataset.editor.title.alias"), //$NON-NLS-1$
            Messages.getString("dataset.editor.title.displayName"), //$NON-NLS-1$
            Messages.getString("dataset.editor.title.displayNameKey") //$NON-NLS-1$
    };

    protected static String[] dialogLabels = new String[] { Messages.getString("dataset.editor.inputDialog.name"), //$NON-NLS-1$
            Messages.getString("dataset.editor.inputDialog.type"), //$NON-NLS-1$
            Messages.getString("dataset.editor.inputDialog.alias"), //$NON-NLS-1$
            Messages.getString("dataset.editor.inputDialog.displayName"), //$NON-NLS-1$
            Messages.getString("dataset.editor.inputDialog.displayNameKey") //$NON-NLS-1$
    };

    protected static String[] cellProperties = new String[] { "name", "dataTypeDisplayName", "alias", //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
            "realDisplayName", "displayNameKey"//$NON-NLS-1$ //$NON-NLS-2$
    };

    protected static IChoiceSet dataTypes = DEUtil.getMetaDataDictionary()
            .getStructure(ComputedColumn.COMPUTED_COLUMN_STRUCT).getMember(ComputedColumn.DATA_TYPE_MEMBER)
            .getAllowedChoices();

    public OutputColumnsPage() {
        super();
        this.isNewlyCreated = false;
        pageActivated = false;

    }

    /**
     * The constructor.
     */
    public OutputColumnsPage(boolean isNewlyCreated) {
        super();
        this.isNewlyCreated = isNewlyCreated;
        pageActivated = false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.IPropertyPage#createPageControl(org.eclipse.swt.widgets.Composite)
     */
    public Control createContents(Composite parent) {
        createTableViewer(parent);
        addListeners();
        ((DataSetHandle) getContainer().getModel()).addListener(this);
        return viewer.getControl();
    }

    protected void createTableViewer(Composite parent) {
        viewer = new PropertyHandleTableViewer(parent, false, true, false);

        TableColumn column = new TableColumn(viewer.getViewer().getTable(), SWT.LEFT);
        column.setText(cellLabels[0]);
        column.setWidth(100);
        column = new TableColumn(viewer.getViewer().getTable(), SWT.LEFT);
        column.setText(cellLabels[1]);
        column.setWidth(100);
        column = new TableColumn(viewer.getViewer().getTable(), SWT.LEFT);
        column.setText(cellLabels[2]);
        column.setWidth(100);
        column = new TableColumn(viewer.getViewer().getTable(), SWT.LEFT);
        column.setText(cellLabels[3]);
        column.setWidth(100);
        column = new TableColumn(viewer.getViewer().getTable(), SWT.LEFT);
        column.setText(cellLabels[4]);
        column.setWidth(150);

        viewer.getViewer().setContentProvider(new OutputColumnsContentProvider());
        viewer.getViewer().setLabelProvider(new OutputColumnsLabelProvider());
    }

    private void addListeners() {
        viewer.getNewButton().addSelectionListener(new SelectionAdapter() {

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

        viewer.getViewer().getTable().addMouseListener(new MouseAdapter() {

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

    private void doEdit() {
        int index = viewer.getViewer().getTable().getSelectionIndex();
        if (index == -1)
            return;

        DataSetViewData data = (DataSetViewData) viewer.getViewer().getTable().getItem(index).getData();
        originalAlias = data.getAlias();
        originalDisplayName = data.getRealDisplayName();
        originalDisplayNameKey = data.getDisplayNameKey();

        doEdit(data);
    }

    protected void doEdit(DataSetViewData data) {
        OutputColumnInputDialog dlg = new OutputColumnInputDialog(data);

        if (dlg.open() == Window.OK) {
            viewer.getViewer().update(data, null);
            updateMessage();
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.IPropertyPage#pageActivated()
     */
    public void pageActivated() {
        if (modelChanged) {
            updateOutputColumns();
            modelChanged = false;
        }
        setPageProperties();
        getContainer().setMessage(Messages.getString("dataset.editor.outputColumns"), //$NON-NLS-1$
                IMessageProvider.NONE);
        viewer.getViewer().getTable().select(0);
        pageActivated = true;
    }

    protected void setPageProperties() {
        viewer.getNewButton().setEnabled(viewer.getViewer().getInput() != null
                && ((DataSetViewData[]) viewer.getViewer().getInput()).length != 0);
        viewer.getNewButton().setText(Messages.getString("PropertyHandleTableViewer.Button.Edit"));//$NON-NLS-1$
        viewer.getNewButton().setToolTipText(Messages.getString("OutputColumnPage.toolTipText.Edit"));//$NON-NLS-1$

        viewer.getEditButton().setVisible(false);
        viewer.getRemoveButton().setVisible(false);
        viewer.getUpButton().setVisible(false);
        viewer.getDownButton().setVisible(false);
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#canLeave()
     */
    public boolean canLeave() {
        if (isValid()) {
            saveOutputColumns();
            if (this.modelChanged) {
                ((DataSetEditor) this.getContainer()).updateDataSetDesign(this);
                updateColumnCache();
                this.modelChanged = false;
            }
            this.pageActivated = false;
            return super.canLeave();
        } else
            return false;
    }

    protected void updateColumnCache() {
        try {
            DataSetUIUtil.updateColumnCache((DataSetHandle) getContainer().getModel());
        } catch (SemanticException e) {
            ExceptionHandler.handle(e);
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#performOk()
     */
    public boolean performOk() {
        if (isValid()) {
            saveOutputColumns();
            ((DataSetHandle) getContainer().getModel()).removeListener(this);
            if (this.modelChanged) {
                ((DataSetEditor) this.getContainer()).updateDataSetDesign(this);
                this.modelChanged = false;
            }
            try {
                if (!pageActivated) {
                    setAnalysisTypeForColumn();
                }
            } catch (BirtException e) {
                ExceptionHandler.handle(e, true);
            }

            ((DataSetHandle) getContainer().getModel()).removeListener(this);

            return super.performOk();
        } else {
            ((DataSetHandle) getContainer().getModel()).removeListener(this);
            return false;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.AbstractDescriptionPropertyPage#getPageDescription()
     */
    public String getPageDescription() {
        return Messages.getString("OutputColumnsPage.description"); //$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#getToolTip()
     */
    public String getToolTip() {
        return Messages.getString("OutputColumnPage.OutputColumns.Tooltip"); //$NON-NLS-1$
    }

    /**
     * update output columns page
     * 
     */
    protected final void updateOutputColumns() {
        clearOutputColumns();
        try {
            populateOutputColums();
        } catch (BirtException e) {
            DataSetExceptionHandler.handle(e);
        }
    }

    /**
     * populate output columns
     * 
     * @throws BirtException
     */
    protected void populateOutputColums() throws BirtException {
        ClassLoader oldContextLoader = Thread.currentThread().getContextClassLoader();
        ClassLoader parentLoader = oldContextLoader;
        if (parentLoader == null)
            parentLoader = this.getClass().getClassLoader();
        ClassLoader newContextLoader = DataSetProvider.getCustomScriptClassLoader(parentLoader,
                ((DataSetEditor) getContainer()).getHandle().getModuleHandle());

        ModuleHandle handle = ((DataSetEditor) getContainer()).getHandle().getModuleHandle();
        DataSessionContext context;
        if (handle instanceof ReportDesignHandle) {

            Map dataSetMap = new HashMap();
            Map dataSourceMap = new HashMap();
            DummyEngineTask engineTask = null;
            DataRequestSession session = null;
            ReportEngine engine = null;
            try {
                EngineConfig ec = new EngineConfig();
                ec.getAppContext().put(EngineConstants.APPCONTEXT_CLASSLOADER_KEY, newContextLoader);
                engine = (ReportEngine) new ReportEngineFactory().createReportEngine(ec);
                DataSetMetaDataHelper.clearPropertyBindingMap(((DataSetEditor) getContainer()).getHandle(),
                        dataSetMap, dataSourceMap);

                ReportDesignHandle copy = (ReportDesignHandle) (handle.copy().getHandle(null));

                engineTask = new DummyEngineTask(engine,
                        new ReportEngineHelper(engine).openReportDesign((ReportDesignHandle) copy), copy);

                session = engineTask.getDataSession();

                engineTask.run();
                DataSetViewData[] viewDatas = DataSetProvider.getCurrentInstance()
                        .populateAllOutputColumns(((DataSetEditor) getContainer()).getHandle(), session);
                if (viewDatas == null) {
                    viewDatas = ((DataSetEditor) getContainer()).getCurrentItemModel(false);
                }

                updateDefaultAnalysisEnablement(viewDatas);

                if (isNewlyCreated) {
                    updateDefaultPropertyValues(viewDatas);
                }

                if (((DataSetEditor) getContainer()).getHandle() instanceof JointDataSetHandle) {
                    PropertyHandle properyHandle = ((DataSetEditor) getContainer()).getHandle()
                            .getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP);

                    if (properyHandle != null) {
                        for (int i = 0; i < viewDatas.length; i++) {
                            for (Iterator columns = properyHandle.iterator(); columns.hasNext();) {
                                ColumnHintHandle column = (ColumnHintHandle) columns.next();
                                if (viewDatas[i].getName().equals(column.getColumnName())) {
                                    viewDatas[i].setAlias(column.getAlias());
                                    break;
                                }
                            }
                        }
                    }

                }
                viewer.getViewer().setInput(viewDatas);
            } finally {
                session.shutdown();
                engineTask.close();
                engine.destroy();
                DataSetMetaDataHelper.resetPropertyBinding(((DataSetEditor) getContainer()).getHandle(), dataSetMap,
                        dataSourceMap);
            }
        } else {
            context = new DataSessionContext(DataSessionContext.MODE_DIRECT_PRESENTATION,
                    ((DataSetEditor) getContainer()).getHandle().getModuleHandle());
            DataRequestSession session = DataRequestSession.newSession(context);

            try {
                DataSetViewData[] viewDatas = DataSetProvider.getCurrentInstance()
                        .populateAllOutputColumns(((DataSetEditor) getContainer()).getHandle(), session);
                if (viewDatas == null) {
                    viewDatas = ((DataSetEditor) getContainer()).getCurrentItemModel(false);
                }

                updateDefaultAnalysisEnablement(viewDatas);

                if (isNewlyCreated) {
                    updateDefaultPropertyValues(viewDatas);
                }

                viewer.getViewer().setInput(viewDatas);
            } finally {
                session.shutdown();
            }
        }

        Thread.currentThread().setContextClassLoader(oldContextLoader);
    }

    protected void updateDefaultPropertyValues(DataSetViewData[] viewDatas) {
        updateAnalysisTypes(viewDatas, true);
    }

    private void updateDefaultAnalysisEnablement(DataSetViewData[] viewDatas) {
        DataSetHandle ds = ((DataSetEditor) getContainer()).getHandle();
        if (ds instanceof OdaDataSetHandle) {
            String queryText = ((OdaDataSetHandle) ds).getQueryText();
            if (queryText != null && (!queryText.equals(sourceQueryText))) {
                if (sourceQueryText == null)
                    getDefaultAnalysisForNullValue = false;
                else
                    getDefaultAnalysisForNullValue = true;
                sourceQueryText = queryText;

                if (isNewlyCreated)
                    getDefaultAnalysisForNullValue = true;
                else
                    updateAnalysisTypes(viewDatas, true);
            }

            if (!isNewlyCreated && modelChanged) {
                getDefaultAnalysisForNullValue = true;
                updateAnalysisTypes(viewDatas, false);
            }
        }
    }

    private void updateAnalysisTypes(DataSetViewData[] viewDatas, boolean updateFlag) {
        for (int i = 0; i < viewDatas.length; i++) {
            DataSetViewData item = viewDatas[i];
            ColumnHintHandle hint = findColumnHint(item);
            if (hint != null) {
                try {
                    String analysis = hint.getAnalysis();
                    if (analysis == null && getDefaultAnalysisForNullValue && updateFlag) {
                        hint.setAnalysis(DataSetUIUtility.getDefaultAnalysisType(item.getDataTypeName()));
                    }
                } catch (SemanticException e) {
                    ExceptionHandler.handle(e);
                }
                item.setAnalysis(hint.getAnalysis());
            }
        }
    }

    /**
     * clear output columns table viewer
     * 
     */
    protected final void clearOutputColumns() {
        viewer.getViewer().getTable().removeAll();
    }

    protected ColumnHintHandle findColumnHint(DataSetViewData viewData) {
        PropertyHandle properyHandle = ((DataSetEditor) getContainer()).getHandle()
                .getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP);

        for (Iterator columns = properyHandle.iterator(); columns.hasNext();) {
            ColumnHintHandle column = (ColumnHintHandle) columns.next();
            if (viewData.getName().equals(column.getColumnName())) {
                return column;
            }
        }
        return null;
    }

    protected void setAnalysisTypeForColumn() throws BirtException {
        if (!isNewlyCreated) {
            DataSetHandle ds = ((DataSetEditor) getContainer()).getHandle();
            DataSetViewData[] viewData = DataSetProvider.getCurrentInstance().getColumns(ds, true);

            PropertyHandle handle = ds.getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP);
            Iterator iter = handle.iterator();
            if (iter != null) {
                while (iter.hasNext()) {
                    ColumnHintHandle hint = (ColumnHintHandle) iter.next();

                    for (int i = 0; i < viewData.length; i++) {
                        if (viewData[i].getName().equals(hint.getColumnName())) {
                            if (hint.getAnalysis() == null) {
                                try {
                                    hint.setAnalysis(
                                            DataSetUIUtility.getDefaultAnalysisType(viewData[i].getDataTypeName()));
                                } catch (SemanticException e) {
                                    ExceptionHandler.handle(e, true);
                                }
                            }
                            continue;
                        }
                    }
                }
            }
        }
    }

    protected void saveOutputColumns() {
        PropertyHandle handle = ((DataSetHandle) getContainer().getModel())
                .getPropertyHandle(DataSetHandle.COLUMN_HINTS_PROP);
        if (viewer != null && viewer.getViewer() != null && viewer.getViewer().getInput() != null) {
            // Iterate through all the cached model items
            DataSetViewData[] items = (DataSetViewData[]) viewer.getViewer().getInput();
            String columnName = null;
            boolean found = false;
            for (int n = 0; n < items.length; n++) {
                columnName = items[n].getName();
                // Find this column name in the handle
                found = false;
                Iterator iter = handle.iterator();
                if (iter != null) {
                    while (iter.hasNext() && !found) {
                        ColumnHintHandle hint = (ColumnHintHandle) iter.next();
                        if (hint.getColumnName().equals(columnName)) {
                            found = true;
                            // Update the display name
                            if (items[n].getRealDisplayName() == null
                                    || items[n].getRealDisplayName().trim().length() == 0) {
                                hint.setDisplayName(null);
                            } else {
                                hint.setDisplayName(items[n].getRealDisplayName());
                            }
                            if (items[n].getDisplayNameKey() == null
                                    || items[n].getDisplayNameKey().trim().length() == 0) {
                                hint.setDisplayNameKey(null);
                            } else {
                                hint.setDisplayNameKey(items[n].getDisplayNameKey());
                            }
                            if (items[n].getAlias() == null || items[n].getAlias().trim().length() == 0) {
                                hint.setAlias(null);
                            } else {
                                hint.setAlias(items[n].getAlias());
                            }
                            if (items[n].getHelpText() == null || items[n].getHelpText().trim().length() == 0) {
                                hint.setHelpText(null);
                            } else {
                                hint.setHelpText(items[n].getHelpText());
                            }
                        }
                    }
                }
                // If not found then create a new item and add it in
                if (!found && isColumnHintRequired(items[n])) {
                    ColumnHint hint = new ColumnHint();
                    hint.setProperty(ColumnHint.COLUMN_NAME_MEMBER, columnName);
                    if (items[n].getRealDisplayName() != null
                            && items[n].getRealDisplayName().trim().length() > 0) {
                        hint.setProperty(ColumnHint.DISPLAY_NAME_MEMBER, items[n].getRealDisplayName());
                    }
                    if (items[n].getDisplayNameKey() != null && items[n].getDisplayNameKey().trim().length() > 0) {
                        hint.setProperty(ColumnHint.DISPLAY_NAME_ID_MEMBER, items[n].getDisplayNameKey());
                    }
                    if (items[n].getAlias() != null && items[n].getAlias().trim().length() > 0) {
                        hint.setProperty(ColumnHint.ALIAS_MEMBER, items[n].getAlias());
                    }
                    if (items[n].getHelpText() != null && items[n].getHelpText().trim().length() > 0) {
                        hint.setProperty(ColumnHint.HELP_TEXT_MEMBER, items[n].getHelpText());

                    }
                    try {
                        handle.addItem(hint);
                    } catch (SemanticException e) {
                        ExceptionHandler.handle(e);
                    }
                }
            }
        }

        if ((DataSetHandle) getContainer().getModel() instanceof OdaDataSetHandle) {
            handle = ((DataSetHandle) getContainer().getModel()).getPropertyHandle(DataSetHandle.RESULT_SET_PROP);
            if (viewer != null && viewer.getViewer() != null && viewer.getViewer().getInput() != null) {
                DataSetViewData[] items = (DataSetViewData[]) viewer.getViewer().getInput();
                for (int n = 0; n < items.length; n++) {
                    String dataType = items[n].getDataTypeName();
                    Iterator iter = handle.iterator();
                    if (iter != null) {
                        while (iter.hasNext()) {
                            try {
                                ResultSetColumnHandle resultSet = (ResultSetColumnHandle) iter.next();
                                if (resultSet.getColumnName().equals(items[n].getName())) {
                                    resultSet.setDataType(dataType);
                                    break;
                                }
                            } catch (Exception ex) {

                            }
                        }
                    }
                }
            }
        }
    }

    /**
     * The alias name is unique or not
     * 
     * @param newValue
     * @return
     */
    protected boolean isUnique(String newValue, DataSetViewData currentItem) {

        DataSetViewData[] items = null;
        try {
            if (viewer == null || viewer.getViewer() == null) {
                items = DataSetProvider.getCurrentInstance()
                        .getColumns(((DataSetEditor) getContainer()).getHandle(), false, true);
            } else {
                items = (DataSetViewData[]) viewer.getViewer().getInput();
            }
        } catch (BirtException e) {
            DataSetExceptionHandler.handle(e);
        }

        for (int i = 0; i < items.length; i++) {
            if (items[i].getName() != null && items[i].getName().equals(currentItem.getName())) {
                continue;
            }
            if ((items[i].getAlias() != null && items[i].getAlias().equals(newValue))
                    || (items[i].getName() != null && items[i].getName().equals(newValue))) {
                return false;
            }
        }
        return true;
    }

    /**
     * validates that the new name/alias from a column hint or a new custom
     * column doesn't conflict with existing column names or aliases
     * 
     */
    private boolean isValid() {
        boolean validate = true;
        String newColumnNameOrAlias;
        DataSetViewData[] items = null;

        if (viewer == null || viewer.getViewer() == null) {
            try {
                items = DataSetProvider.getCurrentInstance()
                        .getColumns(((DataSetEditor) getContainer()).getHandle(), false, true);
            } catch (Exception e) {
                ExceptionHandler.handle(e, true);
            }

        } else {
            items = (DataSetViewData[]) viewer.getViewer().getInput();
        }

        for (int i = 0; items != null && i < items.length && validate; i++) {
            newColumnNameOrAlias = items[i].getAlias();
            if (newColumnNameOrAlias != null && newColumnNameOrAlias.length() > 0) {
                for (int n = 0; n < items.length; n++) {
                    if (i == n)
                        continue;
                    if ((items[n].getName() != null && items[n].getName().equals(newColumnNameOrAlias))
                            || (items[n].getAlias() != null && items[n].getAlias().equals(newColumnNameOrAlias))) {
                        validate = false;
                        getContainer().setMessage(
                                Messages.getFormattedString("dataset.editor.error.columnOrAliasNameAlreadyUsed", //$NON-NLS-1$
                                        new Object[] { newColumnNameOrAlias, Integer.valueOf(n + 1) }),
                                IMessageProvider.ERROR);

                        break;
                    }
                }
            }
        }
        return validate;
    }

    /**
     * update message
     * 
     */
    protected void updateMessage() {
        if (isValid())
            getContainer().setMessage(Messages.getString("dataset.editor.outputColumns"), //$NON-NLS-1$
                    IMessageProvider.NONE);
    }

    /**
     * 
     * @param model
     * @return
     */
    protected boolean isColumnHintRequired(DataSetViewData model) {
        return !((model.getRealDisplayName() == null || model.getRealDisplayName().trim().length() == 0)
                && (model.getDisplayNameKey() == null || model.getDisplayNameKey().trim().length() == 0)
                && (model.getAlias() == null || model.getAlias().trim().length() == 0)
                && (model.getHelpText() == null || model.getHelpText().trim().length() == 0));
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.model.core.Listener#elementChanged(org.eclipse.birt.model.api.DesignElementHandle,
     *      org.eclipse.birt.model.activity.NotificationEvent)
     */
    public void elementChanged(DesignElementHandle focus, NotificationEvent ev) {
        if (focus.equals(getContainer().getModel())) {
            modelChanged = true;
        }
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.birt.report.designer.ui.dialogs.properties.IPropertyPage#performCancel()
     */
    public boolean performCancel() {
        if (viewer != null && viewer.getViewer() != null && viewer.getViewer().getInput() != null) {
            // Update the cached list from the model
            // We have to do this because we are directly updating the column
            // names in the cached list
            DataSetProvider manager = DataSetProvider.getCurrentInstance();
            manager.updateModel(((DataSetEditor) getContainer()).getHandle(),
                    (DataSetViewData[]) viewer.getViewer().getInput());
        }

        ((DataSetHandle) getContainer().getModel()).removeListener(this);
        return super.performCancel();
    }

    protected boolean checkDisplayNameKey(String displayNameKey) {
        boolean result = true;

        if (displayNameKey.trim().indexOf(' ') != -1) {
            result = false;
        }
        return result;
    }

    protected String[] getCompatibleDataTypes(String dataType) {
        String[] compatibleTypes = null;

        if (DesignChoiceConstants.COLUMN_DATA_TYPE_STRING.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER, DesignChoiceConstants.COLUMN_DATA_TYPE_BOOLEAN,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_DATETIME, DesignChoiceConstants.COLUMN_DATA_TYPE_DATE,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT, DesignChoiceConstants.COLUMN_DATA_TYPE_TIME,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_BLOB };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT, DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_TIME.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_DATE.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_DATETIME.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_DATE, DesignChoiceConstants.COLUMN_DATA_TYPE_TIME };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT, DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_JAVA_OBJECT.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_BOOLEAN.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL, DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER, };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER,
                    DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL };
        } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_BLOB.equals(dataType)) {
            compatibleTypes = new String[] { DesignChoiceConstants.COLUMN_DATA_TYPE_STRING };
        }
        if (compatibleTypes == null)
            return new String[0];
        for (int i = 0; i < compatibleTypes.length; i++) {
            compatibleTypes[i] = dataTypes.findChoice(compatibleTypes[i]).getDisplayName();
        }

        return compatibleTypes;
    }

    private class OutputColumnInputDialog extends PropertyHandleInputDialog {

        DataSetViewData data = null;
        private CCombo cmbDataType;
        private String originalDataType;

        protected OutputColumnInputDialog(Object structureOrHandle) {
            super(structureOrHandle);

            data = (DataSetViewData) structureOrHandle;
        }

        protected void setSystemHelp(Composite composite) {
            Utility.setSystemHelp(composite, IHelpConstants.CONEXT_ID_OUTPUT_COLUMNS_DIALOG);
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.birt.report.designer.data.ui.dataset.PropertyHandleInputDialog#createCustomControls(org.eclipse.swt.widgets.Composite)
         */
        protected void createCustomControls(Composite parent) {
            try {
                createCells(parent);
            } catch (Exception e) {
                ExceptionHandler.handle(e);
            }
        }

        private void createCells(Composite parent) throws IllegalArgumentException, IntrospectionException,
                IllegalAccessException, InvocationTargetException {
            for (int i = 0; i < cellProperties.length; i++) {
                ControlProvider.createLabel(parent, dialogLabels[i]);

                if (i == 1) {
                    createDataTypeCombo(parent);
                    continue;
                }
                if (i == 4) {
                    createResourceCell(parent, i);
                    continue;
                }

                createTextCell(parent, i);
            }
        }

        private boolean checkForPotentialProblems(String dataType) {
            if (DesignChoiceConstants.COLUMN_DATA_TYPE_DECIMAL.equals(dataType)) {
                if (DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT
                        .equals(dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName())
                        || DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER
                                .equals(dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName())) {
                    return true;
                }
            } else if (DesignChoiceConstants.COLUMN_DATA_TYPE_FLOAT.equals(dataType)) {
                if (DesignChoiceConstants.COLUMN_DATA_TYPE_INTEGER
                        .equals(dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName())) {
                    return true;
                }
            }
            return false;
        }

        private void createDataTypeCombo(Composite parent) throws IllegalArgumentException, IntrospectionException,
                IllegalAccessException, InvocationTargetException {
            cmbDataType = new CCombo(parent, SWT.READ_ONLY | SWT.BORDER);
            cmbDataType.setLayoutData(ControlProvider.getGridDataWithHSpan(2));

            String selectedItem = data.getDataTypeName();
            originalDataType = selectedItem;
            cmbDataType.add(dataTypes.findChoice(selectedItem).getDisplayName());
            String[] compatibleDisplayNames = getCompatibleDataTypes(selectedItem);

            for (int i = 0; i < compatibleDisplayNames.length; i++) {
                cmbDataType.add(compatibleDisplayNames[i]);
            }

            cmbDataType.select(0);

            DataSetHandle dataSetHandle = (DataSetHandle) getContainer().getModel();

            if (dataSetHandle instanceof OdaDataSetHandle) {
                DataSetViewData[] views = DataSetProvider.getCurrentInstance()
                        .getCachedDataSetItemModel(dataSetHandle, false);

                for (int i = 0; i < views.length; i++) {
                    if (views[i].getName().equals(data.getName())) {
                        if (!views[i].getDataTypeName().equals(data.getDataTypeName())) {
                            if (cmbDataType.indexOf(views[i].getDataTypeDisplayName()) < 0) {
                                cmbDataType.add(views[i].getDataTypeDisplayName());
                                break;
                            }
                        }
                    }
                }
            } else
                cmbDataType.setEnabled(false);

            if (data.isComputedColumn()) {
                cmbDataType.setEnabled(false);
            }

            cmbDataType.addSelectionListener(new SelectionListener() {
                public void widgetSelected(SelectionEvent e) {
                    if (checkForPotentialProblems(originalDataType)) {
                        if (MessageDialog.openQuestion(getShell(),
                                Messages.getString("OutputColumnsPage.DataTypeConvert.Note"),
                                Messages.getString("OutputColumnsPage.DataTypeConvert.Message"))) {
                            data.setDataTypeName(
                                    dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName());
                            data.setDataType(DataAdapterUtil.adaptModelDataType(
                                    dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName()));
                        } else {
                            cmbDataType.select(0);
                        }
                    } else {
                        data.setDataTypeName(dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName());
                        data.setDataType(DataAdapterUtil.adaptModelDataType(
                                dataTypes.findChoiceByDisplayName(cmbDataType.getText()).getName()));
                    }
                }

                public void widgetDefaultSelected(SelectionEvent e) {

                }
            });
        }

        private void createTextCell(Composite parent, final int index) throws IllegalArgumentException,
                IntrospectionException, IllegalAccessException, InvocationTargetException {
            final Text tx = ControlProvider.createText(parent,
                    (String) Utility.getProperty(data, cellProperties[index]));
            tx.setLayoutData(ControlProvider.getGridDataWithHSpan(2));

            if (index < 2)// disable name and dataTypeName
            {
                tx.setEditable(false);
            } else {
                tx.addModifyListener(new ModifyListener() {

                    public void modifyText(ModifyEvent e) {
                        try {
                            if (index == 2) {
                                boolean isUniqueName = isUnique(tx.getText(), data);
                                if (!isUniqueName)
                                    updateStatus(getMiscStatus(IStatus.ERROR,
                                            Messages.getString("OutputColumnPage.OutputColumns.DuplicatedName"))); //$NON-NLS-1$
                                else
                                    updateStatus(getOKStatus());
                            }
                            Object txText = tx.getText();
                            if (tx.getText().trim().length() == 0)
                                txText = null;

                            Utility.setProperty(data, cellProperties[index], txText);
                        } catch (Exception e1) {
                            ExceptionHandler.handle(e1);
                        }
                    }

                });
            }

            if (index == 2) {
                tx.setFocus();
            }
        }

        private void createResourceCell(Composite parent, final int index) throws IllegalArgumentException,
                IntrospectionException, IllegalAccessException, InvocationTargetException {
            final Text tx = ControlProvider.createText(parent,
                    (String) Utility.getProperty(data, cellProperties[index]));
            tx.setLayoutData(ControlProvider.getGridDataWithHSpan(1));
            tx.addModifyListener(new ModifyListener() {

                public void modifyText(ModifyEvent e) {
                    try {
                        Utility.setProperty(data, cellProperties[index], tx.getText());

                        boolean check = checkDisplayNameKey(tx.getText());
                        if (!check) {
                            updateStatus(getMiscStatus(IStatus.ERROR,
                                    Messages.getString("ResourceKey.invalid.containSpace")));
                        }
                    } catch (Exception e1) {
                        ExceptionHandler.handle(e1);
                    }
                }

            });

            SelectionAdapter listener = new SelectionAdapter() {

                public void widgetSelected(SelectionEvent event) {
                    ResourceEditDialog dlg = new ResourceEditDialog(getShell(),
                            Messages.getString("ResourceKeyDescriptor.title.SelectKey")); //$NON-NLS-1$

                    dlg.setResourceURLs(getResourceURLs());

                    if (dlg.open() == Window.OK) {
                        tx.setText((String) dlg.getResult());
                    }
                }
            };
            Button bt = new Button(parent, SWT.PUSH);
            bt.setText("..."); //$NON-NLS-1$
            bt.addSelectionListener(listener);
            if (getBaseName() == null)
                bt.setEnabled(false);
        }

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

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

        private String getBaseName() {
            return SessionHandleAdapter.getInstance().getReportDesignHandle().getIncludeResource();
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.birt.report.designer.data.ui.dataset.PropertyHandleInputDialog#rollback()
         */
        protected void rollback() {
            data.setAlias(originalAlias);
            data.setRealDisplayName(originalDisplayName);
            data.setDisplayNameKey(originalDisplayNameKey);
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.birt.report.designer.data.ui.dataset.PropertyHandleInputDialog#validateSemantics(java.lang.Object)
         */
        protected IStatus validateSemantics(Object structureOrHandle) {
            return null;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.birt.report.designer.data.ui.dataset.PropertyHandleInputDialog#validateSyntax(java.lang.Object)
         */
        protected IStatus validateSyntax(Object structureOrHandle) {
            return null;
        }

        /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.birt.report.designer.data.ui.dataset.PropertyHandleInputDialog#getTitle()
         */
        protected String getTitle() {
            return Messages.getString("OutputColumnPage.title.OutputColumnInputDialog.EditOutputColumn");//$NON-NLS-1$
        }

    }

}

class OutputColumnsContentProvider implements IStructuredContentProvider {

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
     */
    public Object[] getElements(Object inputElement) {
        return (DataSetViewData[]) inputElement;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#dispose()
     */
    public void dispose() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer,
     *      java.lang.Object, java.lang.Object)
     */
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

    }
}

class OutputColumnsLabelProvider implements ITableLabelProvider {
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object,
     *      int)
     */
    public Image getColumnImage(Object element, int columnIndex) {
        return null;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object,
     *      int)
     */
    public String getColumnText(Object element, int columnIndex) {
        String value = null;
        DataSetViewData item = (DataSetViewData) element;
        switch (columnIndex) {
        case 0: {
            value = item.getName();
            break;
        }
        case 1: {
            value = DataSetViewData.getDataTypeDisplayName(item.getDataTypeName());
            break;
        }
        case 2: {
            value = item.getAlias();
            break;
        }
        case 3: {
            value = item.getRealDisplayName();
            break;
        }
        case 4: {
            value = item.getDisplayNameKey();
            break;
        }
        }
        return ((value == null) ? "" : value);//$NON-NLS-1$
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
     */
    public void addListener(ILabelProviderListener listener) {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
     */
    public void dispose() {

    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object,
     *      java.lang.String)
     */
    public boolean isLabelProperty(Object element, String property) {
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
     */
    public void removeListener(ILabelProviderListener listener) {

    }
}