GtkWindowPeer.java [plain text]
package gnu.java.awt.peer.gtk;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.Frame;
import java.awt.event.WindowEvent;
import java.awt.peer.WindowPeer;
public class GtkWindowPeer extends GtkContainerPeer
implements WindowPeer
{
static protected final int GDK_WINDOW_TYPE_HINT_NORMAL = 0;
static protected final int GDK_WINDOW_TYPE_HINT_DIALOG = 1;
static protected final int GDK_WINDOW_TYPE_HINT_MENU = 2;
static protected final int GDK_WINDOW_TYPE_HINT_TOOLBAR = 3;
static protected final int GDK_WINDOW_TYPE_HINT_SPLASHSCREEN = 4;
static protected final int GDK_WINDOW_TYPE_HINT_UTILITY = 5;
static protected final int GDK_WINDOW_TYPE_HINT_DOCK = 6;
static protected final int GDK_WINDOW_TYPE_HINT_DESKTOP = 7;
private boolean hasBeenShown = false;
private int oldState = Frame.NORMAL;
native void create (int type, boolean decorated,
int width, int height,
GtkWindowPeer parent,
int[] insets);
void create (int type, boolean decorated)
{
GtkWindowPeer parent_peer = null;
Component parent = awtComponent.getParent();
int[] insets = new int [] { 0, 0, 0, 0 };
if (parent != null)
parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer();
create (type, decorated,
awtComponent.getWidth(),
awtComponent.getHeight(),
parent_peer,
insets);
this.insets.top = insets [0];
this.insets.left = insets [1];
this.insets.bottom = insets [2];
this.insets.right = insets [3];
}
void create ()
{
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
native void connectJObject ();
native void connectSignals ();
public GtkWindowPeer (Window window)
{
super (window);
}
public void getArgs (Component component, GtkArgList args)
{
args.add ("visible", component.isVisible ());
args.add ("sensitive", component.isEnabled ());
}
native public void toBack ();
native public void toFront ();
native void nativeSetBounds (int x, int y, int width, int height);
public void setBounds (int x, int y, int width, int height)
{
nativeSetBounds (x, y,
width - insets.left - insets.right,
height - insets.top - insets.bottom);
}
public void setTitle (String title)
{
set ("title", title);
}
native void setSize (int width, int height);
public void setResizable (boolean resizable)
{
setSize (awtComponent.getWidth() - insets.left - insets.right,
awtComponent.getHeight() - insets.top - insets.bottom);
set ("allow_shrink", resizable);
set ("allow_grow", resizable);
}
native void setBoundsCallback (Window window,
int x, int y,
int width, int height);
protected void postInsetsChangedEvent (int top, int left,
int bottom, int right)
{
insets.top = top;
insets.left = left;
insets.bottom = bottom;
insets.right = right;
}
protected void postConfigureEvent (int x, int y, int width, int height)
{
int frame_x = x - insets.left;
int frame_y = y - insets.top;
int frame_width = width + insets.left + insets.right;
int frame_height = height + insets.top + insets.bottom;
if (frame_x != awtComponent.getX()
|| frame_y != awtComponent.getY()
|| frame_width != awtComponent.getWidth()
|| frame_height != awtComponent.getHeight())
setBoundsCallback ((Window) awtComponent,
frame_x, frame_y, frame_width, frame_height);
awtComponent.validate();
}
native void nativeSetVisible (boolean b);
public void setVisible (boolean b)
{
if (b)
setBounds (awtComponent.getX(),
awtComponent.getY(),
awtComponent.getWidth(),
awtComponent.getHeight());
nativeSetVisible (b);
}
void postWindowEvent (int id, Window opposite, int newState)
{
if (id == WindowEvent.WINDOW_OPENED)
{
if (!hasBeenShown)
{
q.postEvent (new WindowEvent ((Window) awtComponent, id,
opposite));
hasBeenShown = true;
}
}
else if (id == WindowEvent.WINDOW_STATE_CHANGED)
{
if (oldState != newState)
{
q.postEvent (new WindowEvent ((Window) awtComponent, id, opposite,
oldState, newState));
oldState = newState;
}
}
else
q.postEvent (new WindowEvent ((Window) awtComponent, id, opposite));
}
}