From 2d4d49a088d9666ea76cdaafc2cd7a6d57623020 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Mon, 11 Feb 2002 23:00:13 +0000 Subject: Get followup-up message-list values. Also highlight the message in red if 2002-02-11 Jeffrey Stedfast * message-list.c (ml_tree_value_at): Get followup-up message-list values. Also highlight the message in red if the due-by date is past due (this is what Outlook does). (ml_duplicate_value): Handle follow-up columns. (ml_free_value): Same. (ml_initialize_value): Here too. (ml_value_is_empty): And here. (ml_value_to_string): And finally here. * message-tag-followup.c (message_tag_followup_i18n_name): New convenience function. svn path=/trunk/; revision=15680 --- mail/ChangeLog | 14 +++ mail/message-list.c | 219 +++++++++++++++++++++++++++++--------------- mail/message-list.etspec | 17 +++- mail/message-list.h | 7 +- mail/message-tag-followup.c | 45 +++++---- mail/message-tag-followup.h | 24 ++--- 6 files changed, 219 insertions(+), 107 deletions(-) (limited to 'mail') diff --git a/mail/ChangeLog b/mail/ChangeLog index 96ea089f8d..4fde40e165 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2002-02-11 Jeffrey Stedfast + + * message-list.c (ml_tree_value_at): Get followup-up message-list + values. Also highlight the message in red if the due-by date is + past due (this is what Outlook does). + (ml_duplicate_value): Handle follow-up columns. + (ml_free_value): Same. + (ml_initialize_value): Here too. + (ml_value_is_empty): And here. + (ml_value_to_string): And finally here. + + * message-tag-followup.c (message_tag_followup_i18n_name): New + convenience function. + 2002-02-11 Radek Doulik * mail-callbacks.c (create_msg_composer): unset changed, drop diff --git a/mail/message-list.c b/mail/message-list.c index 152d144067..e3c6f3f726 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -44,6 +44,8 @@ #include "mail-ops.h" #include "Mail.h" +#include "message-tag-followup.h" + #include "art/mail-new.xpm" #include "art/mail-read.xpm" #include "art/mail-replied.xpm" @@ -150,6 +152,7 @@ static struct { { score_high_xpm, NULL }, { score_higher_xpm, NULL }, { score_highest_xpm, NULL }, + { priority_high_xpm, NULL }, /* FIXME: replace with a flag icon */ { NULL, NULL } }; @@ -530,13 +533,16 @@ ml_duplicate_value (ETreeModel *etm, int col, const void *value, void *data) case COL_SENT: case COL_RECEIVED: case COL_SIZE: + case COL_FOLLOWUP_FLAG_STATUS: + case COL_FOLLOWUP_DUE_BY: return (void *) value; - + case COL_FROM: case COL_SUBJECT: case COL_TO: + case COL_FOLLOWUP_FLAG: return g_strdup (value); - + default: g_assert_not_reached (); } @@ -556,11 +562,14 @@ ml_free_value (ETreeModel *etm, int col, void *value, void *data) case COL_SENT: case COL_RECEIVED: case COL_SIZE: + case COL_FOLLOWUP_FLAG_STATUS: + case COL_FOLLOWUP_DUE_BY: break; - + case COL_FROM: case COL_SUBJECT: case COL_TO: + case COL_FOLLOWUP_FLAG: g_free (value); break; default: @@ -581,12 +590,15 @@ ml_initialize_value (ETreeModel *etm, int col, void *data) case COL_SENT: case COL_RECEIVED: case COL_SIZE: + case COL_FOLLOWUP_FLAG_STATUS: + case COL_FOLLOWUP_DUE_BY: return NULL; - + case COL_FROM: case COL_SUBJECT: case COL_TO: - return g_strdup(""); + case COL_FOLLOWUP_FLAG: + return g_strdup (""); default: g_assert_not_reached (); } @@ -607,11 +619,14 @@ ml_value_is_empty (ETreeModel *etm, int col, const void *value, void *data) case COL_SENT: case COL_RECEIVED: case COL_SIZE: + case COL_FOLLOWUP_FLAG_STATUS: + case COL_FOLLOWUP_DUE_BY: return value == NULL; - + case COL_FROM: case COL_SUBJECT: case COL_TO: + case COL_FOLLOWUP_FLAG: return !(value && *(char *)value); default: g_assert_not_reached (); @@ -637,40 +652,44 @@ static const char *score_map[] = { N_("Highest"), }; + static char * ml_value_to_string (ETreeModel *etm, int col, const void *value, void *data) { unsigned int i; - + switch (col){ case COL_MESSAGE_STATUS: i = (unsigned int)value; if (i > 4) - return g_strdup(""); - return g_strdup(_(status_map[i])); - + return g_strdup (""); + return g_strdup (_(status_map[i])); + case COL_SCORE: - i = (unsigned int)value + 3; + i = (unsigned int) value + 3; if (i > 6) i = 3; - return g_strdup(_(score_map[i])); + return g_strdup (_(score_map[i])); case COL_ATTACHMENT: case COL_FLAGGED: case COL_DELETED: case COL_UNREAD: - return g_strdup_printf("%d", (int) value); + case COL_FOLLOWUP_FLAG_STATUS: + return g_strdup_printf ("%d", (int) value); case COL_SENT: case COL_RECEIVED: - return filter_date (GPOINTER_TO_INT(value)); + case COL_FOLLOWUP_DUE_BY: + return filter_date (GPOINTER_TO_INT (value)); case COL_SIZE: - return filter_size (GPOINTER_TO_INT(value)); - + return filter_size (GPOINTER_TO_INT (value)); + case COL_FROM: case COL_SUBJECT: case COL_TO: + case COL_FOLLOWUP_FLAG: return g_strdup (value); default: g_assert_not_reached (); @@ -691,14 +710,14 @@ subtree_unread(MessageList *ml, ETreePath node) { CamelMessageInfo *info; ETreePath child; - + while (node) { info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); g_assert(info); - + if (!(info->flags & CAMEL_MESSAGE_SEEN)) return TRUE; - + if ((child = e_tree_model_node_get_first_child (E_TREE_MODEL (ml->model), node))) if (subtree_unread(ml, child)) return TRUE; @@ -713,15 +732,15 @@ subtree_size(MessageList *ml, ETreePath node) CamelMessageInfo *info; int size = 0; ETreePath child; - + while (node) { info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); g_assert(info); - + size += info->size; if ((child = e_tree_model_node_get_first_child (E_TREE_MODEL (ml->model), node))) size += subtree_size(ml, child); - + node = e_tree_model_node_get_next (ml->model, node); } return size; @@ -733,28 +752,28 @@ subtree_earliest(MessageList *ml, ETreePath node, int sent) CamelMessageInfo *info; time_t earliest = 0, date; ETreePath *child; - + while (node) { info = e_tree_memory_node_get_data((ETreeMemory *)ml->model, node); g_assert(info); - + if (sent) date = info->date_sent; else date = info->date_received; - + if (earliest == 0 || date < earliest) earliest = date; - + if ((child = e_tree_model_node_get_first_child (ml->model, node))) { date = subtree_earliest(ml, child, sent); if (earliest == 0 || (date != 0 && date < earliest)) earliest = date; } - + node = e_tree_model_node_get_next (ml->model, node); } - + return earliest; } @@ -763,15 +782,15 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) { MessageList *message_list = model_data; CamelMessageInfo *msg_info; - + /* retrieve the message information array */ msg_info = e_tree_memory_node_get_data (E_TREE_MEMORY(etm), path); g_assert(msg_info); - + switch (col){ case COL_MESSAGE_STATUS: { ETreePath child; - + /* if a tree is collapsed, then scan its insides for details */ child = e_tree_model_node_get_first_child(etm, path); if (child && !e_tree_node_is_expanded(message_list->tree, path)) { @@ -780,7 +799,7 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) else return (void *)4; } - + if (msg_info->flags & CAMEL_MESSAGE_ANSWERED) return GINT_TO_POINTER (2); else if (msg_info->flags & CAMEL_MESSAGE_SEEN) @@ -801,6 +820,46 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) return GINT_TO_POINTER (score); } + case COL_FOLLOWUP_FLAG_STATUS: { + const char *tag; + + tag = camel_tag_get ((CamelTag **) &msg_info->user_tags, "follow-up"); + if (tag) + return GINT_TO_POINTER (TRUE); + else + return GINT_TO_POINTER (FALSE); + } + case COL_FOLLOWUP_DUE_BY: { + struct _FollowUpTag *tag; + const char *tag_value; + time_t due_by; + + tag_value = camel_tag_get ((CamelTag **) &msg_info->user_tags, "follow-up"); + if (tag_value) { + tag = message_tag_followup_decode (tag_value); + due_by = tag->target_date; + g_free (tag); + return GINT_TO_POINTER (due_by); + } else { + return GINT_TO_POINTER (0); + } + } + case COL_FOLLOWUP_FLAG: { + struct _FollowUpTag *tag; + const char *tag_value; + int flag_type; + + tag_value = camel_tag_get ((CamelTag **) &msg_info->user_tags, "follow-up"); + if (tag_value) { + tag = message_tag_followup_decode (tag_value); + flag_type = tag ? tag->type : FOLLOWUP_FLAG_NONE; + g_free (tag); + + return (void *) message_tag_followup_i18n_name (flag_type); + } else { + return NULL; + } + } case COL_ATTACHMENT: return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_ATTACHMENTS) != 0); case COL_FROM: @@ -819,29 +878,40 @@ ml_tree_value_at (ETreeModel *etm, ETreePath path, int col, void *model_data) return GINT_TO_POINTER ((msg_info->flags & CAMEL_MESSAGE_DELETED) != 0); case COL_UNREAD: { ETreePath child; - + child = e_tree_model_node_get_first_child(etm, path); if (child && !e_tree_node_is_expanded(message_list->tree, path) && (msg_info->flags & CAMEL_MESSAGE_SEEN)) { return GINT_TO_POINTER (subtree_unread (message_list, child)); } - + return GINT_TO_POINTER (!(msg_info->flags & CAMEL_MESSAGE_SEEN)); } case COL_COLOUR: { - const char *colour; - + const char *colour, *followup; + colour = camel_tag_get ((CamelTag **) &msg_info->user_tags, "colour"); - if (colour == NULL && msg_info->flags & CAMEL_MESSAGE_FLAGGED) + followup = camel_tag_get ((CamelTag **) &msg_info->user_tags, "follow-up"); + if (colour == NULL && msg_info->flags & CAMEL_MESSAGE_FLAGGED) { /* FIXME: extract from the xpm somehow. */ colour = "#A7453E"; + } else if (followup != NULL) { + struct _FollowUpTag *tag; + time_t now = time (NULL); + + tag = message_tag_followup_decode (followup); + if (tag && now >= tag->target_date) { + /* FIXME: extract from the xpm somehow. */ + colour = "#A7453E"; + } + g_free (tag); + } return (void *)colour; } + default: + g_assert_not_reached (); + return NULL; } - - g_assert_not_reached (); - - return NULL; } static void @@ -882,10 +952,10 @@ filter_date (time_t date) struct tm then, now, yesterday; char buf[26]; gboolean done = FALSE; - + if (date == 0) return g_strdup (_("?")); - + localtime_r (&date, &then); localtime_r (&nowdate, &now); if (then.tm_mday == now.tm_mday && @@ -943,42 +1013,45 @@ message_list_create_extras (void) GdkPixbuf *images [7]; ETableExtras *extras; ECell *cell; - - extras = e_table_extras_new(); - e_table_extras_add_pixbuf(extras, "status", states_pixmaps [0].pixbuf); - e_table_extras_add_pixbuf(extras, "score", states_pixmaps [13].pixbuf); - e_table_extras_add_pixbuf(extras, "attachment", states_pixmaps [6].pixbuf); - e_table_extras_add_pixbuf(extras, "flagged", states_pixmaps [7].pixbuf); - e_table_extras_add_compare(extras, "address_compare", address_compare); - e_table_extras_add_compare(extras, "subject_compare", subject_compare); + extras = e_table_extras_new (); + e_table_extras_add_pixbuf (extras, "status", states_pixmaps [0].pixbuf); + e_table_extras_add_pixbuf (extras, "score", states_pixmaps [13].pixbuf); + e_table_extras_add_pixbuf (extras, "attachment", states_pixmaps [6].pixbuf); + e_table_extras_add_pixbuf (extras, "flagged", states_pixmaps [7].pixbuf); + e_table_extras_add_pixbuf (extras, "followup", states_pixmaps [15].pixbuf); + + e_table_extras_add_compare (extras, "address_compare", address_compare); + e_table_extras_add_compare (extras, "subject_compare", subject_compare); for (i = 0; i < 5; i++) images [i] = states_pixmaps [i].pixbuf; - - e_table_extras_add_cell(extras, "render_message_status", e_cell_toggle_new (0, 5, images)); - + + e_table_extras_add_cell (extras, "render_message_status", e_cell_toggle_new (0, 5, images)); + for (i = 0; i < 2; i++) images [i] = states_pixmaps [i + 5].pixbuf; - e_table_extras_add_cell(extras, "render_attachment", e_cell_toggle_new (0, 2, images)); + e_table_extras_add_cell (extras, "render_attachment", e_cell_toggle_new (0, 2, images)); images [1] = states_pixmaps [7].pixbuf; - e_table_extras_add_cell(extras, "render_flagged", e_cell_toggle_new (0, 2, images)); - + e_table_extras_add_cell (extras, "render_flagged", e_cell_toggle_new (0, 2, images)); + + images[1] = states_pixmaps [15].pixbuf; + e_table_extras_add_cell (extras, "render_flag_status", e_cell_toggle_new (0, 2, images)); + for (i = 0; i < 7; i++) images[i] = states_pixmaps [i + 7].pixbuf; - e_table_extras_add_cell(extras, "render_score", e_cell_toggle_new (0, 7, images)); - - + e_table_extras_add_cell (extras, "render_score", e_cell_toggle_new (0, 7, images)); + /* date cell */ cell = e_cell_date_new (NULL, GTK_JUSTIFY_LEFT); gtk_object_set (GTK_OBJECT (cell), "bold_column", COL_UNREAD, "color_column", COL_COLOUR, NULL); - e_table_extras_add_cell(extras, "render_date", cell); + e_table_extras_add_cell (extras, "render_date", cell); /* text cell */ cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT); @@ -986,20 +1059,20 @@ message_list_create_extras (void) "bold_column", COL_UNREAD, "color_column", COL_COLOUR, NULL); - e_table_extras_add_cell(extras, "render_text", cell); + e_table_extras_add_cell (extras, "render_text", cell); + + e_table_extras_add_cell (extras, "render_tree", + e_cell_tree_new (NULL, NULL, /* let the tree renderer default the pixmaps */ + TRUE, cell)); - e_table_extras_add_cell(extras, "render_tree", - e_cell_tree_new (NULL, NULL, /* let the tree renderer default the pixmaps */ - TRUE, cell)); - /* size cell */ cell = e_cell_size_new (NULL, GTK_JUSTIFY_RIGHT); gtk_object_set (GTK_OBJECT (cell), "bold_column", COL_UNREAD, "color_column", COL_COLOUR, NULL); - e_table_extras_add_cell(extras, "render_size", cell); - + e_table_extras_add_cell (extras, "render_size", cell); + return extras; } @@ -1970,9 +2043,9 @@ on_cursor_activated_cmd (ETree *tree, int row, ETreePath path, gpointer user_dat static gint on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, MessageList *list) { - int flag; CamelMessageInfo *info; - + int flag; + if (col == COL_MESSAGE_STATUS) flag = CAMEL_MESSAGE_SEEN; else if (col == COL_FLAGGED) @@ -1988,14 +2061,12 @@ on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, Mess /* If a message was marked as deleted and the user flags it as important, marks it as needing a reply, marks it as unread, then undelete the message. */ - if (info->flags & CAMEL_MESSAGE_DELETED) { - + if (info->flags & CAMEL_MESSAGE_DELETED) { if (col == COL_FLAGGED && !(info->flags & CAMEL_MESSAGE_FLAGGED)) flag |= CAMEL_MESSAGE_DELETED; - + if (col == COL_MESSAGE_STATUS && (info->flags & CAMEL_MESSAGE_SEEN)) flag |= CAMEL_MESSAGE_DELETED; - } camel_folder_set_message_flags (list->folder, camel_message_info_uid (info), flag, ~info->flags); diff --git a/mail/message-list.etspec b/mail/message-list.etspec index d75a261173..4f91cbb98d 100644 --- a/mail/message-list.etspec +++ b/mail/message-list.etspec @@ -2,17 +2,32 @@ + + + + + + + + + + + + + + + - + diff --git a/mail/message-list.h b/mail/message-list.h index ed2652024f..42de65cbd8 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -26,7 +26,9 @@ enum { COL_RECEIVED, COL_TO, COL_SIZE, - COL_NEED_REPLY, + COL_FOLLOWUP_FLAG_STATUS, + COL_FOLLOWUP_FLAG, + COL_FOLLOWUP_DUE_BY, COL_LAST, @@ -37,8 +39,7 @@ enum { }; #define MESSAGE_LIST_COLUMN_IS_ACTIVE(col) (col == COL_MESSAGE_STATUS || \ - col == COL_FLAGGED || \ - col == COL_NEED_REPLY) + col == COL_FLAGGED) #define ML_HIDE_NONE_START (0) #define ML_HIDE_NONE_END (2147483647) diff --git a/mail/message-tag-followup.c b/mail/message-tag-followup.c index 86a7abd95b..067dd941ee 100644 --- a/mail/message-tag-followup.c +++ b/mail/message-tag-followup.c @@ -47,17 +47,17 @@ static struct { const char *name; int value; } available_flags[] = { - { N_("Call"), "call", FLAG_CALL }, - { N_("Do Not Forward"), "do-not-forward", FLAG_DO_NOT_FORWARD }, - { N_("Follow-Up"), "follow-up", FLAG_FOLLOWUP }, - { N_("For Your Information"), "fyi", FLAG_FYI }, - { N_("Forward"), "forward", FLAG_FORWARD }, - { N_("No Response Necessary"), "no-response", FLAG_NO_RESPONSE_NECESSARY }, - { N_("Read"), "read", FLAG_READ }, - { N_("Reply"), "reply", FLAG_REPLY }, - { N_("Reply to All"), "reply-all", FLAG_REPLY_ALL }, - { N_("Review"), "review", FLAG_REVIEW }, - { N_("None"), NULL, FLAG_NONE } + { N_("Call"), "call", FOLLOWUP_FLAG_CALL }, + { N_("Do Not Forward"), "do-not-forward", FOLLOWUP_FLAG_DO_NOT_FORWARD }, + { N_("Follow-Up"), "follow-up", FOLLOWUP_FLAG_FOLLOWUP }, + { N_("For Your Information"), "fyi", FOLLOWUP_FLAG_FYI }, + { N_("Forward"), "forward", FOLLOWUP_FLAG_FORWARD }, + { N_("No Response Necessary"), "no-response", FOLLOWUP_FLAG_NO_RESPONSE_NECESSARY }, + { N_("Read"), "read", FOLLOWUP_FLAG_READ }, + { N_("Reply"), "reply", FOLLOWUP_FLAG_REPLY }, + { N_("Reply to All"), "reply-all", FOLLOWUP_FLAG_REPLY_ALL }, + { N_("Review"), "review", FOLLOWUP_FLAG_REVIEW }, + { N_("None"), NULL, FOLLOWUP_FLAG_NONE } }; static MessageTagEditorClass *parent_class; @@ -105,7 +105,7 @@ static void message_tag_followup_init (MessageTagFollowUp *editor) { editor->tag = g_new (struct _FollowUpTag, 1); - editor->tag->type = FLAG_NONE; + editor->tag->type = FOLLOWUP_FLAG_NONE; editor->tag->target_date = time (NULL); editor->tag->completed = 0; @@ -190,7 +190,7 @@ message_tag_followup_decode (const char *value) tag = g_new (struct _FollowUpTag, 1); - for (i = 0; i < FLAG_NONE; i++) { + for (i = 0; i < FOLLOWUP_FLAG_NONE; i++) { if (!strncmp (value, available_flags[i].name, strlen (available_flags[i].name))) break; } @@ -221,7 +221,7 @@ message_tag_followup_encode (struct _FollowUpTag *tag) { g_return_val_if_fail (tag != NULL, NULL); - if (tag->type == FLAG_NONE) + if (tag->type == FOLLOWUP_FLAG_NONE) return NULL; return g_strdup_printf ("%s:%lx:%lx", available_flags[tag->type].name, @@ -229,13 +229,24 @@ message_tag_followup_encode (struct _FollowUpTag *tag) (unsigned long) tag->completed); } +const char * +message_tag_followup_i18n_name (int type) +{ + g_return_val_if_fail (type >= 0 && type <= FOLLOWUP_FLAG_NONE, NULL); + + if (type != FOLLOWUP_FLAG_NONE) + return _(available_flags[type].i18n_name); + else + return NULL; +} + static void clear_clicked (GtkButton *button, gpointer user_data) { MessageTagFollowUp *followup = user_data; gtk_widget_show (followup->none); - gtk_option_menu_set_history (followup->type, FLAG_NONE); + gtk_option_menu_set_history (followup->type, FOLLOWUP_FLAG_NONE); gtk_signal_emit_by_name (GTK_OBJECT (followup->none), "activate", followup); e_date_edit_set_time (followup->target_date, time (NULL)); @@ -309,7 +320,7 @@ construct (MessageTagEditor *editor) followup->type = GTK_OPTION_MENU (glade_xml_get_widget (gui, "followup_type")); gtk_option_menu_remove_menu (followup->type); menu = gtk_menu_new (); - for (i = 0; i <= FLAG_NONE; i++) { + for (i = 0; i <= FOLLOWUP_FLAG_NONE; i++) { item = gtk_menu_item_new_with_label (_(available_flags[i].i18n_name)); gtk_object_set_data (GTK_OBJECT (item), "value", GINT_TO_POINTER (available_flags[i].value)); @@ -321,7 +332,7 @@ construct (MessageTagEditor *editor) followup->none = item; gtk_option_menu_set_menu (followup->type, menu); gtk_signal_emit_by_name (GTK_OBJECT (item), "activate", followup); - gtk_option_menu_set_history (followup->type, FLAG_NONE); + gtk_option_menu_set_history (followup->type, FOLLOWUP_FLAG_NONE); followup->target_date = E_DATE_EDIT (glade_xml_get_widget (gui, "target_date")); e_date_edit_set_time (followup->target_date, time (NULL)); diff --git a/mail/message-tag-followup.h b/mail/message-tag-followup.h index 2f61679664..75161a4e76 100644 --- a/mail/message-tag-followup.h +++ b/mail/message-tag-followup.h @@ -41,17 +41,17 @@ extern "C" { #define IS_MESSAGE_TAG_FOLLOWUP(obj) GTK_CHECK_TYPE (obj, message_tag_followup_get_type ()) enum { - FLAG_CALL, - FLAG_DO_NOT_FORWARD, - FLAG_FOLLOWUP, - FLAG_FYI, - FLAG_FORWARD, - FLAG_NO_RESPONSE_NECESSARY, - FLAG_READ, - FLAG_REPLY, - FLAG_REPLY_ALL, - FLAG_REVIEW, - FLAG_NONE + FOLLOWUP_FLAG_CALL, + FOLLOWUP_FLAG_DO_NOT_FORWARD, + FOLLOWUP_FLAG_FOLLOWUP, + FOLLOWUP_FLAG_FYI, + FOLLOWUP_FLAG_FORWARD, + FOLLOWUP_FLAG_NO_RESPONSE_NECESSARY, + FOLLOWUP_FLAG_READ, + FOLLOWUP_FLAG_REPLY, + FOLLOWUP_FLAG_REPLY_ALL, + FOLLOWUP_FLAG_REVIEW, + FOLLOWUP_FLAG_NONE }; struct _FollowUpTag { @@ -90,7 +90,7 @@ GtkType message_tag_followup_get_type (void); /* utility functions */ struct _FollowUpTag *message_tag_followup_decode (const char *tag_value); char *message_tag_followup_encode (struct _FollowUpTag *followup); - +const char *message_tag_followup_i18n_name (int type); MessageTagEditor *message_tag_followup_new (void); -- cgit v1.2.3