/**
 * Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
 * 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:
 * Thales Corporate Services S.A.S - initial API and implementation
 */
package org.eclipse.egf.model.editor.contributions;

import org.eclipse.egf.common.ui.constant.EGFCommonUIConstants;
import org.eclipse.egf.common.ui.helper.EditorHelper;
import org.eclipse.egf.common.ui.helper.ThrowableHandler;
import org.eclipse.egf.core.ui.contributor.EditorMenuContributor;
import org.eclipse.egf.model.editor.EGFModelEditorPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.IEditingDomainProvider;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;

/**
 * @author Xavier Maysonnave
 * 
 */
public abstract class OpenEObjectMenuContributor extends EditorMenuContributor {

    protected abstract OpenAction getOpenAction();

    protected abstract String getText();

    protected abstract class OpenAction extends Action {

        public OpenAction(String id) {
            setId(id);
        }

        @Override
        public boolean isEnabled() {
            EObject eObject = getEObject();
            if (eObject == null) {
                return false;
            }
            if (eObject instanceof InternalEObject) {
                return ((InternalEObject) eObject).eIsProxy() == false;
            }
            return false;
        }

        public boolean isAlreadyOpenedEditor() {
            return EditorHelper.isAlreadyOpenedEditor(getURI());
        }

        protected abstract EObject getEObject();

        protected URI getURI() {
            EObject eObject = getEObject();
            if (eObject == null) {
                return null;
            }
            return EcoreUtil.getURI(eObject);
        }

        protected URIConverter getURIConverter() {
            EObject eObject = getEObject();
            if (eObject == null) {
                return null;
            }
            if (eObject.eResource() != null && eObject.eResource().getResourceSet() != null && eObject.eResource().getResourceSet().getURIConverter() != null) {
                return eObject.eResource().getResourceSet().getURIConverter();
            }
            return null;
        }

        protected URI normalize(URI uri) {
            if (uri == null || getURIConverter() == null) {
                return uri;
            }
            return getURIConverter().normalize(uri);
        }

        @Override
        public void run() {
            try {
                URI uri = getURI();
                // Try to open it if any
                if (uri != null) {
                    IEditorPart part = EditorHelper.openEditor(normalize(uri));
                    if (part != null && part instanceof IEditingDomainProvider) {
                        EditorHelper.setSelectionToViewer(part, uri);
                    }
                }
            } catch (PartInitException pie) {
                ThrowableHandler.handleThrowable(EGFModelEditorPlugin.getPlugin().getSymbolicName(), pie);
            }
        }

    }

    @Override
    public void menuAboutToShow(IMenuManager menuManager) {
        IStructuredSelection innerSelection = (IStructuredSelection) _selection;
        if (innerSelection.size() == 1 && getOpenAction().getEObject() != null) {
            getOpenAction().setText(getText());
            getOpenAction().setEnabled(getOpenAction().isEnabled());
            menuManager.insertBefore(EGFCommonUIConstants.OPEN_MENU_GROUP, getOpenAction());
        }
    }

}
