/*
* 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.Collections;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.widgets.Shell;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.diagram.ui.AbstractDiagramType;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.DiagramUiPlugin;
import org.teiid.designer.diagram.ui.PluginConstants;
import org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter;
import org.teiid.designer.diagram.ui.figure.DiagramFigureFactory;
import org.teiid.designer.diagram.ui.model.DiagramModelFactory;
import org.teiid.designer.diagram.ui.pakkage.actions.PackageDiagramActionAdapter;
import org.teiid.designer.diagram.ui.part.DiagramEditPartFactory;
import org.teiid.designer.diagram.ui.preferences.DiagramColorObject;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.diagram.ui.util.dialog.LargeDiagramDialog;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.ui.editors.ModelEditorPage;
import org.teiid.designer.ui.util.DiagramProxy;
import org.teiid.designer.ui.viewsupport.ModelObjectUtilities;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* PackageDiagramType
*
* @since 8.0
*/
public class PackageDiagramType extends AbstractDiagramType {
//============================================================================================================================
// FIELDS
//============================================================================================================================
private static DiagramEditPartFactory editPartFactory;
private static DiagramModelFactory modelFactory;
private static DiagramFigureFactory figureFactory;
private static DiagramColorObject bkgdColorObject;
private static PackageDiagramProvider diagramProvider;
private static final int N_LARGE_VALUE = 300;
private static final String LARGE_DIAGRAM_DIALOG_TITLE = DiagramUiConstants.Util.getString("PackageDiagramType.largeDiagramDialogTitle"); //$NON-NLS-1$
//============================================================================================================================
// CONSTRUCTORS
//============================================================================================================================
/**
* Construct an instance of PackageDiagramType.
*
*/
public PackageDiagramType() {
super();
}
//============================================================================================================================
// METHODS implementing IDiagramType
//============================================================================================================================
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getEditPartFactory()
*/
@Override
public DiagramEditPartFactory getEditPartFactory() {
if( editPartFactory == null )
editPartFactory = new PackageDiagramPartFactory();
return editPartFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getFigureFactory()
*/
@Override
public DiagramFigureFactory getFigureFactory() {
if( figureFactory == null )
figureFactory = new PackageDiagramFigureFactory();
return figureFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getModelFactory()
*/
@Override
public DiagramModelFactory getModelFactory() {
if( modelFactory == null )
modelFactory = new PackageDiagramModelFactory();
return modelFactory;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getActionAdapter()
*/
@Override
public IDiagramActionAdapter getActionAdapter(ModelEditorPage editor) {
return new PackageDiagramActionAdapter(editor);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDisplayName()
*/
@Override
public String getDisplayName() {
return DiagramUiConstants.Util.getString("DiagramNames.packageDiagram"); //$NON-NLS-1$) ;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#canOpenContext(java.lang.Object)
*/
@Override
public boolean canOpenContext(Object input) {
boolean canOpen = false;
if( input instanceof EObject ) {
EObject eObj = (EObject)input;
// Note that transient diagrams will appear stale (i.e. eObj.eResource() == NULL
// so we need to defer to their "target" eObjects to make the call
boolean eObjectIsStale = ModelObjectUtilities.isStale(eObj);
if( eObj instanceof Diagram &&
((Diagram)eObj).getType() != null &&
((Diagram)eObj).getType().equals(PluginConstants.PACKAGE_DIAGRAM_TYPE_ID)) {
EObject targetEObj = ((Diagram)eObj).getTarget();
if( targetEObj != null && !ModelObjectUtilities.isStale(targetEObj)) {
canOpen = true;
} else if( targetEObj == null ) {
return true;
}
} else if( !eObjectIsStale ) {
if( DiagramUiUtilities.isStandardUmlPackage(input)) {
canOpen = true;
} else if( DiagramUiUtilities.isModelResourceChild(input)) {
canOpen = true;
} else if( DiagramUiUtilities.hasParentPackage(input)) {
canOpen = true;
} else {
// Case where we have a column or nested table in object that has no package (table under a model)
EObject topClassifier = DiagramUiUtilities.getParentClassifier((EObject)input);
if( topClassifier != null && DiagramUiUtilities.isModelResourceChild(topClassifier))
canOpen = true;
}
}
} else if( input instanceof ModelResource ) {
if( ((ModelResource)input).exists())
canOpen = true;
}
return canOpen;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramForContext(java.lang.Object)
*/
@Override
public Diagram getDiagramForContext(Object actualInput) {
Diagram packageDiagram = null;
Object input = actualInput;
if( input instanceof DiagramProxy ) {
input = ((DiagramProxy)actualInput).getTarget();
if( input == null ) {
// We have a package diagram under model resource
// Need to set the input to the ModelResource
input = ((DiagramProxy)actualInput).getModelResource();
}
}
if( input instanceof Diagram &&
((Diagram)input).getType() != null &&
((Diagram)input).getType().equals(PluginConstants.PACKAGE_DIAGRAM_TYPE_ID))
packageDiagram = (Diagram)input;
else if( input instanceof ModelResource ) {
// We have an input of a model, so we want to find it's package diagram
packageDiagram = getDiagramProvider().getPackageDiagram((ModelResource)input, null, true);
} else if( DiagramUiUtilities.isStandardUmlPackage(input)) {
ModelResource mr = ModelUtilities.getModelResourceForModelObject((EObject)input);
packageDiagram = getDiagramProvider().getPackageDiagram(mr, (EObject)input, true);
} else if( input instanceof ModelResource ) {
packageDiagram = getDiagramProvider().getPackageDiagram((ModelResource)input, null, true);
} else if( DiagramUiUtilities.isModelResourceChild(input)) {
ModelResource mr = ModelUtilities.getModelResourceForModelObject((EObject)input);
packageDiagram = getDiagramProvider().getPackageDiagram(mr, null, true);
} else if( DiagramUiUtilities.hasParentPackage(input)) {
EObject thePackage = DiagramUiUtilities.getParentPackage(input);
if( thePackage != null ) {
packageDiagram = getDiagramProvider().getPackageDiagram(input, true);
}
} else {
// Case where we have a column or nested table in object that has no package (table under a model)
EObject topClassifier = DiagramUiUtilities.getParentClassifier((EObject)input);
if( topClassifier != null && DiagramUiUtilities.isModelResourceChild(topClassifier)) {
ModelResource mr = ModelUtilities.getModelResourceForModelObject((EObject)input);
packageDiagram = getDiagramProvider().getPackageDiagram(mr, null, true);
}
}
if (packageDiagram == null) {
// defect 16988 - pkg diagram still null; as a last resort, just display what we can:
ModelResource mr = null;
if( input instanceof ModelResource ) {
mr = (ModelResource)input;
} else if( input instanceof EObject ) {
mr = ModelUtilities.getModelResourceForModelObject((EObject)input);
}
if( mr != null )
packageDiagram = getDiagramProvider().getPackageDiagram(mr, null, true);
} // endif
return packageDiagram;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getBackgroundColorObject()
*/
@Override
public DiagramColorObject getBackgroundColorObject(String extensionID) {
if( bkgdColorObject == null ) {
bkgdColorObject = new DiagramColorObject(getDisplayName(), PluginConstants.Prefs.Appearance.PACKAGE_BKGD_COLOR);
}
return bkgdColorObject;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDiagramForGoToMarkerEObject(org.eclipse.emf.ecore.EObject)
*/
@Override
public Diagram getDiagramForGoToMarkerEObject(EObject eObject) {
return getDiagramForContext(eObject);
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getDisplayedPath(org.eclipse.emf.ecore.EObject)
*/
@Override
public String getDisplayedPath(Diagram diagram, EObject eObject) {
return null;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#getInitialSelection()
*/
@Override
public EObject getInitialSelection(Object object) {
if( object instanceof Diagram )
return ((Diagram)object).getTarget();
if( object instanceof ModelResource ) {
// Let's get the top-level package diagram, then get it's target
EObject modelAnnotation = null;
try {
modelAnnotation = ((ModelResource)object).getModelAnnotation();
} catch (ModelWorkspaceException theException) {
String message = DiagramUiConstants.Util.getString("ModelErrors.getIResourceerror", ((ModelResource)object).getItemName()); //$NON-NLS-1$
DiagramUiConstants.Util.log(IStatus.ERROR, theException, message);
}
return modelAnnotation;
}
return null;
}
private PackageDiagramProvider getDiagramProvider() {
if( diagramProvider == null )
diagramProvider = new PackageDiagramProvider();
return diagramProvider;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#isDiagramLarge(org.teiid.designer.metamodels.diagram.Diagram)
*/
@Override
public boolean isDiagramLarge(Diagram diagram) {
return getDiagramObjectCount(diagram) > N_LARGE_VALUE;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.IDiagramType#isDiagramTooLarge(org.teiid.designer.metamodels.diagram.Diagram)
*/
@Override
public boolean isDiagramTooLarge(Diagram diagram) {
int maxLimit = DiagramUiPlugin.getDefault().getPreferenceStore().getInt(PluginConstants.Prefs.LARGE_MODEL_SIZE);
int nObjects = getDiagramObjectCount(diagram);
boolean tooLarge = nObjects > maxLimit;
if( tooLarge ) {
Shell shell = DiagramUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
LargeDiagramDialog largeDiagramDialog = new LargeDiagramDialog(shell,LARGE_DIAGRAM_DIALOG_TITLE, nObjects, maxLimit);
largeDiagramDialog.open();
}
return tooLarge;
}
private int getDiagramObjectCount(Diagram diagram) {
int nObjects = 0;
Object targetObject = diagram.getTarget();
List contents = null;
if( targetObject != null && targetObject instanceof EObject && !(targetObject instanceof ModelAnnotation) ) {
contents = diagram.getTarget().eContents();
} else if( targetObject != null && targetObject instanceof EObject && targetObject instanceof ModelAnnotation) {
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(diagram);
if( modelResource != null ) {
try {
contents = modelResource.getEObjects();
} catch (ModelWorkspaceException e) {
contents = Collections.EMPTY_LIST;
String message = DiagramUiConstants.Util.getString("ModelErrors.getContentError", modelResource.getItemName()); //$NON-NLS-1$
DiagramUiConstants.Util.log(IStatus.ERROR, e, message);
}
} else {
contents = Collections.EMPTY_LIST;
}
} else {
contents = Collections.EMPTY_LIST;
}
nObjects = contents.size();
if( nObjects > 1 ) {
EObject nextEObject = null;
// Let's gather up all sub objects
Iterator iter = contents.iterator();
while( iter.hasNext() ) {
nextEObject = (EObject)iter.next();
if( nextEObject.eContents() != null && !nextEObject.eContents().isEmpty() )
nObjects += nextEObject.eContents().size();
}
}
return nObjects;
}
/**
* @see org.teiid.designer.diagram.ui.IDiagramType#getDiagramSelectionStandin(org.teiid.designer.metamodels.diagram.Diagram)
* @since 4.2
*/
@Override
public Object getDiagramSelectionStandin(Diagram diagram) {
// for package diagrams, let's get the target
Object target = diagram.getTarget();
if( target instanceof ModelAnnotation ) {
ModelResource mr = ModelUtilities.getModelResourceForModelObject(diagram);
IResource ir = null;
if( mr != null ) {
try {
ir = mr.getCorrespondingResource();
} catch (ModelWorkspaceException err) {
String message = DiagramUiConstants.Util.getString("ModelErrors.getIResourceerror", mr.getItemName()); //$NON-NLS-1$
DiagramUiConstants.Util.log(IStatus.ERROR, err, message);
}
}
return ir;
}
return target;
}
}