/*******************************************************************************
 * Copyright (c) 2008 Chase Technology Ltd - http://www.chasetechnology.co.uk
 * 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:
 *     Doug Satchwell (Chase Technology Ltd) - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.xsl.internal.debug.ui;

import java.io.File;

import org.eclipse.core.commands.common.CommandException;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchesListener2;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.ide.IDE;
import org.eclipse.wst.xsl.launching.config.BaseLaunchHelper;

/**
 * A listener to XSL launches. When an XSL launch is terminated, this performs the UI parts of the 
 * XSL launching - such as open the editor on the output file, and format it.
 * 
 * @author Doug Satchwell
 */
public class XSLDebugUILaunchListener implements ILaunchesListener2
{
	/**
	 * Starts the launch listening
	 */
	public void start()
	{
		DebugPlugin.getDefault().getLaunchManager().addLaunchListener(this);
	}
	
	/**
	 * Stops the launch listening
	 */
	public void stop()
	{
		DebugPlugin.getDefault().getLaunchManager().removeLaunchListener(this);
	}
	
	public void launchesTerminated(ILaunch[] launches)
	{
		for (ILaunch launch : launches)
		{
			ILaunchConfigurationType configType = null;
			try
			{
				configType = launch.getLaunchConfiguration().getType();
			}
			catch (CoreException e)
			{
				// do nothing
			}
			if (configType != null && "org.eclipse.wst.xsl.launching.launchConfigurationType".equals(configType.getIdentifier()))
			{
				try
				{
					BaseLaunchHelper launchHelper = new BaseLaunchHelper(launch.getLaunchConfiguration());
					File file = launchHelper.getTarget();
					IFile ifile = ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(new Path(file.getAbsolutePath()));
					if (ifile != null)
					{// refresh this workspace file..
						try
						{
							ifile.refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
						}
						catch (CoreException e)
						{
							XSLDebugUIPlugin.log(e);
						}
					}
					openFileIfRequired(launchHelper);
				}
				catch (CoreException e)
				{
					XSLDebugUIPlugin.log(e);
				}
			}
		}
	}

	public void launchesAdded(ILaunch[] launches)
	{
		// do nothing
	}

	public void launchesChanged(ILaunch[] launches)
	{
		// do nothing
	}

	public void launchesRemoved(ILaunch[] launches)
	{
		// do nothing
	}
	
	private void openFileIfRequired(final BaseLaunchHelper launchHelper)
	{
		if (launchHelper.getOpenFileOnCompletion())
		{
			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
			{
				public void run()
				{
					try
					{
						// Open editor on new file.
						IWorkbenchWindow dw = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
						File file = launchHelper.getTarget();
						Path path = new Path(file.getAbsolutePath());
						IFileStore filestore = EFS.getLocalFileSystem().getStore(path);
						IDE.openEditorOnFileStore(dw.getActivePage(), filestore);
						
						if (launchHelper.getFormatFileOnCompletion())
						{
							// format the editor contents
							IHandlerService p = (IHandlerService)PlatformUI.getWorkbench().getService(IHandlerService.class);
							p.executeCommand("org.eclipse.wst.sse.ui.format.document", null);
						}
					}
					catch (PartInitException e)
					{
						XSLDebugUIPlugin.log(e);
					}
					catch (CommandException e)
					{
						XSLDebugUIPlugin.log(e);
					}
				}
			});
		}
	}
}
