]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkimagemenuitem.c
change GTK_MOVEMENT_PARAGRAPHS to go to start/end of paragraph before it
[~andy/gtk] / gtk / gtkimagemenuitem.c
index 621a9cdc2dd6f5c6ea4531b5b289b1ea32241403..0c7476dec5b6e12afe5ac743bc4882cf5663406d 100644 (file)
@@ -28,6 +28,9 @@
 #include "gtkaccellabel.h"
 #include "gtksignal.h"
 #include "gtkintl.h"
+#include "gtkstock.h"
+#include "gtkiconfactory.h"
+#include "gtkimage.h"
 
 static void gtk_image_menu_item_class_init           (GtkImageMenuItemClass *klass);
 static void gtk_image_menu_item_init                 (GtkImageMenuItem      *image_menu_item);
@@ -35,15 +38,11 @@ static void gtk_image_menu_item_size_request         (GtkWidget        *widget,
                                                       GtkRequisition   *requisition);
 static void gtk_image_menu_item_size_allocate        (GtkWidget        *widget,
                                                       GtkAllocation    *allocation);
-static gint gtk_image_menu_item_expose               (GtkWidget             *widget,
-                                                     GdkEventExpose        *event);
 static void gtk_image_menu_item_remove               (GtkContainer          *container,
                                                       GtkWidget             *child);
 static void gtk_image_menu_item_toggle_size_request  (GtkMenuItem           *menu_item,
                                                      gint                  *requisition);
 
