[vcs-log] reference painters get ref manager themselves
authorJulia Beliaeva <Julia.Beliaeva@jetbrains.com>
Tue, 18 Oct 2016 14:59:25 +0000 (17:59 +0300)
committerJulia Beliaeva <Julia.Beliaeva@jetbrains.com>
Thu, 27 Oct 2016 15:19:37 +0000 (18:19 +0300)
platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/GraphCommitCellRenderer.java
platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/LabelPainter.java
platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/RectangleReferencePainter.java
platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/ReferencePainter.java

index 0f0f2f1745dc84a07eae2105d2ecb4deec79528f..001897f25026e544c439020209a6a7a424afd77a 100644 (file)
@@ -3,13 +3,11 @@ package com.intellij.vcs.log.ui.render;
 import com.intellij.openapi.ui.GraphicsConfig;
 import com.intellij.openapi.util.registry.Registry;
 import com.intellij.openapi.vcs.changes.issueLinks.IssueLinkRenderer;
-import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.JBColor;
 import com.intellij.ui.SimpleColoredRenderer;
 import com.intellij.ui.SimpleTextAttributes;
 import com.intellij.ui.TableCell;
 import com.intellij.util.ObjectUtils;
-import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.ui.GraphicsUtil;
 import com.intellij.util.ui.JBUI;
 import com.intellij.util.ui.UIUtil;
@@ -37,8 +35,8 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
   @NotNull private final VcsLogData myLogData;
   @NotNull private final VcsLogGraphTable myGraphTable;
 
-  @Nullable private final FadeOutPainter myFadeOutPainter = isRedesignedLabels() ? new FadeOutPainter() : null;
-  @Nullable private final ReferencePainter myTooltipPainter = isRedesignedLabels() ? new LabelPainter() : null;
+  @Nullable private final FadeOutPainter myFadeOutPainter;
+  @Nullable private final ReferencePainter myTooltipPainter;
 
   @NotNull private final MyComponent myComponent;
 
@@ -50,6 +48,9 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
     myLogData = logData;
     myGraphTable = table;
 
+    myFadeOutPainter = isRedesignedLabels() ? new FadeOutPainter() : null;
+    myTooltipPainter = isRedesignedLabels() ? new LabelPainter(myLogData) : null;
+
     myComponent = new MyComponent(logData, painter, table) {
       @Override
       public void paintComponent(Graphics g) {
@@ -76,7 +77,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
 
     myExpanded = myGraphTable.getExpandableItemsHandler().getExpandedItems().contains(new TableCell(row, column));
     if (myFadeOutPainter != null) {
-      myFadeOutPainter.customize(value.getRefsToThisCommit(), row, column, table, JBColor.black /*any color fits here*/);
+      myFadeOutPainter.customize(value.getRefsToThisCommit(), row, column, table  /*any color fits here*/);
     }
     return myComponent;
   }
@@ -92,7 +93,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
     GraphCommitCell cell = getValue(value);
     Collection<VcsRef> refs = cell.getRefsToThisCommit();
     if (!refs.isEmpty()) {
-      customizeRefsPainter(myTooltipPainter, refs, myComponent.getForeground(), myLogData, myComponent);
+      myTooltipPainter.customizePainter(myComponent, refs, myComponent.getBackground(), myComponent.getForeground());
       if (myTooltipPainter.getSize().getWidth() - LabelPainter.GRADIENT_WIDTH >= width - point.getX()) {
         return new TooltipReferencesPanel(myLogData, myTooltipPainter, refs);
       }
@@ -100,21 +101,6 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
     return null;
   }
 
-  private static void customizeRefsPainter(@NotNull ReferencePainter painter,
-                                           @NotNull Collection<VcsRef> refs,
-                                           @NotNull Color foreground,
-                                           @NotNull VcsLogData logData,
-                                           @NotNull JComponent component) {
-    if (!refs.isEmpty()) {
-      VirtualFile root = ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(refs)).getRoot();
-      painter.customizePainter(component, refs, logData.getLogProvider(root).getReferenceManager(),
-                               component.getBackground(), foreground);
-    }
-    else {
-      painter.customizePainter(component, refs, null, component.getBackground(), foreground);
-    }
-  }
-
   public int getPreferredHeight() {
     return myComponent.getPreferredHeight();
   }
