/*******************************************************************************
 * Copyright (c) 2002, 2005 GEBIT Gesellschaft fuer EDV-Beratung
 * und Informatik-Technologien mbH, 
 * Berlin, Duesseldorf, Frankfurt (Germany) and others.
 * 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:
 *     GEBIT Gesellschaft fuer EDV-Beratung und Informatik-Technologien mbH - initial API and implementation
 * 	   IBM Corporation - bug fixes
 *******************************************************************************/

package org.eclipse.ant.internal.ui.editor.text;


import org.eclipse.ant.internal.ui.model.AntModel;
import org.eclipse.ant.internal.ui.model.IProblemRequestor;
import org.eclipse.ant.internal.ui.model.LocationProvider;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentExtension3;
import org.eclipse.jface.text.ISynchronizable;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.editors.text.TextFileDocumentProvider;
import org.eclipse.ui.texteditor.IDocumentProvider;

public class AntEditorDocumentProvider extends TextFileDocumentProvider {

	private final AntDocumentSetupParticipant fAntDocumentSetupParticipant;

    /**
	 * Remembers a Ant document model for each element.
	 */
	protected class AntFileInfo extends FileInfo {
		
		public AntModel fAntModel;
		
		public AntFileInfo() {
		}
	}
	
	public AntEditorDocumentProvider() {
		IDocumentProvider provider= new TextFileDocumentProvider(new AntStorageDocumentProvider());
		setParentDocumentProvider(provider);
        fAntDocumentSetupParticipant = new AntDocumentSetupParticipant();
	}

    public AntModel getAntModel(Object element) {
	    FileInfo info= getFileInfo(element);
	    if (info instanceof AntFileInfo) {
		    AntFileInfo xmlInfo= (AntFileInfo) info;
		    return xmlInfo.fAntModel;
	    }
	    return null;
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.editors.text.TextFileDocumentProvider#createAnnotationModel(org.eclipse.core.resources.IFile)
     */
    protected IAnnotationModel createAnnotationModel(IFile file) {
		   return new AntAnnotationModel(file);
    }

    protected AntModel createAntModel(Object element, IDocument document, IAnnotationModel annotationModel) {
	    IProblemRequestor requestor= annotationModel instanceof IProblemRequestor ? (IProblemRequestor) annotationModel : null;
	    return new AntModel(document, requestor, new LocationProvider(element instanceof IEditorInput ? (IEditorInput) element : null));
    }
    
    /*
	 * @see org.eclipse.ui.editors.text.TextFileDocumentProvider#createFileInfo(java.lang.Object)
	 */
	protected FileInfo createFileInfo(Object element) throws CoreException {
		FileInfo info= super.createFileInfo(element);
		if (!(info instanceof AntFileInfo)) {
			return null;
		}
	
		//TODO: This is a required workaround for the disconnect between workbench file associations
		//and content types based document setup and creation
		//This ensures that a workbench file assciation for the AntEditor will have a document
		//that is setup with the correct document setup participant since it was "missed" by the 
		//document setup extensions (bug 72598).
		IDocument document= info.fTextFileBuffer.getDocument();
		if (document instanceof IDocumentExtension3) {
			IDocumentExtension3 extension= (IDocumentExtension3) document;
			if (extension.getDocumentPartitioner(AntDocumentSetupParticipant.ANT_PARTITIONING) == null)
			    fAntDocumentSetupParticipant.setup(document);
		}
		
		//Check if the annotation model has been set by the annotation model factory extension for Ant UI
		//and is an annotation model that was specified by the extension (all are IProblemRequestors).
		//If we do not have an annotation model or not a correct annotation model, defer to the annotation model
		//created from this document provider. The document provider is only queried for an annotation model for workspace files.
		//Therefore if the annotation model is still null we are dealing with an external file that is associated with
		//the Ant editor from a user preference setting.
		//In all cases the determined annotation model is set for the file info to be used in the editor. 
		AntFileInfo xmlInfo= (AntFileInfo) info;
		IAnnotationModel annotationModel= xmlInfo.fTextFileBuffer.getAnnotationModel();
		if (annotationModel instanceof IProblemRequestor) {
		    xmlInfo.fModel= annotationModel;
		} else {
		    annotationModel= xmlInfo.fModel;
		}
		
		if (annotationModel == null) {
            annotationModel= new AntExternalAnnotationModel();
            xmlInfo.fModel= annotationModel;       
        }
		 
		AntModel antModel= createAntModel(element, document, annotationModel);
		antModel.install();
		xmlInfo.fAntModel= antModel;
		setUpSynchronization(xmlInfo);
		
		return xmlInfo;
	}
	
    /* (non-Javadoc)
     * @see org.eclipse.ui.editors.text.TextFileDocumentProvider#disposeFileInfo(java.lang.Object, org.eclipse.ui.editors.text.TextFileDocumentProvider.FileInfo)
     */
    protected void disposeFileInfo(Object element, FileInfo info) {
	    if (info instanceof AntFileInfo) {
		    AntFileInfo xmlInfo= (AntFileInfo) info;
		    if (xmlInfo.fAntModel != null) {
			    IDocument doc=  xmlInfo.fTextFileBuffer.getDocument();
			    Object lock= null;
			    if (doc instanceof ISynchronizable) {
			    	lock= ((ISynchronizable) doc).getLockObject();
			    } else {
			    	lock= xmlInfo.fAntModel;
			    }
			    synchronized (lock) {	    	
		    		xmlInfo.fAntModel.dispose();
			    	xmlInfo.fAntModel= null;
		    	}
		    }
	    }
	    super.disposeFileInfo(element, info);	
    }
    
    /*
	 * @see org.eclipse.ui.editors.text.TextFileDocumentProvider#createEmptyFileInfo()
	 */
	protected FileInfo createEmptyFileInfo() {
		return new AntFileInfo();
	}
	
	 private void setUpSynchronization(AntFileInfo antInfo) {
        IDocument document= antInfo.fTextFileBuffer.getDocument();
        IAnnotationModel model= antInfo.fModel;
        
        if (document instanceof ISynchronizable && model instanceof ISynchronizable) {
            Object lock= ((ISynchronizable) document).getLockObject();
            ((ISynchronizable) model).setLockObject(lock);
        }
    }
}