/* * 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.custom.actions; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.IWorkbenchPart; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.workspace.ModelResource; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.DiagramUiPlugin; import org.teiid.designer.diagram.ui.actions.DiagramAction; import org.teiid.designer.diagram.ui.custom.CustomDiagramModelFactory; import org.teiid.designer.diagram.ui.editor.DiagramEditor; import org.teiid.designer.diagram.ui.editor.DiagramEditorUtil; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.metamodels.diagram.Diagram; 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.ModelObjectUtilities; import org.teiid.designer.ui.viewsupport.ModelUtilities; /** * RemoveTransformationSource * * @since 8.0 */ public class RemoveFromDiagramAction extends DiagramAction { private static final String THIS_CLASS = "RemoveFromDiagramAction"; //$NON-NLS-1$ private DiagramEditor editor; // ///////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS // ///////////////////////////////////////////////////////////////////////////////////////////// public RemoveFromDiagramAction() { super(); setImageDescriptor(DiagramUiPlugin.getDefault().getImageDescriptor(DiagramUiConstants.Images.REMOVE_FROM_DIAGRAM)); } // ///////////////////////////////////////////////////////////////////////////////////////////// // METHODS // ///////////////////////////////////////////////////////////////////////////////////////////// /* (non-Javadoc) * @see org.eclipse.ui.ISelectionListener#selectionChanged(IWorkbenchPart, ISelection) */ @Override public void selectionChanged( IWorkbenchPart thePart, ISelection theSelection ) { super.selectionChanged(thePart, theSelection); setEnabled(shouldEnable()); } /* (non-Javadoc) * @see org.eclipse.jface.action.IAction#run() */ @Override protected void doRun() { if (editor != null) { // Need to get the current diagram DiagramModelNode diagramNode = editor.getCurrentModel(); Diagram diagram = (Diagram)diagramNode.getModelObject(); // Need to get ahold of the CustomDiagramModelFactory CustomDiagramModelFactory modelFactory = (CustomDiagramModelFactory)editor.getModelFactory(); // And call add(SelectionUtilities.getSelectedEObjects(getSelection()) if (modelFactory != null) { boolean handleConstruction = !DiagramEditorUtil.isDiagramUnderConstruction(diagram); boolean requiredStart = false; boolean succeeded = false; try { if (handleConstruction) { DiagramEditorUtil.setDiagramUnderConstruction(diagram); } // ------------------------------------------------- // Let's wrap this in a transaction!!! // ------------------------------------------------- requiredStart = ModelerCore.startTxn(true, false, "Add To Custom Diagram", this); //$NON-NLS-1$$ modelFactory.remove(SelectionUtilities.getSelectedEObjects(getSelection()), diagramNode); succeeded = true; } catch (Exception ex) { DiagramUiConstants.Util.log(IStatus.ERROR, ex, ex.getClass().getName() + ":" + THIS_CLASS + ".doRun()"); //$NON-NLS-1$ //$NON-NLS-2$ } finally { if (requiredStart) { if (succeeded) { ModelerCore.commitTxn(); } else { ModelerCore.rollbackTxn(); } } if (handleConstruction) { DiagramEditorUtil.setDiagramConstructionComplete(diagram, true); } } } } } private boolean shouldEnable() { if (!(this.getPart() instanceof ModelEditor) || getSelection() == null || SelectionUtilities.getSelectedEObjects(getSelection()).size() < 0) return false; return allSelectedInDiagram() && isWritable(); } private boolean allSelectedInDiagram() { // check the diagram to see if all selected objects are in diagram?? if (editor != null && editor.getDiagramViewer() != null && editor.getDiagramViewer().getSelectionHandler() != null) { List selectedEObjects = editor.getDiagramViewer().getSelectionHandler().getSelectedEObjects(); if (selectedEObjects == null || selectedEObjects.isEmpty()) return false; Iterator iter = SelectionUtilities.getSelectedEObjects(getSelection()).iterator(); EObject eObj = null; while (iter.hasNext()) { eObj = (EObject)iter.next(); if (!selectedEObjects.contains(eObj)) return false; } } return true; } public void setDiagramEditor( DiagramEditor editor ) { this.editor = editor; } private boolean isWritable() { if (editor != null) { DiagramModelNode currentDiagram = editor.getCurrentModel(); if (currentDiagram != null) { EObject diagram = currentDiagram.getModelObject(); if (!ModelObjectUtilities.isReadOnly(diagram)) { return true; } } } return false; } /** * This method is called in the run() method of AbstractAction to give the actions a hook into canceling the run at the last * minute. This overrides the AbstractAction preRun() method. */ @Override protected boolean preRun() { if (requiresEditorForRun()) { List allSelectedEObjects = SelectionUtilities.getSelectedEObjects(getSelection()); if (allSelectedEObjects != null && !allSelectedEObjects.isEmpty()) { EObject eObject = (EObject)allSelectedEObjects.get(0); ModelResource mr = ModelUtilities.getModelResourceForModelObject(eObject); if (mr != null) { ModelEditorManager.activate(mr, false); } } } return true; } }