fr.inria.atlanmod.emfviews.ui.linkingview.view.ModelSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for fr.inria.atlanmod.emfviews.ui.linkingview.view.ModelSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2013 INRIA.
 * 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:
 * Juan David Villa Calle - initial API and implementation
 *******************************************************************************/
package fr.inria.atlanmod.emfviews.ui.linkingview.view;

import java.io.IOException;
import java.util.ArrayList;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;

import fr.inria.atlanmod.emfviews.core.EView;
import fr.inria.atlanmod.emfviews.core.Viewtype;
import fr.inria.atlanmod.emfviews.util.EmfViewsUtil;
import fr.inria.atlanmod.emfviews.virtualLinks.Association;
import fr.inria.atlanmod.emfviews.virtualLinks.LinkedElement;
import fr.inria.atlanmod.emfviews.virtualLinks.VirtualLink;
import fr.inria.atlanmod.emfviews.virtualLinks.VirtualLinks;
import fr.inria.atlanmod.emfviews.virtualLinks.VirtualLinksFactory;
import fr.inria.atlanmod.emfviews.virtualLinks.VirtualLinksPackage;

public class ModelSelectionDialog extends TitleAreaDialog {

    private CheckboxTreeViewer treeViewer;

    // The model element that is currently selected on an editor
    private EObject selectedElement;

    private EObject modelRoot;

    Composite parent;

    // The views link model element
    private VirtualLinks tempLinksModel;

    private EView currentView;

    public void setSelectedElement(EObject selectedElement) {
        this.selectedElement = selectedElement;

    }

    public ModelSelectionDialog(Shell parentShell, EObject modelRoot, EView currentView) {
        super(parentShell);
        this.modelRoot = modelRoot;
        this.currentView = currentView;
        this.tempLinksModel = currentView.getVirtualLinkManager().getLinks();
    }

    @Override
    public void create() {
        super.create();
        setTitle("Create a link");
        setMessage("You can select several elements", IMessageProvider.INFORMATION);
    }

    public Association getConformantToAssociation(EObject sourceEObject, EObject targetEObject) {
        Association conformantToAssociation = null;
        Viewtype currentViewtype = currentView.getViewtype();
        XMIResourceImpl viewtypeLinks = currentViewtype.getCorrespondenceModelResource();

        if (viewtypeLinks.getContents() != null && viewtypeLinks.getContents().size() > 0) {
            if (viewtypeLinks.getContents().get(0) instanceof VirtualLinks) {
                VirtualLinks vl = (VirtualLinks) (viewtypeLinks.getContents().get(0));
                EList<VirtualLink> virtualLinks = vl.getVirtualLinks();
                ArrayList<Association> associations = new ArrayList<Association>();
                for (VirtualLink virtualLink : virtualLinks) {
                    if (virtualLink instanceof Association)
                        associations.add((Association) virtualLink);
                }
                boolean associationFound = false;
                for (int i = 0; i < associations.size() && !associationFound; i++) {
                    Association a = associations.get(i);
                    EList<LinkedElement> targetElements = a.getTargetElements();
                    for (LinkedElement linkedElement : targetElements) {
                        //TODO Simplify this conditional
                        if (a.getSourceElement().getModelRef()
                                .compareToIgnoreCase(sourceEObject.eClass().getEPackage().getNsURI()) == 0
                                && a.getSourceElement().getName()
                                        .compareToIgnoreCase(sourceEObject.eClass().getName()) == 0
                                && linkedElement.getModelRef()
                                        .compareToIgnoreCase(targetEObject.eClass().getEPackage().getNsURI()) == 0
                                && linkedElement.getName()
                                        .compareToIgnoreCase(targetEObject.eClass().getName()) == 0) {
                            associationFound = true;
                            conformantToAssociation = a;
                        }

                    }

                }
            }
        }

        return conformantToAssociation;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        this.parent = parent;
        Composite area = (Composite) super.createDialogArea(parent);
        Composite container = new Composite(area, SWT.NONE);
        container.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout layout = new GridLayout(1, false);
        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        container.setLayout(layout);

        treeViewer = new CheckboxTreeViewer(area, SWT.BORDER);

        Tree tree = treeViewer.getTree();
        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(new ReflectiveItemProviderAdapterFactory()));

        treeViewer
                .setContentProvider(new AdapterFactoryContentProvider(new ReflectiveItemProviderAdapterFactory()));

        treeViewer.setInput(modelRoot);
        return area;
    }

    @Override
    protected void okPressed() {

        Object[] treeElementsSelected = treeViewer.getCheckedElements();
        if (treeElementsSelected != null && treeElementsSelected.length > 0) {

            ArrayList<Association> newAssociations = new ArrayList<Association>();
            LinkedElement source = EmfViewsUtil.createLinkedElement(
                    "referenceFrom" + selectedElement.eClass().getName() + "ElementFrom"
                            + selectedElement.eClass().getEPackage().getNsPrefix() + "Model",
                    selectedElement.eClass().getEPackage().getNsURI(),
                    selectedElement.eResource().getURIFragment(selectedElement), null);
            for (Object treeItem : treeElementsSelected) {
                EObject selectedEobject = (EObject) treeItem;
                // So here is where i need to save the link.
                VirtualLinksPackage vl = VirtualLinksPackage.eINSTANCE;
                VirtualLinksFactory vLinksFactory = VirtualLinksFactory.eINSTANCE;
                Association vAsso = vLinksFactory.createAssociation();
                // TODO Choose a different name so that they will not all be
                // named the same.
                Association conformantAssociation = getConformantToAssociation(selectedElement, selectedEobject);
                if (conformantAssociation != null) {
                    vAsso.setName(conformantAssociation.getName());
                    // TODO this one is important, because it needs to have the name
                    // of an association on the metamodel
                    vAsso.setAssociationTypeName(conformantAssociation.getAssociationTypeName());
                    LinkedElement target = EmfViewsUtil.createLinkedElement(
                            "referenceTo" + selectedEobject.eClass().getName() + "ElementFrom"
                                    + selectedEobject.eClass().getEPackage().getNsPrefix() + "Model",
                            selectedEobject.eClass().getEPackage().getNsURI(),
                            selectedEobject.eResource().getURIFragment(selectedEobject), null);

                    vAsso.setSourceElement(source);
                    vAsso.getTargetElements().add(target);
                    newAssociations.add(vAsso);

                    tempLinksModel.getLinkedElements().add(source);
                    tempLinksModel.getLinkedElements().add(target);
                    tempLinksModel.getVirtualLinks().add(vAsso);
                } else {
                    MessageDialog.openInformation(parent.getShell(), "Link not created",
                            "Link not created: Create first an association of this type at the viewtype level");
                    this.setReturnCode(Window.CANCEL);
                }

            }

            try {

                EmfViewsUtil.persistLinksModel(tempLinksModel,
                        org.eclipse.emf.common.util.URI.createURI(tempLinksModel.eResource().getURI().toString()));

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

        super.okPressed();
    }

}