GtkDialogPeer.java (create()): Create a top-level GTK window.

2003-09-19  Thomas Fitzsimmons  <fitzsim@redhat.com>

	* gnu/java/awt/peer/gtk/GtkDialogPeer.java (create()): Create a
	top-level GTK window.
	(getArgs): Add "title" property.
	* gnu/java/awt/peer/gtk/GtkWindowPeer.java (setResizable): Use
	"allow_shrink" and "allow_grow" properties.
	* java/awt/Dialog.java: Initialize resizable to true and change
	comments accordingly.  Initialize visible to false in
	constructors.
	* java/awt/Frame.java (dispose): Remove method.
	* java/awt/Window.java (ownedWindows): New field.
	(Window(Window,GraphicsConfiguration)): Add a weak reference to
	owner's ownedWindows vector.
	(finalize): Remove method.
	(hide): Hide owned windows.
	(dispose): Dispose of owned windows.
	(getOwnedWindows): Implement.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Remove
	unused GtkArg code.
	(set(String,boolean)): Clamp gboolean parameter to g_object_set
	to TRUE or FALSE.
	* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
	(create): Set window's size requisition.
	(connectHooks): Fix indentation.
	(setResizable): Remove function.
	(static setBounds): Likewise.
	(setBounds): Replace call to setBounds with GTK size requisition
	and resize calls.

From-SVN: r71585
This commit is contained in:
Thomas Fitzsimmons 2003-09-19 19:27:59 +00:00 committed by Thomas Fitzsimmons
parent 9e3bfa9b75
commit 5ec47f6049
9 changed files with 158 additions and 129 deletions

View File

@ -1,3 +1,33 @@
2003-09-19 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkDialogPeer.java (create()): Create a
top-level GTK window.
(getArgs): Add "title" property.
* gnu/java/awt/peer/gtk/GtkWindowPeer.java (setResizable): Use
"allow_shrink" and "allow_grow" properties.
* java/awt/Dialog.java: Initialize resizable to true and change
comments accordingly. Initialize visible to false in
constructors.
* java/awt/Frame.java (dispose): Remove method.
* java/awt/Window.java (ownedWindows): New field.
(Window(Window,GraphicsConfiguration)): Add a weak reference to
owner's ownedWindows vector.
(finalize): Remove method.
(hide): Hide owned windows.
(dispose): Dispose of owned windows.
(getOwnedWindows): Implement.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkComponentPeer.c: Remove
unused GtkArg code.
(set(String,boolean)): Clamp gboolean parameter to g_object_set
to TRUE or FALSE.
* jni/gtk-peer/gnu_java_awt_peer_gtk_GtkWindowPeer.c
(create): Set window's size requisition.
(connectHooks): Fix indentation.
(setResizable): Remove function.
(static setBounds): Likewise.
(setBounds): Replace call to setBounds with GTK size requisition
and resize calls.
2003-09-19 Mohan Embar <gnustuff@thisiscool.com>
* win32-threads.cc: (ensure_interrupt_event_initialized) New

View File

@ -53,7 +53,7 @@ public class GtkDialogPeer extends GtkWindowPeer
void create ()
{
create (GTK_WINDOW_POPUP,
create (GTK_WINDOW_TOPLEVEL,
awtComponent.getWidth(),
awtComponent.getHeight());
}
@ -64,6 +64,7 @@ public class GtkDialogPeer extends GtkWindowPeer
Dialog dialog = (Dialog) component;
args.add ("title", dialog.getTitle ());
args.add ("modal", dialog.isModal ());
args.add ("allow_shrink", dialog.isResizable ());
args.add ("allow_grow", dialog.isResizable ());

View File

@ -84,6 +84,7 @@ public class GtkFramePeer extends GtkWindowPeer
args.add ("allow_shrink", frame.isResizable ());
args.add ("allow_grow", frame.isResizable ());
}
public void setIconImage (Image image)
{
/* TODO: Waiting on Toolkit Image routines */

View File

@ -53,7 +53,9 @@ public class GtkWindowPeer extends GtkContainerPeer
void create (int type)
{
create (type, awtComponent.getWidth(), awtComponent.getHeight());
create (type,
awtComponent.getWidth(),
awtComponent.getHeight());
}
void create ()
@ -75,7 +77,7 @@ public class GtkWindowPeer extends GtkContainerPeer
args.add ("visible", component.isVisible ());
args.add ("sensitive", component.isEnabled ());
}
native public void toBack ();
native public void toFront ();
@ -86,7 +88,11 @@ public class GtkWindowPeer extends GtkContainerPeer
set ("title", title);
}
native public void setResizable (boolean r);
public void setResizable (boolean resizable)
{
set ("allow_shrink", resizable);
set ("allow_grow", resizable);
}
protected void postConfigureEvent (int x, int y, int width, int height,
int top, int left, int bottom, int right)

