2 * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 2004-2015 the Claws Mail team
4 * Copyright (C) 2014-2015 Charles Lehner
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "claws-features.h"
28 #include <glib/gi18n.h>
31 #include "gtk/gtkutils.h"
32 #include "gtk/combobox.h"
33 #include "gtk/manage_window.h"
34 #include "alertpanel.h"
39 #include "prefs_common.h"
41 #include "mainwindow.h"
42 #include "message_search.h"
43 #include "managesieve.h"
44 #include "sieve_editor.h"
46 GSList *editors = NULL;
48 static void sieve_editor_destroy(SieveEditorPage *page);
50 void sieve_editor_set_position(void *obj, gint pos);
51 gboolean sieve_editor_search_string(void *obj,
52 const gchar *str, gboolean case_sens);
53 gboolean sieve_editor_search_string_backward(void *obj,
54 const gchar *str, gboolean case_sens);
55 static void sieve_editor_save_cb(GtkAction *action, SieveEditorPage *page);
56 static void sieve_editor_check_cb(GtkAction *action, SieveEditorPage *page);
57 static void sieve_editor_revert_cb(GtkAction *action, SieveEditorPage *page);
58 static void sieve_editor_close_cb(GtkAction *action, SieveEditorPage *page);
59 static void sieve_editor_undo_cb(GtkAction *action, SieveEditorPage *page);
60 static void sieve_editor_redo_cb(GtkAction *action, SieveEditorPage *page);
61 static void sieve_editor_cut_cb(GtkAction *action, SieveEditorPage *page);
62 static void sieve_editor_copy_cb(GtkAction *action, SieveEditorPage *page);
63 static void sieve_editor_paste_cb(GtkAction *action, SieveEditorPage *page);
64 static void sieve_editor_allsel_cb(GtkAction *action, SieveEditorPage *page);
65 static void sieve_editor_find_cb(GtkAction *action, SieveEditorPage *page);
66 static void sieve_editor_set_modified(SieveEditorPage *page,
69 static SearchInterface search_interface = {
70 .set_position = sieve_editor_set_position,
71 .search_string_backward = sieve_editor_search_string_backward,
72 .search_string = sieve_editor_search_string,
75 static GtkActionEntry sieve_editor_entries[] =
77 {"Menu", NULL, "Menu" },
79 {"Filter", NULL, N_("_Filter") },
80 {"Edit", NULL, N_("_Edit") },
83 {"Filter/Save", NULL, N_("_Save"), "<control>S", NULL, G_CALLBACK(sieve_editor_save_cb) },
84 {"Filter/CheckSyntax", NULL, N_("Chec_k Syntax"), "<control>K", NULL, G_CALLBACK(sieve_editor_check_cb) },
85 {"Filter/Revert", NULL, N_("Re_vert"), NULL, NULL, G_CALLBACK(sieve_editor_revert_cb) },
86 {"Filter/Close", NULL, N_("_Close"), "<control>W", NULL, G_CALLBACK(sieve_editor_close_cb) },
89 {"Edit/Undo", NULL, N_("_Undo"), "<control>Z", NULL, G_CALLBACK(sieve_editor_undo_cb) },
90 {"Edit/Redo", NULL, N_("_Redo"), "<control>Y", NULL, G_CALLBACK(sieve_editor_redo_cb) },
91 /* {"Edit/---", NULL, "---" }, */
93 {"Edit/Cut", NULL, N_("Cu_t"), "<control>X", NULL, G_CALLBACK(sieve_editor_cut_cb) },
94 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(sieve_editor_copy_cb) },
95 {"Edit/Paste", NULL, N_("_Paste"), "<control>V", NULL, G_CALLBACK(sieve_editor_paste_cb) },
97 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(sieve_editor_allsel_cb) },
99 {"Edit/---", NULL, "---" },
100 {"Edit/Find", NULL, N_("_Find"), "<control>F", NULL, G_CALLBACK(sieve_editor_find_cb) },
104 void sieve_editors_close()
107 g_slist_free_full(editors, (GDestroyNotify)sieve_editor_close);
112 void sieve_editor_append_text(SieveEditorPage *page, gchar *text, gint len)
114 GtkTextBuffer *buffer;
116 gboolean was_modified = page->modified;
118 undo_block(page->undostruct);
119 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
120 gtk_text_buffer_get_end_iter(buffer, &iter);
121 gtk_text_buffer_insert(buffer, &iter, text, len);
122 undo_unblock(page->undostruct);
123 sieve_editor_set_modified(page, was_modified);
126 static gint sieve_editor_get_text(SieveEditorPage *page, gchar **text)
128 GtkTextBuffer *buffer;
129 GtkTextIter start, end;
131 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
132 gtk_text_buffer_get_start_iter(buffer, &start);
133 gtk_text_buffer_get_end_iter(buffer, &end);
134 *text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
135 return gtk_text_iter_get_offset(&end) - gtk_text_iter_get_offset(&start);
138 static void sieve_editor_set_status(SieveEditorPage *page, const gchar *status)
140 gtk_label_set_text(GTK_LABEL(page->status_text), status);
143 static void sieve_editor_set_status_icon(SieveEditorPage *page, const gchar *img_id)
145 GtkImage *img = GTK_IMAGE(page->status_icon);
147 gtk_image_set_from_stock(img, img_id, GTK_ICON_SIZE_BUTTON);
149 gtk_image_clear(img);
152 static void sieve_editor_append_status(SieveEditorPage *page,
155 GtkLabel *label = GTK_LABEL(page->status_text);
156 const gchar *prev_status = gtk_label_get_text(label);
157 const gchar *sep = prev_status && prev_status[0] ? "\n" : "";
158 gtk_label_set_text(label, g_strconcat(prev_status, sep, status, NULL));
161 /* Update the status icon and text from a response. */
162 static void sieve_editor_update_status(SieveEditorPage *page,
165 if (result->has_status) {
166 /* set status icon */
167 sieve_editor_set_status_icon(page,
168 result->success ? GTK_STOCK_DIALOG_INFO : GTK_STOCK_DIALOG_ERROR);
169 /* clear status text */
170 sieve_editor_set_status(page, "");
172 if (result->description) {
173 /* append to status */
174 sieve_editor_append_status(page, result->description);
180 static void sieve_editor_undo_cb(GtkAction *action, SieveEditorPage *page)
182 undo_undo(page->undostruct);
185 static void sieve_editor_redo_cb(GtkAction *action, SieveEditorPage *page)
187 undo_redo(page->undostruct);
190 static void sieve_editor_cut_cb(GtkAction *action, SieveEditorPage *page)
192 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
193 GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
194 gtk_text_buffer_cut_clipboard(buf, clipboard, TRUE);
197 static void sieve_editor_copy_cb(GtkAction *action, SieveEditorPage *page)
199 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
200 GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
201 gtk_text_buffer_copy_clipboard(buf, clipboard);
204 static void sieve_editor_paste_cb(GtkAction *action, SieveEditorPage *page)
206 if (!gtk_widget_has_focus(page->text))
209 GtkTextBuffer *buf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
210 GtkClipboard *clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
211 gchar *contents = gtk_clipboard_wait_for_text(clipboard);
212 GtkTextMark *start_mark = gtk_text_buffer_get_insert(buf);
213 GtkTextIter start_iter;
215 undo_paste_clipboard(GTK_TEXT_VIEW(page->text), page->undostruct);
216 gtk_text_buffer_delete_selection(buf, FALSE, TRUE);
218 gtk_text_buffer_get_iter_at_mark(buf, &start_iter, start_mark);
219 gtk_text_buffer_insert(buf, &start_iter, contents, strlen(contents));
223 static void sieve_editor_allsel_cb(GtkAction *action, SieveEditorPage *page)
225 GtkTextIter start, end;
226 GtkTextBuffer *buffer;
228 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
229 gtk_text_buffer_get_start_iter(buffer, &start);
230 gtk_text_buffer_get_end_iter(buffer, &end);
231 gtk_text_buffer_select_range(buffer, &start, &end);
236 void sieve_editor_set_position(void *obj, gint pos)
238 SieveEditorPage *page = (SieveEditorPage *)obj;
239 GtkTextView *text = GTK_TEXT_VIEW(page->text);
241 gtkut_text_view_set_position(text, pos);
244 gboolean sieve_editor_search_string(void *obj,
245 const gchar *str, gboolean case_sens)
247 SieveEditorPage *page = (SieveEditorPage *)obj;
248 GtkTextView *text = GTK_TEXT_VIEW(page->text);
250 return gtkut_text_view_search_string(text, str, case_sens);
253 gboolean sieve_editor_search_string_backward(void *obj,
254 const gchar *str, gboolean case_sens)
256 SieveEditorPage *page = (SieveEditorPage *)obj;
257 GtkTextView *text = GTK_TEXT_VIEW(page->text);
259 return gtkut_text_view_search_string_backward(text, str, case_sens);
262 static void sieve_editor_search(SieveEditorPage *page)
264 message_search_other(&search_interface, page);
269 static void got_data_reverting(SieveSession *session, gchar *contents,
270 SieveEditorPage *page)
272 if (contents == NULL) {
274 undo_unblock(page->undostruct);
275 gtk_widget_set_sensitive(page->text, TRUE);
276 sieve_editor_set_status(page, "");
277 sieve_editor_set_modified(page, FALSE);
280 if (contents == (void *)-1) {
282 sieve_editor_set_status(page, _("Unable to get script contents"));
283 sieve_editor_set_status_icon(page, GTK_STOCK_DIALOG_ERROR);
287 if (page->first_line) {
288 GtkTextIter start, end;
289 GtkTextBuffer *buffer;
291 page->first_line = FALSE;
293 /* delete previous data */
294 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(page->text));
295 gtk_text_buffer_get_start_iter(buffer, &start);
296 gtk_text_buffer_get_end_iter(buffer, &end);
297 gtk_text_buffer_delete(buffer, &start, &end);
300 gtk_text_buffer_insert(buffer, &end, contents, strlen(contents));
302 sieve_editor_append_text(page, "\n", 1);
303 sieve_editor_append_text(page, contents, strlen(contents));
307 static void sieve_editor_revert(SieveEditorPage *page)
309 undo_block(page->undostruct);
310 page->first_line = TRUE;
311 gtk_widget_set_sensitive(page->text, FALSE);
312 sieve_editor_set_status(page, _("Reverting..."));
313 sieve_editor_set_status_icon(page, NULL);
314 sieve_session_get_script(page->session, page->script_name,
315 (sieve_session_data_cb_fn)got_data_reverting, page);
318 static void sieve_editor_revert_cb(GtkAction *action, SieveEditorPage *page)
320 if (!page->modified ||
321 alertpanel(_("Revert script"),
322 _("This script has been modified. Revert the unsaved changes?"),
323 _("_Revert"), NULL, GTK_STOCK_CANCEL) == G_ALERTDEFAULT)
324 sieve_editor_revert(page);
327 static void got_data_saved(SieveSession *session, SieveResult *result,
328 SieveEditorPage *page)
330 if (result->has_status && result->success) {
331 sieve_editor_set_modified(page, FALSE);
333 sieve_editor_close(page);
336 /* use nice status message if there are no warnings */
337 if (result->code == SIEVE_CODE_NONE) {
338 result->description = _("Script saved successfully.");
341 sieve_editor_update_status(page, result);
344 static void sieve_editor_save(SieveEditorPage *page)
347 gint len = sieve_editor_get_text(page, &text);
348 sieve_editor_set_status(page, _("Saving..."));
349 sieve_editor_set_status_icon(page, NULL);
350 sieve_session_put_script(page->session, page->script_name, len, text,
351 (sieve_session_data_cb_fn)got_data_saved, page);
355 static void sieve_editor_save_cb(GtkAction *action, SieveEditorPage *page)
357 sieve_editor_save(page);
360 static void sieve_editor_find_cb(GtkAction *action, SieveEditorPage *page)
362 sieve_editor_search(page);
365 static void got_data_checked(SieveSession *session, SieveResult *result,
366 SieveEditorPage *page)
368 sieve_editor_update_status(page, result);
371 static void sieve_editor_check_cb(GtkAction *action, SieveEditorPage *page)
374 gint len = sieve_editor_get_text(page, &text);
375 sieve_editor_set_status(page, _("Checking syntax..."));
376 sieve_editor_set_status_icon(page, NULL);
377 sieve_session_check_script(page->session, len, text,
378 (sieve_session_data_cb_fn)got_data_checked, page);
382 static void sieve_editor_changed_cb(GtkTextBuffer *textbuf,
383 SieveEditorPage *page)
385 if (!page->modified) {
386 sieve_editor_set_modified(page, TRUE);
390 static void sieve_editor_destroy(SieveEditorPage *page)
392 gtk_widget_destroy(page->window);
393 undo_destroy(page->undostruct);
397 void sieve_editor_close(SieveEditorPage *page)
399 editors = g_slist_remove(editors, (gconstpointer)page);
400 sieve_editor_destroy(page);
401 sieve_sessions_discard_callbacks(page);
404 static gboolean sieve_editor_confirm_close(SieveEditorPage *page)
406 if (page->modified) {
407 switch (alertpanel(_("Save changes"),
408 _("This script has been modified. Save the latest changes?"),
409 _("_Discard"), _("+_Save"), GTK_STOCK_CANCEL)) {
412 case G_ALERTALTERNATE:
413 page->closing = TRUE;
414 sieve_editor_save(page);
423 static void sieve_editor_close_cb(GtkAction *action, SieveEditorPage *page)
425 if (sieve_editor_confirm_close(page)) {
426 sieve_editor_close(page);
430 static gint sieve_editor_delete_cb(GtkWidget *widget, GdkEventAny *event,
431 SieveEditorPage *page)
433 sieve_editor_close_cb(NULL, page);
438 * sieve_editor_undo_state_changed:
440 * Change the sensivity of the menuentries undo and redo
442 static void sieve_editor_undo_state_changed(UndoMain *undostruct,
443 gint undo_state, gint redo_state, gpointer data)
445 SieveEditorPage *page = (SieveEditorPage *)data;
447 switch (undo_state) {
448 case UNDO_STATE_TRUE:
449 if (!undostruct->undo_state) {
450 undostruct->undo_state = TRUE;
451 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Undo", TRUE);
454 case UNDO_STATE_FALSE:
455 if (undostruct->undo_state) {
456 undostruct->undo_state = FALSE;
457 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Undo", FALSE);
460 case UNDO_STATE_UNCHANGED:
462 case UNDO_STATE_REFRESH:
463 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Undo", undostruct->undo_state);
466 g_warning("Undo state not recognized");
470 switch (redo_state) {
471 case UNDO_STATE_TRUE:
472 if (!undostruct->redo_state) {
473 undostruct->redo_state = TRUE;
474 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Redo", TRUE);
477 case UNDO_STATE_FALSE:
478 if (undostruct->redo_state) {
479 undostruct->redo_state = FALSE;
480 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Redo", FALSE);
483 case UNDO_STATE_UNCHANGED:
485 case UNDO_STATE_REFRESH:
486 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Edit/Redo", undostruct->redo_state);
489 g_warning("Redo state not recognized");
495 SieveEditorPage *sieve_editor_new(SieveSession *session, gchar *script_name)
497 SieveEditorPage *page;
498 GtkUIManager *ui_manager;
499 UndoMain *undostruct;
502 GtkWidget *vbox, *hbox, *hbox1;
503 GtkWidget *scrolledwin;
505 GtkTextBuffer *buffer;
506 GtkWidget *check_btn, *save_btn, *close_btn;
507 GtkWidget *status_text;
508 GtkWidget *status_icon;
510 page = g_new0(SieveEditorPage, 1);
513 window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "sieveeditor");
514 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
515 MANAGE_WINDOW_SIGNALS_CONNECT (window);
516 g_signal_connect(G_OBJECT(window), "delete_event",
517 G_CALLBACK(sieve_editor_delete_cb), page);
519 vbox = gtk_vbox_new(FALSE, 0);
520 gtk_container_add(GTK_CONTAINER(window), vbox);
522 ui_manager = gtk_ui_manager_new();
523 cm_menu_create_action_group_full(ui_manager,
524 "Menu", sieve_editor_entries, G_N_ELEMENTS(sieve_editor_entries),
527 MENUITEM_ADDUI_MANAGER(ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
529 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu", "Filter", "Filter", GTK_UI_MANAGER_MENU)
530 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
533 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Filter", "Save", "Filter/Save", GTK_UI_MANAGER_MENUITEM)
534 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Filter", "CheckSyntax", "Filter/CheckSyntax", GTK_UI_MANAGER_MENUITEM)
535 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Filter", "Revert", "Filter/Revert", GTK_UI_MANAGER_MENUITEM)
536 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Filter", "Close", "Filter/Close", GTK_UI_MANAGER_MENUITEM)
539 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Undo", "Edit/Undo", GTK_UI_MANAGER_MENUITEM)
540 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Redo", "Edit/Redo", GTK_UI_MANAGER_MENUITEM)
541 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
543 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Cut", "Edit/Cut", GTK_UI_MANAGER_MENUITEM)
544 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
545 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Paste", "Edit/Paste", GTK_UI_MANAGER_MENUITEM)
547 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
549 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Separator2", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
551 MENUITEM_ADDUI_MANAGER(ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
553 menubar = gtk_ui_manager_get_widget(ui_manager, "/Menu");
555 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(ui_manager));
556 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
558 cm_menu_set_sensitive_full(ui_manager, "Menu/Edit/Undo", FALSE);
559 cm_menu_set_sensitive_full(ui_manager, "Menu/Edit/Redo", FALSE);
562 scrolledwin = gtk_scrolled_window_new(NULL, NULL);
563 gtk_widget_set_size_request (scrolledwin, 660, 408);
564 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
565 GTK_POLICY_AUTOMATIC,
566 GTK_POLICY_AUTOMATIC);
567 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
569 gtk_box_pack_start(GTK_BOX(vbox), scrolledwin, TRUE, TRUE, 0);
571 text = gtk_text_view_new();
572 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD_CHAR);
573 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), TRUE);
574 gtk_container_add(GTK_CONTAINER(scrolledwin), text);
576 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
577 g_signal_connect(G_OBJECT(buffer), "changed",
578 G_CALLBACK(sieve_editor_changed_cb), page);
581 if (prefs_common_get_prefs()->textfont) {
582 PangoFontDescription *font_desc;
584 font_desc = pango_font_description_from_string
585 (prefs_common_get_prefs()->textfont);
587 gtk_widget_modify_font(text, font_desc);
588 pango_font_description_free(font_desc);
592 hbox = gtk_hbox_new (FALSE, 8);
593 gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
594 gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
597 status_icon = gtk_image_new ();
598 gtk_box_pack_start (GTK_BOX (hbox), status_icon, FALSE, FALSE, 0);
599 status_text = gtk_label_new ("");
600 gtk_box_pack_start (GTK_BOX (hbox), status_text, FALSE, FALSE, 0);
601 gtk_label_set_justify (GTK_LABEL (status_text), GTK_JUSTIFY_LEFT);
604 gtkut_stock_with_text_button_set_create(&hbox1,
605 &close_btn, GTK_STOCK_CANCEL, _("_Close"),
606 &check_btn, GTK_STOCK_OK, _("Chec_k Syntax"),
607 &save_btn, GTK_STOCK_SAVE, _("_Save"));
608 gtk_box_pack_end (GTK_BOX (hbox), hbox1, FALSE, FALSE, 0);
609 gtk_widget_grab_default (save_btn);
610 g_signal_connect (G_OBJECT (close_btn), "clicked",
611 G_CALLBACK (sieve_editor_close_cb), page);
612 g_signal_connect (G_OBJECT (check_btn), "clicked",
613 G_CALLBACK (sieve_editor_check_cb), page);
614 g_signal_connect (G_OBJECT (save_btn), "clicked",
615 G_CALLBACK (sieve_editor_save_cb), page);
617 undostruct = undo_init(text);
618 undo_set_change_state_func(undostruct, &sieve_editor_undo_state_changed,
621 gtk_widget_show_all(window);
623 page->window = window;
624 page->ui_manager = ui_manager;
626 page->undostruct = undostruct;
627 page->session = session;
628 page->script_name = script_name;
629 page->status_text = status_text;
630 page->status_icon = status_icon;
632 editors = g_slist_prepend(editors, page);
634 sieve_editor_set_modified(page, FALSE);
639 SieveEditorPage *sieve_editor_get(SieveSession *session, gchar *script_name)
642 SieveEditorPage *page;
643 for (item = editors; item; item = item->next) {
644 page = (SieveEditorPage *)item->data;
645 if (page->session == session &&
646 strcmp(script_name, page->script_name) == 0)
652 void sieve_editor_present(SieveEditorPage *page)
654 gtk_window_present(GTK_WINDOW(page->window));
657 static void sieve_editor_set_modified(SieveEditorPage *page,
662 page->modified = modified;
663 cm_menu_set_sensitive_full(page->ui_manager, "Menu/Filter/Revert",
666 title = g_strdup_printf(_("%s - Sieve Filter%s"), page->script_name,
667 modified ? " [Edited]") : "");
668 gtk_window_set_title (GTK_WINDOW (page->window), title);
672 sieve_editor_set_status(page, "");
673 sieve_editor_set_status_icon(page, NULL);