/* * 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.mapping.ui.actions; import java.util.Iterator; 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.ModelWorkspaceException; import org.teiid.designer.mapping.ui.PluginConstants; import org.teiid.designer.mapping.ui.UiConstants; import org.teiid.designer.mapping.ui.UiPlugin; import org.teiid.designer.metamodels.diagram.Diagram; import org.teiid.designer.metamodels.transformation.MappingClass; import org.teiid.designer.metamodels.transformation.StagingTable; import org.teiid.designer.transformation.util.TransformationHelper; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.editors.ModelEditor; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * ShowDetailedMappingDiagramAction * * @since 8.0 */ public class ShowDetailedMappingDiagramAction extends MappingAction { // ============================================================================================================================ // Constants // ============================================================================================================================ // Constructors /** * Construct an instance of ShowDetailedMappingDiagramAction. */ public ShowDetailedMappingDiagramAction() { super(); this.setUseWaitCursor(false); setImageDescriptor(UiPlugin.getDefault().getImageDescriptor(UiConstants.Images.SHOW_DETAILED_MAPPING)); } // ============================================================================================================================ // 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 && wasMappingClassSelected(eObject)) { // Let's get Transformation Diagram (i.e. create it if it doesn't exist yet) Diagram transformationDiagram = getTransformationDiagram(modelResource, eObject); ModelEditor editor = getModelEditorForObject(transformationDiagram, true); if (editor != null) { editor.openModelObject(transformationDiagram); } } } determineEnablement(); } private boolean wasMappingClassSelected( EObject eObject ) { if (ModelUtilities.getModelResourceForModelObject(eObject) != null) return (eObject instanceof MappingClass) && TransformationHelper.isVirtualSqlTable(eObject); return false; } private Diagram getTransformationDiagram( ModelResource modelResource, EObject eObject ) { Iterator iter = null; String diagramType = null; if (eObject instanceof StagingTable) { diagramType = org.teiid.designer.transformation.ui.PluginConstants.TRANSFORMATION_DIAGRAM_TYPE_ID; } else { diagramType = PluginConstants.MAPPING_TRANSFORMATION_DIAGRAM_TYPE_ID; } try { iter = modelResource.getModelDiagrams().getDiagrams(eObject).iterator(); } catch (ModelWorkspaceException e) { String message = UiConstants.Util.getString("ShowDetailedMappingDiagram.getDiagramsError", modelResource.toString()); //$NON-NLS-1$ UiConstants.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(diagramType)) return nextDiagram; } } // Couldn't find one so create one boolean requiresStart = false; boolean succeeded = false; try { requiresStart = ModelerCore.startTxn(false, true, "Create Transformation Diagram", this); //$NON-NLS-1$ Diagram depDiagram = modelResource.getModelDiagrams().createNewDiagram(eObject, true); // Do Not persist this diagram. depDiagram.setType(diagramType); succeeded = true; return depDiagram; } catch (ModelWorkspaceException mwe) { String message = UiConstants.Util.getString("ShowDetailedMappingDiagram.createMappingDiagramError", modelResource.toString()); //$NON-NLS-1$ UiConstants.Util.log(IStatus.ERROR, mwe, message); } finally { if (requiresStart) { if (succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } } return null; } // ============================================================================================================================ // Declared Methods /** * @since 4.0 */ private void determineEnablement() { final EObject eObject = SelectionUtilities.getSelectedEObject(getSelection()); if (eObject != null && wasMappingClassSelected(eObject)) { // See if it has a transformation object: ModelResource modelResource = ModelUtilities.getModelResourceForModelObject(eObject); if (modelResource != null && ModelUtilities.isVirtual(modelResource)) { setEnabled(true); return; } } 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; } }