From d5532041abeb7b61ca5eb2ff166afd41df458cef Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Wed, 30 Jan 2019 19:16:35 +0300 Subject: [PATCH] IDEA-206149: Fix com.intellij.ui.stripe.Updater#findPreviousIndex --- .../src/com/intellij/ui/stripe/Updater.java | 97 ++++++++----------- 1 file changed, 38 insertions(+), 59 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/stripe/Updater.java b/platform/platform-impl/src/com/intellij/ui/stripe/Updater.java index 1652d8426c3a..81dc7b90baa0 100644 --- a/platform/platform-impl/src/com/intellij/ui/stripe/Updater.java +++ b/platform/platform-impl/src/com/intellij/ui/stripe/Updater.java @@ -143,73 +143,52 @@ public abstract class Updater implements Dis } public int findNextIndex(int current) { - int count = myPainter.getErrorStripeCount(); - int foundIndex = -1; - int foundLayer = 0; - if (0 <= current && current < count) { - current++; - for (int index = current; index < count; index++) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } - for (int index = 0; index < current; index++) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } + SearchResult result = new SearchResult(); + int max = myPainter.getErrorStripeCount() - 1; + if (0 <= current && current < max) { + result.updateForward(myPainter, current + 1, max); + result.updateForward(myPainter, 0, current); } - else { - for (int index = 0; index < count; index++) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } + else if (0 <= max) { + result.updateForward(myPainter, 0, max); } - return foundIndex; + return result.index; } public int findPreviousIndex(int current) { - int count = myPainter.getErrorStripeCount(); - int foundIndex = -1; - int foundLayer = 0; - if (0 <= current && current < count) { - current--; - for (int index = count - 1; index >= 0; index++) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } - for (int index = current - 1; index >= 0; index++) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } + SearchResult result = new SearchResult(); + int max = myPainter.getErrorStripeCount() - 1; + if (0 < current && current <= max) { + result.updateBackward(myPainter, current - 1, 0); + result.updateBackward(myPainter, max, current); } - else { - for (int index = count - 1; index >= 0; index--) { - int layer = getLayer(index); - if (layer > foundLayer) { - foundIndex = index; - foundLayer = layer; - } - } + else if (0 <= max) { + result.updateBackward(myPainter, max, 0); } - return foundIndex; + return result.index; } - private int getLayer(int index) { - ErrorStripe stripe = myPainter.getErrorStripe(index); - return stripe == null ? -1 : stripe.getLayer(); + private static final class SearchResult { + int layer = 0; + int index = -1; + + void updateForward(ErrorStripePainter painter, int index, int max) { + while (index <= max) update(painter, index++); + } + + void updateBackward(ErrorStripePainter painter, int index, int min) { + while (min <= index) update(painter, index--); + } + + void update(ErrorStripePainter painter, int index) { + ErrorStripe stripe = painter.getErrorStripe(index); + if (stripe != null) { + int layer = stripe.getLayer(); + if (layer > this.layer) { + this.layer = layer; + this.index = index; + } + } + } } }