GtkFramePeer.java (getMenuBarHeight): Added MenuBarPeer parameter.

2004-01-19  Kim Ho  <kho@redhat.com>

        * gnu/java/awt/peer/gtk/GtkFramePeer.java (getMenuBarHeight): Added
        MenuBarPeer parameter.
        (removeMenuBarPeer): New native method.
        (setMenuBar): Call remove if menu bar is null. Adjust insets
        appropriately.
        (postSizeAllocateEvent): New method. Called when menu bar size is
        allocated. Adjust insets and redo layout.
        (GtkFramePeer): Set menu bar during frame creation.
        (postConfigureEvent): Adjust position and size to accomodate
        menu bar.
        * java/awt/Frame.java (setMenuBar): addNotify to create menu bar.
        * java/awt/Menu.java (addSeparator): Use peer's addSeparator.
        (addNotify): Create the peer if it doesn't exist and call addNotify
        for the menu's items.
        * java/awt/MenuBar.java (addNotify): Create this menu bar's menus.
        * java/awt/MenuItem.java (addNotify): Create the peer if it
        doesn't exist.
        * jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
        (removeMenuBarPeer): New method. Remove menu bar on the current
        frame.
        (setMenuBarPeer): Add the menu bar to the current frame and the
        callback for size-allocate events on the menu bar.
        (getMenuBarHeight): Add menu bar parameter.
        (menubar_resize_cb): New callback method for postSizeAllocate events.

        Also: Fix indentation on last ChangeLog entry.

From-SVN: r76149
This commit is contained in:
Kim Ho 2004-01-19 14:27:45 +00:00 committed by Kim Ho
parent 9543baba84
commit 2c20a17152
7 changed files with 178 additions and 46 deletions

View file

@ -1,9 +1,38 @@
2004-01-19 Kim Ho <kho@redhat.com>
* gnu/java/awt/peer/gtk/GtkFramePeer.java (getMenuBarHeight): Added
MenuBarPeer parameter.
(removeMenuBarPeer): New native method.
(setMenuBar): Call remove if menu bar is null. Adjust insets
appropriately.
(postSizeAllocateEvent): New method. Called when menu bar size is
allocated. Adjust insets and redo layout.
(GtkFramePeer): Set menu bar during frame creation.
(postConfigureEvent): Adjust position and size to accomodate
menu bar.
* java/awt/Frame.java (setMenuBar): addNotify to create menu bar.
* java/awt/Menu.java (addSeparator): Use peer's addSeparator.
(addNotify): Create the peer if it doesn't exist and call addNotify
for the menu's items.
* java/awt/MenuBar.java (addNotify): Create this menu bar's menus.
* java/awt/MenuItem.java (addNotify): Create the peer if it
doesn't exist.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(removeMenuBarPeer): New method. Remove menu bar on the current
frame.
(setMenuBarPeer): Add the menu bar to the current frame and the
callback for size-allocate events on the menu bar.
(getMenuBarHeight): Add menu bar parameter.
(menubar_resize_cb): New callback method for postSizeAllocate events.
Also: Fix indentation on last ChangeLog entry.
2004-01-16 Kim Ho <kho@redhat.com>
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
(gtkWidgetGetDimensions): Remove.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(gtkWidgetGetDimensions): Remove.
* gnu/java/awt/peer/gtk/GtkFileDialogPeer.java
(gtkWidgetGetDimensions): Remove.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(gtkWidgetGetDimensions): Remove.
2004-01-16 Tom Tromey <tromey@redhat.com>

View file

