]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.utils.ui/testcases/org/simantics/utils/ui/SWTAWTTest.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.ui / testcases / org / simantics / utils / ui / SWTAWTTest.java
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 (file)
index 0000000..fed7f77
--- /dev/null
@@ -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<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;
+       }
+
+}