/* * 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.pakkage; import java.util.ArrayList; 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.ModelResource; import org.teiid.designer.core.workspace.ModelWorkspaceException; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.DiagramUiPlugin; import org.teiid.designer.diagram.ui.IDiagramProvider; 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>PackageDiagramContentProvider is the specific ContentProvider for all package diagram model * objects inside ModelResources.</p> * <p>PackageDiagramContentProvider implements ITreeContentProvider because this interface has the right * methods for the functionality this class provides.</p> * * @since 8.0 */ final public class PackageDiagramContentProvider implements ITreeContentProvider, IDiagramProvider, DiagramUiConstants { private IPackageDiagramProvider packageDiagramProvider; // =========================================== // Static private static final Object[] NO_CHILDREN = new Object[0]; // =========================================== // Constructors /** * Construct an instance of ModelObjectContentProvider. */ public PackageDiagramContentProvider() { packageDiagramProvider = new PackageDiagramProvider(); } // =========================================== // 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 = getPackageDiagrams(modelResource, eObject); } if ( !diagramList.isEmpty() ) { allChildren.addAll(diagramList); children = allChildren.toArray(); } } } else if ( parentElement instanceof ModelResource ) { ModelResource modelResource = (ModelResource) parentElement; List diagramList = getPackageDiagrams(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) { return hasChildren(element, false); // Object[] children= getChildren(element); // return (children != null) && children.length > 0; } private boolean hasChildren(Object parentElement, boolean dummyBoolean) { if ( parentElement instanceof PresentationEntity ) { return false; } else if ( parentElement instanceof EObject ) { // get resource, and get Diagrams for resource. EObject eObject = (EObject) parentElement; ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject); if( modelResource != null ) { MetamodelAspect aspect = ModelObjectUtilities.getUmlAspect(eObject); if ( aspect instanceof UmlClassifier ) { return false; } else if ( aspect instanceof UmlPackage ) { // All packages have a package diagram, so we return true. // If they don't exist yet, we don't care, that will be handled // in getChildre() return true; } } } else if ( parentElement instanceof ModelResource ) { return hasPackageDiagram((ModelResource) parentElement, null); } return false; } public Diagram getPackageDiagram(ModelResource modelResource, EObject eObject) { Diagram packageDiagram = null; // if eObject == null, then it's a 'Model' node, then we don't ask for a contributed package diagram. if( eObject != null ) { // Here's where we ask the DiagramTypeManager for a package diagram for a specific target and resource // if it comes back null, then we go ahead with the default here.... packageDiagram = DiagramUiPlugin.getDiagramTypeManager().getPackageDiagram(modelResource, eObject, false); } else { try { packageDiagram = DiagramUiPlugin.getDiagramTypeManager().getPackageDiagram(modelResource, modelResource.getModelAnnotation(), false); } catch (ModelWorkspaceException e) { if (!modelResource.hasErrors()) { DiagramUiConstants.Util.log(IStatus.ERROR, e, e.getLocalizedMessage()); } } } if( packageDiagram == null ) { packageDiagram = packageDiagramProvider.getPackageDiagram(modelResource, eObject, false); } return packageDiagram; } private List getPackageDiagrams(ModelResource modelResource, EObject eObject) { List packageDiagrams = new ArrayList(); Diagram packageDiagram = getPackageDiagram(modelResource, eObject); if( packageDiagram != null ) packageDiagrams.add(packageDiagram); return packageDiagrams; } private boolean hasPackageDiagram(ModelResource modelResource, EObject eObject) { List diagramList = null; try { diagramList = new ArrayList(modelResource.getModelDiagrams().getDiagrams(eObject)); } catch (ModelWorkspaceException e) { String message = DiagramUiConstants.Util.getString("Problem in hasPackageDiagram() call for resource = ", modelResource.toString()); //$NON-NLS-1$ DiagramUiConstants.Util.log(IStatus.ERROR, e, message); } if( diagramList != null && !diagramList.isEmpty()) return true; return false; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.IDiagramProvider#canDelete(org.teiid.designer.metamodels.diagram.Diagram) */ @Override public boolean canDelete(Diagram diagram) { return false; } }