/* * 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.actions; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.GroupMarker; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.action.ToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionProvider; import org.teiid.designer.diagram.ui.actions.DiagramGlobalActionsMap; import org.teiid.designer.diagram.ui.actions.LockDiagramAction; import org.teiid.designer.diagram.ui.actions.RefreshAction; import org.teiid.designer.diagram.ui.actions.RouterTypeMenuManager; import org.teiid.designer.diagram.ui.actions.SaveDiagramAction; import org.teiid.designer.diagram.ui.connection.NodeConnectionEditPart; import org.teiid.designer.diagram.ui.editor.DiagramActionAdapter; import org.teiid.designer.diagram.ui.editor.DiagramEditor; import org.teiid.designer.diagram.ui.model.DiagramModelNode; import org.teiid.designer.diagram.ui.notation.uml.part.UmlClassifierEditPart; import org.teiid.designer.diagram.ui.util.RelationalUmlEObjectHelper; import org.teiid.designer.ui.actions.IModelerActionConstants; import org.teiid.designer.ui.common.actions.AbstractAction; import org.teiid.designer.ui.common.actions.GlobalActionsMap; import org.teiid.designer.ui.common.eventsupport.SelectionUtilities; import org.teiid.designer.ui.editors.ModelEditorPage; /** * TransformationActionAdapter * * @since 8.0 */ public class PackageDiagramActionAdapter extends DiagramActionAdapter implements IPackageDiagramActionConstants, IModelerActionConstants { /////////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS /////////////////////////////////////////////////////////////////////////////////////////////// private static final String D_MARKER = IPackageDiagramActionConstants.ContextMenu.DIAGRAM_START; //============================================================================================================================ // Variables private RefreshAction refreshDiagramAction; private ShowParentDiagramAction upPackageDiagramAction; private MenuManager linkTypeManager; // private ActionContributionItem newAssociationACI; // overrides of global actions private RenameAction renameAction; private AbstractAction saveDiagramAction; private LockDiagramAction lockDiagramAction; // actions map is needed since we want to override the default print action private GlobalActionsMap actionsMap; //============================================================================================================================ // Constructors /** * @since 4.0 */ public PackageDiagramActionAdapter(final ModelEditorPage page) { super(page); } private boolean singleLinkSelected() { List selectedEPs = getSelectedInDiagram(); if( ! selectedEPs.isEmpty() && selectedEPs.size() == 1) { Object selectedEP = selectedEPs.get(0); if( selectedEP instanceof NodeConnectionEditPart ) return true; } return false; } private boolean diagramSelected() { ISelectionProvider selProvider = getEditorPage().getModelObjectSelectionProvider(); ISelection selection = selProvider.getSelection(); if( SelectionUtilities.isSingleSelection(selection)) { EObject eObj = SelectionUtilities.getSelectedEObject(selection); if( eObj != null && RelationalUmlEObjectHelper.getEObjectType(eObj) == RelationalUmlEObjectHelper.UML_PACKAGE ) { // We know a package is selected, now we need to see if the viewer has "nothing seleced" if( getDiagramEditor() != null ) { if( getDiagramEditor().getDiagramViewer().getSelectedEditParts().isEmpty() ) return true; } } } return false; } private boolean doRemoveOpen() { List selectedEPs = getSelectedInDiagram(); if( ! selectedEPs.isEmpty() && selectedEPs.size() == 1) { Object selectedEP = selectedEPs.get(0); if( selectedEP instanceof UmlClassifierEditPart ) return true; } return false; } private IAction getAction( String theActionId ) { IAction action = null; try { action = getActionService().getAction(theActionId); } catch (CoreException err) { } return action; } //============================================================================================================================ // Methods /* (non-Javadoc) * @See org.teiid.designer.ui.editors.AbstractModelEditorPageActionBarContributor#getGlobalActions() */ @Override public GlobalActionsMap getGlobalActions() { if ( actionsMap == null ) { actionsMap = new DiagramGlobalActionsMap(); actionsMap.reset(); this.renameAction.setDiagramEditor((DiagramEditor)getEditorPage()); actionsMap.put( EclipseGlobalActions.RENAME, this.renameAction ); } // PAF, 2004-12-07 - quick hack: enable/disable Link Types menu dynamically. updateLinkTypeMenu(); return actionsMap; } /** * Based on readonly status, update the enabled state of the link type submenu. */ private void updateLinkTypeMenu() { DiagramModelNode currentModel = getDiagramEditor().getCurrentModel(); if (currentModel != null) { boolean readOnly = currentModel.isReadOnly(); ((RouterTypeMenuManager)linkTypeManager).setEnabled(!readOnly); } // endif } /** * @since 4.0 */ @Override protected void initActions() { super.initActions(); //----- RefreshAction -----// this.refreshDiagramAction = (RefreshAction)getRegisteredAction(RefreshAction.class.getName()); if (this.refreshDiagramAction == null) { this.refreshDiagramAction = new RefreshAction(); registerAction(this.refreshDiagramAction); } //----- ShowParentDiagramAction -----// this.upPackageDiagramAction = (ShowParentDiagramAction)getRegisteredAction(ShowParentDiagramAction.class.getName()); if (this.upPackageDiagramAction == null) { this.upPackageDiagramAction = new ShowParentDiagramAction(); registerAction(this.upPackageDiagramAction); } //----- LinkSelectionAction -----// linkTypeManager = new RouterTypeMenuManager(); //----- SaveDiagramAction -----// this.saveDiagramAction = (AbstractAction)getRegisteredAction(SaveDiagramAction.class.getName()); if (this.saveDiagramAction == null) { this.saveDiagramAction = new SaveDiagramAction((DiagramEditor)this.getEditorPage()); registerAction(this.saveDiagramAction); } //----- RenameAction -----// this.renameAction = (RenameAction)getRegisteredAction(RenameAction.class.getName()); if (this.renameAction == null) { this.renameAction = new RenameAction(); registerAction(this.renameAction); } //----- SaveDiagramAction -----// this.lockDiagramAction = new LockDiagramAction(((DiagramEditor)this.getEditorPage())); registerAction(this.lockDiagramAction); } //============================================================================================================================ // AbstractModelEditorPageActionBarContributor Methods /* (non-Javadoc) * @See org.teiid.designer.ui.editors.AbstractModelEditorPageActionBarContributor#createContextMenu() */ @Override public void createContextMenu() { createContextMenu(IPackageDiagramActionConstants.ContextMenu.DIAGRAM_EDITOR_PAGE, getEditorPage().getControl()); } private void clearAllActions(IMenuManager theMenuMgr) { IContributionItem[] allContributions = theMenuMgr.getItems(); List removeItems = new ArrayList(allContributions.length); for(int i=0; i<allContributions.length; i++ ) { IContributionItem nextItem = allContributions[i]; if( !(nextItem instanceof GroupMarker) && !(nextItem instanceof Separator) ) { removeItems.add(nextItem); } } Iterator iter = removeItems.iterator(); while( iter.hasNext() ) { theMenuMgr.remove((IContributionItem)iter.next()); } } @Override public void contributeToMenuManager(IMenuManager theMenuMgr, ISelection selection) { removeDiagramActions(theMenuMgr); if( diagramSelected() ) { addDiagramActions(theMenuMgr); } else if( singleLinkSelected() ) { clearAllActions(theMenuMgr); // // now add the actions ((RouterTypeMenuManager)linkTypeManager).setSingleLinkEdit(true); ((RouterTypeMenuManager)linkTypeManager).setInitialSelection(); addDiagramActions(theMenuMgr); } else { addDiagramActions(theMenuMgr); if( doRemoveOpen() ) { // Remove Open IAction openAction = getAction(ModelerGlobalActions.OPEN); if (openAction != null && theMenuMgr.find(openAction.getId()) != null) { theMenuMgr.remove(openAction.getId()); } } } } private void addDiagramActions(IMenuManager theMenuMgr) { // now add the actions theMenuMgr.add(new Separator()); theMenuMgr.add(new GroupMarker(D_MARKER)); theMenuMgr.appendToGroup(D_MARKER, linkTypeManager); ((RouterTypeMenuManager)linkTypeManager).setInitialSelection(); theMenuMgr.appendToGroup(D_MARKER, this.refreshDiagramAction); theMenuMgr.appendToGroup(D_MARKER, this.upPackageDiagramAction); theMenuMgr.appendToGroup(D_MARKER, this.saveDiagramAction); theMenuMgr.add(new Separator()); } private void removeDiagramActions(IMenuManager theMenuMgr) { if ( theMenuMgr.find(D_MARKER) != null ) theMenuMgr.remove(D_MARKER); if ( theMenuMgr.find( this.refreshDiagramAction.getId() ) != null ) theMenuMgr.remove( this.refreshDiagramAction.getId() ); if ( theMenuMgr.find( this.upPackageDiagramAction.getId() ) != null ) theMenuMgr.remove( upPackageDiagramAction.getId() ); if ( theMenuMgr.find( this.linkTypeManager.getId() ) != null ) theMenuMgr.remove( this.linkTypeManager.getId() ); if ( theMenuMgr.find( this.saveDiagramAction.getId() ) != null ) theMenuMgr.remove( this.saveDiagramAction.getId() ); } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#contributeExportedActions(org.eclipse.jface.action.IMenuManager) */ @Override public void contributeExportedActions(IMenuManager theMenuMgr) { // nothing to add to the main menu // if ((theMenuMgr.getId() != null) && theMenuMgr.getId().equals(ModelerActionBarIdManager.getEditMenuId())) { // // edit menu contributions should only happen one time (contributeToMenu(IMenuManager)). // // call createActionContributionItem so that the contributions visibility can be controlled // // by the pageActivate/pageDeactivate methods. // } else { // // assume it must be a context menu. just add to end. // } } //============================================================================================================================ // EditorActionBarContributor Methods /** * @see org.eclipse.ui.part.EditorActionBarContributor#dispose() * @since 4.0 */ @Override public void dispose() { super.dispose(); linkTypeManager = null; } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#contributeToDiagramToolBar(org.eclipse.jface.action.IToolBarManager) */ @Override public void contributeToDiagramToolBar() { ToolBarManager tbm = ((DiagramEditor)getEditorPage()).getToolBarManager(); if( tbm != null ) { tbm.removeAll(); tbm.add(this.refreshDiagramAction); tbm.add(this.upPackageDiagramAction); tbm.add(this.lockDiagramAction); tbm.add(new Separator()); tbm.add(new Separator()); tbm.add(this.saveDiagramAction); this.refreshDiagramAction.setDiagramEditor((DiagramEditor)getEditorPage()); this.upPackageDiagramAction.setDiagramEditor((DiagramEditor)getEditorPage()); tbm.update(true); } } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#handleNotification(org.eclipse.emf.common.notify.Notification) */ @Override public void handleNotification(Notification theNotification) { // Currently doesn't need to do anything. } /* (non-Javadoc) * @See org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#enableDiagramToolbarActions() */ @Override public void enableDiagramToolbarActions() { if( this.upPackageDiagramAction != null ) this.upPackageDiagramAction.determineEnablement(); } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#shouldOverrideMenu() * @since 4.2 */ @Override public boolean shouldOverrideMenu(ISelection selection) { boolean value = false; if( singleLinkSelected() ) { return true; } else if( !singleLinkSelected() ){ // This is where we check for other cases..... value = false; } return value; } }