/***********************************************************************
 * Copyright (c) 2008 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 ***********************************************************************/
package org.eclipse.jst.jee.ui.internal.navigator;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jst.j2ee.commonarchivecore.internal.ModuleFile;
import org.eclipse.jst.j2ee.commonarchivecore.internal.helpers.ArchiveOptions;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;
import org.eclipse.jst.j2ee.internal.archive.JavaEEArchiveUtilities;
import org.eclipse.jst.j2ee.internal.componentcore.ComponentArchiveOptions;
import org.eclipse.jst.j2ee.internal.provider.J2EEUtilityJarItemProvider;
import org.eclipse.jst.jee.archive.IArchive;
import org.eclipse.jst.jee.ui.internal.navigator.ear.GroupEARProvider;
import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanInterfaceNode;
import org.eclipse.jst.jee.ui.internal.navigator.ejb.BeanNode;
import org.eclipse.jst.jee.ui.internal.navigator.ejb.GroupEJBProvider;
import org.eclipse.jst.jee.ui.internal.navigator.web.WebAppProvider;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionContext;
import org.eclipse.ui.actions.OpenWithMenu;
import org.eclipse.ui.internal.navigator.resources.plugin.WorkbenchNavigatorMessages;
import org.eclipse.ui.navigator.CommonActionProvider;
import org.eclipse.ui.navigator.ICommonActionConstants;
import org.eclipse.ui.navigator.ICommonActionExtensionSite;
import org.eclipse.ui.navigator.ICommonMenuConstants;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;

/**
 * Standard operations Java EE Action Provider.
 * Introduces standard operations for Deployment descriptor tree nodes. (like open) 
 * 
 * @author Dimitar Giormov
 *
 */
public class JEEActionProvider extends CommonActionProvider {

private static final Class IRESOURCE_CLASS = IResource.class;
	
	private OpenJEEResourceAction openAction; 
	
	/**
	 * 
	 */
	public JEEActionProvider() {
	}
	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.navigator.internal.views.actions.ICommonActionProvider#init(org.eclipse.ui.IViewPart,
	 *      org.eclipse.jface.viewers.StructuredViewer,
	 *      org.eclipse.wst.common.navigator.internal.views.extensions.NavigatorContentService)
	 */
	public void init(ICommonActionExtensionSite aConfig) {	  
		openAction = new OpenJEEResourceAction(); 
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.navigator.internal.views.actions.ICommonActionProvider#setActionContext(org.eclipse.ui.actions.ActionContext)
	 */
	public void setContext(ActionContext aContext) {
		
		if (aContext != null && aContext.getSelection() instanceof IStructuredSelection) {
			IStructuredSelection selection = (IStructuredSelection) aContext.getSelection();

			openAction.selectionChanged(selection);

			Object[] array = selection.toArray();
			if (isUtilityJars(array)) {
				J2EEUtilityJarItemProvider utilityJarItemProvider = null;
				List newSelection = new ArrayList();
				for (int i = 0; i < array.length; i++) {
					utilityJarItemProvider = (J2EEUtilityJarItemProvider) array[i];
					newSelection.addAll(utilityJarItemProvider.getChildren(null));
				}
				selection = new StructuredSelection(newSelection);
			}
		}
		super.setContext(aContext);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.navigator.internal.views.actions.ICommonActionProvider#fillActionBars(org.eclipse.ui.IActionBars)
	 */
	public void fillActionBars(IActionBars theActionBars) {
		if(openAction.isEnabled()) 
			theActionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction);
		return;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.navigator.internal.views.actions.ICommonActionProvider#fillContextMenu(org.eclipse.jface.action.IMenuManager)
	 */
	public void fillContextMenu(IMenuManager aMenu) {		
		if (getContext()==null || getContext().getSelection().isEmpty())
			return;
		IStructuredSelection selection = (IStructuredSelection) getContext().getSelection();
		if(!adaptsToResource(selection.toArray())) {
			openAction.selectionChanged(selection);
//			createAction.selectionChanged(selection);
			if (openAction.isEnabled())
				aMenu.insertAfter(ICommonMenuConstants.GROUP_OPEN, openAction);
//			if (createAction.isEnabled())
//				aMenu.insertAfter(ICommonMenuConstants.GROUP_OPEN, createAction);
			addOpenWithMenu(aMenu);
			
		}
	}

	private boolean adaptsToResource(Object[] objects) {
		for (int i = 0; i < objects.length; i++) {
			if(objects[i] instanceof IResource) {
				return true;
			} else if (objects[i] instanceof IAdaptable && (((IAdaptable)objects[i]).getAdapter(IRESOURCE_CLASS) != null)) {
				return true;
			}			
		}
		return false;
	}
	private boolean isUtilityJars(Object[] items) {
		if (items != null) {
			for (int i = 0; i < items.length; i++) {
				if (items[i] == null || items[i].getClass() != J2EEUtilityJarItemProvider.class)
					return false;
			}
			return true;
		}
		return false;
	} 
	 
	private void addOpenWithMenu(IMenuManager menu) {
		ISelection selection= getContext().getSelection();
		if (selection.isEmpty() || !(selection instanceof IStructuredSelection))
			return;
		IStructuredSelection ss= (IStructuredSelection)selection;
		if (ss.size() != 1)
			return;

		Object srcObject = ss.getFirstElement();
		Object resource = null;
		
		if (srcObject instanceof EObject) {
			resource = openEObject((EObject) srcObject);
		} else if (srcObject instanceof BeanInterfaceNode) {
			resource = ((BeanInterfaceNode) srcObject).get_fqn();
		} else if (srcObject instanceof BeanNode) {
			resource = ((BeanNode) srcObject).getEjbClassQualifiedName();

		} else if (srcObject instanceof WebAppProvider) {
			IFile file = ((WebAppProvider) srcObject).getDDFile();
			if (file.isAccessible()){				
				resource = file;
			}
		} else if (srcObject instanceof GroupEJBProvider) {
			resource = openEObject((EObject) ((GroupEJBProvider)srcObject).getEjbJar());
		} else if (srcObject instanceof GroupEARProvider) {
			IFile file = ((GroupEARProvider) srcObject).getDDFile();
			if (file.isAccessible()){
				resource = file;
			}
		}
		
		if (!(resource instanceof IFile))
			return; 

		// Create a menu.
		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
		.getActivePage();
		IMenuManager submenu= new MenuManager(WorkbenchNavigatorMessages.OpenActionProvider_OpenWithMenu_label, 
				ICommonMenuConstants.GROUP_OPEN_WITH); 
		submenu.add(new OpenWithMenu(page, (IFile) resource));

		// Add the submenu.
		menu.appendToGroup(ICommonMenuConstants.GROUP_OPEN, submenu);
	}
	
	private IResource openEObject(EObject _srcObject) {
		EObject ro = (EObject) _srcObject;
		IResource resource = WorkbenchResourceHelper
		.getFile((EObject) _srcObject);
		if (resource != null) {
			return resource;
		} else {
			ModuleFile moduleFile = ArchiveUtil.getModuleFile(ro);
			if (moduleFile != null) {
				ArchiveOptions options = moduleFile.getOptions();
				if (options instanceof ComponentArchiveOptions) {
					IVirtualComponent component = ((ComponentArchiveOptions) options)
					.getComponent();
//					openAppropriateEditor(component);
				}
			} else {
				IArchive archive = JavaEEArchiveUtilities.findArchive(ro);
				if(archive != null){
					IVirtualComponent component = JavaEEArchiveUtilities.findComponent(archive);
					if(component != null){
//						openAppropriateEditor(component);
					}
				}
			}
		}
		return null;
	}
}