@ -1,5 +1,5 @@
/* GtkFramePeer.java -- Implements FramePeer with GTK
Copyright (C) 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -45,6 +45,7 @@ import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MenuBar;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.PaintEvent;
import java.awt.peer.FramePeer;
import java.awt.peer.MenuBarPeer;
@ -53,16 +54,41 @@ public class GtkFramePeer extends GtkWindowPeer
implements FramePeer
{
int menuBarHeight = 0;
native int getMenuBarHeight ();
private MenuBarPeer menuBar;
native int getMenuBarHeight (MenuBarPeer bar);
native public void setMenuBarPeer (MenuBarPeer bar);
native public void removeMenuBarPeer (MenuBarPeer bar);
public void setMenuBar (MenuBar bar)
{
if (bar == null)
setMenuBarPeer (null);
else
setMenuBarPeer ((MenuBarPeer) bar.getPeer ());
if (bar == null && menuBar != null)
{
removeMenuBarPeer(menuBar);
menuBar = null;
insets.top -= menuBarHeight;
menuBarHeight = 0;
awtComponent.doLayout();
}
else if (bar != null)
{
if (menuBar != null)
removeMenuBarPeer(menuBar);
menuBar = (MenuBarPeer) ((MenuBar) bar).getPeer();
setMenuBarPeer(menuBar);
}
}
protected void postSizeAllocateEvent()
{
if (menuBar != null)
{
if (menuBarHeight != 0)
insets.top -= menuBarHeight;
menuBarHeight = getMenuBarHeight(menuBar);
insets.top += menuBarHeight;
}
awtComponent.doLayout();
}
public GtkFramePeer (Frame frame)
@ -74,6 +100,7 @@ public class GtkFramePeer extends GtkWindowPeer
{
// Create a normal decorated window.
create (GDK_WINDOW_TYPE_HINT_NORMAL, true);
setMenuBar(((Frame) awtComponent).getMenuBar());
}
public void getArgs (Component component, GtkArgList args)
@ -102,10 +129,31 @@ public class GtkFramePeer extends GtkWindowPeer
g.translate (-insets.left, -insets.top);
return g;
}
// FIXME: When MenuBars work, override postConfigureEvent and
// setBounds to account for MenuBar dimensions.
protected void postConfigureEvent (int x, int y, int width, int height)
{
int frame_x = x - insets.left;
// Add the height of the menubar (if none, menuBarHeight is 0 and has no
// effect). To move the frame down a bit so as to still fit in the window.
int frame_y = y - insets.top + menuBarHeight;
int frame_width = width + insets.left + insets.right;
// Add the height of the menubar to adjust the height so it still fits in
// the window.
int frame_height = height + insets.top + insets.bottom - menuBarHeight;
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();
}
protected void postMouseEvent(int id, long when, int mods, int x, int y,
int clickCount, boolean popupTrigger)
{

View file

@ -1,5 +1,5 @@
/* Frame.java -- AWT toplevel window
Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -342,6 +342,8 @@ public synchronized void
setMenuBar(MenuBar menuBar)
{
this.menuBar = menuBar;
if (menuBar != null)
menuBar.addNotify();
if (peer != null)
((FramePeer) peer).setMenuBar(menuBar);
}

View file

@ -1,5 +1,5 @@
/* Menu.java -- A Java AWT Menu
Copyright (C) 1999, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -294,7 +294,8 @@ insert(String label, int index)
public void
addSeparator()
{
add(separator);
if (peer != null)
((MenuPeer) peer).addSeparator();
}
/*************************************************************************/
@ -376,8 +377,14 @@ removeAll()
public void
addNotify()
{
if (peer != null)
if (peer == null)
peer = getToolkit().createMenu(this);
java.util.Enumeration e = items.elements();
while (e.hasMoreElements())
{
MenuItem mi = (MenuItem)e.nextElement();
mi.addNotify();
}
super.addNotify ();
}

View file

@ -1,5 +1,5 @@
/* MenuBar.java -- An AWT menu bar class
Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -263,6 +263,12 @@ addNotify()
{
if (getPeer() == null)
setPeer((MenuComponentPeer)getToolkit().createMenuBar(this));
Enumeration e = menus.elements();
while (e.hasMoreElements())
{
Menu mi = (Menu)e.nextElement();
mi.addNotify();
}
}
/*************************************************************************/

View file

