summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorLars Hamann <lars@gtk.org>1998-11-07 14:29:22 +0000
committerLars Hamann <lars@src.gnome.org>1998-11-07 14:29:22 +0000
commit9d874ec20a8f42a34a5f35fdfff9bf2164bc8420 (patch)
tree118584f438397d4857a755f10bcc31e71009a1fa /gtk
parent75fff482b91691ca465d8f343ce018955fb212fe (diff)
downloadgtk+-9d874ec20a8f42a34a5f35fdfff9bf2164bc8420.tar.gz
resize clist if adjustments are NULL and list size has changed
Fri Nov 6 23:29:40 1998 Lars Hamann <lars@gtk.org> * gtk/gtkclist.c (real_clear) (adjust_adjustments): resize clist if adjustments are NULL and list size has changed (gtk_clist_size_request): return real list requsition, if adjustments are NULL. (size_allocate_columns): use button->requisition.with, if column width is not set. (list_requisition_width): new function. return full list width. (gtk_clist_set_hadjustment) (gtk_clist_set_vadjustment): do not auto create adjustments. (gtk_clist_motion) (move_vertical) (move_horizontal): check adjustment != NULL.
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkclist.c222
-rw-r--r--gtk/gtkclist.h2
2 files changed, 147 insertions, 77 deletions
diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c
index 30436e4b64..14ecd76ec6 100644
--- a/gtk/gtkclist.c
+++ b/gtk/gtkclist.c
@@ -110,7 +110,6 @@ LIST_WIDTH (GtkCList * clist)
return 0;
}
-
#define GTK_CLIST_CLASS_FW(_widget_) GTK_CLIST_CLASS (GTK_OBJECT (_widget_)->klass)
@@ -286,8 +285,9 @@ static void column_button_create (GtkCList *clist,
static void column_button_clicked (GtkWidget *widget,
gpointer data);
-/* Scrollbars */
-static void adjust_adjustments (GtkCList *clist);
+/* Adjustments */
+static void adjust_adjustments (GtkCList *clist,
+ gboolean block_resize);
static void check_exposures (GtkCList *clist);
static void vadjustment_changed (GtkAdjustment *adjustment,
gpointer data);
@@ -322,9 +322,10 @@ static void draw_row (GtkCList *clist,
static void draw_rows (GtkCList *clist,
GdkRectangle *area);
-/* Size Allocation */
+/* Size Allocation / Requisition */
static void size_allocate_title_buttons (GtkCList *clist);
static void size_allocate_columns (GtkCList *clist);
+static gint list_requisition_width (GtkCList *clist);
/* Memory Allocation/Distruction Routines */
static GtkCListColumn *columns_new (GtkCList *clist);
@@ -991,24 +992,28 @@ void
gtk_clist_set_hadjustment (GtkCList *clist,
GtkAdjustment *adjustment)
{
+ GtkAdjustment *old_adjustment;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
if (adjustment)
g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
- if (clist->hadjustment && (clist->hadjustment != adjustment))
+ if (clist->hadjustment == adjustment)
+ return;
+
+ old_adjustment = clist->hadjustment;
+
+ if (clist->hadjustment)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist);
gtk_object_unref (GTK_OBJECT (clist->hadjustment));
}
- if (!adjustment)
- adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0));
+ clist->hadjustment = adjustment;
- if (clist->hadjustment != adjustment)
+ if (clist->hadjustment)
{
- clist->hadjustment = adjustment;
gtk_object_ref (GTK_OBJECT (clist->hadjustment));
gtk_object_sink (GTK_OBJECT (clist->hadjustment));
@@ -1019,6 +1024,9 @@ gtk_clist_set_hadjustment (GtkCList *clist,
(GtkSignalFunc) hadjustment_value_changed,
(gpointer) clist);
}
+
+ if (!clist->hadjustment || !old_adjustment)
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
GtkAdjustment *
@@ -1034,24 +1042,28 @@ void
gtk_clist_set_vadjustment (GtkCList *clist,
GtkAdjustment *adjustment)
{
+ GtkAdjustment *old_adjustment;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
if (adjustment)
g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
+
+ if (clist->vadjustment == adjustment)
+ return;
- if (clist->vadjustment && (clist->vadjustment != adjustment))
+ old_adjustment = clist->vadjustment;
+
+ if (clist->vadjustment)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist);
gtk_object_unref (GTK_OBJECT (clist->vadjustment));
}
- if (!adjustment)
- adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
- 0.0, 0.0, 0.0));
+ clist->vadjustment = adjustment;
- if (clist->vadjustment != adjustment)
+ if (clist->vadjustment)
{
- clist->vadjustment = adjustment;
gtk_object_ref (GTK_OBJECT (clist->vadjustment));
gtk_object_sink (GTK_OBJECT (clist->vadjustment));
@@ -1062,6 +1074,9 @@ gtk_clist_set_vadjustment (GtkCList *clist,
(GtkSignalFunc) vadjustment_value_changed,
(gpointer) clist);
}
+
+ if (!clist->vadjustment || !old_adjustment)
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
GtkAdjustment *
@@ -1152,8 +1167,7 @@ gtk_clist_thaw (GtkCList *clist)
g_return_if_fail (GTK_IS_CLIST (clist));
GTK_CLIST_UNSET_FLAG (clist, CLIST_FROZEN);
-
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
@@ -1361,7 +1375,8 @@ gtk_clist_set_column_widget (GtkCList *clist,
/* remove and destroy the old widget */
old_widget = GTK_BIN (clist->column[column].button)->child;
if (old_widget)
- gtk_container_remove (GTK_CONTAINER (clist->column[column].button), old_widget);
+ gtk_container_remove (GTK_CONTAINER (clist->column[column].button),
+ old_widget);
/* add and show the widget */
if (widget)
@@ -1600,6 +1615,7 @@ gtk_clist_set_column_max_width (GtkCList *clist,
* abort_column_resize
* size_allocate_title_buttons
* size_allocate_columns
+ * list_requisition_width
* new_column_width
* column_button_create
* column_button_clicked
@@ -1663,7 +1679,7 @@ real_resize_column (GtkCList *clist,
if (column < 0 || column >= clist->columns)
return;
-
+
if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width))
width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width);
if (clist->column[column].max_width >= 0 &&
@@ -1682,7 +1698,7 @@ real_resize_column (GtkCList *clist,
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
}
@@ -1792,7 +1808,6 @@ size_allocate_columns (GtkCList *clist)
{
gint xoffset = CELL_SPACING + COLUMN_INSET;
gint last_column;
- gint width = 0;
gint i;
/* find last visible column and calculate correct column width */
@@ -1802,25 +1817,50 @@ size_allocate_columns (GtkCList *clist)
if (last_column < 0)
return;
- for (i = 0; i < last_column; i++)
+ for (i = 0; i <= last_column; i++)
{
if (!clist->column[i].visible)
continue;
clist->column[i].area.x = xoffset;
- clist->column[i].area.width = clist->column[i].width;
- xoffset += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET);
+ if (clist->column[i].width_set)
+ {
+ clist->column[i].area.width = clist->column[i].width;
+ xoffset += clist->column[i].width + CELL_SPACING + (2* COLUMN_INSET);
+ }
+ else if (GTK_CLIST_SHOW_TITLES (clist) && clist->column[i].button)
+ {
+ clist->column[i].area.width =
+ clist->column[i].button->requisition.width -
+ (CELL_SPACING + (2 * COLUMN_INSET));
+ xoffset += clist->column[i].button->requisition.width;
+ }
}
- if (clist->column[i].width_set)
- width = clist->column[i].width;
- else if (clist->column[i].title)
- width = gdk_string_width (GTK_WIDGET (clist)->style->font,
- clist->column[i].title);
+ clist->column[last_column].area.width = clist->column[last_column].area.width
+ + MAX (0, clist->clist_window_width + COLUMN_INSET - xoffset);
+}
+
+static gint
+list_requisition_width (GtkCList *clist)
+{
+ gint width = CELL_SPACING;
+ gint i;
+
+ for (i = clist->columns - 1; i >= 0 && !clist->column[i].visible; i--)
+ ;
+
+ for (; i >= 0; i--)
+ {
+ if (!clist->column[i].visible)
+ continue;
+
+ if (clist->column[i].width_set)
+ width += clist->column[i].width + CELL_SPACING + (2 * COLUMN_INSET);
+ else if (GTK_CLIST_SHOW_TITLES (clist) && clist->column[i].button)
+ width += clist->column[i].button->requisition.width;
+ }
- clist->column[i].area.x = xoffset;
- clist->column[i].area.width = MAX (width,
- clist->clist_window_width - xoffset -
- (CELL_SPACING + COLUMN_INSET));
+ return width;
}
/* this function returns the new width of the column being resized given
@@ -1873,10 +1913,12 @@ column_button_create (GtkCList *clist,
GtkWidget *button;
button = clist->column[column].button = gtk_button_new ();
+
if (GTK_WIDGET_REALIZED (clist) && clist->title_window)
- gtk_widget_set_parent_window (clist->column[column].button, clist->title_window);
+ gtk_widget_set_parent_window (clist->column[column].button,
+ clist->title_window);
gtk_widget_set_parent (button, GTK_WIDGET (clist));
-
+
gtk_signal_connect (GTK_OBJECT (button), "clicked",
(GtkSignalFunc) column_button_clicked,
(gpointer) clist);
@@ -1929,7 +1971,7 @@ gtk_clist_set_row_height (GtkCList *clist,
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
}
@@ -1948,14 +1990,12 @@ gtk_clist_moveto (GtkCList *clist,
return;
if (column < -1 || column >= clist->columns)
return;
- if (!clist->hadjustment || !clist->vadjustment)
- return;
row_align = CLAMP (row_align, 0, 1);
col_align = CLAMP (col_align, 0, 1);
/* adjust horizontal scrollbar */
- if (column >= 0)
+ if (clist->hadjustment && column >= 0)
{
gint x;
@@ -1972,7 +2012,7 @@ gtk_clist_moveto (GtkCList *clist,
}
/* adjust vertical scrollbar */
- if (row >= 0)
+ if (clist->vadjustment && row >= 0)
move_vertical (clist, row, row_align);
}
@@ -2520,7 +2560,7 @@ real_insert_row (GtkCList *clist,
/* redraw the list if it isn't frozen */
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
if (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)
draw_rows (clist, NULL);
@@ -2586,7 +2626,7 @@ real_remove_row (GtkCList *clist,
/* redraw the row if it isn't frozen */
if (!GTK_CLIST_FROZEN (clist))
{
- adjust_adjustments (clist);
+ adjust_adjustments (clist, FALSE);
if (was_visible)
draw_rows (clist, NULL);
@@ -2640,6 +2680,8 @@ real_clear (GtkCList *clist)
if (!GTK_CLIST_FROZEN (clist))
gtk_clist_thaw (clist);
}
+ else
+ gtk_widget_queue_resize (GTK_WIDGET (clist));
}
/* PUBLIC ROW FUNCTIONS
@@ -4482,10 +4524,10 @@ gtk_clist_parent_set (GtkWidget *widget,
clist = GTK_CLIST (widget);
/* create adjustments */
- if (!clist->hadjustment)
+ /* if (!clist->hadjustment)
gtk_clist_set_hadjustment (clist, NULL);
if (!clist->vadjustment)
- gtk_clist_set_vadjustment (clist, NULL);
+ gtk_clist_set_vadjustment (clist, NULL);*/
}
static gint
@@ -4847,6 +4889,9 @@ move_vertical (GtkCList *clist,
{
gfloat value;
+ if (!clist->vadjustment)
+ return;
+
value = (ROW_TOP_YPIXEL (clist, row) - clist->voffset -
align * (clist->clist_window_height - clist->row_height) +
(2 * align - 1) * CELL_SPACING);
@@ -4863,6 +4908,9 @@ move_horizontal (GtkCList *clist,
{
gfloat value;
+ if (!clist->hadjustment)
+ return;
+
value = CLAMP (clist->hadjustment->value + diff, 0.0,
clist->hadjustment->upper - clist->hadjustment->page_size);
gtk_adjustment_set_value(clist->hadjustment, value);
@@ -4929,7 +4977,7 @@ gtk_clist_motion (GtkWidget *widget,
gdk_window_get_pointer (clist->clist_window, &x, &y, NULL);
/* horizontal autoscrolling */
- if (LIST_WIDTH (clist) > clist->clist_window_width &&
+ if (clist->hadjustment && LIST_WIDTH (clist) > clist->clist_window_width &&
(x < 0 || x >= clist->clist_window_width))
{
if (clist->htimer)
@@ -4957,7 +5005,7 @@ gtk_clist_motion (GtkWidget *widget,
row = ROW_FROM_YPIXEL (clist, y);
/* don't scroll on last pixel row if it's a cell spacing */
- if (y == clist->clist_window_height-1 &&
+ if (y == clist->clist_window_height - 1 &&
y == ROW_TOP_YPIXEL (clist, row-1) + clist->row_height)
return FALSE;
@@ -5017,8 +5065,8 @@ static void
gtk_clist_size_request (GtkWidget *widget,
GtkRequisition *requisition)
{
- gint i;
GtkCList *clist;
+ gint i;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_CLIST (widget));
@@ -5047,6 +5095,11 @@ gtk_clist_size_request (GtkWidget *widget,
requisition->height += (clist->column_title_area.height +
(widget->style->klass->ythickness +
GTK_CONTAINER (widget)->border_width) * 2);
+
+ if (!clist->hadjustment)
+ requisition->width += list_requisition_width (clist);
+ if (!clist->vadjustment)
+ requisition->height += LIST_HEIGHT (clist);
}
static void
@@ -5126,7 +5179,7 @@ gtk_clist_size_allocate (GtkWidget *widget,
size_allocate_columns (clist);
size_allocate_title_buttons (clist);
- adjust_adjustments (clist);
+ adjust_adjustments (clist, TRUE);
}
/* GTKCONTAINER
@@ -5647,41 +5700,58 @@ gtk_clist_get_selection_info (GtkCList *clist,
* check_exposures
*/
static void
-adjust_adjustments (GtkCList * clist)
+adjust_adjustments (GtkCList *clist,
+ gboolean block_resize)
{
- if (!clist->hadjustment || !clist->vadjustment)
- return;
+ if (clist->vadjustment)
+ {
+ clist->vadjustment->page_size = clist->clist_window_height;
+ clist->vadjustment->page_increment = clist->clist_window_height / 2;
+ clist->vadjustment->step_increment = clist->row_height;
+ clist->vadjustment->lower = 0;
+ clist->vadjustment->upper = LIST_HEIGHT (clist);
- clist->vadjustment->page_size = clist->clist_window_height;
- clist->vadjustment->page_increment = clist->clist_window_height / 2;
- clist->vadjustment->step_increment = 10;
- clist->vadjustment->lower = 0;
- clist->vadjustment->upper = LIST_HEIGHT (clist);
+ if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist))
+ {
+ clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
+ clist->clist_window_height));
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment),
+ "value_changed");
+ }
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed");
+ }
- if (clist->clist_window_height - clist->voffset > LIST_HEIGHT (clist))
+ if (clist->hadjustment)
{
- clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
- clist->clist_window_height));
- gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment),
- "value_changed");
- }
+ clist->hadjustment->page_size = clist->clist_window_width;
+ clist->hadjustment->page_increment = clist->clist_window_width / 2;
+ clist->hadjustment->step_increment = 10;
+ clist->hadjustment->lower = 0;
+ clist->hadjustment->upper = LIST_WIDTH (clist);
- clist->hadjustment->page_size = clist->clist_window_width;
- clist->hadjustment->page_increment = clist->clist_window_width / 2;
- clist->hadjustment->step_increment = 10;
- clist->hadjustment->lower = 0;
- clist->hadjustment->upper = LIST_WIDTH (clist);
+ if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist))
+ {
+ clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
+ clist->clist_window_width));
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment),
+ "value_changed");
+ }
+ gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed");
+ }
- if (clist->clist_window_width - clist->hoffset > LIST_WIDTH (clist))
+ if (!block_resize && (!clist->vadjustment || !clist->hadjustment))
{
- clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
- clist->clist_window_width));
- gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment),
- "value_changed");
- }
+ GtkWidget *widget;
- gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed");
- gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed");
+ widget = GTK_WIDGET (clist);
+ gtk_widget_size_request (widget, &widget->requisition);
+
+ if ((!clist->hadjustment &&
+ widget->requisition.width != widget->allocation.width) ||
+ (!clist->vadjustment &&
+ widget->requisition.height != widget->allocation.height))
+ gtk_widget_queue_resize (widget);
+ }
}
static void
diff --git a/gtk/gtkclist.h b/gtk/gtkclist.h
index 5d8c457c4d..37a6d81eb5 100644
--- a/gtk/gtkclist.h
+++ b/gtk/gtkclist.h
@@ -155,7 +155,7 @@ struct _GtkCList
GList *undo_unselection;
gint undo_anchor;
- /* scrollbars */
+ /* scroll adjustments */
GtkAdjustment *hadjustment;
GtkAdjustment *vadjustment;