-static void gtk_image_menu_item_map        (GtkWidget      *widget);
-static void gtk_image_menu_item_unmap      (GtkWidget      *widget);
 static void gtk_image_menu_item_forall     (GtkContainer   *container,
                                             gboolean       include_internals,
                                             GtkCallback     callback,
@@ -52,13 +51,11 @@ static void gtk_image_menu_item_forall     (GtkContainer   *container,
 static void gtk_image_menu_item_set_property (GObject         *object,
                                               guint            prop_id,
                                               const GValue    *value,
-                                              GParamSpec      *pspec,
-                                              const gchar     *trailer);
+                                              GParamSpec      *pspec);
 static void gtk_image_menu_item_get_property (GObject         *object,
                                               guint            prop_id,
                                               GValue          *value,
-                                              GParamSpec      *pspec,
-                                              const gchar     *trailer);
+                                              GParamSpec      *pspec);
 
 
 enum {
@@ -110,11 +107,8 @@ gtk_image_menu_item_class_init (GtkImageMenuItemClass *klass)
   
   parent_class = gtk_type_class (GTK_TYPE_MENU_ITEM);
   
-  widget_class->expose_event = gtk_image_menu_item_expose;
   widget_class->size_request = gtk_image_menu_item_size_request;
   widget_class->size_allocate = gtk_image_menu_item_size_allocate;
-  widget_class->map = gtk_image_menu_item_map;
-  widget_class->unmap = gtk_image_menu_item_unmap;
 
   container_class->forall = gtk_image_menu_item_forall;
   container_class->remove = gtk_image_menu_item_remove;
@@ -143,8 +137,7 @@ static void
 gtk_image_menu_item_set_property (GObject         *object,
                                   guint            prop_id,
                                   const GValue    *value,
-                                  GParamSpec      *pspec,
-                                  const gchar     *trailer)
+                                  GParamSpec      *pspec)
 {
   GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (object);
   
@@ -152,22 +145,11 @@ gtk_image_menu_item_set_property (GObject         *object,
     {
     case PROP_IMAGE:
       {
-        GtkWidget *child;
-
-        child = (GtkWidget*) g_value_get_object (value);
-
-        if (child != image_menu_item->image)
-          {
-            if (image_menu_item->image)
-              gtk_container_remove (GTK_CONTAINER (image_menu_item),
-                                    image_menu_item->image);
-            
-            if (child)
-              {
-                gtk_image_menu_item_add_image (image_menu_item,
-                                               child);
-              }
-          }
+        GtkWidget *image;
+
+        image = (GtkWidget*) g_value_get_object (value);
+
+       gtk_image_menu_item_set_image (image_menu_item, image);
       }
       break;
     default:
@@ -179,8 +161,7 @@ static void
 gtk_image_menu_item_get_property (GObject         *object,
                                   guint            prop_id,
                                   GValue          *value,
-                                  GParamSpec      *pspec,
-                                  const gchar     *trailer)
+                                  GParamSpec      *pspec)
 {
   GtkImageMenuItem *image_menu_item = GTK_IMAGE_MENU_ITEM (object);
   
@@ -203,7 +184,6 @@ gtk_image_menu_item_toggle_size_request (GtkMenuItem *menu_item,
 {
   GtkImageMenuItem *image_menu_item;
   
-  g_return_if_fail (menu_item != NULL);
   g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (menu_item));
 
   image_menu_item = GTK_IMAGE_MENU_ITEM (menu_item);
@@ -276,76 +256,13 @@ gtk_image_menu_item_size_allocate (GtkWidget     *widget,
 
       child_allocation.width = width;
       child_allocation.height = height;
-      child_allocation.x = MAX (x, 0);
-      child_allocation.y = MAX (y, 0);
+      child_allocation.x = widget->allocation.x + MAX (x, 0);
+      child_allocation.y = widget->allocation.y + MAX (y, 0);
 
       gtk_widget_size_allocate (image_menu_item->image, &child_allocation);
     }
 }
 
-static gint
-gtk_image_menu_item_expose (GtkWidget      *widget,
-                           GdkEventExpose *event)
-{
-  GdkEventExpose child_event;
-  GtkImageMenuItem *image_menu_item;
-  
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_IMAGE_MENU_ITEM (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
-  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
-  
-  if (GTK_WIDGET_CLASS (parent_class)->expose_event)
-    (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
-
-  child_event = *event;
-  if (image_menu_item->image && GTK_WIDGET_DRAWABLE (image_menu_item->image) &&
-      GTK_WIDGET_NO_WINDOW (image_menu_item->image) &&
-      gtk_widget_intersect (image_menu_item->image, &event->area, &child_event.area))
-    gtk_widget_event (image_menu_item->image, (GdkEvent*) &child_event);
-  
-  return FALSE;
-}
-
-static void
-gtk_image_menu_item_map (GtkWidget *widget)
-{
-  GtkImageMenuItem *image_menu_item;
-
-  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (widget));
-
-  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
-  
-  (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
-
-  if (image_menu_item->image &&
-      GTK_WIDGET_VISIBLE (image_menu_item->image) &&
-      !GTK_WIDGET_MAPPED (image_menu_item->image))
-    gtk_widget_map (image_menu_item->image);
-
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_show (widget->window);  
-}
-
-static void
-gtk_image_menu_item_unmap (GtkWidget *widget)
-{
-  GtkImageMenuItem *image_menu_item;
-
-  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (widget));
-
-  image_menu_item = GTK_IMAGE_MENU_ITEM (widget);
-  
-  (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
-  
-  if (!GTK_WIDGET_NO_WINDOW (widget))
-    gdk_window_hide (widget->window);
-  
-  if (image_menu_item->image && GTK_WIDGET_MAPPED (image_menu_item->image))
-    gtk_widget_unmap (image_menu_item->image);  
-}
-
 static void
 gtk_image_menu_item_forall (GtkContainer   *container,
                             gboolean       include_internals,
@@ -367,9 +284,27 @@ gtk_image_menu_item_forall (GtkContainer   *container,
     (* callback) (image_menu_item->image, callback_data);
 }
 
+/**
+ * gtk_image_menu_item_new:
+ * @returns: a new #GtkImageMenuItem.
+ *
+ * Creates a new #GtkImageMenuItem with an empty label.
+ **/
+GtkWidget*
+gtk_image_menu_item_new (void)
+{
+  return g_object_new (GTK_TYPE_IMAGE_MENU_ITEM, NULL);
+}
+
+/**
+ * gtk_image_menu_item_new_with_label:
+ * @label: the text of the menu item.
+ * @returns: a new #GtkImageMenuItem.
+ *
+ * Creates a new #GtkImageMenuItem containing a label. 
+ **/
 GtkWidget*
-gtk_image_menu_item_new (GtkWidget   *widget,
-                         const gchar *label)
+gtk_image_menu_item_new_with_label (const gchar *label)
 {
   GtkImageMenuItem *image_menu_item;
   GtkWidget *accel_label;
@@ -385,36 +320,126 @@ gtk_image_menu_item_new (GtkWidget   *widget,
                                     GTK_WIDGET (image_menu_item));
   gtk_widget_show (accel_label);
 
-  if (widget)
-    gtk_image_menu_item_add_image (image_menu_item, widget);
-  
   return GTK_WIDGET(image_menu_item);
 }
 
-void
-gtk_image_menu_item_add_image (GtkImageMenuItem *image_menu_item,
-                               GtkWidget        *child)
+
+/**
+ * gtk_image_menu_item_new_with_mnemonic:
+ * @label: the text of the menu item, with an underscore in front of the
+ *         mnemonic character
+ * @returns: a new #GtkImageMenuItem
+ *
+ * Creates a new #GtkImageMenuItem containing a label. The label
+ * will be created using gtk_label_new_with_mnemonic(), so underscores
+ * in @label indicate the mnemonic for the menu item.
+ **/
+GtkWidget*
+gtk_image_menu_item_new_with_mnemonic (const gchar *label)
 {
-  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (image_menu_item));
-  g_return_if_fail (image_menu_item->image == NULL);
+  GtkImageMenuItem *image_menu_item;
+  GtkWidget *accel_label;
   
-  gtk_widget_set_parent (child, GTK_WIDGET (image_menu_item));
-  image_menu_item->image = child;
+  image_menu_item = GTK_IMAGE_MENU_ITEM (g_object_new (GTK_TYPE_IMAGE_MENU_ITEM,
+                                                       NULL));
 
-  g_object_notify (G_OBJECT (image_menu_item), "image");
-  
-  if (GTK_WIDGET_REALIZED (child->parent))
-    gtk_widget_realize (child);
-  
-  if (GTK_WIDGET_VISIBLE (child->parent) && GTK_WIDGET_VISIBLE (child))
+  accel_label = gtk_type_new (GTK_TYPE_ACCEL_LABEL);
+  gtk_label_set_text_with_mnemonic (GTK_LABEL (accel_label), label);
+  gtk_misc_set_alignment (GTK_MISC (accel_label), 0.0, 0.5);
+
+  gtk_container_add (GTK_CONTAINER (image_menu_item), accel_label);
+  gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
+                                    GTK_WIDGET (image_menu_item));
+  gtk_widget_show (accel_label);
+
+  return GTK_WIDGET(image_menu_item);
+}
+
+/**
+ * gtk_image_menu_item_new_from_stock:
+ * @stock_id: the name of the stock item.
+ * @accel_group: the #GtkAccelGroup to add the menu items accelerator to.
+ * @returns: a new #GtkImageMenuItem.
+ *
+ * Creates a new #GtkImageMenuItem containing the image and text from a 
+ * stock item. Some stock ids have preprocessor macros like #GTK_STOCK_OK 
+ * and #GTK_STOCK_APPLY.
+ **/
+GtkWidget*
+gtk_image_menu_item_new_from_stock (const gchar      *stock_id,
+                                   GtkAccelGroup    *accel_group)
+{
+  GtkWidget *image;
+  GtkStockItem stock_item;
+  GtkWidget *item;
+
+  g_return_val_if_fail (stock_id != NULL, NULL);
+
+  image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+
+  if (gtk_stock_lookup (stock_id, &stock_item))
     {
-      if (GTK_WIDGET_MAPPED (child->parent))
-       gtk_widget_map (child);
+      item = gtk_image_menu_item_new_with_mnemonic (stock_item.label);
 
-      gtk_widget_queue_resize (child);
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+      
+      if (stock_item.keyval && accel_group)
+       gtk_widget_add_accelerator (item,
+                                   "activate",
+                                   accel_group,
+                                   stock_item.keyval,
+                                   stock_item.modifier,
+                                   GTK_ACCEL_VISIBLE);
     }
+  else
+    {
+      item = gtk_image_menu_item_new_with_label (stock_id);
+
+      gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image);
+    }
+
+  gtk_widget_show (image);
+  return item;
+}
+
+/** 
+ * gtk_image_menu_item_set_image:
+ * @image_menu_item: a #GtkImageMenuItem.
+ * @image: a widget to set as the image for the menu item.
+ * 
+ * Sets the image of @image_menu_item to the given widget.
+ **/ 
+void
+gtk_image_menu_item_set_image (GtkImageMenuItem *image_menu_item,
+                               GtkWidget        *image)
+{
+  g_return_if_fail (GTK_IS_IMAGE_MENU_ITEM (image_menu_item));
+
+  if (image == image_menu_item->image)
+    return;
+
+  if (image_menu_item->image)
+    gtk_container_remove (GTK_CONTAINER (image_menu_item),
+                         image_menu_item->image);
+
+  image_menu_item->image = image;
+
+  if (image == NULL)
+    return;
+
+  gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item));
+
+  g_object_notify (G_OBJECT (image_menu_item), "image");
 }
 
+/**
+ * gtk_image_menu_item_get_image:
+ * @image_menu_item: a #GtkImageMenuItem.
+ * @returns: the widget set as image of @image_menu_item.
+ *
+ * Gets the widget that is currently set as the image of @image_menu_item.
+ * See gtk_image_menu_item_set_image().
+ **/
 GtkWidget*
 gtk_image_menu_item_get_image (GtkImageMenuItem *image_menu_item)
 {