Replace hildon pannable area with modest scrollable in msg view window
authorJose Dapena Paz <jdapena@igalia.com>
Thu, 29 Oct 2009 18:47:50 +0000 (19:47 +0100)
committerJose Dapena Paz <jdapena@igalia.com>
Thu, 29 Oct 2009 18:47:51 +0000 (19:47 +0100)
src/hildon2/modest-hildon-pannable-area-scrollable.c
src/modest-runtime.c
src/modest-runtime.h
src/modest-singletons.c
src/modest-singletons.h
src/widgets/modest-msg-view-window.c
src/widgets/modest-scrollable.c
src/widgets/modest-scrollable.h
src/widgets/modest-toolkit-factory.c
src/widgets/modest-toolkit-factory.h

index d135026..7686437 100644 (file)
@@ -70,6 +70,9 @@ enum {
        PROP_0,
        PROP_HORIZONTAL_POLICY,
        PROP_VERTICAL_POLICY,
+       PROP_MOVEMENT_MODE,
+       PROP_HORIZONTAL_MAX_OVERSHOOT,
+       PROP_VERTICAL_MAX_OVERSHOOT,
 };
 
 /* globals */
@@ -131,6 +134,31 @@ modest_hildon_pannable_area_scrollable_class_init (ModestHildonPannableAreaScrol
                                                            GTK_POLICY_AUTOMATIC,
                                                            G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
+       g_object_class_install_property (gobject_class,
+                                        PROP_MOVEMENT_MODE,
+                                        g_param_spec_enum ("movement_mode",
+                                                           "Directions scroll is allowed",
+                                                           "Movements allowed in the scrollable",
+                                                           MODEST_TYPE_MOVEMENT_MODE,
+                                                           MODEST_MOVEMENT_MODE_VERTICAL,
+                                                           G_PARAM_READWRITE |
+                                                           G_PARAM_CONSTRUCT));
+
+       g_object_class_install_property (gobject_class,
+                                        PROP_HORIZONTAL_MAX_OVERSHOOT,
+                                        g_param_spec_int ("horizontal-max-overshoot",
+                                                          "Horizontal max overshoot",
+                                                          "Horizontal maximum overshoot (0 disables)",
+                                                          0, G_MAXINT, 150,
+                                                          G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
+
+       g_object_class_install_property (gobject_class,
+                                        PROP_VERTICAL_MAX_OVERSHOOT,
+                                        g_param_spec_int ("vertical-max-overshoot",
+                                                          "Vertical max overshoot",
+                                                          "Vertical maximum overshoot (0 disables)",
+                                                          0, G_MAXINT, 150,
+                                                          G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
 }
 
 static void
@@ -167,6 +195,8 @@ modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
                                                     GParamSpec *pspec)
 {
        GtkPolicyType policy;
+       HildonMovementMode mov_mode;
+       gint overshoot;
 
        switch (prop_id) {
        case PROP_VERTICAL_POLICY:
@@ -177,6 +207,29 @@ modest_hildon_pannable_area_scrollable_get_property (GObject *obj,
                g_object_get (obj, "hscrollbar-policy", &policy, NULL);
                g_value_set_enum (value, policy);
                break;
+       case PROP_MOVEMENT_MODE:
+               g_object_get (obj, "mov-mode", &mov_mode, NULL);
+               switch (mov_mode) {
+               case HILDON_MOVEMENT_MODE_HORIZ:
+                       g_value_set_enum (value, MODEST_MOVEMENT_MODE_HORIZONTAL);
+                       break;
+               case HILDON_MOVEMENT_MODE_BOTH:
+                       g_value_set_enum (value, MODEST_MOVEMENT_MODE_BOTH);
+                       break;
+               default:
+               case HILDON_MOVEMENT_MODE_VERT:
+                       g_value_set_enum (value, MODEST_MOVEMENT_MODE_VERTICAL);
+                       break;
+               }
+               break;
+       case PROP_HORIZONTAL_MAX_OVERSHOOT:
+               g_object_get (obj, "hovershoot-max", &overshoot, NULL);
+               g_value_set_int (value, overshoot);
+               break;
+       case PROP_VERTICAL_MAX_OVERSHOOT:
+               g_object_get (obj, "vovershoot-max", &overshoot, NULL);
+               g_value_set_int (value, overshoot);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
                break;
@@ -190,6 +243,8 @@ modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
                                                     GParamSpec *pspec)
 {
        GtkPolicyType policy;
+       ModestMovementMode mov_mode;
+       gint overshoot;
 
        switch (prop_id) {
        case PROP_VERTICAL_POLICY:
@@ -200,6 +255,29 @@ modest_hildon_pannable_area_scrollable_set_property (GObject *obj,
                policy = g_value_get_enum (value);
                g_object_set (obj, "hscrollbar-policy", policy, NULL);
                break;
+       case PROP_MOVEMENT_MODE:
+               mov_mode = g_value_get_enum (value);
+               switch (mov_mode) {
+               case MODEST_MOVEMENT_MODE_HORIZONTAL:
+                       g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_HORIZ, NULL);
+                       break;
+               case HILDON_MOVEMENT_MODE_BOTH:
+                       g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
+                       break;
+               default:
+               case MODEST_MOVEMENT_MODE_VERTICAL:
+                       g_object_set (obj, "mov-mode", HILDON_MOVEMENT_MODE_VERT, NULL);
+                       break;
+               }
+               break;
+       case PROP_HORIZONTAL_MAX_OVERSHOOT:
+               overshoot = g_value_get_int (value);
+               g_object_set (obj, "hovershoot-max", overshoot, NULL);
+               break;
+       case PROP_VERTICAL_MAX_OVERSHOOT:
+               overshoot = g_value_get_int (value);
+               g_object_set (obj, "vovershoot-max", overshoot, NULL);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
                break;
index 4e98990..cc106e7 100644 (file)
@@ -201,6 +201,13 @@ modest_runtime_get_platform_factory  (void)
        return modest_singletons_get_platform_factory (_singletons);
 }
 
+ModestToolkitFactory*
+modest_runtime_get_toolkit_factory  (void)
+{
+       g_return_val_if_fail (_singletons, NULL);
+       return modest_singletons_get_toolkit_factory (_singletons);
+}
+
 ModestTnySendQueue*
 modest_runtime_get_send_queue  (TnyTransportAccount *account,
                                gboolean create)
index badd6c5..0fce328 100644 (file)
@@ -45,6 +45,7 @@
 #include <modest-protocol-registry.h>
 #include <tny-stream-cache.h>
 #include <modest-plugin-factory.h>
+#include <widgets/modest-toolkit-factory.h>
 
 G_BEGIN_DECLS
 
@@ -182,8 +183,14 @@ TnyDevice*                    modest_runtime_get_device     (void);
  **/
 TnyPlatformFactory*           modest_runtime_get_platform_factory     (void);
 
-
-
+/**
+ * modest_runtime_get_toolkit_factory:
+ * 
+ * get the #ModestToolkitFactory singleton instance
+ *
+ * Returns: the #ModestToolkitFactory singleton. This should NOT be unref'd.
+ **/
+ModestToolkitFactory*           modest_runtime_get_toolkit_factory     (void);
 
 /**
  * modest_runtime_get_mail_operation_queue:
index ca28aeb..045ff09 100644 (file)
@@ -55,6 +55,7 @@ struct _ModestSingletonsPrivate {
        ModestWindowMgr           *window_mgr;
        ModestProtocolRegistry    *protocol_registry;
        ModestPluginFactory   *plugin_factory;
+       ModestToolkitFactory      *toolkit_factory;
        TnyStreamCache            *images_cache;
 };
 #define MODEST_SINGLETONS_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
@@ -116,6 +117,7 @@ modest_singletons_init (ModestSingletons *obj)
        priv->window_mgr      = NULL;
        priv->protocol_registry = NULL;
        priv->plugin_factory = NULL;
+       priv->toolkit_factory = NULL;
 
        priv->protocol_registry = modest_protocol_registry_new ();
        if (!priv->protocol_registry) {
@@ -149,6 +151,12 @@ modest_singletons_init (ModestSingletons *obj)
                return;
        }
 
+       priv->toolkit_factory  = modest_toolkit_factory_get_instance ();
+       if (!priv->toolkit_factory) {
+               g_printerr ("modest: cannot create toolkit factory instance\n");
+               return;
+       }
+
        priv->device  = tny_platform_factory_new_device (priv->platform_fact);
        if (!priv->device) {
                g_printerr ("modest: cannot create tny device instance\n");
@@ -354,6 +362,13 @@ modest_singletons_get_platform_factory (ModestSingletons *self)
        return MODEST_SINGLETONS_GET_PRIVATE(self)->platform_fact;
 }
 
+ModestToolkitFactory*
+modest_singletons_get_toolkit_factory (ModestSingletons *self)
+{
+       g_return_val_if_fail (self, NULL);
+       return MODEST_SINGLETONS_GET_PRIVATE(self)->toolkit_factory;
+}
+
 ModestWindowMgr* 
 modest_singletons_get_window_mgr (ModestSingletons *self)
 {
index d2669ef..76f9532 100644 (file)
@@ -39,6 +39,7 @@
 #include <modest-mail-operation-queue.h>
 #include <modest-cache-mgr.h>
 #include <modest-tny-platform-factory.h>
+#include <widgets/modest-toolkit-factory.h>
 #include "modest-plugin-factory.h"
 #include "widgets/modest-window-mgr.h"
 #include "modest-protocol-registry.h"
@@ -153,6 +154,18 @@ ModestCacheMgr*           modest_singletons_get_cache_mgr     (ModestSingletons
  **/
 TnyPlatformFactory*       modest_singletons_get_platform_factory  (ModestSingletons *self);
 
+/**
+ * modest_singletons_get_toolkit_factory:
+ * @self: a valid #ModestSingletons instance
+ * 
+ * get the #TnyToolkitFactory singleton instance
+ * don't use this function directly, use the modest-runtime
+ * functions instead.
+ *
+ * Returns: the #ModestToolkitFactory singleton
+ **/
+ModestToolkitFactory*       modest_singletons_get_toolkit_factory  (ModestSingletons *self);
+
 
 /**
  * modest_singletons_get_device:
index bd2a5d9..d6081d8 100644 (file)
@@ -48,7 +48,8 @@
 #include <modest-tny-folder.h>
 #include <modest-text-utils.h>
 #include <modest-account-mgr-helpers.h>
-#include <hildon/hildon-pannable-area.h>
+#include <modest-toolkit-factory.h>
+#include <modest-scrollable.h>
 #include <hildon/hildon-picker-dialog.h>
 #include <hildon/hildon-app-menu.h>
 #include "modest-defs.h"
@@ -349,7 +350,7 @@ modest_msg_view_window_scroll_child (ModestMsgViewWindow *self,
        }
 
        if (step)
-               modest_maemo_utils_scroll_pannable((HildonPannableArea *) priv->main_scroll, 0, step);
+               modest_scrollable_scroll ((ModestScrollable *) priv->main_scroll, 0, step);
 
        return (gboolean) step;
 }
@@ -547,17 +548,15 @@ init_window (ModestMsgViewWindow *obj)
        priv->msg_view = GTK_WIDGET (tny_platform_factory_new_msg_view (modest_tny_platform_factory_get_instance ()));
        modest_msg_view_set_shadow_type (MODEST_MSG_VIEW (priv->msg_view), GTK_SHADOW_NONE);
        main_vbox = gtk_vbox_new  (FALSE, 6);
-       /****** HILDON2:START
-        * create panning widget, and set parameters
-        */
-       priv->main_scroll = hildon_pannable_area_new ();
+
+       priv->main_scroll = modest_toolkit_factory_create_scrollable (modest_runtime_get_toolkit_factory ());
+       modest_scrollable_set_horizontal_policy (MODEST_SCROLLABLE (priv->main_scroll), GTK_POLICY_AUTOMATIC);
         g_object_set (G_OBJECT (priv->main_scroll),
-                     "mov-mode", HILDON_MOVEMENT_MODE_BOTH,
-                     "hovershoot-max", 0,
+                     "movement-mode", MODEST_MOVEMENT_MODE_BOTH,
+                     "horizontal-max-overshoot", 0,
                      NULL);
        gtk_container_add (GTK_CONTAINER (priv->main_scroll), priv->msg_view);
        gtk_box_pack_start (GTK_BOX(main_vbox), priv->main_scroll, TRUE, TRUE, 0);
-       /****** HILDON2:END */
        gtk_container_add   (GTK_CONTAINER(obj), main_vbox);
 
        /* NULL-ize fields if the window is destroyed */
index 97f4289..fab9450 100644 (file)
@@ -216,6 +216,29 @@ modest_scrollable_base_init (gpointer g_iface)
                                                                        G_PARAM_READWRITE |
                                                                        G_PARAM_CONSTRUCT));
 
+               g_object_interface_install_property (g_iface,
+                                                    g_param_spec_enum ("movement_mode",
+                                                                       "Directions scroll is allowed",
+                                                                       "Movements allowed in the scrollable",
+                                                                       MODEST_TYPE_MOVEMENT_MODE,
+                                                                       MODEST_MOVEMENT_MODE_VERTICAL,
+                                                                       G_PARAM_READWRITE |
+                                                                       G_PARAM_CONSTRUCT));
+
+               g_object_interface_install_property (g_iface,
+                                                    g_param_spec_int ("horizontal-max-overshoot",
+                                                                      "Horizontal max overshoot",
+                                                                      "Horizontal maximum overshoot (0 disables)",
+                                                                      0, G_MAXINT, 150,
+                                                                      G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
+
+               g_object_interface_install_property (g_iface,
+                                                    g_param_spec_int ("vertical-max-overshoot",
+                                                                      "Vertical max overshoot",
+                                                                      "Vertical maximum overshoot (0 disables)",
+                                                                      0, G_MAXINT, 150,
+                                                                      G_PARAM_READWRITE |G_PARAM_CONSTRUCT));
+
 
        }
 }
@@ -248,3 +271,58 @@ modest_scrollable_get_type (void)
 
        return type;
 }
+
+void
+modest_scrollable_scroll (ModestScrollable *scrollable, 
+                         gint horizontal, gint vertical)
+{
+       g_return_if_fail (MODEST_IS_SCROLLABLE (scrollable));
+       gint h_pos = -1;
+       gint v_pos = -1;
+
+       g_assert (scrollable);
+       /* at atleast one of values have to be valid */
+       g_return_if_fail (h_pos == -1 && v_pos == -1);
+
+       if (horizontal != 0) {
+               GtkAdjustment *h_adj;
+
+               h_adj = modest_scrollable_get_hadjustment (scrollable);
+               g_return_if_fail (h_adj);
+
+               h_pos = h_adj->value + h_adj->step_increment * horizontal;
+               if (horizontal > 0) {
+                       h_pos += h_adj->page_size;
+               }
+       }
+
+       if (vertical != 0) {
+               GtkAdjustment *v_adj;
+
+               v_adj = modest_scrollable_get_vadjustment (scrollable);
+               g_return_if_fail (v_adj);
+
+               v_pos = v_adj->value + v_adj->step_increment * vertical;
+               if (vertical > 0) {
+                       v_pos += v_adj->page_size;
+               }
+       }
+
+       modest_scrollable_scroll_to (scrollable, h_pos, v_pos);
+}
+
+GType
+modest_movement_mode_get_type (void)
+{
+  static GType etype = 0;
+  if (etype == 0) {
+    static const GFlagsValue values[] = {
+           { MODEST_MOVEMENT_MODE_HORIZONTAL, "HILDON_MOVEMENT_MODE_HORIZONTAL", "horizontal" },
+           { MODEST_MOVEMENT_MODE_VERTICAL, "MODEST_MOVEMENT_MODE_VERTICAL", "vertical" },
+           { MODEST_MOVEMENT_MODE_BOTH, "MODEST_MOVEMENT_MODE_BOTH", "both" },
+           { 0, NULL, NULL }
+    };
+    etype = g_flags_register_static ("ModestMovementMode", values);
+  }
+  return etype;
+}
index aa95c44..c2d16db 100644 (file)
@@ -59,12 +59,28 @@ struct _ModestScrollableIface
        void (*set_horizontal_policy) (ModestScrollable *self, GtkPolicyType policy);
 
        /* properties */
-       /* hscrollbar-policy; */
-       /* vscrollbar-policy; */        
+       /* horizontal-policy; */
+       /* vertical-policy; */
+       /* movement-mode */
+       /* horizontal-max-overshoot */
+       /* vertical-max-overshoot */
+       
 };
 
 GType modest_scrollable_get_type (void);
 
+typedef enum {
+  MODEST_MOVEMENT_MODE_HORIZONTAL = 1 << 1,
+  MODEST_MOVEMENT_MODE_VERTICAL = 1 << 2,
+  MODEST_MOVEMENT_MODE_BOTH = 0x000006
+} ModestMovementMode;
+
+
+GType modest_movement_mode_get_type (void);
+#define MODEST_TYPE_MOVEMENT_MODE (modest_movement_mode_get_type())
+
+
+/* virtual methods */
 void modest_scrollable_add_with_viewport (ModestScrollable *self, GtkWidget *widget);
 GtkAdjustment * modest_scrollable_get_vadjustment (ModestScrollable *self);
 GtkAdjustment * modest_scrollable_get_hadjustment (ModestScrollable *self);
@@ -75,6 +91,9 @@ GtkPolicyType modest_scrollable_get_horizontal_policy (ModestScrollable *self);
 void modest_scrollable_set_vertical_policy (ModestScrollable *self, GtkPolicyType policy);
 void modest_scrollable_set_horizontal_policy (ModestScrollable *self, GtkPolicyType policy);
 
+/* utils */
+void modest_scrollable_scroll (ModestScrollable *self, gint horizontal, gint vertical);
+
 G_END_DECLS
 
 #endif
index 539e4fe..a2451da 100644 (file)
@@ -44,7 +44,7 @@ G_DEFINE_TYPE    (ModestToolkitFactory,
                  G_TYPE_OBJECT);
 
 ModestToolkitFactory *
-modest_toolkit_factory_new                            (void)
+modest_toolkit_factory_get_instance                            (void)
 {
     GObject* self = g_object_new (MODEST_TYPE_TOOLKIT_FACTORY, NULL);
 
index f343dae..abf0594 100644 (file)
@@ -48,7 +48,7 @@ GType
 modest_toolkit_factory_get_type                       (void) G_GNUC_CONST;
 
 ModestToolkitFactory *
-modest_toolkit_factory_new                            (void);
+modest_toolkit_factory_get_instance                            (void);
 
 GtkWidget *
 modest_toolkit_factory_create_scrollable              (ModestToolkitFactory *self);