2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <AppCommon.h>
22 #include "FbContextView.h"
23 #include "Dummy/DummyContent.h"
25 //#define _GET_PRIV(o) evas_object_data_get(o, "CTMDATA");
26 //#define _SET_PRIV(o, data) evas_object_data_set(o, "CTMDATA", data);
28 #define FBR_TEXT_SIZE N_("Size")
29 #define FBR_TEXT_FORMAT N_("Format")
30 #define FBR_TEXT_OPEN N_("OPEN")
31 #define FBR_TEXT_LINK N_("Other linkable apps")
32 #define FBR_TEXT_REL N_("Other apps for this type")
34 #define TOTAL_CONTEXT_BTNS 5
35 #define TABLE_MAX_COL 2
36 #define MIN_LABEL_WIDTH 103
37 #define FBR_CTXT_BTN_WPAD 26
38 #define FBR_CTXT_TABLE_WPAD 14
39 #define FBR_CTXT_TABLE_HPAD 14
45 Evas_Object *eoBtnOpen;
46 Evas_Object *rel_first[TABLE_MAX_COL];
47 Evas_Object *rel_last[TABLE_MAX_COL];
48 Evas_Object *link_first[TABLE_MAX_COL];
49 Evas_Object *link_last[TABLE_MAX_COL];
53 CDummyContent content;
60 for (a = 0; a < TABLE_MAX_COL; a++) {
67 pHandlerButton = new SContextView::CHandlerButton(this);
70 delete pHandlerButton;
73 class CHandlerButton : public CListenerMgr, IMouseMoveListener, IMouseUpListener, ISKeyUpListener {
76 CHandlerButton(SContextView *ins) : IMouseMoveListener(this), IMouseUpListener(this), ISKeyUpListener(this) { m = ins; }
78 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
79 if (!elm_object_focus_get(obj))
80 elm_object_focus_set(obj, EINA_TRUE);
82 virtual void OnSKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_SKey_Up *ev) {
84 if (m->eoBtnOpen == obj) {
86 if (ev->skey == SKEY_ENTER)
89 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
93 if (ev->skey == SKEY_ENTER)
96 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
99 virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) {
101 if (m->eoBtnOpen == obj) {
102 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
105 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
112 extern const char *typestr[];
115 void CContextView::_lbl_start_slide(Evas_Object *lbl)
117 elm_label_ellipsis_set(lbl, EINA_FALSE);
118 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
119 elm_label_slide_go(lbl);
122 void CContextView::_btn_focused(void *data, Evas_Object *obj, void *ev)
128 elm_object_signal_emit(obj, FBR_SIGNAL_FOCUSED, FBR_CONTEXT_VIEW);
132 void CContextView::_btn_unfocused(void *data, Evas_Object *obj, void *ev)
138 elm_object_signal_emit(obj, FBR_SIGNAL_UNFOCUSED, FBR_CONTEXT_VIEW);
142 bool CContextView::_add_btn_label(Evas_Object *btn, const char *txt)
145 char buf[MAX_LENGTH];
150 lbl = elm_label_add(btn);
152 _ERR("elm_label_add failed.");
156 snprintf(buf, sizeof(buf),
157 "<align=center><color=#FFFFFFFF>"
159 "<font_size=21>%s</font_size>"
160 "</font></color></align>", FONT_STYLE_MEDIUM, _(txt));
161 elm_object_text_set(lbl, buf);
162 elm_label_line_wrap_set(lbl, ELM_WRAP_WORD);
163 evas_object_size_hint_min_set(lbl, MIN_LABEL_WIDTH, 0);
164 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNTEXT, lbl);
169 bool CContextView::_add_btn_icon(Evas_Object *btn, const char *icon)
172 char buf[MAX_LENGTH];
177 img = elm_image_add(btn);
179 _ERR("elm_image_add failed.");
183 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, icon);
184 elm_image_file_set(img, buf, NULL);
185 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNICON, img);
190 bool CContextView::_add_btn_info(Evas_Object *btn, const char *icon, const char *txt)
192 if (!btn || !icon || !txt)
195 if (!_add_btn_icon(btn, icon))
198 if (!_add_btn_label(btn, txt))
205 Evas_Object *CContextView::_add_btnbox(Evas_Object *eoBase)
212 box = elm_box_add(eoBase);
214 _ERR(" elm_box_add failed ");
218 elm_box_horizontal_set(box, EINA_TRUE);
219 elm_box_padding_set(box, FBR_CTXT_BTN_WPAD, 0);
220 elm_box_align_set(box, 0, 0.5);
221 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
227 bool CContextView::_get_context_details(CExtNameInfo *pInfo, char **path, char **title, char *subtitle, char *subtitle2)
229 char buf[MAX_LENGTH];
237 *title = pInfo->Name();
238 *path = pInfo->ThumbnailPath();
239 size = pInfo->Size();
241 size_mb = (double)size / (1024 * 1024); /* Convert to MB */
243 snprintf(buf, sizeof(buf), "%s : %f MB", _(FBR_TEXT_SIZE), size_mb);
244 strcpy(subtitle, buf);
246 type = pInfo->Type();
247 snprintf(buf, sizeof(buf), "%s : %s", _(FBR_TEXT_FORMAT), _(typestr[type]));
248 strcpy(subtitle2, buf);
253 Evas_Object *CContextView::_add_rltv_ctnt(Evas_Object *obj, const char *name, const char *icon)
255 Evas_Object *ly, *img;
256 char buf[MAX_LENGTH];
259 _ERR("Invalid argument.");
263 ly = elm_layout_add(obj);
265 _ERR("elm_layout_add failed.");
269 elm_layout_file_set(ly, EDJEFILE, FBR_CONTEXT_APP);
270 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
272 img = elm_image_add(ly);
274 _ERR("elm_image_add failed.");
279 if (!icon || !strcmp(icon, EMPTY_STR)) {
280 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, FBR_IMAGE_DEFAULT_APP);
281 elm_image_file_set(img, buf, NULL);
282 elm_image_no_scale_set(img, EINA_TRUE);
284 elm_image_file_set(img, icon, NULL);
285 elm_image_aspect_fixed_set(img, EINA_FALSE);
288 elm_object_part_content_set(ly, FBR_PART_CTXT_RELCTNT_ICON, img);
289 elm_object_part_text_set(ly, FBR_PART_CTXT_RELCTNT_NAME, name);
290 elm_object_focus_allow_set(ly, EINA_TRUE);
296 Evas_Object *CContextView::_add_scroller(Evas_Object *eoBase)
298 Evas_Object *scroller;
301 _ERR("Invalid argument.");
305 scroller = elm_scroller_add(eoBase);
307 _ERR("elm_scroller_add failed.");
311 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
313 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL,
319 Evas_Object *CContextView::_add_table(Evas_Object *eoBase)
324 _ERR("Invalid argument.");
328 table = elm_table_add(eoBase);
330 _ERR("elm_table_add failed.");
334 elm_table_homogeneous_set(table, EINA_TRUE);
335 elm_table_padding_set(table,
336 FBR_CTXT_TABLE_WPAD * elm_config_scale_get(),
337 FBR_CTXT_TABLE_HPAD * elm_config_scale_get());
338 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
339 evas_object_show(table);
345 Evas_Object *CContextView::_get_icon(Evas_Object *obj, CExtNameInfo *finfo)
350 path = finfo->Path();
354 icon = elm_icon_add(obj);
359 elm_icon_thumb_set(icon, path, NULL);
360 elm_image_aspect_fixed_set(icon, EINA_FALSE);
366 void CContextView::_set_default_thumb(Evas_Object *img, int type)
368 char buf[MAX_LENGTH];
375 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
380 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
381 FBR_IMAGE_DEFAULT_VIDEO);
385 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
386 FBR_IMAGE_DEFAULT_MUSIC);
390 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
391 FBR_IMAGE_DEFAULT_OTHER);
395 elm_image_file_set(img, buf, NULL);
396 elm_image_no_scale_set(img, EINA_TRUE);
400 Evas_Object *CContextView::_create_lbl(Evas_Object *ly, char *title)
404 char buf[MAX_LENGTH];
409 lbl = elm_label_add(ly);
414 elm_object_style_set(lbl, FBR_STYLE_LABEL);
415 elm_label_ellipsis_set(lbl, EINA_TRUE);
416 s = edje_object_data_get(elm_layout_edje_get(ly),
417 FBR_DATA_TITLE_WIDTH);
419 elm_label_wrap_width_set(lbl, atoi(s));
421 _ERR("No title width exist");
423 snprintf(buf, sizeof(buf),
424 "<align=left><color=#FFFFFFFF>"
426 "<font_size=36>%s</font_size>"
427 "</font></color></align>", FONT_STYLE_BOLD, _(title));
428 elm_object_text_set(lbl, buf);
429 elm_label_slide_speed_set(lbl, FBR_TITLE_SLIDE_SPEED);
436 void CContextView::m_SetBtnDownFocus(Evas_Object *btn)
440 if (!m->link_first[0] && !m->rel_first[0]) {
441 elm_object_focus_next_object_set(btn, btn,
446 if (m->link_first[0])
447 elm_object_focus_next_object_set(btn, m->link_first[0],
450 elm_object_focus_next_object_set(btn, m->rel_first[0],
455 void CContextView::m_SetLayoutFocusOrder(Evas_Object *btn)
462 if (m->link_first[0]) {
463 elm_object_focus_next_object_set(m->link_first[0], btn,
465 elm_object_focus_next_object_set(m->link_first[0],
466 m->rel_first[0], ELM_FOCUS_DOWN);
467 elm_object_focus_next_object_set(m->link_first[1], btn,
469 elm_object_focus_next_object_set(m->link_first[1],
470 m->rel_first[0], ELM_FOCUS_DOWN);
473 for (i = 0; i < TABLE_MAX_COL; i++) {
474 if (!m->rel_first[i])
477 obj = m->rel_first[i];
478 if (m->link_first[0])
479 elm_object_focus_next_object_set(obj, m->link_first[0],
482 elm_object_focus_next_object_set(obj, btn,
488 Evas_Object *CContextView::m_AddButton(Evas_Object *eoBase)
494 btn = elm_layout_add(eoBase);
496 _ERR("elm_layout_add failed.");
500 evas_object_size_hint_weight_set(btn,
501 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
502 evas_object_size_hint_align_set(btn, 0.0, 0.5);
504 elm_layout_file_set(btn, EDJEFILE, FBR_CONTEXT_BTN);
505 elm_object_focus_allow_set(btn, EINA_TRUE);
506 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP);
507 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT);
508 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT);
510 evas_object_smart_callback_add(btn, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
511 evas_object_smart_callback_add(btn, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
513 evas_object_show(btn);
514 elm_object_focus_set(btn, EINA_TRUE);
520 bool CContextView::m_AddTableContents(Evas_Object *table, Eina_List *list, enum content_app_type type)
527 CDummyContent::SRelativeContent *rctnt;
533 EINA_LIST_FOREACH(list, l, obj) {
534 rctnt = (CDummyContent::SRelativeContent *)obj;
535 ly = _add_rltv_ctnt(table, rctnt->title, rctnt->imgpath);
538 //_SET_PRIV(ly, rctnt);
539 elm_table_pack(table, ly, col, row, 1, 1);
540 evas_object_show(ly);
542 evas_object_smart_callback_add(ly, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
543 evas_object_smart_callback_add(ly, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
545 m->pHandlerButton->Connect(ly);
548 if (type == APP_LINKED)
549 m->link_first[col] = ly;
551 m->rel_first[col] = ly;
555 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_LEFT);
556 else if (col == TABLE_MAX_COL - 1)
557 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_RIGHT);
559 if (type == APP_LINKED)
560 m->link_last[col] = ly;
562 m->rel_last[col] = ly;
565 if (col >= TABLE_MAX_COL) {
575 bool CContextView::m_CreateContentApps(Eina_List *list, enum content_app_type type)
580 Evas_Object *scroller, *table;
583 scroller = _add_scroller(m->eoBase);
585 _ERR("_add_scroller failed.");
589 table = _add_table(scroller);
591 _ERR("_add_table failed.");
592 evas_object_del(scroller);
596 r = m_AddTableContents(table, list, type);
598 _ERR("m_AddTableContents failed.");
599 evas_object_del(scroller);
603 elm_object_content_set(scroller, table);
605 if (type == APP_LINKED)
606 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_LINK_AREA,
609 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_REL_AREA,
616 bool CContextView::m_CreateBtnsPart(void)
618 Evas_Object *btn, *box;
619 box = _add_btnbox(m->eoBase);
623 btn = m_AddButton(box);
625 evas_object_del(box);
628 if (!_add_btn_info(btn, FBR_IMAGE_CTXT_OPEN, FBR_TEXT_OPEN)) {
629 evas_object_del(box);
633 m_SetBtnDownFocus(btn);
634 m_SetLayoutFocusOrder(btn);
635 elm_box_pack_end(box, btn);
638 m->pHandlerButton->Connect(m->eoBtnOpen);
640 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_BTNAREA, box);
646 bool CContextView::m_CreateInfoPart(void)
648 Evas_Object *img = NULL;
651 char subtitle[MAX_LENGTH];
652 char subtitle2[MAX_LENGTH];
655 Eina_List *rltvlist = NULL;
656 Eina_List *linkapplist = NULL;
658 Evas_Object *lbl = NULL;
660 if (!_get_context_details(m->finfo, &path, &title, subtitle, subtitle2))
663 type = m->finfo->Type();
665 if (type == E_GRP_PHOTO) {
666 img = _get_icon(m->eoBase, m->finfo);
670 img = elm_image_add(m->eoBase);
673 _set_default_thumb(img, type);
676 img = elm_image_add(m->eoBase);
679 elm_image_file_set(img, path, NULL);
680 elm_image_aspect_fixed_set(img, EINA_FALSE);
683 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_ICON, img);
685 lbl = _create_lbl(m->eoBase, title);
687 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_TITLE, lbl);
688 _lbl_start_slide(lbl);
691 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_SUBTITLE, subtitle);
692 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_SUBTITLE2, subtitle2);
694 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_LINK_TEXT, _(FBR_TEXT_LINK));
695 linkapplist = CDummyContent::ListLinkApp(type);
697 m_CreateContentApps(linkapplist, APP_LINKED);
699 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_REL_TEXT, _(FBR_TEXT_REL));
700 rltvlist = CDummyContent::ListRelative(type);
702 m_CreateContentApps(rltvlist, APP_OTHER);
710 void CContextView::sm_CbKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei)
713 Evas_Event_Key_Down *ev;
718 ev = (Evas_Event_Key_Down *)ei;
720 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE))
722 CViewMgr::GetInstance()->PopView();
724 else if (!strcmp(ev->keyname, KEY_EXIT))
728 void CContextView::t_OnShow(void)
730 evas_object_show(m->eoBase);
733 void CContextView::t_OnHide(void)
735 evas_object_hide(m->eoBase);
738 bool CContextView::Create(void *data)
742 Evas_Object *eoBase = NULL;
743 Evas_Object *eoWin = CViewMgr::GetInstance()->Window();
747 _CHECK(m = new SContextView)
748 _CHECK(eoBase = elm_layout_add(eoWin))
749 _CHECK(elm_layout_file_set(eoBase, EDJEFILE, FBR_CONTEXT_VIEW))
750 _COMMAND{ m->eoWin = eoWin; m->eoBase = eoBase; m->finfo = (CExtNameInfo*)data; }
751 _CHECK(m_CreateInfoPart())
752 _CHECK(m_CreateBtnsPart())
755 evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyPressed, m);
758 _CHECK_FAIL{ /* m_CreateBtnsPart */ }
759 _CHECK_FAIL{ /* m_CreateInfoPart */ }
761 _CHECK_FAIL{ evas_object_del(eoBase); }
762 _CHECK_FAIL{ delete m; m = NULL; }
763 } _CREATE_END_AND_CATCH{ return false; }
768 void CContextView::Destroy(void)
772 evas_object_del(m->eoBase);
777 Evas_Object* CContextView::Base(void)