_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 =
_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
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);
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);
}
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;
}
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,
}
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;
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);
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);
{
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);
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)
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");
+ }
}
}
}
}
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__,
}
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;
_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;
}
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