package com.intellij.vcs.log.ui; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.ColorUtil; import com.intellij.ui.JBColor; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import java.awt.*; import java.util.*; import java.util.List; /** * @author Kirill Likhodedov */ public class VcsLogColorManagerImpl implements VcsLogColorManager { private static final Logger LOG = Logger.getInstance(VcsLogColorManagerImpl.class); private static final Color[] ROOT_COLORS = {JBColor.RED, JBColor.GREEN, JBColor.BLUE, JBColor.ORANGE, JBColor.CYAN, JBColor.YELLOW, JBColor.MAGENTA, JBColor.PINK}; @NotNull private final List<VirtualFile> myRoots; @NotNull private final Map<VirtualFile, Color> myRoots2Colors; public VcsLogColorManagerImpl(@NotNull Collection<VirtualFile> roots) { myRoots = new ArrayList<>(roots); Collections.sort(myRoots, Comparator.comparing(VirtualFile::getName)); myRoots2Colors = ContainerUtil.newHashMap(); int i = 0; for (VirtualFile root : myRoots) { Color color; if (i >= ROOT_COLORS.length) { double balance = ((double)(i / ROOT_COLORS.length)) / (roots.size() / ROOT_COLORS.length); Color mix = ColorUtil.mix(ROOT_COLORS[i % ROOT_COLORS.length], ROOT_COLORS[(i + 1) % ROOT_COLORS.length], balance); int tones = (int)(Math.abs(balance - 0.5) * 2 * (roots.size() / ROOT_COLORS.length) + 1); color = new JBColor(ColorUtil.darker(mix, tones), ColorUtil.brighter(mix, 2 * tones)); } else { color = ROOT_COLORS[i]; } i++; myRoots2Colors.put(root, color); } } @NotNull public static JBColor getBackgroundColor(@NotNull final Color baseRootColor) { return new JBColor(() -> ColorUtil.mix(baseRootColor, UIUtil.getTableBackground(), 0.75)); } @Override public boolean isMultipleRoots() { return myRoots.size() > 1; } @NotNull @Override public Color getRootColor(@NotNull VirtualFile root) { Color color = myRoots2Colors.get(root); if (color == null) { LOG.error("No color record for root " + root + ". All roots: " + myRoots2Colors); color = getDefaultRootColor(); } return color; } private static Color getDefaultRootColor() { return UIUtil.getTableBackground(); } }