/*******************************************************************************
 * Copyright (c) 2007, 2009 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
 *     David Carver (STAR) - externalize strings
 *******************************************************************************/
package org.eclipse.wst.xsl.ui.internal.validation;

import java.util.List;

import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.quickassist.IQuickAssistProcessor;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.wst.validation.ValidationFramework;
import org.eclipse.wst.validation.Validator;
import org.eclipse.wst.validation.internal.core.ValidationException;
import org.eclipse.wst.validation.internal.provisional.core.IMessage;
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.eclipse.wst.validation.internal.provisional.core.IValidationContext;
import org.eclipse.wst.validation.internal.provisional.core.IValidator;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.ui.internal.validation.DelegatingSourceValidator;
import org.eclipse.wst.xsl.ui.internal.editor.XSLEditor;
import org.eclipse.wst.xsl.ui.internal.quickassist.ValidationQuickAssist;

/**
 * This performs the as-you-type validation for xsl files
 * 
 */
public class DelegatingSourceValidatorForXSL extends DelegatingSourceValidator
{
	private static final String XSL_UI_XSL_EDITOR_ID = "org.eclipse.wst.xsl.ui.XSLEditor"; //$NON-NLS-1$
	private final static String Id = "org.eclipse.wst.xsl.core.xsl"; //$NON-NLS-1$
	private final String QUICKASSISTPROCESSOR = IQuickAssistProcessor.class.getName();
	
	private Validator _validator;

	/**
	 * Constructor
	 */
	public DelegatingSourceValidatorForXSL()
	{
		super();
	}
	
	@Override
	protected void updateValidationMessages(List messages, IDOMDocument document, IReporter reporter)
	{
		super.updateValidationMessages(messages, document, reporter);
		// insert the quick assist information as an attribute for the messages
//		for (Object msg : reporter.getMessages())
//		{
//			IMessage message = (IMessage)msg;
//
//			ValidationQuickAssist processor = new ValidationQuickAssist();
//			
//			String id = (String)message.getAttribute("validationErrorId");
//			processor.setProblemId(id);
//			
//			message.setAttribute(QUICKASSISTPROCESSOR, processor);
//		}		
	}

	@Override
	public void validate(IValidationContext helper, IReporter reporter) throws ValidationException
	{
		super.validate(helper, reporter);
		
		// validating will refresh the model, so now calculate the overrides.
		// (we only calculate overrides for source validation as we only want to do it for files open in an editor)
		// There follows a very complicated way of creating the required annotations in an editor.
		// TODO resolve this when bug 247222 is sorted
		
		String[] delta = helper.getURIs();
		if (delta.length > 0)
		{
			IFile file = getFile(delta[0]);
			// find any files with open editors...
			IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows();
			for (IWorkbenchWindow workbenchWindow : windows)
			{
				IWorkbenchPage page = workbenchWindow.getActivePage();
				if (page != null)
				{
					IEditorReference[] refs = page.findEditors(new FileEditorInput(file), XSL_UI_XSL_EDITOR_ID, IWorkbenchPage.MATCH_ID | IWorkbenchPage.MATCH_INPUT);
					// lets hope we only have one XSL editor open on the file, or else we don't know which one started this validation...
					if (refs.length == 1)
					{
						XSLEditor editor = (XSLEditor) refs[0].getEditor(false);
						if (editor != null)
						{// all this work just to get here...
							editor.getOverrideIndicatorManager().updateAnnotations();
						}
					}
				}
			}
		}
	}

	private Validator getValidator()
	{
		if (_validator == null)
			_validator = ValidationFramework.getDefault().getValidator(Id, null);
		return _validator;
	}

	@Override
	protected IValidator getDelegateValidator()
	{
		Validator v = getValidator();
		if (v == null)
			return null;
		return v.asIValidator();
	}
}
