/*******************************************************************************
 * Copyright (c) 2003, 2005 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.actions;



import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages;
import org.eclipse.jst.j2ee.internal.plugin.J2EEUIPlugin;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;


public abstract class AbstractActionDelegate implements org.eclipse.ui.IActionDelegate {
	protected ISelection selection;
	protected boolean allowsMultiSelect = false;
	public static final Class IPROJECT_CLASS = IProject.class;
	private final static String ERROR_OCCURRED_TITLE = J2EEUIMessages.getResourceString("ERROR_OCCURRED_TITLE"); //$NON-NLS-1$
	private final static String ERROR_OCCURRED_MESSAGE = J2EEUIMessages.getResourceString("ERROR_OCCURRED_MESSAGE"); //$NON-NLS-1$

	/**
	 * EditModuleDependencyAction constructor comment.
	 */
	public AbstractActionDelegate() {
		super();
	}

	/**
	 * Applicable only when this action does not allow multi select
	 */
	protected IProject getProject() {
		return getProject(getSelectedElement());
	}

	protected List getProjects() {
		if ((selection == null) || !(selection instanceof IStructuredSelection))
			return Collections.EMPTY_LIST;

		List result = new ArrayList();
		IStructuredSelection struct = (IStructuredSelection) selection;
		Iterator it = struct.iterator();
		while (it.hasNext()) {
			IProject p = getProject(it.next());
			if (p != null)
				result.add(p);
		}
		return result;
	}

	protected IProject getProject(Object element) {

		if (isSupportedAction(element))
			return ProjectUtilities.getProject((EObject) element);
		else if (element instanceof IAdaptable)
			return (IProject) ((IAdaptable) element).getAdapter(IPROJECT_CLASS);
		else
			return null;
	}

	protected IStructuredSelection getStructuredSelection() {
		if ((selection == null) || !(selection instanceof IStructuredSelection))
			return null;
		else if (selection.isEmpty()) {
			selection = J2EEUIPlugin.getCurrentSelection();
		}
		return (IStructuredSelection) selection;
	}

	/*
	 * Only return if there is exactly one item selected
	 */
	protected Object getSelectedElement() {
		IStructuredSelection sel = getStructuredSelection();
		return sel == null ? null : sel.getFirstElement();
	}

	protected IWorkbenchWindow getWorkbenchWindow() {
		return J2EEUIPlugin.getActiveWorkbenchWindow();
	}

	/**
	 * Can the receiver be executed for
	 * 
	 * @element
	 */
	protected abstract boolean isSupportedAction(Object element);

	/**
	 * @deprecated use {@link #primRun(Shell)}
	 */
	protected void primRun(IProject project, Shell shell) {
		//Deprecated
	}

	/**
	 * Subclasses should override this instead of {@link #run(org.eclipse.jface.action.IAction)}
	 */
	protected void primRun(Shell shell) {
		primRun(getProject(), shell);
	}

	/**
	 * Performs this action.
	 * <p>
	 * This method is called when the delegating action has been triggered. Implement this method to
	 * do the actual work.
	 * </p>
	 * 
	 * @param action
	 *            the action proxy that handles the presentation portion of the action
	 */
	public void run(org.eclipse.jface.action.IAction action) {

		Shell shell = getWorkbenchWindow().getShell();
		setActionStateFromProjects(action);
		if (!action.isEnabled())
			MessageDialog.openInformation(shell, J2EEUIMessages.getResourceString("INFORMATION_UI_"), J2EEUIMessages.getResourceString("CHOSEN_OP_NOT_AVAILABLE")); //$NON-NLS-2$ = "The chosen operation is not currently available." //$NON-NLS-1$ = "Information"
		else {
			try {
				primRun(shell);
			} catch (Throwable t) {
				org.eclipse.jst.j2ee.internal.plugin.ErrorDialog.openError(shell, ERROR_OCCURRED_TITLE, ERROR_OCCURRED_MESSAGE, t, 0, false);
			}
		}


	}

	/**
	 * Notifies this action delegate that the selection in the workbench has changed.
	 * <p>
	 * Implementers can use this opportunity to change the availability of the action or to modify
	 * other presentation properties.
	 * </p>
	 * 
	 * @param action
	 *            the action proxy that handles presentation portion of the action
	 * @param aSelection
	 *            the current selection in the workbench
	 */
	public void selectionChanged(org.eclipse.jface.action.IAction action, org.eclipse.jface.viewers.ISelection aSelection) {
		this.selection = aSelection;
		setActionState(action);
	}

	protected void setActionState(IAction action) {
		if (allowsMultiSelect)
			setActionStateForMultiSelect(action);
		else
			setActionStateForSingleSelect(action);
	}

	protected void setActionStateForSingleSelect(IAction action) {
		IStructuredSelection sel = getStructuredSelection();
		if (sel == null || sel.size() != 1) {
			action.setEnabled(false);
			return;
		}
		setActionStateFromProjects(action);
	}

	protected void setActionStateForMultiSelect(IAction action) {
		setActionStateFromProjects(action);
	}

	protected void setActionStateFromProjects(IAction action) {
		IStructuredSelection sel = getStructuredSelection();
		boolean allOk = false;
		if (sel != null && !sel.isEmpty()) {
			allOk = true;
			Iterator it = sel.iterator();
			while (it.hasNext()) {
				Object o = it.next();
				IProject project = getProject(o);
				if (project == null || !project.isOpen()) {
					allOk = false;
					break;
				}
			}
		}
		action.setEnabled(allOk);
	}

	/**
	 * Returns the allowsMultiSelect.
	 * 
	 * @return boolean
	 */
	public boolean allowsMultiSelect() {
		return allowsMultiSelect;
	}


	/**
	 * Sets the allowsMultiSelect.
	 * 
	 * @param allowsMultiSelect
	 *            The allowsMultiSelect to set
	 */
	public void setAllowsMultiSelect(boolean allowsMultiSelect) {
		this.allowsMultiSelect = allowsMultiSelect;
	}


}
