diff options
Diffstat (limited to 'mail/mail-search-dialogue.c')
-rw-r--r-- | mail/mail-search-dialogue.c | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/mail/mail-search-dialogue.c b/mail/mail-search-dialogue.c new file mode 100644 index 0000000000..b336ac753e --- /dev/null +++ b/mail/mail-search-dialogue.c @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2000 Helix Code Inc. + * + * Authors: Not Zed <notzed@lostzed.mmc.com.au> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library 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 Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <gtk/gtk.h> +#include <gnome.h> + +#include "mail-search-dialogue.h" + +static void mail_search_dialogue_class_init (MailSearchDialogueClass *class); +static void mail_search_dialogue_init (MailSearchDialogue *gspaper); +static void mail_search_dialogue_finalise (GtkObject *obj); + +static GnomeDialogClass *parent_class; + +guint +mail_search_dialogue_get_type (void) +{ + static guint type = 0; + + if (!type) { + GtkTypeInfo type_info = { + "MailSearchDialogue", + sizeof(MailSearchDialogue), + sizeof(MailSearchDialogueClass), + (GtkClassInitFunc)mail_search_dialogue_class_init, + (GtkObjectInitFunc)mail_search_dialogue_init, + (GtkArgSetFunc)NULL, + (GtkArgGetFunc)NULL + }; + + type = gtk_type_unique(gnome_dialog_get_type (), &type_info); + } + + return type; +} + +static void +mail_search_dialogue_class_init (MailSearchDialogueClass *class) +{ + GtkObjectClass *object_class; + + object_class = (GtkObjectClass *)class; + parent_class = gtk_type_class(gnome_dialog_get_type ()); + + object_class->finalize = mail_search_dialogue_finalise; + /* override methods */ + +} + +static void +mail_search_dialogue_construct (MailSearchDialogue *o, FilterRule *rule) +{ + FilterPart *part; + GnomeDialog *dialogue = GNOME_DIALOG(o); + + o->context = rule_context_new(); + rule_context_add_part_set(o->context, "partset", filter_part_get_type(), + rule_context_add_part, rule_context_next_part); + rule_context_load(o->context, EVOLUTION_DATADIR "/evolution/vfoldertypes.xml", ""); + if (rule) { + o->rule = rule; + o->guts = filter_rule_get_widget(o->rule, o->context); + } else { + o->rule = filter_rule_new(); + part = rule_context_next_part(o->context, NULL); + if (part == NULL) { + g_warning("Problem loading search: no parts to load"); + o->guts = gtk_entry_new(); + } else { + filter_rule_add_part(o->rule, filter_part_clone(part)); + o->guts = filter_rule_get_widget(o->rule, o->context); + } + } + + gtk_widget_show(o->guts); + gtk_box_pack_start(GTK_BOX(dialogue->vbox), o->guts, FALSE, FALSE, 0); +} + +static void +mail_search_dialogue_init (MailSearchDialogue *o) +{ + GnomeDialog *dialogue = GNOME_DIALOG(o); + + gnome_dialog_append_buttons(dialogue, _("Ok"), _("Search"), _("Cancel"), 0); +} + + +static void +mail_search_dialogue_finalise(GtkObject *obj) +{ + MailSearchDialogue *o = (MailSearchDialogue *)obj; + + if (o->context) + gtk_object_unref((GtkObject *)o->context); + if (o->rule) + gtk_object_unref((GtkObject *)o->rule); + + ((GtkObjectClass *)(parent_class))->finalize(obj); +} + +/** + * mail_search_dialogue_new: + * + * Create a new MailSearchDialogue object. + * + * Return value: A new #MailSearchDialogue object. + **/ +MailSearchDialogue * +mail_search_dialogue_new(void) +{ + MailSearchDialogue *o = (MailSearchDialogue *)gtk_type_new(mail_search_dialogue_get_type ()); + mail_search_dialogue_construct(o, NULL); + return o; +} + +MailSearchDialogue *mail_search_dialogue_new_with_rule(FilterRule *rule) +{ + MailSearchDialogue *o = (MailSearchDialogue *)gtk_type_new(mail_search_dialogue_get_type ()); + if (rule) + gtk_object_ref((GtkObject *)rule); + mail_search_dialogue_construct(o, rule); + return o; +} + +/** + * mail_search_dialogue_get_query: + * @msd: + * + * Get the query string represting the current search criterea. + * + * Return value: + **/ +char * +mail_search_dialogue_get_query(MailSearchDialogue *msd) +{ + GString *out = g_string_new(""); + char *ret; + + filter_rule_build_code(msd->rule, out); + ret = out->str; + g_string_free(out, FALSE); + return ret; +} |