[elm_datefield]initial release
authorSohyun Kim <anna1014.kim@samsung.com>
Mon, 16 Aug 2010 22:57:14 +0000 (07:57 +0900)
committerSohyun Kim <anna1014.kim@samsung.com>
Mon, 16 Aug 2010 22:57:14 +0000 (07:57 +0900)
src/lib/Elementary.h.in [changed mode: 0644->0755]
src/lib/Makefile.am
src/lib/elm_datefield.c [new file with mode: 0755]

old mode 100644 (file)
new mode 100755 (executable)
index a275138..ece2113
@@ -1795,6 +1795,20 @@ extern "C" {
     * default
     */
 
+   /* datefield */
+   typedef enum _Elm_Datefield_Layout
+   {
+       ELM_DATEFIELD_LAYOUT_TIME,
+       ELM_DATEFIELD_LAYOUT_DATE,
+       ELM_DATEFIELD_LAYOUT_DATEANDTIME
+   } Elm_Datefield_Layout;
+   
+   EAPI Evas_Object *elm_datefield_add(Evas_Object *parent);
+   EAPI void elm_datefield_layout_set(Evas_Object *obj, Elm_Datefield_Layout layout);
+   EAPI void elm_datefield_date_set(Evas_Object *obj, int year, int month, int day, int hour, int min);
+   EAPI void elm_datefield_date_get(Evas_Object *obj, int *year, int *month, int *day, int *hour, int *min);
+   EAPI void elm_datefield_time_mode_set(Evas_Object *obj, Eina_Bool mode);    
+
    /* titlebar */
    EAPI Evas_Object *elm_titlebar_add(Evas_Object *parent);
    EAPI void         elm_titlebar_label_set(Evas_Object *obj, const char *label);
index 0db243f..b68a5ef 100644 (file)
@@ -126,6 +126,7 @@ elm_dayselector.c \
 elm_cnp_helper.c \
 elm_webview.c \
 elm_cbhm_helper.c \
+elm_datefield.c \
 \
 elc_anchorblock.c \
 elc_anchorview.c \
diff --git a/src/lib/elm_datefield.c b/src/lib/elm_datefield.c
new file mode 100755 (executable)
index 0000000..364344f
--- /dev/null
@@ -0,0 +1,645 @@
+#include <Elementary.h>
+#include "elm_priv.h"
+
+/**
+ * @defgroup Datefield Datefield
+ * @ingroup Elementary
+ *
+ * This is a date editfield. it is used to input date and time using keypad
+ */
+
+typedef struct _Widget_Data Widget_Data;
+
+enum {
+       DATE_YEAR,
+       DATE_MON,
+       DATE_DAY,
+       DATE_MAX
+};
+
+enum {
+       TIME_HOUR,
+       TIME_MIN,
+       TIME_MAX
+};
+
+#define YEAR_MAX_LENGTH        4
+#define MONTH_MAX_LENGTH       3
+#define DAY_MAX_LENGTH         2
+#define TIME_MAX_LENGTH        2
+
+#define YEAR_MAXIMUM   2099
+#define YEAR_MINIMUM   1900
+#define HOUR_24H_MAXIMUM       24
+#define HOUR_12H_MAXIMUM       12
+#define MIN_MAXIMUM    59
+
+static char month_label[13][4] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
+
+/*
+       ELM_DATEFIELD_MODE_TIME,
+       ELM_DATEFIELD_MODE_DATE,
+       ELM_DATEFIELD_MODE_DATEANDTIME
+*/
+
+struct _Widget_Data
+{
+       Evas_Object *base;      
+       Evas_Object *date[DATE_MAX];
+       Evas_Object *time[TIME_MAX];
+       Ecore_Event_Handler *handler;
+       int layout;
+
+       int year, month, day, hour, min;
+       Eina_Bool pm:1;
+       Eina_Bool time_mode:1;
+       Eina_Bool editing:1;
+};
+
+static const char *widtype = NULL;
+static void _del_hook(Evas_Object *obj);
+static void _theme_hook(Evas_Object *obj);
+static void _sizing_eval(Evas_Object *obj);
+static void _on_focus_hook(void *data, Evas_Object *obj);
+
+static void
+_del_hook(Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd || !wd->base) return ;  
+       
+       ecore_event_handler_del(wd->handler);
+}
+
+static void
+_on_focus_hook(void *data, Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd || !wd->base) return ;  
+
+       if (!elm_widget_focus_get(obj))
+               edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
+}
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+}
+
+static void
+_sizing_eval(Evas_Object *obj)
+{
+       Widget_Data *wd = elm_widget_data_get(obj);
+       Evas_Coord minw = -1, minh = -1;
+       edje_object_size_min_calc(wd->base, &minw, &minh);
+       evas_object_size_hint_min_set(obj, minw, minh);
+       evas_object_size_hint_max_set(obj, -1, -1);
+}
+
+static int
+_maximum_day_get(int year, int month)
+{
+       int day_of_month = 0;
+       if (year == 0 || month == 0) return 0;
+
+       switch (month) {
+               case 4: 
+               case 6: 
+               case 9: 
+               case 11:
+                       day_of_month = 30;
+                       break;
+               case 2:
+                       if ((!(year % 4) && (year % 100)) || !(year % 400))
+                               day_of_month = 29;
+                       else
+                               day_of_month = 28;
+                       break;
+               default:
+                       day_of_month = 31;
+                       break;
+       }
+
+       return day_of_month;
+}
+
+static void
+_signal_ampm_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       ELM_CHECK_WIDTYPE(data, widtype);
+       Widget_Data *wd = elm_widget_data_get(data);
+       Evas_Object *focus_obj;
+       
+       if (!wd || !wd->base) return ;  
+
+       focus_obj = elm_widget_focused_object_get(data);
+       if (focus_obj) elm_object_unfocus(focus_obj);
+       edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
+}
+
+static void
+_signal_ampm_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+       ELM_CHECK_WIDTYPE(data, widtype);
+       Widget_Data *wd = elm_widget_data_get(data);
+       Evas_Object *focus_obj;
+       
+       if (!wd || !wd->base) return ;  
+
+       wd->pm = !wd->pm;
+
+       if (wd->pm)
+       {
+               edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
+               wd->hour += HOUR_12H_MAXIMUM;
+       }
+       else
+       {
+               edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
+               wd->hour -= HOUR_12H_MAXIMUM;
+       }
+
+       printf("[%s][%d] ampm_clicked!!year : %d, mon : %d, day : %d, hour : %d, min : %d\n", __FUNCTION__, __LINE__,
+               wd->year, wd->month, wd->day, wd->hour, wd->min);       
+}
+
+static void
+_entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       ELM_CHECK_WIDTYPE(data, widtype);
+       Widget_Data *wd = elm_widget_data_get(data);
+       
+       if (!wd || !wd->base) return ;
+
+       if (elm_widget_focus_get(data))
+               edje_object_signal_emit(wd->base, "elm,state,focus,in", "elm");
+
+       if (obj == wd->date[DATE_YEAR])
+               edje_object_signal_emit(wd->base, "elm,state,year,focus,in", "elm");
+       else if (obj == wd->date[DATE_MON])
+               edje_object_signal_emit(wd->base, "elm,state,month,focus,in", "elm");
+       else if (obj == wd->date[DATE_DAY])
+               edje_object_signal_emit(wd->base, "elm,state,day,focus,in", "elm");
+       else if (obj == wd->time[TIME_HOUR])
+               edje_object_signal_emit(wd->base, "elm,state,hour,focus,in", "elm");
+       else if (obj == wd->time[TIME_MIN])
+               edje_object_signal_emit(wd->base, "elm,state,min,focus,in", "elm");
+}
+
+static void
+_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       ELM_CHECK_WIDTYPE(data, widtype);
+       Widget_Data *wd = elm_widget_data_get(data);
+       char str[YEAR_MAX_LENGTH+1] = {0,};
+       int num = 0;
+       
+       if (!wd || !wd->base) return ;
+
+       wd->editing = FALSE;
+
+       if (obj == wd->date[DATE_YEAR])
+       {
+               num = atoi(elm_entry_entry_get(wd->date[DATE_YEAR]));
+               if (num > YEAR_MAXIMUM) sprintf(str, "%d", YEAR_MAXIMUM);
+               else if (num < YEAR_MINIMUM) sprintf(str, "%d", YEAR_MINIMUM);
+               else sprintf(str, "%d", num);
+
+               elm_entry_entry_set(wd->date[DATE_YEAR], str);
+               wd->year = atoi(elm_entry_entry_get(wd->date[DATE_YEAR]));
+               edje_object_signal_emit(wd->base, "elm,state,year,focus,out", "elm");
+       }
+       else if (obj == wd->date[DATE_MON])
+       {
+               edje_object_signal_emit(wd->base, "elm,state,month,focus,out", "elm");
+       }       
+       else if (obj == wd->date[DATE_DAY])
+       {
+               char *entry_str = elm_entry_entry_get(wd->date[DATE_DAY]);
+               int day_of_month = _maximum_day_get(wd->year, wd->month);
+               
+               num = atoi(entry_str);
+               if (num > day_of_month) sprintf(str, "%d", day_of_month);
+               else if (entry_str[0] == '0') 
+               {
+                       str[0] = (entry_str[1] == '0' || entry_str[1] == '\0')? '1' : entry_str[1];
+                       str[1] = '\0';
+               }
+               else sprintf(str, "%d", num);
+
+               elm_entry_entry_set(wd->date[DATE_DAY], str);
+               wd->day = atoi(elm_entry_entry_get(wd->date[DATE_DAY]));
+               edje_object_signal_emit(wd->base, "elm,state,day,focus,out", "elm");
+       }
+       else if (obj == wd->time[TIME_HOUR])
+       {
+               char *entry_str = elm_entry_entry_get(wd->time[TIME_HOUR]);
+               
+               num = atoi(entry_str);
+               if (!wd->time_mode)  //24h mode
+               {
+                       if (num > HOUR_24H_MAXIMUM) sprintf(str, "%d", HOUR_24H_MAXIMUM);
+                       else if (entry_str[0] == '0') 
+                       {
+                               str[0] = (entry_str[1] == '\0')? '0' : entry_str[1];
+                               str[1] = '\0';
+                       }
+                       else sprintf(str, "%d", num);
+
+                       elm_entry_entry_set(wd->time[TIME_HOUR], str);
+                       wd->hour = atoi(elm_entry_entry_get(wd->time[TIME_HOUR]));
+                       edje_object_signal_emit(wd->base, "elm,state,hour,focus,out", "elm");
+               }
+               else  //12h mode
+               {
+                       if (num > HOUR_12H_MAXIMUM) sprintf(str, "%d", HOUR_12H_MAXIMUM);
+                       else if (entry_str[0] == '0') 
+                       {
+                               str[0] = (entry_str[1] == '\0')? '0' : entry_str[1];
+                               str[1] = '\0';
+                       }
+                       else sprintf(str, "%d", num);
+
+                       elm_entry_entry_set(wd->time[TIME_HOUR], str);
+                       wd->hour = (wd->pm == EINA_TRUE)? atoi(elm_entry_entry_get(wd->time[TIME_HOUR])) + HOUR_12H_MAXIMUM : atoi(elm_entry_entry_get(wd->time[TIME_HOUR]));
+                       if((wd->hour % 12) == 0) wd->hour -= HOUR_12H_MAXIMUM;
+                       edje_object_signal_emit(wd->base, "elm,state,hour,focus,out", "elm");
+               }       
+       }
+       else if (obj == wd->time[TIME_MIN])
+       {
+               num = atoi(elm_entry_entry_get(wd->time[TIME_MIN]));
+               if (num > MIN_MAXIMUM) sprintf(str, "%d", MIN_MAXIMUM);
+               else sprintf(str, "%d", num);
+
+               elm_entry_entry_set(wd->time[TIME_MIN], str);
+               wd->min = atoi(elm_entry_entry_get(wd->time[TIME_MIN]));
+               edje_object_signal_emit(wd->base, "elm,state,min,focus,out", "elm");
+               edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
+       }
+       
+       printf("[%s][%d] ampm_clicked!!year : %d, mon : %d, day : %d, hour : %d, min : %d\n", __FUNCTION__, __LINE__,
+               wd->year, wd->month, wd->day, wd->hour, wd->min);               
+}
+
+static void 
+_entry_focus_move(Evas_Object *obj, Evas_Object *focus_obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+
+       if (!wd || !wd->base) return ;
+
+       if (focus_obj == wd->date[DATE_YEAR])
+               elm_object_focus(wd->time[TIME_HOUR]);
+       else if (focus_obj == wd->date[DATE_MON])
+               elm_object_focus(wd->date[DATE_DAY]);
+       else if (focus_obj == wd->date[DATE_DAY])
+               elm_object_focus(wd->date[DATE_YEAR]);
+       else if (focus_obj == wd->time[TIME_HOUR])
+               elm_object_focus(wd->time[TIME_MIN]);
+       else if (focus_obj == wd->time[TIME_MIN])
+               elm_object_unfocus(wd->time[TIME_MIN]);
+}
+
+static char* 
+_date_string_get(Evas_Object *obj, Evas_Object *focus_obj, const char *event_str)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       char *str = NULL;
+
+       if (!wd || !wd->base) return NULL;
+
+       if (!wd->editing) 
+       {
+               elm_entry_entry_set(focus_obj, "");
+               wd->editing = EINA_TRUE;
+       }
+
+       if (focus_obj == wd->date[DATE_YEAR])
+       {
+               str = ELM_NEW(YEAR_MAX_LENGTH+1);
+               strcpy(str, elm_entry_entry_get(focus_obj));
+               if (strlen(str) <= YEAR_MAX_LENGTH) str[strlen(str)] = event_str[0];
+               
+               if (strlen(str) == YEAR_MAX_LENGTH) 
+                       wd->editing = EINA_FALSE;
+       }
+       else if (focus_obj == wd->date[DATE_MON])
+       {
+               str = ELM_NEW(MONTH_MAX_LENGTH+1);
+               strcpy(str, month_label[atoi(event_str)]);
+               
+               wd->month = atoi(event_str);
+               wd->editing = EINA_FALSE;
+       }
+       else if (focus_obj == wd->date[DATE_DAY])
+       {
+               str = ELM_NEW(DAY_MAX_LENGTH+1);
+               strcpy(str, elm_entry_entry_get(focus_obj));
+               if (strlen(str) <= DAY_MAX_LENGTH) str[strlen(str)] = event_str[0];
+
+               if (strlen(str) == DAY_MAX_LENGTH)
+                       wd->editing = EINA_FALSE;
+       }
+       else if (focus_obj == wd->time[TIME_HOUR])
+       {
+               str = ELM_NEW(TIME_MAX_LENGTH+1);
+               strcpy(str, elm_entry_entry_get(focus_obj));
+               if (strlen(str) <= TIME_MAX_LENGTH) str[strlen(str)] = event_str[0];
+
+               if (!wd->time_mode)  //24h mode
+               {
+                       if (strlen(str) == TIME_MAX_LENGTH || atoi(str) > 2)
+                               wd->editing = EINA_FALSE;;
+               }
+               else  //12h mode
+               {
+                       if (strlen(str) == TIME_MAX_LENGTH || atoi(str) > 1)
+                               wd->editing = EINA_FALSE;
+               }
+       }
+       else if (focus_obj == wd->time[TIME_MIN])
+       {
+               str = ELM_NEW(TIME_MAX_LENGTH+1);
+               strcpy(str, elm_entry_entry_get(focus_obj));
+               if (strlen(str) <= TIME_MAX_LENGTH) str[strlen(str)] = event_str[0];
+               
+               if (strlen(str) == TIME_MAX_LENGTH) 
+                       wd->editing = EINA_FALSE;
+       }
+       
+       return str;
+}
+
+static int 
+_imf_event_commit_cb(void *data, int type, void *event)
+{
+       ELM_CHECK_WIDTYPE(data, widtype);
+       Widget_Data *wd = elm_widget_data_get(data);
+       Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
+       Evas_Object *focus_obj;
+       char *str = NULL;
+               
+       if (!wd || !wd->base) return ECORE_CALLBACK_CANCEL;
+
+       focus_obj = elm_widget_focused_object_get(data);
+
+       str = _date_string_get(data, focus_obj, ev->str);
+       elm_entry_entry_set(focus_obj, str);
+       free(str);
+
+       if (!wd->editing)
+               _entry_focus_move(data, focus_obj);
+
+       return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_date_update(Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       char str[YEAR_MAX_LENGTH+1] = {0,};
+
+       sprintf(str, "%d", wd->year);
+       elm_entry_entry_set(wd->date[DATE_YEAR], str);
+
+       memset(str, 0, YEAR_MAX_LENGTH+1);
+       sprintf(str, "%s", month_label[wd->month]);
+       elm_entry_entry_set(wd->date[DATE_MON], str);
+
+       memset(str, 0, YEAR_MAX_LENGTH+1);
+       sprintf(str, "%d", wd->day);
+       elm_entry_entry_set(wd->date[DATE_DAY], str);
+
+       if (wd->hour >= HOUR_12H_MAXIMUM)
+       {
+               wd->pm = EINA_TRUE;
+               edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
+       }
+       else
+       {
+               wd->pm = EINA_FALSE;
+               edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");             
+       }
+
+       memset(str, 0, YEAR_MAX_LENGTH+1);
+       if (wd->time_mode && (wd->hour > HOUR_12H_MAXIMUM))
+               sprintf(str, "%d", wd->hour - HOUR_12H_MAXIMUM);
+       else if (wd->time_mode && (wd->hour == 0))
+               sprintf(str, "%d", HOUR_12H_MAXIMUM);
+       else
+               sprintf(str, "%d", wd->hour);
+       elm_entry_entry_set(wd->time[TIME_HOUR], str);
+
+       memset(str, 0, YEAR_MAX_LENGTH+1);
+       sprintf(str, "%d", wd->min);
+       if (wd->min == 0) str[1] = '0';
+       elm_entry_entry_set(wd->time[TIME_MIN], str);
+
+       printf("[%s][%d] year : %d, mon : %d, day : %d, hour : %d, min : %d\n", __FUNCTION__, __LINE__,
+               wd->year, wd->month, wd->day, wd->hour, wd->min);               
+}
+
+static void 
+_date_entry_add(Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       int i;
+       
+       if (!wd || !wd->base) return ;  
+
+       for (i = 0; i < DATE_MAX; i++)
+       {
+               wd->date[i] = elm_entry_add(obj);
+               elm_object_style_set(wd->date[i], "datefield");
+               elm_entry_context_menu_disabled_set(wd->date[i], EINA_TRUE);
+               elm_entry_input_panel_layout_set(wd->date[i], ELM_INPUT_PANEL_LAYOUT_NUMBER);
+               evas_object_size_hint_weight_set(wd->date[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+               evas_object_size_hint_align_set(wd->date[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
+               evas_object_smart_callback_add(wd->date[i], "focused", _entry_focused_cb, obj);
+               evas_object_smart_callback_add(wd->date[i], "unfocused", _entry_unfocused_cb, obj);
+               elm_widget_sub_object_add(obj, wd->date[i]);
+       }
+
+       elm_entry_maximum_bytes_set(wd->date[DATE_YEAR], YEAR_MAX_LENGTH);
+       elm_entry_maximum_bytes_set(wd->date[DATE_MON], MONTH_MAX_LENGTH);
+       elm_entry_maximum_bytes_set(wd->date[DATE_DAY], DAY_MAX_LENGTH);
+       
+       edje_object_part_swallow(wd->base, "elm.swallow.date.year", wd->date[DATE_YEAR]);
+       edje_object_part_swallow(wd->base, "elm.swallow.date.month", wd->date[DATE_MON]);
+       edje_object_part_swallow(wd->base, "elm.swallow.date.day", wd->date[DATE_DAY]);
+       edje_object_part_text_set(wd->base, "elm.text.date.comma", ",");        
+}
+
+static void 
+_time_entry_add(Evas_Object *obj)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       int i;
+       
+       if (!wd || !wd->base) return ;  
+
+       for (i = 0; i < TIME_MAX; i++)
+       {
+               wd->time[i] = elm_entry_add(obj);
+               elm_object_style_set(wd->time[i], "datefield"); 
+               elm_entry_context_menu_disabled_set(wd->time[i], EINA_TRUE);
+               elm_entry_input_panel_layout_set(wd->time[i], ELM_INPUT_PANEL_LAYOUT_NUMBER);           
+               elm_entry_maximum_bytes_set(wd->time[i], TIME_MAX_LENGTH);
+               evas_object_size_hint_weight_set(wd->time[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+               evas_object_size_hint_align_set(wd->time[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
+               evas_object_smart_callback_add(wd->time[i], "focused", _entry_focused_cb, obj);
+               evas_object_smart_callback_add(wd->time[i], "unfocused", _entry_unfocused_cb, obj);
+               elm_widget_sub_object_add(obj, wd->time[i]);
+       }
+
+       edje_object_part_swallow(wd->base, "elm.swallow.time.hour", wd->time[TIME_HOUR]);
+       edje_object_part_swallow(wd->base, "elm.swallow.time.min", wd->time[TIME_MIN]);
+       edje_object_part_text_set(wd->base, "elm.text.colon", ":");
+       edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
+       edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "elm.image.ampm", _signal_ampm_clicked, obj);
+       edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.image.ampm", _signal_ampm_mouse_down, obj);
+}
+
+/**
+ * Add a new datefield object
+ *
+ * @param parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup Datefield
+ */
+EAPI Evas_Object *
+elm_datefield_add(Evas_Object *parent)
+{
+       Evas_Object *obj;
+       Evas *e;
+       Widget_Data *wd;
+
+       e = evas_object_evas_get(parent);
+       if (!e) return NULL; 
+       wd = ELM_NEW(Widget_Data);
+       obj = elm_widget_add(e); 
+       ELM_SET_WIDTYPE(widtype, "datefield");
+       elm_widget_type_set(obj, "datefield");
+       elm_widget_sub_object_add(parent, obj);
+       elm_widget_data_set(obj, wd);
+       elm_widget_del_hook_set(obj, _del_hook);
+       elm_widget_theme_hook_set(obj, _theme_hook);
+       elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
+       elm_widget_can_focus_set(obj, EINA_TRUE);
+
+       wd->base = edje_object_add(e);
+       _elm_theme_object_set(obj, wd->base, "datefield", "base", "default");
+       elm_widget_resize_object_set(obj, wd->base);
+
+       wd->handler =  ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _imf_event_commit_cb, obj);
+       _date_entry_add(obj);
+       _time_entry_add(obj);   
+               
+       wd->editing = EINA_FALSE;
+       wd->time_mode = EINA_TRUE;
+       elm_datefield_date_set(obj, 1900, 1, 1, 0, 0);
+
+       _sizing_eval(obj);
+
+       return obj;
+}
+
+EAPI void
+elm_datefield_layout_set(Evas_Object *obj, Elm_Datefield_Layout layout)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       
+       if (!wd || !wd->base) return ;  
+
+       wd->layout = layout;    
+}
+
+/**
+ * Set selected date of the datefield
+ *
+ * @param obj The datefield object
+ * @param year The year to set
+ * @param month The month to set
+ * @param day The day to set
+ * @param hour The hours to set (24hour mode)
+ * @param min The minutes to set
+ *
+ * @ingroup Datefield
+ */
+EAPI void
+elm_datefield_date_set(Evas_Object *obj, int year, int month, int day, int hour, int min)
+{
+       ELM_CHECK_WIDTYPE(obj, widtype);
+       Widget_Data *wd = elm_widget_data_get(obj);
+       
+       if (!wd || !wd->base) return ;  
+
+       wd->year = year;
+       wd->month = month;
+       wd->day = day;
+       wd->hour = hour;
+       wd->min = min;
+
+       _date_update(obj);
+}
+
+/**
+ * Get selected date of the datefield
+ *
+ * @param obj The datepicker object
+ * @param year The pointer to the variable get the selected year
+ * @param month The pointer to the variable get the selected month
+ * @param day The pointer to the variable get the selected day
+ * @param hour The pointer to the variable get the selected hour (24hour mode)
+ * @param hour The pointer to the variable get the selected min
+ *
+ * @ingroup Datefield
+ */
+EAPI void
+elm_datefield_date_get(Evas_Object *obj, int *year, int *month, int *day, int *hour, int *min)
+{
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd) return;
+       
+       if (year)
+               *year = wd->year;
+       if (month)
+               *month = wd->month;
+       if (day)
+               *day = wd->day;
+       if (hour)
+               *hour = wd->hour;
+       if (min)
+               *min = wd->min;
+}
+
+/**
+ * Set if the datefield show hours in military or am/pm mode
+ *
+ * @param obj The datefield object
+ * @param mode option for the hours mode. If true, it is shown as 12h mode, if false, it is shown as 24h mode. Default value is true 
+ *
+ * @ingroup Datefield
+ */
+EAPI void
+elm_datefield_time_mode_set(Evas_Object *obj, Eina_Bool mode)
+{
+       Widget_Data *wd = elm_widget_data_get(obj);
+       if (!wd) return;
+
+       if (wd->time_mode != mode) {
+               wd->time_mode = mode;
+               //_update_ampm(obj);
+       }
+}
+