| /******************************************************************************* |
| * 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.revisions; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Date; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.swt.graphics.RGB; |
| |
| import org.eclipse.jface.internal.text.revisions.ChangeRegion; |
| import org.eclipse.jface.internal.text.revisions.Hunk; |
| import org.eclipse.jface.internal.text.revisions.Range; |
| |
| import org.eclipse.jface.text.IInformationControlCreator; |
| import org.eclipse.jface.text.source.ILineRange; |
| |
| /** |
| * Describes a revision of a document. A revision consists of one ore more {@link ILineRange}s. |
| * <p> |
| * Clients may subclass. |
| * </p> |
| * |
| * @since 3.2 |
| */ |
| public abstract class Revision { |
| /** The original list of change regions. */ |
| private final List<ChangeRegion> fChangeRegions= new ArrayList<>(); |
| /** |
| * The cached list of adjusted ranges. <code>null</code> |
| * if the list must be re-computed. Unmodifiable. |
| * |
| * @since 3.3 |
| */ |
| private List<RevisionRange> fRanges= null; |
| |
| /** |
| * Creates a new revision. |
| */ |
| protected Revision() { |
| } |
| |
| /** |
| * Adds a line range to this revision. The range must be non-empty and have a legal start line |
| * (not -1). |
| * |
| * @param range a line range that was changed with this revision |
| * @throws IndexOutOfBoundsException if the line range is empty or has a negative start line |
| */ |
| public final void addRange(ILineRange range) throws IndexOutOfBoundsException { |
| fChangeRegions.add(new ChangeRegion(this, range)); |
| } |
| |
| /** |
| * Returns the contained {@link RevisionRange}s adapted to the current diff state. The returned |
| * information is only valid at the moment it is returned, and may change as the annotated |
| * document is modified. |
| * |
| * @return an unmodifiable view of the contained ranges |
| */ |
| public final List<RevisionRange> getRegions() { |
| if (fRanges == null) { |
| List<RevisionRange> ranges= new ArrayList<>(fChangeRegions.size()); |
| for (Iterator<ChangeRegion> it= fChangeRegions.iterator(); it.hasNext();) { |
| ChangeRegion region= it.next(); |
| for (Iterator<Range> inner= region.getAdjustedRanges().iterator(); inner.hasNext();) { |
| ILineRange range= inner.next(); |
| ranges.add(new RevisionRange(this, range)); |
| } |
| } |
| fRanges= Collections.unmodifiableList(ranges); |
| } |
| return fRanges; |
| } |
| |
| /** |
| * Adjusts the revision information to the given diff information. Any previous diff information |
| * is discarded. |
| * |
| * @param hunks the diff hunks to adjust the revision information to |
| * @since 3.3 |
| */ |
| final void applyDiff(Hunk[] hunks) { |
| fRanges= null; // mark for recomputation |
| for (Iterator<ChangeRegion> regions= fChangeRegions.iterator(); regions.hasNext();) { |
| ChangeRegion region= regions.next(); |
| region.clearDiff(); |
| for (int i= 0; i < hunks.length; i++) { |
| Hunk hunk= hunks[i]; |
| region.adjustTo(hunk); |
| } |
| } |
| } |
| |
| /** |
| * Returns the hover information that will be shown when the user hovers over the a change |
| * region of this revision. |
| * <p> |
| * <strong>Note:</strong> The hover information control which is used to display the information |
| * must be able process the given object. If the default information control creator is used |
| * the supported format is simple text, full HTML or an HTML fragment. |
| * </p> |
| * |
| * @return the hover information for this revision or <code>null</code> for no hover |
| * @see RevisionInformation#setHoverControlCreator(IInformationControlCreator) |
| */ |
| public abstract Object getHoverInfo(); |
| |
| /** |
| * Returns the author color for this revision. This color can be used to visually distinguish |
| * one revision from another, for example as background color. |
| * <p> |
| * Revisions from the same author must return the same color and revisions from different authors |
| * must return distinct colors.</p> |
| * |
| * @return the RGB color for this revision's author |
| */ |
| public abstract RGB getColor(); |
| |
| /** |
| * Returns the unique (within the document) id of this revision. This may be the version string |
| * or a different identifier. |
| * |
| * @return the id of this revision |
| */ |
| public abstract String getId(); |
| |
| /** |
| * Returns the modification date of this revision. |
| * |
| * @return the modification date of this revision |
| */ |
| public abstract Date getDate(); |
| |
| @Override |
| public String toString() { |
| return "Revision " + getId(); //$NON-NLS-1$ |
| } |
| |
| /** |
| * Returns the display string for the author of this revision. |
| * <p> |
| * Subclasses should replace - the default implementation returns the empty string. |
| * </p> |
| * |
| * @return the author name |
| * @since 3.3 |
| */ |
| public String getAuthor() { |
| return ""; //$NON-NLS-1$ |
| } |
| } |