GtkComponentPeer.java (insets): New field.

2003-10-02  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GtkComponentPeer.java (insets): New
	field.
	(initializeInsets): New method.
	(GtkComponentPeer): Call initializeInsets.  Call setCursor and
	setBounds unconditionally.
	(setBounds): Convert coordinates if parent is a Window.
	* gnu/java/awt/peer/gtk/GtkContainerPeer.java (insets): Move
	field to GtkComponentPeer.
	(GtkContainerPeer): Don't initialize insets.
	* gnu/java/awt/peer/gtk/GtkDialogPeer.java (initializeInsets):
	New method.
	(create): Call new GtkWindowPeer create method.
	* gnu/java/awt/peer/gtk/GtkFramePeer.java (initializeInsets):
	New method.
	(create): Call new GtkWindowPeer create method.
	(setBounds): Remove method.
	(postConfigureEvent): Likewise.
	* gnu/java/awt/peer/gtk/GtkWindowPeer.java: Replace GTK window
	type constants with GDK window type constants.
	(create(int,boolean,int,int,GtkWindowPeer)): New method.
	(create(int,boolean)): Likewise.
	(create()): Call create(int,boolean).
	(nativeSetBounds): New native method declaration.
	(setBounds): Call native method declaration.
	(setSize): New native method declaration.
	(setBoundsCallback): Likewise.
	(postConfigureEvent): Handle change in insets.  Call setSize and
	setBoundsCallback methods.
	* java/awt/Window.java (Window): Set visible to false.
	(setBoundsCallback): New method.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c
	(gtkWidgetGetLocationOnScreen): If this component is not a
	container, adjust the location returned based on the peer's
	allocation.
	(set(String,boolean)): Revert change from 2003-09-19.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkEvents.c
	(awt_event_handler): Fix inset calculation.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkMainThread.c: Add JNI
	glue for Window.setBoundsCallback.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c (create):
	Set up stacking order, window decorations and window manager
	hints.
	(setBoundsCallback): New method.
	(setSize): New method.
	(nativeSetBounds): New method.
	* jni/gtk-peer/gtkpeer.h: Declare setBoundsCallbackID.

From-SVN: r72043
This commit is contained in:
Thomas Fitzsimmons 2003-10-02 18:34:56 +00:00 committed by Thomas Fitzsimmons
parent 01d28c3ff9
commit b59b508138
12 changed files with 316 additions and 107 deletions

View file

