/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.custom;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.teiid.designer.core.metamodel.aspect.MetamodelAspect;
import org.teiid.designer.core.metamodel.aspect.uml.UmlClassifier;
import org.teiid.designer.core.metamodel.aspect.uml.UmlPackage;
import org.teiid.designer.core.workspace.ModelDiagrams;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.IDiagramProvider;
import org.teiid.designer.diagram.ui.PluginConstants;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.metamodels.diagram.PresentationEntity;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* <p>CustomDiagramContentProvider is the specific ContentProvider for all package diagram model
* objects inside ModelResources.</p>
* <p>CustomDiagramContentProvider implements ITreeContentProvider because this interface has the right
* methods for the functionality this class provides.</p>
*
* @since 8.0
*/
final public class CustomDiagramContentProvider implements ITreeContentProvider, IDiagramProvider, DiagramUiConstants {
// ===========================================
// Static
private static final Object[] NO_CHILDREN = new Object[0];
// ===========================================
// Constructors
/**
* Construct an instance of ModelObjectContentProvider.
*/
public CustomDiagramContentProvider() {
}
// ===========================================
// Methods
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
@Override
public void dispose() {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
*/
@Override
public synchronized Object[] getChildren(Object parentElement) {
Object[] children = NO_CHILDREN;
if ( parentElement instanceof PresentationEntity ) {
// then NO_CHILDREN is the right answer
} else if ( parentElement instanceof EObject ) {
// get resource, and get Diagrams for resource.
EObject eObject = (EObject) parentElement;
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
if( modelResource != null ) {
List diagramList = new ArrayList();
ArrayList allChildren = new ArrayList();
MetamodelAspect aspect = ModelObjectUtilities.getUmlAspect(eObject);
if ( aspect instanceof UmlClassifier ) {
return children;
} else if ( aspect instanceof UmlPackage ) {
// make sure this object contains a Package Diagram
diagramList = getCustomDiagrams(modelResource, eObject);
}
if ( !diagramList.isEmpty() ) {
allChildren.addAll(diagramList);
children = allChildren.toArray();
}
}
} else if ( parentElement instanceof ModelResource ) {
ModelResource modelResource = (ModelResource) parentElement;
List diagramList = getCustomDiagrams(modelResource, null);
ArrayList allChildren = new ArrayList();
if ( !diagramList.isEmpty() ) {
allChildren.addAll(diagramList);
children = allChildren.toArray();
}
}
return children;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
@Override
public Object[] getElements(Object inputElement) {
return getChildren(inputElement);
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
*/
@Override
public Object getParent(Object element) {
Object result = null;
if ( element instanceof Diagram ) {
Object target = ((Diagram) element).getTarget();
if ( target instanceof EObject ) {
result = target;
} else if ( target instanceof ModelAnnotation ) {
// the diagram is underneath the model file node - return the IResource
result = ModelUtilities.getModelResourceForModelObject((ModelAnnotation) target);
}
}
return result;
}
/* (non-Javadoc)
* @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
*/
@Override
public boolean hasChildren(Object element) {
Object[] children= getChildren(element);
return (children != null) && children.length > 0;
}
private List getCustomDiagrams(ModelResource modelResource, EObject eObject) {
List customDiagrams = new ArrayList();
ModelDiagrams modelDiagrams = null;
try {
modelDiagrams = modelResource.getModelDiagrams();
if ( modelDiagrams != null && eObject != null ) {
List diagramList = new ArrayList(modelDiagrams.getDiagrams(eObject));
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while( iter.hasNext() ) {
nextDiagram = (Diagram)iter.next();
if( nextDiagram.getType() != null ) {
if( nextDiagram.getType().equals(PluginConstants.CUSTOM_DIAGRAM_TYPE_ID) )
customDiagrams.add(nextDiagram);
} else {
String message = "Diagram has no type!! shouldn't happen. Target = " + eObject + " Diagram = " + nextDiagram; //$NON-NLS-1$ //$NON-NLS-2$
System.out.println(message);
}
}
} else if( modelDiagrams != null ) { // This means get custom diagrams below the model Resource
List diagramList = new ArrayList(modelDiagrams.getDiagrams(null));
Iterator iter = diagramList.iterator();
Diagram nextDiagram = null;
while( iter.hasNext() ) {
nextDiagram = (Diagram)iter.next();
if( nextDiagram.getType() != null ) {
if( nextDiagram.getType().equals(PluginConstants.CUSTOM_DIAGRAM_TYPE_ID) )
customDiagrams.add(nextDiagram);
} else {
String message = "Diagram has no type!! shouldn't happen. Target = " + eObject + " Diagram = " + nextDiagram; //$NON-NLS-1$ //$NON-NLS-2$
System.out.println(message);
}
}
}
} catch (ModelWorkspaceException e) {
if ( !modelResource.hasErrors() ) {
// No errors, then it's unexpected, so log ...
String message = Util.getString("CustomDiagramContentProvider.getCustomDiagramError", modelResource.toString()); //$NON-NLS-1$
Util.log(IStatus.ERROR, e, message);
}
}
return customDiagrams;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramProvider#canDelete(org.teiid.designer.metamodels.diagram.Diagram)
*/
@Override
public boolean canDelete(Diagram diagram) {
return true;
}
}