* src/modest-dimming-rules-group.[ch]:
authorJose Dapena Paz <jdapena@igalia.com>
Tue, 11 Sep 2007 09:17:43 +0000 (09:17 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Tue, 11 Sep 2007 09:17:43 +0000 (09:17 +0000)
        * Added new method modest_dimming_rules_group_add_widget_rule.
          This method connects a dimming rule to a widget in the group,
          so that we can connect rules to widgets outside an ui manager.
        * Refactored some code to add rules to the dimming rules group
          from the methods add_rules and add_widget_rule.
* src/modest-dimming-rule.[ch]:
        * Now dimming rules can be connected to widgets, not only to
          ui manager action paths.
        * Added new methods for getting the action path and connected
          widget from outside.
* src/gnome/modest-main-window.c:
        * Adapted to change in in modest_main_window_get_child_widget
          type.
* src/widgets/modest-msg-edit-window.h:
        * Added method modest_msg_edit_window_get_child_widget to access
          editor widgets from external methods (in particular from
          ui dimming rules).
        * Added methods to get can-undo and can-redo status.
* src/widgets/modest-msg-edit-window-ui.h:
        * Added ui action handlers for menu parents, so that we can run
          dimming rules.
* src/widgets/modest-main-window.h:
        * Changed modest_main_window_get_child_widget types to have a
          proper namespace (instead of MODEST_WIDGET_TYPE_* now we have
          MODEST_MAIN_WINDOW_WIDGET_TYPE_*).
* src/modest-ui-actions.[ch]:
        * Adapted calls to modest_main_window_get_child_widget new api.
        * Added new method modest_ui_actions_on_format_menu_activated,
          to run the dimming rules on showing the format menu.
* src/dbus_api/modest-dbus-callback.c:
        * Adapted calls to modest_main_window_get_child_widget new api.
* src/maemo/modest-msg-edit-window.c:
        * Removed insensitive handlers, as now they're managed in
          dimming manager. In particular, we remove methods
          send_insensitive_press, style_insensitive_press,
          setup_insensitive_handlers.
        * Added "move-cursor" signal handler subject_field_move_cursor.
          This is required because moving cursor in a way that drops
          selection in a GtkEntry does not change primary clipboard
          selection.
        * Removed methods to update dimming status, as this is now
          managed in dimming manager. In particular we drop
          update_dimmed, update_paste_dimming,
          update_remove_attachment_dimming, update_copy_cut_dimming,
          update_select_all_dimming, update_zoom_dimming,
          update_send_dimming.
        * Also removed methods to handle menu activation, as this is now
          handled in the ui manager.
        * Added methods to get the can_undo and can_redo status. This is
          updated through signal handlers of wptextbuffer, as this does
          not provide a method to check this on real time.
        * Added signal handler for owner change in default clipboard
          (required to manage properly paste dimming).
        * Now we use dimming rules for toolbar, menus and clipboard
          based actions. We also use specific dimming rule binding for
          the widgets that we don't get from ui manager (font size and
          face selection, color selection).
        * Implementation of new method
          modest_msg_edit_window_get_child_widget, to access children
          from outside (in particular from dimming rules).
* src/maemo/modest-platform.c:
        * Adapted calls to modest_main_window_get_child_widget new api.
* src/maemo/modest-msg-view-window.c:
        * Adapted calls to modest_main_window_get_child_widget new api.
* src/maemo/modest-main-window.c:
        * Adapted calls to modest_main_window_get_child_widget new api.
* src/modest-ui-dimming-rules.[ch]:
        * Adapted calls to modest_main_window_get_child_widget new api.
        * (..._on_select_all): added implementation for editor widget.
        * (..._on_undo): added implementation for editor widget.
        * New dimming rule ..._on_redo.
        * New dimming rule ..._on_set_style, for style operations of
          message editor.
        * New dimming rule ..._on_zoom for editor (we can only zoom
          when focus is on body).
        * New dimming rule ..._on_editor_paste. This operation depends
          on clipboard, so it cannot be hooked in menu activation
          methods.
        * New dimming rule ..._on_editor_remove_attachment for editor.
        * New dimming rule ..._on_send for editor.
        * Added support in _invalid_clipboard_selected for editor.

pmo-trunk-r3264

18 files changed:
src/dbus_api/modest-dbus-callbacks.c
src/gnome/modest-main-window.c
src/maemo/modest-main-window.c
src/maemo/modest-msg-edit-window-ui-dimming.h [new file with mode: 0644]
src/maemo/modest-msg-edit-window.c
src/maemo/modest-msg-view-window.c
src/maemo/modest-platform.c
src/modest-dimming-rule.c
src/modest-dimming-rule.h
src/modest-dimming-rules-group.c
src/modest-dimming-rules-group.h
src/modest-ui-actions.c
src/modest-ui-actions.h
src/modest-ui-dimming-rules.c
src/modest-ui-dimming-rules.h
src/widgets/modest-main-window.h
src/widgets/modest-msg-edit-window-ui.h
src/widgets/modest-msg-edit-window.h

index 9f2f5d6..89fd2e7 100644 (file)
@@ -842,7 +842,7 @@ on_idle_delete_message (gpointer user_data)
         * so they would appear with a strike-through until then):
         */
        ModestHeaderView *header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget (
-               MODEST_MAIN_WINDOW(win), MODEST_WIDGET_TYPE_HEADER_VIEW));
+               MODEST_MAIN_WINDOW(win), MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
        if (header_view && MODEST_IS_HEADER_VIEW (header_view))
                modest_header_view_refilter (header_view);
        
@@ -934,7 +934,7 @@ on_idle_open_default_inbox(gpointer user_data)
 
        /* Get the folder view */
        GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
        
        gdk_threads_leave (); /* CHECKED */
