Tizen 2.1 base
[apps/home/myfiles.git] / src / widget / mf-split-view.c
1 /*
2  * Copyright 2013         Samsung Electronics Co., Ltd
3  *
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
7  *
8  *  http://floralicense.org/license/
9  *
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.
15  */
16
17
18 #include "mf-main.h"
19 #include "mf-widget.h"
20 #include "mf-callback.h"
21 #include "mf-fm-svc-wrapper.h"
22 //double wscale = (double)(((double)w) / ((double)GL_WIN_WIDTH));
23 #define LEFT_SCALE              0.4
24 #define LEFT_W                  (800*LEFT_SCALE)
25 #define LEFT_H                  (480)
26
27 #ifdef MYFILE_SPLIT_VIEW
28
29 static void _gl_con(void *data, Evas_Object *obj, void *event_info);
30 static void _gl_exp_ndepth(void *data, Evas_Object *obj, void *event_info);
31
32 void mf_split_view_unset_right_content(void *data)
33 {
34
35         MF_TRACE_BEGIN;
36         mf_retm_if(data == NULL, "data is NULL");
37         struct appdata *ap = (struct appdata*)data;
38         Evas_Object *unset = NULL;
39
40         unset = mf_widget_unset_part_content(ap->mf_MainWindow.sSplitData.pPanes, "right");
41         if (unset)
42                 evas_object_hide(unset);
43         MF_TRACE_END;
44 }
45
46
47 void mf_split_view_path_info_update(Evas_Object *label, const char *fullpath, Eina_Bool root)
48 {
49         MF_TRACE_BEGIN;
50         mf_retm_if(label == NULL, "label is NULL");
51         mf_retm_if(fullpath == NULL, "path_info is NULL");
52         char *pathinfo = NULL;
53         char *info = NULL;
54
55         if (root) {
56                 info = g_strdup("Root");
57         } else {
58                 pathinfo = mf_fm_svc_path_info_get(fullpath);
59                 info = mf_fm_svc_path_info_translate(pathinfo, MF_PATH_INFO_MAX_LENGTH_LANDSCAPE);
60         }
61
62         elm_object_part_text_set(label, "info", info);
63         MF_TRACE_END;
64 }
65
66
67 void mf_split_view_init(void *data)
68 {
69         MF_TRACE_BEGIN;
70         mf_retm_if(data == NULL, "data is NULL");
71         struct appdata *ap = (struct appdata*)data;
72         Evas_Object *pLeftGenlist = NULL;
73         /*** create the panes */
74
75         ap->mf_MainWindow.sSplitData.pPanes = mf_widget_create_panes(ap->mf_MainWindow.pMainLayout);
76         evas_object_show(ap->mf_MainWindow.sSplitData.pPanes);
77
78         ap->mf_MainWindow.sSplitData.pMainLayout = mf_widget_create_layout_main(ap->mf_MainWindow.sSplitData.pPanes);
79
80         /**Set left size*/
81         elm_panes_content_left_size_set(ap->mf_MainWindow.sSplitData.pPanes, LEFT_SCALE);
82
83
84         /** create the left folder genlist **/
85         pLeftGenlist = mf_widget_create_genlist(ap->mf_MainWindow.sSplitData.pPanes);
86         evas_object_smart_callback_add(pLeftGenlist, "expanded", _gl_exp_ndepth, ap);
87         evas_object_smart_callback_add(pLeftGenlist, "contracted", _gl_con, ap);
88
89         //mf_widget_resize(pLeftGenlist, LEFT_W, LEFT_H);
90         ap->mf_MainWindow.sSplitData.pSplitLeftGenlist = pLeftGenlist;
91         evas_object_show(pLeftGenlist);
92
93         elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pPanes, "left", pLeftGenlist);
94
95         ap->mf_MainWindow.sSplitData.bFlagSplitViewCreate = TRUE;
96         MF_TRACE_END;
97
98 }
99 void mf_split_view_destory(void *data)
100 {
101         MF_TRACE_BEGIN;
102         mf_retm_if(data == NULL, "data is NULL");
103         struct appdata *ap = (struct appdata*)data;
104
105         //SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSelectAllCheckBox);
106         //SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSelectAllLayout);
107         SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist);
108         SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pPanes);
109         SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pMainLayout);
110         ap->mf_MainWindow.sSplitData.bFlagSplitViewCreate = FALSE;
111         MF_TRACE_END;
112 }
113
114 void mf_split_view_hide(void *data)
115 {
116         MF_TRACE_BEGIN;
117         mf_retm_if(data == NULL, "data is NULL");
118         struct appdata *ap = (struct appdata*)data;
119         evas_object_hide(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist);
120         evas_object_hide(ap->mf_MainWindow.sSplitData.pPanes);
121         evas_object_hide(ap->mf_MainWindow.sSplitData.pMainLayout);
122         MF_TRACE_END;
123 }
124
125 void mf_split_view_show(void *data)
126 {
127         MF_TRACE_BEGIN;
128         mf_retm_if(data == NULL, "data is NULL");
129         struct appdata *ap = (struct appdata*)data;
130         evas_object_show(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist);
131         evas_object_show(ap->mf_MainWindow.sSplitData.pPanes);
132         evas_object_show(ap->mf_MainWindow.sSplitData.pMainLayout);
133         MF_TRACE_END;
134 }
135
136 void mf_split_view_genlist_append(void *data, Evas_Object *pGenlist, GString *fullpath, Elm_Object_Item *parent_item)
137 {
138         MF_TRACE_BEGIN;
139         mf_retm_if(data == NULL, "data is NULL");
140         struct appdata *ap = (struct appdata*)data;
141         Elm_Object_Item *parent = NULL;
142         Eina_List *dir_list = NULL;
143         Eina_List *file_list = NULL;
144         mfItemData_s *it_data;
145         int iSortTypeValue = 0;
146         it_data = elm_object_item_data_get(parent_item);
147         mf_retm_if(it_data == NULL, "it_data is NULL");
148         mf_retm_if(it_data->m_ItemName == NULL, "it_data->m_ItemName is NULL");
149         mf_retm_if(it_data->m_ItemName->str == NULL, "it_data->m_ItemName->str is NULL");
150
151         mf_debug("fullpath is [%s] item is [%s]", fullpath->str, it_data->m_ItemName->str);
152
153         mf_fm_svc_wrapper_get_file_list(it_data->m_ItemName->str, &dir_list, &file_list);
154
155
156         mf_util_get_vconf_value(VCONF_TYPE_SORT_TYPE, &iSortTypeValue);
157
158         mf_fs_oper_sort_list(&file_list, iSortTypeValue);
159
160         if (iSortTypeValue == MYFILE_SORT_BY_NAME_A2Z || iSortTypeValue == MYFILE_SORT_BY_NAME_Z2A || iSortTypeValue == MYFILE_SORT_BY_DATE_R2O
161             || iSortTypeValue == MYFILE_SORT_BY_DATE_O2R) {
162                 mf_fs_oper_sort_list(&dir_list, iSortTypeValue);
163         } else {
164                 mf_fs_oper_sort_list(&dir_list, ap->mf_Status.iFolderSortType);
165         }
166         if (dir_list == NULL || eina_list_count(dir_list) == 0) {
167                 MF_TRACE_END;
168                 return;
169         }
170
171         if (g_string_equal(fullpath, it_data->m_ItemName)) {
172                 it_data->flagExpand = true;
173                 elm_object_item_data_set(it_data->item, it_data);
174
175                 elm_genlist_item_update(it_data->item);
176                 mf_genlist_split_left_items_append(ap, pGenlist, parent_item, dir_list);
177
178                 MF_TRACE_END;
179                 return;
180         } else {
181                 it_data->flagExpand = true;
182                 elm_object_item_data_set(it_data->item, it_data);
183
184                 elm_genlist_item_update(it_data->item);
185                 parent = mf_genlist_split_left_items_append(ap, pGenlist, parent_item, dir_list);
186                 mf_split_view_genlist_append(ap, pGenlist, fullpath, parent);
187         }
188         MF_TRACE_END;
189
190 }
191
192 Elm_Object_Item *mf_split_view_locate_item_get(void *data, int locate)
193 {
194         MF_TRACE_BEGIN;
195         mf_retvm_if(data == NULL, NULL, "data is NULL");
196         struct appdata *ap = (struct appdata*)data;
197
198         Elm_Object_Item *item = NULL;
199
200         switch (locate) {
201         case MYFILE_MMC:
202                 item = ap->mf_MainWindow.sSplitData.mmc_item;
203                 break;
204         case MYFILE_OTG:
205                 item = ap->mf_MainWindow.sSplitData.otg_item;
206                 break;
207         case MYFILE_PHONE:
208         default:
209                 item = ap->mf_MainWindow.sSplitData.phone_item;
210                 break;
211         }
212         return item;
213 }
214
215 static void _gl_con(void *data, Evas_Object *obj, void *event_info)
216 {
217         MF_TRACE_BEGIN;
218         struct appdata *ap = (struct appdata *)data;
219         if (ap->mf_Status.flagNaviPush) {
220                 mf_debug("the transition of the naviframe is not finished");
221                 return;
222         }
223         if (ap->mf_Status.more != MORE_EDIT) {
224                 Elm_Object_Item *item = event_info;
225                 elm_genlist_item_subitems_clear(item);
226                 SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup);
227                 mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item);
228                 mf_error("g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str) %d", g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str));
229                 if (g_strcmp0(ap->mf_Status.path->str, selected->m_ItemName->str)) {
230                         myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap);
231                         SAFE_FREE_GSTRING(ap->mf_Status.path);
232                         ap->mf_Status.path = g_string_new(selected->m_ItemName->str);
233                         SAFE_FREE_CHAR(pNavi_s->pCurrentPath);
234                         pNavi_s->pCurrentPath = g_strdup(selected->m_ItemName->str);
235                         if (ap->mf_Status.more == MORE_DEFAULT) {
236                                 mf_navi_bar_create_default_view(ap);
237                                 mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar);
238                                 mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_ROOT, true);
239                                 //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_OTG_ROOT, TRUE);
240                         } else if (ap->mf_Status.more == MORE_INTERNAL_COPY_MOVE || ap->mf_Status.more == MORE_INTERNAL_COPY || ap->mf_Status.more == MORE_INTERNAL_MOVE
241                                    || ap->mf_Status.more == MORE_DATA_COPYING || ap->mf_Status.more == MORE_DATA_MOVING) {
242                                 mf_navi_bar_create_path_select_view(ap);
243                                 mf_navi_bar_remove_previous_contents(ap, ap->mf_MainWindow.pNaviBar);
244                                 mf_navi_bar_button_set_disable(ap->mf_MainWindow.pNaviItem, CTRL_DISABLE_OTG_ROOT, true);
245                                 //mf_ctrl_bar_item_set_disable(ap->mf_MainWindow.pNaviCtrlBar, CTRL_DISABLE_OTG_ROOT, TRUE);
246                         }
247                 }
248
249         }
250         MF_TRACE_END;
251 }
252
253 static void _gl_exp_ndepth(void *data, Evas_Object *obj, void *event_info)
254 {
255         MF_TRACE_BEGIN;
256         struct appdata *ap = (struct appdata *)data;
257         Elm_Object_Item *item = event_info;
258
259         if (item != NULL) {
260                 mfItemData_s *selected = (mfItemData_s *) elm_object_item_data_get(item);
261                 //elm_genlist_item_selected_set(item, FALSE);
262
263                 if (ap->mf_Status.flagNaviPush) {
264                         mf_debug("the transition of the naviframe is not finished");
265                         return;
266                 }
267                 SAFE_FREE_OBJ(ap->mf_MainWindow.pContextPopup);
268                 if (ap->mf_Status.more == MORE_RENAME) {
269                         if (elm_genlist_item_flip_get(item)) {
270                                 MF_TRACE_END;
271                                 return;
272                         } else {
273                                 mf_callback_rename_save_cb(ap, NULL, NULL);
274                                 return;
275                         }
276                 } else if (ap->mf_Status.more != MORE_EDIT) {
277                         if (g_string_equal(selected->m_ItemName, ap->mf_Status.path)) {
278
279                                 myfileNaviBar *pNavi_s = mf_navi_bar_get_in_use(ap);
280                                 SAFE_FREE_GSTRING(ap->mf_Status.path);
281                                 ap->mf_Status.path = g_string_new(selected->m_ItemName->str);
282                                 SAFE_FREE_CHAR(pNavi_s->pCurrentPath);
283                                 pNavi_s->pCurrentPath = g_strdup(selected->m_ItemName->str);
284
285                                 mf_split_view_genlist_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist,
286                                                              ap->mf_Status.path, item);
287                         } else {
288                                 mf_split_view_genlist_append(ap, ap->mf_MainWindow.sSplitData.pSplitLeftGenlist,
289                                                              ap->mf_Status.path, item);
290                                 if (!g_string_equal(selected->m_ItemName, ap->mf_Status.path)) {
291                                         mf_callback_left_click_cb(data, selected->m_ItemName, item);
292                                 }
293
294                         }
295
296                         }
297         }
298
299         MF_TRACE_END;
300 }
301
302 void mf_split_view_left_genlist_refresh(void *data)
303 {
304         MF_TRACE_BEGIN;
305         mf_retm_if(data == NULL, "data is NULL");
306         struct appdata *ap = (struct appdata*)data;
307         Evas_Object *pGenlist = NULL;
308
309         GString *fullpath = ap->mf_Status.path;
310         mf_retm_if(fullpath == NULL, "fullpath is NULL");
311         //Eina_List *dir_list = NULL;
312
313
314         mf_widget_unset_part_content(ap->mf_MainWindow.sSplitData.pPanes, "left");
315         SAFE_FREE_OBJ(ap->mf_MainWindow.sSplitData.pSplitLeftGenlist);
316         /** create the left folder genlist **/
317         pGenlist = mf_widget_create_genlist(ap->mf_MainWindow.sSplitData.pPanes);
318         evas_object_smart_callback_add(pGenlist, "expanded", _gl_exp_ndepth, ap);
319         evas_object_smart_callback_add(pGenlist, "contracted", _gl_con, ap);
320
321         //mf_widget_resize(pLeftGenlist, LEFT_W, LEFT_H);
322         ap->mf_MainWindow.sSplitData.pSplitLeftGenlist = pGenlist;
323
324         //elm_genlist_mode_set(pGenlist, ELM_LIST_SCROLL); /* Back to default */
325         //elm_scroller_policy_set(pGenlist,EINA_TRUE, EINA_TRUE);
326         evas_object_show(pGenlist);
327
328         elm_object_part_content_set(ap->mf_MainWindow.sSplitData.pPanes, "left", pGenlist);
329
330
331         //pGenlist = ap->mf_MainWindow.sSplitData.pSplitLeftGenlist;
332         mf_retm_if(pGenlist == NULL, "pGenlist is NULL");
333         Elm_Object_Item *parent_item = NULL;
334         mf_genlist_clear(pGenlist);
335         mf_genlist_split_left_genlist_style(ap);
336         mf_genlist_split_root_items_append(pGenlist, ap);
337
338
339         int locate = mf_fm_svc_wrapper_get_location(fullpath->str);
340
341         parent_item = mf_split_view_locate_item_get(ap, locate);
342
343         mf_split_view_genlist_append(ap, pGenlist, fullpath, parent_item);
344                 //error_code = mf_fm_svc_wrapper_get_file_list(path, &dir_list, file_list);
345         MF_TRACE_END;
346 }
347
348 bool mf_split_view_refresh(void *data)
349 {
350         MF_TRACE_BEGIN;
351         mf_retvm_if(data == NULL, FALSE, "data is NULL");
352         struct appdata *ap = (struct appdata*)data;
353         //update the left genlist items
354         mf_split_view_left_genlist_refresh(ap);
355
356         MF_TRACE_END;
357         return TRUE;
358
359 }
360 #endif