blob: a5a41d5d6f20e86a2a0f80f461ed5c091c9f9656 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2005 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.contexts;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.commands.contexts.ContextManager;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISources;
import org.eclipse.ui.LegacyHandlerSubmissionExpression;
import org.eclipse.ui.contexts.EnabledSubmission;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextManager;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.contexts.IWorkbenchContextSupport;
import org.eclipse.ui.internal.Workbench;
import org.eclipse.ui.keys.IBindingService;
/**
* Provides support for contexts within the workbench -- including key bindings,
* and some default contexts for shell types.
*
* @since 3.0
*/
public class WorkbenchContextSupport implements IWorkbenchContextSupport {
/**
* The map of activations that have been given to the handler service (<code>IHandlerActivation</code>),
* indexed by the submissions (<code>HandlerSubmission</code>). This map
* should be <code>null</code> if there are no such activations.
*/
private Map activationsBySubmission = null;
/**
* The binding service for the workbench. This value is never
* <code>null</code>.
*/
private IBindingService bindingService;
/**
* The context service for the workbench. This value is never
* <code>null</code>.
*/
private IContextService contextService;
/**
* The legacy context manager supported by this application.
*/
private ContextManagerLegacyWrapper contextManagerWrapper;
/**
* The workbench for which context support is being provided. This value
* must not be <code>null</code>.
*/
private final Workbench workbench;
/**
* Constructs a new instance of <code>WorkbenchCommandSupport</code>.
* This attaches the key binding support, and adds a global shell activation
* filter.
*
* @param workbenchToSupport
* The workbench that needs to be supported by this instance;
* must not be <code>null</code>.
* @param contextManager
* The context manager to be wrappered; must not be
* <code>null</code>.
*/
public WorkbenchContextSupport(final Workbench workbenchToSupport,
final ContextManager contextManager) {
workbench = workbenchToSupport;
contextService = (IContextService) workbench.getService(IContextService.class);
bindingService = (IBindingService) workbench.getService(IBindingService.class);
contextManagerWrapper = ContextManagerFactory
.getContextManagerWrapper(contextManager);
}
public final void addEnabledSubmission(
final EnabledSubmission enabledSubmission) {
/*
* Create the source priorities based on the conditions mentioned in the
* submission.
*/
int sourcePriorities = 0;
if (enabledSubmission.getActivePartId() != null) {
sourcePriorities |= ISources.ACTIVE_PART_ID;
}
if (enabledSubmission.getActiveShell() != null) {
sourcePriorities |= (ISources.ACTIVE_SHELL | ISources.ACTIVE_WORKBENCH_WINDOW);
}
if (enabledSubmission.getActiveWorkbenchPartSite() != null) {
sourcePriorities |= ISources.ACTIVE_SITE;
}
final IContextActivation activation = contextService.activateContext(
enabledSubmission.getContextId(),
new LegacyHandlerSubmissionExpression(enabledSubmission
.getActivePartId(), enabledSubmission.getActiveShell(),
enabledSubmission.getActiveWorkbenchPartSite()));
if (activationsBySubmission == null) {
activationsBySubmission = new HashMap();
}
activationsBySubmission.put(enabledSubmission, activation);
}
public final void addEnabledSubmissions(final Collection enabledSubmissions) {
final Iterator submissionItr = enabledSubmissions.iterator();
while (submissionItr.hasNext()) {
addEnabledSubmission((EnabledSubmission) submissionItr.next());
}
}
public final IContextManager getContextManager() {
return contextManagerWrapper;
}
public final int getShellType(Shell shell) {
return contextService.getShellType(shell);
}
public final boolean isKeyFilterEnabled() {
return bindingService.isKeyFilterEnabled();
}
public final void openKeyAssistDialog() {
bindingService.openKeyAssistDialog();
}
public final boolean registerShell(final Shell shell, final int type) {
return contextService.registerShell(shell, type);
}
public final void removeEnabledSubmission(
final EnabledSubmission enabledSubmission) {
if (activationsBySubmission == null) {
return;
}
final Object value = activationsBySubmission.remove(enabledSubmission);
if (value instanceof IContextActivation) {
final IContextActivation activation = (IContextActivation) value;
contextService.deactivateContext(activation);
}
}
public final void removeEnabledSubmissions(
final Collection enabledSubmissions) {
final Iterator submissionItr = enabledSubmissions.iterator();
while (submissionItr.hasNext()) {
removeEnabledSubmission((EnabledSubmission) submissionItr.next());
}
}
public final void setKeyFilterEnabled(final boolean enabled) {
bindingService.setKeyFilterEnabled(enabled);
}
public final boolean unregisterShell(final Shell shell) {
return contextService.unregisterShell(shell);
}
}