[elm_datetime.c] Additional functions are added for data sharing between Datetime...
authorsumanth <sumanth.m@samsung.com>
Sat, 27 Jul 2013 16:06:00 +0000 (21:36 +0530)
committerSungho Kwak <sungho1.kwak@samsung.com>
Tue, 6 Aug 2013 05:16:34 +0000 (14:16 +0900)
Change-Id: I7d4bcf39bdf6ce0f8726d5dfce87c718d5ca129a

src/lib/elm_datetime.c
src/lib/elm_priv.h
src/lib/elm_widget_datetime.h
src/modules/datetime_input_popup/datetime_input_popup.c

index db1eebc..1135e20 100644 (file)
@@ -83,6 +83,12 @@ _dt_mod_init()
      _elm_module_symbol_get(mod, "obj_hook");
    ((Datetime_Mod_Api *)(mod->api))->obj_unhook =
      _elm_module_symbol_get(mod, "obj_unhook");
+   ((Datetime_Mod_Api *)(mod->api))->obj_theme_hook =
+     _elm_module_symbol_get(mod, "obj_theme_hook");
+   ((Datetime_Mod_Api *)(mod->api))->obj_focus_hook =
+     _elm_module_symbol_get(mod, "obj_focus_hook");
+   ((Datetime_Mod_Api *)(mod->api))->obj_format_hook =
+     _elm_module_symbol_get(mod, "obj_format_hook");
    ((Datetime_Mod_Api *)(mod->api))->obj_hide =
      _elm_module_symbol_get(mod, "obj_hide");
    ((Datetime_Mod_Api *)(mod->api))->field_create =
@@ -413,6 +419,9 @@ _reload_format(Evas_Object *obj)
 
    _field_list_arrange(obj);
    edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
+
+   if ((dt_mod) && (dt_mod->obj_format_hook))
+     dt_mod->obj_format_hook(sd->mod_data);
 }
 
 static Eina_Bool
@@ -484,7 +493,7 @@ _elm_datetime_smart_focus_next(const Evas_Object *obj,
         list_free = eina_list_free;
         if (!items) return EINA_FALSE;
      }
-printf("count = %d\n", eina_list_count(items));
+
    ret = elm_widget_focus_list_next_get(obj, items, list_data_get, dir, next);
    if (list_free) list_free((Eina_List *)items);
 
@@ -494,10 +503,13 @@ printf("count = %d\n", eina_list_count(items));
 static Eina_Bool
 _elm_datetime_smart_on_focus(Evas_Object *obj)
 {
+  ELM_DATETIME_DATA_GET(obj, sd);
+
+  if ((dt_mod) && (dt_mod->obj_focus_hook))
+    dt_mod->obj_focus_hook(sd->mod_data);
+
    if (!elm_widget_focus_get(obj))
      {
-        ELM_DATETIME_DATA_GET(obj, sd);
-
         if ((dt_mod) && (dt_mod->obj_hide))
           dt_mod->obj_hide(sd->mod_data);
      }
@@ -581,6 +593,9 @@ _elm_datetime_smart_theme(Evas_Object *obj)
    edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
    elm_layout_sizing_eval(obj);
 
+   if ((dt_mod) && (dt_mod->obj_theme_hook))
+     dt_mod->obj_theme_hook(sd->mod_data);
+
    return EINA_TRUE;
 }
 
@@ -717,6 +732,22 @@ _field_format_get(Evas_Object *obj,
    return field->fmt;
 }
 
