From 2959148099e0bb2ec5a8dc7c6fea67599e2bb20b Mon Sep 17 00:00:00 2001 From: chi ding Date: Thu, 14 Nov 2013 17:36:50 +0100 Subject: [PATCH] Fixed the unable to draw dropdown list issue in IVI IVI code and Mobile code for dropdown list are implemented differently and conditionally compiled. Here is the JIRA page https://bugs.tizen.org/jira/browse/TIVI-1525 Updated by Joone Hur Change-Id: I9cc05f328abe53e786e646e34bdf7d92f74992c5 Signed-off-by: Chi Ding --- Source/WTF/wtf/Platform.h | 3 +- .../UIProcess/API/efl/tizen/ewk_popup_picker.cpp | 190 ++++++++++++++++++++- .../UIProcess/API/efl/tizen/ewk_popup_picker.h | 6 + 3 files changed, 191 insertions(+), 8 deletions(-) diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h index 5bc2483..9db615f 100644 --- a/Source/WTF/wtf/Platform.h +++ b/Source/WTF/wtf/Platform.h @@ -328,16 +328,15 @@ #if ENABLE(TIZEN_DESKTOP_BROWSING) #define ENABLE_TIZEN_MULTIPLE_SELECT 0 -#define ENABLE_TIZEN_WEBKIT2_POPUP_INTERNAL 0 #define ENABLE_TIZEN_LINK_EFFECT 0 #define ENABLE_TIZEN_LINK_MAGNIFIER 0 #else #define ENABLE_TIZEN_MULTIPLE_SELECT 1 /*Santosh Mahto (santosh.ma@samsung.com) : enable the feature of handling select element multple selection */ -#define ENABLE_TIZEN_WEBKIT2_POPUP_INTERNAL 1 /* Ryuan Choi(ryuan.choi@samsung.com) : popup implementation for WK2/tizen internal */ #define ENABLE_TIZEN_LINK_EFFECT 1 /* Sanghyup Lee(sh53.lee@samsung.com) To beep when click link*/ #define ENABLE_TIZEN_LINK_MAGNIFIER 1 /* Sangyong Park(sy302.park@samsung.com) : feature for link magnifier */ #endif +#define ENABLE_TIZEN_WEBKIT2_POPUP_INTERNAL 1 /* Ryuan Choi(ryuan.choi@samsung.com) : popup implementation for WK2/tizen internal */ #define ENABLE_TIZEN_PASTEBOARD 1 /* Michal Pakula(m.pakula@samsung.com), Eunmi Lee(eunmi15.lee@samsung.com) : Pasteboard implementation for WK1 and WK2. */ #define ENABLE_TIZEN_TEXT_CARET_HANDLING_WK2 1 /* Piotr Roguski(p.roguski@samsung.com) : enables two methods for getting and setting text caret position in editable fields */ #define ENABLE_TIZEN_ENLARGE_CARET_WIDTH 1 /* Taesik Cho : enlarge default caret width(size) - Email team is demanding this function. When composing, it is difficult to know where caret is.*/ diff --git a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp index 88fe46b..d1ea14a 100644 --- a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp +++ b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.cpp @@ -29,6 +29,8 @@ #include #include +#if ENABLE(TIZEN_DESKTOP_BROWSING) + #if ENABLE(TIZEN_MULTIPLE_SELECT) int compareChangedItems(const void* a, const void* b) { @@ -38,6 +40,173 @@ int compareChangedItems(const void* a, const void* b) } #endif +static void on_popup_menu_discarded(void *user_data, Evas_Object *obj, void *event_info) +{ + // The user clicked outside the menu to discard it. + Ewk_Popup_Picker* picker = (Ewk_Popup_Picker*)user_data; + +#if ENABLE(TIZEN_MULTIPLE_SELECT) + if (picker->multiSelect) + ewk_view_popup_menu_multiple_select(picker->parent, picker->changedList); + else + ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); +#else + ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); +#endif + + ewk_view_popup_menu_close(picker->parent); +} + +static void on_popup_menu_item_clicked(void *user_data, Evas_Object *obj, void *event_info) +{ + Ewk_Popup_Picker* picker = (Ewk_Popup_Picker*)user_data; + Elm_Object_Item *item = (Elm_Object_Item *)event_info; + + int index = picker->selectedIndex = elm_menu_item_index_get(item); + +#if ENABLE(TIZEN_MULTIPLE_SELECT) + if (picker->multiSelect) { //if it's multiple select, after mouse click event, we should change the "changedList" and select the items, but not close the elm_menu. The menu should only be closed when mouse click event happens outside of the menu + int pos = eina_inarray_search(picker->changedList, &index, compareChangedItems); + + if (pos == -1) + eina_inarray_push(picker->changedList, &index); + else + eina_inarray_remove(picker->changedList, &index); + + ewk_view_popup_menu_multiple_select(picker->parent, picker->changedList); + } else { + //if it's single select, after mouse click event, we should select the item and close elm_menu + ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); + ewk_view_popup_menu_close(picker->parent); + } +#else + //if it's single select, after mouse click event, we should select the item and close elm_menu + ewk_view_popup_menu_select(picker->parent, picker->selectedIndex); + ewk_view_popup_menu_close(picker->parent); +#endif +} + +static void createAndShowPopupList(Ewk_Popup_Picker* picker, Evas_Object* parent, Eina_List* items, int selectedIndex) +{ + picker->selectedIndex = selectedIndex; + + void* itemv; + const Eina_List* l; + + if (picker->elm_menu) + evas_object_del(picker->elm_menu); + picker->elm_menu = elm_menu_add(parent); + + evas_object_smart_callback_add(picker->elm_menu, "clicked", on_popup_menu_discarded, picker); + + picker->firstItem = 0; + int index = 0; + + EINA_LIST_FOREACH(items, l, itemv) { + Ewk_Popup_Menu_Item* menuItem = static_cast(itemv); + Elm_Object_Item *objectItem = NULL; + + switch (ewk_popup_menu_item_type_get(menuItem)) { + case EWK_POPUP_MENU_SEPARATOR: + elm_menu_item_separator_add(picker->elm_menu, NULL); + break; + case EWK_POPUP_MENU_ITEM: + if (ewk_popup_menu_item_is_label_get(menuItem)) { + objectItem = elm_menu_item_add(picker->elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(menuItem), NULL, NULL); + elm_object_item_disabled_set(objectItem, EINA_TRUE); + } else { + objectItem = elm_menu_item_add(picker->elm_menu, NULL, NULL, ewk_popup_menu_item_text_get(menuItem), on_popup_menu_item_clicked, picker); + const char *tooltip_text = ewk_popup_menu_item_tooltip_get(menuItem); + if (tooltip_text && tooltip_text[0] != '\0') + elm_object_item_tooltip_text_set(objectItem, tooltip_text); + elm_object_item_disabled_set(objectItem, !ewk_popup_menu_item_enabled_get(menuItem)); + elm_menu_item_selected_set(objectItem, ewk_popup_menu_item_selected_get(menuItem)); + } + break; + } + + if (!index && objectItem) + picker->firstItem = objectItem; + + index++; + } + + elm_object_part_content_set(picker->container, "elm.swallow.content", picker->elm_menu); + + bindtextdomain("WebKit", WEBKIT_TEXT_DIR); + edje_object_part_text_set(elm_layout_edje_get(picker->container), "elm.text.done", dgettext("WebKit","IDS_WEBVIEW_BUTTON_DONE")); +} + +static void resizeAndShowPicker(Ewk_Popup_Picker* picker) +{ + /* resize picker to window */ + Eina_Rectangle windowRect; + Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(picker->container)); + ecore_evas_geometry_get(ee, &windowRect.x, &windowRect.y, &windowRect.w, &windowRect.h); + + evas_object_resize(picker->container, windowRect.w, windowRect.h); + evas_object_move(picker->container, windowRect.x, windowRect.y); + + int targetX = 0; + int targetY = 0; + evas_pointer_canvas_xy_get(evas_object_evas_get(picker->container), &targetX, &targetY); + + elm_menu_move(picker->elm_menu, targetX, targetY); + evas_object_show(picker->elm_menu); + + evas_object_show(picker->container); +} + +#if ENABLE(TIZEN_MULTIPLE_SELECT) +Ewk_Popup_Picker* ewk_popup_picker_new(Evas_Object* parent, Eina_List* items, int selectedIndex, Eina_Bool multiple) +#else +Ewk_Popup_Picker* ewk_popup_picker_new(Evas_Object* parent, Eina_List* items, int selectedIndex) +#endif +{ + Ewk_Popup_Picker* picker = new Ewk_Popup_Picker; + picker->parent = parent; + picker->elm_menu = 0; + +#if ENABLE(TIZEN_MULTIPLE_SELECT) + picker->multiSelect = multiple; + picker->changedList = eina_inarray_new(sizeof(int), 0); +#endif + picker->container = elm_layout_add(parent); + if (!elm_layout_file_set(picker->container, EDJE_DIR"/control.edj", "elm/picker")) + LOG_ERROR("Error! : %s, %s\n", EDJE_DIR"/control.edj", "elm/picker"); + + createAndShowPopupList(picker, parent, items, selectedIndex); + resizeAndShowPicker(picker); + + return picker; +} + +void ewk_popup_picker_del(Ewk_Popup_Picker* picker) +{ + evas_object_del(picker->container); + evas_object_del(picker->elm_menu); + +#if ENABLE(TIZEN_MULTIPLE_SELECT) + eina_inarray_free(changedList); + picker->changedList=0; +#endif + + picker->firstItem = 0; + picker->elm_menu = 0; + delete picker; +} + +void ewk_popup_picker_update(Evas_Object* parent, Ewk_Popup_Picker* picker, Eina_List* items, int selectedIndex) +{ + // FIXME: A check should be made if the items are changed instead of directly changing them. + // Another issue is that if the list is scrolled, the old scroll position is not retained as + // the list is replaced directly. + evas_object_del(picker->elm_menu); + createAndShowPopupList(picker, parent, items, selectedIndex); +} + +#else // ENABLE(TIZEN_DESKTOP_BROWSING) + void menuItemActivated(void* data, Evas_Object* obj, void* event_info) { Ewk_Popup_Picker* picker = static_cast(data); @@ -204,11 +373,6 @@ Ewk_Popup_Picker* ewk_popup_picker_new(Evas_Object* parent, Eina_List* items, in return picker; } -void ewk_popup_picker_resize(Ewk_Popup_Picker* picker) -{ - resizeAndShowPicker(picker); -} - void ewk_popup_picker_del(Ewk_Popup_Picker* picker) { evas_object_smart_callback_del(picker->popupList, "selected", menuItemActivated); @@ -227,5 +391,19 @@ void ewk_popup_picker_update(Evas_Object* parent, Ewk_Popup_Picker* picker, Eina evas_object_del(picker->popupList); createAndShowPopupList(picker, parent, items, selectedIndex); } - #endif + +void ewk_popup_picker_resize(Ewk_Popup_Picker* picker) +{ + resizeAndShowPicker(picker); +} + +#if ENABLE(TIZEN_MULTIPLE_SELECT) +int compareChangedItems(const void* a, const void* b) +{ + const int* left = static_cast(a); + const int* right = static_cast(b); + return (*left - *right); +} +#endif // ENABLE(TIZEN_DESKTOP_BROWSING) +#endif // ENABLE(TIZEN_WEBKIT2_POPUP_INTERNAL) diff --git a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h index 26f959f..d4a04bf 100644 --- a/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h +++ b/Source/WebKit2/UIProcess/API/efl/tizen/ewk_popup_picker.h @@ -34,7 +34,13 @@ class WebPopupMenuProxyEfl; struct _Ewk_Popup_Picker { Evas_Object* container; Evas_Object* parent; +#if ENABLE(TIZEN_WEBKIT2_POPUP_INTERNAL) +#if ENABLE(TIZEN_DESKTOP_BROWSING) + Evas_Object* elm_menu; +#else Evas_Object* popupList; +#endif +#endif Elm_Object_Item* firstItem; int selectedIndex; #if ENABLE(TIZEN_MULTIPLE_SELECT) -- 2.7.4