index 5d07395..d987c29 100644 (file)
@@ -230,23 +230,23 @@ modest_main_window_finalize (GObject *obj)
 
 GtkWidget*
 modest_main_window_get_child_widget (ModestMainWindow *self,
-                                    ModestWidgetType widget_type)
+                                    ModestMainWindowWidgetType widget_type)
 {
        ModestMainWindowPrivate *priv;
        GtkWidget *widget;
        
        g_return_val_if_fail (self, NULL);
-       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_WIDGET_TYPE_NUM,
+       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM,
                              NULL);
                                
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
 
        switch (widget_type) {
-       case MODEST_WIDGET_TYPE_HEADER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW:
                widget = (GtkWidget*)priv->header_view; break;
-       case MODEST_WIDGET_TYPE_FOLDER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW:
                widget = (GtkWidget*)priv->folder_view; break;
-       case MODEST_WIDGET_TYPE_MSG_PREVIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_MSG_PREVIEW:
                widget = (GtkWidget*)priv->msg_preview; break;
        default:
                g_return_val_if_reached (NULL);
index ebd9fde..587daa7 100644 (file)
@@ -397,21 +397,21 @@ modest_main_window_finalize (GObject *obj)
 
 GtkWidget*
 modest_main_window_get_child_widget (ModestMainWindow *self,
-                                    ModestWidgetType widget_type)
+                                    ModestMainWindowWidgetType widget_type)
 {
        ModestMainWindowPrivate *priv;
        GtkWidget *widget;
        
        g_return_val_if_fail (self, NULL);
-       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_WIDGET_TYPE_NUM,
+       g_return_val_if_fail (widget_type >= 0 && widget_type < MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM,
                              NULL);
        
        priv = MODEST_MAIN_WINDOW_GET_PRIVATE(self);
 
        switch (widget_type) {
-       case MODEST_WIDGET_TYPE_HEADER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW:
                widget = (GtkWidget*)priv->header_view; break;
-       case MODEST_WIDGET_TYPE_FOLDER_VIEW:
+       case MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW:
                widget = (GtkWidget*)priv->folder_view; break;
        default:
                return NULL;
@@ -1213,11 +1213,11 @@ modest_main_window_new (void)
        modest_dimming_rules_group_add_rules (menu_rules_group, 
                                              modest_main_window_menu_dimming_entries,
                                              G_N_ELEMENTS (modest_main_window_menu_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (toolbar_rules_group, 
                                              modest_main_window_toolbar_dimming_entries,
                                              G_N_ELEMENTS (modest_main_window_toolbar_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
 
        /* Insert dimming rules group for this window */
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
diff --git a/src/maemo/modest-msg-edit-window-ui-dimming.h b/src/maemo/modest-msg-edit-window-ui-dimming.h
new file mode 100644 (file)
index 0000000..c22e90d
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef __MODEST_MSG_EDIT_WINDOW_UI_DIMMING_PRIV_H__
+#define __MODEST_MSG_EDIT_WINDOW_UI_DIMMING_PRIV_H__
+
+#include "modest-dimming-rules-group.h"
+#include "modest-ui-dimming-rules.h"
+
+G_BEGIN_DECLS
+
+
+/* Menu Dimming rules entries */
+static const ModestDimmingEntry modest_msg_edit_window_menu_dimming_entries [] = {
+
+       /* Format Menu */
+       { "/MenuBar/FormatMenu/SelectFontMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },
+       { "/MenuBar/FormatMenu/AlignmentMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },
+       { "/MenuBar/FormatMenu/AlignmentLeftMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },
+       { "/MenuBar/FormatMenu/AlignmentRightMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },
+       { "/MenuBar/FormatMenu/AlignmentCenterMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },
+       { "/MenuBar/FormatMenu/InsertImageMenu", G_CALLBACK (modest_ui_dimming_rules_on_set_style) },   
+       { "/MenuBar/ViewMenu/ZoomMenu", G_CALLBACK (modest_ui_dimming_rules_on_zoom) }, 
+       { "/MenuBar/EditMenu/SelectAllMenu", G_CALLBACK (modest_ui_dimming_rules_on_select_all) },      
+       { "/MenuBar/EditMenu/UndoMenu", G_CALLBACK (modest_ui_dimming_rules_on_undo) }, 
+       { "/MenuBar/EditMenu/RedoMenu", G_CALLBACK (modest_ui_dimming_rules_on_redo) }, 
+       { "/MenuBar/AttachmentsMenu/RemoveAttachmentsMenu", G_CALLBACK (modest_ui_dimming_rules_on_editor_remove_attachment) }, 
+
+};
+
+/* Menu Dimming rules entries */
+static const ModestDimmingEntry modest_msg_edit_window_toolbar_dimming_entries [] = {
+
+       /* Toolbar */
+       { "/ToolBar/ToolbarSend", G_CALLBACK(modest_ui_dimming_rules_on_send) },
+       { "/ToolBar/ActionsBold", G_CALLBACK(modest_ui_dimming_rules_on_set_style) },
+       { "/ToolBar/ActionsItalics", G_CALLBACK(modest_ui_dimming_rules_on_set_style) },
+};
+
+/* Clipboard Dimming rules entries */
+static const ModestDimmingEntry modest_msg_edit_window_clipboard_dimming_entries [] = {
+
+       /* Toolbar */
+       { "/MenuBar/EditMenu/CutMenu", G_CALLBACK(modest_ui_dimming_rules_on_cut) },
+       { "/MenuBar/EditMenu/CopyMenu", G_CALLBACK(modest_ui_dimming_rules_on_copy) },
+       { "/MenuBar/EditMenu/PasteMenu", G_CALLBACK(modest_ui_dimming_rules_on_editor_paste) },
+};
+
+G_END_DECLS
+#endif /* __MODEST_MSG_VIEW_WINDOW_UI_PRIV_H__ */
index dd814c2..fb5f411 100644 (file)
@@ -62,6 +62,7 @@
 #include <wptextview.h>
 #include <wptextbuffer.h>
 #include "modest-scroll-area.h"
+#include "modest-msg-edit-window-ui-dimming.h"
 
 #include "modest-hildon-includes.h"
 #ifdef MODEST_HAVE_HILDON0_WIDGETS
@@ -92,9 +93,6 @@ static void  modest_msg_edit_window_finalize     (GObject *obj);
 static gboolean msg_body_focus (GtkWidget *focus, GdkEventFocus *event, gpointer userdata);
 static void  body_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor);
 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  setup_insensitive_handlers (ModestMsgEditWindow *editor);
 static void  reset_modified (ModestMsgEditWindow *editor);
 
 static void  text_buffer_refresh_attributes (WPTextBuffer *buffer, ModestMsgEditWindow *window);
@@ -136,14 +134,12 @@ 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 subject_field_move_cursor (GtkEntry *entry,
+                                      GtkMovementStep step,
+                                      gint a1,
+                                      gboolean a2,
+                                      gpointer userdata);
 static void update_window_title (ModestMsgEditWindow *window);
-static void update_dimmed (ModestMsgEditWindow *window);
-static void update_paste_dimming (ModestMsgEditWindow *window);
-static void update_remove_attachment_dimming (ModestMsgEditWindow *window);
-static void update_copy_cut_dimming (ModestMsgEditWindow *window);
-static void update_select_all_dimming (ModestMsgEditWindow *window);
-static void update_zoom_dimming (ModestMsgEditWindow *window);
-static void update_send_dimming (ModestMsgEditWindow *window);
 
 /* Find toolbar */
 static void modest_msg_edit_window_find_toolbar_search (GtkWidget *widget,
@@ -200,11 +196,6 @@ static void DEBUG_BUFFER (WPTextBuffer *buffer)
 /*             GdkEventKey *event, */
 /*             gpointer user_data); */
 
-static void edit_menu_activated (GtkAction *action,
-                                gpointer userdata);
-static void view_menu_activated (GtkAction *action,
-                                gpointer userdata);
-
 /* list my signals */
 enum {
        /* MY_SIGNAL_1, */
@@ -257,7 +248,9 @@ struct _ModestMsgEditWindowPrivate {
 
        gdouble zoom_level;
        
+       gboolean    can_undo, can_redo;
        gulong      clipboard_change_handler_id;
+       gulong      default_clipboard_change_handler_id;
 
        TnyMsg      *draft_msg;
        TnyMsg      *outbox_msg;
@@ -367,7 +360,11 @@ modest_msg_edit_window_init (ModestMsgEditWindow *obj)
        priv->draft_msg = NULL;
        priv->outbox_msg = NULL;
        priv->msg_uid = NULL;
+
+       priv->can_undo = FALSE;
+       priv->can_redo = FALSE;
        priv->clipboard_change_handler_id = 0;
+       priv->default_clipboard_change_handler_id = 0;
        priv->sent = FALSE;
 
        priv->last_vadj_upper = 0;
@@ -411,18 +408,6 @@ get_transports (void)
        return transports;
 }
 
-static gboolean attachment_view_focus_lost (
-               GtkWidget *widget,
-               GdkEventFocus *event,
-               ModestMsgEditWindow *window)
-{
-       g_return_val_if_fail(MODEST_IS_MSG_EDIT_WINDOW(window), FALSE);
-
-       update_remove_attachment_dimming(window);
-
-       return FALSE;
-}
-
 void vadj_changed (GtkAdjustment *adj,
                   ModestMsgEditWindow *window)
 {
@@ -504,8 +489,6 @@ init_window (ModestMsgEditWindow *obj)
        gtk_container_add (GTK_CONTAINER (priv->add_attachment_button), attachment_icon);
        gtk_box_pack_start (GTK_BOX (subject_box), priv->add_attachment_button, FALSE, FALSE, 0);
        priv->attachments_view = modest_attachments_view_new (NULL);
-       g_signal_connect (G_OBJECT (priv->attachments_view), "focus-out-event",
-                         G_CALLBACK (attachment_view_focus_lost), obj);
        
        priv->header_box = gtk_vbox_new (FALSE, 0);
        
@@ -586,8 +569,8 @@ init_window (ModestMsgEditWindow *obj)
                          "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);
-       recpt_field_changed (modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field)), MODEST_MSG_EDIT_WINDOW (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);
@@ -620,6 +603,8 @@ init_window (ModestMsgEditWindow *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);
 
 }
        
@@ -632,6 +617,10 @@ modest_msg_edit_window_disconnect_signals (ModestWindow *window)
                                           priv->clipboard_change_handler_id))
                g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_PRIMARY), 
                                             priv->clipboard_change_handler_id);
+       if (g_signal_handler_is_connected (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), 
+                                          priv->default_clipboard_change_handler_id))
+               g_signal_handler_disconnect (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), 
+                                            priv->default_clipboard_change_handler_id);
 }
 
 static void
@@ -881,7 +870,7 @@ set_msg (ModestMsgEditWindow *self, TnyMsg *msg, gboolean preserve_is_rich)
 
        reset_modified (self);
 
-       update_dimmed (self);
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
        text_buffer_can_undo (priv->text_buffer, FALSE, self);
        text_buffer_can_redo (priv->text_buffer, FALSE, self);
 
@@ -1107,6 +1096,9 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        GtkAction *action;
        ModestConf *conf;
        ModestPair *account_pair = NULL;
+       ModestDimmingRulesGroup *menu_rules_group = NULL;
+       ModestDimmingRulesGroup *toolbar_rules_group = NULL;
+       ModestDimmingRulesGroup *clipboard_rules_group = NULL;
 
        g_return_val_if_fail (msg, NULL);
        g_return_val_if_fail (account_name, NULL);
@@ -1192,12 +1184,45 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        modest_msg_edit_window_setup_toolbar (MODEST_MSG_EDIT_WINDOW (obj));
        hildon_window_add_toolbar (HILDON_WINDOW (obj), GTK_TOOLBAR (priv->find_toolbar));
 
-       setup_insensitive_handlers (MODEST_MSG_EDIT_WINDOW (obj));
-
        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);
 
+       parent_priv->ui_dimming_manager = modest_ui_dimming_manager_new ();
+       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 dimming rules */
+       modest_dimming_rules_group_add_rules (menu_rules_group, 
+                                             modest_msg_edit_window_menu_dimming_entries,
+                                             G_N_ELEMENTS (modest_msg_edit_window_menu_dimming_entries),
+                                             MODEST_WINDOW (obj));
+       modest_dimming_rules_group_add_rules (toolbar_rules_group, 
+                                             modest_msg_edit_window_toolbar_dimming_entries,
+                                             G_N_ELEMENTS (modest_msg_edit_window_toolbar_dimming_entries),
+                                             MODEST_WINDOW (obj));
+       modest_dimming_rules_group_add_widget_rule (toolbar_rules_group, priv->font_color_button,
+                                                   G_CALLBACK (modest_ui_dimming_rules_on_set_style),
+                                                   MODEST_WINDOW (obj));
+       modest_dimming_rules_group_add_widget_rule (toolbar_rules_group, priv->font_size_toolitem,
+                                                   G_CALLBACK (modest_ui_dimming_rules_on_set_style),
+                                                   MODEST_WINDOW (obj));
+       modest_dimming_rules_group_add_widget_rule (toolbar_rules_group, priv->font_face_toolitem,
+                                                   G_CALLBACK (modest_ui_dimming_rules_on_set_style),
+                                                   MODEST_WINDOW (obj));
+       modest_dimming_rules_group_add_rules (clipboard_rules_group, 
+                                             modest_msg_edit_window_clipboard_dimming_entries,
+                                             G_N_ELEMENTS (modest_msg_edit_window_clipboard_dimming_entries),
+                                             MODEST_WINDOW (obj));
+       /* Insert dimming rules group for this window */
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, toolbar_rules_group);
+       modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, clipboard_rules_group);
+        /* Checks the dimming rules */
+       g_object_unref (menu_rules_group);
+       g_object_unref (toolbar_rules_group);
+       g_object_unref (clipboard_rules_group);
+
        set_msg (MODEST_MSG_EDIT_WINDOW (obj), msg, preserve_is_rich);
 
        text_buffer_refresh_attributes (WP_TEXT_BUFFER (priv->text_buffer), MODEST_MSG_EDIT_WINDOW (obj));
@@ -1209,6 +1234,9 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
                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);
