diff options
Diffstat (limited to 'src/widget/mf-ug-search-view.c')
-rw-r--r-- | src/widget/mf-ug-search-view.c | 455 |
1 files changed, 455 insertions, 0 deletions
diff --git a/src/widget/mf-ug-search-view.c b/src/widget/mf-ug-search-view.c new file mode 100644 index 0000000..2ff7215 --- /dev/null +++ b/src/widget/mf-ug-search-view.c @@ -0,0 +1,455 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.1 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://floralicense.org/license/ + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <Eina.h> +#include <Ecore_X.h> + +#include "mf-ug-main.h" +#include "mf-ug-util.h" +#include "mf-ug-winset.h" +#include "mf-ug-fs-util.h" +#include "mf-ug-resource.h" +#include "mf-ug-cb.h" + +#define MF_SEARCH_OPTION_DEF (MF_SEARCH_OPT_EXT) +#define MF_SEARCH_ROOT_NUM 2 +#define MF_SEARCH_TIMER_INTERVAL 0.5 + +extern int flagSearchMsg; +extern pthread_mutex_t gLockSearchMsg; +extern pthread_cond_t gCondSearchMsg; + +typedef struct { + char *size; + char *create_date; +} mf_search_detail_infor_s; + +static void __mf_ug_search_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info); + +Evas_Object *mf_ug_search_view_create_no_content(Evas_Object *parent) +{ + Evas_Object *nocontent = elm_layout_add(parent); + elm_layout_theme_set(nocontent, "layout", "nocontents", "text"); + elm_object_focus_set(nocontent, EINA_FALSE); + elm_object_part_text_set(nocontent, "elm.text", MF_UG_LABEL_NO_RESULT); + return nocontent; +} + +void mf_ug_search_view_item_append(void *data, void *user_data) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)user_data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + + ugNaviBar *pNavi_s = mf_ug_navi_bar_get_in_use_navi(ugd); + ug_mf_retm_if(pNavi_s == NULL, "get navi failed"); + + char *item_name = (char *)data; + ug_mf_retm_if(item_name == NULL, "input item_name error"); + + ugListItemData *m_TempItem = NULL; + GString *search_path = g_string_new(item_name); + + + g_string_free(search_path, TRUE); + search_path = NULL; + + m_TempItem = (ugListItemData *) malloc(sizeof(ugListItemData)); + + if (m_TempItem == NULL) { + return; + } + memset(m_TempItem, 0, sizeof(ugListItemData)); + + m_TempItem->ug_pItemName = g_string_new(item_name); + m_TempItem->ug_iGroupValue = 0; + m_TempItem->ug_pRadioBox = NULL; + m_TempItem->ug_bChecked = FALSE; + m_TempItem->ug_pCheckBox = NULL; + m_TempItem->ug_pThumbPath = NULL; + m_TempItem->ug_bRealThumbFlag = FALSE; + m_TempItem->ug_pData = ugd; + m_TempItem->ug_pItem = NULL; + + /*delete timer if exists*/ + +#ifdef UG_THUMB_REAL_TIME_UPDATE + if (ugd->ug_Status.ug_pThumbUpdateTimer != NULL) { + ecore_timer_del(ugd->ug_Status.ug_pThumbUpdateTimer); + ugd->ug_Status.ug_pThumbUpdateTimer = NULL; + } +#endif + Elm_Object_Item *it = NULL; + + it = elm_genlist_item_append(ugd->ug_MainWindow.ug_pNaviGenlist, &ugd->ug_Status.ug_itc, m_TempItem, NULL, ELM_GENLIST_ITEM_NONE, NULL, ugd); + m_TempItem->ug_pItem = it; + UG_TRACE_END; + +} + +Evas_Object *mf_ug_search_create_select_all_layout(Evas_Object *parent) +{ + + ug_mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *pSelectedAllLayout = NULL; + pSelectedAllLayout = elm_layout_add(parent); + elm_object_focus_set(pSelectedAllLayout, EINA_FALSE); + elm_layout_theme_set(pSelectedAllLayout, "genlist", "item", "select_all/default"); + evas_object_size_hint_weight_set(pSelectedAllLayout, EVAS_HINT_EXPAND, EVAS_HINT_FILL); + evas_object_size_hint_align_set(pSelectedAllLayout, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_object_part_text_set(pSelectedAllLayout, "elm.text", MF_UG_LABEL_SELECT_ALL); + evas_object_show(pSelectedAllLayout); + return pSelectedAllLayout; +} + +Evas_Object *mf_ug_search_create_check_box(Evas_Object *parent) +{ + ug_mf_retvm_if(parent == NULL, NULL, "parent is NULL"); + + Evas_Object *checkbox = NULL; + checkbox = elm_check_add(parent); + elm_object_focus_set(checkbox, EINA_FALSE); + evas_object_propagate_events_set(checkbox, EINA_FALSE); + evas_object_show(checkbox); + return checkbox; +} + +void __mf_ug_search_select_all_layout_mouse_down_cb(void *data, Evas * evas, Evas_Object * obj, void *event_info) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + + ugd->ug_Status.ug_bSelectAllChecked = !ugd->ug_Status.ug_bSelectAllChecked; + elm_check_state_pointer_set(ugd->ug_MainWindow.ug_pSelectAllCheckBox, &ugd->ug_Status.ug_bSelectAllChecked); + + __mf_ug_search_select_all_check_changed_cb(ugd, NULL, NULL); + UG_TRACE_END; +} + +static void __mf_ug_search_select_all_check_changed_cb(void *data, Evas_Object * obj, void *event_info) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + Evas_Object *genlist = ugd->ug_MainWindow.ug_pNaviGenlist; + ug_debug("ugd->ug_Status.ug_iTotalCount is [%d]", ugd->ug_Status.ug_iTotalCount); + if (ugd->ug_Status.ug_bSelectAllChecked) { + ug_debug(); + ugd->ug_Status.ug_iCheckedCount = ugd->ug_Status.ug_iTotalCount; + } else { + ug_debug(); + ugd->ug_Status.ug_iCheckedCount = 0; + } + + ugListItemData *it_data; + Elm_Object_Item *it; + int count = 0; + + it = elm_genlist_first_item_get(genlist); + while (it) { + ug_debug(); + it_data = elm_object_item_data_get(it); + if (it_data) { + ug_debug(); + it_data->ug_bChecked = ugd->ug_Status.ug_bSelectAllChecked; + count++; + } + it = elm_genlist_item_next_get(it); + } + elm_genlist_realized_items_update(genlist); + + if (count > 0 && ugd->ug_Status.ug_bSelectAllChecked) { + Evas_Object *notify_popup = NULL; + char lable_file[UG_LABEL_STRING_LENGTH] = { '\0', }; + char *label = NULL; + /*1 TODO: need to update for multi-language */ + + snprintf(lable_file, sizeof(lable_file), "%d", count); + label = g_strconcat(MF_UG_LABEL_SELECTED, "(", lable_file, ")", NULL); + notify_popup = mf_ug_navibar_create_notify_popup(ugd, ugd->ug_MainWindow.ug_pNaviLayout, label, false, NULL); + ugd->ug_MainWindow.ug_pSelectInfoLayout = notify_popup; + UG_SAFE_FREE_CHAR(label); + + } else { + UG_SAFE_FREE_OBJ(ugd->ug_MainWindow.ug_pSelectInfoLayout); + } + mf_ug_ctrl_bar_set_item_disable(ugd); + + UG_TRACE_END; +} + + +static void __mf_ug_search_view_result_cb(mf_search_result_t *result, void *user_data) +{ + ug_mf_retm_if(result == NULL, "result is NULL"); + + ugData *ugd = (ugData *)user_data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + + ugNaviBar *pNavi_s = mf_ug_navi_bar_get_in_use_navi(ugd); + ug_mf_retm_if(pNavi_s == NULL, "get navi failed"); + + Evas_Object *playout = ugd->ug_MainWindow.ug_pNaviLayout; + ug_mf_retm_if(playout == NULL, "get conformant failed"); + Evas_Object *newContent = NULL; + Evas_Object *unUsed = elm_object_part_content_unset(playout, "part1"); + if (unUsed) { + evas_object_del(unUsed); + unUsed = NULL; + } + + if (g_list_length(result->dir_list) + g_list_length(result->file_list) == 0) { + ug_ecore_idler_del(ugd->ug_Status.popup_create_idler); + newContent = mf_ug_search_view_create_no_content(playout); + elm_object_part_content_set(playout, "part1", newContent); + mf_ug_navi_bar_button_set_disable(ugd, true); + } else { + + + + //newContent = mf_ug_genlist_create_content_list_view(ugd); + newContent = __mf_ug_genlist_create_gl(ugd); + ugd->ug_MainWindow.ug_pNaviGenlist = newContent; + + elm_object_part_content_set(playout, "part1", newContent); + + if (result->file_list != NULL) { + Evas_Object *pSelectAllLayout = NULL; + Evas_Object *pSelectAllCheckBox = NULL; + ugd->ug_Status.ug_bSelectAllChecked = false; + ugd->ug_Status.ug_iTotalCount = g_list_length(result->file_list); + ugd->ug_Status.ug_iCheckedCount = 0; + + pSelectAllLayout = mf_ug_search_create_select_all_layout(ugd->ug_MainWindow.ug_pNaviBox); + ug_mf_retm_if(pSelectAllLayout == NULL, "pSelectAllLayout is NULL"); + ugd->ug_MainWindow.ug_pSelectAllLayout = pSelectAllLayout; + evas_object_event_callback_add(pSelectAllLayout, EVAS_CALLBACK_MOUSE_DOWN, __mf_ug_search_select_all_layout_mouse_down_cb, ugd); + pSelectAllCheckBox = mf_ug_search_create_check_box(pSelectAllLayout); + ugd->ug_MainWindow.ug_pSelectAllCheckBox = pSelectAllCheckBox; + elm_check_state_pointer_set(pSelectAllCheckBox, &ugd->ug_Status.ug_bSelectAllChecked); + evas_object_smart_callback_add(pSelectAllCheckBox, "changed", __mf_ug_search_select_all_check_changed_cb, ugd); + + elm_object_part_content_set(pSelectAllLayout, "elm.icon", pSelectAllCheckBox); + elm_box_pack_start(ugd->ug_MainWindow.ug_pNaviBox, pSelectAllLayout); + } + if (result->dir_list != NULL) { + g_list_foreach(result->dir_list, mf_ug_search_view_item_append, ugd); + } + if (result->file_list != NULL) { + g_list_foreach(result->file_list, mf_ug_search_view_item_append, ugd); + } + } +} + + +static Eina_Bool __mf_ug_search_view_stop(void *data) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retvm_if(ugd == NULL, ECORE_CALLBACK_CANCEL, "ugd is NULL"); + + + UG_SAFE_FREE_OBJ(ugd->ug_MainWindow.ug_pSearchPopup); + + if (ugd->ug_UiGadget.ug_pSyncPipe != NULL) { + ecore_pipe_del(ugd->ug_UiGadget.ug_pSyncPipe); + ugd->ug_UiGadget.ug_pSyncPipe = NULL; + } + __mf_ug_search_view_result_cb(((ms_handle_t *) ugd->ug_Status.search_handler)->result, ugd); + + if (ugd->ug_Status.search_handler > 0) { + mf_ug_search_stop(ugd->ug_Status.search_handler); + } + + + if (ugd->ug_Status.search_handler > 0) { + mf_ug_search_finalize(&ugd->ug_Status.search_handler); + } + + UG_TRACE_END; + return ECORE_CALLBACK_CANCEL; +} + +static void __mf_ug_search_view_stop_cb(void *data, Evas_Object * obj, void *event_info) { + + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + + __mf_ug_search_view_stop(ugd); + + UG_TRACE_END; +} + + +static int __mf_ug_search_view_idle_search_msg_cope_finished(void *data) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + if (ugd == NULL || ugd->ug_Status.msg_finish_idler == NULL) { + return ECORE_CALLBACK_CANCEL; + } + pthread_mutex_lock(&gLockSearchMsg); + if (flagSearchMsg == 0) { + flagSearchMsg = 1; + pthread_cond_signal(&gCondSearchMsg); + } + pthread_mutex_unlock(&gLockSearchMsg); + ugd->ug_Status.msg_finish_idler = NULL; + + return ECORE_CALLBACK_CANCEL; +} + +static void __mf_ug_search_view_pipe_cb(void *data, void *buffer, unsigned int nbyte) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + if (ugd == NULL) { + ug_debug("input ugd is NULL"); + return; + } + + mf_search_pipe_msg *pSearchMsg = (mf_search_pipe_msg *) buffer; + if (pSearchMsg == NULL) { + ug_debug("received message is NULL"); + goto MF_CONTINURE_SEARCH; + } + + if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_RESULT_REPORT) { + ug_debug("result get"); + } else if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_ROOT_CHANGE) { + ug_debug("root change "); + + char *new_desc = mf_ug_fm_svc_wrapper_translate_path(pSearchMsg->current_path); + //elm_object_text_set(ugd->ug_MainWindow.ug_pSearchPopup, new_desc); + elm_object_text_set(ugd->ug_MainWindow.ug_pSearchLabel, new_desc); + //elm_object_part_text_set(ugd->ug_MainWindow.ug_pSearchLabel, "path", new_desc); + if (pSearchMsg->current_path) { + free(pSearchMsg->current_path); + pSearchMsg->current_path = NULL; + } + if (new_desc != NULL) { + free(new_desc); + new_desc = NULL; + } + } else if (pSearchMsg->mf_sp_msg_type == MF_SEARCH_PIPE_MSG_FINISHED) { + + ug_ecore_idler_del(ugd->ug_Status.popup_del_idler); + UG_SAFE_FREE_OBJ(ugd->ug_MainWindow.ug_pSearchPopup); + //ugd->ug_Status.popup_del_idler = ecore_idler_add(mf_ug_cb_popup_del_idler_cb, ugd); + __mf_ug_search_view_result_cb((mf_search_result_t *) pSearchMsg->report_result, data); + } + +MF_CONTINURE_SEARCH: + ug_ecore_idler_del(ugd->ug_Status.msg_finish_idler); + ugd->ug_Status.msg_finish_idler = ecore_idler_add((Ecore_Task_Cb)__mf_ug_search_view_idle_search_msg_cope_finished, ugd); + //__mf_ug_search_view_idle_search_msg_cope_finished(NULL); + UG_TRACE_END; +} + +static void __mf_ug_search_view_idle_search_start(void *data) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + + ugNaviBar *pNavi_s = mf_ug_navi_bar_get_in_use_navi(ugd); + ug_mf_retm_if(pNavi_s == NULL, "pNavi_s is NULL"); + char *text = NULL; + + if (ugd->ug_UiGadget.ug_pExtension) + text = g_strdup(ugd->ug_UiGadget.ug_pExtension); + + int root_num = 0; + const char *SearchRoot[MF_SEARCH_ROOT_NUM] = {0}; + ug_debug("text is [%s] path is [%s]", text, ugd->ug_Status.ug_pPath->str); + if (ugd->ug_UiGadget.ug_iSelectMode == IMPORT_MODE || ugd->ug_UiGadget.ug_iSelectMode == IMPORT_SINGLE) { + root_num = 2; + SearchRoot[0] = PHONE_FOLDER; + + SearchRoot[1] = MEMORY_FOLDER; + } else { + root_num = 1; + SearchRoot[0] = ugd->ug_Status.ug_pPath->str; + + } + //const char *SearchRoot[MF_SEARCH_ROOT_NUM] = { ugd->ug_Status.ug_pPath->str}; + //ug_debug("search path is [%s]", ugd->ug_Status.ug_pPath->str); + /*Start Search routine*/ + if (!mf_ug_search_start(ugd->ug_Status.search_handler, SearchRoot, root_num, \ + ((text) ? text : NULL), MF_SEARCH_OPTION_DEF, (void *)ugd)) { + ug_debug("start success"); + /*generate the popup used to show search path + **it's sure that new_desc is not NULL even if original path is NULL*/ + //ugd->ug_MainWindow.ug_pSearchPopup = mf_ug_popup_create(ugd, UG_POPMODE_SEARCH, NULL, MF_UG_LABEL_SEARCH, NULL, NULL, NULL, __mf_ug_search_view_stop_cb, ugd); + ugd->ug_MainWindow.ug_pSearchPopup = mf_ug_popup_create_search(ugd, __mf_ug_search_view_stop_cb, ugd); + } else { + ug_debug("start failed"); + } + ug_debug(); + + + if (text != NULL) { + free(text); + text = NULL; + } + +} + +void mf_ug_search_view_enter_search_routine(void *data, Evas_Object * obj, void *event_info) +{ + UG_TRACE_BEGIN; + ugData *ugd = (ugData *)data; + ug_mf_retm_if(ugd == NULL, "ugd is NULL"); + +#ifdef UG_THUMB_REAL_TIME_UPDATE + if (ugd->ug_Status.ug_pThumbUpdateTimer != NULL) { + ecore_timer_del(ugd->ug_Status.ug_pThumbUpdateTimer); + ugd->ug_Status.ug_pThumbUpdateTimer = NULL; + } +#endif + //ugd->ug_Status.ug_iMore = UG_MORE_SEARCH; + + if (ugd->ug_Status.search_handler > 0) + mf_ug_search_finalize(&ugd->ug_Status.search_handler); + + int ret = mf_ug_search_init(&ugd->ug_Status.search_handler); + ug_mf_retm_if(ret < 0, "Fail to mf_ug_search_init()"); + + if (ugd->ug_UiGadget.ug_pSyncPipe != NULL) { + ecore_pipe_del(ugd->ug_UiGadget.ug_pSyncPipe); + ugd->ug_UiGadget.ug_pSyncPipe = NULL; + } + ugd->ug_UiGadget.ug_pSyncPipe = ecore_pipe_add(__mf_ug_search_view_pipe_cb, ugd); + + if (ugd->ug_UiGadget.ug_pSyncPipe == NULL) { + ug_debug("add pipe failed"); + } + /*this is to init global variable to ensure the first message can be transmitted correctly*/ + /*flagSearchMsg is to indicate the condition wait to sync data of threads*/ + pthread_mutex_lock(&gLockSearchMsg); + flagSearchMsg = 1; + pthread_mutex_unlock(&gLockSearchMsg); + + /*delete guide text label in the box*/ + /*evas_object_del(elm_object_content_unset(pNavi_s->pNaviConform));*/ + __mf_ug_search_view_idle_search_start(ugd); + + UG_TRACE_END; +} + |