/******************************************************************************* * Copyright (c) 2017 protos software gmbh (http://www.protos.de). * 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: * Juergen Haug (initial contribution) * *******************************************************************************/ package org.eclipse.etrice.ui.behavior.fsm.provider import com.google.common.collect.ArrayListMultimap import com.google.common.collect.Multimap import java.util.Collection import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.util.EcoreUtil import org.eclipse.etrice.core.fsm.fSM.ModelComponent import org.eclipse.etrice.ui.behavior.fsm.editor.AbstractFSMDiagramTypeProvider import org.eclipse.etrice.ui.common.base.support.DiagramAccessBase import org.eclipse.graphiti.mm.pictograms.PictogramElement import org.eclipse.graphiti.mm.pictograms.PictogramLink import org.eclipse.graphiti.services.Graphiti /** * Provides the {@linkplain PictogramElement} objects of the base class diagram. * This is a reverse mapping from room business objects to linked base diagram pictograms. * * TODO: use fsmgenmodel instead */ class BaseDiagramProvider { val Multimap baseDiagramBusinessObjs = ArrayListMultimap.create new(AbstractFSMDiagramTypeProvider diagramTypeProvider) { val diagramAccess = diagramTypeProvider.injector.getInstance(DiagramAccessBase) val mc = Graphiti.linkService.getBusinessObjectForLinkedPictogramElement(diagramTypeProvider.diagram) as ModelComponent val rs = diagramTypeProvider.diagram.eResource.resourceSet // open base diagrams => causes full recursive update or creation of all base diagrams // all base diagrams have to be considered because inherited subgraph could not exist yet val baseClasses = newArrayList => [ var base = mc.base while(base !== null && it.add(base)) { base = base.base } ] baseClasses.reverseView.forEach[ base | val baseDiagram = diagramAccess.getDiagram(base, rs) if(baseDiagram != null) { // create mapping from business object to pictogram elements EcoreUtil.ExternalCrossReferencer.find(baseDiagram).forEach [ targetEObj, eFeatureSetting | eFeatureSetting.map[getEObject].filter(PictogramLink).map[pictogramElement].forEach [ pe | baseDiagramBusinessObjs.put(targetEObj, pe) ] ] // base diagram resource not needed anymore rs.resources.remove(baseDiagram.eResource) } ] } def Collection getPictograms(EObject roomObj) { if(roomObj == null) emptyList else baseDiagramBusinessObjs.get(roomObj) } }