| /******************************************************************************* |
| * Copyright (c) 2005, 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.tests.contexts; |
| |
| import java.util.HashSet; |
| import java.util.Set; |
| |
| import org.eclipse.core.commands.Command; |
| import org.eclipse.core.commands.CommandManager; |
| import org.eclipse.core.commands.ParameterizedCommand; |
| import org.eclipse.core.commands.common.NotDefinedException; |
| import org.eclipse.core.commands.contexts.Context; |
| 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.Scheme; |
| import org.eclipse.jface.bindings.keys.KeyBinding; |
| import org.eclipse.jface.bindings.keys.KeySequence; |
| import org.eclipse.jface.bindings.keys.ParseException; |
| import org.eclipse.jface.contexts.IContextIds; |
| import org.eclipse.ui.tests.harness.util.UITestCase; |
| |
| /** |
| * A test case covering the scenario described in Bug 84763. The problem was |
| * that the context manager was exposing its internal data structures, and the |
| * binding manager was mangling them. Debug then responded to bad information in |
| * the <code>previouslyEnabledContextIds</code> property on the context event. |
| * |
| * @since 3.1 |
| */ |
| public final class Bug84763Test extends UITestCase { |
| |
| /** |
| * The binding manager to use in each test case. A new binding manager is |
| * created for each test case, and it is disposed when the test is over. |
| */ |
| private BindingManager bindingManager = null; |
| |
| /** |
| * The context manager to use in each test case. A new context manager is |
| * created for each test case, and it is disposed when the test is over. |
| */ |
| private ContextManager contextManager = null; |
| |
| /** |
| * The context manager listener to use in each test case. A new context |
| * manager listener is created for each test case, and it is disposed when |
| * the test is over. |
| */ |
| private IContextManagerListener contextManagerListener = null; |
| |
| /** |
| * The set of the previous context identifiers returned by the last context |
| * manager event. This value is set to <code>null</code> at the end of |
| * each test. |
| */ |
| private Set previousContextIds = null; |
| |
| /** |
| * Constructor for <code>Bug84763Test</code>. |
| * |
| * @param name |
| * The name of the test |
| */ |
| public Bug84763Test(final String name) { |
| super(name); |
| } |
| |
| /** |
| * Creates a new context manager and a binding manager for use in the test |
| * cases. |
| */ |
| protected void doSetUp() { |
| contextManager = new ContextManager(); |
| contextManagerListener = new IContextManagerListener() { |
| |
| public void contextManagerChanged( |
| ContextManagerEvent contextManagerEvent) { |
| previousContextIds = contextManagerEvent |
| .getPreviouslyActiveContextIds(); |
| if (previousContextIds != null) { |
| previousContextIds = new HashSet(previousContextIds); |
| } |
| } |
| |
| }; |
| contextManager.addContextManagerListener(contextManagerListener); |
| bindingManager = new BindingManager(contextManager, |
| new CommandManager()); |
| } |
| |
| /** |
| * Releases the context manager and binding manager for garbage collection. |
| */ |
| protected void doTearDown() { |
| contextManager = null; |
| contextManagerListener = null; |
| previousContextIds = null; |
| bindingManager = null; |
| } |
| |
| /** |
| * <p> |
| * Testst whether the binding manager will overwrite information in the |
| * context manager. In particular, whether the list of previous enabled |
| * context identifiers will be changed. |
| * </p> |
| * |
| * @throws NotDefinedException |
| * If the scheme we try to activate is not defined. |
| * @throws ParseException |
| * If "CTRL+F" cannot be parsed for some reason. |
| */ |
| public void testWindowChildWhenDialog() throws NotDefinedException, |
| ParseException { |
| // Define the contexts to use. |
| final Context dialogAndWindowsContext = contextManager |
| .getContext(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW); |
| dialogAndWindowsContext.define("In Dialogs and Windows", null, null); |
| final Context dialogContext = contextManager |
| .getContext(IContextIds.CONTEXT_ID_DIALOG); |
| dialogContext.define("In Dialogs", null, |
| IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW); |
| final Context windowContext = contextManager |
| .getContext(IContextIds.CONTEXT_ID_WINDOW); |
| windowContext.define("In Windows", null, |
| IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW); |
| final Context windowChildContext = contextManager.getContext("sibling"); |
| windowChildContext.define("Sibling", null, |
| IContextIds.CONTEXT_ID_WINDOW); |
| |
| // Force a binding computation. |
| final Scheme scheme = bindingManager.getScheme("na"); |
| scheme.define("name", null, null); |
| bindingManager.setActiveScheme(scheme); |
| final CommandManager commandManager = new CommandManager(); |
| final Command command = commandManager.getCommand("commandId"); |
| final ParameterizedCommand parameterizedCommand = new ParameterizedCommand( |
| command, null); |
| bindingManager.addBinding(new KeyBinding(KeySequence |
| .getInstance("CTRL+F"), parameterizedCommand, scheme.getId(), |
| windowChildContext.getId(), null, null, null, Binding.SYSTEM)); |
| bindingManager.getActiveBindingsFor((ParameterizedCommand) null); |
| |
| // Activate the dialog context and the sibling. |
| final Set activeContextIds = new HashSet(); |
| activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG); |
| activeContextIds.add(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW); |
| activeContextIds.add(windowChildContext.getId()); |
| contextManager.setActiveContextIds(activeContextIds); |
| |
| // Force a binding computation. |
| bindingManager.getActiveBindingsFor((ParameterizedCommand) null); |
| |
| // Active the window context. |
| activeContextIds.remove(IContextIds.CONTEXT_ID_DIALOG); |
| activeContextIds.add(IContextIds.CONTEXT_ID_WINDOW); |
| contextManager.setActiveContextIds(activeContextIds); |
| |
| // Force a binding computation. |
| bindingManager.getActiveBindingsFor((ParameterizedCommand) null); |
| |
| /* |
| * Check to see what the listener got as the list of previously active |
| * context identifiers. |
| */ |
| assertEquals("There should have been 3 context ids active previously", |
| 3, previousContextIds.size()); |
| assertTrue("The previous contexts should include the dialog context", |
| previousContextIds.contains(IContextIds.CONTEXT_ID_DIALOG)); |
| assertTrue("The previous contexts should include the dialog context", |
| previousContextIds |
| .contains(IContextIds.CONTEXT_ID_DIALOG_AND_WINDOW)); |
| assertTrue("The previous contexts should include the dialog context", |
| previousContextIds.contains(windowChildContext.getId())); |
| System.out.println("testSiblingContext"); |
| } |
| } |