@@ -1217,13 +1245,6 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        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");
        modest_maemo_toggle_action_set_active_block_notify (GTK_TOGGLE_ACTION (action),
@@ -1232,7 +1253,7 @@ modest_msg_edit_window_new (TnyMsg *msg, const gchar *account_name, gboolean pre
        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));
 
-       update_paste_dimming (MODEST_MSG_EDIT_WINDOW (obj));
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
        priv->update_caption_visibility = TRUE;
 
        reset_modified (MODEST_MSG_EDIT_WINDOW (obj));
@@ -2378,7 +2399,7 @@ modest_msg_edit_window_set_file_format (ModestMsgEditWindow *window,
                }
                        break;
                }
-               update_dimmed (window);
+               modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
        }
 }
 
@@ -2524,7 +2545,7 @@ modest_msg_edit_window_undo (ModestMsgEditWindow *window)
        
        wp_text_buffer_undo (WP_TEXT_BUFFER (priv->text_buffer));
 
-       update_dimmed (window);
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 
 }
 
@@ -2538,91 +2559,47 @@ modest_msg_edit_window_redo (ModestMsgEditWindow *window)
        
        wp_text_buffer_redo (WP_TEXT_BUFFER (priv->text_buffer));
 
-       update_dimmed (window);
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 
 }
 
-static void
-update_dimmed (ModestMsgEditWindow *window)
+static void  
+text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window)
 {
        ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-       GtkAction *action;
-       GtkWidget *widget;
-       gboolean rich_text;
-       gboolean editor_focused;
 
-       rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer));
-       editor_focused = gtk_widget_is_focus (priv->msg_body);
-
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/SelectFontMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-/*     action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/BulletedListMenu"); */
-/*     gtk_action_set_sensitive (action, rich_text && editor_focused); */
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentLeftMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentCenterMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/FormatMenu/AlignmentMenu/AlignmentRightMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/AttachmentsMenu/InsertImageMenu");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsBold");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
-       gtk_action_set_sensitive (action, rich_text && editor_focused);
-       widget = priv->font_color_button;
-       gtk_widget_set_sensitive (widget, rich_text && editor_focused);
-       widget = priv->font_size_toolitem;
-       gtk_widget_set_sensitive (widget, rich_text && editor_focused);
-       widget = priv->font_face_toolitem;
-       gtk_widget_set_sensitive (widget, rich_text && editor_focused);
+       priv->can_undo = can_undo;
 }
 
-static void
-setup_insensitive_handlers (ModestMsgEditWindow *window)
+static void  
+text_buffer_can_redo (GtkTextBuffer *buffer, gboolean can_redo, ModestMsgEditWindow *window)
 {
-       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
        ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-       GtkWidget *widget;
-
-       widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ToolbarSend");
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (send_insensitive_press), window);
-       widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsBold");
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
-       widget = gtk_ui_manager_get_widget (parent_priv->ui_manager, "/ToolBar/ActionsItalics");
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
-       widget = priv->font_color_button;
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
-       widget = priv->font_size_toolitem;
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
-       widget = priv->font_face_toolitem;
-       g_signal_connect (G_OBJECT (widget), "insensitive-press", G_CALLBACK (style_insensitive_press), window);
 
+       priv->can_redo = can_redo;
 }
 
-static void  
-text_buffer_can_undo (GtkTextBuffer *buffer, gboolean can_undo, ModestMsgEditWindow *window)
+gboolean            
+modest_msg_edit_window_can_undo (ModestMsgEditWindow *window)
 {
-       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-       GtkAction *action;
+       ModestMsgEditWindowPrivate *priv;
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), FALSE);
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
 
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/UndoMenu");
-       gtk_action_set_sensitive (action, can_undo);
+       return priv->can_undo;
 }
 
-static void  
-text_buffer_can_redo (GtkTextBuffer *buffer, gboolean can_redo, ModestMsgEditWindow *window)
+gboolean            
+modest_msg_edit_window_can_redo (ModestMsgEditWindow *window)
 {
-       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-       GtkAction *action;
+       ModestMsgEditWindowPrivate *priv;
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (window), FALSE);
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
 
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/RedoMenu");
-       gtk_action_set_sensitive (action, can_redo);
+       return priv->can_redo;
 }
 
+
 static void
 text_buffer_delete_images_by_id (GtkTextBuffer *buffer, const gchar * image_id)
 {
@@ -2678,7 +2655,7 @@ msg_body_focus (GtkWidget *focus,
                gpointer userdata)
 {
        
-       update_dimmed (MODEST_MSG_EDIT_WINDOW (userdata));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (userdata));
        return FALSE;
 }
 
@@ -2686,40 +2663,13 @@ static void
 recpt_field_changed (GtkTextBuffer *buffer,
                  ModestMsgEditWindow *editor)
 {
-        update_send_dimming (editor);
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (editor));
 }
 
 static void
 body_changed (GtkTextBuffer *buffer, ModestMsgEditWindow *editor)
 {
-        update_send_dimming (editor);
-}
-
-static void  
-send_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
-{
-       ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
-        const gchar *subject = gtk_entry_get_text (GTK_ENTRY (priv->subject_field));
-        if (message_is_empty(editor) || (subject == NULL || subject[0] == '\0')) {
-                hildon_banner_show_information (NULL, NULL, _("mcen_ib_subject_or_body_not_modified"));
-        } else {
-                hildon_banner_show_information (NULL, NULL, _("mcen_ib_add_recipients_first"));
-        }
-}
-
-static void
-style_insensitive_press (GtkWidget *widget, ModestMsgEditWindow *editor)
-{
-       gboolean rich_text, editor_focused;
-
-       ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (editor);
-       rich_text = wp_text_buffer_is_rich_text (WP_TEXT_BUFFER (priv->text_buffer));
-       editor_focused = gtk_widget_is_focus (priv->msg_body);
-
-       if (!rich_text)
-               hildon_banner_show_information (NULL, NULL, _("mcen_ib_item_unavailable_plaintext"));
-       else if (!editor_focused)
-               hildon_banner_show_information (NULL, NULL, _("mcen_ib_move_cursor_to_message"));
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (editor));
 }
 
 static void
@@ -2814,9 +2764,19 @@ modest_msg_edit_window_clipboard_owner_change (GtkClipboard *clipboard,
        if (!GTK_WIDGET_VISIBLE (window))
                return;
 
-       update_remove_attachment_dimming (window);
-       update_copy_cut_dimming (window);
-       update_paste_dimming (window);
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules");
+}
+static void 
+subject_field_move_cursor (GtkEntry *entry,
+                          GtkMovementStep step,
+                          gint a1,
+                          gboolean a2,
+                          gpointer window)
+{
+       if (!GTK_WIDGET_VISIBLE (window))
+               return;
+
+       modest_window_check_dimming_rules_group (MODEST_WINDOW (window), "ModestClipboardDimmingRules");
 }
 
 static void 
@@ -2841,7 +2801,7 @@ subject_field_changed (GtkEditable *editable,
        ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
        update_window_title (window);
        gtk_text_buffer_set_modified (priv->text_buffer, TRUE);
-        update_send_dimming (window);
+       modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
 }
 
 static void  
@@ -3034,170 +2994,6 @@ modest_msg_edit_window_find_toolbar_close (GtkWidget *widget,
        gtk_toggle_action_set_active (toggle, FALSE);
 }
 
