/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Authors: Jeffrey Stedfast * * Copyright 2002 Ximian, 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 #include #include #include #include #include #include #include #include #include #include #include "filter-label.h" #include "e-util/e-sexp.h" #define d(x) static gboolean validate (FilterElement *fe); static void xml_create (FilterElement *fe, xmlNodePtr node); static GtkWidget *get_widget (FilterElement *fe); static void filter_label_class_init (FilterLabelClass *klass); static void filter_label_init (FilterLabel *label); static void filter_label_finalise (GtkObject *obj); static FilterElementClass *parent_class; enum { LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = { 0 }; GtkType filter_label_get_type (void) { static GtkType type = 0; if (!type) { GtkTypeInfo type_info = { "FilterLabel", sizeof (FilterLabel), sizeof (FilterLabelClass), (GtkClassInitFunc) filter_label_class_init, (GtkObjectInitFunc) filter_label_init, (GtkArgSetFunc) NULL, (GtkArgGetFunc) NULL }; type = gtk_type_unique (filter_int_get_type (), &type_info); } return type; } static void filter_label_class_init (FilterLabelClass *klass) { GtkObjectClass *object_class = (GtkObjectClass *) klass; FilterElementClass *filter_element = (FilterElementClass *) klass; parent_class = gtk_type_class (filter_int_get_type ()); object_class->finalize = filter_label_finalise; /* override methods */ filter_element->validate = validate; filter_element->xml_create = xml_create; filter_element->get_widget = get_widget; /* signals */ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } static void filter_label_init (FilterLabel *o) { } static void filter_label_finalise (GtkObject *obj) { ((GtkObjectClass *)(parent_class))->finalize (obj); } /** * filter_label_new: * * Create a new FilterLabel object. * * Return value: A new #FilterLabel object. **/ FilterLabel * filter_label_new (void) { return (FilterLabel *) gtk_type_new (filter_label_get_type ()); } static gboolean validate (FilterElement *fe) { FilterInt *label = (FilterInt *)fe; GtkWidget *dialog; if (label->val < 0 || label->val > 4) { dialog = gnome_ok_dialog (_("You must specify a label name")); gnome_dialog_run_and_close (GNOME_DIALOG (dialog)); return FALSE; } return TRUE; } static void xml_create (FilterElement *fe, xmlNodePtr node) { /* parent implementation */ ((FilterElementClass *)(parent_class))->xml_create (fe, node); } static void label_selected (GtkWidget *item, gpointer user_data) { FilterInt *label = user_data; label->val = GPOINTER_TO_INT (gtk_object_get_data (GTK_OBJECT (item), "label")); } static GtkWidget * get_widget (FilterElement *fe) { FilterInt *label = (FilterInt *) fe; GtkWidget *omenu, *menu, *item; Bonobo_ConfigDatabase db; CORBA_Environment ev; char *path, *num; int i; omenu = gtk_option_menu_new (); menu = gtk_menu_new (); gtk_widget_show (menu); /* sigh. This is a fucking nightmare... */ CORBA_exception_init (&ev); db = bonobo_get_object ("wombat:", "Bonobo/ConfigDatabase", &ev); if (BONOBO_EX (&ev) || db == CORBA_OBJECT_NIL) { CORBA_exception_free (&ev); /* I guess we'll have to return an empty menu? */ gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); return omenu; } CORBA_exception_free (&ev); path = g_strdup ("/Mail/Labels/label_#"); num = path + strlen (path) - 1; for (i = 0; i < 5; i++) { char *utf8_label, *native_label; sprintf (num, "%d", i); utf8_label = bonobo_config_get_string (db, path, NULL); native_label = e_utf8_to_gtk_string (GTK_WIDGET (menu), utf8_label); g_free (utf8_label); item = gtk_menu_item_new_with_label (native_label); g_free (native_label); gtk_object_set_data (GTK_OBJECT (item), "label", GINT_TO_POINTER (i)); gtk_signal_connect (GTK_OBJECT (item), "activate", label_selected, label); gtk_widget_show (item); gtk_menu_append (GTK_MENU (menu), item); } g_free (path); gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), label->val); return omenu; }