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
11 #define PICKER_POPUP_FIELD_COUNT 3
13 /* struct tm does not define the fields in the order year, month,
14 * date, hour, minute. values are reassigned to an array for easy
17 #define DATETIME_MODULE_TM_ARRAY(intptr, tmptr) \
25 static const char *field_styles[] = {
26 "year", "month", "date", "hour", "minute", "ampm" };
28 static char month_arr[TOTAL_NUMBER_OF_MONTHS][MONTH_STRING_MAX_SIZE];
30 static const char SIG_EDIT_START[] = "edit,start";
31 static const char SIG_EDIT_END[] = "edit,end";
32 static const char SIG_PICKER_VALUE_SET[] = "picker,value,set";
34 typedef struct _Popup_Module_Data Popup_Module_Data;
36 struct _Popup_Module_Data
38 Elm_Datetime_Module_Data mod_data;
40 Evas_Object *datepicker_layout, *timepicker_layout;
41 Evas_Object *popup_field[DATETIME_FIELD_COUNT];
42 int field_location[PICKER_POPUP_FIELD_COUNT];
43 Evas_Object *datetime_field[DATETIME_FIELD_COUNT];
45 Eina_Bool time_12hr_fmt;
47 Eina_Bool weekday_show;
48 Eina_Bool weekday_loc_first;
51 EAPI void field_value_display(Elm_Datetime_Module_Data *module_data, Evas_Object *obj);
54 _picker_nextfield_location_get(void *data, int curr)
57 Popup_Module_Data *popup_mod;
58 popup_mod = (Popup_Module_Data *)data;
59 if (!popup_mod) return ELM_DATETIME_LAST;
61 for (idx = 0; idx < PICKER_POPUP_FIELD_COUNT; idx++)
62 if (popup_mod->field_location[idx] == curr) break;
63 if (idx < ELM_DATETIME_DATE)
65 next_idx = popup_mod->field_location[++idx];
68 else return ELM_DATETIME_LAST;
72 _picker_field_location_get(void *data, int curr)
75 Popup_Module_Data *popup_mod;
76 popup_mod = (Popup_Module_Data *)data;
77 if (!popup_mod) return ELM_DATETIME_LAST;
79 for (idx = 0; idx < PICKER_POPUP_FIELD_COUNT; idx++)
80 if (popup_mod->field_location[idx] == curr) break;
86 _picker_hide_cb(void *data,
87 Evas_Object *obj __UNUSED__,
88 const char *emission __UNUSED__,
89 const char *source __UNUSED__)
91 Popup_Module_Data *popup_mod;
92 popup_mod = (Popup_Module_Data *)data;
93 if (!popup_mod) return;
95 evas_object_smart_callback_call(obj, SIG_EDIT_END, NULL);
96 evas_object_hide(popup_mod->popup);
100 _datetime_press_cb(void *data,
101 Evas_Object *obj __UNUSED__,
102 const char *emission __UNUSED__,
105 Popup_Module_Data *popup_mod;
108 popup_mod = (Popup_Module_Data *)data;
109 if (!popup_mod) return;
111 if (!strcmp(source, "date.picker.bg"))
113 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
114 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,select", "elm");
116 else if (!strcmp(source, "time.picker.bg"))
118 for (idx = ELM_DATETIME_HOUR; idx < DATETIME_FIELD_COUNT; idx++)
119 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,select", "elm");
124 _datetime_unpress_cb(void *data,
125 Evas_Object *obj __UNUSED__,
126 const char *emission __UNUSED__,
129 Popup_Module_Data *popup_mod;
132 popup_mod = (Popup_Module_Data *)data;
133 if (!popup_mod) return;
135 if (!strcmp(source, "date.picker.bg"))
137 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
138 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,unselect", "elm");
140 else if (!strcmp(source, "time.picker.bg"))
142 for (idx = ELM_DATETIME_HOUR; idx < DATETIME_FIELD_COUNT; idx++)
143 elm_object_signal_emit(popup_mod->datetime_field[idx], "elm,state,unselect", "elm");
148 _set_datepicker_value(Popup_Module_Data *popup_mod)
152 if (!popup_mod) return;
154 elm_datetime_value_get(popup_mod->mod_data.base, &set_time);
155 set_time.tm_year = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_YEAR]) - STRUCT_TM_YEAR_BASE_VALUE;
156 set_time.tm_mon = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
157 set_time.tm_mday = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_DATE]);
158 elm_datetime_value_set(popup_mod->mod_data.base, &set_time);
162 _set_timepicker_value(Popup_Module_Data *popup_mod)
167 if (!popup_mod) return;
169 elm_datetime_value_get(popup_mod->mod_data.base, &set_time);
171 hour = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
172 if (popup_mod->time_12hr_fmt)
174 if (popup_mod->is_pm)
175 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
176 hour = (hour == STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : hour;
177 hour = (hour == 24) ? STRUCT_TM_TIME_12HRS_MAX_VALUE : hour;
179 set_time.tm_hour = hour;
180 set_time.tm_min = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MINUTE]);
181 elm_datetime_value_set(popup_mod->mod_data.base, &set_time);
185 _popup_set_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
187 Popup_Module_Data *popup_mod;
188 Evas_Object *content, *widget;
190 Evas_Object *spinner, *entry;
192 popup_mod = (Popup_Module_Data *)data;
193 if (!popup_mod) return;
195 widget = popup_mod->mod_data.base;
197 evas_object_smart_callback_call(widget, SIG_EDIT_END, NULL);
199 evas_object_hide(popup_mod->popup);
200 content = elm_object_content_get(popup_mod->popup);
201 if (content == popup_mod->datepicker_layout)
203 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
205 spinner = popup_mod->popup_field[idx];
206 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
207 if (!entry) continue;
208 if (elm_object_focus_get(entry))
210 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
211 edje_object_message_signal_process(elm_layout_edje_get(spinner));
214 _set_datepicker_value(popup_mod);
216 else if (content == popup_mod->timepicker_layout)
218 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
220 spinner = popup_mod->popup_field[idx];
221 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
222 if (!entry) continue;
223 if (elm_object_focus_get(entry))
225 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
226 edje_object_message_signal_process(elm_layout_edje_get(spinner));
229 _set_timepicker_value(popup_mod);
232 evas_object_smart_callback_call(popup_mod->mod_data.base, SIG_PICKER_VALUE_SET, NULL);
236 _popup_cancel_btn_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
238 Popup_Module_Data *popup_mod;
239 Evas_Object *content, *widget;
241 Evas_Object *spinner, *entry;
243 popup_mod = (Popup_Module_Data *)data;
244 if (!popup_mod) return;
246 widget = popup_mod->mod_data.base;
248 evas_object_smart_callback_call(widget, SIG_EDIT_END, NULL);
250 evas_object_hide(popup_mod->popup);
251 content = elm_object_content_get(popup_mod->popup);
252 if (content == popup_mod->datepicker_layout)
254 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
256 spinner = popup_mod->popup_field[idx];
257 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
258 if (!entry) continue;
259 if (elm_object_focus_get(entry))
261 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
265 else if (content == popup_mod->timepicker_layout)
267 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
269 spinner = popup_mod->popup_field[idx];
270 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
271 if (!entry) continue;
272 if (elm_object_focus_get(entry))
274 elm_layout_signal_emit(spinner, "elm,action,entry,toggle", "elm");
281 _picker_hide_cb(void *data,
282 Evas_Object *obj __UNUSED__,
283 const char *emission __UNUSED__,
284 const char *source __UNUSED__)
286 Popup_Module_Data *popup_mod;
287 popup_mod = (Popup_Module_Data *)data;
288 if (!popup_mod) return;
290 evas_object_smart_callback_call(obj, SIG_EDIT_END, NULL);
291 evas_object_hide(popup_mod->popup);
295 _entry_activated_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
297 Popup_Module_Data *popup_mod;
298 Evas_Object *entry, *en;
301 popup_mod = (Popup_Module_Data *)data;
302 if (!popup_mod) return;
304 for (idx = 0; idx < PICKER_POPUP_FIELD_COUNT; idx++)
306 entry = elm_object_part_content_get(popup_mod->popup_field[idx], "elm.swallow.entry");
309 next_idx = _picker_nextfield_location_get(popup_mod, idx);
310 if (next_idx != ELM_DATETIME_LAST)
311 elm_layout_signal_emit(popup_mod->popup_field[next_idx], "elm,action,entry,toggle", "elm");
315 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_HOUR], "elm.swallow.entry");
318 en = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MINUTE], "elm.swallow.entry");
319 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MINUTE],
320 "elm,action,entry,toggle", "elm");
325 _entry_clicked_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
327 Popup_Module_Data *popup_mod;
329 popup_mod = (Popup_Module_Data *)data;
330 if (!popup_mod || !obj) return;
334 _entry_focused_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
336 Popup_Module_Data *popup_mod;
340 popup_mod = (Popup_Module_Data *)data;
341 if (!popup_mod) return;
343 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MONTH],
344 "elm.swallow.entry");
347 value = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
348 elm_object_text_set(obj, month_arr[value]);
350 for (idx = 0; idx < DATETIME_FIELD_COUNT -1; idx++)
352 entry = elm_object_part_content_get(popup_mod->popup_field[idx], "elm.swallow.entry");
353 if ((obj != entry) && elm_object_focus_get(entry))
355 elm_layout_signal_emit(popup_mod->popup_field[idx],
356 "elm,action,entry,toggle", "elm");
363 _entry_unfocused_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
365 Popup_Module_Data *popup_mod;
367 popup_mod = (Popup_Module_Data *)data;
368 if (!popup_mod) return;
370 // TODO: entry_unfocused code
374 _set_datepicker_popup_title_text(Popup_Module_Data *popup_mod)
378 char weekday[BUFF_SIZE];
379 if (!popup_mod) return;
382 localtime_r(&t, &set_time);
383 set_time.tm_year = (popup_mod->set_time).tm_year;
384 set_time.tm_mon = (popup_mod->set_time).tm_mon;
385 set_time.tm_mday = (popup_mod->set_time).tm_mday;
386 /* FIXME: To restrict month wrapping because of summer time in some locales,
387 * ignore day light saving mode in mktime(). */
388 set_time.tm_isdst = -1;
390 strftime(weekday, BUFF_SIZE, "%a", &set_time);
391 elm_object_part_text_set(popup_mod->popup, "elm.text.title2", weekday);
393 elm_object_domain_translatable_part_text_set(popup_mod->popup, "title,text", PACKAGE, E_("Set date"));
397 _set_timepicker_popup_title_text(Popup_Module_Data *popup_mod)
399 if (!popup_mod) return;
401 elm_object_domain_translatable_part_text_set(popup_mod->popup, "title,text", PACKAGE, E_("Set time"));
402 elm_object_part_text_set(popup_mod->popup, "elm.text.title2", "");
406 _set_ampm_value(Popup_Module_Data *popup_mod)
408 char ampm_str[BUFF_SIZE] = {0,};
409 const char *fmt = NULL;
411 if (!popup_mod || !popup_mod->time_12hr_fmt) return;
413 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base,
415 strftime(ampm_str, BUFF_SIZE, fmt, &(popup_mod->set_time));
417 elm_object_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM], ampm_str);
418 else if (popup_mod->set_time.tm_hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
419 elm_object_domain_translatable_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM],
422 elm_object_domain_translatable_text_set(popup_mod->popup_field[ELM_DATETIME_AMPM],
427 _datepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
429 Popup_Module_Data *popup_mod;
430 struct tm min_values, max_values;
431 int idx, field_idx, min, max;
433 popup_mod = (Popup_Module_Data *)data;
434 if (!popup_mod) return;
436 for (idx = 0; idx < DATETIME_FIELD_COUNT; idx++)
437 if ((obj == popup_mod->popup_field[idx])) break;
439 if (idx > ELM_DATETIME_DATE) return;
442 DATETIME_MODULE_TM_ARRAY(set_val_arr, &popup_mod->set_time);
443 if (field_idx == ELM_DATETIME_YEAR)
444 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) - STRUCT_TM_YEAR_BASE_VALUE;
445 else if (field_idx == ELM_DATETIME_MONTH)
446 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj) - 1;
448 *set_val_arr[field_idx] = (int)elm_spinner_value_get(obj);
450 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
451 &(popup_mod->set_time), &min_values, &max_values);
453 DATETIME_MODULE_TM_ARRAY(min_val_arr, &min_values);
454 DATETIME_MODULE_TM_ARRAY(max_val_arr, &max_values);
456 for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
458 min = *min_val_arr[idx];
459 max = *max_val_arr[idx];
460 if (idx == ELM_DATETIME_YEAR)
462 min += STRUCT_TM_YEAR_BASE_VALUE;
463 max += STRUCT_TM_YEAR_BASE_VALUE;
465 else if (idx == ELM_DATETIME_MONTH)
470 elm_spinner_min_max_set(popup_mod->popup_field[idx], min, max);
472 for (idx = field_idx; idx <= ELM_DATETIME_DATE; idx++)
474 if (idx == ELM_DATETIME_YEAR)
475 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - STRUCT_TM_YEAR_BASE_VALUE;
476 else if (idx == ELM_DATETIME_MONTH)
477 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]) - 1;
479 *set_val_arr[idx] = (int)elm_spinner_value_get(popup_mod->popup_field[idx]);
482 _set_datepicker_popup_title_text(popup_mod);
486 _timepicker_value_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
488 Popup_Module_Data *popup_mod;
489 struct tm min_values, max_values;
492 popup_mod = (Popup_Module_Data *)data;
493 if (!popup_mod) return;
495 if (obj == popup_mod->popup_field[ELM_DATETIME_HOUR])
497 hour = (int)elm_spinner_value_get(obj);
498 if (popup_mod->time_12hr_fmt && popup_mod->is_pm)
500 if (hour != STRUCT_TM_TIME_12HRS_MAX_VALUE)
501 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
505 (popup_mod->set_time).tm_hour = hour;
506 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base,
507 &(popup_mod->set_time), &min_values, &max_values);
508 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE],
509 min_values.tm_min, max_values.tm_min);
510 (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(
511 popup_mod->popup_field[ELM_DATETIME_MINUTE]);
512 popup_mod->is_pm = (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : 1;
513 _set_ampm_value(popup_mod);
515 else if (obj == popup_mod->popup_field[ELM_DATETIME_MINUTE])
516 (popup_mod->set_time).tm_min = (int)elm_spinner_value_get(obj);
521 _ampm_clicked_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
523 Popup_Module_Data *popup_mod;
526 popup_mod = (Popup_Module_Data *)data;
527 if (!popup_mod || !popup_mod->time_12hr_fmt) return;
529 hour = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_HOUR]);
530 if (popup_mod->time_12hr_fmt && popup_mod->is_pm && (hour != STRUCT_TM_TIME_12HRS_MAX_VALUE))
531 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
533 if (hour > STRUCT_TM_TIME_12HRS_MAX_VALUE)
534 hour -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
535 else if (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
536 hour += STRUCT_TM_TIME_12HRS_MAX_VALUE;
539 if (popup_mod->is_pm) hour = 0;
540 else hour = STRUCT_TM_TIME_12HRS_MAX_VALUE;
543 (popup_mod->set_time).tm_hour = hour;
544 popup_mod->is_pm = (hour < STRUCT_TM_TIME_12HRS_MAX_VALUE) ? 0 : 1;
545 _set_ampm_value(popup_mod);
549 _text_insert(const char *text, char *input, int pos)
552 int text_len, input_len;
554 text_len = strlen(text);
555 input_len = strlen(input);
556 result = (char *)malloc(sizeof(char) * (text_len + input_len) + 1);
557 memset(result, 0, sizeof(char) * (text_len + input_len) + 1);
559 strncpy(result, text, pos);
560 strcpy(result + pos, input);
561 strcpy(result + pos + input_len, text + pos);
563 return (const char *)result;
567 _year_validity_checking_filter(void *data, Evas_Object *obj, char **text)
569 Popup_Module_Data *popup_mod;
571 const char *new_str = NULL;
572 int min, max, val = 0, len;
574 const char *curr_str;
577 EINA_SAFETY_ON_NULL_RETURN(text);
578 popup_mod = (Popup_Module_Data *)data;
579 if (!popup_mod) return;
582 len = strlen(elm_object_text_get(obj));
585 curr_str = elm_object_text_get(obj);
586 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
587 if (new_str) val = atoi(new_str);
589 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, ELM_DATETIME_YEAR, &min, &max);
590 min += STRUCT_TM_YEAR_BASE_VALUE;
591 max += STRUCT_TM_YEAR_BASE_VALUE;
595 elm_entry_entry_set(obj, new_str);
596 elm_entry_cursor_end_set(obj);
597 next_idx = _picker_nextfield_location_get(popup_mod, ELM_DATETIME_YEAR);
598 if (next_idx != ELM_DATETIME_LAST)
600 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_YEAR],
601 "elm,action,entry,toggle", "elm");
602 entry = elm_object_part_content_get(popup_mod->popup_field[next_idx],
603 "elm.swallow.entry");
604 if (!elm_object_focus_get(entry))
605 elm_layout_signal_emit(popup_mod->popup_field[next_idx],
606 "elm,action,entry,toggle", "elm");
611 free((void *)new_str);
616 _month_validity_checking_filter(void *data, Evas_Object *obj, char **text)
618 Popup_Module_Data *popup_mod;
620 const char *new_str = NULL;
622 int val = 0, len, max_digits;
624 const char *curr_str;
627 EINA_SAFETY_ON_NULL_RETURN(text);
628 popup_mod = (Popup_Module_Data *)data;
629 if (!popup_mod) return;
632 len = strlen(elm_object_text_get(obj));
633 curr_str = elm_object_text_get(obj);
634 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
635 if (new_str) val = atoi(new_str) - 1;
637 elm_spinner_min_max_get(popup_mod->popup_field[ELM_DATETIME_MONTH], &min, &max);
641 max_digits = (max >= 10 ? 2 : 1);
642 if (len < 1 && max_digits > 1 && val < 1) return;
644 if ((val >= min) && (val <= max))
646 elm_entry_entry_set(obj, new_str);
647 elm_entry_cursor_end_set(obj);
648 next_idx = _picker_nextfield_location_get(popup_mod, ELM_DATETIME_MONTH);
649 if (next_idx != DATETIME_FIELD_COUNT)
651 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MONTH],
652 "elm,action,entry,toggle", "elm");
653 entry = elm_object_part_content_get(popup_mod->popup_field[next_idx],
654 "elm.swallow.entry");
655 if (!elm_object_focus_get(entry))
656 elm_layout_signal_emit(popup_mod->popup_field[next_idx],
657 "elm,action,entry,toggle", "elm");
661 free((void *)new_str);
666 _hour_validity_checking_filter(void *data, Evas_Object *obj, char **text)
668 Popup_Module_Data *popup_mod;
670 const char *new_str = NULL;
673 const char *curr_str;
675 EINA_SAFETY_ON_NULL_RETURN(text);
677 popup_mod = (Popup_Module_Data *)data;
678 if (!popup_mod) return;
681 len = strlen(elm_object_text_get(obj));
684 curr_str = elm_object_text_get(obj);
685 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
686 if (new_str) val = atoi(new_str);
688 if (popup_mod->time_12hr_fmt && val > STRUCT_TM_TIME_12HRS_MAX_VALUE)
691 free((void *)new_str);
695 else if (!popup_mod->time_12hr_fmt && val > STRUCT_TM_TIME_24HRS_MAX_VALUE)
698 free((void *)new_str);
702 elm_entry_entry_set(obj, new_str);
703 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_HOUR],
704 "elm,action,entry,toggle", "elm");
706 entry = elm_object_part_content_get(popup_mod->popup_field[ELM_DATETIME_MINUTE],
707 "elm.swallow.entry");
708 if (!elm_object_focus_get(entry))
710 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_MINUTE],
711 "elm,action,entry,toggle", "elm");
714 free((void *)new_str);
719 _date_validity_checking_filter(void *data, Evas_Object *obj, char **text)
721 Popup_Module_Data *popup_mod;
723 const char *new_str = NULL;
725 const char *curr_str;
729 EINA_SAFETY_ON_NULL_RETURN(text);
730 popup_mod = (Popup_Module_Data *)data;
731 if (!popup_mod) return;
734 len = strlen(elm_object_text_get(obj));
737 curr_str = elm_object_text_get(obj);
738 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
739 if (new_str) val = atoi(new_str);
740 elm_spinner_min_max_get(popup_mod->popup_field[ELM_DATETIME_DATE], &min, &max);
742 if ((val >= min) && (val <= max))
744 elm_entry_entry_set(obj, new_str);
745 elm_entry_cursor_end_set(obj);
746 next_idx = _picker_nextfield_location_get(popup_mod, ELM_DATETIME_DATE);
747 if (next_idx != ELM_DATETIME_LAST)
749 elm_layout_signal_emit(popup_mod->popup_field[ELM_DATETIME_DATE],
750 "elm,action,entry,toggle", "elm");
751 entry = elm_object_part_content_get(popup_mod->popup_field[next_idx],
752 "elm.swallow.entry");
753 if (!elm_object_focus_get(entry))
754 elm_layout_signal_emit(popup_mod->popup_field[next_idx],
755 "elm,action,entry,toggle", "elm");
759 free((void *)new_str);
764 _minute_validity_checking_filter(void *data, Evas_Object *obj, char **text)
766 Popup_Module_Data *popup_mod;
767 const char *new_str = NULL;
768 int min, max, val = 0, len;
770 const char *curr_str;
772 EINA_SAFETY_ON_NULL_RETURN(text);
773 popup_mod = (Popup_Module_Data *)data;
774 if (!popup_mod) return;
777 len = strlen(elm_object_text_get(obj));
780 curr_str = elm_object_text_get(obj);
781 if (curr_str) new_str = _text_insert(curr_str, insert, elm_entry_cursor_pos_get(obj));
782 if (new_str) val = atoi(new_str);
784 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, ELM_DATETIME_MINUTE, &min, &max);
786 if ((val >= min) && (val <= max))
788 elm_entry_entry_set(obj, new_str);
789 elm_entry_cursor_end_set(obj);
792 free((void *)new_str);
797 _set_datepicker_entry_filter(Popup_Module_Data *popup_mod)
799 Evas_Object *spinner, *entry;
800 static Elm_Entry_Filter_Accept_Set digits_filter_data;
801 static Elm_Entry_Filter_Limit_Size limit_filter_data;
805 if (!popup_mod) return;
807 digits_filter_data.accepted = "0123456789";
808 digits_filter_data.rejected = NULL;
810 limit_filter_data.max_byte_count = 0;
812 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
814 spinner = popup_mod->popup_field[idx];
815 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
816 if (!entry) continue;
818 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
819 elm_object_style_set(entry, buf);
820 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
821 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
823 if (idx == ELM_DATETIME_MONTH)
825 value = (int)elm_spinner_value_get(popup_mod->popup_field[ELM_DATETIME_MONTH]) - 1;
826 elm_object_text_set(entry, month_arr[value]);
829 elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &digits_filter_data);
831 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_DATETIME);
833 if (idx == ELM_DATETIME_YEAR)
834 limit_filter_data.max_char_count = 4;
836 limit_filter_data.max_char_count = 2;
838 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
840 evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, popup_mod);
841 evas_object_smart_callback_add(entry, "unfocused", _entry_unfocused_cb, popup_mod);
842 evas_object_smart_callback_add(entry, "activated", _entry_activated_cb, popup_mod);
843 evas_object_smart_callback_add(entry, "clicked", _entry_clicked_cb, popup_mod);
845 if (idx == ELM_DATETIME_YEAR)
846 elm_entry_markup_filter_append(entry, _year_validity_checking_filter, popup_mod);
847 else if (idx == ELM_DATETIME_MONTH)
848 elm_entry_markup_filter_append(entry, _month_validity_checking_filter, popup_mod);
849 else if (idx == ELM_DATETIME_DATE)
850 elm_entry_markup_filter_append(entry, _date_validity_checking_filter, popup_mod);
855 _set_timepicker_entry_filter(Popup_Module_Data *popup_mod)
857 Evas_Object *spinner, *entry;
858 static Elm_Entry_Filter_Accept_Set digits_filter_data;
859 static Elm_Entry_Filter_Limit_Size limit_filter_data;
863 if (!popup_mod) return;
865 digits_filter_data.accepted = "0123456789";
866 digits_filter_data.rejected = NULL;
868 limit_filter_data.max_byte_count = 0;
870 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
872 spinner = popup_mod->popup_field[idx];
873 entry = elm_object_part_content_get(spinner, "elm.swallow.entry");
874 if (!entry) continue;
876 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
877 elm_object_style_set(entry, buf);
878 elm_entry_magnifier_disabled_set(entry, EINA_TRUE);
879 elm_entry_context_menu_disabled_set(entry, EINA_TRUE);
880 elm_entry_input_panel_layout_set(entry, ELM_INPUT_PANEL_LAYOUT_DATETIME);
881 elm_entry_markup_filter_append(entry, elm_entry_filter_accept_set, &digits_filter_data);
883 limit_filter_data.max_char_count = 2;
884 elm_entry_markup_filter_append(entry, elm_entry_filter_limit_size, &limit_filter_data);
886 evas_object_smart_callback_add(entry, "focused", _entry_focused_cb, popup_mod);
887 evas_object_smart_callback_add(entry, "unfocused", _entry_unfocused_cb, popup_mod);
888 evas_object_smart_callback_add(entry, "activated", _entry_activated_cb, popup_mod);
889 evas_object_smart_callback_add(entry, "clicked", _entry_clicked_cb, popup_mod);
891 if (idx == ELM_DATETIME_HOUR)
892 elm_entry_markup_filter_append(entry, _hour_validity_checking_filter, popup_mod);
893 else if (idx == ELM_DATETIME_MINUTE)
894 elm_entry_markup_filter_append(entry, _minute_validity_checking_filter, popup_mod);
899 _show_datepicker_layout(Popup_Module_Data *popup_mod)
901 Evas_Object *content;
903 int idx, year, month, min, max;
904 Elm_Datetime_Field_Type field_type = ELM_DATETIME_YEAR;
906 if (!popup_mod || !popup_mod->mod_data.base) return;
908 content = elm_object_content_get(popup_mod->popup);
909 if (content != popup_mod->datepicker_layout)
911 elm_object_content_unset(popup_mod->popup);
912 if (content) evas_object_hide(content);
913 elm_object_content_set(popup_mod->popup, popup_mod->datepicker_layout);
914 evas_object_show(popup_mod->datepicker_layout);
916 elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
917 _set_datepicker_popup_title_text(popup_mod);
919 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
920 year = curr_time.tm_year + STRUCT_TM_YEAR_BASE_VALUE;
921 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_YEAR], year);
922 month = curr_time.tm_mon + 1;
923 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_MONTH], month);
924 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_DATE], curr_time.tm_mday);
926 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
928 field_type = (Elm_Datetime_Field_Type)idx;
929 popup_mod->mod_data.field_limit_get(popup_mod->mod_data.base, field_type, &min, &max);
930 if (idx == ELM_DATETIME_YEAR)
931 elm_spinner_min_max_set(popup_mod->popup_field[idx], (STRUCT_TM_YEAR_BASE_VALUE + min), (STRUCT_TM_YEAR_BASE_VALUE + max));
932 else if (idx == ELM_DATETIME_MONTH)
933 elm_spinner_min_max_set(popup_mod->popup_field[idx], (1+min), (1+max));
935 elm_spinner_min_max_set(popup_mod->popup_field[idx], min, max);
940 _show_timepicker_layout(Popup_Module_Data *popup_mod)
942 Evas_Object *content;
943 struct tm curr_time, min_time, max_time;
944 int hour, hour_min, hour_max;
946 if (!popup_mod || !popup_mod->mod_data.base) return;
948 content = elm_object_content_get(popup_mod->popup);
949 if (content != popup_mod->timepicker_layout)
951 elm_object_content_unset(popup_mod->popup);
952 if (content) evas_object_hide(content);
953 elm_object_content_set(popup_mod->popup, popup_mod->timepicker_layout);
954 evas_object_show(popup_mod->timepicker_layout);
956 elm_datetime_value_get(popup_mod->mod_data.base, &(popup_mod->set_time));
957 _set_timepicker_popup_title_text(popup_mod);
959 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
960 hour = curr_time.tm_hour;
961 if (popup_mod->time_12hr_fmt)
963 if (hour >= STRUCT_TM_TIME_12HRS_MAX_VALUE)
964 popup_mod->is_pm = EINA_TRUE;
966 popup_mod->is_pm = EINA_FALSE;
967 if (hour >= STRUCT_TM_TIME_12HRS_MAX_VALUE)
968 hour -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
969 hour = (hour == 0) ? STRUCT_TM_TIME_12HRS_MAX_VALUE : hour;
972 popup_mod->mod_data.fields_min_max_get(popup_mod->mod_data.base, &curr_time, &min_time, &max_time);
973 hour_min = min_time.tm_hour;
974 hour_max = max_time.tm_hour;
975 if (popup_mod->time_12hr_fmt)
977 if (hour_min < 1) hour_min = 1;
978 else if (hour_min > STRUCT_TM_TIME_12HRS_MAX_VALUE)
979 hour_min -= STRUCT_TM_TIME_12HRS_MAX_VALUE;
980 if (hour_max > STRUCT_TM_TIME_12HRS_MAX_VALUE)
981 hour_max = STRUCT_TM_TIME_12HRS_MAX_VALUE;
983 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour_min, hour_max);
984 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE],
985 min_time.tm_min, max_time.tm_min);
987 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_HOUR], hour);
988 elm_spinner_value_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], curr_time.tm_min);
989 if (popup_mod->time_12hr_fmt)
990 _set_ampm_value(popup_mod);
994 _set_month_special_values(Popup_Module_Data *popup_mod)
997 const char *fmt = NULL;
1000 if (!popup_mod) return;
1002 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
1003 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base, ELM_DATETIME_MONTH);
1004 for (month = 0; month < TOTAL_NUMBER_OF_MONTHS; month++)
1006 curr_time.tm_mon = month;
1007 strftime(month_arr[month], MONTH_STRING_MAX_SIZE, fmt, &curr_time);
1009 for (month = 0; month < 12; month++)
1010 elm_spinner_special_value_add(popup_mod->popup_field[ELM_DATETIME_MONTH],
1011 month + 1, month_arr[month]);
1015 _create_datetime_popup(Popup_Module_Data *popup_mod)
1017 Evas_Object *set_btn, *cancel_btn;
1018 Evas_Object *parent, *widget, *conformant = NULL;
1019 const char *widget_type;
1021 if (!popup_mod) return;
1023 // add popup to the content of elm_conformant
1024 widget = popup_mod->mod_data.base;
1025 while(widget != NULL)
1027 parent = elm_widget_parent_get(widget);
1028 widget_type = elm_widget_type_get(widget);
1029 if (!strcmp(widget_type, "elm_conformant"))
1031 conformant = widget;
1037 popup_mod->popup = elm_popup_add(elm_object_content_get(conformant));
1039 popup_mod->popup = elm_popup_add(elm_widget_top_get(popup_mod->mod_data.base));
1041 evas_object_size_hint_weight_set(popup_mod->popup, EVAS_HINT_EXPAND,
1043 evas_object_size_hint_align_set(popup_mod->popup, EVAS_HINT_FILL, 0.5);
1045 cancel_btn = elm_button_add(popup_mod->popup);
1046 elm_object_style_set(cancel_btn, "popup_button/default");
1047 elm_object_domain_translatable_text_set(cancel_btn, PACKAGE, E_("Cancel"));
1048 elm_object_part_content_set(popup_mod->popup, "button1", cancel_btn);
1049 evas_object_smart_callback_add(cancel_btn, "clicked", _popup_cancel_btn_clicked_cb, popup_mod);
1051 set_btn = elm_button_add(popup_mod->popup);
1052 elm_object_style_set(set_btn, "popup_button/default");
1053 elm_object_domain_translatable_text_set(set_btn, PACKAGE, E_("Set"));
1054 elm_object_part_content_set(popup_mod->popup, "button2", set_btn);
1055 evas_object_smart_callback_add(set_btn, "clicked", _popup_set_btn_clicked_cb, popup_mod);
1059 _create_datepicker_layout(Popup_Module_Data *popup_mod)
1061 Evas_Object *spinner;
1062 char buf[BUFF_SIZE];
1065 if (!popup_mod || !popup_mod->popup) return;
1067 popup_mod->datepicker_layout = elm_layout_add(popup_mod->popup);
1068 elm_layout_theme_set(popup_mod->datepicker_layout, "layout", "datetime_popup", "date_layout");
1070 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1072 spinner = elm_spinner_add(popup_mod->popup);
1073 elm_spinner_editable_set(spinner, EINA_TRUE);
1074 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
1075 elm_object_style_set(spinner, buf);
1076 elm_spinner_step_set(spinner, 1);
1077 elm_spinner_wrap_set(spinner, EINA_TRUE);
1078 elm_spinner_label_format_set(spinner, "%02.0f");
1079 snprintf(buf, sizeof(buf), "field%d", idx);
1080 elm_object_part_content_set(popup_mod->datepicker_layout, buf, spinner);
1082 if (idx == ELM_DATETIME_YEAR)
1083 elm_spinner_min_max_set(spinner, 1902, 2037);
1084 else if (idx == ELM_DATETIME_MONTH)
1085 elm_spinner_min_max_set(spinner, 1, 12);
1086 else if (idx == ELM_DATETIME_DATE)
1087 elm_spinner_min_max_set(spinner, 1, 31);
1089 evas_object_smart_callback_add(spinner, "changed", _datepicker_value_changed_cb, popup_mod);
1090 popup_mod->popup_field[idx] = spinner;
1093 _set_month_special_values(popup_mod);
1094 _set_datepicker_entry_filter(popup_mod);
1098 _create_timepicker_layout(Popup_Module_Data *popup_mod)
1100 Evas_Object *spinner, *ampm;
1101 char buf[BUFF_SIZE];
1104 if (!popup_mod || !popup_mod->popup) return;
1106 popup_mod->timepicker_layout = elm_layout_add(popup_mod->popup);
1107 popup_mod->time_12hr_fmt = popup_mod->mod_data.field_location_get(popup_mod->mod_data.base, ELM_DATETIME_AMPM, NULL);
1109 if (popup_mod->time_12hr_fmt)
1110 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout");
1112 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout_24hr");
1114 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
1116 spinner = elm_spinner_add(popup_mod->popup);
1117 elm_spinner_editable_set(spinner, EINA_TRUE);
1118 snprintf(buf, sizeof(buf), "datetime_popup/%s", field_styles[idx]);
1119 elm_object_style_set(spinner, buf);
1120 elm_spinner_step_set(spinner, 1);
1121 elm_spinner_wrap_set(spinner, EINA_TRUE);
1122 elm_spinner_label_format_set(spinner, "%02.0f");
1123 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1124 elm_object_part_content_set(popup_mod->timepicker_layout, buf, spinner);
1125 evas_object_smart_callback_add(spinner, "changed", _timepicker_value_changed_cb, popup_mod);
1126 popup_mod->popup_field[idx] = spinner;
1129 ampm = elm_entry_add(popup_mod->popup);
1130 elm_entry_single_line_set(ampm, EINA_TRUE);
1131 elm_entry_editable_set(ampm, EINA_FALSE);
1132 elm_entry_magnifier_disabled_set(ampm, EINA_TRUE);
1133 elm_entry_context_menu_disabled_set(ampm, EINA_TRUE);
1134 elm_object_style_set(ampm, "datetime_popup/ampm");
1135 evas_object_smart_callback_add(ampm, "clicked", _ampm_clicked_cb, popup_mod);
1136 elm_object_part_content_set(popup_mod->timepicker_layout, "field2",ampm);
1137 popup_mod->popup_field[ELM_DATETIME_AMPM] = ampm;
1139 if (!popup_mod->time_12hr_fmt)
1140 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], 0, 23);
1142 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_HOUR], 1, 12);
1143 elm_spinner_min_max_set(popup_mod->popup_field[ELM_DATETIME_MINUTE], 0, 59);
1145 _set_timepicker_entry_filter(popup_mod);
1149 _weekday_loc_update(Popup_Module_Data *popup_mod)
1153 if (!popup_mod) return;
1155 fmt = nl_langinfo(D_T_FMT);
1156 if (!strncmp(fmt, "%a", 2) || !strncmp(fmt, "%A", 2))
1157 popup_mod->weekday_loc_first = EINA_TRUE;
1159 popup_mod->weekday_loc_first = EINA_FALSE;
1163 _module_format_change(Popup_Module_Data *popup_mod)
1165 Evas_Object *spinner_field[PICKER_POPUP_FIELD_COUNT];
1166 Evas_Object *datetime, *spinner;
1167 int field_loc[PICKER_POPUP_FIELD_COUNT];
1168 char buf[BUFF_SIZE];
1169 int idx, loc, prev_loc;
1170 Eina_Bool datepicker_bg_show = EINA_FALSE;
1171 Eina_Bool timepicker_bg_show = EINA_FALSE;
1172 Eina_Bool time_12hr;
1174 if (!popup_mod) return;
1176 datetime = popup_mod->mod_data.base;
1177 if (popup_mod->datepicker_layout)
1179 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1181 popup_mod->mod_data.field_location_get(datetime, idx, &loc);
1182 prev_loc = _picker_field_location_get(popup_mod, idx);
1183 snprintf(buf, sizeof(buf), "field%d", prev_loc);
1184 spinner_field[idx] = elm_object_part_content_unset(popup_mod->datepicker_layout, buf);
1185 field_loc[idx] = loc;
1187 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1189 snprintf(buf, sizeof(buf), "field%d", field_loc[idx]);
1190 elm_object_part_content_set(popup_mod->datepicker_layout, buf, spinner_field[idx]);
1191 popup_mod->field_location[idx] = field_loc[idx];
1194 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1195 datepicker_bg_show |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
1196 if (!datepicker_bg_show)
1197 elm_layout_signal_emit(datetime, "datetime,datepicker,bg,hide", "elm");
1199 for (idx = ELM_DATETIME_HOUR; idx < ELM_DATETIME_AMPM; idx++)
1200 timepicker_bg_show |= popup_mod->mod_data.field_location_get(datetime, idx, NULL);
1201 if (!timepicker_bg_show)
1202 elm_layout_signal_emit(datetime, "datetime,timepicker,bg,hide", "elm");
1204 time_12hr = popup_mod->mod_data.field_location_get(datetime, ELM_DATETIME_AMPM, NULL);
1205 if ((popup_mod->time_12hr_fmt != time_12hr) && (popup_mod->timepicker_layout))
1207 for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
1209 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1210 spinner = elm_object_part_content_unset(popup_mod->timepicker_layout, buf);
1211 if (spinner) evas_object_hide(spinner);
1215 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout");
1216 for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
1218 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1219 elm_object_part_content_set(popup_mod->timepicker_layout, buf, popup_mod->popup_field[idx]);
1224 elm_layout_theme_set(popup_mod->timepicker_layout, "layout", "datetime_popup", "time_layout_24hr");
1225 for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_MINUTE; idx++)
1227 snprintf(buf, sizeof(buf), "field%d", (idx - ELM_DATETIME_HOUR));
1228 elm_object_part_content_set(popup_mod->timepicker_layout, buf, popup_mod->popup_field[idx]);
1232 popup_mod->time_12hr_fmt = time_12hr;
1233 _weekday_loc_update(popup_mod);
1237 _datepicker_show_cb(void *data,
1239 const char *emission __UNUSED__,
1240 const char *source __UNUSED__)
1242 Popup_Module_Data *popup_mod;
1244 popup_mod = (Popup_Module_Data *)data;
1245 if (!popup_mod) return;
1247 if (!popup_mod->popup)
1248 _create_datetime_popup(popup_mod);
1250 if (!popup_mod->datepicker_layout)
1251 _create_datepicker_layout(popup_mod);
1253 _show_datepicker_layout(popup_mod);
1254 evas_object_show(popup_mod->popup);
1255 evas_object_smart_callback_call(obj, SIG_EDIT_START, NULL);
1259 _timepicker_show_cb(void *data,
1261 const char *emission __UNUSED__,
1262 const char *source __UNUSED__)
1264 Popup_Module_Data *popup_mod;
1266 popup_mod = (Popup_Module_Data *)data;
1267 if (!popup_mod) return;
1269 if (!popup_mod->popup)
1270 _create_datetime_popup(popup_mod);
1272 if (!popup_mod->timepicker_layout)
1273 _create_timepicker_layout(popup_mod);
1275 _show_timepicker_layout(popup_mod);
1276 evas_object_show(popup_mod->popup);
1277 evas_object_smart_callback_call(obj, SIG_EDIT_START, NULL);
1281 _module_language_changed_cb(void *data,
1282 Evas_Object *obj __UNUSED__,
1283 void *event_info __UNUSED__)
1285 Popup_Module_Data *popup_mod;
1286 Evas_Object *content;
1287 popup_mod = (Popup_Module_Data *)data;
1288 if (!popup_mod || !popup_mod->popup) return;
1290 content = elm_object_content_get(popup_mod->popup);
1291 if (content == popup_mod->datepicker_layout)
1292 _set_datepicker_popup_title_text(popup_mod);
1293 else if (content == popup_mod->timepicker_layout)
1294 _set_timepicker_popup_title_text(popup_mod);
1296 _set_month_special_values(popup_mod);
1297 _set_ampm_value(popup_mod);
1301 _weekday_show_cb(void *data,
1302 Evas_Object *obj __UNUSED__,
1303 const char *emission __UNUSED__,
1304 const char *source __UNUSED__)
1306 Popup_Module_Data *popup_mod;
1307 int idx, loc, weekday_loc;
1309 popup_mod = (Popup_Module_Data *)data;
1310 if (!popup_mod) return;
1312 popup_mod->weekday_show = EINA_TRUE;
1314 weekday_loc = (popup_mod->weekday_loc_first) ? 0 : 2;
1315 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1317 popup_mod->mod_data.field_location_get(popup_mod->mod_data.base, idx, &loc);
1318 if (loc == weekday_loc)
1320 field_value_display((Elm_Datetime_Module_Data *)popup_mod,
1321 popup_mod->datetime_field[idx]);
1328 _weekday_hide_cb(void *data,
1329 Evas_Object *obj __UNUSED__,
1330 const char *emission __UNUSED__,
1331 const char *source __UNUSED__)
1333 Popup_Module_Data *popup_mod;
1334 int idx, loc, weekday_loc;
1336 popup_mod = (Popup_Module_Data *)data;
1337 if (!popup_mod) return;
1339 popup_mod->weekday_show = EINA_FALSE;
1340 weekday_loc = (popup_mod->weekday_loc_first) ? 0 : 2;
1341 for (idx = 0; idx <= ELM_DATETIME_DATE; idx++)
1343 popup_mod->mod_data.field_location_get(popup_mod->mod_data.base, idx, &loc);
1344 if (loc == weekday_loc)
1346 field_value_display((Elm_Datetime_Module_Data *)popup_mod,
1347 popup_mod->datetime_field[idx]);
1354 _access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
1356 const char* type = NULL;
1360 case ELM_DATETIME_YEAR:
1361 type = "datetime field, year";
1364 case ELM_DATETIME_MONTH:
1365 type = "datetime field, month";
1368 case ELM_DATETIME_DATE:
1369 type = "datetime field, date";
1372 case ELM_DATETIME_HOUR:
1373 type = "datetime field, hour";
1376 case ELM_DATETIME_MINUTE:
1377 type = "datetime field, minute";
1380 case ELM_DATETIME_AMPM:
1381 type = "datetime field, AM PM";
1388 _elm_access_text_set
1389 (_elm_access_object_get(obj), ELM_ACCESS_TYPE, type);
1390 _elm_access_callback_set
1391 (_elm_access_object_get(obj), ELM_ACCESS_STATE, NULL, NULL);
1394 // module functions for the specific module type
1396 field_value_display(Elm_Datetime_Module_Data *module_data, Evas_Object *obj)
1398 Popup_Module_Data *popup_mod;
1399 Elm_Datetime_Field_Type field_type;
1400 struct tm curr_time;
1401 char buf[BUFF_SIZE] = {0,};
1402 char weekday[BUFF_SIZE], label[BUFF_SIZE];
1403 int loc, weekday_loc;
1405 Eina_Bool is_weekday_shown;
1407 popup_mod = (Popup_Module_Data *)module_data;
1408 if (!popup_mod || !obj) return;
1410 elm_datetime_value_get(popup_mod->mod_data.base, &curr_time);
1411 field_type = (Elm_Datetime_Field_Type )evas_object_data_get(obj, "_field_type");
1412 fmt = popup_mod->mod_data.field_format_get(popup_mod->mod_data.base, field_type);
1413 strftime(buf, sizeof(buf), fmt, &curr_time);
1415 if ((!buf[0]) && ((!strcmp(fmt, "%p")) || (!strcmp(fmt, "%P"))))
1417 if (curr_time.tm_hour < STRUCT_TM_TIME_12HRS_MAX_VALUE)
1418 elm_object_domain_translatable_text_set(obj, PACKAGE, E_("AM"));
1420 elm_object_domain_translatable_text_set(obj, PACKAGE, E_("PM"));
1422 else if (!popup_mod->weekday_show)
1423 elm_object_text_set(obj, buf);
1426 /* FIXME: To restrict month wrapping because of summer time in some locales,
1427 * ignore day light saving mode in mktime(). */
1428 curr_time.tm_isdst = -1;
1430 strftime(weekday, sizeof(weekday), "%a", &curr_time);
1431 weekday_loc = (popup_mod->weekday_loc_first) ? 0 : 2;
1432 is_weekday_shown = popup_mod->mod_data.field_location_get(
1433 popup_mod->mod_data.base, field_type, &loc);
1434 if (!is_weekday_shown || (loc != weekday_loc))
1435 elm_object_text_set(obj, buf);
1438 snprintf(label, sizeof(label), "%s %s", weekday, buf);
1439 elm_object_text_set(obj, label);
1443 snprintf(label, sizeof(label), "%s %s", buf, weekday);
1444 elm_object_text_set(obj, label);
1450 field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type field_type)
1452 Popup_Module_Data *popup_mod;
1453 Evas_Object *field_obj;
1454 char buf[BUFF_SIZE];
1456 popup_mod = (Popup_Module_Data *)module_data;
1457 if (!popup_mod) return NULL;
1459 field_obj = elm_label_add(popup_mod->mod_data.base);
1460 snprintf(buf, sizeof(buf), "datetime/%s/default", field_styles[field_type]);
1461 elm_object_style_set(field_obj, buf);
1462 evas_object_data_set(field_obj, "_field_type", (void *)field_type);
1463 popup_mod->datetime_field[field_type] = field_obj;
1465 _access_set(field_obj, field_type);
1470 EAPI Elm_Datetime_Module_Data *
1471 obj_hook(Evas_Object *obj)
1473 Popup_Module_Data *popup_mod;
1475 popup_mod = ELM_NEW(Popup_Module_Data);
1476 if (!popup_mod) return NULL;
1478 elm_object_signal_callback_add(obj, "datepicker,show", "",
1479 _datepicker_show_cb, popup_mod);
1480 elm_object_signal_callback_add(obj, "timepicker,show", "",
1481 _timepicker_show_cb, popup_mod);
1482 elm_object_signal_callback_add(obj, "picker,hide", "",
1483 _picker_hide_cb, popup_mod);
1484 elm_object_signal_callback_add(obj, "language,changed", "",
1485 _module_language_changed_cb, popup_mod);
1486 elm_object_signal_callback_add(obj, "elm,action,press", "*",
1487 _datetime_press_cb, popup_mod);
1488 elm_object_signal_callback_add(obj, "elm,action,unpress", "*",
1489 _datetime_unpress_cb, popup_mod);
1490 elm_object_signal_callback_add(obj, "weekday,show", "",
1491 _weekday_show_cb, popup_mod);
1492 elm_object_signal_callback_add(obj, "weekday,hide", "",
1493 _weekday_hide_cb, popup_mod);
1495 popup_mod->popup = NULL;
1496 popup_mod->datepicker_layout = NULL;
1497 popup_mod->timepicker_layout = NULL;
1498 popup_mod->weekday_show = EINA_FALSE;
1499 popup_mod->weekday_loc_first = EINA_TRUE;
1501 return ((Elm_Datetime_Module_Data*)popup_mod);
1505 obj_unhook(Elm_Datetime_Module_Data *module_data)
1507 Popup_Module_Data *popup_mod;
1509 popup_mod = (Popup_Module_Data *)module_data;
1510 if (!popup_mod) return;
1512 if (popup_mod->popup)
1513 evas_object_del(popup_mod->popup);
1523 obj_format_hook(Elm_Datetime_Module_Data *module_data)
1525 Popup_Module_Data *popup_mod;
1527 popup_mod = (Popup_Module_Data *)module_data;
1528 if (!popup_mod) return;
1530 _module_format_change(popup_mod);
1534 obj_theme_hook(Elm_Datetime_Module_Data *module_data)
1536 Popup_Module_Data *popup_mod;
1538 popup_mod = (Popup_Module_Data *)module_data;
1539 if (!popup_mod) return;
1541 // TODO: function can be improved to provide different popup styles.
1545 obj_focus_hook(Elm_Datetime_Module_Data *module_data __UNUSED__)
1547 // TODO: Default focus - enhance this func. for obj_show/obj_hide like below
1549 Popup_Module_Data *popup_mod;
1551 Eina_Bool is_focused = EINA_FALSE; //init with i/p argument
1553 popup_mod = (Popup_Module_Data *)module_data;
1554 if (!popup_mod || popup_mod->popup) return;
1556 for (idx = 0; idx < DATETIME_FIELD_COUNT; idx++)
1557 if (elm_object_focus_get(popup_mod->popup_field[idx]))
1558 is_focused = EINA_TRUE;
1561 evas_object_show(popup_mod->popup);
1563 evas_object_hide(popup_mod->popup);
1567 // module api funcs needed
1569 elm_modapi_init(void *m __UNUSED__)
1571 return 1; // succeed always
1575 elm_modapi_shutdown(void *m __UNUSED__)
1577 return 1; // succeed always