From f7f103b5f83a96e9286adb4309631a31c4933701 Mon Sep 17 00:00:00 2001 From: Philip Langer Date: Fri, 15 Sep 2017 12:23:14 +0200 Subject: [PATCH] [521940] Prevent index out of bounds exception on empty SMV tree Bug: 521940 Change-Id: Ie87219688ad5ae16bfd9920f5c0f85242f3fdc01 Signed-off-by: Philip Langer --- .../EMFCompareDiffTreeRuler.java | 55 +++++++++++++++------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java index 5292b15e5..c406d892e 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareDiffTreeRuler.java @@ -187,21 +187,35 @@ public class EMFCompareDiffTreeRuler extends Canvas { */ private void handlePaintEvent(PaintEvent e) { annotationsData.clear(); - for (Diff diff : dependencyData.getRequires()) { - final Collection treeNodes = dependencyData.getTreeNodes(diff); - for (TreeNodeToVisibleTreeItem treeNodeToVisibleTreeItem : findTreeItems(treeNodes)) { - if (!JFaceUtil.isFiltered(fTreeViewer, treeNodeToVisibleTreeItem.getTreeNode(), null)) { - createAnnotation(e, treeNodeToVisibleTreeItem, compareColor.getRequiredFillColor(), - compareColor.getRequiredStrokeColor()); + + int yRuler = getSize().y; + boolean isVerticalScrollBarEnabled = isVerticalScrollBarEnabled(); + Tree tree = fTreeViewer.getTree(); + if (tree.getItemCount() > 0) { + int yMin = Math.abs(tree.getItem(0).getBounds().y); + int yMax = getLastVisibleItem().getBounds().y; + + Color requiredFillColor = compareColor.getRequiredFillColor(); + Color requiredStrokeColor = compareColor.getRequiredStrokeColor(); + for (Diff diff : dependencyData.getRequires()) { + final Collection treeNodes = dependencyData.getTreeNodes(diff); + for (TreeNodeToVisibleTreeItem treeNodeToVisibleTreeItem : findTreeItems(treeNodes)) { + if (!JFaceUtil.isFiltered(fTreeViewer, treeNodeToVisibleTreeItem.getTreeNode(), null)) { + createAnnotation(e, treeNodeToVisibleTreeItem, requiredFillColor, requiredStrokeColor, + yRuler, isVerticalScrollBarEnabled, yMin, yMax); + } } } - } - for (Diff diff : dependencyData.getRejections()) { - final Collection treeNodes = dependencyData.getTreeNodes(diff); - for (TreeNodeToVisibleTreeItem treeNodeToVisibleTreeItem : findTreeItems(treeNodes)) { - if (!JFaceUtil.isFiltered(fTreeViewer, treeNodeToVisibleTreeItem.getTreeNode(), null)) { - createAnnotation(e, treeNodeToVisibleTreeItem, compareColor.getUnmergeableFillColor(), - compareColor.getUnmergeableStrokeColor()); + + Color unmergeableFillColor = compareColor.getUnmergeableFillColor(); + Color unmergeableStrokeColor = compareColor.getUnmergeableStrokeColor(); + for (Diff diff : dependencyData.getRejections()) { + final Collection treeNodes = dependencyData.getTreeNodes(diff); + for (TreeNodeToVisibleTreeItem treeNodeToVisibleTreeItem : findTreeItems(treeNodes)) { + if (!JFaceUtil.isFiltered(fTreeViewer, treeNodeToVisibleTreeItem.getTreeNode(), null)) { + createAnnotation(e, treeNodeToVisibleTreeItem, unmergeableFillColor, + unmergeableStrokeColor, yRuler, isVerticalScrollBarEnabled, yMin, yMax); + } } } } @@ -392,17 +406,22 @@ public class EMFCompareDiffTreeRuler extends Canvas { * the annotation's fill color. * @param border * the annotation's border color. + * @param yRuler + * the ruler size's y value + * @param isVerticalScrollBarEnabled + * whether the vertical scroll bar is enabled. + * @param yMin + * the minimum y value. + * @param yMax + * the maximum y value. */ private void createAnnotation(PaintEvent e, TreeNodeToVisibleTreeItem treeNodeToVisibleTreeItem, - Color fill, Color border) { + Color fill, Color border, int yRuler, boolean isVerticalScrollBarEnabled, int yMin, int yMax) { TreeItem item = getDeepestVisibleTreeItem(treeNodeToVisibleTreeItem.getTreeItem(), treeNodeToVisibleTreeItem.getTreeItem()); if (item != null) { int y = item.getBounds().y; - int yRuler = getSize().y; - if (isVerticalScrollBarEnabled()) { - int yMin = Math.abs(item.getParent().getItems()[0].getBounds().y); - int yMax = getLastVisibleItem().getBounds().y; + if (isVerticalScrollBarEnabled) { int realYMax = yMax + yMin; if (realYMax > 0) { y = (y + yMin) * yRuler / realYMax; -- 2.11.4.GIT