2005-10-10 [colin] 1.9.15cvs28
[claws.git] / src / gtk / colorlabel.c
index 0913b87ffce313b16cf22b2448bcce34e345078c..4a8ce9d0679553acc115e7e532259da73b32c734 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 2001-2003 Hiroyuki Yamamoto & The Sylpheed Claws Team
+ * Copyright (C) 2001-2004 Hiroyuki Yamamoto & The Sylpheed Claws Team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 /* (alfons) - based on a contribution by Satoshi Nagayasu; revised for colorful 
 #include "defs.h"
 
 #include <glib.h>
-#include <gdk/gdkx.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
 #include <gtk/gtkwidget.h>
-#include <gtk/gtkpixmap.h>
+#include <gtk/gtkimage.h>
 #include <gtk/gtkmenu.h>
 #include <gtk/gtkcheckmenuitem.h>
 #include <gtk/gtklabel.h>
 #include <gtk/gtkmenuitem.h>
 #include <gtk/gtkalignment.h>
 #include <gtk/gtkhbox.h>
+#include <gtk/gtkvbox.h>
 #include <gtk/gtkwindow.h>
 #include <gtk/gtkdrawingarea.h>
 
-#include "intl.h"
 #include "colorlabel.h"
 #include "utils.h"
+#include "gtkutils.h"
 
 static gchar *labels[] = {
        N_("Orange"),
@@ -78,6 +80,9 @@ static struct
        { LCCF_ALL, { 0, 0x66 << 8, 0x33 << 8, 0x33 << 8 },     NULL, NULL }
 };
 
+#define LABEL_COLOR_WIDTH      28
+#define LABEL_COLOR_HEIGHT     16
+
 #define LABEL_COLORS_ELEMS (sizeof label_colors / sizeof label_colors[0])
 
 #define G_RETURN_VAL_IF_INVALID_COLOR(color, val) \
@@ -125,15 +130,15 @@ static gboolean colorlabel_drawing_area_expose_event_cb
        gc = gdk_gc_new(drawable);
 
        gdk_gc_set_foreground(gc, &color);
-       gdk_draw_rectangle(drawable, gc,
-                          TRUE, 0, 0, widget->allocation.width,
-                          widget->allocation.height);
        gdk_draw_rectangle(drawable, widget->style->black_gc,
-                          FALSE, 0, 0, widget->allocation.width,
-                          widget->allocation.height);
+                          FALSE, 0, 0, widget->allocation.width - 1,
+                          widget->allocation.height - 1);
+       gdk_draw_rectangle(drawable, gc,
+                          TRUE, 1, 1, widget->allocation.width - 2,
+                          widget->allocation.height - 2);
 
        gdk_gc_unref(gc);                          
-
+       
        return FALSE;
 }
 
@@ -142,17 +147,18 @@ static GtkWidget *colorlabel_create_color_widget(GdkColor color)
        GtkWidget *widget;
 
        widget = gtk_drawing_area_new();
-       gtk_drawing_area_size(GTK_DRAWING_AREA(widget), 16, 16);
+       gtk_widget_set_size_request(widget, LABEL_COLOR_WIDTH - 2, 
+                                   LABEL_COLOR_HEIGHT - 4);
 
 #define CL(x)          (((gulong) (x) >> (gulong) 8) & 0xFFUL) 
 #define CR(r, g, b)    ((CL(r) << (gulong) 16) | \
                         (CL(g) << (gulong)  8) | \
                         (CL(b)))
 
-       gtk_signal_connect(GTK_OBJECT(widget), "expose_event", 
-                          GTK_SIGNAL_FUNC
+       g_signal_connect(G_OBJECT(widget), "expose_event", 
+                        G_CALLBACK
                                (colorlabel_drawing_area_expose_event_cb),
-                          GINT_TO_POINTER
+                        GINT_TO_POINTER
                                ((gint)CR(color.red, color.green, color.blue)));
 
        return widget;
@@ -225,12 +231,12 @@ GtkWidget *colorlabel_create_check_color_menu_item(gint color_index)
 {
        GtkWidget *label; 
        GtkWidget *hbox; 
-       GtkWidget *align
+       GtkWidget *vbox
        GtkWidget *item;
 
        G_RETURN_VAL_IF_INVALID_COLOR(color_index, NULL);
 
-       item  = gtk_check_menu_item_new();
+       item = gtk_check_menu_item_new();
 
        colorlabel_recreate(color_index);
 
@@ -238,33 +244,43 @@ GtkWidget *colorlabel_create_check_color_menu_item(gint color_index)
         * how to create pixmap menus */
        label = gtk_label_new(label_colors[color_index].label);
 
-       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
        gtk_widget_show(label);
        hbox = gtk_hbox_new(FALSE, 0);
        gtk_widget_show(hbox);
        gtk_container_add(GTK_CONTAINER(item), hbox);
 
