/*******************************************************************************
* Copyright (c) 2008, 2012 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.codegen.core.initializer;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.eef.components.ComponentsFactory;
import org.eclipse.emf.eef.components.PropertiesEditionComponent;
import org.eclipse.emf.eef.components.PropertiesEditionContext;
import org.eclipse.emf.eef.components.PropertiesEditionElement;
import org.eclipse.emf.eef.mapping.Category;
import org.eclipse.emf.eef.mapping.MappingFactory;
import org.eclipse.emf.eef.views.Container;
import org.eclipse.emf.eef.views.ElementEditor;
import org.eclipse.emf.eef.views.View;
import org.eclipse.emf.eef.views.ViewElement;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class ComponentTransformer extends AbstractTransformer {
private Map<EObject, List<ViewElement>> workingResolvTemp;
/* ===== Constructor ===== */
public ComponentTransformer(Map<EObject, List<ViewElement>> workingResolvTemp) {
this.workingResolvTemp = workingResolvTemp;
}
/* ===== Transformation ===== */
public PropertiesEditionContext genPackage2Context(GenPackage genPackage) {
PropertiesEditionContext context = ComponentsFactory.eINSTANCE.createPropertiesEditionContext();
context.setModel(genPackage);
context.setDocumentation("Edition Context for " + genPackage.getEcorePackage().getName()
+ " GenPackage");
Category components = MappingFactory.eINSTANCE.createCategory();
components.setName(genPackage.getEcorePackage().getName());
context.getCategories().add(components);
for (GenClass genClass : genPackage.getGenClasses()) {
if (!genClass.getEcoreClass().isAbstract()) {
components.getBindings().add(genClass2Component(genClass, genPackage));
}
}
return context;
}
public PropertiesEditionComponent genClass2Component(GenClass genClass, GenPackage genPackage) {
PropertiesEditionComponent component = ComponentsFactory.eINSTANCE.createPropertiesEditionComponent();
component.setName(genClass.getEcoreClass().getName());
component.setModel(genClass.getEcoreClass());
List<ViewElement> list = workingResolvTemp.get(genClass.getEcoreClass());
for (ViewElement viewElement : list) {
component.getViews().add((View)viewElement);
}
for (EStructuralFeature feature : genClass.getEcoreClass().getEAllStructuralFeatures()) {
if (isSignificant(feature) && !feature.isDerived()
&& !inheritedMember(feature, genClass.getEcoreClass())) {
PropertiesEditionElement structuralFeature2EditionElement = eStructuralFeature2EditionElement(
list, feature);
if (structuralFeature2EditionElement != null)
component.getProperties().add(structuralFeature2EditionElement);
}
}
return component;
}
public PropertiesEditionElement eStructuralFeature2EditionElement(List<ViewElement> concerningViews,
EStructuralFeature feature) {
PropertiesEditionElement element = ComponentsFactory.eINSTANCE.createPropertiesEditionElement();
element.setName(feature.getName());
element.setModel(feature);
List<ViewElement> list = workingResolvTemp.get(feature);
if (list != null) {
for (ViewElement viewElement : list) {
if (inConcerningViews(concerningViews, viewElement))
element.getViews().add((ElementEditor)viewElement);
}
} else {
System.err.println("No view found for : " + feature.toString());
return null;
}
return element;
}
/* ===== Misc utilities ===== */
private boolean inConcerningViews(List<ViewElement> concerningViews, ViewElement toCheck) {
for (ViewElement viewElement : concerningViews) {
if (viewElement instanceof View) {
if (inConcerningView((View)viewElement, toCheck))
return true;
}
}
return false;
}
private boolean inConcerningView(View concerningView, ViewElement toCheck) {
if (toCheck instanceof View && EcoreUtil.equals(concerningView, toCheck))
return true;
else {
Container next = toCheck.getContainer();
if (next != null)
return inConcerningView(concerningView, next);
else
return false;
}
}
}