From: Jose Dapena Paz Date: Thu, 15 Nov 2007 08:51:33 +0000 (+0000) Subject: * src/widgets/modest-combo-box.[ch]: X-Git-Tag: git_migration_finished~2089 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=cb22f21e3b8d843e124ba976a01ab74c3c763712 * src/widgets/modest-combo-box.[ch]: * Added (modest_combo_box_set_pair_list), to be able to set the pair list after constructing the widget. * src/widgets/modest-window-mgr.[ch]: * Added a new cache for preconstructing message view and editor so that we can speed up opening messages. We provide methods ..._get_msg_view_window and ..._get_msg_edit_window. The cached instances are constructed in the idle loop. These methods are used internally in constructors of editor and view. * src/maemo/modest-msg-edit-window.c: * Completely new structure of the widget construction. Now it happens in two stages. First stage is in init_window. Here it constructs as much as possible the widget without any specific running parameter. Then the ..._new constructor connects all signals, configures the widget with ModestConf and sets the message. This way, we can precreate the widget in the window manager cache. * Modified menubar_to_menu to ask for the popup menu in xml instead of the old hack of reparenting children of menubar. * src/maemo/modest-msg-view-window.c: * Similar refactoring to the one in editor. Now init creates all the widgets, and they're finally set up in construction. We also use the window manager cache. * Similar change to menubar_to_menu. * src/maemo/ui/modest-msg-view-window-ui.xml, src/maemo/ui/modest-msg-edit-window-ui.xml: * Instead of a I changed it to be a to get a GtkMenu instead of a GtkMenubar * src/modest-widget-memory.c: * Cleaned a small leak. pmo-trunk-r3738 --- diff --git a/src/maemo/modest-msg-edit-window.c b/src/maemo/modest-msg-edit-window.c index 3478e21..5e113d9 100644 --- a/src/maemo/modest-msg-edit-window.c +++ b/src/maemo/modest-msg-edit-window.c @@ -157,6 +157,7 @@ static void on_account_removed (TnyAccountStore *account_store, TnyAccount *account, gpointer user_data); +static void init_window (ModestMsgEditWindow *obj); static void DEBUG_BUFFER (WPTextBuffer *buffer) { @@ -315,7 +316,37 @@ save_state (ModestWindow *self) static void restore_settings (ModestMsgEditWindow *self) { - modest_widget_memory_restore (modest_runtime_get_conf(), + ModestConf *conf = NULL; + GtkAction *action; + ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (self); + + conf = modest_runtime_get_conf (); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarNormalScreenMenu"); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR, NULL)); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, + "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarFullScreenMenu"); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL)); + + /* set initial state of cc and bcc */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu"); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)); + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu"); + modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), + modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)); + + /* Dim at start clipboard actions */ + action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu"); + 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); + + modest_widget_memory_restore (conf, G_OBJECT(self), MODEST_CONF_EDIT_WINDOW_KEY); } @@ -384,6 +415,7 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj) modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), GTK_WINDOW(obj),"applications_email_editor"); + init_window (obj); } @@ -460,11 +492,87 @@ void vadj_changed (GtkAdjustment *adj, static void +connect_signals (ModestMsgEditWindow *obj) +{ + ModestMsgEditWindowPrivate *priv; + + priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj); + + g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes", + G_CALLBACK (text_buffer_refresh_attributes), obj); + g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo", + G_CALLBACK (text_buffer_can_undo), obj); + g_signal_connect (G_OBJECT (priv->text_buffer), "can-redo", + G_CALLBACK (text_buffer_can_redo), obj); + g_signal_connect (G_OBJECT (priv->text_buffer), "changed", + G_CALLBACK (body_changed), obj); + g_signal_connect (G_OBJECT (obj), "window-state-event", + G_CALLBACK (modest_msg_edit_window_window_state_event), + NULL); + g_signal_connect_after (G_OBJECT (priv->text_buffer), "apply-tag", + G_CALLBACK (text_buffer_apply_tag), obj); + g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook", + G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook", + G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook", + G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); + + g_signal_connect (G_OBJECT (priv->add_attachment_button), "clicked", + G_CALLBACK (modest_msg_edit_window_add_attachment_clicked), obj); + + g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event", + G_CALLBACK (msg_body_focus), obj); + g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event", + G_CALLBACK (msg_body_focus), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))), + "changed", G_CALLBACK (recpt_field_changed), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))), + "changed", G_CALLBACK (recpt_field_changed), obj); + g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))), + "changed", G_CALLBACK (recpt_field_changed), obj); + g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj); + g_signal_connect_after (G_OBJECT (priv->subject_field), "move-cursor", G_CALLBACK (subject_field_move_cursor), obj); + g_signal_connect (G_OBJECT (priv->subject_field), "insert-text", G_CALLBACK (subject_field_insert_text), obj); + + g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj); + g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), obj); + + g_signal_connect (G_OBJECT (gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->scroll))), + "changed", + G_CALLBACK (vadj_changed), + obj); + + 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->default_clipboard_change_handler_id = + g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change", + G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj); + +} + +static GtkWidget * +menubar_to_menu (GtkUIManager *ui_manager) +{ + GtkWidget *main_menu; + + /* Get the menubar from the UI manager */ + main_menu = gtk_ui_manager_get_widget (ui_manager, "/MenuBar"); + + return main_menu; +} + +static void init_window (ModestMsgEditWindow *obj) { GtkWidget *from_caption, *to_caption, *subject_caption; GtkWidget *main_vbox; ModestMsgEditWindowPrivate *priv; + GtkActionGroup *action_group; + ModestWindowPrivate *parent_priv; + GdkPixbuf *window_icon = NULL; + GError *error = NULL; GtkSizeGroup *size_group; GtkWidget *frame; @@ -475,15 +583,70 @@ init_window (ModestMsgEditWindow *obj) GdkAtom deserialize_type; #endif priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE(obj); + parent_priv = MODEST_WINDOW_GET_PRIVATE (obj); + + parent_priv->ui_manager = gtk_ui_manager_new(); + action_group = gtk_action_group_new ("ModestMsgEditWindowActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + + /* Add common actions */ + gtk_action_group_add_actions (action_group, + modest_msg_edit_action_entries, + G_N_ELEMENTS (modest_msg_edit_action_entries), + obj); + gtk_action_group_add_toggle_actions (action_group, + modest_msg_edit_toggle_action_entries, + G_N_ELEMENTS (modest_msg_edit_toggle_action_entries), + obj); + gtk_action_group_add_radio_actions (action_group, + modest_msg_edit_alignment_radio_action_entries, + G_N_ELEMENTS (modest_msg_edit_alignment_radio_action_entries), + GTK_JUSTIFY_LEFT, + G_CALLBACK (modest_ui_actions_on_change_justify), + obj); + gtk_action_group_add_radio_actions (action_group, + modest_msg_edit_zoom_action_entries, + G_N_ELEMENTS (modest_msg_edit_zoom_action_entries), + 100, + G_CALLBACK (modest_ui_actions_on_change_zoom), + obj); + gtk_action_group_add_radio_actions (action_group, + modest_msg_edit_priority_action_entries, + G_N_ELEMENTS (modest_msg_edit_priority_action_entries), + 0, + G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority), + obj); + gtk_action_group_add_radio_actions (action_group, + modest_msg_edit_file_format_action_entries, + G_N_ELEMENTS (modest_msg_edit_file_format_action_entries), + modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL), + G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format), + obj); + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); + g_object_unref (action_group); + + /* Load the UI definition */ + gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-edit-window-ui.xml", + &error); + if (error != NULL) { + g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message); + g_clear_error (&error); + } + + /* Add accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (obj), + gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); + + /* Menubar. Update the state of some toggles */ + parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager); + hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar)); size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); /* Note: This ModestPairList* must exist for as long as the combo * that uses it, because the ModestComboBox uses the ID opaquely, * so it can't know how to manage its memory. */ - priv->from_field_protos = get_transports (); - - priv->from_field = modest_combo_box_new (priv->from_field_protos, g_str_equal); + priv->from_field = modest_combo_box_new (NULL, g_str_equal); priv->to_field = modest_recpt_editor_new (); priv->cc_field = modest_recpt_editor_new (); @@ -552,46 +715,6 @@ init_window (ModestMsgEditWindow *obj) /* g_signal_connect (G_OBJECT (obj), "key_pressed", G_CALLBACK (on_key_pressed), NULL) */ - g_signal_connect (G_OBJECT (priv->text_buffer), "refresh_attributes", - G_CALLBACK (text_buffer_refresh_attributes), obj); - g_signal_connect (G_OBJECT (priv->text_buffer), "can-undo", - G_CALLBACK (text_buffer_can_undo), obj); - g_signal_connect (G_OBJECT (priv->text_buffer), "can-redo", - G_CALLBACK (text_buffer_can_redo), obj); - g_signal_connect (G_OBJECT (priv->text_buffer), "changed", - G_CALLBACK (body_changed), obj); - g_signal_connect (G_OBJECT (obj), "window-state-event", - G_CALLBACK (modest_msg_edit_window_window_state_event), - NULL); - g_signal_connect_after (G_OBJECT (priv->text_buffer), "apply-tag", - G_CALLBACK (text_buffer_apply_tag), obj); - g_signal_connect_swapped (G_OBJECT (priv->to_field), "open-addressbook", - G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); - g_signal_connect_swapped (G_OBJECT (priv->cc_field), "open-addressbook", - G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); - g_signal_connect_swapped (G_OBJECT (priv->bcc_field), "open-addressbook", - G_CALLBACK (modest_msg_edit_window_open_addressbook), obj); - - g_signal_connect (G_OBJECT (priv->add_attachment_button), "clicked", - G_CALLBACK (modest_msg_edit_window_add_attachment_clicked), obj); - - g_signal_connect (G_OBJECT (priv->msg_body), "focus-in-event", - G_CALLBACK (msg_body_focus), obj); - g_signal_connect (G_OBJECT (priv->msg_body), "focus-out-event", - G_CALLBACK (msg_body_focus), obj); - g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field))), - "changed", G_CALLBACK (recpt_field_changed), obj); - g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field))), - "changed", G_CALLBACK (recpt_field_changed), obj); - g_signal_connect (G_OBJECT (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field))), - "changed", G_CALLBACK (recpt_field_changed), obj); - g_signal_connect (G_OBJECT (priv->subject_field), "changed", G_CALLBACK (subject_field_changed), obj); - g_signal_connect_after (G_OBJECT (priv->subject_field), "move-cursor", G_CALLBACK (subject_field_move_cursor), obj); - g_signal_connect (G_OBJECT (priv->subject_field), "insert-text", G_CALLBACK (subject_field_insert_text), obj); - - g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_edit_window_find_toolbar_close), obj); - g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_edit_window_find_toolbar_search), obj); - priv->scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (priv->scroll), GTK_SHADOW_NONE); @@ -616,11 +739,13 @@ init_window (ModestMsgEditWindow *obj) gtk_container_add (GTK_CONTAINER(obj), window_box); priv->scroll_area = modest_scroll_area_new (priv->scroll, priv->msg_body); gtk_container_add (GTK_CONTAINER (frame), priv->scroll_area); - - 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->default_clipboard_change_handler_id = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD)), "owner-change", - G_CALLBACK (modest_msg_edit_window_clipboard_owner_change), obj); + + /* Set window icon */ + window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON); + if (window_icon) { + gtk_window_set_icon (GTK_WINDOW (obj), window_icon); + g_object_unref (window_icon); + } } @@ -690,31 +815,6 @@ modest_msg_edit_window_finalize (GObject *obj) G_OBJECT_CLASS(parent_class)->finalize (obj); } -static GtkWidget * -menubar_to_menu (GtkUIManager *ui_manager) -{ - GtkWidget *main_menu; - GtkWidget *menubar; - GList *iter; - - /* Create new main menu */ - main_menu = gtk_menu_new(); - - /* Get the menubar from the UI manager */ - menubar = gtk_ui_manager_get_widget (ui_manager, "/MenuBar"); - - iter = gtk_container_get_children (GTK_CONTAINER (menubar)); - while (iter) { - GtkWidget *menu; - - menu = GTK_WIDGET (iter->data); - gtk_widget_reparent(menu, main_menu); - - iter = g_list_next (iter); - } - return main_menu; -} - static GdkPixbuf * pixbuf_from_stream (TnyStream *stream, const gchar *mime_type) { @@ -1180,100 +1280,34 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre GObject *obj; ModestWindowPrivate *parent_priv; ModestMsgEditWindowPrivate *priv; - GtkActionGroup *action_group; - GError *error = NULL; - GdkPixbuf *window_icon = NULL; - GtkAction *action; - ModestConf *conf; ModestPair *account_pair = NULL; ModestDimmingRulesGroup *menu_rules_group = NULL; ModestDimmingRulesGroup *toolbar_rules_group = NULL; ModestDimmingRulesGroup *clipboard_rules_group = NULL; + ModestWindowMgr *mgr = NULL; g_return_val_if_fail (msg, NULL); g_return_val_if_fail (account_name, NULL); + + mgr = modest_runtime_get_window_mgr (); - obj = g_object_new(MODEST_TYPE_MSG_EDIT_WINDOW, NULL); + obj = G_OBJECT (modest_window_mgr_get_msg_edit_window (mgr)); priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (obj); parent_priv = MODEST_WINDOW_GET_PRIVATE (obj); - parent_priv->ui_manager = gtk_ui_manager_new(); - action_group = gtk_action_group_new ("ModestMsgEditWindowActions"); - gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); - - /* Add common actions */ - gtk_action_group_add_actions (action_group, - modest_msg_edit_action_entries, - G_N_ELEMENTS (modest_msg_edit_action_entries), - obj); - gtk_action_group_add_toggle_actions (action_group, - modest_msg_edit_toggle_action_entries, - G_N_ELEMENTS (modest_msg_edit_toggle_action_entries), - obj); - gtk_action_group_add_radio_actions (action_group, - modest_msg_edit_alignment_radio_action_entries, - G_N_ELEMENTS (modest_msg_edit_alignment_radio_action_entries), - GTK_JUSTIFY_LEFT, - G_CALLBACK (modest_ui_actions_on_change_justify), - obj); - gtk_action_group_add_radio_actions (action_group, - modest_msg_edit_zoom_action_entries, - G_N_ELEMENTS (modest_msg_edit_zoom_action_entries), - 100, - G_CALLBACK (modest_ui_actions_on_change_zoom), - obj); - gtk_action_group_add_radio_actions (action_group, - modest_msg_edit_priority_action_entries, - G_N_ELEMENTS (modest_msg_edit_priority_action_entries), - 0, - G_CALLBACK (modest_ui_actions_msg_edit_on_change_priority), - obj); - gtk_action_group_add_radio_actions (action_group, - modest_msg_edit_file_format_action_entries, - G_N_ELEMENTS (modest_msg_edit_file_format_action_entries), - modest_conf_get_bool (modest_runtime_get_conf (), MODEST_CONF_PREFER_FORMATTED_TEXT, NULL), - G_CALLBACK (modest_ui_actions_msg_edit_on_change_file_format), - obj); - gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); - g_object_unref (action_group); - - /* Load the UI definition */ - gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-edit-window-ui.xml", - &error); - if (error != NULL) { - g_warning ("Could not merge modest-msg-edit-window-ui.xml: %s", error->message); - g_clear_error (&error); - } - - /* Add accelerators */ - gtk_window_add_accel_group (GTK_WINDOW (obj), - gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); - - /* Menubar. Update the state of some toggles */ - parent_priv->menubar = menubar_to_menu (parent_priv->ui_manager); - conf = modest_runtime_get_conf (); - action = gtk_ui_manager_get_action (parent_priv->ui_manager, - "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarNormalScreenMenu"); - modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), - modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR, NULL)); - action = gtk_ui_manager_get_action (parent_priv->ui_manager, - "/MenuBar/ViewMenu/ShowToolbarMenu/ViewShowToolbarFullScreenMenu"); - modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), - modest_conf_get_bool (conf, MODEST_CONF_EDIT_WINDOW_SHOW_TOOLBAR_FULLSCREEN, NULL)); - - hildon_window_set_menu (HILDON_WINDOW (obj), GTK_MENU (parent_priv->menubar)); + priv->from_field_protos = get_transports (); + modest_combo_box_set_pair_list (MODEST_COMBO_BOX (priv->from_field), priv->from_field_protos); + modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj)); + hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar)); /* Init window */ - init_window (MODEST_MSG_EDIT_WINDOW(obj)); + connect_signals (MODEST_MSG_EDIT_WINDOW(obj)); restore_settings (MODEST_MSG_EDIT_WINDOW(obj)); modest_window_set_active_account (MODEST_WINDOW(obj), account_name); - modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj)); - hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar)); - account_pair = modest_pair_list_find_by_first_as_string (priv->from_field_protos, account_name); if (account_pair != NULL) modest_combo_box_set_active_id (MODEST_COMBO_BOX (priv->from_field), account_pair->first); @@ -1317,32 +1351,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj)); - /* Set window icon */ - window_icon = modest_platform_get_icon (MODEST_APP_MSG_EDIT_ICON); - if (window_icon) { - gtk_window_set_icon (GTK_WINDOW (obj), window_icon); - g_object_unref (window_icon); - } - modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj)); - modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules"); - - /* Dim at start clipboard actions */ - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu"); - 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); - - /* set initial state of cc and bcc */ - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewCcFieldMenu"); - modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), - modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_CC, NULL)); - action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/ViewMenu/ViewBccFieldMenu"); - modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action), - modest_conf_get_bool(modest_runtime_get_conf(), MODEST_CONF_SHOW_BCC, NULL)); - modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules"); priv->update_caption_visibility = TRUE; diff --git a/src/maemo/modest-msg-view-window.c b/src/maemo/modest-msg-view-window.c index 7e0e61b..066cfc7 100644 --- a/src/maemo/modest-msg-view-window.c +++ b/src/maemo/modest-msg-view-window.c @@ -151,6 +151,7 @@ static void set_toolbar_mode (ModestMsgViewWindow *self, static void update_window_title (ModestMsgViewWindow *window); static gboolean set_toolbar_transfer_mode (ModestMsgViewWindow *self); +static void init_window (ModestMsgViewWindow *obj); /* list my signals */ @@ -326,8 +327,55 @@ static void modest_msg_view_window_init (ModestMsgViewWindow *obj) { ModestMsgViewWindowPrivate *priv; + ModestWindowPrivate *parent_priv = NULL; + GtkActionGroup *action_group = NULL; + GError *error = NULL; + GdkPixbuf *window_icon; + priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); + parent_priv = MODEST_WINDOW_GET_PRIVATE(obj); + parent_priv->ui_manager = gtk_ui_manager_new(); + + action_group = gtk_action_group_new ("ModestMsgViewWindowActions"); + gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); + + /* Add common actions */ + gtk_action_group_add_actions (action_group, + modest_action_entries, + G_N_ELEMENTS (modest_action_entries), + obj); + gtk_action_group_add_toggle_actions (action_group, + modest_toggle_action_entries, + G_N_ELEMENTS (modest_toggle_action_entries), + obj); + gtk_action_group_add_toggle_actions (action_group, + msg_view_toggle_action_entries, + G_N_ELEMENTS (msg_view_toggle_action_entries), + obj); + gtk_action_group_add_radio_actions (action_group, + msg_view_zoom_action_entries, + G_N_ELEMENTS (msg_view_zoom_action_entries), + 100, + G_CALLBACK (modest_ui_actions_on_change_zoom), + obj); + gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); + g_object_unref (action_group); + + /* Load the UI definition */ + gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml", + &error); + if (error) { + g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message); + g_error_free (error); + error = NULL; + } + /* ****** */ + + /* Add accelerators */ + gtk_window_add_accel_group (GTK_WINDOW (obj), + gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); + priv->is_search_result = FALSE; priv->msg_view = NULL; @@ -348,6 +396,16 @@ modest_msg_view_window_init (ModestMsgViewWindow *obj) priv->remove_attachment_banner = NULL; priv->msg_uid = NULL; + /* Init window */ + init_window (MODEST_MSG_VIEW_WINDOW(obj)); + /* Set window icon */ + window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON); + if (window_icon) { + gtk_window_set_icon (GTK_WINDOW (obj), window_icon); + g_object_unref (window_icon); + } + + modest_window_mgr_register_help_id (modest_runtime_get_window_mgr(), GTK_WINDOW(obj),"applications_email_viewer"); } @@ -538,7 +596,6 @@ init_window (ModestMsgViewWindow *obj) g_signal_connect (G_OBJECT (priv->find_toolbar), "close", G_CALLBACK (modest_msg_view_window_find_toolbar_close), obj); g_signal_connect (G_OBJECT (priv->find_toolbar), "search", G_CALLBACK (modest_msg_view_window_find_toolbar_search), obj); - priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj); gtk_widget_show_all (GTK_WIDGET(main_vbox)); } @@ -703,9 +760,6 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, ModestDimmingRulesGroup *menu_rules_group = NULL; ModestDimmingRulesGroup *toolbar_rules_group = NULL; ModestDimmingRulesGroup *clipboard_rules_group = NULL; - GtkActionGroup *action_group = NULL; - GError *error = NULL; - GdkPixbuf *window_icon; obj = G_OBJECT (self); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE(obj); @@ -713,49 +767,12 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, priv->msg_uid = g_strdup (msg_uid); - parent_priv->ui_manager = gtk_ui_manager_new(); parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new(); - action_group = gtk_action_group_new ("ModestMsgViewWindowActions"); - gtk_action_group_set_translation_domain (action_group, GETTEXT_PACKAGE); - menu_rules_group = modest_dimming_rules_group_new ("ModestMenuDimmingRules", FALSE); toolbar_rules_group = modest_dimming_rules_group_new ("ModestToolbarDimmingRules", TRUE); clipboard_rules_group = modest_dimming_rules_group_new ("ModestClipboardDimmingRules", FALSE); - /* Add common actions */ - gtk_action_group_add_actions (action_group, - modest_action_entries, - G_N_ELEMENTS (modest_action_entries), - obj); - gtk_action_group_add_toggle_actions (action_group, - modest_toggle_action_entries, - G_N_ELEMENTS (modest_toggle_action_entries), - obj); - gtk_action_group_add_toggle_actions (action_group, - msg_view_toggle_action_entries, - G_N_ELEMENTS (msg_view_toggle_action_entries), - obj); - gtk_action_group_add_radio_actions (action_group, - msg_view_zoom_action_entries, - G_N_ELEMENTS (msg_view_zoom_action_entries), - 100, - G_CALLBACK (modest_ui_actions_on_change_zoom), - obj); - - gtk_ui_manager_insert_action_group (parent_priv->ui_manager, action_group, 0); - g_object_unref (action_group); - - /* Load the UI definition */ - gtk_ui_manager_add_ui_from_file (parent_priv->ui_manager, MODEST_UIDIR "modest-msg-view-window-ui.xml", - &error); - if (error) { - g_printerr ("modest: could not merge modest-msg-view-window-ui.xml: %s\n", error->message); - g_error_free (error); - error = NULL; - } - /* ****** */ - /* Add common dimming rules */ modest_dimming_rules_group_add_rules (menu_rules_group, modest_msg_view_menu_dimming_entries, @@ -778,23 +795,11 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, g_object_unref (toolbar_rules_group); g_object_unref (clipboard_rules_group); - /* Add accelerators */ - gtk_window_add_accel_group (GTK_WINDOW (obj), - gtk_ui_manager_get_accel_group (parent_priv->ui_manager)); - - /* Init window */ - init_window (MODEST_MSG_VIEW_WINDOW(obj)); restore_settings (MODEST_MSG_VIEW_WINDOW(obj)); - /* Set window icon */ - window_icon = modest_platform_get_icon (MODEST_APP_MSG_VIEW_ICON); - if (window_icon) { - gtk_window_set_icon (GTK_WINDOW (obj), window_icon); - g_object_unref (window_icon); - } - /* g_signal_connect (G_OBJECT(obj), "delete-event", G_CALLBACK(on_delete_event), obj); */ + priv->clipboard_change_handler = g_signal_connect (G_OBJECT (gtk_clipboard_get (GDK_SELECTION_PRIMARY)), "owner-change", G_CALLBACK (modest_msg_view_window_clipboard_owner_change), obj); g_signal_connect (G_OBJECT(priv->msg_view), "activate_link", G_CALLBACK (modest_ui_actions_on_msg_link_clicked), obj); g_signal_connect (G_OBJECT(priv->msg_view), "link_hover", @@ -857,8 +862,10 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, TnyFolder *header_folder = NULL; ModestHeaderView *header_view = NULL; ModestWindow *main_window = NULL; - - window = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL); + ModestWindowMgr *mgr = NULL; + + mgr = modest_runtime_get_window_mgr (); + window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr)); g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL); modest_msg_view_window_construct (window, modest_account_name, msg_uid); @@ -868,8 +875,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg, /* Remember the message list's TreeModel so we can detect changes * and change the list selection when necessary: */ - main_window = modest_window_mgr_get_main_window( - modest_runtime_get_window_mgr(), FALSE); /* don't create */ + main_window = modest_window_mgr_get_main_window(mgr, FALSE); /* don't create */ if (!main_window) { g_warning ("%s: BUG: no main window", __FUNCTION__); return NULL; @@ -933,8 +939,10 @@ modest_msg_view_window_new_for_search_result (TnyMsg *msg, { ModestMsgViewWindow *window = NULL; ModestMsgViewWindowPrivate *priv = NULL; + ModestWindowMgr *mgr = NULL; - window = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL); + mgr = modest_runtime_get_window_mgr (); + window = MODEST_MSG_VIEW_WINDOW (modest_window_mgr_get_msg_view_window (mgr)); g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW (window), NULL); modest_msg_view_window_construct (window, modest_account_name, msg_uid); @@ -955,10 +963,12 @@ modest_msg_view_window_new_for_attachment (TnyMsg *msg, const gchar *msg_uid) { GObject *obj = NULL; - ModestMsgViewWindowPrivate *priv; + ModestMsgViewWindowPrivate *priv; + ModestWindowMgr *mgr = NULL; + g_return_val_if_fail (msg, NULL); - - obj = g_object_new(MODEST_TYPE_MSG_VIEW_WINDOW, NULL); + mgr = modest_runtime_get_window_mgr (); + obj = G_OBJECT (modest_window_mgr_get_msg_view_window (mgr)); priv = MODEST_MSG_VIEW_WINDOW_GET_PRIVATE (obj); modest_msg_view_window_construct (MODEST_MSG_VIEW_WINDOW (obj), modest_account_name, msg_uid); diff --git a/src/maemo/ui/modest-msg-edit-window-ui.xml b/src/maemo/ui/modest-msg-edit-window-ui.xml index 71d2ff5..f67c433 100644 --- a/src/maemo/ui/modest-msg-edit-window-ui.xml +++ b/src/maemo/ui/modest-msg-edit-window-ui.xml @@ -30,7 +30,7 @@ - + @@ -114,7 +114,7 @@ - + diff --git a/src/modest-widget-memory.c b/src/modest-widget-memory.c index 9e543db..97f647f 100644 --- a/src/modest-widget-memory.c +++ b/src/modest-widget-memory.c @@ -381,6 +381,7 @@ restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view, if (modest_conf_key_exists (conf, sort_key, NULL)) { gchar *value = modest_conf_get_string (conf, sort_key, NULL); sscanf (value, "%d:%d:%d", &sort_colid, &sort_type, &sort_flag_id); + g_free (value); } if (modest_conf_key_exists (conf, key, NULL)) { diff --git a/src/widgets/modest-combo-box.c b/src/widgets/modest-combo-box.c index 8956df8..6c066fe 100644 --- a/src/widgets/modest-combo-box.c +++ b/src/widgets/modest-combo-box.c @@ -147,6 +147,20 @@ get_model (ModestPairList *pairs) return GTK_TREE_MODEL (store); } +void +modest_combo_box_set_pair_list (ModestComboBox *combo, ModestPairList *pairs) +{ + GtkTreeModel *model; + + model = get_model (pairs); + + gtk_combo_box_set_model (GTK_COMBO_BOX(combo), model); + g_object_unref (model); + + gtk_combo_box_set_active (GTK_COMBO_BOX(combo), 0); +} + + GtkWidget* modest_combo_box_new (ModestPairList *pairs, GEqualFunc id_equal_func) @@ -156,8 +170,6 @@ modest_combo_box_new (ModestPairList *pairs, GEqualFunc id_equal_func) GObject *obj; ModestComboBoxPrivate *priv; - g_return_val_if_fail (pairs, NULL); - obj = G_OBJECT(g_object_new(MODEST_TYPE_COMBO_BOX, NULL)); priv = MODEST_COMBO_BOX_GET_PRIVATE(obj); diff --git a/src/widgets/modest-combo-box.h b/src/widgets/modest-combo-box.h index bf464cd..060266c 100644 --- a/src/widgets/modest-combo-box.h +++ b/src/widgets/modest-combo-box.h @@ -83,6 +83,15 @@ GtkWidget* modest_combo_box_new (ModestPairList* pairs, GEqualFunc id_equal_func); /** + * modest_combo_box_set_pair_list: + * @combo: a #ModestComboBox + * @pairs: a #ModestPairList + * + * sets the model of the combobox with a new pair list. + */ +void modest_combo_box_set_pair_list (ModestComboBox *combo, + ModestPairList *pairs); +/** * modest_combo_box_get_active_id * @self: a valid ModestComboBox instance * diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index 0638190..42e14e1 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -84,6 +84,10 @@ struct _ModestWindowMgrPrivate { guint closing_time; GSList *modal_handler_uids; + GtkWidget *cached_view; + GtkWidget *cached_editor; + guint idle_load_view_id; + guint idle_load_editor_id; }; #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ MODEST_TYPE_WINDOW_MGR, \ @@ -147,6 +151,42 @@ modest_window_mgr_class_init (ModestWindowMgrClass *klass) G_TYPE_NONE, 0); } +static gboolean +idle_load_view (ModestWindowMgr *mgr) +{ + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (mgr); + + priv->cached_view = g_object_new (MODEST_TYPE_MSG_VIEW_WINDOW, NULL); + priv->idle_load_view_id = 0; + return FALSE; +} + +static gboolean +idle_load_editor (ModestWindowMgr *mgr) +{ + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (mgr); + + priv->cached_editor = g_object_new (MODEST_TYPE_MSG_EDIT_WINDOW, NULL); + priv->idle_load_editor_id = 0; + return FALSE; +} + +static void +load_new_view (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + if ((priv->cached_view == NULL) && (priv->idle_load_view_id == 0)) + priv->idle_load_view_id = g_idle_add ((GSourceFunc) idle_load_view, self); +} + +static void +load_new_editor (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + if ((priv->cached_editor == NULL) && (priv->idle_load_editor_id == 0)) + priv->idle_load_editor_id = g_idle_add ((GSourceFunc) idle_load_editor, self); +} + static void modest_window_mgr_init (ModestWindowMgr *obj) { @@ -170,6 +210,8 @@ modest_window_mgr_init (ModestWindowMgr *obj) priv->closing_time = 0; priv->modal_handler_uids = NULL; + priv->cached_view = NULL; + priv->cached_editor = NULL; } static void @@ -177,6 +219,25 @@ modest_window_mgr_finalize (GObject *obj) { ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj); + if (priv->idle_load_view_id > 0) { + g_source_remove (priv->idle_load_view_id); + priv->idle_load_view_id = 0; + } + + if (priv->idle_load_editor_id > 0) { + g_source_remove (priv->idle_load_editor_id); + priv->idle_load_editor_id = 0; + } + + if (priv->cached_view) { + gtk_widget_destroy (priv->cached_view); + priv->cached_view = NULL; + } + if (priv->cached_editor) { + gtk_widget_destroy (priv->cached_editor); + priv->cached_editor = NULL; + } + if (priv->window_list) { GList *iter = priv->window_list; /* unregister pending windows */ @@ -521,6 +582,8 @@ modest_window_mgr_register_window (ModestWindowMgr *self, return; } else { priv->main_window = window; + load_new_view (self); + load_new_editor (self); } } @@ -1087,3 +1150,37 @@ modest_window_mgr_num_windows (ModestWindowMgr *self) return num_windows; } + +GtkWidget * +modest_window_mgr_get_msg_edit_window (ModestWindowMgr *self) +{ + GtkWidget *result; + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + + if (priv->cached_editor) { + result = priv->cached_editor; + priv->cached_editor = NULL; + load_new_editor (self); + } else { + result = g_object_new (MODEST_TYPE_MSG_EDIT_WINDOW, NULL); + } + + return result; +} + +GtkWidget * +modest_window_mgr_get_msg_view_window (ModestWindowMgr *self) +{ + GtkWidget *result; + ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(self); + + if (priv->cached_view) { + result = priv->cached_view; + priv->cached_view = NULL; + load_new_view (self); + } else { + result = g_object_new (MODEST_TYPE_MSG_VIEW_WINDOW, NULL); + } + + return result; +} diff --git a/src/widgets/modest-window-mgr.h b/src/widgets/modest-window-mgr.h index 3f697b9..60ef0ae 100644 --- a/src/widgets/modest-window-mgr.h +++ b/src/widgets/modest-window-mgr.h @@ -299,6 +299,28 @@ void modest_window_mgr_save_state_for_all_windows (ModestWindowMgr *self); * Returns: the number of already registered windows **/ gint modest_window_mgr_num_windows (ModestWindowMgr *self); + +/** + * modest_window_mgr_get_msg_view_window: + * @self: a #ModestWindowMgr + * + * obtain a cached #ModestMsgViewWindow if available, or construct a new + * one. + * + * Returns: a #ModestMsgViewWindow + */ +GtkWidget * modest_window_mgr_get_msg_view_window (ModestWindowMgr *self); + +/** + * modest_window_mgr_get_msg_edit_window: + * @self: a #ModestWindowMgr + * + * obtain a cached #ModestMsgEditWindow if available, or construct a new + * one. + * + * Returns: a #ModestMsgEditWindow + */ +GtkWidget * modest_window_mgr_get_msg_edit_window (ModestWindowMgr *self); G_END_DECLS