diff options
author | Silenio Quarti <silenio> | 2009-07-01 14:50:54 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2009-07-01 14:50:54 +0000 |
commit | 093c579a4ffd9551acb901bba9617e7aa776989d (patch) | |
tree | 71cf23798b651ef92f188390841a8d130908fb11 /bundles/org.eclipse.swt/Eclipse SWT AWT/gtk/org | |
parent | f664d297f7bb009784868bf3fcf0b3e3bb9a646b (diff) | |
download | eclipse.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.java | 333 |
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; +} +} |