diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryColorManager.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryColorManager.kt new file mode 100644 index 000000000000..3be5ecacf8a3 --- /dev/null +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryColorManager.kt @@ -0,0 +1,31 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.vcs.log.history + +import com.intellij.openapi.vcs.FilePath +import com.intellij.vcs.log.VcsLogDataPack +import com.intellij.vcs.log.history.FileHistoryVisiblePack.Companion.filePaths +import com.intellij.vcs.log.ui.VcsLogColorManager +import com.intellij.vcs.log.ui.VcsLogColorManagerImpl +import java.awt.Color + +class FileHistoryColorManager(private val path: FilePath) : VcsLogColorManager { + private var baseColorManager = VcsLogColorManagerImpl(setOf(path)) + + override fun getPathColor(path: FilePath): Color { + return baseColorManager.getPathColor(path) + } + + fun update(pack: VcsLogDataPack) { + val filePaths = pack.filePaths() + if (filePaths.isEmpty()) { + baseColorManager = VcsLogColorManagerImpl(setOf(path)) + } + else { + baseColorManager = VcsLogColorManagerImpl(filePaths) + } + } + + override fun getPaths(): Collection { + return baseColorManager.paths + } +} diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryFilterer.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryFilterer.kt index 4fb21102f1e1..d51cf5e64cb3 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryFilterer.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryFilterer.kt @@ -226,13 +226,6 @@ internal class FileHistoryFilterer(logData: VcsLogData) : VcsLogFilterer { } } - private fun getStructureFilter(filters: VcsLogFilterCollection) = filters.detailsFilters.singleOrNull() as? VcsLogStructureFilter - - private fun getFilePath(filters: VcsLogFilterCollection): FilePath? { - val filter = getStructureFilter(filters) ?: return null - return filter.files.singleOrNull() - } - private fun getHash(filters: VcsLogFilterCollection): Hash? { val fileHistoryFilter = getStructureFilter(filters) as? VcsLogFileHistoryFilter if (fileHistoryFilter != null) { @@ -242,10 +235,17 @@ internal class FileHistoryFilterer(logData: VcsLogData) : VcsLogFilterer { val revisionFilter = filters.get(VcsLogFilterCollection.REVISION_FILTER) return revisionFilter?.heads?.singleOrNull()?.hash } - + companion object { private val LOG = Logger.getInstance(FileHistoryFilterer::class.java) + private fun getStructureFilter(filters: VcsLogFilterCollection) = filters.detailsFilters.singleOrNull() as? VcsLogStructureFilter + + fun getFilePath(filters: VcsLogFilterCollection): FilePath? { + val filter = getStructureFilter(filters) ?: return null + return filter.files.singleOrNull() + } + @JvmStatic fun createFilters(path: FilePath, revision: Hash?, diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUi.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUi.java index 3f90924bbf36..2109213a63c0 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUi.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUi.java @@ -23,7 +23,6 @@ import com.intellij.vcs.log.impl.VcsLogContentUtil; import com.intellij.vcs.log.impl.VcsLogUiProperties; import com.intellij.vcs.log.impl.VcsProjectLog; import com.intellij.vcs.log.ui.AbstractVcsLogUi; -import com.intellij.vcs.log.ui.VcsLogColorManager; import com.intellij.vcs.log.ui.VcsLogUiImpl; import com.intellij.vcs.log.ui.highlighters.CurrentBranchHighlighter; import com.intellij.vcs.log.ui.highlighters.MyCommitsHighlighter; @@ -37,8 +36,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; +import java.util.Collections; import java.util.List; -import java.util.*; +import java.util.Objects; +import java.util.Set; import static com.intellij.ui.JBColor.namedColor; import static com.intellij.util.ObjectUtils.notNull; @@ -58,13 +59,12 @@ public class FileHistoryUi extends AbstractVcsLogUi { @NotNull private final History myHistory; public FileHistoryUi(@NotNull VcsLogData logData, - @NotNull VcsLogColorManager manager, @NotNull FileHistoryUiProperties uiProperties, @NotNull VisiblePackRefresher refresher, @NotNull FilePath path, @Nullable Hash revision, @NotNull VirtualFile root) { - super(getFileHistoryLogId(path, revision), logData, manager, refresher); + super(getFileHistoryLogId(path, revision), logData, new FileHistoryColorManager(path), refresher); myPath = path; myRoot = root; @@ -214,7 +214,9 @@ public class FileHistoryUi extends AbstractVcsLogUi { @Override protected void onVisiblePackUpdated(boolean permGraphChanged) { + ((FileHistoryColorManager)myColorManager).update(myVisiblePack); myFileHistoryPanel.updateDataPack(myVisiblePack, permGraphChanged); + myFileHistoryPanel.getGraphTable().rootColumnUpdated(); } @NotNull @@ -275,6 +277,9 @@ public class FileHistoryUi extends AbstractVcsLogUi { else if (CommonUiProperties.SHOW_DIFF_PREVIEW.equals(property)) { myFileHistoryPanel.showDiffPreview(myUiProperties.get(CommonUiProperties.SHOW_DIFF_PREVIEW)); } + else if (CommonUiProperties.SHOW_ROOT_NAMES.equals(property)) { + myFileHistoryPanel.getGraphTable().rootColumnUpdated(); + } } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUiFactory.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUiFactory.java index 3bc14f8d8b60..edda658b1261 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUiFactory.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryUiFactory.java @@ -10,13 +10,10 @@ import com.intellij.vcs.log.VcsLogFilterCollection; import com.intellij.vcs.log.data.VcsLogData; import com.intellij.vcs.log.graph.PermanentGraph; import com.intellij.vcs.log.impl.VcsLogManager; -import com.intellij.vcs.log.ui.VcsLogColorManagerImpl; import com.intellij.vcs.log.visible.VisiblePackRefresherImpl; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Collections; - public class FileHistoryUiFactory implements VcsLogManager.VcsLogUiFactory { @NotNull private final FilePath myFilePath; @NotNull private final VirtualFile myRoot; @@ -34,7 +31,7 @@ public class FileHistoryUiFactory implements VcsLogManager.VcsLogUiFactory COLUMN_WIDTH = new HashMap<>(); public List COLUMN_ORDER = new ArrayList<>(); public boolean SHOW_DIFF_PREVIEW = true; + public boolean SHOW_ROOT_NAMES = false; } @SuppressWarnings("unchecked") @@ -55,6 +57,9 @@ public class FileHistoryUiProperties implements VcsLogUiProperties, PersistentSt else if (SHOW_DIFF_PREVIEW.equals(property)) { return (T)Boolean.valueOf(myState.SHOW_DIFF_PREVIEW); } + else if (SHOW_ROOT_NAMES.equals(property)) { + return (T)Boolean.valueOf(myState.SHOW_ROOT_NAMES); + } throw new UnsupportedOperationException("Unknown property " + property); } @@ -76,6 +81,9 @@ public class FileHistoryUiProperties implements VcsLogUiProperties, PersistentSt else if (SHOW_DIFF_PREVIEW.equals(property)) { myState.SHOW_DIFF_PREVIEW = (Boolean)value; } + else if (SHOW_ROOT_NAMES.equals(property)) { + myState.SHOW_ROOT_NAMES = (Boolean)value; + } else { throw new UnsupportedOperationException("Unknown property " + property); } @@ -88,6 +96,7 @@ public class FileHistoryUiProperties implements VcsLogUiProperties, PersistentSt SHOW_ALL_BRANCHES.equals(property) || COLUMN_ORDER.equals(property) || SHOW_DIFF_PREVIEW.equals(property) || + SHOW_ROOT_NAMES.equals(property) || property instanceof TableColumnProperty; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryVisiblePack.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryVisiblePack.kt index 040eb74ec553..c4af7c501ab7 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryVisiblePack.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/history/FileHistoryVisiblePack.kt @@ -21,14 +21,19 @@ import com.intellij.vcs.log.VcsLogFilterCollection import com.intellij.vcs.log.data.DataPackBase import com.intellij.vcs.log.graph.VisibleGraph import com.intellij.vcs.log.visible.VisiblePack +import gnu.trove.THashSet class FileHistoryVisiblePack(dataPack: DataPackBase, graph: VisibleGraph, canRequestMore: Boolean, - filters: VcsLogFilterCollection, - fileHistory: FileHistory) : VisiblePack(dataPack, graph, canRequestMore, filters, fileHistory) { + filters: VcsLogFilterCollection, + fileHistory: FileHistory) : VisiblePack(dataPack, graph, canRequestMore, filters, fileHistory) { constructor(dataPack: DataPackBase, graph: VisibleGraph, canRequestMore: Boolean, filters: VcsLogFilterCollection, commitsToPaths: Map) : this(dataPack, graph, canRequestMore, filters, FileHistory(commitsToPaths)) + override fun getFilePath(rowIndex: Int): FilePath { + return filePath(visibleGraph.getRowInfo(rowIndex).commit) ?: FileHistoryFilterer.getFilePath(filters)!! + } + companion object { val VcsLogDataPack.fileHistory: FileHistory get() { @@ -44,6 +49,11 @@ class FileHistoryVisiblePack(dataPack: DataPackBase, graph: VisibleGraph, c @JvmStatic fun VcsLogDataPack.isDeletedInCommit(commit: Int): Boolean = this.commitsToPathsMap[commit]?.deleted ?: false + + @JvmStatic + fun VcsLogDataPack.filePaths(): Set { + return commitsToPathsMap.values.mapTo(THashSet(FILE_PATH_HASHING_STRATEGY)) { it.filePath } + } } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogColorManagerImpl.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogColorManagerImpl.java index 0487293feab2..da1fd434ec71 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogColorManagerImpl.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/VcsLogColorManagerImpl.java @@ -2,10 +2,12 @@ package com.intellij.vcs.log.ui; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Couple; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; +import com.intellij.util.containers.BidirectionalMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import com.intellij.vcsUtil.VcsUtil; @@ -25,15 +27,18 @@ public class VcsLogColorManagerImpl implements VcsLogColorManager { {JBColor.RED, JBColor.GREEN, JBColor.BLUE, JBColor.ORANGE, JBColor.CYAN, JBColor.YELLOW, JBColor.MAGENTA, JBColor.PINK}; @NotNull private final Map myPaths2Colors; - @NotNull private final List mySortedPaths; + @NotNull private final List myPaths; - public VcsLogColorManagerImpl(@NotNull Collection roots) { - mySortedPaths = ContainerUtil.map(ContainerUtil.sorted(roots, Comparator.comparing(VirtualFile::getName)), - file -> VcsUtil.getFilePath(file)); + public VcsLogColorManagerImpl(@NotNull Set roots) { + this(ContainerUtil.map(ContainerUtil.sorted(roots, Comparator.comparing(VirtualFile::getName)), + file -> VcsUtil.getFilePath(file))); + } + public VcsLogColorManagerImpl(@NotNull Collection paths) { + myPaths = new ArrayList<>(paths); myPaths2Colors = new HashMap<>(); - for (int i = 0; i < mySortedPaths.size(); i++) { - myPaths2Colors.put(mySortedPaths.get(i).getPath(), getColor(i, mySortedPaths.size())); + for (int i = 0; i < myPaths.size(); i++) { + myPaths2Colors.put(myPaths.get(i).getPath(), getColor(i, myPaths.size())); } } @@ -87,6 +92,6 @@ public class VcsLogColorManagerImpl implements VcsLogColorManager { @NotNull @Override public Collection getPaths() { - return mySortedPaths; + return myPaths; } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/GraphTableModel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/GraphTableModel.java index 8233f3de2d44..1bce59cb1e61 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/GraphTableModel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/table/GraphTableModel.java @@ -15,7 +15,6 @@ import com.intellij.vcs.log.data.VcsLogData; import com.intellij.vcs.log.ui.frame.CommitPresentationUtil; import com.intellij.vcs.log.ui.render.GraphCommitCell; import com.intellij.vcs.log.visible.VisiblePack; -import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,7 +125,7 @@ public class GraphTableModel extends AbstractTableModel { VcsShortCommitDetails data = getCommitMetadata(rowIndex); switch (columnIndex) { case ROOT_COLUMN: - return VcsUtil.getFilePath(getRoot(rowIndex)); + return myDataPack.getFilePath(rowIndex); case COMMIT_COLUMN: return new GraphCommitCell(data.getSubject(), getRefsAtRow(rowIndex), myDataPack.getVisibleGraph().getRowInfo(rowIndex).getPrintElements()); diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePack.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePack.java index 09bd6c5588be..07a27090cd63 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePack.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/visible/VisiblePack.java @@ -15,6 +15,7 @@ */ package com.intellij.vcs.log.visible; +import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.vcs.log.VcsLogDataPack; import com.intellij.vcs.log.VcsLogFilterCollection; @@ -24,6 +25,7 @@ import com.intellij.vcs.log.data.DataPack; import com.intellij.vcs.log.data.DataPackBase; import com.intellij.vcs.log.graph.VisibleGraph; import com.intellij.vcs.log.visible.filters.VcsLogFilterObject; +import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -123,4 +125,9 @@ public class VisiblePack implements VcsLogDataPack { ", canRequestMore=" + myCanRequestMore + "}"; } + + @NotNull + public FilePath getFilePath(int index) { + return VcsUtil.getFilePath(getRoot(index)); + } }