fr.openpeople.rdal.ide.view.requirement.ReferencedDesignElementsPanel.java Source code

Java tutorial

Introduction

Here is the source code for fr.openpeople.rdal.ide.view.requirement.ReferencedDesignElementsPanel.java

Source

/*******************************************************************************
 * Copyright (c) 2011 Lab-STICC Universite de Bretagne Sud, Lorient.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the CeCILL-B license available
 * at :
 * en : http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
 * fr : http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
 * 
 * Contributors:
 * Dominique BLOUIN (Lab-STICC UBS), dominique.blouin@univ-ubs.fr
 ******************************************************************************/
package fr.openpeople.rdal.ide.view.requirement;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
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.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

import fr.labsticc.framework.constraints.core.ICompletionProposal;
import fr.labsticc.framework.constraints.ide.view.UsedLibrarySelectionDialog;
import fr.labsticc.framework.constraints.model.constraints.ConstraintLanguage;
import fr.labsticc.framework.constraints.model.constraints.FormalConstraintLanguage;
import fr.labsticc.framework.constraints.model.constraints.FormalLanguageExpression;
import fr.labsticc.framework.constraints.model.constraints.FormalLanguageLibrary;
import fr.labsticc.framework.constraints.view.ConstraintPanel;
import fr.labsticc.framework.constraints.view.IConstraintPanelActionHandler;
import fr.labsticc.framework.constraints.view.IConstraintViewersConfiguration;
import fr.labsticc.framework.constraints.view.TableColumnSortSelectionListener;
import fr.labsticc.framework.constraints.view.TableColumnSorter;
import fr.labsticc.framework.core.exception.IExceptionHandler;
import fr.openpeople.rdal.ide.view.EditorUtil;
import fr.openpeople.rdal.model.core.AbstractRequirement;
import fr.openpeople.rdal.model.core.CoreFactory;
import fr.openpeople.rdal.model.core.ModelElementReference;
import fr.openpeople.rdal.model.core.RefExpressionCollectedModelElements;
import fr.openpeople.rdal.model.core.RefUserSelectedModelElements;
import fr.openpeople.rdal.model.core.ReferencedModelElements;
import fr.openpeople.rdal.service.IRequirementBusinessDelegate;

public class ReferencedDesignElementsPanel extends Composite {

    private TableViewer tblElements;
    private List<ModelElementReference> dataElements;
    private ToolBar tbrActions;
    private ToolItem tbiUseQuery;
    private ToolItem tbiSelectElements;
    private ToolItem tbiOpenElements;

    private ConstraintPanel pnlConstraint;

    private final IRequirementBusinessDelegate businessDelegate;
    private final IExceptionHandler exceptionHandler;

    private final ILabelProvider labelProvider = new LabelProvider() {

        @Override
        public String getText(final Object p_object) {
            return businessDelegate.getText(p_object);
        }

        @Override
        public Image getImage(final Object p_object) {
            return (Image) businessDelegate.getImage(p_object);
        }
    };

    private AbstractRequirement requirement;

    public ReferencedDesignElementsPanel(final Composite p_parent, final int pi_style,
            final IConstraintViewersConfiguration p_constraintViewsConfig,
            final IRequirementBusinessDelegate p_businessDelegate, final IExceptionHandler p_exceptionHandler) {
        super(p_parent, pi_style);

        businessDelegate = p_businessDelegate;
        exceptionHandler = p_exceptionHandler;
        dataElements = new ArrayList<ModelElementReference>();
        requirement = null;

        createControls(p_constraintViewsConfig);
    }

    private void createControls(final IConstraintViewersConfiguration p_constraintViewsConfig) {
        setLayout(new FillLayout());
        final SashForm sashForm = new SashForm(this, SWT.VERTICAL | SWT.LEFT_TO_RIGHT);
        sashForm.setLayout(new GridLayout());

        createElementsTable(sashForm);
        createExpressionPanel(sashForm, p_constraintViewsConfig);

        sashForm.setWeights(new int[] { 1, 2 });
    }