@ -72,6 +72,8 @@ public class GtkComponentPeer extends GtkGenericPeer
{
Component awtComponent;
Insets insets;
/* this isEnabled differs from Component.isEnabled, in that it
knows if a parent is disabled. In that case Component.isEnabled
may return true, but our isEnabled will always return false */
@ -90,6 +92,11 @@ public class GtkComponentPeer extends GtkGenericPeer
throw new RuntimeException ();
}
void initializeInsets ()
{
insets = new Insets (0, 0, 0, 0);
}
native void connectHooks ();
protected GtkComponentPeer (Component awtComponent)
@ -115,13 +122,13 @@ public class GtkComponentPeer extends GtkGenericPeer
// c.setFont (cp.getFont ());
if (awtComponent.getFont() != null)
setFont(awtComponent.getFont());
if (! (awtComponent instanceof Window))
{
setCursor (awtComponent.getCursor ());
Rectangle bounds = awtComponent.getBounds ();
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
}
initializeInsets ();
setCursor (awtComponent.getCursor ());
Rectangle bounds = awtComponent.getBounds ();
setBounds (bounds.x, bounds.y, bounds.width, bounds.height);
} catch (RuntimeException ex) { ; }
}
@ -278,11 +285,11 @@ public class GtkComponentPeer extends GtkGenericPeer
{
Component parent = awtComponent.getParent ();
if (parent instanceof Frame)
if (parent instanceof Window)
{
Insets insets = ((Frame)parent).getInsets ();
/* convert Java's coordinate space into GTK+'s coordinate space */
setNativeBounds (x-insets.left, y-insets.top, width, height);
Insets insets = ((Window) parent).getInsets ();
// Convert from Java coordinates to GTK coordinates.
setNativeBounds (x - insets.left, y - insets.top, width, height);
}
else
setNativeBounds (x, y, width, height);

View file

@ -48,14 +48,12 @@ import java.awt.peer.ContainerPeer;
public class GtkContainerPeer extends GtkComponentPeer
implements ContainerPeer
{
Insets insets;
Container c;
public GtkContainerPeer(Container c)
{
super (c);
this.c = c;
insets = new Insets (0, 0, 0, 0);
}
public void beginValidate()

View file

@ -41,6 +41,7 @@ package gnu.java.awt.peer.gtk;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Insets;
import java.awt.peer.DialogPeer;
public class GtkDialogPeer extends GtkWindowPeer
@ -51,11 +52,19 @@ public class GtkDialogPeer extends GtkWindowPeer
super (dialog);
}
void initializeInsets ()
{
// Unfortunately, X does not provide a clean way to calculate the
// dimensions of a dialog's borders before it has been displayed.
// So we guess and then fix the dimensions upon receipt of the
// first configure event.
insets = new Insets (20, 6, 6, 6);
}
void create ()
{
create (GTK_WINDOW_TOPLEVEL,
awtComponent.getWidth(),
awtComponent.getHeight());
// Create a decorated dialog window.
create (GDK_WINDOW_TYPE_HINT_DIALOG, true);
}
public void getArgs (Component component, GtkArgList args)

View file

@ -42,6 +42,7 @@ import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Insets;
import java.awt.MenuBar;
import java.awt.Rectangle;
import java.awt.event.PaintEvent;
@ -69,9 +70,19 @@ public class GtkFramePeer extends GtkWindowPeer
super (frame);
}
void initializeInsets ()
{
// Unfortunately, X does not provide a clean way to calculate the
// dimensions of a frame's borders before it has been displayed.
// So we guess and then fix the dimensions upon receipt of the
// first configure event.
insets = new Insets (20, 6, 6, 6);
}
void create ()
{
create (GTK_WINDOW_TOPLEVEL);
// Create a normal decorated window.
create (GDK_WINDOW_TYPE_HINT_NORMAL, true);
}
public void getArgs (Component component, GtkArgList args)
@ -97,26 +108,8 @@ public class GtkFramePeer extends GtkWindowPeer
return g;
}
public void setBounds (int x, int y, int width, int height)
{
super.setBounds (0, 0, width - insets.left - insets.right,
height - insets.top - insets.bottom + menuBarHeight);
}
protected void postConfigureEvent (int x, int y, int width, int height,
int top, int left, int bottom, int right)
{
if (((Frame)awtComponent).getMenuBar () != null)
{
menuBarHeight = getMenuBarHeight ();
top += menuBarHeight;
}
super.postConfigureEvent (0, 0,
width + left + right,
height + top + bottom - menuBarHeight,
top, left, bottom, right);
}
// FIXME: When MenuBars work, override postConfigureEvent and
// setBounds to account for MenuBar dimensions.
protected void postMouseEvent(int id, long when, int mods, int x, int y,
int clickCount, boolean popupTrigger)
@ -128,8 +121,6 @@ public class GtkFramePeer extends GtkWindowPeer
protected void postExposeEvent (int x, int y, int width, int height)
{
// System.out.println ("x + insets.left:" + (x + insets.left));
// System.out.println ("y + insets.top :" + (y + insets.top));
q.postEvent (new PaintEvent (awtComponent, PaintEvent.PAINT,
new Rectangle (x + insets.left,
y + insets.top,

View file

@ -40,29 +40,43 @@ package gnu.java.awt.peer.gtk;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Window;
import java.awt.peer.WindowPeer;
public class GtkWindowPeer extends GtkContainerPeer
implements WindowPeer
{
static protected final int GTK_WINDOW_TOPLEVEL = 0;
static protected final int GTK_WINDOW_POPUP = 1;
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;
native void create (int type, int width, int height);
native void create (int type, boolean decorated,
int width, int height,
GtkWindowPeer parent);
void create (int type)
void create (int type, boolean decorated)
{
create (type,
GtkWindowPeer parent_peer = null;
Component parent = awtComponent.getParent();
if (parent != null)
parent_peer = (GtkWindowPeer) awtComponent.getParent().getPeer();
create (type, decorated,
awtComponent.getWidth(),
awtComponent.getHeight());
awtComponent.getHeight(),
parent_peer);
}
void create ()
{
create (GTK_WINDOW_POPUP,
awtComponent.getWidth(),
awtComponent.getHeight());
// Create a normal undecorated window.
create (GDK_WINDOW_TYPE_HINT_NORMAL, false);
}
native void connectHooks ();
@ -81,7 +95,14 @@ public class GtkWindowPeer extends GtkContainerPeer
native public void toBack ();
native public void toFront ();
native public void setBounds (int x, int y, int width, int height);
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)
{
@ -90,34 +111,82 @@ public class GtkWindowPeer extends GtkContainerPeer
public void setResizable (boolean resizable)
{
// Call setSize; otherwise when resizable is changed from true to
// false the window will shrink to the dimensions it had before it
// was resizable.
setSize (awtComponent.getWidth() - insets.left - insets.right,
awtComponent.getHeight() - insets.top - insets.bottom);
set ("allow_shrink", resizable);
set ("allow_grow", resizable);
}
native void setSize (int width, int height);
native void setBoundsCallback (Window window,
int x, int y,
int width, int height);
protected void postConfigureEvent (int x, int y, int width, int height,
int top, int left, int bottom, int right)
{
/*
If our borders change (which often happens when we opaque resize),
we need to make sure that a new layout will happen, since Sun
forgets to handle this case.
*/
// Configure events tell us the location and dimensions of the
// window within the frame borders, and the dimensions of the
// frame borders (top, left, bottom, right).
// If our borders change we need to make sure that a new layout
// will happen, since Sun forgets to handle this case.
if (insets.top != top
|| insets.left != left
|| insets.bottom != bottom
|| insets.right != right)
{
awtComponent.invalidate ();
}
insets.top = top;
insets.left = left;
insets.bottom = bottom;
insets.right = right;
// When our insets change, we receive a configure event with
// the new insets, the old window location and the old window
// dimensions. We update our Window object's location and
// size using our old inset values.
setBoundsCallback ((Window) awtComponent,
x - insets.left,
y - insets.top,
width + insets.left + insets.right,
height + insets.top + insets.bottom);
awtComponent.setBounds (x, y, width, height);
awtComponent.validate ();
// The peer's dimensions do not get updated automatically when
// insets change so we need to do it manually.
setSize (width + (insets.left - left) + (insets.right - right),
height + (insets.top - top) + (insets.bottom - bottom));
insets.top = top;
insets.left = left;
insets.bottom = bottom;
insets.right = right;
awtComponent.validate();
}
else
{
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);
if (frame_width != awtComponent.getWidth()
|| frame_height != awtComponent.getHeight())
setSize (width, height);
awtComponent.validate();
}
}
}
native public void setVisible (boolean b);
}