+ ModestDimmingRule *rule = NULL;
+ gboolean dimmed = FALSE;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_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)
+ dimmed = _invalid_attach_selected (win, FALSE, FALSE, FALSE, rule);
+
+ if (!dimmed) {
+ dimmed = _purged_attach_selected (win, FALSE, NULL);
+ if (dimmed) {
+ modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
+ }
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_remove_attachments (ModestWindow *win, gpointer user_data)
+{
+ ModestDimmingRule *rule = NULL;
+ gboolean dimmed = 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 in main window if there's only one message selected */
+ if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
+ dimmed = _invalid_msg_selected (MODEST_MAIN_WINDOW (win), TRUE, rule);
+ }
+
+ /* Check in view window if there's any attachment selected */
+ if (!dimmed && MODEST_IS_MSG_VIEW_WINDOW (win)) {
+ dimmed = _invalid_attach_selected (win, FALSE, FALSE, TRUE, NULL);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("FIXME:no attachment selected"));
+ }
+
+ /* cannot purge in editable drafts nor pop folders */
+ if (!dimmed) {
+ dimmed = _invalid_folder_for_purge (win, rule);
+ }
+
+ /* Check if the selected message in main window has attachments */
+ if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
+ dimmed = _selected_msg_marked_as (MODEST_MAIN_WINDOW(win), TNY_HEADER_FLAG_ATTACHMENTS, TRUE, FALSE);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mail_ib_unable_to_purge_attachments"));
+ }
+
+ /* Check if all attachments are already purged */
+ if (!dimmed) {
+ dimmed = _purged_attach_selected (win, TRUE, rule);
+ }
+
+ /* Check if the message is already downloaded */
+ if (!dimmed && MODEST_IS_MAIN_WINDOW (win)) {
+ dimmed = !_msg_download_completed (MODEST_MAIN_WINDOW (win));
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mail_ib_attach_not_local"));
+ }
+
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_undo (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) {
+ dimmed = _clipboard_is_empty (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, "");
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_cut (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 common dimming rules */
+ if (!dimmed) {
+ dimmed = _invalid_clipboard_selected (win, rule);
+ }
+
+ /* Check window specific dimming rules */
+ if (MODEST_IS_MAIN_WINDOW (win)) {
+ if (!dimmed) {
+ dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, "");
+ }
+ if (!dimmed) {
+ dimmed = _selected_msg_sent_in_progress (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
+ }
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_copy (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 common dimming rules */
+ if (!dimmed) {
+ dimmed = _invalid_clipboard_selected (win, rule);
+ }
+
+ /* Check window specific dimming rules */
+ if (MODEST_IS_MAIN_WINDOW (win)) {
+ if (!dimmed) {
+ dimmed = _selected_folder_is_empty (MODEST_MAIN_WINDOW(win));
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, "");
+ }
+ if (!dimmed) {
+ dimmed = _selected_msg_sent_in_progress (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mcen_ib_unable_to_cut_mess"));
+ }
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_view_previous (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);
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
+
+ /* Check dimmed rule */
+ if (!dimmed) {
+ dimmed = _transfer_mode_enabled (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
+ }
+ if (!dimmed) {
+ if (MODEST_IS_MSG_VIEW_WINDOW (win))
+ dimmed = modest_msg_view_window_first_message_selected (MODEST_MSG_VIEW_WINDOW(win));
+ modest_dimming_rule_set_notification (rule, NULL);
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_view_next (ModestWindow *win, gpointer user_data)
+{
+ ModestDimmingRule *rule = NULL;
+ gboolean dimmed = FALSE;
+
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_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) {
+ dimmed = _transfer_mode_enabled (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mail_ib_notavailable_downloading"));
+ }
+ if (!dimmed) {
+ if (MODEST_IS_MSG_VIEW_WINDOW (win))
+ dimmed = modest_msg_view_window_last_message_selected (MODEST_MSG_VIEW_WINDOW (win));
+ modest_dimming_rule_set_notification (rule, NULL);
+ }
+
+ return dimmed;
+}
+
+
+gboolean
+modest_ui_dimming_rules_on_tools_smtp_servers (ModestWindow *win, gpointer user_data)
+{
+ const gboolean dimmed =
+ !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
+ TRUE);
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_cancel_sending (ModestWindow *win, gpointer user_data)
+{
+ ModestDimmingRule *rule = NULL;
+ TnyFolderType types[1];
+ guint n_messages = 0;
+ gboolean dimmed = FALSE;
+
+ g_return_val_if_fail (MODEST_IS_MAIN_WINDOW(win), FALSE);
+ g_return_val_if_fail (MODEST_IS_DIMMING_RULE (user_data), FALSE);
+ rule = MODEST_DIMMING_RULE (user_data);
+
+ types[0] = TNY_FOLDER_TYPE_OUTBOX;
+
+ /* Check dimmed rules */
+ if (!dimmed) {
+ dimmed = _already_opened_msg (win, &n_messages);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mcen_ib_message_unableto_cancel_send"));
+ }
+ if (!dimmed) {
+ dimmed = !_selected_folder_is_any_of_type (win, types, 1);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, "");
+ }
+ if (!dimmed) {
+ dimmed = !_sending_in_progress (win);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, "");
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_send_receive (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) {
+ dimmed = !modest_account_mgr_has_accounts(modest_runtime_get_account_mgr(),
+ TRUE);
+ if (dimmed)
+ modest_dimming_rule_set_notification (rule, _("mcen_nc_no_email_acnts_defined"));
+ }
+
+ return dimmed;
+}
+
+gboolean
+modest_ui_dimming_rules_on_add_to_contacts (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) {
+ GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
+ gchar *selection = NULL;
+ selection = gtk_clipboard_wait_for_text (clipboard);
+
+ dimmed = !((selection != NULL) && (modest_text_utils_validate_recipient (selection, NULL)));
+ }
+
+ return dimmed;
+}
+
+/* *********************** static utility functions ******************** */
+
+/* Returns whether the selected message is marked as deleted. */
+static gboolean
+_message_is_marked_as_deleted (ModestMsgViewWindow *win)
+{
+ g_return_val_if_fail (win, FALSE);
+ g_return_val_if_fail (MODEST_IS_MSG_VIEW_WINDOW(win), FALSE);
+
+ TnyHeader* header = modest_msg_view_window_get_header (win);
+ if (!header)
+ return FALSE;
+
+ return (tny_header_get_flags (header) & TNY_HEADER_FLAG_DELETED);
+}
+
+
+
+/* Returns whether the selected message is marked as deleted.
+ * @param win The main window, or NULL if you want this function
+ * to discover the main window itself, which is marginally less
+ * efficient. */
+static gboolean
+_selected_message_is_marked_as_deleted (ModestMainWindow *win)
+{
+ gboolean result = FALSE;
+ TnyHeaderFlags flags;
+
+ flags = TNY_HEADER_FLAG_DELETED;
+
+ /* Check dimmed rule */
+ result = _selected_msg_marked_as (win, flags, FALSE, FALSE);
+
+ return result;
+}
+
+static gboolean
+_selected_folder_not_writeable (ModestMainWindow *win)
+{
+ GtkWidget *folder_view = NULL;
+ TnyFolderStore *parent_folder = NULL;
+ ModestTnyFolderRules rules;
+ gboolean result = FALSE;