/*******************************************************************************
 * Copyright (c) 2013 CEA LIST.
 * 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:
 *     Cedric Dumoulin - cedric.dumoulin@lifl.fr
 ******************************************************************************/
/**
 *
 */
package org.eclipse.papyrus.infra.gmfdiag.layers.ui.view;

import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.papyrus.internal.infra.gmfdiag.layers.model.NotFoundException;
import org.eclipse.ui.ISources;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.handlers.HandlerUtil;

/**
 * Utilities to open, close or check the LayersExplorerView.
 *
 *
 * @author cedric dumoulin
 *
 */
public class LayersExplorerViewUtils {

	/**
	 * Id of the View.
	 */
	static final public String LayersExplorerViewId = "org.eclipse.papyrus.infra.gmfdiag.layers.ui.view.layersexplorer";

	/**
	 *
	 * @param event
	 */
	static public void openView(ExecutionEvent event) {
		try {
			HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().showView(LayersExplorerViewId);
		} catch (PartInitException e) {
			// Do nothing;
		}
	}

	/**
	 *
	 * @param event
	 */
	static public void openView(IEvaluationContext context) {
		try {
			getActiveWorkbenchWindow(context).getActivePage().showView(LayersExplorerViewId);
		} catch (PartInitException e) {
			// Do nothing;
		}
	}

	/**
	 *
	 * @param event
	 * @throws NotFoundException
	 */
	static public LayersExplorerView findView(ExecutionEvent event) throws NotFoundException {
		IViewPart part = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().findView(LayersExplorerViewId);

		if (part instanceof LayersExplorerView) {
			return (LayersExplorerView) part;
		} else {
			throw new NotFoundException("Can't find LayersExplorerView.");
		}
	}

	/**
	 *
	 * @param event
	 * @throws NotFoundException
	 */
	static public LayersExplorerView findView(IEvaluationContext context) throws NotFoundException {
		IViewPart part = getActiveWorkbenchWindow(context).getActivePage().findView(LayersExplorerViewId);

		if (part instanceof LayersExplorerView) {
			return (LayersExplorerView) part;
		} else {
			throw new NotFoundException("Can't find LayersExplorerView.");
		}
	}

	/**
	 *
	 * @param event
	 * @return
	 */
	static public boolean isViewOpened(ExecutionEvent event) {
		try {
			return findView(event) != null;
		} catch (NotFoundException e) {
			// Do nothing;
			return false;
		}
	}

	/**
	 *
	 * @param event
	 * @return
	 */
	static public boolean isViewOpened(IEvaluationContext context) {
		try {
			return findView(context) != null;
		} catch (NotFoundException e) {
			// Do nothing;
			return false;
		}
	}

	public static IWorkbenchWindow getActiveWorkbenchWindow(IEvaluationContext context) {
		Object o = HandlerUtil.getVariable(context, ISources.ACTIVE_WORKBENCH_WINDOW_NAME);
		if (o instanceof IWorkbenchWindow) {
			return (IWorkbenchWindow) o;
		}
		return null;
	}

}
