1 /*******************************************************************************
2  * Copyright (c) 2018 Red Hat and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     Red Hat - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.swt.tests.gtk.snippets;
15 
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.graphics.Rectangle;
18 import org.eclipse.swt.layout.FillLayout;
19 import org.eclipse.swt.widgets.Button;
20 import org.eclipse.swt.widgets.Display;
21 import org.eclipse.swt.widgets.List;
22 import org.eclipse.swt.widgets.Shell;
23 import org.eclipse.swt.widgets.Table;
24 import org.eclipse.swt.widgets.TableItem;
25 import org.eclipse.swt.widgets.Tree;
26 import org.eclipse.swt.widgets.TreeItem;
27 
28 public class Bug305864_ListItemHeight {
29 
main(String[] args)30 	public static void main(String[] args) {
31 		testTree();
32 		testList();
33 		testTable();
34 	}
35 
testTree()36 	private static void testTree() {
37 		final Display display = new Display();
38 		final Shell shell = new Shell(display);
39 		FillLayout layout = new FillLayout(SWT.VERTICAL);
40 		shell.setLayout(layout);
41 
42 		final Tree tree = new Tree(shell, SWT.BORDER);
43 
44 		for (int i=0; i<32; i++) {
45 			TreeItem iItem = new TreeItem (tree, 0);
46 			iItem.setText ("TreeItem (1) -" + (i+1));
47 			for (int j=0; j<4; j++) {
48 				TreeItem jItem = new TreeItem (iItem, 0);
49 				jItem.setText ("TreeItem (2) -" + (j+1));
50 				for (int k=0; k<4; k++) {
51 					TreeItem kItem = new TreeItem (jItem, 0);
52 					kItem.setText ("TreeItem (3) -" + (k+1));
53 					for (int l=0; l<4; l++) {
54 						TreeItem lItem = new TreeItem (kItem, 0);
55 						lItem.setText ("TreeItem (4) -" + (l+1));
56 					}
57 				}
58 			}
59 		}
60 
61 		final Button button = new Button (shell, SWT.PUSH);
62 		button.setText("Visible Items []");
63 		button.addListener(SWT.Selection, e -> {
64 			Rectangle rect = tree.getClientArea();
65 			int itemHeight = tree.getItemHeight();
66 			double visibleCount = ((double) rect.height) / itemHeight;
67 			button.setText("Visible Items [" + Math.round(visibleCount) + "]");
68 		});
69 		shell.setSize(200, 250);
70 		shell.open();
71 		while (!shell.isDisposed()) {
72 			if (!display.readAndDispatch()) {
73 				display.sleep();
74 			}
75 		}
76 		display.dispose();
77 
78 
79 	}
testList()80 	private static void testList() {
81 		final Display display = new Display();
82 		final Shell shell = new Shell(display);
83 		FillLayout layout = new FillLayout(SWT.VERTICAL);
84 		shell.setLayout(layout);
85 
86 		final List list = new List(shell, SWT.BORDER | SWT.SINGLE | SWT.V_SCROLL);
87 		list.setData("name", "list");
88 
89 		for (int i = 0; i < 100; i++) {
90 			list.add("Item " + (i + 1) + " is quite long");
91 		}
92 
93 		final Button button = new Button (shell, SWT.PUSH);
94 		button.setText("Visible Items []");
95 		button.addListener(SWT.Selection, e -> {
96 			Rectangle rect = list.getClientArea();
97 			int itemHeight = list.getItemHeight();
98 			double visibleCount = ((double) rect.height) / itemHeight;
99 			button.setText("Visible Items [" + Math.round(visibleCount) + "]");
100 		});
101 		shell.setSize(200, 250);
102 		shell.open();
103 		while (!shell.isDisposed()) {
104 			if (!display.readAndDispatch()) {
105 				display.sleep();
106 			}
107 		}
108 		display.dispose();
109 	}
110 
testTable()111 	private static void testTable() {
112 		final Display display = new Display();
113 		final Shell shell = new Shell(display);
114 		FillLayout layout = new FillLayout(SWT.VERTICAL);
115 		shell.setLayout(layout);
116 		final Table table = new Table(shell, SWT.NONE);
117 		for (int i = 0; i < 32; i++) {
118 			TableItem item = new TableItem(table, SWT.NONE);
119 			item.setText("Item " + (i + 1) + " is quite long");
120 		}
121 		final Button button = new Button (shell, SWT.PUSH);
122 		button.setText("Visible Items []");
123 		button.addListener(SWT.Selection, e -> {
124 			Rectangle rect = table.getClientArea();
125 			int itemHeight = table.getItemHeight();
126 			int headerHeight = table.getHeaderHeight();
127 			double visibleCount = ((double) (rect.height - headerHeight)) / itemHeight;
128 			button.setText("Visible Items [" + Math.round(visibleCount) + "]");
129 		});
130 		shell.setSize(200, 250);
131 		shell.open();
132 		while (!shell.isDisposed()) {
133 			if (!display.readAndDispatch()) {
134 				display.sleep();
135 			}
136 		}
137 		display.dispose();
138 	}
139 
140 }
141