blob: 07b6e76dc181fb76d4b6c9ca444949758ccae15c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 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.revisions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.internal.text.revisions.Hunk;
import org.eclipse.jface.text.IInformationControlCreator;
import org.eclipse.jface.text.ITextHoverExtension;
import org.eclipse.jface.text.information.IInformationProviderExtension2;
/**
* Encapsulates revision information for one line-based document.
* <p>
* Clients may instantiate.
* </p>
*
* @since 3.2
* @see Revision
*/
public final class RevisionInformation implements ITextHoverExtension, IInformationProviderExtension2 {
/** The revisions, element type: {@link Revision}. */
private final List fRevisions= new ArrayList();
/** A unmodifiable view of <code>fRevisions</code>. */
private final List fRORevisions= Collections.unmodifiableList(fRevisions);
/**
* The flattened list of {@link RevisionRange}s, unmodifiable. <code>null</code> if the list
* must be re-computed.
*
* @since 3.3
*/
private List fRanges= null;
/**
* The hover control creator. Can be <code>null</code>.
*
* @since 3.3
*/
private IInformationControlCreator fHoverControlCreator;
/**
* The information presenter control creator. Can be <code>null</code>.
*
* @since 3.3
*/
private IInformationControlCreator fInformationPresenterControlCreator;
/**
* Creates a new revision information model.
*/
public RevisionInformation() {
}
/**
* Adds a revision.
*
* @param revision a revision
*/
public void addRevision(Revision revision) {
Assert.isLegal(revision != null);
fRevisions.add(revision);
}
/**
* Returns the contained revisions.
*
* @return an unmodifiable view of the contained revisions (element type: {@link Revision})
*/
public List getRevisions() {
return fRORevisions;
}
/**
* Returns the line ranges of this revision information. The returned information is only valid
* at the moment it is returned, and may change as the annotated document is modified. See
* {@link IRevisionListener} for a way to be informed when the revision information changes. The
* returned list is sorted by document offset.
*
* @return an unmodifiable view of the line ranges (element type: {@link RevisionRange})
* @see IRevisionListener
* @since 3.3
*/
public List getRanges() {
if (fRanges == null) {
List ranges= new ArrayList(fRevisions.size() * 2); // wild size guess
for (Iterator it= fRevisions.iterator(); it.hasNext();) {
Revision revision= (Revision) it.next();
ranges.addAll(revision.getRegions());
}
// sort by start line
Collections.sort(ranges, new Comparator() {
public int compare(Object o1, Object o2) {
RevisionRange r1= (RevisionRange) o1;
RevisionRange r2= (RevisionRange) o2;
return r1.getStartLine() - r2.getStartLine();
}
});
fRanges= Collections.unmodifiableList(ranges);
}
return fRanges;
}
/**
* Adjusts the revision information to the given diff information. Any previous diff information is discarded. <strong>Note</strong>: This is an internal framework method and must not be called by clients.
*
* @param hunks the diff hunks to adjust the revision information to
* @since 3.3
* @noreference This method is not intended to be referenced by clients.
*/
public void applyDiff(Hunk[] hunks) {
fRanges= null; // mark for recomputation
for (Iterator revisions= getRevisions().iterator(); revisions.hasNext();)
((Revision) revisions.next()).applyDiff(hunks);
}
/*
* @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator()
* @since 3.3
*/
public IInformationControlCreator getHoverControlCreator() {
return fHoverControlCreator;
}
/**
* {@inheritDoc}
* @return the information control creator or <code>null</code>
* @since 3.3
*/
public IInformationControlCreator getInformationPresenterControlCreator() {
return fInformationPresenterControlCreator;
}
/**
* Sets the hover control creator.
* <p>
* <strong>Note:</strong> The created information control must be able to display the object
* returned by the concrete implementation of {@link Revision#getHoverInfo()}.
* </p>
*
* @param creator the control creator
* @since 3.3
*/
public void setHoverControlCreator(IInformationControlCreator creator) {
fHoverControlCreator= creator;
}
/**
* Sets the information presenter control creator.
*
* @param creator the control creator
* @since 3.3
*/
public void setInformationPresenterControlCreator(IInformationControlCreator creator) {
fInformationPresenterControlCreator= creator;
}
}