1 #include <Elementary.h>
3 #include "elm_widget_scroller.h"
4 EAPI const char ELM_SCROLLER_SMART_NAME[] = "elm_scroller";
6 static const char SIG_SCROLL[] = "scroll";
7 static const char SIG_SCROLL_ANIM_START[] = "scroll,anim,start";
8 static const char SIG_SCROLL_ANIM_STOP[] = "scroll,anim,stop";
9 static const char SIG_SCROLL_DRAG_START[] = "scroll,drag,start";
10 static const char SIG_SCROLL_DRAG_STOP[] = "scroll,drag,stop";
11 static const char SIG_EDGE_LEFT[] = "edge,left";
12 static const char SIG_EDGE_RIGHT[] = "edge,right";
13 static const char SIG_EDGE_TOP[] = "edge,top";
14 static const char SIG_EDGE_BOTTOM[] = "edge,bottom";
15 static const char SIG_VBAR_DRAG[] = "vbar,drag";
16 static const char SIG_VBAR_PRESS[] = "vbar,press";
17 static const char SIG_VBAR_UNPRESS[] = "vbar,unpress";
18 static const char SIG_HBAR_DRAG[] = "hbar,drag";
19 static const char SIG_HBAR_PRESS[] = "hbar,press";
20 static const char SIG_HBAR_UNPRESS[] = "hbar,unpress";
21 static const Evas_Smart_Cb_Description _smart_callbacks[] =
24 {SIG_SCROLL_ANIM_START, ""},
25 {SIG_SCROLL_ANIM_STOP, ""},
26 {SIG_SCROLL_DRAG_START, ""},
27 {SIG_SCROLL_DRAG_STOP, ""},
31 {SIG_EDGE_BOTTOM, ""},
34 {SIG_VBAR_UNPRESS, ""},
37 {SIG_HBAR_UNPRESS, ""},
41 static const Evas_Smart_Interface *_smart_interfaces[] =
43 (Evas_Smart_Interface *)&ELM_SCROLLABLE_IFACE, NULL
46 EVAS_SMART_SUBCLASS_IFACE_NEW
47 (ELM_SCROLLER_SMART_NAME, _elm_scroller, Elm_Scroller_Smart_Class,
48 Elm_Layout_Smart_Class, elm_layout_smart_class_get, _smart_callbacks,
52 _elm_scroller_smart_event(Evas_Object *obj,
53 Evas_Object *src __UNUSED__,
54 Evas_Callback_Type type,
65 Evas_Coord page_x = 0;
66 Evas_Coord page_y = 0;
67 Evas_Coord step_x = 0;
68 Evas_Coord step_y = 0;
69 Evas_Event_Key_Down *ev = event_info;
71 ELM_SCROLLER_DATA_GET(obj, sd);
73 if (elm_widget_disabled_get(obj)) return EINA_FALSE;
74 if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
75 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
77 sd->s_iface->content_pos_get(obj, &x, &y);
78 sd->s_iface->step_size_get(obj, &step_x, &step_y);
79 sd->s_iface->page_size_get(obj, &page_x, &page_y);
80 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
81 evas_object_geometry_get(sd->content, &c_x, &c_y, &max_x, &max_y);
83 if (((!strcmp(ev->keyname, "Left")) ||
84 (!strcmp(ev->keyname, "KP_Left")) ||
85 (!strcmp(ev->keyname, "Right")) ||
86 (!strcmp(ev->keyname, "KP_Right")) ||
87 (!strcmp(ev->keyname, "Up")) ||
88 (!strcmp(ev->keyname, "KP_Up")) ||
89 (!strcmp(ev->keyname, "Down")) ||
90 (!strcmp(ev->keyname, "KP_Down"))) && (!ev->string))
92 Evas_Object *current_focus = NULL;
93 Eina_List *can_focus_list = NULL;
94 Evas_Object *new_focus = NULL;
100 current_focus = elm_widget_focused_object_get(obj);
101 evas_object_geometry_get(current_focus, &f_x, &f_y, &f_w, &f_h);
102 can_focus_list = elm_widget_can_focus_child_list_get(obj);
103 if ((current_focus == obj) ||
104 (!ELM_RECTS_INTERSECT
105 (x, y, v_w, v_h, (f_x - c_x), (f_y - c_y), f_w, f_h)))
111 EINA_LIST_FOREACH(can_focus_list, l, cur)
113 double cur_weight = 0.0;
115 evas_object_geometry_get(cur, &f_x, &f_y, &f_w, &f_h);
116 if (ELM_RECTS_INTERSECT
117 (x, y, v_w, v_h, (f_x - c_x), (f_y - c_y), f_w, f_h))
120 cur_weight += ((f_x - c_x) - x) * ((f_x - c_x) - x);
122 cur_weight += ((f_y - c_y) - y) * ((f_y - c_y) - y);
123 if (cur_weight == 0.0)
125 elm_widget_focus_steal(cur);
126 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
129 cur_weight = 1.0 / cur_weight;
130 if (cur_weight > weight)
139 elm_widget_focus_steal(new_focus);
140 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
146 Evas_Object *tmp = NULL;
147 double degree = 0.0, weight = 0.0;
148 void *(*list_data_get)(const Eina_List *list);
150 list_data_get = eina_list_data_get;
152 if ((!strcmp(ev->keyname, "Left")) ||
153 (!strcmp(ev->keyname, "KP_Left")))
155 else if ((!strcmp(ev->keyname, "Right")) ||
156 (!strcmp(ev->keyname, "KP_Right")))
158 else if ((!strcmp(ev->keyname, "Up")) ||
159 (!strcmp(ev->keyname, "KP_Up")))
161 else if ((!strcmp(ev->keyname, "Down")) ||
162 (!strcmp(ev->keyname, "KP_Down")))
165 if (elm_widget_focus_list_direction_get
166 (obj, current_focus, can_focus_list, list_data_get, degree,
177 evas_object_geometry_get(new_focus, &f_x, &f_y, &f_w, &f_h);
178 l_x = f_x - c_x - step_x;
179 l_y = f_y - c_y - step_y;
180 l_w = f_w + (step_x * 2);
181 l_h = f_h + (step_y * 2);
183 if (ELM_RECTS_INTERSECT(x, y, v_w, v_h, l_x, l_y, l_w, l_h))
185 elm_widget_focus_steal(new_focus);
186 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
192 if ((!strcmp(ev->keyname, "Left")) ||
193 ((!strcmp(ev->keyname, "KP_Left")) && (!ev->string)))
195 if (x <= 0) return EINA_FALSE;
198 else if ((!strcmp(ev->keyname, "Right")) ||
199 ((!strcmp(ev->keyname, "KP_Right")) && (!ev->string)))
201 if (x >= (max_x - v_w)) return EINA_FALSE;
204 else if ((!strcmp(ev->keyname, "Up")) ||
205 ((!strcmp(ev->keyname, "KP_Up")) && (!ev->string)))
207 if (y == 0) return EINA_FALSE;
210 else if ((!strcmp(ev->keyname, "Down")) ||
211 ((!strcmp(ev->keyname, "KP_Down")) && (!ev->string)))
213 if (y >= (max_y - v_h)) return EINA_FALSE;
216 else if ((!strcmp(ev->keyname, "Home")) ||
217 ((!strcmp(ev->keyname, "KP_Home")) && (!ev->string)))
221 else if ((!strcmp(ev->keyname, "End")) ||
222 ((!strcmp(ev->keyname, "KP_End")) && (!ev->string)))
226 else if ((!strcmp(ev->keyname, "Prior")) ||
227 ((!strcmp(ev->keyname, "KP_Prior")) && (!ev->string)))
230 y -= -(page_y * v_h) / 100;
234 else if ((!strcmp(ev->keyname, "Next")) ||
235 ((!strcmp(ev->keyname, "KP_Next")) && (!ev->string)))
238 y += -(page_y * v_h) / 100;
242 else return EINA_FALSE;
244 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
245 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
251 _elm_scroller_smart_activate(Evas_Object *obj, Elm_Activate act)
257 Evas_Coord page_x = 0;
258 Evas_Coord page_y = 0;
260 ELM_SCROLLER_DATA_GET(obj, sd);
262 if ((elm_widget_disabled_get(obj)) ||
263 (act == ELM_ACTIVATE_DEFAULT)) return EINA_FALSE;
265 sd->s_iface->content_pos_get(obj, &x, &y);
266 sd->s_iface->page_size_get(obj, &page_x, &page_y);
267 sd->s_iface->content_viewport_size_get(obj, &v_w, &v_h);
269 if (act == ELM_ACTIVATE_UP)
272 y -= -(page_y * v_h) / 100;
276 else if (act == ELM_ACTIVATE_DOWN)
279 y += -(page_y * v_h) / 100;
283 else if (act == ELM_ACTIVATE_LEFT)
286 x -= -(page_x * v_w) / 100;
290 else if (act == ELM_ACTIVATE_RIGHT)
293 x += -(page_x * v_w) / 100;
298 sd->s_iface->content_pos_set(obj, x, y, EINA_TRUE);
303 _elm_scroller_smart_sizing_eval(Evas_Object *obj)
305 Evas_Coord vw = 0, vh = 0, minw = 0, minh = 0, maxw = 0, maxh = 0, w, h,
307 double xw = 0.0, yw = 0.0;
309 ELM_SCROLLER_DATA_GET(obj, sd);
311 /* parent class' early call */
312 if (!sd->s_iface) return;
316 evas_object_size_hint_min_get(sd->content, &minw, &minh);
317 evas_object_size_hint_max_get(sd->content, &maxw, &maxh);
318 evas_object_size_hint_weight_get(sd->content, &xw, &yw);
321 sd->s_iface->content_viewport_size_get(obj, &vw, &vh);
324 if ((minw > 0) && (vw < minw))
326 else if ((maxw > 0) && (vw > maxw))
334 if ((minh > 0) && (vh < minh))
336 else if ((maxh > 0) && (vh > maxh))
342 if (sd->content) evas_object_resize(sd->content, vw, vh);
346 edje_object_size_min_calc(ELM_WIDGET_DATA(sd)->resize_obj, &vmw, &vmh);
348 if (sd->min_w) w = vmw + minw;
349 if (sd->min_h) h = vmh + minh;
351 evas_object_size_hint_max_get(obj, &maxw, &maxh);
352 if ((maxw > 0) && (w > maxw)) w = maxw;
353 if ((maxh > 0) && (h > maxh)) h = maxh;
355 evas_object_size_hint_min_set(obj, w, h);
359 _mirrored_set(Evas_Object *obj,
362 ELM_SCROLLER_DATA_GET(obj, sd);
364 sd->s_iface->mirrored_set(obj, mirrored);
368 _elm_scroller_smart_theme(Evas_Object *obj)
370 if (!ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->theme(obj))
373 _mirrored_set(obj, elm_widget_mirrored_get(obj));
375 elm_layout_sizing_eval(obj);
381 _elm_scroller_smart_focus_next(const Evas_Object *obj,
382 Elm_Focus_Direction dir,
387 ELM_SCROLLER_DATA_GET(obj, sd);
389 if (!sd->content) return EINA_FALSE;
394 if (_elm_config->access_mode)
396 if ((elm_widget_can_focus_get(cur)) ||
397 (elm_widget_child_can_focus_get(cur)))
398 return elm_widget_focus_next_get(cur, dir, next);
403 /* Try focus cycle in subitem */
404 if (elm_widget_focus_get(obj))
406 if ((elm_widget_can_focus_get(cur)) ||
407 (elm_widget_child_can_focus_get(cur)))
408 return elm_widget_focus_next_get(cur, dir, next);
412 *next = (Evas_Object *)obj;
414 return !elm_widget_focus_get(obj);
418 _show_region_hook(void *data,
419 Evas_Object *content_obj)
421 Evas_Coord x, y, w, h;
423 ELM_SCROLLER_DATA_GET(data, sd);
425 elm_widget_show_region_get(content_obj, &x, &y, &w, &h);
426 sd->s_iface->content_region_show(data, x, y, w, h);
430 _changed_size_hints_cb(void *data,
432 Evas_Object *obj __UNUSED__,
433 void *event_info __UNUSED__)
435 elm_layout_sizing_eval(data);
439 _elm_scroller_smart_sub_object_del(Evas_Object *obj,
442 ELM_SCROLLER_DATA_GET(obj, sd);
444 if (!ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->sub_object_del(obj, sobj))
447 if (sobj == sd->content)
449 elm_widget_on_show_region_hook_set(sd->content, NULL, NULL);
458 _resize_cb(void *data,
460 Evas_Object *obj __UNUSED__,
461 void *event_info __UNUSED__)
463 elm_layout_sizing_eval(data);
467 _edge_left_cb(Evas_Object *obj,
468 void *data __UNUSED__)
470 evas_object_smart_callback_call(obj, SIG_EDGE_LEFT, NULL);
474 _edge_right_cb(Evas_Object *obj,
475 void *data __UNUSED__)
477 evas_object_smart_callback_call(obj, SIG_EDGE_RIGHT, NULL);
481 _edge_top_cb(Evas_Object *obj,
482 void *data __UNUSED__)
484 evas_object_smart_callback_call(obj, SIG_EDGE_TOP, NULL);
488 _edge_bottom_cb(Evas_Object *obj,
489 void *data __UNUSED__)
491 evas_object_smart_callback_call(obj, SIG_EDGE_BOTTOM, NULL);
495 _vbar_drag_cb(Evas_Object *obj,
496 void *data __UNUSED__)
498 evas_object_smart_callback_call(obj, SIG_VBAR_DRAG, NULL);
502 _vbar_press_cb(Evas_Object *obj,
503 void *data __UNUSED__)
505 evas_object_smart_callback_call(obj, SIG_VBAR_PRESS, NULL);
509 _vbar_unpress_cb(Evas_Object *obj,
510 void *data __UNUSED__)
512 evas_object_smart_callback_call(obj, SIG_VBAR_UNPRESS, NULL);
516 _hbar_drag_cb(Evas_Object *obj,
517 void *data __UNUSED__)
519 evas_object_smart_callback_call(obj, SIG_HBAR_DRAG, NULL);
523 _hbar_press_cb(Evas_Object *obj,
524 void *data __UNUSED__)
526 evas_object_smart_callback_call(obj, SIG_HBAR_PRESS, NULL);
530 _hbar_unpress_cb(Evas_Object *obj,
531 void *data __UNUSED__)
533 evas_object_smart_callback_call(obj, SIG_HBAR_UNPRESS, NULL);
537 _scroll_cb(Evas_Object *obj,
538 void *data __UNUSED__)
540 evas_object_smart_callback_call(obj, SIG_SCROLL, NULL);
544 _scroll_anim_start_cb(Evas_Object *obj,
545 void *data __UNUSED__)
547 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_START, NULL);
551 _scroll_anim_stop_cb(Evas_Object *obj,
552 void *data __UNUSED__)
554 evas_object_smart_callback_call(obj, SIG_SCROLL_ANIM_STOP, NULL);
558 _scroll_drag_start_cb(Evas_Object *obj,
559 void *data __UNUSED__)
561 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_START, NULL);
565 _scroll_drag_stop_cb(Evas_Object *obj,
566 void *data __UNUSED__)
568 evas_object_smart_callback_call(obj, SIG_SCROLL_DRAG_STOP, NULL);
572 _elm_scroller_smart_content_set(Evas_Object *obj,
574 Evas_Object *content)
576 ELM_SCROLLER_DATA_GET(obj, sd);
578 if (part && strcmp(part, "default"))
579 return ELM_CONTAINER_CLASS
580 (_elm_scroller_parent_sc)->content_set(obj, part, content);
582 if (sd->content == content) return EINA_TRUE;
584 if (sd->content) evas_object_del(sd->content);
585 sd->content = content;
589 elm_widget_on_show_region_hook_set(content, _show_region_hook, obj);
590 elm_widget_sub_object_add(obj, content);
592 sd->s_iface->content_set(obj, content);
595 elm_layout_sizing_eval(obj);
601 _elm_scroller_smart_content_get(const Evas_Object *obj,
604 ELM_SCROLLER_DATA_GET(obj, sd);
606 if (part && strcmp(part, "default"))
607 return ELM_CONTAINER_CLASS
608 (_elm_scroller_parent_sc)->content_get(obj, part);
614 _elm_scroller_smart_content_unset(Evas_Object *obj,
617 Evas_Object *content;
619 ELM_SCROLLER_DATA_GET(obj, sd);
621 if (part && strcmp(part, "default"))
622 return ELM_CONTAINER_CLASS
623 (_elm_scroller_parent_sc)->content_unset(obj, part);
625 if (!sd->content) return NULL;
627 content = sd->content;
628 elm_widget_sub_object_del(obj, sd->content);
629 sd->s_iface->content_set(obj, NULL);
636 _elm_scroller_content_min_limit_cb(Evas_Object *obj,
640 ELM_SCROLLER_DATA_GET(obj, sd);
645 elm_layout_sizing_eval(obj);
649 _elm_scroller_smart_add(Evas_Object *obj)
651 Evas_Coord minw, minh;
653 EVAS_SMART_DATA_ALLOC(obj, Elm_Scroller_Smart_Data);
655 ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->base.add(obj);
657 elm_widget_can_focus_set(obj, EINA_TRUE);
659 elm_layout_theme_set(obj, "scroller", "base", elm_widget_style_get(obj));
661 priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
662 evas_object_smart_member_add(priv->hit_rect, obj);
663 elm_widget_sub_object_add(obj, priv->hit_rect);
665 evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
666 evas_object_show(priv->hit_rect);
667 evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
669 priv->s_iface = evas_object_smart_interface_get
670 (obj, ELM_SCROLLABLE_IFACE_NAME);
672 priv->s_iface->objects_set
673 (obj, ELM_WIDGET_DATA(priv)->resize_obj, priv->hit_rect);
675 evas_object_event_callback_add
676 (obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _changed_size_hints_cb, obj);
678 edje_object_size_min_calc(ELM_WIDGET_DATA(priv)->resize_obj, &minw, &minh);
679 evas_object_size_hint_min_set(obj, minw, minh);
680 evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, obj);
682 priv->s_iface->edge_left_cb_set(obj, _edge_left_cb);
683 priv->s_iface->edge_right_cb_set(obj, _edge_right_cb);
684 priv->s_iface->edge_top_cb_set(obj, _edge_top_cb);
685 priv->s_iface->edge_bottom_cb_set(obj, _edge_bottom_cb);
686 priv->s_iface->vbar_drag_cb_set(obj, _vbar_drag_cb);
687 priv->s_iface->vbar_press_cb_set(obj, _vbar_press_cb);
688 priv->s_iface->vbar_unpress_cb_set(obj, _vbar_unpress_cb);
689 priv->s_iface->hbar_drag_cb_set(obj, _hbar_drag_cb);
690 priv->s_iface->hbar_press_cb_set(obj, _hbar_press_cb);
691 priv->s_iface->hbar_unpress_cb_set(obj, _hbar_unpress_cb);
692 priv->s_iface->scroll_cb_set(obj, _scroll_cb);
693 priv->s_iface->animate_start_cb_set(obj, _scroll_anim_start_cb);
694 priv->s_iface->animate_stop_cb_set(obj, _scroll_anim_stop_cb);
695 priv->s_iface->drag_start_cb_set(obj, _scroll_drag_start_cb);
696 priv->s_iface->drag_stop_cb_set(obj, _scroll_drag_stop_cb);
698 priv->s_iface->content_min_limit_cb_set
699 (obj, _elm_scroller_content_min_limit_cb);
703 _elm_scroller_smart_move(Evas_Object *obj,
707 ELM_SCROLLER_DATA_GET(obj, sd);
709 ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->base.move(obj, x, y);
711 evas_object_move(sd->hit_rect, x, y);
715 _elm_scroller_smart_resize(Evas_Object *obj,
719 ELM_SCROLLER_DATA_GET(obj, sd);
721 ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->base.resize(obj, w, h);
723 evas_object_resize(sd->hit_rect, w, h);
727 _elm_scroller_smart_member_add(Evas_Object *obj,
730 ELM_SCROLLER_DATA_GET(obj, sd);
732 ELM_WIDGET_CLASS(_elm_scroller_parent_sc)->base.member_add(obj, member);
735 evas_object_raise(sd->hit_rect);
739 _elm_scroller_smart_set_user(Elm_Scroller_Smart_Class *sc)
741 ELM_WIDGET_CLASS(sc)->base.add = _elm_scroller_smart_add;
742 ELM_WIDGET_CLASS(sc)->base.move = _elm_scroller_smart_move;
743 ELM_WIDGET_CLASS(sc)->base.resize = _elm_scroller_smart_resize;
744 ELM_WIDGET_CLASS(sc)->base.member_add = _elm_scroller_smart_member_add;
746 ELM_WIDGET_CLASS(sc)->sub_object_del = _elm_scroller_smart_sub_object_del;
747 ELM_WIDGET_CLASS(sc)->theme = _elm_scroller_smart_theme;
748 ELM_WIDGET_CLASS(sc)->focus_next = _elm_scroller_smart_focus_next;
749 ELM_WIDGET_CLASS(sc)->event = _elm_scroller_smart_event;
750 ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
751 ELM_WIDGET_CLASS(sc)->activate = _elm_scroller_smart_activate;
753 ELM_CONTAINER_CLASS(sc)->content_set = _elm_scroller_smart_content_set;
754 ELM_CONTAINER_CLASS(sc)->content_get = _elm_scroller_smart_content_get;
755 ELM_CONTAINER_CLASS(sc)->content_unset = _elm_scroller_smart_content_unset;
757 ELM_LAYOUT_CLASS(sc)->sizing_eval = _elm_scroller_smart_sizing_eval;
760 EAPI const Elm_Scroller_Smart_Class *
761 elm_scroller_smart_class_get(void)
763 static Elm_Scroller_Smart_Class _sc =
764 ELM_SCROLLER_SMART_CLASS_INIT_NAME_VERSION(ELM_SCROLLER_SMART_NAME);
765 static const Elm_Scroller_Smart_Class *class = NULL;
766 Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
771 _elm_scroller_smart_set(&_sc);
772 esc->callbacks = _smart_callbacks;
779 elm_scroller_add(Evas_Object *parent)
784 EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
786 e = evas_object_evas_get(parent);
789 obj = evas_object_smart_add(e, _elm_scroller_smart_class_new());
791 if (!elm_widget_sub_object_add(parent, obj))
792 ERR("could not add %p as sub object of %p", obj, parent);
799 elm_scroller_custom_widget_base_theme_set(Evas_Object *obj,
803 ELM_SCROLLER_CHECK(obj);
804 ELM_SCROLLER_DATA_GET(obj, sd);
806 EINA_SAFETY_ON_NULL_RETURN(klass);
807 EINA_SAFETY_ON_NULL_RETURN(group);
809 if (eina_stringshare_replace(&(ELM_LAYOUT_DATA(sd)->klass), klass) ||
810 eina_stringshare_replace(&(ELM_LAYOUT_DATA(sd)->group), group))
811 _elm_scroller_smart_theme(obj);
815 elm_scroller_content_min_limit(Evas_Object *obj,
819 ELM_SCROLLABLE_CHECK(obj);
821 s_iface->content_min_limit(obj, w, h);
825 elm_scroller_region_show(Evas_Object *obj,
831 ELM_SCROLLABLE_CHECK(obj);
833 s_iface->content_region_show(obj, x, y, w, h);
837 elm_scroller_policy_set(Evas_Object *obj,
838 Elm_Scroller_Policy policy_h,
839 Elm_Scroller_Policy policy_v)
841 ELM_SCROLLABLE_CHECK(obj);
843 if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
844 (policy_v >= ELM_SCROLLER_POLICY_LAST))
847 s_iface->policy_set(obj, policy_h, policy_v);
851 elm_scroller_policy_get(const Evas_Object *obj,
852 Elm_Scroller_Policy *policy_h,
853 Elm_Scroller_Policy *policy_v)
855 ELM_SCROLLABLE_CHECK(obj);
857 s_iface->policy_get(obj, policy_h, policy_v);
861 elm_scroller_region_get(const Evas_Object *obj,
867 ELM_SCROLLABLE_CHECK(obj);
869 if ((x) || (y)) s_iface->content_pos_get(obj, x, y);
870 if ((w) || (h)) s_iface->content_viewport_size_get(obj, w, h);
874 elm_scroller_child_size_get(const Evas_Object *obj,
878 ELM_SCROLLABLE_CHECK(obj);
880 s_iface->content_size_get(obj, w, h);
884 elm_scroller_bounce_set(Evas_Object *obj,
888 ELM_SCROLLABLE_CHECK(obj);
890 s_iface->bounce_allow_set(obj, h_bounce, v_bounce);
894 elm_scroller_bounce_get(const Evas_Object *obj,
898 ELM_SCROLLABLE_CHECK(obj);
900 s_iface->bounce_allow_get(obj, h_bounce, v_bounce);
904 elm_scroller_page_relative_set(Evas_Object *obj,
908 Evas_Coord pagesize_h, pagesize_v;
910 ELM_SCROLLABLE_CHECK(obj);
912 s_iface->paging_get(obj, NULL, NULL, &pagesize_h, &pagesize_v);
915 (obj, h_pagerel, v_pagerel, pagesize_h, pagesize_v);
919 elm_scroller_page_relative_get(const Evas_Object *obj,
923 ELM_SCROLLABLE_CHECK(obj);
925 s_iface->paging_get(obj, h_pagerel, v_pagerel, NULL, NULL);
929 elm_scroller_page_size_set(Evas_Object *obj,
930 Evas_Coord h_pagesize,
931 Evas_Coord v_pagesize)
933 double pagerel_h, pagerel_v;
935 ELM_SCROLLABLE_CHECK(obj);
937 s_iface->paging_get(obj, &pagerel_h, &pagerel_v, NULL, NULL);
940 (obj, pagerel_h, pagerel_v, h_pagesize, v_pagesize);
944 elm_scroller_page_size_get(const Evas_Object *obj,
945 Evas_Coord *h_pagesize,
946 Evas_Coord *v_pagesize)
948 ELM_SCROLLABLE_CHECK(obj);
950 s_iface->paging_get(obj, NULL, NULL, h_pagesize, v_pagesize);
954 elm_scroller_current_page_get(const Evas_Object *obj,
958 ELM_SCROLLABLE_CHECK(obj);
960 s_iface->current_page_get(obj, h_pagenumber, v_pagenumber);
964 elm_scroller_last_page_get(const Evas_Object *obj,
968 ELM_SCROLLABLE_CHECK(obj);
970 s_iface->last_page_get(obj, h_pagenumber, v_pagenumber);
974 elm_scroller_page_show(Evas_Object *obj,
978 ELM_SCROLLABLE_CHECK(obj);
980 s_iface->page_show(obj, h_pagenumber, v_pagenumber);
984 elm_scroller_page_bring_in(Evas_Object *obj,
988 ELM_SCROLLABLE_CHECK(obj);
990 s_iface->page_bring_in(obj, h_pagenumber, v_pagenumber);
994 elm_scroller_region_bring_in(Evas_Object *obj,
1000 ELM_SCROLLABLE_CHECK(obj);
1002 s_iface->region_bring_in(obj, x, y, w, h);
1006 elm_scroller_gravity_set(Evas_Object *obj,
1010 ELM_SCROLLABLE_CHECK(obj);
1012 s_iface->gravity_set(obj, x, y);
1016 elm_scroller_gravity_get(const Evas_Object *obj,
1020 ELM_SCROLLABLE_CHECK(obj);
1022 s_iface->gravity_get(obj, x, y);
1026 elm_scroller_propagate_events_set(Evas_Object *obj,
1027 Eina_Bool propagation)
1029 Elm_Widget_Smart_Data *sd;
1031 ELM_SCROLLABLE_CHECK(obj);
1033 sd = evas_object_smart_data_get(obj);
1034 if (!sd) return; /* just being paranoid */
1036 evas_object_propagate_events_set(sd->resize_obj, propagation);
1040 elm_scroller_propagate_events_get(const Evas_Object *obj)
1042 Elm_Widget_Smart_Data *sd;
1044 ELM_SCROLLABLE_CHECK(obj, EINA_FALSE);
1046 sd = evas_object_smart_data_get(obj);
1047 if (!sd) return EINA_FALSE; /* just being paranoid */
1049 return evas_object_propagate_events_get(sd->resize_obj);