Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 2ccdc3e1715e583cb666e7304f7a897f181c4695 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*******************************************************************************
 * Copyright (c) 2018 Red Hat and others. All rights reserved.
 * The contents of this file are made available under the terms
 * of the GNU Lesser General Public License (LGPL) Version 2.1 that
 * accompanies this distribution (lgpl-v21.txt).  The LGPL is also
 * available at http://www.gnu.org/licenses/lgpl.html.  If the version
 * of the LGPL at http://www.gnu.org is different to the version of
 * the LGPL accompanying this distribution and there is any conflict
 * between the two license versions, the terms of the LGPL accompanying
 * this distribution shall govern.
 *
 * Contributors:
 *     Red Hat - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.tests.gtk.snippets;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

/*
 * Title: Bug 528155: [GTK] Table/Tree forgets to set SWT.SELECTED bit on PaintItem
 * How to run: launch snippet and click the first row of either Table/Tree widget
 * Bug description: The red selection foreground color is not displayed for either Table/Tree
 * Expected results: The selected items of each widget should have a red foreground color
 * GTK Version(s): GTK2, GTK3
 */
public class Bug528155_TableTreeForegroundDrawing {

	public static void main(String[] args) {
		final Display display = new Display();

		final Shell shell = new Shell(display);
		shell.setLayout(new FillLayout());

		final Color defaultBack = display.getSystemColor(SWT.COLOR_YELLOW);
		final Color defaultFore = display.getSystemColor(SWT.COLOR_DARK_GRAY);
		final Color selectionBack = display.getSystemColor(SWT.COLOR_BLUE);
		final Color selectionBackUnfocused = display.getSystemColor(SWT.COLOR_GRAY);
		final Color selectionFore = display.getSystemColor(SWT.COLOR_RED);

		final Tree tree = new Tree(shell, SWT.BORDER);
		tree.setBackground(defaultBack);
		tree.setForeground(defaultFore);
		final Listener treeListener = event -> {
			if (event.type == SWT.MeasureItem) {
				event.width = 50;
			}
			else if (event.type == SWT.EraseItem) {
				if ((event.detail & SWT.SELECTED) != 0) {
					event.gc.setBackground(tree.isFocusControl() ? selectionBack : selectionBackUnfocused);
					event.gc.fillRectangle(event.x, event.y, event.width, event.height);
					event.detail &= ~SWT.SELECTED;
				}
			}
			else if (event.type == SWT.PaintItem) {
				if ((event.detail & SWT.SELECTED) != 0) {
					event.gc.setForeground(selectionFore);
				}
				event.gc.drawString("Node " + event.index, event.x, event.y, true);
			}
		};
		tree.addListener(SWT.MeasureItem, treeListener);
		tree.addListener(SWT.EraseItem, treeListener);
		tree.addListener(SWT.PaintItem, treeListener);

		new TreeItem(tree, SWT.NONE);
		new TreeItem(tree, SWT.NONE);

		final Table table = new Table(shell, SWT.BORDER | SWT.VIRTUAL);
		table.setBackground(defaultBack);
		table.setForeground(defaultFore);
		table.setHeaderVisible(true);

		final TableColumn column = new TableColumn(table, SWT.LEFT);
		column.setText("Column 1");
		column.setWidth(400);

		final Listener tableListener = event -> {
			if (event.type == SWT.MeasureItem) {
				event.width = 50;
			}
			else if (event.type == SWT.EraseItem) {
				if ((event.detail & SWT.SELECTED) != 0) {
					event.gc.setBackground(table.isFocusControl() ? selectionBack : selectionBackUnfocused);
					event.gc.fillRectangle(event.x, event.y, event.width, event.height);
//						cachedDetail = event.detail;
					event.detail &= ~SWT.SELECTED;
				}
			}
			else if (event.type == SWT.PaintItem) {
//					if ((cachedDetail & SWT.SELECTED) != 0) {
				if ((event.detail & SWT.SELECTED) != 0) {
					event.gc.setForeground(selectionFore);
				}
				event.gc.drawString("Row " + event.index, event.x, event.y, true);
			}
			else if (event.type == SWT.SetData) {
			}
		};
		table.addListener(SWT.SetData, tableListener);
		table.addListener(SWT.MeasureItem, tableListener);
		table.addListener(SWT.EraseItem, tableListener);
		table.addListener(SWT.PaintItem, tableListener);

		table.setItemCount(2);

		shell.setSize(500, 400);
		shell.open();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}

		display.dispose();
	}
}

Back to the top