/*
* 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.transformation.ui.actions;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.IDE;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.core.workspace.ModelTransformations;
import org.teiid.designer.core.workspace.ModelWorkspaceException;
import org.teiid.designer.metamodels.diagram.Diagram;
import org.teiid.designer.transformation.ui.PluginConstants;
import org.teiid.designer.transformation.ui.UiConstants;
import org.teiid.designer.ui.common.UiPlugin;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.editors.ModelEditor;
import org.teiid.designer.ui.editors.ModelEditorManager;
import org.teiid.designer.ui.viewsupport.ModelUtilities;
/**
* ShowDependencyDiagramAction
*
* @since 8.0
*/
public class ShowDependencyDiagramAction extends TransformationAction implements UiConstants{
//============================================================================================================================
// Constants
//============================================================================================================================
// Constructors
/**
* Construct an instance of ShowDependencyDiagramAction.
*
*/
public ShowDependencyDiagramAction() {
super(null);
this.setUseWaitCursor(false);
}
//============================================================================================================================
// ISelectionListener Methods
/**
* @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection)
* @since 4.0
*/
@Override
public void selectionChanged(final IWorkbenchPart part, final ISelection selection) {
super.selectionChanged(part, selection);
determineEnablement();
}
//============================================================================================================================
// Action Methods
/**
* @see org.eclipse.jface.action.Action#run()
* @since 4.0
*/
@Override
protected void doRun() {
final EObject eObject = SelectionUtilities.getSelectedEObject(getSelection());
if( eObject != null ) {
// See if it has a transformation object:
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
if( modelResource != null && ModelUtilities.isVirtual(modelResource)) {
try {
List transformations = modelResource.getModelTransformations().getTransformations(eObject);
if( transformations != null && transformations.size() == 1 ) {
ModelEditor editor = getModelEditorForObject(eObject, true);
if( editor != null ) {
ModelEditorManager.activate(editor);
Diagram depDiagram = getDependencyDiagram(modelResource, eObject);
if( depDiagram != null ) {
editor.closeObjectEditor();
editor.openModelObject(depDiagram);
}
}
}
} catch (ModelWorkspaceException e) {
String message = Util.getString("ShowDependencyDiagramAction.showDependencyDiagramError", modelResource.toString()); //$NON-NLS-1$
Util.log(IStatus.ERROR, e, message);
}
}
}
determineEnablement();
}
private Diagram getDependencyDiagram(ModelResource modelResource, EObject eObject) {
Iterator iter = null;
try {
iter = modelResource.getModelDiagrams().getDiagrams(eObject).iterator();
} catch (ModelWorkspaceException e) {
String message = Util.getString("ShowDependencyDiagramAction.getDiagramsError", modelResource.toString()); //$NON-NLS-1$
Util.log(IStatus.ERROR, e, message);
}
if( iter != null ) {
Diagram nextDiagram = null;
while( iter.hasNext() ) {
nextDiagram = (Diagram)iter.next();
if( nextDiagram.getType() != null &&
nextDiagram.getType().equals(PluginConstants.DEPENDENCY_DIAGRAM_TYPE_ID))
return nextDiagram;
}
}
Diagram depDiagram = null;
// Couldn't find one so create one
boolean requiredStart = ModelerCore.startTxn(false, true, "Create Dependency Diagram", this); //$NON-NLS-1$
boolean succeeded = false;
try {
depDiagram = modelResource.getModelDiagrams().createNewDiagram(eObject, false); // Do Not persist this diagram.
depDiagram.setType(PluginConstants.DEPENDENCY_DIAGRAM_TYPE_ID);
succeeded = true;
} catch (ModelWorkspaceException mwe) {
String message = Util.getString("ShowDependencyDiagramAction.createDependencyDiagramError", modelResource.toString()); //$NON-NLS-1$
Util.log(IStatus.ERROR, mwe, message);
} finally {
if( requiredStart ) {
if(succeeded) {
ModelerCore.commitTxn();
} else {
ModelerCore.rollbackTxn();
}
}
}
return depDiagram;
}
//============================================================================================================================
// Declared Methods
/**
* @since 4.0
*/
private void determineEnablement() {
final EObject eObject = SelectionUtilities.getSelectedEObject(getSelection());
if( eObject != null && canLegallyEditResource() ) {
// See if it has a transformation object:
ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject);
if( modelResource != null && ModelUtilities.isVirtual(modelResource)) {
try {
ModelTransformations modelTransformations = modelResource.getModelTransformations();
if ( modelTransformations != null ) {
List transformations = modelTransformations.getTransformations(eObject);
if( transformations != null && transformations.size() == 1 ) {
setEnabled(true);
return;
}
}
} catch (ModelWorkspaceException e) {
String message = Util.getString("ShowDependencyDiagramAction.showDependencyDiagramError", modelResource.toString()); //$NON-NLS-1$
Util.log(IStatus.ERROR, e, message);
}
}
}
setEnabled(false);
}
private static ModelEditor getModelEditorForObject(EObject object, boolean forceOpen) {
ModelEditor result = null;
IFile file = null;
ModelResource mdlRsrc = ModelUtilities.getModelResourceForModelObject(object);
if ( mdlRsrc != null){
file = (IFile) mdlRsrc.getResource();
result = getModelEditorForFile(file, forceOpen);
}
return result;
}
// =============================================
// Private Methods
private static ModelEditor getModelEditorForFile(IFile file, boolean forceOpen) {
ModelEditor result = null;
if ( file != null ) {
IWorkbenchPage page = UiPlugin.getDefault().getCurrentWorkbenchWindow().getActivePage();
if ( page != null ) {
// look through the open editors and see if there is one available for this model file.
IEditorReference[] editors = page.getEditorReferences();
for ( int i=0 ; i<editors.length ; ++i ) {
IEditorPart editor = editors[i].getEditor(false);
if ( editor != null ) {
IEditorInput input = editor.getEditorInput();
if ( input instanceof IFileEditorInput ) {
if ( file.equals(((IFileEditorInput) input).getFile()) ) {
// found it;
if ( editor instanceof ModelEditor ) {
result = (ModelEditor) editor;
}
break;
}
}
}
}
if ( result == null && forceOpen) {
// there is no editor open for this object. Open one and hand it the double-click target.
try {
IEditorPart editor = IDE.openEditor(page, file);
if ( editor instanceof ModelEditor ) {
result = (ModelEditor) editor;
}
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
}
return result;
}
}