/*******************************************************************************
 * 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.jaxp.debug.ui.internal.views;

import java.io.IOException;
import java.io.Reader;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugEvent;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IDebugEventSetListener;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.SourceViewerConfiguration;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.ui.StructuredTextViewerConfiguration;
import org.eclipse.wst.sse.ui.internal.StructuredTextViewer;
import org.eclipse.wst.sse.ui.internal.provisional.style.LineStyleProvider;
import org.eclipse.wst.xsl.internal.debug.ui.XSLDebugUIPlugin;
import org.eclipse.wst.xsl.jaxp.launching.model.JAXPDebugTarget;
import org.eclipse.wst.xsl.ui.internal.StructuredTextViewerConfigurationXSL;

/**
 * TODO handle multiple concurrent debugging processes (and bring the current results to the top depending on which selected in Debug view)
 * 
 * @author Doug Satchwell
 */
public class ResultView extends ViewPart implements IDebugEventSetListener
{
	private SourceViewer sv;

	@Override
	public void dispose()
	{
		DebugPlugin.getDefault().removeDebugEventListener(this);
		super.dispose();
	}

	@Override
	public void createPartControl(Composite parent)
	{
		this.sv = createViewer(parent);
		
		// handle any launches already added
		IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
		for (IDebugTarget debugTarget : targets)
		{
			if (debugTarget instanceof JAXPDebugTarget)
			{
				handleDebugTarget((JAXPDebugTarget)debugTarget);
			}			
		}
		// listen to further launches
		DebugPlugin.getDefault().addDebugEventListener(this);
	}

	private SourceViewer createViewer(Composite parent)
	{
		SourceViewerConfiguration sourceViewerConfiguration = new StructuredTextViewerConfiguration() {
			StructuredTextViewerConfiguration baseConfiguration = new StructuredTextViewerConfigurationXSL();

			public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
				return baseConfiguration.getConfiguredContentTypes(sourceViewer);
			}

			public LineStyleProvider[] getLineStyleProviders(ISourceViewer sourceViewer, String partitionType) {
				return baseConfiguration.getLineStyleProviders(sourceViewer, partitionType);
			}
		};
		SourceViewer viewer = new StructuredTextViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
		((StructuredTextViewer) viewer).getTextWidget().setFont(JFaceResources.getFont("org.eclipse.wst.sse.ui.textfont")); //$NON-NLS-1$
		viewer.configure(sourceViewerConfiguration);
		viewer.setEditable(false);
		return viewer;
	}

	@Override
	public void setFocus()
	{}

	public void handleDebugEvents(DebugEvent[] events)
	{
		for (DebugEvent debugEvent : events)
		{
			if (debugEvent.getKind() == DebugEvent.CREATE && debugEvent.getSource() instanceof JAXPDebugTarget)
			{
				handleDebugTarget((JAXPDebugTarget)debugEvent.getSource());
			}
		}
	}
	
	private void handleDebugTarget(JAXPDebugTarget xdt)
	{
		// first, clear the viewer
		sv.setDocument(null);
		
		final Reader reader = xdt.getGenerateReader();
		IWorkbenchSiteProgressService service = (IWorkbenchSiteProgressService)getSite().getService(IWorkbenchSiteProgressService.class);
		service.schedule(new Job("Result view job"){
			@Override
			protected IStatus run(IProgressMonitor monitor) {
				IStatus status = Status.OK_STATUS;
				try
				{
					char[] c = new char[8192]; // this is the default BufferedWriter size, so we will usually get chunks of this size
					int size;
					while((size = reader.read(c)) != -1)
					{
						writeString(new String(c,0,size));
					}
				}
				catch (IOException e)
				{
					// ignore
				}
				finally
				{
					monitor.done();
				}
				return status;
			}
			
			private void writeString(final String s)
			{
				getSite().getShell().getDisplay().syncExec(new Runnable(){

					public void run()
					{
						// if this is the first lot of data, determine the correct content type and set the appropriate document
						if (sv.getDocument()  == null)
						{
							IDocument document;
							if (s.startsWith("<!DOCTYPE html"))
							{
								String contentType = "org.eclipse.wst.html.core.htmlsource";
								IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(contentType);
								document = scratchModel.getStructuredDocument();
							}
							else if (s.startsWith("<?xml"))
							{
								String contentType = "org.eclipse.core.runtime.xml";
								IStructuredModel scratchModel = StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(contentType);
								document = scratchModel.getStructuredDocument();
							}
							else
							{
								// TODO how to create a plain text Document??
								document = null;
							}
							sv.setDocument(document);
						}
						try
						{
							sv.getDocument().replace(sv.getDocument().getLength(), 0, s);
						}
						catch (BadLocationException e)
						{
							XSLDebugUIPlugin.log(e);
						}
						sv.revealRange(sv.getDocument().getLength(),0);
						PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().activate(ResultView.this);
					}
				});
			}
		});
	}

}
