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 (ecore_file_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 (ecore_file_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)
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 (ecore_file_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 Evas_Object *bg = elm_bg_add(obj);
405 __mf_gengrid_get_thumbnail(params);
406 elm_bg_load_size_set(bg, MF_ICON_SIZE, MF_ICON_SIZE);
409 elm_bg_file_set(bg, params->thumb_path, NULL);
410 evas_object_size_hint_max_set(bg, MF_ICON_SIZE, MF_ICON_SIZE);
411 evas_object_size_hint_aspect_set(bg, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
412 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
413 evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
414 evas_object_show(bg);
417 fsFileType type = FILE_TYPE_NONE;
418 type = mf_file_attr_get_file_type_by_mime(params->m_ItemName->str);
419 if (type == FILE_TYPE_VIDEO) {
420 Evas_Object *layout = NULL;;
421 layout = elm_layout_add(obj);
422 elm_object_focus_set(layout, EINA_FALSE);
423 elm_layout_file_set(layout, EDJ_NAME, GRP_THUMBNAIL_ONLY);
424 elm_object_part_content_set(layout, "thumbnail", bg);
426 const char *play_icon_path = MF_ICON_THUMBNAIL_VIDEO_PLAY;
427 Evas_Object *play_icon = NULL;
428 play_icon = elm_image_add(obj);
429 elm_object_focus_set(play_icon, EINA_FALSE);
430 elm_image_file_set(play_icon, play_icon_path, NULL);
431 evas_object_show(play_icon);
432 elm_object_part_content_set(layout, "video_play", play_icon);
437 } else if (!strcmp(part, "elm.swallow.block") && params->ap->mf_Status.more == MORE_EDIT) {
438 Evas_Object *layout = elm_layout_add(obj);
439 elm_layout_theme_set(layout, "gengrid", "item", "block/default");
440 evas_object_propagate_events_set(layout, 0);
441 evas_object_event_callback_add(layout, EVAS_CALLBACK_MOUSE_DOWN, (Evas_Object_Event_Cb)mf_callback_rename_create_cb, params);
443 } else if (!strcmp(part, "elm.swallow.end") && params->ap->mf_Status.more == MORE_EDIT)
445 Evas_Object *ck = elm_check_add(obj);
446 mf_retvm_if(ck == NULL, NULL, "ck is NULL");
447 elm_object_focus_set(ck, EINA_FALSE);
448 params->pCheckBox = ck;
449 elm_object_style_set(ck, "grid");
450 evas_object_propagate_events_set(ck, 1);
451 mf_debug("params is [%p]params->m_checked is [%d]",params, params->m_checked);
452 elm_check_state_set(ck, params->m_checked);
453 elm_gengrid_item_selected_set(params->item, params->m_checked);
454 evas_object_smart_callback_add(ck, "changed", __mf_gengrid_item_check_changed, params);
455 evas_object_show(ck);
461 static char *__mf_gengrid_item_label_get(void *data, Evas_Object * obj, const char *part)
464 mfItemData_s *params = (mfItemData_s *) data;
465 mf_retv_if(params == NULL, NULL);
467 if (strcmp(part, "elm.text") == 0) {
468 /* supporting multi-lang for default folders */
470 if (g_strcmp0(params->m_ItemName->str, PHONE_FOLDER) == 0) {
471 return g_strdup(GET_SYS_STR(MF_LABEL_PHONE));
472 } else if (g_strcmp0(params->m_ItemName->str, MEMORY_FOLDER) == 0) {
473 return g_strdup(GET_SYS_STR(MF_LABEL_MMC));
474 } else if (g_strcmp0(params->m_ItemName->str, OTG_FOLDER) == 0) {
475 return g_strdup(GET_STR(MF_LABEL_OTG));
477 if (params->ap->mf_Status.more == MORE_SEARCH &¶ms->ap->mf_Status.search_filter) {
478 char *markup_name = NULL;
480 markup_name = (char *)mf_util_search_markup_keyword(ecore_file_file_get(params->m_ItemName->str), params->ap->mf_Status.search_filter, &res);
483 return g_strdup(markup_name);
487 if (params->ap->mf_Status.iExtensionState == MF_EXTENSION_HIDE && !mf_file_attr_is_dir(params->m_ItemName->str)) {
488 return mf_fm_svc_get_file_name(params->m_ItemName);
491 return g_strdup(ecore_file_file_get(params->m_ItemName->str));
495 return strdup(_(""));
500 static void __mf_gengrid_item_del(void *data, Evas_Object * obj)
502 mfItemData_s *params = (mfItemData_s *) data;
504 if (params->m_ItemName) {
505 g_string_free(params->m_ItemName, TRUE);
506 params->m_ItemName = NULL;
508 if (params->thumb_path) {
509 free(params->thumb_path);
510 params->thumb_path = NULL;
512 if (params->create_date) {
513 free(params->create_date);
514 params->create_date = NULL;
521 media_info_cancel_thumbnail(params->media);
522 media_info_destroy(params->media);
523 params->media = NULL;
531 Evas_Object *mf_gengrid_create_grid (Evas_Object *parent)
534 mf_retvm_if(parent == NULL, NULL, "parent is NULL");
535 Evas_Object *grid = NULL;
537 grid = elm_gengrid_add(parent);
538 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
539 evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
540 elm_object_focus_set(grid, EINA_FALSE);
542 elm_gengrid_align_set(grid, 0.0, 0.0);
543 elm_gengrid_horizontal_set(grid, EINA_FALSE);
544 elm_scroller_bounce_set(grid, EINA_FALSE, EINA_TRUE);
545 elm_gengrid_multi_select_set(grid, EINA_TRUE);
547 gic.item_style = "default_gridtext";
548 gic.func.text_get = __mf_gengrid_item_label_get;
549 gic.func.content_get = __mf_gengrid_item_icon_get;
550 gic.func.state_get = NULL;
551 gic.func.del = __mf_gengrid_item_del;
553 evas_object_show(grid);
557 void mf_gengrid_create_list_default_style(Evas_Object *pGengrid, void *data, Eina_List *dir_list,
558 Eina_List *file_list)
562 mf_retm_if(data == NULL, "data is NULL");
563 mf_retm_if(pGengrid == NULL, "pGengrid is NULL");
564 /*0. variable definition and parameter check*/
565 struct appdata *ap = (struct appdata *)data;
567 fsNodeInfo *pNode = NULL;
570 EINA_LIST_FOREACH(dir_list, l, pNode) {
571 mf_widget_item_append(pGengrid, pNode, ap);
573 /* add file items into the genlist */
575 EINA_LIST_FOREACH(file_list, l, pNode) {
576 mf_widget_item_append(pGengrid, pNode, ap);
580 static void __mf_gengrid_thumbs_longpressed(void *data, Evas_Object *obj,
583 mf_retm_if(event_info == NULL, "event_info is NULL");
585 mfItemData_s *it_data = elm_object_item_data_get(event_info);
586 mf_retm_if(it_data == NULL, "it_data is NULL");
588 mf_context_popup_create_gengrid(it_data);
590 Evas_Object *mf_gengrid_create_list(void *data, Evas_Object *parent)
594 mf_retvm_if(data == NULL, NULL, "data is NULL");
595 mf_retvm_if(parent == NULL, NULL, "parent is NULL");
597 struct appdata *ap = (struct appdata *)data;
598 Evas_Object *gengrid = NULL;
599 Eina_List *file_list = NULL;
600 Eina_List *dir_list = NULL;
603 if (ap->mf_Status.view_type == mf_view_root_category) {
604 file_list = ap->mf_FileOperation.category_list;
606 file_list = ap->mf_FileOperation.file_list;
607 dir_list = ap->mf_FileOperation.folder_list;
610 gengrid = mf_gengrid_create_grid(parent);
612 evas_object_smart_callback_add(gengrid, "longpressed",
613 __mf_gengrid_thumbs_longpressed, ap);
614 if (MF_SCALE_FACTORY == 1) {
615 elm_gengrid_item_size_set(gengrid, MF_HD_GENGRID_ITEM_WIDTH, MF_HD_GENGRID_ITEM_HEIGTH);
617 elm_gengrid_item_size_set(gengrid, MF_WVGA_GENGRID_ITEM_WIDTH, MF_WVGA_GENGRID_ITEM_HEIGTH);
620 if (gengrid == NULL) {
623 evas_object_smart_callback_add(gengrid, "selected", __mf_gengrid_icon_clicked, ap);
624 mf_gengrid_create_list_default_style(gengrid, ap, dir_list, file_list);