2433bad13962eefc08f8c7082602ca9fd137c320
[apps/core/preloaded/ug-image-viewer-efl.git] / main / src / view / ivug-main-view.cpp
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (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 #include <ui-gadget-module.h>           // ug_destroy_me, ug_send_result
18 #include <vconf.h>
19 #include <vconf-keys.h>
20 #include <utilX.h>                      // Key event
21 #include <math.h>                       // round
22
23 #include "ivug-common.h"
24 #include "ivug-parameter.h"
25
26 #include "ivug-main-view.h"
27 #include "ivug-main-view-toolbar.h"
28 #include "ivug-main-view-menu.h"
29
30 #include "ivug-filter.h"
31
32 #include "ivug-ext-ug.h"
33
34 #include "ivug-util.h"
35 #include "ivug-medialist.h"
36 #include "ivug-media.h"
37
38 #include "ivug-popup.h"
39 #include "ivug-selectioninfo.h"
40
41 #include "ivug-slider-item.h"
42 #include "ivug-slider.h"
43
44 #include "ivug-setas-view.h"
45 #include "ivug-name-view.h"
46 #include "ivug-details-view.h"
47
48 #include "ivug-listpopup.h"
49 #include "ivug-slideshow.h"
50
51
52 #include "ivug-ext-ug.h"
53
54 #include "ivug-drm-common.h"
55 #include "EFLUtil.h"
56
57
58 #include "ivug-image.h"
59
60 #include "ivug-main-view-priv.h"
61
62 #undef HIDE_INDICATOR           // For testing.
63 #define TEST_MOUSE_EVENT
64
65 #define DEFAULT_THUMBNAIL_PATH                  IMAGE_PATH"/T01_Nocontents_broken.png"
66
67 #define LONGTAP_TIMEOUT (2.0) // 2secs
68
69 // EDJE
70 #define IVUG_MAIN_EDJ   EDJ_PATH"/ivug-main.edj"
71 ///////////////////////////////////////////////////////////////////////////////////////////////////
72 //
73 //
74 static bool _destory_slideshow_and_ug(Ivug_MainView *pMainView, int state, bool bMmc_out);
75 static void _on_slideshow_finished(void *data, Evas_Object *obj, void *event_info);
76
77 void _update_title(Ivug_MainView *pMainView)
78 {
79 #define MAX_TITLE_LEN   256
80
81         static char title[MAX_TITLE_LEN];
82
83         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
84         Media_Data *mdata = ivug_medialist_get_data(mitem);
85
86         if (mdata == NULL)
87         {
88                 MSG_MAIN_ERROR("slider data is NULL");
89                 return;
90         }
91
92         if (pMainView->view_by == IVUG_VIEW_BY_FOLDER
93                 || pMainView->view_by == IVUG_VIEW_BY_ALL
94                 || pMainView->view_by == IVUG_VIEW_BY_PLACES)
95         {
96                 snprintf(title, sizeof(title), "%d/%d",
97                         mdata->index + 1,
98                         ivug_medialist_get_count(pMainView->mList));    //get title.
99         }
100         else if(mdata->fileurl != NULL)
101         {
102                 const char* filename = ivug_get_filename(mdata->fileurl);
103                 if(filename)
104                 {
105                         snprintf(title, sizeof(title), "%s", filename);
106                 }
107         }
108         else
109         {
110                 MSG_MAIN_ERROR("set Title error");
111         }
112
113         IV_ASSERT(pMainView->navi_bar != NULL);
114
115         MSG_MAIN_HIGH("Update title : %s", title);
116
117         elm_object_item_text_set(pMainView->navi_it, title);
118
119 }
120
121
122 static void
123 _on_longpress_popup_selected(void *data, Evas_Object *obj, void *event_info)
124 {
125         Ivug_MainView *pMainView = (Ivug_MainView *)data;
126         IV_ASSERT(pMainView != NULL);
127
128 // Destroy copy popup
129         pMainView->longpress_popup = NULL;              // object is removed automatically
130
131         int response = (int)event_info;
132
133         Media_Item *mtiem = ivug_slider_get_item(pMainView->slider);
134         Media_Data *mdata = ivug_medialist_get_data(mtiem);
135         if (mdata == NULL)
136         {
137                 MSG_MAIN_ERROR("slider data is NULL");
138                 return;
139         }
140
141         if(response == LPPOPUP_RESPONSE_COPY)
142         {
143                 //get current file path.
144
145                 char *path = NULL;
146                 int len = 0;
147                 // This Will add to the article
148                 char buf[IVUG_MAX_FILE_PATH_LEN] = {0,};
149
150                 {
151                         path = mdata->filepath;
152                         len = strlen(mdata->filepath)+strlen("file://")+1;
153                         snprintf(buf, IVUG_MAX_FILE_PATH_LEN, "file://%s", mdata->filepath);
154                 }
155
156                 if (len < IVUG_MAX_FILE_PATH_LEN)
157                 {
158                         MSG_MAIN_HIGH("file path = %s, file url =%s", path, buf);
159                         elm_cnp_selection_set(pMainView->layout, ELM_SEL_TYPE_CLIPBOARD, ELM_SEL_FORMAT_IMAGE, buf, sizeof(buf));
160                         _ivug_selectioninfo_create(pMainView, IDS_COPIED_TO_CLIPBOARD);
161                 }
162                 else
163                 {
164                         MSG_MAIN_ERROR("slider file path is too long");
165                 }
166         }
167 }
168
169
170 static Eina_Bool _on_key_down(void *user_data, int type, void *event)
171 {
172         if (!user_data) {
173                 MSG_IMAGEVIEW_ERROR("user data is NULL");
174                 return ECORE_CALLBACK_PASS_ON;
175         }
176
177         Ivug_MainView *pMainView = (Ivug_MainView *)user_data;
178
179         Ecore_Event_Key *key_event = (Ecore_Event_Key *) event;
180
181         if (!strcmp(key_event->keyname, KEY_END))
182         {
183                 MSG_IMAGEVIEW_HIGH("Bakc(End) key");
184         }
185         else if (!strcmp(key_event->keyname, KEY_SELECT))
186         {
187                 MSG_IMAGEVIEW_HIGH("Home key");
188         }
189         else if (!strcmp(key_event->keyname, KEY_POWER))
190         {
191                 MSG_IMAGEVIEW_HIGH("Power key");
192                 if ( pMainView->ssHandle )
193                 {
194                         ivug_ss_stop(pMainView->ssHandle);
195                 }
196         }
197
198         MSG_IMAGEVIEW_LOW("Key down : %s", key_event->keyname);
199
200         return ECORE_CALLBACK_PASS_ON;
201 }
202
203 static Eina_Bool _on_exit_timer_expired(void *data)
204 {
205         ivug_retv_if(!data, ECORE_CALLBACK_CANCEL);
206
207         Ivug_MainView *pMainView = (Ivug_MainView *)data;
208
209         pMainView->exit_timer = NULL;
210
211         DESTROY_ME();
212
213         return ECORE_CALLBACK_CANCEL;
214 }
215
216 static void _on_resize(void *data, Evas *e, Evas_Object *obj, void *event_info)
217 {
218         Ivug_MainView *pMainView = static_cast<Ivug_MainView *>(data);
219         IV_ASSERT(pMainView != NULL);
220
221         Evas_Coord x,y,w,h;
222         evas_object_geometry_get(obj, &x, &y, &w, &h);
223         /**
224         *  during slideshow, after rotation, resize cb of slideshow obj cannot be invoked,
225             so invoke it manually
226         */
227         if(pMainView->ssHandle)
228                 ivug_ss_resize(pMainView->ssHandle);
229         MSG_MAIN_HIGH("MainView resized geomtery XYWH(%d,%d,%d,%d) Rotate=%d", x, y, w, h, gGetRotationDegree());
230
231         if(pMainView->ctx_popup)        // when rotated context popup will disapper at EFL
232         {
233                 evas_object_del(pMainView->ctx_popup);
234                 pMainView->ctx_popup = NULL;
235         }
236
237         ivug_slider_zoom_reset(pMainView->slider);
238
239         pMainView->zoom_level = 1;
240         elm_slider_value_set(pMainView->zoom_slider, 1.0);
241 }
242
243 static bool _destory_slideshow_and_ug(Ivug_MainView *pMainView,
244         int state,
245         bool bMmc_out)
246 {
247         IV_ASSERT(pMainView != NULL);
248         evas_object_smart_callback_del_full(ivug_ss_object_get(pMainView->ssHandle),
249                 "slideshow,finished", _on_slideshow_finished, pMainView);
250
251         ivug_allow_lcd_off();
252         /*from gallery ablum*/
253         if(bMmc_out)
254         {
255                 if (pMainView->ssHandle)
256                 {
257                         MSG_MAIN_HIGH("image viewer end cause slide show ended");
258                         ivug_ss_delete(pMainView->ssHandle);
259                         pMainView->ssHandle = NULL;
260                 }
261
262                 DESTROY_ME();
263                 return true;
264         }
265
266         return false;
267 }
268
269
270 void _ivug_main_on_mmc_state_changed(keynode_t* node, void *data)
271 {
272         Ivug_MainView *pMainView = (Ivug_MainView *)data;
273         if (NULL == pMainView) {
274                 return;
275         }
276
277         if ( pMainView->ext_ug )
278         {
279                 MSG_IMAGEVIEW_HIGH("Extern UG is running");
280         }
281
282         if(pMainView->ssHandle)
283         {
284                 ivug_ss_set_stop(pMainView->ssHandle);
285                 _destory_slideshow_and_ug(pMainView, SLIDE_SHOW_STOPPED, true);
286         } else {
287                 if(pMainView->exit_timer == NULL)
288                 {
289                         pMainView->exit_timer = ecore_timer_add(0.2, _on_exit_timer_expired, data);
290                 }
291         }
292 }
293
294 static void _show_zoom_icon(Ivug_MainView *pMainView)
295 {
296         ivug_ret_if(!pMainView);
297
298         MSG_MAIN_ERROR("_show_zoom_icon");
299
300         /*unsigned int zoom_level = ivug_slider_zoom_level_get(pMainView->slider);
301         if(zoom_level == 0)
302         {
303                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_out,disable","elm");
304                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_in,enable","elm");
305         }
306         else if(zoom_level == ZOOM_LEVEL_MAX)
307         {
308                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_in,disable","elm");
309                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_out,enable","elm");
310         }
311         else*/
312         {
313                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_out,enable","elm");
314                 edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_in,enable","elm");
315         }
316
317         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,zoom_slider,show","elm");
318 }
319
320 static void _hide_zoom_icon(Ivug_MainView *pMainView)
321 {
322         ivug_ret_if(!pMainView);
323
324         MSG_MAIN_ERROR("_hide_zoom_icon");
325
326         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_out,hide","elm");
327         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,btn_zoom_in,hide","elm");
328         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,zoom_slider,hide","elm");
329 }
330
331 static void _update_main_view(Ivug_MainView *pMainView)
332 {
333         IV_ASSERT(pMainView != NULL);
334
335         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
336         Media_Data *mdata = ivug_medialist_get_data(mitem);
337
338         if(mdata == NULL)
339         {
340                 MSG_MAIN_ERROR("mdata is NULL");
341                 return;
342         }
343
344         PERF_CHECK_BEGIN(LVL6, "Set menu title");
345
346         _update_title(pMainView);
347
348         PERF_CHECK_END(LVL6, "Set menu title");
349
350         slide_state_t state = ivug_slider_get_state(pMainView->slider);
351
352         if(mdata->slide_type == SLIDE_TYPE_IMAGE && mdata->bIsDRMContent == false && state != SLIDE_STATE_ERROR)
353         {
354                 _show_zoom_icon(pMainView);
355         }
356         else
357         {
358                 _hide_zoom_icon(pMainView);
359         }
360
361         return;
362 }
363
364
365 static void
366 _ivug_main_drm_popup_purchase_cb(void *data, Evas_Object *obj, void *event_info)
367 {
368         int response_id = (int)event_info;
369         IV_ASSERT(data != NULL);
370
371         Ivug_MainView *pMainView = (Ivug_MainView *)data;
372
373         MSG_MAIN_HIGH("DRM popup selected : %d", response_id);
374
375         if(response_id == POPUP_RESPONSE_CANCEL)
376         {
377                 MSG_MAIN_HIGH("cancel selected");
378 #ifdef USE_SLIDE_SKIP
379                 MSG_MAIN_HIGH("shift again");
380                 ivug_slider_skip(pMainView->slider);
381 #else
382                 ivug_slider_load(pMainView->slider);
383 #endif
384         }
385         else
386         {
387                 MSG_MAIN_HIGH("unlock process");
388
389                 Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
390                 Media_Data *mdata = ivug_medialist_get_data(mitem);
391
392                 char *url = ivug_drm_get_right_url(mdata->filepath);
393                 if (url != NULL)
394                 {
395                         MSG_MAIN_HIGH("path = %s, right url : %s", mdata->filepath, url);
396                         ivug_ext_launch_browser(url);
397                         free(url);
398                 }
399                 else
400                 {
401                         MSG_MAIN_ERROR("ivug_drm_get_right_url error. path = %s", mdata->filepath);
402                 }
403         }
404 }
405
406
407 static void
408 _ivug_main_drm_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
409 {
410         int response_id = (int)event_info;
411         IV_ASSERT(data != NULL);
412
413         Ivug_MainView *pMainView = (Ivug_MainView *)data;
414
415         MSG_MAIN_HIGH("DRM popup selected : %d", response_id);
416
417         if(response_id == POPUP_RESPONSE_CANCEL)
418         {
419                 MSG_MAIN_HIGH("cancel selected");
420 #ifdef USE_SLIDE_SKIP
421                 MSG_MAIN_HIGH("shift again");
422                 ivug_slider_skip(pMainView->slider);
423 #else
424                 ivug_slider_load(pMainView->slider);
425 #endif
426
427         }
428         else
429         {
430                 ivug_slider_load(pMainView->slider);
431         }
432 }
433
434
435 void _ivug_main_view_drm_process(drm_constraints result, int info, void *data)
436 {
437 #define MAX_DBUFFER_SIZE        2048
438
439         ivug_ret_if(!data);
440         Ivug_MainView *pMainView = (Ivug_MainView *)data;
441
442         char string[MAX_DBUFFER_SIZE] = "";
443         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
444         Media_Data *mdata = ivug_medialist_get_data(mitem);
445         slide_state_t state = ivug_slider_get_state(pMainView->slider);
446
447         if(mdata == NULL)
448         {
449                 MSG_MAIN_ERROR("mdata is NULL");
450                 return;
451         }
452
453         switch(result)
454         {
455                 case IVUG_DRM_RESULT_LIMITED:
456                         MSG_MAIN_HIGH("Limited");
457                         snprintf(string, sizeof(string),
458                                         IDS_DRM_UNLOCK,
459                                         ecore_file_file_get(mdata->filepath));
460                         ivug_2btn_popup_show(pMainView->layout, NULL, string, _ivug_main_drm_popup_purchase_cb, pMainView);
461                         break;
462                 case IVUG_DRM_RESULT_UNLIMITED:
463                         MSG_MAIN_HIGH("Unlimited");
464                         if(state != SLIDE_STATE_LOADED)
465                         {
466                                 ivug_slider_load(pMainView->slider);
467                         }
468                         break;
469                 case IVUG_DRM_RESULT_COUNT:
470                         MSG_MAIN_HIGH("Count = %d", info);
471                         if(info > 2)
472                         {
473                                 ivug_slider_load(pMainView->slider);
474                         }
475                         else if(info == 2)
476                         {
477                                 snprintf(string, sizeof(string),
478                                         IDS_DRM_COUNT_BASED_OPEN_MANY, 2,
479                                         ecore_file_file_get(mdata->filepath));
480                                 ivug_2btn_popup_show(pMainView->layout, NULL, string, _ivug_main_drm_popup_response_cb, pMainView);
481                         }
482                         else
483                         {
484                                 snprintf(string, sizeof(string),
485                                         IDS_DRM_COUNT_BASED_OPEN_ONE,
486                                         ecore_file_file_get(mdata->filepath));
487                                 ivug_2btn_popup_show(pMainView->layout, NULL, string, _ivug_main_drm_popup_response_cb, pMainView);
488                         }
489                         break;
490                 case IVUG_DRM_RESULT_INTERVAL_DAYS:
491                         MSG_MAIN_HIGH("Interval days = %d", info);
492                         snprintf(string, sizeof(string),
493                                         IDS_DRM_INTERVAL_BASED_DAYS,
494                                         ecore_file_file_get(mdata->filepath),
495                                         info);
496                         ivug_2btn_popup_show(pMainView->layout, NULL, string, _ivug_main_drm_popup_response_cb, pMainView);
497                         break;
498                 case IVUG_DRM_RESULT_ACCUMULATED:
499                         MSG_MAIN_HIGH("Accumulated time = %d", info);
500                         break;
501                 case IVUG_DRM_RESULT_DATETIME:
502                 case IVUG_DRM_RESULT_TIMED_COUNT:
503                 case IVUG_DRM_RESULT_SYSTEM:
504                         ivug_slider_load(pMainView->slider);
505                         break;
506                 default :
507                         MSG_MAIN_WARN("Unknown resule : %d", result);
508                         ivug_slider_load(pMainView->slider);
509                         break;
510         }
511 }
512
513
514 static void
515 _on_slider_clicked(void *data, Evas_Object *obj, void *event_info)
516 {
517         MSG_MAIN_HIGH("Main View Clicked");
518         IV_ASSERT(data != NULL);
519
520         Ivug_MainView *pMainView = (Ivug_MainView *)data;
521
522         if(pMainView->bClickPrevent == true)
523         {
524                 pMainView->bClickPrevent = false;
525                 return;
526         }
527
528         if (pMainView->bShowMenu)
529         {
530                 ivug_main_view_hide_menu_bar(pMainView);
531         }
532         else
533         {
534                 ivug_main_view_show_menu_bar(pMainView);
535         }
536
537 }
538
539 static void
540 _on_slider_icon_clicked(void *data, Evas_Object *obj, void *event_info)
541 {
542         MSG_MAIN_HIGH("Main View Video icon Clicked");
543         IV_ASSERT(data != NULL);
544
545         Ivug_MainView *pMainView = (Ivug_MainView *)data;
546
547         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
548         Media_Data *mdata = ivug_medialist_get_data(mitem);
549         if (mdata == NULL)
550         {
551                 MSG_MAIN_ERROR("slide data is NULL");
552                 return;
553         }
554
555 // "Add tag" in video player shows only when launching from gallery.
556         else if (pMainView->mode == IVUG_MODE_FILE || pMainView->mode == IVUG_MODE_DISPLAY || pMainView->mode == IVUG_MODE_SINGLE )
557         {
558                 MSG_MAIN_HIGH("Launching simple video player. Mode=%d", pMainView->mode);
559                 ivug_ext_launch_videoplayer_simple(mdata->filepath);
560         }
561         else
562         {
563                 MSG_MAIN_HIGH("Launching normal video player");
564                 ivug_ext_launch_videoplayer(mdata->filepath);
565         }
566
567 }
568
569 static Eina_Bool _ivug_long_press_timer_expired(void *data)
570 {
571         ivug_retv_if(!data, ECORE_CALLBACK_CANCEL);
572
573         Ivug_MainView *pMainView = (Ivug_MainView *)data;
574
575         MSG_SETAS_HIGH("long press timer expired");
576
577         pMainView->popup_timer = NULL;
578
579         if(pMainView->bLongpressEnd == false)   // still press
580         {
581                 if(pMainView->longpress_popup)
582                 {
583                         IVUG_DEBUG_WARNING("copy popup remove");
584                         evas_object_del(pMainView->longpress_popup);
585                         pMainView->longpress_popup = NULL;
586                 }
587         }
588
589
590         return ECORE_CALLBACK_CANCEL;
591 }
592
593 static void
594 _on_slider_long_press_start(void *data, Evas_Object *obj, void *event_info)
595 {
596         Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
597         ivug_ret_if(!data||!p);
598
599         Ivug_MainView *pMainView = (Ivug_MainView *)data;
600
601         MSG_MAIN_HIGH("LongPressed XY(%d,%d)", p->x, p->y);
602
603         int x = p->x;
604         int y = p->y;
605
606         if ( ivug_slider_get_state(pMainView->slider) != SLIDE_STATE_LOADED)
607         {
608                 MSG_MAIN_ERROR("Long pressed. but state is not ready");
609                 return;
610         }
611
612         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
613         Media_Data *mdata = ivug_medialist_get_data(mitem);
614         if(mdata == NULL)
615         {
616                 MSG_MAIN_ERROR("mdata is NULL");
617                 return;
618         }
619
620         if(mdata->slide_type != SLIDE_TYPE_IMAGE)
621         {
622                 MSG_MAIN_ERROR("Long pressed. but it is not image");
623                 return;
624         }
625
626         pMainView->longpress_popup = ivug_longpress_popup_show(pMainView->slider, x, y, _on_longpress_popup_selected, pMainView);
627         if (pMainView->longpress_popup == NULL)
628         {
629                 IVUG_DEBUG_WARNING("long press popup create failed");
630                 return ;
631         }
632
633         pMainView->bLongpressEnd = false;
634
635         if(pMainView->popup_timer)
636         {
637                 ecore_timer_del(pMainView->popup_timer);
638         }
639         pMainView->popup_timer = ecore_timer_add(LONGTAP_TIMEOUT, _ivug_long_press_timer_expired, pMainView);
640 }
641
642 static void
643 _on_slider_long_press_end(void *data, Evas_Object *obj, void *event_info)
644 {
645         //Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
646         //ivug_ret_if(!data||!p);
647         ivug_ret_if(!data);
648
649         Ivug_MainView *pMainView = (Ivug_MainView *)data;
650
651         pMainView->bLongpressEnd = true;
652
653         if(pMainView->popup_timer)
654         {
655                 ecore_timer_del(pMainView->popup_timer);
656                 pMainView->popup_timer = NULL;
657         }
658
659         if((int)event_info == LONGTAP_CANCELED)
660         {
661                 if(pMainView->longpress_popup)
662                 {
663                         IVUG_DEBUG_WARNING("copy popup remove");
664                         evas_object_del(pMainView->longpress_popup);
665                         pMainView->longpress_popup = NULL;
666                 }
667         }
668 }
669
670 static void _on_remove_main_view_ui(Ivug_MainView *pMainView)
671 {
672         IV_ASSERT(pMainView != NULL);
673
674         ivug_main_view_del_hide_timer(pMainView);
675
676         // Slider should be removed before mList is freed.
677         if ( pMainView->slider )
678         {
679                 evas_object_del(pMainView->slider);
680                 pMainView->slider = NULL;
681         }
682
683         if ( pMainView->pCropView )
684         {
685                 MSG_MAIN_HIGH("Crop View Destroy");
686                 ivug_crop_view_destroy(pMainView->pCropView);
687                 pMainView->pCropView = NULL;
688         }
689
690         if ( pMainView->pNameView )
691         {
692                 MSG_MAIN_HIGH("Name View Destroy");
693                 ivug_name_view_destroy(pMainView->pNameView);
694                 pMainView->pNameView = NULL;
695         }
696
697         if ( pMainView->pSetAsView )
698         {
699                 MSG_MAIN_HIGH("SetAS View Destroy");
700                 ivug_setas_view_destroy(pMainView->pSetAsView);
701                 pMainView->pSetAsView = NULL;
702         }
703
704         if ( pMainView->pDetailsView )
705         {
706                 MSG_MAIN_HIGH("Details View Destroy");
707
708                 ivug_details_view_destroy(pMainView->pDetailsView);
709                 pMainView->pDetailsView = NULL;
710         }
711
712
713         if(pMainView->layout)           // Remove topmost parent in main view.
714         {
715                 evas_object_del(pMainView->layout);
716                 pMainView->layout = NULL;
717         }
718
719         if(pMainView->empty_layout)
720         {
721                 evas_object_del(pMainView->empty_layout);
722                 pMainView->empty_layout = NULL;
723         }
724
725         if ( pMainView->mList )
726         {
727                 MSG_MAIN_HIGH("Remove media list");
728                 ivug_medialist_del(pMainView->mList);           // ivug_medialist_del() is not working on destroy cb.
729                 pMainView->mList = NULL;
730         }
731 }
732
733
734 static void
735 _on_slider_item_changed(void *data, Evas_Object *obj, void *event_info)
736 {
737         IV_ASSERT(data != NULL);
738
739         Ivug_MainView *pMainView = (Ivug_MainView *)data;
740         Slide_Item *sitem = (Slide_Item *)event_info;
741
742         MSG_MAIN_HIGH("Image slider changed callback. ");
743
744         if ( sitem == NULL || sitem->mitem == NULL)
745         {
746                 // There is no item existed. terminate UG
747                 MSG_MAIN_ERROR("No item is remained. exit UG. Sitem=0x%08x", sitem);
748                 _on_remove_main_view_ui(pMainView);
749                 DESTROY_ME();
750                 return;
751         }
752
753         if(pMainView->selectioninfo != NULL)
754         {
755                 MSG_MAIN_MED("Delete small noti");
756                 evas_object_del(pMainView->selectioninfo);
757                 pMainView->selectioninfo = NULL;
758         }
759
760         if (pMainView->longpress_popup)
761         {
762                 MSG_MAIN_MED("Delete copy popup");
763                 evas_object_del(pMainView->longpress_popup);
764                 pMainView->longpress_popup = NULL;
765         }
766
767         drm_data_t *drm_data = ivug_slider_item_check_drm_constraint(sitem);
768         if(drm_data)
769         {
770                 _ivug_main_view_drm_process(drm_data->constraints, drm_data->data, pMainView);
771                 free(drm_data);
772         }
773
774 // Update Main View.
775         if ( pMainView->bShowMenu == true )
776         {
777                 PERF_CHECK_BEGIN(LVL5, "Update main view");
778                 _update_main_view(pMainView);
779                 PERF_CHECK_END(LVL5, "Update main view");
780         }
781
782         Media_Data *mdata = ivug_medialist_get_data(ivug_slider_item_data_get(sitem));
783
784         if(mdata->bIsDRMContent == true && ivug_drm_get_forwarding_info(mdata->filepath) == false)
785         {
786                 elm_object_disabled_set(pMainView->btn_share, EINA_TRUE);
787         }
788
789         pMainView->zoom_level = 1;
790         elm_slider_value_set(pMainView->zoom_slider, 1.0);
791
792         ivug_slider_zoom_reset(pMainView->slider);
793 }
794
795
796 static void
797 _on_slider_item_state_changed(void *data, Evas_Object *obj, void *event_info)
798 {
799 // Only called center item state is changed/
800         MSG_MAIN_HIGH("Image slider item state changed callback. ");
801         ivug_ret_if(!data);
802
803         Ivug_MainView *pMainView = (Ivug_MainView *)data;
804         Slide_Item *sitem = (Slide_Item *)event_info;
805
806         if ( sitem == NULL || sitem->mitem == NULL)
807         {
808                 // There is no item existed. terminate UG
809                 MSG_MAIN_ERROR("No item is remained. exit UG");
810                 DESTROY_ME();
811
812                 return;
813         }
814
815         if(sitem->state == SLIDE_STATE_DOWNLOAD_FAILED)
816         {
817                 MSG_MAIN_ERROR("Download failed");
818                 _ivug_selectioninfo_create(pMainView, IDS_DOWNLOAD_FAILED);
819         }
820
821 }
822
823
824
825 static void _on_receive_mouse_down (void *data, Evas *e, Evas_Object *obj, void *event_info)
826 {
827         Ivug_MainView *pMainView = (Ivug_MainView *)data;
828         if (NULL == pMainView) {
829                 return;
830         }
831
832         ivug_main_view_del_hide_timer(pMainView);
833
834         MSG_MAIN_HIGH("Event layer clicked : %s %s Layer=%d",evas_object_name_get(obj), evas_object_type_get(obj), evas_object_layer_get(obj));
835 }
836
837 #ifdef TEST_MOUSE_EVENT
838 static void _on_receive_mouse_down1 (void *data, Evas *e, Evas_Object *obj, void *event_info)
839 {
840         char *name = (char *)data;
841
842         MSG_MAIN_HIGH("Event layer mouse down : %s %s Layer=%d",evas_object_name_get(obj), name, evas_object_layer_get(obj));
843 }
844
845 static void _on_receive_mouse_up1 (void *data, Evas *e, Evas_Object *obj, void *event_info)
846 {
847         char *name = (char *)data;
848
849         MSG_MAIN_HIGH("Event layer mouse up : %s %s Layer=%d",evas_object_name_get(obj), name, evas_object_layer_get(obj));
850 }
851
852 #endif
853
854
855 static void _on_receive_mouse_up (void *data, Evas *e, Evas_Object *obj, void *event_info)
856 {
857         Ivug_MainView *pMainView = (Ivug_MainView *)data;
858         if (NULL == pMainView) {
859                 return;
860         }
861
862         ivug_main_view_set_hide_timer(pMainView);
863 }
864
865 static void
866 _on_menu_state_changed(void *data, Evas_Object *obj, const char *emission, const char *source)
867 {
868         Ivug_MainView *pMainView = static_cast<Ivug_MainView *>(data);
869         if (NULL == pMainView) {
870                 return;
871         }
872
873         MSG_MAIN_HIGH("Receive %s %s", emission, source);
874
875         if ( strncmp(emission, "menu,show,finished", strlen(emission)) == 0 )
876         {
877                 elm_object_disabled_set(pMainView->ctrl_bar, EINA_FALSE);
878         }
879         else
880         {
881                 evas_object_hide(pMainView->ctrl_bar);
882                 elm_object_disabled_set(pMainView->ctrl_bar, EINA_TRUE);
883         }
884 }
885
886
887 static void _win_profile_changed_cb(void *data, Evas_Object * obj, void *event_info)
888 {
889         Ivug_MainView *pMainView = (Ivug_MainView *)data;
890         IV_ASSERT(pMainView != NULL);
891
892         const char *profile = elm_config_profile_get();
893
894         if (!strcmp(profile, "desktop"))
895         {  // desktop mode
896
897                 // hide naviframe's back key
898                 elm_object_item_part_content_set(pMainView->navi_it, "prev_btn", NULL);
899         }
900         else
901         {   // mobile
902
903                 // show naviframe's back key
904                 elm_object_item_part_content_set(pMainView->navi_it, "prev_btn", pMainView->back_btn);
905         }
906 }
907
908
909 ///////////////////////////////////////////////////////////////////////////////////////////////////
910 //
911 // External APIs
912 //
913
914 static char * _ivug_get_folder_name(char *filepath)
915 {
916         char *folder = ecore_file_dir_get(filepath);
917
918         char *name = NULL;
919
920         name = strrchr(folder, '/');
921         if ( (name != NULL) && ((name+1) != NULL) )
922         {
923                 return strdup(name + 1);
924         }
925
926         return NULL;
927 }
928
929
930 bool
931 ivug_main_view_set_list(Ivug_MainView *pMainView, ivug_parameter *ivug_param)
932 {
933         MSG_MAIN_HIGH("Load media list.");
934
935         PERF_CHECK_BEGIN(LVL2, "create media list");
936         if (NULL == pMainView) {
937                 return false;
938         }
939
940         Media_List *mlist = ivug_medialist_create();
941         if (mlist == NULL)
942         {
943                 MSG_MAIN_ERROR("Creating media list failed");
944                 return false;
945         }
946         PERF_CHECK_END(LVL2, "create media list");
947
948         PERF_CHECK_BEGIN(LVL2, "create filter");
949
950         Filter_struct *filter = ivug_param_create_filter(ivug_param);
951         if (filter == NULL)
952         {
953                 MSG_MAIN_ERROR("Creating filter failed");
954                 ivug_medialist_del(mlist);
955                 return false;
956         }
957
958         //do not use ivug_param->view_by after here
959
960         PERF_CHECK_END(LVL2, "create filter");
961
962         Media_Item *current = NULL;
963         Media_Data *pData = NULL;
964
965
966         {
967                 PERF_CHECK_BEGIN(LVL2, "media list load");
968                 current = ivug_medialist_load(mlist, filter);
969                 PERF_CHECK_END(LVL2, "media list load");
970         }
971
972         if(current == NULL)
973         {
974                 MSG_MAIN_ERROR("Media list load failed");
975                 goto LOAD_LIST_FAILED;
976         }
977
978         pData = ivug_medialist_get_data(current);
979         if(pData == NULL)
980         {
981                 MSG_MAIN_ERROR("current data is NULL");
982                 goto LOAD_LIST_FAILED;
983         }
984         if(pData->fileurl == NULL)
985         {
986                 MSG_MAIN_ERROR("current fileurl is NULL");
987                 goto LOAD_LIST_FAILED;
988         }
989
990         if(filter->view_by == IVUG_VIEW_BY_ALL)
991         {
992                 pMainView->album_name = strdup(IDS_ALL_ALBUMS);
993         }
994         else if(filter->view_by == IVUG_VIEW_BY_FOLDER)
995         {
996                 /*
997                 media_handle m_handle = ivug_db_get_folder_handle(ecore_file_dir_get(ivug_param->filepath));
998                 if(m_handle == NULL)
999                 {
1000                         MSG_IVUG_FATAL("View by Folder. but media handle is NULL" );
1001                         return NULL;
1002                 }
1003
1004                 pMainView->album_name = ivug_db_get_folder_name(m_handle);
1005                 */
1006                 pMainView->album_name = _ivug_get_folder_name(ivug_param->filepath);
1007                 if(pMainView->album_name == NULL)
1008                 {
1009                         pMainView->album_name = strdup(IDS_NO_NAME);
1010                 }
1011         }
1012
1013         pMainView->mList = mlist;
1014         PERF_CHECK_BEGIN(LVL2, "media list set");
1015
1016         if(!ivug_slider_set_medialist(pMainView->slider, mlist, current)) {
1017                         MSG_MAIN_ERROR("ivug_slider_set_medialist error");
1018                         goto LOAD_LIST_FAILED;
1019         }
1020
1021         PERF_CHECK_END(LVL2, "media list set");
1022
1023         ivug_data_filter_delete(filter);
1024
1025         return true;
1026
1027 LOAD_LIST_FAILED:
1028         if(filter)
1029                 ivug_data_filter_delete(filter);
1030         if(mlist)
1031                 ivug_medialist_del(mlist);
1032         pMainView->mList = NULL;
1033         return false;
1034 }
1035
1036 static void
1037 _on_slideshow_finished(void *data, Evas_Object *obj, void *event_info)
1038 {
1039         MSG_MAIN_HIGH("_on_slideshow_finished");
1040         IV_ASSERT(data != NULL);
1041
1042         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1043         int ss_state = (int)event_info;
1044         bool bDestoryed = false;
1045         bDestoryed = _destory_slideshow_and_ug(pMainView, ss_state, false);
1046         if (bDestoryed) {
1047                 return;
1048         }
1049
1050         Media_Item * item = NULL;
1051
1052         if(pMainView->ssHandle)
1053         {
1054
1055                 item = ivug_ss_item_get(pMainView->ssHandle);
1056                 ivug_ss_delete(pMainView->ssHandle);
1057                 pMainView->ssHandle = NULL;
1058
1059                 if(item)
1060                         ivug_slider_set_item(pMainView->slider, item, SLIDE_INSTANTLY);
1061         }
1062
1063
1064         ivug_slider_load(pMainView->slider);
1065         ivug_main_view_show_menu_bar(pMainView);
1066 }
1067
1068 static void
1069 _ivug_main_view_zoom_out_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
1070 {
1071         ivug_ret_if(!obj);
1072         ivug_ret_if(!data);
1073
1074         MSG_MAIN_ERROR("_ivug_main_view_zoom_out_cb");
1075
1076         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1077
1078         double d_value = elm_slider_value_get(pMainView->zoom_slider);
1079
1080         MSG_MAIN_HIGH("d_value = %lf", d_value);
1081
1082         int value = (int)round(d_value);
1083
1084         MSG_MAIN_HIGH("value = %d", value);
1085
1086         if(value > 1)
1087         {
1088                 ivug_main_view_del_hide_timer(pMainView);
1089
1090                 ivug_slider_zoom_out(pMainView->slider);
1091                 pMainView->zoom_level--;
1092                 elm_slider_value_set(pMainView->zoom_slider, value-1.0);
1093
1094                 ivug_main_view_set_hide_timer(pMainView);
1095         }
1096
1097         _show_zoom_icon(pMainView);
1098 }
1099
1100 static void
1101 _ivug_main_view_zoom_in_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
1102 {
1103         ivug_ret_if(!obj);
1104         ivug_ret_if(!data);
1105
1106         MSG_MAIN_ERROR("_ivug_main_view_zoom_in_cb");
1107
1108         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1109
1110         double d_value = elm_slider_value_get(pMainView->zoom_slider);
1111
1112         MSG_MAIN_HIGH("d_value = %lf", d_value);
1113
1114         int value = (int)round(d_value);
1115
1116         MSG_MAIN_HIGH("value = %d", value);
1117
1118         if(value <= ZOOM_LEVEL_MAX)
1119         {
1120                 ivug_main_view_del_hide_timer(pMainView);
1121
1122                 ivug_slider_zoom_in(pMainView->slider);
1123                 pMainView->zoom_level++;
1124                 elm_slider_value_set(pMainView->zoom_slider, value+1.0);
1125
1126                 ivug_main_view_set_hide_timer(pMainView);
1127         }
1128
1129         _show_zoom_icon(pMainView);
1130 }
1131
1132 static void _zoom_slider_change_cb(void *data, Evas_Object *obj, void *event_info)
1133 {
1134         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1135
1136         double d_value = elm_slider_value_get(pMainView->zoom_slider);
1137
1138         MSG_MAIN_HIGH("d_value = %lf", d_value);
1139
1140         int value = (int)round(d_value);
1141
1142         MSG_MAIN_HIGH("value = %d", value);
1143
1144         while(pMainView->zoom_level > 0
1145                 && pMainView->zoom_level <= ZOOM_LEVEL_MAX+1
1146                 && value != pMainView->zoom_level)
1147         {
1148                 if(value > pMainView->zoom_level)
1149                 {
1150                         ivug_slider_zoom_in(pMainView->slider);
1151                         pMainView->zoom_level++;
1152                 }
1153                 else if(value < pMainView->zoom_level)
1154                 {
1155                         ivug_slider_zoom_out(pMainView->slider);
1156                         pMainView->zoom_level--;
1157                 }
1158         }
1159 }
1160
1161 static void _zoom_slider_start_cb(void *data, Evas_Object *obj, void *event_info)
1162 {
1163         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1164
1165         ivug_main_view_del_hide_timer(pMainView);
1166 }
1167
1168 static void _zoom_slider_end_cb(void *data, Evas_Object *obj, void *event_info)
1169 {
1170         Ivug_MainView *pMainView = (Ivug_MainView *)data;
1171
1172         ivug_main_view_set_hide_timer(pMainView);
1173 }
1174
1175 Ivug_MainView *
1176 ivug_main_view_create(Evas_Object* parent, ivug_mode mode, ivug_view_by view_by)
1177 {
1178         IV_ASSERT(parent != NULL);
1179
1180         MSG_MAIN_HIGH("Creating main view. Parent=0x%08x Mode=%d ViewBy=%d", parent, mode, view_by);
1181
1182         PERF_CHECK_BEGIN(LVL2, "Create layout");
1183
1184 //create main view layout
1185         Ivug_MainView *pMainView = (Ivug_MainView *)calloc(1, sizeof(Ivug_MainView) );
1186         IV_ASSERT(pMainView != NULL);
1187
1188 // Set default value
1189         pMainView->parent = parent;
1190         pMainView->mode = mode;
1191         pMainView->view_by = view_by;
1192
1193         pMainView->bShowMenu = true;
1194
1195         pMainView->hide_count = -1;
1196
1197         Evas_Object *layout = EFL::create_layout(parent, IVUG_MAIN_EDJ, "mainview");
1198         if ( layout == NULL)    //if failed
1199         {
1200                 MSG_MAIN_ERROR("main layout create failed");
1201                 free(pMainView);
1202                 return NULL;
1203         }
1204
1205         pMainView->layout = layout;
1206         evas_object_name_set(pMainView->layout, "Main Layout");
1207
1208         PERF_CHECK_END(LVL2, "Create layout");
1209
1210         edje_object_signal_callback_add(_EDJ(pMainView->layout),
1211                                 "menu,hide,finished",
1212                                 "edc",
1213                                 _on_menu_state_changed,
1214                                 (void *)pMainView);
1215
1216         edje_object_signal_callback_add(_EDJ(pMainView->layout),
1217                                 "menu,show,finished",
1218                                 "edc",
1219                                 _on_menu_state_changed,
1220                                 (void *)pMainView);
1221
1222 // Navigation bar
1223         PERF_CHECK_BEGIN(LVL2, "elm_naviframe_add");
1224
1225         pMainView->navi_bar = elm_naviframe_add(layout);
1226         if ( pMainView->navi_bar == NULL)
1227         {
1228                 MSG_MAIN_ERROR("navigation bar failed");
1229                 ivug_main_view_destroy(pMainView);
1230                 return NULL;
1231         }
1232         evas_object_name_set(pMainView->navi_bar, "Main naviframe");
1233
1234 // Layout life cycle is controlled by application explictily.
1235         elm_naviframe_content_preserve_on_pop_set(pMainView->navi_bar, EINA_TRUE);
1236
1237 #ifdef USE_CUSTOM_STYLE
1238         elm_object_theme_set(pMainView->navi_bar, gGetSystemTheme() );
1239 #endif
1240         const char *profile = elm_config_profile_get();
1241         if (!strcmp(profile,"mobile"))
1242         {
1243                 elm_object_style_set(pMainView->navi_bar, "ivug-main/default");
1244         }
1245         else if (!strcmp(profile,"desktop"))
1246         {
1247                 elm_object_style_set(pMainView->navi_bar, "ivug-main/noindicator");
1248         }
1249         else
1250         {
1251                 MSG_MAIN_ERROR("Unknown profile : %s", profile);
1252         }
1253
1254         elm_object_part_content_set(layout, "mainview.navibar", pMainView->navi_bar);   //swallow
1255
1256         PERF_CHECK_END(LVL2, "elm_naviframe_add");
1257
1258         PERF_CHECK_BEGIN(LVL2, "elm_layout_add");
1259
1260         pMainView->empty_layout = EFL::create_layout(layout, IVUG_MAIN_EDJ, "navi_content");
1261         if (pMainView->empty_layout == NULL)
1262         {
1263                 IVUG_DEBUG_WARNING("layout create failed");
1264                 ivug_main_view_destroy(pMainView);
1265                 return NULL;
1266         }
1267
1268         evas_object_name_set(pMainView->empty_layout, "Empty layout");
1269         PERF_CHECK_END(LVL2,"elm_layout_add");
1270
1271         if(pMainView->view_by != IVUG_VIEW_BY_FILE && pMainView->view_by != IVUG_VIEW_BY_INVAILD)
1272         {
1273                 PERF_CHECK_BEGIN(LVL2, "Create thumblist");
1274
1275
1276                 PERF_CHECK_END(LVL2, "Create thumblist");
1277         }
1278
1279 //create slider
1280         PERF_CHECK_BEGIN(LVL2, "ivug_slider_add");
1281
1282         pMainView->slider = ivug_slider_add(pMainView->empty_layout);
1283         if (pMainView->slider == NULL)
1284         {
1285                 MSG_MAIN_ERROR("image slider create failed");
1286                 ivug_main_view_destroy(pMainView);
1287                 return NULL;
1288         }
1289
1290         elm_object_part_content_set(pMainView->empty_layout, "mainview.slider", pMainView->slider);     //swallow
1291
1292         PERF_CHECK_END(LVL2, "ivug_slider_add");
1293
1294         Evas_Object *slider = elm_slider_add(pMainView->empty_layout);
1295         elm_slider_indicator_format_set(slider, "%1.0f");
1296         elm_slider_min_max_set(slider, 1, 5);
1297         elm_slider_value_set(slider, 1);
1298
1299         evas_object_smart_callback_add(slider, "changed", _zoom_slider_change_cb, pMainView);
1300         evas_object_smart_callback_add(slider, "slider,drag,start", _zoom_slider_start_cb, pMainView);
1301         evas_object_smart_callback_add(slider, "slider,drag,stop", _zoom_slider_end_cb, pMainView);
1302
1303         elm_object_part_content_set(pMainView->empty_layout, "zoom_slider_area", slider);       //swallow
1304
1305         pMainView->zoom_slider = slider;
1306         pMainView->zoom_level = 1;
1307
1308         if (pMainView->mode != IVUG_MODE_DISPLAY)
1309         {
1310                 PERF_CHECK_BEGIN(LVL2, "ivug_button_add");
1311                 pMainView->back_btn = ivug_button_add(pMainView->navi_bar, "naviframe/end_btn/default", IDS_BACK, NULL, on_btn_back_clicked, pMainView);
1312                 PERF_CHECK_END(LVL2, "ivug_button_add");
1313         }
1314         else
1315         {
1316                 PERF_CHECK_BEGIN(LVL2, "ivug_button_add");
1317                 pMainView->back_btn = ivug_button_add(pMainView->navi_bar, "naviframe/end_btn/default", IDS_BACK, NULL, on_btn_selectcancel_clicked, pMainView);
1318                 PERF_CHECK_END(LVL2, "ivug_button_add");
1319         }
1320
1321         PERF_CHECK_BEGIN(LVL2, "elm_naviframe_item_push");
1322         pMainView->navi_it = elm_naviframe_item_push(pMainView->navi_bar, NULL, pMainView->back_btn, NULL, pMainView->empty_layout, NULL);
1323         PERF_CHECK_END(LVL2, "elm_naviframe_item_push");
1324
1325         //Evas_Object *conformant = (Evas_Object *)ug_get_conformant();
1326         //elm_object_signal_emit(conformant, "elm,state,indicator,overlap", "");
1327
1328         evas_object_smart_callback_add((Evas_Object *)ug_get_window(), "profile,changed", _win_profile_changed_cb, pMainView);
1329
1330         _create_main_menu(pMainView);
1331
1332         PERF_CHECK_BEGIN(LVL2, "add event handler");
1333
1334 //      elm_object_part_content_set(layout, "mainview.slider", pMainView->slider);      //swallow
1335
1336 //register mouse call back.
1337         evas_object_smart_callback_add(pMainView->slider, "slider,clicked", _on_slider_clicked, pMainView);
1338         evas_object_smart_callback_add(pMainView->slider, "slider,longpress,start", _on_slider_long_press_start, pMainView);
1339         evas_object_smart_callback_add(pMainView->slider, "slider,longpress,end", _on_slider_long_press_end, pMainView);
1340         evas_object_smart_callback_add(pMainView->slider, "slider,clicked,icon", _on_slider_icon_clicked, pMainView);
1341
1342         evas_object_smart_callback_add(pMainView->slider, "slider,item,changed", _on_slider_item_changed, pMainView);
1343         evas_object_smart_callback_add(pMainView->slider, "slider,item,state,changed", _on_slider_item_state_changed, pMainView);
1344
1345         //MSG_MAIN_HIGH("binded main win address is %p\n", main_win);
1346
1347 #ifdef TEST_MOUSE_EVENT
1348         evas_object_event_callback_add(pMainView->navi_bar, EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"navigarion");
1349         evas_object_event_callback_add(pMainView->layout, EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"layout");
1350         evas_object_event_callback_add(pMainView->slider, EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"slider");
1351         evas_object_event_callback_add(pMainView->slider, EVAS_CALLBACK_MOUSE_UP, _on_receive_mouse_up1, (void *)"slider");
1352         evas_object_event_callback_add(const_cast<Evas_Object *>(edje_object_part_object_get(_EDJ(pMainView->layout) , "clip")), EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"clip");
1353         evas_object_event_callback_add(const_cast<Evas_Object *>(edje_object_part_object_get(_EDJ(pMainView->layout) , "mainview.navibar")), EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"navi swallow");
1354         evas_object_event_callback_add(pMainView->ctrl_bar, EVAS_CALLBACK_MOUSE_DOWN, _on_receive_mouse_down1, (void *)"controlbar");
1355 #endif
1356
1357         evas_object_event_callback_add(pMainView->layout, EVAS_CALLBACK_RESIZE, _on_resize, pMainView);
1358
1359         // zoom icon
1360         edje_object_signal_callback_add(_EDJ(pMainView->empty_layout),
1361                                         "mainview,zoom_out,clicked",
1362                                         "",
1363                                         _ivug_main_view_zoom_out_cb,
1364                                         (void *)pMainView);
1365         edje_object_signal_callback_add(_EDJ(pMainView->empty_layout),
1366                                         "mainview,zoom_in,clicked",
1367                                         "",
1368                                         _ivug_main_view_zoom_in_cb,
1369                                         (void *)pMainView);
1370
1371         _show_zoom_icon(pMainView);
1372
1373         pMainView->keydown_handler = ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _on_key_down, (void *)pMainView);
1374
1375         {
1376                 int bx, by, bw, bh;
1377                 evas_object_geometry_get(pMainView->navi_bar, &bx, &by, &bw, &bh);
1378
1379                 MSG_MAIN_HIGH("Navibar Created. (%d,%d,%d,%d)", bx, by, bw, bh);
1380         }
1381
1382         {
1383                 int bx, by, bw, bh;
1384                 evas_object_geometry_get(pMainView->slider, &bx, &by, &bw, &bh);
1385
1386                 MSG_MAIN_HIGH("Slider Created. (%d,%d,%d,%d)", bx, by, bw, bh);
1387         }
1388
1389         {
1390                 int bx, by, bw, bh;
1391                 evas_object_geometry_get(pMainView->empty_layout, &bx, &by, &bw, &bh);
1392
1393                 MSG_MAIN_HIGH("Empty Created. (%d,%d,%d,%d)", bx, by, bw, bh);
1394         }
1395
1396         int bx, by, bw, bh;
1397         evas_object_geometry_get(pMainView->layout, &bx, &by, &bw, &bh);
1398
1399         MSG_MAIN_HIGH("Main View Created. (%d,%d,%d,%d)", bx, by, bw, bh);
1400
1401 // For debugging.
1402         DELETE_NOTIFY(pMainView->layout);
1403
1404         PERF_CHECK_END(LVL2, "add event handler");
1405
1406         return pMainView;
1407
1408 }
1409
1410 void ivug_main_view_start_slideshow(Ivug_MainView *pMainView, Eina_Bool bSlideFirst)
1411 {
1412         IV_ASSERT(pMainView != NULL);
1413
1414         Media_Item *current = NULL;
1415
1416         // Stop animation & movie play before slideshow is started.
1417         ivug_slider_pause(pMainView->slider);
1418         current = ivug_slider_get_item(pMainView->slider);
1419
1420         ivug_prohibit_lcd_off();
1421         //ivug_main_view_hide_menu_bar(pMainView);
1422
1423         pMainView->ssHandle = ivug_ss_create(pMainView->layout);
1424
1425 // Register callback
1426         evas_object_smart_callback_add(ivug_ss_object_get(pMainView->ssHandle),  "slideshow,finished", _on_slideshow_finished, pMainView);
1427
1428         ivug_main_view_hide_menu_bar(pMainView);
1429
1430         ivug_ss_start(pMainView->ssHandle, current, pMainView->mList, bSlideFirst);
1431 }
1432
1433
1434 Evas_Object *
1435 ivug_main_view_object_get(Ivug_MainView *pMainView)
1436 {
1437         IV_ASSERT(pMainView != NULL);
1438
1439         return pMainView->layout;
1440 }
1441
1442 void
1443 ivug_main_view_start(Ivug_MainView *pMainView)
1444 {
1445         IV_ASSERT(pMainView != NULL);
1446
1447
1448         {
1449                 ivug_main_view_set_hide_timer(pMainView);
1450         }
1451
1452
1453         PERF_CHECK_BEGIN(LVL2, "slider start");
1454         ivug_slider_start(pMainView->slider);
1455         PERF_CHECK_END(LVL2, "slider start");
1456
1457
1458         pMainView->area_obj = evas_object_rectangle_add(evas_object_evas_get(pMainView->layout));
1459         evas_object_size_hint_expand_set(pMainView->area_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
1460         evas_object_size_hint_fill_set(pMainView->area_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
1461         evas_object_color_set(pMainView->area_obj, 0,0,0,0);
1462         elm_object_part_content_set(pMainView->layout, "mainview.area", pMainView->area_obj);
1463
1464 //      evas_object_show(pMainView->area_obj);
1465 }
1466
1467
1468 void
1469 ivug_main_view_resume(Ivug_MainView *pMainView)
1470 {
1471         IV_ASSERT(pMainView != NULL);
1472         if (pMainView->slider == NULL) {
1473                 MSG_MAIN_HIGH("slider is NULL");
1474                 return;
1475         }
1476         MSG_MAIN_HIGH("Main View Update");
1477
1478         Media_Item *mitem = ivug_slider_get_item(pMainView->slider);
1479         Media_Data *mdata = ivug_medialist_get_data(mitem);
1480
1481         IV_ASSERT(mdata != NULL);
1482
1483         if (mdata->slide_type == SLIDE_TYPE_IMAGE || mdata->slide_type == SLIDE_TYPE_VIDEO )
1484         {
1485                 if(mdata->filepath && ecore_file_exists(mdata->filepath)) // Current file is not deleted
1486                 {
1487                         MSG_MAIN_HIGH("Current filepath : %s", mdata->filepath);
1488                 }
1489                 else
1490                 {
1491                         /*if file is not exist ug terminated temporally */
1492                         MSG_MAIN_ERROR("Center file is not exist. stype=%d name=%s", mdata->slide_type, mdata->filepath);
1493                         DESTROY_ME();
1494                         return ;
1495                 }
1496         }
1497         else
1498         {
1499                 MSG_MAIN_ERROR("Unhandled slide type : %d", mdata->slide_type);
1500         }
1501
1502 // When resume, menu bar will be appeared.
1503         if(!(pMainView->pNameView
1504                 || pMainView->pSetAsView
1505                 || pMainView->pCropView))       //child view is not exist
1506         {
1507                 ivug_main_view_show_menu_bar(pMainView);
1508         }
1509
1510         ivug_slider_resume(pMainView->slider);
1511 }
1512
1513 void
1514 ivug_main_view_pause(Ivug_MainView *pMainView)
1515 {
1516         IV_ASSERT(pMainView != NULL);
1517
1518         if ( pMainView->ssHandle )
1519         {
1520                 ivug_ss_stop(pMainView->ssHandle);
1521         }
1522         if (pMainView->slider) {
1523                 ivug_slider_pause(pMainView->slider);
1524         }
1525
1526         if(pMainView->bShowMenu == true)
1527         {
1528                 ivug_main_view_del_hide_timer(pMainView);
1529         }
1530         // Stop photocam If AGIF
1531 }
1532
1533
1534 void
1535 ivug_main_view_destroy(Ivug_MainView *pMainView)
1536 {
1537         IV_ASSERT(pMainView != NULL);
1538
1539         MSG_MAIN_HIGH("ENTER : Main View Destroy. pMainView=0x%08x", pMainView);
1540
1541         ivug_main_view_del_hide_timer(pMainView);
1542
1543         if (pMainView->popup_timer)
1544         {
1545                 ecore_timer_del(pMainView->popup_timer);
1546                 pMainView->popup_timer = NULL;
1547         }
1548
1549         if (pMainView->popup)
1550         {
1551                 evas_object_del(pMainView->popup);
1552                 pMainView->popup = NULL;
1553         }
1554
1555         if (pMainView->ext_ug)
1556         {
1557                 MSG_MAIN_HIGH("External UG Destroy");
1558                 ug_destroy(pMainView->ext_ug);
1559                 pMainView->ext_ug = NULL;
1560         }
1561
1562         if (pMainView->exit_timer)
1563         {
1564                 ecore_timer_del(pMainView->exit_timer);
1565                 pMainView->exit_timer = NULL;
1566         }
1567
1568         if ( pMainView->zoom_slider )
1569         {
1570                 evas_object_del(pMainView->zoom_slider);
1571                 pMainView->zoom_slider = NULL;
1572         }
1573
1574         MSG_MAIN_HIGH("Unregister system notifications");
1575
1576         if(pMainView->keydown_handler)
1577         {
1578                 ecore_event_handler_del(pMainView->keydown_handler);
1579                 pMainView->keydown_handler = NULL;
1580         }
1581
1582         if(pMainView->album_name)
1583         {
1584                 free(pMainView->album_name);
1585         }
1586
1587         if(pMainView->area_obj)
1588         {
1589                 evas_object_del(pMainView->area_obj);
1590                 pMainView->area_obj = NULL;
1591         }
1592
1593 // Who remove medialist?????
1594         _on_remove_main_view_ui(pMainView);
1595
1596         EFL::dump_obj(pMainView->parent, 0);
1597         free(pMainView);
1598
1599         MSG_MAIN_HIGH("LEAVE : Main View Destroy.");
1600
1601         return ;
1602 }
1603
1604 void ivug_main_view_set_hide_timer(Ivug_MainView *pMainView)
1605 {
1606         IV_ASSERT(pMainView != NULL);
1607
1608         return;
1609 }
1610
1611 void ivug_main_view_del_hide_timer(Ivug_MainView *pMainView)
1612 {
1613         IV_ASSERT(pMainView != NULL);
1614
1615         return;
1616 }
1617
1618 void
1619 ivug_main_view_show_menu_bar(Ivug_MainView *pMainView)
1620 {
1621         MSG_MAIN_HIGH("Show Menu");
1622         if (NULL == pMainView) {
1623                 return;
1624         }
1625
1626         pMainView->bShowMenu = true;
1627         evas_object_show(pMainView->ctrl_bar);
1628
1629         _update_main_view(pMainView);
1630
1631 #ifdef HIDE_INDICATOR
1632         elm_win_indicator_mode_set(ug_get_window(), ELM_WIN_INDICATOR_HIDE);
1633 #else
1634         if(gIsDesktopMode() == false)
1635         {
1636                 elm_win_indicator_mode_set((Evas_Object *)ug_get_window(), ELM_WIN_INDICATOR_SHOW);
1637         }
1638 #endif
1639 //      edje_object_signal_emit(_EDJ(pMainView->layout), "mainview,show,menu", "elm");
1640
1641         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,show", "user");
1642
1643         elm_naviframe_item_title_visible_set(pMainView->navi_it, EINA_TRUE);
1644         elm_object_item_signal_emit(pMainView->navi_it, "elm,state,toolbar,open", "");
1645
1646         ivug_slider_set_menu_visibility(pMainView->slider, EINA_TRUE);
1647
1648 #ifdef TEST_MOUSE_EVENT
1649         Eina_List *l = const_cast<Eina_List *>(evas_object_clipees_get(pMainView->navi_bar));
1650
1651         MSG_MAIN_HIGH("Clipper clips %i objects", eina_list_count(l));
1652
1653         void *obj;
1654         Eina_List *l1;
1655
1656         EINA_LIST_FOREACH(l, l1, obj)
1657         {
1658                 MSG_MAIN_HIGH("Object Type : %s", evas_object_name_get((Evas_Object *)obj));
1659         }
1660
1661         Evas_Object *above;
1662         Evas_Object *below;
1663
1664         above = evas_object_above_get(pMainView->navi_bar);
1665         MSG_MAIN_HIGH("Navi Above : 0x%08x %s %s", above, evas_object_name_get(above), evas_object_type_get(above));
1666
1667         below = evas_object_below_get(pMainView->navi_bar);
1668         MSG_MAIN_HIGH("Navi Below : 0x%08x %s %s", below, evas_object_name_get(below), evas_object_type_get(below));
1669
1670         above = evas_object_above_get(pMainView->slider);
1671         MSG_MAIN_HIGH("Slider Above : 0x%08x %s %s", above, evas_object_name_get(above), evas_object_type_get(above));
1672
1673         below = evas_object_below_get(pMainView->slider);
1674         MSG_MAIN_HIGH("Slider Below : 0x%08x %s %s", below, evas_object_name_get(below), evas_object_type_get(below));
1675 #endif
1676
1677         ivug_main_view_set_hide_timer(pMainView);
1678
1679 }
1680
1681 void
1682 ivug_main_view_hide_menu_bar(Ivug_MainView *pMainView)
1683 {
1684         MSG_MAIN_HIGH("Hide Menu");
1685         if (NULL == pMainView) {
1686                 return;
1687         }
1688
1689         ivug_main_view_del_hide_timer(pMainView);
1690
1691         pMainView->bShowMenu = false;
1692
1693         elm_object_disabled_set(pMainView->ctrl_bar, EINA_TRUE);
1694
1695         edje_object_signal_emit(_EDJ(pMainView->empty_layout), "elm,state,hide", "user");
1696
1697         elm_win_indicator_mode_set((Evas_Object *)ug_get_window(), ELM_WIN_INDICATOR_HIDE);
1698
1699 //      edje_object_signal_emit(_EDJ(pMainView->layout), "mainview,hide,menu","elm");
1700         elm_naviframe_item_title_visible_set(pMainView->navi_it, EINA_FALSE);
1701         elm_object_item_signal_emit(pMainView->navi_it, "elm,state,toolbar,close", "");
1702
1703         // zoom icon
1704         _hide_zoom_icon(pMainView);
1705
1706         ivug_slider_set_menu_visibility(pMainView->slider, EINA_FALSE);
1707
1708 }
1709