dbg.h file is removed.
[profile/tv/apps/native/source.git] / src / view / menu_view.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
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 <aul.h>
18 #include <AppCommon.h>
19 #include "source_mgr.h"
20 #include "util.h"
21 #include "def.h"
22 #include "menu_view.h"
23 #include "external.h"
24
25 #define TEXT_SEL        _("SELECT")
26 #define TEXT_RM         _("REMOVE")
27
28 #define STYLE_MENU_SEL  "menu_ctx_sel"
29 #define STYLE_MENU_RM   "menu_ctx_rm"
30
31 #define MAX_BTN_NUM     2
32 #define USB_ROW         0
33 #define EXTERNAL_ROW    1
34 #define SEL_COL         0
35 #define RM_COL          1
36
37 enum EObjectType {
38         MENU_BASE = 0,
39         MENU_SELECT_BTN,
40         MENU_REMOVE_BTN
41 };
42
43 struct bp_property {
44         const char *part;
45         const char *style;
46         char *text;
47 };
48
49 struct SMenuView {
50         Evas_Object *base;
51         Evas_Object *btn[MAX_BTN_NUM];
52         Evas_Object *focus_btn;
53         CSourceInfo *node;
54         CViewMgr *vmgr;
55 };
56
57 Evas_Object *CMenuView::m_AddLayout(Evas_Object *win)
58 {
59         Evas_Object *base;
60
61         if (!win)
62                 return NULL;
63
64         base = util_add_layout(win, GRP_MENU);
65         if (!base)
66                 return NULL;
67
68         evas_object_show(base);
69
70         return base;
71 }
72
73 Evas_Object *CMenuView::m_AddBtn(Evas_Object *parent,
74                 const char *part,
75                 const char *style,
76                 const char *str)
77 {
78         Evas_Object *btn;
79
80         if (!parent || !style || !str)
81                 return NULL;
82
83         btn = elm_button_add(parent);
84         if (!btn) {
85                 _ERR("add button error.");
86                 return NULL;
87         }
88
89         elm_object_style_set(btn, style);
90         elm_object_part_text_set(btn, PART_MENU_BTN_TEXT, str);
91         evas_object_size_hint_weight_set(btn,
92                         EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
93         evas_object_size_hint_align_set(btn,
94                         EVAS_HINT_FILL, EVAS_HINT_FILL);
95
96         evas_object_show(btn);
97         elm_object_part_content_set(parent, part, btn);
98
99         return btn;
100 }
101
102 Evas_Object *CMenuView::m_AddBtnByIndex(unsigned int row, unsigned int col)
103 {
104         Evas_Object *btn;
105         unsigned int bp_arr_row;
106         struct bp_property bp_arr[][MAX_BTN_NUM] = {
107                 {
108                         {
109                                 PART_MENU_BTN_1,
110                                 STYLE_MENU_SEL,
111                                 TEXT_SEL
112                         },
113                         {
114                                 PART_MENU_BTN_2,
115                                 STYLE_MENU_RM,
116                                 TEXT_RM
117                         },
118                 },
119                 {
120                         {
121                                 PART_MENU_BTN_1,
122                                 STYLE_MENU_SEL,
123                                 TEXT_SEL
124                         },
125                         {
126                                 NULL,
127                                 NULL,
128                                 NULL
129                         },
130                 },
131         };
132
133         bp_arr_row = sizeof(bp_arr) /
134                         (sizeof(struct bp_property) * MAX_BTN_NUM);
135
136         if (row >= bp_arr_row || col >= MAX_BTN_NUM)
137                 return NULL;
138
139         btn = m_AddBtn(m->base, bp_arr[row][col].part,
140                         bp_arr[row][col].style,
141                         bp_arr[row][col].text);
142         if (!btn)
143                 return NULL;
144
145         return btn;
146 }
147
148 bool CMenuView::m_AddUsbMenuBtn(void)
149 {
150         Evas_Object *sel_btn, *rm_btn;
151
152         sel_btn = m_AddBtnByIndex(USB_ROW, SEL_COL);
153         if (!sel_btn) {
154                 _ERR("Add usb select button failed.");
155                 return false;
156         }
157
158         Connect(sel_btn, MENU_SELECT_BTN, TYPE_KEY_DOWN | TYPE_MOUSE_DOWN
159                                 | TYPE_MOUSE_MOVE | TYPE_FOCUSED);
160
161         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_UP);
162         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_DOWN);
163         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_LEFT);
164
165         rm_btn = m_AddBtnByIndex(USB_ROW, RM_COL);
166         if (!rm_btn) {
167                 _ERR("Add usb remove button failed.");
168                 evas_object_del(sel_btn);
169                 return false;
170         }
171
172         Connect(rm_btn, MENU_REMOVE_BTN, TYPE_KEY_DOWN | TYPE_MOUSE_DOWN
173                                 | TYPE_MOUSE_MOVE | TYPE_FOCUSED);
174
175         elm_object_focus_next_object_set(rm_btn, rm_btn, ELM_FOCUS_UP);
176         elm_object_focus_next_object_set(rm_btn, rm_btn, ELM_FOCUS_DOWN);
177         elm_object_focus_next_object_set(rm_btn, rm_btn, ELM_FOCUS_RIGHT);
178
179         elm_object_focus_set(sel_btn, EINA_TRUE);
180
181         return true;
182 }
183
184 bool CMenuView::m_AddExternalMenuBtn(void)
185 {
186         Evas_Object *sel_btn;
187
188         sel_btn = m_AddBtnByIndex(EXTERNAL_ROW, SEL_COL);
189         if (!sel_btn) {
190                 _ERR("Add wifi select button failed.");
191                 return false;
192         }
193
194         Connect(sel_btn, MENU_SELECT_BTN, TYPE_KEY_DOWN | TYPE_MOUSE_DOWN
195                                 | TYPE_MOUSE_MOVE | TYPE_FOCUSED);
196
197         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_UP);
198         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_DOWN);
199         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_LEFT);
200         elm_object_focus_next_object_set(sel_btn, sel_btn, ELM_FOCUS_RIGHT);
201
202         elm_object_focus_set(sel_btn, EINA_TRUE);
203
204         return true;
205 }
206
207 bool CMenuView::m_AddMenuBtn(void)
208 {
209         switch (m->node->Type()) {
210         case CONN_TYPE_USB:
211                 return m_AddUsbMenuBtn();
212         case CONN_TYPE_TV:
213                 return m_AddExternalMenuBtn();
214         default:
215                 break;
216         }
217
218         return false;
219 }
220
221 bool CMenuView::m_AddFocusItem(void)
222 {
223         Evas_Object *img;
224         const char *path;
225
226         elm_object_part_text_set(m->base,
227                         PART_FOCUS_ITEM_TEXT_NAME,
228                         _(m->node->Name()));
229         elm_object_part_text_set(m->base,
230                         PART_FOCUS_ITEM_TEXT_TYPE,
231                         _(m->node->TypeName()));
232
233         path = m->node->IconPath();
234         if (!path)
235                 return false;
236
237         img = elm_image_add(m->base);
238         if (!img)
239                 return false;
240
241         elm_image_file_set(img, path, NULL);
242         evas_object_show(img);
243         elm_object_part_content_set(m->base, PART_FOCUS_ITEM_IMG, img);
244
245         return true;
246 }
247
248
249 Evas_Object *CMenuView::Base(void)
250 {
251         ASSERT(m);
252
253         return m->base;
254 }
255
256
257 bool CMenuView::Create(void *data)
258 {
259         ASSERT(!m);
260         ASSERT(data);
261
262         Evas_Object *win, *base;
263         CViewMgr *vmgr = CViewMgr::GetInstance();
264         ASSERT(vmgr);
265
266         win = vmgr->Window();
267         if (!win)
268                 return false;
269
270         base = m_AddLayout(win);
271         if (!base)
272                 return false;
273
274         m = new SMenuView;
275         if (!m) {
276                 _ERR("calloc private data failed.");
277                 evas_object_del(base);
278                 return NULL;
279         }
280         memset(m, 0, sizeof(SMenuView));
281
282         m->base = base;
283         m->node = (CSourceInfo *)data;
284         m->vmgr = vmgr;
285
286         if (!m_AddFocusItem()) {
287                 _ERR("add focus item failed.");
288                 evas_object_del(base);
289                 delete m;
290                 m = NULL;
291                 return NULL;
292         }
293
294         if (!m_AddMenuBtn()) {
295                 _ERR("add menu button failed.");
296                 evas_object_del(base);
297                 delete m;
298                 m = NULL;
299                 return NULL;
300         }
301
302         Connect(base, MENU_BASE, TYPE_KEY_DOWN);
303
304         CBaseView::Create(NULL);
305
306         return true;
307 }
308
309 void CMenuView::Destroy(void)
310 {
311         ASSERT(m);
312
313         CBaseView::Destroy();
314
315         delete m;
316         m = NULL;
317 }
318
319 void CMenuView::t_OnShow(void)
320 {
321         ASSERT(m);
322
323         evas_object_show(m->base);
324
325         t_OnResume();
326 }
327
328 void CMenuView::t_OnHide(void)
329 {
330         ASSERT(m);
331
332         evas_object_hide(m->base);
333 }
334
335 void CMenuView::t_OnResume(void)
336 {
337         ASSERT(m);
338
339         elm_object_focus_set(m->focus_btn, EINA_TRUE);
340 }
341
342 void CMenuView::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
343 {
344         switch (id) {
345         case MENU_BASE:
346                 if (!ev->keyname)
347                         return;
348
349                 if (!strcmp(ev->keyname, KEY_BACK)
350                         || !strcmp(ev->keyname, KEY_BACK_REMOTE))
351                         m->vmgr->PopView();
352
353                 break;
354         case MENU_SELECT_BTN:
355                 if (!ev->keyname)
356                         return;
357
358                 if (!strcmp(ev->keyname, KEY_ENTER)
359                         || !strcmp(ev->keyname, KEY_ENTER_REMOTE))
360                         m->node->SwitchTo();
361
362                 break;
363         case MENU_REMOVE_BTN:
364                 if (!ev->keyname)
365                         return;
366
367                 if (!strcmp(ev->keyname, KEY_ENTER)
368                         || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
369                         /* TODO call usb remove */
370                         m->vmgr->PopView();
371                 }
372
373                 break;
374         default:
375                 break;
376         }
377 }
378
379 void CMenuView::OnMouseDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Down *ev)
380 {
381         switch (id) {
382         case MENU_SELECT_BTN:
383                 m->node->SwitchTo();
384                 break;
385         case MENU_REMOVE_BTN:
386                 m->vmgr->PopView();
387                 break;
388         default:
389                 break;
390         }
391 }
392
393 void CMenuView::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
394 {
395         switch (id) {
396         case MENU_SELECT_BTN:
397         case MENU_REMOVE_BTN:
398                 if (!elm_object_focus_get(obj))
399                         elm_object_focus_set(obj, EINA_TRUE);
400
401                 break;
402         default:
403                 break;
404         }
405 }
406
407 void CMenuView::OnFocused(int id, Evas_Object *obj, Elm_Object_Item *item)
408 {
409         switch (id) {
410         case MENU_SELECT_BTN:
411         case MENU_REMOVE_BTN:
412                 m->focus_btn = obj;
413                 break;
414         default:
415                 break;
416         }
417 }