blob: fd00dbfbb7a392496ffc4ce477a21aafc2912024 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Borland Software Corporation and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.emf.util.ui.provider;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
public class EmfModelContentProvider implements ITreeContentProvider {
public EmfModelContentProvider() {
}
public Object[] getChildren(Object parentElement) {
if(parentElement instanceof Node) {
return ((Node)parentElement).getChildren();
}
return new Object[0];
}
public Object getParent(Object element) {
if(element instanceof Node) {
return ((Node)element).getParent();
}
return null;
}
public boolean hasChildren(Object element) {
if(element instanceof Node) {
return ((Node)element).hasChildren();
}
return true;
}
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public static interface IUriNode {
URI getUri();
}
public static abstract class Node {
public Node(Object parent) {
myParent = parent;
}
public Object getParent() {
return myParent;
}
public boolean hasChildren() {
return getChildren().length > 0;
}
public abstract Object getData();
public abstract Object[] getChildren();
@Override
public boolean equals(Object obj) {
if(obj instanceof Node == false) {
return false;
}
Node node = (Node)obj;
boolean eq = getData() == null ?
node.getData() == null :
getData().equals(node.getData());
return eq;
}
@Override
public int hashCode() {
return getData() == null ? 0 : getData().hashCode();
}
private final Object myParent;
}
public static class EReferenceNode extends Node {
public EReferenceNode(EReference ref, EObjectNode parent) {
super(parent);
myRef = ref;
}
@Override
public Object getData() {
return myRef;
}
@Override
public Object[] getChildren() {
EObjectNode parent = (EObjectNode)getParent();
EObject obj = parent.getObject();
Object value = obj.eGet(myRef);
List<Object> children = new ArrayList<Object>();
if(value instanceof List<?>) {
for(Iterator<?> it = ((List<?>) value).iterator(); it.hasNext(); ) {
EObject child = (EObject)it.next();
children.add(new EObjectNode(child, this));
}
}
else if(value instanceof EObject) {
children.add(new EObjectNode((EObject)value, this));
}
return children.toArray();
}
private final EReference myRef;
}
public static class EObjectNode extends Node implements IUriNode {
public EObjectNode(EObject obj, Object parent) {
super(parent);
myObj = obj;
}
public URI getUri() {
return EcoreUtil.getURI(myObj);
}
@Override
public Object getData() {
return getObject();
}
public EObject getObject() {
return myObj;
}
@Override
public Object[] getChildren() {
List<Object> children = new ArrayList<Object>();
for(EReference ref : myObj.eClass().getEAllContainments()) {
if(ref.isDerived()) {
continue;
}
EReferenceNode node = new EReferenceNode(ref, this);
if(!node.hasChildren()) {
continue;
}
children.add(node);
}
return children.toArray();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof EObjectNode == false) {
return false;
}
EObjectNode node = (EObjectNode) obj;
return getUri() == null ? node.getUri() == null : getUri().equals(node.getUri());
}
@Override
public int hashCode() {
return getUri() == null ? 0 : getUri().hashCode();
}
public final EObject myObj;
}
public static class ResourceNode extends Node implements IUriNode {
public ResourceNode(Resource resource) {
super(null);
myResource = resource;
}
public URI getUri() {
return myResource.getURI();
}
@Override
public Object getData() {
return getResource();
}
public Resource getResource() {
return myResource;
}
@Override
public Object[] getChildren() {
List<Object> children = new ArrayList<Object>();
for(EObject child : myResource.getContents()) {
children.add(new EObjectNode(child, this));
}
return children.toArray();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof ResourceNode == false) {
return false;
}
ResourceNode other = (ResourceNode)obj;
boolean eq = myResource.getURI() == null ?
other.myResource.getURI() == null :
myResource.getURI().equals(other.myResource.getURI());
return eq;
}
@Override
public int hashCode() {
return myResource == null ? 0 : myResource.hashCode();
}
private final Resource myResource;
}
public static EObjectNode makeEObjectNode(EObject obj, Object root) {
EObject container = obj.eContainer();
if(container == null) {
return new EObjectNode(obj, root);
}
else {
return new EObjectNode(obj, makeEReferenceNode(container, (EReference)obj.eContainingFeature(), root));
}
}
public static Node makeEReferenceNode(EObject container, EReference ref, Object root) {
return new EReferenceNode(ref, makeEObjectNode(container, root));
}
}