diff options
author | Lars Hamann <lars@gtk.org> | 1998-11-05 15:44:22 +0000 |
---|---|---|
committer | Lars Hamann <lars@src.gnome.org> | 1998-11-05 15:44:22 +0000 |
commit | 00fbbe68b035f9e2888b0005e30370cb6913be39 (patch) | |
tree | 9e450c963e020e15e6b77b124ec8fb36e58d2350 /gtk/gtkscrolledwindow.c | |
parent | 6a227eec1cd13cd5b364b2f1f3c77febc5d70de5 (diff) | |
download | gtk+-00fbbe68b035f9e2888b0005e30370cb6913be39.tar.gz |
removed vscrollbar, hscrollbar, vscrollbar_policy, hscrollbar_policy.
Thu Nov 5 16:00:32 1998 Lars Hamann <lars@gtk.org>
* gtk/gtkclist.h (struct _GtkCList): removed vscrollbar, hscrollbar,
vscrollbar_policy, hscrollbar_policy. added h/vadjustment.
* gtk/gtkclist.c (gtk_clist_class_init): added new args types
"hadjustment" & "vadjustment"
(gtk_clist_set_arg) (gtk_clist_get_arg): new object class
set/get_arg functions
(gtk_clist_construct): don't create/adjust scrollbars.
(gtk_clist_set_hadjustment) (gtk_clist_set_vadjustment): new functions
to set h/vadjustments
(gtk_clist_get_vadjustment) (gtk_clist_get_hadjustment): new functions
to query h/vadjustments
(create_scrollbars): removed.
(create_adjustments): replacement for create_scrollbars
(gtk_clist_new): call gtk_clist_new_with_titles
(gtk_clist_new_with_titles): don't warn on titles == NULL
(move_horizontal): use CLAMP instead
(gtk_clist_set_policy): deprecated method.
use gtk_scrolled_window_set_policy instead.
(vadjustment_value_changed): use clist->vadj.
(adjust_scrollbars): renamed to adjust_adjustments
(adjust_adjustments): former adjust_scrollbars
(gtk_clist_destroy): unref adjustments
(gtk_clist_size_allocate) (gtk_clist_map) (title_focus)
(gtk_clist_unmap) (gtk_clist_size_request) (gtk_clist_focus)
(gtk_clist_size_allocate) (gtk_clist_forall): don't use scrollbars
(gtk_clist_thaw) (real_insert_row) (real_remove_row)
(gtk_clist_set_row_height) (real_resize_column):
call adjust_adjustments
(gtk_clist_moveto): return if clist has no adjustments yet.
(gtk_clist_parent_set): new GtkWidget::parent_set function.
Autogenerate h/vadjustments if needed.
(move_horizontal) (move_vertical): some cleanups
* gtk/gtkviewport.c (gtk_viewport_set_arg) (gtk_viewport_new):
call only gtk_viewport_set_h/vadjustment and let these functions
do the work.
(gtk_viewport_set_hadjustment) (gtk_viewport_set_vadjustment):
generate a new adjustment if needed
* gtk/gtkscrolledwindow.h ((struct _GtkScrolledWindow):
use a guint bitfield for h/vscrollbar_policy and h/vscrollbar_visible
* gtk/gtkscrolledwindow.c (gtk_scrolled_window_adjustment_changed):
queue_resize if visibility of scrollbars changes
(gtk_scrolled_window_remove): only call container_remove with
scrolled_window->viewport automatically if viewport was autogenerated
(gtk_scrolled_window_add): add widget as scrolled_window->viewport.
auto create a viewport only if widget does not take h/vadjustments.
(gtk_scrolled_window_construct): don't generate a viewport
automatically.
(gtk_scrolled_window_forall): call callback with viewport in any case
(gtk_scrolled_window_set_arg): call gtk_container_add in case of
ARG_VIEWPORT
(gtk_scrolled_window_size_allocate) (gtk_scrolled_window_size_request)
(gtk_scrolled_window_map) (gtk_scrolled_window_unmap): check
viewport != NULL
* gtk/testgtk.c
(create_ctree) (export_ctree) (create_clist): use a scrolled_window
in conjunction with clists/ctrees
* gtk/gtkfilesel.c (gtk_file_selection_init): use a scrolled_window
in conjunction with clists
* gtk/gtkfontsel.c (gtk_font_selection_init): use a scrolled_window
in conjunction with clists
Diffstat (limited to 'gtk/gtkscrolledwindow.c')
-rw-r--r-- | gtk/gtkscrolledwindow.c | 128 |
1 files changed, 96 insertions, 32 deletions
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c index 944cc81ec2..046e5eb472 100644 --- a/gtk/gtkscrolledwindow.c +++ b/gtk/gtkscrolledwindow.c @@ -147,12 +147,8 @@ gtk_scrolled_window_set_arg (GtkObject *object, GtkWidget *viewport; case ARG_VIEWPORT: - g_return_if_fail (scrolled_window->viewport == NULL); viewport = GTK_VALUE_POINTER (*arg); - if (!viewport) - viewport = gtk_viewport_new (NULL, NULL); - scrolled_window->viewport = viewport; - gtk_scrolled_window_construct (scrolled_window, NULL, NULL); + gtk_container_add (GTK_CONTAINER (scrolled_window), viewport); case ARG_HSCROLLBAR_POLICY: gtk_scrolled_window_set_policy (scrolled_window, GTK_VALUE_ENUM (*arg), @@ -205,6 +201,7 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window) scrolled_window->vscrollbar = NULL; scrolled_window->hscrollbar_policy = GTK_POLICY_ALWAYS; scrolled_window->vscrollbar_policy = GTK_POLICY_ALWAYS; + scrolled_window->autogenerated_viewport = FALSE; } GtkWidget* @@ -216,7 +213,7 @@ gtk_scrolled_window_new (GtkAdjustment *hadjustment, scrolled_window = gtk_type_new (GTK_TYPE_SCROLLED_WINDOW); gtk_scrolled_window_construct (GTK_SCROLLED_WINDOW (scrolled_window), hadjustment, vadjustment); - + return scrolled_window; } @@ -230,14 +227,13 @@ gtk_scrolled_window_construct (GtkScrolledWindow *scrolled_window, g_return_if_fail (scrolled_window->hscrollbar == NULL); g_return_if_fail (scrolled_window->vscrollbar == NULL); - if (scrolled_window->viewport) - g_return_if_fail (hadjustment == NULL && vadjustment == NULL); - else - scrolled_window->viewport = gtk_viewport_new (hadjustment, vadjustment); + scrolled_window->hscrollbar = gtk_hscrollbar_new (hadjustment); + scrolled_window->vscrollbar = gtk_vscrollbar_new (vadjustment); - hadjustment = gtk_viewport_get_hadjustment (GTK_VIEWPORT (scrolled_window->viewport)); - vadjustment = gtk_viewport_get_vadjustment (GTK_VIEWPORT (scrolled_window->viewport)); - gtk_container_set_resize_mode (GTK_CONTAINER (scrolled_window->viewport), GTK_RESIZE_PARENT); + hadjustment = + gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar)); + vadjustment = + gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar)); gtk_signal_connect (GTK_OBJECT (hadjustment), "changed", (GtkSignalFunc) gtk_scrolled_window_adjustment_changed, @@ -246,18 +242,12 @@ gtk_scrolled_window_construct (GtkScrolledWindow *scrolled_window, (GtkSignalFunc) gtk_scrolled_window_adjustment_changed, (gpointer) scrolled_window); - scrolled_window->hscrollbar = gtk_hscrollbar_new (hadjustment); - scrolled_window->vscrollbar = gtk_vscrollbar_new (vadjustment); - - gtk_widget_set_parent (scrolled_window->viewport, GTK_WIDGET (scrolled_window)); gtk_widget_set_parent (scrolled_window->hscrollbar, GTK_WIDGET (scrolled_window)); gtk_widget_set_parent (scrolled_window->vscrollbar, GTK_WIDGET (scrolled_window)); - gtk_widget_show (scrolled_window->viewport); gtk_widget_show (scrolled_window->hscrollbar); gtk_widget_show (scrolled_window->vscrollbar); - gtk_widget_ref (scrolled_window->viewport); gtk_widget_ref (scrolled_window->hscrollbar); gtk_widget_ref (scrolled_window->vscrollbar); } @@ -344,7 +334,8 @@ gtk_scrolled_window_map (GtkWidget *widget) GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); scrolled_window = GTK_SCROLLED_WINDOW (widget); - if (GTK_WIDGET_VISIBLE (scrolled_window->viewport) && + if (scrolled_window->viewport && + GTK_WIDGET_VISIBLE (scrolled_window->viewport) && !GTK_WIDGET_MAPPED (scrolled_window->viewport)) gtk_widget_map (scrolled_window->viewport); @@ -371,7 +362,8 @@ gtk_scrolled_window_unmap (GtkWidget *widget) GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); scrolled_window = GTK_SCROLLED_WINDOW (widget); - if (GTK_WIDGET_MAPPED (scrolled_window->viewport)) + if (scrolled_window->viewport && + GTK_WIDGET_MAPPED (scrolled_window->viewport)) gtk_widget_unmap (scrolled_window->viewport); if (GTK_WIDGET_MAPPED (scrolled_window->hscrollbar)) @@ -397,7 +389,8 @@ gtk_scrolled_window_draw (GtkWidget *widget, { scrolled_window = GTK_SCROLLED_WINDOW (widget); - if (gtk_widget_intersect (scrolled_window->viewport, area, &child_area)) + if (scrolled_window->viewport && + gtk_widget_intersect (scrolled_window->viewport, area, &child_area)) gtk_widget_draw (scrolled_window->viewport, &child_area); if (gtk_widget_intersect (scrolled_window->hscrollbar, area, &child_area)) @@ -425,7 +418,8 @@ gtk_scrolled_window_size_request (GtkWidget *widget, requisition->width = 0; requisition->height = 0; - if (GTK_WIDGET_VISIBLE (scrolled_window->viewport)) + if (scrolled_window->viewport && + GTK_WIDGET_VISIBLE (scrolled_window->viewport)) { gtk_widget_size_request (scrolled_window->viewport, &scrolled_window->viewport->requisition); @@ -483,7 +477,8 @@ gtk_scrolled_window_size_allocate (GtkWidget *widget, if (scrolled_window->vscrollbar_policy == GTK_POLICY_ALWAYS) scrolled_window->vscrollbar_visible = TRUE; - if (GTK_WIDGET_VISIBLE (scrolled_window->viewport)) + if (scrolled_window->viewport && + GTK_WIDGET_VISIBLE (scrolled_window->viewport)) { count = 0; @@ -562,13 +557,75 @@ gtk_scrolled_window_add (GtkContainer *container, GtkWidget *widget) { GtkScrolledWindow *scrolled_window; + GtkArgInfo *info_hadj; + GtkArgInfo *info_vadj; + GtkArg arg; + gchar *error; g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container)); g_return_if_fail (widget != NULL); scrolled_window = GTK_SCROLLED_WINDOW (container); - gtk_container_add (GTK_CONTAINER (scrolled_window->viewport), widget); + + if (scrolled_window->viewport) + gtk_container_remove (container, scrolled_window->viewport); + + error = gtk_object_arg_get_info (GTK_OBJECT_TYPE (widget), + "hadjustment", &info_hadj); + if (!error) + { + error = gtk_object_arg_get_info (GTK_OBJECT_TYPE (widget), + "vadjustment", &info_vadj); + + if (!error) + { + gtk_object_set (GTK_OBJECT (widget), + "hadjustment", + gtk_scrolled_window_get_hadjustment + (scrolled_window), + "vadjustment", + gtk_scrolled_window_get_vadjustment + (scrolled_window), + NULL); + scrolled_window->viewport = widget; + gtk_widget_set_parent (widget, GTK_WIDGET (scrolled_window)); + gtk_widget_ref (widget); + scrolled_window->autogenerated_viewport = FALSE; + } + } + + if (error) + { + g_free (error); + + scrolled_window->viewport = gtk_viewport_new + (gtk_scrolled_window_get_hadjustment (scrolled_window), + gtk_scrolled_window_get_vadjustment (scrolled_window)); + gtk_widget_set_parent (scrolled_window->viewport, + GTK_WIDGET (scrolled_window)); + gtk_widget_ref (scrolled_window->viewport); + gtk_widget_show (scrolled_window->viewport); + scrolled_window->autogenerated_viewport = FALSE; + + gtk_container_add (GTK_CONTAINER (scrolled_window->viewport), widget); + + widget = scrolled_window->viewport; + } + + if (GTK_WIDGET_VISIBLE (scrolled_window)) + { + if (GTK_WIDGET_REALIZED (scrolled_window) && + !GTK_WIDGET_REALIZED (widget)) + gtk_widget_realize (widget); + + if (GTK_WIDGET_MAPPED (scrolled_window) && + !GTK_WIDGET_MAPPED (widget)) + gtk_widget_map (widget); + } + + if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (scrolled_window)) + gtk_widget_queue_resize (widget); } static void @@ -582,15 +639,18 @@ gtk_scrolled_window_remove (GtkContainer *container, g_return_if_fail (widget != NULL); scrolled_window = GTK_SCROLLED_WINDOW (container); - if (scrolled_window->viewport == widget || scrolled_window->hscrollbar == widget || scrolled_window->vscrollbar == widget) { /* this happens during destroy */ + + if (scrolled_window->viewport == widget) + scrolled_window->autogenerated_viewport = FALSE; + gtk_widget_unparent (widget); } - else + else if (scrolled_window->autogenerated_viewport) gtk_container_remove (GTK_CONTAINER (scrolled_window->viewport), widget); } @@ -608,16 +668,13 @@ gtk_scrolled_window_forall (GtkContainer *container, scrolled_window = GTK_SCROLLED_WINDOW (container); + if (scrolled_window->viewport) + (* callback) (scrolled_window->viewport, callback_data); if (include_internals) { - if (scrolled_window->viewport) - (* callback) (scrolled_window->viewport, callback_data); - (* callback) (scrolled_window->vscrollbar, callback_data); (* callback) (scrolled_window->hscrollbar, callback_data); } - else if (scrolled_window->viewport) - gtk_container_foreach (GTK_CONTAINER (scrolled_window->viewport), callback, callback_data); } static void @@ -649,6 +706,7 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, gpointer data) { GtkScrolledWindow *scrolled_win; + gboolean visible; g_return_if_fail (adjustment != NULL); g_return_if_fail (data != NULL); @@ -659,16 +717,22 @@ gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment, { if (scrolled_win->hscrollbar_policy == GTK_POLICY_AUTOMATIC) { + visible = scrolled_win->hscrollbar_visible; scrolled_win->hscrollbar_visible = ((adjustment->upper - adjustment->lower) > adjustment->page_size); + if (scrolled_win->hscrollbar_visible != visible) + gtk_widget_queue_resize (GTK_WIDGET (scrolled_win)); } } else if (adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_win->vscrollbar))) { if (scrolled_win->vscrollbar_policy == GTK_POLICY_AUTOMATIC) { + visible = scrolled_win->vscrollbar_visible; scrolled_win->vscrollbar_visible = ((adjustment->upper - adjustment->lower) > adjustment->page_size); + if (scrolled_win->vscrollbar_visible != visible) + gtk_widget_queue_resize (GTK_WIDGET (scrolled_win)); } } else |