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 <Elementary.h>
20 #include <AppCommon.h>
24 #include "FbContextView.h"
25 #include "Dummy/DummyContent.h"
27 //#define _GET_PRIV(o) evas_object_data_get(o, "CTMDATA");
28 //#define _SET_PRIV(o, data) evas_object_data_set(o, "CTMDATA", data);
30 #define FBR_TEXT_SIZE N_("Size")
31 #define FBR_TEXT_FORMAT N_("Format")
32 #define FBR_TEXT_OPEN N_("OPEN")
33 #define FBR_TEXT_LINK N_("Other linkable apps")
34 #define FBR_TEXT_REL N_("Other apps for this type")
36 #define TOTAL_CONTEXT_BTNS 5
37 #define TABLE_MAX_COL 2
38 #define MIN_LABEL_WIDTH 103
39 #define FBR_CTXT_BTN_WPAD 26
40 #define FBR_CTXT_TABLE_WPAD 14
41 #define FBR_CTXT_TABLE_HPAD 14
47 Evas_Object *eoBtnOpen;
48 Evas_Object *rel_first[TABLE_MAX_COL];
49 Evas_Object *rel_last[TABLE_MAX_COL];
50 Evas_Object *link_first[TABLE_MAX_COL];
51 Evas_Object *link_last[TABLE_MAX_COL];
55 CDummyContent content;
62 for (a = 0; a < TABLE_MAX_COL; a++) {
69 pHandlerButton = new SContextView::CHandlerButton(this);
72 delete pHandlerButton;
75 class CHandlerButton : public CListenerMgr, IMouseMoveListener, IMouseUpListener, IKeyUpListener {
78 CHandlerButton(SContextView *ins) : IMouseMoveListener(this), IMouseUpListener(this), IKeyUpListener(this) { m = ins; }
80 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
81 if (!elm_object_focus_get(obj))
82 elm_object_focus_set(obj, EINA_TRUE);
84 virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev) {
86 if (m->eoBtnOpen == obj) {
88 if (strcmp(ev->keyname, KEY_ENTER) && strcmp(ev->keyname, KEY_ENTER_REMOTE))
91 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
95 if (strcmp(ev->keyname, KEY_ENTER) && strcmp(ev->keyname, KEY_ENTER_REMOTE))
98 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
101 virtual void OnMouseUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Up *ev) {
103 if (m->eoBtnOpen == obj) {
104 CViewMgr::GetInstance()->UpdateView(FBR_BASE_VIEW, NULL);
107 elm_object_signal_emit(obj, FBR_SIGNAL_CONTENT_CLICKED, FBR_CONTEXT_VIEW);
114 extern const char *typestr[];
117 void CContextView::_lbl_start_slide(Evas_Object *lbl)
119 elm_label_ellipsis_set(lbl, EINA_FALSE);
120 elm_label_slide_mode_set(lbl, ELM_LABEL_SLIDE_MODE_AUTO);
121 elm_label_slide_go(lbl);
124 void CContextView::_btn_focused(void *data, Evas_Object *obj, void *ev)
130 elm_object_signal_emit(obj, FBR_SIGNAL_FOCUSED, FBR_CONTEXT_VIEW);
134 void CContextView::_btn_unfocused(void *data, Evas_Object *obj, void *ev)
140 elm_object_signal_emit(obj, FBR_SIGNAL_UNFOCUSED, FBR_CONTEXT_VIEW);
144 bool CContextView::_add_btn_label(Evas_Object *btn, const char *txt)
147 char buf[MAX_LENGTH];
152 lbl = elm_label_add(btn);
154 _ERR("elm_label_add failed.");
158 snprintf(buf, sizeof(buf),
159 "<align=center><color=#FFFFFFFF>"
161 "<font_size=21>%s</font_size>"
162 "</font></color></align>", FONT_STYLE_MEDIUM, _(txt));
163 elm_object_text_set(lbl, buf);
164 elm_label_line_wrap_set(lbl, ELM_WRAP_WORD);
165 evas_object_size_hint_min_set(lbl, MIN_LABEL_WIDTH, 0);
166 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNTEXT, lbl);
171 bool CContextView::_add_btn_icon(Evas_Object *btn, const char *icon)
174 char buf[MAX_LENGTH];
179 img = elm_image_add(btn);
181 _ERR("elm_image_add failed.");
185 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, icon);
186 elm_image_file_set(img, buf, NULL);
187 elm_object_part_content_set(btn, FBR_PART_CTXT_BTNICON, img);
192 bool CContextView::_add_btn_info(Evas_Object *btn, const char *icon, const char *txt)
194 if (!btn || !icon || !txt)
197 if (!_add_btn_icon(btn, icon))
200 if (!_add_btn_label(btn, txt))
207 Evas_Object *CContextView::_add_btnbox(Evas_Object *eoBase)
214 box = elm_box_add(eoBase);
216 _ERR(" elm_box_add failed ");
220 elm_box_horizontal_set(box, EINA_TRUE);
221 elm_box_padding_set(box, FBR_CTXT_BTN_WPAD, 0);
222 elm_box_align_set(box, 0, 0.5);
223 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
229 bool CContextView::_get_context_details(CExtNameInfo *pInfo, char **path, char **title, char *subtitle, char *subtitle2)
231 char buf[MAX_LENGTH];
239 *title = pInfo->Name();
240 *path = pInfo->ThumbnailPath();
241 size = pInfo->Size();
243 size_mb = (double)size / (1024 * 1024); /* Convert to MB */
245 snprintf(buf, sizeof(buf), "%s : %f MB", _(FBR_TEXT_SIZE), size_mb);
246 strcpy(subtitle, buf);
248 type = pInfo->Type();
249 snprintf(buf, sizeof(buf), "%s : %s", _(FBR_TEXT_FORMAT), _(typestr[type]));
250 strcpy(subtitle2, buf);
255 Evas_Object *CContextView::_add_rltv_ctnt(Evas_Object *obj, const char *name, const char *icon)
257 Evas_Object *ly, *img;
258 char buf[MAX_LENGTH];
261 _ERR("Invalid argument.");
265 ly = elm_layout_add(obj);
267 _ERR("elm_layout_add failed.");
271 elm_layout_file_set(ly, EDJEFILE, FBR_CONTEXT_APP);
272 evas_object_size_hint_weight_set(ly, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
274 img = elm_image_add(ly);
276 _ERR("elm_image_add failed.");
281 if (!icon || !strcmp(icon, EMPTY_STR)) {
282 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR, FBR_IMAGE_DEFAULT_APP);
283 elm_image_file_set(img, buf, NULL);
284 elm_image_no_scale_set(img, EINA_TRUE);
286 elm_image_file_set(img, icon, NULL);
287 elm_image_aspect_fixed_set(img, EINA_FALSE);
290 elm_object_part_content_set(ly, FBR_PART_CTXT_RELCTNT_ICON, img);
291 elm_object_part_text_set(ly, FBR_PART_CTXT_RELCTNT_NAME, name);
292 elm_object_focus_allow_set(ly, EINA_TRUE);
298 Evas_Object *CContextView::_add_scroller(Evas_Object *eoBase)
300 Evas_Object *scroller;
303 _ERR("Invalid argument.");
307 scroller = elm_scroller_add(eoBase);
309 _ERR("elm_scroller_add failed.");
313 evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND,
315 evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL,
321 Evas_Object *CContextView::_add_table(Evas_Object *eoBase)
326 _ERR("Invalid argument.");
330 table = elm_table_add(eoBase);
332 _ERR("elm_table_add failed.");
336 elm_table_homogeneous_set(table, EINA_TRUE);
337 elm_table_padding_set(table,
338 FBR_CTXT_TABLE_WPAD * elm_config_scale_get(),
339 FBR_CTXT_TABLE_HPAD * elm_config_scale_get());
340 evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
341 evas_object_show(table);
347 Evas_Object *CContextView::_get_icon(Evas_Object *obj, CExtNameInfo *finfo)
352 path = finfo->Path();
356 icon = elm_icon_add(obj);
361 elm_icon_thumb_set(icon, path, NULL);
362 elm_image_aspect_fixed_set(icon, EINA_FALSE);
368 void CContextView::_set_default_thumb(Evas_Object *img, int type)
370 char buf[MAX_LENGTH];
377 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
382 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
383 FBR_IMAGE_DEFAULT_VIDEO);
387 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
388 FBR_IMAGE_DEFAULT_MUSIC);
392 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
393 FBR_IMAGE_DEFAULT_OTHER);
397 elm_image_file_set(img, buf, NULL);
398 elm_image_no_scale_set(img, EINA_TRUE);
402 Evas_Object *CContextView::_create_lbl(Evas_Object *ly, char *title)
406 char buf[MAX_LENGTH];
411 lbl = elm_label_add(ly);
416 elm_object_style_set(lbl, FBR_STYLE_LABEL);
417 elm_label_ellipsis_set(lbl, EINA_TRUE);
418 s = edje_object_data_get(elm_layout_edje_get(ly),
419 FBR_DATA_TITLE_WIDTH);
421 elm_label_wrap_width_set(lbl, atoi(s));
423 _ERR("No title width exist");
425 snprintf(buf, sizeof(buf),
426 "<align=left><color=#FFFFFFFF>"
428 "<font_size=36>%s</font_size>"
429 "</font></color></align>", FONT_STYLE_BOLD, _(title));
430 elm_object_text_set(lbl, buf);
431 elm_label_slide_speed_set(lbl, FBR_TITLE_SLIDE_SPEED);
438 void CContextView::m_SetBtnDownFocus(Evas_Object *btn)
442 if (!m->link_first[0] && !m->rel_first[0]) {
443 elm_object_focus_next_object_set(btn, btn,
448 if (m->link_first[0])
449 elm_object_focus_next_object_set(btn, m->link_first[0],
452 elm_object_focus_next_object_set(btn, m->rel_first[0],
457 void CContextView::m_SetLayoutFocusOrder(Evas_Object *btn)
464 if (m->link_first[0]) {
465 elm_object_focus_next_object_set(m->link_first[0], btn,
467 elm_object_focus_next_object_set(m->link_first[0],
468 m->rel_first[0], ELM_FOCUS_DOWN);
469 elm_object_focus_next_object_set(m->link_first[1], btn,
471 elm_object_focus_next_object_set(m->link_first[1],
472 m->rel_first[0], ELM_FOCUS_DOWN);
475 for (i = 0; i < TABLE_MAX_COL; i++) {
476 if (!m->rel_first[i])
479 obj = m->rel_first[i];
480 if (m->link_first[0])
481 elm_object_focus_next_object_set(obj, m->link_first[0],
484 elm_object_focus_next_object_set(obj, btn,
490 Evas_Object *CContextView::m_AddButton(Evas_Object *eoBase)
496 btn = elm_layout_add(eoBase);
498 _ERR("elm_layout_add failed.");
502 evas_object_size_hint_weight_set(btn,
503 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
504 evas_object_size_hint_align_set(btn, 0.0, 0.5);
506 elm_layout_file_set(btn, EDJEFILE, FBR_CONTEXT_BTN);
507 elm_object_focus_allow_set(btn, EINA_TRUE);
508 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_UP);
509 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_LEFT);
510 elm_object_focus_next_object_set(btn, btn, ELM_FOCUS_RIGHT);
512 evas_object_smart_callback_add(btn, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
513 evas_object_smart_callback_add(btn, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
515 evas_object_show(btn);
516 elm_object_focus_set(btn, EINA_TRUE);
522 bool CContextView::m_AddTableContents(Evas_Object *table, Eina_List *list, enum content_app_type type)
529 CDummyContent::SRelativeContent *rctnt;
535 EINA_LIST_FOREACH(list, l, obj) {
536 rctnt = (CDummyContent::SRelativeContent *)obj;
537 ly = _add_rltv_ctnt(table, rctnt->title, rctnt->imgpath);
540 //_SET_PRIV(ly, rctnt);
541 elm_table_pack(table, ly, col, row, 1, 1);
542 evas_object_show(ly);
544 evas_object_smart_callback_add(ly, FBR_SIGNAL_FOCUSED, _btn_focused, NULL);
545 evas_object_smart_callback_add(ly, FBR_SIGNAL_UNFOCUSED, _btn_unfocused, NULL);
547 m->pHandlerButton->Connect(ly);
550 if (type == APP_LINKED)
551 m->link_first[col] = ly;
553 m->rel_first[col] = ly;
557 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_LEFT);
558 else if (col == TABLE_MAX_COL - 1)
559 elm_object_focus_next_object_set(ly, ly, ELM_FOCUS_RIGHT);
561 if (type == APP_LINKED)
562 m->link_last[col] = ly;
564 m->rel_last[col] = ly;
567 if (col >= TABLE_MAX_COL) {
577 bool CContextView::m_CreateContentApps(Eina_List *list, enum content_app_type type)
582 Evas_Object *scroller, *table;
585 scroller = _add_scroller(m->eoBase);
587 _ERR("_add_scroller failed.");
591 table = _add_table(scroller);
593 _ERR("_add_table failed.");
594 evas_object_del(scroller);
598 r = m_AddTableContents(table, list, type);
600 _ERR("m_AddTableContents failed.");
601 evas_object_del(scroller);
605 elm_object_content_set(scroller, table);
607 if (type == APP_LINKED)
608 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_LINK_AREA,
611 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_REL_AREA,
618 bool CContextView::m_CreateBtnsPart(void)
620 Evas_Object *btn, *box;
621 box = _add_btnbox(m->eoBase);
625 btn = m_AddButton(box);
627 evas_object_del(box);
630 if (!_add_btn_info(btn, FBR_IMAGE_CTXT_OPEN, FBR_TEXT_OPEN)) {
631 evas_object_del(box);
635 m_SetBtnDownFocus(btn);
636 m_SetLayoutFocusOrder(btn);
637 elm_box_pack_end(box, btn);
640 m->pHandlerButton->Connect(m->eoBtnOpen);
642 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_BTNAREA, box);
648 bool CContextView::m_CreateInfoPart(void)
650 Evas_Object *img = NULL;
653 char subtitle[MAX_LENGTH];
654 char subtitle2[MAX_LENGTH];
657 Eina_List *rltvlist = NULL;
658 Eina_List *linkapplist = NULL;
660 Evas_Object *lbl = NULL;
662 if (!_get_context_details(m->finfo, &path, &title, subtitle, subtitle2))
665 type = m->finfo->Type();
667 if (type == E_GRP_PHOTO) {
668 img = _get_icon(m->eoBase, m->finfo);
672 img = elm_image_add(m->eoBase);
675 _set_default_thumb(img, type);
678 img = elm_image_add(m->eoBase);
681 elm_image_file_set(img, path, NULL);
682 elm_image_aspect_fixed_set(img, EINA_FALSE);
685 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_ICON, img);
687 lbl = _create_lbl(m->eoBase, title);
689 elm_object_part_content_set(m->eoBase, FBR_PART_CTXT_TITLE, lbl);
690 _lbl_start_slide(lbl);
693 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_SUBTITLE, subtitle);
694 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_SUBTITLE2, subtitle2);
696 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_LINK_TEXT, _(FBR_TEXT_LINK));
697 linkapplist = CDummyContent::ListLinkApp(type);
699 m_CreateContentApps(linkapplist, APP_LINKED);
701 elm_object_part_text_set(m->eoBase, FBR_PART_CTXT_REL_TEXT, _(FBR_TEXT_REL));
702 rltvlist = CDummyContent::ListRelative(type);
704 m_CreateContentApps(rltvlist, APP_OTHER);
712 void CContextView::sm_CbKeyPressed(void *dt, Evas *e, Evas_Object *obj, void *ei)
715 Evas_Event_Key_Down *ev;
720 ev = (Evas_Event_Key_Down *)ei;
722 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE))
724 CViewMgr::GetInstance()->PopView();
726 else if (!strcmp(ev->keyname, KEY_EXIT))
730 void CContextView::t_OnShow(void)
732 evas_object_show(m->eoBase);
735 void CContextView::t_OnHide(void)
737 evas_object_hide(m->eoBase);
740 bool CContextView::Create(void *data)
744 Evas_Object *eoBase = NULL;
745 Evas_Object *eoWin = CViewMgr::GetInstance()->Window();
749 _CHECK(m = new SContextView)
750 _CHECK(eoBase = elm_layout_add(eoWin))
751 _CHECK(elm_layout_file_set(eoBase, EDJEFILE, FBR_CONTEXT_VIEW))
752 _COMMAND{ m->eoWin = eoWin; m->eoBase = eoBase; m->finfo = (CExtNameInfo*)data; }
753 _CHECK(m_CreateInfoPart())
754 _CHECK(m_CreateBtnsPart())
757 evas_object_event_callback_add(eoBase, EVAS_CALLBACK_KEY_DOWN, sm_CbKeyPressed, m);
760 _CHECK_FAIL{ /* m_CreateBtnsPart */ }
761 _CHECK_FAIL{ /* m_CreateInfoPart */ }
763 _CHECK_FAIL{ evas_object_del(eoBase); }
764 _CHECK_FAIL{ delete m; m = NULL; }
765 } _CREATE_END_AND_CATCH{ return false; }
770 void CContextView::Destroy(void)
774 evas_object_del(m->eoBase);
779 Evas_Object* CContextView::Base(void)