package org.eclipse.compare.contentmergeviewer;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.core.runtime.IProgressMonitor;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.operation.ModalContext;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;


class DelayedProgressMonitor implements IProgressMonitor {
	
	ProgressMonitorDialog fProgressDialog;
	IProgressMonitor fRealProgressMonitor;
	String fTaskName;
	String fSubTaskName;
	int fTotalWork;
	int fWorked;
	boolean fCancelable;
	Shell fShell;
	int fTime;
	
	
	DelayedProgressMonitor(Shell shell) {
		fShell= shell;
	}

	/*
	 * @see IProgressMonitor#beginTask(String, int)
	 */
	public void beginTask(String name, int totalWork) {
		fTaskName= name;
		fTotalWork= totalWork;
		fTime= 0;
	}

	/*
	 * @see IProgressMonitor#done()
	 */
	public void done() {
		if (fRealProgressMonitor != null)
			fRealProgressMonitor.done();
	}

	/*
	 * @see IProgressMonitor#internalWorked(double)
	 */
	public void internalWorked(double work) {
		if (fRealProgressMonitor != null) {
			fRealProgressMonitor.internalWorked(work);
		}
	}
	
	private void checkTimeout() {
		if (fRealProgressMonitor == null) {
			
			//if (fTime++ < 100)
			//	return;
			
			fProgressDialog= new ProgressMonitorDialog(fShell);
			fProgressDialog.setCancelable(true);
			fProgressDialog.open();
			fRealProgressMonitor= fProgressDialog.getProgressMonitor();
			fRealProgressMonitor.beginTask(fTaskName, fTotalWork);
			if (fSubTaskName != null)
				fRealProgressMonitor.subTask(fSubTaskName);
			fRealProgressMonitor.worked(fWorked);
		}
	}

	/*
	 * @see IProgressMonitor#isCanceled()
	 */
	public boolean isCanceled() {
		checkTimeout();
		if (fRealProgressMonitor != null)
			return fRealProgressMonitor.isCanceled();
		return false;
	}

	/*
	 * @see IProgressMonitor#setCanceled(boolean)
	 */
	public void setCanceled(boolean value) {
		if (fRealProgressMonitor != null)
			fRealProgressMonitor.setCanceled(value);
		else
			fCancelable= value;
	}

	/*
	 * @see IProgressMonitor#setTaskName(String)
	 */
	public void setTaskName(String name) {
		if (fRealProgressMonitor != null)
			fRealProgressMonitor.setTaskName(name);
		else
			fTaskName= name;
	}

	/*
	 * @see IProgressMonitor#subTask(String)
	 */
	public void subTask(String name) {
		if (fRealProgressMonitor != null)
			fRealProgressMonitor.subTask(name);
		else
			fSubTaskName= name;
	}

	/*
	 * @see IProgressMonitor#worked(int)
	 */
	public void worked(int work) {
		if (fRealProgressMonitor != null)
			fRealProgressMonitor.internalWorked(work);
		else {
			fWorked+= work;
			checkTimeout();
		}
	}
	
	public static void run(Shell shell, boolean fork, boolean cancelable, IRunnableWithProgress runnable)
						throws InvocationTargetException, InterruptedException {
		
		DelayedProgressMonitor pm= new DelayedProgressMonitor(shell);
		pm.checkTimeout();
		try {
			ModalContext.run(runnable, fork, pm, shell.getDisplay());
		} finally {
			if (pm.fProgressDialog != null)
				pm.fProgressDialog.close();
		}
	}
}

