1 /*******************************************************************************
2 * Copyright (c) 2013 Association for Decentralized Information Management
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Semantum Oy - testcase for Simantics issue #3518 workaround
11 *******************************************************************************/
12 package org.simantics.utils.ui;
14 import java.awt.Frame;
15 import java.awt.event.WindowAdapter;
16 import java.awt.event.WindowEvent;
17 import java.lang.reflect.InvocationTargetException;
18 import java.lang.reflect.Method;
19 import java.util.Vector;
21 import javax.swing.JComponent;
22 import javax.swing.JScrollPane;
23 import javax.swing.JTable;
24 import javax.swing.SwingUtilities;
26 import org.eclipse.swt.SWT;
27 import org.eclipse.swt.awt.SWT_AWT;
28 import org.eclipse.swt.custom.CTabFolder;
29 import org.eclipse.swt.custom.CTabItem;
30 import org.eclipse.swt.layout.FillLayout;
31 import org.eclipse.swt.widgets.Composite;
32 import org.eclipse.swt.widgets.Control;
33 import org.eclipse.swt.widgets.Display;
34 import org.eclipse.swt.widgets.Event;
35 import org.eclipse.swt.widgets.Listener;
36 import org.eclipse.swt.widgets.Shell;
37 import org.eclipse.swt.widgets.TabFolder;
38 import org.eclipse.swt.widgets.TabItem;
41 * See Eclipse bug 377104 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=377104)
42 * for original patches and ideas for this testcase.
44 public class SWTAWTTest {
46 public static void main(String[] args) {
47 final Display display = Display.getDefault();
53 display.addFilter(SWT.Activate, new Listener() {
55 public void handleEvent(Event event) {
56 System.out.println("SWT.Activate: " + event.widget + " (" + System.identityHashCode(event.widget) + ")");
60 while (!display.isDisposed()) {
61 if (!display.readAndDispatch()) {
63 System.out.print(".");
68 private static void tryTabFolder() {
69 Shell shell = new Shell();
70 shell.setText("TabFolder");
71 shell.setLayout(new FillLayout());
72 TabFolder folder = new TabFolder(shell, SWT.NONE);
73 for (int i = 0; i < 2; i++) {
74 TabItem item = new TabItem(folder, SWT.NONE);
75 item.setText("#" + i);
76 item.setControl(openTable(folder));
78 folder.setSelection(0);
80 folder = new TabFolder(shell, SWT.NONE);
81 for (int i = 0; i < 2; i++) {
82 TabItem item = new TabItem(folder, SWT.NONE);
83 item.setText("#" + i);
84 item.setControl(openTable(folder));
86 folder.setSelection(0);
90 private static void tryCTabFolder() {
91 Shell shell = new Shell();
92 shell.setText("CTabFolder");
93 shell.setLayout(new FillLayout());
94 CTabFolder folder = new CTabFolder(shell, SWT.NONE);
95 for (int i = 0; i < 2; i++) {
96 CTabItem item = new CTabItem(folder, SWT.NONE);
97 item.setText("#" + i);
98 item.setControl(openTable(folder));
100 folder.setSelection(0);
102 folder = new CTabFolder(shell, SWT.NONE);
103 for (int i = 0; i < 2; i++) {
104 CTabItem item = new CTabItem(folder, SWT.NONE);
105 item.setText("#" + i);
106 item.setControl(openTable(folder));
108 folder.setSelection(0);
112 private static void trySideBySide() {
113 Shell shell = new Shell();
114 shell.setText("Side by Side (FillLayout)");
115 shell.setLayout(new FillLayout());
121 private static Control openTable(Composite outer) {
122 final Composite parent = new Composite(outer, SWT.EMBEDDED);
123 final Frame frame = SWT_AWT.new_Frame(parent);
124 final Display display = outer.getDisplay();
126 String ver = System.getProperty("java.version");
127 if (ver.startsWith("1.7") || ver.startsWith("1.8"))
129 frame.addWindowListener(new WindowAdapter()
132 public void windowActivated(WindowEvent e)
134 display.asyncExec(new Runnable()
139 if (display.getFocusControl() == parent)
142 Method m = Shell.class.getDeclaredMethod("setActiveControl", Control.class);
143 boolean accessible = m.isAccessible();
145 m.setAccessible(true);
146 m.invoke(parent.getShell(), parent);
148 m.setAccessible(false);
149 } catch (SecurityException e) {
151 } catch (NoSuchMethodException e) {
153 } catch (IllegalArgumentException e) {
155 } catch (IllegalAccessException e) {
157 } catch (InvocationTargetException e) {
158 e.getCause().printStackTrace();
167 SwingUtilities.invokeLater(new Runnable() {
169 //final InputContext input = frame.getInputContext();
170 frame.add(createTable());
177 private static JComponent createTable() {
178 /* Creating components */
179 int nrows = 1000, ncolumns = 10;
180 Vector<Vector<Object>> rows = new Vector<>();
181 for (int i = 0; i < nrows; i++) {
182 Vector<Object> row = new Vector<>();
183 for (int j = 0; j < ncolumns; j++) {
184 row.addElement("Item " + i + "-" + j);
186 rows.addElement(row);
188 Vector<Object> columns = new Vector<Object>();
189 for (int i = 0; i < ncolumns; i++) {
190 columns.addElement("Column " + i);
192 JTable table = new JTable(rows, columns);
193 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
194 table.createDefaultColumnsFromModel();
195 JScrollPane scrollPane = new JScrollPane(table);