From f32fb52280641689df2f20ae57c130d008bff529 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sat, 28 Sep 2013 17:00:16 +0400 Subject: [PATCH] [log] Don't draw all references on the branches panel: limit by width Otherwise repaint is slow if there are many refs. Pass the maximum width to the RefPainter, and don't draw if further refs would be invisible. The problem affects only the BranchesPanel: other RefPainter clients draw a limited amount of refs (only refs on the given commit). They have other problems though which will be solved later. --- .../src/com/intellij/vcs/log/ui/frame/BranchesPanel.java | 2 +- .../impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java | 3 ++- .../intellij/vcs/log/ui/render/GraphCommitCellRender.java | 2 +- .../impl/src/com/intellij/vcs/log/ui/render/RefPainter.java | 5 ++++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java index a9a4dcc03827..92eadfd6f128 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/BranchesPanel.java @@ -72,7 +72,7 @@ public class BranchesPanel extends JPanel { @Override protected void paintComponent(Graphics g) { - myRefPositions = myRefPainter.draw((Graphics2D)g, myRefs, 0); + myRefPositions = myRefPainter.draw((Graphics2D)g, myRefs, 0, getWidth()); } public void rebuild() { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java index e235b95ce5c9..c35459c4f457 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java @@ -182,7 +182,8 @@ class DetailsPanel extends JPanel implements ListSelectionListener { @Override protected void paintComponent(Graphics g) { - myRefPainter.draw((Graphics2D)g, myRefs, 0); + // TODO when the right margin reaches, draw on the second line + myRefPainter.draw((Graphics2D)g, myRefs, 0, getWidth()); } void setRefs(@NotNull List refs) { diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/GraphCommitCellRender.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/GraphCommitCellRender.java index 798ff9f1437f..200063f6ac86 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/GraphCommitCellRender.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/GraphCommitCellRender.java @@ -90,7 +90,7 @@ public class GraphCommitCellRender implements TableCellRenderer { VirtualFile root = refs.iterator().next().getRoot(); // all refs are from the same commit => they have the same root refs = myDataHolder.getLogProvider(root).getReferenceManager().sort(refs); } - refPainter.draw(g2, refs, padding); + refPainter.draw(g2, refs, padding, -1); // TODO think how to behave if there are too many refs here (even if tags are collapsed) g.drawImage(image, 0, 0, null); } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/RefPainter.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/RefPainter.java index 7fbe3041e3c3..759f568793a7 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/RefPainter.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/render/RefPainter.java @@ -103,7 +103,7 @@ public class RefPainter { return Math.round(p); } - public Map draw(@NotNull Graphics2D g2, @NotNull List refs, int startPadding) { + public Map draw(@NotNull Graphics2D g2, @NotNull List refs, int startPadding, int maxWidth) { float currentPadding = startPadding; g2.setFont(DEFAULT_FONT); g2.setStroke(new BasicStroke(1.5f)); @@ -114,6 +114,9 @@ public class RefPainter { int x = draw(g2, ref, (int)currentPadding); positions.put(x, ref); currentPadding += paddingStr(ref.getName(), renderContext); + if (maxWidth > 0 && x >= maxWidth) { + break; + } } return positions; }