Implemented ZoomUI service
[profile/tv/apps/web/browser.git] / services / ZoomUI / ZoomUI.cpp
1 /*
2  * Copyright (c) 2015 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17
18 #include <Elementary.h>
19 #include <boost/concept_check.hpp>
20 #include <vector>
21 #include <AbstractMainWindow.h>
22
23 #include "ZoomUI.h"
24 #include "BrowserLogger.h"
25 #include "ServiceManager.h"
26
27 #define DX 50
28 #define iDX -50
29
30 namespace tizen_browser{
31 namespace base_ui{
32
33 EXPORT_SERVICE(ZoomUI, "org.tizen.browser.zoomui")
34
35 ZoomUI::ZoomUI()
36     : m_layout(nullptr)
37     , m_nav_layout(nullptr)
38     , m_zoom_slider(nullptr)
39     , m_current_translation_x(0)
40     , m_current_translation_y(0)
41 {
42     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
43     m_edjFilePath = EDJE_DIR;
44     m_edjFilePath.append("ZoomUI/ZoomUI.edj");
45     elm_theme_extension_add(nullptr, m_edjFilePath.c_str());
46 }
47
48 ZoomUI::~ZoomUI() {}
49
50 void ZoomUI::init(Evas_Object* parent)
51 {
52     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
53     M_ASSERT(parent);
54     m_parent = parent;
55 }
56
57 Evas_Object* ZoomUI::getContent()
58 {
59     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
60     M_ASSERT(m_parent);
61     if(!m_layout)
62         createLayout(m_parent);
63     return m_layout;
64 }
65
66 void ZoomUI::showUI()
67 {
68     evas_object_show(m_layout);
69     evas_object_show(m_nav_layout);
70     evas_object_show(m_zoom_slider);
71 }
72
73 void ZoomUI::hideUI()
74 {
75     evas_object_hide(m_zoom_slider);
76     evas_object_hide(m_nav_layout);
77     evas_object_hide(m_layout);
78 }
79
80 void ZoomUI::show(Evas_Object* parent)
81 {
82     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
83     init(parent);
84     createLayout(parent);
85     showUI();
86 }
87
88 void ZoomUI::createLayout(Evas_Object *parent)
89 {
90     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
91
92     m_layout = elm_layout_add(parent);
93     elm_layout_file_set(m_layout, m_edjFilePath.c_str(), "zoom-layout");
94     evas_object_size_hint_weight_set(m_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
95     evas_object_size_hint_align_set(m_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
96
97     createZoomSlider();
98     createNavigationButtons();
99 }
100
101 void ZoomUI::createZoomSlider()
102 {
103     m_zoom_slider = elm_slider_add(m_layout);
104     evas_object_size_hint_weight_set(m_zoom_slider, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
105     evas_object_size_hint_align_set(m_zoom_slider, EVAS_HINT_FILL, EVAS_HINT_FILL);
106     evas_object_smart_callback_add(m_zoom_slider, "changed", _zoom_slider_changed, this);
107     elm_object_style_set(m_zoom_slider, "default");
108     elm_slider_horizontal_set(m_zoom_slider, EINA_TRUE);
109     elm_slider_min_max_set(m_zoom_slider, 1, 6);
110     elm_slider_step_set(m_zoom_slider, 1);
111     elm_slider_value_set(m_zoom_slider, 3);
112     elm_slider_indicator_format_set(m_zoom_slider, "%1.0f");
113
114     elm_object_part_content_set(m_layout, "slider_swallow", m_zoom_slider);
115 }
116
117 void ZoomUI::createNavigationButtons()
118 {
119     m_nav_layout = elm_layout_add(m_layout);
120     elm_layout_file_set(m_nav_layout, m_edjFilePath.c_str(), "nav-layout");
121     evas_object_size_hint_weight_set(m_nav_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
122     evas_object_size_hint_align_set(m_nav_layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
123     elm_object_part_content_set(m_layout, "nav_buttons", m_nav_layout);
124
125     Evas_Object* icon = elm_icon_add(m_nav_layout);
126     setImageFile(icon, LEFT, false);
127     evas_object_smart_callback_add(icon, "clicked", _left_button_clicked, this);
128     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_left_button, this);
129     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_left_button, this);
130     elm_object_part_content_set(m_nav_layout, "left_button", icon);
131     
132     icon = elm_icon_add(m_nav_layout);
133     setImageFile(icon, RIGHT, false);
134     evas_object_smart_callback_add(icon, "clicked", _right_button_clicked, this);
135     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_right_button, this);
136     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_right_button, this);
137     elm_object_part_content_set(m_nav_layout, "right_button", icon);
138
139     icon = elm_icon_add(m_nav_layout);
140     setImageFile(icon, DOWN, false);
141     evas_object_smart_callback_add(icon, "clicked", _down_button_clicked, this);
142     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_down_button, this);
143     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_down_button, this);
144     elm_object_part_content_set(m_nav_layout, "down_button", icon);
145
146     icon = elm_icon_add(m_nav_layout);
147     setImageFile(icon, UP, false);
148     evas_object_smart_callback_add(icon, "clicked", _up_button_clicked, this);
149     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_IN, _cb_focus_in_up_button, this);
150     evas_object_event_callback_add(icon, EVAS_CALLBACK_MOUSE_OUT, _cb_focus_out_up_button, this);
151     elm_object_part_content_set(m_nav_layout, "up_button", icon);
152 }
153
154 void ZoomUI::clearItems()
155 {
156     evas_object_del(m_layout);
157     setZoom(ZOOM_DEFAULT);
158 }
159
160 void ZoomUI::setImageFile(Evas_Object* obj, int direction, bool focused)
161 {
162     switch (direction) {
163         case LEFT:  elm_image_file_set(obj, m_edjFilePath.c_str(), focused ? "ic_zoom_indicator_left_foc.png" : "ic_zoom_indicator_left_nor.png");
164                     break;
165         case RIGHT: elm_image_file_set(obj, m_edjFilePath.c_str(), focused ? "ic_zoom_indicator_right_foc.png" : "ic_zoom_indicator_right_nor.png");
166                     break;
167         case DOWN:  elm_image_file_set(obj, m_edjFilePath.c_str(), focused ? "ic_zoom_indicator_down_foc.png" : "ic_zoom_indicator_down_nor.png");
168                     break;
169         case UP:    elm_image_file_set(obj, m_edjFilePath.c_str(), focused ? "ic_zoom_indicator_up_foc.png" : "ic_zoom_indicator_up_nor.png");
170                     break;
171         default:    BROWSER_LOGD("[%s:%d] Warning: Unhandled button", __PRETTY_FUNCTION__, __LINE__);
172                     break;
173     }
174 }
175
176 void ZoomUI::_zoom_slider_changed(void *data, Evas_Object *obj, void *event_info)
177 {
178     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
179     if(data && obj) {
180         int val = elm_slider_value_get(obj);
181         int zoomLevel = ZOOM_DEFAULT;    
182         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
183
184         switch (val) {
185             case 1: zoomLevel = ZOOM_50;
186                     break;
187             case 2: zoomLevel = ZOOM_75;
188                     break;
189             case 3: zoomLevel = ZOOM_DEFAULT;
190                     break;
191             case 4: zoomLevel = ZOOM_150;
192                     break;
193             case 5: zoomLevel = ZOOM_200;
194                     break;
195             case 6: zoomLevel = ZOOM_300;
196                     break;
197             default:BROWSER_LOGD("[%s:%d] Warning: Unhandled zoom level", __PRETTY_FUNCTION__, __LINE__);
198                     break;
199         }
200         zoomUI->setZoom(zoomLevel);
201     }
202 }
203
204 void ZoomUI::_left_button_clicked(void * data, Evas_Object * obj, void * event_info)
205 {
206     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
207     if (data && obj) {
208         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
209         zoomUI->scrollView(iDX, 0);
210     }
211 }
212
213 void ZoomUI::_right_button_clicked(void * data, Evas_Object * obj, void * event_info)
214 {
215     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
216     if (data && obj) {
217         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
218         zoomUI->scrollView(DX, 0);
219     }
220 }
221
222 void ZoomUI::_up_button_clicked(void * data, Evas_Object * obj, void * event_info)
223 {
224     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
225     if (data && obj) {
226         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
227         zoomUI->scrollView(0, iDX);
228     }
229 }
230
231 void ZoomUI::_down_button_clicked(void * data, Evas_Object * obj, void * event_info)
232 {
233     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
234     if (data && obj) {
235         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
236         zoomUI->scrollView(0, DX);
237     }
238 }
239
240 void ZoomUI::_cb_focus_in_left_button(void * data, Evas *, Evas_Object *obj, void *)
241 {
242     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
243     if (data && obj) {
244         elm_object_focus_set(obj, EINA_TRUE);
245         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
246         zoomUI->setImageFile(obj, LEFT, true);
247     }
248 }
249
250 void ZoomUI::_cb_focus_out_left_button(void * data, Evas *, Evas_Object *obj, void *)
251 {
252     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
253     if (data && obj) {
254         elm_object_focus_set(obj, EINA_FALSE);
255         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
256         zoomUI->setImageFile(obj, LEFT, false);
257     }
258 }
259
260 void ZoomUI::_cb_focus_in_right_button(void * data, Evas *, Evas_Object *obj, void *)
261 {
262     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
263     if (data && obj) {
264         elm_object_focus_set(obj, EINA_TRUE);
265         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
266         zoomUI->setImageFile(obj, RIGHT, true);
267     }
268 }
269
270 void ZoomUI::_cb_focus_out_right_button(void * data, Evas *, Evas_Object *obj, void *)
271 {
272     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
273     if (data && obj) {
274         elm_object_focus_set(obj, EINA_FALSE);
275         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
276         zoomUI->setImageFile(obj, RIGHT, false);
277     }
278 }
279
280 void ZoomUI::_cb_focus_in_up_button(void * data, Evas *, Evas_Object *obj, void *)
281 {
282     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
283     if (data && obj) {
284         elm_object_focus_set(obj, EINA_TRUE);
285         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
286         zoomUI->setImageFile(obj, UP, true);
287     }
288 }
289
290 void ZoomUI::_cb_focus_out_up_button(void * data, Evas *, Evas_Object *obj, void *)
291 {
292     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
293     if (data && obj) {
294         elm_object_focus_set(obj, EINA_FALSE);
295         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
296         zoomUI->setImageFile(obj, UP, false);
297     }
298 }
299
300 void ZoomUI::_cb_focus_in_down_button(void * data, Evas *, Evas_Object *obj, void *)
301 {
302     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
303     if (data && obj) {
304         elm_object_focus_set(obj, EINA_TRUE);
305         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
306         zoomUI->setImageFile(obj, DOWN, true);
307     }
308 }
309
310 void ZoomUI::_cb_focus_out_down_button(void * data, Evas *, Evas_Object *obj, void *)
311 {
312     BROWSER_LOGD("[%s:%d] ", __PRETTY_FUNCTION__, __LINE__);
313     if (data && obj) {
314         elm_object_focus_set(obj, EINA_FALSE);
315         ZoomUI *zoomUI = static_cast<ZoomUI*>(data);
316         zoomUI->setImageFile(obj, DOWN, false);
317     }
318 }
319
320
321 }
322 }