1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
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.
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"
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
;
58 em_filter_folder_element_get_type(void)
60 static GType type
= 0;
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
),
72 (GInstanceInitFunc
)em_filter_folder_element_init
,
75 type
= g_type_register_static(FILTER_TYPE_ELEMENT
, "EMFilterFolderElement", &info
, 0);
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
;
104 em_filter_folder_element_init(EMFilterFolderElement
*ff
)
110 em_filter_folder_element_finalise(GObject
*obj
)
112 EMFilterFolderElement
*ff
= (EMFilterFolderElement
*)obj
;
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
);
133 em_filter_folder_element_set_value(EMFilterFolderElement
*ff
, const char *uri
)
136 ff
->uri
= g_strdup(uri
);
140 validate(FilterElement
*fe
)
142 EMFilterFolderElement
*ff
= (EMFilterFolderElement
*)fe
;
144 if (ff
->uri
&& *ff
->uri
) {
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
151 e_error_run(NULL
, "mail:no-folder", NULL
);
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;
165 xml_create(FilterElement
*fe
, xmlNodePtr node
)
167 /* parent implementation */
168 FILTER_ELEMENT_CLASS(parent_class
)->xml_create(fe
, node
);
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
);
190 xml_decode(FilterElement
*fe
, xmlNodePtr node
)
192 EMFilterFolderElement
*ff
= (EMFilterFolderElement
*)fe
;
195 d(printf("Decoding folder from xml %p\n", fe
));
198 fe
->name
= xmlGetProp(node
, "name");
202 if (!strcmp(n
->name
, "folder")) {
205 uri
= xmlGetProp(n
, "uri");
207 ff
->uri
= g_strdup(uri
);
218 folder_selected(EMFolderSelectionButton
*button
, EMFilterFolderElement
*ff
)
222 uri
= em_folder_selection_button_get_selection(button
);
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
);
230 get_widget(FilterElement
*fe
)
232 EMFilterFolderElement
*ff
= (EMFilterFolderElement
*)fe
;
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
);
241 gtk_widget_show(button
);
242 g_signal_connect(button
, "selected", G_CALLBACK(folder_selected
), ff
);
248 build_code(FilterElement
*fe
, GString
*out
, struct _FilterPart
*ff
)
254 format_sexp(FilterElement
*fe
, GString
*out
)
256 EMFilterFolderElement
*ff
= (EMFilterFolderElement
*)fe
;
258 e_sexp_encode_string(out
, ff
->uri
);
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
);
267 parent_class
->copy_value(de
, se
);