+static Eina_Bool
+_field_location_get(Evas_Object *obj, Elm_Datetime_Field_Type field_type,
+                    int *loc)
+{
+   Datetime_Field *field;
+
+   ELM_DATETIME_DATA_GET(obj, sd);
+
+   field = sd->field_list + field_type;
+   if (!field) return EINA_FALSE;
+
+   if (loc) *loc = field->location;
+
+   return (field->fmt_exist && field->visible);
+}
+
 static void
 _field_limit_get(Evas_Object *obj,
                  Elm_Datetime_Field_Type field_type,
@@ -758,6 +789,52 @@ _field_limit_get(Evas_Object *obj,
 }
 
 static void
+_fields_min_max_get(Evas_Object *obj, struct tm *set_value,
+                    struct tm *min_value, struct tm *max_value)
+{
+   int value, min, max, max_days;
+   Datetime_Field *field;
+   unsigned int i, idx;
+
+   ELM_DATETIME_DATA_GET(obj, sd);
+
+   if (!set_value || min_value || !max_value) return;
+
+   DATETIME_TM_ARRAY(mod_set_timearr, set_value);
+   DATETIME_TM_ARRAY(mod_min_timearr, min_value);
+   DATETIME_TM_ARRAY(mod_max_timearr, max_value);
+
+   DATETIME_TM_ARRAY(min_timearr, &sd->min_limit);
+   DATETIME_TM_ARRAY(max_timearr, &sd->max_limit);
+
+   for (idx = 0; idx < ELM_DATETIME_AMPM; idx++)
+     {
+        field = sd->field_list + idx;
+        min = field->min;
+        max = field->max;
+
+        for (i = 0; i < idx; i++)
+          if (*mod_set_timearr[i] > *min_timearr[i]) break;
+        if ((i == idx) && (min < *min_timearr[idx]))
+          min = *min_timearr[idx];
+
+        if (idx == ELM_DATETIME_DATE)
+          {
+             max_days = _max_days_get(mod_set_timearr[ELM_DATETIME_YEAR],
+                                      mod_set_timearr[ELM_DATETIME_MONTH]);
+             if (max > max_days) max = max_days;
+          }
+        for (i = 0; i < idx; i++)
+          if (*mod_set_timearr[i] < *max_timearr[i]) break;
+        if ((i == idx) && (max > *max_timearr[idx]))
+          max = *max_timearr[idx];
+
+        *mod_min_timearr[idx] = min;
+        *mod_max_timearr[idx] = max;
+     }
+}
+
+static void
 _field_list_init(Evas_Object *obj)
 {
    Datetime_Field *field;
@@ -829,8 +906,10 @@ _elm_datetime_smart_add(Evas_Object *obj)
    if (priv->mod_data)
      {
         priv->mod_data->base = obj;
-        priv->mod_data->field_limit_get = _field_limit_get;
         priv->mod_data->field_format_get = _field_format_get;
+        priv->mod_data->field_location_get = _field_location_get;
+        priv->mod_data->field_limit_get = _field_limit_get;
+        priv->mod_data->fields_min_max_get = _fields_min_max_get;
      }
 
    _field_list_init(obj);
index b41a037..f1ce48d 100644 (file)
@@ -264,12 +264,19 @@ struct _Elm_Module
 struct _Elm_Datetime_Module_Data
 {
    Evas_Object *base;
+   const char  *(*field_format_get)(Evas_Object * obj,
+                                    Elm_Datetime_Field_Type field_type);
+   Eina_Bool    (*field_location_get)(Evas_Object *obj,
+                                      Elm_Datetime_Field_Type field_type,
+                                      int *loc);
    void         (*field_limit_get)(Evas_Object *obj,
                                    Elm_Datetime_Field_Type field_type,
                                    int *range_min,
                                    int *range_max);
-   const char  *(*field_format_get)(Evas_Object * obj,
-                                    Elm_Datetime_Field_Type field_type);
+   void         (*fields_min_max_get)(Evas_Object *obj,
+                                      struct tm *set_value,
+                                      struct tm *min_value,
+                                      struct tm *max_value);
 };
 
 void                 _elm_emotion_init(void);
index 6a7611a..5cd5bbc 100644 (file)
@@ -146,6 +146,9 @@ struct _Datetime_Mod_Api
 {
    Elm_Datetime_Module_Data *(*obj_hook)(Evas_Object * obj);
    void                      (*obj_unhook)(Elm_Datetime_Module_Data *mdata);
+   void                      (*obj_theme_hook)(Elm_Datetime_Module_Data *mdata);
+   void                      (*obj_focus_hook)(Elm_Datetime_Module_Data *mdata);
+   void                      (*obj_format_hook)(Elm_Datetime_Module_Data *mdata);
    void                      (*obj_hide)(Elm_Datetime_Module_Data *mdata);
    Evas_Object              *(*field_create)(Elm_Datetime_Module_Data * mdata,
                                              Elm_Datetime_Field_Type ftype);
index 6d1e6eb..bb0bbfa 100644 (file)
@@ -133,7 +133,10 @@ _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *even
              entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
              if (!entry) continue;
              if (elm_object_focus_get(entry))
-               elm_object_focus_set(entry, EINA_FALSE);
+               {
+                  elm_object_focus_set(entry, EINA_FALSE);
+                  elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
+               }
           }
      }
    else if (content == popup_mod->timepicker_layout)
@@ -144,7 +147,10 @@ _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *even
              entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
              if (!entry) continue;
              if (elm_object_focus_get(entry))
-               elm_object_focus_set(entry, EINA_FALSE);
+               {
+                  elm_object_focus_set(entry, EINA_FALSE);
+                  elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
+               }
           }
      }
 }
