Updated Traditional Chinese translation(Hong Kong). Updated Traditional
[evolution.git] / mail / em-filter-folder-element.c
blobe2f0b81b9f474b6df5c8a2d41cb38565c9b71a69
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * Copyright(C)2000-2002 Ximian Inc.
5 * Authors: Not Zed <notzed@lostzed.mmc.com.au>
6 * Jeffrey Stedfast <fejj@ximian.com>
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public
18 * License along with this program; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
27 #include <string.h>
29 #include <gtk/gtk.h>
30 #include <libgnome/gnome-i18n.h>
32 #include "em-filter-folder-element.h"
33 #include "mail/em-folder-selection-button.h"
34 #include "mail/mail-component.h"
35 #include "mail/em-utils.h"
36 #include "libedataserver/e-sexp.h"
37 #include "e-util/e-error.h"
39 #define d(x)
41 static gboolean validate(FilterElement *fe);
42 static int folder_eq(FilterElement *fe, FilterElement *cm);
43 static void xml_create(FilterElement *fe, xmlNodePtr node);
44 static xmlNodePtr xml_encode(FilterElement *fe);
45 static int xml_decode(FilterElement *fe, xmlNodePtr node);
46 static GtkWidget *get_widget(FilterElement *fe);
47 static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff);
48 static void format_sexp(FilterElement *, GString *);
49 static void emff_copy_value(FilterElement *de, FilterElement *se);
51 static void em_filter_folder_element_class_init(EMFilterFolderElementClass *class);
52 static void em_filter_folder_element_init(EMFilterFolderElement *ff);
53 static void em_filter_folder_element_finalise(GObject *obj);
55 static FilterElementClass *parent_class = NULL;
57 GType
58 em_filter_folder_element_get_type(void)
60 static GType type = 0;
62 if (!type) {
63 static const GTypeInfo info = {
64 sizeof(EMFilterFolderElementClass),
65 NULL, /* base_class_init */
66 NULL, /* base_class_finalize */
67 (GClassInitFunc)em_filter_folder_element_class_init,
68 NULL, /* class_finalize */
69 NULL, /* class_data */
70 sizeof(EMFilterFolderElement),
71 0, /* n_preallocs */
72 (GInstanceInitFunc)em_filter_folder_element_init,
75 type = g_type_register_static(FILTER_TYPE_ELEMENT, "EMFilterFolderElement", &info, 0);
78 return type;
81 static void
82 em_filter_folder_element_class_init(EMFilterFolderElementClass *klass)
84 GObjectClass *object_class = G_OBJECT_CLASS(klass);
85 FilterElementClass *fe_class = FILTER_ELEMENT_CLASS(klass);
87 parent_class = g_type_class_ref(FILTER_TYPE_ELEMENT);
89 object_class->finalize = em_filter_folder_element_finalise;
91 /* override methods */
92 fe_class->validate = validate;
93 fe_class->eq = folder_eq;
94 fe_class->xml_create = xml_create;
95 fe_class->xml_encode = xml_encode;
96 fe_class->xml_decode = xml_decode;
97 fe_class->get_widget = get_widget;
98 fe_class->build_code = build_code;
99 fe_class->format_sexp = format_sexp;
100 fe_class->copy_value = emff_copy_value;
103 static void
104 em_filter_folder_element_init(EMFilterFolderElement *ff)
109 static void
110 em_filter_folder_element_finalise(GObject *obj)
112 EMFilterFolderElement *ff = (EMFilterFolderElement *)obj;
114 g_free(ff->uri);
116 G_OBJECT_CLASS(parent_class)->finalize(obj);
120 * em_filter_folder_element_new:
122 * Create a new EMFilterFolderElement object.
124 * Return value: A new #EMFilterFolderElement object.
126 EMFilterFolderElement *
127 em_filter_folder_element_new(void)
129 return(EMFilterFolderElement *)g_object_new(em_filter_folder_element_get_type(), NULL, NULL);
132 void
133 em_filter_folder_element_set_value(EMFilterFolderElement *ff, const char *uri)
135 g_free(ff->uri);
136 ff->uri = g_strdup(uri);
139 static gboolean
140 validate(FilterElement *fe)
142 EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
144 if (ff->uri && *ff->uri) {
145 return TRUE;
146 } else {
147 /* FIXME: FilterElement should probably have a
148 GtkWidget member pointing to the value gotten with
149 ::get_widget()so that we can get the parent window
150 here. */
151 e_error_run(NULL, "mail:no-folder", NULL);
153 return FALSE;
157 static int
158 folder_eq(FilterElement *fe, FilterElement *cm)
160 return FILTER_ELEMENT_CLASS(parent_class)->eq(fe, cm)
161 && strcmp(((EMFilterFolderElement *)fe)->uri, ((EMFilterFolderElement *)cm)->uri)== 0;
164 static void
165 xml_create(FilterElement *fe, xmlNodePtr node)
167 /* parent implementation */
168 FILTER_ELEMENT_CLASS(parent_class)->xml_create(fe, node);
171 static xmlNodePtr
172 xml_encode(FilterElement *fe)
174 xmlNodePtr value, work;
175 EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
177 d(printf("Encoding folder as xml\n"));
179 value = xmlNewNode(NULL, "value");
180 xmlSetProp(value, "name", fe->name);
181 xmlSetProp(value, "type", "folder");
183 work = xmlNewChild(value, NULL, "folder", NULL);
184 xmlSetProp(work, "uri", ff->uri);
186 return value;
189 static int
190 xml_decode(FilterElement *fe, xmlNodePtr node)
192 EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
193 xmlNodePtr n;
195 d(printf("Decoding folder from xml %p\n", fe));
197 xmlFree(fe->name);
198 fe->name = xmlGetProp(node, "name");
200 n = node->children;
201 while(n) {
202 if (!strcmp(n->name, "folder")) {
203 char *uri;
205 uri = xmlGetProp(n, "uri");
206 g_free(ff->uri);
207 ff->uri = g_strdup(uri);
208 xmlFree(uri);
209 break;
211 n = n->next;
214 return 0;
217 static void
218 folder_selected(EMFolderSelectionButton *button, EMFilterFolderElement *ff)
220 const char *uri;
222 uri = em_folder_selection_button_get_selection(button);
223 g_free(ff->uri);
224 ff->uri = uri!=NULL?em_uri_from_camel(uri):NULL;
226 gdk_window_raise(GTK_WIDGET(gtk_widget_get_ancestor(GTK_WIDGET(button), GTK_TYPE_WINDOW))->window);
229 static GtkWidget *
230 get_widget(FilterElement *fe)
232 EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
233 GtkWidget *button;
234 char *uri;
236 uri = em_uri_to_camel(ff->uri);
237 button = em_folder_selection_button_new(_("Select Folder"), NULL);
238 em_folder_selection_button_set_selection(EM_FOLDER_SELECTION_BUTTON(button), uri);
239 g_free(uri);
241 gtk_widget_show(button);
242 g_signal_connect(button, "selected", G_CALLBACK(folder_selected), ff);
244 return button;
247 static void
248 build_code(FilterElement *fe, GString *out, struct _FilterPart *ff)
250 return;
253 static void
254 format_sexp(FilterElement *fe, GString *out)
256 EMFilterFolderElement *ff = (EMFilterFolderElement *)fe;
258 e_sexp_encode_string(out, ff->uri);
261 static void
262 emff_copy_value(FilterElement *de, FilterElement *se)
264 if (EM_IS_FILTER_FOLDER_ELEMENT(se))
265 em_filter_folder_element_set_value((EMFilterFolderElement *)de, ((EMFilterFolderElement *)se)->uri);
266 else
267 parent_class->copy_value(de, se);