* 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
* 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);
/* 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 */
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);
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;
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);
--- /dev/null
+#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__ */
#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
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);
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,
/* 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, */
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;
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;
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)
{
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);
"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);
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);
}
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
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);
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);
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));
g_object_unref (window_icon);
}
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (obj));
+ modest_window_check_dimming_rules_group (MODEST_WINDOW (obj), "ModestClipboardDimmingRules");
+
/* Dim at start clipboard actions */
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/EditMenu/CutMenu");
gtk_action_set_sensitive (action, FALSE);
action = gtk_ui_manager_get_action (parent_priv->ui_manager, "/MenuBar/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),
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));
}
break;
}
- update_dimmed (window);
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (window));
}
}
wp_text_buffer_undo (WP_TEXT_BUFFER (priv->text_buffer));
- update_dimmed (window);
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (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)
{
gpointer userdata)
{
- update_dimmed (MODEST_MSG_EDIT_WINDOW (userdata));
+ modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (userdata));
return FALSE;
}
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
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
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
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)
{
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;
+ }
+}
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;
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);
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);
/* 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;
ModestWindow *win;
ModestDimmingCallback dimming_rule;
gchar *action_path;
+ GtkWidget *widget;
gchar *notification;
};
priv->win = NULL;
priv->dimming_rule = NULL;
priv->action_path = NULL;
+ priv->widget = NULL;
priv->notification = NULL;
}
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)
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
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;
+}
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.
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);
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 {
gchar *name;
gboolean notifications_enabled;
GHashTable *rules_map;
+ GSList *widget_rules;
};
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);
(GEqualFunc) g_str_equal,
(GDestroyNotify) g_free,
(GDestroyNotify) g_object_unref);
+ priv->widget_rules = NULL;
}
static void
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);
}
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;
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++) {
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);
}
}
/* 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);
}
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;
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:
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)) {
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;
}
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;
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);
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;
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;
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"));
/* 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));
/* 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;
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
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;
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));
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;
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;
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;
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;
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;
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));
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 */
/* 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));
} 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);
}
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;
}
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));
}
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));
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)) {
/* 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;
/* 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 */
}
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)
{
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);
#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);
} 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 */
/* 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;
/* 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;
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);
/* 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)) {
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));
/* 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 */
{
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;
}
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;
}
}
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;
/* 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;
/* 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;
/* 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;
/* 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;
/* 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 =
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;
/* 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;
/* 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;
/* 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;
/* 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;
{
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)));
/* 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) {
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)));
/*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;
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);
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
* 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;
/**
* 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:
/* 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") },
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().
*/
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
*
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
*
*/
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__ */