Problems with checked elements in CheckboxTableViewer based on virtual table [message #546255] |
Mon, 12 July 2010 10:05 |
Ilya Messages: 1 Registered: July 2010 |
Junior Member |
|
|
Recently I switched on using virtual table (with flag SWT.VIRTUAL) to speed up creating, updating, etc. rows. Content provider implements IStructuredContentProvider.
I noticed two bugs (well, probably, bugs) which I would like to discuss and find workaround. You can reproduce these bugs very easily using posted snippet. It was taken from JFace snippets and modified.
1. If you programmatically select rows in CheckboxTableViewer (using its method setAllChecked) and try to scroll down, rows are displayed as empty. Click "Select/Deselect All" and scroll down table.
2. If again programmatically select rows using its method setAllChecked, then try to get selected data objects using getCheckedElements, some of data objects are nulls, but shouldn`t be as it corrupts method contract. Click "Select/Deselect All", click "Null Rows" and message with number of rows with null data objects will be displayed.
Did anybody met same problems? How did you solve it?
P.S. In my project I need to have table component which works fast with huge number of rows, supports rows sorting and filtering and has checkboxes in rows. Probably, there are any third-party table components with listed properties?
package org.eclipse.jface.snippets.viewers;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
/**
* A simple TableViewer to demonstrate the usage of a standard content provider
* with a virtual table
*
* @author Tom Schindl <tom.schindl@bestsolution.at>
*
*/
public class Snippet029VirtualTableViewer {
private class MyContentProvider implements IStructuredContentProvider {
private MyModel[] elements;
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
*/
public Object[] getElements(Object inputElement) {
return elements;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
public void dispose() {
}
/*
* (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) {
this.elements = (MyModel[]) newInput;
}
}
public class MyModel {
public int counter;
public MyModel(int counter) {
this.counter = counter;
}
@Override
public String toString() {
return "Item " + this.counter;
}
}
public Snippet029VirtualTableViewer(final Shell shell) {
Table table = new Table(shell, SWT.CHECK | SWT.FULL_SELECTION | SWT.VIRTUAL);
final CheckboxTableViewer v = new CheckboxTableViewer(table);
v.setLabelProvider(new LabelProvider());
v.setContentProvider(new MyContentProvider());
v.setUseHashlookup(true);
MyModel[] model = createModel();
v.setInput(model);
v.getTable().setLinesVisible(true);
Button b = new Button(shell, SWT.PUSH);
b.setText("Select/Deselect All");
b.addSelectionListener(new SelectionAdapter() {
private boolean selectionState = true;
@Override
public void widgetSelected(SelectionEvent e) {
v.setAllChecked(selectionState);
selectionState = !selectionState;
}
});
Button b2 = new Button(shell, SWT.PUSH);
b2.setText("Null Rows");
b2.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
Object[] checked = v.getCheckedElements();
int nullRows = 0;
for (int i = 0; i < checked.length; i++) {
if (null == checked[i]) {
nullRows++;
}
}
if (nullRows > 0)
MessageDialog.openError(shell, "Rows data objects", "Number of rows with null data: " + nullRows);
else
MessageDialog.openInformation(shell, "Rows data objects", "No null data");
}
});
}
private MyModel[] createModel() {
MyModel[] elements = new MyModel[10000];
for (int i = 0; i < 10000; i++) {
elements[i] = new MyModel(i);
}
return elements;
}
/**
* @param args
*/
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
new Snippet029VirtualTableViewer(shell);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
|
|
|
|
Powered by
FUDForum. Page generated in 0.03144 seconds