git-svn-id: http://ltt.polymtl.ca/svn@249 04897980-b3bd-0310-b5e0-8ef037075253
authoryangxx <yangxx@04897980-b3bd-0310-b5e0-8ef037075253>
Fri, 26 Sep 2003 16:50:12 +0000 (16:50 +0000)
committeryangxx <yangxx@04897980-b3bd-0310-b5e0-8ef037075253>
Fri, 26 Sep 2003 16:50:12 +0000 (16:50 +0000)
ltt/branches/poly/lttv/modules/gui/API/Makefile.am
ltt/branches/poly/lttv/modules/gui/API/gtkcustomhbox.c [new file with mode: 0644]

index f6d40e8b4b866e3f6966a168b84de7bfafffc639..a31cbc422e1688d8a4e7a6b2a32ce63346876d7e 100644 (file)
@@ -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 (file)
index 0000000..9f6ea9e
--- /dev/null
@@ -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 <lttv/gtkcustomhbox.h>
+
+
+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);
+           }
+       }
+    }
+}
This page took 0.028069 seconds and 4 git commands to generate.