blob: 2ba27b63048de00b4fc116489a504a3b339f8608 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jface.text.source;
import java.util.Iterator;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
/**
* This interface defines the model for managing annotations attached to a document.
* The model maintains a set of annotations for a given document and notifies registered annotation
* model listeners about annotation model changes. It also provides methods
* for querying the current position of an annotation managed
* by this model.
* <p>
* In order to provide backward compatibility for clients of <code>IAnnotationModel</code>, extension
* interfaces are used to provide a means of evolution. The following extension interfaces
* exist:
* <ul>
* <li> {@link org.eclipse.jface.text.source.IAnnotationModelExtension} since version 3.0 introducing the concept
* of model piggybacking annotation models, modification time stamps, and enhanced manipulation methods.
* </li>
* <li> {@link org.eclipse.jface.text.source.IAnnotationModelExtension2} since version 3.4 allows to retrieve
* annotations within a given region.
* </li>
* </ul>
* </p>
*
* Clients may implement this interface or use the default implementation provided
* by <code>AnnotationModel</code>.
*
* @see org.eclipse.jface.text.source.IAnnotationModelExtension
* @see org.eclipse.jface.text.source.IAnnotationModelExtension2
* @see org.eclipse.jface.text.source.Annotation
* @see org.eclipse.jface.text.source.IAnnotationModelListener
*/
public interface IAnnotationModel {
/**
* Registers the annotation model listener with this annotation model.
* After registration listener is informed about each change of this model.
* If the listener is already registered nothing happens.
*
* @param listener the listener to be registered, may not be <code>null</code>
*/
void addAnnotationModelListener(IAnnotationModelListener listener);
/**
* Removes the listener from the model's list of annotation model listeners.
* If the listener is not registered with the model nothing happens.
*
* @param listener the listener to be removed, may not be <code>null</code>
*/
void removeAnnotationModelListener(IAnnotationModelListener listener);
/**
* Connects the annotation model to a document. The annotations managed
* by this model must subsequently update according to the changes applied
* to the document. Once an annotation model is connected to a document,
* all further <code>connect</code> calls must mention the document the
* model is already connected to. An annotation model primarily uses
* <code>connect</code> and <code>disconnect</code> for reference counting
* the document. Reference counting frees the clients from keeping tracker
* whether a model has already been connected to a document.
*
* @param document the document the model gets connected to,
* may not be <code>null</code>
*
* @see #disconnect(IDocument)
*/
void connect(IDocument document);
/**
* Disconnects this model from a document. After that, document changes no longer matter.
* An annotation model may only be disconnected from a document to which it has been
* connected before. If the model reference counts the connections to a document,
* the connection to the document may only be terminated if the reference count does
* down to 0.
*
* @param document the document the model gets disconnected from,
* may not be <code>null</code>
*
* @see #connect(IDocument) for further specification details
*/
void disconnect(IDocument document);
/**
* Adds a annotation to this annotation model. The annotation is associated with
* with the given position which describes the range covered by the annotation.
* All registered annotation model listeners are informed about the change.
* If the model is connected to a document, the position is automatically
* updated on document changes. If the annotation is already managed by
* this annotation model or is not a valid position in the connected document
* nothing happens.
* <p>
* <strong>Performance hint:</strong> Use {@link IAnnotationModelExtension#replaceAnnotations(Annotation[], java.util.Map)}
* if several annotations are added and/or removed.
* </p>
*
* @param annotation the annotation to add, may not be <code>null</code>
* @param position the position describing the range covered by this annotation,
* may not be <code>null</code>
*/
void addAnnotation(Annotation annotation, Position position);
/**
* Removes the given annotation from the model. I.e. the annotation is no
* longer managed by this model. The position associated with the annotation
* is no longer updated on document changes. If the annotation is not
* managed by this model, nothing happens.
* <p>
* <strong>Performance hint:</strong> Use {@link IAnnotationModelExtension#replaceAnnotations(Annotation[], java.util.Map)}
* if several annotations are removed and/or added.
* </p>
*
* @param annotation the annotation to be removed from this model,
* may not be <code>null</code>
*/
void removeAnnotation(Annotation annotation);
/**
* Returns all annotations managed by this model.
*
* @return all annotations managed by this model
*/
Iterator<Annotation> getAnnotationIterator();
/**
* Returns the position associated with the given annotation.
*
* @param annotation the annotation whose position should be returned
* @return the position of the given annotation or <code>null</code> if no
* associated annotation exists
*/
Position getPosition(Annotation annotation);
}