/**
* 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.internal.ui;
import java.util.Map;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.SubCoolBarManager;
import org.eclipse.jface.action.ToolBarContributionItem;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IActionBars2;
import org.eclipse.ui.IEditorActionBarContributor;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.SubActionBars2;
/**
* An extended sub cool bar manager for used by the
* <code>TopicmapMultipageActionBarContributor</code>.
*/
public class SubActionBarsExt extends SubActionBars2 {
private IEditorActionBarContributor myContributor;
private final String myType;
private IToolBarManager myToolBarManager;
private ToolBarContributionItem myToolBarContributionItem;
private PartListener myPartListener;
/**
* Default constructor.
*
* @param page
* @param parent
* @param subContributor
* @param type
*/
public SubActionBarsExt(final IWorkbenchPage page, final IActionBars2 parent,
final IEditorActionBarContributor subContributor, final String type) {
super(parent, parent.getServiceLocator());
assert type != null;
this.myType = type;
assert page != null;
this.myPartListener = new PartListener(page);
assert subContributor != null;
this.myContributor = subContributor;
this.myContributor.init(this, page);
}
/**
* @return the action bar contributor
*/
public IEditorActionBarContributor getContributor() {
return this.myContributor;
}
/**
* Changes the active editor part.
*
* @param editorPart
*/
public void setEditorPart(final IEditorPart editorPart) {
this.myContributor.setActiveEditor(editorPart);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.SubActionBars#getToolBarManager()
*/
@Override
public IToolBarManager getToolBarManager() {
if (this.myToolBarManager == null) {
final ICoolBarManager parentCoolBarManager = getTopCoolBarManager();
if (parentCoolBarManager == null) {
return null;
}
final IContributionItem foundItem = parentCoolBarManager.find(this.myType);
if (foundItem instanceof ToolBarContributionItem
&& ((ToolBarContributionItem) foundItem).getToolBarManager() != null) {
this.myToolBarContributionItem = (ToolBarContributionItem) foundItem;
this.myToolBarManager = this.myToolBarContributionItem.getToolBarManager();
} else {
if (!(parentCoolBarManager instanceof ContributionManager)) {
return null;
}
this.myToolBarManager = new ToolBarManager(SWT.FLAT | SWT.RIGHT);
this.myToolBarContributionItem = new ToolBarContributionItem(this.myToolBarManager, this.myType);
if (!((ContributionManager) parentCoolBarManager).replaceItem(this.myType,
this.myToolBarContributionItem)) {
parentCoolBarManager.add(this.myToolBarContributionItem);
}
}
this.myToolBarContributionItem.setVisible(getActive());
}
return this.myToolBarManager;
}
/**
* @return the top-level cool bar manager instance
*/
private ICoolBarManager getTopCoolBarManager() {
ICoolBarManager coolBarManager = getCastedParent().getCoolBarManager();
while (coolBarManager instanceof SubCoolBarManager
&& ((SubCoolBarManager) coolBarManager).getParent() instanceof ICoolBarManager) {
coolBarManager = (ICoolBarManager) ((SubCoolBarManager) coolBarManager).getParent();
}
return coolBarManager;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.SubActionBars2#dispose()
*/
@Override
public void dispose() {
super.dispose();
this.myContributor.dispose();
this.myContributor = null;
// XXX for some reason I'm not supposed to dispose of this or else it
// creates NPE in the worbbench
// if (this.myToolBarContributionItem != null) {
// this.myToolBarContributionItem.dispose();
// this.myToolBarContributionItem = null;
// }
if (this.myToolBarManager != null) {
this.myToolBarManager.removeAll();
this.myToolBarManager = null;
}
this.myPartListener.dispose();
this.myPartListener = null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.SubActionBars2#setActive(boolean)
*/
@Override
protected void setActive(final boolean value) {
if (getActive() == value) {
return;
}
super.setActive(value);
final ICoolBarManager parentCoolBarManager = getTopCoolBarManager();
if (parentCoolBarManager != null) {
parentCoolBarManager.markDirty();
}
if (this.myToolBarManager != null && parentCoolBarManager != null) {
final IContributionItem[] items = this.myToolBarManager.getItems();
for (int i = 0; i < items.length; i++) {
final IContributionItem item = items[i];
item.setVisible(value);
}
this.myToolBarManager.markDirty();
this.myToolBarManager.update(false);
}
if (value) {
final Map< ? , ? > globals = getGlobalActionHandlers();
if (globals != null) {
for (final Map.Entry< ? , ? > nextEntry : globals.entrySet()) {
final Object key = nextEntry.getKey();
final Object entryValue = nextEntry.getValue();
if (key instanceof String && entryValue instanceof IAction) {
getParent().setGlobalActionHandler((String) key, (IAction) entryValue);
}
}
}
} else {
getParent().clearGlobalActionHandlers();
}
getParent().updateActionBars();
}
/**
* Inner class to be able to be notified when parts are activated.
*/
private class PartListener implements IPartListener {
private IWorkbenchPage myPage;
/**
* Default constructor.
*
* @param page
*/
public PartListener(final IWorkbenchPage page) {
this.myPage = page;
this.myPage.addPartListener(this);
}
/**
* Default cleanup method.
*/
public void dispose() {
this.myPage.removePartListener(this);
this.myPage = null;
}
/*
* (non-Javadoc)
* @see
* org.eclipse.ui.IPartListener#partActivated(org.eclipse.ui.IWorkbenchPart
* )
*/
@Override
public void partActivated(final IWorkbenchPart part) {
if (part instanceof IEditorPart) {
final IEditorPart editorPart = (IEditorPart) part;
if (editorPart.getEditorSite().getActionBars() != getParent() && getActive()) {
deactivate();
updateActionBars();
}
}
}
/*
* (non-Javadoc)
* @seeorg.eclipse.ui.IPartListener#partBroughtToTop(org.eclipse.ui.
* IWorkbenchPart)
*/
@Override
public void partBroughtToTop(final IWorkbenchPart part) {
// not required
}
/*
* (non-Javadoc)
* @see
* org.eclipse.ui.IPartListener#partClosed(org.eclipse.ui.IWorkbenchPart
* )
*/
@Override
public void partClosed(final IWorkbenchPart part) {
// not required
}
/*
* (non-Javadoc)
* @seeorg.eclipse.ui.IPartListener#partDeactivated(org.eclipse.ui.
* IWorkbenchPart)
*/
@Override
public void partDeactivated(final IWorkbenchPart part) {
// not required
}
/*
* (non-Javadoc)
* @see
* org.eclipse.ui.IPartListener#partOpened(org.eclipse.ui.IWorkbenchPart
* )
*/
@Override
public void partOpened(final IWorkbenchPart part) {
// not required
}
}
}