2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU Lesser General Public
4 * License as published by the Free Software Foundation; either
5 * version 2 of the License, or (at your option) version 3.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
10 * Lesser General Public License for more details.
12 * You should have received a copy of the GNU Lesser General Public
13 * License along with the program; if not, see <http://www.gnu.org/licenses/>
17 * Michael Zucchi <notzed@ximian.com>
19 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
29 #include <glib/gi18n.h>
31 #include "e-util/e-util-private.h"
33 #include "libemail-engine/e-mail-folder-utils.h"
34 #include "libemail-engine/e-mail-session.h"
35 #include "libemail-engine/e-mail-utils.h"
36 #include "libemail-engine/mail-folder-cache.h"
37 #include "libemail-engine/mail-mt.h"
38 #include "libemail-engine/mail-ops.h"
39 #include "libemail-engine/mail-tools.h"
41 #include "e-mail-backend.h"
42 #include "em-folder-tree-model.h"
44 #include "em-vfolder-editor-context.h"
45 #include "em-vfolder-editor.h"
46 #include "em-vfolder-editor-rule.h"
47 #include "mail-autofilter.h"
48 #include "mail-vfolder-ui.h"
49 #include "e-mail-ui-session.h"
51 #define d(x) /* (printf("%s:%s: ", G_STRLOC, G_STRFUNC), (x))*/
53 /* NOTE: Once mail is moved to EDS, this context needs to be created ofr Mail UI. */
54 extern EMVFolderContext
*context
; /* context remains open all time */
57 vfolder_edit (EMailBackend
*backend
,
58 GtkWindow
*parent_window
)
60 EShellBackend
*shell_backend
;
62 const gchar
*config_dir
;
64 EMailSession
*session
;
66 g_return_if_fail (E_IS_MAIL_BACKEND (backend
));
67 g_return_if_fail (GTK_IS_WINDOW (parent_window
));
69 shell_backend
= E_SHELL_BACKEND (backend
);
70 config_dir
= e_shell_backend_get_config_dir (shell_backend
);
71 filename
= g_build_filename (config_dir
, "vfolders.xml", NULL
);
72 session
= e_mail_backend_get_session (backend
);
74 vfolder_load_storage (session
);
76 dialog
= em_vfolder_editor_new (context
);
77 gtk_window_set_title (
78 GTK_WINDOW (dialog
), _("Search Folders"));
79 gtk_window_set_transient_for (
80 GTK_WINDOW (dialog
), parent_window
);
82 switch (gtk_dialog_run (GTK_DIALOG (dialog
))) {
84 e_rule_context_save ((ERuleContext
*) context
, filename
);
87 e_rule_context_revert ((ERuleContext
*) context
, filename
);
91 gtk_widget_destroy (dialog
);
95 vfolder_edit_response_cb (GtkWidget
*dialog
,
99 if (response_id
== GTK_RESPONSE_OK
) {
102 EFilterRule
*newrule
;
103 const gchar
*config_dir
;
106 object
= G_OBJECT (dialog
);
107 rule
= g_object_get_data (object
, "vfolder-rule");
108 newrule
= g_object_get_data (object
, "vfolder-newrule");
110 e_filter_rule_copy (rule
, newrule
);
111 config_dir
= mail_session_get_config_dir ();
112 user
= g_build_filename (config_dir
, "vfolders.xml", NULL
);
113 e_rule_context_save ((ERuleContext
*) context
, user
);
117 gtk_widget_destroy (dialog
);
121 vfolder_edit_rule (EMailSession
*session
,
122 const gchar
*folder_uri
,
123 EAlertSink
*alert_sink
)
127 GtkWidget
*container
;
128 EFilterRule
*rule
= NULL
;
129 EFilterRule
*newrule
;
130 gchar
*folder_name
= NULL
;
132 g_return_if_fail (E_IS_MAIL_SESSION (session
));
133 g_return_if_fail (folder_uri
!= NULL
);
134 g_return_if_fail (E_IS_ALERT_SINK (alert_sink
));
136 e_mail_folder_uri_parse (
137 CAMEL_SESSION (session
), folder_uri
,
138 NULL
, &folder_name
, NULL
);
140 if (folder_name
!= NULL
) {
141 rule
= e_rule_context_find_rule (
142 (ERuleContext
*) context
, folder_name
, NULL
);
143 g_free (folder_name
);
147 /* TODO: we should probably just create it ... */
149 alert_sink
, "mail:vfolder-notexist",
155 newrule
= e_filter_rule_clone (rule
);
157 dialog
= gtk_dialog_new_with_buttons (
158 _("Edit Search Folder"), NULL
,
159 GTK_DIALOG_DESTROY_WITH_PARENT
,
160 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
161 GTK_STOCK_OK
, GTK_RESPONSE_OK
, NULL
);
163 gtk_container_set_border_width (GTK_CONTAINER (dialog
), 6);
164 gtk_dialog_set_default_response (GTK_DIALOG (dialog
), GTK_RESPONSE_OK
);
166 gtk_window_set_default_size (GTK_WINDOW (dialog
), 500, 500);
167 gtk_window_set_resizable (GTK_WINDOW (dialog
), TRUE
);
169 container
= gtk_dialog_get_content_area (GTK_DIALOG (dialog
));
170 gtk_box_set_spacing (GTK_BOX (container
), 6);
172 widget
= e_filter_rule_get_widget (
173 (EFilterRule
*) newrule
, (ERuleContext
*) context
);
174 gtk_box_pack_start (GTK_BOX (container
), widget
, TRUE
, TRUE
, 0);
175 gtk_widget_show (widget
);
177 g_object_set_data_full (
178 G_OBJECT (dialog
), "vfolder-rule",
179 rule
, (GDestroyNotify
) g_object_unref
);
180 g_object_set_data_full (
181 G_OBJECT (dialog
), "vfolder-newrule",
182 newrule
, (GDestroyNotify
) g_object_unref
);
186 G_CALLBACK (vfolder_edit_response_cb
), NULL
);
188 gtk_widget_show (dialog
);
192 new_rule_clicked (GtkWidget
*w
,
196 if (button
== GTK_RESPONSE_OK
) {
197 const gchar
*config_dir
;
199 EFilterRule
*rule
= g_object_get_data ((GObject
*) w
, "rule");
200 EAlert
*alert
= NULL
;
202 if (!e_filter_rule_validate (rule
, &alert
)) {
203 e_alert_run_dialog (GTK_WINDOW (w
), alert
);
204 g_object_unref (alert
);
208 if (e_rule_context_find_rule (
209 (ERuleContext
*) context
, rule
->name
, rule
->source
)) {
210 e_alert_run_dialog_for_args (
211 GTK_WINDOW (w
), "mail:vfolder-notunique",
217 e_rule_context_add_rule ((ERuleContext
*) context
, rule
);
218 config_dir
= mail_session_get_config_dir ();
219 user
= g_build_filename (config_dir
, "vfolders.xml", NULL
);
220 e_rule_context_save ((ERuleContext
*) context
, user
);
224 gtk_widget_destroy (w
);
228 new_rule_changed_cb (EFilterRule
*rule
,
231 g_return_if_fail (rule
!= NULL
);
232 g_return_if_fail (dialog
!= NULL
);
234 gtk_dialog_set_response_sensitive (
235 dialog
, GTK_RESPONSE_OK
, rule
->parts
!= NULL
);
238 /* clones a filter/search rule into a matching vfolder rule
239 * (assuming the same system definitions) */
241 vfolder_clone_rule (EMailSession
*session
,
247 g_return_val_if_fail (E_IS_MAIL_SESSION (session
), NULL
);
249 rule
= em_vfolder_editor_rule_new (session
);
251 xml
= e_filter_rule_xml_encode (in
);
252 e_filter_rule_xml_decode (rule
, xml
, (ERuleContext
*) context
);
253 xmlFreeNodeList (xml
);
259 release_rule_notify_cb (gpointer rule
)
261 /* disconnect the "changed" signal */
262 g_signal_handlers_disconnect_by_data (
263 rule
, g_object_get_data (rule
, "editor-dlg"));
264 g_object_set_data (rule
, "editor-dlg", NULL
);
265 g_object_unref (rule
);
268 /* adds a rule with a gui */
270 vfolder_gui_add_rule (EMVFolderRule
*rule
)
274 GtkWidget
*container
;
276 w
= e_filter_rule_get_widget ((EFilterRule
*) rule
, (ERuleContext
*) context
);
278 gd
= (GtkDialog
*) gtk_dialog_new_with_buttons (
279 _("New Search Folder"),
281 GTK_DIALOG_DESTROY_WITH_PARENT
,
282 GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
283 GTK_STOCK_OK
, GTK_RESPONSE_OK
, NULL
);
285 gtk_dialog_set_default_response (gd
, GTK_RESPONSE_OK
);
286 gtk_container_set_border_width (GTK_CONTAINER (gd
), 6);
288 container
= gtk_dialog_get_content_area (gd
);
289 gtk_box_set_spacing (GTK_BOX (container
), 6);
291 g_object_set (gd
, "resizable", TRUE
, NULL
);
292 gtk_window_set_default_size (GTK_WINDOW (gd
), 500, 500);
293 gtk_box_pack_start (GTK_BOX (container
), w
, TRUE
, TRUE
, 0);
294 gtk_widget_show ((GtkWidget
*) gd
);
295 g_object_set_data (G_OBJECT (rule
), "editor-dlg", gd
);
296 g_object_set_data_full (
297 G_OBJECT (gd
), "rule", rule
,
298 release_rule_notify_cb
);
301 G_CALLBACK (new_rule_changed_cb
), gd
);
302 new_rule_changed_cb ((EFilterRule
*) rule
, gd
);
305 G_CALLBACK (new_rule_clicked
), NULL
);
306 gtk_widget_show ((GtkWidget
*) gd
);
310 vfolder_gui_add_from_message (EMailSession
*session
,
311 CamelMimeMessage
*message
,
317 g_return_if_fail (CAMEL_IS_MIME_MESSAGE (message
));
319 rule
= (EMVFolderRule
*) em_vfolder_rule_from_message (
320 context
, message
, flags
, folder
);
321 vfolder_gui_add_rule (rule
);
325 vfolder_gui_add_from_address (EMailSession
*session
,
326 CamelInternetAddress
*addr
,
332 g_return_if_fail (addr
!= NULL
);
334 rule
= (EMVFolderRule
*) em_vfolder_rule_from_address (
335 context
, addr
, flags
, folder
);
336 vfolder_gui_add_rule (rule
);