1 #include <Elementary.h>
4 #define DATETIME_FIELD_COUNT 6
6 #define MONTH_STRING_MAX_SIZE 32
7 #define TOTAL_NUMBER_OF_MONTHS 12
8 #define STRUCT_TM_YEAR_BASE_VALUE 1900
9 #define STRUCT_TM_TIME_12HRS_MAX_VALUE 12
10 #define STRUCT_TM_TIME_24HRS_MAX_VALUE 23
12 /* struct tm does not define the fields in the order year, month,
13 * date, hour, minute. values are reassigned to an array for easy
16 #define DATETIME_MODULE_TM_ARRAY(intptr, tmptr) \
24 static const char *field_styles[] = {
25 "year", "month", "date", "hour", "minute", "ampm" };
27 static char month_arr[TOTAL_NUMBER_OF_MONTHS][MONTH_STRING_MAX_SIZE];
29 static const char SIG_EDIT_START[] = "edit,start";
30 static const char SIG_EDIT_END[] = "edit,end";
32 typedef struct _Popup_Module_Data Popup_Module_Data;
34 struct _Popup_Module_Data
36 Elm_Datetime_Module_Data mod_data;
38 Evas_Object *datepicker_layout, *timepicker_layout;
39 Evas_Object *popup_field[DATETIME_FIELD_COUNT];
40 Evas_Object *datetime_field[DATETIME_FIELD_COUNT];
42 Eina_Bool time_12hr_fmt;
47 _picker_hide_cb(void *data,
48 Evas_Object *obj __UNUSED__,
49 const char *emission __UNUSED__,
50 const char *source __UNUSED__)
52 Popup_Module_Data *popup_mod;
53 popup_mod = (Popup_Module_Data *)data;
54 if (!popup_mod) return;
56 evas_object_smart_callback_call(obj, SIG_EDIT_END, NULL);
57 evas_object_hide(popup_mod->popup);
61 _datetime_press_cb(void *data,
62 Evas_Object *obj __UNUSED__,
63 const char *emission __UNUSED__,
66 Popup_Module_Data *popup_mod;
69 popup_mod = (Popup_Module_Data *)data;
70 if (!popup_mod) return;
72 if (!strcmp(source, "date.picker.bg"))
74 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
75 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,select", "elm");
77 else if (!strcmp(source, "time.picker.bg"))
79 for (idx = ELM_DATETIME_HOUR; idx < DATETIME_FIELD_COUNT; idx++)
80 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,select", "elm");
85 _datetime_unpress_cb(void *data,
86 Evas_Object *obj __UNUSED__,
87 const char *emission __UNUSED__,
90 Popup_Module_Data *popup_mod;
93 popup_mod = (Popup_Module_Data *)data;
94 if (!popup_mod) return;
96 if (!strcmp(source, "date.picker.bg"))
98 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
99 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,unselect", "elm");
101 else if (!strcmp(source, "time.picker.bg"))
103 for (idx = ELM_DATETIME_HOUR; idx < DATETIME_FIELD_COUNT; idx++)
104 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,unselect", "elm");
109 _set_datepicker_value(Popup_Module_Data *popup_mod)
113 if (!popup_mod) return;
115 elm_datetime_value_get(popup_mod->mod_data.base, &set_time);
116 set_time.tm_year = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_YEAR]) - STRUCT_TM_YEAR_BASE_VALUE;
117 set_time.tm_mon = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
118 set_time.tm_mday = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_DATE]);
119 elm_datetime_value_set(popup_mod->mod_data.base, &set_time);
123 _set_timepicker_value(Popup_Module_Data *popup_mod)
128 if (!popup_mod) return;
130 elm_datetime_value_get(popup_mod->mod_data.base, &set_time);
132 hour = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
133 if (popup_mod->time_12hr_fmt)
135 if (popup_mod->is_pm)
136 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
137 hour = (hour == STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : hour;
138 hour = (hour == 24) ? STRUCT_TM_TIME_12HRS_MAX_VALUE : hour;
140 set_time.tm_hour = hour;
141 set_time.tm_min = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MINUTE]);
142 elm_datetime_value_set(popup_mod->mod_data.base, &set_time);
146 _popup_set_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
148 Popup_Module_Data *popup_mod;
149 Evas_Object *content, *widget;
151 Evas_Object *spinner, *entry;
153 popup_mod = (Popup_Module_Data *)data;
154 if (!popup_mod) return;
156 widget = popup_mod->mod_data.base;
158 evas_object_smart_callback_call(widget, SIG_EDIT_END, NULL);
160 evas_object_hide(popup_mod->popup);
161 content = elm_object_content_get(popup_mod->popup);
162 if (content == popup_mod->datepicker_layout)
164 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
166 spinner = popup_mod->popup_field[idx];
167 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
168 if (!entry) continue;
169 if (elm_object_focus_get(entry))
171 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
172 edje_object_message_signal_process(elm_layout_edje_get(spinner));
175 _set_datepicker_value(popup_mod);
177 else if (content == popup_mod->timepicker_layout)
179 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
181 spinner = popup_mod->popup_field[idx];
182 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
183 if (!entry) continue;
184 if (elm_object_focus_get(entry))
186 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
187 edje_object_message_signal_process(elm_layout_edje_get(spinner));
190 _set_timepicker_value(popup_mod);
195 _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
197 Popup_Module_Data *popup_mod;
198 Evas_Object *content, *widget;
200 Evas_Object *spinner, *entry;
202 popup_mod = (Popup_Module_Data *)data;
203 if (!popup_mod) return;
205 widget = popup_mod->mod_data.base;
207 evas_object_smart_callback_call(widget, SIG_EDIT_END, NULL);
209 evas_object_hide(popup_mod->popup);
210 content = elm_object_content_get(popup_mod->popup);
211 if (content == popup_mod->datepicker_layout)
213 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
215 spinner = popup_mod->popup_field[idx];
216 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
217 if (!entry) continue;
218 if (elm_object_focus_get(entry))
220 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
224 else if (content == popup_mod->timepicker_layout)
226 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
228 spinner = popup_mod->popup_field[idx];
229 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
230 if (!entry) continue;
231 if (elm_object_focus_get(entry))
233 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
240 _entry_activated_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
242 Popup_Module_Data *popup_mod;
243 Evas_Object *entry, *en;
246 popup_mod = (Popup_Module_Data *)data;
247 if (!popup_mod) return;
249 for (idx = 0; idx < ELM_DATETIME_DATE; idx++)
251 entry = elm_object_part_content_get(popup_mod->popup_field[idx], "elm.swallow.entry");
255 en = elm_object_part_content_get(popup_mod->popup_field[idx], "elm.swallow.entry");
256 elm_layout_signal_emit(popup_mod->popup_field[idx], "elm,action,entry,toggle", "elm");
260 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_HOUR], "elm.swallow.entry");
263 en = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MINUTE], "elm.swallow.entry");
264 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MINUTE],
265 "elm,action,entry,toggle", "elm");
270 _entry_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
272 Popup_Module_Data *popup_mod;
274 popup_mod = (Popup_Module_Data *)data;
275 if (!popup_mod || !obj) return;
279 _entry_focused_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
281 Popup_Module_Data *popup_mod;
285 popup_mod = (Popup_Module_Data *)data;
286 if (!popup_mod) return;
288 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MONTH],
289 "elm.swallow.entry");
292 value = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
293 elm_object_text_set(obj, month_arr[value]);
295 for (idx = 0; idx < DATETIME_FIELD_COUNT -1; idx++)
297 entry = elm_object_part_content_get(popup_mod->popup_field[idx], "elm.swallow.entry");
298 if ((obj != entry) && elm_object_focus_get(entry))
300 elm_layout_signal_emit(popup_mod->popup_field[idx],
301 "elm,action,entry,toggle", "elm");
308 _entry_unfocused_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
310 Popup_Module_Data *popup_mod;
312 popup_mod = (Popup_Module_Data *)data;
313 if (!popup_mod) return;
315 // TODO: entry_unfocused code
319 _set_datepicker_popup_title_text(Popup_Module_Data *popup_mod)
323 char title[BUFF_SIZE];
324 if (!popup_mod) return;
327 localtime_r(&t, &set_time);
328 set_time.tm_year = (popup_mod->set_time).tm_year;
329 set_time.tm_mon = (popup_mod->set_time).tm_mon;
330 set_time.tm_mday = (popup_mod->set_time).tm_mday;
331 set_time.tm_hour = 0;
333 strftime(title, BUFF_SIZE, "%x, %a", &set_time);
334 elm_object_part_text_set(popup_mod->popup, "title,text", title);
338 _set_timepicker_popup_title_text(Popup_Module_Data *popup_mod)
340 char title[BUFF_SIZE];
341 if (!popup_mod) return;
343 if (!popup_mod->time_12hr_fmt)
344 strftime(title, BUFF_SIZE, "%H:%M", &(popup_mod->set_time));
346 strftime(title, BUFF_SIZE, "%I:%M %p", &(popup_mod->set_time));
347 elm_object_part_text_set(popup_mod->popup, "title,text", title);
351 _set_ampm_value(Popup_Module_Data *popup_mod)
353 char ampm_str[BUFF_SIZE] = {0,};
354 const char *fmt = NULL;
356 if (!popup_mod || !popup_mod->time_12hr_fmt) return;
358 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base,
360 strftime(ampm_str, BUFF_SIZE, fmt, &(popup_mod->set_time));
362 elm_object_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM], ampm_str);
363 else if (popup_mod->set_time.tm_hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
364 elm_object_domain_translatable_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM],
367 elm_object_domain_translatable_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM],
372 _datepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
374 Popup_Module_Data *popup_mod;
375 struct tm min_values, max_values;
376 int idx, field_idx, min, max;
378 popup_mod = (Popup_Module_Data *)data;
379 if (!popup_mod) return;
381 for (idx = 0; idx < DATETIME_FIELD_COUNT; idx++)
382 if ((obj == popup_mod->popup_field[idx])) break;
384 if (idx > ELM_DATETIME_DATE) return;
387 DATETIME_MODULE_TM_ARRAY(set_val_arr, &popup_mod->set_time);
388 if (field_idx == ELM_DATETIME_YEAR)
389 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) - STRUCT_TM_YEAR_BASE_VALUE;
390 else if (field_idx == ELM_DATETIME_MONTH)
391 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) - 1;
393 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj);
395 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
396 &(popup_mod->set_time), &min_values, &max_values);
398 DATETIME_MODULE_TM_ARRAY(min_val_arr, &min_values);
399 DATETIME_MODULE_TM_ARRAY(max_val_arr, &max_values);
401 for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
403 min = *min_val_arr[idx];
404 max = *max_val_arr[idx];
405 if (idx == ELM_DATETIME_YEAR)
407 min += STRUCT_TM_YEAR_BASE_VALUE;
408 max += STRUCT_TM_YEAR_BASE_VALUE;
410 else if (idx == ELM_DATETIME_MONTH)
415 elm_spinner_min_max_set(popup_mod->popup_field[idx], min, max);
417 for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
419 if (idx == ELM_DATETIME_YEAR)
420 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - STRUCT_TM_YEAR_BASE_VALUE;
421 else if (idx == ELM_DATETIME_MONTH)
422 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - 1;
424 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]);
427 _set_datepicker_popup_title_text(popup_mod);
431 _timepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
433 Popup_Module_Data *popup_mod;
434 struct tm min_values, max_values;
437 popup_mod = (Popup_Module_Data *)data;
438 if (!popup_mod) return;
440 if (obj == popup_mod->popup_field[ELM_DATETIME_HOUR])
442 hour = (int)elm_spinner_value_get(obj);
443 if (popup_mod->time_12hr_fmt && popup_mod->is_pm)
445 if (hour != STRUCT_TM_TIME_12HRS_MAX_VALUE)
446 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
450 (popup_mod->set_time).tm_hour = hour;
451 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
452 &(popup_mod->set_time), &min_values, &max_values);
453 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE],
454 min_values.tm_min, max_values.tm_min);
455 (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(
456 popup_mod->popup_field[ELM_DATETIME_MINUTE]);
457 popup_mod->is_pm = (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : 1;
458 _set_ampm_value(popup_mod);
460 else if (obj == popup_mod->popup_field[ELM_DATETIME_MINUTE])
461 (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(obj);
463 _set_timepicker_popup_title_text(popup_mod);
467 _ampm_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
469 Popup_Module_Data *popup_mod;
472 popup_mod = (Popup_Module_Data *)data;
473 if (!popup_mod || !popup_mod->time_12hr_fmt) return;
475 hour = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
476 if (popup_mod->time_12hr_fmt && popup_mod->is_pm && (hour != STRUCT_TM_TIME_12HRS_MAX_VALUE))
477 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
479 if (hour > STRUCT_TM_TIME_12HRS_MAX_VALUE)
480 hour -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
481 else if (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
482 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
485 if (popup_mod->is_pm) hour = 0;
486 else hour = STRUCT_TM_TIME_12HRS_MAX_VALUE;
489 (popup_mod->set_time).tm_hour = hour;
490 popup_mod->is_pm = (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : 1;
491 _set_ampm_value(popup_mod);
492 _set_timepicker_popup_title_text(popup_mod);
496 _text_insert(const char *text, char *input, int pos)
499 int text_len, input_len;
501 text_len = strlen(text);
502 input_len = strlen(input);
503 result = (char *)malloc(sizeof(char) * (text_len + input_len) + 1);
504 memset(result, 0, sizeof(char) * (text_len + input_len) + 1);
506 strncpy(result, text, pos);
507 strcpy(result + pos, input);
508 strcpy(result + pos + input_len, text + pos);
510 return (const char *)result;
514 _year_validity_checking_filter(void *data, Evas_Object *obj, char **text)
516 Popup_Module_Data *popup_mod;
518 const char *new_str = NULL;
519 int min, max, val = 0, len;
521 const char *curr_str;
523 EINA_SAFETY_ON_NULL_RETURN(text);
524 popup_mod = (Popup_Module_Data *)data;
525 if (!popup_mod) return;
528 len = strlen(elm_object_text_get(obj));
531 curr_str = elm_object_text_get(obj);
532 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
533 if (new_str) val = atoi(new_str);
535 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, ELM_DATETIME_YEAR, &min, &max);
536 min += STRUCT_TM_YEAR_BASE_VALUE;
537 max += STRUCT_TM_YEAR_BASE_VALUE;
541 elm_entry_entry_set(obj, new_str);
542 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_YEAR],
543 "elm,action,entry,toggle", "elm");
545 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MONTH],
546 "elm.swallow.entry");
547 if (!elm_object_focus_get(entry))
549 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MONTH],
550 "elm,action,entry,toggle", "elm");
555 free((void *)new_str);
560 _month_validity_checking_filter(void *data, Evas_Object *obj, char **text)
562 Popup_Module_Data *popup_mod;
564 const char *new_str = NULL;
566 int val = 0, len, max_digits;
568 const char *curr_str;
570 EINA_SAFETY_ON_NULL_RETURN(text);
571 popup_mod = (Popup_Module_Data *)data;
572 if (!popup_mod) return;
575 len = strlen(elm_object_text_get(obj));
576 curr_str = elm_object_text_get(obj);
577 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
578 if (new_str) val = atoi(new_str) - 1;
580 elm_spinner_min_max_get(popup_mod->popup_field[ELM_DATETIME_MONTH], &min, &max);
584 max_digits = (max >= 10 ? 2 : 1);
585 if (len < 1 && max_digits > 1 && val < 1) return;
587 if ((val >= min) && (val <= max))
589 elm_entry_entry_set(obj, new_str);
590 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MONTH],
591 "elm,action,entry,toggle", "elm");
593 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_DATE],
594 "elm.swallow.entry");
595 if (!elm_object_focus_get(entry))
597 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_DATE],
598 "elm,action,entry,toggle", "elm");
602 free((void *)new_str);
607 _hour_validity_checking_filter(void *data, Evas_Object *obj, char **text)
609 Popup_Module_Data *popup_mod;
611 const char *new_str = NULL;
614 const char *curr_str;
616 EINA_SAFETY_ON_NULL_RETURN(text);
618 popup_mod = (Popup_Module_Data *)data;
619 if (!popup_mod) return;
622 len = strlen(elm_object_text_get(obj));
625 curr_str = elm_object_text_get(obj);
626 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
627 if (new_str) val = atoi(new_str);
629 if (popup_mod->time_12hr_fmt && val > STRUCT_TM_TIME_12HRS_MAX_VALUE)
632 free((void *)new_str);
636 else if (!popup_mod->time_12hr_fmt && val > STRUCT_TM_TIME_24HRS_MAX_VALUE)
639 free((void *)new_str);
643 elm_entry_entry_set(obj, new_str);
644 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_HOUR],
645 "elm,action,entry,toggle", "elm");
647 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MINUTE],
648 "elm.swallow.entry");
649 if (!elm_object_focus_get(entry))
651 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MINUTE],
652 "elm,action,entry,toggle", "elm");
655 free((void *)new_str);
660 _date_validity_checking_filter(void *data, Evas_Object *obj, char **text)
662 Popup_Module_Data *popup_mod;
663 const char *new_str = NULL;
665 const char *curr_str;
669 EINA_SAFETY_ON_NULL_RETURN(text);
670 popup_mod = (Popup_Module_Data *)data;
671 if (!popup_mod) return;
674 len = strlen(elm_object_text_get(obj));
677 curr_str = elm_object_text_get(obj);
678 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
679 if (new_str) val = atoi(new_str);
680 elm_spinner_min_max_get(popup_mod->popup_field[ELM_DATETIME_DATE], &min, &max);
682 if ((val >= min) && (val <= max))
684 elm_entry_entry_set(obj, new_str);
685 elm_entry_cursor_end_set(obj);
688 free((void *)new_str);
693 _minute_validity_checking_filter(void *data, Evas_Object *obj, char **text)
695 Popup_Module_Data *popup_mod;
696 const char *new_str = NULL;
697 int min, max, val = 0, len;
699 const char *curr_str;
701 EINA_SAFETY_ON_NULL_RETURN(text);
702 popup_mod = (Popup_Module_Data *)data;
703 if (!popup_mod) return;
706 len = strlen(elm_object_text_get(obj));
709 curr_str = elm_object_text_get(obj);
710 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
711 if (new_str) val = atoi(new_str);
713 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, ELM_DATETIME_MINUTE, &min, &max);
715 if ((val >= min) && (val <= max))
717 elm_entry_entry_set(obj, new_str);
718 elm_entry_cursor_end_set(obj);
721 free((void *)new_str);
726 _set_datepicker_entry_filter(Popup_Module_Data *popup_mod)
728 Evas_Object *spinner, *entry;
729 static Elm_Entry_Filter_Accept_Set digits_filter_data;
730 static Elm_Entry_Filter_Limit_Size limit_filter_data;
734 if (!popup_mod) return;
736 digits_filter_data.accepted = "0123456789";
737 digits_filter_data.rejected = NULL;
739 limit_filter_data.max_byte_count = 0;
741 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
743 spinner = popup_mod->popup_field[idx];
744 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
745 if (!entry) continue;
747 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
748 elm_object_style_set(entry, buf);
749 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
750 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
752 if (idx == ELM_DATETIME_MONTH)
754 value = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
755 elm_object_text_set(entry, month_arr[value]);
758 elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &digits_filter_data);
760 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_DATETIME);
762 if (idx == ELM_DATETIME_YEAR)
763 limit_filter_data.max_char_count = 4;
765 limit_filter_data.max_char_count = 2;
767 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
769 evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, popup_mod);
770 evas_object_smart_callback_add(entry, "unfocused", _entry_unfocused_cb, popup_mod);
771 evas_object_smart_callback_add(entry, "activated", _entry_activated_cb, popup_mod);
772 evas_object_smart_callback_add(entry, "clicked", _entry_clicked_cb, popup_mod);
774 if (idx == ELM_DATETIME_YEAR)
775 elm_entry_markup_filter_append(entry, _year_validity_checking_filter, popup_mod);
776 else if (idx == ELM_DATETIME_MONTH)
777 elm_entry_markup_filter_append(entry, _month_validity_checking_filter, popup_mod);
778 else if (idx == ELM_DATETIME_DATE)
779 elm_entry_markup_filter_append(entry, _date_validity_checking_filter, popup_mod);
784 _set_timepicker_entry_filter(Popup_Module_Data *popup_mod)
786 Evas_Object *spinner, *entry;
787 static Elm_Entry_Filter_Accept_Set digits_filter_data;
788 static Elm_Entry_Filter_Limit_Size limit_filter_data;
792 if (!popup_mod) return;
794 digits_filter_data.accepted = "0123456789";
795 digits_filter_data.rejected = NULL;
797 limit_filter_data.max_byte_count = 0;
799 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
801 spinner = popup_mod->popup_field[idx];
802 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
803 if (!entry) continue;
805 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
806 elm_object_style_set(entry, buf);
807 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
808 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
809 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_DATETIME);
810 elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &digits_filter_data);
812 limit_filter_data.max_char_count = 2;
813 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
815 evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, popup_mod);
816 evas_object_smart_callback_add(entry, "unfocused", _entry_unfocused_cb, popup_mod);
817 evas_object_smart_callback_add(entry, "activated", _entry_activated_cb, popup_mod);
818 evas_object_smart_callback_add(entry, "clicked", _entry_clicked_cb, popup_mod);
820 if (idx == ELM_DATETIME_HOUR)
821 elm_entry_markup_filter_append(entry, _hour_validity_checking_filter, popup_mod);
822 else if (idx == ELM_DATETIME_MINUTE)
823 elm_entry_markup_filter_append(entry, _minute_validity_checking_filter, popup_mod);
828 _show_datepicker_layout(Popup_Module_Data *popup_mod)
830 Evas_Object *content;
832 int idx, year, month, min, max;
833 Elm_Datetime_Field_Type field_type = ELM_DATETIME_YEAR;
835 if (!popup_mod || !popup_mod->mod_data.base) return;
837 content = elm_object_content_get(popup_mod->popup);
838 if (content != popup_mod->datepicker_layout)
840 elm_object_content_unset(popup_mod->popup);
841 if (content) evas_object_hide(content);
842 elm_object_content_set(popup_mod->popup, popup_mod->datepicker_layout);
843 evas_object_show(popup_mod->datepicker_layout);
845 elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
846 _set_datepicker_popup_title_text(popup_mod);
848 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
849 year = curr_time.tm_year + STRUCT_TM_YEAR_BASE_VALUE;
850 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_YEAR], year);
851 month = curr_time.tm_mon + 1;
852 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_MONTH], month);
853 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_DATE], curr_time.tm_mday);
855 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
857 field_type = (Elm_Datetime_Field_Type)idx;
858 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, field_type, &min, &max);
859 if (idx == ELM_DATETIME_YEAR)
860 elm_spinner_min_max_set(popup_mod->popup_field[idx], (STRUCT_TM_YEAR_BASE_VALUE + min), (STRUCT_TM_YEAR_BASE_VALUE + max));
861 else if (idx == ELM_DATETIME_MONTH)
862 elm_spinner_min_max_set(popup_mod->popup_field[idx], (1+min), (1+max));
864 elm_spinner_min_max_set(popup_mod->popup_field[idx], min, max);
869 _show_timepicker_layout(Popup_Module_Data *popup_mod)
871 Evas_Object *content;
872 struct tm curr_time, min_time, max_time;
873 int hour, hour_min, hour_max;
875 if (!popup_mod || !popup_mod->mod_data.base) return;
877 content = elm_object_content_get(popup_mod->popup);
878 if (content != popup_mod->timepicker_layout)
880 elm_object_content_unset(popup_mod->popup);
881 if (content) evas_object_hide(content);
882 elm_object_content_set(popup_mod->popup, popup_mod->timepicker_layout);
883 evas_object_show(popup_mod->timepicker_layout);
885 elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
886 _set_timepicker_popup_title_text(popup_mod);
888 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
889 hour = curr_time.tm_hour;
890 if (popup_mod->time_12hr_fmt)
892 if (hour >= STRUCT_TM_TIME_12HRS_MAX_VALUE)
893 popup_mod->is_pm = EINA_TRUE;
895 popup_mod->is_pm = EINA_FALSE;
896 if (hour >= STRUCT_TM_TIME_12HRS_MAX_VALUE)
897 hour -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
898 hour = (hour == 0) ? STRUCT_TM_TIME_12HRS_MAX_VALUE : hour;
900 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour);
901 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], curr_time.tm_min);
902 if (popup_mod->time_12hr_fmt)
903 _set_ampm_value(popup_mod);
905 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base, &curr_time, &min_time, &max_time);
906 hour_min = min_time.tm_hour;
907 hour_max = max_time.tm_hour;
908 if (popup_mod->time_12hr_fmt)
910 if (hour_min < 1) hour_min = 1;
911 else if (hour_min > STRUCT_TM_TIME_12HRS_MAX_VALUE)
912 hour_min -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
913 if (hour_max > STRUCT_TM_TIME_12HRS_MAX_VALUE)
914 hour_max = STRUCT_TM_TIME_12HRS_MAX_VALUE;
916 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour_min, hour_max);
917 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE],
918 min_time.tm_min, max_time.tm_min);
922 _set_month_special_values(Popup_Module_Data *popup_mod)
925 const char *fmt = NULL;
928 if (!popup_mod) return;
930 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
931 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base, ELM_DATETIME_MONTH);
932 for (month = 0; month < TOTAL_NUMBER_OF_MONTHS; month++)
934 curr_time.tm_mon = month;
935 strftime(month_arr[month], MONTH_STRING_MAX_SIZE, fmt, &curr_time);
937 for (month = 0; month < 12; month++)
938 elm_spinner_special_value_add(popup_mod->popup_field[ELM_DATETIME_MONTH],
939 month + 1, month_arr[month]);
943 _create_datetime_popup(Popup_Module_Data *popup_mod)
945 Evas_Object *set_btn, *cancel_btn;
946 Evas_Object *parent, *widget, *conformant = NULL;
947 const char *widget_type;
949 if (!popup_mod) return;
951 // add popup to the content of elm_conformant
952 widget = popup_mod->mod_data.base;
953 while(widget != NULL)
955 parent = elm_widget_parent_get(widget);
956 widget_type = elm_widget_type_get(widget);
957 if (!strcmp(widget_type, "elm_conformant"))
965 popup_mod->popup = elm_popup_add(elm_object_content_get(conformant));
967 popup_mod->popup = elm_popup_add(elm_widget_top_get(popup_mod->mod_data.base));
969 evas_object_size_hint_weight_set(popup_mod->popup, EVAS_HINT_EXPAND,
971 evas_object_size_hint_align_set(popup_mod->popup, EVAS_HINT_FILL, 0.5);
973 cancel_btn = elm_button_add(popup_mod->popup);
974 elm_object_style_set(cancel_btn, "popup_button/default");
975 elm_object_domain_translatable_text_set(cancel_btn, PACKAGE, E_("Cancel"));
976 elm_object_part_content_set(popup_mod->popup, "button1", cancel_btn);
977 evas_object_smart_callback_add(cancel_btn, "clicked", _popup_cancel_btn_clicked_cb, popup_mod);
979 set_btn = elm_button_add(popup_mod->popup);
980 elm_object_style_set(set_btn, "popup_button/default");
981 elm_object_domain_translatable_text_set(set_btn, PACKAGE, E_("Set"));
982 elm_object_part_content_set(popup_mod->popup, "button2", set_btn);
983 evas_object_smart_callback_add(set_btn, "clicked", _popup_set_btn_clicked_cb, popup_mod);
987 _create_datepicker_layout(Popup_Module_Data *popup_mod)
989 Evas_Object *spinner;
993 if (!popup_mod) return;
995 popup_mod->datepicker_layout = elm_layout_add(popup_mod->popup);
996 elm_layout_theme_set(popup_mod->datepicker_layout, "layout", "datetime_popup", "date_layout");
998 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1000 spinner = elm_spinner_add(popup_mod->popup);
1001 elm_spinner_editable_set(spinner, EINA_TRUE);
1002 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
1003 elm_object_style_set(spinner, buf);
1004 elm_spinner_step_set(spinner, 1);
1005 elm_spinner_wrap_set(spinner, EINA_TRUE);
1006 elm_spinner_label_format_set(spinner, "%02.0f");
1007 snprintf(buf, sizeof(buf), "field%d", idx);
1008 elm_object_part_content_set(popup_mod->datepicker_layout, buf, spinner);
1010 if (idx == ELM_DATETIME_YEAR)
1011 elm_spinner_min_max_set(spinner, 1902, 2037);
1012 else if (idx == ELM_DATETIME_MONTH)
1013 elm_spinner_min_max_set(spinner, 1, 12);
1014 else if (idx == ELM_DATETIME_DATE)
1015 elm_spinner_min_max_set(spinner, 1, 31);
1017 evas_object_smart_callback_add(spinner, "changed", _datepicker_value_changed_cb, popup_mod);
1018 popup_mod->popup_field[idx] = spinner;
1021 _set_month_special_values(popup_mod);
1022 _set_datepicker_entry_filter(popup_mod);
1026 _create_timepicker_layout(Popup_Module_Data *popup_mod)
1028 Evas_Object *spinner, *ampm;
1029 char buf[BUFF_SIZE];
1032 if (!popup_mod) return;
1034 popup_mod->timepicker_layout = elm_layout_add(popup_mod->popup);
1035 popup_mod->time_12hr_fmt = popup_mod->mod_data.field_location_get(popup_mod->mod_data.base, ELM_DATETIME_AMPM, NULL);
1037 if (popup_mod->time_12hr_fmt)
1038 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout");
1040 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout_24hr");
1042 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
1044 spinner = elm_spinner_add(popup_mod->popup);
1045 elm_spinner_editable_set(spinner, EINA_TRUE);
1046 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
1047 elm_object_style_set(spinner, buf);
1048 elm_spinner_step_set(spinner, 1);
1049 elm_spinner_wrap_set(spinner, EINA_TRUE);
1050 elm_spinner_label_format_set(spinner, "%02.0f");
1051 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1052 elm_object_part_content_set(popup_mod->timepicker_layout, buf, spinner);
1053 evas_object_smart_callback_add(spinner, "changed", _timepicker_value_changed_cb, popup_mod);
1054 popup_mod->popup_field[idx] = spinner;
1057 ampm = elm_entry_add(popup_mod->popup);
1058 elm_entry_single_line_set(ampm, EINA_TRUE);
1059 elm_entry_editable_set(ampm, EINA_FALSE);
1060 elm_entry_magnifier_disabled_set(ampm, EINA_TRUE);
1061 elm_entry_context_menu_disabled_set(ampm, EINA_TRUE);
1062 elm_object_style_set(ampm, "datetime_popup/ampm");
1063 evas_object_smart_callback_add(ampm, "clicked", _ampm_clicked_cb, popup_mod);
1064 elm_object_part_content_set(popup_mod->timepicker_layout, "field2",ampm);
1065 popup_mod->popup_field[ELM_DATETIME_AMPM] = ampm;
1067 if (!popup_mod->time_12hr_fmt)
1068 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], 0, 23);
1070 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], 1, 12);
1071 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], 0, 59);
1073 _set_timepicker_entry_filter(popup_mod);
1077 _module_format_change(Popup_Module_Data *popup_mod)
1079 Evas_Object *datetime, *spinner;
1080 char buf[BUFF_SIZE];
1082 Eina_Bool datepicker_bg_show = EINA_FALSE;
1083 Eina_Bool timepicker_bg_show = EINA_FALSE;
1084 Eina_Bool time_12hr;
1086 if (!popup_mod) return;
1088 datetime = popup_mod->mod_data.base;
1089 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1090 datepicker_bg_show |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
1091 if (!datepicker_bg_show)
1092 elm_layout_signal_emit(datetime, "datetime,datepicker,bg,hide", "elm");
1094 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
1095 timepicker_bg_show |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
1096 if (!timepicker_bg_show)
1097 elm_layout_signal_emit(datetime, "datetime,timepicker,bg,hide", "elm");
1099 time_12hr = popup_mod->mod_data.field_location_get(datetime, ELM_DATETIME_AMPM, NULL);
1100 if ((popup_mod->time_12hr_fmt != time_12hr) && (popup_mod->timepicker_layout))
1102 for (idx = ELM_DATETIME_DATE; idx <= ELM_DATETIME_AMPM; idx++)
1104 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1105 spinner = elm_object_part_content_unset(popup_mod->timepicker_layout, buf);
1106 if (spinner) evas_object_hide(spinner);
1110 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout");
1111 for (idx = ELM_DATETIME_DATE; idx <= ELM_DATETIME_AMPM; idx++)
1113 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1114 elm_object_part_content_set(popup_mod->timepicker_layout, buf, popup_mod->popup_field[idx]);
1119 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout_24hr");
1120 for (idx = ELM_DATETIME_DATE; idx <= ELM_DATETIME_MINUTE; idx++)
1122 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1123 elm_object_part_content_set(popup_mod->timepicker_layout, buf, popup_mod->popup_field[idx]);
1127 popup_mod->time_12hr_fmt = time_12hr;
1131 _datepicker_show_cb(void *data,
1133 const char *emission __UNUSED__,
1134 const char *source __UNUSED__)
1136 Popup_Module_Data *popup_mod;
1138 popup_mod = (Popup_Module_Data *)data;
1139 if (!popup_mod) return;
1141 if (!popup_mod->popup)
1142 _create_datetime_popup(popup_mod);
1144 if (!popup_mod->datepicker_layout)
1145 _create_datepicker_layout(popup_mod);
1147 _show_datepicker_layout(popup_mod);
1148 evas_object_show(popup_mod->popup);
1149 evas_object_smart_callback_call(obj, SIG_EDIT_START, NULL);
1153 _timepicker_show_cb(void *data,
1155 const char *emission __UNUSED__,
1156 const char *source __UNUSED__)
1158 Popup_Module_Data *popup_mod;
1160 popup_mod = (Popup_Module_Data *)data;
1161 if (!popup_mod) return;
1163 if (!popup_mod->popup)
1164 _create_datetime_popup(popup_mod);
1166 if (!popup_mod->timepicker_layout)
1167 _create_timepicker_layout(popup_mod);
1169 _show_timepicker_layout(popup_mod);
1170 evas_object_show(popup_mod->popup);
1171 evas_object_smart_callback_call(obj, SIG_EDIT_START, NULL);
1175 _module_language_changed_cb(void *data,
1176 Evas_Object *obj __UNUSED__,
1177 void *event_info __UNUSED__)
1179 Popup_Module_Data *popup_mod;
1180 Evas_Object *content;
1181 popup_mod = (Popup_Module_Data *)data;
1182 if (!popup_mod || !popup_mod->popup) return;
1184 content = elm_object_content_get(popup_mod->popup);
1185 if (content == popup_mod->datepicker_layout)
1186 _set_datepicker_popup_title_text(popup_mod);
1187 else if (content == popup_mod->timepicker_layout)
1188 _set_timepicker_popup_title_text(popup_mod);
1190 _set_month_special_values(popup_mod);
1191 _set_ampm_value(popup_mod);
1195 _access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
1197 const char* type = NULL;
1201 case ELM_DATETIME_YEAR:
1202 type = "datetime field, year";
1205 case ELM_DATETIME_MONTH:
1206 type = "datetime field, month";
1209 case ELM_DATETIME_DATE:
1210 type = "datetime field, date";
1213 case ELM_DATETIME_HOUR:
1214 type = "datetime field, hour";
1217 case ELM_DATETIME_MINUTE:
1218 type = "datetime field, minute";
1221 case ELM_DATETIME_AMPM:
1222 type = "datetime field, AM PM";
1229 _elm_access_text_set
1230 (_elm_access_object_get(obj), ELM_ACCESS_TYPE, type);
1231 _elm_access_callback_set
1232 (_elm_access_object_get(obj), ELM_ACCESS_STATE, NULL, NULL);
1235 // module functions for the specific module type
1237 field_value_display(Elm_Datetime_Module_Data *module_data, Evas_Object *obj)
1239 Popup_Module_Data *popup_mod;
1240 Elm_Datetime_Field_Type field_type;
1241 struct tm curr_time;
1242 char buf[BUFF_SIZE] = {0,};
1245 popup_mod = (Popup_Module_Data *)module_data;
1246 if (!popup_mod || !obj) return;
1248 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
1249 field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
1250 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base, field_type);
1251 strftime(buf, sizeof(buf), fmt, &curr_time);
1253 if ((!buf[0]) && ((!strcmp(fmt, "%p")) || (!strcmp(fmt, "%P"))))
1255 if (curr_time.tm_hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
1256 elm_object_domain_translatable_text_set(obj, PACKAGE, E_("AM"));
1258 elm_object_domain_translatable_text_set(obj, PACKAGE, E_("PM"));
1261 elm_object_text_set(obj, buf);
1263 if (field_type == ELM_DATETIME_DATE)
1266 strftime(buf, sizeof(buf), "%a", &curr_time);
1267 elm_layout_text_set(popup_mod->mod_data.base, "elm.text.weekday", buf);
1272 field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type field_type)
1274 Popup_Module_Data *popup_mod;
1275 Evas_Object *field_obj;
1276 char buf[BUFF_SIZE];
1278 popup_mod = (Popup_Module_Data *)module_data;
1279 if (!popup_mod) return NULL;
1281 field_obj = elm_label_add(popup_mod->mod_data.base);
1282 snprintf(buf, sizeof(buf), "datetime/%s/default", field_styles[field_type]);
1283 elm_object_style_set(field_obj, buf);
1284 evas_object_data_set(field_obj, "_field_type", (void *)field_type);
1285 popup_mod->datetime_field[field_type] = field_obj;
1287 _access_set(field_obj, field_type);
1292 EAPI Elm_Datetime_Module_Data *
1293 obj_hook(Evas_Object *obj)
1295 Popup_Module_Data *popup_mod;
1297 popup_mod = ELM_NEW(Popup_Module_Data);
1298 if (!popup_mod) return NULL;
1300 elm_object_signal_callback_add(obj, "datepicker,show", "",
1301 _datepicker_show_cb, popup_mod);
1302 elm_object_signal_callback_add(obj, "timepicker,show", "",
1303 _timepicker_show_cb, popup_mod);
1304 elm_object_signal_callback_add(obj, "picker,hide", "",
1305 _picker_hide_cb, popup_mod);
1306 evas_object_smart_callback_add(obj, "language,changed",
1307 _module_language_changed_cb, popup_mod);
1308 elm_object_signal_callback_add(obj, "elm,action,press", "*",
1309 _datetime_press_cb, popup_mod);
1310 elm_object_signal_callback_add(obj, "elm,action,unpress", "*",
1311 _datetime_unpress_cb, popup_mod);
1313 popup_mod->popup = NULL;
1314 popup_mod->datepicker_layout = NULL;
1315 popup_mod->timepicker_layout = NULL;
1317 return ((Elm_Datetime_Module_Data*)popup_mod);
1321 obj_unhook(Elm_Datetime_Module_Data *module_data)
1323 Popup_Module_Data *popup_mod;
1325 popup_mod = (Popup_Module_Data *)module_data;
1326 if (!popup_mod) return;
1328 if (popup_mod->popup)
1329 evas_object_del(popup_mod->popup);
1339 obj_format_hook(Elm_Datetime_Module_Data *module_data)
1341 Popup_Module_Data *popup_mod;
1343 popup_mod = (Popup_Module_Data *)module_data;
1344 if (!popup_mod) return;
1346 _module_format_change(popup_mod);
1350 obj_theme_hook(Elm_Datetime_Module_Data *module_data)
1352 Popup_Module_Data *popup_mod;
1354 popup_mod = (Popup_Module_Data *)module_data;
1355 if (!popup_mod) return;
1357 // TODO: function can be improved to provide different popup styles.
1361 obj_focus_hook(Elm_Datetime_Module_Data *module_data __UNUSED__)
1363 // TODO: Default focus - enhance this func. for obj_show/obj_hide like below
1365 Popup_Module_Data *popup_mod;
1367 Eina_Bool is_focused = EINA_FALSE; //init with i/p argument
1369 popup_mod = (Popup_Module_Data *)module_data;
1370 if (!popup_mod || popup_mod->popup) return;
1372 for (idx = 0; idx < DATETIME_FIELD_COUNT; idx++)
1373 if (elm_object_focus_get(popup_mod->popup_field[idx]))
1374 is_focused = EINA_TRUE;
1377 evas_object_show(popup_mod->popup);
1379 evas_object_hide(popup_mod->popup);
1383 // module api funcs needed
1385 elm_modapi_init(void *m __UNUSED__)
1387 return 1; // succeed always
1391 elm_modapi_shutdown(void *m __UNUSED__)
1393 return 1; // succeed always