On a new project I started use SWT/JFace for a desktop app. This is for a standalone application not an Eclipse RCP app. I've built out a few parts and I currently have a TabFolder that is not working properly.
When this component is created, it holds a TabFolder, that tabs will be added to. Each tab holds a TableViewer. It all seems to be working but I have an annoying issue that I can't seem to get right.
When the tab is added it opens and the tab content area is blank. Resizing the screen causes the tab's TableViewer to appear as expected filling the tab. I've tried setting focus, redraw, update, pack. Nothing seems to cause it to properly appear until resizing the shell. I also have this constant output of a warning that I'm not sure if its related.
(SWT:121939): Gtk-WARNING **: 17:13:42.617: Negative content width -2 (allocation 15, extents 8x9) while allocating gadget (node button, owner GtkButton)
Any ideas why I can't get it to properly display the table viewer when it displays the tab?
public class RegistryTabView extends Composite {
private static final int[] COLUMN_SIZES = { 15, 90, 55, 175, 125, 150, 75, 75, 75 };
private static final String[] COLUMN_TITLES = { " ", "Date", "#", "Payee", "Memo", "Category", "Credit", "Debit" };
private AccountService accountService;
private CategoryService categoryService;
private TabFolder tabFolder;
private Map<String, TabItem> tabs;
private TransactionService transactionService;
public RegistryTabView(Composite parent, AccountService accountService, CategoryService categoryService, TransactionService transactionService) {
super(parent, SWT.NONE);
this.accountService = accountService;
this.transactionService = transactionService;
this.categoryService = categoryService;
tabs = new HashMap<>();
setLayout(new FillLayout());
tabFolder = new TabFolder(this, SWT.BORDER);
tabFolder.setLayout(new FillLayout());
}
protected TableViewerColumn createColumn(TableViewer viewer, String label, int width)
{
final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, width);
final TableColumn column = viewerColumn.getColumn();
column.setText(label);
column.setMoveable(false);
column.setResizable(true);
column.setWidth(width);
return viewerColumn;
}
public void openAccountRegistry(AccountEntity account) {
TabItem tab = tabs.get(account.getName());
if (tab != null) {
tabFolder.setSelection(tab);
} else {
tab = new TabItem(tabFolder, SWT.TOP);
tab.setText(account.getName());
tabs.put(account.getName(), tab);
final TableViewer viewer = new TableViewer(tabFolder);
viewer.setContentProvider(new RegistryContentProvider());
viewer.getTable().setHeaderVisible(true);
viewer.getTable().setLinesVisible(true);
// Status
int counter = 0;
TableViewerColumn column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
final StatusTypeEntity state = ((AccountTransactionEntity) element).getState();
return super.getText(state == null ? "" : state.getName());
}
});
// Date
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
final Long enteredDate = ((AccountTransactionEntity) element).getEnterDate();
if (enteredDate == null) {
return super.getText(format.format(new Date()));
}
return super.getText(format.format(new Date(enteredDate)));
}
});
// Check number
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return super.getText(((AccountTransactionEntity) element).getCheckNumber());
}
});
// Payee
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return super.getText(((AccountTransactionEntity) element).getPayee());
}
});
// Memo
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return super.getText(((AccountTransactionEntity) element).getMemo());
}
});
// Category
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
return CategoryService.getCategoryName(((AccountTransactionEntity) element).getCategory());
}
});
// Credit
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
final AccountTransactionEntity entity = (AccountTransactionEntity) element;
final TransactionTypeEntity transactionType = entity.getType();
Double value = 0.0;
final NumberFormat formatter = NumberFormat.getCurrencyInstance();
if (transactionType != null && transactionType.getId() == 2) {
value = ((AccountTransactionEntity) element).getAmount();
}
return formatter.format(value);
}
});
// Debit
counter++;
column = createColumn(viewer, COLUMN_TITLES[counter], COLUMN_SIZES[counter]);
column.setLabelProvider(new ColumnLabelProvider() {
@Override
public String getText(Object element) {
final AccountTransactionEntity entity = (AccountTransactionEntity) element;
final TransactionTypeEntity transactionType = entity.getType();
Double value = 0.0;
final NumberFormat formatter = NumberFormat.getCurrencyInstance();
if (transactionType != null && transactionType.getId() == 1) {
value = ((AccountTransactionEntity) element).getAmount();
}
return formatter.format(value);
}
});
final List<AccountTransactionEntity> transactions = transactionService.getTransactions(account.getId(), 0l,
150);
transactions.add(new AccountTransactionEntity());
viewer.setInput(transactions);
tab.setControl(viewer.getTable());
tabFolder.setSelection(tab);
viewer.getTable().forceFocus();
}
}
}