1 #include <Elementary.h>
5 * @defgroup Datefield Datefield
8 * This is a date editfield. it is used to input date and time using keypad
11 typedef struct _Widget_Data Widget_Data;
36 #define YEAR_MAX_LENGTH 4
37 #define MONTH_MAX_LENGTH 3
38 #define DAY_MAX_LENGTH 2
39 #define TIME_MAX_LENGTH 2
41 #define YEAR_MAXIMUM 2099
42 #define YEAR_MINIMUM 1900
43 #define MONTH_MAXIMUM 12
44 #define HOUR_24H_MAXIMUM 23
45 #define HOUR_12H_MAXIMUM 12
46 #define MIN_MAXIMUM 59
48 static char month_label[13][4] = {"", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
53 Evas_Object *date[DATE_MAX];
54 Evas_Object *time[TIME_MAX];
55 Ecore_Event_Handler *handler;
58 int year, month, day, hour, min;
61 Eina_Bool time_mode:1;
64 void (*func)(void *data, Evas_Object *obj, int value);
68 static const char *widtype = NULL;
70 static void _del_hook(Evas_Object *obj);
71 static void _theme_hook(Evas_Object *obj);
72 static void _sizing_eval(Evas_Object *obj);
73 static void _on_focus_hook(void *data, Evas_Object *obj);
75 static void _signal_rect_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source);
76 static void _signal_ampm_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source);
77 static void _signal_ampm_clicked(void *data, Evas_Object *obj, const char *emission, const char *source);
78 static void _entry_focused_cb(void *data, Evas_Object *obj, void *event_info);
79 static void _entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info);
80 static void _entry_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info);
81 static int _imf_event_commit_cb(void *data, int type, void *event);
82 static void _input_panel_event_callback(void *data, Ecore_IMF_Context *ctx, int value);
84 static void _date_entry_add(Evas_Object *obj);
85 static void _time_entry_add(Evas_Object *obj);
86 static void _date_update(Evas_Object *obj);
87 static void _entry_focus_move(Evas_Object *obj, Evas_Object *focus_obj);
88 static Eina_Bool _check_input_done(Evas_Object *obj, Evas_Object *focus_obj, int strlen);
89 static int _maximum_day_get(int year, int month);
92 _del_hook(Evas_Object *obj)
94 Widget_Data *wd = elm_widget_data_get(obj);
97 ecore_event_handler_del(wd->handler);
103 _on_focus_hook(void *data, Evas_Object *obj)
105 Widget_Data *wd = elm_widget_data_get(obj);
106 if (!wd || !wd->base) return ;
108 if (!elm_widget_focus_get(obj))
109 edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
113 _theme_hook(Evas_Object *obj)
115 Widget_Data *wd = elm_widget_data_get(obj);
117 if (!wd || !wd->base) return;
119 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME)
121 _elm_theme_object_set(obj, wd->base, "datefield", "dateandtime", elm_widget_style_get(obj));
123 for (i = 0; i < DATE_MAX; i++)
124 elm_object_style_set(wd->date[i], "datefield/hybrid");
125 for (i = 0; i < TIME_MAX; i++)
126 elm_object_style_set(wd->time[i], "datefield/hybrid");
128 else if (wd->layout == ELM_DATEFIELD_LAYOUT_DATE)
130 _elm_theme_object_set(obj, wd->base, "datefield", "date", elm_widget_style_get(obj));
132 for (i = 0; i < DATE_MAX; i++)
133 elm_object_style_set(wd->date[i], "datefield");
135 for (i = 0; i < TIME_MAX; i++)
136 evas_object_hide(wd->time[i]);
138 else if (wd->layout == ELM_DATEFIELD_LAYOUT_TIME)
140 _elm_theme_object_set(obj, wd->base, "datefield", "time", elm_widget_style_get(obj));
142 for (i = 0; i < TIME_MAX; i++)
143 elm_object_style_set(wd->time[i], "datefield");
145 for (i = 0; i < DATE_MAX; i++)
146 evas_object_hide(wd->date[i]);
149 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME || wd->layout == ELM_DATEFIELD_LAYOUT_DATE)
151 edje_object_part_swallow(wd->base, "elm.swallow.date.year", wd->date[DATE_YEAR]);
152 edje_object_part_swallow(wd->base, "elm.swallow.date.month", wd->date[DATE_MON]);
153 edje_object_part_swallow(wd->base, "elm.swallow.date.day", wd->date[DATE_DAY]);
154 edje_object_part_text_set(wd->base, "elm.text.date.comma", ",");
157 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME || wd->layout == ELM_DATEFIELD_LAYOUT_TIME)
159 edje_object_part_swallow(wd->base, "elm.swallow.time.hour", wd->time[TIME_HOUR]);
160 edje_object_part_swallow(wd->base, "elm.swallow.time.min", wd->time[TIME_MIN]);
161 edje_object_part_text_set(wd->base, "elm.text.colon", ":");
164 edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);
171 _sizing_eval(Evas_Object *obj)
173 Widget_Data *wd = elm_widget_data_get(obj);
174 Evas_Coord minw = -1, minh = -1;
176 edje_object_size_min_calc(wd->base, &minw, &minh);
177 evas_object_size_hint_min_set(obj, minw, minh);
178 evas_object_size_hint_max_set(obj, -1, -1);
182 _signal_ampm_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
184 Widget_Data *wd = elm_widget_data_get(data);
185 Evas_Object *focus_obj;
187 if (!wd || !wd->base) return ;
189 focus_obj = elm_widget_focused_object_get(data);
190 if (focus_obj) elm_object_unfocus(focus_obj);
191 edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
195 _signal_ampm_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
197 Widget_Data *wd = elm_widget_data_get(data);
198 if (!wd || !wd->base) return ;
204 edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
205 wd->hour += HOUR_12H_MAXIMUM;
209 edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
210 wd->hour -= HOUR_12H_MAXIMUM;
215 _signal_rect_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
217 Widget_Data *wd = elm_widget_data_get(data);
220 if (!strcmp(source, "elm.rect.date.year.over"))
221 elm_object_focus(wd->date[DATE_YEAR]);
222 else if (!strcmp(source, "elm.rect.date.month.over"))
223 elm_object_focus(wd->date[DATE_MON]);
224 else if (!strcmp(source, "elm.rect.date.day.over"))
225 elm_object_focus(wd->date[DATE_DAY]);
226 else if (!strcmp(source, "elm.rect.time.hour.over"))
227 elm_object_focus(wd->time[TIME_HOUR]);
228 else if (!strcmp(source, "elm.rect.time.min.over"))
229 elm_object_focus(wd->time[TIME_MIN]);
230 else if (!strcmp(source, "elm.rect.date.left.pad"))
232 switch (wd->date_format)
234 case DATE_FORMAT_YYDDMM:
235 case DATE_FORMAT_YYMMDD:
236 elm_object_focus(wd->date[DATE_YEAR]);
238 case DATE_FORMAT_MMDDYY:
239 case DATE_FORMAT_MMYYDD:
240 elm_object_focus(wd->date[DATE_MON]);
242 case DATE_FORMAT_DDMMYY:
243 case DATE_FORMAT_DDYYMM:
244 elm_object_focus(wd->date[DATE_DAY]);
247 else if (!strcmp(source, "elm.rect.date.right.pad"))
249 switch (wd->date_format)
251 case DATE_FORMAT_MMDDYY:
252 case DATE_FORMAT_DDMMYY:
253 elm_object_focus(wd->date[DATE_YEAR]);
255 case DATE_FORMAT_DDYYMM:
256 case DATE_FORMAT_YYDDMM:
257 elm_object_focus(wd->date[DATE_MON]);
259 case DATE_FORMAT_YYMMDD:
260 case DATE_FORMAT_MMYYDD:
261 elm_object_focus(wd->date[DATE_DAY]);
267 _entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
269 Widget_Data *wd = elm_widget_data_get(data);
270 if (!wd || !wd->base) return;
272 if (elm_widget_focus_get(data))
273 edje_object_signal_emit(wd->base, "elm,state,focus,in", "elm");
275 if (obj == wd->date[DATE_YEAR])
276 edje_object_signal_emit(wd->base, "elm,state,year,focus,in", "elm");
277 else if (obj == wd->date[DATE_MON])
278 edje_object_signal_emit(wd->base, "elm,state,month,focus,in", "elm");
279 else if (obj == wd->date[DATE_DAY])
280 edje_object_signal_emit(wd->base, "elm,state,day,focus,in", "elm");
281 else if (obj == wd->time[TIME_HOUR])
282 edje_object_signal_emit(wd->base, "elm,state,hour,focus,in", "elm");
283 else if (obj == wd->time[TIME_MIN])
284 edje_object_signal_emit(wd->base, "elm,state,min,focus,in", "elm");
288 _entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
290 Widget_Data *wd = elm_widget_data_get(data);
291 char str[YEAR_MAX_LENGTH+1] = {0,};
294 if (!wd || !wd->base) return;
298 if (obj == wd->date[DATE_YEAR])
300 if (!strlen(elm_entry_entry_get(wd->date[DATE_YEAR]))) num = wd->year;
301 else num = atoi(elm_entry_entry_get(wd->date[DATE_YEAR]));
303 if (num > YEAR_MAXIMUM) num = YEAR_MAXIMUM;
304 else if (num < YEAR_MINIMUM) num = YEAR_MINIMUM;
307 sprintf(str, "%d", num);
308 elm_entry_entry_set(wd->date[DATE_YEAR], str);
309 edje_object_signal_emit(wd->base, "elm,state,year,focus,out", "elm");
311 else if (obj == wd->date[DATE_MON])
313 int day_of_month = _maximum_day_get(wd->year, wd->month);
315 if (wd->day > day_of_month)
317 wd->day = day_of_month;
318 sprintf(str, "%d", wd->day);
319 elm_entry_entry_set(wd->date[DATE_DAY], str);
321 edje_object_signal_emit(wd->base, "elm,state,month,focus,out", "elm");
323 else if (obj == wd->date[DATE_DAY])
325 int day_of_month = _maximum_day_get(wd->year, wd->month);
327 if (!strlen(elm_entry_entry_get(wd->date[DATE_DAY]))) num = wd->day;
328 else num = atoi(elm_entry_entry_get(wd->date[DATE_DAY]));
330 if (num > day_of_month) num = day_of_month;
331 else if (num == 0) num = 1;
334 sprintf(str, "%d", num);
335 elm_entry_entry_set(wd->date[DATE_DAY], str);
336 edje_object_signal_emit(wd->base, "elm,state,day,focus,out", "elm");
338 else if (obj == wd->time[TIME_HOUR])
340 if (!strlen(elm_entry_entry_get(wd->time[TIME_HOUR]))) num = (wd->hour == 0)? 24 : wd->hour;
341 else num = atoi(elm_entry_entry_get(wd->time[TIME_HOUR]));
343 if (!wd->time_mode) // 24 mode
345 if (num > HOUR_24H_MAXIMUM) num = HOUR_24H_MAXIMUM;
350 if (num > HOUR_24H_MAXIMUM)
352 num = HOUR_12H_MAXIMUM;
355 else if (num > HOUR_12H_MAXIMUM)
357 num -= HOUR_12H_MAXIMUM;
360 else if (num == 0) num = 1;
362 wd->hour = (wd->pm == EINA_TRUE)? num + HOUR_12H_MAXIMUM : num;
363 if((wd->hour % 12) == 0) wd->hour -= HOUR_12H_MAXIMUM;
365 if (wd->pm) edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
366 else edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
368 sprintf(str, "%d", num);
369 elm_entry_entry_set(wd->time[TIME_HOUR], str);
370 edje_object_signal_emit(wd->base, "elm,state,hour,focus,out", "elm");
372 else if (obj == wd->time[TIME_MIN])
374 if (!strlen(elm_entry_entry_get(wd->time[TIME_MIN]))) num = wd->min;
375 else num = atoi(elm_entry_entry_get(wd->time[TIME_MIN]));
377 if (num > MIN_MAXIMUM) num = MIN_MAXIMUM;
380 sprintf(str, "%d", num);
381 elm_entry_entry_set(wd->time[TIME_MIN], str);
382 edje_object_signal_emit(wd->base, "elm,state,min,focus,out", "elm");
384 edje_object_signal_emit(wd->base, "elm,state,focus,out", "elm");
388 _entry_focus_move(Evas_Object *obj, Evas_Object *focus_obj)
390 Widget_Data *wd = elm_widget_data_get(obj);
394 if (focus_obj == wd->date[DATE_YEAR])
396 switch (wd->date_format)
398 case DATE_FORMAT_DDMMYY:
399 case DATE_FORMAT_MMDDYY:
400 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME)
401 elm_object_focus(wd->time[TIME_HOUR]);
402 else if (wd->layout == ELM_DATEFIELD_LAYOUT_DATE)
403 elm_object_unfocus(wd->date[DATE_YEAR]);
405 case DATE_FORMAT_DDYYMM:
406 case DATE_FORMAT_YYMMDD:
407 elm_object_focus(wd->date[DATE_MON]);
409 case DATE_FORMAT_MMYYDD:
410 case DATE_FORMAT_YYDDMM:
411 elm_object_focus(wd->date[DATE_DAY]);
414 else if (focus_obj == wd->date[DATE_MON])
416 switch (wd->date_format)
418 case DATE_FORMAT_DDYYMM:
419 case DATE_FORMAT_YYDDMM:
420 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME)
421 elm_object_focus(wd->time[TIME_HOUR]);
422 else if (wd->layout == ELM_DATEFIELD_LAYOUT_DATE)
423 elm_object_unfocus(wd->date[DATE_MON]);
425 case DATE_FORMAT_DDMMYY:
426 case DATE_FORMAT_MMYYDD:
427 elm_object_focus(wd->date[DATE_YEAR]);
429 case DATE_FORMAT_MMDDYY:
430 case DATE_FORMAT_YYMMDD:
431 elm_object_focus(wd->date[DATE_DAY]);
434 else if (focus_obj == wd->date[DATE_DAY])
436 switch (wd->date_format)
438 case DATE_FORMAT_YYMMDD:
439 case DATE_FORMAT_MMYYDD:
440 if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME)
441 elm_object_focus(wd->time[TIME_HOUR]);
442 else if (wd->layout == ELM_DATEFIELD_LAYOUT_DATE)
443 elm_object_unfocus(wd->date[DATE_DAY]);
445 case DATE_FORMAT_DDYYMM:
446 case DATE_FORMAT_MMDDYY:
447 elm_object_focus(wd->date[DATE_YEAR]);
449 case DATE_FORMAT_DDMMYY:
450 case DATE_FORMAT_YYDDMM:
451 elm_object_focus(wd->date[DATE_MON]);
454 else if (focus_obj == wd->time[TIME_HOUR])
455 elm_object_focus(wd->time[TIME_MIN]);
456 else if (focus_obj == wd->time[TIME_MIN])
457 elm_object_unfocus(wd->time[TIME_MIN]);
461 _maximum_day_get(int year, int month)
463 int day_of_month = 0;
464 if (year == 0 || month == 0) return 0;
474 if ((!(year % 4) && (year % 100)) || !(year % 400))
488 _check_input_done(Evas_Object *obj, Evas_Object *focus_obj, int strlen)
490 Widget_Data *wd = elm_widget_data_get(obj);
492 if (!wd) return EINA_FALSE;
494 if (focus_obj == wd->date[DATE_YEAR] && strlen == YEAR_MAX_LENGTH)
495 wd->editing = EINA_FALSE;
496 else if (focus_obj == wd->date[DATE_MON] && strlen == MONTH_MAX_LENGTH)
497 wd->editing = EINA_FALSE;
498 else if (focus_obj == wd->date[DATE_DAY] && strlen == DAY_MAX_LENGTH)
499 wd->editing = EINA_FALSE;
500 else if (focus_obj == wd->time[TIME_HOUR])
502 if (strlen == TIME_MAX_LENGTH || atoi(elm_entry_entry_get(focus_obj)) > 2)
503 wd->editing = EINA_FALSE;
505 else if (focus_obj == wd->time[TIME_MIN] && strlen == TIME_MAX_LENGTH)
506 wd->editing = EINA_FALSE;
512 _entry_key_up_cb(void *data, Evas *e , Evas_Object *obj , void *event_info)
514 Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *) event_info;
516 if (!strcmp(ev->keyname, "BackSpace"))
517 elm_entry_entry_set(obj, "");
521 _imf_event_commit_cb(void *data, int type, void *event)
523 Widget_Data *wd = elm_widget_data_get(data);
524 Ecore_IMF_Event_Commit *ev = (Ecore_IMF_Event_Commit *) event;
525 Evas_Object *focus_obj;
526 char str[YEAR_MAX_LENGTH+1] = {0,};
528 if (!wd) return ECORE_CALLBACK_RENEW;
529 if(!elm_widget_focus_get(data)) return ECORE_CALLBACK_RENEW;
531 focus_obj = elm_widget_focused_object_get(data);
534 elm_entry_entry_set(focus_obj, "");
535 wd->editing = EINA_TRUE;
538 if (focus_obj == wd->date[DATE_MON])
540 wd->month = atoi(ev->str);
541 strcpy(str, month_label[wd->month]);
545 strcpy(str, elm_entry_entry_get(focus_obj));
546 str[strlen(str)] = ev->str[0];
548 elm_entry_entry_set(focus_obj, str);
550 if (_check_input_done(data, focus_obj, strlen(str)))
551 _entry_focus_move(data, focus_obj);
553 return ECORE_CALLBACK_CANCEL;
557 _input_panel_event_callback(void *data, Ecore_IMF_Context *ctx, int value)
559 Widget_Data *wd = elm_widget_data_get(data);
564 wd->func(wd->func_data, data, value);
568 _date_update(Evas_Object *obj)
570 Widget_Data *wd = elm_widget_data_get(obj);
571 char str[YEAR_MAX_LENGTH+1];
573 if (!wd || !wd->base) return;
575 sprintf(str, "%d", wd->year);
576 elm_entry_entry_set(wd->date[DATE_YEAR], str);
578 sprintf(str, "%s", month_label[wd->month]);
579 elm_entry_entry_set(wd->date[DATE_MON], str);
581 sprintf(str, "%d", wd->day);
582 elm_entry_entry_set(wd->date[DATE_DAY], str);
584 if (!wd->time_mode) //24 mode
585 sprintf(str, "%d", wd->hour);
588 if (wd->hour >= HOUR_12H_MAXIMUM)
591 edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
596 edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
599 if (wd->hour > HOUR_12H_MAXIMUM)
600 sprintf(str, "%d", wd->hour - HOUR_12H_MAXIMUM);
601 else if (wd->hour == 0)
602 sprintf(str, "%d", HOUR_12H_MAXIMUM);
604 sprintf(str, "%d", wd->hour);
606 elm_entry_entry_set(wd->time[TIME_HOUR], str);
608 sprintf(str, "%d", wd->min);
609 if (wd->min == 0) str[1] = '0';
610 elm_entry_entry_set(wd->time[TIME_MIN], str);
614 _date_entry_add(Evas_Object *obj)
616 Widget_Data *wd = elm_widget_data_get(obj);
621 for (i = 0; i < DATE_MAX; i++)
623 wd->date[i] = elm_entry_add(obj);
624 elm_entry_context_menu_disabled_set(wd->date[i], EINA_TRUE);
625 if (i == DATE_MON) elm_entry_input_panel_layout_set(wd->date[i], ELM_INPUT_PANEL_LAYOUT_MONTH);
626 else elm_entry_input_panel_layout_set(wd->date[i], ELM_INPUT_PANEL_LAYOUT_NUMBERONLY);
627 evas_object_size_hint_weight_set(wd->date[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
628 evas_object_size_hint_align_set(wd->date[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
629 evas_object_smart_callback_add(wd->date[i], "focused", _entry_focused_cb, obj);
630 evas_object_smart_callback_add(wd->date[i], "unfocused", _entry_unfocused_cb, obj);
631 evas_object_event_callback_add(wd->date[i], EVAS_CALLBACK_KEY_UP, _entry_key_up_cb, obj);
632 elm_widget_sub_object_add(obj, wd->date[i]);
634 elm_entry_maximum_bytes_set(wd->date[DATE_YEAR], YEAR_MAX_LENGTH);
635 elm_entry_maximum_bytes_set(wd->date[DATE_MON], MONTH_MAX_LENGTH);
636 elm_entry_maximum_bytes_set(wd->date[DATE_DAY], DAY_MAX_LENGTH);
640 _time_entry_add(Evas_Object *obj)
642 Widget_Data *wd = elm_widget_data_get(obj);
647 for (i = 0; i < TIME_MAX; i++)
649 wd->time[i] = elm_entry_add(obj);
650 elm_entry_context_menu_disabled_set(wd->time[i], EINA_TRUE);
651 elm_entry_input_panel_layout_set(wd->time[i], ELM_INPUT_PANEL_LAYOUT_NUMBERONLY);
652 elm_entry_maximum_bytes_set(wd->time[i], TIME_MAX_LENGTH);
653 evas_object_size_hint_weight_set(wd->time[i], EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
654 evas_object_size_hint_align_set(wd->time[i], EVAS_HINT_FILL, EVAS_HINT_FILL);
655 evas_object_smart_callback_add(wd->time[i], "focused", _entry_focused_cb, obj);
656 evas_object_smart_callback_add(wd->time[i], "unfocused", _entry_unfocused_cb, obj);
657 evas_object_event_callback_add(wd->time[i], EVAS_CALLBACK_KEY_UP, _entry_key_up_cb, obj);
658 elm_widget_sub_object_add(obj, wd->time[i]);
663 * Add a new datefield object
665 * @param parent The parent object
666 * @return The new object or NULL if it cannot be created
671 elm_datefield_add(Evas_Object *parent)
677 e = evas_object_evas_get(parent);
679 wd = ELM_NEW(Widget_Data);
680 obj = elm_widget_add(e);
681 ELM_SET_WIDTYPE(widtype, "datefield");
682 elm_widget_type_set(obj, "datefield");
683 elm_widget_sub_object_add(parent, obj);
684 elm_widget_data_set(obj, wd);
685 elm_widget_del_hook_set(obj, _del_hook);
686 elm_widget_theme_hook_set(obj, _theme_hook);
687 elm_widget_on_focus_hook_set( obj, _on_focus_hook, NULL );
688 elm_widget_can_focus_set(obj, EINA_TRUE);
690 wd->base = edje_object_add(e);
691 elm_widget_resize_object_set(obj, wd->base);
692 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.date.left.pad", _signal_rect_mouse_down, obj);
693 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.date.year.over", _signal_rect_mouse_down, obj);
694 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.date.month.over", _signal_rect_mouse_down, obj);
695 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.date.day.over", _signal_rect_mouse_down, obj);
696 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.date.right.pad", _signal_rect_mouse_down, obj);
698 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.time.hour.over", _signal_rect_mouse_down, obj);
699 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.time.min.over", _signal_rect_mouse_down, obj);
700 edje_object_signal_callback_add(wd->base, "mouse,down,1", "elm.rect.time.ampm.over", _signal_ampm_mouse_down, obj);
701 edje_object_signal_callback_add(wd->base, "mouse,clicked,1", "elm.rect.time.ampm.over", _signal_ampm_clicked, obj);
703 wd->handler = ecore_event_handler_add(ECORE_IMF_EVENT_COMMIT, _imf_event_commit_cb, obj);
704 _date_entry_add(obj);
705 _time_entry_add(obj);
707 wd->year = YEAR_MINIMUM;
712 wd->layout = ELM_DATEFIELD_LAYOUT_DATEANDTIME;
713 wd->editing = EINA_FALSE;
714 wd->time_mode = EINA_TRUE;
715 wd->date_format = DATE_FORMAT_MMDDYY;
723 * set layout for the datefield
725 * @param obj The datefield object
726 * @param layout set layout for date/time/dateandtime (default: ELM_DATEFIELD_LAYOUT_DATEANDTIME)
731 elm_datefield_layout_set(Evas_Object *obj, Elm_Datefield_Layout layout)
733 ELM_CHECK_WIDTYPE(obj, widtype);
734 Widget_Data *wd = elm_widget_data_get(obj);
738 if (wd->layout != layout)
746 * Set selected date of the datefield
748 * @param obj The datefield object
749 * @param year The year to set
750 * @param month The month to set
751 * @param day The day to set
752 * @param hour The hours to set (24hour mode - 0~23)
753 * @param min The minutes to set (0~59)
758 elm_datefield_date_set(Evas_Object *obj, int year, int month, int day, int hour, int min)
760 ELM_CHECK_WIDTYPE(obj, widtype);
761 Widget_Data *wd = elm_widget_data_get(obj);
766 if (year > YEAR_MAXIMUM) wd->year = YEAR_MAXIMUM;
767 else if (year < YEAR_MINIMUM) wd->year = YEAR_MINIMUM;
768 else wd->year = year;
770 if (month > MONTH_MAXIMUM) wd->month = MONTH_MAXIMUM;
771 else if (month <= 0) wd->month = 1;
772 else wd->month = month;
774 day_of_month = _maximum_day_get(wd->year, wd->month);
775 if (day > day_of_month) wd->day = day_of_month;
776 else if (day <= 0) wd->day = 1;
779 if (hour > HOUR_24H_MAXIMUM) wd->hour = HOUR_24H_MAXIMUM;
780 else if (hour < 0) wd->hour = 0;
781 else wd->hour = hour;
783 if (min > MIN_MAXIMUM) wd->min = MIN_MAXIMUM;
784 else if (min < 0) wd->min = 0;
791 * Get selected date of the datefield
793 * @param obj The datefield object
794 * @param year The pointer to the variable get the selected year
795 * @param month The pointer to the variable get the selected month
796 * @param day The pointer to the variable get the selected day
797 * @param hour The pointer to the variable get the selected hour (24hour mode)
798 * @param hour The pointer to the variable get the selected min
803 elm_datefield_date_get(Evas_Object *obj, int *year, int *month, int *day, int *hour, int *min)
805 ELM_CHECK_WIDTYPE(obj, widtype);
806 Widget_Data *wd = elm_widget_data_get(obj);
823 * Set if the datefield show hours in military or am/pm mode
825 * @param obj The datefield object
826 * @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
831 elm_datefield_time_mode_set(Evas_Object *obj, Eina_Bool mode)
833 ELM_CHECK_WIDTYPE(obj, widtype);
834 Widget_Data *wd = elm_widget_data_get(obj);
838 if (wd->time_mode != mode)
840 char str[YEAR_MAX_LENGTH+1];
842 wd->time_mode = mode;
843 if (!wd->time_mode) edje_object_signal_emit(wd->base, "elm,state,mode,24h", "elm");
844 else edje_object_signal_emit(wd->base, "elm,state,mode,12h", "elm");
846 if (!wd->time_mode) //24 mode
847 sprintf(str, "%d", wd->hour);
850 if (wd->hour >= HOUR_12H_MAXIMUM)
853 edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
858 edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
861 if (wd->hour > HOUR_12H_MAXIMUM)
862 sprintf(str, "%d", wd->hour - HOUR_12H_MAXIMUM);
863 else if (wd->hour == 0)
864 sprintf(str, "%d", HOUR_12H_MAXIMUM);
866 sprintf(str, "%d", wd->hour);
868 elm_entry_entry_set(wd->time[TIME_HOUR], str);
873 * Set date format of datefield
875 * @param obj The datefield object
876 * @param fmt The date format, ex) yymmdd. Default value is mmddyy.
881 elm_datefield_date_format_set(Evas_Object *obj, const char *fmt)
883 char sig[32] = "elm,state,format,";
885 Widget_Data *wd = elm_widget_data_get(obj);
887 if (!wd || !fmt) return;
891 sig[j++] = tolower(fmt[i++]);
894 edje_object_signal_emit(wd->base, sig, "elm");
896 if (strstr(sig, "yymmdd")) wd->date_format = DATE_FORMAT_YYMMDD;
897 else if (strstr(sig, "yyddmm")) wd->date_format = DATE_FORMAT_YYDDMM;
898 else if (strstr(sig, "mmyydd")) wd->date_format = DATE_FORMAT_MMYYDD;
899 else if (strstr(sig, "mmddyy")) wd->date_format = DATE_FORMAT_MMDDYY;
900 else if (strstr(sig, "ddyymm")) wd->date_format = DATE_FORMAT_DDYYMM;
901 else if (strstr(sig, "ddmmyy")) wd->date_format = DATE_FORMAT_DDMMYY;
905 * Add a callback function for input panel state
907 * @param obj The datefield object
908 * @param func The function to be called when the event is triggered (value will be the Ecore_IMF_Input_Panel_State)
909 * @param data The data pointer to be passed to @p func
914 elm_datefield_input_panel_state_callback_add(Evas_Object *obj, void (*pEventCallbackFunc) (void *data, Evas_Object *obj, int value), void *data)
916 Widget_Data *wd = elm_widget_data_get(obj);
921 if (wd->func && (wd->func != pEventCallbackFunc))
922 elm_datefield_input_panel_state_callback_del(obj, wd->func);
924 if (pEventCallbackFunc)
926 wd->func = pEventCallbackFunc;
927 wd->func_data = data;
929 for (i = 0; i < DATE_MAX; i++)
930 ecore_imf_context_input_panel_event_callback_add(
931 elm_entry_imf_context_get(wd->date[i]), ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, obj);
933 for (i = 0; i < TIME_MAX; i++)
934 ecore_imf_context_input_panel_event_callback_add(
935 elm_entry_imf_context_get(wd->time[i]), ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback, obj);
940 * Delete a callback function for input panel state
942 * @param obj The datefield object
943 * @param func The function to be called when the event is triggered
948 elm_datefield_input_panel_state_callback_del(Evas_Object *obj, void (*pEventCallbackFunc) (void *data, Evas_Object *obj, int value))
950 Widget_Data *wd = elm_widget_data_get(obj);
955 if (wd->func && wd->func == pEventCallbackFunc)
957 for (i = 0; i < DATE_MAX; i++)
958 ecore_imf_context_input_panel_event_callback_del(
959 elm_entry_imf_context_get(wd->date[i]), ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback);
961 for (i = 0; i < TIME_MAX; i++)
962 ecore_imf_context_input_panel_event_callback_del(
963 elm_entry_imf_context_get(wd->time[i]), ECORE_IMF_INPUT_PANEL_STATE_EVENT, _input_panel_event_callback);
966 wd->func_data = NULL;