@@ -128,8 +114,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
     @NotNull private final VcsLogGraphTable myGraphTable;
     @NotNull private final GraphCellPainter myPainter;
     @NotNull private final IssueLinkRenderer myIssueLinkRenderer;
-    @NotNull private final ReferencePainter myReferencePainter =
-      isRedesignedLabels() ? new LabelPainter() : new RectangleReferencePainter();
+    @NotNull private final ReferencePainter myReferencePainter;
 
     @NotNull protected PaintInfo myGraphImage = new PaintInfo(UIUtil.createImage(1, 1, BufferedImage.TYPE_INT_ARGB), 0);
     @NotNull private Font myFont;
@@ -140,6 +125,8 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
       myPainter = painter;
       myGraphTable = table;
 
+      myReferencePainter = isRedesignedLabels() ? new LabelPainter(myLogData) : new RectangleReferencePainter(myLogData);
+
       myIssueLinkRenderer = new IssueLinkRenderer(myLogData.getProject(), this);
       myFont = RectanglePainter.getFont();
       myHeight = calculateHeight();
@@ -182,8 +169,8 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
       SimpleTextAttributes style = myGraphTable.applyHighlighters(this, row, column, hasFocus, isSelected);
 
       Collection<VcsRef> refs = cell.getRefsToThisCommit();
-      Color foreground = ObjectUtils.assertNotNull(myGraphTable.getBaseStyle(row, column, hasFocus, isSelected).getForeground());
-      customizeRefsPainter(myReferencePainter, refs, foreground, myLogData, this);
+      Color baseForeground = ObjectUtils.assertNotNull(myGraphTable.getBaseStyle(row, column, hasFocus, isSelected).getForeground());
+      myReferencePainter.customizePainter(this, refs, getBackground(), baseForeground);
 
       setBorder(null);
       append("");
