package com.intellij.vcs.log; import org.jetbrains.annotations.NotNull; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.Collection; import java.util.Comparator; import java.util.List; /** * Sorts {@link VcsRef references} of branches and tags according to their type, "expected importance" and other means. */ public interface VcsLogRefManager { /** * Returns the comparator which compares two given references, which represent heads (leafs) of the log graph, * by their expected position in the log graph. * <p/> * The comparison result is used in graph layout to choose which branch should be laid at the left, and which - at the right. * This layout order should be kept between log refreshes, when possible. * Branches which are laid at the left are considered more important than which are laid at the right. * <p/> * <ul> * <li><b>Negative</b> value is returned if the first branch should be laid out at the left from the second (i.e. "is more important"). * <li><b>Positive</b> value is returned if the first branch should be laid out at the right from the second (i.e. "is less important"). * <li>Zero is returned for equal references. * </ul> * <p/> * It is guaranteed that the supplied collection is not empty. * <p/> * The given collection may contain references from different roots. * * @see #getLabelsOrderComparator() */ @NotNull Comparator<VcsRef> getBranchLayoutComparator(); /** * Return the comparator which compares two given references, to identify the order of branch labels in the log table and description. * References are compared by their position, more important references appear at the left from the less important. * <p/> * <ul> * <li><b>Negative</b> value is returned if the first reference should appear at the left from the second (i.e. "is more important"). * <li><b>Positive</b> value is returned if the first reference should appear at the right from the second (i.e. "is less important"). * <li>Zero is returned for equal references. * </ul> * <p/> * Note that this comparator not necessarily should be consistent with {@link #getBranchLayoutComparator()}. * <p/> * * @see #getBranchLayoutComparator() */ @NotNull Comparator<VcsRef> getLabelsOrderComparator(); /** * <p>Groups VCS references to show them in branch filter.</p> * <p>Groups containing only one element will be displayed as a single ref. Others will provide a popup menu.</p> * <p>Groups must be pre-sorted in the order which they are to be painted on the panel.</p> */ @NotNull List<RefGroup> groupForBranchFilter(@NotNull Collection<VcsRef> refs); /** * Groups VCS references to show them in graph table. * All references given to this method are from the same commit. */ @NotNull List<RefGroup> groupForTable(@NotNull Collection<VcsRef> refs, boolean compact, boolean showTagNames); /** * Writes given reference type to the output. * * @param out output to write type into * @param type type to serialize */ void serialize(@NotNull DataOutput out, @NotNull VcsRefType type) throws IOException; /** * Reads reference type from given input. * * @param in input to read type from * @return reference type read from the input */ @NotNull VcsRefType deserialize(@NotNull DataInput in) throws IOException; }