diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java index 04b1af3c0353..69486253f2e5 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java @@ -96,10 +96,9 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme @NotNull private final AsynchConsumer myHistoryPanelRefresh; @NotNull private final Map myRevisionsOrder = ContainerUtil.newHashMap(); @NotNull private final Map myRevisionToVirtualFile = ContainerUtil.newHashMap(); - @NotNull private final Comparator myRevisionsInOrderComparator = (o1, o2) -> { + @NotNull private final Comparator myRevisionsInOrderComparator = (o1, o2) -> { // descending - return Comparing - .compare(myRevisionsOrder.get(o2.getRevision().getRevisionNumber()), myRevisionsOrder.get(o1.getRevision().getRevisionNumber())); + return Comparing.compare(myRevisionsOrder.get(o2.getRevisionNumber()), myRevisionsOrder.get(o1.getRevisionNumber())); }; @NotNull private final DetailsPanel myDetails; @NotNull private final DualView myDualView; @@ -247,7 +246,7 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme public static String getPresentableText(@NotNull VcsFileRevision revision, boolean withMessage) { // implementation reflected by com.intellij.vcs.log.ui.frame.VcsLogGraphTable.getPresentableText() StringBuilder sb = new StringBuilder(); - sb.append(FileHistoryPanelImpl.RevisionColumnInfo.toString(revision)).append(" "); + sb.append(FileHistoryPanelImpl.RevisionColumnInfo.toString(revision.getRevisionNumber())).append(" "); sb.append(revision.getAuthor()); long time = revision.getRevisionDate().getTime(); sb.append(" on ").append(DateFormatUtil.formatDate(time)).append(" at ").append(DateFormatUtil.formatTime(time)); @@ -283,22 +282,15 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme @NotNull VcsHistoryProvider provider, @Nullable ColumnInfo[] additionalColumns) { ArrayList columns = new ArrayList<>(); - columns.add(new RevisionColumnInfo(myRevisionsInOrderComparator)); - if (!provider.isDateOmittable()) columns.add(new DateColumnInfo()); - columns.add(new AuthorColumnInfo()); - ArrayList additionalColumnInfo = new ArrayList<>(); + columns.add(new TreeNodeColumnInfoWrapper<>(new RevisionColumnInfo(myRevisionsInOrderComparator))); + if (!provider.isDateOmittable()) columns.add(new TreeNodeColumnInfoWrapper<>(new DateColumnInfo())); + columns.add(new TreeNodeColumnInfoWrapper<>(new AuthorColumnInfo())); if (additionalColumns != null) { for (ColumnInfo additionalColumn : additionalColumns) { - additionalColumnInfo.add(new FileHistoryColumnWrapper(additionalColumn) { - @Override - protected DualView getDualView() { - return myDualView; - } - }); + columns.add(new TreeNodeColumnInfoWrapper(additionalColumn)); } } - columns.addAll(additionalColumnInfo); - columns.add(new MessageColumnInfo(project)); + columns.add(new TreeNodeColumnInfoWrapper<>(new MessageColumnInfo(project))); return columns.toArray(new DualViewColumnInfo[columns.size()]); } @@ -663,66 +655,104 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme updateMessage(); } - public static class RevisionColumnInfo extends VcsColumnInfo { - private final Comparator myComparator; + private class TreeNodeColumnInfoWrapper> extends FileHistoryColumnWrapper { + public TreeNodeColumnInfoWrapper(@NotNull ColumnInfo additionalColumn) { + super(additionalColumn); + } - public RevisionColumnInfo(Comparator comparator) { + @Override + protected DualView getDualView() { + return myDualView; + } + } + + public static class RevisionColumnInfo extends ColumnInfo { + @Nullable private final Comparator myComparator; + @NotNull private final ColoredTableCellRenderer myRenderer; + + public RevisionColumnInfo(@Nullable Comparator comparator) { super(VcsBundle.message("column.name.revision.version")); myComparator = comparator; + myRenderer = new ColoredTableCellRenderer() { + protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) { + setOpaque(selected); + append(RevisionColumnInfo.toString((VcsRevisionNumber)value)); + SpeedSearchUtil.applySpeedSearchHighlighting(table, this, false, selected); + } + }; } @NotNull - private static String toString(@NotNull VcsFileRevision o) { - VcsRevisionNumber number = o.getRevisionNumber(); + private static String toString(@NotNull VcsRevisionNumber number) { return number instanceof ShortVcsRevisionNumber ? ((ShortVcsRevisionNumber)number).toShortString() : number.asString(); } + @Nullable @Override - protected VcsRevisionNumber getDataOf(VcsFileRevision object) { - return object.getRevisionNumber(); + public VcsRevisionNumber valueOf(VcsFileRevision revision) { + return revision.getRevisionNumber(); } + @Nullable @Override - public Comparator getComparator() { + public Comparator getComparator() { return myComparator; } - public String valueOf(TreeNodeOnVcsRevision object) { - return toString(object.getRevision()); - } - @Override public String getPreferredStringValue() { return StringUtil.repeatSymbol('m', 10); } + + @Nullable + @Override + public TableCellRenderer getRenderer(VcsFileRevision revision) { + return myRenderer; + } } - public static class DateColumnInfo extends VcsColumnInfo { + public static class DateColumnInfo extends ColumnInfo { + @NotNull private final ColoredTableCellRenderer myRenderer; + public DateColumnInfo() { super(VcsBundle.message("column.name.revision.date")); + + myRenderer = new ColoredTableCellRenderer() { + protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) { + setOpaque(selected); + Date date = (Date)value; + if (date != null) { + append(DateFormatUtil.formatPrettyDateTime(date)); + } + SpeedSearchUtil.applySpeedSearchHighlighting(table, this, false, selected); + } + }; } - @NotNull - static String toString(VcsFileRevision object) { - Date date = object.getRevisionDate(); - if (date == null) return ""; - return DateFormatUtil.formatPrettyDateTime(date); + @Nullable + @Override + public Comparator getComparator() { + return Comparator.comparing(revision -> valueOf(revision)); } - protected String getDataOf(VcsFileRevision object) { - return toString(object); - } - - public int compare(TreeNodeOnVcsRevision o1, TreeNodeOnVcsRevision o2) { - return Comparing.compare(o1.getRevision().getRevisionDate(), o2.getRevision().getRevisionDate()); + @Nullable + @Override + public Date valueOf(VcsFileRevision revision) { + return revision.getRevisionDate(); } @Override public String getPreferredStringValue() { return DateFormatUtil.formatPrettyDateTime(Clock.getTime() + 1000); } + + @Nullable + @Override + public TableCellRenderer getRenderer(VcsFileRevision revision) { + return myRenderer; + } } private static class AuthorCellRenderer extends ColoredTableCellRenderer { @@ -751,35 +781,22 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme } } - public static class AuthorColumnInfo extends VcsColumnInfo { + public static class AuthorColumnInfo extends ColumnInfo { private final TableCellRenderer AUTHOR_RENDERER = new AuthorCellRenderer(); public AuthorColumnInfo() { super(VcsBundle.message("column.name.revision.list.author")); } - static String toString(VcsFileRevision revision) { - if (revision instanceof VcsFileRevisionEx) { - if (!Comparing.equal(revision.getAuthor(), ((VcsFileRevisionEx)revision).getCommitterName())) { - return revision.getAuthor() + "*"; - } - } - return revision.getAuthor(); - } - - protected String getDataOf(VcsFileRevision object) { - return toString(object); - } - + @Nullable @Override - public TableCellRenderer getRenderer(TreeNodeOnVcsRevision revision) { + public TableCellRenderer getRenderer(VcsFileRevision revision) { return AUTHOR_RENDERER; } @Override - public TableCellRenderer getCustomizedRenderer(TreeNodeOnVcsRevision value, TableCellRenderer renderer) { + public TableCellRenderer getCustomizedRenderer(VcsFileRevision revision, TableCellRenderer renderer) { if (renderer instanceof AuthorCellRenderer) { - VcsFileRevision revision = value.getRevision(); if (revision instanceof VcsFileRevisionEx) { VcsFileRevisionEx ex = (VcsFileRevisionEx)revision; StringBuilder sb = new StringBuilder(StringUtil.notNullize(ex.getAuthor())); @@ -795,6 +812,17 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme return renderer; } + @Nullable + @Override + public String valueOf(VcsFileRevision revision) { + if (revision instanceof VcsFileRevisionEx) { + if (!Comparing.equal(revision.getAuthor(), ((VcsFileRevisionEx)revision).getCommitterName())) { + return revision.getAuthor() + "*"; + } + } + return revision.getAuthor(); + } + @Override @NonNls public String getPreferredStringValue() { @@ -802,7 +830,7 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme } } - public static class MessageColumnInfo extends VcsColumnInfo { + public static class MessageColumnInfo extends ColumnInfo { private final ColoredTableCellRenderer myRenderer; private final IssueLinkRenderer myIssueLinkRenderer; @@ -830,8 +858,10 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme return index == -1 ? originalMessage : originalMessage.substring(0, index); } - protected String getDataOf(VcsFileRevision object) { - return getSubject(object); + @Nullable + @Override + public String valueOf(VcsFileRevision revision) { + return getSubject(revision); } @Override @@ -839,7 +869,9 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme return StringUtil.repeatSymbol('m', 80); } - public TableCellRenderer getRenderer(TreeNodeOnVcsRevision revision) { + @Nullable + @Override + public TableCellRenderer getRenderer(VcsFileRevision revision) { return myRenderer; } } @@ -886,52 +918,6 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme } } - abstract static class VcsColumnInfo> extends DualViewColumnInfo - implements Comparator { - @NotNull private final ColoredTableCellRenderer myRenderer; - - public VcsColumnInfo(String name) { - super(name); - - myRenderer = new ColoredTableCellRenderer() { - protected void customizeCellRenderer(JTable table, Object value, boolean selected, boolean hasFocus, int row, int column) { - setOpaque(selected); - append(value.toString()); - SpeedSearchUtil.applySpeedSearchHighlighting(table, this, false, selected); - } - }; - } - - protected abstract T getDataOf(VcsFileRevision o); - - public Comparator getComparator() { - return this; - } - - public String valueOf(TreeNodeOnVcsRevision object) { - T result = getDataOf(object.getRevision()); - return result == null ? "" : result.toString(); - } - - public int compare(TreeNodeOnVcsRevision o1, TreeNodeOnVcsRevision o2) { - return Comparing.compare(getDataOf(o1.getRevision()), getDataOf(o2.getRevision())); - } - - public boolean shouldBeShownIsTheTree() { - return true; - } - - public boolean shouldBeShownIsTheTable() { - return true; - } - - @Nullable - @Override - public TableCellRenderer getRenderer(TreeNodeOnVcsRevision revision) { - return myRenderer; - } - } - private static class MyTreeCellRenderer implements TreeCellRenderer { private final TreeCellRenderer myDefaultCellRenderer; private final Getter myHistorySession; @@ -1023,8 +1009,8 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme int selectionSize = selection.size(); if (selectionSize > 1) { - List selectedRevisions = ContainerUtil.map(ContainerUtil.sorted(selection, myRevisionsInOrderComparator), - TreeNodeOnVcsRevision::getRevision); + List selectedRevisions = ContainerUtil.sorted(ContainerUtil.map(selection, TreeNodeOnVcsRevision::getRevision), + myRevisionsInOrderComparator); VcsFileRevision olderRevision = selectedRevisions.get(0); VcsFileRevision newestRevision = selectedRevisions.get(selection.size() - 1); myDiffHandler.showDiffForTwo(e.getRequiredData(CommonDataKeys.PROJECT), myFilePath, olderRevision, newestRevision);