-static void 
-update_remove_attachment_dimming (ModestMsgEditWindow *window)
-{
-       ModestWindowPrivate *parent_priv;
-       ModestMsgEditWindowPrivate *priv;
-       GtkAction *action;
-       GList *selected_attachments = NULL;
-       gint n_att_selected = 0;
-
-       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-       parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-
-       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);
-}
-
-static void 
-update_copy_cut_dimming (ModestMsgEditWindow *window)
-{
-       ModestWindowPrivate *parent_priv = NULL;
-       ModestMsgEditWindowPrivate *priv = NULL;
-       GtkAction *action = NULL;
-       gboolean has_selection = FALSE;
-       GtkWidget *focused = NULL;
-
-       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-       parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-       focused = gtk_window_get_focus (GTK_WINDOW (window));
-
-       if (GTK_IS_TEXT_VIEW (focused)) {
-               GtkTextBuffer *buffer = NULL;
-               buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
-               has_selection = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer));
-       } else if (GTK_IS_EDITABLE (focused)) {
-               has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
-       }
-
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
-       gtk_action_set_sensitive (action, (has_selection) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CopyMenu");
-       gtk_action_set_sensitive (action, (has_selection) && (!MODEST_IS_ATTACHMENTS_VIEW (focused)));
-
-}
-
-static void 
-update_paste_dimming (ModestMsgEditWindow *window)
-{
-       ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-       GtkAction *action = NULL;
-       GtkClipboard *clipboard = NULL;
-       ModestEmailClipboard *e_clipboard;
-       GtkWidget *focused;
-       gboolean active;
-
-       focused = gtk_window_get_focus (GTK_WINDOW (window));
-
-       e_clipboard = modest_runtime_get_email_clipboard ();
-       if (!modest_email_clipboard_cleared (e_clipboard)) {
-               active = TRUE;
-       } else {
-               clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
-               active = gtk_clipboard_wait_is_text_available (clipboard);
-       }
-
-       if (active) {
-               if (MODEST_IS_ATTACHMENTS_VIEW (focused))
-                       active = FALSE;
-       }
-
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/PasteMenu");
-       gtk_action_set_sensitive (action, active);
-
-}
-
-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
-update_send_dimming (ModestMsgEditWindow *window)
-{
-        ModestWindowPrivate *parent_priv = MODEST_WINDOW_GET_PRIVATE (window);
-        ModestMsgEditWindowPrivate *priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (window);
-        GtkTextBuffer *to_buffer, *cc_buffer, *bcc_buffer;
-        const gchar *subject;
-       gboolean dim = FALSE;
-       GtkAction *action;
-
-       to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->to_field));
-       cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->cc_field));
-       bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (priv->bcc_field));
-        subject = gtk_entry_get_text (GTK_ENTRY (priv->subject_field));
-
-       dim = ((gtk_text_buffer_get_char_count (to_buffer) +
-               gtk_text_buffer_get_char_count (cc_buffer) +
-               gtk_text_buffer_get_char_count (bcc_buffer)) == 0)
-          || (subject == NULL || subject[0] == '\0')
-          || message_is_empty(window);
-
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/ToolBar/ToolbarSend");
-       gtk_action_set_sensitive (action, !dim);
-       action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EmailMenu/SendMenu");
-       gtk_action_set_sensitive (action, !dim);
-}
-
-static void
-edit_menu_activated (GtkAction *action,
-                    gpointer userdata)
-{
-       ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata);
-
-       update_select_all_dimming (window);
-       update_copy_cut_dimming (window);
-       update_paste_dimming (window);
-}
-static void
-view_menu_activated (GtkAction *action,
-                    gpointer userdata)
-{
-       ModestMsgEditWindow *window = MODEST_MSG_EDIT_WINDOW (userdata);
-
-       update_zoom_dimming (window);
-}
-
 gboolean 
 modest_msg_edit_window_get_sent (ModestMsgEditWindow *window)
 {
@@ -3295,3 +3091,36 @@ modest_msg_edit_window_get_message_uid (ModestMsgEditWindow *window)
 
        return priv->msg_uid;
 }
+
+GtkWidget *
+modest_msg_edit_window_get_child_widget (ModestMsgEditWindow *win,
+                                        ModestMsgEditWindowWidgetType widget_type)
+{
+       ModestMsgEditWindowPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), NULL);
+       priv = MODEST_MSG_EDIT_WINDOW_GET_PRIVATE (win);
+
+       switch (widget_type) {
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY:
+               return priv->msg_body;
+               break;
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO:
+               return priv->to_field;
+               break;
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC:
+               return priv->cc_field;
+               break;
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC:
+               return priv->bcc_field;
+               break;
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT:
+               return priv->subject_field;
+               break;
+       case MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS:
+               return priv->attachments_view;
+               break;
+       default:
+               return NULL;
+       }
+}
index 52f1450..eca3043 100644 (file)
@@ -587,7 +587,7 @@ modest_msg_view_window_disconnect_signals (ModestWindow *self)
 
        header_view = MODEST_HEADER_VIEW(
                        modest_main_window_get_child_widget(
-                       main_window, MODEST_WIDGET_TYPE_HEADER_VIEW));
+                       main_window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
 
        if (header_view == NULL)
                return;
@@ -753,15 +753,15 @@ modest_msg_view_window_construct (ModestMsgViewWindow *self, TnyMsg *msg,
        modest_dimming_rules_group_add_rules (menu_rules_group, 
                                              modest_msg_view_menu_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_menu_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (toolbar_rules_group, 
                                              modest_msg_view_toolbar_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_toolbar_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
        modest_dimming_rules_group_add_rules (clipboard_rules_group, 
                                              modest_msg_view_clipboard_dimming_entries,
                                              G_N_ELEMENTS (modest_msg_view_clipboard_dimming_entries),
-                                             self);
+                                             MODEST_WINDOW (self));
 
        /* Insert dimming rules group for this window */
        modest_ui_dimming_manager_insert_rules_group (parent_priv->ui_dimming_manager, menu_rules_group);
@@ -865,7 +865,7 @@ modest_msg_view_window_new_with_header_model (TnyMsg *msg,
                        modest_window_mgr_get_main_window(window_mgr));
        g_assert(main_window != NULL);
        header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget(
-                       main_window, MODEST_WIDGET_TYPE_HEADER_VIEW));
+                       main_window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
        if (header_view != NULL){
                header_folder = modest_header_view_get_folder(header_view);
                g_assert(header_folder != NULL);
index ae94a93..b88226f 100644 (file)
@@ -563,7 +563,7 @@ launch_sort_headers_dialog (GtkWindow *parent_window,
        /* Get header window */
        if (MODEST_IS_MAIN_WINDOW (parent_window)) {
                header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_window),
-                                                                                     MODEST_WIDGET_TYPE_HEADER_VIEW));
+                                                                                     MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
        }
        if (!header_view) return;
 
index 778f06d..49621cf 100644 (file)
@@ -39,6 +39,7 @@ struct _ModestDimmingRulePrivate {
        ModestWindow *win;
        ModestDimmingCallback dimming_rule;
        gchar *action_path;
+       GtkWidget *widget;
        gchar *notification;
 };
 
@@ -95,6 +96,7 @@ modest_dimming_rule_init (ModestDimmingRule *obj)
        priv->win = NULL;
        priv->dimming_rule = NULL;
        priv->action_path = NULL;
+       priv->widget = NULL;
        priv->notification = NULL;
 }
 
@@ -138,6 +140,28 @@ modest_dimming_rule_new(ModestWindow *win,
        return obj;
 }
 
+ModestDimmingRule*
+modest_dimming_rule_new_from_widget (ModestWindow *win,
+                                    ModestDimmingCallback dimming_rule,
+                                    GtkWidget *widget)
+{
+       ModestDimmingRule *obj;
+       ModestDimmingRulePrivate *priv;
+               
+       g_return_val_if_fail (MODEST_IS_WINDOW (win), NULL);
+       g_return_val_if_fail (dimming_rule != NULL, NULL);
+       g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+                             
+       obj = MODEST_DIMMING_RULE(g_object_new(MODEST_TYPE_DIMMING_RULE, NULL));
+
+       priv = MODEST_DIMMING_RULE_GET_PRIVATE(obj);
+       priv->win = win;
+       priv->dimming_rule = dimming_rule;
+       priv->widget = widget;
+
+       return obj;
+}
+
 
 void
 modest_dimming_rule_process (ModestDimmingRule *self)
@@ -150,17 +174,21 @@ modest_dimming_rule_process (ModestDimmingRule *self)
        priv = MODEST_DIMMING_RULE_GET_PRIVATE(self);
        g_return_if_fail (priv->win != NULL);
        g_return_if_fail (priv->dimming_rule != NULL);
-       g_return_if_fail (priv->action_path != NULL);
+       g_return_if_fail ((priv->action_path != NULL)|| GTK_IS_WIDGET (priv->widget));
 
        /* process dimming rule */
        dimmed = priv->dimming_rule (priv->win, self);
 
        /* Update dimming status */
-        action = modest_window_get_action (priv->win, priv->action_path);      
-       if (action == NULL)
-               g_printerr ("modest: action path '%s' has not associatd action\n", priv->action_path);
-       else
-               gtk_action_set_sensitive (action, !dimmed);
+       if (priv->action_path != NULL) {
+               action = modest_window_get_action (priv->win, priv->action_path);       
+               if (action != NULL)
+                       gtk_action_set_sensitive (action, !dimmed);
+               else
+                       g_printerr ("modest: action path '%s' has not associatd action\n", priv->action_path);
+       } else if (priv->widget != NULL) {
+               gtk_widget_set_sensitive (priv->widget, !dimmed);
+       }
 }
 
 void
@@ -222,3 +250,28 @@ modest_dimming_rule_get_notification (ModestDimmingRule *rule)
        
        return g_strdup(priv->notification);
 }
+
+GtkWidget *
+modest_dimming_rule_get_widget (ModestDimmingRule *rule)
+{
+       ModestDimmingRulePrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), NULL);
+       priv = MODEST_DIMMING_RULE_GET_PRIVATE(rule);
+
+       if (priv->action_path != NULL)
+               return modest_window_get_action_widget (MODEST_WINDOW (priv->win), priv->action_path);
+       else
+               return priv->widget;
+}
+
+const gchar *
+modest_dimming_rule_get_action_path (ModestDimmingRule *rule)
+{
+       ModestDimmingRulePrivate *priv = NULL;
+
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (rule), NULL);
+       priv = MODEST_DIMMING_RULE_GET_PRIVATE(rule);
+
+       return priv->action_path;
+}
index 2cd03c0..2dc553a 100644 (file)
@@ -82,6 +82,25 @@ ModestDimmingRule*    modest_dimming_rule_new     (ModestWindow *win,
                                                   ModestDimmingCallback dimming_rule,
                                                   const gchar *action_path);
 
