Pages

2009-11-03

Sort SWT Table by a column reagardless the column count


Create a table, add columns and the following listener to each column:


private Listener TableSortListener(final Table table) {
            return new Listener() {
                public void handleEvent(Event e) {
                    TableItem[] items = table.getItems();
                    Collator collator = Collator.getInstance(Locale.getDefault());
                    TableColumn column = (TableColumn)e.widget;
                    int index = 0;
                   
                    // Get selected column
                    for(int i=0;i<table.getColumnCount();i++)
                         if(column == table.getColumn(i)) index=i;


                    // Set sort direction
                    int cmp =-1;         
                    if(table.getSortDirection() == SWT.UP) cmp = 1;
                   
                    for (int i = 1; i < items.length; i++) {
                        String value1 = items[i].getText(index);
                        for (int j = 0; j < i; j++){
                            String value2 = items[j].getText(index);
                            if (collator.compare(value1, value2) * cmp < 0) {
                                
                                 // Cache Strings
                                 String[] values = new String[table.getColumnCount()] ;
                                 for(int c=0;c<table.getColumnCount();c++) values[c] = items[i].getText(c);
        
                                // Cache Data & Images
                                String data = (String) items[i].getData();
                                org.eclipse.swt.graphics.Image image = items[i].getImage();
                               
                                // Redraw
                                items[i].dispose();
                                TableItem item = new TableItem(table, SWT.NONE, j);
                                item.setText(values);
                                item.setData(data);
                                item.setImage(image);
                               
                                items = table.getItems();
                                break;
                            }
                        }
                    }

                    table.setSortColumn(column);
                    table.setSortDirection((table.getSortDirection() == SWT.UP)? SWT.DOWN : SWT.UP);
                }
            };
        }

No comments:

Post a Comment