| // RAP [rh] KeyBindingService disabed, since the implemented interface is not supported |
| ///******************************************************************************* |
| // * 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.internal; |
| // |
| //import java.util.ArrayList; |
| //import java.util.Arrays; |
| //import java.util.Collections; |
| //import java.util.HashMap; |
| //import java.util.HashSet; |
| //import java.util.Iterator; |
| //import java.util.List; |
| //import java.util.Map; |
| //import java.util.Set; |
| // |
| //import org.eclipse.jface.action.IAction; |
| //import org.eclipse.ui.IKeyBindingService; |
| //import org.eclipse.ui.INestableKeyBindingService; |
| //import org.eclipse.ui.IWorkbenchPartSite; |
| //import org.eclipse.ui.IWorkbenchSite; |
| //import org.eclipse.ui.PlatformUI; |
| //import org.eclipse.ui.commands.ActionHandler; |
| //import org.eclipse.ui.commands.HandlerSubmission; |
| //import org.eclipse.ui.commands.IHandler; |
| //import org.eclipse.ui.commands.Priority; |
| //import org.eclipse.ui.contexts.EnabledSubmission; |
| //import org.eclipse.ui.internal.actions.CommandAction; |
| //import org.eclipse.ui.internal.handlers.CommandLegacyActionWrapper; |
| // |
| ///** |
| // * This service provides a nestable implementation of a key binding service. |
| // * This class is provided for backwards compatibility only, and might be removed |
| // * in the future. All of the functionality is the class can be duplicated by |
| // * using the commands and contexts API. |
| // * |
| // * @since 2.0 |
| // */ |
| //public final class KeyBindingService implements INestableKeyBindingService { |
| // |
| // /** |
| // * The currently active nested service, if any. If there are no nested |
| // * services or none of them are active, then this value is <code>null</code>. |
| // */ |
| // private IKeyBindingService activeService = null; |
| // |
| // /** |
| // * Whether this key binding service has been disposed. A disposed key |
| // * binding service should not be used again. |
| // */ |
| // private boolean disposed; |
| // |
| // /** |
| // * The set of context identifiers enabled in this key binding service (not |
| // * counting any nested services). This set may be empty, but it is never |
| // * <code>null</code>. |
| // */ |
| // private Set enabledContextIds = Collections.EMPTY_SET; |
| // |
| // /** |
| // * The list of context submissions indicating the enabled state of the |
| // * context. This does not include those from nested services. This list may |
| // * be empty, but it is never <code>null</code>. |
| // */ |
| // private List enabledSubmissions = new ArrayList(); |
| // |
| // /** |
| // * The map of handler submissions, sorted by command identifiers. This does |
| // * not include those from nested services. This map may be empty, but it is |
| // * never <code>null</code>. |
| // */ |
| // private Map handlerSubmissionsByCommandId = new HashMap(); |
| // |
| // /** |
| // * The context submissions from the currently active nested service. This |
| // * value is <code>null</code> if there is no currently active nested |
| // * service. |
| // */ |
| // private List nestedEnabledSubmissions = null; |
| // |
| // /** |
| // * The handler submissions from the currently active nested service. This |
| // * value is <code>null</code> if there is no currently active handler |
| // * service. |
| // */ |
| // private List nestedHandlerSubmissions = null; |
| // |
| // /** |
| // * The map of workbench part sites to nested key binding services. This map |
| // * may be empty, but is never <code>null</code>. |
| // */ |
| // private final Map nestedServices = new HashMap(); |
| // |
| // /** |
| // * The parent for this key binding service; <code>null</code> if there is |
| // * no parent. If there is a parent, then this means that it should not do a |
| // * "live" update of its contexts or handlers, but should make a call to the |
| // * parent instead. |
| // */ |
| // private final KeyBindingService parent; |
| // |
| // /** |
| // * The site within the workbench at which this service is provided. This |
| // * value should not be <code>null</code>. |
| // */ |
| // private IWorkbenchPartSite workbenchPartSite; |
| // |
| // /** |
| // * Constructs a new instance of <code>KeyBindingService</code> on a given |
| // * workbench site. This instance is not nested. |
| // * |
| // * @param workbenchPartSite |
| // * The site for which this service will be responsible; should |
| // * not be <code>null</code>. |
| // */ |
| // public KeyBindingService(IWorkbenchPartSite workbenchPartSite) { |
| // this(workbenchPartSite, null); |
| // } |
| // |
| // /** |
| // * Constructs a new instance of <code>KeyBindingService</code> on a given |
| // * workbench site. |
| // * |
| // * @param workbenchPartSite |
| // * The site for which this service will be responsible; should |
| // * not be <code>null</code>. |
| // * @param parent |
| // * The parent key binding service, if any; <code>null</code> if |
| // * none. |
| // */ |
| // KeyBindingService(IWorkbenchPartSite workbenchPartSite, |
| // KeyBindingService parent) { |
| // this.workbenchPartSite = workbenchPartSite; |
| // this.parent = parent; |
| // } |
| // |
| // /* |
| // * (non-Javadoc) |
| // * |
| // * @see org.eclipse.ui.INestableKeyBindingService#activateKeyBindingService(org.eclipse.ui.IWorkbenchSite) |
| // */ |
| // public boolean activateKeyBindingService(IWorkbenchSite nestedSite) { |
| // if (disposed) { |
| // return false; |
| // } |
| // |
| // // Check if we should do a deactivation. |
| // if (nestedSite == null) { |
| // // We should do a deactivation, if there is one active. |
| // if (activeService == null) { |
| // // There is no active service. Do no work. |
| // return false; |
| // } |
| // // Deactivate the currently active nested service. |
| // deactivateNestedService(); |
| // return true; |
| // } |
| // |
| // // Attempt to activate a service. |
| // final IKeyBindingService service = (IKeyBindingService) nestedServices |
| // .get(nestedSite); |
| // |
| // if (service == activeService) { |
| // // The service is already active, or already null |
| // return false; |
| // } |
| // |
| // deactivateNestedService(); |
| // if (service!=null) { |
| // activateNestedService(service); |
| // } |
| // return true; |
| // } |
| // |
| // /** |
| // * Activates the given service without worrying about the currently active |
| // * service. This goes through the work of adding all of the nested context |
| // * ids as enabled submissions. |
| // * |
| // * @param service |
| // * The service to become active; if <code>null</code>, then |
| // * the reference to the active service is set to |
| // * <code>null</code> but nothing else happens. |
| // */ |
| // private final void activateNestedService(final IKeyBindingService service) { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // /* |
| // * If I have a parent, and I'm the active service, then deactivate so |
| // * that I can make changes. |
| // */ |
| // boolean active = false; |
| // boolean haveParent = (parent != null); |
| // if (haveParent) { |
| // active = (parent.activeService == this); |
| // if (active) { |
| // parent.deactivateNestedService(); |
| // } |
| // } |
| // |
| // // Update the active service. |
| // activeService = service; |
| // |
| // // Check to see that the service isn't null. |
| // if (service == null) { |
| // return; |
| // } |
| // |
| // if (haveParent) { |
| // if (active) { |
| // parent.activateNestedService(this); |
| // } |
| // |
| // } else if (activeService instanceof KeyBindingService) { |
| // // I have no parent, so I can make the changes myself. |
| // final KeyBindingService nestedService = (KeyBindingService) activeService; |
| // |
| // // Update the contexts. |
| // nestedEnabledSubmissions = nestedService.getEnabledSubmissions(); |
| // normalizeSites(nestedEnabledSubmissions); |
| // PlatformUI.getWorkbench().getContextSupport().addEnabledSubmissions( |
| // nestedEnabledSubmissions); |
| // |
| // // Update the handlers. |
| // nestedHandlerSubmissions = nestedService.getHandlerSubmissions(); |
| // normalizeSites(nestedHandlerSubmissions); |
| // PlatformUI.getWorkbench().getCommandSupport().addHandlerSubmissions( |
| // nestedHandlerSubmissions); |
| // } |
| // } |
| // |
| // /** |
| // * Deactives the currently active service. This nulls out the reference, and |
| // * removes all the enabled submissions for the nested service. |
| // */ |
| // private final void deactivateNestedService() { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // // Don't do anything if there is no active service. |
| // if (activeService == null) { |
| // return; |
| // } |
| // |
| // // Check to see if there is a parent. |
| // boolean active = false; |
| // if (parent != null) { |
| // // Check if I'm the active service. |
| // if (parent.activeService == this) { |
| // active = true; |
| // // Deactivate myself so I can make changes. |
| // parent.deactivateNestedService(); |
| // } |
| // |
| // } else if (activeService instanceof KeyBindingService) { |
| // // Remove all the nested context ids. |
| // PlatformUI.getWorkbench().getContextSupport() |
| // .removeEnabledSubmissions(nestedEnabledSubmissions); |
| // |
| // /* |
| // * Remove all of the nested handler submissions. The handlers here |
| // * weren't created by this instance (but by the nest instance), and |
| // * hence can't be disposed here. |
| // */ |
| // PlatformUI.getWorkbench().getCommandSupport() |
| // .removeHandlerSubmissions(nestedHandlerSubmissions); |
| // |
| // } |
| // |
| // // Clear our reference to the active service. |
| // activeService = null; |
| // |
| // // If necessary, let my parent know that changes have occurred. |
| // if (active) { |
| // parent.activateNestedService(this); |
| // } |
| // } |
| // |
| // /** |
| // * Disposes this key binding service. This clears out all of the submissions |
| // * held by this service, and its nested services. |
| // */ |
| // public void dispose() { |
| // if (!disposed) { |
| // deactivateNestedService(); |
| // disposed = true; |
| // |
| // PlatformUI.getWorkbench() |
| // .getContextSupport() |
| // .removeEnabledSubmissions(new ArrayList(enabledSubmissions)); |
| // enabledSubmissions.clear(); |
| // |
| // /* |
| // * Each removed handler submission, must dispose its corresponding |
| // * handler -- as these handlers only exist inside of this class. |
| // */ |
| // final List submissions = new ArrayList( |
| // handlerSubmissionsByCommandId.values()); |
| // final Iterator submissionItr = submissions.iterator(); |
| // while (submissionItr.hasNext()) { |
| // ((HandlerSubmission) submissionItr.next()).getHandler() |
| // .dispose(); |
| // } |
| // PlatformUI.getWorkbench().getCommandSupport() |
| // .removeHandlerSubmissions(submissions); |
| // handlerSubmissionsByCommandId.clear(); |
| // |
| // for (Iterator iterator = nestedServices.values().iterator(); iterator |
| // .hasNext();) { |
| // KeyBindingService keyBindingService = (KeyBindingService) iterator |
| // .next(); |
| // keyBindingService.dispose(); |
| // } |
| // |
| // nestedEnabledSubmissions = null; |
| // nestedHandlerSubmissions = null; |
| // nestedServices.clear(); |
| // } |
| // } |
| // |
| // /** |
| // * Gets a copy of all the enabled submissions in the nesting chain. |
| // * |
| // * @return All of the nested enabled submissions -- including the ones from |
| // * this service. This list may be empty, but is never |
| // * <code>null</code>. |
| // */ |
| // private final List getEnabledSubmissions() { |
| // if (disposed) { |
| // return null; |
| // } |
| // |
| // final List submissions = new ArrayList(enabledSubmissions); |
| // if (activeService instanceof KeyBindingService) { |
| // final KeyBindingService nestedService = (KeyBindingService) activeService; |
| // submissions.addAll(nestedService.getEnabledSubmissions()); |
| // } |
| // return submissions; |
| // } |
| // |
| // /** |
| // * Gets a copy of all the handler submissions in the nesting chain. |
| // * |
| // * @return All of the nested handler submissions -- including the ones from |
| // * this service. This list may be empty, but is never |
| // * <code>null</code>. |
| // */ |
| // private final List getHandlerSubmissions() { |
| // if (disposed) { |
| // return null; |
| // } |
| // |
| // final List submissions = new ArrayList(handlerSubmissionsByCommandId |
| // .values()); |
| // if (activeService instanceof KeyBindingService) { |
| // final KeyBindingService nestedService = (KeyBindingService) activeService; |
| // submissions.addAll(nestedService.getHandlerSubmissions()); |
| // } |
| // return submissions; |
| // } |
| // |
| // /* |
| // * (non-Javadoc) |
| // * |
| // * @see org.eclipse.ui.INestableKeyBindingService#getKeyBindingService(org.eclipse.ui.IWorkbenchSite) |
| // */ |
| // public IKeyBindingService getKeyBindingService(IWorkbenchSite nestedSite) { |
| // if (disposed) { |
| // return null; |
| // } |
| // |
| // if (nestedSite == null) { |
| // return null; |
| // } |
| // |
| // IKeyBindingService service = (IKeyBindingService) nestedServices |
| // .get(nestedSite); |
| // if (service == null) { |
| // // TODO the INestedKeyBindingService API should be based on |
| // // IWorkbenchPartSite.. |
| // if (nestedSite instanceof IWorkbenchPartSite) { |
| // service = new KeyBindingService( |
| // (IWorkbenchPartSite) nestedSite, this); |
| // } else { |
| // service = new KeyBindingService(null, this); |
| // } |
| // |
| // nestedServices.put(nestedSite, service); |
| // } |
| // |
| // return service; |
| // } |
| // |
| // public String[] getScopes() { |
| // if (disposed) { |
| // return null; |
| // } |
| // |
| // // Get the nested scopes, if any. |
| // final String[] nestedScopes; |
| // if (activeService == null) { |
| // nestedScopes = null; |
| // } else { |
| // nestedScopes = activeService.getScopes(); |
| // } |
| // |
| // // Build the list of active scopes |
| // final Set activeScopes = new HashSet(); |
| // activeScopes.addAll(enabledContextIds); |
| // if (nestedScopes != null) { |
| // for (int i = 0; i < nestedScopes.length; i++) { |
| // activeScopes.add(nestedScopes[i]); |
| // } |
| // } |
| // |
| // return (String[]) activeScopes.toArray(new String[activeScopes.size()]); |
| // } |
| // |
| // /** |
| // * Replaces the active workbench site with this service's active workbench |
| // * site. This ensures that the context manager will recognize the context as |
| // * active. Note: this method modifies the list in place; it is |
| // * <em>destructive</em>. |
| // * |
| // * @param submissionsToModify |
| // * The submissions list to modify; must not be <code>null</code>, |
| // * but may be empty. |
| // */ |
| // private final void normalizeSites(final List submissionsToModify) { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // final int size = submissionsToModify.size(); |
| // for (int i = 0; i < size; i++) { |
| // final Object submission = submissionsToModify.get(i); |
| // final Object replacementSubmission; |
| // |
| // if (submission instanceof EnabledSubmission) { |
| // final EnabledSubmission enabledSubmission = (EnabledSubmission) submission; |
| // if (!workbenchPartSite.equals(enabledSubmission |
| // .getActiveWorkbenchPartSite())) { |
| // replacementSubmission = new EnabledSubmission(null, |
| // enabledSubmission.getActiveShell(), |
| // workbenchPartSite, enabledSubmission.getContextId()); |
| // } else { |
| // replacementSubmission = enabledSubmission; |
| // } |
| // |
| // } else if (submission instanceof HandlerSubmission) { |
| // final HandlerSubmission handlerSubmission = (HandlerSubmission) submission; |
| // if (!workbenchPartSite.equals(handlerSubmission |
| // .getActiveWorkbenchPartSite())) { |
| // replacementSubmission = new HandlerSubmission(null, |
| // handlerSubmission.getActiveShell(), |
| // workbenchPartSite, |
| // handlerSubmission.getCommandId(), handlerSubmission |
| // .getHandler(), handlerSubmission |
| // .getPriority()); |
| // } else { |
| // replacementSubmission = handlerSubmission; |
| // } |
| // |
| // } else { |
| // replacementSubmission = submission; |
| // } |
| // |
| // submissionsToModify.set(i, replacementSubmission); |
| // } |
| // |
| // } |
| // |
| // public void registerAction(IAction action) { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // if (action instanceof CommandLegacyActionWrapper) { |
| // // this is a registration of a fake action for an already |
| // // registered handler |
| // WorkbenchPlugin |
| // .log("Cannot register a CommandLegacyActionWrapper back into the system"); //$NON-NLS-1$ |
| // return; |
| // } |
| // |
| // if (action instanceof CommandAction) { |
| // // we unfortunately had to allow these out into the wild, but they |
| // // still must not feed back into the system |
| // return; |
| // } |
| // |
| // unregisterAction(action); |
| // String commandId = action.getActionDefinitionId(); |
| // if (commandId != null) { |
| // /* |
| // * If I have a parent and I'm active, de-activate myself while |
| // * making changes. |
| // */ |
| // boolean active = false; |
| // if ((parent != null) && (parent.activeService == this)) { |
| // active = true; |
| // parent.deactivateNestedService(); |
| // } |
| // |
| // // Create the new submission |
| // IHandler handler = new ActionHandler(action); |
| // HandlerSubmission handlerSubmission = new HandlerSubmission(null, |
| // workbenchPartSite.getShell(), workbenchPartSite, commandId, |
| // handler, Priority.MEDIUM); |
| // handlerSubmissionsByCommandId.put(commandId, handlerSubmission); |
| // |
| // // Either submit the new handler myself, or simply re-activate. |
| // if (parent != null) { |
| // if (active) { |
| // parent.activateNestedService(this); |
| // } |
| // } else { |
| // PlatformUI.getWorkbench().getCommandSupport() |
| // .addHandlerSubmission(handlerSubmission); |
| // } |
| // } |
| // } |
| // |
| // /* |
| // * (non-Javadoc) |
| // * |
| // * @see org.eclipse.ui.INestableKeyBindingService#removeKeyBindingService(org.eclipse.ui.IWorkbenchSite) |
| // */ |
| // public boolean removeKeyBindingService(IWorkbenchSite nestedSite) { |
| // if (disposed) { |
| // return false; |
| // } |
| // |
| // final IKeyBindingService service = (IKeyBindingService) nestedServices |
| // .remove(nestedSite); |
| // if (service == null) { |
| // return false; |
| // } |
| // |
| // if (service.equals(activeService)) { |
| // deactivateNestedService(); |
| // } |
| // |
| // return true; |
| // } |
| // |
| // public void setScopes(String[] scopes) { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // // Either deactivate myself, or remove the previous submissions myself. |
| // boolean active = false; |
| // if ((parent != null) && (parent.activeService == this)) { |
| // active = true; |
| // parent.deactivateNestedService(); |
| // } else { |
| // PlatformUI.getWorkbench().getContextSupport() |
| // .removeEnabledSubmissions(enabledSubmissions); |
| // } |
| // enabledSubmissions.clear(); |
| // |
| // // Determine the new list of submissions. |
| // enabledContextIds = new HashSet(Arrays.asList(scopes)); |
| // for (Iterator iterator = enabledContextIds.iterator(); iterator |
| // .hasNext();) { |
| // String contextId = (String) iterator.next(); |
| // enabledSubmissions.add(new EnabledSubmission(null, null, |
| // workbenchPartSite, contextId)); |
| // } |
| // |
| // // Submit the new contexts myself, or simply re-active myself. |
| // if (parent != null) { |
| // if (active) { |
| // parent.activateNestedService(this); |
| // } |
| // } else { |
| // PlatformUI.getWorkbench().getContextSupport().addEnabledSubmissions( |
| // enabledSubmissions); |
| // } |
| // } |
| // |
| // public void unregisterAction(IAction action) { |
| // if (disposed) { |
| // return; |
| // } |
| // |
| // if (action instanceof CommandLegacyActionWrapper) { |
| // // this is a registration of a fake action for an already |
| // // registered handler |
| // WorkbenchPlugin |
| // .log("Cannot unregister a CommandLegacyActionWrapper out of the system"); //$NON-NLS-1$ |
| // return; |
| // } |
| // |
| // String commandId = action.getActionDefinitionId(); |
| // |
| // if (commandId != null) { |
| // // Deactivate this service while making changes. |
| // boolean active = false; |
| // if ((parent != null) && (parent.activeService == this)) { |
| // active = true; |
| // parent.deactivateNestedService(); |
| // } |
| // |
| // // Remove the current submission, if any. |
| // HandlerSubmission handlerSubmission = (HandlerSubmission) handlerSubmissionsByCommandId |
| // .remove(commandId); |
| // |
| // /* |
| // * Either activate this service again, or remove the submission |
| // * myself. |
| // */ |
| // if (parent != null) { |
| // if (active) { |
| // parent.activateNestedService(this); |
| // } |
| // } else { |
| // if (handlerSubmission != null) { |
| // PlatformUI.getWorkbench().getCommandSupport() |
| // .removeHandlerSubmission(handlerSubmission); |
| // handlerSubmission.getHandler().dispose(); |
| // } |
| // } |
| // } |
| // } |
| //} |