/* * 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.editor; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.notify.Notification; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.ui.ISelectionListener; import org.teiid.core.designer.util.I18nUtil; import org.teiid.designer.diagram.ui.DiagramUiConstants; import org.teiid.designer.diagram.ui.DiagramUiPlugin; import org.teiid.designer.diagram.ui.actions.DiagramActionService; import org.teiid.designer.ui.common.actions.AbstractAction; import org.teiid.designer.ui.common.actions.ActionService; import org.teiid.designer.ui.editors.AbstractModelEditorPageActionBarContributor; import org.teiid.designer.ui.editors.ModelEditorPage; /** * @since 8.0 */ public class DiagramActionAdapter extends AbstractModelEditorPageActionBarContributor implements IDiagramActionAdapter, DiagramUiConstants { // ///////////////////////////////////////////////////////////////////////////////////////////// // CONSTANTS // ///////////////////////////////////////////////////////////////////////////////////////////// private static final String PREFIX = I18nUtil.getPropertyPrefix(DiagramActionAdapter.class); // ============================================================================================================================ // Variables // collection of contributions that have been contributed via the contributeExportedActions(). // these contributions get installed in the Edit Menu and the visibility of these is controlled when // editor pages/diagram types are changed. these must be removed from the edit menu when this is disposed. private List contributionItems; // Hashmap of registered actions that can be used to cleanup during dispose method private HashMap allRegisteredActions = new HashMap(); /** The main menu being contributed to. */ private IMenuManager editMenu; private boolean actionsInitialized = false; // ============================================================================================================================ // Constructors /** * @since 4.0 */ public DiagramActionAdapter( final ModelEditorPage page ) { super(page); contributionItems = new ArrayList(); initActions(); } /** * @since 5.0 */ protected void initActions() { actionsInitialized = true; } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#setDiagramEditor(org.teiid.designer.ui.editors.ModelEditorPage) * @since 5.0 */ @Override public void setDiagramEditor( final ModelEditorPage editor ) { super.setActiveEditor(editor); if (!actionsInitialized) { initActions(); } } /** * @return * @since 5.0 */ protected DiagramEditor getDiagramEditor() { if (super.getEditorPage() instanceof DiagramEditor) return (DiagramEditor)super.getEditorPage(); return null; } /** * @return * @since 5.0 */ protected List getSelectedInDiagram() { if (getDiagramEditor() != null) { return getDiagramEditor().getDiagramViewer().getSelectedEditParts(); } return Collections.EMPTY_LIST; } // ============================================================================================================================ // Methods /** * @param newItem * @since 5.0 */ protected void addContributionItem( IContributionItem newItem ) { contributionItems.add(newItem); } /** * @return * @since 5.0 */ protected List getContributionItems() { return contributionItems; } /** * @param oldItem * @since 5.0 */ protected void removeContributionItem( IContributionItem oldItem ) { contributionItems.remove(oldItem); } /** * Retrieves the requested action from the action service. * * @param theActionId the action identifier * @return the action or <code>null</code> if not found in the service */ protected IAction getRegisteredAction( String theActionId ) { IAction result = null; ActionService actionService = getActionService(); String key = DiagramActionService.constructKey(theActionId, getEditorPage()); if (actionService.isRegistered(key)) { try { result = actionService.getAction(key); } catch (CoreException theException) { Util.log(IStatus.ERROR, Util.getString(PREFIX + "actionProblem", new Object[] {theActionId})); //$NON-NLS-1$ } } return result; } /** * Registers the specified action with the action service and wires it to receive selection events. * * @param theAction the action being registered */ protected void registerAction( AbstractAction theAction ) { DiagramUiPlugin.registerDiagramActionForSelection(theAction); String actionKey = DiagramActionService.constructKey(theAction, getEditorPage()); getActionService().registerAction(actionKey, theAction); allRegisteredActions.put(theAction, actionKey); } /** * Unregisters the specified action with the action service. * * @param theAction the action being unregistered */ protected void unregisterAction( AbstractAction theAction ) { DiagramUiPlugin.unregisterDiagramActionForSelection(theAction); String actionKey = (String)allRegisteredActions.get(theAction); getActionService().removeAction(actionKey); } /** * Creates an <code>ActionContributionItem</code> using the given action. Also hides the item and registers the action in the * service. * * @param theAction the action whose <code>ActionContributionItem</code> is being created * @since 4.0 */ protected ActionContributionItem createActionContributionItem( final IAction theAction ) { ActionContributionItem item = new ActionContributionItem(theAction); item.setVisible(false); addContributionItem(item); return item; } /** * @since 4.0 */ @Override public ActionService getActionService() { // Defect 24615 - Action service may be null. VDB editor will end up Hiding DiagramEditor and calling dispose without // initializing the action service. ActionService actionService = null; if (getEditorPage() != null && getEditorPage().getSite() != null && getEditorPage().getEditorSite().getPage() != null) { actionService = DiagramUiPlugin.getDefault().getActionService(getEditorPage().getSite().getPage()); } return actionService; } // ============================================================================================================================ // AbstractModelEditorPageActionBarContributor Methods /** * @See org.teiid.designer.ui.editors.ModelEditorPageActionBarContributor#pageActivated() * @since 4.0 */ @Override public void pageActivated() { // set main actionbar contributions to be visible setActionsVisible(true); } /** * @See org.teiid.designer.ui.editors.ModelEditorPageActionBarContributor#pageDeactivated() * @since 4.0 */ @Override public void pageDeactivated() { // set main actionbar contributions to be hidden setActionsVisible(false); } /** * Helper method to show/hide action contributions. * * @param theShowFlag indicates if the actions should be visible or not */ private void setActionsVisible( boolean theShowFlag ) { for (int size = contributionItems.size(), i = 0; i < size; i++) { IContributionItem item = (IContributionItem)contributionItems.get(i); item.setVisible(theShowFlag); } if (getActionBars() != null && getActionBars().getToolBarManager() != null) { getActionBars().getToolBarManager().update(true); } } protected void setEditMenu( IMenuManager theEditMenu ) { this.editMenu = theEditMenu; } // ============================================================================================================================ // EditorActionBarContributor Methods /** * @see org.eclipse.ui.part.EditorActionBarContributor#dispose() * @since 4.0 */ @Override public void dispose() { ActionService service = getActionService(); // Defect 24615 - Action service may be null. VDB editor will end up Hiding DiagramEditor and calling dispose without // initializing the action service. if (service != null) { for (Iterator iter = allRegisteredActions.keySet().iterator(); iter.hasNext();) { AbstractAction theAction = (AbstractAction)iter.next(); unregisterAction(theAction); } for (int size = contributionItems.size(), i = 0; i < size; i++) { IContributionItem item = (IContributionItem)contributionItems.get(i); if (item instanceof ActionContributionItem) { ActionContributionItem ai = (ActionContributionItem)item; service.removeAction(DiagramActionService.constructKey(ai.getAction(), getEditorPage())); if (ai.getAction() instanceof ISelectionListener) { DiagramUiPlugin.unregisterDiagramActionForSelection((ISelectionListener)ai.getAction()); } } // remove from edit menu if (this.editMenu != null) { this.editMenu.remove(item); } } } setEditorPage(null); } /* * (non-Javadoc) * * @See org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#disposeOfActions() */ @Override public void disposeOfActions() { this.dispose(); } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#contributeToDiagramToolBar() * @since 5.0 */ @Override public void contributeToDiagramToolBar() { } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#contributeToMenuManager(org.eclipse.jface.action.IMenuManager, * org.eclipse.jface.viewers.ISelection) * @since 5.0 */ @Override public void contributeToMenuManager( IMenuManager theMenuMgr, ISelection theSelection ) { } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#enableDiagramToolbarActions() * @since 5.0 */ @Override public void enableDiagramToolbarActions() { } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#handleNotification(org.eclipse.emf.common.notify.Notification) * @since 5.0 */ @Override public void handleNotification( Notification theNotification ) { } /** * @see org.teiid.designer.diagram.ui.editor.IDiagramActionAdapter#shouldOverrideMenu(org.eclipse.jface.viewers.ISelection) * @since 5.0 */ @Override public boolean shouldOverrideMenu( ISelection theSelection ) { return false; } /** * @see org.teiid.designer.ui.editors.AbstractModelEditorPageActionBarContributor#createContextMenu() * @since 5.0 */ @Override public void createContextMenu() { } }