* Changes in the autotools stuff affecting a lot of platform dependent
[modest] / src / modest-dimming-rules-group.c
index 75eb591..14ea232 100644 (file)
 #include "modest-dimming-rules-group-priv.h"
 #include "modest-dimming-rule.h"
 #include "modest-platform.h"
+#include "modest-ui-dimming-rules.h"
 
 static void modest_dimming_rules_group_class_init (ModestDimmingRulesGroupClass *klass);
 static void modest_dimming_rules_group_init       (ModestDimmingRulesGroup *obj);
 static void modest_dimming_rules_group_finalize   (GObject *obj);
 
+#ifndef MODEST_TOOLKIT_GTK
 static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data);
+#endif
 
+static void on_window_destroy (gpointer data,
+                              GObject *object);
+
+static void _add_rule (ModestDimmingRulesGroup *self,
+                      ModestDimmingRule *rule,
+                      ModestWindow *window);
 
 typedef struct _ModestDimmingRulesGroupPrivate ModestDimmingRulesGroupPrivate;
 struct _ModestDimmingRulesGroupPrivate {       
+       ModestWindow *window;
        gchar *name;
+       gboolean notifications_enabled;
        GHashTable *rules_map;
+       GSList *widget_rules;
 };
 
+
 #define MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
                                                    MODEST_TYPE_DIMMING_RULES_GROUP, \
                                                    ModestDimmingRulesGroupPrivate))
@@ -53,9 +66,7 @@ struct _ModestDimmingRulesGroupPrivate {
 static GObjectClass *parent_class = NULL;
 
 static void _execute_dimming_rule (gpointer key, gpointer value, gpointer user_data);
-static void _insensitive_press_callback (GtkWidget *widget, gpointer user_data);
-
-
+static void _execute_widget_dimming_rule (gpointer data, gpointer user_data);
 
 GType
 modest_dimming_rules_group_get_type (void)
@@ -101,10 +112,13 @@ modest_dimming_rules_group_init (ModestDimmingRulesGroup *obj)
        priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj);
 
        priv->name = NULL;
+       priv->window = NULL;
+       priv->notifications_enabled = FALSE;
        priv->rules_map = g_hash_table_new_full ((GHashFunc) g_str_hash,
                                                 (GEqualFunc) g_str_equal,
                                                 (GDestroyNotify) g_free,
                                                 (GDestroyNotify) g_object_unref);
+       priv->widget_rules = NULL;
 }
 
 static void
@@ -120,12 +134,16 @@ 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);
 }
 
 
 ModestDimmingRulesGroup*
-modest_dimming_rules_group_new(const gchar *group_name)
+modest_dimming_rules_group_new(const gchar *group_name,
+                              gboolean notifications_enabled)
 {
        ModestDimmingRulesGroup *obj;
        ModestDimmingRulesGroupPrivate *priv;
@@ -136,6 +154,7 @@ modest_dimming_rules_group_new(const gchar *group_name)
 
        priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(obj);
        priv->name = g_strdup(group_name);
+       priv->notifications_enabled = notifications_enabled;
 
        return obj;
 }
@@ -153,11 +172,70 @@ 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);
+#ifndef MODEST_TOOLKIT_GTK
+       /* Connect insensitive-presss handler to show notifications */
+       g_signal_connect (G_OBJECT (widget), "insensitive-press", 
+                         G_CALLBACK (_insensitive_press_callback), 
+                         rule);
+#endif
+       /* 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;
@@ -169,10 +247,15 @@ 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 (window);
+       g_object_weak_ref (G_OBJECT (window), on_window_destroy, self);
+
+       /* Add dimming rules */
        for (i=0; i < n_elements; i++) {
                entry = modest_dimming_entries[i]; 
                
@@ -185,30 +268,51 @@ 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 (MODEST_WINDOW(user_data),
+               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 */         
-               g_hash_table_insert (priv->rules_map, g_strdup(entry.action_path), dim_rule);
+               _add_rule (self, dim_rule, window);
        }
 }
 
+gboolean 
+modest_dimming_rules_group_notifications_enabled (ModestDimmingRulesGroup *self)
+{
+       ModestDimmingRulesGroupPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self), FALSE);
+       priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self);
+       
+       return priv->notifications_enabled;
+} 
+
 void 
 modest_dimming_rules_group_execute (ModestDimmingRulesGroup *self) 
 {
        ModestDimmingRulesGroupPrivate *priv;
+       DimmedState *state = NULL;
 
+       g_return_if_fail (MODEST_IS_DIMMING_RULES_GROUP(self));
        priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE(self);
 
+       if (!priv->window)
+               return;
+
+       /* Init dimming rules init data */
+       state = modest_ui_dimming_rules_define_dimming_state (priv->window);    
+       modest_window_set_dimming_state (priv->window, state);
+
+       /* 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);
 }
 
 
@@ -222,21 +326,53 @@ _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));
+}
+
+#ifndef MODEST_TOOLKIT_GTK
+static void
 _insensitive_press_callback (GtkWidget *widget, gpointer user_data)
 {
-       ModestDimmingRule *rule;
+       ModestDimmingRulesGroup *group = NULL;
+       ModestDimmingRule *rule = NULL;
        gchar *notification = NULL;
 
        g_return_if_fail (MODEST_IS_DIMMING_RULE (user_data));
        rule = MODEST_DIMMING_RULE (user_data);
 
+       /* Check if this group has notification system enabled */
+       group = modest_dimming_rule_get_group (rule);
+       if (!modest_dimming_rules_group_notifications_enabled (group))
+               goto frees;
+
        /* Get specific notification */
        notification = modest_dimming_rule_get_notification (rule);
-       if (notification == NULL) return;
-
+       if (notification == NULL)
+               goto frees;
+       
        /* Show notification banner */
        modest_platform_information_banner (NULL, NULL, notification);  
-
+       
        /* Free */
-       g_free(notification);
+ frees:
+       if (group != NULL)
+               g_object_unref(group);
+       if (notification != NULL)
+               g_free(notification);
+}
+#endif
+
+static void
+on_window_destroy (gpointer data,
+                  GObject *object)
+{
+       ModestDimmingRulesGroup *self = MODEST_DIMMING_RULES_GROUP (data);
+       ModestDimmingRulesGroupPrivate *priv = MODEST_DIMMING_RULES_GROUP_GET_PRIVATE (self);
+
+       priv->window = NULL;
 }