From 3a8d9002e48803456b160f474b7b6cf5793d3bd2 Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Tue, 4 Jul 2017 04:48:33 +0300 Subject: [PATCH] [file-history] fix history for selection This commit partially undo 6c160fd. Since columns from file history are used in history for selection, they need to use VcsFileRevision, not TreeNodeOnVcsRevision. So now each column is wrapped in TreeNodeColumnInfoWrapper in file history, and does not extend DualViewColumnInfo. --- .../vcs/history/FileHistoryPanelImpl.java | 204 ++++++++---------- 1 file changed, 95 insertions(+), 109 deletions(-) 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);