package org.eclipse.ant.internal.ui;

/*
 * (c) Copyright IBM Corp. 2000, 2001.
 * All Rights Reserved.
 */
 
import java.io.File;
import org.apache.tools.ant.ProjectHelper;
import org.eclipse.ant.core.EclipseProject;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.*;
import org.eclipse.ui.*;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.jface.action.*;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;

/**
 * Superclass of run & debug pulldown actions.
 */
public class AntLaunchDropDownAction implements IWorkbenchWindowPulldownDelegate {
	

/**
 * @see IWorkbenchWindowActionDelegate
 */
public void dispose() {
}

private void createMenuForAction(Menu parent, Action action) {
	ActionContributionItem item= new ActionContributionItem(action);
	item.fill(parent, -1);
}

/**
 * @see IWorkbenchWindowPulldownDelegate
 */
public Menu getMenu(Control parent) {
	Menu menu= new Menu(parent);
	IFile[] historyList= AntUIPlugin.getPlugin().getHistory();
	int count= 0;
	for (int i = 0; i < historyList.length; i++) {
		IFile file = historyList[i];
		if (file == null) 
			break;
		AntAction newAction= new AntAction(file);
		createMenuForAction(menu, newAction);
		count++;
	}
	if (count == 0)
		createMenuForAction(menu, new AntAction(null));

	return menu;
}

/**
 * @see IWorkbenchWindowActionDelegate
 */
public void init(IWorkbenchWindow window){
}

/**
 * @see IActionDelegate
 */
public void run(IAction action) {
	IWorkbenchWindow window= PlatformUI.getWorkbench().getActiveWorkbenchWindow();
	IStructuredSelection selection= resolveSelection(window);
	
	if (selection != null) {
		Object selectedObject = selection.getFirstElement();
		if (selectedObject instanceof IFile) {
			if (((IFile) selectedObject).getFileExtension().equals("xml"))
				new AntAction((IFile) selectedObject).run();
		}
		else if (selectedObject instanceof FileEditorInput) {
			if ((((FileEditorInput) selectedObject).getFile()).getFileExtension().equals("xml"))
				new AntAction(((FileEditorInput) selectedObject).getFile()).run();
		}
	}
}

/**
 * Determines and returns the selection that provides context for the launch,
 * or <code>null</code> if there is no selection.
 */
protected IStructuredSelection resolveSelection(IWorkbenchWindow window) {
	if (window == null) {
		return null;
	}
	ISelection selection= window.getSelectionService().getSelection();
	if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
		// there is no obvious selection - go fishing
		selection= null;
		IWorkbenchPage page= window.getActivePage();
		if (page == null) {
			//workspace is closed
			return null;
		}

		// first, see if there is an active editor, and try its input element
		IEditorPart editor= page.getActiveEditor();
		Object element= null;
		if (editor != null) {
			element= editor.getEditorInput();
		}

		if (selection == null && element != null) {
			selection= new StructuredSelection(element);
		}
	}
	return (IStructuredSelection)selection;
}

/**
 * @see IActionDelegate
 */
public void selectionChanged(IAction action, ISelection selection){
}

}
