[jbosstools-issues] [JBoss JIRA] (ERT-709) [GTK] Incorrect behaviour of tree rendering on GTK after removing paint listener [EBZ#294300]

Eric Williams (Jira) issues at jboss.org
Wed Feb 20 15:30:00 EST 2019


     [ https://issues.jboss.org/browse/ERT-709?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Williams reassigned ERT-709:
---------------------------------

      Sprint: devex #162 February 2019
    Assignee: Eric Williams


> [GTK] Incorrect behaviour of tree rendering on GTK after removing paint listener [EBZ#294300]
> ---------------------------------------------------------------------------------------------
>
>                 Key: ERT-709
>                 URL: https://issues.jboss.org/browse/ERT-709
>             Project: Eclipse Release Train
>          Issue Type: Task
>          Components: Platform
>            Reporter: Friendly Jira Robot
>            Assignee: Eric Williams
>            Priority: Major
>              Labels: SWT, bzira
>
> If I'd like to add custom paint listener to my tree and than remove it, sometimes all text disappear. Actually, the problem is text foreground == white after removing paint listener.
> Looks like the problem with Tree.drawForeground field: while custom rendering appear, Tree could cache this variable and then use invalid value when there are no custom painters (drawForeground value doesn't clear).
> Following example reproduce my problem. You need to select the last one item in the tree, check "Enable custom painter" and then uncheck it -- all text will be white:
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.events.SelectionAdapter;
> import org.eclipse.swt.events.SelectionEvent;
> import org.eclipse.swt.graphics.Color;
> import org.eclipse.swt.graphics.GC;
> import org.eclipse.swt.graphics.Image;
> import org.eclipse.swt.graphics.Rectangle;
> import org.eclipse.swt.graphics.TextLayout;
> import org.eclipse.swt.layout.GridData;
> import org.eclipse.swt.layout.GridLayout;
> import org.eclipse.swt.widgets.Button;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Event;
> import org.eclipse.swt.widgets.Listener;
> import org.eclipse.swt.widgets.Shell;
> import org.eclipse.swt.widgets.Tree;
> import org.eclipse.swt.widgets.TreeItem;
> public class TreePainter implements Listener {
> 	private Tree tree;
> 	private TextLayout textLayout;
> 	TreePainter(Tree tree) {
> 		this.tree = tree;
> 	}
> 	public void setListeners(boolean add) {
> 		if (add) {
> 			tree.addListener(SWT.EraseItem, this);
> 			tree.addListener(SWT.PaintItem, this);
> 		} else {
> 			tree.removeListener(SWT.EraseItem, this);
> 			tree.removeListener(SWT.PaintItem, this);
> 		}
> 		redraw();
> 	}
> 	@Override
> 	public void handleEvent(Event event) {
> 		switch (event.type) {
> 		case SWT.PaintItem:
> 			paint(event);
> 			break;
> 		case SWT.EraseItem:
> 			erase(event);
> 			break;
> 		}
> 	}
> 	private void erase(Event event) {
> 		event.detail &= ~(SWT.BACKGROUND | SWT.FOREGROUND | SWT.SELECTED | SWT.HOT);
> 	}
> 	private void paint(Event event) {
> 		TreeItem item = (TreeItem) event.item;
> 		GC gc = event.gc;
> 		// remember colors to restore the GC later
> 		Color oldForeground = gc.getForeground();
> 		Color oldBackground = gc.getBackground();
> 		int index = event.index;
> 		Color foreground = item.getForeground(index);
> 		if (foreground != null) {
> 			gc.setForeground(foreground);
> 		}
> 		Color background = item.getBackground(index);
> 		if (background != null) {
> 			gc.setBackground(background);
> 		}
> 		if ((event.detail & SWT.SELECTED) != 0) {
> 			gc.fillRectangle(item.getBounds(index));
> 		}
> 		Image image = item.getImage(index);
> 		if (image != null) {
> 			Rectangle imageBounds = item.getImageBounds(index);
> 			if (imageBounds != null) {
> 				Rectangle bounds = image.getBounds();
> 				// center the image in the given space
> 				int x = imageBounds.x
> 						+ Math.max(0, (imageBounds.width - bounds.width) / 2);
> 				int y = imageBounds.y
> 						+ Math.max(0, (imageBounds.height - bounds.height) / 2);
> 				gc.drawImage(image, x, y);
> 			}
> 		}
> 		Rectangle textBounds = item.getTextBounds(index);
> 		if (textBounds != null) {
> 			TextLayout layout = getTextLayout();
> 			layout.setText(item.getText(index));
> 			layout.setFont(item.getFont(index));
> 			Rectangle layoutBounds = layout.getBounds();
> 			int x = textBounds.x;
> 			int avg = (textBounds.height - layoutBounds.height) / 2;
> 			int y = textBounds.y + Math.max(0, avg);
> 			layout.draw(gc, x, y);
> 		}
> 		gc.setForeground(oldForeground);
> 		gc.setBackground(oldBackground);
> 	}
> 	public void redraw() {
> 		Rectangle rect = tree.getClientArea();
> 		tree.redraw(rect.x, rect.y, rect.width, rect.height, true);
> 	}
> 	private TextLayout getTextLayout() {
> 		if (textLayout == null) {
> 			int orientation = tree.getStyle()
> 					& (SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT);
> 			textLayout = new TextLayout(tree.getDisplay());
> 			textLayout.setOrientation(orientation);
> 		} else {
> 			textLayout.setText("");
> 		}
> 		return textLayout;
> 	}
> 	public static void main(String[] args) {
> 		Display display = new Display();
> 		Shell shell = new Shell(display);
> 		shell.setBounds(10, 10, 800, 600);
> 		shell.setLayout(new GridLayout());
> 		final Tree tree = new Tree(shell, SWT.BORDER);
> 		tree.setLinesVisible(true);
> 		for (int i = 0; i < 5; i++) {
> 			TreeItem item = new TreeItem(tree, SWT.NONE);
> 			item.setText("item " + i);
> 			for (int j = 0; j < 5; j++) {
> 				TreeItem child = new TreeItem(item, SWT.NONE);
> 				child.setText("item " + i + "-" + j);
> 			}
> 		}
> 		tree.setLayoutData(new GridData(GridData.FILL_BOTH));
> 		final TreePainter painer = new TreePainter(tree);
> 		final Button button = new Button(shell, SWT.CHECK);
> 		button.setText("Enable custom painter");
> 		button.addSelectionListener(new SelectionAdapter() {
> 			@Override
> 			public void widgetSelected(SelectionEvent e) {
> 				painer.setListeners(button.getSelection());
> 			}
> 		});
> 		shell.open();
> 		while (!shell.isDisposed()) {
> 			if (!display.readAndDispatch())
> 				display.sleep();
> 		}
> 		display.dispose();
> 	}
> }



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the jbosstools-issues mailing list