From 51fe60cd69cd77fd63dbdd20b3e5fcc6bb650c8a Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Sat, 14 Nov 2009 00:20:35 -0500 Subject: BugĀ 600714 - No label colors in popup menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mail/Makefile.am | 2 + mail/e-mail-label-action.c | 155 +++++++++++++++++++++++++++++++++++++++++++++ mail/e-mail-label-action.h | 73 +++++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 mail/e-mail-label-action.c create mode 100644 mail/e-mail-label-action.h (limited to 'mail') diff --git a/mail/Makefile.am b/mail/Makefile.am index 01d41aaaa6..286d27dc12 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -40,6 +40,7 @@ mailinclude_HEADERS = \ e-mail-attachment-bar.h \ e-mail-browser.h \ e-mail-display.h \ + e-mail-label-action.h \ e-mail-label-dialog.h \ e-mail-label-list-store.h \ e-mail-label-manager.h \ @@ -96,6 +97,7 @@ libevolution_mail_la_SOURCES = \ e-mail-attachment-bar.c \ e-mail-browser.c \ e-mail-display.c \ + e-mail-label-action.c \ e-mail-label-dialog.c \ e-mail-label-list-store.c \ e-mail-label-manager.c \ diff --git a/mail/e-mail-label-action.c b/mail/e-mail-label-action.c new file mode 100644 index 0000000000..2647564223 --- /dev/null +++ b/mail/e-mail-label-action.c @@ -0,0 +1,155 @@ +/* + * e-mail-label-action.c + * + * This program 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) version 3. + * + * This program 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 the program; if not, see + * + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + +#include "e-mail-label-action.h" + +#include "e-util/e-binding.h" + +#define E_MAIL_LABEL_ACTION_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionPrivate)) + +struct _EMailLabelActionPrivate { + gint placeholder; +}; + +static gpointer parent_class; + +static void +mail_label_action_menu_item_realize_cb (GtkWidget *menu_item) +{ + GtkAction *action; + GtkActivatable *activatable; + GtkWidget *container; + GtkWidget *widget; + const gchar *stock_id; + + activatable = GTK_ACTIVATABLE (menu_item); + action = gtk_activatable_get_related_action (activatable); + g_return_if_fail (E_IS_MAIL_LABEL_ACTION (action)); + + /* Prevent GtkMenuItem's sync_action_properties() method from + * destroying our hack. Instead we use EBindings to keep the + * label and image in sync with the action. */ + gtk_activatable_set_use_action_appearance (activatable, FALSE); + + /* Remove the menu item's child widget. */ + widget = gtk_bin_get_child (GTK_BIN (menu_item)); + gtk_widget_destroy (widget); + + /* Now add our own child widget. */ + + widget = gtk_hbox_new (FALSE, 3); + gtk_container_add (GTK_CONTAINER (menu_item), widget); + gtk_widget_show (widget); + + container = widget; + + /*stock_id = gtk_action_get_stock_id (action); + widget = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);*/ + widget = gtk_action_create_icon (action, GTK_ICON_SIZE_MENU); + gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0); + gtk_widget_show (widget); + + /* XXX GtkImage calls it "stock", not "stock-id". */ + /*e_mutual_binding_new (action, "stock-id", widget, "stock");*/ + + widget = gtk_label_new (NULL); + gtk_label_set_use_underline (GTK_LABEL (widget), TRUE); + gtk_misc_set_alignment (GTK_MISC (widget), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0); + gtk_widget_show (widget); + + e_mutual_binding_new (action, "label", widget, "label"); +} + +static GtkWidget * +mail_label_action_create_menu_item (GtkAction *action) +{ + GtkWidget *menu_item; + + menu_item = gtk_check_menu_item_new (); + + g_signal_connect ( + menu_item, "realize", + G_CALLBACK (mail_label_action_menu_item_realize_cb), NULL); + + return menu_item; +} + +static void +mail_label_action_class_init (EMailLabelActionClass *class) +{ + GtkActionClass *action_class; + + parent_class = g_type_class_peek_parent (class); + g_type_class_add_private (class, sizeof (EMailLabelActionPrivate)); + + action_class = GTK_ACTION_CLASS (class); + action_class->create_menu_item = mail_label_action_create_menu_item; +} + +static void +mail_label_action_init (EMailLabelAction *action) +{ + action->priv = E_MAIL_LABEL_ACTION_GET_PRIVATE (action); +} + +GType +e_mail_label_action_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + static const GTypeInfo type_info = { + sizeof (EMailLabelActionClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) mail_label_action_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (EMailLabelAction), + 0, /* n_preallocs */ + (GInstanceInitFunc) mail_label_action_init, + NULL /* value_table */ + }; + + type = g_type_register_static ( + GTK_TYPE_TOGGLE_ACTION, + "EMailLabelAction", &type_info, 0); + } + + return type; +} + +EMailLabelAction * +e_mail_label_action_new (const gchar *name, + const gchar *label, + const gchar *tooltip, + const gchar *stock_id) +{ + g_return_val_if_fail (name != NULL, NULL); + + return g_object_new ( + E_TYPE_MAIL_LABEL_ACTION, + "name", name, "label", label, + "tooltip", tooltip, "stock-id", stock_id, NULL); +} diff --git a/mail/e-mail-label-action.h b/mail/e-mail-label-action.h new file mode 100644 index 0000000000..1b681f15db --- /dev/null +++ b/mail/e-mail-label-action.h @@ -0,0 +1,73 @@ +/* + * e-mail-label-action.h + * + * This program 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) version 3. + * + * This program 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 the program; if not, see + * + * + * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com) + * + */ + +/* This is a toggle action whose menu item shows a checkbox, icon and + * label. Use of this thing for anything besides the label submenu in + * the message list popup menu is discouraged, which is why this class + * was not given a more generic name. */ + +#ifndef E_MAIL_LABEL_ACTION_H +#define E_MAIL_LABEL_ACTION_H + +#include + +/* Standard GObject macros */ +#define E_TYPE_MAIL_LABEL_ACTION \ + (e_mail_label_action_get_type ()) +#define E_MAIL_LABEL_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST \ + ((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelAction)) +#define E_MAIL_LABEL_ACTION_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_CAST \ + ((cls), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionClass)) +#define E_IS_MAIL_LABEL_ACTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE \ + ((obj), E_TYPE_MAIL_LABEL_ACTION)) +#define E_IS_MAIL_LABEL_ACTION_CLASS(cls) \ + (G_TYPE_CHECK_CLASS_TYPE \ + ((cls), E_TYPE_MAIL_LABEL_ACTION)) +#define E_MAIL_LABEL_ACTION_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS \ + ((obj), E_TYPE_MAIL_LABEL_ACTION, EMailLabelActionClass)) + +G_BEGIN_DECLS + +typedef struct _EMailLabelAction EMailLabelAction; +typedef struct _EMailLabelActionClass EMailLabelActionClass; +typedef struct _EMailLabelActionPrivate EMailLabelActionPrivate; + +struct _EMailLabelAction { + GtkToggleAction parent; + EMailLabelActionPrivate *priv; +}; + +struct _EMailLabelActionClass { + GtkToggleActionClass parent_class; +}; + +GType e_mail_label_action_get_type (void); +EMailLabelAction * + e_mail_label_action_new (const gchar *name, + const gchar *label, + const gchar *tooltip, + const gchar *stock_id); + +#endif /* E_MAIL_LABEL_ACTION_H */ -- cgit