----------------------------------------- | prop1 | val1 | ----------------------------------------- | prop1 | val2 | ----------------------------------------- | prop3 | < image > | -----------------------------------------
----------------------------------------- | prop1 | val1 | ----------------------------------------- | prop1 | val2 | ----------------------------------------- | prop3 | < image > | -----------------------------------------
TableViewer viewer = new TableViewer(...); Table table = viewer.getTable(); Listener paintListener = new Listener() { public void handleEvent(Event event) { sitch (event.type) { case SWT.EraseItem: // I need to fixe only the second column (index=1) // when there is no image. if (event.index == 1 && item.getImage(1)==null) { // Don't make native painting of the foreground we will take care // of it. at the reception of the SWT.PaintEvent event.detail &= ~SWT.FOREGROUND; } break; case SWT.Paint: if (event.index == 1 && item.getImage(1)==null) { // Draw the text where the image is expected. event.gc.drawString(item.getText(), item.getImageBounds(1).x, item.getImageBounds(1).y); } break; } } } table.addListener(SWT.EraseItem,paintListener); table.addListener(SWT.PaintItem,paintListener);
valueColumn.setLabelProvider(new OwnerDrawLabelProvider() { @Override public void update(ViewerCell cell) { ReadoutEntry entry = (ReadoutEntry) cell.getElement(); cell.setText(entry.getStringValue()); cell.setImage(entry.getImageValue(Display.getDefault())); } @Override protected void paint(Event event, Object element) { ReadoutEntry entry = (ReadoutEntry) element; GC gc = event.gc; Table table = (Table) event.widget; int width = table.getColumn(0).getWidth(); if (entry.getImageValue(table) != null) { gc.drawImage(entry.getImageValue(Display.getDefault()), width + 2, event.y + 2); } else { gc.drawText(entry.getStringValue(), width + 2, event.y + 2, true); } } @Override protected void erase(Event event, Object element) { event.detail &= ~SWT.FOREGROUND; } @Override protected void measure(Event event, Object element) { } });
valueColumn.setLabelProvider(new OwnerDrawLabelProvider() { // Don't even think on update!!!! /** * Paint an image or text as required. I never need to paint both. */ @Override protected void paint(Event event, Object element) { Contact entry = (Contact) element; GC gc = event.gc; Table table = (Table) event.widget; int width = table.getColumn(0).getWidth(); if (entry.getImageValue(table) != null) { gc.drawImage(entry.getImageValue(), width + 2, event.y + 2); } else { gc.drawText(entry.getStringValue(), width + 2, event.y + 2, true); } } // Forget erase. As I don't fill the cell I don't need to signal that // I will draw the contents myself. /** * Images are normally taller that text so I need to adjust the height * before painting. */ @Override protected void measure(Event event, Object element) { Contact entry = (Contact) element; Image image = entry.getImageValue(); if (image!=null) { event.height=image.getBounds().height; } } });