| /******************************************************************************* |
| * Copyright (c) 2004, 2006 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.commands; |
| |
| import java.util.ArrayList; |
| 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.core.commands.Command; |
| import org.eclipse.core.commands.CommandManager; |
| import org.eclipse.core.commands.contexts.ContextManager; |
| import org.eclipse.core.commands.contexts.ContextManagerEvent; |
| import org.eclipse.core.commands.contexts.IContextManagerListener; |
| import org.eclipse.jface.bindings.Binding; |
| import org.eclipse.jface.bindings.BindingManager; |
| import org.eclipse.jface.bindings.BindingManagerEvent; |
| import org.eclipse.jface.bindings.IBindingManagerListener; |
| import org.eclipse.jface.bindings.Scheme; |
| import org.eclipse.jface.bindings.TriggerSequence; |
| import org.eclipse.jface.bindings.keys.ParseException; |
| import org.eclipse.ui.commands.CommandManagerEvent; |
| import org.eclipse.ui.commands.ICategory; |
| import org.eclipse.ui.commands.ICommand; |
| import org.eclipse.ui.commands.ICommandManager; |
| import org.eclipse.ui.commands.ICommandManagerListener; |
| import org.eclipse.ui.commands.IKeyConfiguration; |
| import org.eclipse.ui.internal.handlers.LegacyHandlerWrapper; |
| import org.eclipse.ui.internal.keys.SchemeLegacyWrapper; |
| import org.eclipse.ui.internal.util.Util; |
| import org.eclipse.ui.keys.KeySequence; |
| |
| /** |
| * Provides support for the old <code>ICommandManager</code> interface. |
| * |
| * @since 3.1 |
| */ |
| public final class CommandManagerLegacyWrapper implements ICommandManager, |
| org.eclipse.core.commands.ICommandManagerListener, |
| IBindingManagerListener, IContextManagerListener { |
| |
| /** |
| * Whether commands should print out information about which handlers are |
| * being executed. Change this value if you want console output on command |
| * execution. |
| */ |
| public static boolean DEBUG_COMMAND_EXECUTION = false; |
| |
| /** |
| * Whether commands should print out information about handler changes. |
| * Change this value if you want console output when commands change |
| * handlers. |
| */ |
| public static boolean DEBUG_HANDLERS = false; |
| |
| /** |
| * Which command should print out debugging information. Change this value |
| * if you want to only here when a command with a particular identifier |
| * changes its handler. |
| */ |
| public static String DEBUG_HANDLERS_COMMAND_ID = null; |
| |
| static boolean validateKeySequence(KeySequence keySequence) { |
| if (keySequence == null) { |
| return false; |
| } |
| List keyStrokes = keySequence.getKeyStrokes(); |
| int size = keyStrokes.size(); |
| if (size == 0 || size > 4 || !keySequence.isComplete()) { |
| return false; |
| } |
| return true; |
| } |
| |
| /** |
| * The JFace binding machine that provides binding support for this |
| * workbench mutable command manager. This value will never be |
| * <code>null</code>. |
| * |
| * @since 3.1 |
| */ |
| private final BindingManager bindingManager; |
| |
| /** |
| * The command manager that provides functionality for this workbench |
| * command manager. This value will never be <code>null</code>. |
| * |
| * @since 3.1 |
| */ |
| private final CommandManager commandManager; |
| |
| private List commandManagerListeners; |
| |
| /** |
| * The context manager that provides functionality for this workbench |
| * command manager. This value will never be <code>null</code>. |
| * |
| * @since 3.1 |
| */ |
| private final ContextManager contextManager; |
| |
| /** |
| * Constructs a new instance of <code>MutableCommandManager</code>. The |
| * binding manager and command manager providing support for this manager |
| * are constructed at this time. |
| * |
| * @param bindingManager |
| * The binding manager providing support for the command manager; |
| * must not be <code>null</code>. |
| * @param commandManager |
| * The command manager providing support for this command |
| * manager; must not be <code>null</code>. |
| * @param contextManager |
| * The context manager to provide context support to this |
| * manager. This value must not be <code>null</code>. |
| * |
| */ |
| public CommandManagerLegacyWrapper(final BindingManager bindingManager, |
| final CommandManager commandManager, |
| final ContextManager contextManager) { |
| if (contextManager == null) { |
| throw new NullPointerException( |
| "The context manager cannot be null."); //$NON-NLS-1$ |
| } |
| this.bindingManager = bindingManager; |
| this.commandManager = commandManager; |
| this.contextManager = contextManager; |
| } |
| |
| public final void addCommandManagerListener( |
| final ICommandManagerListener commandManagerListener) { |
| if (commandManagerListener == null) { |
| throw new NullPointerException("Cannot add a null listener."); //$NON-NLS-1$ |
| } |
| |
| if (commandManagerListeners == null) { |
| commandManagerListeners = new ArrayList(); |
| this.commandManager.addCommandManagerListener(this); |
| this.bindingManager.addBindingManagerListener(this); |
| this.contextManager.addContextManagerListener(this); |
| } |
| |
| if (!commandManagerListeners.contains(commandManagerListener)) { |
| commandManagerListeners.add(commandManagerListener); |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.bindings.IBindingManagerListener#bindingManagerChanged(org.eclipse.jface.bindings.BindingManagerEvent) |
| */ |
| public final void bindingManagerChanged(final BindingManagerEvent event) { |
| final boolean schemeDefinitionsChanged = event.getScheme() != null; |
| final Set previousSchemes; |
| if (schemeDefinitionsChanged) { |
| previousSchemes = new HashSet(); |
| final Scheme scheme = event.getScheme(); |
| final Scheme[] definedSchemes = event.getManager() |
| .getDefinedSchemes(); |
| final int definedSchemesCount = definedSchemes.length; |
| for (int i = 0; i < definedSchemesCount; i++) { |
| final Scheme definedScheme = definedSchemes[0]; |
| if ((definedScheme == scheme) && (event.isSchemeDefined())) { |
| continue; // skip this one, it was just defined. |
| } |
| previousSchemes.add(definedSchemes[0].getId()); |
| } |
| if (!event.isSchemeDefined()) { |
| previousSchemes.add(scheme.getId()); |
| } |
| } else { |
| previousSchemes = null; |
| } |
| |
| fireCommandManagerChanged(new CommandManagerEvent(this, false, event |
| .isActiveSchemeChanged(), event.isLocaleChanged(), event |
| .isPlatformChanged(), false, false, schemeDefinitionsChanged, |
| null, null, previousSchemes)); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.commands.ICommandManagerListener#commandManagerChanged(org.eclipse.commands.CommandManagerEvent) |
| */ |
| public final void commandManagerChanged( |
| final org.eclipse.core.commands.CommandManagerEvent event) { |
| // Figure out the set of previous category identifiers. |
| final boolean categoryIdsChanged = event.isCategoryChanged(); |
| final Set previousCategoryIds; |
| if (categoryIdsChanged) { |
| previousCategoryIds = new HashSet(commandManager |
| .getDefinedCategoryIds()); |
| final String categoryId = event.getCategoryId(); |
| if (event.isCategoryDefined()) { |
| previousCategoryIds.remove(categoryId); |
| } else { |
| previousCategoryIds.add(categoryId); |
| } |
| } else { |
| previousCategoryIds = null; |
| } |
| |
| // Figure out the set of previous command identifiers. |
| final boolean commandIdsChanged = event.isCommandChanged(); |
| final Set previousCommandIds; |
| if (commandIdsChanged) { |
| previousCommandIds = new HashSet(commandManager |
| .getDefinedCommandIds()); |
| final String commandId = event.getCommandId(); |
| if (event.isCommandDefined()) { |
| previousCommandIds.remove(commandId); |
| } else { |
| previousCommandIds.add(commandId); |
| } |
| } else { |
| previousCommandIds = null; |
| } |
| |
| fireCommandManagerChanged(new CommandManagerEvent(this, false, false, |
| false, false, categoryIdsChanged, commandIdsChanged, false, |
| previousCategoryIds, previousCommandIds, null)); |
| } |
| |
| public final void contextManagerChanged(final ContextManagerEvent event) { |
| fireCommandManagerChanged(new CommandManagerEvent(this, event |
| .isActiveContextsChanged(), false, false, false, false, false, |
| false, null, null, null)); |
| } |
| |
| private void fireCommandManagerChanged( |
| CommandManagerEvent commandManagerEvent) { |
| if (commandManagerEvent == null) { |
| throw new NullPointerException(); |
| } |
| if (commandManagerListeners != null) { |
| for (int i = 0; i < commandManagerListeners.size(); i++) { |
| ((ICommandManagerListener) commandManagerListeners.get(i)) |
| .commandManagerChanged(commandManagerEvent); |
| } |
| } |
| } |
| |
| public Set getActiveContextIds() { |
| return contextManager.getActiveContextIds(); |
| } |
| |
| public String getActiveKeyConfigurationId() { |
| final Scheme scheme = bindingManager.getActiveScheme(); |
| if (scheme != null) { |
| return scheme.getId(); |
| } |
| |
| /* |
| * TODO This is possibly a breaking change. The id should be non-null, |
| * and presumably, a real scheme id. |
| */ |
| return Util.ZERO_LENGTH_STRING; |
| } |
| |
| public String getActiveLocale() { |
| return bindingManager.getLocale(); |
| } |
| |
| public String getActivePlatform() { |
| return bindingManager.getPlatform(); |
| } |
| |
| public ICategory getCategory(String categoryId) { |
| // TODO Provide access to the categories. |
| // return new CategoryWrapper(commandManager.getCategory(categoryId)); |
| return null; |
| } |
| |
| public ICommand getCommand(String commandId) { |
| final Command command = commandManager.getCommand(commandId); |
| return new CommandLegacyWrapper(command, bindingManager); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.commands.ICommandManager#getDefinedCategoryIds() |
| */ |
| public Set getDefinedCategoryIds() { |
| return commandManager.getDefinedCategoryIds(); |
| } |
| |
| public Set getDefinedCommandIds() { |
| return commandManager.getDefinedCommandIds(); |
| } |
| |
| public Set getDefinedKeyConfigurationIds() { |
| final Set definedIds = new HashSet(); |
| final Scheme[] schemes = bindingManager.getDefinedSchemes(); |
| for (int i = 0; i < schemes.length; i++) { |
| definedIds.add(schemes[i].getId()); |
| } |
| return definedIds; |
| } |
| |
| public IKeyConfiguration getKeyConfiguration(String keyConfigurationId) { |
| final Scheme scheme = bindingManager.getScheme(keyConfigurationId); |
| return new SchemeLegacyWrapper(scheme, bindingManager); |
| } |
| |
| public Map getPartialMatches(KeySequence keySequence) { |
| try { |
| final org.eclipse.jface.bindings.keys.KeySequence sequence = org.eclipse.jface.bindings.keys.KeySequence |
| .getInstance(keySequence.toString()); |
| final Map partialMatches = bindingManager |
| .getPartialMatches(sequence); |
| final Map returnValue = new HashMap(); |
| final Iterator matchItr = partialMatches.entrySet().iterator(); |
| while (matchItr.hasNext()) { |
| final Map.Entry entry = (Map.Entry) matchItr.next(); |
| final TriggerSequence trigger = (TriggerSequence) entry |
| .getKey(); |
| if (trigger instanceof org.eclipse.jface.bindings.keys.KeySequence) { |
| final org.eclipse.jface.bindings.keys.KeySequence triggerKey = (org.eclipse.jface.bindings.keys.KeySequence) trigger; |
| returnValue.put(KeySequence.getInstance(triggerKey |
| .toString()), entry.getValue()); |
| } |
| } |
| return returnValue; |
| } catch (final ParseException e) { |
| return new HashMap(); |
| } catch (final org.eclipse.ui.keys.ParseException e) { |
| return new HashMap(); |
| } |
| } |
| |
| public String getPerfectMatch(KeySequence keySequence) { |
| try { |
| final org.eclipse.jface.bindings.keys.KeySequence sequence = org.eclipse.jface.bindings.keys.KeySequence |
| .getInstance(keySequence.toString()); |
| final Binding binding = bindingManager.getPerfectMatch(sequence); |
| if (binding == null) { |
| return null; |
| } |
| |
| return binding.getParameterizedCommand().getId(); |
| |
| } catch (final ParseException e) { |
| return null; |
| } |
| } |
| |
| public boolean isPartialMatch(KeySequence keySequence) { |
| try { |
| final org.eclipse.jface.bindings.keys.KeySequence sequence = org.eclipse.jface.bindings.keys.KeySequence |
| .getInstance(keySequence.toString()); |
| return bindingManager.isPartialMatch(sequence); |
| } catch (final ParseException e) { |
| return false; |
| } |
| } |
| |
| public boolean isPerfectMatch(KeySequence keySequence) { |
| try { |
| final org.eclipse.jface.bindings.keys.KeySequence sequence = org.eclipse.jface.bindings.keys.KeySequence |
| .getInstance(keySequence.toString()); |
| return bindingManager.isPerfectMatch(sequence); |
| } catch (final ParseException e) { |
| return false; |
| } |
| } |
| |
| public void removeCommandManagerListener( |
| ICommandManagerListener commandManagerListener) { |
| if (commandManagerListener == null) { |
| throw new NullPointerException("Cannot remove a null listener"); //$NON-NLS-1$ |
| } |
| |
| if (commandManagerListeners != null) { |
| commandManagerListeners.remove(commandManagerListener); |
| if (commandManagerListeners.isEmpty()) { |
| commandManagerListeners = null; |
| this.commandManager.removeCommandManagerListener(this); |
| this.bindingManager.removeBindingManagerListener(this); |
| this.contextManager.removeContextManagerListener(this); |
| } |
| } |
| } |
| |
| /** |
| * Updates the handlers for a block of commands all at once. |
| * |
| * @param handlersByCommandId |
| * The map of command identifier (<code>String</code>) to |
| * handler (<code>IHandler</code>). |
| */ |
| public final void setHandlersByCommandId(final Map handlersByCommandId) { |
| // Wrap legacy handlers so they can be passed to the new API. |
| final Iterator entryItr = handlersByCommandId.entrySet().iterator(); |
| while (entryItr.hasNext()) { |
| final Map.Entry entry = (Map.Entry) entryItr.next(); |
| final Object handler = entry.getValue(); |
| if (handler instanceof org.eclipse.ui.commands.IHandler) { |
| final String commandId = (String) entry.getKey(); |
| handlersByCommandId.put(commandId, new LegacyHandlerWrapper( |
| (org.eclipse.ui.commands.IHandler) handler)); |
| } |
| } |
| |
| commandManager.setHandlersByCommandId(handlersByCommandId); |
| } |
| } |