blob: 762508187bc8e57954df71a3ed6a3113768ea650 [file] [log] [blame]
/*
* Copyright 1996-2004 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*/
package sun.awt.motif;
import java.awt.Component;
import java.awt.peer.FramePeer;
import sun.awt.EmbeddedFrame;
import java.awt.peer.ComponentPeer;
import sun.awt.*;
import java.awt.*;
public class MEmbeddedFrame extends EmbeddedFrame {
/**
* Widget id of the shell widget
*/
long handle;
public enum IDKind {
WIDGET,
WINDOW
};
public MEmbeddedFrame() {
}
/**
* Backward-compatible implementation. This constructor takes widget which represents Frame's
* shell and uses it as top-level to build hierarchy of top-level widgets upon. It assumes that
* no XEmbed support is provided.
* @param widget a valid Xt widget pointer.
*/
public MEmbeddedFrame(long widget) {
this(widget, IDKind.WIDGET, false);
}
/**
* New constructor, gets X Window id and allows to specify whether XEmbed is supported by parent
* X window. Creates hierarchy of top-level widgets under supplied window ID.
* @param winid a valid X window
* @param supportsXEmbed whether the host application supports XEMBED protocol
*/
public MEmbeddedFrame(long winid, boolean supportsXEmbed) {
this(winid, IDKind.WINDOW, supportsXEmbed);
}
/**
* Creates embedded frame using ID as parent.
* @param ID parent ID
* @param supportsXEmbed whether the host application supports XEMBED protocol
* @param kind if WIDGET, ID represents a valid Xt widget pointer; if WINDOW, ID is a valid X Window
* ID
*/
public MEmbeddedFrame(long ID, IDKind kind, boolean supportsXEmbed) {
super(supportsXEmbed);
if (kind == IDKind.WIDGET) {
this.handle = ID;
} else {
this.handle = getWidget(ID);
}
MToolkit toolkit = (MToolkit)Toolkit.getDefaultToolkit();
setPeer(toolkit.createEmbeddedFrame(this));
/*
* addNotify() creates a LightweightDispatcher that propagates
* SunDropTargetEvents to subcomponents.
* NOTE: show() doesn't call addNotify() for embedded frames.
*/
addNotify();
show();
}
public void synthesizeWindowActivation(boolean b) {
MEmbeddedFramePeer peer = (MEmbeddedFramePeer)getPeer();
if (peer != null) {
if (peer.supportsXEmbed()) {
if (peer.isXEmbedActive()) {
// If XEmbed is active no synthetic focus events are allowed - everything
// should go through XEmbed
if (b) {
peer.requestXEmbedFocus();
}
}
} else {
peer.synthesizeFocusInOut(b);
}
}
}
public void show() {
if (handle != 0) {
mapWidget(handle);
}
super.show();
}
protected boolean traverseOut(boolean direction) {
MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer();
xefp.traverseOut(direction);
return true;
}
// Native methods to handle widget <-> X Windows mapping
//
static native long getWidget(long winid);
static native int mapWidget(long widget);
public void registerAccelerator(AWTKeyStroke stroke) {
MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer();
if (xefp != null) {
xefp.registerAccelerator(stroke);
}
}
public void unregisterAccelerator(AWTKeyStroke stroke) {
MEmbeddedFramePeer xefp = (MEmbeddedFramePeer) getPeer();
if (xefp != null) {
xefp.unregisterAccelerator(stroke);
}
}
}