blob: 3e2645e469ad3030dd14ce2c736a238769bd2a34 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002, 2007 GEBIT Gesellschaft fuer EDV-Beratung
* und Informatik-Technologien mbH,
* Berlin, Duesseldorf, Frankfurt (Germany) and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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 static 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;
}
@Override
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));
}
@Override
protected FileInfo createFileInfo(Object element) throws CoreException {
FileInfo info = super.createFileInfo(element);
if (!(info instanceof AntFileInfo)) {
return null;
}
// 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 association 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;
return xmlInfo;
}
@Override
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;
}
if (lock == null) {
xmlInfo.fAntModel.dispose();
xmlInfo.fAntModel = null;
} else {
synchronized (lock) {
xmlInfo.fAntModel.dispose();
xmlInfo.fAntModel = null;
}
}
}
}
super.disposeFileInfo(element, info);
}
@Override
protected FileInfo createEmptyFileInfo() {
return new AntFileInfo();
}
}