+
+/**
+ * modest_dimming_rule_new:
+ * @win: the #ModestWindow object which executes dimming rule.
+ * @dimming_rule: a #ModestDimmingCallback function to check dimmed status.
+ * @widget: the widget the rule will apply to
+ * 
+ * Creates a new instance of class #ModestDimmingRule using parameters to
+ * fill private data, required to process dimming rules. All parameters
+ * are required and NULL will be returned if one of these parameters is
+ * invalid or NULL.
+ * 
+ * Returns: a new instance of #ModestDimmingRule class, or NULL, if parameters
+ * are invalid.
+ **/
+ModestDimmingRule*
+modest_dimming_rule_new_from_widget (ModestWindow *win,
+                                    ModestDimmingCallback dimming_rule,
+                                    GtkWidget *widget);
 /**
  * modest_dimming_rule_process:
  * @rule: a #ModestDimmingRule object to process.
@@ -116,6 +135,29 @@ void modest_dimming_rule_set_group (ModestDimmingRule *rule,
 ModestDimmingRulesGroup *
 modest_dimming_rule_get_group (ModestDimmingRule *rule);
 
+/**
+ * modest_dimming_rule_get_widget:
+ * @rule: a #ModestDimmingRule
+ *
+ * Widget the dimming rule is referenced to
+ *
+ * Returns: a #GtkWidget or %NULL if the dimming rule has no widget attached
+ */
+const gchar*
+modest_dimming_rule_get_action_path (ModestDimmingRule *rule);
+
+/**
+ * modest_dimming_rule_get_widget:
+ * @rule: a #ModestDimmingRule
+ *
+ * In case the dimming rule references directly a widget, it
+ * returns the widget.
+ *
+ * Returns: a #GtkWidget or %NULL if the dimming rule has no direct widget attached
+ */
+GtkWidget *
+modest_dimming_rule_get_widget (ModestDimmingRule *rule);
+
 void modest_dimming_rule_set_notification (ModestDimmingRule *rule,
                                           const gchar *notification);
 
index 4d9e05a..a7459e3 100644 (file)
@@ -39,6 +39,9 @@ static void modest_dimming_rules_group_finalize   (GObject *obj);
 
 static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data);
 
+static void _add_rule (ModestDimmingRulesGroup *self,
+                      ModestDimmingRule *rule,
+                      ModestWindow *window);
 
 typedef struct _ModestDimmingRulesGroupPrivate ModestDimmingRulesGroupPrivate;
 struct _ModestDimmingRulesGroupPrivate {       
@@ -46,6 +49,7 @@ struct _ModestDimmingRulesGroupPrivate {
        gchar *name;
        gboolean notifications_enabled;
        GHashTable *rules_map;
+       GSList *widget_rules;
 };
 
 
@@ -57,6 +61,7 @@ struct _ModestDimmingRulesGroupPrivate {
 static GObjectClass *parent_class = NULL;
 
 static void _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data);
+static void _execute_widget_dimming_rule (gpointer data, gpointer user_data);
 static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data);
 
 
@@ -111,6 +116,7 @@ modest_dimming_rules_group_init (ModestDimmingRulesGroup *obj)
                                                 (GEqualFunc) g_str_equal,
                                                 (GDestroyNotify) g_free,
                                                 (GDestroyNotify) g_object_unref);
+       priv->widget_rules = NULL;
 }
 
 static void
@@ -126,6 +132,9 @@ modest_dimming_rules_group_finalize (GObject *obj)
        if (priv->rules_map != NULL)
                g_hash_table_destroy (priv->rules_map);
 
+       if (priv->widget_rules != NULL)
+               g_slist_foreach (priv->widget_rules, (GFunc) g_object_unref, NULL);
+
        G_OBJECT_CLASS(parent_class)->finalize (obj);
 }
 
@@ -161,11 +170,69 @@ modest_dimming_rules_group_get_name (ModestDimmingRulesGroup *self)
        return g_strdup (priv->name);
 }
 
+static void
+_add_rule (ModestDimmingRulesGroup *self,
+          ModestDimmingRule *rule,
+          ModestWindow *window)
+{
+       ModestDimmingRulesGroupPrivate *priv;
+       GtkWidget *widget = NULL;
+       const gchar *action_path = NULL;
+
+       g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self));
+       g_return_if_fail (MODEST_IS_WINDOW(window));
+       g_return_if_fail (MODEST_IS_DIMMING_RULE (rule));
+       
+       priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self);
+
+       /* Set window to process dimming rules */
+       priv->window = MODEST_WINDOW (window);
+
+       widget = modest_dimming_rule_get_widget (rule);
+       /* Connect insensitive-presss handler to show notifications */
+       g_signal_connect (G_OBJECT (widget), "insensitive-press", 
+                         G_CALLBACK (_insensitive_press_callback), 
+                         rule);
+
+       /* Register new dimming rule */         
+       modest_dimming_rule_set_group (rule, self);
+       action_path = modest_dimming_rule_get_action_path (rule);
+       if (action_path)
+               g_hash_table_insert (priv->rules_map, g_strdup(action_path), rule);
+       else
+               priv->widget_rules = g_slist_prepend (priv->widget_rules, rule);
+}
+
+void
+modest_dimming_rules_group_add_widget_rule (ModestDimmingRulesGroup *self,
+                                           GtkWidget *widget,
+                                           GCallback callback,
+                                           ModestWindow *window)
+{
+       ModestDimmingRulesGroupPrivate *priv;
+       ModestDimmingRule *dim_rule = NULL;
+
+       g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self));
+       g_return_if_fail (GTK_IS_WIDGET (widget));
+       g_return_if_fail (MODEST_IS_WINDOW(window));
+       
+       priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self);
+
+       /* Set window to process dimming rules */
+       priv->window = MODEST_WINDOW (window);
+
+       dim_rule = modest_dimming_rule_new_from_widget (priv->window,
+                                                       (ModestDimmingCallback) callback,
+                                                       widget);
+
+       _add_rule (self, dim_rule, window);
+}
+
 void
 modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self,
                                      const ModestDimmingEntry modest_dimming_entries[],
                                      guint n_elements,
-                                     gpointer user_data)
+                                     ModestWindow *window)
 {
        ModestDimmingRulesGroupPrivate *priv;
        ModestDimmingRule *dim_rule = NULL;
@@ -177,12 +244,12 @@ modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self,
        g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self));
        g_return_if_fail (modest_dimming_entries != NULL);
        g_return_if_fail (n_elements > 0);
-       g_return_if_fail (MODEST_IS_WINDOW(user_data));
+       g_return_if_fail (MODEST_IS_WINDOW(window));
        
        priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self);
 
        /* Set window to process dimming rules */
-       priv->window = MODEST_WINDOW (user_data);
+       priv->window = MODEST_WINDOW (window);
 
        /* Add dimming rules */
        for (i=0; i < n_elements; i++) {
@@ -197,22 +264,15 @@ modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self,
                if (!unique) continue;
 
                /* Check action path is valid */
-               widget = modest_window_get_action_widget (MODEST_WINDOW (user_data), entry.action_path);
+               widget = modest_window_get_action_widget (MODEST_WINDOW (window), entry.action_path);
                if (widget == NULL) continue;
 
                /* Create a new dimming rule */
                dim_rule = modest_dimming_rule_new (priv->window,
                                                    (ModestDimmingCallback) entry.callback,
                                                    entry.action_path);
-               
-               /* Connect insensitive-presss handler to show notifications */
-               g_signal_connect (G_OBJECT (widget), "insensitive-press", 
-                                 G_CALLBACK (_insensitive_press_callback), 
-                                 dim_rule);
-
-               /* Register new dimming rule */         
-               modest_dimming_rule_set_group (dim_rule, self);
-               g_hash_table_insert (priv->rules_map, g_strdup(entry.action_path), dim_rule);
+
+               _add_rule (self, dim_rule, window);
        }
 }
 
@@ -242,6 +302,7 @@ modest_dimming_rules_group_execute (ModestDimmingRulesGroup *self)
 
        /* execute group dimming rules */
        g_hash_table_foreach (priv->rules_map, _execute_dimming_rule, NULL);
+       g_slist_foreach (priv->widget_rules, (GFunc) _execute_widget_dimming_rule, NULL);
 
        /* Free dimming ruls init data */
        modest_window_set_dimming_state (priv->window, NULL);
@@ -258,6 +319,15 @@ _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data)
 }
 
 static void
