From 3b43ea17ab7fa33c167cd5f09beabebe27a4f3fe Mon Sep 17 00:00:00 2001 From: yangxx Date: Fri, 26 Sep 2003 16:50:12 +0000 Subject: [PATCH] git-svn-id: http://ltt.polymtl.ca/svn@249 04897980-b3bd-0310-b5e0-8ef037075253 --- .../poly/lttv/modules/gui/API/Makefile.am | 3 +- .../poly/lttv/modules/gui/API/gtkcustomhbox.c | 346 ++++++++++++++++++ 2 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 ltt/branches/poly/lttv/modules/gui/API/gtkcustomhbox.c diff --git a/ltt/branches/poly/lttv/modules/gui/API/Makefile.am b/ltt/branches/poly/lttv/modules/gui/API/Makefile.am index f6d40e8b..a31cbc42 100644 --- a/ltt/branches/poly/lttv/modules/gui/API/Makefile.am +++ b/ltt/branches/poly/lttv/modules/gui/API/Makefile.am @@ -11,6 +11,7 @@ AM_CFLAGS += $(GTK_CFLAGS) LIBS += $(GLIB_LIBS) LIBS += $(GTK_LIBS) -lib_LTLIBRARIES = libmainWinApi.la +lib_LTLIBRARIES = libmainWinApi.la libcustomBox.la libmainWinApi_la_SOURCES = toolbar.c menu.c gtkTraceSet.c +libcustomBox_la_SOURCES = gtkcustomhbox.c EXTRA_DIST = diff --git a/ltt/branches/poly/lttv/modules/gui/API/gtkcustomhbox.c b/ltt/branches/poly/lttv/modules/gui/API/gtkcustomhbox.c new file mode 100644 index 00000000..9f6ea9ef --- /dev/null +++ b/ltt/branches/poly/lttv/modules/gui/API/gtkcustomhbox.c @@ -0,0 +1,346 @@ +/* GTK - The GIMP Toolkit + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GTK+ Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include + + +static void gtk_custom_hbox_class_init (GtkCustomHBoxClass *klass); +static void gtk_custom_hbox_init (GtkCustomHBox *box); +static void gtk_custom_hbox_size_request (GtkWidget *widget, + GtkRequisition *requisition); +static void gtk_custom_hbox_size_allocate (GtkWidget *widget, + GtkAllocation *allocation); + + +GType +gtk_custom_hbox_get_type (void) +{ + static GType hbox_type = 0; + + if (!hbox_type) + { + static const GTypeInfo hbox_info = + { + sizeof (GtkCustomHBoxClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gtk_custom_hbox_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkCustomHBox), + 0, /* n_preallocs */ + (GInstanceInitFunc) gtk_custom_hbox_init, + }; + + hbox_type = g_type_register_static (GTK_TYPE_BOX, "GtkCustomHBox", + &hbox_info, 0); + } + + return hbox_type; +} + +static void +gtk_custom_hbox_finalize (GObject *object) +{ + GtkCustomHBox * hbox = GTK_CUSTOM_HBOX (object); + + hbox->remove_item(hbox); + + G_OBJECT_CLASS(g_type_class_peek_parent(GTK_CUSTOM_HBOX_GET_CLASS(hbox)))->finalize(G_OBJECT(object)); +} + +static void +gtk_custom_hbox_class_init (GtkCustomHBoxClass *class) +{ + GtkWidgetClass *widget_class; + GObjectClass *gobject_class = G_OBJECT_CLASS(class); + + gobject_class->finalize = gtk_custom_hbox_finalize; + + widget_class = (GtkWidgetClass*) class; + + widget_class->size_request = gtk_custom_hbox_size_request; + widget_class->size_allocate = gtk_custom_hbox_size_allocate; +} + +static void +gtk_custom_hbox_init (GtkCustomHBox *hbox) +{ +} + +GtkWidget* +gtk_custom_hbox_new (gboolean homogeneous, + gint spacing, + remove_func remove) +{ + GtkCustomHBox *hbox; + + hbox = g_object_new (GTK_TYPE_CUSTOM_HBOX, NULL); + hbox->remove_item = remove; + + GTK_BOX (hbox)->spacing = spacing; + GTK_BOX (hbox)->homogeneous = homogeneous ? TRUE : FALSE; + + return GTK_WIDGET (hbox); +} + +static void +gtk_custom_hbox_size_request (GtkWidget *widget, + GtkRequisition *requisition) +{ + GtkBox *box; + GtkBoxChild *child; + GList *children; + gint nvis_children; + gint width; + + box = GTK_BOX (widget); + requisition->width = 0; + requisition->height = 0; + nvis_children = 0; + + children = box->children; + while (children) + { + child = children->data; + children = children->next; + + if (GTK_WIDGET_VISIBLE (child->widget)) + { + GtkRequisition child_requisition; + + gtk_widget_size_request (child->widget, &child_requisition); + + if (box->homogeneous) + { + width = child_requisition.width + child->padding * 2; + requisition->width = MAX (requisition->width, width); + } + else + { + requisition->width += child_requisition.width + child->padding * 2; + } + + requisition->height = MAX (requisition->height, child_requisition.height); + + nvis_children += 1; + } + } + + if (nvis_children > 0) + { + if (box->homogeneous) + requisition->width *= nvis_children; + requisition->width += (nvis_children - 1) * box->spacing; + } + + requisition->width += GTK_CONTAINER (box)->border_width * 2; + requisition->height += GTK_CONTAINER (box)->border_width * 2; +} + +static void +gtk_custom_hbox_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + GtkBox *box; + GtkBoxChild *child; + GList *children; + GtkAllocation child_allocation; + gint nvis_children; + gint nexpand_children; + gint child_width; + gint width; + gint extra; + gint x; + GtkTextDirection direction; + + box = GTK_BOX (widget); + widget->allocation = *allocation; + + direction = gtk_widget_get_direction (widget); + + nvis_children = 0; + nexpand_children = 0; + children = box->children; + + while (children) + { + child = children->data; + children = children->next; + + if (GTK_WIDGET_VISIBLE (child->widget)) + { + nvis_children += 1; + if (child->expand) + nexpand_children += 1; + } + } + + if (nvis_children > 0) + { + if (box->homogeneous) + { + width = (allocation->width - + GTK_CONTAINER (box)->border_width * 2 - + (nvis_children - 1) * box->spacing); + extra = width / nvis_children; + } + else if (nexpand_children > 0) + { + width = (gint) allocation->width - (gint) widget->requisition.width; + extra = width / nexpand_children; + } + else + { + width = 0; + extra = 0; + } + + x = allocation->x + GTK_CONTAINER (box)->border_width; + child_allocation.y = allocation->y + GTK_CONTAINER (box)->border_width; + child_allocation.height = MAX (1, (gint) allocation->height - (gint) GTK_CONTAINER (box)->border_width * 2); + + children = box->children; + while (children) + { + child = children->data; + children = children->next; + + if ((child->pack == GTK_PACK_START) && GTK_WIDGET_VISIBLE (child->widget)) + { + if (box->homogeneous) + { + if (nvis_children == 1) + child_width = width; + else + child_width = extra; + + nvis_children -= 1; + width -= extra; + } + else + { + GtkRequisition child_requisition; + + gtk_widget_get_child_requisition (child->widget, &child_requisition); + + child_width = child_requisition.width + child->padding * 2; + + if (child->expand) + { + if (nexpand_children == 1) + child_width += width; + else + child_width += extra; + + nexpand_children -= 1; + width -= extra; + } + } + + if (child->fill) + { + child_allocation.width = MAX (1, (gint) child_width - (gint) child->padding * 2); + child_allocation.x = x + child->padding; + } + else + { + GtkRequisition child_requisition; + + gtk_widget_get_child_requisition (child->widget, &child_requisition); + child_allocation.width = child_requisition.width; + child_allocation.x = x + (child_width - child_allocation.width) / 2; + } + + if (direction == GTK_TEXT_DIR_RTL) + child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width; + + gtk_widget_size_allocate (child->widget, &child_allocation); + + x += child_width + box->spacing; + } + } + + x = allocation->x + allocation->width - GTK_CONTAINER (box)->border_width; + + children = box->children; + while (children) + { + child = children->data; + children = children->next; + + if ((child->pack == GTK_PACK_END) && GTK_WIDGET_VISIBLE (child->widget)) + { + GtkRequisition child_requisition; + gtk_widget_get_child_requisition (child->widget, &child_requisition); + + if (box->homogeneous) + { + if (nvis_children == 1) + child_width = width; + else + child_width = extra; + + nvis_children -= 1; + width -= extra; + } + else + { + child_width = child_requisition.width + child->padding * 2; + + if (child->expand) + { + if (nexpand_children == 1) + child_width += width; + else + child_width += extra; + + nexpand_children -= 1; + width -= extra; + } + } + + if (child->fill) + { + child_allocation.width = MAX (1, (gint)child_width - (gint)child->padding * 2); + child_allocation.x = x + child->padding - child_width; + } + else + { + child_allocation.width = child_requisition.width; + child_allocation.x = x + (child_width - child_allocation.width) / 2 - child_width; + } + + if (direction == GTK_TEXT_DIR_RTL) + child_allocation.x = allocation->x + allocation->width - (child_allocation.x - allocation->x) - child_allocation.width; + + gtk_widget_size_allocate (child->widget, &child_allocation); + + x -= (child_width + box->spacing); + } + } + } +} -- 2.34.1