d0213218a5b28f7f6b75b871dd929699401eb932
[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 char const* const ELM = "elm";
36 char const* const LAYOUT = "layout";
37 char const* const APPLICATION = "application";
38 char const* const INDICATOR = "indicator";
39 char const* const NOINDICATOR = "noindicator";
40 char const* const INTERNAL_LAYOUT = "internal_layout";
41 char const* const FLOATBACKWARD_BUTTON_STYLE = "wrt/backward";
42
43 } // anonymous namespace
44
45 WindowData::WindowData(unsigned long pid, bool manualInit) :
46     m_win(NULL),
47     m_naviBackButton(NULL)
48 {
49     m_win = createWindow(pid);
50
51     if (!manualInit)
52     {
53         init();
54     }
55 }
56
57 WindowData::~WindowData()
58 {
59     LogDebug("");
60     evas_object_del(m_win);
61 }
62
63 void WindowData::init()
64 {
65     Assert(m_win != NULL && "m_win is null");
66
67     // import button theme
68     elm_theme_overlay_add(NULL, THEME_EDJ_PATH);
69
70     m_conformant = createConformant(m_win);
71     evas_object_show(m_conformant);
72     m_platform_layout = createPlatformLayout(m_conformant);
73     evas_object_show(m_platform_layout);
74     m_navigation = createNavigationBar(m_platform_layout);
75     evas_object_show(m_navigation);
76     m_user_layout = createUserLayout(m_navigation);
77     evas_object_show(m_user_layout);
78 }
79
80 void WindowData::setEvasObjectForLayout(Evas_Object* evas_object)
81 {
82     elm_object_content_set(m_conformant, evas_object);
83 }
84
85 void WindowData::unsetEvasObjectForLayout()
86 {
87     elm_object_content_unset(m_conformant);
88 }
89
90 void WindowData::toggleIndicator(bool fullscreen)
91 {
92     LogDebug("fullscreen=" << (fullscreen?"true":"false"));
93
94     if (!fullscreen) {
95         elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
96     } else {
97         elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
98     }
99 }
100
101 void WindowData::setViewMode(
102         bool fullscreen,
103         bool backbutton)
104 {
105     LogDebug("setViewMode");
106     LogDebug("fullscreen: " << fullscreen);
107     LogDebug("backbutton: " << backbutton);
108
109     m_fullscreen = fullscreen;
110
111     toggleIndicator(m_fullscreen);
112
113     if (backbutton) {
114         createFloatBackButton();
115     }
116
117 }
118
119 void WindowData::createFloatBackButton()
120 {
121     // Add float backbutton on the left coner
122     m_floatBackButton = elm_button_add(m_user_layout);
123     elm_object_style_set(m_floatBackButton, FLOATBACKWARD_BUTTON_STYLE);
124     elm_object_part_content_set(m_user_layout,
125                                 ELM_SWALLOW_BACKWARD,
126                                 m_floatBackButton);
127     evas_object_show(m_floatBackButton);
128 }
129
130 Evas_Object* WindowData::createWindow(unsigned long pid)
131 {
132     ADD_PROFILING_POINT("elm_win_add", "start");
133     Evas_Object* window = elm_win_add(NULL, "wrt-widget", ELM_WIN_BASIC);
134     ADD_PROFILING_POINT("elm_win_add", "stop");
135     ecore_x_window_prop_property_set(
136         elm_win_xwindow_get(window),
137         ECORE_X_ATOM_NET_WM_PID,
138         ECORE_X_ATOM_CARDINAL, 32, &pid, 1);
139     elm_win_conformant_set(window, EINA_TRUE);
140     int w, h;
141     ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
142     evas_object_resize(window, w, h);
143
144     return window;
145 }
146
147 Evas_Object* WindowData::createConformant(Evas_Object* parent)
148 {
149     Assert(parent != NULL && "Parent is null");
150     Evas_Object* conformant = elm_conformant_add(parent);
151
152     evas_object_size_hint_weight_set(
153             conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
154     evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
155     elm_win_resize_object_add(parent, conformant);
156     return conformant;
157 }
158
159 Evas_Object* WindowData::createPlatformLayout(Evas_Object* parent)
160 {
161     Evas_Object*  platform_layout = elm_layout_add(parent);
162
163     ADD_PROFILING_POINT("elm_layout_theme_set", "start");
164     elm_layout_file_set(platform_layout, PLATFORM_EDJ_PATH, "platformlayout");
165     ADD_PROFILING_POINT("elm_layout_theme_set", "stop");
166
167     evas_object_size_hint_align_set(platform_layout,
168             EVAS_HINT_FILL,
169             EVAS_HINT_FILL);
170     evas_object_size_hint_weight_set(platform_layout,
171             EVAS_HINT_EXPAND,
172             EVAS_HINT_EXPAND);
173
174     elm_object_content_set(parent, platform_layout);
175     edje_object_signal_emit(
176             elm_layout_edje_get(platform_layout), ELM_STATE_SHOW_CONTENT, ELM);
177     return platform_layout;
178 }
179
180 Evas_Object* WindowData::createNavigationBar(Evas_Object* parent)
181 {
182     Assert(parent != NULL && "Parent for naviframe is null");
183     Evas_Object* navigation = elm_naviframe_add(parent);
184
185     evas_object_size_hint_align_set(navigation,
186             EVAS_HINT_FILL,
187             EVAS_HINT_FILL);
188     evas_object_size_hint_weight_set(navigation,
189             EVAS_HINT_EXPAND,
190             EVAS_HINT_EXPAND);
191     elm_object_part_content_set(parent, ELM_SWALLOW_CONTENT, navigation);
192     //elm_object_content_set(parent, navigation);
193     return navigation;
194 }
195
196 Evas_Object* WindowData::createUserLayout(Evas_Object* parent)
197 {
198     Assert(parent != NULL && "Parent for User Layout is null");
199     Evas_Object* layout = elm_layout_add(parent);
200     elm_layout_file_set(layout, DAEMON_EDJ_PATH, "client");
201     evas_object_size_hint_weight_set(
202             layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
203     evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
204
205     ADD_PROFILING_POINT("elm_naviframe_item_push", "start");
206     Elm_Object_Item* naviIt = elm_naviframe_item_push(
207         /* Evas_Object *obj */
208         parent,
209         /* const char *title_label  */
210         "",
211         /* Evas_Object *prev_btn */
212         NULL,
213         /* Evas_Object *next_btn */
214         NULL,
215         /* Evas_Object *content */
216         layout,
217         /* const char *item_style */
218         NULL);
219
220     elm_naviframe_item_title_visible_set(naviIt, EINA_FALSE);
221
222     return layout;
223 }
224
225 void WindowData::addNaviBackButtonCallback(
226         const char* event,
227         CallbackType callback,
228         const void* data)
229 {
230     Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
231     evas_object_smart_callback_add(m_naviBackButton, event, callback, data);
232 }
233
234 void* WindowData::delNaviBackButtonCallback(
235         const char* event,
236         CallbackType callBack)
237 {
238     Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
239     return evas_object_smart_callback_del(m_naviBackButton, event, callBack);
240 }
241
242 void WindowData::addFloatBackButtonCallback(
243         const char* event,
244         CallbackType callback,
245         const void* data)
246 {
247     Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
248     evas_object_smart_callback_add(m_floatBackButton, event, callback, data);
249 }
250
251 void* WindowData::delFloatBackButtonCallback(
252         const char* event,
253         CallbackType callBack)
254 {
255     Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
256     return evas_object_smart_callback_del(m_floatBackButton, event, callBack);
257 }
258
259 void WindowData::userlayoutCallbackAdd(
260         const Evas_Callback_Type event,
261         EvasCallbackType callback,
262         const void* data)
263 {
264     Assert(m_user_layout != NULL && "m_user_layout is null");
265     evas_object_event_callback_add(m_user_layout, event, callback, data);
266 }
267
268 void* WindowData::userlayoutCallbackDel(
269         const Evas_Callback_Type event,
270         EvasCallbackType callBack)
271 {
272     Assert(m_user_layout != NULL && "m_user_layout is null");
273     return evas_object_event_callback_del(m_user_layout, event, callBack);
274 }
275
276 void WindowData::emitSignalForUserLayout(
277         const char* emission, const char* source)
278 {
279     LogInfo("emitSignalForUserLayout called");
280     Assert(m_user_layout != NULL && "m_user_layout is null");
281     Assert(emission != NULL && "emission is null");
282     Assert(source != NULL && "source is null");
283
284     edje_object_signal_emit(
285             elm_layout_edje_get(m_user_layout), emission, source);
286 }
287
288 void WindowData::toggleFullscreen(bool fullscreen)
289 {
290     LogDebug(__PRETTY_FUNCTION__);
291
292     static bool alreadyFullscreen = false;
293
294     if (alreadyFullscreen == fullscreen) {
295         // window is in fullscreen mode and fullscreen mode is requested, or
296         // window is not in fullscreen and a request is made to exit fullscreen
297         // In these two situations we don't have to do anything here.
298         return;
299     }
300
301     if (!m_fullscreen) //If ViewMode is not fullscreen, toggle indicator
302         toggleIndicator(fullscreen);
303
304     alreadyFullscreen = !alreadyFullscreen;
305 }