/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.ui.examples.jobs.actions;

import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.examples.jobs.TestJob;

/**
 * Test action that creates a number of fake jobs, and then waits until they complete.
 */
public class CreateJobsAction implements IWorkbenchWindowActionDelegate {
	static final long DELAY = 100;

	private IWorkbenchWindow window;

	public CreateJobsAction() {
	}
	private long askForDuration() {
		InputDialog dialog = new InputDialog(window.getShell(), "How long?", "Enter the number of milliseconds per job", "1000", new IInputValidator() {
			public String isValid(String newText) {
				try {
					Long.parseLong(newText);
				} catch (NumberFormatException e) {
					return "Not a number";
				}
				return null;
			}
		});
		if (dialog.open() == Dialog.CANCEL)
			throw new OperationCanceledException();
		return Long.parseLong(dialog.getValue());
	}
	private boolean askForExclusive() {
		MessageDialog dialog =
			new MessageDialog(
				window.getShell(),
				"Likes to be left alone?",
				null,
				"Press yes if the jobs should be run one at a time, and no otherwise",
				MessageDialog.QUESTION,
				new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
				1 // no is the default
		);
		return dialog.open() == 0;
	}
	private boolean askForFailure() {
		MessageDialog dialog =
			new MessageDialog(
				window.getShell(),
				"Born to fail?",
				null,
				"Should the jobs return an error status?",
				MessageDialog.QUESTION,
				new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL },
				1 // no is the default
		);
		return dialog.open() == 0;
	}
	private int askForJobCount() {
		InputDialog dialog = new InputDialog(window.getShell(), "How much work?", "Enter the number of jobs to run", "100", new IInputValidator() {
			public String isValid(String newText) {
				try {
					Integer.parseInt(newText);
				} catch (NumberFormatException e) {
					return "Not a number";
				}
				return null;
			}
		});
		if (dialog.open() == Dialog.CANCEL)
			throw new OperationCanceledException();
		return Integer.parseInt(dialog.getValue());
	}
	public void dispose() {
	}
	public void init(IWorkbenchWindow window) {
		this.window = window;
	}

	public void run(IAction action) {
		try {
			int jobCount = askForJobCount();
			long duration = askForDuration();
			boolean exclusive = askForExclusive();
			boolean failure = askForFailure();
			for (int i = 0; i < jobCount; i ++) {
				new TestJob(duration, exclusive, failure,false).schedule(DELAY);
			}
//			ProgressMonitorDialog dialog = new ProgressMonitorDialog(window.getShell());
//			dialog.run(true, true, new IRunnableWithProgress() {
//				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
//					try {
//						Platform.getJobManager().join(CreateJobsAction.this, monitor);
//					} catch (OperationCanceledException e) {
//					}
//				}
//			});
		} catch (OperationCanceledException e) {
//		} catch (InvocationTargetException e) {
//			e.printStackTrace();
//		} catch (InterruptedException e) {
//			e.printStackTrace();
		}
	}
	public void selectionChanged(IAction action, ISelection selection) {
	}
}