2004-01-05 Thomas Fitzsimmons <fitzsim@redhat.com>
* gnu/java/awt/peer/gtk/GtkScrollPanePeer.java, jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c (create(int, int)): New method. (create): Call new create method. (gtkScrolledWindowNew, gtkScrolledWindowSetSize): Remove methods. (childResized): Remove native implementation. Implement in Java. (getHScrollbarHeight, getVScrollbarWidth): Call gtk_widget_size_request to get scrollbar dimensions. * java/awt/ScrollPane.java (getViewportSize): Reimplement. Only call getVScrollbarWidth and getHScrollbarHeight when vertical and horizontal scrollbars respectively are needed. (doLayout): Enlarge child if it is smaller than the viewport. From-SVN: r75446
This commit is contained in:
parent
4b6eeb9ac4
commit
6037221c71
@ -1,3 +1,20 @@
|
|||||||
|
2004-01-05 Thomas Fitzsimmons <fitzsim@redhat.com>
|
||||||
|
|
||||||
|
* gnu/java/awt/peer/gtk/GtkScrollPanePeer.java,
|
||||||
|
jni/gtk-peer/gnu_java_awt_peer_gtk_GtkScrollPanePeer.c
|
||||||
|
(create(int, int)): New method.
|
||||||
|
(create): Call new create method.
|
||||||
|
(gtkScrolledWindowNew, gtkScrolledWindowSetSize): Remove
|
||||||
|
methods.
|
||||||
|
(childResized): Remove native implementation. Implement in
|
||||||
|
Java.
|
||||||
|
(getHScrollbarHeight, getVScrollbarWidth): Call
|
||||||
|
gtk_widget_size_request to get scrollbar dimensions.
|
||||||
|
* java/awt/ScrollPane.java (getViewportSize): Reimplement. Only
|
||||||
|
call getVScrollbarWidth and getHScrollbarHeight when vertical
|
||||||
|
and horizontal scrollbars respectively are needed.
|
||||||
|
(doLayout): Enlarge child if it is smaller than the viewport.
|
||||||
|
|
||||||
2004-01-05 Fernando Nasser <fnasser@redhat.com>
|
2004-01-05 Fernando Nasser <fnasser@redhat.com>
|
||||||
|
|
||||||
* java/awt/Dialog.java (constructor): Accept null title as per spec.
|
* java/awt/Dialog.java (constructor): Accept null title as per spec.
|
||||||
|
@ -46,15 +46,17 @@ import java.awt.peer.ScrollPanePeer;
|
|||||||
public class GtkScrollPanePeer extends GtkContainerPeer
|
public class GtkScrollPanePeer extends GtkContainerPeer
|
||||||
implements ScrollPanePeer
|
implements ScrollPanePeer
|
||||||
{
|
{
|
||||||
native void create ();
|
native void create (int width, int height);
|
||||||
|
|
||||||
|
void create ()
|
||||||
|
{
|
||||||
|
create (awtComponent.getWidth (), awtComponent.getHeight ());
|
||||||
|
}
|
||||||
|
|
||||||
native void gtkScrolledWindowNew(ComponentPeer parent,
|
|
||||||
int policy, int w, int h, int[] dims);
|
|
||||||
native void gtkScrolledWindowSetScrollPosition(int x, int y);
|
native void gtkScrolledWindowSetScrollPosition(int x, int y);
|
||||||
native void gtkScrolledWindowSetHScrollIncrement (int u);
|
native void gtkScrolledWindowSetHScrollIncrement (int u);
|
||||||
native void gtkScrolledWindowSetVScrollIncrement (int u);
|
native void gtkScrolledWindowSetVScrollIncrement (int u);
|
||||||
native void gtkScrolledWindowSetSize(int w, int h);
|
|
||||||
|
|
||||||
public GtkScrollPanePeer (ScrollPane sp)
|
public GtkScrollPanePeer (ScrollPane sp)
|
||||||
{
|
{
|
||||||
super (sp);
|
super (sp);
|
||||||
@ -63,7 +65,24 @@ public class GtkScrollPanePeer extends GtkContainerPeer
|
|||||||
}
|
}
|
||||||
|
|
||||||
native void setPolicy (int policy);
|
native void setPolicy (int policy);
|
||||||
native public void childResized (int width, int height);
|
public void childResized (int width, int height)
|
||||||
|
{
|
||||||
|
int dim[] = new int[2];
|
||||||
|
|
||||||
|
gtkWidgetGetDimensions (dim);
|
||||||
|
|
||||||
|
// If the child is in this range, GTK adds both scrollbars, but
|
||||||
|
// the AWT doesn't. So set the peer's scroll policy to
|
||||||
|
// GTK_POLICY_NEVER.
|
||||||
|
if ((width > dim[0] - getVScrollbarWidth ()
|
||||||
|
&& width <= dim[0])
|
||||||
|
&& (height > dim[1] - getHScrollbarHeight ()
|
||||||
|
&& height <= dim[1]))
|
||||||
|
setPolicy (ScrollPane.SCROLLBARS_NEVER);
|
||||||
|
else
|
||||||
|
setPolicy (((ScrollPane) awtComponent).getScrollbarDisplayPolicy ());
|
||||||
|
}
|
||||||
|
|
||||||
native public int getHScrollbarHeight ();
|
native public int getHScrollbarHeight ();
|
||||||
native public int getVScrollbarWidth ();
|
native public int getVScrollbarWidth ();
|
||||||
native public void setScrollPosition (int x, int y);
|
native public void setScrollPosition (int x, int y);
|
||||||
|
@ -218,12 +218,71 @@ public Dimension getViewportSize ()
|
|||||||
{
|
{
|
||||||
Dimension viewsize = getSize ();
|
Dimension viewsize = getSize ();
|
||||||
Insets insets = getInsets ();
|
Insets insets = getInsets ();
|
||||||
viewsize.width = (viewsize.width
|
|
||||||
- (insets.left + insets.right)
|
viewsize.width -= (insets.left + insets.right);
|
||||||
- getVScrollbarWidth ());
|
viewsize.height -= (insets.top + insets.bottom);
|
||||||
viewsize.height = (viewsize.height
|
|
||||||
- (insets.top + insets.bottom)
|
Component[] list = getComponents();
|
||||||
- getHScrollbarHeight ());
|
if ((list == null) || (list.length <= 0))
|
||||||
|
return viewsize;
|
||||||
|
|
||||||
|
Dimension dim = list[0].getPreferredSize();
|
||||||
|
|
||||||
|
if (dim.width <= 0 && dim.height <= 0)
|
||||||
|
return viewsize;
|
||||||
|
|
||||||
|
int vScrollbarWidth = getVScrollbarWidth ();
|
||||||
|
int hScrollbarHeight = getHScrollbarHeight ();
|
||||||
|
|
||||||
|
if (scrollbarDisplayPolicy == SCROLLBARS_ALWAYS)
|
||||||
|
{
|
||||||
|
viewsize.width -= vScrollbarWidth;
|
||||||
|
viewsize.height -= hScrollbarHeight;
|
||||||
|
return viewsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scrollbarDisplayPolicy == SCROLLBARS_NEVER)
|
||||||
|
return viewsize;
|
||||||
|
|
||||||
|
// The scroll policy is SCROLLBARS_AS_NEEDED, so we need to see if
|
||||||
|
// either scrollbar is needed.
|
||||||
|
|
||||||
|
// Assume we don't need either scrollbar.
|
||||||
|
boolean mayNeedVertical = false;
|
||||||
|
boolean mayNeedHorizontal = false;
|
||||||
|
|
||||||
|
boolean needVertical = false;
|
||||||
|
boolean needHorizontal = false;
|
||||||
|
|
||||||
|
// Check if we need vertical scrollbars. If we do, then we need to
|
||||||
|
// subtract the width of the vertical scrollbar from the viewport's
|
||||||
|
// width.
|
||||||
|
if (dim.height > viewsize.height)
|
||||||
|
needVertical = true;
|
||||||
|
else if (dim.height > (viewsize.height - hScrollbarHeight))
|
||||||
|
// This is tricky. In this case the child is tall enough that its
|
||||||
|
// bottom edge would be covered by a horizontal scrollbar, if one
|
||||||
|
// were present. This means that if there's a horizontal
|
||||||
|
// scrollbar then we need a vertical scrollbar.
|
||||||
|
mayNeedVertical = true;
|
||||||
|
|
||||||
|
if (dim.width > viewsize.width)
|
||||||
|
needHorizontal = true;
|
||||||
|
else if (dim.width > (viewsize.width - vScrollbarWidth))
|
||||||
|
mayNeedHorizontal = true;
|
||||||
|
|
||||||
|
if (needVertical && mayNeedHorizontal)
|
||||||
|
needHorizontal = true;
|
||||||
|
|
||||||
|
if (needHorizontal && mayNeedVertical)
|
||||||
|
needVertical = true;
|
||||||
|
|
||||||
|
if (needHorizontal)
|
||||||
|
viewsize.height -= hScrollbarHeight;
|
||||||
|
|
||||||
|
if (needVertical)
|
||||||
|
viewsize.width -= vScrollbarWidth;
|
||||||
|
|
||||||
return viewsize;
|
return viewsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,7 +450,19 @@ doLayout()
|
|||||||
if ((list != null) && (list.length > 0))
|
if ((list != null) && (list.length > 0))
|
||||||
{
|
{
|
||||||
Dimension dim = list[0].getPreferredSize();
|
Dimension dim = list[0].getPreferredSize();
|
||||||
list[0].resize(dim);
|
Dimension vp = getViewportSize ();
|
||||||
|
|
||||||
|
if (dim.width < vp.width)
|
||||||
|
dim.width = vp.width;
|
||||||
|
|
||||||
|
if (dim.height < vp.height)
|
||||||
|
dim.height = vp.height;
|
||||||
|
|
||||||
|
ScrollPanePeer peer = (ScrollPanePeer) getPeer ();
|
||||||
|
if (peer != null)
|
||||||
|
peer.childResized (dim.width, dim.height);
|
||||||
|
|
||||||
|
list[0].resize (dim);
|
||||||
|
|
||||||
Point p = getScrollPosition();
|
Point p = getScrollPosition();
|
||||||
if (p.x > dim.width)
|
if (p.x > dim.width)
|
||||||
|
@ -41,20 +41,22 @@ exception statement from your version. */
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create
|
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_create
|
||||||
(JNIEnv *env, jobject obj)
|
(JNIEnv *env, jobject obj, int width, int height)
|
||||||
{
|
{
|
||||||
gpointer window;
|
GtkWidget *sw;
|
||||||
|
|
||||||
/* Create global reference and save it for future use */
|
/* Create global reference and save it for future use */
|
||||||
NSA_SET_GLOBAL_REF (env, obj);
|
NSA_SET_GLOBAL_REF (env, obj);
|
||||||
|
|
||||||
gdk_threads_enter ();
|
gdk_threads_enter ();
|
||||||
|
|
||||||
window = gtk_scrolled_window_new (NULL, NULL);
|
sw = gtk_scrolled_window_new (NULL, NULL);
|
||||||
|
|
||||||
|
gtk_widget_set_size_request (sw, width, height);
|
||||||
|
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
|
|
||||||
NSA_SET_PTR (env, obj, window);
|
NSA_SET_PTR (env, obj, sw);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
JNIEXPORT void JNICALL
|
||||||
@ -116,34 +118,25 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_gtkScrolledWindowSetVScrollIncremen
|
|||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL
|
|
||||||
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_childResized
|
|
||||||
(JNIEnv *env, jobject obj, jint width, jint height)
|
|
||||||
{
|
|
||||||
void *ptr;
|
|
||||||
|
|
||||||
ptr = NSA_GET_PTR (env, obj);
|
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
gdk_threads_enter ();
|
|
||||||
gtk_widget_set_usize (GTK_BIN (ptr)->child, width, height);
|
|
||||||
gdk_threads_leave ();
|
|
||||||
}
|
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL
|
JNIEXPORT jint JNICALL
|
||||||
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getHScrollbarHeight
|
Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getHScrollbarHeight
|
||||||
(JNIEnv *env, jobject obj)
|
(JNIEnv *env, jobject obj)
|
||||||
{
|
{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
GtkScrolledWindow *sw;
|
GtkScrolledWindow *sw;
|
||||||
jint height;
|
GtkRequisition requisition;
|
||||||
|
jint height = 0;
|
||||||
|
jint spacing = 0;
|
||||||
|
|
||||||
ptr = NSA_GET_PTR (env, obj);
|
ptr = NSA_GET_PTR (env, obj);
|
||||||
|
|
||||||
gdk_threads_enter ();
|
gdk_threads_enter ();
|
||||||
sw = GTK_SCROLLED_WINDOW (ptr);
|
sw = GTK_SCROLLED_WINDOW (ptr);
|
||||||
height = (sw->hscrollbar_visible) ? sw->hscrollbar->allocation.height : 0;
|
|
||||||
|
gtk_widget_size_request (sw->hscrollbar, &requisition);
|
||||||
|
gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
|
||||||
|
height = requisition.height + spacing;
|
||||||
|
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
|
|
||||||
return height;
|
return height;
|
||||||
@ -155,13 +148,19 @@ Java_gnu_java_awt_peer_gtk_GtkScrollPanePeer_getVScrollbarWidth
|
|||||||
{
|
{
|
||||||
void *ptr;
|
void *ptr;
|
||||||
GtkScrolledWindow *sw;
|
GtkScrolledWindow *sw;
|
||||||
jint width;
|
GtkRequisition requisition;
|
||||||
|
jint width = 0;
|
||||||
|
jint spacing = 0;
|
||||||
|
|
||||||
ptr = NSA_GET_PTR (env, obj);
|
ptr = NSA_GET_PTR (env, obj);
|
||||||
|
|
||||||
gdk_threads_enter ();
|
gdk_threads_enter ();
|
||||||
sw = GTK_SCROLLED_WINDOW (ptr);
|
sw = GTK_SCROLLED_WINDOW (ptr);
|
||||||
width = (sw->vscrollbar_visible) ? sw->vscrollbar->allocation.width : 0;
|
|
||||||
|
gtk_widget_size_request (sw->vscrollbar, &requisition);
|
||||||
|
gtk_widget_style_get (GTK_WIDGET (sw), "scrollbar_spacing", &spacing, NULL);
|
||||||
|
width = requisition.width + spacing;
|
||||||
|
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
|
|
||||||
return width;
|
return width;
|
||||||
|
Loading…
Reference in New Issue
Block a user