1 /* Copyright (c) 2006, Nokia Corporation
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * * Neither the name of the Nokia Corporation nor the names of its
14 * contributors may be used to endorse or promote products derived from
15 * this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #include <glib/gi18n.h>
33 #include <glib/gstdio.h>
35 #include <tny-account-store.h>
36 #include <tny-fs-stream.h>
37 #include <tny-vfs-stream.h>
41 #include <modest-account-mgr.h>
42 #include <modest-account-mgr-helpers.h>
44 #include <widgets/modest-msg-edit-window.h>
45 #include <widgets/modest-combo-box.h>
46 #include <widgets/modest-recpt-editor.h>
47 #include <widgets/modest-attachments-view.h>
49 #include <modest-runtime.h>
51 #include "modest-platform.h"
52 #include "modest-icon-names.h"
53 #include "modest-widget-memory.h"
54 #include "modest-window-priv.h"
55 #include "modest-mail-operation.h"
56 #include "modest-tny-platform-factory.h"
57 #include "modest-tny-msg.h"
58 #include "modest-address-book.h"
59 #include "modest-text-utils.h"
60 #include <tny-simple-list.h>
61 #include <wptextview.h>
62 #include <wptextbuffer.h>
63 #include "modest-scroll-area.h"
65 #include "modest-hildon-includes.h"
66 #ifdef MODEST_HAVE_HILDON0_WIDGETS
67 #include <hildon-widgets/hildon-color-chooser.h>
69 #include "widgets/modest-msg-edit-window-ui.h"
70 #ifdef MODEST_HAVE_HILDON0_WIDGETS
71 #include <libgnomevfs/gnome-vfs-mime-utils.h>
73 #include <libgnomevfs/gnome-vfs-mime.h>
75 #include "modest-maemo-utils.h"
78 #define DEFAULT_FONT_SIZE 3
79 #define DEFAULT_FONT 2
80 #define DEFAULT_SIZE_BUTTON_FONT_FAMILY "Sans"
81 #define DEFAULT_SIZE_COMBOBOX_WIDTH 80
82 #define DEFAULT_MAIN_VBOX_SPACING 6
83 #define SUBJECT_MAX_LENGTH 1000
84 #define IMAGE_MAX_WIDTH 640
86 static void modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klass);
87 static void modest_msg_edit_window_init (ModestMsgEditWindow *obj);
88 static void modest_msg_edit_window_finalize (GObject *obj);
90 static gboolean msg_body_focus (GtkWidget *focus, GdkEventFocus *event, gpointer userdata);
91 static void recpt_field_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor);
92 static void send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor);
93 static void style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor);
94 static void remove_attachment_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor);
95 static void zoom_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor);
96 static void paste_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor);
97 static void setup_insensitive_handlers (ModestMsgEditWindow *editor);
98 static void reset_modified (ModestMsgEditWindow *editor);
100 static void text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *window);
101 static void text_buffer_delete_range (GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, gpointer userdata);
102 static void text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window);
103 static void text_buffer_delete_images_by_id (GtkTextBuffer *buffer, const gchar * image_id);
104 static void subject_field_changed (GtkEditable *editable, ModestMsgEditWindow *window);
105 static void modest_msg_edit_window_color_button_change (ModestMsgEditWindow *window,
107 static void modest_msg_edit_window_size_change (GtkCheckMenuItem *menu_item,
109 static void modest_msg_edit_window_font_change (GtkCheckMenuItem *menu_item,
111 static void modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window);
112 static gboolean modest_msg_edit_window_window_state_event (GtkWidget *widget,
113 GdkEventWindowState *event,
115 static void modest_msg_edit_window_open_addressbook (ModestMsgEditWindow *window,
116 ModestRecptEditor *editor);
117 static void modest_msg_edit_window_add_attachment_clicked (GtkButton *button,
118 ModestMsgEditWindow *window);
120 /* ModestWindow methods implementation */
121 static void modest_msg_edit_window_set_zoom (ModestWindow *window, gdouble zoom);
122 static gdouble modest_msg_edit_window_get_zoom (ModestWindow *window);
123 static gboolean modest_msg_edit_window_zoom_minus (ModestWindow *window);
124 static gboolean modest_msg_edit_window_zoom_plus (ModestWindow *window);
125 static void modest_msg_edit_window_show_toolbar (ModestWindow *window,
126 gboolean show_toolbar);
127 static void modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard,
129 ModestMsgEditWindow *window);
130 static void modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard,
132 ModestMsgEditWindow *window);
133 static void update_window_title (ModestMsgEditWindow *window);
134 static void update_dimmed (ModestMsgEditWindow *window);
135 static void update_paste_dimming (ModestMsgEditWindow *window);
136 static void update_select_all_dimming (ModestMsgEditWindow *window);
137 static void update_zoom_dimming (ModestMsgEditWindow *window);
140 static void modest_msg_edit_window_find_toolbar_search (GtkWidget *widget,
141 ModestMsgEditWindow *window);
142 static void modest_msg_edit_window_find_toolbar_close (GtkWidget *widget,
143 ModestMsgEditWindow *window);
144 static void edit_menu_activated (GtkAction *action,
146 static void view_menu_activated (GtkAction *action,
149 /* list my signals */
156 typedef struct _ModestMsgEditWindowPrivate ModestMsgEditWindowPrivate;
157 struct _ModestMsgEditWindowPrivate {
159 GtkWidget *header_box;
161 ModestPairList *from_field_protos;
162 GtkWidget *from_field;
166 GtkWidget *bcc_field;
167 GtkWidget *subject_field;
168 GtkWidget *attachments_view;
169 GtkWidget *priority_icon;
170 GtkWidget *add_attachment_button;
172 GtkWidget *cc_caption;
173 GtkWidget *bcc_caption;
174 GtkWidget *attachments_caption;
176 GtkTextBuffer *text_buffer;
178 GtkWidget *font_size_toolitem;
179 GtkWidget *font_face_toolitem;
180 GtkWidget *font_color_button;
181 GSList *font_items_group;
182 GtkWidget *font_tool_button_label;
183 GSList *size_items_group;
184 GtkWidget *size_tool_button_label;
186 GtkWidget *find_toolbar;
189 GtkWidget *scroll_area;
194 TnyHeaderFlags priority_flags;
198 gulong clipboard_change_handler_id;
199 gulong system_clipboard_change_handler_id;
204 #define MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \
205 MODEST_TYPE_MSG_EDIT_WINDOW, \
206 ModestMsgEditWindowPrivate))
208 static GtkWindowClass *parent_class = NULL;
210 /* uncomment the following if you have defined any signals */
211 /* static guint signals[LAST_SIGNAL] = {0}; */
214 modest_msg_edit_window_get_type (void)
216 static GType my_type = 0;
218 static const GTypeInfo my_info = {
219 sizeof(ModestMsgEditWindowClass),
220 NULL, /* base init */
221 NULL, /* base finalize */
222 (GClassInitFunc) modest_msg_edit_window_class_init,
223 NULL, /* class finalize */
224 NULL, /* class data */
225 sizeof(ModestMsgEditWindow),
227 (GInstanceInitFunc) modest_msg_edit_window_init,
230 my_type = g_type_register_static (MODEST_TYPE_WINDOW,
231 "ModestMsgEditWindow",
234 wp_text_buffer_library_init ();
240 save_state (ModestWindow *self)
242 modest_widget_memory_save (modest_runtime_get_conf(),
243 G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY);
248 restore_settings (ModestMsgEditWindow *self)
250 modest_widget_memory_restore (modest_runtime_get_conf(),
251 G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY);
256 modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klass)
258 GObjectClass *gobject_class;
259 ModestWindowClass *modest_window_class;
260 gobject_class = (GObjectClass*) klass;
261 modest_window_class = (ModestWindowClass*) klass;
263 parent_class = g_type_class_peek_parent (klass);
264 gobject_class->finalize = modest_msg_edit_window_finalize;
266 modest_window_class->set_zoom_func = modest_msg_edit_window_set_zoom;
267 modest_window_class->get_zoom_func = modest_msg_edit_window_get_zoom;
268 modest_window_class->zoom_plus_func = modest_msg_edit_window_zoom_plus;
269 modest_window_class->zoom_minus_func = modest_msg_edit_window_zoom_minus;
270 modest_window_class->show_toolbar_func = modest_msg_edit_window_show_toolbar;
272 g_type_class_add_private (gobject_class, sizeof(ModestMsgEditWindowPrivate));
274 modest_window_class->save_state_func = save_state;
278 modest_msg_edit_window_init (ModestMsgEditWindow *obj)
280 ModestMsgEditWindowPrivate *priv;
281 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj);
283 priv->msg_body = NULL;
284 priv->from_field = NULL;
285 priv->to_field = NULL;
286 priv->cc_field = NULL;
287 priv->bcc_field = NULL;
288 priv->subject_field = NULL;
289 priv->attachments = NULL;
291 priv->zoom_level = 1.0;
293 priv->cc_caption = NULL;
294 priv->bcc_caption = NULL;
296 priv->priority_flags = 0;
298 priv->find_toolbar = NULL;
300 priv->draft_msg = NULL;
301 priv->clipboard_change_handler_id = 0;
302 priv->system_clipboard_change_handler_id = 0;
306 /* FIXME: this is a dup from the one in gtk/ */
309 * @result: A ModestPairList, which must be freed with modest_pair_list_free().
311 static ModestPairList*
312 get_transports (void)
314 GSList *transports = NULL;
316 ModestAccountMgr *account_mgr = modest_runtime_get_account_mgr();
317 GSList *accounts = modest_account_mgr_account_names (account_mgr,
318 TRUE /* only enabled accounts. */);
320 GSList *cursor = accounts;
322 gchar *account_name = cursor->data;
323 gchar *from_string = NULL;
325 from_string = modest_account_mgr_get_from_string (account_mgr,
329 if (from_string && account_name) {
330 gchar *name = account_name;
331 ModestPair *pair = modest_pair_new ((gpointer) name,
332 (gpointer) from_string , TRUE);
333 transports = g_slist_prepend (transports, pair);
336 cursor = cursor->next;
338 g_slist_free (accounts); /* only free the accounts, not the elements,
339 * because they are used in the pairlist */
345 init_window (ModestMsgEditWindow *obj)
347 GtkWidget *from_caption, *to_caption, *subject_caption;
348 GtkWidget *main_vbox;
349 ModestMsgEditWindowPrivate *priv;
351 GtkSizeGroup *size_group;
353 GtkWidget *subject_box;
354 GtkWidget *attachment_icon;
355 GtkWidget *window_box;
357 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj);
359 size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
361 /* Note: This ModestPairList* must exist for as long as the combo
362 * that uses it, because the ModestComboBox uses the ID opaquely,
363 * so it can't know how to manage its memory. */
364 priv->from_field_protos = get_transports ();
366 priv->from_field = modest_combo_box_new (priv->from_field_protos, g_str_equal);
368 priv->to_field = modest_recpt_editor_new ();
369 priv->cc_field = modest_recpt_editor_new ();
370 priv->bcc_field = modest_recpt_editor_new ();
371 subject_box = gtk_hbox_new (FALSE, 0);
372 priv->priority_icon = gtk_image_new ();
373 gtk_box_pack_start (GTK_BOX (subject_box), priv->priority_icon, FALSE, FALSE, 0);
374 priv->subject_field = gtk_entry_new_with_max_length (SUBJECT_MAX_LENGTH);
375 hildon_gtk_entry_set_input_mode (GTK_ENTRY (priv->subject_field),
376 HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_AUTOCAP);
377 gtk_box_pack_start (GTK_BOX (subject_box), priv->subject_field, TRUE, TRUE, 0);
378 priv->add_attachment_button = gtk_button_new ();
379 GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (priv->add_attachment_button), GTK_CAN_FOCUS);
380 gtk_button_set_relief (GTK_BUTTON (priv->add_attachment_button), GTK_RELIEF_NONE);
381 gtk_button_set_focus_on_click (GTK_BUTTON (priv->add_attachment_button), FALSE);
382 gtk_button_set_alignment (GTK_BUTTON (priv->add_attachment_button), 1.0, 1.0);
383 attachment_icon = gtk_image_new_from_icon_name (MODEST_HEADER_ICON_ATTACH, GTK_ICON_SIZE_BUTTON);
384 gtk_container_add (GTK_CONTAINER (priv->add_attachment_button), attachment_icon);
385 gtk_box_pack_start (GTK_BOX (subject_box), priv->add_attachment_button, FALSE, FALSE, 0);
386 priv->attachments_view = modest_attachments_view_new (NULL);
388 priv->header_box = gtk_vbox_new (FALSE, 0);
390 from_caption = hildon_caption_new (size_group, _("mail_va_from"), priv->from_field, NULL, 0);
391 to_caption = hildon_caption_new (size_group, _("mail_va_to"), priv->to_field, NULL, 0);
392 priv->cc_caption = hildon_caption_new (size_group, _("mail_va_cc"), priv->cc_field, NULL, 0);
393 priv->bcc_caption = hildon_caption_new (size_group, _("mail_va_hotfix1"), priv->bcc_field, NULL, 0);
394 subject_caption = hildon_caption_new (size_group, _("mail_va_subject"), subject_box, NULL, 0);
395 priv->attachments_caption = hildon_caption_new (size_group, _("mail_va_attachment"), priv->attachments_view, NULL, 0);
396 g_object_unref (size_group);
398 size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
399 modest_recpt_editor_set_field_size_group (MODEST_RECPT_EDITOR (priv->to_field), size_group);
400 modest_recpt_editor_set_field_size_group (MODEST_RECPT_EDITOR (priv->cc_field), size_group);
401 modest_recpt_editor_set_field_size_group (MODEST_RECPT_EDITOR (priv->bcc_field), size_group);
402 gtk_size_group_add_widget (size_group, priv->subject_field);
403 gtk_size_group_add_widget (size_group, priv->attachments_view);
404 g_object_unref (size_group);
406 gtk_box_pack_start (GTK_BOX (priv->header_box), from_caption, FALSE, FALSE, 0);
407 gtk_box_pack_start (GTK_BOX (priv->header_box), to_caption, FALSE, FALSE, 0);
408 gtk_box_pack_start (GTK_BOX (priv->header_box), priv->cc_caption, FALSE, FALSE, 0);
409 gtk_box_pack_start (GTK_BOX (priv->header_box), priv->bcc_caption, FALSE, FALSE, 0);
410 gtk_box_pack_start (GTK_BOX (priv->header_box), subject_caption, FALSE, FALSE, 0);
411 gtk_box_pack_start (GTK_BOX (priv->header_box), priv->attachments_caption, FALSE, FALSE, 0);
412 gtk_widget_set_no_show_all (priv->attachments_caption, TRUE);
415 priv->msg_body = wp_text_view_new ();
416 gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (priv->msg_body), GTK_WRAP_WORD_CHAR);
417 priv->text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body));
418 g_object_set (priv->text_buffer, "font_scale", 1.0, NULL);
419 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
420 /* gtk_text_buffer_set_can_paste_rich_text (priv->text_buffer, TRUE); */
421 wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
423 priv->find_toolbar = hildon_find_toolbar_new (NULL);
424 gtk_widget_set_no_show_all (priv->find_toolbar, TRUE);
426 g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes",
427 G_CALLBACK (text_buffer_refresh_attributes), obj);
428 g_signal_connect (G_OBJECT (priv->text_buffer), "delete-range",
429 G_CALLBACK (text_buffer_delete_range), obj);
430 g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo",
431 G_CALLBACK (text_buffer_can_undo), obj);
432 g_signal_connect (G_OBJECT (obj), "window-state-event",
433 G_CALLBACK (modest_msg_edit_window_window_state_event),
435 g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook",
436 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
437 g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook",
438 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
439 g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook",
440 G_CALLBACK (modest_msg_edit_window_open_addressbook), obj);
442 g_signal_connect (G_OBJECT (priv->add_attachment_button), "clicked",
443 G_CALLBACK (modest_msg_edit_window_add_attachment_clicked), obj);
445 g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event",
446 G_CALLBACK (msg_body_focus), obj);
447 g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event",
448 G_CALLBACK (msg_body_focus), obj);
449 g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))),
450 "changed", G_CALLBACK (recpt_field_changed), obj);
451 g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))),
452 "changed", G_CALLBACK (recpt_field_changed), obj);
453 g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))),
454 "changed", G_CALLBACK (recpt_field_changed), obj);
455 recpt_field_changed (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)), MODEST_MSG_EDIT_WINDOW (obj));
456 g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj);
458 g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj);
459 g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), obj);
461 priv->scroll = gtk_scrolled_window_new (NULL, NULL);
462 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
463 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scroll), GTK_SHADOW_NONE);
465 main_vbox = gtk_vbox_new (FALSE, DEFAULT_MAIN_VBOX_SPACING);
467 gtk_box_pack_start (GTK_BOX(main_vbox), priv->header_box, FALSE, FALSE, 0);
468 frame = gtk_frame_new (NULL);
469 gtk_box_pack_start (GTK_BOX(main_vbox), frame, TRUE, TRUE, 0);
471 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (priv->scroll), main_vbox);
472 gtk_container_set_focus_vadjustment (GTK_CONTAINER (main_vbox), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll)));
473 gtk_widget_show_all (GTK_WIDGET(priv->scroll));
475 if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)) {
476 gtk_widget_set_no_show_all (priv->cc_caption, TRUE);
477 gtk_widget_hide (priv->cc_caption);
479 if (!modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)) {
480 gtk_widget_set_no_show_all (priv->bcc_caption, TRUE);
481 gtk_widget_hide (priv->bcc_caption);
484 window_box = gtk_vbox_new (FALSE, 0);
485 gtk_box_pack_start (GTK_BOX (window_box), priv->scroll, TRUE, TRUE, 0);
486 gtk_box_pack_end (GTK_BOX (window_box), priv->find_toolbar, FALSE, FALSE, 0);
487 gtk_container_add (GTK_CONTAINER(obj), window_box);
488 priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body);
489 gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area);
492 TODO: scroll_area was never instantiated.
493 Stop building without warnings-as-errors. murrayc.
494 gtk_container_set_focus_vadjustment (GTK_CONTAINER (scroll_area),
495 gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll)));
498 priv->clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change",
499 G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj);
500 priv->system_clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change",
501 G_CALLBACK (modest_msg_edit_window_system_clipboard_owner_change), obj);
507 modest_msg_edit_window_finalize (GObject *obj)
509 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (obj);
511 if (priv->clipboard_change_handler_id > 0) {
512 g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), priv->clipboard_change_handler_id);
513 priv->clipboard_change_handler_id = 0;
516 if (priv->system_clipboard_change_handler_id > 0) {
517 g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD),
518 priv->system_clipboard_change_handler_id);
519 priv->system_clipboard_change_handler_id = 0;
522 /* This had to stay alive for as long as the combobox that used it: */
523 modest_pair_list_free (priv->from_field_protos);
525 G_OBJECT_CLASS(parent_class)->finalize (obj);
529 menubar_to_menu (GtkUIManager *ui_manager)
531 GtkWidget *main_menu;
535 /* Create new main menu */
536 main_menu = gtk_menu_new();
538 /* Get the menubar from the UI manager */
539 menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar");
541 iter = gtk_container_get_children (GTK_CONTAINER (menubar));
545 menu = GTK_WIDGET (iter->data);
546 gtk_widget_reparent(menu, main_menu);
548 iter = g_list_next (iter);
555 set_msg (ModestMsgEditWindow *self, TnyMsg *msg)
558 const gchar *to, *cc, *bcc, *subject;
560 ModestMsgEditWindowPrivate *priv;
562 TnyHeaderFlags priority_flags;
564 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self));
565 g_return_if_fail (TNY_IS_MSG (msg));
567 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
569 header = tny_msg_get_header (msg);
570 to = tny_header_get_to (header);
571 cc = tny_header_get_cc (header);
572 bcc = tny_header_get_bcc (header);
573 subject = tny_header_get_subject (header);
574 priority_flags = tny_header_get_flags (header) & TNY_HEADER_FLAG_PRIORITY;
577 modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->to_field), to);
579 modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->cc_field), cc);
580 gtk_widget_set_no_show_all (priv->cc_caption, FALSE);
581 gtk_widget_show (priv->cc_caption);
582 } else if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_SHOW_CC, NULL)) {
583 gtk_widget_set_no_show_all (priv->cc_caption, FALSE);
584 gtk_widget_hide (priv->cc_caption);
587 modest_recpt_editor_set_recipients (MODEST_RECPT_EDITOR (priv->bcc_field), bcc);
588 gtk_widget_set_no_show_all (priv->cc_caption, FALSE);
589 gtk_widget_show (priv->bcc_caption);
590 } else if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_SHOW_BCC, NULL)) {
591 gtk_widget_set_no_show_all (priv->bcc_caption, FALSE);
592 gtk_widget_hide (priv->bcc_caption);
595 gtk_entry_set_text (GTK_ENTRY(priv->subject_field), subject);
596 modest_msg_edit_window_set_priority_flags (MODEST_MSG_EDIT_WINDOW(self),
599 update_window_title (self);
601 /* gtk_text_buffer_set_can_paste_rich_text (priv->text_buffer, TRUE); */
602 wp_text_buffer_reset_buffer (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
603 body = modest_tny_msg_get_body (msg, TRUE);
605 if ((body == NULL)||(body[0] == '\0')) {
607 body = modest_text_utils_convert_to_html ("");
609 wp_text_buffer_load_document_begin (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
610 wp_text_buffer_load_document_write (WP_TEXT_BUFFER (priv->text_buffer),
613 wp_text_buffer_load_document_end (WP_TEXT_BUFFER (priv->text_buffer));
616 /* Get the default format required from configuration */
617 if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL)) {
618 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), FALSE);
621 /* Set the default focus depending on having already a To: field or not */
622 if ((!to)||(*to == '\0')) {
623 modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field));
625 gtk_widget_grab_focus (priv->msg_body);
628 /* TODO: lower priority, select in the From: combo to the
629 value that comes from msg <- not sure, should it be
632 /* Add attachments to the view */
633 modest_attachments_view_set_message (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), msg);
634 priv->attachments = modest_attachments_view_get_attachments (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
635 if (priv->attachments == NULL) {
636 gtk_widget_hide (priv->attachments_caption);
638 gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
639 gtk_widget_show_all (priv->attachments_caption);
642 gtk_text_buffer_get_start_iter (priv->text_buffer, &iter);
643 gtk_text_buffer_place_cursor (priv->text_buffer, &iter);
645 reset_modified (self);
647 update_dimmed (self);
648 text_buffer_can_undo (priv->text_buffer, FALSE, self);
650 priv->draft_msg = msg;
654 menu_tool_button_clicked_popup (GtkMenuToolButton *item,
657 GList *item_children, *node;
658 GtkWidget *bin_child;
660 bin_child = gtk_bin_get_child (GTK_BIN(item));
662 item_children = gtk_container_get_children (GTK_CONTAINER (bin_child));
664 for (node = item_children; node != NULL; node = g_list_next (node)) {
665 if (GTK_IS_TOGGLE_BUTTON (node->data)) {
666 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (node->data), TRUE);
669 g_list_free (item_children);
673 menu_tool_button_dont_expand (GtkMenuToolButton *item)
676 GList *item_children, *node;
678 box = gtk_bin_get_child (GTK_BIN (item));
679 gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
680 item_children = gtk_container_get_children (GTK_CONTAINER (box));
682 for (node = item_children; node != NULL; node = g_list_next (node)) {
683 gtk_box_set_child_packing (GTK_BOX (box), GTK_WIDGET (node->data), TRUE, TRUE, 0, GTK_PACK_START);
684 if (GTK_IS_TOGGLE_BUTTON (node->data))
685 gtk_button_set_alignment (GTK_BUTTON (node->data), 0.0, 0.5);
686 else if (GTK_IS_BUTTON (node->data))
687 gtk_button_set_alignment (GTK_BUTTON (node->data), 1.0, 0.5);
689 g_list_free (item_children);
694 modest_msg_edit_window_setup_toolbar (ModestMsgEditWindow *window)
696 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
697 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
698 GtkWidget *placeholder;
699 GtkWidget *tool_item;
704 GtkWidget *sizes_menu;
705 GtkWidget *fonts_menu;
706 GSList *radio_group = NULL;
711 parent_priv->toolbar = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar");
712 hildon_window_add_toolbar (HILDON_WINDOW (window), GTK_TOOLBAR (parent_priv->toolbar));
714 /* should we hide the toolbar? */
715 if (!modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_SHOW_TOOLBAR, NULL))
716 gtk_widget_hide (parent_priv->toolbar);
718 /* Font color placeholder */
719 placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/FontColor");
720 insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
723 tool_item = GTK_WIDGET (gtk_tool_item_new ());
724 priv->font_color_button = hildon_color_button_new ();
725 GTK_WIDGET_UNSET_FLAGS (tool_item, GTK_CAN_FOCUS);
726 GTK_WIDGET_UNSET_FLAGS (priv->font_color_button, GTK_CAN_FOCUS);
727 gtk_container_add (GTK_CONTAINER (tool_item), priv->font_color_button);
728 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
729 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
730 gtk_toolbar_insert(GTK_TOOLBAR(parent_priv->toolbar), GTK_TOOL_ITEM (tool_item), insert_index);
731 g_signal_connect_swapped (G_OBJECT (priv->font_color_button), "notify::color", G_CALLBACK (modest_msg_edit_window_color_button_change), window);
733 /* Font size and face placeholder */
734 placeholder = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/FontAttributes");
735 insert_index = gtk_toolbar_get_item_index(GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM(placeholder));
737 tool_item = GTK_WIDGET (gtk_menu_tool_button_new (NULL, NULL));
738 priv->size_tool_button_label = gtk_label_new (NULL);
739 snprintf(size_text, sizeof(size_text), "%d", wp_font_size[DEFAULT_FONT_SIZE]);
740 markup = g_strconcat ("<span font_family='", DEFAULT_SIZE_BUTTON_FONT_FAMILY, "'>",
741 size_text,"</span>", NULL);
742 gtk_label_set_markup (GTK_LABEL (priv->size_tool_button_label), markup);
744 gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (tool_item), priv->size_tool_button_label);
745 sizes_menu = gtk_menu_new ();
746 priv->size_items_group = NULL;
748 for (size_index = 0; size_index < WP_FONT_SIZE_COUNT; size_index++) {
749 GtkWidget *size_menu_item;
751 snprintf(size_text, sizeof(size_text), "%d", wp_font_size[size_index]);
752 size_menu_item = gtk_radio_menu_item_new_with_label (radio_group, size_text);
753 radio_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (size_menu_item));
754 gtk_menu_shell_append (GTK_MENU_SHELL (sizes_menu), size_menu_item);
755 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (size_menu_item), (wp_font_size[size_index] == 12));
756 gtk_widget_show (size_menu_item);
758 priv->size_items_group = g_slist_prepend (priv->size_items_group, size_menu_item);
762 for (node = radio_group; node != NULL; node = g_slist_next (node)) {
763 GtkWidget *item = (GtkWidget *) node->data;
764 g_signal_connect (G_OBJECT (item), "toggled", G_CALLBACK (modest_msg_edit_window_size_change),
768 priv->size_items_group = g_slist_reverse (priv->size_items_group);
769 gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (tool_item), sizes_menu);
770 g_signal_connect (G_OBJECT (tool_item), "clicked", G_CALLBACK (menu_tool_button_clicked_popup), NULL);
771 gtk_toolbar_insert (GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM (tool_item), insert_index);
772 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
773 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
774 menu_tool_button_dont_expand (GTK_MENU_TOOL_BUTTON (tool_item));
775 priv->font_size_toolitem = tool_item;
778 tool_item = GTK_WIDGET (gtk_menu_tool_button_new (NULL, NULL));
779 priv->font_tool_button_label = gtk_label_new (NULL);
780 markup = g_strconcat ("<span font_family='", wp_get_font_name(DEFAULT_FONT), "'>Tt</span>", NULL);
781 gtk_label_set_markup (GTK_LABEL (priv->font_tool_button_label), markup);
783 gtk_tool_button_set_label_widget (GTK_TOOL_BUTTON (tool_item), priv->font_tool_button_label);
784 fonts_menu = gtk_menu_new ();
785 priv->font_items_group = NULL;
787 for (font_index = 0; font_index < wp_get_font_count (); font_index++) {
788 GtkWidget *font_menu_item;
789 GtkWidget *child_label;
791 font_menu_item = gtk_radio_menu_item_new_with_label (radio_group, "");
792 child_label = gtk_bin_get_child (GTK_BIN (font_menu_item));
793 markup = g_strconcat ("<span font_family='", wp_get_font_name (font_index),"'>",
794 wp_get_font_name (font_index), "</span>", NULL);
795 gtk_label_set_markup (GTK_LABEL (child_label), markup);
798 radio_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (font_menu_item));
799 gtk_menu_shell_append (GTK_MENU_SHELL (fonts_menu), font_menu_item);
800 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (font_menu_item), (font_index == DEFAULT_FONT));
801 gtk_widget_show (font_menu_item);
803 priv->font_items_group = g_slist_prepend (priv->font_items_group, font_menu_item);
806 for (node = radio_group; node != NULL; node = g_slist_next (node)) {
807 GtkWidget *item = (GtkWidget *) node->data;
808 g_signal_connect (G_OBJECT (item), "toggled", G_CALLBACK (modest_msg_edit_window_font_change),
811 priv->font_items_group = g_slist_reverse (priv->font_items_group);
812 gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (tool_item), fonts_menu);
813 g_signal_connect (G_OBJECT (tool_item), "clicked", G_CALLBACK (menu_tool_button_clicked_popup), NULL);
814 gtk_toolbar_insert (GTK_TOOLBAR (parent_priv->toolbar), GTK_TOOL_ITEM (tool_item), insert_index);
815 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
816 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
817 menu_tool_button_dont_expand (GTK_MENU_TOOL_BUTTON (tool_item));
818 priv->font_face_toolitem = tool_item;
820 /* Set expand and homogeneous for remaining items */
821 tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSend");
822 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
823 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
824 tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsBold");
825 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
826 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
827 tool_item = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
828 gtk_tool_item_set_expand (GTK_TOOL_ITEM (tool_item), TRUE);
829 gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (tool_item), TRUE);
837 modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name)
840 ModestWindowPrivate *parent_priv;
841 ModestMsgEditWindowPrivate *priv;
842 GtkActionGroup *action_group;
843 GError *error = NULL;
844 GdkPixbuf *window_icon = NULL;
847 gboolean prefer_formatted;
849 ModestPair *account_pair = NULL;
851 g_return_val_if_fail (msg, NULL);
852 g_return_val_if_fail (account_name, NULL);
854 obj = g_object_new(MODEST_TYPE_MSG_EDIT_WINDOW, NULL);
856 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (obj);
857 parent_priv = MODEST_WINDOW_GET_PRIVATE (obj);
859 parent_priv->ui_manager = gtk_ui_manager_new();
860 action_group = gtk_action_group_new ("ModestMsgEditWindowActions");
861 gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE);
863 /* Add common actions */
864 gtk_action_group_add_actions (action_group,
865 modest_msg_edit_action_entries,
866 G_N_ELEMENTS (modest_msg_edit_action_entries),
868 gtk_action_group_add_toggle_actions (action_group,
869 modest_msg_edit_toggle_action_entries,
870 G_N_ELEMENTS (modest_msg_edit_toggle_action_entries),
872 gtk_action_group_add_radio_actions (action_group,
873 modest_msg_edit_alignment_radio_action_entries,
874 G_N_ELEMENTS (modest_msg_edit_alignment_radio_action_entries),
876 G_CALLBACK (modest_ui_actions_on_change_justify),
878 gtk_action_group_add_radio_actions (action_group,
879 modest_msg_edit_zoom_action_entries,
880 G_N_ELEMENTS (modest_msg_edit_zoom_action_entries),
882 G_CALLBACK (modest_ui_actions_on_change_zoom),
884 gtk_action_group_add_radio_actions (action_group,
885 modest_msg_edit_priority_action_entries,
886 G_N_ELEMENTS (modest_msg_edit_priority_action_entries),
888 G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority),
890 gtk_action_group_add_radio_actions (action_group,
891 modest_msg_edit_file_format_action_entries,
892 G_N_ELEMENTS (modest_msg_edit_file_format_action_entries),
893 modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL),
894 G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format),
896 gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0);
897 g_object_unref (action_group);
899 /* Load the UI definition */
900 gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-edit-window-ui.xml",
903 g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message);
904 g_clear_error (&error);
907 /* Add accelerators */
908 gtk_window_add_accel_group (GTK_WINDOW (obj),
909 gtk_ui_manager_get_accel_group (parent_priv->ui_manager));
912 parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager);
913 hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar));
916 init_window (MODEST_MSG_EDIT_WINDOW(obj));
918 restore_settings (MODEST_MSG_EDIT_WINDOW(obj));
920 gtk_window_set_icon_from_file (GTK_WINDOW(obj), MODEST_APP_ICON, NULL);
922 modest_window_set_active_account (MODEST_WINDOW(obj), account_name);
924 modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj));
926 setup_insensitive_handlers (MODEST_MSG_EDIT_WINDOW (obj));
928 account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name);
929 if (account_pair != NULL)
930 modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->from_field), account_pair->first);
932 set_msg (MODEST_MSG_EDIT_WINDOW (obj), msg);
934 text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj));
936 /* Set window icon */
937 window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON);
938 gtk_window_set_icon (GTK_WINDOW (obj), window_icon);
940 /* Dim at start clipboard actions */
941 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
942 gtk_action_set_sensitive (action, FALSE);
943 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
944 gtk_action_set_sensitive (action, FALSE);
945 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu");
946 gtk_action_set_sensitive (action, FALSE);
948 /* Update select all */
949 update_select_all_dimming (MODEST_MSG_EDIT_WINDOW (obj));
950 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu");
951 g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (edit_menu_activated), obj);
952 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu");
953 g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (view_menu_activated), obj);
955 /* set initial state of cc and bcc */
956 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu");
957 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
958 modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL));
959 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu");
960 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action),
961 modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL));
963 /* Setup the file format */
964 conf = modest_runtime_get_conf ();
965 prefer_formatted = modest_conf_get_bool (conf, MODEST_CONF_PREFER_FORMATTED_TEXT, &error);
967 g_clear_error (&error);
968 file_format = MODEST_FILE_FORMAT_FORMATTED_TEXT;
970 file_format = (prefer_formatted) ?
971 MODEST_FILE_FORMAT_FORMATTED_TEXT :
972 MODEST_FILE_FORMAT_PLAIN_TEXT;
973 modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (obj), file_format);
975 update_paste_dimming (MODEST_MSG_EDIT_WINDOW (obj));
977 return (ModestWindow*) obj;
981 get_formatted_data_cb (const gchar *buffer, gpointer user_data)
983 GString **string_buffer = (GString **) user_data;
985 *string_buffer = g_string_append (*string_buffer, buffer);
991 * @result: A new string which should be freed with g_free().
994 get_formatted_data (ModestMsgEditWindow *edit_window)
996 ModestMsgEditWindowPrivate *priv;
997 GString *string_buffer = g_string_new ("");
999 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (edit_window);
1001 wp_text_buffer_save_document (WP_TEXT_BUFFER(priv->text_buffer), get_formatted_data_cb, &string_buffer);
1003 return g_string_free (string_buffer, FALSE);
1008 modest_msg_edit_window_get_msg_data (ModestMsgEditWindow *edit_window)
1011 const gchar *account_name;
1012 ModestMsgEditWindowPrivate *priv;
1014 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (edit_window), NULL);
1016 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (edit_window);
1018 account_name = modest_combo_box_get_active_id (MODEST_COMBO_BOX (priv->from_field));
1019 g_return_val_if_fail (account_name, NULL);
1022 /* don't free these (except from) */
1023 data = g_slice_new0 (MsgData);
1024 data->from = modest_account_mgr_get_from_string (modest_runtime_get_account_mgr(),
1026 data->account_name = g_strdup (account_name);
1027 data->to = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->to_field)));
1028 data->cc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->cc_field)));
1029 data->bcc = g_strdup (modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->bcc_field)));
1030 data->subject = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->subject_field)));
1031 if (priv->draft_msg) {
1032 data->draft_msg = g_object_ref (priv->draft_msg);
1034 data->draft_msg = NULL;
1037 GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body));
1039 gtk_text_buffer_get_bounds (buf, &b, &e);
1040 data->plain_body = g_strdup (gtk_text_buffer_get_text (priv->text_buffer, &b, &e, FALSE)); /* returns a copy */
1042 if (wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer)))
1043 data->html_body = get_formatted_data (edit_window); /* returns a copy. */
1045 data->html_body = NULL;
1047 data->attachments = priv->attachments; /* TODO: copy and free ? */
1048 data->priority_flags = priv->priority_flags;
1053 /* TODO: We must duplicate this implementation for GNOME and Maemo, but that is unwise. */
1055 modest_msg_edit_window_free_msg_data (ModestMsgEditWindow *edit_window,
1058 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (edit_window));
1066 g_free (data->subject);
1067 g_free (data->plain_body);
1068 g_free (data->html_body);
1069 if (data->draft_msg != NULL) {
1070 g_object_unref (data->draft_msg);
1071 data->draft_msg = NULL;
1073 g_free (data->account_name);
1075 /* TODO: Free data->attachments? */
1077 g_slice_free (MsgData, data);
1081 modest_msg_edit_window_get_format (ModestMsgEditWindow *self)
1084 ModestMsgEditWindowPrivate *priv = NULL;
1085 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self), MODEST_MSG_EDIT_FORMAT_HTML);
1087 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
1089 rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer));
1091 return MODEST_MSG_EDIT_FORMAT_HTML;
1093 return MODEST_MSG_EDIT_FORMAT_TEXT;
1097 modest_msg_edit_window_set_format (ModestMsgEditWindow *self,
1098 ModestMsgEditFormat format)
1100 ModestMsgEditWindowPrivate *priv;
1102 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self));
1103 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
1106 case MODEST_MSG_EDIT_FORMAT_HTML:
1107 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
1109 case MODEST_MSG_EDIT_FORMAT_TEXT:
1110 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), FALSE);
1113 g_return_if_reached ();
1117 ModestMsgEditFormatState *
1118 modest_msg_edit_window_get_format_state (ModestMsgEditWindow *self)
1120 ModestMsgEditFormatState *format_state = NULL;
1121 ModestMsgEditWindowPrivate *priv;
1122 WPTextBufferFormat *buffer_format = g_new0 (WPTextBufferFormat, 1);
1124 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self), NULL);
1125 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
1127 wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, TRUE);
1129 format_state = g_new0 (ModestMsgEditFormatState, 1);
1130 format_state->bold = buffer_format->bold&0x1;
1131 format_state->italics = buffer_format->italic&0x1;
1132 format_state->bullet = buffer_format->bullet&0x1;
1133 format_state->color = buffer_format->color;
1134 format_state->font_size = buffer_format->font_size;
1135 format_state->font_family = wp_get_font_name (buffer_format->font);
1136 format_state->justification = buffer_format->justification;
1137 g_free (buffer_format);
1139 return format_state;
1144 modest_msg_edit_window_set_format_state (ModestMsgEditWindow *self,
1145 const ModestMsgEditFormatState *format_state)
1147 ModestMsgEditWindowPrivate *priv;
1148 WPTextBufferFormat *buffer_format = g_new0 (WPTextBufferFormat, 1);
1149 WPTextBufferFormat *current_format = g_new0 (WPTextBufferFormat, 1);
1150 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self));
1151 g_return_if_fail (format_state != NULL);
1153 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (self);
1154 gtk_widget_grab_focus (priv->msg_body);
1155 buffer_format->bold = (format_state->bold != FALSE);
1156 buffer_format->italic = (format_state->italics != FALSE);
1157 buffer_format->color = format_state->color;
1158 buffer_format->font_size = format_state->font_size;
1159 buffer_format->font = wp_get_font_index (format_state->font_family, 0);
1160 buffer_format->justification = format_state->justification;
1161 buffer_format->bullet = format_state->bullet;
1163 wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), current_format, TRUE);
1165 buffer_format->cs.bold = ((buffer_format->bold&0x1) != (current_format->bold&0x1));
1166 buffer_format->cs.italic = ((buffer_format->italic&0x1) != (current_format->italic&0x1));
1167 buffer_format->cs.color = gdk_color_equal(&(buffer_format->color), &(current_format->color));
1168 buffer_format->cs.font_size = (buffer_format->font_size != current_format->font_size);
1169 buffer_format->cs.font = (buffer_format->font != current_format->font);
1170 buffer_format->cs.justification = (buffer_format->justification != current_format->justification);
1171 buffer_format->cs.bullet = (buffer_format->bullet != current_format->bullet);
1173 wp_text_buffer_freeze (WP_TEXT_BUFFER (priv->text_buffer));
1174 if (buffer_format->cs.bold) {
1175 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BOLD, (gpointer) (buffer_format->bold&0x1));
1177 if (buffer_format->cs.italic) {
1178 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_ITALIC, (gpointer) (buffer_format->italic&0x1));
1180 if (buffer_format->cs.color) {
1181 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR, (gpointer) (&(buffer_format->color)));
1183 if (buffer_format->cs.font_size) {
1184 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BOLD, (gpointer) (buffer_format->font_size));
1186 if (buffer_format->cs.justification) {
1187 switch (buffer_format->justification) {
1188 case GTK_JUSTIFY_LEFT:
1189 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_LEFT, (gpointer) TRUE);
1191 case GTK_JUSTIFY_CENTER:
1192 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_CENTER, (gpointer) TRUE);
1194 case GTK_JUSTIFY_RIGHT:
1195 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_RIGHT, (gpointer) TRUE);
1202 if (buffer_format->cs.font) {
1203 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BOLD, (gpointer) (buffer_format->font));
1205 if (buffer_format->cs.bullet) {
1206 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_BULLET, (gpointer) ((int)buffer_format->bullet));
1208 /* wp_text_buffer_set_format (WP_TEXT_BUFFER (priv->text_buffer), buffer_format); */
1209 wp_text_buffer_thaw (WP_TEXT_BUFFER (priv->text_buffer));
1211 g_free (current_format);
1216 toggle_action_set_active_block_notify (GtkToggleAction *action,
1219 GSList *proxies = NULL;
1221 for (proxies = gtk_action_get_proxies (GTK_ACTION (action));
1222 proxies != NULL; proxies = g_slist_next (proxies)) {
1223 GtkWidget *widget = (GtkWidget *) proxies->data;
1224 gtk_action_block_activate_from (GTK_ACTION (action), widget);
1227 gtk_toggle_action_set_active (action, value);
1229 for (proxies = gtk_action_get_proxies (GTK_ACTION (action));
1230 proxies != NULL; proxies = g_slist_next (proxies)) {
1231 GtkWidget *widget = (GtkWidget *) proxies->data;
1232 gtk_action_unblock_activate_from (GTK_ACTION (action), widget);
1237 text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *window)
1239 WPTextBufferFormat *buffer_format = g_new0 (WPTextBufferFormat, 1);
1241 ModestWindowPrivate *parent_priv;
1242 ModestMsgEditWindowPrivate *priv;
1243 GtkWidget *new_size_menuitem;
1244 GtkWidget *new_font_menuitem;
1246 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1247 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1249 if (wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer))) {
1250 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/FileFormatMenu/FileFormatFormattedTextMenu");
1251 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
1252 toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), TRUE);
1254 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/FileFormatMenu/FileFormatPlainTextMenu");
1255 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
1256 toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), TRUE);
1259 wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, FALSE);
1261 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsBold");
1262 toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), buffer_format->bold);
1264 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
1265 toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), buffer_format->italic);
1267 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu");
1268 toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), buffer_format->bullet);
1270 g_signal_handlers_block_by_func (G_OBJECT (priv->font_color_button),
1271 G_CALLBACK (modest_msg_edit_window_color_button_change),
1273 hildon_color_button_set_color (HILDON_COLOR_BUTTON (priv->font_color_button), & (buffer_format->color));
1274 g_signal_handlers_unblock_by_func (G_OBJECT (priv->font_color_button),
1275 G_CALLBACK (modest_msg_edit_window_color_button_change),
1278 new_size_menuitem = GTK_WIDGET ((g_slist_nth (priv->size_items_group,
1279 buffer_format->font_size))->data);
1280 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (new_size_menuitem))) {
1284 label = gtk_bin_get_child (GTK_BIN (new_size_menuitem));
1285 markup = g_strconcat ("<span font_family='Serif'>", gtk_label_get_text (GTK_LABEL (label)), "</span>", NULL);
1286 gtk_label_set_markup (GTK_LABEL (priv->size_tool_button_label), markup);
1288 g_signal_handlers_block_by_func (G_OBJECT (new_size_menuitem),
1289 G_CALLBACK (modest_msg_edit_window_size_change),
1291 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_size_menuitem), TRUE);
1292 g_signal_handlers_unblock_by_func (G_OBJECT (new_size_menuitem),
1293 G_CALLBACK (modest_msg_edit_window_size_change),
1297 new_font_menuitem = GTK_WIDGET ((g_slist_nth (priv->font_items_group,
1298 buffer_format->font))->data);
1299 if (!gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (new_font_menuitem))) {
1303 label = gtk_bin_get_child (GTK_BIN (new_font_menuitem));
1304 markup = g_strconcat ("<span font_family='", gtk_label_get_text (GTK_LABEL (label)),"'>Tt</span>", NULL);
1305 gtk_label_set_markup (GTK_LABEL (priv->font_tool_button_label), markup);
1307 g_signal_handlers_block_by_func (G_OBJECT (new_font_menuitem),
1308 G_CALLBACK (modest_msg_edit_window_font_change),
1310 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (new_font_menuitem), TRUE);
1311 g_signal_handlers_unblock_by_func (G_OBJECT (new_font_menuitem),
1312 G_CALLBACK (modest_msg_edit_window_font_change),
1316 g_free (buffer_format);
1322 modest_msg_edit_window_select_color (ModestMsgEditWindow *window)
1325 WPTextBufferFormat *buffer_format = g_new0 (WPTextBufferFormat, 1);
1326 ModestMsgEditWindowPrivate *priv;
1327 GtkWidget *dialog = NULL;
1329 const GdkColor *new_color = NULL;
1331 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1332 wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), buffer_format, FALSE);
1334 #ifdef MODEST_HILDON_VERSION_0
1335 dialog = hildon_color_selector_new (GTK_WINDOW (window));
1336 hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog), &(buffer_format->color));
1338 dialog = hildon_color_chooser_new ();
1339 hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog), &(buffer_format->color));
1340 #endif /*MODEST_HILDON_VERSION_0*/
1341 g_free (buffer_format);
1343 response = gtk_dialog_run (GTK_DIALOG (dialog));
1345 case GTK_RESPONSE_OK: {
1346 #ifdef MODEST_HILDON_VERSION_0
1347 new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog));
1350 hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col);
1352 #endif /*MODEST_HILDON_VERSION_0*/
1359 gtk_widget_destroy (dialog);
1361 if (new_color != NULL)
1362 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR, (gpointer) new_color);
1367 modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window)
1370 ModestMsgEditWindowPrivate *priv;
1371 GtkWidget *dialog = NULL;
1373 GdkColor *old_color = NULL;
1374 const GdkColor *new_color = NULL;
1376 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1377 old_color = (GdkColor*)wp_text_buffer_get_background_color (WP_TEXT_BUFFER (priv->text_buffer));
1379 #ifdef MODEST_HILDON_VERSION_0
1380 dialog = hildon_color_selector_new (GTK_WINDOW (window));
1381 hildon_color_selector_set_color (HILDON_COLOR_SELECTOR (dialog),(GdkColor*)old_color);
1383 dialog = hildon_color_chooser_new ();
1384 hildon_color_chooser_set_color (HILDON_COLOR_CHOOSER (dialog),(GdkColor*)old_color);
1385 #endif /*MODEST_HILDON_VERSION_9*/
1387 response = gtk_dialog_run (GTK_DIALOG (dialog));
1389 case GTK_RESPONSE_OK: {
1390 #ifdef MODEST_HILDON_VERSION_0
1391 new_color = hildon_color_selector_get_color (HILDON_COLOR_SELECTOR (dialog));
1394 hildon_color_chooser_get_color (HILDON_COLOR_CHOOSER(dialog), &col);
1396 #endif /*MODEST_HILDON_VERSION_0*/
1402 gtk_widget_destroy (dialog);
1404 if (new_color != NULL)
1405 wp_text_buffer_set_background_color (WP_TEXT_BUFFER (priv->text_buffer), new_color);
1411 modest_msg_edit_window_insert_image (ModestMsgEditWindow *window)
1414 ModestMsgEditWindowPrivate *priv;
1415 GtkWidget *dialog = NULL;
1417 GSList *uris = NULL;
1418 GSList *uri_node = NULL;
1420 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1422 dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN);
1423 gtk_window_set_title (GTK_WINDOW (dialog), _("mcen_ia_select_inline_image_title"));
1424 gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
1426 modest_maemo_utils_setup_images_filechooser (GTK_FILE_CHOOSER (dialog));
1428 response = gtk_dialog_run (GTK_DIALOG (dialog));
1430 case GTK_RESPONSE_OK:
1431 uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
1436 gtk_widget_destroy (dialog);
1438 for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) {
1440 GnomeVFSHandle *handle = NULL;
1441 GnomeVFSResult result;
1442 GtkTextIter position;
1443 GtkTextMark *insert_mark;
1445 uri = (const gchar *) uri_node->data;
1446 result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
1447 if (result == GNOME_VFS_OK) {
1448 GdkPixbufLoader *loader;
1450 GnomeVFSFileInfo info;
1451 gchar *filename, *basename;
1452 TnyMimePart *mime_part;
1455 const gchar *mime_type = NULL;
1457 filename = g_filename_from_uri (uri, NULL, NULL);
1458 if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE)
1460 mime_type = gnome_vfs_file_info_get_mime_type (&info);
1462 mime_part = tny_platform_factory_new_mime_part
1463 (modest_runtime_get_platform_factory ());
1464 stream = TNY_STREAM (tny_vfs_stream_new (handle));
1466 tny_mime_part_construct_from_stream (mime_part, stream, mime_type);
1468 content_id = g_strdup_printf ("%d", priv->last_cid);
1469 tny_mime_part_set_content_id (mime_part, content_id);
1470 g_free (content_id);
1473 basename = g_path_get_basename (filename);
1474 tny_mime_part_set_filename (mime_part, basename);
1477 priv->attachments = g_list_prepend (priv->attachments, mime_part);
1478 modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
1480 gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
1481 gtk_widget_show_all (priv->attachments_caption);
1482 gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
1485 loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, NULL);
1486 while (!tny_stream_is_eos (TNY_STREAM (stream))) {
1487 char read_buffer[128];
1489 readed = tny_stream_read (TNY_STREAM (stream), read_buffer, 128);
1490 if (!gdk_pixbuf_loader_write (loader, read_buffer, readed, NULL))
1493 pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
1494 g_object_ref (pixbuf);
1495 gdk_pixbuf_loader_close (loader, NULL);
1496 g_object_unref (loader);
1498 if (gdk_pixbuf_get_width (pixbuf) > IMAGE_MAX_WIDTH) {
1499 GdkPixbuf *new_pixbuf;
1501 new_height = (gdk_pixbuf_get_height (pixbuf) * IMAGE_MAX_WIDTH) /
1502 gdk_pixbuf_get_width (pixbuf);
1503 new_pixbuf = gdk_pixbuf_scale_simple (pixbuf, IMAGE_MAX_WIDTH, new_height, GDK_INTERP_BILINEAR);
1504 g_object_unref (pixbuf);
1505 pixbuf = new_pixbuf;
1508 if (pixbuf != NULL) {
1509 insert_mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer));
1510 gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (priv->text_buffer), &position, insert_mark);
1511 wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (mime_part)), pixbuf);
1520 modest_msg_edit_window_attach_file (ModestMsgEditWindow *window)
1523 ModestMsgEditWindowPrivate *priv;
1524 GtkWidget *dialog = NULL;
1526 GSList *uris = NULL;
1529 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1531 dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN);
1532 gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
1534 response = gtk_dialog_run (GTK_DIALOG (dialog));
1536 case GTK_RESPONSE_OK:
1537 uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
1542 gtk_widget_destroy (dialog);
1544 for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) {
1546 GnomeVFSHandle *handle = NULL;
1547 GnomeVFSResult result;
1549 uri = (const gchar *) uri_node->data;
1550 result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ);
1551 if (result == GNOME_VFS_OK) {
1552 TnyMimePart *mime_part;
1554 const gchar *mime_type = NULL;
1558 GnomeVFSFileInfo info;
1560 filename = g_filename_from_uri (uri, NULL, NULL);
1562 if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == GNOME_VFS_OK)
1563 mime_type = gnome_vfs_file_info_get_mime_type (&info);
1564 mime_part = tny_platform_factory_new_mime_part
1565 (modest_runtime_get_platform_factory ());
1566 stream = TNY_STREAM (tny_vfs_stream_new (handle));
1568 tny_mime_part_construct_from_stream (mime_part, stream, mime_type);
1570 content_id = g_strdup_printf ("%d", priv->last_cid);
1571 tny_mime_part_set_content_id (mime_part, content_id);
1572 g_free (content_id);
1575 basename = g_path_get_basename (filename);
1576 tny_mime_part_set_filename (mime_part, basename);
1579 priv->attachments = g_list_prepend (priv->attachments, mime_part);
1580 modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
1582 gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
1583 gtk_widget_show_all (priv->attachments_caption);
1584 gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
1589 g_slist_foreach (uris, (GFunc) g_free, NULL);
1590 g_slist_free (uris);
1594 modest_msg_edit_window_attach_file_noninteractive (
1595 ModestMsgEditWindow *window,
1596 const gchar *file_uri)
1599 ModestMsgEditWindowPrivate *priv;
1601 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1606 /* TODO: We should probably try to use only the URI,
1607 * instead of using a filename.
1609 gchar* filename = g_filename_from_uri (file_uri, NULL, NULL);
1611 g_warning("%s: g_filename_from_uri(%s) failed.\n", __FUNCTION__, file_uri);
1614 file_id = g_open (filename, O_RDONLY, 0);
1615 if (file_id != -1) {
1616 TnyMimePart *mime_part;
1618 const gchar *mime_type;
1621 #ifdef MODEST_HAVE_HILDON0_WIDGETS
1622 mime_type = gnome_vfs_get_mime_type(filename);
1624 mime_type = gnome_vfs_get_file_mime_type_fast (filename, NULL);
1626 mime_part = tny_platform_factory_new_mime_part
1627 (modest_runtime_get_platform_factory ());
1628 stream = TNY_STREAM (tny_fs_stream_new (file_id));
1630 tny_mime_part_construct_from_stream (mime_part, stream, mime_type);
1632 content_id = g_strdup_printf ("%d", priv->last_cid);
1633 tny_mime_part_set_content_id (mime_part, content_id);
1634 g_free (content_id);
1637 basename = g_path_get_basename (filename);
1638 tny_mime_part_set_filename (mime_part, basename);
1641 priv->attachments = g_list_prepend (priv->attachments, mime_part);
1642 modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
1644 gtk_widget_set_no_show_all (priv->attachments_caption, FALSE);
1645 gtk_widget_show_all (priv->attachments_caption);
1646 } else if (file_id == -1) {
1648 g_warning("file to be attached does not exist: %s", filename);
1656 modest_msg_edit_window_remove_attachments (ModestMsgEditWindow *window,
1659 ModestMsgEditWindowPrivate *priv;
1660 gboolean clean_list = FALSE;
1662 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1663 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1665 if (att_list == NULL) {
1666 att_list = modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
1670 if (att_list == NULL) {
1671 hildon_banner_show_information (NULL, NULL, _("TODO: no attachments selected to remove"));
1673 GtkWidget *confirmation_dialog = NULL;
1674 gboolean dialog_response;
1676 gchar *message = NULL;
1677 const gchar *filename = NULL;
1679 if (att_list->next == NULL) {
1680 filename = tny_mime_part_get_filename (TNY_MIME_PART (att_list->data));
1684 message = g_strdup_printf (ngettext("emev_nc_delete_attachment", "emev_nc_delete_attachments",
1685 att_list->next == NULL), filename);
1686 confirmation_dialog = hildon_note_new_confirmation (GTK_WINDOW (window), message);
1688 dialog_response = (gtk_dialog_run (GTK_DIALOG (confirmation_dialog))==GTK_RESPONSE_OK);
1689 gtk_widget_destroy (confirmation_dialog);
1690 if (!dialog_response) {
1692 g_list_free (att_list);
1695 hildon_banner_show_information (NULL, NULL, _("mcen_ib_removing_attachment"));
1697 for (node = att_list; node != NULL; node = g_list_next (node)) {
1698 TnyMimePart *mime_part = (TnyMimePart *) node->data;
1699 const gchar *att_id;
1700 priv->attachments = g_list_remove (priv->attachments, mime_part);
1702 modest_attachments_view_remove_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
1704 if (priv->attachments == NULL)
1705 gtk_widget_hide (priv->attachments_caption);
1706 att_id = tny_mime_part_get_content_id (mime_part);
1708 text_buffer_delete_images_by_id (gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->msg_body)),
1710 g_object_unref (mime_part);
1711 gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
1716 g_list_free (att_list);
1720 modest_msg_edit_window_color_button_change (ModestMsgEditWindow *window,
1723 ModestMsgEditWindowPrivate *priv;
1724 GdkColor *new_color;
1725 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1727 #ifdef MODEST_HAVE_HILDON0_WIDGETS
1728 new_color = hildon_color_button_get_color (HILDON_COLOR_BUTTON (priv->font_color_button));
1731 hildon_color_button_get_color (HILDON_COLOR_BUTTON(priv->font_color_button), &col);
1733 #endif /*#ifdef MODEST_HAVE_HILDON0_WIDGETS*/
1735 wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FORECOLOR, (gpointer) new_color);
1737 gtk_window_set_focus (GTK_WINDOW (window), priv->msg_body);
1742 modest_msg_edit_window_size_change (GtkCheckMenuItem *menu_item,
1745 ModestMsgEditWindowPrivate *priv;
1746 gint new_size_index;
1747 ModestMsgEditWindow *window;
1750 window = MODEST_MSG_EDIT_WINDOW (userdata);
1751 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1752 gtk_widget_grab_focus (GTK_WIDGET (priv->msg_body));
1754 if (gtk_check_menu_item_get_active (menu_item)) {
1756 WPTextBufferFormat format;
1758 memset (&format, 0, sizeof (format));
1759 wp_text_buffer_get_current_state (WP_TEXT_BUFFER (priv->text_buffer), &format);
1761 label = gtk_bin_get_child (GTK_BIN (menu_item));
1763 new_size_index = atoi (gtk_label_get_text (GTK_LABEL (label)));
1764 format.cs.font_size = TRUE;
1765 format.cs.text_position = TRUE;
1766 format.cs.font = TRUE;
1767 format.font_size = wp_get_font_size_index (new_size_index, DEFAULT_FONT_SIZE);
1768 wp_text_buffer_set_format (WP_TEXT_BUFFER (priv->text_buffer), &format);
1770 /* if (!wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FONT_SIZE, */
1771 /* (gpointer) wp_get_font_size_index (new_size_index, 12))) */
1772 /* wp_text_view_reset_and_show_im (WP_TEXT_VIEW (priv->msg_body)); */
1774 text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (window));
1775 markup = g_strconcat ("<span font_family='Serif'>", gtk_label_get_text (GTK_LABEL (label)), "</span>", NULL);
1776 gtk_label_set_markup (GTK_LABEL (priv->size_tool_button_label), markup);
1782 modest_msg_edit_window_font_change (GtkCheckMenuItem *menu_item,
1785 ModestMsgEditWindowPrivate *priv;
1786 gint new_font_index;
1787 ModestMsgEditWindow *window;
1790 window = MODEST_MSG_EDIT_WINDOW (userdata);
1791 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1792 gtk_widget_grab_focus (GTK_WIDGET (priv->msg_body));
1794 if (gtk_check_menu_item_get_active (menu_item)) {
1797 label = gtk_bin_get_child (GTK_BIN (menu_item));
1799 new_font_index = wp_get_font_index (gtk_label_get_text (GTK_LABEL (label)), DEFAULT_FONT);
1801 if (!wp_text_buffer_set_attribute (WP_TEXT_BUFFER (priv->text_buffer), WPT_FONT,
1802 (gpointer) new_font_index))
1803 wp_text_view_reset_and_show_im (WP_TEXT_VIEW (priv->msg_body));
1805 text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (window));
1806 markup = g_strconcat ("<span font_family='",gtk_label_get_text (GTK_LABEL (label)),"'>Tt</span>", NULL);
1807 gtk_label_set_markup (GTK_LABEL (priv->font_tool_button_label), markup);
1813 modest_msg_edit_window_set_zoom (ModestWindow *window,
1816 ModestMsgEditWindowPrivate *priv;
1817 ModestWindowPrivate *parent_priv;
1818 GtkRadioAction *zoom_radio_action;
1820 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1822 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1823 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1824 priv->zoom_level = zoom;
1825 wp_text_buffer_set_font_scaling_factor (WP_TEXT_BUFFER (priv->text_buffer), zoom);
1827 /* Zoom level menu options should be updated with the current zoom level */
1828 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1829 zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
1830 "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
1831 #ifdef MODEST_HAVE_HILDON0_WIDGETS
1832 /* FIXME: Not availible before Gtk 2.10 */
1834 gtk_radio_action_set_current_value (zoom_radio_action, (gint) (zoom*100.0+0.1));
1839 modest_msg_edit_window_get_zoom (ModestWindow *window)
1841 ModestMsgEditWindowPrivate *priv;
1843 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), 1.0);
1845 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1846 return priv->zoom_level;
1850 zoom_allowed (ModestMsgEditWindow *window)
1854 focus = gtk_window_get_focus (GTK_WINDOW (window));
1855 return (focus != NULL && WP_IS_TEXT_VIEW (focus));
1859 modest_msg_edit_window_zoom_plus (ModestWindow *window)
1861 ModestWindowPrivate *parent_priv;
1862 GtkRadioAction *zoom_radio_action;
1863 GSList *group, *node;
1865 /* First we check if the text view is focused. If not, zooming is not allowed */
1866 if (!zoom_allowed (MODEST_MSG_EDIT_WINDOW (window))) {
1867 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here"));
1871 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1872 zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
1873 "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
1875 group = gtk_radio_action_get_group (zoom_radio_action);
1877 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) {
1878 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_max_zoom_level_reached"));
1882 for (node = group; node != NULL; node = g_slist_next (node)) {
1883 if ((node->next != NULL) && gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->next->data))) {
1884 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->data), TRUE);
1892 modest_msg_edit_window_zoom_minus (ModestWindow *window)
1894 ModestWindowPrivate *parent_priv;
1895 GtkRadioAction *zoom_radio_action;
1896 GSList *group, *node;
1898 /* First we check if the text view is focused. If not, zooming is not allowed */
1899 if (!zoom_allowed (MODEST_MSG_EDIT_WINDOW (window))) {
1900 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here"));
1904 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1905 zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager,
1906 "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu"));
1908 group = gtk_radio_action_get_group (zoom_radio_action);
1910 for (node = group; node != NULL; node = g_slist_next (node)) {
1911 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (node->data))) {
1912 if (node->next != NULL) {
1913 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE);
1916 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached"));
1924 modest_msg_edit_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata)
1926 if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) {
1927 ModestWindowPrivate *parent_priv;
1928 ModestWindowMgr *mgr;
1929 gboolean is_fullscreen;
1930 GtkAction *fs_toggle_action;
1933 mgr = modest_runtime_get_window_mgr ();
1934 is_fullscreen = (modest_window_mgr_get_fullscreen_mode (mgr))?1:0;
1936 parent_priv = MODEST_WINDOW_GET_PRIVATE (widget);
1938 fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
1939 active = (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action)))?1:0;
1940 if (is_fullscreen != active)
1941 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), is_fullscreen);
1949 modest_msg_edit_window_toggle_fullscreen (ModestMsgEditWindow *window)
1951 ModestWindowPrivate *parent_priv;
1952 GtkAction *fs_toggle_action;
1955 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
1957 fs_toggle_action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewToggleFullscreenMenu");
1958 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (fs_toggle_action));
1959 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (fs_toggle_action), !active);
1963 modest_msg_edit_window_show_cc (ModestMsgEditWindow *window,
1966 ModestMsgEditWindowPrivate *priv = NULL;
1967 const gchar *recipients;
1968 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1970 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1971 gtk_widget_set_no_show_all (priv->cc_caption, TRUE);
1972 recipients = modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->cc_field));
1973 if ((show) || ((recipients != NULL) && (recipients[0] != '\0')))
1974 gtk_widget_show (priv->cc_caption);
1976 gtk_widget_hide (priv->cc_caption);
1977 modest_conf_set_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, show, NULL);
1981 modest_msg_edit_window_show_bcc (ModestMsgEditWindow *window,
1984 ModestMsgEditWindowPrivate *priv = NULL;
1985 const gchar *recipients;
1986 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
1988 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
1989 gtk_widget_set_no_show_all (priv->bcc_caption, TRUE);
1990 recipients = modest_recpt_editor_get_recipients (MODEST_RECPT_EDITOR (priv->bcc_field));
1991 if ((show) || ((recipients != NULL) && (recipients[0] != '\0')))
1992 gtk_widget_show (priv->bcc_caption);
1994 gtk_widget_hide (priv->bcc_caption);
1995 modest_conf_set_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, show, NULL);
1999 modest_msg_edit_window_open_addressbook (ModestMsgEditWindow *window,
2000 ModestRecptEditor *editor)
2002 ModestMsgEditWindowPrivate *priv;
2004 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2005 g_return_if_fail ((editor == NULL) || (MODEST_IS_RECPT_EDITOR (editor)));
2006 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2008 if (editor == NULL) {
2009 GtkWidget *view_focus;
2010 view_focus = gtk_window_get_focus (GTK_WINDOW (window));
2012 /* This code should be kept in sync with ModestRecptEditor. The
2013 textview inside the recpt editor is the one that really gets the
2014 focus. As it's inside a scrolled window, and this one inside the
2015 hbox recpt editor inherits from, we'll need to go up in the
2016 hierarchy to know if the text view is part of the recpt editor
2017 or if it's a different text entry */
2019 if (gtk_widget_get_parent (view_focus)) {
2020 GtkWidget *first_parent;
2022 first_parent = gtk_widget_get_parent (view_focus);
2023 if (gtk_widget_get_parent (first_parent) &&
2024 MODEST_IS_RECPT_EDITOR (gtk_widget_get_parent (first_parent))) {
2025 editor = MODEST_RECPT_EDITOR (gtk_widget_get_parent (first_parent));
2030 editor = MODEST_RECPT_EDITOR (priv->to_field);
2034 modest_address_book_select_addresses (editor);
2039 modest_msg_edit_window_select_contacts (ModestMsgEditWindow *window)
2041 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2043 modest_msg_edit_window_open_addressbook (window, NULL);
2047 modest_msg_edit_window_show_toolbar (ModestWindow *self,
2048 gboolean show_toolbar)
2050 ModestWindowPrivate *parent_priv;
2052 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (self));
2053 parent_priv = MODEST_WINDOW_GET_PRIVATE(self);
2055 /* FIXME: we can not just use the code of
2056 modest_msg_edit_window_setup_toolbar because it has a
2057 mixture of both initialization and creation code. */
2060 gtk_widget_show (GTK_WIDGET (parent_priv->toolbar));
2062 gtk_widget_hide (GTK_WIDGET (parent_priv->toolbar));
2066 modest_msg_edit_window_set_priority_flags (ModestMsgEditWindow *window,
2067 TnyHeaderFlags priority_flags)
2069 ModestMsgEditWindowPrivate *priv;
2070 ModestWindowPrivate *parent_priv;
2072 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2074 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2075 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2076 priority_flags = priority_flags & (TNY_HEADER_FLAG_PRIORITY);
2078 if (priv->priority_flags != priority_flags) {
2079 GtkAction *priority_action = NULL;
2081 priv->priority_flags = priority_flags;
2083 switch (priority_flags) {
2084 case TNY_HEADER_FLAG_HIGH_PRIORITY:
2085 gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), "qgn_list_messaging_high", GTK_ICON_SIZE_MENU);
2086 gtk_widget_show (priv->priority_icon);
2087 priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager,
2088 "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityHighMenu");
2090 case TNY_HEADER_FLAG_LOW_PRIORITY:
2091 gtk_image_set_from_icon_name (GTK_IMAGE (priv->priority_icon), "qgn_list_messaging_low", GTK_ICON_SIZE_MENU);
2092 gtk_widget_show (priv->priority_icon);
2093 priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager,
2094 "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityLowMenu");
2097 gtk_widget_hide (priv->priority_icon);
2098 priority_action = gtk_ui_manager_get_action (parent_priv->ui_manager,
2099 "/MenuBar/ToolsMenu/MessagePriorityMenu/MessagePriorityNormalMenu");
2102 gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (priority_action), TRUE);
2103 gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
2108 modest_msg_edit_window_set_file_format (ModestMsgEditWindow *window,
2111 ModestMsgEditWindowPrivate *priv;
2112 gint current_format;
2114 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2116 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2118 current_format = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer))
2119 ? MODEST_FILE_FORMAT_FORMATTED_TEXT : MODEST_FILE_FORMAT_PLAIN_TEXT;
2121 if (current_format != file_format) {
2122 switch (file_format) {
2123 case MODEST_FILE_FORMAT_FORMATTED_TEXT:
2124 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), TRUE);
2126 case MODEST_FILE_FORMAT_PLAIN_TEXT:
2130 dialog = hildon_note_new_confirmation (NULL, _("emev_nc_formatting_lost"));
2131 response = gtk_dialog_run (GTK_DIALOG (dialog));
2132 gtk_widget_destroy (dialog);
2133 if (response == GTK_RESPONSE_OK)
2134 wp_text_buffer_enable_rich_text (WP_TEXT_BUFFER (priv->text_buffer), FALSE);
2138 update_dimmed (window);
2143 modest_msg_edit_window_select_font (ModestMsgEditWindow *window)
2146 ModestMsgEditWindowPrivate *priv;
2147 WPTextBufferFormat oldfmt, fmt;
2148 gint old_position = 0;
2152 GdkColor *color = NULL;
2153 gboolean bold, bold_set, italic, italic_set;
2154 gboolean underline, underline_set;
2155 gboolean strikethrough, strikethrough_set;
2156 gboolean position_set;
2157 gboolean font_size_set, font_set, color_set;
2160 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2161 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2163 dialog = hildon_font_selection_dialog_new (GTK_WINDOW (window), NULL);
2165 /* First we get the currently selected font information */
2166 wp_text_buffer_get_attributes (WP_TEXT_BUFFER (priv->text_buffer), &oldfmt, TRUE);
2167 g_object_set (G_OBJECT (dialog), "font-scaling", priv->zoom_level, NULL);
2169 switch (oldfmt.text_position) {
2170 case TEXT_POSITION_NORMAL:
2173 case TEXT_POSITION_SUPERSCRIPT:
2181 g_object_set (G_OBJECT (dialog),
2182 "bold", oldfmt.bold != FALSE,
2183 "bold-set", !oldfmt.cs.bold,
2184 "underline", oldfmt.underline != FALSE,
2185 "underline-set", !oldfmt.cs.underline,
2186 "italic", oldfmt.italic != FALSE,
2187 "italic-set", !oldfmt.cs.italic,
2188 "strikethrough", oldfmt.strikethrough != FALSE,
2189 "strikethrough-set", !oldfmt.cs.strikethrough,
2190 "color", &oldfmt.color,
2191 "color-set", !oldfmt.cs.color,
2192 "size", wp_font_size[oldfmt.font_size],
2193 "size-set", !oldfmt.cs.font_size,
2194 "position", old_position,
2195 "position-set", !oldfmt.cs.text_position,
2196 "family", wp_get_font_name (oldfmt.font),
2197 "family-set", !oldfmt.cs.font,
2200 gtk_widget_show_all (dialog);
2201 response = gtk_dialog_run (GTK_DIALOG (dialog));
2202 if (response == GTK_RESPONSE_OK) {
2204 g_object_get( dialog,
2206 "bold-set", &bold_set,
2207 "underline", &underline,
2208 "underline-set", &underline_set,
2210 "italic-set", &italic_set,
2211 "strikethrough", &strikethrough,
2212 "strikethrough-set", &strikethrough_set,
2214 "color-set", &color_set,
2216 "size-set", &font_size_set,
2217 "family", &font_name,
2218 "family-set", &font_set,
2219 "position", &position,
2220 "position-set", &position_set,
2225 if (response == GTK_RESPONSE_OK) {
2226 memset(&fmt, 0, sizeof(fmt));
2232 fmt.italic = italic;
2233 fmt.cs.italic = TRUE;
2235 if (underline_set) {
2236 fmt.underline = underline;
2237 fmt.cs.underline = TRUE;
2239 if (strikethrough_set) {
2240 fmt.strikethrough = strikethrough;
2241 fmt.cs.strikethrough = TRUE;
2246 ? TEXT_POSITION_NORMAL
2247 : ( ( position == 1 )
2248 ? TEXT_POSITION_SUPERSCRIPT
2249 : TEXT_POSITION_SUBSCRIPT );
2250 fmt.cs.text_position = TRUE;
2254 fmt.cs.color = TRUE;
2257 fmt.font = wp_get_font_index(font_name,
2262 if (font_size_set) {
2263 fmt.font_size = wp_get_font_size_index(
2264 font_size, DEFAULT_FONT_SIZE);
2265 fmt.cs.font_size = TRUE;
2267 wp_text_buffer_set_format(WP_TEXT_BUFFER(priv->text_buffer), &fmt);
2269 gtk_widget_destroy (dialog);
2271 gtk_widget_grab_focus(GTK_WIDGET(priv->msg_body));
2275 modest_msg_edit_window_undo (ModestMsgEditWindow *window)
2277 ModestMsgEditWindowPrivate *priv;
2279 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2280 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2282 wp_text_buffer_undo (WP_TEXT_BUFFER (priv->text_buffer));
2284 update_dimmed (window);
2289 update_dimmed (ModestMsgEditWindow *window)
2291 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2292 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2296 gboolean editor_focused;
2298 rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer));
2299 editor_focused = gtk_widget_is_focus (priv->msg_body);
2301 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/SelectFontMenu");
2302 gtk_action_set_sensitive (action, rich_text && editor_focused);
2303 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu");
2304 gtk_action_set_sensitive (action, rich_text && editor_focused);
2305 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu");
2306 gtk_action_set_sensitive (action, rich_text && editor_focused);
2307 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentLeftMenu");
2308 gtk_action_set_sensitive (action, rich_text && editor_focused);
2309 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentCenterMenu");
2310 gtk_action_set_sensitive (action, rich_text && editor_focused);
2311 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentRightMenu");
2312 gtk_action_set_sensitive (action, rich_text && editor_focused);
2313 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/InsertImageMenu");
2314 gtk_action_set_sensitive (action, rich_text && editor_focused);
2315 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsBold");
2316 gtk_action_set_sensitive (action, rich_text && editor_focused);
2317 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
2318 gtk_action_set_sensitive (action, rich_text && editor_focused);
2319 widget = priv->font_color_button;
2320 gtk_widget_set_sensitive (widget, rich_text && editor_focused);
2321 widget = priv->font_size_toolitem;
2322 gtk_widget_set_sensitive (widget, rich_text && editor_focused);
2323 widget = priv->font_face_toolitem;
2324 gtk_widget_set_sensitive (widget, rich_text && editor_focused);
2328 setup_insensitive_handlers (ModestMsgEditWindow *window)
2330 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2331 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2334 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSend");
2335 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (send_insensitive_press), window);
2336 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/EmailMenu/SendMenu");
2337 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (send_insensitive_press), window);
2339 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/SelectFontMenu");
2340 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2341 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu");
2342 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2343 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu");
2344 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2345 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentLeftMenu");
2346 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2347 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentCenterMenu");
2348 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2349 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentRightMenu");
2350 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2351 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/InsertImageMenu");
2352 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2353 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsBold");
2354 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2355 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
2356 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2357 widget = priv->font_color_button;
2358 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2359 widget = priv->font_size_toolitem;
2360 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2361 widget = priv->font_face_toolitem;
2362 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
2364 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu");
2365 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (remove_attachment_insensitive_press), window);
2366 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu");
2367 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (zoom_insensitive_press), window);
2369 widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/EditMenu/PasteMenu");
2370 g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (paste_insensitive_press), window);
2374 text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window)
2376 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2379 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/UndoMenu");
2380 gtk_action_set_sensitive (action, can_undo);
2384 text_buffer_delete_images_by_id (GtkTextBuffer *buffer, const gchar * image_id)
2387 GtkTextIter match_start, match_end;
2389 if (image_id == NULL)
2392 gtk_text_buffer_get_start_iter (buffer, &iter);
2394 while (gtk_text_iter_forward_search (&iter, "\xef\xbf\xbc", 0, &match_start, &match_end, NULL)) {
2395 GSList *tags = gtk_text_iter_get_tags (&match_start);
2397 for (node = tags; node != NULL; node = g_slist_next (node)) {
2398 GtkTextTag *tag = (GtkTextTag *) node->data;
2399 if (g_object_get_data (G_OBJECT (tag), "image-set") != NULL) {
2400 gchar *cur_image_id = g_object_get_data (G_OBJECT (tag), "image-index");
2401 if ((cur_image_id != NULL) && (strcmp (image_id, cur_image_id)==0)) {
2403 offset = gtk_text_iter_get_offset (&match_start);
2404 gtk_text_buffer_delete (buffer, &match_start, &match_end);
2405 gtk_text_buffer_get_iter_at_offset (buffer, &iter, offset);
2409 gtk_text_iter_forward_char (&iter);
2414 text_buffer_delete_range (GtkTextBuffer *buffer, GtkTextIter *start, GtkTextIter *end, gpointer userdata)
2416 ModestMsgEditWindow *window = (ModestMsgEditWindow *) userdata;
2417 GtkTextIter real_start, real_end;
2418 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2420 if (gtk_text_iter_compare (start, end) > 0) {
2424 real_start = *start;
2428 GSList *tags = gtk_text_iter_get_tags (&real_start);
2430 for (node = tags; node != NULL; node = g_slist_next (node)) {
2431 GtkTextTag *tag = (GtkTextTag *) node->data;
2432 if (g_object_get_data (G_OBJECT (tag), "image-set") != NULL) {
2433 gchar *image_id = g_object_get_data (G_OBJECT (tag), "image-index");
2435 modest_attachments_view_remove_attachment_by_id (MODEST_ATTACHMENTS_VIEW (priv->attachments_view),
2437 gtk_text_buffer_remove_tag (buffer, tag, start, end);
2440 } while (gtk_text_iter_forward_char (&real_start)&&
2441 (gtk_text_iter_compare (&real_start, &real_end)<=0));
2445 msg_body_focus (GtkWidget *focus,
2446 GdkEventFocus *event,
2450 update_dimmed (MODEST_MSG_EDIT_WINDOW (userdata));
2455 recpt_field_changed (GtkTextBuffer *buffer,
2456 ModestMsgEditWindow *editor)
2458 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (editor);
2459 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
2460 GtkTextBuffer *to_buffer, *cc_buffer, *bcc_buffer;
2461 gboolean dim = FALSE;
2464 to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field));
2465 cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field));
2466 bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field));
2468 dim = ((gtk_text_buffer_get_char_count (to_buffer) +
2469 gtk_text_buffer_get_char_count (cc_buffer) +
2470 gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
2472 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSend");
2473 gtk_action_set_sensitive (action, !dim);
2474 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EmailMenu/SendMenu");
2475 gtk_action_set_sensitive (action, !dim);
2479 send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
2481 hildon_banner_show_information (NULL, NULL, _("mcen_ib_add_recipients_first"));
2485 zoom_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
2487 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here"));
2491 remove_attachment_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
2493 ModestWindowPrivate *parent_priv;
2494 ModestMsgEditWindowPrivate *priv;
2495 GList *selected_attachments = NULL;
2496 gint n_att_selected = 0;
2498 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
2499 parent_priv = MODEST_WINDOW_GET_PRIVATE (editor);
2501 selected_attachments = modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
2502 n_att_selected = g_list_length (selected_attachments);
2503 g_list_free (selected_attachments);
2505 if (n_att_selected > 1)
2506 hildon_banner_show_information (NULL, NULL, _("mcen_ib_unable_to_display_more"));
2507 else if (n_att_selected == 0)
2508 hildon_banner_show_information (NULL, NULL, _("TODO: select one attachment"));
2513 style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
2515 gboolean rich_text, editor_focused;
2517 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
2518 rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer));
2519 editor_focused = gtk_widget_is_focus (priv->msg_body);
2522 hildon_banner_show_information (NULL, NULL, _("mcen_ib_item_unavailable_plaintext"));
2523 else if (!editor_focused)
2524 hildon_banner_show_information (NULL, NULL, _("mcen_ib_move_cursor_to_message"));
2528 reset_modified (ModestMsgEditWindow *editor)
2530 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
2531 GtkTextBuffer *buffer;
2533 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field));
2534 gtk_text_buffer_set_modified (buffer, FALSE);
2535 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->cc_field));
2536 gtk_text_buffer_set_modified (buffer, FALSE);
2537 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->bcc_field));
2538 gtk_text_buffer_set_modified (buffer, FALSE);
2539 gtk_text_buffer_set_modified (priv->text_buffer, FALSE);
2543 modest_msg_edit_window_is_modified (ModestMsgEditWindow *editor)
2545 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
2546 GtkTextBuffer *buffer;
2548 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->to_field));
2549 if (gtk_text_buffer_get_modified (buffer))
2551 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->cc_field));
2552 if (gtk_text_buffer_get_modified (buffer))
2554 buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR(priv->bcc_field));
2555 if (gtk_text_buffer_get_modified (buffer))
2557 if (gtk_text_buffer_get_modified (priv->text_buffer))
2564 modest_msg_edit_window_check_names (ModestMsgEditWindow *window)
2566 ModestMsgEditWindowPrivate *priv = NULL;
2568 g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), FALSE);
2569 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2571 /* check if there's no recipient added */
2572 if ((gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))) == 0) &&
2573 (gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))) == 0) &&
2574 (gtk_text_buffer_get_char_count (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))) == 0)) {
2575 /* no recipient contents, then select contacts */
2576 modest_msg_edit_window_open_addressbook (window, NULL);
2580 if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->to_field)))
2582 if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->cc_field)))
2584 if (!modest_address_book_check_names (MODEST_RECPT_EDITOR (priv->bcc_field)))
2587 modest_recpt_editor_grab_focus (MODEST_RECPT_EDITOR (priv->to_field));
2594 modest_msg_edit_window_add_attachment_clicked (GtkButton *button,
2595 ModestMsgEditWindow *window)
2597 modest_msg_edit_window_attach_file (window);
2601 modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard,
2603 ModestMsgEditWindow *window)
2605 ModestWindowPrivate *parent_priv;
2606 ModestMsgEditWindowPrivate *priv;
2610 GList *selected_attachments = NULL;
2611 gint n_att_selected = 0;
2613 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2614 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2615 selection = gtk_clipboard_wait_for_text (clipboard);
2616 focused = gtk_window_get_focus (GTK_WINDOW (window));
2618 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
2619 gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
2620 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
2621 gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
2623 selected_attachments = modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view));
2624 n_att_selected = g_list_length (selected_attachments);
2625 g_list_free (selected_attachments);
2627 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu");
2628 gtk_action_set_sensitive (action, n_att_selected == 1);
2631 update_paste_dimming (window);
2635 update_window_title (ModestMsgEditWindow *window)
2637 ModestMsgEditWindowPrivate *priv = NULL;
2638 const gchar *subject;
2640 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2641 subject = gtk_entry_get_text (GTK_ENTRY (priv->subject_field));
2642 if (subject == NULL || subject[0] == '\0')
2643 subject = _("mail_va_new_email");
2645 gtk_window_set_title (GTK_WINDOW (window), subject);
2650 subject_field_changed (GtkEditable *editable,
2651 ModestMsgEditWindow *window)
2653 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2654 update_window_title (window);
2655 gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
2659 modest_msg_edit_window_toggle_find_toolbar (ModestMsgEditWindow *window,
2662 ModestMsgEditWindowPrivate *priv = NULL;
2664 g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window));
2665 priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2667 gtk_widget_set_no_show_all (priv->find_toolbar, FALSE);
2669 gtk_widget_show_all (priv->find_toolbar);
2670 hildon_find_toolbar_highlight_entry (HILDON_FIND_TOOLBAR (priv->find_toolbar), TRUE);
2672 gtk_widget_hide_all (priv->find_toolbar);
2673 gtk_widget_grab_focus (priv->msg_body);
2679 modest_msg_edit_window_find_toolbar_search (GtkWidget *widget,
2680 ModestMsgEditWindow *window)
2682 gchar *current_search = NULL;
2683 ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
2685 GtkTextIter selection_start, selection_end;
2686 GtkTextIter match_start, match_end;
2688 g_object_get (G_OBJECT (widget), "prefix", ¤t_search, NULL);
2689 if ((current_search == NULL) && (strcmp (current_search, "") == 0)) {
2690 g_free (current_search);
2694 gtk_text_buffer_get_selection_bounds (priv->text_buffer, &selection_start, &selection_end);
2695 result = gtk_text_iter_forward_search (&selection_end, current_search, GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, &match_end, NULL);
2697 GtkTextIter buffer_start;
2698 gtk_text_buffer_get_start_iter (priv->text_buffer, &buffer_start);
2699 result = gtk_text_iter_forward_search (&buffer_start, current_search, GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, &match_end, &selection_start);
2702 gtk_text_buffer_select_range (priv->text_buffer, &match_start, &match_end);
2703 gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (priv->msg_body), &match_start, 0.0, TRUE, 0.0, 0.0);
2705 /* TODO: warning about non succesful search */
2707 g_free (current_search);
2711 modest_msg_edit_window_find_toolbar_close (GtkWidget *widget,
2712 ModestMsgEditWindow *window)
2714 GtkToggleAction *toggle;
2715 ModestWindowPrivate *parent_priv;
2716 parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2718 toggle = GTK_TOGGLE_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ToolsMenu/FindInMessageMenu"));
2719 gtk_toggle_action_set_active (toggle, FALSE);
2724 update_paste_dimming (ModestMsgEditWindow *window)
2726 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2727 GtkAction *action = NULL;
2728 GtkClipboard *clipboard = NULL;
2732 focused = gtk_window_get_focus (GTK_WINDOW (window));
2734 clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
2735 active = gtk_clipboard_wait_is_text_available (clipboard);
2738 if (MODEST_IS_ATTACHMENTS_VIEW (focused))
2742 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/PasteMenu");
2743 gtk_action_set_sensitive (action, active);
2748 paste_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
2750 GtkWidget *focused = gtk_window_get_focus (GTK_WINDOW (editor));
2752 if (MODEST_IS_ATTACHMENTS_VIEW (focused))
2753 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_unable_to_paste_here"));
2755 hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ecoc_ib_edwin_nothing_to_paste"));
2761 modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard,
2763 ModestMsgEditWindow *window)
2765 update_paste_dimming (window);
2769 update_select_all_dimming (ModestMsgEditWindow *window)
2772 gboolean dimmed = FALSE;
2774 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2776 focused = gtk_window_get_focus (GTK_WINDOW (window));
2777 if (GTK_IS_ENTRY (focused)) {
2778 const gchar *current_text;
2779 current_text = gtk_entry_get_text (GTK_ENTRY (focused));
2780 dimmed = ((current_text == NULL) || (current_text[0] == '\0'));
2781 } else if (GTK_IS_TEXT_VIEW (focused)) {
2782 GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
2783 dimmed = (gtk_text_buffer_get_char_count (buffer) < 1);
2784 } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) {
2787 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/SelectAllMenu");
2788 gtk_action_set_sensitive (action, !dimmed);
2792 update_zoom_dimming (ModestMsgEditWindow *window)
2795 gboolean dimmed = FALSE;
2797 ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
2799 focused = gtk_window_get_focus (GTK_WINDOW (window));
2800 dimmed = ! WP_IS_TEXT_VIEW (focused);
2801 action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu");
2802 gtk_action_set_sensitive (action, !dimmed);
2806 edit_menu_activated (GtkAction *action,
2809 ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata);
2811 update_select_all_dimming (window);
2814 view_menu_activated (GtkAction *action,
2817 ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata);
2819 update_zoom_dimming (window);