package com.onpositive.commons.ui.viewers;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.widgets.Display;
public class DeferedContentProvider implements ITreeContentProvider {
private final ITreeContentProvider parent;
private int limit = 300;
private TreeViewer viewer;
public DeferedContentProvider(ITreeContentProvider parent) {
this.parent = parent;
}
public Object[] getChildren(Object parentElement) {
return parent.getChildren(parentElement);
}
public Object getParent(Object element) {
return parent.getParent(element);
}
public boolean hasChildren(Object element) {
return parent.hasChildren(element);
}
public Object[] getElements(Object inputElement) {
Object[] elements = parent.getElements(inputElement);
ViewerSorter sorter = viewer.getSorter();
if (sorter!=null){
sorter.sort(viewer, elements);
}
if (elements.length > limit) {
final Object[][] newElements = new Object[elements.length / limit
+ (elements.length % limit == 0 ? 0 : 1)][];
for (int b = 0; b < newElements.length; b++) {
if (b == newElements.length - 1 && elements.length % limit != 0) {
newElements[b] = new Object[elements.length % limit];
} else {
newElements[b] = new Object[limit];
}
}
for (int a = 0; a < elements.length; a++) {
newElements[a / limit][a % limit] = elements[a];
}
for (int b = 1; b < newElements.length; b++) {
final int index = b;
Display.getCurrent().timerExec(b * 100, new Runnable() {
public void run() {
if (viewer.getContentProvider() == DeferedContentProvider.this
&& !viewer.getTree().isDisposed()) {
viewer.getControl().setRedraw(false);
try {
viewer.add(viewer.getInput(),
newElements[index]);
} finally {
viewer.getControl().setRedraw(true);
}
}
}
});
}
return newElements[0];
}
return elements;
}
public void dispose() {
parent.dispose();
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
parent.inputChanged(viewer, oldInput, newInput);
this.viewer = (TreeViewer) viewer;
}
public IContentProvider getBase() {
return parent;
}
}