blob: 58bc54c6c58c17d9cb77dd47835d3696cca23e32 [file] [log] [blame]
/*******************************************************************************
* 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);
}
}
}