/******************************************************************************* * 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.getCause().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 rows = new Vector(); for (int i = 0; i < nrows; i++) { Vector row = new Vector(); for (int j = 0; j < ncolumns; j++) { row.addElement("Item " + i + "-" + j); } rows.addElement(row); } Vector columns = new Vector(); 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; } }