-       align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
-       gtk_widget_show(align);
-       gtk_container_set_border_width(GTK_CONTAINER(align), 1);
+       vbox = gtk_vbox_new(TRUE, 0);
+       gtk_widget_show(vbox);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), 1);
 
-       gtk_container_add(GTK_CONTAINER(align), label_colors[color_index].widget);
+       gtk_container_add(GTK_CONTAINER(vbox),
+                         label_colors[color_index].widget);
        gtk_widget_show(label_colors[color_index].widget);
-       gtk_widget_set_usize(align, 16, 16);
 
-       gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 4);
 
        return item;
 }
 
+/* Work around a gtk bug (?): without that, the selected menu item's 
+ * colored rectangle is drawn at 0,0 in the window...
+ */
+static void refresh_menu (GtkWidget *menushell, gpointer data)
+{
+       GtkMenu *menu = (GtkMenu *)data;
+       GtkWidget *widget = gtk_menu_get_attach_widget(menu);
+       gtk_widget_hide_all(widget);
+       gtk_widget_unrealize(widget);
+       gtk_widget_show_all(widget);
+       gtk_widget_queue_draw(widget);
+}
+
 /* colorlabel_create_color_menu() - creates a color menu without 
  * checkitems, probably for use in combo items */
 GtkWidget *colorlabel_create_color_menu(void)
 {
        GtkWidget *label; 
-       GtkWidget *hbox; 
-       GtkWidget *align; 
        GtkWidget *item;
        GtkWidget *menu;
        gint i;
@@ -273,43 +289,47 @@ GtkWidget *colorlabel_create_color_menu(void)
 
        /* create the menu items. each item has its color code attached */
        menu = gtk_menu_new();
-       gtk_object_set_data(GTK_OBJECT(menu), "label_color_menu", menu);
+       g_object_set_data(G_OBJECT(menu), "label_color_menu", menu);
 
        item = gtk_menu_item_new_with_label(_("None"));
-       gtk_menu_append(GTK_MENU(menu), item);
-       gtk_object_set_data(GTK_OBJECT(item), "color", GUINT_TO_POINTER(0));
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+       g_object_set_data(G_OBJECT(item), "color", GUINT_TO_POINTER(0));
        gtk_widget_show(item);
-       
+
        /* and the color items */
        for (i = 0; i < LABEL_COLORS_ELEMS; i++) {
-               GtkWidget *widget = colorlabel_create_color_widget(label_colors[i].color);
+               GtkWidget *hbox; 
+               GtkWidget *vbox;
+               GtkWidget *widget;
 
                item  = gtk_menu_item_new();
-               gtk_object_set_data(GTK_OBJECT(item), "color", GUINT_TO_POINTER(i + 1));
+               g_object_set_data(G_OBJECT(item), "color",
+                                 GUINT_TO_POINTER(i + 1));
 
                label = gtk_label_new(label_colors[i].label);
                
-               gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
                gtk_widget_show(label);
                hbox = gtk_hbox_new(FALSE, 0);
                gtk_widget_show(hbox);
                gtk_container_add(GTK_CONTAINER(item), hbox);
 
-               align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
-               gtk_widget_show(align);
-               gtk_container_set_border_width(GTK_CONTAINER(align), 1);
+               vbox = gtk_vbox_new(TRUE, 0);
+               gtk_widget_show(vbox);
+               gtk_container_set_border_width(GTK_CONTAINER(vbox), 1);
 
-               gtk_container_add(GTK_CONTAINER(align), widget);
+               widget = colorlabel_create_color_widget(label_colors[i].color);
                gtk_widget_show(widget);
-               gtk_widget_set_usize(align, 16, 16);
+               gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0);
 
-               gtk_box_pack_start(GTK_BOX(hbox), align, FALSE, FALSE, 0);
+               gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
                gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 4);
                
-               gtk_menu_append(GTK_MENU(menu), item);
+               gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
                gtk_widget_show(item);
        }
-
+       
+       g_signal_connect(G_OBJECT(menu), "selection-done", 
+                       G_CALLBACK(refresh_menu), menu);
        gtk_widget_show(menu);
 
        return menu;
@@ -318,14 +338,10 @@ GtkWidget *colorlabel_create_color_menu(void)
 guint colorlabel_get_color_menu_active_item(GtkWidget *menu)
 {
        GtkWidget *menuitem;
-       guint      color;
+       guint color;
 
-       g_return_val_if_fail
-               (gtk_object_get_data(GTK_OBJECT(menu), "label_color_menu"), 0);
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
        color = GPOINTER_TO_UINT
-               (gtk_object_get_data(GTK_OBJECT(menuitem), "color"));
+               (g_object_get_data(G_OBJECT(menuitem), "color"));
        return color;
 }
-
-