private static class ListOfGoodsTypesColumnLabelProvider extends ColumnLabelProvider { private static final long serialVersionUID = 3822851008869376774L; private String propertyName; private IRedeemSubmitCallback callback; private boolean pendingRefresh; private final List TABLE_EDITORS = new LinkedList(); private final NumberFormat NUMBERFORMATTER = NumberFormat.getIntegerInstance(); private ListOfGoodsTypesColumnLabelProvider(String propertyName, IRedeemSubmitCallback callback) { this.propertyName = propertyName; this.callback = callback; NUMBERFORMATTER.setGroupingUsed(true); } @Override public void update(ViewerCell cell) { final TableItem item = (TableItem) cell.getItem(); final Table table = item.getParent(); final int column = cell.getColumnIndex(); //TODO: When changing pages, all TableEditor needs to be disposed & redrawn if (pendingRefresh) { if (TABLE_EDITORS.size() > 0) { for (TableEditor tableEditor : TABLE_EDITORS) { if (tableEditor.getEditor() != null) tableEditor.getEditor().dispose(); tableEditor.dispose(); } TABLE_EDITORS.clear(); } pendingRefresh = false; } if (FIELD_REDEEMABLE.equalsIgnoreCase(propertyName) && ((GoodsView)cell.getElement()).getBalance() > 0) { TableEditor tableEditor = new TableEditor(table); tableEditor.grabHorizontal = true; Button button = new Button(table, SWT.FLAT); button.setText("Redeem"); button.addSelectionListener ( new SelectionListener() { private static final long serialVersionUID = -1566441291539945860L; @Override public void widgetSelected(SelectionEvent event) { //TODO: Add codes here } @Override public void widgetDefaultSelected(SelectionEvent event){} } ); tableEditor.setEditor(button, item, column); TABLE_EDITORS.add(tableEditor); } super.update(cell); } @Override public String getText(Object element) { if (FIELD_GOODS_TYPE_ID.equals(propertyName)) return ((GoodsView)element).getGoodsTypeId(); else if (FIELD_GOODS_NAME.equals(propertyName)) return ((GoodsView)element).getName(); else if (FIELD_REDEEM_POINTS.equals(propertyName)) return NUMBERFORMATTER.format(((GoodsView)element).getRedeemPoints()); else if (FIELD_BALANCE.equals(propertyName)) return NUMBERFORMATTER.format(((GoodsView)element).getBalance()); else if (FIELD_REDEEMABLE.equals(propertyName)) return ((GoodsView)element).getBalance() > 0 ? "Redeem" : "N/A"; return ""; } private void refresh(){this.pendingRefresh = true;} }