blob: ed20d06d0dc3fdc9205d9a68922abcd2c22e58e0 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}