2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <Elementary.h>
26 #include <AppCommon.h>
27 #include "Mediadata.h"
28 #include "ExtNameInfo.h"
30 #include "GengridItemClass.h"
31 #include "InputHandler.h"
35 #include <InputHandler.h>
37 #include "FbContextView.h"
40 #define GENGRID_ITEM_SIZE_W (263 + 20)
41 #define GENGRID_ITEM_SIZE_H (359 + 20)
44 static Elm_Object_Item *_find_item_by_id(Eina_List *list, char *fid)
51 EINA_LIST_FOREACH(list, l, obj) {
52 pItemInfo = (SItemInfo *)obj;
53 id = pItemInfo->pInfo->Id();
54 if (id && !strcmp(id, fid))
55 return pItemInfo->item;
61 static SItemInfo *_find_item_info(Eina_List *list, Elm_Object_Item *item)
67 EINA_LIST_FOREACH(list, l, obj) {
68 pItemInfo = (SItemInfo*)obj;
69 if (pItemInfo->item == item)
78 CMediadata *pMediadata;
85 Eina_List *elItemInfo;
87 CFileGrid::SCallback callback;
90 SItemInfo *ctxt_itinfo;
91 SItemInfo *handle_itinfo;
95 CGengridItemClass *pGengridItemClass;
98 memset(this, 0, sizeof(SFileGrid));
103 void CFileGrid::sm_CbRealized(void *data, Evas_Object *obj, void *event_info)
106 if (!data || !obj || !event_info)
109 elm_object_item_signal_callback_add((Elm_Object_Item*)event_info,
110 FBR_SIGNAL_BTN_CLICKED, FBR_BASE_VIEW,
111 sm_CbSelectItem, data);
114 void CFileGrid::sm_CbUnrealized(void *data, Evas_Object *obj, void *event_info)
117 if (!data || !obj || !event_info)
120 elm_object_item_signal_callback_del((Elm_Object_Item*)event_info,
121 FBR_SIGNAL_BTN_CLICKED, FBR_BASE_VIEW,
125 void CFileGrid::Action(void)
128 m->handle_itinfo = m->ctxt_itinfo;
130 m_DeleteContextView();
133 void CFileGrid::m_DeleteContextView(void)
135 if(CViewMgr::GetInstance()->CheckTop(FBR_CONTEXT_VIEW))
136 CViewMgr::GetInstance()->PopView();
139 void CFileGrid::sm_CbSelectItem(void *data, Elm_Object_Item *it, const char *emission, const char *source)
142 CFileGrid* root = (CFileGrid*)data;
143 SItemInfo *pItemInfo;
148 pItemInfo = _find_item_info(root->m->elItemInfo, it);
150 _ERR(" no item info found ");
154 root->m->handle_itinfo = pItemInfo;
155 root->m_HandleSelection();
158 void CFileGrid::m_HandleSelection(void)
163 SItemInfo *pItemInfo = m->handle_itinfo;
168 type = pItemInfo->pInfo->Type();
169 if (type == E_GRP_FOLDER) {
174 id = pItemInfo->pInfo->Id();
182 elm_object_tree_focus_allow_set(m->eoBase, EINA_FALSE);
183 t_Update(m->fid, false);//_update_filegrid(m, m->fid, false);
184 elm_object_tree_focus_allow_set(m->eoBase, EINA_TRUE);
185 elm_object_focus_set(m->eoGrid, EINA_TRUE);
188 path = pItemInfo->pInfo->Path();
192 if (m->callback.cbLinkApp)
193 m->callback.cbLinkApp(m->callback.cookie, type, CInfo::SourceType(), path);
194 elm_gengrid_item_selected_set(pItemInfo->item, EINA_FALSE);
198 void CFileGrid::m_GetMediaList(char *fid)
201 ret = m->pMediadata->GetMediaList(fid, CInfo::GroupIndex(), CInfo::SourceType(), &m->elFile);
203 _ERR(" Fetching all list from file failed ");
208 void CFileGrid::m_GetFolderList(void)
211 ret = m->pMediadata->GetFolderList(CInfo::GroupIndex(), CInfo::SourceType(), &m->elFile);
213 _ERR(" Fetching all list from file failed ");
218 void CFileGrid::t_CreateFileGrid(void)
222 grid = elm_gengrid_add(m->eoBase);
225 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
226 elm_gengrid_align_set(grid, 0, 0);
227 elm_object_part_content_set(m->eoBase, FBR_PART_MEDIA_GRID, grid);
231 evas_object_smart_callback_add(grid, FBR_SIGNAL_REALIZED, sm_CbRealized, this);
232 evas_object_smart_callback_add(grid, FBR_SIGNAL_UNREALIZED, sm_CbUnrealized, this);
233 elm_gengrid_item_size_set(grid, elm_config_scale_get() * GENGRID_ITEM_SIZE_W, elm_config_scale_get() * GENGRID_ITEM_SIZE_H);
237 m->pGengridItemClass = new CGengridItemClass;
238 if (!m->pGengridItemClass->Create()) {
239 delete m->pGengridItemClass;
240 m->pGengridItemClass = NULL;
241 evas_object_del(grid);
242 _ERR(" elm_genlist_item_class_new failed ");
246 evas_object_show(grid);
250 void CFileGrid::t_Empty(bool sort_flag)
253 elm_gengrid_clear(m->eoGrid);
254 evas_object_del(m->eoGrid);
258 if (m->pGengridItemClass)
260 m->pGengridItemClass->Destroy();
261 delete m->pGengridItemClass;
262 m->pGengridItemClass = NULL;
265 if (sort_flag == false && m->elFile != NULL) {
266 eina_list_free(m->elFile);
270 m->elItemInfo = NULL;
271 if (m->callback.cbUpdateEmptyFocusSequence)
272 m->callback.cbUpdateEmptyFocusSequence(m->callback.cookie);
276 void CFileGrid::t_Update(char *fid, bool sort_flag)
278 _DBG("fid: %s, sort_flag: %d", fid, sort_flag);
280 elm_gengrid_clear(m->eoGrid);
281 if (sort_flag == false && m->elFile != NULL) {
282 eina_list_free(m->elFile);
286 m->elItemInfo = NULL;
287 if (m->callback.cbUpdateEmptyFocusSequence)
288 m->callback.cbUpdateEmptyFocusSequence(m->callback.cookie);
290 if (sort_flag == false) {
297 const char* sortType;
298 switch(CInfo::SortType())
301 sortType = SORT_BY_NAME_AZ;
304 sortType = SORT_BY_NAME_ZA;
307 sortType = SORT_BY_DATE_ASC;
310 sortType = SORT_BY_DATE_DES;
313 sortType = SORT_BY_SIZE_ASC;
316 sortType = SORT_BY_SIZE_DES;
319 _DBG("Fix your code : sortType is invalid");
320 sortType = SORT_BY_NAME_AZ;
324 m->elFile = CSortMgr::Sort(m->elFile, sortType);
334 void CFileGrid::t_Fill(void)
338 SItemInfo *pItemInfo;
342 _DBG("grid: %x, flist: %x", m->eoGrid, m->elFile);
343 if (!m->eoGrid || !m->elFile)
346 ts = eina_list_count(m->elFile);
347 _DBG("count: %d", ts);
352 EINA_LIST_FOREACH(m->elFile, l, obj) {
353 pInfo = (CExtNameInfo*)obj;
354 pItemInfo = (SItemInfo *)calloc(1, sizeof(SItemInfo));
356 _DBG("Fail to allocate memory!!!!!!");
360 pItemInfo->pInfo = pInfo;
361 pItemInfo->item = elm_gengrid_item_append(m->eoGrid, m->pGengridItemClass->Handle(), pItemInfo, NULL, m);
362 m->elItemInfo = eina_list_append(m->elItemInfo, pItemInfo);
365 if (m->callback.cbUpdatedGrid)
366 m->callback.cbUpdatedGrid(m->callback.cookie);
370 bool CFileGrid::Create(Evas_Object* win, Evas_Object *base, const SCallback *cb)
376 _CHECK(m = new SFileGrid)
377 _CHECK(m->pMediadata = new CMediadata )
378 _CHECK(m->pMediadata->Create())
387 _CHECK_FAIL{ m->pMediadata->Destroy(); }
388 _CHECK_FAIL{ delete m->pMediadata; }
389 _CHECK_FAIL{ delete m; m = NULL; }
390 } _CREATE_END_AND_CATCH{ return false; }
397 void CFileGrid::Destroy(void)
403 m_DeleteContextView();
407 m->pMediadata->Destroy();
408 delete m->pMediadata;
414 void CFileGrid::Update(bool sort_flag)
419 if (sort_flag == true) {
422 t_Update(fid, sort_flag);
426 void CFileGrid::SetFocus(Eina_Bool flag)
430 elm_object_focus_set(m->eoGrid, flag);
434 Evas_Object* CFileGrid::Grid(void)
442 void CFileGrid::OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) {
444 SItemInfo *pItemInfo;
447 _DBG("%s", ev->keyname);
449 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
451 if (m->callback.cbUnsetFocus)
452 m->callback.cbUnsetFocus(m->callback.cookie);
455 t_Update(NULL, false);
456 it = _find_item_by_id(m->elItemInfo, m->fid);
457 elm_gengrid_item_show(it, ELM_GENGRID_ITEM_SCROLLTO_IN);
458 elm_object_item_focus_set(it, EINA_TRUE);
461 else if (!strcmp(ev->keyname, KEY_ENTER) || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
462 it = elm_object_focused_item_get(obj);
464 _ERR(" unable to get focused item ");
467 pItemInfo = _find_item_info(m->elItemInfo, it);
471 m->handle_itinfo = pItemInfo;
474 else if (!strcmp(ev->keyname, KEY_MENU) || !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
475 it = elm_object_focused_item_get(obj);
477 _ERR(" unable to get focused item ");
480 pItemInfo = _find_item_info(m->elItemInfo, it);
484 m->ctxt_itinfo = pItemInfo;
486 CViewMgr::GetInstance()->PushView(FBR_CONTEXT_VIEW, pItemInfo->pInfo);
491 void CFileGrid::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
493 Elm_Object_Item *item;
498 item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
499 ev->cur.canvas.y, NULL, NULL);
503 elm_object_item_focus_set(item, EINA_TRUE);