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
44 Evas_Object *eoBtnOpen;
45 Evas_Object *rel_first[TABLE_MAX_COL];
46 Evas_Object *rel_last[TABLE_MAX_COL];
47 Evas_Object *link_first[TABLE_MAX_COL];
48 Evas_Object *link_last[TABLE_MAX_COL];
52 CDummyContent content;
58 for (a = 0; a < TABLE_MAX_COL; a++) {
65 pHandlerButton = new SContextView::CHandlerButton(this);
68 delete pHandlerButton;
71 class CHandlerButton : public CListenerMgr, IMouseMoveListener, IMouseUpListener, ISKeyUpListener {
74 CHandlerButton(SContextView *ins) : IMouseMoveListener(this), IMouseUpListener(this), ISKeyUpListener(this) { m = ins; }
76 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
77 if (!elm_object_focus_get(obj))
78 elm_object_focus_set(obj, EINA_TRUE);
80 virtual void OnSKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_SKey_Up *ev) {
82 if (m->eoBtnOpen == obj) {
84 if (ev->skey == SKEY_ENTER)
87 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
91 if (ev->skey == SKEY_ENTER)
94 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
97 virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) {
99 if (m->eoBtnOpen == obj) {
100 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
103 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
110 extern const char *typestr[];
113 void CContextView::_lbl_start_slide(Evas_Object *lbl)
115 elm_label_ellipsis_set(lbl, EINA_FALSE);
116 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
117 elm_label_slide_go(lbl);
120 void CContextView::_btn_focused(void *data, Evas_Object *obj, void *ev)
126 elm_object_signal_emit(obj, FBR_SIGNAL_FOCUSED, FBR_CONTEXT_VIEW);
130 void CContextView::_btn_unfocused(void *data, Evas_Object *obj, void *ev)
136 elm_object_signal_emit(obj, FBR_SIGNAL_UNFOCUSED, FBR_CONTEXT_VIEW);
140 bool CContextView::_add_btn_label(Evas_Object *btn, const char *txt)
143 char buf[MAX_LENGTH];
148 lbl = elm_label_add(btn);
150 _ERR("elm_label_add failed.");
154 snprintf(buf, sizeof(buf),
155 "<align=center><color=#FFFFFFFF>"
157 "<font_size=21>%s</font_size>"
158 "</font></color></align>", FONT_STYLE_MEDIUM, _(txt));
159 elm_object_text_set(lbl, buf);
160 elm_label_line_wrap_set(lbl, ELM_WRAP_WORD);
161 evas_object_size_hint_min_set(lbl, MIN_LABEL_WIDTH, 0);
162 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNTEXT, lbl);
167 bool CContextView::_add_btn_icon(Evas_Object *btn, const char *icon)
170 char buf[MAX_LENGTH];
175 img = elm_image_add(btn);
177 _ERR("elm_image_add failed.");
181 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, icon);
182 elm_image_file_set(img, buf, NULL);
183 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNICON, img);
188 bool CContextView::_add_btn_info(Evas_Object *btn, const char *icon, const char *txt)
190 if (!btn || !icon || !txt)
193 if (!_add_btn_icon(btn, icon))
196 if (!_add_btn_label(btn, txt))
203 Evas_Object *CContextView::_add_btnbox(Evas_Object *eoBase)
210 box = elm_box_add(eoBase);
212 _ERR(" elm_box_add failed ");
216 elm_box_horizontal_set(box, EINA_TRUE);
217 elm_box_padding_set(box, FBR_CTXT_BTN_WPAD, 0);
218 elm_box_align_set(box, 0, 0.5);
219 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
225 bool CContextView::_get_context_details(CExtNameInfo *pInfo, char **path, char **title, char *subtitle, char *subtitle2)
227 char buf[MAX_LENGTH];
235 *title = pInfo->Name();
236 *path = pInfo->ThumbnailPath();
237 size = pInfo->Size();
239 size_mb = (double)size / (1024 * 1024); /* Convert to MB */
241 snprintf(buf, sizeof(buf), "%s : %f MB", _(FBR_TEXT_SIZE), size_mb);
242 strcpy(subtitle, buf);
244 type = pInfo->Type();
245 snprintf(buf, sizeof(buf), "%s : %s", _(FBR_TEXT_FORMAT), _(typestr[type]));
246 strcpy(subtitle2, buf);
251 Evas_Object *CContextView::_add_rltv_ctnt(Evas_Object *obj, const char *name, const char *icon)
253 Evas_Object *ly, *img;
254 char buf[MAX_LENGTH];
257 _ERR("Invalid argument.");
261 ly = elm_layout_add(obj);
263 _ERR("elm_layout_add failed.");
267 elm_layout_file_set(ly, EDJEFILE, FBR_CONTEXT_APP);
268 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
270 img = elm_image_add(ly);
272 _ERR("elm_image_add failed.");
277 if (!icon || !strcmp(icon, EMPTY_STR)) {
278 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, FBR_IMAGE_DEFAULT_APP);
279 elm_image_file_set(img, buf, NULL);
280 elm_image_no_scale_set(img, EINA_TRUE);
282 elm_image_file_set(img, icon, NULL);
283 elm_image_aspect_fixed_set(img, EINA_FALSE);
286 elm_object_part_content_set(ly, FBR_PART_CTXT_RELCTNT_ICON, img);
287 elm_object_part_text_set(ly, FBR_PART_CTXT_RELCTNT_NAME, name);
288 elm_object_focus_allow_set(ly, EINA_TRUE);
294 Evas_Object *CContextView::_add_scroller(Evas_Object *eoBase)
296 Evas_Object *scroller;
299 _ERR("Invalid argument.");
303 scroller = elm_scroller_add(eoBase);
305 _ERR("elm_scroller_add failed.");
309 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
311 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL,
317 Evas_Object *CContextView::_add_table(Evas_Object *eoBase)
322 _ERR("Invalid argument.");
326 table = elm_table_add(eoBase);
328 _ERR("elm_table_add failed.");
332 elm_table_homogeneous_set(table, EINA_TRUE);
333 elm_table_padding_set(table,
334 FBR_CTXT_TABLE_WPAD * elm_config_scale_get(),
335 FBR_CTXT_TABLE_HPAD * elm_config_scale_get());
336 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
337 evas_object_show(table);
343 Evas_Object *CContextView::_get_icon(Evas_Object *obj, CExtNameInfo *finfo)
348 path = finfo->Path();
352 icon = elm_icon_add(obj);
357 elm_icon_thumb_set(icon, path, NULL);
358 elm_image_aspect_fixed_set(icon, EINA_FALSE);
364 void CContextView::_set_default_thumb(Evas_Object *img, int type)
366 char buf[MAX_LENGTH];
373 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
378 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
379 FBR_IMAGE_DEFAULT_VIDEO);
383 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
384 FBR_IMAGE_DEFAULT_MUSIC);
388 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
389 FBR_IMAGE_DEFAULT_OTHER);
393 elm_image_file_set(img, buf, NULL);
394 elm_image_no_scale_set(img, EINA_TRUE);
398 Evas_Object *CContextView::_create_lbl(Evas_Object *ly, char *title)
402 char buf[MAX_LENGTH];
407 lbl = elm_label_add(ly);
412 elm_object_style_set(lbl, FBR_STYLE_LABEL);
413 elm_label_ellipsis_set(lbl, EINA_TRUE);
414 s = edje_object_data_get(elm_layout_edje_get(ly),
415 FBR_DATA_TITLE_WIDTH);
417 elm_label_wrap_width_set(lbl, atoi(s));
419 _ERR("No title width exist");
421 snprintf(buf, sizeof(buf),
422 "<align=left><color=#FFFFFFFF>"
424 "<font_size=36>%s</font_size>"
425 "</font></color></align>", FONT_STYLE_BOLD, _(title));
426 elm_object_text_set(lbl, buf);
427 elm_label_slide_speed_set(lbl, FBR_TITLE_SLIDE_SPEED);
434 void CContextView::m_SetBtnDownFocus(Evas_Object *btn)
438 if (!m->link_first[0] && !m->rel_first[0]) {
439 elm_object_focus_next_object_set(btn, btn,
444 if (m->link_first[0])
445 elm_object_focus_next_object_set(btn, m->link_first[0],
448 elm_object_focus_next_object_set(btn, m->rel_first[0],
453 void CContextView::m_SetLayoutFocusOrder(Evas_Object *btn)
460 if (m->link_first[0]) {
461 elm_object_focus_next_object_set(m->link_first[0], btn,
463 elm_object_focus_next_object_set(m->link_first[0],
464 m->rel_first[0], ELM_FOCUS_DOWN);
465 elm_object_focus_next_object_set(m->link_first[1], btn,
467 elm_object_focus_next_object_set(m->link_first[1],
468 m->rel_first[0], ELM_FOCUS_DOWN);
471 for (i = 0; i < TABLE_MAX_COL; i++) {
472 if (!m->rel_first[i])
475 obj = m->rel_first[i];
476 if (m->link_first[0])
477 elm_object_focus_next_object_set(obj, m->link_first[0],
480 elm_object_focus_next_object_set(obj, btn,
486 Evas_Object *CContextView::m_AddButton(Evas_Object *eoBase)
492 btn = elm_layout_add(eoBase);
494 _ERR("elm_layout_add failed.");
498 evas_object_size_hint_weight_set(btn,
499 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
500 evas_object_size_hint_align_set(btn, 0.0, 0.5);
502 elm_layout_file_set(btn, EDJEFILE, FBR_CONTEXT_BTN);
503 elm_object_focus_allow_set(btn, EINA_TRUE);
504 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP);
505 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT);
506 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT);
508 evas_object_smart_callback_add(btn, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
509 evas_object_smart_callback_add(btn, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
511 evas_object_show(btn);
512 elm_object_focus_set(btn, EINA_TRUE);
518 bool CContextView::m_AddTableContents(Evas_Object *table, Eina_List *list, enum content_app_type type)
525 CDummyContent::SRelativeContent *rctnt;
531 EINA_LIST_FOREACH(list, l, obj) {
532 rctnt = (CDummyContent::SRelativeContent *)obj;
533 ly = _add_rltv_ctnt(table, rctnt->title, rctnt->imgpath);
536 //_SET_PRIV(ly, rctnt);
537 elm_table_pack(table, ly, col, row, 1, 1);
538 evas_object_show(ly);
540 evas_object_smart_callback_add(ly, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
541 evas_object_smart_callback_add(ly, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
543 m->pHandlerButton->Connect(ly);
546 if (type == APP_LINKED)
547 m->link_first[col] = ly;
549 m->rel_first[col] = ly;
553 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_LEFT);
554 else if (col == TABLE_MAX_COL - 1)
555 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_RIGHT);
557 if (type == APP_LINKED)
558 m->link_last[col] = ly;
560 m->rel_last[col] = ly;
563 if (col >= TABLE_MAX_COL) {
573 bool CContextView::m_CreateContentApps(Eina_List *list, enum content_app_type type)
578 Evas_Object *scroller, *table;
581 scroller = _add_scroller(Base());
583 _ERR("_add_scroller failed.");
587 table = _add_table(scroller);
589 _ERR("_add_table failed.");
590 evas_object_del(scroller);
594 r = m_AddTableContents(table, list, type);
596 _ERR("m_AddTableContents failed.");
597 evas_object_del(scroller);
601 elm_object_content_set(scroller, table);
603 if (type == APP_LINKED)
604 elm_object_part_content_set(Base(), FBR_PART_CTXT_LINK_AREA,
607 elm_object_part_content_set(Base(), FBR_PART_CTXT_REL_AREA,
614 bool CContextView::m_CreateBtnsPart(void)
616 Evas_Object *btn, *box;
617 box = _add_btnbox(Base());
621 btn = m_AddButton(box);
623 evas_object_del(box);
626 if (!_add_btn_info(btn, FBR_IMAGE_CTXT_OPEN, FBR_TEXT_OPEN)) {
627 evas_object_del(box);
631 m_SetBtnDownFocus(btn);
632 m_SetLayoutFocusOrder(btn);
633 elm_box_pack_end(box, btn);
636 m->pHandlerButton->Connect(m->eoBtnOpen);
638 elm_object_part_content_set(Base(), FBR_PART_CTXT_BTNAREA, box);
644 bool CContextView::m_CreateInfoPart(void)
646 Evas_Object *img = NULL;
649 char subtitle[MAX_LENGTH];
650 char subtitle2[MAX_LENGTH];
653 Eina_List *rltvlist = NULL;
654 Eina_List *linkapplist = NULL;
656 Evas_Object *lbl = NULL;
658 if (!_get_context_details(m->finfo, &path, &title, subtitle, subtitle2))
661 type = m->finfo->Type();
663 if (type == E_GRP_PHOTO) {
664 img = _get_icon(Base(), m->finfo);
668 img = elm_image_add(Base());
671 _set_default_thumb(img, type);
674 img = elm_image_add(Base());
677 elm_image_file_set(img, path, NULL);
678 elm_image_aspect_fixed_set(img, EINA_FALSE);
681 elm_object_part_content_set(Base(), FBR_PART_CTXT_ICON, img);
683 lbl = _create_lbl(Base(), title);
685 elm_object_part_content_set(Base(), FBR_PART_CTXT_TITLE, lbl);
686 _lbl_start_slide(lbl);
689 elm_object_part_text_set(Base(), FBR_PART_CTXT_SUBTITLE, subtitle);
690 elm_object_part_text_set(Base(), FBR_PART_CTXT_SUBTITLE2, subtitle2);
692 elm_object_part_text_set(Base(), FBR_PART_CTXT_LINK_TEXT, _(FBR_TEXT_LINK));
693 linkapplist = CDummyContent::ListLinkApp(type);
695 m_CreateContentApps(linkapplist, APP_LINKED);
697 elm_object_part_text_set(Base(), FBR_PART_CTXT_REL_TEXT, _(FBR_TEXT_REL));
698 rltvlist = CDummyContent::ListRelative(type);
700 m_CreateContentApps(rltvlist, APP_OTHER);
708 void CContextView::sm_CbKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei)
711 Evas_Event_Key_Down *ev;
716 ev = (Evas_Event_Key_Down *)ei;
718 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE))
720 CViewMgr::GetInstance()->PopView();
722 else if (!strcmp(ev->keyname, KEY_EXIT))
726 void CContextView::t_OnShow(void)
728 evas_object_show(Base());
731 void CContextView::t_OnHide(void)
733 evas_object_hide(Base());
736 bool CContextView::Create(void *data, Evas_Object *base)
740 Evas_Object *eoBase = NULL;
741 Evas_Object *eoWin = CViewMgr::GetInstance()->Window();
745 _CHECK(m = new SContextView)
746 _CHECK(eoBase = elm_layout_add(eoWin))
747 _CHECK(elm_layout_file_set(eoBase, EDJEFILE, FBR_CONTEXT_VIEW))
748 _COMMAND{ m->eoWin = eoWin; m->finfo = (CExtNameInfo*)data; }
749 _CHECK(CBaseView::Create(NULL, eoBase))
750 _CHECK(m_CreateInfoPart())
751 _CHECK(m_CreateBtnsPart())
754 evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyPressed, m);
757 _CHECK_FAIL{ /* m_CreateBtnsPart */ }
758 _CHECK_FAIL{ /* m_CreateInfoPart */ }
759 _CHECK_FAIL{ CBaseView::Destroy(); }
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(Base());
774 CBaseView::Destroy();