9e52983f73423c0091a041853e0d51f616e20b93
[apps/web/download-manager.git] / src / download-manager-view.cpp
1 /*
2  * Copyright 2012  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://www.tizenopensource.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  * @file        download-manager-view.cpp
19  * @author      Jungki Kwak (jungki.kwak@samsung.com)
20  * @brief       UI manager class for download list view and delete view
21  */
22 #include <sstream>
23 #include <queue>
24 #include "download-manager-view.h"
25 #include "download-manager-history-db.h"
26 #include "download-manager-downloadItem.h"
27
28 static void destroy_window_cb(void *data, Evas_Object *obj, void *event);
29
30 enum {
31         DOWNLOAD_NOTIFY_SELECTED,
32         DOWNLOAD_NOTIFY_DELETED
33 };
34
35 DownloadView::DownloadView(void)
36         : eoWindow(NULL)
37         , eoBackground(NULL)
38         , eoLayout(NULL)
39         , eoNaviBar(NULL)
40         , eoNaviBarItem(NULL)
41         , eoBackBtn(NULL)
42         , eoControlBar(NULL)
43         , eoCbItemDelete(NULL)
44         , eoCbItemCancel(NULL)
45         , eoCbItemEmpty(NULL)
46         , eoNotifyTimer(NULL)
47         , eoBoxLayout(NULL)
48         , eoBox(NULL)
49         , eoDldList(NULL)
50         , eoPopup(NULL)
51         , eoSelectAllLayout(NULL)
52         , eoAllCheckedBox(NULL)
53         , eoNotifyInfoLayout(NULL)
54         , m_allChecked(EINA_FALSE)
55 #ifndef _TIZEN_PUBLIC
56         , m_sweepedItem(NULL)
57 #endif
58         , m_viewItemCount(0)
59 {
60 // FIXME Later : init private members
61         DownloadEngine &engine = DownloadEngine::getInstance();
62         engine.initEngine();
63         DateUtil &inst = DateUtil::getInstance();
64         inst.updateLocale();
65         dldGenlistGroupStyle.item_style = "grouptitle";
66         dldGenlistGroupStyle.func.text_get = getGenlistGroupLabelCB;
67         dldGenlistGroupStyle.func.content_get = NULL;
68         dldGenlistGroupStyle.func.state_get = NULL;
69         dldGenlistGroupStyle.func.del = NULL;
70
71         m_today.setType(DATETIME::DATE_TYPE_TODAY);
72         m_yesterday.setType(DATETIME::DATE_TYPE_YESTERDAY);
73         m_previousDay.setType(DATETIME::DATE_TYPE_PREVIOUS);
74 }
75
76 DownloadView::~DownloadView()
77 {
78         DP_LOG_FUNC();
79 //      DownloadEngine &engine = DownloadEngine::getInstance();
80 //      engine.deinitEngine();
81 }
82
83 Evas_Object *DownloadView::create(void)
84 {
85         Evas_Object *window = NULL;
86         window = createWindow(PACKAGE);
87         if (!window)
88                 return NULL;
89
90         createBackground(window);
91         createLayout(window);
92         setIndicator(window);
93         createView();
94
95         return window;
96 }
97
98 void DownloadView::destroy()
99 {
100         DownloadEngine &engine = DownloadEngine::getInstance();
101         engine.deinitEngine();
102         ecore_timer_del(eoNotifyTimer);
103 }
104
105 void DownloadView::show()
106 {
107         DP_LOG_FUNC();
108 #ifdef _SILENT_LAUNCH
109         evas_object_show(eoWindow);
110 #endif
111         elm_win_raise(eoWindow);
112         handleUpdateDateGroupType(NULL);
113 }
114
115 void DownloadView::hide()
116 {
117         DP_LOG_FUNC();
118         removePopup();
119 #ifndef _TIZEN_PUBLIC
120         cancelSweepEvent();
121 #endif
122         destroyNotifyInfo();
123         if (isGenlistEditMode()) {
124                 hideGenlistEditMode();
125         }
126 #ifdef _SILENT_LAUNCH
127         evas_object_hide(eoWindow);
128 #endif
129         elm_win_lower(eoWindow);
130 }
131
132 void DownloadView::activateWindow()
133 {
134         if (!eoWindow)
135                 create();
136
137         show();
138 }
139
140 #ifndef _TIZEN_PUBLIC
141 void DownloadView::rotateWindow(int angle)
142 {
143         if (angle >= 0)
144                 elm_win_rotation_with_resize_set(eoWindow, angle);
145 }
146 #endif
147
148 void DownloadView::showViewItem(int id, const char *title)
149 {
150         DP_LOG_FUNC();
151 }
152
153 /* This is called by AUL view mode */
154 void DownloadView::playContent(int id, const char *title)
155 {
156         DP_LOG_FUNC();
157 }
158
159 void DownloadView::setIndicator(Evas_Object *window)
160 {
161         elm_win_indicator_mode_set(window, ELM_WIN_INDICATOR_SHOW);
162 }
163
164 Evas_Object *DownloadView::createWindow(const char *windowName)
165 {
166         eoWindow = elm_win_add(NULL, windowName, ELM_WIN_BASIC);
167         if (eoWindow) {
168                 elm_win_title_set(eoWindow, __("IDS_BR_HEADER_DOWNLOAD_MANAGER"));
169                 elm_win_borderless_set(eoWindow, EINA_TRUE);
170                 elm_win_conformant_set(eoWindow, 1);
171                 evas_object_smart_callback_add(eoWindow, "delete,request",
172                                 destroy_window_cb,      static_cast<void*>(this));
173         }
174         return eoWindow;
175 }
176
177 Evas_Object *DownloadView::createBackground(Evas_Object *window)
178 {
179         if (!window)
180                 return NULL;
181
182         eoBackground = elm_bg_add(window);
183         if (eoBackground) {
184                 evas_object_size_hint_weight_set(eoBackground, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
185                 elm_win_resize_object_add(window, eoBackground);
186                 evas_object_show(eoBackground);
187         } else {
188                 DP_LOGE("Fail to create bg object");
189         }
190         return eoBackground;
191 }
192
193 Evas_Object *DownloadView::createLayout(Evas_Object *parent)
194 {
195         if (!parent) {
196                 DP_LOGE("Invalid Paramter");
197                 return NULL;
198         }
199
200         eoLayout = elm_layout_add(parent);
201         if (eoLayout) {
202                 if (!elm_layout_theme_set(eoLayout, "layout", "application", "default" ))
203                         DP_LOGE("Fail to set elm_layout_theme_set");
204
205                 evas_object_size_hint_weight_set(eoLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
206                 elm_win_resize_object_add(parent, eoLayout);
207
208                 edje_object_signal_emit(elm_layout_edje_get(eoLayout), "elm,state,show,indicator", "elm");
209                 evas_object_show(eoLayout);
210         } else {
211                 DP_LOGE("Fail to create layout");
212         }
213         return eoLayout;
214 }
215
216 void DownloadView::createView()
217 {
218         DP_LOG_FUNC();
219         createNaviBar();
220         createList();
221         if (m_viewItemCount < 1)
222                 showEmptyView();
223 }
224
225 void DownloadView::createNaviBar()
226 {
227         DP_LOGD_FUNC();
228         eoNaviBar = elm_naviframe_add(eoLayout);
229         elm_object_part_content_set(eoLayout, "elm.swallow.content", eoNaviBar);
230         createBackBtn();
231         createBox();
232         eoNaviBarItem = elm_naviframe_item_push(eoNaviBar,
233                 __("IDS_BR_HEADER_DOWNLOAD_MANAGER"),eoBackBtn, NULL, eoBoxLayout, NULL);
234         createControlBar();
235         evas_object_show(eoNaviBar);
236 }
237
238 void DownloadView::createBackBtn()
239 {
240         DP_LOGD_FUNC();
241         eoBackBtn = elm_button_add(eoNaviBar);
242         elm_object_style_set(eoBackBtn, "naviframe/end_btn/default");
243         evas_object_smart_callback_add(eoBackBtn, "clicked", backBtnCB,NULL);
244         evas_object_show(eoBackBtn);
245 }
246
247 void DownloadView::createControlBar()
248 {
249         DP_LOGD_FUNC();
250
251         eoControlBar = elm_toolbar_add(eoNaviBar);
252         if (eoControlBar == NULL)
253                 return;
254         elm_toolbar_shrink_mode_set(eoControlBar, ELM_TOOLBAR_SHRINK_EXPAND);
255         eoCbItemDelete = elm_toolbar_item_append(eoControlBar, NULL,
256                 S_("IDS_COM_OPT_DELETE"), cbItemDeleteCB, eoNaviBar);
257         eoCbItemEmpty = elm_toolbar_item_append(eoControlBar, NULL, NULL, NULL, NULL);
258         elm_object_item_part_content_set(eoNaviBarItem, "controlbar",
259                 eoControlBar);
260         elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
261         elm_object_item_disabled_set(eoCbItemEmpty, EINA_TRUE);
262         evas_object_show(eoControlBar);
263 }
264
265 void DownloadView::createBox()
266 {
267         DP_LOGD_FUNC();
268         eoBoxLayout = elm_layout_add(eoNaviBar);
269         elm_layout_file_set(eoBoxLayout,
270                 "/opt/apps/com.samsung.download-manager/res/edje/download-manager.edj",
271                 "download/selectioninfo");
272
273         evas_object_size_hint_weight_set(eoBoxLayout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
274         evas_object_size_hint_align_set(eoBoxLayout, EVAS_HINT_FILL, EVAS_HINT_FILL);
275
276         eoBox = elm_box_add(eoBoxLayout);
277         elm_object_part_content_set(eoBoxLayout, "gen.swallow.contents", eoBox);
278
279         evas_object_show(eoBox);
280         evas_object_show(eoBoxLayout);
281 }
282
283 void DownloadView::createList()
284 {
285         //DP_LOGD_FUNC();
286         eoDldList = elm_genlist_add(eoBoxLayout);
287         DP_LOGD("create::eoDldList[%p]",eoDldList);
288 /* When using ELM_LIST_LIMIT, the window size is broken at the landscape mode */
289         evas_object_size_hint_weight_set(eoDldList, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
290         evas_object_size_hint_align_set(eoDldList, EVAS_HINT_FILL, EVAS_HINT_FILL);
291         elm_genlist_homogeneous_set(eoDldList, EINA_TRUE);
292         elm_genlist_block_count_set(eoDldList,8);
293
294 #ifndef _TIZEN_PUBLIC
295         evas_object_smart_callback_add(eoDldList, "drag,start,right", sweepRightCB, NULL);
296         evas_object_smart_callback_add(eoDldList, "drag,start,left", sweepLeftCB, NULL);
297 #endif
298         elm_box_pack_end(eoBox, eoDldList);
299         evas_object_show(eoDldList);
300 }
301
302 void destroy_window_cb(void *data, Evas_Object *obj, void *event)
303 {
304         DP_LOG_FUNC();
305         elm_exit();
306 }
307
308 void DownloadView::changedRegion()
309 {
310         DateUtil &inst = DateUtil::getInstance();
311         inst.updateLocale();
312         elm_genlist_realized_items_update(eoDldList);
313 }
314
315 void DownloadView::attachViewItem(ViewItem *viewItem)
316 {
317         DP_LOG_FUNC();
318         if (m_viewItemCount < 1) {
319                 hideEmptyView();
320                 createList();
321         }
322         if (viewItem) {
323                 addViewItemToGenlist(viewItem);
324                 m_viewItemCount++;
325         }
326 }
327
328 void DownloadView::detachViewItem(ViewItem *viewItem)
329 {
330         DP_LOG("delete viewItem[%p]",viewItem);
331         if (viewItem) {
332                 delete viewItem;
333                 m_viewItemCount--;
334         }
335         if (!isGenlistEditMode() &&
336                         (m_viewItemCount < 1))
337                 showEmptyView();
338 }
339
340 void DownloadView::update()
341 {
342         Elm_Object_Item *it = NULL;
343         DP_LOG_FUNC();
344         if (!eoDldList) {
345                 DP_LOGE("download list is NULL");
346                 return;
347         }
348         it = elm_genlist_first_item_get(eoDldList);
349         while (it) {
350                 DP_LOGD("glItem[%p]",it);
351                 elm_genlist_item_update(it);
352                 it = elm_genlist_item_next_get(it);
353         }
354 }
355
356 void DownloadView::update(ViewItem *viewItem)
357 {
358         if (!viewItem)
359                 return;
360
361         DP_LOG("DownloadView::update viewItem [%p]", viewItem);
362         elm_genlist_item_update(viewItem->genlistItem());
363 }
364
365 void DownloadView::update(Elm_Object_Item *glItem)
366 {
367         if (!glItem)
368                 return;
369
370         DP_LOG("DownloadView::update glItem [%p]", glItem);
371         elm_genlist_item_update(glItem);
372 }
373
374 #ifndef _TIZEN_PUBLIC
375 ViewItem *DownloadView::findViewItemForGenlistItem(Elm_Object_Item *glItem)
376 {
377         Elm_Object_Item *it = NULL;
378         ViewItem *viewItem = NULL;
379         if (!eoDldList) {
380                 DP_LOGE("download list is NULL");
381                 return NULL;
382         }
383         it = elm_genlist_first_item_get(eoDldList);
384         while (it) {
385                 /* don't search group item */
386                 if (elm_genlist_item_select_mode_get(it) !=
387                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY && it == glItem) {
388                         viewItem = (ViewItem *)elm_object_item_data_get(it);
389                         break;
390                 }
391                 it = elm_genlist_item_next_get(it);
392         }
393
394         return viewItem;
395 }
396 #endif
397
398 void DownloadView::addViewItemToGenlist(ViewItem *viewItem)
399 {
400         DP_LOG_FUNC();
401         handleUpdateDateGroupType(viewItem);
402         createGenlistItem(viewItem);
403 }
404
405 void DownloadView::createGenlistItem(ViewItem *viewItem)
406 {
407         Elm_Object_Item *glItem = NULL;
408         Elm_Object_Item *glGroupItem = NULL;
409         /* EAPI Elm_Object_Item *elm_genlist_item_prepend(
410          *      Evas_Object *obj,
411          *      const Elm_Genlist_Item_Class *itc,
412          *      const void *data,
413          *      Elm_Object_Item *parent,
414          *      Elm_Genlist_Item_Type flags,
415          *      Evas_Smart_Cb func,
416          *      const void *func_data) EINA_ARG_NONNULL(1); */
417         glGroupItem = getGenlistGroupItem(viewItem->dateGroupType());
418         DP_LOGD("group item[%p]",glGroupItem);
419         if (!glGroupItem) {
420                 DateGroup *dateGrpObj = getDateGroupObj(viewItem->dateGroupType());
421                 if (!viewItem->isFinished()) {
422                         glGroupItem = elm_genlist_item_prepend(
423                                 eoDldList,
424                                 &dldGenlistGroupStyle,
425                                 static_cast<const void*>(dateGrpObj),
426                                 NULL,
427                                 ELM_GENLIST_ITEM_GROUP,
428                                 NULL,
429                                 NULL);
430                 } else {
431                         /* Download History Item */
432                         glGroupItem = elm_genlist_item_append(
433                                 eoDldList,
434                                 &dldGenlistGroupStyle,
435                                 static_cast<const void*>(dateGrpObj),
436                                 NULL,
437                                 ELM_GENLIST_ITEM_GROUP,
438                                 NULL,
439                                 NULL);
440                 }
441                 if (!glGroupItem)
442                         DP_LOGE("Fail to add a genlist group item");
443                 else
444                         elm_genlist_item_select_mode_set(glGroupItem,
445                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
446                 setGenlistGroupItem(viewItem->dateGroupType(), glGroupItem);
447         }
448         increaseGenlistGroupCount(viewItem->dateGroupType());
449         if (!viewItem->isFinished()) {
450                 glItem = elm_genlist_item_insert_after(
451                         eoDldList,
452                         viewItem->elmGenlistStyle(),
453                         static_cast<const void*>(viewItem),
454                         glGroupItem,
455                         glGroupItem,
456                         ELM_GENLIST_ITEM_NONE,
457                         genlistClickCB,
458                         static_cast<const void*>(viewItem));
459         } else {
460                 /* Download History Item */
461                 glItem = elm_genlist_item_append(
462                         eoDldList,
463                         viewItem->elmGenlistStyle(),
464                         static_cast<const void*>(viewItem),
465                         glGroupItem,
466                         ELM_GENLIST_ITEM_NONE,
467                         genlistClickCB,
468                         static_cast<const void*>(viewItem));
469         }
470         if (!glItem)
471                 DP_LOGE("Fail to add a genlist item");
472
473         DP_LOGD("genlist groupItem[%p] item[%p] viewItem[%p]", glGroupItem, glItem, viewItem);
474         viewItem->setGenlistItem(glItem);
475         /* Move scrollbar to top.
476          * When groupItem means today group in case of addtion of download link item
477         **/
478         if (!viewItem->isFinished())
479                 elm_genlist_item_show(glGroupItem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
480 }
481
482 void DownloadView::showEmptyView()
483 {
484         DP_LOGD_FUNC();
485         if (!eoEmptyNoContent) {
486                 eoEmptyNoContent = elm_layout_add(eoLayout);
487                 elm_layout_theme_set(eoEmptyNoContent, "layout", "nocontents", "text");
488                 evas_object_size_hint_weight_set(eoEmptyNoContent, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
489                 evas_object_size_hint_align_set(eoEmptyNoContent, EVAS_HINT_FILL, EVAS_HINT_FILL);
490                 elm_object_part_text_set(eoEmptyNoContent, "elm.text",
491                         __("IDS_DL_BODY_NO_DOWNLOADS"));
492                 evas_object_size_hint_weight_set (eoEmptyNoContent,
493                         EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
494
495                 if (eoDldList) {
496                         elm_box_unpack(eoBox,eoDldList);
497                         /* Detection code */
498                         DP_LOGD("del::eoDldList[%p]",eoDldList);
499                         evas_object_del(eoDldList);
500                         eoDldList = NULL;
501                 }
502                 elm_box_pack_start(eoBox, eoEmptyNoContent);
503         }
504         evas_object_show(eoEmptyNoContent);
505         elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
506 }
507
508 void DownloadView::hideEmptyView()
509 {
510         DP_LOGD_FUNC();
511         if(eoEmptyNoContent) {
512                 elm_box_unpack(eoBox, eoEmptyNoContent);
513                 evas_object_del(eoEmptyNoContent);
514                 eoEmptyNoContent = NULL;
515         }
516         elm_object_item_disabled_set(eoCbItemDelete, EINA_FALSE);
517 }
518
519 bool DownloadView::isGenlistEditMode()
520 {
521         return (bool)elm_genlist_decorate_mode_get(eoDldList);
522 }
523
524 #ifndef _TIZEN_PUBLIC
525 void DownloadView::cancelSweepEvent()
526 {
527         DP_LOGD_FUNC();
528         if (m_sweepedItem) {
529                 m_sweepedItem->sweepLeft();
530                 m_sweepedItem = NULL;
531         }
532 }
533 #endif
534
535 void DownloadView::createSelectAllLayout()
536 {
537         eoSelectAllLayout = elm_layout_add(eoBox);
538         elm_layout_theme_set(eoSelectAllLayout, "genlist", "item",
539                 "select_all/default");
540         evas_object_size_hint_weight_set(eoSelectAllLayout, EVAS_HINT_EXPAND,
541                 EVAS_HINT_FILL);
542         evas_object_size_hint_align_set(eoSelectAllLayout, EVAS_HINT_FILL,
543                 EVAS_HINT_FILL);
544         evas_object_event_callback_add(eoSelectAllLayout, EVAS_CALLBACK_MOUSE_DOWN,
545                 selectAllClickedCB, NULL);
546         eoAllCheckedBox = elm_check_add(eoSelectAllLayout);
547         elm_check_state_pointer_set(eoAllCheckedBox, &m_allChecked);
548         evas_object_smart_callback_add(eoAllCheckedBox, "changed",
549                 selectAllChangedCB, NULL);
550         evas_object_propagate_events_set(eoAllCheckedBox, EINA_FALSE);
551         elm_object_part_content_set(eoSelectAllLayout, "elm.icon", eoAllCheckedBox);
552         elm_object_text_set(eoSelectAllLayout, S_("IDS_COM_BODY_SELECT_ALL"));
553         elm_box_pack_start(eoBox, eoSelectAllLayout);
554         evas_object_show(eoSelectAllLayout);
555         m_allChecked = EINA_FALSE;
556 }
557
558 void DownloadView::changeAllCheckedValue()
559 {
560         m_allChecked = !m_allChecked;
561         elm_check_state_pointer_set(eoAllCheckedBox, &m_allChecked);
562         handleChangedAllCheckedState();
563 }
564
565 void DownloadView::destroyCheckedItem()
566 {
567         Eina_List *list = NULL;
568         Elm_Object_Item *it = NULL;
569         ViewItem *item = NULL;
570         int checkedCount = 0;
571         queue <unsigned int> deleteQueue;
572
573         DP_LOGD_FUNC();
574
575         it = elm_genlist_first_item_get(eoDldList);
576
577         while (it) {
578                 item = (ViewItem *)elm_object_item_data_get(it);
579                 /* elm_genlist_item_select_mode_get is needed to check group item */
580                 if (elm_genlist_item_select_mode_get(it) !=
581                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY &&
582                                 item && item->checkedValue()) {
583                         list = eina_list_append(list, it);
584                 }
585                 it = elm_genlist_item_next_get(it);
586         }
587
588         if (!list) {
589                 DP_LOGD("There is no delete item");
590                 return;
591         }
592
593         checkedCount = eina_list_count(list);
594         if (checkedCount < 1)
595                 return;
596         DP_LOGD("checkedCount[%d]", checkedCount);
597
598         for (int i = 0; i < checkedCount; i++)
599         {
600                 it = (Elm_Object_Item *)eina_list_data_get(list);
601                 if (it)
602                         item = (ViewItem *)elm_object_item_data_get(it);
603                 else
604                         DP_LOGE("genlist item is null");
605                 list = eina_list_next(list);
606                 if (item) {
607                         deleteQueue.push(item->historyId());
608                         item->destroy();
609                 } else {
610                         DP_LOGE("viewItem is null");
611                 }
612         }
613         if (list)
614                 eina_list_free(list);
615
616         DownloadHistoryDB::deleteMultipleItem(deleteQueue);
617         showNotifyInfo(DOWNLOAD_NOTIFY_DELETED, checkedCount);
618         hideGenlistEditMode();
619 }
620
621 void DownloadView::showGenlistEditMode()
622 {
623         DP_LOG_FUNC();
624 #ifndef _TIZEN_PUBLIC
625         cancelSweepEvent();
626 #endif
627         /* Initialize notify info widget */
628         destroyNotifyInfo();
629         elm_object_item_text_set(eoNaviBarItem, S_("IDS_COM_OPT_DELETE"));
630         /* Change layoutbackground color to edit mode color */
631         elm_object_style_set(eoBackground, "edit_mode");
632         /* Disable the back button of control bar */
633         elm_object_item_part_content_unset(eoNaviBarItem, "prev_btn");
634         destroyEvasObj(eoBackBtn);
635
636         if (eoCbItemEmpty)
637                 elm_object_item_del(eoCbItemEmpty);
638         eoCbItemCancel = elm_toolbar_item_append(eoControlBar, NULL,
639                 S_("IDS_COM_SK_CANCEL"), cbItemCancelCB, eoNaviBar);
640
641         /* Append 'Select All' layout */
642         createSelectAllLayout();
643         /* Set reorder end edit mode */
644         elm_genlist_reorder_mode_set(eoDldList, EINA_TRUE);
645         elm_genlist_decorate_mode_set(eoDldList, EINA_TRUE);
646         /* This means even if the ouside of checked box is selected,
647            it is same to click a check box. */
648         elm_genlist_select_mode_set(eoDldList, ELM_OBJECT_SELECT_MODE_ALWAYS);
649
650         Elm_Object_Item *it = NULL;
651         ViewItem *viewItem = NULL;
652         it = elm_genlist_first_item_get(eoDldList);
653         while (it) {
654                 viewItem = (ViewItem *)elm_object_item_data_get(it);
655                 if (elm_genlist_item_select_mode_get(it) !=
656                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY &&
657                                 viewItem && !(viewItem->isFinished()))
658                         elm_object_item_disabled_set(it, EINA_TRUE);
659                 it = elm_genlist_item_next_get(it);
660         }
661         elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
662 }
663
664 void DownloadView::hideGenlistEditMode()
665 {
666         DP_LOG_FUNC();
667
668         elm_object_item_text_set(eoNaviBarItem, __("IDS_BR_HEADER_DOWNLOAD_MANAGER"));
669         elm_object_style_set(eoBackground, "default");
670
671         /* Recreate back button */
672         createBackBtn();
673         elm_object_item_part_content_set(eoNaviBarItem, "prev_btn", eoBackBtn);
674
675         if (eoCbItemCancel) {
676                 elm_object_item_del(eoCbItemCancel);
677                 eoCbItemCancel = NULL;
678         }
679         eoCbItemEmpty = elm_toolbar_item_append(eoControlBar, NULL, NULL, NULL, NULL);
680         elm_object_item_disabled_set(eoCbItemEmpty, EINA_TRUE);
681
682         elm_box_unpack(eoBox, eoSelectAllLayout);
683
684         destroyEvasObj(eoAllCheckedBox);
685         destroyEvasObj(eoSelectAllLayout);
686
687         elm_genlist_reorder_mode_set(eoDldList, EINA_FALSE);
688         elm_genlist_decorate_mode_set(eoDldList, EINA_FALSE);
689         elm_genlist_select_mode_set(eoDldList, ELM_OBJECT_SELECT_MODE_DEFAULT);
690
691         Elm_Object_Item *it = NULL;
692         ViewItem *viewItem = NULL;
693         it = elm_genlist_first_item_get(eoDldList);
694         while (it) {
695                 viewItem = (ViewItem *)elm_object_item_data_get(it);
696                 if (elm_genlist_item_select_mode_get(it) !=
697                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY && viewItem) {
698                         if (elm_object_item_disabled_get(it))
699                                 elm_object_item_disabled_set(it, EINA_FALSE);
700                         viewItem->setCheckedValue(EINA_FALSE);
701                         viewItem->setCheckedBtn(NULL);
702                 }
703                 it = elm_genlist_item_next_get(it);
704         }
705
706         m_allChecked = EINA_FALSE;
707
708         if (m_viewItemCount < 1) {
709                 elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
710                 showEmptyView();
711         } else
712                 elm_object_item_disabled_set(eoCbItemDelete, EINA_FALSE);
713 }
714
715 void DownloadView::handleChangedAllCheckedState()
716 {
717         int checkedCount = 0;
718         Elm_Object_Item *it = NULL;
719         ViewItem *viewItem = NULL;
720         it = elm_genlist_first_item_get(eoDldList);
721         while (it) {
722                 viewItem = (ViewItem *)elm_object_item_data_get(it);
723                 if (elm_genlist_item_select_mode_get(it) !=
724                         ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY && viewItem) {
725                         if (viewItem->isFinished()) {
726                                 viewItem->setCheckedValue(m_allChecked);
727                                 viewItem->updateCheckedBtn();
728                                 checkedCount++;
729                         }
730                 }
731                 it = elm_genlist_item_next_get(it);
732         }
733
734         if (m_allChecked && checkedCount > 0) {
735                 elm_object_item_disabled_set(eoCbItemDelete, EINA_FALSE);
736                 showNotifyInfo(DOWNLOAD_NOTIFY_SELECTED, checkedCount);
737         } else {
738                 elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
739                 showNotifyInfo(DOWNLOAD_NOTIFY_SELECTED, 0);
740         }
741 }
742
743 void DownloadView::handleCheckedState()
744 {
745         int checkedCount = 0;
746         int deleteAbleTotalCount = 0;
747
748         DP_LOGD_FUNC();
749
750         Elm_Object_Item *it = NULL;
751         ViewItem *viewItem = NULL;
752         it = elm_genlist_first_item_get(eoDldList);
753         while (it) {
754                 viewItem = (ViewItem *)elm_object_item_data_get(it);
755                 if (elm_genlist_item_select_mode_get(it) !=
756                         ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY && viewItem) {
757                         if (viewItem->checkedValue())
758                                 checkedCount++;
759                         if (viewItem->isFinished())
760                                 deleteAbleTotalCount++;
761                 }
762                 it = elm_genlist_item_next_get(it);
763         }
764
765         if (checkedCount == deleteAbleTotalCount)
766                 m_allChecked = EINA_TRUE;
767         else
768                 m_allChecked = EINA_FALSE;
769         elm_check_state_pointer_set(eoAllCheckedBox, &m_allChecked);
770
771         if (checkedCount == 0) {
772                 elm_object_item_disabled_set(eoCbItemDelete, EINA_TRUE);
773                 destroyNotifyInfo();
774         } else
775                 elm_object_item_disabled_set(eoCbItemDelete, EINA_FALSE);
776         showNotifyInfo(DOWNLOAD_NOTIFY_SELECTED, checkedCount);
777 }
778 void DownloadView::createNotifyInfo()
779 {
780         DP_LOGD_FUNC();
781         eoNotifyInfoLayout = elm_layout_add(eoBoxLayout);
782         elm_object_part_content_set(eoBoxLayout, "sel.swallow.contents",
783                         eoNotifyInfoLayout);
784         evas_object_size_hint_weight_set(eoNotifyInfoLayout,
785                         EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
786         evas_object_size_hint_align_set(eoNotifyInfoLayout,
787                         EVAS_HINT_FILL, EVAS_HINT_FILL);
788 }
789
790 void DownloadView::showNotifyInfo(int type, int selectedCount)
791 {
792         string buf;
793         DP_LOGD_FUNC();
794
795         if (selectedCount == 0) {
796                 destroyNotifyInfo();
797                 return;
798         }
799
800         if (!eoNotifyInfoLayout)
801                 createNotifyInfo();
802
803         elm_layout_theme_set(eoNotifyInfoLayout, "standard", "selectioninfo",
804                         "default");
805         buf.append(" ");
806         if (type == DOWNLOAD_NOTIFY_SELECTED) {
807                 stringstream countStr;
808                 countStr << selectedCount;
809                 buf = S_("IDS_COM_BODY_SELECTED");
810                 buf.append(" (");
811                 buf.append(countStr.str());
812                 buf.append(")");
813         } else if (type == DOWNLOAD_NOTIFY_DELETED) {
814                 buf = S_("IDS_COM_POP_DELETED");
815                 if (eoNotifyTimer) {
816                         ecore_timer_del(eoNotifyTimer);
817                         eoNotifyTimer = NULL;
818                 }
819                 eoNotifyTimer = ecore_timer_add(3, deletedNotifyTimerCB, NULL);
820         }
821         elm_object_part_text_set(eoNotifyInfoLayout, "elm.text", buf.c_str());
822         elm_object_signal_emit(eoBoxLayout, "show,selection,info", "elm");
823         evas_object_show(eoNotifyInfoLayout);
824 }
825
826 Eina_Bool DownloadView::deletedNotifyTimerCB(void *data)
827 {
828         DownloadView& view = DownloadView::getInstance();
829         view.destroyNotifyInfo();
830         return ECORE_CALLBACK_RENEW;
831 }
832
833 void DownloadView::destroyNotifyInfo()
834 {
835         DP_LOGD_FUNC();
836         destroyEvasObj(eoNotifyInfoLayout);
837         eoNotifyInfoLayout = NULL;
838 }
839
840 /* Static callback function */
841 void DownloadView::showNotifyInfoCB(void *data, Evas *evas, Evas_Object *obj,
842         void *event)
843 {
844         Evas_Object *layout = (Evas_Object *)data;
845         if (!data) {
846                 DP_LOGE("data is NULL");
847                 return;
848         }
849         edje_object_signal_emit(_EDJ(layout), "elm,layout,content,bottom_padding",
850                 "layout");
851 }
852
853 void DownloadView::hideNotifyInfoCB(void *data, Evas *evas, Evas_Object *obj,
854         void *event)
855 {
856         Evas_Object *layout = (Evas_Object *)data;
857         if (!data) {
858                 DP_LOGE("data is NULL");
859                 return;
860         }
861         edje_object_signal_emit(_EDJ(layout), "elm,layout,content,default", "layout");
862 }
863
864 void DownloadView::selectAllClickedCB(void *data, Evas *evas, Evas_Object *obj,
865         void *event_info)
866 {
867         DownloadView &view = DownloadView::getInstance();
868         DP_LOGD_FUNC();
869         view.changeAllCheckedValue();
870 }
871
872 void DownloadView::selectAllChangedCB(void *data, Evas_Object *obj,
873         void *event_info)
874 {
875         DownloadView &view = DownloadView::getInstance();
876         DP_LOGD_FUNC();
877         view.handleChangedAllCheckedState();
878 }
879
880 #ifndef _TIZEN_PUBLIC
881 void DownloadView::sweepRightCB(void *data, Evas_Object *obj, void *event_info)
882 {
883         DownloadView& view = DownloadView::getInstance();
884         DP_LOGD_FUNC();
885         if (!obj || !event_info) {
886                 DP_LOGE("obj or event_info is NULL");
887                 return;
888         }
889         if (!elm_genlist_decorate_mode_get(obj)) {
890                 Elm_Object_Item *glItem = (Elm_Object_Item *)event_info;
891                 ViewItem *viewItem = view.findViewItemForGenlistItem(glItem);
892                 if (viewItem) {
893                         if (viewItem->isFinished()) {
894                                 if (view.sweepedItem())
895                                         view.sweepedItem()->sweepLeft();
896                                 viewItem->sweepRight();
897                                 view.setSweepedItem(viewItem);
898                         }
899                 } else {
900                         DP_LOGE("Fail to find view item at sweep mode");
901                 }
902         } else
903                 DP_LOGD("Unable to sweep right");
904 }
905
906 void DownloadView::sweepLeftCB(void *data, Evas_Object *obj, void *event_info)
907 {
908         DownloadView& view = DownloadView::getInstance();
909         DP_LOGD_FUNC();
910         if (!obj || !event_info) {
911                 DP_LOGE("obj or event_info is NULL");
912                 return;
913         }
914
915         if (!elm_genlist_decorate_mode_get(obj)) {
916                 Elm_Object_Item *glItem = (Elm_Object_Item *)event_info;
917                 ViewItem *viewItem = view.findViewItemForGenlistItem(glItem);
918                 if (viewItem) {
919                         if (viewItem->isFinished()) {
920                                 viewItem->sweepLeft();
921                                 view.setSweepedItem(NULL);
922                         }
923                 } else {
924                         DP_LOGE("Fail to find view item at sweep mode");
925                 }
926         } else
927                 DP_LOGD("Unable to sweep left");
928 }
929 #endif
930
931 void DownloadView::backBtnCB(void *data, Evas_Object *obj, void *event_info)
932 {
933         DownloadView& view = DownloadView::getInstance();
934         view.hide();
935 }
936
937 void DownloadView::cbItemDeleteCB(void *data, Evas_Object *obj, void *event_info)
938 {
939
940         DownloadView& view = DownloadView::getInstance();
941         if (!view.isGenlistEditMode())
942                 view.showGenlistEditMode();
943         else
944                 view.destroyCheckedItem();
945 }
946
947 void DownloadView::cbItemCancelCB(void *data, Evas_Object *obj, void *event_info)
948 {
949         DownloadView& view = DownloadView::getInstance();
950         view.destroyNotifyInfo();
951         view.hideGenlistEditMode();
952 }
953
954 void DownloadView::genlistClickCB(void *data, Evas_Object *obj, void *event_info)
955 {
956         ViewItem *item = reinterpret_cast<ViewItem *>(data);
957         DP_LOGD_FUNC();
958         if (!data) {
959                 DP_LOGE("data is NULL");
960                 return;
961         }
962         item->clickedGenlistItem();
963 }
964
965 void DownloadView::cancelClickCB(void *data, Evas_Object *obj, void *event_info)
966 {
967         ViewItem *item = NULL;
968
969         DP_LOGD_FUNC();
970
971         if (!data) {
972                 DP_LOGE("data is NULL");
973                 return;
974         }
975         item = reinterpret_cast<ViewItem *>(data);
976         item->requestCancel();
977
978 }
979
980 void DownloadView::showErrPopup(string &desc)
981 {
982         removePopup();
983
984         eoPopup = elm_popup_add(eoWindow);
985         evas_object_size_hint_weight_set(eoPopup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
986         elm_object_text_set(eoPopup, desc.c_str());
987         elm_popup_timeout_set(eoPopup, 2);
988         evas_object_smart_callback_add(eoPopup, "response", errPopupResponseCB, NULL);
989         evas_object_show(eoPopup);
990 }
991
992 void DownloadView::errPopupResponseCB(void *data, Evas_Object *obj, void *event_info)
993 {
994         DP_LOGD_FUNC();
995         DownloadView& view = DownloadView::getInstance();
996         view.removePopup();
997 }
998
999 void DownloadView::removePopup()
1000 {
1001         DP_LOGD_FUNC();
1002         destroyEvasObj(eoPopup);
1003 }
1004
1005 DateGroup *DownloadView::getDateGroupObj(int type)
1006 {
1007         DateGroup *obj = NULL;
1008         switch (type) {
1009         case DATETIME::DATE_TYPE_LATER:
1010         case DATETIME::DATE_TYPE_TODAY:
1011                 obj = &m_today;
1012                 break;
1013         case DATETIME::DATE_TYPE_YESTERDAY:
1014                 obj = &m_yesterday;
1015                 break;
1016         case DATETIME::DATE_TYPE_PREVIOUS:
1017                 obj = &m_previousDay;
1018                 break;
1019         default:
1020                 obj = NULL;
1021                 DP_LOGE("Cannot enter here");
1022                 break;
1023         }
1024         return obj;
1025 }
1026
1027 Elm_Object_Item *DownloadView::getGenlistGroupItem(int type)
1028 {
1029         DateGroup *obj = getDateGroupObj(type);
1030         if (!obj)
1031                 return NULL;
1032         return obj->glGroupItem();
1033 }
1034
1035 void DownloadView::setGenlistGroupItem(int type, Elm_Object_Item *item)
1036 {
1037         DateGroup *obj = getDateGroupObj(type);
1038         if (!obj)
1039                 return;
1040         obj->setGlGroupItem(item);
1041 }
1042
1043 void DownloadView::increaseGenlistGroupCount(int type)
1044 {
1045         DateGroup *obj = getDateGroupObj(type);
1046         if (!obj)
1047                 return;
1048         if (type == DATETIME::DATE_TYPE_TODAY || type == DATETIME::DATE_TYPE_LATER) {
1049                 if (m_today.getCount() < 1) {
1050                         DateUtil &inst = DateUtil::getInstance();
1051                         inst.setTodayStandardTime();
1052                 }
1053         }
1054         obj->increaseCount();
1055         DP_LOGD("increased count[%d]",obj->getCount());
1056 }
1057
1058 int DownloadView::getGenlistGroupCount(int type)
1059 {
1060         DateGroup *obj = getDateGroupObj(type);
1061         if (!obj)
1062                 return 0;
1063         DP_LOGD("Group count[%d]",obj->getCount());
1064         return obj->getCount();
1065 }
1066
1067 void DownloadView::handleGenlistGroupItem(int type)
1068 {
1069         DateGroup *obj = getDateGroupObj(type);
1070         if (!obj)
1071                 return;
1072         obj->decreaseCount();
1073         DP_LOGD("count[%d]type[%d]",obj->getCount(),type);
1074         if (obj->getCount() < 1) {
1075                 //DP_LOGD("Group Item[%p][%d]", obj->glGroupItem(),type);
1076                 elm_object_item_del(obj->glGroupItem());
1077                 obj->setGlGroupItem(NULL);
1078         }
1079 }
1080
1081 void DownloadView::handleUpdateDateGroupType(ViewItem *viewItem)
1082 {
1083         int diffDays = 0;
1084         DateUtil &inst = DateUtil::getInstance();
1085         DP_LOGD_FUNC();
1086         diffDays = inst.getDiffDaysFromToday();
1087         if (viewItem) {
1088         /* Update a view item which is added now
1089          * This should be only called when attaching item
1090         **/
1091                 viewItem->extractDateGroupType();
1092         } else if (diffDays != 0) {
1093         /* FIXME later
1094          * Now, it is recreated download items and group items.
1095          * Consider to move only group item later.
1096          * This should be only called from show() function
1097         **/
1098 /* FIXME later
1099  * Another problem is happend becuase eina list is used repacing with vector */
1100 #if 0
1101                 cleanGenlistData();
1102                 Elm_Object_Item *it = NULL;
1103                 ViewItem *viewItem = NULL;
1104                 it = elm_genlist_first_item_get(eoDldList);
1105                 while (it) {
1106                         viewItem = (ViewItem *)elm_object_item_data_get(it);
1107                         if (!viewItem || elm_genlist_item_select_mode_get(it) !=
1108                                         ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
1109                                 continue;
1110                         viewItem->extractDateGroupType();
1111                         createGenlistItem(viewItem);
1112                         it = elm_genlist_item_next_get(it);
1113                 }
1114 #endif
1115         }
1116         inst.setTodayStandardTime();
1117 }
1118
1119 void DownloadView::moveRetryItem(ViewItem *viewItem)
1120 {
1121         Elm_Object_Item *todayGroupItem = NULL;
1122         Elm_Object_Item *firstItem = NULL;
1123         DP_LOGD_FUNC();
1124         if (!viewItem) {
1125                 DP_LOGE("view item is NULL");
1126                 return;
1127         }
1128         firstItem = elm_genlist_first_item_get(eoDldList);
1129         if (firstItem) {
1130                 DP_LOGD("groupItem[%p] viewItem[%p]", firstItem, viewItem);
1131                 /* This is group item */
1132                 if (elm_genlist_item_select_mode_get(firstItem) ==
1133                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY) {
1134                         /* The top item is the item after group item */
1135                         firstItem = elm_genlist_item_next_get(firstItem);
1136                         DP_LOGD("firstItem[%p], present item[%p]", firstItem, viewItem->genlistItem());
1137                         if (firstItem == viewItem->genlistItem()) {
1138                                 DP_LOGD("This is already top item. Don't need to move");
1139                                 return;
1140                         }
1141                 }
1142         }
1143         elm_object_item_del(viewItem->genlistItem());
1144         viewItem->setGenlistItem(NULL);
1145         handleGenlistGroupItem(viewItem->dateGroupType());
1146         todayGroupItem = getGenlistGroupItem(DATETIME::DATE_TYPE_TODAY);
1147         if (!todayGroupItem) {
1148                 DateGroup *dateGrpObj = getDateGroupObj(DATETIME::DATE_TYPE_TODAY);
1149                 todayGroupItem = elm_genlist_item_prepend(
1150                                 eoDldList,
1151                                 &dldGenlistGroupStyle,
1152                                 static_cast<const void*>(dateGrpObj),
1153                                 NULL,
1154                                 ELM_GENLIST_ITEM_GROUP,
1155                                 NULL,
1156                                 NULL);
1157                 setGenlistGroupItem(DATETIME::DATE_TYPE_TODAY, todayGroupItem);
1158                 if (!todayGroupItem)
1159                         DP_LOGE("Fail to add a genlist group item");
1160                 else
1161                         elm_genlist_item_select_mode_set(todayGroupItem,
1162                                 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
1163         }
1164         increaseGenlistGroupCount(DATETIME::DATE_TYPE_TODAY);
1165         Elm_Object_Item *glItem = elm_genlist_item_insert_after(
1166                         eoDldList,
1167                         viewItem->elmGenlistStyle(),
1168                         static_cast<const void*>(viewItem),
1169                         todayGroupItem,
1170                         todayGroupItem,
1171                         ELM_GENLIST_ITEM_NONE,
1172                         genlistClickCB,
1173                         static_cast<const void*>(viewItem));
1174         if (!glItem)
1175                 DP_LOGE("Fail to add a genlist item");
1176         DP_LOGD("genlist groupItem[%p] item[%p] viewItem[%p]", todayGroupItem,
1177                 glItem, viewItem);
1178         viewItem->setGenlistItem(glItem);
1179         elm_genlist_item_show(todayGroupItem, ELM_GENLIST_ITEM_SCROLLTO_TOP);
1180         viewItem->extractDateGroupType();
1181 }
1182
1183 char *DownloadView::getGenlistGroupLabel(void *data, Evas_Object *obj, const char *part)
1184 {
1185         DateGroup *dateGrp = static_cast<DateGroup *>(data);
1186
1187         if(!data || !obj || !part)
1188                 return NULL;
1189
1190         DP_LOGD("ViewItem::getListGroupLabel:part[%s] groupDateType[%d] obj[%p]", part, dateGrp->getType(), obj);
1191         if (strncmp(part, "elm.text", strlen("elm.text")) == 0) {
1192                 DateUtil &inst = DateUtil::getInstance();
1193                 string msg;
1194                 string outBuf;
1195                 double udateTime = 0;
1196                 switch (dateGrp->getType()) {
1197                 case DATETIME::DATE_TYPE_PREVIOUS:
1198                         msg = S_("IDS_COM_BODY_PREVIOUS_DAYS");
1199                         break;
1200                 case DATETIME::DATE_TYPE_YESTERDAY:
1201                         udateTime = inst.yesterdayTime()*1000;
1202                         msg = S_("IDS_COM_BODY_YESTERDAY");
1203                         msg += " (";
1204                         inst.getDateStr(LOCALE_STYLE::FULL_DATE, udateTime, outBuf);
1205                         msg += outBuf;
1206                         msg += ")";
1207                         break;
1208                 case DATETIME::DATE_TYPE_LATER:
1209                 case DATETIME::DATE_TYPE_TODAY:
1210                         udateTime = inst.nowTime()*1000;
1211                         msg = S_("IDS_COM_BODY_TODAY");
1212                         msg += " (";
1213                         inst.getDateStr(LOCALE_STYLE::FULL_DATE, udateTime, outBuf);
1214                         msg += outBuf;
1215                         msg += ")";
1216                         break;
1217                 default :
1218                         DP_LOGE("Cannot enter here");
1219                         return NULL;
1220                 }
1221                 return strdup(msg.c_str());
1222         }
1223         return NULL;
1224 }
1225
1226 char *DownloadView::getGenlistGroupLabelCB(void *data, Evas_Object *obj, const char *part)
1227 {
1228 //      DP_LOGD_FUNC();
1229         if(!data || !obj || !part)
1230                 return NULL;
1231
1232         DownloadView &view = DownloadView::getInstance();
1233         return view.getGenlistGroupLabel(data, obj, part);
1234 }
1235
1236 void DownloadView::cleanGenlistData()
1237 {
1238         Elm_Object_Item *grpItem = NULL;
1239         DP_LOGD_FUNC();
1240         grpItem = m_today.glGroupItem();
1241         if (grpItem)
1242                 elm_object_item_del(grpItem);
1243         m_today.initData();
1244         grpItem = m_yesterday.glGroupItem();
1245         if (grpItem)
1246                 elm_object_item_del(grpItem);
1247         m_yesterday.initData();
1248         grpItem = m_previousDay.glGroupItem();
1249         if (grpItem)
1250                 elm_object_item_del(grpItem);
1251         m_previousDay.initData();
1252         elm_genlist_clear(eoDldList);
1253 }
1254