@@ -939,6 +945,28 @@ _create_timepicker_layout(Popup_Module_Data *popup_mod)
 }
 
 static void
+_module_format_change(Popup_Module_Data *popup_mod)
+{
+   Evas_Object *datetime;
+   int idx;
+   Eina_Bool datepicker_bg_hide = EINA_FALSE;
+   Eina_Bool timepicker_bg_hide = EINA_FALSE;
+
+   if (!popup_mod) return;
+
+   datetime = popup_mod->mod_data.base;
+   for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
+     datepicker_bg_hide |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
+   if (datepicker_bg_hide)
+     elm_layout_signal_emit(datetime, "datetime,datepicker,bg,hide", "elm");
+
+   for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
+     timepicker_bg_hide |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
+   if (timepicker_bg_hide)
+     elm_layout_signal_emit(datetime, "datetime,timepicker,bg,hide", "elm");
+}
+
+static void
 _datepicker_show_cb(void *data,
                    Evas_Object *obj __UNUSED__,
                    const char *emission __UNUSED__,
@@ -981,6 +1009,21 @@ _timepicker_show_cb(void *data,
 }
 
 static void
+_module_language_changed_cb(void *data,
+                           Evas_Object *obj __UNUSED__,
+                           const char *emission __UNUSED__,
+                           const char *source __UNUSED__)
+{
+   Popup_Module_Data *popup_mod;
+
+   popup_mod = (Popup_Module_Data *)data;
+   if (!popup_mod || popup_mod->popup) return;
+
+   _set_month_special_values(popup_mod);
+   _set_ampm_special_values(popup_mod);
+}
+
+static void
 _access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
 {
    const char* type = NULL;
@@ -1090,6 +1133,8 @@ obj_hook(Evas_Object *obj __UNUSED__)
                                   _timepicker_show_cb, popup_mod);
    elm_object_signal_callback_add(obj, "datetime,timepicker,hide", "",
                                   _timepicker_hide_cb, popup_mod);
+   elm_object_signal_callback_add(obj, "language,changed", "",
+                                  _module_language_changed_cb, popup_mod);
 
    popup_mod->popup = NULL;
    popup_mod->datepicker_layout = NULL;
@@ -1119,19 +1164,29 @@ obj_unhook(Elm_Datetime_Module_Data *module_data)
 }
 
 EAPI void
-obj_language_change(Elm_Datetime_Module_Data *module_data __UNUSED__)
+obj_format_hook(Elm_Datetime_Module_Data *module_data)
 {
    Popup_Module_Data *popup_mod;
 
    popup_mod = (Popup_Module_Data *)module_data;
-   if (!popup_mod || popup_mod->popup) return;
+   if (!popup_mod) return;
 
-   _set_month_special_values(popup_mod);
-   _set_ampm_special_values(popup_mod);
+   _module_format_change(popup_mod);
+}
+
+EAPI void
+obj_theme_hook(Elm_Datetime_Module_Data *module_data)
+{
+   Popup_Module_Data *popup_mod;
+
+   popup_mod = (Popup_Module_Data *)module_data;
+   if (!popup_mod) return;
+
+   // TODO: function can be improved to provide different popup styles.
 }
 
 EAPI void
-obj_hide(Elm_Datetime_Module_Data *module_data __UNUSED__)
+obj_focus_hook(Elm_Datetime_Module_Data *module_data __UNUSED__)
 {
    // TODO: Default focus - enhance this func. for obj_show/obj_hide like below
 #if 0