/* * 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.model; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.diagram.ui.DiagramUiPlugin; import org.teiid.designer.diagram.ui.util.DiagramUiUtilities; import org.teiid.designer.metamodels.diagram.AbstractDiagramEntity; import org.teiid.designer.metamodels.diagram.Diagram; /** * DiagramModelFactoryImpl * * @since 8.0 */ abstract public class DiagramModelFactoryImpl implements DiagramModelFactory { // private static final String THIS_CLASS = "DiagramModelFactoryImpl"; //$NON-NLS-1$ @Override public DiagramModelNode createModel(Object oBaseObject, IProgressMonitor monitor) { return null; } // public DiagramModelNode createModel(Object oBaseObject, String sNotationId, IProgressMonitor monitor) { // return null; // } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.model.DiagramModelFactory#notifyModel(org.eclipse.emf.common.notify.Notification) */ @Override public boolean notifyModel(Notification notification, DiagramModelNode diagramModelNode, String sDiagramTypeId) { // Default implementation does nothing; return true; } protected boolean currentDiagramRemoved(Diagram diagram) { boolean isRemoved = false; if( diagram == null ) isRemoved = true; else if( diagram.eResource() == null ) { isRemoved = true; if( diagram.getTarget() != null && diagram.getTarget().eResource() != null) isRemoved = false; // check the eContainer. if( diagram.eContainer() == null ) { if(diagramIsTransient(diagram) ) isRemoved = false; } } return isRemoved; } protected boolean diagramIsTransient(Diagram diagram) { // Get DiagramTypeManager and ask it the same question return DiagramUiPlugin.getDiagramTypeManager().isTransientDiagram(diagram); } public DiagramModelNode getParentInDiagram(DiagramModelNode diagramModelNode, EObject parentEObject) { DiagramModelNode parentModelNode = null; if( diagramModelNode.getModelObject() != null && diagramModelNode.getModelObject() == parentEObject) parentModelNode = diagramModelNode; else parentModelNode = findParent(diagramModelNode, parentEObject); return parentModelNode; } private DiagramModelNode findParent(DiagramModelNode someModelNode, EObject parentEObject ) { List modelChildren = someModelNode.getChildren(); Iterator iter = modelChildren.iterator(); DiagramModelNode nextChildNode = null; while( iter.hasNext() ) { nextChildNode = (DiagramModelNode)iter.next(); if( nextChildNode.getModelObject() != null && nextChildNode.getModelObject() == parentEObject ) return nextChildNode; } return null; } /** * Utility method to find a specific diagram model node for an eObject and it is a direct child of the * diagram. (i.e not a nested classifier, or an attribute) * @param diagramModelNode * @param someEObject * @return diagramModelNode. */ public DiagramModelNode getNodeInDiagram(DiagramModelNode diagramModelNode, EObject someEObject) { if( diagramModelNode.getModelObject() != null && diagramModelNode.getModelObject() == someEObject) return diagramModelNode; List modelChildren = diagramModelNode.getChildren(); Iterator iter = modelChildren.iterator(); DiagramModelNode nextChildNode = null; while( iter.hasNext() ) { nextChildNode = (DiagramModelNode)iter.next(); if( nextChildNode.getModelObject() != null && nextChildNode.getModelObject() == someEObject) return nextChildNode; } return null; } public DiagramModelNode getModelNode(DiagramModelNode diagramModelNode, EObject someModelObject) { if ( diagramModelNode.getModelObject() != null && diagramModelNode.getModelObject() == someModelObject) { return diagramModelNode; } DiagramModelNode matchedNode = null; // Check the children List contents = diagramModelNode.getChildren(); if( contents != null && !contents.isEmpty() ) { Iterator iter = contents.iterator(); Object nextObj = null; DiagramModelNode nextNode = null; while (iter.hasNext() && matchedNode == null) { nextObj = iter.next(); if (nextObj instanceof DiagramModelNode) { nextNode = (DiagramModelNode)nextObj; matchedNode = getModelNode(nextNode, someModelObject); } } } return matchedNode; } protected boolean notifierIsDiagramEntity(Notification notification) { Object notifier = ModelerCore.getModelEditor().getChangedObject(notification); return notifier instanceof AbstractDiagramEntity; } protected boolean notifierIsDiagram(Notification notification) { Object notifier = ModelerCore.getModelEditor().getChangedObject(notification); return notifier instanceof Diagram; } protected boolean isDiagramNotifier(Notification notification) { Object notifier = ModelerCore.getModelEditor().getChangedObject(notification); return (notifier instanceof Diagram || notifier instanceof AbstractDiagramEntity); } protected EObject getEObjectTarget(Notification notification) { Object targetObject = ModelerCore.getModelEditor().getChangedObject(notification); if( targetObject instanceof EObject ) return (EObject)targetObject; return null; } protected boolean isValidTarget(EObject targetEObject) { if( targetEObject == null || targetEObject instanceof Diagram || targetEObject instanceof AbstractDiagramEntity ) return false; return true; } @Override public void handleLabelProviderChanged(DiagramModelNode diagramModelNode, List eObjects) { HashMap updateNodes = new HashMap(eObjects.size()); Iterator iter = eObjects.iterator(); while( iter.hasNext() ) { EObject nextEObject = (EObject)iter.next(); DiagramModelNode nextNode = getModelNode(diagramModelNode, nextEObject); if( nextNode != null ) { updateNodes.put(nextNode, "x"); //$NON-NLS-1$ // nextNode.updateForErrorsAndWarnings(); DiagramModelNode parentClassNode = DiagramUiUtilities.getClassifierParentNode(nextNode); if( parentClassNode != null ) { updateNodes.put(parentClassNode, "x"); //$NON-NLS-1$ } } } iter = updateNodes.keySet().iterator(); while( iter.hasNext() ) { DiagramModelNode nextNode = (DiagramModelNode)iter.next(); if( nextNode != null ) { nextNode.updateForErrorsAndWarnings(); } } } /** * Method which determines whether this EObject can be represented in a diagram or not. * @return boolean */ @Override public boolean isDrawable( EObject object ) { return true; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.model.DiagramModelFactory#shouldRefreshDiagram(org.eclipse.emf.common.notify.Notification, org.teiid.designer.diagram.ui.model.DiagramModelNode, java.lang.String) */ @Override public boolean shouldRefreshDiagram(Notification notification, DiagramModelNode diagramModelNode, String sDiagramTypeId) { // return false by default. return false; } }