aboutsummaryrefslogtreecommitdiffstats
path: root/filter/filter-system-flag.c
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@helixcode.com>2000-12-02 12:01:53 +0800
committerJeffrey Stedfast <fejj@src.gnome.org>2000-12-02 12:01:53 +0800
commite7c8c694a76a27b29056465d25347276db24519f (patch)
tree9d92e199b464ed0dcd9c014eacd0a98573194a7d /filter/filter-system-flag.c
parent787d1833c052cc1acf54a1d7fae5c350bdec4f94 (diff)
downloadgsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar.gz
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar.bz2
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar.lz
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar.xz
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.tar.zst
gsoc2013-evolution-e7c8c694a76a27b29056465d25347276db24519f.zip
Added support for the system-flag type.
2000-12-01 Jeffrey Stedfast <fejj@helixcode.com> * filter-element.c (filter_element_new_type_name): Added support for the system-flag type. * Makefile.am: Added filter-system-flag.[c,h]. * filter-system-flag.[c,h]: New type for system flags. * filtertypes.xml: Oops, looks like we were still using integers as arguments to set-flag. Change over to using strings which are safer and also change the name to set-system-flag. * filter-driver.c (do_flag): Use strings instead of integers. Instead of set-flag, the callback is now set-system-flag for less confusion. Sorry Ettore, but you'll have to change your filters. * filtertypes.xml: Added system-flags stuff. * vfoldertypes.xml: And here too. * filter-message-search.c (system_flag): New ESExp callback for filtering on system flags. svn path=/trunk/; revision=6764
Diffstat (limited to 'filter/filter-system-flag.c')
-rw-r--r--filter/filter-system-flag.c255
1 files changed, 255 insertions, 0 deletions
diff --git a/filter/filter-system-flag.c b/filter/filter-system-flag.c
new file mode 100644
index 0000000000..abf3739f37
--- /dev/null
+++ b/filter/filter-system-flag.c
@@ -0,0 +1,255 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@helixcode.com>
+ *
+ * Copyright 2000 Helix Code, Inc. (www.helixcode.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.
+ *
+ */
+
+
+#include <gtk/gtk.h>
+#include <gnome.h>
+#include <gnome-xml/xmlmemory.h>
+
+#include <gal/widgets/e-unicode.h>
+
+#include "filter-system-flag.h"
+#include "e-util/e-sexp.h"
+
+#define d(x)
+
+static void xml_create (FilterElement *fe, xmlNodePtr node);
+static xmlNodePtr xml_encode (FilterElement *fe);
+static int xml_decode (FilterElement *fe, xmlNodePtr node);
+static GtkWidget *get_widget (FilterElement *fe);
+static void build_code (FilterElement *fe, GString *out, struct _FilterPart *ff);
+static void format_sexp (FilterElement *, GString *);
+
+static void filter_system_flag_class_init (FilterSystemFlagClass *class);
+static void filter_system_flag_init (FilterSystemFlag *gspaper);
+static void filter_system_flag_finalise (GtkObject *obj);
+
+#define _PRIVATE(x) (((FilterSystemFlag *)(x))->priv)
+
+struct _FilterSystemFlagPrivate {
+};
+
+static FilterElementClass *parent_class;
+
+enum {
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+struct _system_flag {
+ char *title;
+ char *value;
+} system_flags[] = {
+ { _("Replied to"), "Answered" },
+ { _("Deleted"), "Deleted" },
+ { _("Draft"), "Draft" },
+ { _("Important"), "Flagged" },
+ { _("Read"), "Seen" },
+ { NULL, NULL }
+};
+
+static struct _system_flag *
+find_option (const char *name)
+{
+ struct _system_flag *flag;
+
+ for (flag = system_flags; flag->title; flag++) {
+ if (!g_strcasecmp (name, flag->value))
+ return flag;
+ }
+
+ return NULL;
+}
+
+GtkType
+filter_system_flag_get_type (void)
+{
+ static guint type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "FilterSystemFlag",
+ sizeof (FilterSystemFlag),
+ sizeof (FilterSystemFlagClass),
+ (GtkClassInitFunc) filter_system_flag_class_init,
+ (GtkObjectInitFunc) filter_system_flag_init,
+ (GtkArgSetFunc) NULL,
+ (GtkArgGetFunc) NULL
+ };
+
+ type = gtk_type_unique (filter_element_get_type (), &type_info);
+ }
+
+ return type;
+}
+
+static void
+filter_system_flag_class_init (FilterSystemFlagClass *class)
+{
+ GtkObjectClass *object_class;
+ FilterElementClass *filter_element = (FilterElementClass *)class;
+
+ object_class = (GtkObjectClass *)class;
+ parent_class = gtk_type_class(filter_element_get_type ());
+
+ object_class->finalize = filter_system_flag_finalise;
+
+ /* override methods */
+ filter_element->xml_create = xml_create;
+ filter_element->xml_encode = xml_encode;
+ filter_element->xml_decode = xml_decode;
+ filter_element->get_widget = get_widget;
+ filter_element->build_code = build_code;
+ filter_element->format_sexp = format_sexp;
+
+ /* signals */
+
+ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
+}
+
+static void
+filter_system_flag_init (FilterSystemFlag *o)
+{
+ o->priv = g_malloc0 (sizeof (*o->priv));
+}
+
+static void
+filter_system_flag_finalise (GtkObject *obj)
+{
+ FilterSystemFlag *o = (FilterSystemFlag *)obj;
+
+ o = o;
+
+ ((GtkObjectClass *)(parent_class))->finalize (obj);
+}
+
+/**
+ * filter_system_flag_new:
+ *
+ * Create a new FilterSystemFlag object.
+ *
+ * Return value: A new #FilterSystemFlag object.
+ **/
+FilterSystemFlag *
+filter_system_flag_new (void)
+{
+ FilterSystemFlag *o = (FilterSystemFlag *)gtk_type_new (filter_system_flag_get_type ());
+ return o;
+}
+
+static void
+xml_create (FilterElement *fe, xmlNodePtr node)
+{
+ /* parent implementation */
+ ((FilterElementClass *)(parent_class))->xml_create (fe, node);
+}
+
+static xmlNodePtr
+xml_encode (FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ xmlNodePtr value;
+
+ d(printf ("Encoding %s as xml\n", type));
+ value = xmlNewNode (NULL, "value");
+ xmlSetProp (value, "name", fe->name);
+ xmlSetProp (value, "type", "system-flag");
+ xmlSetProp (value, "value", fsf->value);
+
+ return value;
+}
+
+static int
+xml_decode (FilterElement *fe, xmlNodePtr node)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ struct _system_flag *flag;
+ char *value;
+
+ fe->name = xmlGetProp (node, "name");
+
+ value = xmlGetProp (node, "value");
+ if (value) {
+ flag = find_option (value);
+ fsf->value = flag ? flag->value : NULL;
+ xmlFree (value);
+ } else {
+ fsf->value = NULL;
+ }
+
+ return 0;
+}
+
+static void
+item_selected (GtkWidget *widget, FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ struct _system_flag *flag;
+
+ flag = gtk_object_get_data (GTK_OBJECT (widget), "flag");
+
+ fsf->value = flag->value;
+}
+
+static GtkWidget *
+get_widget (FilterElement *fe)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *) fe;
+ GtkWidget *omenu, *menu, *item;
+ struct _system_flag *flag;
+ int index = 0, current = 0;
+
+ fsf->value = system_flags[0].value;
+
+ menu = gtk_menu_new ();
+ for (flag = system_flags; flag->title; flag++) {
+ item = gtk_menu_item_new_with_label (flag->title);
+ gtk_object_set_data (GTK_OBJECT (item), "flag", flag);
+ gtk_signal_connect (GTK_OBJECT (item), "select", item_selected, fe);
+ gtk_menu_append (GTK_MENU (menu), item);
+ gtk_widget_show (item);
+ if (!g_strcasecmp (fsf->value, flag->value))
+ current = index;
+ index++;
+ }
+
+ omenu = gtk_option_menu_new ();
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
+
+ return omenu;
+}
+
+static void
+build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
+{
+ return;
+}
+
+static void
+format_sexp (FilterElement *fe, GString *out)
+{
+ FilterSystemFlag *fsf = (FilterSystemFlag *)fe;
+
+ e_sexp_encode_string (out, fsf->value);
+}