    private void createElementsTable(final Composite p_parent) {
        final Composite pnlElements = new Composite(p_parent, SWT.NULL);
        pnlElements.setLayout(new GridLayout());

        tbrActions = new ToolBar(pnlElements, SWT.FLAT | SWT.WRAP | SWT.RIGHT);

        tbiUseQuery = createToolBarItem("/icons/useQuery.gif",
                "Use query expression to calculate design model elements", SWT.CHECK, new SelectionAdapter() {

                    @Override
                    public void widgetSelected(final SelectionEvent p_evt) {
                        final boolean useQuery = ((ToolItem) p_evt.getSource()).getSelection();
                        setReferencedModelElements(useQuery);
                    }
                });
        tbiOpenElements = createToolBarItem("/icons/openElements.gif", "Open design model element(s)", SWT.PUSH,
                new SelectionAdapter() {

                    @Override
                    public void widgetSelected(final SelectionEvent p_evt) {
                        openEditors();
                    }
                });
        tbiOpenElements.setEnabled(false);

        tbiSelectElements = createToolBarItem("/icons/selectElements.gif", "Select referenced design element(s)",
                SWT.PUSH, new SelectionAdapter() {

                    @Override
                    public void widgetSelected(final SelectionEvent p_evt) {
                        selectReferencedElements();
                    }
                });

        createTblElements(pnlElements);
    }

    private void createTblElements(final Composite p_parent) {
        tblElements = new TableViewer(p_parent,
                SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
        final Table table = tblElements.getTable();
        table.setToolTipText("Double-click element to open it.");
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        table.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseDoubleClick(MouseEvent p_evt) {
                final Object source = p_evt.getSource();

                if (source instanceof Table) {
                    final Table tbl = (Table) source;

                    if (tbl.getSelectionCount() == 1) {
                        openEditors();
                    }
                }
            }
        });

        final GridData gridData = new GridData();
        gridData.verticalAlignment = GridData.FILL;
        gridData.grabExcessHorizontalSpace = true;
        gridData.grabExcessVerticalSpace = true;
        gridData.horizontalAlignment = GridData.FILL;
        tblElements.getControl().setLayoutData(gridData);

        tblElements.setContentProvider(new IStructuredContentProvider() {

            @Override
            public void inputChanged(final Viewer p_viewer, final Object p_oldInput, final Object p_newInput) {
            }

            @Override
            public void dispose() {
            }

            @Override
            public Object[] getElements(final Object p_inputElement) {
                return ((Collection<?>) p_inputElement).toArray();
            }
        });

        tblElements.setInput(dataElements);
        tblElements.setSorter(new TableColumnSorter());
        tblElements.addPostSelectionChangedListener(new ISelectionChangedListener() {

            @Override
            public void selectionChanged(final SelectionChangedEvent p_event) {
                if (p_event.getSelection() instanceof IStructuredSelection) {
                    final IStructuredSelection structSel = (IStructuredSelection) p_event.getSelection();
                    tbiOpenElements.setEnabled(structSel.size() > 0);
                } else {
                    tbiOpenElements.setEnabled(false);
                }
            }
        });

