| /******************************************************************************* |
| * Copyright (c) 2004, 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jface.tests.viewers.interactive; |
| |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.jface.viewers.IContentProvider; |
| import org.eclipse.jface.viewers.ILazyContentProvider; |
| import org.eclipse.jface.viewers.Viewer; |
| import org.eclipse.ui.progress.UIJob; |
| |
| /** |
| * The LazyVirtualTableView is the VirtualTableView with lazy content. |
| */ |
| public class LazyDeferredVirtualTableView extends VirtualTableView { |
| |
| /** |
| * Create a new instance of the receiver. |
| */ |
| public LazyDeferredVirtualTableView() { |
| super(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#getContentProvider() |
| */ |
| protected IContentProvider getContentProvider() { |
| return new ILazyContentProvider() { |
| |
| int rangeStart = -1; |
| |
| int rangeEnd = -1; |
| |
| UIJob updateJob = new UIJob("Update") { |
| public IStatus runInUIThread(IProgressMonitor monitor) { |
| if(viewer.getControl().isDisposed()) |
| return Status.CANCEL_STATUS; |
| int rangeLength = rangeEnd - rangeStart; |
| for (int i = 0; i <= rangeLength; i++) { |
| int index = i + rangeStart; |
| viewer.replace("Element " + String.valueOf(index), |
| index); |
| } |
| |
| return Status.OK_STATUS; |
| } |
| }; |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.ILazyContentProvider#updateElements(int, |
| * int) |
| */ |
| public void updateElement(int index) { |
| |
| int begin = Math.max(0, index - 50); |
| int end = Math.min(begin + 50, 9999); |
| |
| // Initial case |
| if (rangeStart == -1 || rangeEnd == -1) { |
| rangeStart = begin; |
| rangeEnd = end; |
| updateJob.schedule(1000); |
| return; |
| } |
| |
| // Are we in the range already being worked on? |
| if (index >= rangeStart && index <= rangeEnd) |
| return; |
| |
| // Are we outside of the old range? |
| if (begin > rangeEnd || end < rangeStart) { |
| viewer.getTable().clear(rangeStart, rangeEnd); |
| rangeStart = begin; |
| rangeEnd = end; |
| updateJob.schedule(1000); |
| return; |
| } |
| |
| // Shift if it is before |
| if (begin < rangeStart) { |
| rangeStart = begin; |
| int oldEnd = rangeEnd; |
| rangeEnd = end; |
| viewer.getTable().clear(end + 1, oldEnd); |
| |
| updateJob.schedule(1000); |
| return; |
| } |
| |
| // Shift if it is after |
| if (end > rangeEnd) { |
| rangeEnd = end; |
| int oldStart = rangeStart; |
| rangeStart = begin; |
| viewer.getTable().clear(oldStart, rangeStart - 1); |
| updateJob.schedule(1000); |
| return; |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IContentProvider#dispose() |
| */ |
| public void dispose() { |
| // Do Nothing |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, |
| * java.lang.Object, java.lang.Object) |
| */ |
| public void inputChanged(Viewer viewer, Object oldInput, |
| Object newInput) { |
| // Do nothing. |
| } |
| }; |
| } |
| |
| /* (non-Javadoc) |
| * @see org.eclipse.jface.tests.viewers.interactive.VirtualTableView#resetInput() |
| */ |
| protected void resetInput() { |
| viewer.setItemCount(itemCount); |
| super.resetInput(); |
| } |
| } |