--- /dev/null
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+#include "elm_priv.h"
+
+#define DATETIME_FIELD_COUNT 6
+#define FIELD_FORMAT_LEN 3
+#define BUFF_SIZE 100
+
+typedef struct _Input_Spinner_Module_Data Input_Spinner_Module_Data;
+
+struct _Input_Spinner_Module_Data
+{
+ Elm_Datetime_Module_Data mod_data;
+};
+
+static void
+_field_value_set(struct tm *tim, Elm_Datetime_Field_Type field_type, int val)
+{
+ if (field_type >= DATETIME_FIELD_COUNT - 1) return;
+
+ int *timearr[]= { &tim->tm_year, &tim->tm_mon, &tim->tm_mday, &tim->tm_hour, &tim->tm_min };
+ *timearr[field_type] = val;
+}
+
+static void
+_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ Elm_Datetime_Field_Type field_type;
+ struct tm tim;
+ int value ;
+
+ layout_mod = (Input_Spinner_Module_Data *)data;
+
+ elm_datetime_value_get(layout_mod->mod_data.base, &tim);
+ field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
+ value = elm_spinner_value_get(obj);
+
+ if (field_type == ELM_DATETIME_YEAR)
+ {
+ value -= 1900;
+ }
+ else if (field_type == ELM_DATETIME_MONTH)
+ {
+ value -= 1;
+ }
+
+ _field_value_set(&tim, field_type, value);
+
+ elm_datetime_value_set(layout_mod->mod_data.base, &tim);
+}
+
+static void
+_ampm_clicked_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ struct tm curr_time;
+
+ layout_mod = (Input_Spinner_Module_Data *)data;
+ if (!layout_mod) return;
+
+ elm_datetime_value_get(layout_mod->mod_data.base, &curr_time);
+ if (curr_time.tm_hour >= 12) curr_time.tm_hour -= 12;
+ else curr_time.tm_hour += 12;
+ elm_datetime_value_set(layout_mod->mod_data.base, &curr_time);
+}
+
+static void
+_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
+{
+ const char* type = NULL;
+
+ switch (field_type)
+ {
+ case ELM_DATETIME_YEAR:
+ type = "datetime field, year";
+ break;
+
+ case ELM_DATETIME_MONTH:
+ type = "datetime field, month";
+ break;
+
+ case ELM_DATETIME_DATE:
+ type = "datetime field, date";
+ break;
+
+ case ELM_DATETIME_HOUR:
+ type = "datetime field, hour";
+ break;
+
+ case ELM_DATETIME_MINUTE:
+ type = "datetime field, minute";
+ break;
+
+ case ELM_DATETIME_AMPM:
+ type = "datetime field, AM PM";
+ break;
+
+ default:
+ break;
+ }
+}
+
+// module fucns for the specific module type
+EAPI void
+field_format_changed(Elm_Datetime_Module_Data *module_data, Evas_Object *obj)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ Elm_Datetime_Field_Type field_type;
+ int min, max;
+ struct tm tim;
+ char buf[BUFF_SIZE] = {0};
+ const char *fmt;
+
+ layout_mod = (Input_Spinner_Module_Data *)module_data;
+ if (!layout_mod || !obj) return;
+
+ field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
+
+ if ((field_type == ELM_DATETIME_MONTH) || (field_type == ELM_DATETIME_HOUR))
+ {
+ fmt = layout_mod->mod_data.field_format_get(layout_mod->mod_data.base, field_type);
+ layout_mod->mod_data.field_limit_get(layout_mod->mod_data.base, field_type, &min, &max);
+ for (int i = min ; i <= max; i++)
+ {
+ if (field_type == ELM_DATETIME_MONTH)
+ tim.tm_mon = i;
+ else
+ tim.tm_hour = i;
+
+ strftime(buf, sizeof(buf), fmt, &tim);
+
+ if (field_type == ELM_DATETIME_MONTH)
+ elm_spinner_special_value_add(obj, i + 1, buf);
+ else
+ elm_spinner_special_value_add(obj, i, buf);
+ }
+ }
+}
+
+EAPI void
+field_value_display(Elm_Datetime_Module_Data *module_data, Evas_Object *obj)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ Elm_Datetime_Field_Type field_type;
+ int min, max, value;
+ struct tm tim;
+ char buf[BUFF_SIZE] = {0};
+ const char *fmt;
+
+ layout_mod = (Input_Spinner_Module_Data *)module_data;
+ if (!layout_mod || !obj) return;
+
+ elm_datetime_value_get(layout_mod->mod_data.base, &tim);
+
+ field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
+ fmt = layout_mod->mod_data.field_format_get(layout_mod->mod_data.base, field_type);
+ strftime(buf, sizeof(buf), fmt, &tim);
+
+ if(field_type == ELM_DATETIME_AMPM)
+ {
+ if ((tim.tm_hour > 0) && (tim.tm_hour <= 12))
+ elm_object_text_set(obj, "AM");
+ else
+ elm_object_text_set(obj, "PM");
+ }
+ else if (field_type == ELM_DATETIME_MONTH)
+ {
+ layout_mod->mod_data.field_limit_get(layout_mod->mod_data.base, field_type, &min, &max);
+ elm_spinner_min_max_set(obj, 1 + min, 1 + max);
+ elm_spinner_value_set(obj, 1 + tim.tm_mon);
+ }
+ else if (field_type == ELM_DATETIME_YEAR)
+ {
+ layout_mod->mod_data.field_limit_get(layout_mod->mod_data.base, field_type, &min, &max);
+ elm_spinner_min_max_set(obj, 1900 + min, 1900 + max);
+ elm_spinner_value_set(obj, 1900 + tim.tm_year);
+ }
+ else if (field_type == ELM_DATETIME_HOUR)
+ {
+ layout_mod->mod_data.field_limit_get(layout_mod->mod_data.base, field_type, &min, &max);
+ elm_spinner_min_max_set(obj, min, max);
+ elm_spinner_value_set(obj, tim.tm_hour);
+ }
+ else
+ {
+ layout_mod->mod_data.field_limit_get(layout_mod->mod_data.base, field_type, &min, &max);
+ elm_spinner_min_max_set(obj, min, max);
+ value = atoi(buf);
+ elm_spinner_value_set(obj, value);
+ }
+
+}
+
+EAPI Evas_Object *
+field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type field_type)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ Evas_Object *field_obj;
+ layout_mod = (Input_Spinner_Module_Data *)module_data;
+ if (!layout_mod) return NULL;
+
+ if (field_type == ELM_DATETIME_AMPM)
+ {
+ field_obj = elm_button_add(layout_mod->mod_data.base);
+ elm_object_style_set(field_obj, "datetime/ampm");
+ evas_object_smart_callback_add(field_obj, "clicked", _ampm_clicked_cb, layout_mod);
+ }
+ else
+ {
+ field_obj = elm_spinner_add(layout_mod->mod_data.base);
+ elm_spinner_editable_set(field_obj, EINA_TRUE);
+ elm_object_style_set(field_obj, "vertical_date_picker");
+ elm_spinner_step_set(field_obj, 1);
+ elm_spinner_wrap_set(field_obj, EINA_TRUE);
+ elm_spinner_label_format_set(field_obj, "%02.0f");
+ if (field_type == ELM_DATETIME_HOUR || field_type == ELM_DATETIME_MONTH)
+ elm_spinner_interval_set(field_obj, 0.2);
+ else
+ elm_spinner_interval_set(field_obj, 0.1);
+ evas_object_smart_callback_add(field_obj, "changed", _spinner_changed_cb, layout_mod);
+ }
+ evas_object_data_set(field_obj, "_field_type", (void *)field_type);
+
+ // ACCESS
+ _access_set(field_obj, field_type);
+
+ return field_obj;
+}
+
+EAPI Elm_Datetime_Module_Data *
+obj_hook(Evas_Object *obj)
+{
+ Input_Spinner_Module_Data *layout_mod;
+ layout_mod = ELM_NEW(Input_Spinner_Module_Data);
+ if (!layout_mod) return NULL;
+
+ return ((Elm_Datetime_Module_Data*)layout_mod);
+}
+
+EAPI void
+obj_unhook(Elm_Datetime_Module_Data *module_data)
+{
+ Input_Spinner_Module_Data *layout_mod;
+
+ layout_mod = (Input_Spinner_Module_Data *)module_data;
+ if (!layout_mod) return;
+
+ if (layout_mod)
+ {
+ free(layout_mod);
+ layout_mod = NULL;
+ }
+}
+
+EAPI void
+obj_hide(Elm_Datetime_Module_Data *module_data)
+{
+ return;
+}
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+ return 1; // succeed always
+}