@@ -230,7 +217,7 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
     public int getTooltipXCoordinate(@NotNull GraphCommitCell cell) {
       Collection<VcsRef> refs = cell.getRefsToThisCommit();
       if (!refs.isEmpty()) {
-        customizeRefsPainter(myReferencePainter, refs, getForeground(), myLogData, this);
+        myReferencePainter.customizePainter(this, refs, getBackground(), getForeground());
         TableColumn commitColumn = myGraphTable.getColumnModel().getColumn(GraphTableModel.COMMIT_COLUMN);
         return commitColumn.getWidth() - (myReferencePainter.getSize().width - LabelPainter.GRADIENT_WIDTH) / 2;
       }
@@ -263,24 +250,24 @@ public class GraphCommitCellRenderer extends TypeSafeTableCellRenderer<GraphComm
   }
 
   private class FadeOutPainter {
-    @NotNull private final LabelPainter myEmptyPainter = new LabelPainter();
+    @NotNull private final LabelPainter myEmptyPainter = new LabelPainter(myLogData);
     private int myWidth = LabelPainter.GRADIENT_WIDTH;
 
-    public void customize(@NotNull Collection<VcsRef> currentRefs, int row, int column, @NotNull JTable table, @NotNull Color foreground) {
+    public void customize(@NotNull Collection<VcsRef> currentRefs, int row, int column, @NotNull JTable table) {
       myWidth = 0;
 
       if (currentRefs.isEmpty()) {
         int prevWidth = 0;
         if (row > 0) {
           GraphCommitCell commitCell = getValue(table.getValueAt(row - 1, column));
-          customizeRefsPainter(myEmptyPainter, commitCell.getRefsToThisCommit(), foreground, myLogData, myComponent);
+          myEmptyPainter.customizePainter(myComponent, commitCell.getRefsToThisCommit(), myComponent.getBackground(), JBColor.black);
           prevWidth = myEmptyPainter.getSize().width;
         }
 
         int nextWidth = 0;
         if (row < table.getRowCount() - 1) {
           GraphCommitCell commitCell = getValue(table.getValueAt(row + 1, column));
-          customizeRefsPainter(myEmptyPainter, commitCell.getRefsToThisCommit(), foreground, myLogData, myComponent);
+          myEmptyPainter.customizePainter(myComponent, commitCell.getRefsToThisCommit(), myComponent.getBackground(), JBColor.black);
           nextWidth = myEmptyPainter.getSize().width;
         }
 
index 46418cb56607e24f51f2efcb80d9267f71e09bbf..49bd0e51995380408d1b410dd9e483377aa2adc9 100644 (file)
@@ -44,8 +44,8 @@ import com.intellij.vcs.log.RefGroup;
 import com.intellij.vcs.log.VcsLogRefManager;
 import com.intellij.vcs.log.VcsRef;
 import com.intellij.vcs.log.VcsRefType;
+import com.intellij.vcs.log.data.VcsLogData;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
@@ -64,8 +64,9 @@ public class LabelPainter implements ReferencePainter {
   private static final String TWO_DOTS = "..";
   private static final String SEPARATOR = "/";
 
-  @NotNull
-  private List<Pair<String, LabelIcon>> myLabels = ContainerUtil.newArrayList();
+  @NotNull private final VcsLogData myLogData;
+
+  @NotNull private List<Pair<String, LabelIcon>> myLabels = ContainerUtil.newArrayList();
   private int myHeight = JBUI.scale(22);
   private int myWidth = 0;
   @NotNull
@@ -73,9 +74,12 @@ public class LabelPainter implements ReferencePainter {
   @NotNull
   private Color myForeground = UIUtil.getTableForeground();
 
+  public LabelPainter(@NotNull VcsLogData data) {
+    myLogData = data;
+  }
+
   public void customizePainter(@NotNull JComponent component,
                                @NotNull Collection<VcsRef> references,
-                               @Nullable VcsLogRefManager manager,
                                @NotNull Color background,
                                @NotNull Color foreground) {
     myBackground = background;
@@ -83,30 +87,45 @@ public class LabelPainter implements ReferencePainter {
 
     FontMetrics metrics = component.getFontMetrics(getReferenceFont());
     myHeight = metrics.getHeight() + TOP_TEXT_PADDING + BOTTOM_TEXT_PADDING;
-    myWidth = GRADIENT_WIDTH + RIGHT_PADDING;
 
-    myLabels = ContainerUtil.newArrayList();
-    if (manager == null) return;
+    VcsLogRefManager manager = ReferencePainter.getRefManager(myLogData, references);
+    List<RefGroup> refGroups = manager == null ? ContainerUtil.emptyList() : manager.groupForTable(references);
+    Pair<List<Pair<String, LabelIcon>>, Integer> presentation = calculatePresentation(refGroups, metrics, myHeight, myBackground);
+
+    myLabels = presentation.first;
+    myWidth = presentation.second;
+  }
 
-    for (RefGroup group : manager.groupForTable(references)) {
+  @NotNull
+  public static Pair<List<Pair<String, LabelIcon>>, Integer> calculatePresentation(@NotNull List<RefGroup> refGroups,
+                                                                                   @NotNull FontMetrics fontMetrics,
+                                                                                   int height,
+                                                                                   @NotNull Color background) {
+    int width = GRADIENT_WIDTH + RIGHT_PADDING;
+
+    List<Pair<String, LabelIcon>> labels = ContainerUtil.newArrayList();
+    if (refGroups.isEmpty()) return Pair.create(labels, width);
+
+    for (RefGroup group : refGroups) {
       if (group.isExpanded()) {
         for (VcsRef ref : group.getRefs()) {
-          LabelIcon labelIcon = new LabelIcon(myHeight, myBackground, ref.getType().getBackgroundColor());
+          LabelIcon labelIcon = new LabelIcon(height, background, ref.getType().getBackgroundColor());
           String text = shortenRefName(ref.getName());
 
-          myLabels.add(Pair.create(text, labelIcon));
-          myWidth += labelIcon.getIconWidth() + metrics.stringWidth(text) + MIDDLE_PADDING;
+          labels.add(Pair.create(text, labelIcon));
+          width += labelIcon.getIconWidth() + fontMetrics.stringWidth(text) + MIDDLE_PADDING;
         }
       }
       else {
-
-        LabelIcon labelIcon = new LabelIcon(myHeight, myBackground, getGroupColors(group));
+        LabelIcon labelIcon = new LabelIcon(height, background, getGroupColors(group));
         String text = shortenRefName(group.getName());
 
-        myLabels.add(Pair.create(text, labelIcon));
-        myWidth += labelIcon.getIconWidth() + metrics.stringWidth(text) + MIDDLE_PADDING;
+        labels.add(Pair.create(text, labelIcon));
+        width += labelIcon.getIconWidth() + fontMetrics.stringWidth(text) + MIDDLE_PADDING;
       }
     }
+
+    return Pair.create(labels, width);
   }
 
   @NotNull
@@ -123,7 +142,7 @@ public class LabelPainter implements ReferencePainter {
   }
 
   @NotNull
-  public Color[] getGroupColors(@NotNull RefGroup group) {
+  public static Color[] getGroupColors(@NotNull RefGroup group) {
     MultiMap<VcsRefType, VcsRef> referencesByType = ContainerUtil.groupBy(group.getRefs(), VcsRef::getType);
     Color[] colors;
     if (referencesByType.size() == 1) {
index 875dd38a0e79bdc9151f060de3dc9dff42975b8c..a86cd5f86397d2dfa048709edce174b2b8e935ed 100644 (file)
@@ -26,9 +26,9 @@ import com.intellij.util.ui.UIUtil;
 import com.intellij.vcs.log.VcsLogRefManager;
 import com.intellij.vcs.log.VcsRef;
 import com.intellij.vcs.log.VcsRefType;
+import com.intellij.vcs.log.data.VcsLogData;
 import com.intellij.vcs.log.paint.PaintParameters;
 import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.awt.*;
@@ -37,8 +37,8 @@ import java.util.List;
 import java.util.Map;
 
 public class RectangleReferencePainter implements ReferencePainter {
-  @NotNull
-  private List<Pair<String, Color>> myLabels = ContainerUtil.newArrayList();
+  @NotNull private final VcsLogData myLogData;
+  @NotNull private List<Pair<String, Color>> myLabels = ContainerUtil.newArrayList();
   private int myHeight = JBUI.scale(22);
   private int myWidth = 0;
 
@@ -49,10 +49,13 @@ public class RectangleReferencePainter implements ReferencePainter {
     }
   };
 
+  public RectangleReferencePainter(@NotNull VcsLogData data) {
+    myLogData = data;
+  }
+
   @Override
   public void customizePainter(@NotNull JComponent component,
                                @NotNull Collection<VcsRef> references,
-                               @Nullable VcsLogRefManager manager,
                                @NotNull Color background,
                                @NotNull Color foreground) {
     FontMetrics metrics = component.getFontMetrics(getReferenceFont());
@@ -60,6 +63,7 @@ public class RectangleReferencePainter implements ReferencePainter {
     myWidth = 2 * PaintParameters.LABEL_PADDING;
 
     myLabels = ContainerUtil.newArrayList();
+    VcsLogRefManager manager = ReferencePainter.getRefManager(myLogData, references);
     if (manager == null) return;
 
     List<VcsRef> sorted = ContainerUtil.sorted(references, manager.getLabelsOrderComparator());
index c92db0b76de4c97f1aae770fb6fb6d03836213db..536b0ace9b2bff09b6736dd8ff6397d51a8ac734 100644 (file)
  */
 package com.intellij.vcs.log.ui.render;
 
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.ObjectUtils;
+import com.intellij.util.containers.ContainerUtil;
 import com.intellij.vcs.log.VcsLogRefManager;
 import com.intellij.vcs.log.VcsRef;
+import com.intellij.vcs.log.data.VcsLogData;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -27,7 +31,6 @@ import java.util.Collection;
 public interface ReferencePainter {
   void customizePainter(@NotNull JComponent component,
                         @NotNull Collection<VcsRef> references,
-                        @Nullable VcsLogRefManager manager,
                         @NotNull Color background,
                         @NotNull Color foreground);
 
@@ -40,4 +43,15 @@ public interface ReferencePainter {
   default Font getReferenceFont() {
     return RectanglePainter.getFont();
   }
+
+  @Nullable
+  static VcsLogRefManager getRefManager(@NotNull VcsLogData logData, @NotNull Collection<VcsRef> references) {
+    if (!references.isEmpty()) {
+      VirtualFile root = ObjectUtils.assertNotNull(ContainerUtil.getFirstItem(references)).getRoot();
+      return logData.getLogProvider(root).getReferenceManager();
+    }
+    else {
+      return null;
+    }
+  }
 }