--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2013 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Semantum Oy - testcase for Simantics issue #3518 workaround
+ *******************************************************************************/
+package org.simantics.utils.ui;
+
+import java.awt.Frame;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.SwingUtilities;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.awt.SWT_AWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+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.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+
+/**
+ * See Eclipse bug 377104 (https://bugs.eclipse.org/bugs/show_bug.cgi?id=377104)
+ * for original patches and ideas for this testcase.
+ */
+public class SWTAWTTest {
+
+ public static void main(String[] args) {
+ final Display display = Display.getDefault();
+
+ tryCTabFolder();
+ tryTabFolder();
+ trySideBySide();
+
+ display.addFilter(SWT.Activate, new Listener() {
+ @Override
+ public void handleEvent(Event event) {
+ System.out.println("SWT.Activate: " + event.widget + " (" + System.identityHashCode(event.widget) + ")");
+ }
+ });
+
+ while (!display.isDisposed()) {
+ if (!display.readAndDispatch()) {
+ display.sleep();
+ System.out.print(".");
+ }
+ }
+ }
+
+ private static void tryTabFolder() {
+ Shell shell = new Shell();
+ shell.setText("TabFolder");
+ shell.setLayout(new FillLayout());
+ TabFolder folder = new TabFolder(shell, SWT.NONE);
+ for (int i = 0; i < 2; i++) {
+ TabItem item = new TabItem(folder, SWT.NONE);
+ item.setText("#" + i);
+ item.setControl(openTable(folder));
+ }
+ folder.setSelection(0);
+
+ folder = new TabFolder(shell, SWT.NONE);
+ for (int i = 0; i < 2; i++) {
+ TabItem item = new TabItem(folder, SWT.NONE);
+ item.setText("#" + i);
+ item.setControl(openTable(folder));
+ }
+ folder.setSelection(0);
+ shell.open();
+ }
+
+ private static void tryCTabFolder() {
+ Shell shell = new Shell();
+ shell.setText("CTabFolder");
+ shell.setLayout(new FillLayout());
+ CTabFolder folder = new CTabFolder(shell, SWT.NONE);
+ for (int i = 0; i < 2; i++) {
+ CTabItem item = new CTabItem(folder, SWT.NONE);
+ item.setText("#" + i);
+ item.setControl(openTable(folder));
+ }
+ folder.setSelection(0);
+
+ folder = new CTabFolder(shell, SWT.NONE);
+ for (int i = 0; i < 2; i++) {
+ CTabItem item = new CTabItem(folder, SWT.NONE);
+ item.setText("#" + i);
+ item.setControl(openTable(folder));
+ }
+ folder.setSelection(0);
+ shell.open();
+ }
+
+ private static void trySideBySide() {
+ Shell shell = new Shell();
+ shell.setText("Side by Side (FillLayout)");
+ shell.setLayout(new FillLayout());
+ openTable(shell);
+ openTable(shell);
+ shell.open();
+ }
+
+ private static Control openTable(Composite outer) {
+ final Composite parent = new Composite(outer, SWT.EMBEDDED);
+ final Frame frame = SWT_AWT.new_Frame(parent);
+ final Display display = outer.getDisplay();
+
+ String ver = System.getProperty("java.version");
+ if (ver.startsWith("1.7") || ver.startsWith("1.8"))
+ {
+ frame.addWindowListener(new WindowAdapter()
+ {
+ @Override
+ public void windowActivated(WindowEvent e)
+ {
+ display.asyncExec(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ if (display.getFocusControl() == parent)
+ {
+ try {
+ Method m = Shell.class.getDeclaredMethod("setActiveControl", Control.class);
+ boolean accessible = m.isAccessible();
+ if (!accessible)
+ m.setAccessible(true);
+ m.invoke(parent.getShell(), parent);
+ if (!accessible)
+ m.setAccessible(false);
+ } catch (SecurityException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ });
+ }
+ });
+ }
+
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ //final InputContext input = frame.getInputContext();
+ frame.add(createTable());
+
+ }
+ });
+ return parent;
+ }
+
+ private static JComponent createTable() {
+ /* Creating components */
+ int nrows = 1000, ncolumns = 10;
+ Vector<Object> rows = new Vector<Object>();
+ for (int i = 0; i < nrows; i++) {
+ Vector<Object> row = new Vector<Object>();
+ for (int j = 0; j < ncolumns; j++) {
+ row.addElement("Item " + i + "-" + j);
+ }
+ rows.addElement(row);
+ }
+ Vector<Object> columns = new Vector<Object>();
+ for (int i = 0; i < ncolumns; i++) {
+ columns.addElement("Column " + i);
+ }
+ JTable table = new JTable(rows, columns);
+ table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+ table.createDefaultColumnsFromModel();
+ JScrollPane scrollPane = new JScrollPane(table);
+ return scrollPane;
+ }
+
+}