summaryrefslogtreecommitdiff
path: root/src/widget/mf-ug-search-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/widget/mf-ug-search-view.c')
-rw-r--r--src/widget/mf-ug-search-view.c455
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;
+}
+