summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2009-07-01 14:50:54 +0000
committerSilenio Quarti <silenio>2009-07-01 14:50:54 +0000
commit093c579a4ffd9551acb901bba9617e7aa776989d (patch)
tree71cf23798b651ef92f188390841a8d130908fb11 /bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org
parentf664d297f7bb009784868bf3fcf0b3e3bb9a646b (diff)
downloadeclipse.platform.swt-093c579a4ffd9551acb901bba9617e7aa776989d.tar.gz
eclipse.platform.swt-093c579a4ffd9551acb901bba9617e7aa776989d.tar.xz
eclipse.platform.swt-093c579a4ffd9551acb901bba9617e7aa776989d.zip
restore HEAD after accidental deletion by error in automated build script
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org/eclipse/swt/awt/SWT_AWT.java333
1 files changed, 333 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org/eclipse/swt/awt/SWT_AWT.java b/bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org/eclipse/swt/awt/SWT_AWT.java
new file mode 100644
index 0000000000..2dead66273
--- /dev/null
+++ b/bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org/eclipse/swt/awt/SWT_AWT.java
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation and others.
+ * 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:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swt.awt;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/* SWT Imports */
+import org.eclipse.swt.*;
+import org.eclipse.swt.internal.*;
+import org.eclipse.swt.internal.gtk.*;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Event;
+
+/* AWT Imports */
+import java.awt.AWTEvent;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Canvas;
+import java.awt.Frame;
+import java.awt.Window;
+import java.awt.event.AWTEventListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.WindowEvent;
+
+
+/**
+ * This class provides a bridge between SWT and AWT, so that it
+ * is possible to embed AWT components in SWT and vice versa.
+ *
+ * @see <a href="http://www.eclipse.org/swt/snippets/#awt">Swing/AWT snippets</a>
+ * @see <a href="http://www.eclipse.org/swt/">Sample code and further information</a>
+ *
+ * @since 3.0
+ */
+public class SWT_AWT {
+
+ /**
+ * The name of the embedded Frame class. The default class name
+ * for the platform will be used if <code>null</code>.
+ */
+ public static String embeddedFrameClass;
+
+ /**
+ * Key for looking up the embedded frame for a Composite using
+ * getData().
+ */
+ static String EMBEDDED_FRAME_KEY = "org.eclipse.swt.awt.SWT_AWT.embeddedFrame";
+
+static boolean loaded, swingInitialized;
+
+static native final int /*long*/ getAWTHandle (Object canvas);
+static native final void setDebug (Frame canvas, boolean debug);
+
+static synchronized void loadLibrary () {
+ if (loaded) return;
+ loaded = true;
+ /*
+ * Note that the jawt library is loaded explicitly
+ * because it cannot be found by the library loader.
+ * All exceptions are caught because the library may
+ * have been loaded already.
+ */
+ try {
+ System.loadLibrary("jawt");
+ } catch (Throwable e) {}
+ Library.loadLibrary("swt-awt");
+}
+
+static synchronized void initializeSwing() {
+ if (swingInitialized) return;
+ swingInitialized = true;
+ /*
+ * Feature in GTK. The default X error handler
+ * for GTK calls exit() after printing the X error.
+ * Normally, this isn't that big a problem for SWT
+ * applications because they don't cause X errors.
+ * However, sometimes X errors are generated by AWT
+ * that make SWT exit. The fix is to hide all X
+ * errors when AWT is running.
+ */
+ OS.gdk_error_trap_push();
+ try {
+ /* Initialize the default focus traversal policy */
+ Class[] emptyClass = new Class[0];
+ Object[] emptyObject = new Object[0];
+ Class clazz = Class.forName("javax.swing.UIManager");
+ Method method = clazz.getMethod("getDefaults", emptyClass);
+ if (method != null) method.invoke(clazz, emptyObject);
+ } catch (Throwable e) {}
+}
+
+/**
+ * Returns a <code>java.awt.Frame</code> which is the embedded frame
+ * associated with the specified composite.
+ *
+ * @param parent the parent <code>Composite</code> of the <code>java.awt.Frame</code>
+ * @return a <code>java.awt.Frame</code> the embedded frame or <code>null</code>.
+ *
+ * @exception IllegalArgumentException <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * </ul>
+ *
+ * @since 3.2
+ */
+public static Frame getFrame (Composite parent) {
+ if (parent == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+ if ((parent.getStyle () & SWT.EMBEDDED) == 0) return null;
+ return (Frame)parent.getData(EMBEDDED_FRAME_KEY);
+}
+
+/**
+ * Creates a new <code>java.awt.Frame</code>. This frame is the root for
+ * the AWT components that will be embedded within the composite. In order
+ * for the embedding to succeed, the composite must have been created
+ * with the SWT.EMBEDDED style.
+ * <p>
+ * IMPORTANT: As of JDK1.5, the embedded frame does not receive mouse events.
+ * When a lightweight component is added as a child of the embedded frame,
+ * the cursor does not change. In order to work around both these problems, it is
+ * strongly recommended that a heavyweight component such as <code>java.awt.Panel</code>
+ * be added to the frame as the root of all components.
+ * </p>
+ *
+ * @param parent the parent <code>Composite</code> of the new <code>java.awt.Frame</code>
+ * @return a <code>java.awt.Frame</code> to be the parent of the embedded AWT components
+ *
+ * @exception IllegalArgumentException <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * <li>ERROR_INVALID_ARGUMENT - if the parent Composite does not have the SWT.EMBEDDED style</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+public static Frame new_Frame (final Composite parent) {
+ if (parent == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+ if ((parent.getStyle () & SWT.EMBEDDED) == 0) {
+ SWT.error (SWT.ERROR_INVALID_ARGUMENT);
+ }
+ int /*long*/ handle = parent.embeddedHandle;
+ /*
+ * Some JREs have implemented the embedded frame constructor to take an integer
+ * and other JREs take a long. To handle this binary incompatibility, use
+ * reflection to create the embedded frame.
+ */
+ Class clazz = null;
+ try {
+ String className = embeddedFrameClass != null ? embeddedFrameClass : "sun.awt.X11.XEmbeddedFrame";
+ clazz = Class.forName(className);
+ } catch (Throwable e) {
+ SWT.error (SWT.ERROR_NOT_IMPLEMENTED, e, " [need JDK 1.5 or greater]");
+ }
+ initializeSwing ();
+ Object value = null;
+ Constructor constructor = null;
+ try {
+ constructor = clazz.getConstructor (new Class [] {int.class, boolean.class});
+ value = constructor.newInstance (new Object [] {new Integer ((int)/*64*/handle), Boolean.TRUE});
+ } catch (Throwable e1) {
+ try {
+ constructor = clazz.getConstructor (new Class [] {long.class, boolean.class});
+ value = constructor.newInstance (new Object [] {new Long (handle), Boolean.TRUE});
+ } catch (Throwable e2) {
+ SWT.error (SWT.ERROR_NOT_IMPLEMENTED, e2);
+ }
+ }
+ final Frame frame = (Frame) value;
+ parent.setData(EMBEDDED_FRAME_KEY, frame);
+ if (Device.DEBUG) {
+ loadLibrary();
+ setDebug(frame, true);
+ }
+ try {
+ /* Call registerListeners() to make XEmbed focus traversal work */
+ Method method = clazz.getMethod("registerListeners", null);
+ if (method != null) method.invoke(value, null);
+ } catch (Throwable e) {}
+ final AWTEventListener awtListener = new AWTEventListener() {
+ public void eventDispatched(AWTEvent event) {
+ if (event.getID() == WindowEvent.WINDOW_OPENED) {
+ final Window window = (Window) event.getSource();
+ if (window.getParent() == frame) {
+ parent.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ if (parent.isDisposed()) return;
+ Shell shell = parent.getShell();
+ loadLibrary();
+ int /*long*/ awtHandle = getAWTHandle(window);
+ if (awtHandle == 0) return;
+ int /*long*/ xWindow = OS.gdk_x11_drawable_get_xid(OS.GTK_WIDGET_WINDOW(OS.gtk_widget_get_toplevel(shell.handle)));
+ OS.XSetTransientForHint(OS.GDK_DISPLAY(), awtHandle, xWindow);
+ }
+ });
+ }
+ }
+ }
+ };
+ frame.getToolkit().addAWTEventListener(awtListener, AWTEvent.WINDOW_EVENT_MASK);
+ final Listener shellListener = new Listener () {
+ public void handleEvent (Event e) {
+ switch (e.type) {
+ case SWT.Deiconify:
+ EventQueue.invokeLater(new Runnable () {
+ public void run () {
+ frame.dispatchEvent (new WindowEvent (frame, WindowEvent.WINDOW_DEICONIFIED));
+ }
+ });
+ break;
+ case SWT.Iconify:
+ EventQueue.invokeLater(new Runnable () {
+ public void run () {
+ frame.dispatchEvent (new WindowEvent (frame, WindowEvent.WINDOW_ICONIFIED));
+ }
+ });
+ break;
+ }
+ }
+ };
+ Shell shell = parent.getShell ();
+ shell.addListener (SWT.Deiconify, shellListener);
+ shell.addListener (SWT.Iconify, shellListener);
+
+ Listener listener = new Listener () {
+ public void handleEvent (Event e) {
+ switch (e.type) {
+ case SWT.Dispose:
+ Shell shell = parent.getShell ();
+ shell.removeListener (SWT.Deiconify, shellListener);
+ shell.removeListener (SWT.Iconify, shellListener);
+ parent.setVisible(false);
+ EventQueue.invokeLater(new Runnable () {
+ public void run () {
+ frame.getToolkit().removeAWTEventListener(awtListener);
+ frame.dispose ();
+ }
+ });
+ break;
+ case SWT.Resize:
+ if (Library.JAVA_VERSION >= Library.JAVA_VERSION(1, 6, 0)) {
+ final Rectangle clientArea = parent.getClientArea();
+ EventQueue.invokeLater(new Runnable () {
+ public void run () {
+ frame.setSize (clientArea.width, clientArea.height);
+ }
+ });
+ }
+ break;
+ }
+ }
+ };
+ parent.addListener (SWT.Dispose, listener);
+ parent.addListener (SWT.Resize, listener);
+
+ parent.getDisplay().asyncExec(new Runnable() {
+ public void run () {
+ if (parent.isDisposed()) return;
+ final Rectangle clientArea = parent.getClientArea();
+ EventQueue.invokeLater(new Runnable () {
+ public void run () {
+ frame.setSize (clientArea.width, clientArea.height);
+ frame.validate ();
+ }
+ });
+ }
+ });
+ return frame;
+}
+
+/**
+ * Creates a new <code>Shell</code>. This Shell is the root for
+ * the SWT widgets that will be embedded within the AWT canvas.
+ *
+ * @param display the display for the new Shell
+ * @param parent the parent <code>java.awt.Canvas</code> of the new Shell
+ * @return a <code>Shell</code> to be the parent of the embedded SWT widgets
+ *
+ * @exception IllegalArgumentException <ul>
+ * <li>ERROR_NULL_ARGUMENT - if the display is null</li>
+ * <li>ERROR_NULL_ARGUMENT - if the parent is null</li>
+ * <li>ERROR_INVALID_ARGUMENT - if the parent's peer is not created</li>
+ * </ul>
+ *
+ * @since 3.0
+ */
+public static Shell new_Shell (final Display display, final Canvas parent) {
+ if (display == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+ if (parent == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+ int /*long*/ handle = 0;
+ try {
+ loadLibrary ();
+ handle = getAWTHandle (parent);
+ } catch (Throwable e) {
+ SWT.error (SWT.ERROR_NOT_IMPLEMENTED, e);
+ }
+ if (handle == 0) SWT.error (SWT.ERROR_INVALID_ARGUMENT, null, " [peer not created]");
+
+ final Shell shell = Shell.gtk_new (display, handle);
+ final ComponentListener listener = new ComponentAdapter () {
+ public void componentResized (ComponentEvent e) {
+ display.syncExec (new Runnable () {
+ public void run () {
+ if (shell.isDisposed()) return;
+ Dimension dim = parent.getSize ();
+ shell.setSize (dim.width, dim.height);
+ }
+ });
+ }
+ };
+ parent.addComponentListener(listener);
+ shell.addListener(SWT.Dispose, new Listener() {
+ public void handleEvent(Event event) {
+ parent.removeComponentListener(listener);
+ }
+ });
+ shell.setVisible (true);
+ return shell;
+}
+}