58f51c2a74071a9e6773a45d0d8d438fa6367dda
[apps/core/preloaded/ug-image-viewer-efl.git] / main / src / view / ivug-setas-view-callerid.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 #include <Elementary.h>
17
18 #include "ivug-define.h"
19
20 #include "ivug-setas-view-callerid.h"
21 #include "ivug-setas-view.h"
22
23 #include "ivug-selectioninfo.h"
24
25 #include "ivug-image.h"
26 #include "ivug-drm-common.h"
27 #include "EFLUtil.h"
28 #include "ivug-scissorbox.h"
29
30 #include "ivug-db.h"
31
32 #define EDJ_PATH PREFIX"/res/edje/"PACKAGE
33
34 #define SETAS_EDJ_FILE EDJ_PATH"/ivug-setas.edj"
35
36 #define CLICK_TIME_MAX          (500)                           // click time.
37 #define CLICK_WIDTH_MIN (elm_config_finger_size_get() >> 1)     //click width, if mouse move under this value and under click time, it is click.
38 #define CLICK_INTERVAL_TIME 0.15
39
40 /* it is temp define, because scroll, scroll,anim,end is called earlyer.
41    So find bound of scissor box again after SETAS_INTERVAL_TIME */
42 #define SETAS_INTERVAL_TIME 0.1
43 #define SETAS_INTERVAL_TIME_FIRST_LOAD 0.3
44
45 #define CROP_BOX_INTERVAL_TIME 0.3
46
47 typedef struct {
48         Evas_Object *layout;
49         Evas_Object *notify;
50         Evas_Object *notify_area;
51         Evas_Object *photocam;
52
53         Evas_Object *contents_area;
54
55         Evas_Object *gesture;
56
57         Evas_Object *btn_ok;
58
59         bool bShowMenu;         // Current state for button's visibility
60
61         char *filepath;
62         char *drm_filepath;
63
64         Evas_Coord_Rectangle rect;
65
66         int prev_x;
67         int prev_y;
68         int prev_w;
69         int prev_h;
70
71         struct {
72                 Evas_Object *box;
73                 double ratio;
74
75                 Eina_Bool bAspectPreserve;
76         } crop;
77
78         Ecore_Timer *box_timer;
79
80 } TSetAsData;
81
82 #define SETAS_DATA(obj) \
83                 (TSetAsData *)evas_object_data_get((Evas_Object *)(obj), "pSetAsData")
84
85 static void _on_moved(void *data, Evas *e, Evas_Object *obj, void *event_info);
86 static void _on_resized(void *data, Evas *e, Evas_Object *obj, void *event_info);
87
88 static void _put_scissorbox_default(TSetAsData *pSetAsData)
89 {
90         Evas_Object *image = ivug_image_internal_image_get(pSetAsData->photocam);
91
92         int image_w = 0;
93         int image_h = 0;
94         double ratio = pSetAsData->crop.ratio;
95         Evas_Coord_Rectangle rect = {0,};
96
97         ivug_image_image_size_get(pSetAsData->photocam, &image_w, &image_h);    // Get original image size.
98
99         /*int degree = ivug_image_rotate_get(pSetAsData->photocam);
100         if(degree == 90 || degree == 270)       //rotated
101         {
102                 int temp = image_w;
103                 image_w = image_h;
104                 image_h = temp;
105         }*/
106
107         int lcd_x, lcd_y, lcd_w, lcd_h;
108
109         evas_object_geometry_get(pSetAsData->contents_area, &lcd_x, &lcd_y, &lcd_w, &lcd_h);
110         MSG_SETAS_HIGH("lcd_x=%d, lcd_y=%d, lcd_w=%d, lcd_h=%d", lcd_x, lcd_y, lcd_w, lcd_h);
111
112         int px, py, pw, ph;
113         ivug_image_region_get(pSetAsData->photocam, &px, &py, &pw, &ph);
114
115         px = (lcd_w - pw) / 2;  // do not use previous px, px is invalid because transition effect
116
117         MSG_SETAS_WARN("region XYWH(%d,%d,%d,%d)",      px, py, pw, ph);
118
119         int ix, iy, iw, ih;
120
121         if ( image_w > image_h )        // Landscape image
122         {
123                 if(ratio > 1.0) // height is larger
124                 {
125                         iw = image_h / (2 * ratio);
126                         ih = image_h / 2;
127                 }
128                 else
129                 {
130                         iw = image_h / 2;
131                         ih = (image_h * ratio) / 2;
132                 }
133         }
134         else
135         {
136                 if(ratio > 1.0) // height is larger
137                 {
138                         iw = image_w / (2 * ratio);
139                         ih = image_w / 2;
140                 }
141                 else
142                 {
143                         iw = image_w / 2;
144                         ih = (image_w * ratio) / 2;
145                 }
146         }
147
148         ix = (image_w - iw)/2;
149         iy = (image_h - ih)/2;
150
151
152         rect.x = (double)ix * pw / image_w + px;
153         rect.y = (double)iy * ph / image_h + py;
154
155         rect.w = (double)iw * pw / image_w;
156         rect.h = (double)ih * ph / image_h;
157
158         MSG_SETAS_WARN("Zoom Put Box in LCD XYWH(%d,%d,%d,%d)",
159                 rect.x, rect.y, rect.w, rect.h);
160
161         ivug_scissorbox_region_set(pSetAsData->crop.box, rect.x, rect.y, rect.w, rect.h);
162
163         ivug_scissorbox_attach(pSetAsData->crop.box, image);            // Attach to photocam
164
165         ivug_scissorbox_boundary_set(pSetAsData->crop.box, px, py, pw, ph);
166
167         pSetAsData->prev_x = px;        //lcd_x is wrong because transition effect
168         pSetAsData->prev_y = py;
169         pSetAsData->prev_w = pw;
170         pSetAsData->prev_h = ph;
171 }
172
173 static Eina_Bool _put_scissorbox_timer_cb(void *data)
174 {
175         TSetAsData *pSetAsData = SETAS_DATA(data);
176
177         pSetAsData->box_timer = NULL;
178
179         _put_scissorbox_default(pSetAsData);
180
181         elm_object_disabled_set(pSetAsData->btn_ok, EINA_FALSE);
182
183         return ECORE_CALLBACK_CANCEL;
184 }
185
186
187 static void
188 _on_btn_ok_clicked(void *data, Evas_Object *obj, void *event_info)
189 {
190         TSetAsData *pSetAsData = SETAS_DATA(data);
191         IV_ASSERT(pSetAsData != NULL);
192
193         MSG_SETAS_HIGH("OK button clicked");
194         evas_object_smart_callback_call(pSetAsData->layout, "ok,clicked", NULL);
195
196         evas_object_event_callback_del_full(pSetAsData->layout, EVAS_CALLBACK_MOVE, _on_moved, pSetAsData->layout);
197         evas_object_event_callback_del_full(pSetAsData->layout, EVAS_CALLBACK_RESIZE, _on_resized, pSetAsData->layout);
198
199         if ( pSetAsData->crop.box )
200         {
201                 evas_object_del(pSetAsData->crop.box);
202                 pSetAsData->crop.box = NULL;
203         }
204
205 }
206
207 static void
208 _on_photocam_loaded(void *data, Evas_Object *obj, void *event_info)
209 {
210         TSetAsData *pSetAsData = SETAS_DATA(data);
211         MSG_SETAS_HIGH("Photocam preloaded");
212
213 #if 0
214         typedef enum _Evas_Load_Error
215         {
216            EVAS_LOAD_ERROR_NONE = 0, /**< No error on load */
217            EVAS_LOAD_ERROR_GENERIC = 1, /**< A non-specific error occurred */
218            EVAS_LOAD_ERROR_DOES_NOT_EXIST = 2, /**< File (or file path) does not exist */
219            EVAS_LOAD_ERROR_PERMISSION_DENIED = 3, /**< Permission deinied to an existing file (or path) */
220            EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED = 4, /**< Allocation of resources failure prevented load */
221            EVAS_LOAD_ERROR_CORRUPT_FILE = 5, /**< File corrupt (but was detected as a known format) */
222            EVAS_LOAD_ERROR_UNKNOWN_FORMAT = 6 /**< File is not a known format */
223         } Evas_Load_Error; /**< Load error you can get from loading of files - see evas_load_error_str() too */
224 #endif
225
226         Evas_Load_Error error = static_cast<Evas_Load_Error>((int)event_info);
227
228         if ( error != EVAS_LOAD_ERROR_NONE )
229         {
230                 MSG_SETAS_ERROR("Error occured during decoding. Error=%d", error);
231
232                 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
233                 {
234                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
235                 }
236                 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
237                 {
238                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
239                 }
240                 else
241                 {
242                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
243                 }
244
245                 return;
246         }
247
248         MSG_SETAS_HIGH("Photocam loaded.");
249
250         pSetAsData->box_timer = ecore_timer_add(CROP_BOX_INTERVAL_TIME, _put_scissorbox_timer_cb, (void *)pSetAsData->layout);
251
252         evas_object_smart_callback_call(pSetAsData->layout, "loaded", NULL);
253
254         pSetAsData->notify_area = const_cast<Evas_Object *>(edje_object_part_object_get(_EDJ(pSetAsData->layout),
255                                                                                                                                 "setasview.contents.swallow.notify"));
256
257         pSetAsData->notify = ivug_notify_static_create(pSetAsData->notify_area, IDS_CALLER_ID_NOTIFY, NOTIFY_ALIGN_BOTTOM);
258 }
259
260
261 static void _on_moved(void *data, Evas *e, Evas_Object *obj, void *event_info)
262 {
263 //      TSetAsData *pSetAsData = SETAS_DATA(data);
264
265 }
266
267 static void _on_resized(void *data, Evas *e, Evas_Object *obj, void *event_info)
268 {
269         TSetAsData *pSetAsData = SETAS_DATA(data);
270         ///////////////////////////////////////////////////////////////////
271         int org_x, org_y, org_w, org_h;
272
273         MSG_SETAS_MED("prev_x=%d, prev_y=%d, prev_w=%d, prev_h=%d", pSetAsData->prev_x, pSetAsData->prev_y, pSetAsData->prev_w, pSetAsData->prev_h);
274
275         org_x = pSetAsData->prev_x;
276         org_y = pSetAsData->prev_y;
277         org_w = pSetAsData->prev_w;
278         org_h = pSetAsData->prev_h;
279
280         if(org_w == 0 || org_h == 0)
281                 return;
282
283         int org_sx, org_sy, org_sw, org_sh;
284         ivug_scissorbox_region_get(pSetAsData->crop.box, &org_sx, &org_sy, &org_sw, &org_sh);
285
286         MSG_SETAS_MED("org_sx=%d, org_sy=%d, org_sw=%d, org_sh=%d", org_sx, org_sy, org_sw, org_sh);
287
288         int dx = org_sx-org_x;
289         int dy = org_sy-org_y;
290
291         int lcd_x, lcd_y, lcd_w, lcd_h;
292
293         evas_object_geometry_get(pSetAsData->contents_area, &lcd_x, &lcd_y, &lcd_w, &lcd_h);
294         MSG_SETAS_MED("lcd_x=%d, lcd_y=%d, lcd_w=%d, lcd_h=%d", lcd_x, lcd_y, lcd_w, lcd_h);
295
296         int ph, pw;
297
298         int img_w, img_h;
299         int ext_w, ext_h;
300
301         img_w = org_w;
302         img_h = org_h;
303         ext_w = lcd_w;
304         ext_h = lcd_h;
305
306         ph = (img_h * ext_w) / img_w;
307
308         if (ph > ext_h)
309         {
310                 pw = (img_w * ext_h) / img_h;
311                 ph = ext_h;
312         }
313         else
314         {
315                 pw = ext_w;
316         }
317
318         double zoom = 0.0;
319
320         if ( img_w > img_h)
321         {
322                 zoom = (double)pw / img_w;
323         }
324         else
325         {
326                 zoom = (double)ph / img_h;
327         }
328
329         int sx, sy, sw, sh;
330
331         sw = org_sw*zoom;
332         sh = org_sh*zoom;
333         dx *= zoom;
334         dy *= zoom;
335
336         sx = lcd_x + (ext_w-img_w*zoom)/2 + dx;
337         sy = lcd_y + (ext_h-img_h*zoom)/2 + dy;
338
339
340         int bound_x, bound_y, bound_w, bound_h;
341
342         bound_x = lcd_x+(ext_w-img_w*zoom)/2;
343         bound_y = lcd_y+(ext_h-img_h*zoom)/2;
344         bound_w = img_w*zoom;
345         bound_h = img_h*zoom;
346
347         ivug_scissorbox_boundary_set(pSetAsData->crop.box, bound_x, bound_y, bound_w, bound_h);
348
349         ///////////////////////////////////////////////////////////////////
350
351         MSG_SETAS_MED("sx=%d, sy=%d, sw=%d, sh=%d", sx, sy, sw, sh);
352
353         ivug_scissorbox_region_set(pSetAsData->crop.box, sx, sy, sw, sh);
354
355         pSetAsData->prev_x = bound_x;
356         pSetAsData->prev_y = bound_y;
357         pSetAsData->prev_w = bound_w;
358         pSetAsData->prev_h = bound_h;
359
360         MSG_SETAS_MED("prev_x=%d, prev_y=%d, prev_w=%d, prev_h=%d", pSetAsData->prev_x, pSetAsData->prev_y, pSetAsData->prev_w, pSetAsData->prev_h);
361 }
362
363 static Evas_Event_Flags _finger_tap_end(void *data , void *event_info)
364 {
365         Elm_Gesture_Taps_Info *p = (Elm_Gesture_Taps_Info *) event_info;
366
367         MSG_SETAS_HIGH("Finger tab end. evt=%d", p->timestamp);
368
369         if ( p->n != 1 ) return EVAS_EVENT_FLAG_NONE;
370
371         TSetAsData *pSetAsData = (TSetAsData *)data;
372         IV_ASSERT(pSetAsData != NULL);
373
374         if(pSetAsData->bShowMenu)
375         {
376                 MSG_SETAS_HIGH("Hide");
377                 elm_win_indicator_mode_set((Evas_Object*)ug_get_window(), ELM_WIN_INDICATOR_HIDE);
378                 evas_object_hide(pSetAsData->notify);
379         }
380         else
381         {
382                 MSG_SETAS_HIGH("Show");
383                 if(gIsDesktopMode() == false)
384                 {
385                         elm_win_indicator_mode_set((Evas_Object *)ug_get_window(), ELM_WIN_INDICATOR_SHOW);
386                 }
387                 evas_object_show(pSetAsData->notify);
388         }
389
390         pSetAsData->bShowMenu = !pSetAsData->bShowMenu;
391
392         return EVAS_EVENT_FLAG_NONE;
393 }
394
395 void _add_gesture_layer(Evas_Object *parent, TSetAsData *pSetAsData)
396 {
397         IV_ASSERT(pSetAsData != NULL);
398
399         Evas_Object *gesture = pSetAsData->gesture;
400
401         gesture = elm_gesture_layer_add(parent);
402         elm_gesture_layer_hold_events_set(gesture, EINA_FALSE);
403
404         elm_gesture_layer_cb_set(gesture, ELM_GESTURE_N_TAPS, ELM_GESTURE_STATE_END, _finger_tap_end, (void *)pSetAsData);
405
406         if ( elm_gesture_layer_attach(gesture, pSetAsData->photocam) == EINA_FALSE)
407         {
408                 MSG_SETAS_ERROR("Cannot attach event rect");
409         }
410
411         evas_object_name_set(gesture, "CallerID:Getsture");
412 }
413
414 Evas_Object *_ivug_setas_callerid_create_layout(Evas_Object *parent)
415 {
416         TSetAsData *pSetAsData = (TSetAsData *)calloc(1, sizeof(TSetAsData));
417
418         if ( pSetAsData == NULL )
419         {
420                 MSG_SETAS_ERROR("Cannot alloc pSetasData");
421                 return NULL;
422         }
423
424         Evas_Object *photocam = NULL;
425
426         pSetAsData->layout = ivug_layout_add2(parent, SETAS_EDJ_FILE, "setas_view");
427         if ( pSetAsData->layout == NULL )
428         {
429                 MSG_SETAS_ERROR("Cannot create layout.");
430                 goto error;
431         }
432
433         MSG_SETAS_HIGH("Create setas layout");
434         pSetAsData->contents_area = ivug_default_layout_add(parent);
435         evas_object_name_set(pSetAsData->contents_area, "contets_area");
436         if ( pSetAsData->contents_area == NULL )
437         {
438                 MSG_SETAS_ERROR("Cannot create contets_area.");
439         }
440
441         elm_object_part_content_set(pSetAsData->layout, "setasview.contents.swallow", pSetAsData->contents_area);
442
443         pSetAsData->crop.box = ivug_scissorbox_add(pSetAsData->contents_area);
444
445         if ( pSetAsData->crop.box == NULL )
446         {
447                 MSG_SETAS_ERROR("Cannot create layout.");
448                 goto error;
449         }
450
451         evas_object_smart_member_add(pSetAsData->crop.box, pSetAsData->layout);
452
453         photocam = ivug_image_create(pSetAsData->layout);
454         ivug_image_animated_set(photocam, EINA_FALSE);  // Show first frame only when AGIF
455         ivug_image_hold_set(photocam , EINA_TRUE);                      // Disable mouse events
456
457         evas_object_name_set(photocam, "setas_photocam");
458
459         pSetAsData->photocam = photocam;
460
461         evas_object_smart_callback_add(photocam, "loaded", _on_photocam_loaded, (void *)pSetAsData->layout);
462         elm_object_part_content_set(pSetAsData->layout, "setasview.photocam", photocam);
463         evas_object_show(photocam);
464
465         pSetAsData->bShowMenu = true;
466         //_add_gesture_layer(pSetAsData->layout, pSetAsData);
467
468         evas_object_data_set(pSetAsData->layout, "pSetAsData", pSetAsData);
469         evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_MOVE, _on_moved, pSetAsData->layout);
470         evas_object_event_callback_add(pSetAsData->layout, EVAS_CALLBACK_RESIZE, _on_resized, pSetAsData->layout);
471
472         return pSetAsData->layout;
473
474 error:
475         if ( pSetAsData->crop.box )
476                 evas_object_del(pSetAsData->crop.box);
477
478         if ( pSetAsData->layout )
479                 evas_object_del(pSetAsData->layout);
480
481         if ( pSetAsData )
482                 free(pSetAsData);
483
484         return NULL;
485 }
486
487 Evas_Object *_ivug_setas_callerid_delete_layout(Evas_Object *obj)
488 {
489         TSetAsData *pSetAsData = SETAS_DATA(obj);
490         IV_ASSERT(pSetAsData != NULL);
491
492         if(pSetAsData->box_timer)
493         {
494                 ecore_timer_del(pSetAsData->box_timer);
495                 pSetAsData->box_timer = NULL;
496         }
497
498         if(pSetAsData->photocam)
499         {
500                 MSG_SETAS_HIGH("Removing photocam");
501                 evas_object_del(pSetAsData->photocam);
502                 pSetAsData->photocam = NULL;
503         }
504
505         if(pSetAsData->notify)
506         {
507                 evas_object_del(pSetAsData->notify);
508                 pSetAsData->notify = NULL;
509         }
510
511         if(pSetAsData->contents_area)
512         {
513                 evas_object_del(pSetAsData->contents_area);
514                 pSetAsData->contents_area = NULL;
515         }
516
517         if(pSetAsData->layout)
518         {
519                 evas_object_event_callback_del_full(pSetAsData->layout, EVAS_CALLBACK_MOVE, _on_moved, pSetAsData->layout);
520                 evas_object_event_callback_del_full(pSetAsData->layout, EVAS_CALLBACK_RESIZE, _on_resized, pSetAsData->layout);
521                 evas_object_del(pSetAsData->layout);
522                 pSetAsData->layout = NULL;
523         }
524
525         if(pSetAsData->crop.box)
526         {
527                 evas_object_del(pSetAsData->crop.box);
528                 pSetAsData->crop.box = NULL;
529         }
530         if(pSetAsData->filepath)
531         {
532                 free(pSetAsData->filepath);
533                 pSetAsData->filepath = NULL;
534         }
535
536         if(pSetAsData->drm_filepath)
537         {
538                 ivug_remove_file(pSetAsData->drm_filepath);
539                 free(pSetAsData->drm_filepath);
540                 pSetAsData->drm_filepath = NULL;
541         }
542
543         if(pSetAsData->btn_ok)
544         {
545                 evas_object_del(pSetAsData->btn_ok);
546                 pSetAsData->btn_ok = NULL;
547         }
548
549         free(pSetAsData);
550
551         return NULL;
552 }
553
554 bool _ivug_setas_callerid_load_file(Evas_Object *obj, const char *filepath)
555 {
556         TSetAsData *pSetAsData = SETAS_DATA(obj);
557
558         MSG_SETAS_HIGH("Load image file : %s", filepath);
559
560         pSetAsData->filepath = strdup(filepath);
561
562         Evas_Load_Error error = EVAS_LOAD_ERROR_NONE;
563         error = ivug_image_file_set(pSetAsData->photocam, filepath, "noAnim");
564
565         if ( error != EVAS_LOAD_ERROR_NONE )
566         {
567                 MSG_SETAS_ERROR("FileSet Error=%d", error);
568
569                 if ( error == EVAS_LOAD_ERROR_UNKNOWN_FORMAT )
570                 {
571                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_UNKNOWN_FORMAT);
572                         return false;
573                 }
574                 else if ( error == EVAS_LOAD_ERROR_PERMISSION_DENIED )
575                 {
576                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_PERMISSION_DENIED);
577                         return false;
578                 }
579                 else
580                 {
581                         evas_object_smart_callback_call(pSetAsData->layout, "load,failed", (void *)SETAS_ERROR_TYPE_INVALID_FILE);
582                         return false;
583                 }
584
585                 return false;
586         }
587
588         return true;
589 }
590
591 Evas_Object *_ivug_setas_callerid_internal_image_get(Evas_Object *obj)
592 {
593         TSetAsData *pSetAsData = SETAS_DATA(obj);
594
595         MSG_SETAS_HIGH("Internal image get!");
596
597         return pSetAsData->photocam;
598 }
599
600 bool _ivug_setas_callerid_select_region_get(Evas_Object *obj, int *x, int *y, int *w, int *h)
601 {
602         TSetAsData *pSetAsData = SETAS_DATA(obj);
603
604         if ( pSetAsData->crop.box == NULL)
605         {
606                 return false;
607         }
608
609         ivug_scissorbox_region_get(pSetAsData->crop.box, x, y, w, h);
610
611         return true;
612 }
613
614
615 void _ivug_setas_callerid_aspect_ratio_set(Evas_Object *obj, double ratio)
616 {
617         TSetAsData *pSetAsData = SETAS_DATA(obj);
618
619         pSetAsData->crop.bAspectPreserve = TRUE;
620         pSetAsData->crop.ratio = ratio;
621
622         ivug_scissorbox_ratio_fix( pSetAsData->crop.box, EINA_TRUE);
623 }
624
625 void _ivug_setas_callerid_create_menu(Evas_Object *obj, Evas_Object *navi_bar)
626 {
627         TSetAsData *pSetAsData = SETAS_DATA(obj);
628
629         pSetAsData->btn_ok = ivug_button_add(navi_bar, "naviframe/toolbar/default",
630                                                                 IDS_SAVE, NULL, _on_btn_ok_clicked, (void *)pSetAsData->layout);
631
632         Elm_Object_Item *navi_it = elm_naviframe_top_item_get(navi_bar);
633         elm_object_item_part_content_set(navi_it, "toolbar_button1", pSetAsData->btn_ok);
634
635         elm_object_disabled_set(pSetAsData->btn_ok, EINA_TRUE);
636 }
637