/** * This file is protected by Copyright. * Please refer to the COPYRIGHT file distributed with this source distribution. * * This file is part of REDHAWK IDE. * * All rights reserved. This program and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html. * */ package gov.redhawk.ui.editor; import java.util.HashMap; import java.util.Map; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IActionBars2; import org.eclipse.ui.IEditorActionBarContributor; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPropertyListener; import org.eclipse.ui.part.MultiPageEditorActionBarContributor; import gov.redhawk.internal.ui.SubActionBarsExt; /** * A special implementation of a * <code>MultiPageEditorActionBarContributor</code> to switch between action bar * contributions for tree-based editor pages and diagram editor pages. * * @see MultiPageEditorActionBarContributor */ public abstract class ScaMultipageActionBarContributor extends MultiPageEditorActionBarContributor implements IMenuListener { private final Map<IEditorPart, SubActionBarsExt> actionBarMap = new HashMap<IEditorPart, SubActionBarsExt>(); private SubActionBarsExt myActiveEditorActionBars; private IEditorPart myActiveEditor; private final IPropertyListener myEditorPropertyChangeListener = new IPropertyListener() { @Override public void propertyChanged(final Object source, final int propId) { if (ScaMultipageActionBarContributor.this.myActiveEditorActionBars != null) { if (ScaMultipageActionBarContributor.this.myActiveEditorActionBars.getContributor() instanceof EditingDomainActionBarContributor && ScaMultipageActionBarContributor.this.myActiveEditor.getEditorSite() != null) { ScaMultipageActionBarContributor.this.myActiveEditorActionBars.getContributor().setActiveEditor( ScaMultipageActionBarContributor.this.myActiveEditor); ((EditingDomainActionBarContributor) ScaMultipageActionBarContributor.this.myActiveEditorActionBars.getContributor()).update(); } } } }; @Override public void init(IActionBars actionBars) { super.init(actionBars); } @Override public void contributeToToolBar(IToolBarManager toolBarManager) { super.contributeToToolBar(toolBarManager); } @Override public void setActiveEditor(final IEditorPart part) { if (this.myActiveEditor != null) { this.myActiveEditor.removePropertyListener(this.myEditorPropertyChangeListener); } // TODO: Will this cast ever not be correct? this.myActiveEditor = part; super.setActiveEditor(part); if (this.myActiveEditor instanceof IEditingDomainProvider) { this.myActiveEditor.addPropertyListener(this.myEditorPropertyChangeListener); } } /** * @since 2.3 */ public IEditorPart getActiveEditor() { return this.myActiveEditor; } @Override public IActionBars2 getActionBars() { return (IActionBars2) super.getActionBars(); } @Override public void setActivePage(IEditorPart activeEditor) { if (myActiveEditor == null) { return; } if (activeEditor == null) { activeEditor = this.myActiveEditor; } SubActionBarsExt actionBars = this.actionBarMap.get(activeEditor); if (actionBars == null) { final IEditorActionBarContributor subBars = getSubActionBarContributor(activeEditor); if (subBars != null) { actionBars = new SubActionBarsExt(getPage(), getActionBars(), subBars, getType(activeEditor)); this.actionBarMap.put(activeEditor, actionBars); } } setActiveActionBars(actionBars, activeEditor); } /** * @param activeEditor * @return */ protected abstract String getType(IEditorPart activeEditor); /** * @param activeEditor * @return */ protected IEditorActionBarContributor getSubActionBarContributor(final IEditorPart activeEditor) { if (activeEditor == null) { return null; } return (IEditorActionBarContributor) activeEditor.getAdapter(IEditorActionBarContributor.class); } @Override public void dispose() { super.dispose(); for (final SubActionBarsExt ext : this.actionBarMap.values()) { ext.dispose(); } this.actionBarMap.clear(); } /** * Switches the active action bars. */ private void setActiveActionBars(final SubActionBarsExt actionBars, final IEditorPart activeEditor) { if (this.myActiveEditorActionBars != null && this.myActiveEditorActionBars != actionBars) { this.myActiveEditorActionBars.deactivate(); } this.myActiveEditorActionBars = actionBars; if (this.myActiveEditorActionBars != null) { this.myActiveEditorActionBars.setEditorPart(activeEditor); this.myActiveEditorActionBars.activate(); this.myActiveEditorActionBars.updateActionBars(); } } public IActionBars2 getActionBarContributor(final IEditorPart part) { return this.actionBarMap.get(part); } @Override public void menuAboutToShow(final IMenuManager manager) { final SubActionBarsExt actionBars = this.actionBarMap.get(this.myActiveEditor); if (actionBars != null && actionBars.getContributor() instanceof IMenuListener) { ((IMenuListener) actionBars.getContributor()).menuAboutToShow(manager); } } }