From 75c271cfc273cabf2b43428add4e971ebd016cd8 Mon Sep 17 00:00:00 2001 From: Patrick Tasse Date: Mon, 22 Oct 2012 13:07:14 -0400 Subject: [PATCH] Fix for bug 392591: ArrayIndexOutOfBoundsException in virtual table. Change-Id: Ie7f6e36765b5b0a111ba6a63e867f0ac99864fb8 Reviewed-on: https://git.eclipse.org/r/8329 Tested-by: Hudson CI Reviewed-by: Alexandre Montplaisir IP-Clean: Alexandre Montplaisir Tested-by: Alexandre Montplaisir Reviewed-by: Patrick Tasse --- .../widgets/virtualtable/TmfVirtualTable.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/virtualtable/TmfVirtualTable.java b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/virtualtable/TmfVirtualTable.java index 61ebda9fbb..e7599d6dfa 100644 --- a/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/virtualtable/TmfVirtualTable.java +++ b/org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/virtualtable/TmfVirtualTable.java @@ -429,9 +429,12 @@ public class TmfVirtualTable extends Composite { if (fSelectedEventRank < lastEventRank) { fSelectedEventRank++; selectedRow = fSelectedEventRank - fTableTopEventRank; - if (selectedRow >= fFullyVisibleRows) { + if (selectedRow == fFullyVisibleRows) { fTableTopEventRank++; needsRefresh = true; + } else if (selectedRow < fFrozenRowCount || selectedRow > fFullyVisibleRows) { + fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank)); + needsRefresh = true; } } break; @@ -442,9 +445,12 @@ public class TmfVirtualTable extends Composite { if (fSelectedEventRank > 0) { fSelectedEventRank--; selectedRow = fSelectedEventRank - fTableTopEventRank; - if (selectedRow < fFrozenRowCount && fTableTopEventRank > 0) { + if (selectedRow == fFrozenRowCount - 1 && fTableTopEventRank > 0) { fTableTopEventRank--; needsRefresh = true; + } else if (selectedRow < fFrozenRowCount || selectedRow > fFullyVisibleRows) { + fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank)); + needsRefresh = true; } } break; @@ -474,12 +480,15 @@ public class TmfVirtualTable extends Composite { fSelectedEventRank = lastEventRank; } selectedRow = fSelectedEventRank - fTableTopEventRank; - if (selectedRow > fFullyVisibleRows - 1) { + if (selectedRow > fFullyVisibleRows + fFrozenRowCount - 1 && selectedRow < 2 * fFullyVisibleRows) { fTableTopEventRank += fFullyVisibleRows; if (fTableTopEventRank > lastPageTopEntryRank) { fTableTopEventRank = lastPageTopEntryRank; } needsRefresh = true; + } else if (selectedRow < fFrozenRowCount || selectedRow >= 2 * fFullyVisibleRows) { + fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank)); + needsRefresh = true; } } break; @@ -493,12 +502,15 @@ public class TmfVirtualTable extends Composite { fSelectedEventRank = fFrozenRowCount; } selectedRow = fSelectedEventRank - fTableTopEventRank; - if (selectedRow < 0) { + if (selectedRow < fFrozenRowCount && selectedRow > -fFullyVisibleRows) { fTableTopEventRank -= fFullyVisibleRows; if (fTableTopEventRank < 0) { fTableTopEventRank = 0; } needsRefresh = true; + } else if (selectedRow <= -fFullyVisibleRows || selectedRow >= fFullyVisibleRows) { + fTableTopEventRank = Math.max(0, Math.min(fSelectedEventRank - fFrozenRowCount, lastPageTopEntryRank)); + needsRefresh = true; } } break; -- 2.34.1