Search code examples
buttonjfacetableviewer

JFace button in TableViewerColumn


Is it possible to have a button in a TableViewerColumn? There are several posts that confirm this, but I've found no code that actually works. I've read about a DialogCellEditor, too, is that what to look into?

Regards, Marcus


Solution

  • As this seems to be a common problem, I've tried a workaround. I use an image as label and add editing support like so:

            col = createTableViewerColumn(titles[10], bounds[10], 10);
        col.setEditingSupport(new DeleteSupport(viewer));
        col.setLabelProvider(new ColumnLabelProvider() {
            @Override
            public Image getImage(Object element) {
                return new Image(ApplicationRunner.getApp().getShell()
                        .getDisplay(), "ressources/images/delete.png");
            }
    
            @Override
            public String getText(Object element) {
                return "";
            }
        });
    

    In the DeleteSupport class (extending EditingSupport), you have to let canEdit() return false, so the image is not selectable. But then, you can't work with getValue(). So, I do whatever I have to in canEdit() BEFORE returning false. That's the same behavior as a simple push button would have.

    The DeleteSupport looks like this:

    public class DeleteSupport extends EditingSupport {
    
    private final TableViewer viewer;
    
    public DeleteSupport(TableViewer viewer) {
        super(viewer);
        this.viewer = viewer;
    }
    
    @Override
    protected CellEditor getCellEditor(Object element) {
        return new TextCellEditor(viewer.getTable());
    }
    
    @Override
    protected boolean canEdit(Object element) {
    
                // if confirmed, try to delete the customer
        if (MessageDialog.openConfirm(  ApplicationRunner.getApp().getShell(),
                        "Confirm delete",
                        "Soll " + ((Customer) element).getFirstname()
                        + " " + ((Customer) element).getLastname()
                        + " be deleted? Cannot be undone!")) {
    
            try {
                CustomerDAO.getInstance().delete(((Customer) element).getId());
            } catch (SQLException e) {
                // TODO something
            }
        }
    
                // reload anyways
        try {
            viewer.setInput(CustomerDAO.getInstance().getAll());
        } catch (SQLException e) {
            // TODO something else
        }
        viewer.refresh();
    
        return false;
    }
    
    @Override
    protected Object getValue(Object element) {
        return "";
    }
    
    @Override
    protected void setValue(Object element, Object value) {
    }
    

    }