/*******************************************************************************
 * 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.HashMap;
import java.util.Map;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.contexts.IContextActivation;
import org.eclipse.ui.contexts.IContextService;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.ui.menus.UIElement;

/**
 * @since 3.3
 * 
 */
public class ToggleContextHandler extends AbstractHandler implements
		IElementUpdater {
	private static final String TOGGLE_ID = "toggleContext.contextId";
	Map contextActivations = new HashMap();

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.core.commands.IHandler#execute(org.eclipse.core.commands.ExecutionEvent)
	 */
	public Object execute(ExecutionEvent event) throws ExecutionException {
		String contextId = event.getParameter(TOGGLE_ID);
		IWorkbenchWindow window = HandlerUtil
				.getActiveWorkbenchWindowChecked(event);

		IContextService contextService = (IContextService) window
				.getService(IContextService.class);
		IContextActivation a = (IContextActivation) contextActivations
				.get(contextId);

		// toggle the context active or not
		if (a == null) {
			contextActivations.put(contextId, contextService
					.activateContext(contextId));
		} else {
			contextService.deactivateContext(a);
			contextActivations.remove(contextId);
		}

		// now we should update any menu items/tool items that refer
		// to toggleContext(contextId) ... this request means
		// only update the UI that points to this specific context
		// id ... not the other, non-interesting ones.
		ICommandService commandService = (ICommandService) window
				.getService(ICommandService.class);
		Map filter = new HashMap();
		filter.put(TOGGLE_ID, contextId);
		commandService.refreshElements(event.getCommand().getId(), filter);
		return null;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ui.commands.IElementUpdater#updateElement(org.eclipse.ui.menus.UIElement, java.util.Map)
	 */
	public void updateElement(UIElement element, Map parameters) {

		// the checked state depends on if we have an activation for that
		// context ID or not
		String contextId = (String) parameters.get(TOGGLE_ID);
		element.setChecked(contextActivations.get(contextId) != null);
	}
}
