pt.iscte.xdiagram.provider.internal.handlers.ContainsHandler.java Source code

Java tutorial

Introduction

Here is the source code for pt.iscte.xdiagram.provider.internal.handlers.ContainsHandler.java

Source

/*******************************************************************************
 * Copyright (c) 2016 ISCTE-IUL.
 * 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:
 *     Andr L. Santos, Eduardo Gomes - initial API and implementation
 *******************************************************************************/
package pt.iscte.xdiagram.provider.internal.handlers;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.graphiti.mm.GraphicsAlgorithmContainer;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
import pt.iscte.xdiagram.dsl.model.ConnectableElement;
import pt.iscte.xdiagram.dsl.model.Contains;
import pt.iscte.xdiagram.dsl.model.Feature;
import pt.iscte.xdiagram.dsl.model.FeatureContainer;
import pt.iscte.xdiagram.provider.internal.FeatureHandler;

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;

public class ContainsHandler implements FeatureHandler {

    private Multimap<GraphicsAlgorithmContainer, Contains> references;
    private Map<GraphicsAlgorithmContainer, EObject> owners;

    public ContainsHandler() {
        references = ArrayListMultimap.create();
        owners = Maps.newHashMap();
    }

    public boolean isContainer(GraphicsAlgorithmContainer container) {
        return references.containsKey(container);
    }

    //   public Collection<Contains> getContainsFeature(ContainerShape container) {
    //      return references.get(container); 
    //   }

    public Collection<EReference> getReferences(ContainerShape container) {
        List<EReference> list = new ArrayList<>();
        for (Contains c : references.get(container))
            list.add(c.getModelReference());

        return list;
    }

    public Collection<EReference> getReferences(ContainerShape container, EObject eObject) {
        Collection<EReference> list = getReferences(container);
        Iterator<EReference> it = list.iterator();
        while (it.hasNext()) {
            if (!it.next().getEReferenceType().isInstance(eObject))
                it.remove();
        }
        return list;
    }

    public EObject getOwner(ContainerShape container) {
        assert isContainer(container);

        return owners.get(container);
    }

    @Override
    public Class<? extends Feature> getTargetFeature() {
        return Contains.class;
    }

    @Override
    public void handle(FeatureContainer element, Feature feature, EObject eObject, Diagram diagram,
            GraphicsAlgorithmContainer container, GraphicsAlgorithm figure) {

        Contains cont = (Contains) feature;

        owners.put(container, eObject);
        references.put(container, cont);
    }

    @Override
    public void applyDefaults(FeatureContainer element, EObject eObject, Diagram diagram,
            GraphicsAlgorithmContainer container, GraphicsAlgorithm figure) {

    }

    @Override
    public boolean accept(FeatureContainer element) {
        return element instanceof ConnectableElement;
    }
}