org.eclipse.reqcycle.ocl.ui.SettingPage.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.reqcycle.ocl.ui.SettingPage.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Atos.
 * 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:
 *     Atos - initial API and implementation
 ******************************************************************************/
package org.eclipse.reqcycle.ocl.ui;

import java.util.Collection;
import java.util.List;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoProperties;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.ui.dialogs.WorkspaceResourceDialog;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.databinding.viewers.ViewerProperties;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.reqcycle.emf.utils.EMFUtils;
import org.eclipse.reqcycle.ocl.ReqcycleOCLPlugin;
import org.eclipse.reqcycle.ocl.ui.OCLConnector.SettingBean;
import org.eclipse.reqcycle.repository.data.IDataModelManager;
import org.eclipse.reqcycle.repository.data.types.IDataModel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
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.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.ISelectionStatusValidator;
import org.eclipse.ui.model.BaseWorkbenchContentProvider;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ziggurat.inject.ZigguratInject;

import ScopeConf.Scope;

import com.google.common.collect.Lists;

public class SettingPage extends WizardPage {

    private IDataModelManager dataManager = ZigguratInject.make(IDataModelManager.class);

    private Button browseButton;

    private Text tFile;

    private ComboViewer cvDataModel;

    private ComboViewer cvScope;

    private Combo cScope;

    private Combo cDataModel;

    private List<Scope> inputScope = Lists.newArrayList();

    private SettingBean bean;

    protected SettingPage(SettingBean bean) {
        super("OCL Connector settings");
        this.bean = bean;
        setDescription("Connector settings");
    }

    @Override
    public void createControl(Composite parent) {
        Composite containerComposite = new Composite(parent, SWT.None);
        containerComposite.setLayout(new GridLayout(3, false));
        Label fileLabel = new Label(containerComposite, SWT.NONE);
        fileLabel.setText("UML Model :");

        tFile = new Text(containerComposite, SWT.BORDER | SWT.READ_ONLY);
        tFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        tFile.setEnabled(false);
        browseButton = new Button(containerComposite, SWT.NONE);
        browseButton.setText("Browse");

        Label lblSeparator = new Label(containerComposite, SWT.SEPARATOR | SWT.HORIZONTAL);
        lblSeparator.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));

        SashForm sashForm = new SashForm(containerComposite, SWT.NONE);
        sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));

        Label lblDataModel = new Label(containerComposite, SWT.NONE);
        lblDataModel.setText("Data Model :");

        cvDataModel = new ComboViewer(containerComposite);
        cDataModel = cvDataModel.getCombo();
        cDataModel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        cvDataModel.setContentProvider(ArrayContentProvider.getInstance());
        cvDataModel.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof IDataModel) {
                    return ((IDataModel) element).getName();
                }
                return super.getText(element);
            }
        });
        cvDataModel.setInput(dataManager.getAllDataModels());

        Label lblScope = new Label(containerComposite, SWT.NONE);
        lblScope.setText("Scope :");

        cvScope = new ComboViewer(containerComposite);
        cScope = cvScope.getCombo();
        cScope.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
        cScope.setEnabled(false);
        cvScope.setContentProvider(ArrayContentProvider.getInstance());
        cvScope.setLabelProvider(new LabelProvider() {

            @Override
            public String getText(Object element) {
                if (element instanceof Scope) {
                    return ((Scope) element).getName();
                }
                return super.getText(element);
            }
        });
        cvScope.setInput(inputScope);

        hookListeners();
        initDataBindings();
        setControl(containerComposite);
    }

    @Override
    public boolean isPageComplete() {
        String uriString = bean.getUri();
        if (uriString != null && !uriString.isEmpty()) {
            URI uri = URI.createPlatformResourceURI(uriString, true);
            if (!EMFUtils.isEMF(uri)) {
                setErrorMessage("Selected .uml file is not an EMF resource");
                return false;
            }
        } else {
            return false;
        }
        setErrorMessage(null);
        return bean.getDataPackage() != null && bean.getScope() != null;
    }

    /**
     * Label provider for the workspace resource dialog.
     */
    protected static ILabelProvider labelProvider = new WorkbenchLabelProvider() {

        @Override
        public Color getForeground(Object element) {
            return Display.getDefault().getSystemColor(SWT.COLOR_BLACK);
        }

        @Override
        public Color getBackground(Object element) {
            return Display.getDefault().getSystemColor(SWT.COLOR_WHITE);
        }
    };

    protected static ViewerFilter filter = new ViewerFilter() {

        @Override
        public boolean select(Viewer viewer, Object parentElement, Object element) {
            return true;
        }
    };

    protected static ISelectionStatusValidator validator = new ISelectionStatusValidator() {

        @Override
        public IStatus validate(Object[] selection) {
            if (selection.length == 1) {
                Object o = selection[0];
                if (o instanceof IFile && "uml".equals(((IFile) o).getFileExtension())) {
                    return Status.OK_STATUS;
                }
            }
            return new Status(IStatus.ERROR, ReqcycleOCLPlugin.PLUGIN_ID, "Select a single UML file");
        }
    };

    protected void hookListeners() {

        cvDataModel.addSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                inputScope.clear();
                cScope.setEnabled(false);
                ISelection selection = event.getSelection();
                if (selection instanceof IStructuredSelection) {
                    Object obj = ((IStructuredSelection) selection).getFirstElement();
                    if (obj instanceof IDataModel) {
                        cScope.setEnabled(true);
                        Collection<Scope> scopes = dataManager.getScopes((IDataModel) obj);
                        inputScope.addAll(scopes);
                    }

                }
                cvScope.refresh();
            }
        });

        browseButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                BaseWorkbenchContentProvider contentProvider = new BaseWorkbenchContentProvider();
                WorkspaceResourceDialog dialog = new WorkspaceResourceDialog(Display.getCurrent().getActiveShell(),
                        labelProvider, contentProvider);
                dialog.addFilter(filter);
                dialog.setAllowMultiple(false);
                dialog.setInput(ResourcesPlugin.getWorkspace().getRoot());
                dialog.setValidator(validator);
                int open = dialog.open();
                if (open == 0) {
                    IFile iFile = dialog.getSelectedFiles()[0];
                    String location = iFile.getFullPath().toOSString();
                    tFile.setText(location);
                }
            }
        });
    }

    protected DataBindingContext initDataBindings() {
        DataBindingContext bindingContext = new DataBindingContext();
        //
        IObservableValue observeTextFileURITextObserveWidget = WidgetProperties.text(SWT.Modify).observe(tFile);
        IObservableValue uriBeanObserveValue = PojoProperties.value("uri").observe(bean);
        bindingContext.bindValue(observeTextFileURITextObserveWidget, uriBeanObserveValue, null, null);
        //
        IObservableValue observeSingleSelectionCvDataModel = ViewerProperties.singleSelection()
                .observe(cvDataModel);
        IObservableValue dataPackageBeanObserveValue = PojoProperties.value("dataPackage").observe(bean);
        bindingContext.bindValue(observeSingleSelectionCvDataModel, dataPackageBeanObserveValue, null, null);
        //
        IObservableValue observeSingleSelectionCvScope = ViewerProperties.singleSelection().observe(cvScope);
        IObservableValue scopeBeanObserveValue = PojoProperties.value("scope").observe(bean);
        bindingContext.bindValue(observeSingleSelectionCvScope, scopeBeanObserveValue, null, null);
        //
        return bindingContext;
    }

}