/*******************************************************************************
 * Copyright (c) 2011, 2019 Mia-Software and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * Contributors:
 *    Nicolas Bros (Mia-Software) - initial API and implementation
 *******************************************************************************/
package org.eclipse.modisco.infra.browser.opener;

import org.eclipse.emf.common.ui.URIEditorInput;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.modisco.facet.util.emf.core.IEObjectBrowserOpener;
import org.eclipse.modisco.facet.util.emf.core.IEPackageBrowserOpener;
import org.eclipse.modisco.facet.util.emf.core.IResourceBrowserOpener;
import org.eclipse.modisco.infra.browser.MoDiscoBrowserPlugin;
import org.eclipse.modisco.infra.browser.editors.BrowserUtils;
import org.eclipse.modisco.infra.browser.editors.EcoreBrowser;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.infra.common.ui.internal.editorInputs.ResourceEditorInput;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.IDE;

public class BrowserOpener implements IResourceBrowserOpener, IEPackageBrowserOpener,
		IEObjectBrowserOpener {

	public BrowserOpener() {
		//
	}

	public void openResource(final Resource resource) {
		Display.getDefault().syncExec(new Runnable() {
			public void run() {
				try {
					IWorkbenchPage activePage = PlatformUI.getWorkbench()
							.getActiveWorkbenchWindow().getActivePage();
					IDE.openEditor(activePage, new ResourceEditorInput(resource),
							EcoreBrowser.EDITOR_ID, true);
				} catch (Exception e) {
					MoDiscoLogger.logError(e, MoDiscoBrowserPlugin.getPlugin());
				}
			}
		});
	}

	public void openEObject(final EObject eObject) {
		BrowserUtils.openEObjectInBrowser(eObject, true);
	}

	public void openEPackage(final EPackage ePackage) {
		try {
			final IEditorInput input = new URIEditorInput(URI.createURI(ePackage.getNsURI()));
			IDE.openEditor(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(),
					input, EcoreBrowser.EDITOR_ID, true);
		} catch (final Exception e) {
			MoDiscoBrowserPlugin.logException(e);
		}
	}

	public String getBrowserName() {
		return EcoreBrowser.HUMAN_READABLE_NAME;
	}
}
