org.eclipse.birt.report.designer.ui.cubebuilder.page.DatasetSelectionPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.birt.report.designer.ui.cubebuilder.page.DatasetSelectionPage.java

Source

/*******************************************************************************
 * Copyright (c) 2005 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.cubebuilder.page;

import org.eclipse.birt.report.designer.core.mediator.IMediatorColleague;
import org.eclipse.birt.report.designer.core.mediator.IMediatorRequest;
import org.eclipse.birt.report.designer.core.mediator.MediatorManager;
import org.eclipse.birt.report.designer.core.model.SessionHandleAdapter;
import org.eclipse.birt.report.designer.core.util.mediator.request.ReportRequest;
import org.eclipse.birt.report.designer.internal.ui.data.DataService;
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.views.dialogs.provider.FilterHandleProvider;
import org.eclipse.birt.report.designer.ui.cubebuilder.dialog.FilterListDialog;
import org.eclipse.birt.report.designer.ui.cubebuilder.nls.Messages;
import org.eclipse.birt.report.designer.ui.cubebuilder.util.OlapUtil;
import org.eclipse.birt.report.designer.ui.util.ExceptionUtil;
import org.eclipse.birt.report.designer.ui.util.UIUtil;
import org.eclipse.birt.report.designer.ui.views.ElementAdapterManager;
import org.eclipse.birt.report.designer.util.ColorManager;
import org.eclipse.birt.report.designer.util.DEUtil;
import org.eclipse.birt.report.model.api.CommandStack;
import org.eclipse.birt.report.model.api.DataSetHandle;
import org.eclipse.birt.report.model.api.activity.SemanticException;
import org.eclipse.birt.report.model.api.command.NameException;
import org.eclipse.birt.report.model.api.olap.CubeHandle;
import org.eclipse.birt.report.model.api.olap.TabularCubeHandle;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
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.Label;
import org.eclipse.swt.widgets.Text;

public class DatasetSelectionPage extends AbstractCubePropertyPage {

    private static final String NEW_DATA_SET = Messages.getString("DatasetSelectionPage.Combo.NewDataSet0"); //$NON-NLS-1$
    private CubeHandle input;
    private Combo dataSetCombo;
    private Text nameText;
    private CubeBuilder builder;
    private Button filterButton;
    private Button primaryKeyButton;
    private Label primaryKeyLabel, primaryKeyHint;

    public DatasetSelectionPage(CubeBuilder builder, CubeHandle model) {
        input = model;
        this.builder = builder;
    }

    public Control createContents(Composite parent) {
        Composite container = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 4;
        layout.marginRight = 20;
        container.setLayout(layout);

        Label nameLabel = new Label(container, SWT.NONE);
        nameLabel.setText(Messages.getString("DatasetPage.Label.Name")); //$NON-NLS-1$
        nameText = new Text(container, SWT.BORDER);
        nameText.addModifyListener(new ModifyListener() {

            public void modifyText(ModifyEvent e) {
                try {
                    input.setName(nameText.getText());
                    builder.setErrorMessage(null);
                    builder.setTitleMessage(Messages.getString("DatasetPage.Title.Message")); //$NON-NLS-1$
                } catch (NameException e1) {
                    if (nameText.getText().trim().length() == 0)
                        builder.setErrorMessage(Messages.getString("DatasePage.EmptyName.ErrorMessage")); //$NON-NLS-1$
                    else
                        builder.setErrorMessage(e1.getLocalizedMessage());
                }
            }

        });

        GridData data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 3;
        nameText.setLayoutData(data);

        Label dateSetLabel = new Label(container, SWT.NONE);
        dateSetLabel.setText(Messages.getString("DatasetPage.Label.PrimaryDataset")); //$NON-NLS-1$
        dataSetCombo = new Combo(container, SWT.BORDER | SWT.READ_ONLY);
        data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 2;
        dataSetCombo.setLayoutData(data);
        dataSetCombo.setVisibleItemCount(30);
        dataSetCombo.addSelectionListener(new SelectionAdapter() {

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

        });

        filterButton = new Button(container, SWT.PUSH);
        filterButton.setText(Messages.getString("DatasetPage.Button.Filter")); //$NON-NLS-1$
        data = new GridData();
        data.widthHint = Math.max(60, filterButton.computeSize(SWT.DEFAULT, SWT.DEFAULT).x);
        filterButton.setLayoutData(data);
        filterButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                CommandStack stack = SessionHandleAdapter.getInstance().getCommandStack();
                stack.startTrans(""); //$NON-NLS-1$

                FilterHandleProvider provider = (FilterHandleProvider) ElementAdapterManager.getAdapter(builder,
                        FilterHandleProvider.class);
                if (provider == null)
                    provider = new FilterHandleProvider();

                FilterListDialog dialog = new FilterListDialog(provider);
                dialog.setInput(input);
                if (dialog.open() == Window.OK) {
                    stack.commit();
                } else
                    stack.rollback();
            }

        });

        filterButton.setEnabled(false);

        new Label(container, SWT.NONE);

        primaryKeyButton = new Button(container, SWT.CHECK);
        primaryKeyButton.addSelectionListener(new SelectionAdapter() {

            public void widgetSelected(SelectionEvent e) {
                try {
                    ((TabularCubeHandle) input).setAutoPrimaryKey(primaryKeyButton.getSelection());
                } catch (SemanticException e1) {
                    ExceptionHandler.handle(e1);
                }
            }

        });

        primaryKeyLabel = new Label(container, SWT.WRAP);
        data = new GridData(SWT.FILL, SWT.NONE, false, false);
        data.horizontalSpan = 2;
        data.widthHint = 400;
        primaryKeyLabel.setLayoutData(data);
        primaryKeyLabel.setText(Messages.getString("DatasetSelectionPage.Label.Auto.Primary.Key")); //$NON-NLS-1$

        primaryKeyLabel.addTraverseListener(new TraverseListener() {

            public void keyTraversed(TraverseEvent e) {
                if (e.detail == SWT.TRAVERSE_MNEMONIC && e.doit) {
                    e.detail = SWT.TRAVERSE_NONE;
                    primaryKeyButton.setSelection(!primaryKeyButton.getSelection());
                }
            }
        });

        new Label(container, SWT.NONE);

        primaryKeyHint = new Label(container, SWT.WRAP);
        data = new GridData(SWT.FILL, SWT.NONE, false, false);
        data.horizontalSpan = 3;
        data.widthHint = 400;
        primaryKeyHint.setLayoutData(data);
        primaryKeyHint.setText(Messages.getString("DatasetSelectionPage.Text.Auto.Primary.Key")); //$NON-NLS-1$
        primaryKeyHint.setForeground(ColorManager.getColor(128, 128, 128));

        FontData fontData = primaryKeyHint.getFont().getFontData()[0];
        Font font = new Font(parent.getDisplay(),
                new FontData(fontData.getName(), fontData.getHeight(), SWT.ITALIC));
        primaryKeyHint.setFont(font);

        return container;
    }

    public void pageActivated() {
        UIUtil.bindHelp(builder.getShell(), IHelpContextIds.CUBE_BUILDER_DATASET_SELECTION_PAGE);
        getContainer().setMessage(Messages.getString("DatasetPage.Container.Title.Message"), //$NON-NLS-1$
                IMessageProvider.NONE);
        builder.setTitleTitle(Messages.getString("DatasetPage.Title.Title")); //$NON-NLS-1$
        builder.setErrorMessage(null);
        builder.setTitleMessage(Messages.getString("DatasetPage.Title.Message")); //$NON-NLS-1$
        load();
    }

    private void refresh() {
        // dataSetCombo.setItems( input.getAvailableDatasetsName( ) );
        // dataSetCombo.select( input.getIndexOfPrimaryDataset( ) );
        if (dataSetCombo != null && !dataSetCombo.isDisposed()) {
            dataSetCombo.setItems(OlapUtil.getAvailableDatasetNames());
            dataSetCombo.add(NEW_DATA_SET);
            if (((TabularCubeHandle) input).getDataSet() != null) {
                String datasetName = ((TabularCubeHandle) input).getDataSet().getQualifiedName();
                if (dataSetCombo.indexOf(datasetName) == -1) {
                    dataSetCombo.add(datasetName, 0);
                }
                dataSetCombo.setText(datasetName);
            }
            if (dataSetCombo.getSelectionIndex() == -1) {
                if (dataSetCombo.getItemCount() == 2) {
                    dataSetCombo.select(0);
                    if (((TabularCubeHandle) input).getDataSet() == null) {
                        handleDatasetComboSelectedEvent();
                    }
                }
            }
            if (dataSetCombo.getSelectionIndex() == -1) {
                builder.setOKEnable(false);
                filterButton.setEnabled(false);
            } else {
                builder.setOKEnable(true);
                filterButton.setEnabled(true);
            }
        }
        primaryKeyButton.setSelection(((TabularCubeHandle) input).autoPrimaryKey());
    }

    private void load() {
        if (input != null) {
            if (input.getName() != null)
                nameText.setText(input.getName());
            refresh();
        }
    }

    private void setDataset(String datasetName) {
        if (dataSetCombo.getSelectionIndex() == -1) {
            builder.setOKEnable(false);
            filterButton.setEnabled(false);
        } else {
            try {
                ((TabularCubeHandle) input).setDataSet(OlapUtil.getDataset(datasetName));
            } catch (SemanticException e1) {
                ExceptionUtil.handle(e1);
            }
            builder.setOKEnable(true);
            filterButton.setEnabled(true);
        }
    }

    private void handleRequest(ReportRequest request) {
        if (ReportRequest.CREATE_ELEMENT.equals(request.getType())) {
            Object obj = DEUtil.getInputFirstElement(request.getSelectionObject());
            if (obj instanceof DataSetHandle) {
                dataSetCombo.removeAll();
                refresh();
                dataSetCombo.setText(((DataSetHandle) obj).getQualifiedName());
                setDataset(dataSetCombo.getItem(dataSetCombo.getSelectionIndex()));
            }
        }
    }

    private void handleDatasetComboSelectedEvent() {
        if (dataSetCombo.getItemCount() == 0)
            return;
        String datasetName = dataSetCombo.getItem(dataSetCombo.getSelectionIndex());
        if (NEW_DATA_SET.equals(datasetName)) {

            IMediatorColleague colleague = new IMediatorColleague() {

                public boolean isInterested(IMediatorRequest request) {
                    return request instanceof ReportRequest;
                }

                public void performRequest(IMediatorRequest request) {
                    handleRequest((ReportRequest) request);
                }

            };

            MediatorManager.addGlobalColleague(colleague);

            dataSetCombo.removeAll();
            refresh();

            DataService.getInstance().createDataSet();

            MediatorManager.removeGlobalColleague(colleague);

            return;
        }
        setDataset(datasetName);
    }

}