1 // Copyright 2014 Samsung Electronics. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "InputPicker.h"
7 #include "base/path_service.h"
8 #include "base/files/file_path.h"
9 #include "base/logging.h"
10 #include "base/time/time.h"
11 #include "common/web_contents_utils.h"
12 #include "content/common/paths_efl.h"
13 #include "content/public/browser/web_contents.h"
14 #include "eweb_view.h"
20 #include <Elementary.h>
22 #include <vconf/vconf.h>
24 #include <efl_extension.h>
25 extern void* EflExtensionHandle;
30 static const unsigned maxDatetimeLength = 32;
31 static const unsigned maxDateStringLength = 10;
32 static const char defaultDatetimeFormat[] = "%Y/%m/%d %H:%M";
34 struct InputPicker::Layout {
35 Layout(Evas_Object *ewkView)
37 , parent(elm_object_top_widget_get(elm_object_parent_widget_get(ewk_view_)))
44 , dataListEditField(0)
48 , datetime_local(false) {
49 evas_object_focus_set(ewk_view_, false);
51 /* FIXME : Workaround. OSP requirement.
52 OSP want to block own touch event while webkit internal picker is running. */
53 evas_object_smart_callback_call(ewk_view_, "input,picker,show", 0);
56 bool BuildColorSelector();
57 bool CreateColorSelector();
58 bool CreateOKButton();
59 void SetPopupSize(int width, int height);
61 base::FilePath GetLayoutFilePath() {
62 base::FilePath edj_dir;
63 base::FilePath control_edj;
64 PathService::Get(PathsEfl::EDJE_RESOURCE_DIR, &edj_dir);
65 control_edj = edj_dir.Append(FILE_PATH_LITERAL("control.edj"));
70 /* FIXME : Workaround. OSP requirement.
71 OSP want to block own touch event while webkit internal picker is running. */
72 evas_object_smart_callback_call(ewk_view_, "input,picker,hide", 0);
74 evas_object_focus_set(ewk_view_, true);
77 Evas_Object* ewk_view_;
81 Evas_Object* datePicker;
82 Evas_Object* time_picker;
83 Evas_Object* color_picker;
84 Evas_Object* color_rect;
85 Evas_Object* okButton;
86 Evas_Object* dataListEditField;
93 bool InputPicker::Layout::BuildColorSelector() {
94 /* add color palette widget */
95 color_picker = elm_colorselector_add(layout);
99 elm_colorselector_mode_set(color_picker, ELM_COLORSELECTOR_PALETTE);
100 evas_object_size_hint_fill_set(color_picker, EVAS_HINT_FILL, EVAS_HINT_FILL);
101 evas_object_size_hint_weight_set(color_picker, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
103 #if defined(OS_TIZEN_TV)
104 elm_colorselector_color_set(color_picker, initial_r, initial_g, initial_b, 255);
106 Eina_List* color_list = const_cast<Eina_List*>
107 (elm_colorselector_palette_items_get(color_picker));
114 Elm_Object_Item* it = NULL;
116 EINA_LIST_FOREACH(color_list, list, item) {
118 elm_colorselector_palette_item_color_get((Elm_Object_Item*)item, &r, &g, &b, &a);
119 if (r == initial_r && g == initial_g && b == initial_b) {
120 it = (Elm_Object_Item*)item;
127 it = (Elm_Object_Item*)eina_list_nth(color_list, 0);
129 elm_object_item_signal_emit((Elm_Object_Item*)it, "elm,state,selected", "elm");
132 elm_object_part_content_set(layout, "colorpalette", color_picker);
136 bool InputPicker::Layout::CreateOKButton() {
137 okButton = elm_button_add(popup);
141 elm_object_style_set(okButton, "popup");
142 elm_object_text_set(okButton, "OK");
143 elm_object_part_content_set(popup, "button1", okButton);
144 evas_object_focus_set(okButton, true);
148 void InputPicker::Layout::SetPopupSize(int width, int height) {
150 evas_object_resize(popup, width, height);
151 evas_object_move(popup, 0, 0);
155 bool InputPicker::Layout::CreateColorSelector() {
156 popup = elm_popup_add(parent);
160 elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
161 elm_object_part_text_set(popup, "title,text", "Select color");
162 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
164 base::FilePath control_edj = GetLayoutFilePath();
166 layout = elm_layout_add(popup);
170 elm_layout_file_set(layout, control_edj.AsUTF8Unsafe().c_str(),
171 "colorselector_popup_layout");
172 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
173 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
175 color_rect = evas_object_rectangle_add(evas_object_evas_get(layout));
178 evas_object_size_hint_weight_set(color_rect,
179 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
180 evas_object_show(color_rect);
181 evas_object_color_set(color_rect, initial_r, initial_g, initial_b, 255);
182 elm_object_part_content_set(layout, "rect", color_rect);
185 BuildColorSelector();
187 evas_object_show(layout);
188 elm_object_content_set(popup, layout);
189 return CreateOKButton();
192 struct ColorPopupUserData {
193 InputPicker* inputPicker;
194 Evas_Object* colorRect;
196 Evas_Object* colorAccessObject;
208 struct Input_Date_Str {
209 char year[maxDateStringLength];
210 char mon[maxDateStringLength];
211 char day[maxDateStringLength];
212 char hour[maxDateStringLength];
213 char min[maxDateStringLength];
214 char sec[maxDateStringLength];
217 static char* datetimeFormat() {
218 #if defined(OS_TIZEN)
219 char* datetimeFormat = NULL;
220 char* regionFormat = NULL;
221 char* language = NULL;
222 char buf[256] = { 0, };
227 language = getenv("LANGUAGE");
228 setenv("LANGUAGE", "en_US", 1);
230 regionFormat = vconf_get_str(VCONFKEY_REGIONFORMAT);
234 returnValue = vconf_get_int(VCONFKEY_REGIONFORMAT_TIME1224, &timeValue);
237 else if (timeValue == VCONFKEY_TIME_FORMAT_12 ||
238 timeValue == VCONFKEY_TIME_FORMAT_24)
239 isHour24 = timeValue - 1;
242 snprintf(buf, sizeof(buf), "%s_DTFMT_24HR", regionFormat);
244 snprintf(buf, sizeof(buf), "%s_DTFMT_12HR", regionFormat);
248 // FIXME: Workaround fix for region format.
249 int bufLength = strlen(buf);
250 for (int i = 0; i < bufLength - 4; i++) {
251 if (buf[i] == 'u' && buf[i + 1] == 't' && buf[i + 2] == 'f') {
252 if (buf[i + 3] == '8') {
254 for (int j = bufLength; j > i + 3; j--)
257 buf[bufLength + 1] = '\0';
258 } else if (buf[i + 3] == '-' && buf[i + 4] == '8') {
271 datetimeFormat = dgettext("dt_fmt", buf);
273 if(!language || !strcmp(language, ""))
274 unsetenv("LANGUAGE");
276 setenv("LANGUAGE", language, 1);
278 // FIXME: Workaround fix for not supported dt_fmt.
279 // Use default format if dt_fmt string is not exist.
280 if (strlen(datetimeFormat) == strlen(buf) &&
281 !strncmp(datetimeFormat, buf, strlen(buf))) {
285 return strdup(datetimeFormat);
291 InputPicker::InputPicker(EWebView& web_view_)
292 : web_view_(web_view_)
293 , ewk_view_(web_view_.evas_object())
298 InputPicker::~InputPicker() {
299 if (picker_layout_) {
300 if (picker_layout_->popup)
301 evas_object_del(picker_layout_->popup);
302 delete picker_layout_;
306 void InputPicker::SetPopupSize(int width, int height) {
308 picker_layout_->SetPopupSize(width, height);
311 #if defined(OS_TIZEN_MOBILE)
312 void InputPicker::endEditingCallback(
313 void* data, Evas_Object* obj, void* event_info)
315 InputPicker* inputPicker = static_cast<InputPicker*>(data);
317 inputPicker->removeDatetimePickerDelayed();
321 void InputPicker::showDatePicker(ui::TextInputType input_type, double input_date)
323 web_view_.ExecuteEditCommand("Unselect", 0);
327 struct tm* currentTime;
329 if (!std::isfinite(input_date)) {
331 currentTime = localtime(&timep);
332 } else if (input_type == ui::TEXT_INPUT_TYPE_MONTH) {
333 // when type is month, input_date is number of month since epoch
334 unsigned int year = floor(input_date / 12.0) + 1970.0;
335 unsigned int month = input_date - (year - 1970) * 12 + 1;
339 snprintf(date, 12, "%d-%d", year, month);
341 char* last_char = strptime(date, "%Y-%m", &tm);
346 // in all other cases, input_date is number of milliseconds since epoch
347 base::Time doubleT = base::Time::FromDoubleT(input_date/1000);
348 timep = doubleT.ToTimeT();
349 currentTime = gmtime(&timep);
352 switch (input_type) {
353 case ui::TEXT_INPUT_TYPE_DATE:
354 showDatePopup(currentTime);
356 case ui::TEXT_INPUT_TYPE_DATE_TIME_FIELD:
357 case ui::TEXT_INPUT_TYPE_DATE_TIME:
358 showDatetimePopup(currentTime, false /*datetime*/);
360 case ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL:
361 showDatetimePopup(currentTime, true /* datetime_local */);
363 case ui::TEXT_INPUT_TYPE_TIME:
364 showTimePopup(currentTime);
366 case ui::TEXT_INPUT_TYPE_WEEK:
367 showWeekPopup(currentTime);
369 case ui::TEXT_INPUT_TYPE_MONTH:
370 showMonthPopup(currentTime);
377 void InputPicker::ColorPickerKeyUpCallback(void* data, Evas*, Evas_Object* obj, void* event_info) {
378 Evas_Event_Key_Up* key_struct = static_cast<Evas_Event_Key_Up*>(event_info);
379 if (!web_contents_utils::MapsToHWBackKey(key_struct->keyname))
382 HandleBackKeyColorPicker(data, obj, event_info);
385 void InputPicker::ShowColorPicker(int r, int g, int b, int alpha) {
386 if (picker_layout_) {
387 elm_colorselector_color_set(picker_layout_->color_picker, r, g, b, alpha);
388 evas_object_focus_set(picker_layout_->okButton, true);
389 evas_object_show(picker_layout_->layout);
393 picker_layout_ = new InputPicker::Layout(ewk_view_);
395 picker_layout_->initial_r = r;
396 picker_layout_->initial_g = g;
397 picker_layout_->initial_b = b;
399 picker_layout_->CreateColorSelector();
401 evas_object_smart_callback_add(picker_layout_->color_picker,
402 "color,item,selected",
403 SelectedColorCallback,
404 picker_layout_->color_rect);
405 #if defined(OS_TIZEN)
406 eext_object_event_callback_add(picker_layout_->popup, EEXT_CALLBACK_BACK,
407 HandleBackKeyColorPicker, this);
409 evas_object_event_callback_add(picker_layout_->popup, EVAS_CALLBACK_KEY_UP,
410 ColorPickerKeyUpCallback, this);
412 evas_object_smart_callback_add(
413 picker_layout_->okButton,
418 evas_object_show(picker_layout_->popup);
421 void InputPicker::HideColorPicker() {
425 web_view_.web_contents().DidEndColorChooser();
427 if (picker_layout_->popup) {
428 evas_object_del(picker_layout_->popup);
429 picker_layout_->popup = 0;
432 delete picker_layout_;
436 void InputPicker::SelectedColorCallback(
437 void* data, Evas_Object* obj, void* event_info) {
443 Elm_Object_Item *color_it = static_cast<Elm_Object_Item *>(event_info);
444 elm_colorselector_palette_item_color_get(color_it, &r, &g, &b, &a);
445 evas_object_color_set(static_cast<Evas_Object*>(data), r, g, b, a);
448 void InputPicker::ColorPickerCallback(
449 void* data, Evas_Object* obj, void* event_info) {
450 InputPicker* inputPicker = static_cast<InputPicker*>(data);
452 int r(0), g(0), b(0), a(0);
453 evas_object_color_get(inputPicker->picker_layout_->color_rect, &r, &g, &b, &a);
455 inputPicker->web_view_.web_contents().DidChooseColorInColorChooser(
456 SkColorSetARGB(a, r, g, b));
457 inputPicker->HideColorPicker();
460 void InputPicker::HandleBackKeyColorPicker(
461 void* data, Evas_Object* obj, void* event_info) {
462 InputPicker* inputPicker = static_cast<InputPicker*>(data);
464 int r = inputPicker->picker_layout_->initial_r;
465 int g = inputPicker->picker_layout_->initial_g;
466 int b = inputPicker->picker_layout_->initial_b;
469 inputPicker->web_view_.web_contents().DidChooseColorInColorChooser(
470 SkColorSetARGB(a, r, g, b));
472 inputPicker->HideColorPicker();
475 void InputPicker::showDatePopup(struct tm* currentTime) {
476 if (picker_layout_) {
477 // Just update the value.
478 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
479 evas_object_focus_set(picker_layout_->okButton, true);
483 picker_layout_ = new InputPicker::Layout(ewk_view_);
484 CreatePopupLayout(dgettext("WebKit","IDS_WEBVIEW_HEADER_SET_DATE"),
487 picker_layout_->CreateOKButton();
489 evas_object_smart_callback_add(
490 picker_layout_->okButton, "clicked", datePopupCallback, this);
491 elm_object_content_set(picker_layout_->popup, picker_layout_->layout);
492 evas_object_show(picker_layout_->popup);
495 void InputPicker::showWeekPopup(struct tm* currentTime) {
496 if (picker_layout_) {
497 // Just update the value.
498 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
499 evas_object_focus_set(picker_layout_->okButton, true);
503 picker_layout_ = new InputPicker::Layout(ewk_view_);
504 CreatePopupLayout(dgettext("WebKit","IDS_WEBVIEW_HEADER_SET_WEEK"),
507 picker_layout_->CreateOKButton();
509 evas_object_smart_callback_add(
510 picker_layout_->okButton, "clicked", weekPopupCallback, this);
511 elm_object_content_set(picker_layout_->popup, picker_layout_->layout);
512 evas_object_show(picker_layout_->popup);
515 void InputPicker::showTimePopup(struct tm* currentTime) {
516 if (picker_layout_) {
517 // Just update the value.
518 elm_datetime_value_set(picker_layout_->time_picker, currentTime);
519 evas_object_focus_set(picker_layout_->okButton, true);
523 picker_layout_ = new InputPicker::Layout(ewk_view_);
524 CreateTimePopupLayout(dgettext("WebKit","IDS_WEBVIEW_HEADER_SET_TIME"),
527 picker_layout_->CreateOKButton();
529 evas_object_smart_callback_add(
530 picker_layout_->okButton, "clicked", timePopupCallback, this);
531 elm_object_content_set(picker_layout_->popup, picker_layout_->layout);
532 evas_object_show(picker_layout_->popup);
535 void InputPicker::showMonthPopup(struct tm* currentTime) {
536 if (picker_layout_) {
537 // Just update the value.
538 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
539 evas_object_focus_set(picker_layout_->okButton, true);
543 picker_layout_ = new InputPicker::Layout(ewk_view_);
544 CreatePopupLayout(dgettext("WebKit","IDS_WEBVIEW_HEADER_SET_MONTH"),
547 picker_layout_->CreateOKButton();
549 evas_object_smart_callback_add(
550 picker_layout_->okButton, "clicked", monthPopupCallback, this);
551 elm_object_content_set(picker_layout_->popup, picker_layout_->layout);
552 evas_object_show(picker_layout_->popup);
555 void InputPicker::showDatetimePopup(struct tm* currentTime, bool datetime_local) {
556 if (picker_layout_) {
557 // Just update the value.
558 picker_layout_->datetime_local = datetime_local;
560 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
561 evas_object_focus_set(picker_layout_->okButton, true);
565 picker_layout_ = new InputPicker::Layout(ewk_view_);
566 picker_layout_->datetime_local = datetime_local;
568 CreateDateTimePopupLayout(
569 dgettext("WebKit","IDS_WEBVIEW_HEADER_SET_DATE_AND_TIME"), currentTime);
571 picker_layout_->CreateOKButton();
573 evas_object_smart_callback_add(
574 picker_layout_->okButton, "clicked", datetimePopupCallback, this);
575 evas_object_smart_callback_add(
576 picker_layout_->datePicker, "changed", datetimeChangedCallback, this);
577 evas_object_smart_callback_add(
578 picker_layout_->time_picker, "changed", datetimeChangedCallback, this);
580 elm_object_content_set(picker_layout_->popup, picker_layout_->layout);
581 evas_object_show(picker_layout_->popup);
585 Eina_Bool InputPicker::removeDatetimePicker(void* data) {
586 InputPicker* inputPicker = static_cast<InputPicker*>(data);
587 inputPicker->web_view_.web_contents().DidCancelDialog();
589 if (!inputPicker->picker_layout_)
590 return ECORE_CALLBACK_CANCEL;
592 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
594 inputPicker->deletePopupLayout();
595 delete inputPicker->picker_layout_;
596 inputPicker->picker_layout_ = 0;
598 return ECORE_CALLBACK_CANCEL;
601 void InputPicker::removeDatetimePickerDelayed() {
602 ecore_timer_add(0.1, removeDatetimePicker, this);
605 void InputPicker::DatePickerKeyUpCallback(void* data, Evas*, Evas_Object* obj, void* event_info) {
606 Evas_Event_Key_Up* key_struct = static_cast<Evas_Event_Key_Up*>(event_info);
607 if (!web_contents_utils::MapsToHWBackKey(key_struct->keyname))
610 HandleBackKeyDatePicker(data, obj, event_info);
613 void InputPicker::CreatePopupLayout(const char* title, struct tm* currentTime) {
614 picker_layout_->popup = elm_popup_add(picker_layout_->parent);
615 evas_object_size_hint_weight_set(
616 picker_layout_->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
617 elm_object_part_text_set(picker_layout_->popup, "title,text", title);
619 #if defined(OS_TIZEN)
620 if (EflExtensionHandle) {
621 void (*webkit_eext_object_event_callback_add)(
622 Evas_Object *, Eext_Callback_Type , Eext_Event_Cb func, void *);
623 webkit_eext_object_event_callback_add = (void (*)(
627 void *)) dlsym(EflExtensionHandle, "eext_object_event_callback_add");
628 (*webkit_eext_object_event_callback_add)(
629 picker_layout_->popup, EEXT_CALLBACK_BACK, HandleBackKeyDatePicker, this);
632 evas_object_event_callback_add(picker_layout_->popup, EVAS_CALLBACK_KEY_UP,
633 DatePickerKeyUpCallback, this);
635 base::FilePath edj_dir;
636 base::FilePath control_edj;
637 PathService::Get(PathsEfl::EDJE_RESOURCE_DIR, &edj_dir);
638 control_edj = edj_dir.Append(FILE_PATH_LITERAL("control.edj"));
641 picker_layout_->layout = elm_layout_add(picker_layout_->popup);
643 picker_layout_->layout,
644 control_edj.AsUTF8Unsafe().c_str(),
646 evas_object_size_hint_weight_set(
647 picker_layout_->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
649 picker_layout_->datePicker = elm_datetime_add(picker_layout_->layout);
650 elm_object_part_content_set(
651 picker_layout_->layout,
652 "elm.swallow.datetime",
653 picker_layout_->datePicker);
655 char* format = datetimeFormat();
657 elm_datetime_format_set(picker_layout_->datePicker, format);
660 elm_datetime_format_set(picker_layout_->datePicker, defaultDatetimeFormat);
663 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
665 #if defined(OS_TIZEN_TV)
666 elm_object_signal_emit(picker_layout_->layout,"TV","align,swallow.datetime");
668 #if defined(OS_TIZEN_MOBILE)
669 evas_object_smart_callback_add(
670 picker_layout_->datePicker, "edit,end", endEditingCallback, 0);
674 void InputPicker::CreateDateTimePopupLayout(const char* title, struct tm* currentTime) {
675 picker_layout_->popup = elm_popup_add(picker_layout_->parent);
676 elm_object_scale_set(picker_layout_->popup, 0.7);
677 evas_object_size_hint_weight_set(
678 picker_layout_->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
679 elm_object_part_text_set(picker_layout_->popup, "title,text", title);
681 #if defined(OS_TIZEN)
682 if (EflExtensionHandle) {
683 void (*webkit_eext_object_event_callback_add)(
684 Evas_Object *, Eext_Callback_Type , Eext_Event_Cb func, void *);
685 webkit_eext_object_event_callback_add = (void (*)(
689 void *)) dlsym(EflExtensionHandle, "eext_object_event_callback_add");
690 (*webkit_eext_object_event_callback_add)(
691 picker_layout_->popup, EEXT_CALLBACK_BACK, HandleBackKeyDatePicker, this);
694 evas_object_event_callback_add(picker_layout_->popup, EVAS_CALLBACK_KEY_UP,
695 DatePickerKeyUpCallback, this);
697 base::FilePath edj_dir;
698 base::FilePath control_edj;
699 PathService::Get(PathsEfl::EDJE_RESOURCE_DIR, &edj_dir);
700 control_edj = edj_dir.Append(FILE_PATH_LITERAL("control.edj"));
703 picker_layout_->layout = elm_layout_add(picker_layout_->popup);
705 picker_layout_->layout,
706 control_edj.AsUTF8Unsafe().c_str(),
708 evas_object_size_hint_weight_set(
709 picker_layout_->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
711 picker_layout_->time_picker = elm_datetime_add(picker_layout_->layout);
712 elm_object_part_content_set(
713 picker_layout_->layout,
714 "elm.swallow.datetime",
715 picker_layout_->time_picker);
717 picker_layout_->datePicker = elm_datetime_add(picker_layout_->layout);
718 elm_object_part_content_set(
719 picker_layout_->layout,
720 "elm.swallow.datetime2",
721 picker_layout_->datePicker);
723 elm_object_style_set(picker_layout_->time_picker, "time_layout");
725 char* format = datetimeFormat();
727 elm_datetime_format_set(picker_layout_->datePicker, format);
728 elm_datetime_format_set(picker_layout_->time_picker, format);
731 elm_datetime_format_set(picker_layout_->datePicker, defaultDatetimeFormat);
732 elm_datetime_format_set(picker_layout_->time_picker, defaultDatetimeFormat);
735 elm_datetime_value_set(picker_layout_->datePicker, currentTime);
736 elm_datetime_value_set(picker_layout_->time_picker, currentTime);
738 #if defined(OS_TIZEN_MOBILE)
739 evas_object_smart_callback_add(
740 picker_layout_->datePicker, "edit,end", endEditingCallback, 0);
744 void InputPicker::CreateTimePopupLayout(const char* title, struct tm* currentTime) {
745 picker_layout_->popup = elm_popup_add(picker_layout_->parent);
746 evas_object_size_hint_weight_set(
747 picker_layout_->popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
748 elm_object_part_text_set(picker_layout_->popup, "title,text", title);
750 #if defined(OS_TIZEN)
751 if (EflExtensionHandle) {
752 void (*webkit_eext_object_event_callback_add)(
753 Evas_Object *, Eext_Callback_Type , Eext_Event_Cb func, void *);
754 webkit_eext_object_event_callback_add = (void (*)(
758 void *)) dlsym(EflExtensionHandle, "eext_object_event_callback_add");
759 (*webkit_eext_object_event_callback_add)(
760 picker_layout_->popup, EEXT_CALLBACK_BACK, HandleBackKeyDatePicker, this);
763 evas_object_event_callback_add(picker_layout_->popup, EVAS_CALLBACK_KEY_UP,
764 DatePickerKeyUpCallback, this);
766 base::FilePath edj_dir;
767 base::FilePath control_edj;
768 PathService::Get(PathsEfl::EDJE_RESOURCE_DIR, &edj_dir);
769 control_edj = edj_dir.Append(FILE_PATH_LITERAL("control.edj"));
772 picker_layout_->layout = elm_layout_add(picker_layout_->popup);
774 picker_layout_->layout,
775 control_edj.AsUTF8Unsafe().c_str(),
777 evas_object_size_hint_weight_set(
778 picker_layout_->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
780 picker_layout_->time_picker = elm_datetime_add(picker_layout_->layout);
781 elm_object_part_content_set(
782 picker_layout_->layout,
783 "elm.swallow.datetime",
784 picker_layout_->time_picker);
786 elm_object_style_set(picker_layout_->time_picker, "time_layout");
788 char* format = datetimeFormat();
790 elm_datetime_format_set(picker_layout_->time_picker, format);
793 elm_datetime_format_set(picker_layout_->time_picker, defaultDatetimeFormat);
796 elm_datetime_value_set(picker_layout_->time_picker, currentTime);
798 #if defined(OS_TIZEN_TV)
799 elm_object_signal_emit(picker_layout_->layout,"TV","align,swallow.datetime");
801 #if defined(OS_TIZEN_MOBILE)
802 evas_object_smart_callback_add(
803 picker_layout_->time_picker, "edit,end", endEditingCallback, 0);
807 void InputPicker::deletePopupLayout() {
808 if(picker_layout_->popup){
809 evas_object_del(picker_layout_->popup);
810 picker_layout_->popup = 0;
814 void InputPicker::datePopupCallback(
815 void* data, Evas_Object* obj, void* event_info) {
816 struct tm currentTime;
817 memset(¤tTime, 0, sizeof(struct tm));
819 InputPicker* inputPicker = static_cast<InputPicker*>(data);
821 elm_datetime_value_get(inputPicker->picker_layout_->datePicker, ¤tTime);
822 mktime(¤tTime);
824 char dateStr[20] = { 0, };
825 strftime(dateStr, 20, "%F" , ¤tTime);
827 inputPicker->web_view_.web_contents().DidReplaceDateTime(std::string(dateStr));
828 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
830 inputPicker->deletePopupLayout();
831 delete inputPicker->picker_layout_;
832 inputPicker->picker_layout_ = 0;
835 void InputPicker::weekPopupCallback(
836 void* data, Evas_Object* obj, void* event_info) {
837 struct tm currentTime;
838 memset(¤tTime, 0, sizeof(struct tm));
840 InputPicker* inputPicker = static_cast<InputPicker*>(data);
842 elm_datetime_value_get(inputPicker->picker_layout_->datePicker, ¤tTime);
843 mktime(¤tTime);
845 char dateStr[20] = { 0, };
846 strftime(dateStr, 20, "%G-W%V", ¤tTime);
848 inputPicker->web_view_.web_contents().DidReplaceDateTime(std::string(dateStr));
849 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
851 inputPicker->deletePopupLayout();
852 delete inputPicker->picker_layout_;
853 inputPicker->picker_layout_ = 0;
856 void InputPicker::timePopupCallback(
857 void* data, Evas_Object* obj, void* event_info) {
858 struct tm currentTime;
859 memset(¤tTime, 0, sizeof(struct tm));
861 InputPicker* inputPicker = static_cast<InputPicker*>(data);
863 elm_datetime_value_get(inputPicker->picker_layout_->time_picker, ¤tTime);
864 mktime(¤tTime);
866 char dateStr[20] = { 0, };
867 strftime(dateStr, 20, "%R", ¤tTime);
869 inputPicker->web_view_.web_contents().DidReplaceDateTime(std::string(dateStr));
870 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
872 inputPicker->deletePopupLayout();
873 delete inputPicker->picker_layout_;
874 inputPicker->picker_layout_ = 0;
877 void InputPicker::monthPopupCallback(
878 void* data, Evas_Object* obj, void* event_info) {
879 struct tm currentTime;
880 memset(¤tTime, 0, sizeof(struct tm));
882 InputPicker* inputPicker = static_cast<InputPicker*>(data);
883 mktime(¤tTime);
885 elm_datetime_value_get(inputPicker->picker_layout_->datePicker, ¤tTime);
887 char dateStr[20] = { 0, };
888 strftime(dateStr, 20, "%Y-%m", ¤tTime);
890 inputPicker->web_view_.web_contents().DidReplaceDateTime(std::string(dateStr));
891 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
893 inputPicker->deletePopupLayout();
894 delete inputPicker->picker_layout_;
895 inputPicker->picker_layout_ = 0;
898 void InputPicker::datetimePopupCallback(
899 void* data, Evas_Object* obj, void* event_info) {
900 struct tm currentTime;
901 memset(¤tTime, 0, sizeof(struct tm));
903 InputPicker* inputPicker = static_cast<InputPicker*>(data);
905 elm_datetime_value_get(inputPicker->picker_layout_->datePicker, ¤tTime);
906 mktime(¤tTime);
908 char dateStr[50] = { 0, };
909 if (inputPicker->picker_layout_->datetime_local)
910 strftime(dateStr, 50, "%FT%R", ¤tTime);
912 strftime(dateStr, 50, "%FT%RZ", ¤tTime);
914 inputPicker->web_view_.web_contents().DidReplaceDateTime(std::string(dateStr));
915 inputPicker->web_view_.ExecuteEditCommand("Unselect", 0);
917 inputPicker->deletePopupLayout();
918 delete inputPicker->picker_layout_;
919 inputPicker->picker_layout_ = 0;
922 void InputPicker::datetimeChangedCallback(
923 void* data, Evas_Object* obj, void* event_info) {
924 struct tm currentTime;
925 memset(¤tTime, 0, sizeof(struct tm));
927 InputPicker* inputPicker = static_cast<InputPicker*>(data);
928 if (obj == inputPicker->picker_layout_->datePicker) {
929 elm_datetime_value_get(inputPicker->picker_layout_->datePicker, ¤tTime);
930 elm_datetime_value_set(inputPicker->picker_layout_->time_picker, ¤tTime);
931 } else if (obj == inputPicker->picker_layout_->time_picker) {
932 elm_datetime_value_get(inputPicker->picker_layout_->time_picker, ¤tTime);
933 elm_datetime_value_set(inputPicker->picker_layout_->datePicker, ¤tTime);
937 void InputPicker::HandleBackKeyDatePicker(
938 void* data, Evas_Object* obj, void* event_info) {
939 removeDatetimePicker(data);
942 } // namespace content