X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fmaemo%2Fmodest-msg-edit-window.c;h=61ae3c2a7141dbcf7fad4dadd7df320717151c52;hp=292ace4c3534c9a3bedd4c243cbcfdf779d4e376;hb=7068c16e5edce3b80f8ec3f1671fc9eeb6bf84b5;hpb=5c56b46404a8ce2530d8e772660fcc1a66300cb1 diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 292ace4..61ae3c2 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -65,6 +65,7 @@ #include "modest-hildon-includes.h" #include "widgets/modest-msg-edit-window-ui.h" #include +#include "modest-maemo-utils.h" #define DEFAULT_FONT_SIZE 3 @@ -73,6 +74,7 @@ #define DEFAULT_SIZE_COMBOBOX_WIDTH 80 #define DEFAULT_MAIN_VBOX_SPACING 6 #define SUBJECT_MAX_LENGTH 1000 +#define IMAGE_MAX_WIDTH 640 static void modest_msg_edit_window_class_init (ModestMsgEditWindowClass *klass); static void modest_msg_edit_window_init (ModestMsgEditWindow *obj); @@ -82,6 +84,8 @@ static gboolean msg_body_focus (GtkWidget *focus, GdkEventFocus *event, gpointer static void recpt_field_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor); static void send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); static void style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); +static void remove_attachment_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); +static void zoom_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor); static void setup_insensitive_handlers (ModestMsgEditWindow *editor); static void reset_modified (ModestMsgEditWindow *editor); static gboolean is_modified (ModestMsgEditWindow *editor); @@ -116,15 +120,24 @@ static void modest_msg_edit_window_show_toolbar (ModestWindow *window, static void modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard, GdkEvent *event, ModestMsgEditWindow *window); +static void modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard, + GdkEvent *event, + ModestMsgEditWindow *window); static void update_window_title (ModestMsgEditWindow *window); static void update_dimmed (ModestMsgEditWindow *window); +static void update_paste_dimming (ModestMsgEditWindow *window); +static void update_select_all_dimming (ModestMsgEditWindow *window); +static void update_zoom_dimming (ModestMsgEditWindow *window); /* Find toolbar */ static void modest_msg_edit_window_find_toolbar_search (GtkWidget *widget, ModestMsgEditWindow *window); static void modest_msg_edit_window_find_toolbar_close (GtkWidget *widget, ModestMsgEditWindow *window); - +static void edit_menu_activated (GtkAction *action, + gpointer userdata); +static void view_menu_activated (GtkAction *action, + gpointer userdata); /* list my signals */ enum { @@ -166,6 +179,7 @@ struct _ModestMsgEditWindowPrivate { GtkWidget *find_toolbar; GtkWidget *scroll; + GtkWidget *scroll_area; gint last_cid; GList *attachments; @@ -175,6 +189,7 @@ struct _ModestMsgEditWindowPrivate { gdouble zoom_level; gulong clipboard_change_handler_id; + gulong system_clipboard_change_handler_id; TnyMsg *draft_msg; }; @@ -277,6 +292,7 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) priv->draft_msg = NULL; priv->clipboard_change_handler_id = 0; + priv->system_clipboard_change_handler_id = 0; } @@ -463,13 +479,15 @@ init_window (ModestMsgEditWindow *obj) gtk_box_pack_start (GTK_BOX (window_box), priv->scroll, TRUE, TRUE, 0); gtk_box_pack_end (GTK_BOX (window_box), priv->find_toolbar, FALSE, FALSE, 0); gtk_container_add (GTK_CONTAINER(obj), window_box); - scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); - gtk_container_add (GTK_CONTAINER (frame), scroll_area); + priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); + gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area); gtk_container_set_focus_vadjustment (GTK_CONTAINER (scroll_area), gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))); priv->clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj); + priv->system_clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change", + G_CALLBACK (modest_msg_edit_window_system_clipboard_owner_change), obj); } @@ -484,6 +502,12 @@ modest_msg_edit_window_finalize (GObject *obj) priv->clipboard_change_handler_id = 0; } + if (priv->system_clipboard_change_handler_id > 0) { + g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), + priv->system_clipboard_change_handler_id); + priv->system_clipboard_change_handler_id = 0; + } + /* This had to stay alive for as long as the combobox that used it: */ modest_pair_list_free (priv->from_field_protos); @@ -936,6 +960,15 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) gtk_action_set_sensitive (action, FALSE); action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu"); gtk_action_set_sensitive (action, FALSE); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu"); + gtk_action_set_sensitive (action, FALSE); + + /* Update select all */ + update_select_all_dimming (MODEST_MSG_EDIT_WINDOW (obj)); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu"); + g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (edit_menu_activated), obj); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu"); + g_signal_connect (G_OBJECT (action), "activate", G_CALLBACK (view_menu_activated), obj); /* set initial state of cc and bcc */ action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu"); @@ -956,6 +989,8 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name) MODEST_FILE_FORMAT_FORMATTED_TEXT : MODEST_FILE_FORMAT_PLAIN_TEXT; modest_msg_edit_window_set_file_format (MODEST_MSG_EDIT_WINDOW (obj), file_format); + + update_paste_dimming (MODEST_MSG_EDIT_WINDOW (obj)); return (ModestWindow*) obj; } @@ -1389,6 +1424,7 @@ modest_msg_edit_window_select_background_color (ModestMsgEditWindow *window) } + void modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) { @@ -1396,76 +1432,102 @@ modest_msg_edit_window_insert_image (ModestMsgEditWindow *window) ModestMsgEditWindowPrivate *priv; GtkWidget *dialog = NULL; gint response = 0; - gchar *filename = NULL; + GSList *uris = NULL; + GSList *uri_node = NULL; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_window_set_title (GTK_WINDOW (dialog), _("mcen_ia_select_inline_image_title")); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); + + modest_maemo_utils_setup_images_filechooser (GTK_FILE_CHOOSER (dialog)); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog)); break; default: break; } gtk_widget_destroy (dialog); - if (filename) { - GdkPixbuf *pixbuf = NULL; + for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) { + const gchar *uri; + GnomeVFSHandle *handle = NULL; + GnomeVFSResult result; GtkTextIter position; GtkTextMark *insert_mark; - pixbuf = gdk_pixbuf_new_from_file (filename, NULL); - if (pixbuf) { - gint image_file_id; - GdkPixbufFormat *pixbuf_format; - - image_file_id = g_open (filename, O_RDONLY, 0); - pixbuf_format = gdk_pixbuf_get_file_info (filename, NULL, NULL); - if ((image_file_id != -1)&&(pixbuf_format != NULL)) { - TnyMimePart *image_part; - TnyStream *image_stream; - gchar **mime_types; - gchar *mime_type; - gchar *basename; - gchar *content_id; - - mime_types = gdk_pixbuf_format_get_mime_types (pixbuf_format); - if ((mime_types != NULL) && (mime_types[0] != NULL)) { - mime_type = mime_types[0]; - } else { - mime_type = "image/unknown"; - } - image_part = tny_platform_factory_new_mime_part - (modest_runtime_get_platform_factory ()); - image_stream = TNY_STREAM (tny_fs_stream_new (image_file_id)); - - tny_mime_part_construct_from_stream (image_part, image_stream, mime_type); - g_strfreev (mime_types); - - content_id = g_strdup_printf ("%d", priv->last_cid); - tny_mime_part_set_content_id (image_part, content_id); - g_free (content_id); - priv->last_cid++; - - basename = g_path_get_basename (filename); - tny_mime_part_set_filename (image_part, basename); - g_free (basename); - + uri = (const gchar *) uri_node->data; + result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); + if (result == GNOME_VFS_OK) { + GdkPixbufLoader *loader; + GdkPixbuf *pixbuf; + GnomeVFSFileInfo info; + gchar *filename, *basename; + TnyMimePart *mime_part; + TnyStream *stream; + gchar *content_id; + const gchar *mime_type = NULL; + + filename = g_filename_from_uri (uri, NULL, NULL); + if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) + == GNOME_VFS_OK) + mime_type = gnome_vfs_file_info_get_mime_type (&info); + + mime_part = tny_platform_factory_new_mime_part + (modest_runtime_get_platform_factory ()); + stream = TNY_STREAM (tny_vfs_stream_new (handle)); + + tny_mime_part_construct_from_stream (mime_part, stream, mime_type); + + content_id = g_strdup_printf ("%d", priv->last_cid); + tny_mime_part_set_content_id (mime_part, content_id); + g_free (content_id); + priv->last_cid++; + + basename = g_path_get_basename (filename); + tny_mime_part_set_filename (mime_part, basename); + g_free (basename); + + priv->attachments = g_list_prepend (priv->attachments, mime_part); + modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), + mime_part); + gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); + gtk_widget_show_all (priv->attachments_caption); + gtk_text_buffer_set_modified (priv->text_buffer, TRUE); + g_free (filename); + + loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, NULL); + while (!tny_stream_is_eos (TNY_STREAM (stream))) { + char read_buffer[128]; + gint readed; + readed = tny_stream_read (TNY_STREAM (stream), read_buffer, 128); + if (!gdk_pixbuf_loader_write (loader, read_buffer, readed, NULL)) + break; + } + pixbuf = gdk_pixbuf_loader_get_pixbuf (loader); + g_object_ref (pixbuf); + gdk_pixbuf_loader_close (loader, NULL); + g_object_unref (loader); + + if (gdk_pixbuf_get_width (pixbuf) > IMAGE_MAX_WIDTH) { + GdkPixbuf *new_pixbuf; + gint new_height; + new_height = (gdk_pixbuf_get_height (pixbuf) * IMAGE_MAX_WIDTH) / + gdk_pixbuf_get_width (pixbuf); + new_pixbuf = gdk_pixbuf_scale_simple (pixbuf, IMAGE_MAX_WIDTH, new_height, GDK_INTERP_BILINEAR); + g_object_unref (pixbuf); + pixbuf = new_pixbuf; + } + + if (pixbuf != NULL) { insert_mark = gtk_text_buffer_get_insert (GTK_TEXT_BUFFER (priv->text_buffer)); gtk_text_buffer_get_iter_at_mark (GTK_TEXT_BUFFER (priv->text_buffer), &position, insert_mark); - wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (image_part)), pixbuf); - priv->attachments = g_list_prepend (priv->attachments, image_part); - modest_attachments_view_add_attachment (MODEST_ATTACHMENTS_VIEW (priv->attachments_view), - image_part); - gtk_text_buffer_set_modified (priv->text_buffer, TRUE); - gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); - gtk_widget_show_all (priv->attachments_caption); - } else if (image_file_id == -1) { - close (image_file_id); - } + wp_text_buffer_insert_image (WP_TEXT_BUFFER (priv->text_buffer), &position, g_strdup (tny_mime_part_get_content_id (mime_part)), pixbuf); + } } } @@ -1479,36 +1541,41 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) ModestMsgEditWindowPrivate *priv; GtkWidget *dialog = NULL; gint response = 0; - gchar *uri = NULL, *filename = NULL; + GSList *uris = NULL; + GSList *uri_node; priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); dialog = hildon_file_chooser_dialog_new (GTK_WINDOW (window), GTK_FILE_CHOOSER_ACTION_OPEN); + gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE); response = gtk_dialog_run (GTK_DIALOG (dialog)); switch (response) { case GTK_RESPONSE_OK: - uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); + uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog)); break; default: break; } gtk_widget_destroy (dialog); - if (uri) { - + for (uri_node = uris; uri_node != NULL; uri_node = g_slist_next (uri_node)) { + const gchar *uri; GnomeVFSHandle *handle = NULL; GnomeVFSResult result; + uri = (const gchar *) uri_node->data; result = gnome_vfs_open (&handle, uri, GNOME_VFS_OPEN_READ); if (result == GNOME_VFS_OK) { TnyMimePart *mime_part; TnyStream *stream; const gchar *mime_type = NULL; gchar *basename; + gchar *filename; gchar *content_id; GnomeVFSFileInfo info; + + filename = g_filename_from_uri (uri, NULL, NULL); if (gnome_vfs_get_file_info_from_handle (handle, &info, GNOME_VFS_FILE_INFO_GET_MIME_TYPE) == GNOME_VFS_OK) mime_type = gnome_vfs_file_info_get_mime_type (&info); @@ -1533,9 +1600,12 @@ modest_msg_edit_window_attach_file (ModestMsgEditWindow *window) gtk_widget_set_no_show_all (priv->attachments_caption, FALSE); gtk_widget_show_all (priv->attachments_caption); gtk_text_buffer_set_modified (priv->text_buffer, TRUE); + g_free (filename); + } - g_free (filename); } + g_slist_foreach (uris, (GFunc) g_free, NULL); + g_slist_free (uris); } void @@ -1759,12 +1829,21 @@ modest_msg_edit_window_set_zoom (ModestWindow *window, gdouble zoom) { ModestMsgEditWindowPrivate *priv; + ModestWindowPrivate *parent_priv; + GtkRadioAction *zoom_radio_action; g_return_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window)); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); priv->zoom_level = zoom; wp_text_buffer_set_font_scaling_factor (WP_TEXT_BUFFER (priv->text_buffer), zoom); + + /* Zoom level menu options should be updated with the current zoom level */ + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu")); + gtk_radio_action_set_current_value (zoom_radio_action, (gint) (zoom*100.0+0.1)); } static gdouble @@ -1779,12 +1858,27 @@ modest_msg_edit_window_get_zoom (ModestWindow *window) } static gboolean +zoom_allowed (ModestMsgEditWindow *window) +{ + GtkWidget *focus; + + focus = gtk_window_get_focus (GTK_WINDOW (window)); + return (focus != NULL && WP_IS_TEXT_VIEW (focus)); +} + +static gboolean modest_msg_edit_window_zoom_plus (ModestWindow *window) { ModestWindowPrivate *parent_priv; GtkRadioAction *zoom_radio_action; GSList *group, *node; + /* First we check if the text view is focused. If not, zooming is not allowed */ + if (!zoom_allowed (MODEST_MSG_EDIT_WINDOW (window))) { + hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here")); + return FALSE; + } + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu")); @@ -1792,7 +1886,7 @@ modest_msg_edit_window_zoom_plus (ModestWindow *window) group = gtk_radio_action_get_group (zoom_radio_action); if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (group->data))) { - hildon_banner_show_information (NULL, NULL, _("mcen_ib_max_zoom_level")); + hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_max_zoom_level_reached")); return FALSE; } @@ -1812,6 +1906,12 @@ modest_msg_edit_window_zoom_minus (ModestWindow *window) GtkRadioAction *zoom_radio_action; GSList *group, *node; + /* First we check if the text view is focused. If not, zooming is not allowed */ + if (!zoom_allowed (MODEST_MSG_EDIT_WINDOW (window))) { + hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here")); + return FALSE; + } + parent_priv = MODEST_WINDOW_GET_PRIVATE (window); zoom_radio_action = GTK_RADIO_ACTION (gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu/Zoom50Menu")); @@ -1824,7 +1924,7 @@ modest_msg_edit_window_zoom_minus (ModestWindow *window) gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (node->next->data), TRUE); return TRUE; } else - hildon_banner_show_information (NULL, NULL, _("mcen_ib_min_zoom_level")); + hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_min_zoom_level_reached")); break; } } @@ -1980,7 +2080,7 @@ modest_msg_edit_window_set_priority_flags (ModestMsgEditWindow *window, priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); parent_priv = MODEST_WINDOW_GET_PRIVATE (window); - priority_flags = priority_flags & (TNY_HEADER_FLAG_HIGH_PRIORITY); + priority_flags = priority_flags & (TNY_HEADER_FLAG_PRIORITY); if (priv->priority_flags != priority_flags) { GtkAction *priority_action = NULL; @@ -2268,6 +2368,10 @@ setup_insensitive_handlers (ModestMsgEditWindow *window) widget = priv->font_face_toolitem; g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (remove_attachment_insensitive_press), window); + widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu"); + g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (zoom_insensitive_press), window); } static void @@ -2381,6 +2485,34 @@ send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) hildon_banner_show_information (NULL, NULL, _("mcen_ib_add_recipients_first")); } +static void +zoom_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) +{ + hildon_banner_show_information (NULL, NULL, dgettext("hildon-common-strings", "ckct_ib_cannot_zoom_here")); +} + +static void +remove_attachment_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) +{ + ModestWindowPrivate *parent_priv; + ModestMsgEditWindowPrivate *priv; + GList *selected_attachments = NULL; + gint n_att_selected = 0; + + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor); + parent_priv = MODEST_WINDOW_GET_PRIVATE (editor); + + selected_attachments = modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view)); + n_att_selected = g_list_length (selected_attachments); + g_list_free (selected_attachments); + + if (n_att_selected > 1) + hildon_banner_show_information (NULL, NULL, _("mcen_ib_unable_to_display_more")); + else if (n_att_selected == 0) + hildon_banner_show_information (NULL, NULL, _("TODO: select one attachment")); + +} + static void style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor) { @@ -2475,10 +2607,14 @@ modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard, ModestMsgEditWindow *window) { ModestWindowPrivate *parent_priv; + ModestMsgEditWindowPrivate *priv; GtkAction *action; gchar *selection; GtkWidget *focused; + GList *selected_attachments = NULL; + gint n_att_selected = 0; + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window); parent_priv = MODEST_WINDOW_GET_PRIVATE (window); selection = gtk_clipboard_wait_for_text (clipboard); focused = gtk_window_get_focus (GTK_WINDOW (window)); @@ -2487,6 +2623,16 @@ modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard, gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu"); gtk_action_set_sensitive (action, (selection != NULL) && (!MODEST_IS_ATTACHMENTS_VIEW (focused))); + + selected_attachments = modest_attachments_view_get_selection (MODEST_ATTACHMENTS_VIEW (priv->attachments_view)); + n_att_selected = g_list_length (selected_attachments); + g_list_free (selected_attachments); + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu"); + gtk_action_set_sensitive (action, n_att_selected == 1); + + + update_paste_dimming (window); } static void @@ -2577,3 +2723,79 @@ modest_msg_edit_window_find_toolbar_close (GtkWidget *widget, gtk_toggle_action_set_active (toggle, FALSE); } + +static void +update_paste_dimming (ModestMsgEditWindow *window) +{ + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + GtkAction *action = NULL; + GtkClipboard *clipboard = NULL; + + clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); + + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/PasteMenu"); + gtk_action_set_sensitive (action, gtk_clipboard_wait_is_text_available (clipboard)); + +} + +static void +modest_msg_edit_window_system_clipboard_owner_change (GtkClipboard *clipboard, + GdkEvent *event, + ModestMsgEditWindow *window) +{ + update_paste_dimming (window); +} + +static void +update_select_all_dimming (ModestMsgEditWindow *window) +{ + GtkWidget *focused; + gboolean dimmed = FALSE; + GtkAction *action; + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + + focused = gtk_window_get_focus (GTK_WINDOW (window)); + if (GTK_IS_ENTRY (focused)) { + const gchar *current_text; + current_text = gtk_entry_get_text (GTK_ENTRY (focused)); + dimmed = ((current_text == NULL) || (current_text[0] == '\0')); + } else if (GTK_IS_TEXT_VIEW (focused)) { + GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused)); + dimmed = (gtk_text_buffer_get_char_count (buffer) < 1); + } else if (MODEST_IS_ATTACHMENTS_VIEW (focused)) { + dimmed = FALSE; + } + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/SelectAllMenu"); + gtk_action_set_sensitive (action, !dimmed); +} + +static void +update_zoom_dimming (ModestMsgEditWindow *window) +{ + GtkWidget *focused; + gboolean dimmed = FALSE; + GtkAction *action; + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window); + + focused = gtk_window_get_focus (GTK_WINDOW (window)); + dimmed = ! WP_IS_TEXT_VIEW (focused); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ZoomMenu"); + gtk_action_set_sensitive (action, !dimmed); +} + +static void +edit_menu_activated (GtkAction *action, + gpointer userdata) +{ + ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata); + + update_select_all_dimming (window); +} +static void +view_menu_activated (GtkAction *action, + gpointer userdata) +{ + ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata); + + update_zoom_dimming (window); +}