+_execute_widget_dimming_rule (gpointer data, gpointer user_data)
+{
+       g_return_if_fail (MODEST_IS_DIMMING_RULE (data));
+
+       /* Process dimming rule */
+       modest_dimming_rule_process (MODEST_DIMMING_RULE(data));
+}
+
+static void
 _insensitive_press_callback (GtkWidget *widget, gpointer user_data)
 {
        ModestDimmingRulesGroup *group = NULL;
index 415c1ea..9d5ef18 100644 (file)
@@ -97,7 +97,21 @@ void
 modest_dimming_rules_group_add_rules (ModestDimmingRulesGroup *self,
                                      const ModestDimmingEntry modest_dimming_entries[],
                                      guint n_elements,
-                                     gpointer user_data);
+                                     ModestWindow *window);
+
+/**
+ * modest_dimming_rules_group_add_rules:
+ * @self: the #ModestDimmingRulesGroup object which stores dimming rules.
+ * @rule: a #ModestDimmingRule 
+ * @user_data: generic user data.
+ * 
+ * Add @rule to @self dimming rules group object. 
+ **/
+void
+modest_dimming_rules_group_add_widget_rule (ModestDimmingRulesGroup *self,
+                                           GtkWidget *widget,
+                                           GCallback callback,
+                                           ModestWindow *window);
 
 /**
  * modest_dimming_rules_group_get_name:
index de39900..bbe1fc5 100644 (file)
@@ -301,7 +301,7 @@ get_selected_headers (ModestWindow *win)
                GtkWidget *header_view;         
                
                header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                                  MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                return modest_header_view_get_selected_headers (MODEST_HEADER_VIEW(header_view));
                
        } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
@@ -429,7 +429,7 @@ modest_ui_actions_on_delete_message (GtkAction *action, ModestWindow *win)
        if (MODEST_IS_MAIN_WINDOW (win)) {
                header_view = 
                        modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                            MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                if (!gtk_widget_is_focus (header_view))
                        return;
        }
@@ -594,7 +594,7 @@ modest_ui_actions_on_delete_message_or_folder (GtkAction *action, ModestWindow *
        if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *w;
                w = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                        MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                        MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                if (gtk_widget_is_focus (w)) {
                        modest_ui_actions_on_delete_folder (action, MODEST_MAIN_WINDOW(win));
                        return;
@@ -924,7 +924,7 @@ open_msg_cb (ModestMailOperation *mail_op, TnyHeader *header,  TnyMsg *msg, gpoi
                        GtkTreeModel *model;
                        
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(parent_win),
-                                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
                        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (header_view));
                        sel_list = gtk_tree_selection_get_selected_rows (sel, &model);
@@ -1461,7 +1461,7 @@ modest_ui_actions_on_next (GtkAction *action,
 
                header_view = modest_main_window_get_child_widget (
                                MODEST_MAIN_WINDOW(window),
-                               MODEST_WIDGET_TYPE_HEADER_VIEW);
+                               MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                if (!header_view)
                        return;
        
@@ -1484,7 +1484,7 @@ modest_ui_actions_on_prev (GtkAction *action,
        if (MODEST_IS_MAIN_WINDOW (window)) {
                GtkWidget *header_view;
                header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
-                                                                  MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                if (!header_view)
                        return;
                
@@ -1505,7 +1505,7 @@ modest_ui_actions_on_sort (GtkAction *action,
        if (MODEST_IS_MAIN_WINDOW (window)) {
                GtkWidget *header_view;
                header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(window),
-                                                                  MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                if (!header_view) {
                        modest_platform_information_banner (NULL, NULL, _CS("ckdg_ib_nothing_to_sort"));
 
@@ -1533,7 +1533,7 @@ new_messages_arrived (ModestMailOperation *self,
        /* Set contents style of headers view */
        if (modest_main_window_get_contents_style (win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_EMPTY) {
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), 
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));             
                
 
@@ -1719,7 +1719,7 @@ modest_do_refresh_current_folder(ModestWindow *win)
                /* Get folder and header view */
                folder_view = 
                        modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win), 
-                                                            MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                            MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                if (!folder_view)
                        return;
 
