I have a JFace TreeViewer
with a SWT Tree
underlaying and I am painting my cells for multiple row support for myself. Currently, it looks like this:
I want both the expand icon and the label to be lowered like this:
This is no problem for the label because I am extending from StyledCellLabelProvider
and am overwriting paint()
and measure()
- the problem is that I have no clue if its possible to set the Y Coordinate for the Expand Icon. I'm afraid it isn't.. If so, I would like to paint a custom expand icon for myself, too, but there's another point then: Is it possible to completely vanish the native expand icon? I tried this in both the measure()
and paint()
method, but it didn't worked:
event.detail &= ~SWT.FOREGROUND;
I just added simple paint method on Tree. this should help you to get the direction
public class Snippet {public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
shell.setLayout(new FillLayout());
final Tree tree = new Tree (shell, SWT.BORDER);
for (int i=0; i<4; i++) {
TreeItem iItem = new TreeItem (tree, 0);
iItem.setText ("TreeItem (0) -" + i);
for (int j=0; j<4; j++) {
TreeItem jItem = new TreeItem (iItem, 0);
jItem.setText ("TreeItem (1) -" + j);
for (int k=0; k<4; k++) {
TreeItem kItem = new TreeItem (jItem, 0);
kItem.setText ("TreeItem (2) -" + k);
for (int l=0; l<4; l++) {
TreeItem lItem = new TreeItem (kItem, 0);
lItem.setText ("TreeItem (3) -" + l);
}
}
}
}
tree.addListener(SWT.PaintItem, new Listener() {
@Override
public void handleEvent(Event event) {
GC gc = event.gc;
TreeItem item = (TreeItem) event.item;
Tree tree = (Tree) event.widget;
Rectangle rect = tree.getClientArea();
Rectangle bounds = item.getBounds();
/**
* expand/collapse native control bounds
*/
TreeItem parentItem= item.getParentItem();
Rectangle ecb = null;
if(parentItem != null){
Rectangle pBounds = parentItem.getBounds();
ecb = new Rectangle(pBounds.x, bounds.y, Math.abs(pBounds.x-bounds.x), bounds.height);
}
else
{
ecb = new Rectangle(rect.x, bounds.y, Math.abs(rect.x-bounds.x), bounds.height);
}
gc.setAlpha(200);
/**
* paint image in this bounds depending on state
* testing purpose: filling background
*/
if(item.getExpanded()){
gc.setBackground(event.display.getSystemColor(SWT.COLOR_RED));
gc.fillRectangle(ecb.x,ecb.y,ecb.width,ecb.height);
}
else
{
gc.setBackground(event.display.getSystemColor(SWT.COLOR_CYAN));
gc.fillRectangle(ecb.x,ecb.y,ecb.width,ecb.height);
}
}
});
shell.setSize (200, 200);
shell.open ();
while (!shell.isDisposed()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
}
you need to draw your expand / collapse images instead filling background