[Release] wrt_0.8.166 for tizen_2.1 branch
[platform/framework/web/wrt.git] / src / wrt-client / window_data.cpp
1 /*
2  * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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  * @file        window_data.cpp
18  * @author      Jaroslaw Osmanski (j.osmanski@samsung.com)
19  * @version     1.0
20  * @brief       Window data class implementation
21  */
22 #include "window_data.h"
23
24 #include <ui-gadget.h>
25 #include <dpl/log/log.h>
26
27 namespace {
28 char const* const PLATFORM_EDJ_PATH = "/usr/share/edje/wrt/Platform.edj";
29 char const* const DAEMON_EDJ_PATH = "/usr/share/edje/wrt/Daemon.edj";
30 char const* const THEME_EDJ_PATH = "/usr/share/edje/wrt/wrt_theme.edj";
31 char const* const ELM_STATE_SHOW_CONTENT = "elm,state,show,content";
32 char const* const ELM_SWALLOW_CONTENT = "elm.swallow.content";
33 char const* const ELM_SWALLOW_BACKWARD = "elm.swallow.backward";
34
35 const char *ELM_EVENT_PROFILE_CHANGED = "profile,changed";
36
37 char const* const ELM = "elm";
38 char const* const LAYOUT = "layout";
39 char const* const APPLICATION = "application";
40 char const* const INDICATOR = "indicator";
41 char const* const NOINDICATOR = "noindicator";
42 char const* const INTERNAL_LAYOUT = "internal_layout";
43 char const* const FLOATBACKWARD_BUTTON_STYLE = "wrt/backward";
44 const std::string DESKTOP_PROFILE("desktop");
45 } // anonymous namespace
46
47 WindowData::WindowData(unsigned long pid, bool manualInit) :
48     m_win(NULL),
49     m_naviBackButton(NULL),
50     m_initialized(false)
51 {
52     m_win = createWindow(pid);
53
54     if (!manualInit) {
55         init();
56     }
57 }
58
59 WindowData::~WindowData()
60 {
61     LogDebug("");
62     evas_object_del(m_win);
63 }
64
65 void WindowData::init()
66 {
67     Assert(m_win != NULL && "m_win is null");
68
69     if (m_initialized == true)
70     {
71         LogInfo("Already initilized");
72         return;
73     }
74
75     // import button theme
76     elm_theme_overlay_add(NULL, THEME_EDJ_PATH);
77
78     m_conformant = createConformant(m_win);
79     evas_object_show(m_conformant);
80     m_platform_layout = createPlatformLayout(m_conformant);
81     evas_object_show(m_platform_layout);
82     m_navigation = createNavigationBar(m_platform_layout);
83     evas_object_show(m_navigation);
84     m_user_layout = createUserLayout(m_navigation);
85     evas_object_show(m_user_layout);
86
87     m_initialized = true;
88 }
89
90 void WindowData::setEvasObjectForLayout(Evas_Object* evas_object)
91 {
92     elm_object_content_set(m_conformant, evas_object);
93 }
94
95 void WindowData::unsetEvasObjectForLayout()
96 {
97     elm_object_content_unset(m_conformant);
98 }
99
100 void WindowData::toggleIndicator(bool fullscreen)
101 {
102     LogDebug("fullscreen=" << (fullscreen ? "true" : "false"));
103
104     if (!fullscreen) {
105         elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
106     } else {
107         elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
108     }
109 }
110
111 void WindowData::setViewMode(
112     bool fullscreen,
113     bool backbutton)
114 {
115     LogDebug("setViewMode");
116     LogDebug("fullscreen: " << fullscreen);
117     LogDebug("backbutton: " << backbutton);
118
119     m_fullscreen = fullscreen;
120
121     toggleIndicator(m_fullscreen);
122
123     if (backbutton) {
124         createFloatBackButton();
125     }
126 }
127
128 void WindowData::createFloatBackButton()
129 {
130     // Add float backbutton on the left coner
131     m_floatBackButton = elm_button_add(m_user_layout);
132     elm_object_style_set(m_floatBackButton, FLOATBACKWARD_BUTTON_STYLE);
133     elm_object_part_content_set(m_user_layout,
134                                 ELM_SWALLOW_BACKWARD,
135                                 m_floatBackButton);
136     evas_object_show(m_floatBackButton);
137 }
138
139 Evas_Object* WindowData::createWindow(unsigned long pid)
140 {
141     ADD_PROFILING_POINT("elm_win_add", "start");
142     Evas_Object* window = elm_win_add(NULL, "wrt-widget", ELM_WIN_BASIC);
143     ADD_PROFILING_POINT("elm_win_add", "stop");
144     ecore_x_window_prop_property_set(
145         elm_win_xwindow_get(window),
146         ECORE_X_ATOM_NET_WM_PID,
147         ECORE_X_ATOM_CARDINAL, 32, &pid, 1);
148     elm_win_conformant_set(window, EINA_TRUE);
149     int w, h;
150     ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
151     evas_object_resize(window, w, h);
152
153     evas_object_smart_callback_add(window,
154                                    ELM_EVENT_PROFILE_CHANGED,
155                                    winProfileChangedCallback,
156                                    this);
157     return window;
158 }
159
160 Evas_Object* WindowData::createConformant(Evas_Object* parent)
161 {
162     Assert(parent != NULL && "Parent is null");
163     Evas_Object* conformant = elm_conformant_add(parent);
164
165     evas_object_size_hint_weight_set(
166         conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
167     evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
168     elm_win_resize_object_add(parent, conformant);
169     return conformant;
170 }
171
172 Evas_Object* WindowData::createPlatformLayout(Evas_Object* parent)
173 {
174     Evas_Object*  platform_layout = elm_layout_add(parent);
175
176     ADD_PROFILING_POINT("elm_layout_theme_set", "start");
177     elm_layout_file_set(platform_layout, PLATFORM_EDJ_PATH, "platformlayout");
178     ADD_PROFILING_POINT("elm_layout_theme_set", "stop");
179
180     evas_object_size_hint_align_set(platform_layout,
181                                     EVAS_HINT_FILL,
182                                     EVAS_HINT_FILL);
183     evas_object_size_hint_weight_set(platform_layout,
184                                      EVAS_HINT_EXPAND,
185                                      EVAS_HINT_EXPAND);
186
187     elm_object_content_set(parent, platform_layout);
188     edje_object_signal_emit(
189         elm_layout_edje_get(platform_layout), ELM_STATE_SHOW_CONTENT, ELM);
190     return platform_layout;
191 }
192
193 Evas_Object* WindowData::createNavigationBar(Evas_Object* parent)
194 {
195     Assert(parent != NULL && "Parent for naviframe is null");
196     Evas_Object* navigation = elm_naviframe_add(parent);
197
198     evas_object_size_hint_align_set(navigation,
199                                     EVAS_HINT_FILL,
200                                     EVAS_HINT_FILL);
201     evas_object_size_hint_weight_set(navigation,
202                                      EVAS_HINT_EXPAND,
203                                      EVAS_HINT_EXPAND);
204     elm_object_part_content_set(parent, ELM_SWALLOW_CONTENT, navigation);
205     //elm_object_content_set(parent, navigation);
206     return navigation;
207 }
208
209 Evas_Object* WindowData::createUserLayout(Evas_Object* parent)
210 {
211     Assert(parent != NULL && "Parent for User Layout is null");
212     Evas_Object* layout = elm_layout_add(parent);
213     elm_layout_file_set(layout, DAEMON_EDJ_PATH, "client");
214     evas_object_size_hint_weight_set(
215         layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
216     evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
217
218     ADD_PROFILING_POINT("elm_naviframe_item_push", "start");
219     Elm_Object_Item* naviIt = elm_naviframe_item_push(
220             /* Evas_Object *obj */
221             parent,
222             /* const char *title_label  */
223             "",
224             /* Evas_Object *prev_btn */
225             NULL,
226             /* Evas_Object *next_btn */
227             NULL,
228             /* Evas_Object *content */
229             layout,
230             /* const char *item_style */
231             NULL);
232     ADD_PROFILING_POINT("elm_naviframe_item_push", "stop");
233
234     elm_naviframe_item_title_visible_set(naviIt, EINA_FALSE);
235
236     return layout;
237 }
238
239 void WindowData::setDesktopIcon()
240 {
241     // set window icon
242     Evas_Object *icon = evas_object_image_add(evas_object_evas_get(m_win));
243     evas_object_image_file_set(icon,
244                                "/opt/share/icons/default/small/tizenScmgz.png",
245                                NULL);
246     elm_win_icon_object_set(m_win, icon);
247 }
248
249 void WindowData::addNaviBackButtonCallback(
250     const char* event,
251     CallbackType callback,
252     const void* data)
253 {
254     Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
255     evas_object_smart_callback_add(m_naviBackButton, event, callback, data);
256 }
257
258 void* WindowData::delNaviBackButtonCallback(
259     const char* event,
260     CallbackType callBack)
261 {
262     Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
263     return evas_object_smart_callback_del(m_naviBackButton, event, callBack);
264 }
265
266 void WindowData::addFloatBackButtonCallback(
267     const char* event,
268     CallbackType callback,
269     const void* data)
270 {
271     Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
272     evas_object_smart_callback_add(m_floatBackButton, event, callback, data);
273 }
274
275 void* WindowData::delFloatBackButtonCallback(
276     const char* event,
277     CallbackType callBack)
278 {
279     Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
280     return evas_object_smart_callback_del(m_floatBackButton, event, callBack);
281 }
282
283 void WindowData::userlayoutCallbackAdd(
284     const Evas_Callback_Type event,
285     EvasCallbackType callback,
286     const void* data)
287 {
288     Assert(m_user_layout != NULL && "m_user_layout is null");
289     evas_object_event_callback_add(m_user_layout, event, callback, data);
290 }
291
292 void* WindowData::userlayoutCallbackDel(
293     const Evas_Callback_Type event,
294     EvasCallbackType callBack)
295 {
296     Assert(m_user_layout != NULL && "m_user_layout is null");
297     return evas_object_event_callback_del(m_user_layout, event, callBack);
298 }
299
300 void WindowData::emitSignalForUserLayout(
301     const char* emission, const char* source)
302 {
303     LogInfo("emitSignalForUserLayout called");
304     Assert(m_user_layout != NULL && "m_user_layout is null");
305     Assert(emission != NULL && "emission is null");
306     Assert(source != NULL && "source is null");
307
308     edje_object_signal_emit(
309         elm_layout_edje_get(m_user_layout), emission, source);
310 }
311
312 void WindowData::toggleFullscreen(bool fullscreen)
313 {
314     LogDebug(__PRETTY_FUNCTION__);
315
316     static bool alreadyFullscreen = false;
317
318     if (alreadyFullscreen == fullscreen) {
319         // window is in fullscreen mode and fullscreen mode is requested, or
320         // window is not in fullscreen and a request is made to exit fullscreen
321         // In these two situations we don't have to do anything here.
322         return;
323     }
324
325     if (!m_fullscreen) { //If ViewMode is not fullscreen, toggle indicator
326         toggleIndicator(fullscreen);
327     }
328
329     alreadyFullscreen = !alreadyFullscreen;
330 }
331
332 void WindowData::winProfileChangedCallback(void *data,
333                                            Evas_Object* /*obj*/,
334                                            void* /*eventInfo*/)
335 {
336     LogDebug("winProfileChangedCallback");
337     if (data == NULL) {
338         return;
339     }
340     WindowData* This = static_cast<WindowData *>(data);
341     const char *profile = elm_config_profile_get();
342
343     if (DESKTOP_PROFILE == profile) {
344         elm_win_indicator_mode_set(This->m_win, ELM_WIN_INDICATOR_HIDE);
345         This->setDesktopIcon();
346     }
347 }
348