        buildColumns();
    }

    private void openEditors() {
        try {
            for (final ModelElementReference modelObjectRef : selectedRefModelElements()) {
                final EObject modelElement = modelObjectRef.getModelElement();
                EditorUtil.openEditor(modelElement);
            }
        } catch (Throwable p_th) {
            getExceptionHandler().handleException(p_th, null);
        }
    }

    private List<ModelElementReference> selectedRefModelElements() {
        final List<ModelElementReference> elements = new ArrayList<ModelElementReference>();
        final Table table = tblElements.getTable();
        for (final TableItem item : table.getSelection()) {
            elements.add((ModelElementReference) item.getData());
        }

        return elements;
    }

    private void buildColumns() {
        final TableColumnSortSelectionListener sortListener = new TableColumnSortSelectionListener(tblElements);

        ColumnLabelProvider colLabelProvider = new ColumnLabelProvider() {
            @Override
            public String getText(final Object p_element) {
                final ModelElementReference ref = (ModelElementReference) p_element;

                return labelProvider.getText(ref.getModelElement());
            }

            @Override
            public Image getImage(final Object p_element) {
                final ModelElementReference ref = (ModelElementReference) p_element;

                return labelProvider.getImage(ref.getModelElement());
            }
        };
        TableViewerColumn viewerColumn = new TableViewerColumn(tblElements, SWT.NONE);
        viewerColumn.setLabelProvider(colLabelProvider);
        TableColumn column = viewerColumn.getColumn();
        column.setText("Element");
        column.setWidth(350);
        column.setResizable(true);
        column.setMoveable(true);
        column.addSelectionListener(sortListener);

        colLabelProvider = new ColumnLabelProvider() {
            @Override
            public String getText(final Object p_element) {
                final ModelElementReference ref = (ModelElementReference) p_element;
                final EObject modelElement = ref.getModelElement();
                final Resource resource = modelElement.eResource();

                return resource == null ? "Unsaved" : String.valueOf(resource.getURI());
            }
        };
        viewerColumn = new TableViewerColumn(tblElements, SWT.NONE);

        viewerColumn.setLabelProvider(colLabelProvider);
        column = viewerColumn.getColumn();
        column.setText("Location");
        column.setWidth(600);
        column.setResizable(true);
        column.setMoveable(true);
        column.addSelectionListener(sortListener);
    }

    private void setReferencedModelElements(final boolean pb_useQuery) {
        try {
            if (pb_useQuery) {
                displayData(businessDelegate.setReferencedModelElements(requirement, pnlConstraint.getLanguageId(),
                        pnlConstraint.getConstraintText()));
            } else {
                displayData(businessDelegate.setReferencedModelElements(requirement, dataElements));
            }
        } catch (final Throwable p_th) {
            exceptionHandler.handleException(p_th, requirement);
        }
    }

    private void selectReferencedElements() {
        final ReferencedModelElements currentRefModelElement = requirement.getSatisfiedBy().get(0);
        final RefUserSelectedModelElements templRefModelElement;

        if (currentRefModelElement instanceof RefUserSelectedModelElements) {
            templRefModelElement = (RefUserSelectedModelElements) currentRefModelElement;
        } else {
            templRefModelElement = CoreFactory.eINSTANCE.createRefUserSelectedModelElements();
        }

        final RefModelElementsSelectionDialog dialog = new RefModelElementsSelectionDialog(getShell(),
                labelProvider, templRefModelElement, businessDelegate.modelElements(templRefModelElement),
                businessDelegate.modelElementsChoice(requirement, templRefModelElement));
        if (dialog.open() == Window.OK) {
            final Collection<EObject> selectedElements = dialog.getResult();

            if (selectedElements != null) {
                try {
                    displayData(businessDelegate.setModelElements(requirement, selectedElements));
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }
            }
        }
    }

    private void createExpressionPanel(final Composite p_parent,
            final IConstraintViewersConfiguration p_constraintViewsConfig) {
        final IConstraintPanelActionHandler actionHandler = new IConstraintPanelActionHandler() {

            @Override
            public List<ICompletionProposal> completionProposalRequested(final String p_languageId,
                    final String p_constraintText, final Collection<String> p_libraryIds) {
                try {
                    return businessDelegate.computeRefElementsCompletionProposals(requirement, p_constraintText);
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);

                    return null;
                }
            }

            @Override
            public String constraintEvaluationRequested(final String p_languageId, final String p_constraintText,
                    final Collection<String> p_libraryIds) {
                try {
                    final Collection<ModelElementReference> refElements = businessDelegate
                            .modelElementReferences(requirement);
                    setElements(refElements);

                    return refElements.toString();
                    //pnlConstraint.displayConstraint( p_constraintText, refElements.toString() );
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, p_constraintText);

                    return null;
                }
            }

            @Override
            public String constraintLoadingRequested(final String p_languageId) {
                final FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN);

                try {
                    fileDialog.setFilterExtensions(
                            new String[] { businessDelegate.languageFileExtension(requirement, p_languageId) });
                    fileDialog.setText("Load Constraint Expression");
                    final String resourceId = fileDialog.open();

                    if (resourceId != null) {
                        final String constraintText = businessDelegate.readConstraintText(p_languageId, resourceId);

                        // Must save the new data
                        displayData(businessDelegate.setRefModelElementsConstraintExprText(requirement,
                                p_languageId, constraintText));

                        return constraintText;
                    }
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }

                return null;
            }

            @Override
            public void constraintSavingRequested(final String p_languageId, final String p_constraintText) {
                final String languageId = pnlConstraint.getLanguageId();

                final FileDialog fileDialog = new FileDialog(getShell(), SWT.SAVE);

                try {
                    fileDialog.setFilterExtensions(
                            new String[] { businessDelegate.languageFileExtension(requirement, p_languageId) });
                    fileDialog.setText("Save Constraint Expression");
                    final String resourceId = fileDialog.open();

                    if (resourceId != null) {
                        businessDelegate.persistConstraint(languageId, resourceId, p_constraintText);
                    }
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }
            }

            @Override
            public Collection<String> constraintLanguageChanged(final String p_newLanguageId) {
                try {
                    displayData(businessDelegate.setReferencedModelElements(requirement, p_newLanguageId,
                            pnlConstraint.getConstraintText()));
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }

                final FormalLanguageExpression expression = ((RefExpressionCollectedModelElements) requirement
                        .getSatisfiedBy()).getQueryExpression();

                return expression.getUsedLibraryNames();
            }

            @Override
            public Collection<String> addLibrariesRequested(final String p_languageId,
                    final Collection<String> p_currentLibraries) {
                try {
                    final FormalLanguageExpression expression = ((RefExpressionCollectedModelElements) requirement
                            .getSatisfiedBy()).getQueryExpression();
                    final UsedLibrarySelectionDialog dialog = new UsedLibrarySelectionDialog(getShell(),
                            labelProvider, expression, businessDelegate.librariesChoice(expression));
                    if (dialog.open() == Window.OK) {
                        businessDelegate.setRefModelElementsLibraries(requirement, dialog.getResult());

                        return expression.getUsedLibraryNames();
                    }
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }

                return null;
            }

            @Override
            public void librariesRefreshRequested(final Collection<String> p_libraryNames) {
                try {
                    businessDelegate.refreshRefModelElementsLibraries(requirement, libraryIds(p_libraryNames));
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }
            }

            @Override
            public void librariesDeleted(final Collection<String> p_libraryNames) {
                try {
                    businessDelegate.deleteRefModelElementsLibraries(requirement, libraryIds(p_libraryNames));
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }
            }

            @Override
            public void openLibrariesRequested(final Collection<String> p_libraryNames) {
                try {
                    EditorUtil.openEditors(libraryIds(p_libraryNames));
                } catch (final Throwable p_th) {
                    getExceptionHandler().handleException(p_th, requirement);
                }
            }

            @Override
            public void constraintTextChanged(final String p_languageId, final String p_constraintText) {
                // The text change event may be fired even after the use query button has been released.
                // Call this method only when in proper type of referenced model elements.
                if (tbiUseQuery.getSelection()) {
                    try {
                        businessDelegate.setRefModelElementsConstraintExprText(requirement, p_languageId,
                                p_constraintText);
                    } catch (final Throwable p_th) {
                        getExceptionHandler().handleException(p_th, requirement);
                    }
                }
            }
        };

        pnlConstraint = new ConstraintPanel(p_parent, SWT.NULL, actionHandler, p_constraintViewsConfig,
                getExceptionHandler());

        final GridData data = new GridData();
        data.grabExcessHorizontalSpace = true;
        data.horizontalAlignment = SWT.FILL;
        data.grabExcessVerticalSpace = true;
        data.verticalAlignment = SWT.FILL;
        pnlConstraint.setLayoutData(data);
    }

    private Collection<String> libraryIds(final Collection<String> p_libraryNames) {
        final Collection<String> libIds = new HashSet<String>();
        final FormalConstraintLanguage language = (FormalConstraintLanguage) ((RefExpressionCollectedModelElements) requirement
                .getSatisfiedBy()).getQueryExpression().getLanguage();

        for (final String libName : p_libraryNames) {
            final FormalLanguageLibrary library = language.libraryByName(libName);

            if (library != null) {
                libIds.add(library.getId());
            }
        }

        return libIds;
    }

    public ToolItem createToolBarItem(final String p_imagePath, final String p_tooltip, final int pi_style,
            final SelectionListener p_listener) {
        final ToolItem tbiItem = new ToolItem(tbrActions, pi_style);
        tbiItem.setToolTipText(p_tooltip);

        if (p_imagePath != null) {
            tbiItem.setImage(createImage(p_imagePath));
        }

        if (p_listener != null) {
            tbiItem.addSelectionListener(p_listener);
        }

        return tbiItem;
    }

    private Image createImage(final String p_imagePath) {
        return new Image(getDisplay(),
                Thread.currentThread().getContextClassLoader().getResourceAsStream(p_imagePath));
    }

    public void setElements(final Collection<ModelElementReference> p_elements) {
        dataElements.clear();

        if (p_elements != null) {
            dataElements.addAll(p_elements);
        }

        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                tblElements.refresh();
            }
        });
    }

    protected IExceptionHandler getExceptionHandler() {
        return exceptionHandler;
    }

    public void displayData(final AbstractRequirement p_requirement) {
        requirement = p_requirement;

        displayReferencedModelElements();
    }

    private void displayReferencedModelElements() {
        final ReferencedModelElements refElements = requirement.getSatisfiedBy().get(0);

        final FormalLanguageExpression refExpression;

        if (refElements instanceof RefUserSelectedModelElements) {
            //         for ( final ModelElementReference ref : ( (RefModelElementsCollection) refElements ).getModelElementReferences() ) {
            //            elements.add( ref.getModelElement() );
            //         }

            refExpression = null;
        } else if (refElements instanceof RefExpressionCollectedModelElements) {
            //         elements = null;
            refExpression = ((RefExpressionCollectedModelElements) refElements).getQueryExpression();
        } else {
            //         elements = null;
            refExpression = null;
        }

        displayExpression(refExpression);
        manageButtons(refExpression != null);
        setElements(refElements == null ? null : refElements.getModelElementReferences());
    }

    private void manageButtons(final boolean pb_useQuery) {
        tbiUseQuery.setSelection(pb_useQuery);
        tbiSelectElements.setEnabled(!pb_useQuery);
        pnlConstraint.setEnabled(pb_useQuery);
    }

    private void displayExpression(final FormalLanguageExpression p_expression) {
        final String languageId;
        final String expressionText;

        if (p_expression == null) {
            languageId = null;
            expressionText = null;
        } else {
            expressionText = p_expression.getText();

            final ConstraintLanguage language = p_expression.getLanguage();

            if (language == null) {
                languageId = null;
            } else {
                languageId = language.getId();
            }
        }

        final Set<String> definedLanguageIds = new TreeSet<String>();

        for (final ConstraintLanguage language : businessDelegate.definedLanguages(requirement)) {
            if (language instanceof FormalConstraintLanguage) {
                definedLanguageIds.add(language.getId());
            }
        }

        pnlConstraint.configure(definedLanguageIds, languageId);
        pnlConstraint.displayConstraint(expressionText, null);

        displayLibraries(p_expression);
    }

    private void displayLibraries(final FormalLanguageExpression p_expression) {
        final Collection<String> libraryNames = new ArrayList<String>();

        if (p_expression != null) {
            for (final FormalLanguageLibrary library : ((FormalLanguageExpression) p_expression)
                    .getUsedLibraries()) {
                libraryNames.add(library.getName());
            }
        }

        pnlConstraint.setLibraries(libraryNames);
    }
}