@@ -1728,7 +1728,7 @@ modest_do_refresh_current_folder(ModestWindow *win)
                if (folder_store && TNY_IS_FOLDER (folder_store)) {
                        header_view = 
                                modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                    MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                
                        /* We do not need to set the contents style
                           because it hasn't changed. We also do not
@@ -1776,7 +1776,7 @@ modest_ui_actions_toggle_header_list_view (GtkAction *action, ModestMainWindow *
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        header_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
        if (!header_view)
                return;
 
@@ -1815,7 +1815,7 @@ modest_ui_actions_on_header_selected (ModestHeaderView *header_view,
                        TnyFolder *folder = modest_header_view_get_folder (header_view);
                        GtkWidget *folder_view = 
                                modest_main_window_get_child_widget (main_window,
-                                                                    MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                    MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                        if (folder != NULL) 
                                modest_folder_view_select_folder (MODEST_FOLDER_VIEW (folder_view), folder, FALSE);
                        gtk_widget_grab_focus (GTK_WIDGET (folder_view));
@@ -1901,7 +1901,7 @@ folder_refreshed_cb (ModestMailOperation *mail_op,
 
        win = MODEST_MAIN_WINDOW (user_data);
        header_view = 
-               modest_main_window_get_child_widget(win, MODEST_WIDGET_TYPE_HEADER_VIEW);
+               modest_main_window_get_child_widget(win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
        if (header_view) {
                TnyFolder *current_folder;
@@ -1934,7 +1934,7 @@ modest_ui_actions_on_folder_selection_changed (ModestFolderView *folder_view,
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        header_view = modest_main_window_get_child_widget(main_window,
-                                                         MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                         MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
        if (!header_view)
                return;
        
@@ -2469,7 +2469,7 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return;
 
@@ -2511,12 +2511,12 @@ modest_ui_actions_on_rename_folder (GtkAction *action,
        g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return;
 
        header_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
        
        if (!header_view)
                return;
@@ -2605,7 +2605,7 @@ delete_folder (ModestMainWindow *main_window, gboolean move_to_trash)
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (main_window));
 
        folder_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return;
 
@@ -2668,7 +2668,7 @@ modest_ui_actions_on_delete_folder (GtkAction *action,
 
        delete_folder (main_window, FALSE);
        folder_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return;
        modest_folder_view_select_first_inbox_or_local (MODEST_FOLDER_VIEW (folder_view));
@@ -3216,7 +3216,7 @@ modest_ui_actions_on_select_all (GtkAction *action,
                
                if (!(MODEST_IS_HEADER_VIEW (focused_widget))) {
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (window),
-                                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                }
                                
                /* Disable window dimming management */
@@ -3430,7 +3430,7 @@ modest_ui_actions_on_details (GtkAction *action,
 
                /* Check which widget has the focus */
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                   MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                   MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                if (gtk_widget_is_focus (folder_view)) {
                        TnyFolderStore *folder_store
                                = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
@@ -3449,7 +3449,7 @@ modest_ui_actions_on_details (GtkAction *action,
 
                } else {
                        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                        /* Show details of each header */
                        do_headers_action (win, headers_action_show_details, header_view);
                }
@@ -3619,7 +3619,7 @@ on_move_to_dialog_folder_selection_changed (ModestFolderView* self,
        if (MODEST_IS_MAIN_WINDOW (user_data)) {
                /* Get the widgets */
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (user_data),
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                if (gtk_widget_is_focus (folder_view))
                        moving_folder = TRUE;
        }
@@ -3907,7 +3907,7 @@ modest_ui_actions_move_folder_error_handler (ModestMailOperation *mail_op,
        if (MODEST_IS_MAIN_WINDOW (user_data)) {
                main_window = MODEST_MAIN_WINDOW(user_data);
                folder_view = modest_main_window_get_child_widget (main_window,
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);     
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW); 
                modest_folder_view_disable_next_folder_selection (MODEST_FOLDER_VIEW(folder_view));             
        }
 
@@ -4044,7 +4044,7 @@ modest_ui_actions_on_main_window_remove_attachments (GtkAction *action,
        g_return_if_fail (MODEST_IS_MAIN_WINDOW (win));
 
        header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
        header_list = modest_header_view_get_selected_headers (MODEST_HEADER_VIEW (header_view));
 
@@ -4177,7 +4177,7 @@ modest_ui_actions_on_main_window_move_to (GtkAction *action,
        src_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
 
        /* Get header view */
-       header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget (win, MODEST_WIDGET_TYPE_HEADER_VIEW));
+       header_view = MODEST_HEADER_VIEW(modest_main_window_get_child_widget (win, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW));
 
        /* Get folder or messages to transfer */
        if (gtk_widget_is_focus (folder_view)) {
@@ -4300,7 +4300,7 @@ modest_ui_actions_on_move_to (GtkAction *action,
        /* Get the folder view widget if exists */
        if (main_window)
                folder_view = modest_main_window_get_child_widget (main_window,
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        else
                folder_view = NULL;
 
@@ -4443,7 +4443,7 @@ modest_ui_actions_on_help (GtkAction *action,
                
                /* Get selected folder */
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                folder_store = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
 
                /* Switch help_id */
@@ -4538,6 +4538,16 @@ modest_ui_actions_on_view_menu_activated (GtkAction *action,
 }
 
 void
+modest_ui_actions_on_format_menu_activated (GtkAction *action,
+                                           ModestWindow *window)
+{
+       g_return_if_fail (MODEST_IS_WINDOW (window));
+
+       /* Update dimmed */     
+       modest_window_check_dimming_rules_group (window, "ModestMenuDimmingRules");     
+}
+
+void
 modest_ui_actions_on_tools_menu_activated (GtkAction *action,
                                          ModestWindow *window)
 {
index 18f1def..befaeed 100644 (file)
@@ -352,6 +352,10 @@ modest_ui_actions_on_edit_menu_activated (GtkAction *action,
                                          ModestWindow *window);
 
 void
+modest_ui_actions_on_format_menu_activated (GtkAction *action,
+                                           ModestWindow *window);
+
+void
 modest_ui_actions_on_view_menu_activated (GtkAction *action,
                                          ModestWindow *window);
 
index 552a61a..c5ce23d 100644 (file)
@@ -40,6 +40,7 @@
 #include <widgets/modest-attachments-view.h>
 #include <modest-runtime.h>
 #include <tny-simple-list.h>
+#include <widgets/modest-recpt-editor.h>
 
 
 static gboolean _folder_is_any_of_type (TnyFolder *folder, TnyFolderType types[], guint ntypes);
@@ -121,7 +122,7 @@ _define_main_window_dimming_state (ModestMainWindow *window)
        } else if (MODEST_IS_HEADER_VIEW (focused_widget)) {
                header_view = focused_widget;           
        } else {
-               header_view = modest_main_window_get_child_widget (window, MODEST_WIDGET_TYPE_HEADER_VIEW);
+               header_view = modest_main_window_get_child_widget (window, MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
        }
        
        /* Get header view and selected headers */
@@ -359,7 +360,7 @@ modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
 
        /* Get selected folder as parent of new folder to create */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        parent_folder = modest_folder_view_get_selected (MODEST_FOLDER_VIEW(folder_view));
        if (!parent_folder)
                return TRUE;
@@ -402,7 +403,7 @@ modest_ui_dimming_rules_on_new_folder (ModestWindow *win, gpointer user_data)
 
        /* if not the folder is selected then dim */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (folder_view && !gtk_widget_is_focus (folder_view)) 
                dimmed = TRUE;
 
@@ -425,11 +426,11 @@ modest_ui_dimming_rules_on_delete (ModestWindow *win, gpointer user_data)
        if (MODEST_IS_MAIN_WINDOW (win)) {
                /* Get the folder view */
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                
                /* Get header view */
                header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
 
                if (header_view && gtk_widget_is_focus (header_view)) 
                        dimmed = modest_ui_dimming_rules_on_delete_msg (win, rule);
@@ -770,7 +771,7 @@ modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
                                
                /* Check dimmed rule */
                header_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                  MODEST_WIDGET_TYPE_HEADER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW);
                
                /* If the header view has the focus: */
                if (header_view && gtk_widget_is_focus (header_view)) {
@@ -781,7 +782,7 @@ modest_ui_dimming_rules_on_details (ModestWindow *win, gpointer user_data)
                else {
                        /* If the folder view has the focus: */
                        GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                               MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                               MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                        if (folder_view && gtk_widget_is_focus (folder_view)) {
                                TnyFolderStore *folder_store
                                        = modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view));
@@ -912,7 +913,7 @@ modest_ui_dimming_rules_on_main_window_move_to (ModestWindow *win, gpointer user
        
        /* Get the folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
 
        
        /* Check diming rules for folders transfer  */
@@ -1081,21 +1082,34 @@ modest_ui_dimming_rules_on_select_all (ModestWindow *win, gpointer user_data)
 {
        ModestDimmingRule *rule = NULL;
        gboolean dimmed = FALSE;
+       GtkWidget *focused = NULL;
 
-       g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
+       g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
        g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
        rule = MODEST_DIMMING_RULE (user_data);
 
-       /* Check dimmed rule */ 
-       if (!dimmed)
+       focused = gtk_window_get_focus (GTK_WINDOW (win));
+
+       /* Main window dimming rules */ 
+       if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
                dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
 
-       if (!dimmed)
+       if (!dimmed && MODEST_IS_MAIN_WINDOW (win))
                dimmed = _header_view_is_all_selected (MODEST_MAIN_WINDOW(win));
 
-       if (dimmed)
-               modest_dimming_rule_set_notification (rule, "");
-               
+       if (!dimmed && 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'));
+       }
+
+       if (!dimmed && 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);
+       }
+
+       if (dimmed && MODEST_IS_ATTACHMENTS_VIEW (focused))
+               dimmed = FALSE;
        return dimmed;
 }
 
@@ -1209,11 +1223,32 @@ modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data)
        rule = MODEST_DIMMING_RULE (user_data);
 
        /* Check dimmed rule */ 
-       if (!dimmed) {
+       if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
                dimmed = _clipboard_is_empty (win); 
                if (dimmed)
                        modest_dimming_rule_set_notification (rule, "");
        }
+
+       if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
+               dimmed = !modest_msg_edit_window_can_undo (MODEST_MSG_EDIT_WINDOW (win));
+       }
+                               
+       return dimmed;  
+}
+
+gboolean 
+modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       gboolean dimmed = FALSE;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       rule = MODEST_DIMMING_RULE (user_data);
+
+       /* Check dimmed rule */ 
+       if (!dimmed && MODEST_IS_MSG_EDIT_WINDOW (win)) {
+               dimmed = !modest_msg_edit_window_can_redo (MODEST_MSG_EDIT_WINDOW (win));
+       }
                                
        return dimmed;  
 }
@@ -1347,6 +1382,186 @@ modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data)
 }
 
 gboolean 
+modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       const DimmedState *state = NULL;
+       gboolean dimmed = FALSE;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
+       rule = MODEST_DIMMING_RULE (user_data);
+       state = modest_window_get_dimming_state (win);
+
+
+       /* Check common dimming rules */
+       if (!dimmed) {
+               ModestMsgEditFormat format;
+               format = modest_msg_edit_window_get_format (MODEST_MSG_EDIT_WINDOW (win));
+
+               dimmed = (format != MODEST_MSG_EDIT_FORMAT_HTML);
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_item_unavailable_plaintext"));
+       }
+
+       if (!dimmed) {
+               GtkWidget *body;
+               body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
+                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
+               
+               dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
+       }
+              
+       
+       return dimmed;
+}
+
+gboolean 
+modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       const DimmedState *state = NULL;
+       gboolean dimmed = FALSE;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
+       rule = MODEST_DIMMING_RULE (user_data);
+       state = modest_window_get_dimming_state (win);
+
+       if (!dimmed) {
+               GtkWidget *body;
+               body = modest_msg_edit_window_get_child_widget (MODEST_MSG_EDIT_WINDOW (win),
+                                                               MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
+               
+               dimmed = ((body == NULL)||(!gtk_widget_is_focus (body)));
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_move_cursor_to_message"));
+       }
+              
+       
+       return dimmed;
+}
+
+gboolean 
+modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       const DimmedState *state = NULL;
+       gboolean dimmed = FALSE;
+       GtkWidget *focused = NULL;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
+       rule = MODEST_DIMMING_RULE (user_data);
+       state = modest_window_get_dimming_state (win);
+
+       focused = gtk_window_get_focus (GTK_WINDOW (win));
+
+       if (!dimmed) {
+               dimmed = MODEST_IS_ATTACHMENTS_VIEW (focused);
+       }
+
+       if (!dimmed) {
+               GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+               ModestEmailClipboard *e_clipboard = modest_runtime_get_email_clipboard ();
+               dimmed = modest_email_clipboard_cleared (e_clipboard) && 
+                       !gtk_clipboard_wait_is_text_available (clipboard);
+       }
+       
+       return dimmed;
+}
+
+gboolean 
+modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       const DimmedState *state = NULL;
+       gboolean dimmed = FALSE;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
+       rule = MODEST_DIMMING_RULE (user_data);
+       state = modest_window_get_dimming_state (win);
+
+       if (!dimmed) {
+               GList *selected_attachments = NULL;
+               gint n_att_selected = 0;
+               GtkWidget *attachments_view;
+               attachments_view = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS);
+               
+               selected_attachments = modest_attachments_view_get_selection (
+                       MODEST_ATTACHMENTS_VIEW (attachments_view));
+               n_att_selected = g_list_length (selected_attachments);
+               g_list_free (selected_attachments);
+
+               dimmed = (n_att_selected != 1);
+       }
+       
+       return dimmed;
+}
+
+gboolean 
+modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data)
+{
+       ModestDimmingRule *rule = NULL;
+       const DimmedState *state = NULL;
+       gboolean dimmed = FALSE;
+       
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+       g_return_val_if_fail (MODEST_IS_MSG_EDIT_WINDOW (win), TRUE);
+       rule = MODEST_DIMMING_RULE (user_data);
+       state = modest_window_get_dimming_state (win);
+
+       if (!dimmed) {
+               GtkWidget *subject_field, *body_field;
+               GtkTextBuffer *body_buffer;
+               const gchar *subject = NULL;
+               body_field = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY);
+               subject_field = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT);
+               body_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (body_field));
+               subject = gtk_entry_get_text (GTK_ENTRY (subject_field));
+
+               dimmed = ((subject == NULL || subject[0] == '\0')
+                         || (gtk_text_buffer_get_char_count(body_buffer) == 0));
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_subject_or_body_not_modified"));
+       }
+              
+       if (!dimmed) {
+               GtkWidget *to_field, *cc_field, *bcc_field;
+               GtkTextBuffer * to_buffer, *cc_buffer, *bcc_buffer;
+               cc_field = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC);
+               to_field = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO);
+               bcc_field = modest_msg_edit_window_get_child_widget (
+                       MODEST_MSG_EDIT_WINDOW (win),
+                       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC);
+               to_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (to_field));
+               cc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (cc_field));
+               bcc_buffer = modest_recpt_editor_get_buffer (MODEST_RECPT_EDITOR (bcc_field));
+
+               dimmed = ((gtk_text_buffer_get_char_count (to_buffer) +
+                          gtk_text_buffer_get_char_count (cc_buffer) +
+                          gtk_text_buffer_get_char_count (bcc_buffer)) == 0);
+               if (dimmed)
+                       modest_dimming_rule_set_notification (rule, _("mcen_ib_add_recipients_first"));
+       }
+       
+       return dimmed;
+}
+
+gboolean 
 modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data)
 {
        ModestDimmingRule *rule = NULL;
@@ -1528,7 +1743,7 @@ _selected_folder_not_writeable (ModestMainWindow *win,
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view)
                return TRUE;
@@ -1576,7 +1791,7 @@ _selected_folder_not_deletable (ModestMainWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view)
                return TRUE;
@@ -1612,7 +1827,7 @@ _selected_folder_not_moveable (ModestMainWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view)
                return TRUE;
@@ -1648,7 +1863,7 @@ _selected_folder_not_renameable (ModestMainWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view)
                return TRUE;
@@ -1705,7 +1920,7 @@ _selected_folder_is_root (ModestMainWindow *win)
 
        /* All accounts are root items: */
        GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (folder_view) {                                      
                gboolean is_account = FALSE;
                TnyFolderStore *folder_store = 
@@ -1742,7 +1957,7 @@ _selected_folder_is_MMC_or_POP_root (ModestMainWindow *win)
        gboolean result = FALSE;
 
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return FALSE;
 
@@ -1795,7 +2010,7 @@ _selected_folder_is_empty (ModestMainWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view)
                return TRUE;
@@ -1826,7 +2041,7 @@ _folder_view_has_focus (ModestWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return FALSE;
        
@@ -1848,7 +2063,7 @@ _selected_folder_is_same_as_source (ModestWindow *win)
 
        /* Get folder view */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        if (!folder_view)
                return FALSE;
        
@@ -1893,7 +2108,7 @@ _selected_folder_is_any_of_type (ModestWindow *win,
 
                /* Get folder view */
                folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                                  MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                  MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                /* If no folder view, always dimmed */
                if (!folder_view)
                        return FALSE;
@@ -1967,22 +2182,31 @@ _invalid_clipboard_selected (ModestWindow *win,
 {
        const DimmedState *state = NULL;
        gboolean result = FALSE;
+       GtkWidget *focused = NULL;
 
        g_return_val_if_fail (MODEST_IS_WINDOW(win), FALSE);
        state = modest_window_get_dimming_state (win);
-
-       if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
+       /* Get focuesed widget */
+       focused = gtk_window_get_focus (GTK_WINDOW (win));
+
+       if (MODEST_IS_MSG_EDIT_WINDOW (win)) {
+               gboolean has_selection = FALSE;
+               if (GTK_IS_TEXT_VIEW (focused)) {
+                       GtkTextBuffer *buffer = NULL;
+                       buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (focused));
+                       has_selection = gtk_text_buffer_get_has_selection (GTK_TEXT_BUFFER (buffer));
+               } else if (GTK_IS_EDITABLE (focused)) {
+                       has_selection = gtk_editable_get_selection_bounds (GTK_EDITABLE (focused), NULL, NULL);
+               }
+               result = !has_selection;
+       } else if (MODEST_IS_MSG_VIEW_WINDOW (win)) {
                GtkClipboard *clipboard = NULL;
                gchar *selection = NULL;
-               GtkWidget *focused = NULL;
 
                /* Get clipboard selection*/
                clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
                selection = gtk_clipboard_wait_for_text (clipboard);
 
-               /* Get focuesed widget */
-               focused = gtk_window_get_focus (GTK_WINDOW (win));
-
                /* Check dimming */
                result = ((selection == NULL) || 
                          (MODEST_IS_ATTACHMENTS_VIEW (focused)));
@@ -2140,7 +2364,7 @@ _invalid_msg_selected (ModestMainWindow *win,
                
        /* Get folder view to check focus */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
 
        /* Check dimmed rule (TODO: check focus on widgets */   
        if (!result) {
@@ -2261,7 +2485,7 @@ _invalid_folder_for_purge (ModestWindow *win,
                g_object_unref (msg);
        } else if (MODEST_IS_MAIN_WINDOW (win)) {
                GtkWidget *folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (win),
-                                                                             MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                                             MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
                if (!folder_view)
                        return FALSE;
                folder = TNY_FOLDER (modest_folder_view_get_selected (MODEST_FOLDER_VIEW (folder_view)));
@@ -2350,7 +2574,7 @@ _selected_folder_has_subfolder_with_same_name (ModestWindow *win)
 
        /*Get current parent folder */
        folder_view = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW(win),
-                                                          MODEST_WIDGET_TYPE_FOLDER_VIEW);
+                                                          MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW);
        /* If no folder view, always dimmed */
        if (!folder_view) return FALSE;
        
index ada4bbf..eea079f 100644 (file)
@@ -64,6 +64,7 @@ gboolean modest_ui_dimming_rules_on_view_attachments (ModestWindow *win, gpointe
 gboolean modest_ui_dimming_rules_on_save_attachments (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_undo (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_redo (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_copy (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_cut (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_view_previous (ModestWindow *win, gpointer user_data);
@@ -74,6 +75,11 @@ gboolean modest_ui_dimming_rules_on_csm_cancel_sending (ModestWindow *win, gpoin
 gboolean modest_ui_dimming_rules_on_send_receive (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_add_to_contacts (ModestWindow *win, gpointer user_data);
 gboolean modest_ui_dimming_rules_on_find_msg (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_set_style (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_zoom (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_send (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_editor_remove_attachment (ModestWindow *win, gpointer user_data);
+gboolean modest_ui_dimming_rules_on_editor_paste (ModestWindow *win, gpointer user_data);
 
 G_END_DECLS
 #endif 
index c9ded93..edf9a90 100644 (file)
@@ -111,12 +111,12 @@ ModestWindow* modest_main_window_new (void);
  * true now, but might not be. Therefore, these types
  */
 typedef enum {
-       MODEST_WIDGET_TYPE_HEADER_VIEW,
-       MODEST_WIDGET_TYPE_FOLDER_VIEW,
-       MODEST_WIDGET_TYPE_MSG_PREVIEW,
+       MODEST_MAIN_WINDOW_WIDGET_TYPE_HEADER_VIEW,
+       MODEST_MAIN_WINDOW_WIDGET_TYPE_FOLDER_VIEW,
+       MODEST_MAIN_WINDOW_WIDGET_TYPE_MSG_PREVIEW,
        
-       MODEST_WIDGET_TYPE_NUM,
-} ModestWidgetType;
+       MODEST_MAIN_WINDOW_WIDGET_TYPE_NUM,
+} ModestMainWindowWidgetType;
 
 
 /**
@@ -127,7 +127,7 @@ typedef enum {
  * Returns: a child window or NULL
  */
 GtkWidget* modest_main_window_get_child_widget (ModestMainWindow *self,
-                                               ModestWidgetType widget_type);
+                                               ModestMainWindowWidgetType widget_type);
 
 /**
  * modest_main_window_close_all:
index fb0e3d9..1003512 100644 (file)
@@ -41,11 +41,11 @@ static const GtkActionEntry modest_msg_edit_action_entries [] = {
 
        /* Toplevel menus */
        { "Email", NULL, N_("mcen_me_inbox_email") },
-       { "View", NULL, N_("mcen_me_inbox_view") },
-       { "Edit", NULL, N_("mcen_me_inbox_edit") },
-       { "Format", NULL, N_("mcen_me_editor_format") },
+       { "View", NULL, N_("mcen_me_inbox_view") , NULL, NULL, G_CALLBACK (modest_ui_actions_on_view_menu_activated)},
+       { "Edit", NULL, N_("mcen_me_inbox_edit") , NULL, NULL, G_CALLBACK (modest_ui_actions_on_edit_menu_activated)},
+       { "Format", NULL, N_("mcen_me_editor_format") , NULL, NULL, G_CALLBACK (modest_ui_actions_on_format_menu_activated)},
        { "Alignment", NULL, N_("mcen_me_editor_align") },
-       { "Attachments", NULL, N_("mcen_me_viewer_attachments") },
+       { "Attachments", NULL, N_("mcen_me_viewer_attachments"), NULL, NULL, G_CALLBACK (modest_ui_actions_on_attachment_menu_activated) },
        { "Zoom", NULL, N_("mcen_me_viewer_zoom") },
        { "MessagePriority", NULL, N_("mcen_me_editor_message_priority") },
        { "FileFormat", NULL, N_("mcen_me_editor_file_format") },
index 76cba35..f182cc9 100644 (file)
@@ -70,6 +70,16 @@ typedef enum {
        MODEST_MSG_EDIT_FORMAT_HTML
 } ModestMsgEditFormat;
 
+typedef enum {
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BODY,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_TO,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_CC,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_BCC,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_SUBJECT,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_ATTACHMENTS,
+       MODEST_MSG_EDIT_WINDOW_WIDGET_TYPE_NUM,
+} ModestMsgEditWindowWidgetType;
+
 /** Get these with modest_msg_edit_window_get_msg_data() 
  * and free them with modest_msg_edit_window_free_msg_data().
  */
@@ -299,6 +309,16 @@ void            modest_msg_edit_window_select_font        (ModestMsgEditWindow *
 void            modest_msg_edit_window_undo               (ModestMsgEditWindow *window);
 
 /**
+ * modest_msg_edit_window_can_undo:
+ * @window: a #ModestMsgEditWindow
+ *
+ * Checks if an undo operation is available
+ *
+ * Returns: %TRUE if undo can be done, %FALSE otherwise.
+ */
+gboolean            modest_msg_edit_window_can_undo               (ModestMsgEditWindow *window);
+
+/**
  * modest_msg_edit_window_redo:
  * @window: a #ModestMsgEditWindow
  *
@@ -307,6 +327,16 @@ void            modest_msg_edit_window_undo               (ModestMsgEditWindow *
 void            modest_msg_edit_window_redo               (ModestMsgEditWindow *window);
 
 /**
+ * modest_msg_edit_window_can_redo:
+ * @window: a #ModestMsgEditWindow
+ *
+ * Checks if a redp operation is available
+ *
+ * Returns: %TRUE if redo can be done, %FALSE otherwise.
+ */
+gboolean            modest_msg_edit_window_can_redo               (ModestMsgEditWindow *window);
+
+/**
  * modest_msg_edit_window_select_contacts:
  * @window: a #ModestMsgEditWindow
  *
@@ -375,6 +405,19 @@ void            modest_msg_edit_window_set_draft           (ModestMsgEditWindow
  */
 const gchar*    modest_msg_edit_window_get_message_uid (ModestMsgEditWindow *window);
 
+/**
+ * modest_msg_edit_window_get_child_widget:
+ * @win: a #ModestMsgEditWindow
+ * @widget_type: the type of the child to obtain
+ *
+ * Obtain the child widget of @win of type @widget_type
+ *
+ * Returns: a #GtkWidget, or %NULL
+ */
+GtkWidget *
+modest_msg_edit_window_get_child_widget (ModestMsgEditWindow *win,
+                                        ModestMsgEditWindowWidgetType widget_type);
+
 G_END_DECLS
 
 #endif /* __MODEST_MSG_EDIT_WINDOW_H__ */