Bug 256889 [Viewers] [table] IAE (Index out of bounds) after selecting rows in virtual TableViewer
Steps to reproduce: - Load the attached snippet - Press button "Select all elements" The button's selection listener first calls table.selectAll(); and then loads the current selection of the TableViewer via tableViewer.getSelection(); --> Exception: Exception in thread "main" java.lang.IllegalArgumentException: Index out of bounds at org.eclipse.swt.SWT.error(SWT.java:3761) at org.eclipse.swt.SWT.error(SWT.java:3695) at org.eclipse.swt.SWT.error(SWT.java:3666) at org.eclipse.swt.widgets.Widget.error(Widget.java:463) at org.eclipse.swt.widgets.Table.getItem(Table.java:2262) at org.eclipse.jface.viewers.TableViewer.doGetItem(TableViewer.java:233) at org.eclipse.jface.viewers.AbstractTableViewer.getVirtualSelection(AbstractTableViewer.java:498) at org.eclipse.jface.viewers.AbstractTableViewer.getSelectionFromWidget(AbstractTableViewer.java:468) at org.eclipse.jface.viewers.StructuredViewer.getSelection(StructuredViewer.java:972) at VirtualTableTest$2.widgetSelected(VirtualTableTest.java:98) at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422) at VirtualTableTest.runTableTest(VirtualTableTest.java:162) at VirtualTableTest.main(VirtualTableTest.java:175)
bundles/org.eclipse.jface/src/org/eclipse/jface/viewers/AbstractTableViewer.java
}
			int requiredCount = doGetItemCount() - indices.length;
			Arrays.sort(indices);
			Object[] newCache = new Object[requiredCount];
			int indexInNewCache = 0;
			int nextToSkip = 0;
			for (int i = 0; i < cachedElements.length; i++) {
				if (nextToSkip < indices.length && i == indices[nextToSkip]) {
					nextToSkip++;
				} else {
					newCache[indexInNewCache++] = cachedElements[i];
				}
			}
			cachedElements = newCache;
		}
		/**
		 * The elements between the given indices (inclusive) need to be removed
		 * from the cache.
		 *
		 * @param from
		 * @param to
		 */
		public void removeIndicesFromTo(int from, int to) {
			int indexAfterTo = to + 1;
			Object[] newCache = new Object[cachedElements.length
					- (indexAfterTo - from)];
			System.arraycopy(cachedElements, 0, newCache, 0, from);
			if (indexAfterTo < cachedElements.length) {
				System.arraycopy(cachedElements, indexAfterTo, newCache, from,
						cachedElements.length - indexAfterTo);