create rotation job and EAPI e_border_rotation_set
[platform/core/uifw/e17.git] / src / bin / e_gadcon_popup.c
1 #include "e.h"
2
3 /* local subsystem functions */
4 static void _e_gadcon_popup_free(E_Gadcon_Popup *pop);
5 static void _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked);
6 static void _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj);
7 static void _e_gadcon_popup_position(E_Gadcon_Popup *pop);
8 static void _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
9
10 /* externally accessible functions */
11
12 EAPI E_Gadcon_Popup *
13 e_gadcon_popup_new(E_Gadcon_Client *gcc)
14 {
15    E_Gadcon_Popup *pop;
16    Evas_Object *o;
17    E_Zone *zone;
18
19    pop = E_OBJECT_ALLOC(E_Gadcon_Popup, E_GADCON_POPUP_TYPE, _e_gadcon_popup_free);
20    if (!pop) return NULL;
21    zone = e_gadcon_client_zone_get(gcc);
22    pop->win = e_popup_new(zone, 0, 0, 0, 0);
23    e_popup_layer_set(pop->win, 350);
24
25    o = edje_object_add(pop->win->evas);
26    e_theme_edje_object_set(o, "base/theme/gadman", "e/gadman/popup");
27    evas_object_show(o);
28    evas_object_move(o, 0, 0);
29    e_popup_edje_bg_object_set(pop->win, o);
30    pop->o_bg = o;
31
32    pop->gcc = gcc;
33    pop->gadcon_lock = 1;
34    pop->gadcon_was_locked = 0;
35
36    return pop;
37 }
38
39 EAPI void
40 e_gadcon_popup_content_set(E_Gadcon_Popup *pop, Evas_Object *o)
41 {
42    Evas_Object *old_o;
43
44    if (!pop) return;
45    E_OBJECT_CHECK(pop);
46    E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
47
48    old_o = edje_object_part_swallow_get(pop->o_bg, "e.swallow.content");
49    if (old_o != o)
50      {
51         if (old_o)
52           {
53              edje_object_part_unswallow(pop->o_bg, old_o);
54              evas_object_del(old_o);
55           }
56         edje_object_part_swallow(pop->o_bg, "e.swallow.content", o);
57         evas_object_event_callback_add(o, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
58                                        _e_gadcon_popup_changed_size_hints_cb, pop);
59      }
60
61    _e_gadcon_popup_size_recalc(pop, o);
62 }
63
64 EAPI void
65 e_gadcon_popup_show(E_Gadcon_Popup *pop)
66 {
67    if (!pop) return;
68    E_OBJECT_CHECK(pop);
69    E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
70
71    if (pop->win->visible) return;
72
73    e_popup_show(pop->win);
74
75    _e_gadcon_popup_position(pop);
76 }
77
78 EAPI void
79 e_gadcon_popup_hide(E_Gadcon_Popup *pop)
80 {
81    if (!pop) return;
82    E_OBJECT_CHECK(pop);
83    E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
84    if (pop->pinned) return;
85    e_popup_hide(pop->win);
86    if (pop->gadcon_was_locked)
87      _e_gadcon_popup_locked_set(pop, 0);
88 }
89
90 EAPI void
91 e_gadcon_popup_toggle_pinned(E_Gadcon_Popup *pop)
92 {
93    if (!pop) return;
94    E_OBJECT_CHECK(pop);
95    E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
96
97    if (pop->pinned)
98      {
99         pop->pinned = 0;
100         edje_object_signal_emit(pop->o_bg, "e,state,unpinned", "e");
101      }
102    else
103      {
104         pop->pinned = 1;
105         edje_object_signal_emit(pop->o_bg, "e,state,pinned", "e");
106      }
107 }
108
109 EAPI void
110 e_gadcon_popup_lock_set(E_Gadcon_Popup *pop, Eina_Bool setting)
111 {
112    if (!pop) return;
113    E_OBJECT_CHECK(pop);
114    E_OBJECT_TYPE_CHECK(pop, E_GADCON_POPUP_TYPE);
115
116    setting = !!setting;
117    if (pop->gadcon_lock == setting) return;
118    pop->gadcon_lock = setting;
119
120    if (setting != pop->gadcon_was_locked)
121      _e_gadcon_popup_locked_set(pop, setting);
122 }
123
124 /* local subsystem functions */
125
126 static void
127 _e_gadcon_popup_free(E_Gadcon_Popup *pop)
128 {
129    if (pop->gadcon_was_locked)
130      _e_gadcon_popup_locked_set(pop, 0);
131    pop->gcc = NULL;
132    e_object_del(E_OBJECT(pop->win));
133    free(pop);
134 }
135
136 static void
137 _e_gadcon_popup_locked_set(E_Gadcon_Popup *pop, Eina_Bool locked)
138 {
139    if (!pop->gcc)
140      return;
141
142    e_gadcon_locked_set(pop->gcc->gadcon, locked);
143    pop->gadcon_was_locked = locked;
144 }
145
146 static void
147 _e_gadcon_popup_size_recalc(E_Gadcon_Popup *pop, Evas_Object *obj)
148 {
149    Evas_Coord w = 0, h = 0;
150
151    e_widget_size_min_get(obj, &w, &h);
152    if ((!w) || (!h)) evas_object_size_hint_min_get(obj, &w, &h);
153    if ((!w) || (!h))
154      {
155         edje_object_size_min_get(obj, &w, &h);
156         edje_object_size_min_restricted_calc(obj, &w, &h, w, h);
157      }
158    edje_extern_object_min_size_set(obj, w, h);
159    edje_object_size_min_calc(pop->o_bg, &pop->w, &pop->h);
160    evas_object_resize(pop->o_bg, pop->w, pop->h);
161
162    if (pop->win->visible)
163      _e_gadcon_popup_position(pop);
164 }
165
166 static void
167 _e_gadcon_popup_position(E_Gadcon_Popup *pop)
168 {
169    Evas_Coord gx = 0, gy = 0, gw, gh, zw, zh, zx, zy, px, py;
170
171    /* Popup positioning */
172    e_gadcon_client_geometry_get(pop->gcc, &gx, &gy, &gw, &gh);
173    zx = pop->win->zone->x;
174    zy = pop->win->zone->y;
175    zw = pop->win->zone->w;
176    zh = pop->win->zone->h;
177    switch (pop->gcc->gadcon->orient)
178      {
179       case E_GADCON_ORIENT_CORNER_RT:
180       case E_GADCON_ORIENT_CORNER_RB:
181       case E_GADCON_ORIENT_RIGHT:
182         px = gx - pop->w;
183         py = gy;
184         if (py + pop->h >= (zy + zh))
185           py = gy + gh - pop->h;
186         break;
187
188       case E_GADCON_ORIENT_LEFT:
189       case E_GADCON_ORIENT_CORNER_LT:
190       case E_GADCON_ORIENT_CORNER_LB:
191         px = gx + gw;
192         py = gy;
193         if (py + pop->h >= (zy + zh))
194           py = gy + gh - pop->h;
195         break;
196
197       case E_GADCON_ORIENT_TOP:
198       case E_GADCON_ORIENT_CORNER_TL:
199       case E_GADCON_ORIENT_CORNER_TR:
200         py = gy + gh;
201         px = (gx + (gw / 2)) - (pop->w / 2);
202         if ((px + pop->w) >= (zx + zw))
203           px = gx + gw - pop->w;
204         else if (px < zx)
205           px = zx;
206         break;
207
208       case E_GADCON_ORIENT_BOTTOM:
209       case E_GADCON_ORIENT_CORNER_BL:
210       case E_GADCON_ORIENT_CORNER_BR:
211         py = gy - pop->h;
212         px = (gx + (gw / 2)) - (pop->w / 2);
213         if ((px + pop->w) >= (zx + zw))
214           px = gx + gw - pop->w;
215         else if (px < zx)
216           px = zx;
217         break;
218
219       case E_GADCON_ORIENT_FLOAT:
220         px = (gx + (gw / 2)) - (pop->w / 2);
221         if (gy >= (zy + (zh / 2)))
222           py = gy - pop->h;
223         else
224           py = gy + gh;
225         if ((px + pop->w) >= (zx + zw))
226           px = gx + gw - pop->w;
227         else if (px < zx)
228           px = zx;
229         break;
230
231       default:
232         e_popup_move_resize(pop->win, 50, 50, pop->w, pop->h);
233         return;
234      }
235    if (px - zx < 0)
236      px = zx;
237    if (py - zy < 0)
238      py = zy;
239    e_popup_move_resize(pop->win, px - zx, py - zy, pop->w, pop->h);
240
241    if (pop->gadcon_lock && (!pop->gadcon_was_locked))
242      _e_gadcon_popup_locked_set(pop, 1);
243 }
244
245 static void
246 _e_gadcon_popup_changed_size_hints_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
247 {
248    E_Gadcon_Popup *pop;
249
250    pop = data;
251    _e_gadcon_popup_size_recalc(pop, obj);
252 }
253