Question

A 2-sash sashform. A 3-level TreeViewer in one and a TableViewer in the other. When it starts no item is selected in the TreeViewer and the TableViewer shows a list of all the first level objects available. To achieve this, the TreeViewerContainer instantiates the TableViewerContainer and then calls its showFirstLevelItemList( ) method :

public class TableViewerContainer {
private Table table;
private TableViewer tableViewer;
private TableColumnLayout layout;

public TableViewerContainer(SashForm sashForm) {

    Composite composite = new Composite(sashForm, SWT.NONE);
    composite.setLayout(new GridLayout(1, false));      
    tableViewer = new TableViewer(composite, SWT.BORDER
            | SWT.FULL_SELECTION);
    table = tableViewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);

    // Add TableColumnLayout
    layout = new TableColumnLayout();
    composite.setLayout(layout);
}

public void showFirstLevelItemList( FirstLevelItemListContainer obj ) {
    // Add the only column
    TableViewerColumn tableViewerColumn = new TableViewerColumn(
            tableViewer, SWT.NONE);
    TableColumn tblclmnFirst = tableViewerColumn.getColumn();

    layout.setColumnData(tblclmnFirst, new ColumnWeightData(10,
            ColumnWeightData.MINIMUM_WIDTH, false));

    tblclmnFirst.setText("Description");

    // assign providers and show the table 
    tableViewer.setLabelProvider(new FirstLevelItemLabelProvider());
    tableViewer.setContentProvider(new FirstLevelItemContentProvider());
    tableViewer.setInput(obj);      
} 

This works fine.

Next, selecting an item in the TreeViewer causes the tableViewer to update the data accordingly. To effect this I added a SelectionChangedListener():

treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
        public void selectionChanged(SelectionChangedEvent event) {
            IStructuredSelection selection = (IStructuredSelection) event
                    .getSelection();
            Object obj = selection.getFirstElement();
            if (obj instanceof firsLevelDetail ) {  
                FirstLevelDetail fld = (FirstLevelDetail) obj;
                tableViewer.showFirstLevelDetail(fld);               

            } else if (obj instanceof SecondLevelDetail )
                SecondLevelDetail sld = (SecondLevelDetail) obj;
                tableViewer.showSecondLevelDetail(sld);              

            else if (obj instanceof ThirdLevelDetail)
            ThirdLevelDetail tld = (ThirdLevelDetail) obj;
                tableViewer.showSecondLevelDetail(tld);
        }
    });`

So that when the user selects a firstLevelItem the TableViewer shows the corresponding data. All the methods called follow the following pattern :

private void showFirstLevelDetail( FirstLevelDetailObj obj ) {

    Table tbl = tableViewer.getTable();
    tbl.setRedraw(false);

    // Dispose former columns 
    while (tbl.getColumnCount() > 0) {
        tbl.getColumns()[0].dispose();
    }

    // add new columns  
    TableViewerColumn tableViewerColumn = new TableViewerColumn(
            tableViewer, SWT.NONE);
    TableColumn tblclmn = tableViewerColumn.getColumn();
    layout.setColumnData(tblclmn, new ColumnWeightData(1,
            ColumnWeightData.MINIMUM_WIDTH, true));
    tblclmn.setText("Code FL Item");

    tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
    tblclmn = tableViewerColumn.getColumn();
    layout.setColumnData(tblclmn, new ColumnWeightData(1,
            ColumnWeightData.MINIMUM_WIDTH, true));
    tblclmn.setText("Description FL Item");

    tbl.setRedraw(true);

    // to avoid an Exception 
    tableViewer.setInput(null);

    // Assign new providers and show the data
    tableViewer.setLabelProvider(new FirstLevelDetailLabelProvider());
    tableViewer.setContentProvider(new FirstLevelDetailContentProvider());
    tableViewer.setInput(obj);
}

The ContentProviders' getElements() methods follow the next patern:

public Object[] getElements(Object inputElement) {
return ((FirstLevelDetail)inputElement).getArrayItems();                
}

My problem is after this process the table doesn't show a header or any data until it is resized. Then it works normally until another item is selected, no matter what level the item is.

tableViewer.refresh() does not work.
tableViewer.getTable().redraw() does not work.

All the showXxxxLevelDetail () work properly if they are called in the first place, instead of showFirstLevelItemList() method, provided tableViewer.setInput(null) is commented out.

I'm running Eclipse Indigo, jface 3.8, Windows XP.

Était-ce utile?

La solution

I would try to call

composite.layout();

after calling any of those showXXXLevelDetail() methods.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top