X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.utils.ui%2Ftestcases%2Forg%2Fsimantics%2Futils%2Fui%2FSWTAWTTest.java;fp=bundles%2Forg.simantics.utils.ui%2Ftestcases%2Forg%2Fsimantics%2Futils%2Fui%2FSWTAWTTest.java;h=fed7f7703865d14a9c48c082dc60206c1dd750b7;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.utils.ui/testcases/org/simantics/utils/ui/SWTAWTTest.java b/bundles/org.simantics.utils.ui/testcases/org/simantics/utils/ui/SWTAWTTest.java new file mode 100644 index 000000000..fed7f7703 --- /dev/null +++ b/bundles/org.simantics.utils.ui/testcases/org/simantics/utils/ui/SWTAWTTest.java @@ -0,0 +1,199 @@ +/******************************************************************************* + * 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 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; + } + +}