/*******************************************************************************
* Copyright (c) 2000, 2009 IBM Corporation and others.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui;
import java.util.Map;
import org.eclipse.core.commands.common.EventManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.SubMenuManager;
import org.eclipse.jface.action.SubStatusLineManager;
import org.eclipse.jface.action.SubToolBarManager;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.ui.services.IServiceLocator;
/**
* Generic implementation of the <code>IActionBars</code> interface.
*/
public class SubActionBars extends EventManager implements IActionBars {
@Override
public void clearGlobalActionHandlers() {
// TODO Auto-generated method stub
}
@Override
public IMenuManager getMenuManager() {
// TODO Auto-generated method stub
return null;
}
@Override
public IServiceLocator getServiceLocator() {
// TODO Auto-generated method stub
return null;
}
@Override
public IStatusLineManager getStatusLineManager() {
// TODO Auto-generated method stub
return null;
}
@Override
public IToolBarManager getToolBarManager() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setGlobalActionHandler(String actionId, IAction handler) {
// TODO Auto-generated method stub
}
@Override
public void updateActionBars() {
// TODO Auto-generated method stub
}
// /**
// * The expression to use when contributing handlers through
// * {@link #setGlobalActionHandler(String, IAction)} . This ensures that
// * handlers contributed through {@link SubActionBars} are given priority
// * over handlers contributed to the {@link IHandlerService}.
// */
// private static final Expression EXPRESSION = new Expression() {
// public final EvaluationResult evaluate(final IEvaluationContext context)
// {
// return EvaluationResult.TRUE;
// }
//
// public final void collectExpressionInfo(final ExpressionInfo info) {
// info.addVariableNameAccess(SourcePriorityNameMapping.LEGACY_LEGACY_NAME);
// }
// };
//
// /**
// * Property constant for changes to action handlers.
// */
public static final String P_ACTION_HANDLERS = "org.eclipse.ui.internal.actionHandlers"; //$NON-NLS-1$
private Map actionHandlers;
//
// private boolean actionHandlersChanged;
//
// /**
// * A map of handler activations ({@link IHandlerActivation} indexed by
// * action id ({@link String}) indexed by service locator (
// * {@link IServiceLocator}). This value is <code>null</code> if there are
// no
// * activations.
// */
// private Map activationsByActionIdByServiceLocator;
//
private boolean active = false;
private SubMenuManager menuMgr;
private IActionBars parent;
//
// /**
// * A service locator appropriate for this action bar. This value is never
// * <code>null</code>. It must be capable of providing a
// * {@link IHandlerService}.
// */
private IServiceLocator serviceLocator;
private SubStatusLineManager statusLineMgr;
private SubToolBarManager toolBarMgr;
//
// private Map actionIdByCommandId = new HashMap();
//
// /**
// * Construct a new <code>SubActionBars</code> object. The service locator
// * will simply be the service locator of the parent.
// *
// * @param parent
// * The parent of this action bar; must not be <code>null</code>.
// */
// public SubActionBars(final IActionBars parent) {
// this(parent, null);
// }
//
/**
* Constructs a new instance of <code>SubActionBars</code>.
*
* @param parent
* The parent of this action bar; must not be <code>null</code>.
* @param serviceLocator
* The service locator for this action bar; should not be
* <code>null</code>.
*
* @since 3.2
*/
public SubActionBars(final IActionBars parent,
final IServiceLocator serviceLocator) {
if (parent == null) {
throw new NullPointerException("The parent cannot be null"); //$NON-NLS-1$
}
this.parent = parent;
this.serviceLocator = serviceLocator;
}
/**
* Activate the contributions.
*/
public void activate() {
activate(true);
}
/**
* Activate the contributions.
* <p>
* Workaround for toolbar layout flashing when editors contribute large
* amounts of items. In this case we want to force the items to be
* visible/hidden only when required, otherwise just change the enablement
* state.
* </p>
*/
public void activate(boolean forceVisibility) {
setActive(true);
}
/**
* Adds a property change listener. Has no effect if an identical listener
* is already registered.
*
* @param listener
* a property change listener
*/
public void addPropertyChangeListener(IPropertyChangeListener listener) {
addListenerObject(listener);
}
//
// /**
// * Sets the active flag. Clients should not call this method directly
// unless
// * they are overriding the setActive() method.
// */
// protected final void basicSetActive(boolean active) {
// this.active = active;
// }
//
// /**
// * Clear the global action handlers.
// */
// public void clearGlobalActionHandlers() {
// if (actionHandlers != null) {
// actionHandlers.clear();
// actionHandlersChanged = true;
// }
//
// if (activationsByActionIdByServiceLocator != null) {
// // Clean up the activations.
// final Iterator activationItr = activationsByActionIdByServiceLocator
// .entrySet().iterator();
// while (activationItr.hasNext()) {
// final Map.Entry value = (Map.Entry) activationItr.next();
// final IServiceLocator locator = (IServiceLocator) value
// .getKey();
// final IHandlerService service = (IHandlerService) locator
// .getService(IHandlerService.class);
// final Map activationsByActionId = (Map) value.getValue();
// final Iterator iterator = activationsByActionId.values()
// .iterator();
// while (iterator.hasNext()) {
// final IHandlerActivation activation = (IHandlerActivation) iterator
// .next();
// if (service != null) {
// service.deactivateHandler(activation);
// }
// activation.getHandler().dispose();
// }
// }
// activationsByActionIdByServiceLocator.clear();
// }
// }
//
// /**
// * Returns a new sub menu manager.
// *
// * @param parent
// * the parent menu manager
// * @return the menu manager
// */
// protected SubMenuManager createSubMenuManager(IMenuManager parent) {
// return new SubMenuManager(parent);
// }
//
// /**
// * Returns a new sub toolbar manager.
// *
// * @param parent
// * the parent toolbar manager
// * @return the tool bar manager
// */
// protected SubToolBarManager createSubToolBarManager(IToolBarManager
// parent) {
// return new SubToolBarManager(parent);
// }
//
/**
* Deactivate the contributions.
*/
public void deactivate() {
deactivate(true);
}
/**
* Deactivate the contributions.
* <p>
* Workaround for menubar/toolbar layout flashing when editors have many
* contributions. In this case we want to force the contributions to be
* visible/hidden only when required, otherwise just change the enablement
* state.
* </p>
*/
public void deactivate(boolean forceHide) {
setActive(false);
}
/**
* Dispose the contributions.
*/
public void dispose() {
clearGlobalActionHandlers();
if (menuMgr != null) {
menuMgr.dispose();
menuMgr.disposeManager();
}
if (statusLineMgr != null) {
statusLineMgr.disposeManager();
}
if (toolBarMgr != null) {
toolBarMgr.disposeManager();
}
clearListeners();
}
//
// /**
// * Notifies any property change listeners if the global action handlers
// have
// * changed
// */
// protected void fireActionHandlersChanged() {
// if (actionHandlersChanged) {
// // Doesn't actually pass the old and new values
// firePropertyChange(new PropertyChangeEvent(this, P_ACTION_HANDLERS,
// null, null));
// actionHandlersChanged = false;
// }
// }
//
// /**
// * Notifies any property change listeners that a property has changed.
// Only
// * listeners registered at the time this method is called are notified.
// *
// * @param event
// * the property change event
// *
// * @see IPropertyChangeListener#propertyChange
// */
// protected void firePropertyChange(PropertyChangeEvent event) {
// Object[] listeners = getListeners();
// for (int i = 0; i < listeners.length; ++i) {
// ((IPropertyChangeListener) listeners[i]).propertyChange(event);
// }
// }
//
// /**
// * Return whether the manager is currently active or not.
// */
// protected final boolean getActive() {
// return active;
// }
//
/**
* Get the handler for a window action.
*
* @param actionID
* an action ID declared in the registry
* @return an action handler which implements the action ID, or
* <code>null</code> if none is registered.
*/
public IAction getGlobalActionHandler(String actionID) {
if (actionHandlers == null) {
return null;
}
return (IAction) actionHandlers.get(actionID);
}
/**
* Returns the complete list of active global action handlers. If there are
* no global action handlers registered return null.
*/
public Map getGlobalActionHandlers() {
return actionHandlers;
}
//
// /**
// * Returns the abstract menu manager. If items are added or removed from
// the
// * manager be sure to call <code>updateActionBars</code>.
// *
// * @return the menu manager
// */
// public IMenuManager getMenuManager() {
// if (menuMgr == null) {
// menuMgr = createSubMenuManager(parent.getMenuManager());
// menuMgr.setVisible(active);
// }
// return menuMgr;
// }
//
// /**
// * Return the parent action bar manager.
// */
// protected final IActionBars getParent() {
// return parent;
// }
//
// /**
// * Answer the service locator for this action bar.
// *
// * @return an <code>IServiceLocater</code> or the parents if the receiver
// * does not have one
// *
// * @since 3.2
// */
// public final IServiceLocator getServiceLocator() {
// if (serviceLocator != null) {
// return serviceLocator;
// }
//
// return parent.getServiceLocator();
// }
//
// /**
// * Returns the status line manager. If items are added or removed from the
// * manager be sure to call <code>updateActionBars</code>.
// *
// * @return the status line manager
// */
// public IStatusLineManager getStatusLineManager() {
// if (statusLineMgr == null) {
// statusLineMgr = new SubStatusLineManager(
// parent.getStatusLineManager());
// statusLineMgr.setVisible(active);
// }
// return statusLineMgr;
// }
//
// /**
// * Returns the tool bar manager. If items are added or removed from the
// * manager be sure to call <code>updateActionBars</code>.
// *
// * @return the tool bar manager
// */
// public IToolBarManager getToolBarManager() {
// if (toolBarMgr == null) {
// toolBarMgr = createSubToolBarManager(parent.getToolBarManager());
// toolBarMgr.setVisible(active);
// }
// return toolBarMgr;
// }
//
// /**
// * Return whether the sub menu manager has been created yet.
// */
// protected final boolean isSubMenuManagerCreated() {
// return menuMgr != null;
// }
//
// /**
// * Return whether the sub status line manager has been created yet.
// */
// protected final boolean isSubStatusLineManagerCreated() {
// return statusLineMgr != null;
// }
//
// /**
// * Return whether the sub toolbar manager has been created yet.
// */
// protected final boolean isSubToolBarManagerCreated() {
// return toolBarMgr != null;
// }
//
// /**
// * Notification that the target part for the action bars has changed.
// */
// public void partChanged(IWorkbenchPart part) {
// }
//
/**
* Removes the given property change listener. Has no effect if an identical
* listener is not registered.
*
* @param listener
* a property change listener
*/
public void removePropertyChangeListener(IPropertyChangeListener listener) {
removeListenerObject(listener);
}
/**
* Activate / deactivate the contributions.
*/
protected void setActive(boolean set) {
active = set;
if (menuMgr != null) {
menuMgr.setVisible(set);
}
if (statusLineMgr != null) {
statusLineMgr.setVisible(set);
}
if (toolBarMgr != null) {
toolBarMgr.setVisible(set);
}
}
//
// /**
// * Add a handler for a window action.
// *
// * @param actionID
// * an action ID declared in the registry
// * @param handler
// * an action which implements the action ID. <code>null</code>
// * may be passed to deregister a handler.
// */
// public void setGlobalActionHandler(String actionID, IAction handler) {
// if (actionID == null) {
// /*
// * Bug 124061. It used to be invalid to pass null as an action id,
// * but some people still did it. Handle this case by trapping the
// * exception and logging it.
// */
// WorkbenchPlugin
// .log("Cannot set the global action handler for a null action id"); //$NON-NLS-1$
// return;
// }
//
// if (handler instanceof CommandLegacyActionWrapper) {
// // this is a registration of a fake action for an already
// // registered handler
// WorkbenchPlugin
// .log("Cannot feed a CommandLegacyActionWrapper back into the system"); //$NON-NLS-1$
// return;
// }
//
// if (handler instanceof CommandAction) {
// // we unfortunately had to allow these out into the wild, but they
// // still must not feed back into the system
// return;
// }
//
// if (handler != null) {
// // Update the action handlers.
// if (actionHandlers == null) {
// actionHandlers = new HashMap(11);
// }
// actionHandlers.put(actionID, handler);
//
// // Add a mapping from this action id to the command id.
// if (serviceLocator != null) {
// String commandId = null;
// final IActionCommandMappingService mappingService =
// (IActionCommandMappingService) serviceLocator
// .getService(IActionCommandMappingService.class);
// if (mappingService != null) {
// commandId = mappingService.getCommandId(actionID);
// }
// if (commandId == null) {
// commandId = handler.getActionDefinitionId();
// }
//
// // Update the handler activations.
// final IHandlerService service = (IHandlerService) serviceLocator
// .getService(IHandlerService.class);
// Map activationsByActionId = null;
// if (activationsByActionIdByServiceLocator == null) {
// activationsByActionIdByServiceLocator = new WeakHashMap();
// activationsByActionId = new HashMap();
// activationsByActionIdByServiceLocator.put(serviceLocator,
// activationsByActionId);
// } else {
// activationsByActionId = (Map) activationsByActionIdByServiceLocator
// .get(serviceLocator);
// if (activationsByActionId == null) {
// activationsByActionId = new HashMap();
// activationsByActionIdByServiceLocator.put(
// serviceLocator, activationsByActionId);
// } else if (activationsByActionId.containsKey(actionID)) {
// final Object value = activationsByActionId
// .remove(actionID);
// if (value instanceof IHandlerActivation) {
// final IHandlerActivation activation = (IHandlerActivation) value;
// actionIdByCommandId.remove(activation
// .getCommandId());
// if (service != null) {
// service.deactivateHandler(activation);
// }
// activation.getHandler().dispose();
// }
// } else if (commandId != null
// && actionIdByCommandId.containsKey(commandId)) {
// final Object value = activationsByActionId
// .remove(actionIdByCommandId.remove(commandId));
// if (value instanceof IHandlerActivation) {
// final IHandlerActivation activation = (IHandlerActivation) value;
// if (service != null) {
// service.deactivateHandler(activation);
// }
// activation.getHandler().dispose();
// }
// }
// }
//
// if (commandId != null) {
// actionIdByCommandId.put(commandId, actionID);
// // Register this as a handler with the given definition id.
// // the expression gives the setGlobalActionHandler() a
// // priority.
// final IHandler actionHandler = new ActionHandler(handler);
// Expression handlerExpression = EXPRESSION;
// // XXX add new API in next release to avoid down-casting
// // (bug 137091)
// if (this instanceof EditorActionBars) {
// handlerExpression = ((EditorActionBars) this)
// .getHandlerExpression();
// }
// if (service != null) {
// final IHandlerActivation activation = service
// .activateHandler(commandId, actionHandler,
// handlerExpression);
// activationsByActionId.put(actionID, activation);
// }
// }
// }
//
// } else {
// if (actionHandlers != null) {
// actionHandlers.remove(actionID);
// }
//
// // Remove the handler activation.
// if (serviceLocator != null) {
// final IHandlerService service = (IHandlerService) serviceLocator
// .getService(IHandlerService.class);
// if (activationsByActionIdByServiceLocator != null) {
// final Map activationsByActionId = (Map)
// activationsByActionIdByServiceLocator
// .get(serviceLocator);
// if ((activationsByActionId != null)
// && (activationsByActionId.containsKey(actionID))) {
// final Object value = activationsByActionId
// .remove(actionID);
// if (value instanceof IHandlerActivation) {
// final IHandlerActivation activation = (IHandlerActivation) value;
// actionIdByCommandId.remove(activation
// .getCommandId());
// service.deactivateHandler(activation);
// activation.getHandler().dispose();
// }
// }
// }
// }
// }
// actionHandlersChanged = true;
// }
//
// /**
// * Sets the service locator for this action bar.
// *
// * @param locator
// * The new locator; must not be <code>null</code>.
// *
// * @since 3.2
// */
// protected final void setServiceLocator(final IServiceLocator locator) {
// if (locator == null) {
// throw new NullPointerException("The service locator cannot be null"); //$NON-NLS-1$
// }
// this.serviceLocator = locator;
// }
//
// /**
// * Commits all UI changes. This should be called after additions or
// * subtractions have been made to a menu, status line, or toolbar.
// */
// public void updateActionBars() {
// parent.updateActionBars();
// fireActionHandlersChanged();
// }
}