View File

@ -70,7 +70,7 @@ private boolean modal;
/**
* @serial Indicates whether or not this dialog box is resizable.
*/
private boolean resizable;
private boolean resizable = true;
/**
* @serial The title string for this dialog box, which can be
@ -91,7 +91,7 @@ private String title;
/**
* Initializes a new instance of <code>Dialog</code> with the specified
* parent, that is not resizable and not modal, and which has no title.
* parent, that is resizable and not modal, and which has no title.
*
* @param parent The parent frame of this dialog box.
*
@ -109,7 +109,7 @@ Dialog(Frame parent)
/**
* Initializes a new instance of <code>Dialog</code> with the specified
* parent and modality, that is not resizable and which has no title.
* parent and modality, that is resizable and which has no title.
*
* @param parent The parent frame of this dialog box.
* @param modal <true> if this dialog box is modal, <code>false</code>
@ -129,7 +129,7 @@ Dialog(Frame parent, boolean modal)
/**
* Initializes a new instance of <code>Dialog</code> with the specified
* parent, that is not resizable and not modal, and which has the specified
* parent, that is resizable and not modal, and which has the specified
* title.
*
* @param parent The parent frame of this dialog box.
@ -149,7 +149,7 @@ Dialog(Frame parent, String title)
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent, title, and modality, that is not resizable.
* parent, title, and modality, that is resizable.
*
* @param parent The parent frame of this dialog box.
* @param title The title string for this dialog box.
@ -168,7 +168,7 @@ Dialog(Frame parent, String title, boolean modal)
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent, title, modality and <code>GraphicsConfiguration</code>,
* that is not resizable.
* that is resizable.
*
* @param parent The parent frame of this dialog box.
* @param title The title string for this dialog box.
@ -189,14 +189,14 @@ Dialog (Frame parent, String title, boolean modal, GraphicsConfiguration gc)
this.title = title;
this.modal = modal;
resizable = false;
visible = false;
setLayout(new BorderLayout());
}
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent, that is not resizable.
* parent, that is resizable.
*
* @exception IllegalArgumentException If parent is null. This exception is
* always thrown when GraphicsEnvironment.isHeadless() returns true.
@ -211,7 +211,7 @@ Dialog (Dialog owner)
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent and title, that is not resizable.
* parent and title, that is resizable.
*
* @exception IllegalArgumentException If parent is null. This exception is
* always thrown when GraphicsEnvironment.isHeadless() returns true.
@ -226,7 +226,7 @@ Dialog (Dialog owner, String title)
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent, title and modality, that is not resizable.
* parent, title and modality, that is resizable.
*
* @exception IllegalArgumentException If parent is null. This exception is
* always thrown when GraphicsEnvironment.isHeadless() returns true.
@ -242,7 +242,7 @@ Dialog (Dialog owner, String title, boolean modal)
/**
* Initializes a new instance of <code>Dialog</code> with the specified,
* parent, title, modality and <code>GraphicsConfiguration</code>,
* that is not resizable.
* that is resizable.
*
* @exception IllegalArgumentException If parent is null, the
* GraphicsConfiguration is not a screen device or
@ -255,10 +255,10 @@ Dialog (Dialog parent, String title, boolean modal, GraphicsConfiguration gc)
{
super (parent, parent.getGraphicsConfiguration ());
this.modal = modal;
this.title = title;
resizable = false;
this.modal = modal;
visible = false;
setLayout (new BorderLayout ());
}

View File

@ -437,25 +437,6 @@ addNotify()
/*************************************************************************/
/**
* Destroys any resources associated with this frame. This includes
* all components in the frame and all owned toplevel windows.
*/
public void
dispose()
{
Enumeration e = ownedWindows.elements();
while(e.hasMoreElements())
{
Window w = (Window)e.nextElement();
w.dispose();
}
super.dispose();
}
/*************************************************************************/
/**
* Returns a debugging string describing this window.
*
@ -472,8 +453,6 @@ getFrames()
{
//Frame[] array = new Frames[frames.size()];
//return frames.toArray(array);
// see finalize() comment
String msg = "FIXME: can't be implemented without weak references";
throw new UnsupportedOperationException(msg);
}

View File

@ -43,9 +43,13 @@ import java.awt.event.WindowFocusListener;
import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener;
import java.awt.peer.WindowPeer;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.Iterator;
import java.util.EventListener;
import java.util.Locale;
import java.util.ResourceBundle;
import java.util.Vector;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
@ -69,6 +73,9 @@ public class Window extends Container implements Accessible
/** @since 1.4 */
private boolean focusableWindowState = true;
// A list of other top-level windows owned by this window.
private transient Vector ownedWindows = new Vector();
private transient WindowListener windowListener;
private transient WindowFocusListener windowFocusListener;
private transient WindowStateListener windowStateListener;
@ -139,11 +146,13 @@ public class Window extends Container implements Accessible
if (owner == null)
throw new IllegalArgumentException ("owner must not be null");
this.parent = owner;
// FIXME: add to owner's "owned window" list
//owner.owned.add(this); // this should be a weak reference
parent = owner;
synchronized (owner.ownedWindows)
{
owner.ownedWindows.add(new WeakReference(this));
}
// FIXME: make this text visible in the window.
SecurityManager s = System.getSecurityManager();
if (s != null && ! s.checkTopLevelWindow(this))
@ -170,18 +179,6 @@ public class Window extends Container implements Accessible
return super.getGraphicsConfigurationImpl();
}
/**
* Disposes of the input methods and context, and removes the WeakReference
* which formerly pointed to this Window from the parent's owned Window list.
*
* @exception Throwable The Exception raised by this method.
*/
protected void finalize() throws Throwable
{
// FIXME: remove from owner's "owned window" list (Weak References)
super.finalize();
}
/**
* Creates the native peer for this window.
*/
@ -227,7 +224,23 @@ public class Window extends Container implements Accessible
public void hide()
{
// FIXME: call hide() on any "owned" children here.
synchronized (ownedWindows)
{
Iterator e = ownedWindows.iterator();
while(e.hasNext())
{
Window w = (Window)(((Reference) e.next()).get());
if (w != null)
w.hide();
else
// Remove null weak reference from ownedWindows.
// Unfortunately this can't be done in the Window's
// finalize method because there is no way to guarantee
// synchronous access to ownedWindows there.
e.remove();
}
}
super.hide();
}
@ -239,15 +252,26 @@ public class Window extends Container implements Accessible
}
/**
* Called to free any resource associated with this window.
* Destroys any resources associated with this window. This includes
* all components in the window and all owned top-level windows.
*/
public void dispose()
{
hide();
Window[] list = getOwnedWindows();
for (int i=0; i<list.length; i++)
list[i].dispose();
synchronized (ownedWindows)
{
Iterator e = ownedWindows.iterator();
while(e.hasNext())
{
Window w = (Window)(((Reference) e.next()).get());
if (w != null)
w.dispose();
else
// Remove null weak reference from ownedWindows.
e.remove();
}
}
for (int i = 0; i < ncomponents; ++i)
component[i].removeNotify();
@ -340,9 +364,33 @@ public class Window extends Container implements Accessible
/** @since 1.2 */
public Window[] getOwnedWindows()
{
// FIXME: return array containing all the windows this window currently
// owns.
return new Window[0];
Window [] trimmedList;
synchronized (ownedWindows)
{
// Windows with non-null weak references in ownedWindows.
Window [] validList = new Window [ownedWindows.size()];
Iterator e = ownedWindows.iterator();
int numValid = 0;
while (e.hasNext())
{
Window w = (Window)(((Reference) e.next()).get());
if (w != null)
validList[numValid++] = w;
else
// Remove null weak reference from ownedWindows.
e.remove();
}
if (numValid != validList.length)
{
trimmedList = new Window [numValid];
System.arraycopy (validList, 0, trimmedList, 0, numValid);
}
else
trimmedList = validList;
}
return trimmedList;
}
/**

View File

@ -494,15 +494,11 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_S
const char *name;
const char *value;
void *ptr;
GtkArg arg;
ptr = NSA_GET_PTR (env, obj);
name = (*env)->GetStringUTFChars (env, jname, NULL);
value = (*env)->GetStringUTFChars (env, jvalue, NULL);
arg.type = GTK_TYPE_STRING;
arg.name = (char *) name;
GTK_VALUE_STRING (arg) = (char *) value;
gdk_threads_enter();
g_object_set(ptr, name, value, NULL);
gdk_threads_leave();
@ -512,20 +508,20 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_S
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Z
(JNIEnv *env, jobject obj, jstring jname, jboolean value)
(JNIEnv *env, jobject obj, jstring jname, jboolean jvalue)
{
const char *name;
gboolean value;
void *ptr;
GtkArg arg;
ptr = NSA_GET_PTR (env, obj);
name = (*env)->GetStringUTFChars (env, jname, NULL);
/* Apparently a jboolean can have a value greater than 1. gboolean
variables may only contain the value TRUE or FALSE. */
value = jvalue ? TRUE : FALSE;
arg.type = GTK_TYPE_BOOL;
arg.name = (char *) name;
GTK_VALUE_BOOL (arg) = value;
gdk_threads_enter();
gdk_threads_enter();
g_object_set(ptr, name, value, NULL);
gdk_threads_leave();
@ -537,15 +533,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_la
{
const char *name;
void *ptr;
GtkArg arg;
ptr = NSA_GET_PTR (env, obj);
name = (*env)->GetStringUTFChars (env, jname, NULL);
arg.type = GTK_TYPE_INT;
arg.name = (char *) name;
GTK_VALUE_INT (arg) = value;
gdk_threads_enter();
g_object_set(ptr, name, value, NULL);
gdk_threads_leave();
@ -558,15 +549,10 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_la
{
const char *name;
void *ptr;
GtkArg arg;
ptr = NSA_GET_PTR (env, obj);
name = (*env)->GetStringUTFChars (env, jname, NULL);
arg.type = GTK_TYPE_FLOAT;
arg.name = (char *) name;
GTK_VALUE_FLOAT (arg) = value;
gdk_threads_enter();
g_object_set(ptr, name, value, NULL);
gdk_threads_leave();
@ -580,7 +566,6 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O
{
const char *name;
void *ptr1, *ptr2;
GtkArg arg;
ptr1 = NSA_GET_PTR (env, obj1);
ptr2 = NSA_GET_PTR (env, obj2);
@ -598,10 +583,6 @@ Java_gnu_java_awt_peer_gtk_GtkComponentPeer_set__Ljava_lang_String_2Ljava_lang_O
return;
}
arg.type = GTK_TYPE_OBJECT;
arg.name = (char *) name;
GTK_VALUE_OBJECT (arg) = GTK_OBJECT (ptr2);
gdk_threads_enter();
g_object_set(ptr1, name, ptr2, NULL);
gdk_threads_leave();

View File

@ -42,8 +42,6 @@ exception statement from your version. */
#include <gdk/gdkprivate.h>
#include <gdk/gdkx.h>
static void setBounds (GtkWidget *, jint, jint, jint, jint);
/*
* Make a new window (any type)
*/
@ -60,6 +58,13 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_create
gtk_window_set_default_size (GTK_WINDOW(window), width, height);
/* We must set this window's size requisition. Otherwise when a
resize is queued (when gtk_widget_queue_resize is called) the
window will snap to its default requisition of 0x0. If we omit
this call, Frames and Dialogs shrink to degenerate 1x1 windows
when their resizable property changes. */
gtk_widget_set_size_request (window, width, height);
vbox = gtk_vbox_new (0, 0);
layout = gtk_layout_new (NULL, NULL);
gtk_box_pack_end (GTK_BOX (vbox), layout, 1, 1, 0);
@ -88,6 +93,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setVisible
gtk_widget_hide (GTK_WIDGET (ptr));
XFlush (GDK_DISPLAY ());
gdk_threads_leave ();
}
@ -102,20 +108,20 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_connectHooks
gdk_threads_enter ();
children = gtk_container_get_children(GTK_CONTAINER(ptr));
vbox = children->data;
children = gtk_container_get_children(GTK_CONTAINER(ptr));
vbox = children->data;
if(!GTK_IS_VBOX(vbox))
{
printf("*** this is not a vbox\n");
}
children = gtk_container_get_children(GTK_CONTAINER(vbox));
layout = children->data;
if(!GTK_IS_VBOX(vbox))
{
printf("*** this is not a vbox\n");
}
children = gtk_container_get_children(GTK_CONTAINER(vbox));
layout = children->data;
if(!GTK_IS_LAYOUT(layout))
{
if(!GTK_IS_LAYOUT(layout))
{
printf("*** widget is not a layout ***");
}
}
gtk_widget_realize (layout);
@ -176,24 +182,6 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setTitle
(*env)->ReleaseStringUTFChars (env, title, str);
}
/*
* Set a window's resizing policy
*/
JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setResizable
(JNIEnv *env, jobject obj, jboolean resize)
{
void *ptr;
ptr = NSA_GET_PTR (env, obj);
gdk_threads_enter ();
gtk_window_set_policy (GTK_WINDOW (ptr), resize, resize, 0);
gdk_threads_leave ();
}
/*
* Lower the z-level of a window.
*/
@ -230,12 +218,6 @@ Java_gnu_java_awt_peer_gtk_GtkWindowPeer_toFront (JNIEnv *env,
gdk_threads_leave ();
}
static void
setBounds (GtkWidget *widget, jint x, jint y, jint width, jint height)
{
gtk_window_resize (GTK_WINDOW(widget), width, height);
}
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBounds
(JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height)
{
@ -247,7 +229,8 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkWindowPeer_setBounds
gdk_threads_enter ();
widget = GTK_WIDGET (ptr);
setBounds (widget, x, y, width, height);
gtk_widget_set_size_request (widget, width, height);
gtk_window_resize (GTK_WINDOW(widget), width, height);
gdk_threads_leave ();
}
@ -306,7 +289,7 @@ gdk_window_get_root_geometry (GdkWindow *window,
gint *depth)
{
GdkWindow *private;
g_return_if_fail (window != NULL);
private = (GdkWindow*) window;