@ -1,5 +1,5 @@
/* MenuItem.java -- An item in a menu
Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -361,7 +361,7 @@ disableEvents(long events)
public void
addNotify()
{
if (peer != null)
if (peer == null)
peer = getToolkit ().createMenuItem (this);
}

View file

@ -1,5 +1,5 @@
/* gtkwindowpeer.c -- Native implementation of GtkWindowPeer
Copyright (C) 1998, 1999, 2002, 2004 Free Software Foundation, Inc.
Copyright (C) 1998, 1999, 2002 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@ -72,6 +72,8 @@ static jint window_get_new_state (GtkWidget *widget);
static gboolean window_property_changed_cb (GtkWidget *widget,
GdkEventProperty *event,
jobject peer);
static void menubar_resize_cb (GtkWidget *widget, GtkAllocation *alloc,
jobject peer);
/*
* Make a new window.
@ -358,45 +360,61 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_nativeSetBounds
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer
Java_gnu_java_awt_peer_gtk_GtkFramePeer_removeMenuBarPeer
(JNIEnv *env, jobject obj, jobject menubar)
{
void *wptr, *mptr;
GtkBox *box;
if (!menubar) return;
void *wptr;
GtkWidget *box;
GtkWidget *mptr;
wptr = NSA_GET_PTR (env, obj);
mptr = NSA_GET_PTR (env, menubar);
if (!mptr) return; /* this case should remove a menu */
gdk_threads_enter ();
box = GTK_BOX (GTK_BIN (wptr)->child);
gtk_box_pack_start (box, GTK_WIDGET (mptr), 0, 0, 0);
box = GTK_BIN (wptr)->child;
gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (mptr));
gdk_threads_leave();
}
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkFramePeer_setMenuBarPeer
(JNIEnv *env, jobject obj, jobject menubar)
{
void *wptr;
GtkWidget *mptr;
GtkWidget *box;
jobject *gref = NSA_GET_GLOBAL_REF (env, obj);
wptr = NSA_GET_PTR (env, obj);
mptr = NSA_GET_PTR (env, menubar);
gdk_threads_enter ();
g_signal_connect (G_OBJECT (mptr), "size-allocate",
G_CALLBACK (menubar_resize_cb), *gref);
box = GTK_BIN (wptr)->child;
gtk_box_pack_start (GTK_BOX (box), mptr, 0, 0, 0);
gtk_widget_show (mptr);
gdk_threads_leave ();
}
JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GtkFramePeer_getMenuBarHeight
(JNIEnv *env, jobject obj)
(JNIEnv *env, jobject obj, jobject menubar)
{
void *ptr;
GList *children;
jint height = 0;
ptr = NSA_GET_PTR (env, obj);
GtkWidget *ptr;
jint height;
ptr = NSA_GET_PTR (env, menubar);
gdk_threads_enter ();
children = gtk_container_children (GTK_CONTAINER (GTK_BIN (ptr)->child));
if (g_list_length (children) == 2)
{
GtkWidget *menubar = GTK_WIDGET (children->data);
height = menubar->allocation.height;
}
height = ptr->allocation.height;
gdk_threads_leave ();
return height;
}
@ -698,3 +716,25 @@ window_property_changed_cb (GtkWidget *widget __attribute__((unused)),
return FALSE;
}
static void menubar_resize_cb (GtkWidget *widget, GtkAllocation *alloc,
jobject peer)
{
static int id_set = 0;
static jmethodID postSizeAllocateEventID;
if (!id_set)
{
jclass gtkframepeer = (*gdk_env)->FindClass (gdk_env,
"gnu/java/awt/peer/gtk/GtkFramePeer");
postSizeAllocateEventID = (*gdk_env)->GetMethodID (gdk_env,
gtkframepeer,
"postSizeAllocateEvent",
"()V");
id_set = 1;
}
gdk_threads_leave();
(*gdk_env)->CallVoidMethod (gdk_env, peer,
postSizeAllocateEventID);
gdk_threads_enter();
}