/*******************************************************************************
* Copyright (c) 2008, 2012
* 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:
* Javier Canovas (javier.canovas@inria.fr)
*******************************************************************************/
package fr.inria.atlanmod.collaboro.ui.views;
import java.util.ArrayList;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.provider.EModelElementItemProvider;
import org.eclipse.emf.ecore.provider.EcoreItemProviderAdapterFactory;
import org.eclipse.emf.ecore.util.EcoreAdapterFactory;
import org.eclipse.emf.edit.provider.IItemPropertySource;
import org.eclipse.emf.edit.ui.provider.PropertySource;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.internal.keys.model.ModelElement;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.ui.views.properties.IPropertySourceProvider;
import fr.inria.atlanmod.collaboro.history.AbstractSyntaxElement;
import fr.inria.atlanmod.collaboro.history.ConcreteSyntaxElement;
import fr.inria.atlanmod.collaboro.history.ExistingAbstractSyntaxElement;
import fr.inria.atlanmod.collaboro.history.ModelChange;
import fr.inria.atlanmod.collaboro.history.NewAbstractSyntaxElement;
import fr.inria.atlanmod.collaboro.history.Solution;
import fr.inria.atlanmod.collaboro.history.SyntaxElement;
import fr.inria.atlanmod.collaboro.history.Update;
import fr.inria.atlanmod.collaboro.history.impl.ModelChangeImpl;
import fr.inria.atlanmod.collaboro.history.provider.HistoryItemProviderAdapterFactory;
import fr.inria.atlanmod.collaboro.history.provider.ModelChangeItemProvider;
import fr.inria.atlanmod.collaboro.notation.NotationElement;
import fr.inria.atlanmod.collaboro.notation.provider.NotationItemProviderAdapterFactory;
import fr.inria.atlanmod.collaboro.notation.util.NotationAdapterFactory;
public class ChangesContentProvider implements IStructuredContentProvider, ITreeContentProvider, IPropertySourceProvider {
private Solution solution;
public ChangesContentProvider(Solution solution) {
super();
this.solution = solution;
}
@Override
public void dispose() {
// TODO Auto-generated method stub
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
// TODO Auto-generated method stub
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof ModelChange) {
ModelChange modelChange = (ModelChange) parentElement;
SyntaxElement referred = modelChange.getReferredElement();
SyntaxElement target = modelChange.getTarget();
ArrayList<Object> result = new ArrayList<Object>();
if(referred != null) result.add(referred);
if(target != null) result.add(target);
if (modelChange instanceof Update) {
Update update = (Update) modelChange;
if(update.getSource() != null) result.add(update.getSource());
}
return result.toArray();
} else if (parentElement instanceof SyntaxElement) {
SyntaxElement syntaxElement = (SyntaxElement) parentElement;
Object result = null;
if (syntaxElement instanceof NewAbstractSyntaxElement) {
NewAbstractSyntaxElement abstractSyntaxElement = (NewAbstractSyntaxElement) syntaxElement;
EModelElement modelElement = abstractSyntaxElement.getElement();
EcoreItemProviderAdapterFactory factory = new EcoreItemProviderAdapterFactory();
result = new SyntaxElementPropertySource(modelElement, syntaxElement, (IItemPropertySource) factory.adapt(modelElement, IItemPropertySource.class));
} else if (syntaxElement instanceof ExistingAbstractSyntaxElement) {
ExistingAbstractSyntaxElement abstractSyntaxElement = (ExistingAbstractSyntaxElement) syntaxElement;
EModelElement modelElement = abstractSyntaxElement.getElement();
EcoreItemProviderAdapterFactory factory = new EcoreItemProviderAdapterFactory();
result = new SyntaxElementPropertySource(modelElement, syntaxElement, (IItemPropertySource) factory.adapt(modelElement, IItemPropertySource.class));
} else if (syntaxElement instanceof ConcreteSyntaxElement) {
ConcreteSyntaxElement concreteSyntaxElement = (ConcreteSyntaxElement) syntaxElement;
NotationElement notationElement = concreteSyntaxElement.getElement();
NotationItemProviderAdapterFactory factory = new NotationItemProviderAdapterFactory();
result = new SyntaxElementPropertySource(notationElement, syntaxElement, (IItemPropertySource) factory.adapt(notationElement, IItemPropertySource.class));
}
return new Object[] { result };
}
return null;
}
@Override
public Object getParent(Object element) {
if (element instanceof ModelChange) {
return null;
} else if (element instanceof SyntaxElement) {
SyntaxElement syntaxElement = (SyntaxElement) element;
return syntaxElement.eContainer();
} else if (element instanceof SyntaxElementPropertySource) {
SyntaxElementPropertySource elementPropertySource = (SyntaxElementPropertySource) element;
return elementPropertySource.getParent();
}
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof ModelChange) {
return true;
} else if (element instanceof SyntaxElement) {
return true;
}
return false;
}
@Override
public Object[] getElements(Object inputElement) {
return solution.getChanges().toArray();
}
@Override
public IPropertySource getPropertySource(Object object) {
System.out.println("llamando para " + object);
return null;
}
}