2 * Copyright 2013 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://floralicense.org/license/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "mf-widget.h"
21 #include "mf-callback.h"
22 #include "mf-launch.h"
23 #include "mf-fm-svc-wrapper.h"
25 #include "mf-language-mgr.h"
27 Elm_Gengrid_Item_Class gic;
28 #define GENGRID_ITEM_WIDTH 72
30 static inline void __mf_gengrid_get_thumbnail(mfItemData_s *params)
33 if (params->thumb_path == NULL) {
34 if (mf_file_attr_is_dir(params->m_ItemName->str)) {
35 if (params->ap->mf_Status.view_type == mf_view_root) {
36 params->thumb_path = strdup(MF_ICON_THUMBNAIL_FOLDER);
37 } else if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) {
38 params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE);
40 params->thumb_path = strdup(MF_ICON_THUMBNAIL_FOLDER);
42 params->real_thumb_flag = TRUE;
44 const char *icon_path = NULL;
45 mf_file_attr_get_file_icon(params->m_ItemName->str, &error_code, MF_ROTATE_LANDSCAPE, &icon_path, ¶ms->media);
46 if (icon_path && ecore_file_exists(icon_path)) {
47 if (!g_strcmp0(icon_path, DEFAULT_ICON)) {
48 params->thumb_path = strdup(MF_ICON_THUMBNAIL_UNKOWN);
50 params->thumb_path = strdup(icon_path);
52 params->real_thumb_flag = TRUE;
53 } else { /*must be image/video file*/
54 fsFileType type = FILE_TYPE_NONE;
55 type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str);
57 if (type == FILE_TYPE_VIDEO) {
58 params->thumb_path = strdup(MF_ICON_THUMBNAIL_VIDEO);
59 } else if (type == FILE_TYPE_IMAGE) {
60 params->thumb_path = strdup(MF_ICON_IMAGE);
62 params->thumb_path = strdup(MF_ICON_THUMBNAIL_UNKOWN);
64 params->real_thumb_flag = FALSE;
65 error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED;
68 } else if (params->thumb_path && ecore_file_exists(params->thumb_path)) {
69 if (params->real_thumb_flag == FALSE) {
70 error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED;
72 } else if (!ecore_file_exists(params->thumb_path)) {
73 mf_error("thumb_path[%s] is not exist", params->thumb_path);
74 free(params->thumb_path);
75 params->thumb_path = NULL;
77 fsFileType type = FILE_TYPE_NONE;
78 type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str);
79 if (mf_file_attr_is_dir(params->m_ItemName->str)) {
80 if (mf_fm_svc_wrapper_is_root_path(params->ap->mf_Status.path->str) == MYFILE_OTG) {
81 params->thumb_path = strdup(MF_ICON_EXTERNAL_DEVICE);
83 params->thumb_path = strdup(MF_ICON_FOLDER);
87 if (type == FILE_TYPE_VIDEO) {
88 params->thumb_path = strdup(MF_ICON_THUMBNAIL_VIDEO);
89 } else if (type == FILE_TYPE_IMAGE) {
90 params->thumb_path = strdup(MF_ICON_IMAGE);
92 params->thumb_path = strdup(DEFAULT_ICON);
95 params->real_thumb_flag = FALSE;
96 error_code = MYFILE_ERR_GET_THUMBNAIL_FAILED;
98 if (error_code != 0) {
99 mf_callback_create_thumbnail(params, mf_callback_thumb_created_cb);
103 static void __mf_gengrid_icon_clicked(void *data, Evas_Object *obj, void *event_info)
106 mf_retm_if(data == NULL, "data is NULL");
107 mf_retm_if(event_info == NULL, "event_info is NULL");
108 struct appdata *ap = (struct appdata *)data;
109 Elm_Object_Item *item = (Elm_Object_Item *) event_info;
112 if (ap->mf_Status.more == MORE_EDIT || ap->mf_Status.more == MORE_SHARE_EDIT)
115 elm_gengrid_item_selected_set(item, EINA_FALSE);
116 mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item);
117 mf_retm_if(selected == NULL, "selected is NULL");
118 mf_retm_if(selected->m_ItemName == NULL, "selected->m_ItemName is NULL");
119 mf_retm_if(selected->m_ItemName->str == NULL, "selected->m_ItemName->str is NULL");
120 if (mf_fm_svc_wrapper_is_dir(selected->m_ItemName)) {
122 myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap);
123 mf_retm_if(pNavi_s == NULL, "get navi structure failed");
124 GString *new_path = NULL;
128 if (ap->mf_Status.more == MORE_SEARCH)
129 ap->mf_Status.more = MORE_DEFAULT;
132 new_path = g_string_new(selected->m_ItemName->str);
134 #ifdef MYFILE_USB_OTG
135 /* if click items under otg root path, it means some disk take into use*/
136 error_code = mf_file_attr_is_disk_link(new_path->str, &result);
137 if (error_code == 0 && result == TRUE) { /* a usb disk take into use */
139 **we don't need to set the previous device flag to be false
140 **because click cannot jump from one device to another
142 mf_otg_set_node_using_flag(ap, new_path->str,TRUE);
146 if (ap->mf_Status.path != NULL) {
147 g_string_free(ap->mf_Status.path, TRUE);
148 ap->mf_Status.path = NULL;
150 ap->mf_Status.path = new_path;
152 if (pNavi_s->pCurrentPath != NULL) {
153 free(pNavi_s->pCurrentPath);
154 pNavi_s->pCurrentPath = NULL;
156 pNavi_s->pCurrentPath = g_strdup(new_path->str);
158 if (ap->mf_Status.view_type == mf_view_root) {
159 ap->mf_Status.view_type = mf_view_normal;
160 #ifdef MYFILE_SPLIT_VIEW
161 if (ap->mf_Status.rotation_type == MF_ROTATE_LANDSCAPE) {
162 if (ap->mf_Status.view_type != mf_view_root_category && ap->mf_Status.view_type != mf_view_root) {
163 mf_navi_bar_reset_panes_main(ap);
168 mf_widget_refresh_view(ap);
170 ret = mf_launch_service(ap, selected->m_ItemName->str);
175 static void __mf_gengrid_item_check_changed(void *data, Evas_Object *obj, void *event_info)
179 mfItemData_s *itemData = (mfItemData_s *)data;
180 struct appdata *ap = (struct appdata *)itemData->ap;
182 itemData->m_checked = elm_check_state_get(obj);
183 if (itemData->m_checked) {
184 ap->mf_MainWindow.pEditView.iCheckedCount++;
186 ap->mf_MainWindow.pEditView.iCheckedCount--;
189 //if (ap->mf_MainWindow.pEditView.pSelectAllCheckBox) {
191 if (ap->mf_MainWindow.pEditView.iTotalCount == ap->mf_MainWindow.pEditView.iCheckedCount) {
192 ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_TRUE;
194 ap->mf_MainWindow.pEditView.bSelectAllChecked = EINA_FALSE;
196 //elm_check_state_pointer_set(ap->mf_MainWindow.pEditView.pSelectAllCheckBox, &ap->mf_MainWindow.pEditView.bSelectAllChecked);
199 elm_gengrid_item_selected_set(itemData->item, itemData->m_checked);
200 mf_genlist_gl_edit_item_selected(ap);
204 void mf_gengrid_select_all(void *data)
207 struct appdata *ap = (struct appdata *)data;
208 mf_retm_if(ap == NULL, "input parameter data error");
210 Evas_Object *gengrid = ap->mf_MainWindow.pEditView.pGengrid;
211 mfItemData_s *it_data = NULL;
212 Elm_Object_Item *it = NULL;
214 it = elm_gengrid_first_item_get(gengrid);
216 it_data = elm_object_item_data_get(it);
218 it_data->m_checked = ap->mf_MainWindow.pEditView.bSelectAllChecked;
219 elm_check_state_set(it_data->pCheckBox, it_data->m_checked);
220 elm_gengrid_item_selected_set(it_data->item, it_data->m_checked);
222 it = elm_gengrid_item_next_get(it);
227 void mf_gengrid_edit_select(void *data, int *count)
230 struct appdata *ap = (struct appdata *)data;
231 mf_retm_if(ap == NULL, "input parameter data error");
233 Evas_Object *gengrid = ap->mf_MainWindow.pEditView.pGengrid;
234 mfItemData_s *itemData = NULL;
235 Elm_Object_Item *it = NULL;
237 it = elm_gengrid_first_item_get(gengrid);
239 itemData = elm_object_item_data_get(it);
240 if (itemData->m_checked) {
241 ap->mf_Status.flagFileSelect = TRUE;
245 it = elm_gengrid_item_next_get(it);
250 void mf_gengrid_create_grid_items(void *data, Evas_Object *grid, Eina_List *file_list)
253 mf_retm_if(grid == NULL, "grid is NULL");
254 mf_retm_if(file_list == NULL, "file_list is NULL");
255 mf_retm_if(data == NULL, "data is NULL");
256 struct appdata *ap = (struct appdata*)data;
260 mfItemData_s *m_TempItem = NULL;
262 elm_gengrid_clear(grid);
264 mf_debug("****************** count is [%d]", eina_list_count(file_list));
265 EINA_LIST_FOREACH(file_list, l, pData) {
266 char *real_name = NULL;
268 fsNodeInfo *pNode = (fsNodeInfo *)pData;
271 real_name = g_strconcat(pNode->path, "/", pNode->name, NULL);
273 if (real_name == NULL) {
276 mf_debug("************** gengrid item is [%s]", real_name);
277 m_TempItem = (mfItemData_s *) malloc(sizeof(mfItemData_s));
278 if (m_TempItem == NULL) {
283 Elm_Object_Item *it = NULL;
285 m_TempItem->m_ItemName = g_string_new(real_name);
286 m_TempItem->size = NULL;
287 m_TempItem->create_date = NULL;
288 m_TempItem->m_checked = FALSE;
289 m_TempItem->pCheckBox = NULL;
290 m_TempItem->thumb_path = NULL;
291 m_TempItem->real_thumb_flag = FALSE;
292 m_TempItem->unregister_lang_mgr = TRUE;
293 m_TempItem->media = NULL;
296 if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY
297 || ap->mf_Status.more == MORE_INTERNAL_MOVE || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING){
299 it = elm_gengrid_item_append(grid, &gic, m_TempItem, NULL, NULL);
300 mf_language_mgr_register_gengrid_item(it);
303 it = elm_gengrid_item_append(grid, &gic, m_TempItem, __mf_gengrid_icon_clicked, ap);
304 mf_language_mgr_register_gengrid_item(it);
306 m_TempItem->item = it;
312 void mf_gengrid_refresh(void *data)
315 mf_retm_if(data == NULL, "data is NULL");
316 struct appdata *ap = (struct appdata *)data;
318 mf_gengrid_create_grid_items(ap, ap->mf_MainWindow.pNaviGengrid, ap->mf_FileOperation.file_list);
322 void mf_gengrid_item_select(void *data, Evas_Object *pGengrid, int *file_count, int *dir_count)
324 mf_retm_if(data == NULL, "data is NULL");
325 mf_retm_if(pGengrid == NULL, "pGengrid is NULL");
326 struct appdata *ap = (struct appdata *)data;
327 Elm_Object_Item *it = NULL;
328 mfItemData_s *itemData = NULL;
329 //int error_code = 0;
331 it = elm_gengrid_first_item_get(pGengrid);
333 itemData = elm_object_item_data_get(it);
334 if (itemData->m_checked) {
335 if (mf_file_attr_is_dir(itemData->m_ItemName->str)) {
336 //bool systemfolder = FALSE;
337 ap->mf_Status.flagFolderSelect = TRUE;
340 ap->mf_Status.flagFileSelect = TRUE;
345 it = elm_gengrid_item_next_get(it);
350 void mf_gengrid_get_grid_selected_files(Evas_Object *gengrid, Eina_List **list)
353 mf_retm_if(gengrid == NULL, "gengrid is NULL");
355 mfItemData_s *itemData = NULL;
356 Elm_Object_Item *it = NULL;
357 GString *pTemp = NULL;
359 it = elm_gengrid_first_item_get(gengrid);
361 itemData = elm_object_item_data_get(it);
362 if (itemData->m_checked) {
363 pTemp = g_string_new(itemData->m_ItemName->str);
364 *list = eina_list_append(*list, pTemp);
366 it = elm_gengrid_item_next_get(it);
372 void mf_gengrid_get_grid_selected_items(Evas_Object *gengrid, Eina_List **list)
375 mf_retm_if(gengrid == NULL, "gengrid is NULL");
377 mfItemData_s *itemData = NULL;
378 Elm_Object_Item *it = NULL;
380 it = elm_gengrid_first_item_get(gengrid);
382 itemData = elm_object_item_data_get(it);
383 if (itemData->m_checked) {
384 *list = eina_list_append(*list, itemData);
386 it = elm_gengrid_item_next_get(it);
392 static Evas_Object *__mf_gengrid_item_icon_get(void *data, Evas_Object *obj, const char *part)
395 mfItemData_s *params = (mfItemData_s *) data;
396 struct appdata *ap = (struct appdata *)params->ap;
397 mf_retvm_if(params == NULL, NULL, "param is NULL");
398 mf_retvm_if(params->m_ItemName == NULL, NULL, "m_ItemName is NULL");
399 mf_retvm_if(part == NULL, NULL, "part is NULL");
400 mf_retvm_if(obj == NULL, NULL, "obj is NULL");
401 mf_retvm_if(ap == NULL, NULL, "ap is NULL");
403 if (!strcmp(part, "elm.swallow.icon")) {
404 __mf_gengrid_get_thumbnail(params);
406 Evas_Object *icon = elm_image_add(obj);
407 elm_image_file_set(icon, params->thumb_path, NULL);
408 elm_image_aspect_fixed_set(icon, EINA_FALSE);
409 evas_object_show(icon);
411 } else if (!strcmp(part, "elm.swallow.block") && params->ap->mf_Status.more == MORE_EDIT) {
412 Evas_Object *layout = elm_layout_add(obj);
413 elm_layout_theme_set(layout, "gengrid", "item", "block/default");
414 evas_object_propagate_events_set(layout, 0);
415 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, (Evas_Object_Event_Cb)mf_callback_rename_create_cb, params);
417 } else if (!strcmp(part, "elm.swallow.end") && params->ap->mf_Status.more == MORE_EDIT)
419 Evas_Object *ck = elm_check_add(obj);
420 mf_retvm_if(ck == NULL, NULL, "ck is NULL");
421 elm_object_focus_set(ck, EINA_FALSE);
422 params->pCheckBox = ck;
423 elm_object_style_set(ck, "grid");
424 evas_object_propagate_events_set(ck, 1);
425 mf_debug("params is [%p]params->m_checked is [%d]",params, params->m_checked);
426 elm_check_state_set(ck, params->m_checked);
427 elm_gengrid_item_selected_set(params->item, params->m_checked);
428 evas_object_smart_callback_add(ck, "changed", __mf_gengrid_item_check_changed, params);
429 evas_object_show(ck);
435 static char *__mf_gengrid_item_label_get(void *data, Evas_Object * obj, const char *part)
438 mfItemData_s *params = (mfItemData_s *) data;
439 mf_retv_if(params == NULL, NULL);
441 if (strcmp(part, "elm.text") == 0) {
442 /* supporting multi-lang for default folders */
444 if (g_strcmp0(params->m_ItemName->str, PHONE_FOLDER) == 0) {
445 return g_strdup(GET_SYS_STR(MF_LABEL_PHONE));
446 } else if (g_strcmp0(params->m_ItemName->str, MEMORY_FOLDER) == 0) {
447 return g_strdup(GET_SYS_STR(MF_LABEL_MMC));
448 } else if (g_strcmp0(params->m_ItemName->str, OTG_FOLDER) == 0) {
449 return g_strdup(GET_STR(MF_LABEL_OTG));
451 if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) {
452 char *markup_name = NULL;
454 markup_name = (char *)mf_util_search_markup_keyword(ecore_file_file_get(params->m_ItemName->str), params->ap->mf_Status.search_filter, &res);
457 return g_strdup(markup_name);
461 if (params->ap->mf_Status.iExtensionState == MF_EXTENSION_HIDE && !mf_file_attr_is_dir(params->m_ItemName->str)) {
462 return mf_fm_svc_get_file_name(params->m_ItemName);
465 return g_strdup(ecore_file_file_get(params->m_ItemName->str));
469 return strdup(_(""));
474 static void __mf_gengrid_item_del(void *data, Evas_Object * obj)
476 mfItemData_s *params = (mfItemData_s *) data;
478 if (params->m_ItemName) {
479 g_string_free(params->m_ItemName, TRUE);
480 params->m_ItemName = NULL;
482 if (params->thumb_path) {
483 free(params->thumb_path);
484 params->thumb_path = NULL;
486 if (params->create_date) {
487 free(params->create_date);
488 params->create_date = NULL;
495 media_info_cancel_thumbnail(params->media);
496 media_info_destroy(params->media);
497 params->media = NULL;
505 void mf_gengrid_gen_style_set()
507 gic.item_style = "default_gridtext";
508 gic.func.text_get = __mf_gengrid_item_label_get;
509 gic.func.content_get = __mf_gengrid_item_icon_get;
510 gic.func.state_get = NULL;
511 gic.func.del = __mf_gengrid_item_del;
514 Evas_Object *mf_gengrid_create(Evas_Object *parent)
517 mf_retvm_if(parent == NULL, NULL, "parent is NULL");
519 Evas_Object *grid = NULL;
520 grid = mf_gengrid_create_grid(parent);
521 mf_gengrid_gen_style_set();
525 Evas_Object *mf_gengrid_create_grid (Evas_Object *parent)
528 mf_retvm_if(parent == NULL, NULL, "parent is NULL");
529 Evas_Object *grid = NULL;
530 grid = elm_gengrid_add(parent);
531 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
532 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
533 elm_object_focus_set(grid, EINA_FALSE);
535 elm_gengrid_align_set(grid, 0.0, 0.0);
536 elm_gengrid_horizontal_set(grid, EINA_FALSE);
537 elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
538 elm_gengrid_multi_select_set(grid, EINA_TRUE);
539 evas_object_show(grid);
543 void mf_gengrid_create_list_default_style(Evas_Object *pGengrid, void *data, Eina_List *dir_list,
544 Eina_List *file_list)
548 mf_retm_if(data == NULL, "data is NULL");
549 mf_retm_if(pGengrid == NULL, "pGengrid is NULL");
550 /*0. variable definition and parameter check*/
551 struct appdata *ap = (struct appdata *)data;
553 fsNodeInfo *pNode = NULL;
556 EINA_LIST_FOREACH(dir_list, l, pNode) {
557 mf_widget_item_append(pGengrid, pNode, ap);
559 /* add file items into the genlist */
561 EINA_LIST_FOREACH(file_list, l, pNode) {
562 mf_widget_item_append(pGengrid, pNode, ap);
566 static void __mf_gengrid_thumbs_longpressed(void *data, Evas_Object *obj,
569 mf_retm_if(event_info == NULL, "event_info is NULL");
571 mfItemData_s *it_data = elm_object_item_data_get(event_info);
572 mf_retm_if(it_data == NULL, "it_data is NULL");
574 mf_context_popup_create_gengrid(it_data);
576 Evas_Object *mf_gengrid_create_list(void *data, Evas_Object *parent)
580 mf_retvm_if(data == NULL, NULL, "data is NULL");
581 mf_retvm_if(parent == NULL, NULL, "parent is NULL");
583 struct appdata *ap = (struct appdata *)data;
584 Evas_Object *gengrid = NULL;
585 Eina_List *file_list = NULL;
586 Eina_List *dir_list = NULL;
589 if (ap->mf_Status.view_type == mf_view_root_category) {
590 file_list = ap->mf_FileOperation.category_list;
592 file_list = ap->mf_FileOperation.file_list;
593 dir_list = ap->mf_FileOperation.folder_list;
596 gengrid = mf_gengrid_create(parent);
598 evas_object_smart_callback_add(gengrid, "longpressed",
599 __mf_gengrid_thumbs_longpressed, ap);
600 elm_gengrid_item_size_set(gengrid, MF_HD_GENGRID_ITEM_WIDTH, MF_HD_GENGRID_ITEM_HEIGTH);
602 if (gengrid == NULL) {
605 evas_object_smart_callback_add(gengrid, "selected", __mf_gengrid_icon_clicked, ap);
606 mf_gengrid_create_list_default_style(gengrid, ap, dir_list, file_list);