From f9f3d6073e646e386641059580d109e36c0a4aa2 Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 9 Feb 2002 02:03:07 +0000 Subject: New flag-for-followup tag editor dialog. 2002-02-08 Jeffrey Stedfast * message-tag-followup.[c,h]: New flag-for-followup tag editor dialog. * mail-callbacks.c (flag_for_followup): New callback that pops up a flag-for-followup editor dialog. (flag_followup_completed): Marks all flag-for-followup'd messages as 'complete'. (flag_followup_clear): Clears all flag-for-followup tags from the selected messages. * message-tags.glade: glade file for tag editors. svn path=/trunk/; revision=15632 --- mail/ChangeLog | 14 ++ mail/Makefile.am | 4 +- mail/folder-browser.c | 6 +- mail/mail-callbacks.c | 139 ++++++++++++++++++- mail/mail-callbacks.h | 4 +- mail/message-tag-followup.c | 330 ++++++++++++++++++++++++++++++++++++++++++++ mail/message-tag-followup.h | 99 +++++++++++++ mail/message-tags.glade | 307 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 892 insertions(+), 11 deletions(-) create mode 100644 mail/message-tag-followup.c create mode 100644 mail/message-tag-followup.h create mode 100644 mail/message-tags.glade diff --git a/mail/ChangeLog b/mail/ChangeLog index b6bf98a894..ea6260731e 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2002-02-08 Jeffrey Stedfast + + * message-tag-followup.[c,h]: New flag-for-followup tag editor + dialog. + + * mail-callbacks.c (flag_for_followup): New callback that pops up + a flag-for-followup editor dialog. + (flag_followup_completed): Marks all flag-for-followup'd messages + as 'complete'. + (flag_followup_clear): Clears all flag-for-followup tags from the + selected messages. + + * message-tags.glade: glade file for tag editors. + 2002-02-08 Jeffrey Stedfast * message-tag-editor.[c,h]: Base class for a message tag editor. diff --git a/mail/Makefile.am b/mail/Makefile.am index ae237d2b90..cd4b6f29d2 100644 --- a/mail/Makefile.am +++ b/mail/Makefile.am @@ -108,6 +108,8 @@ evolution_mail_SOURCES = \ message-list.h \ message-tag-editor.c \ message-tag-editor.h \ + message-tag-followup.c \ + message-tag-followup.h \ subscribe-dialog.c \ subscribe-dialog.h \ mail.h @@ -137,7 +139,7 @@ oaf_DATA = $(oaf_in_files:.oaf.in=.oaf) @XML_I18N_MERGE_OAF_RULE@ gladedir = $(datadir)/evolution/glade -glade_DATA = mail-config.glade local-config.glade subscribe-dialog.glade +glade_DATA = mail-config.glade local-config.glade subscribe-dialog.glade message-tags.glade etspecdir = $(datadir)/evolution/etspec/ etspec_DATA = message-list.etspec subscribe-dialog.etspec diff --git a/mail/folder-browser.c b/mail/folder-browser.c index a2ca2b2a0b..d0d9887e7b 100644 --- a/mail/folder-browser.c +++ b/mail/folder-browser.c @@ -1471,9 +1471,9 @@ static EPopupMenu context_menu[] = { E_POPUP_SEPARATOR, - { N_("Flag for Follow-up"), NULL, GTK_SIGNAL_FUNC (flag_for_followup),NULL, CAN_FLAG_FOR_FOLLOWUP }, - { N_("Flag Completed"), NULL, GTK_SIGNAL_FUNC (flag_completed), NULL, CAN_FLAG_COMPLETED }, - { N_("Clear Flag"), NULL, GTK_SIGNAL_FUNC (flag_clear), NULL, CAN_FLAG_COMPLETED }, + { N_("Flag for Follow-up"), NULL, GTK_SIGNAL_FUNC (flag_for_followup), NULL, CAN_FLAG_FOR_FOLLOWUP }, + { N_("Flag Completed"), NULL, GTK_SIGNAL_FUNC (flag_followup_completed), NULL, CAN_FLAG_COMPLETED }, + { N_("Clear Flag"), NULL, GTK_SIGNAL_FUNC (flag_followup_clear), NULL, CAN_FLAG_COMPLETED }, /* separator here? */ diff --git a/mail/mail-callbacks.c b/mail/mail-callbacks.c index 2dcbec039c..d636778a04 100644 --- a/mail/mail-callbacks.c +++ b/mail/mail-callbacks.c @@ -58,6 +58,8 @@ #include "mail-folder-cache.h" #include "folder-browser.h" #include "subscribe-dialog.h" +#include "message-tag-editor.h" +#include "message-tag-followup.h" #include "e-messagebox.h" #include "Evolution.h" @@ -1807,22 +1809,149 @@ toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path) toggle_flags (FOLDER_BROWSER (user_data), CAMEL_MESSAGE_FLAGGED); } + +struct _tag_editor_data { + MessageTagEditor *editor; + FolderBrowser *fb; + GPtrArray *uids; +}; + +static void +tag_editor_ok (GtkWidget *button, gpointer user_data) +{ + struct _tag_editor_data *data = user_data; + const char *name, *value; + int i; + + if (FOLDER_BROWSER_IS_DESTROYED (data->fb)) + goto done; + + name = message_tag_editor_get_name (data->editor); + if (!name) + goto done; + + value = message_tag_editor_get_value (data->editor); + + camel_folder_freeze (data->fb->folder); + for (i = 0; i < data->uids->len; i++) { + camel_folder_set_message_user_tag (data->fb->folder, data->uids->pdata[i], name, value); + } + camel_folder_thaw (data->fb->folder); + + done: + gtk_widget_destroy (GTK_WIDGET (data->editor)); +} + +static void +tag_editor_cancel (GtkWidget *button, gpointer user_data) +{ + struct _tag_editor_data *data = user_data; + + gtk_widget_destroy (GTK_WIDGET (data->editor)); +} + +static void +tag_editor_destroy (GnomeDialog *dialog, gpointer user_data) +{ + struct _tag_editor_data *data = user_data; + + gtk_object_unref (GTK_OBJECT (data->fb)); + g_ptr_array_free (data->uids, TRUE); + g_free (data); +} + void flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path) { - ; + FolderBrowser *fb = FOLDER_BROWSER (user_data); + struct _tag_editor_data *data; + GtkWidget *editor; + GPtrArray *uids; + + if (FOLDER_BROWSER_IS_DESTROYED (fb)) + return; + + uids = g_ptr_array_new (); + message_list_foreach (fb->message_list, enumerate_msg, uids); + + editor = (GtkWidget *) message_tag_followup_new (); + + data = g_new (struct _tag_editor_data, 1); + data->editor = MESSAGE_TAG_EDITOR (editor); + gtk_widget_ref (GTK_WIDGET (fb)); + data->fb = fb; + data->uids = uids; + + gnome_dialog_button_connect (GNOME_DIALOG (editor), 0, tag_editor_ok, data); + gnome_dialog_button_connect (GNOME_DIALOG (editor), 1, tag_editor_cancel, data); + gnome_dialog_set_close (GNOME_DIALOG (editor), TRUE); + + gtk_signal_connect (GTK_OBJECT (editor), "destroy", + tag_editor_destroy, data); + + gtk_widget_show (editor); } void -flag_completed (BonoboUIComponent *uih, void *user_data, const char *path) +flag_followup_completed (BonoboUIComponent *uih, void *user_data, const char *path) { - ; + FolderBrowser *fb = FOLDER_BROWSER (user_data); + GPtrArray *uids; + time_t now; + int i; + + if (FOLDER_BROWSER_IS_DESTROYED (fb)) + return; + + uids = g_ptr_array_new (); + message_list_foreach (fb->message_list, enumerate_msg, uids); + + now = time (NULL); + + camel_folder_freeze (fb->folder); + for (i = 0; i < uids->len; i++) { + struct _FollowUpTag *tag; + const char *tag_value; + char *value; + + tag_value = camel_folder_get_message_user_tag (fb->folder, uids->pdata[i], "follow-up"); + if (!tag_value) + continue; + + tag = message_tag_followup_decode (tag_value); + tag->completed = now; + + value = message_tag_followup_encode (tag); + g_free (tag); + + camel_folder_set_message_user_tag (fb->folder, uids->pdata[i], "follow-up", value); + g_free (value); + } + camel_folder_thaw (fb->folder); + + g_ptr_array_free (uids, TRUE); } void -flag_clear (BonoboUIComponent *uih, void *user_data, const char *path) +flag_followup_clear (BonoboUIComponent *uih, void *user_data, const char *path) { - ; + FolderBrowser *fb = FOLDER_BROWSER (user_data); + GPtrArray *uids; + int i; + + if (FOLDER_BROWSER_IS_DESTROYED (fb)) + return; + + uids = g_ptr_array_new (); + message_list_foreach (fb->message_list, enumerate_msg, uids); + + camel_folder_freeze (fb->folder); + for (i = 0; i < uids->len; i++) { + camel_folder_set_message_user_tag (fb->folder, uids->pdata[i], "follow-up", NULL); + } + camel_folder_thaw (fb->folder); + + g_ptr_array_free (uids, TRUE); } void diff --git a/mail/mail-callbacks.h b/mail/mail-callbacks.h index d4be330565..f50763b16d 100644 --- a/mail/mail-callbacks.h +++ b/mail/mail-callbacks.h @@ -97,8 +97,8 @@ void mark_as_important (BonoboUIComponent *uih, void *user_data, const c void mark_as_unimportant (BonoboUIComponent *uih, void *user_data, const char *path); void toggle_as_important (BonoboUIComponent *uih, void *user_data, const char *path); void flag_for_followup (BonoboUIComponent *uih, void *user_data, const char *path); -void flag_completed (BonoboUIComponent *uih, void *user_data, const char *path); -void flag_clear (BonoboUIComponent *uih, void *user_data, const char *path); +void flag_followup_completed (BonoboUIComponent *uih, void *user_data, const char *path); +void flag_followup_clear (BonoboUIComponent *uih, void *user_data, const char *path); void zoom_in (BonoboUIComponent *uih, void *user_data, const char *path); void zoom_out (BonoboUIComponent *uih, void *user_data, const char *path); diff --git a/mail/message-tag-followup.c b/mail/message-tag-followup.c new file mode 100644 index 0000000000..3465dd4e69 --- /dev/null +++ b/mail/message-tag-followup.c @@ -0,0 +1,330 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Jeffrey Stedfast + * + * Copyright 2002 Ximain, Inc. (www.ximian.com) + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * 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 Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include + +#include + +#include "message-tag-followup.h" + +static void message_tag_followup_class_init (MessageTagFollowUpClass *class); +static void message_tag_followup_init (MessageTagFollowUp *followup); +static void message_tag_followup_finalise (GtkObject *obj); + +static const char *tag_get_name (MessageTagEditor *editor); +static const char *tag_get_value (MessageTagEditor *editor); +static void tag_set_value (MessageTagEditor *editor, const char *value); + + +static struct { + const char *i18n_name; + 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 } +}; + +static MessageTagEditorClass *parent_class; + +GtkType +message_tag_followup_get_type (void) +{ + static GtkType type = 0; + + if (!type) { + GtkTypeInfo type_info = { + "MessageTagFollowUp", + sizeof (MessageTagFollowUp), + sizeof (MessageTagFollowUpClass), + (GtkClassInitFunc) message_tag_followup_class_init, + (GtkObjectInitFunc) message_tag_followup_init, + (GtkArgSetFunc) NULL, + (GtkArgGetFunc) NULL + }; + + type = gtk_type_unique (message_tag_editor_get_type (), &type_info); + } + + return type; +} + +static void +message_tag_followup_class_init (MessageTagFollowUpClass *klass) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *) klass; + parent_class = gtk_type_class (message_tag_editor_get_type ()); + + object_class->finalize = message_tag_followup_finalise; + + parent_class->get_name = tag_get_name; + parent_class->get_value = tag_get_value; + parent_class->set_value = tag_set_value; +} + +static void +message_tag_followup_init (MessageTagFollowUp *editor) +{ + editor->tag = g_new (struct _FollowUpTag, 1); + editor->tag->type = FLAG_NONE; + editor->tag->target_date = time (NULL); + editor->tag->completed = 0; + + editor->value = NULL; + + editor->type = NULL; + editor->target_date = NULL; + editor->completed = NULL; + editor->clear = NULL; +} + + +static void +message_tag_followup_finalise (GtkObject *obj) +{ + MessageTagFollowUp *editor = (MessageTagFollowUp *) obj; + + g_free (editor->tag); + g_free (editor->value); + + ((GtkObjectClass *)(parent_class))->finalize (obj); +} + + +static const char * +tag_get_name (MessageTagEditor *editor) +{ + return "follow-up"; +} + +static const char * +tag_get_value (MessageTagEditor *editor) +{ + MessageTagFollowUp *followup = (MessageTagFollowUp *) editor; + + g_free (followup->value); + followup->value = message_tag_followup_encode (followup->tag); + + return followup->value; +} + +static void +set_widget_values (MessageTagFollowUp *followup) +{ + time_t completed; + + gtk_option_menu_set_history (followup->type, followup->tag->type); + + e_date_edit_set_time (followup->target_date, followup->tag->target_date); + + completed = followup->tag->completed; + gtk_toggle_button_set_active (followup->completed, completed ? TRUE : FALSE); + if (completed) + followup->tag->completed = completed; +} + +static void +tag_set_value (MessageTagEditor *editor, const char *value) +{ + MessageTagFollowUp *followup = (MessageTagFollowUp *) editor; + + g_free (followup->tag); + followup->tag = message_tag_followup_decode (value); + + set_widget_values (followup); +} + + +struct _FollowUpTag * +message_tag_followup_decode (const char *value) +{ + struct _FollowUpTag *tag; + const char *inptr; + int i; + + tag = g_new (struct _FollowUpTag, 1); + + for (i = 0; i < FLAG_NONE; i++) { + if (!strncmp (value, available_flags[i].name, strlen (available_flags[i].name))) + break; + } + + tag->type = i; + + inptr = value + strlen (available_flags[i].name); + + if (*inptr == ':') { + inptr++; + tag->target_date = strtoul (inptr, (char **) &inptr, 16); + if (*inptr == ':') { + inptr++; + tag->completed = strtoul (inptr, (char **) &inptr, 16); + } else + tag->completed = 0; + } else { + tag->target_date = time (NULL); + tag->completed = 0; + } + + return tag; +} + + +char * +message_tag_followup_encode (struct _FollowUpTag *tag) +{ + g_return_val_if_fail (tag != NULL, NULL); + + return g_strdup_printf ("%s:%lx:%lx", available_flags[tag->type].name, + (unsigned long) tag->target_date, + (unsigned long) tag->completed); +} + +static void +clear_clicked (GtkButton *button, gpointer user_data) +{ + MessageTagFollowUp *followup = user_data; + + /* FIXME: set dropdown == None?? */ + e_date_edit_set_time (followup->target_date, time (NULL)); + gtk_toggle_button_set_active (followup->completed, FALSE); +} + +static void +completed_toggled (GtkToggleButton *button, gpointer user_data) +{ + MessageTagFollowUp *followup = user_data; + + if (gtk_toggle_button_get_active (followup->completed)) + followup->tag->completed = time (NULL); + else + followup->tag->completed = 0; +} + +static void +type_changed (GtkMenuItem *item, gpointer user_data) +{ + MessageTagFollowUp *followup = user_data; + + followup->tag->type = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (item), "value")); +} + +static void +target_date_changed (EDateEdit *widget, gpointer user_data) +{ + MessageTagFollowUp *followup = user_data; + + followup->tag->target_date = e_date_edit_get_time (widget); +} + +GtkWidget *target_date_new (const char *s1, const char *s2, int i1, int i2); + +GtkWidget * +target_date_new (const char *s1, const char *s2, int i1, int i2) +{ + GtkWidget *widget; + + widget = e_date_edit_new (); + e_date_edit_set_show_date (E_DATE_EDIT (widget), TRUE); + e_date_edit_set_show_time (E_DATE_EDIT (widget), TRUE); + e_date_edit_set_week_start_day (E_DATE_EDIT (widget), 6); + /* FIXME: make this locale dependant?? */ + e_date_edit_set_use_24_hour_format (E_DATE_EDIT (widget), FALSE); + e_date_edit_set_allow_no_date_set (E_DATE_EDIT (widget), FALSE); + e_date_edit_set_time_popup_range (E_DATE_EDIT (widget), 0, 24); + + return widget; +} + +static void +construct (MessageTagEditor *editor) +{ + MessageTagFollowUp *followup = (MessageTagFollowUp *) editor; + GtkWidget *widget, *menu, *item; + GladeXML *gui; + int i; + + gui = glade_xml_new (EVOLUTION_GLADEDIR "/message-tags.glade", "followup_editor"); + + widget = glade_xml_get_widget (gui, "toplevel"); + + /* reparent */ + gtk_widget_reparent (widget, GNOME_DIALOG (editor)->vbox); + + 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++) { + 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)); + gtk_signal_connect (GTK_OBJECT (item), "activate", + type_changed, followup); + gtk_menu_append (GTK_MENU (menu), item); + gtk_widget_show (item); + } + gtk_option_menu_set_menu (followup->type, menu); + + followup->target_date = E_DATE_EDIT (glade_xml_get_widget (gui, "target_date")); + e_date_edit_set_time (followup->target_date, time (NULL)); + gtk_signal_connect (GTK_OBJECT (followup->target_date), "changed", + target_date_changed, followup); + + followup->completed = GTK_TOGGLE_BUTTON (glade_xml_get_widget (gui, "completed")); + gtk_signal_connect (GTK_OBJECT (followup->completed), "toggled", + completed_toggled, followup); + + followup->clear = GTK_BUTTON (glade_xml_get_widget (gui, "clear")); + gtk_signal_connect (GTK_OBJECT (followup->clear), "clicked", + clear_clicked, followup); + + gtk_object_unref (GTK_OBJECT (gui)); +} + +MessageTagEditor * +message_tag_followup_new (void) +{ + MessageTagEditor *editor; + + editor = (MessageTagEditor *) gtk_type_new (message_tag_followup_get_type ()); + construct (editor); + + return editor; +} diff --git a/mail/message-tag-followup.h b/mail/message-tag-followup.h new file mode 100644 index 0000000000..cb5b7857e1 --- /dev/null +++ b/mail/message-tag-followup.h @@ -0,0 +1,99 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * Authors: Jeffrey Stedfast + * + * Copyright 2002 Ximain, Inc. (www.ximian.com) + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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 General Public License for more details. + * + * 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 Street #330, Boston, MA 02111-1307, USA. + * + */ + + +#ifndef __MESSAGE_TAG_FOLLOWUP_H__ +#define __MESSAGE_TAG_FOLLOWUP_H__ + +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#pragma } +#endif /* __cplusplus */ + +#define MESSAGE_TAG_FOLLOWUP(obj) GTK_CHECK_CAST (obj, message_tag_followup_get_type (), MessageTagFollowUp) +#define MESSAGE_TAG_FOLLOWUP_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, message_tag_followup_get_type (), MessageTagFollowUpClass) +#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 +}; + +struct _FollowUpTag { + int type; + time_t target_date; + time_t completed; +}; + +typedef struct _MessageTagFollowUp MessageTagFollowUp; +typedef struct _MessageTagFollowUpClass MessageTagFollowUpClass; + +struct _MessageTagFollowUp { + MessageTagEditor parent; + + struct _FollowUpTag *tag; + char *value; + + GtkOptionMenu *type; + EDateEdit *target_date; + GtkToggleButton *completed; + GtkButton *clear; +}; + +struct _MessageTagFollowUpClass { + MessageTagEditorClass parent_class; + + /* virtual methods */ + /* signals */ +}; + + +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); + + +MessageTagEditor *message_tag_followup_new (void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MESSAGE_TAG_FOLLOWUP_H__ */ diff --git a/mail/message-tags.glade b/mail/message-tags.glade new file mode 100644 index 0000000000..469d74ce31 --- /dev/null +++ b/mail/message-tags.glade @@ -0,0 +1,307 @@ + + + + + message-tags + message-tags + + src + pixmaps + C + True + True + + + + GnomeDialog + followup_editor + False + Flag to Follow Up + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + False + False + False + False + False + + + GtkVBox + GnomeDialog:vbox + vbox2 + 3 + False + 3 + + 4 + True + True + + + + GtkHButtonBox + GnomeDialog:action_area + hbuttonbox1 + GTK_BUTTONBOX_END + 8 + 85 + 27 + 7 + 0 + + 0 + False + True + GTK_PACK_END + + + + GtkButton + button4 + True + True + GNOME_STOCK_BUTTON_OK + + + + GtkButton + button5 + True + True + GNOME_STOCK_BUTTON_CANCEL + + + + + GtkVBox + toplevel + False + 4 + + 0 + True + True + + + + GtkHBox + hbox1 + 3 + False + 3 + + 0 + False + False + + + + GtkLabel + label6 + + GTK_JUSTIFY_LEFT + False + 7.45058e-09 + 0 + 0 + 0 + + 0 + False + False + + + + + GtkLabel + lblSubject + + GTK_JUSTIFY_LEFT + True + 7.45058e-09 + 0.5 + 0 + 0 + + 0 + True + True + + + + + + GtkTable + table2 + 3 + 2 + 3 + False + 3 + 3 + + 0 + True + True + + + + GtkLabel + label3 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + followup_type + + 0 + 1 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkLabel + label4 + + GTK_JUSTIFY_CENTER + False + 0 + 0.5 + 0 + 0 + + 0 + 1 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkButton + clear + True + + GTK_RELIEF_NORMAL + + 2 + 3 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + GtkCheckButton + completed + True + + False + True + + 2 + 3 + 1 + 2 + 0 + 0 + False + False + False + False + True + False + + + + + GtkOptionMenu + followup_type + True + None +Call +Do Not Forward +Follow-Up +For Your Information +Forward +No Response Necessary +Read +Reply +Reply to All +Review + + 0 + + 1 + 2 + 0 + 1 + 0 + 0 + False + False + False + False + True + False + + + + + Custom + target_date + target_date_new + 0 + 0 + Sat, 09 Feb 2002 00:20:24 GMT + + 1 + 2 + 1 + 2 + 0 + 0 + False + False + False + False + True + True + + + + + + + + -- cgit v1.2.3