blob: 40c9b02b6f5d5ec6d88166e26e464c1081a2b193 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2007 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.menus;
import java.util.Collections;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.contexts.Context;
import org.eclipse.core.expressions.Expression;
import org.eclipse.core.expressions.ExpressionConverter;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.AbstractEnabledHandler;
import org.eclipse.ui.menus.AbstractContributionFactory;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.menus.IContributionRoot;
import org.eclipse.ui.menus.IMenuService;
import org.eclipse.ui.services.IServiceLocator;
import org.eclipse.ui.tests.TestPlugin;
import org.eclipse.ui.tests.api.workbenchpart.MenuContributionHarness;
import org.eclipse.ui.tests.commands.ActiveContextExpression;
import org.eclipse.ui.tests.harness.util.UITestCase;
/**
* @since 3.3
*
*/
public class MenuVisibilityTest extends UITestCase {
private static final String EXTENSION_ID = "org.eclipse.ui.tests.menusX1";
private static final String LOCATION = "menu:foo";
private static final String COMMAND_ID = "org.eclipse.ui.tests.commandEnabledVisibility";
/**
* @param testName
*/
public MenuVisibilityTest(String testName) {
super(testName);
}
private IContextService contextService;
private IMenuService menuService;
private IWorkbenchWindow window;
private IContextActivation activeContext;
public void testBasicContribution() throws Exception {
IAction a = new Action() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
System.out.println("Hello action");
}
};
final MenuManager manager = new MenuManager();
final ActionContributionItem item = new ActionContributionItem(a);
final Expression activeContextExpr = new ActiveContextExpression(
MenuContributionHarness.CONTEXT_TEST1_ID,
new String[] { ISources.ACTIVE_CONTEXT_NAME });
AbstractContributionFactory factory = new AbstractContributionFactory(
LOCATION, TestPlugin.PLUGIN_ID) {
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.menus.AbstractContributionFactory#createContributionItems(org.eclipse.ui.menus.IMenuService,
* org.eclipse.ui.menus.AbstractContributionFactory.IContributionList)
*/
public void createContributionItems(IServiceLocator menuService,
IContributionRoot additions) {
additions.addContributionItem(item, activeContextExpr);
}
};
menuService.addContributionFactory(factory);
menuService.populateContributionManager(manager, LOCATION);
assertFalse("starting state", item.isVisible());
activeContext = contextService
.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
assertTrue("active context", item.isVisible());
contextService.deactivateContext(activeContext);
activeContext = null;
assertFalse("after deactivation", item.isVisible());
menuService.releaseContributions(manager);
menuService.removeContributionFactory(factory);
manager.dispose();
}
public void testExtensionContributionExpression() throws Exception {
IAction a = new Action() {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.action.Action#run()
*/
public void run() {
System.out.println("Hello action");
}
};
final MenuManager manager = new MenuManager();
final ActionContributionItem aci = new ActionContributionItem(a);
IExtensionRegistry reg = Platform.getExtensionRegistry();
IExtensionPoint menusExtension = reg
.getExtensionPoint("org.eclipse.ui.menus");
IExtension extension = menusExtension.getExtension(EXTENSION_ID);
IConfigurationElement[] mas = extension.getConfigurationElements();
final Expression activeContextExpr[] = new Expression[1];
for (int i = 0; i < mas.length; i++) {
IConfigurationElement ma = mas[i];
IConfigurationElement[] items = ma.getChildren();
for (int j = 0; j < items.length; j++) {
IConfigurationElement item = items[j];
String id = item.getAttribute("id");
if (id != null
&& id.equals("org.eclipse.ui.tests.menus.itemX1")) {
IConfigurationElement visibleWhenElement = item
.getChildren("visibleWhen")[0];
activeContextExpr[0] = ExpressionConverter.getDefault()
.perform(visibleWhenElement.getChildren()[0]);
}
}
}
assertNotNull("Failed to find expression", activeContextExpr[0]);
AbstractContributionFactory factory = new AbstractContributionFactory(
LOCATION, TestPlugin.PLUGIN_ID) {
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.menus.AbstractContributionFactory#createContributionItems(org.eclipse.ui.menus.IMenuService,
* org.eclipse.ui.menus.AbstractContributionFactory.IContributionList)
*/
public void createContributionItems(IServiceLocator menuService,
IContributionRoot additions) {
additions.addContributionItem(aci, activeContextExpr[0]);
}
};
menuService.addContributionFactory(factory);
menuService.populateContributionManager(manager, LOCATION);
assertFalse("starting state", aci.isVisible());
activeContext = contextService
.activateContext(MenuContributionHarness.CONTEXT_TEST1_ID);
assertTrue("active context", aci.isVisible());
contextService.deactivateContext(activeContext);
activeContext = null;
assertFalse("after deactivation", aci.isVisible());
menuService.releaseContributions(manager);
menuService.removeContributionFactory(factory);
manager.dispose();
}
private static class TestEnabled extends AbstractEnabledHandler {
public Object execute(ExecutionEvent event) {
System.out.println("go");
return null;
}
public void setEnabled(boolean isEnabled) {
super.setEnabled(isEnabled);
}
}
public void testVisibilityTracksEnablement() throws Exception {
final MenuManager manager = new MenuManager();
final CommandContributionItemParameter parm = new CommandContributionItemParameter(
window, null, COMMAND_ID, Collections.EMPTY_MAP, null, null,
null, null, null, null, CommandContributionItem.STYLE_PUSH,
null, true);
final CommandContributionItem item = new CommandContributionItem(parm);
AbstractContributionFactory factory = new AbstractContributionFactory(
LOCATION, TestPlugin.PLUGIN_ID) {
public void createContributionItems(IServiceLocator menuService,
IContributionRoot additions) {
additions.addContributionItem(item, null);
}
};
menuService.addContributionFactory(factory);
menuService.populateContributionManager(manager, LOCATION);
assertFalse(item.isEnabled());
assertFalse("starting state", item.isVisible());
IHandlerService handlers = (IHandlerService) window
.getService(IHandlerService.class);
TestEnabled handler = new TestEnabled();
IHandlerActivation activateHandler = handlers.activateHandler(
COMMAND_ID, handler);
assertTrue(handler.isEnabled());
assertTrue(item.isEnabled());
assertTrue("activated handler", item.isVisible());
handler.setEnabled(false);
assertFalse("set enabled == false", item.isVisible());
handler.setEnabled(true);
assertTrue("set enabled == true", item.isVisible());
handlers.deactivateHandler(activateHandler);
assertFalse("deactivate handler", item.isVisible());
menuService.releaseContributions(manager);
menuService.removeContributionFactory(factory);
manager.dispose();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.tests.harness.util.UITestCase#doSetUp()
*/
protected void doSetUp() throws Exception {
super.doSetUp();
window = openTestWindow();
menuService = (IMenuService) window.getService(IMenuService.class);
contextService = (IContextService) window
.getService(IContextService.class);
Context context1 = contextService
.getContext(MenuContributionHarness.CONTEXT_TEST1_ID);
if (!context1.isDefined()) {
context1.define("Menu Test 1", "Menu test 1",
IContextService.CONTEXT_ID_DIALOG_AND_WINDOW);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.tests.harness.util.UITestCase#doTearDown()
*/
protected void doTearDown() throws Exception {
if (activeContext != null) {
contextService.deactivateContext(activeContext);
activeContext = null;
}
menuService = null;
contextService = null;
window = null;
super.doTearDown();
}
}