/*
-----------------------------------------------------------------------
--          			CHESS editor plugin							 --
--                                                                   --
--                    Copyright (C) 2011-2012                        --
--                 University of Padova, ITALY                       --
--                                                                   --
-- Author: Alessandro Zovi         azovi@math.unipd.it 		         --
--                                                                   --
-- 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-v20.html                         --
-----------------------------------------------------------------------
*/

package org.polarsys.chess.service.internal.commands;

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.papyrus.editor.PapyrusMultiDiagramEditor;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.commands.ICommandService;
import org.eclipse.ui.commands.IElementUpdater;
import org.eclipse.ui.menus.UIElement;
import org.polarsys.chess.core.profiles.CHESSProfileManager;
import org.polarsys.chess.core.views.DiagramStatus;
import org.polarsys.chess.service.gui.utils.CHESSEditorUtils;
import org.polarsys.chess.service.internal.commands.switchers.SwitchSourceProvider;
import org.polarsys.chess.service.internal.service.CHESSService;
import org.polarsys.chess.service.internal.service.CHESSServiceFactory;

public class CurrentViewStatusCommand extends AbstractHandler implements IElementUpdater {
	
	public CurrentViewStatusCommand() {
		SwitchSourceProvider.commandsToRefresh.add(COMMAND_ID);
	}

	public static String COMMAND_ID = "org.polarsys.chess.service.CurrentViewStatus";
	
	public static void refresh(){
		ICommandService service = (ICommandService) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getService(ICommandService.class);
        service.refreshElements(COMMAND_ID, null);
	}
	
	public Object execute(ExecutionEvent event) throws ExecutionException {
		return null;
	}

	@SuppressWarnings("rawtypes")
	public void updateElement(UIElement element, Map parameters) {
		PapyrusMultiDiagramEditor editor = CHESSEditorUtils.getCHESSEditor();
		//DesignView currentView;
		DiagramStatus diagramStatus;
		
		if (editor != null && (null != (diagramStatus = CHESSEditorUtils.getDiagramStatus(editor)))){
			if (diagramStatus != null && null != (/*currentView = */diagramStatus.getCurrentView())){
	
				String n = diagramStatus.getActiveView();
				element.setTooltip(n);
				
				element.setIcon(CHESSService.viewIcons.get(n));
				return;
			}	
		}	

		element.setIcon(CHESSService.viewIcons.get(CHESSProfileManager.NULL_VIEW));

	    element.setTooltip(CHESSProfileManager.NULL_VIEW);
		element.setText(" ");
//		PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor().getEditorSite().getActionBars().updateActionBars();
	}

}
