2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * @file window_data.cpp
18 * @author Jaroslaw Osmanski (j.osmanski@samsung.com)
20 * @brief Window data class implementation
22 #include "window_data.h"
24 #include <ui-gadget.h>
25 #include <dpl/log/log.h>
28 char const* const DAEMON_EDJ_PATH = "/usr/share/edje/wrt/Daemon.edj";
29 char const* const THEME_EDJ_PATH = "/usr/share/edje/wrt/wrt_theme.edj";
30 char const* const ELM_STATE_SHOW_CONTENT = "elm,state,show,content";
31 char const* const ELM_SWALLOW_CONTENT = "elm.swallow.content";
32 char const* const ELM_SWALLOW_BACKWARD = "elm.swallow.backward";
33 char const* const ELM = "elm";
34 char const* const LAYOUT = "layout";
35 char const* const APPLICATION = "application";
36 char const* const INDICATOR = "indicator";
37 char const* const NOINDICATOR = "noindicator";
38 char const* const LIST_PROCESS = "list_process";
39 char const* const INTERNAL_LAYOUT = "internal_layout";
40 char const* const FLOATBACKWARD_BUTTON_STYLE = "wrt/backward";
41 const double PROGRESS_POSITION_X = 0.5;
42 const double PROGRESS_POSITION_Y = 0.5;
43 const int PROGRESS_SIZE_RATIO = 12; //ResolutionWidth / ProgressWidth = 12
44 const int PROGRESS_COLOR_R = 153;
45 const int PROGRESS_COLOR_G = 153;
46 const int PROGRESS_COLOR_B = 153;
47 const int PROGRESS_COLOR_A = 255;
49 } // anonymous namespace
51 WindowData::WindowData(unsigned long pid, bool manualInit) :
52 m_naviBackButton(NULL), m_win(NULL)
54 m_win = createWindow(pid);
62 WindowData::~WindowData()
65 evas_object_del(m_win);
68 void WindowData::init()
70 Assert(m_win != NULL && "m_win is null");
73 // import button theme
74 elm_theme_overlay_add(NULL, THEME_EDJ_PATH);
76 m_platform_layout = createPlatformLayout(m_win);
77 evas_object_show(m_platform_layout);
78 m_navigation = createNavigationBar(m_platform_layout);
79 evas_object_show(m_navigation);
80 m_user_layout = createUserLayout(m_navigation);
81 evas_object_show(m_user_layout);
82 m_conformant = createConformant(m_user_layout);
83 evas_object_show(m_conformant);
84 m_progress = createProgress(m_user_layout);
87 static_cast<Display*>(ecore_x_display_get()),
88 elm_win_xwindow_get(m_win),
90 UG_OPT_INDICATOR_ENABLE);
93 LogError("Gadget creation failed for window: " << m_win);
94 Assert(false && "UI Gadget creation failed");
98 void WindowData::setEvasObjectForLayout(Evas_Object* evas_object)
100 elm_object_content_set(m_conformant, evas_object);
103 void WindowData::unsetEvasObjectForLayout()
105 elm_object_content_unset(m_conformant);
108 void WindowData::loadingOn()
110 LogInfo("loadingOn");
112 alignProgressPosition();
113 elm_progressbar_pulse(m_progress, EINA_TRUE);
114 evas_object_show(m_progress);
117 void WindowData::loadingOff()
119 LogInfo("loadingOff");
121 elm_progressbar_pulse(m_progress, EINA_FALSE);
122 evas_object_hide(m_progress);
125 void WindowData::moveProgress()
127 LogInfo("moveProgress");
129 if (evas_object_visible_get(m_progress) == EINA_TRUE) {
130 alignProgressPosition();
132 LogInfo("Progress is hide");
136 void WindowData::setViewModeFullScreen(bool indicator, bool backbutton)
138 LogDebug("indicator: " << indicator << ", backbutton: " << backbutton);
140 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
141 elm_layout_theme_set(m_platform_layout,
146 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
147 elm_layout_theme_set(m_platform_layout,
153 createFloatBackButton();
157 void WindowData::setViewModeMaximized(
162 LogDebug("indicator: " << indicator << ", backbutton: " << backbutton);
164 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_SHOW);
165 elm_layout_theme_set(m_platform_layout,
170 elm_win_indicator_mode_set(m_win, ELM_WIN_INDICATOR_HIDE);
171 elm_layout_theme_set(m_platform_layout,
178 createFloatBackButton();
182 void WindowData::createTitle(const char* data)
184 LogDebug("createTitle");
185 Elm_Object_Item* naviIt = elm_naviframe_top_item_get(m_navigation);
186 elm_naviframe_item_title_visible_set(naviIt, EINA_TRUE);
187 elm_object_item_text_set(naviIt, data);
190 void WindowData::removeTitle()
192 Elm_Object_Item* naviIt = elm_naviframe_top_item_get(m_navigation);
193 elm_object_item_text_set(naviIt, "");
194 elm_naviframe_item_title_visible_set(naviIt, EINA_FALSE);
197 void WindowData::createTitleButton()
199 // Add left button for back action
200 m_naviBackButton = elm_button_add(m_navigation);
201 elm_object_style_set(m_naviBackButton, "navigationbar_backbutton/default");
203 Elm_Object_Item* naviIt = elm_naviframe_top_item_get(m_navigation);
204 elm_object_item_part_content_set(naviIt, "prev_btn",
208 void WindowData::createFloatBackButton()
210 // Add float backbutton on the left coner
211 m_floatBackButton = elm_button_add(m_user_layout);
212 elm_object_style_set(m_floatBackButton, FLOATBACKWARD_BUTTON_STYLE);
213 elm_object_part_content_set(m_user_layout,
214 ELM_SWALLOW_BACKWARD,
216 evas_object_show(m_floatBackButton);
219 void WindowData::updateTitleButton(const bool display)
222 evas_object_show(m_naviBackButton);
224 evas_object_hide(m_naviBackButton);
228 Evas_Object* WindowData::createWindow(unsigned long pid)
230 Evas_Object* window = elm_win_add(NULL, "wrt-widget", ELM_WIN_BASIC);
231 ecore_x_window_prop_property_set(
232 elm_win_xwindow_get(window),
233 ECORE_X_ATOM_NET_WM_PID,
234 ECORE_X_ATOM_CARDINAL, 32, &pid, 1);
235 elm_win_title_set(window, "wrt-widget");
236 elm_win_borderless_set(window, EINA_TRUE);
237 elm_win_conformant_set(window, EINA_TRUE);
239 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
240 evas_object_resize(window, w, h);
244 Evas_Object* WindowData::createPlatformLayout(Evas_Object* parent)
246 Evas_Object* platform_layout = elm_layout_add(parent);
247 elm_layout_theme_set(platform_layout, LAYOUT, APPLICATION, NOINDICATOR);
248 evas_object_size_hint_expand_set(platform_layout,
251 elm_win_resize_object_add(m_win, platform_layout);
252 edje_object_signal_emit(
253 elm_layout_edje_get(platform_layout), ELM_STATE_SHOW_CONTENT, ELM);
254 return platform_layout;
257 Evas_Object* WindowData::createUserLayout(Evas_Object* parent)
259 Assert(parent != NULL && "Parent for User Layout is null");
260 Evas_Object* layout = elm_layout_add(parent);
261 elm_layout_file_set(layout, DAEMON_EDJ_PATH, "client");
262 evas_object_size_hint_weight_set(
263 layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
264 Elm_Object_Item* naviIt = elm_naviframe_item_push(
265 /* Evas_Object *obj */
267 /* const char *title_label */
269 /* Evas_Object *prev_btn */
271 /* Evas_Object *next_btn */
273 /* Evas_Object *content */
275 /* const char *item_style */
278 elm_naviframe_item_title_visible_set(naviIt, EINA_FALSE);
282 Evas_Object* WindowData::createConformant(Evas_Object* parent)
284 Assert(parent != NULL && "Parent is null");
285 Evas_Object* conformant = elm_conformant_add(parent);
286 elm_object_style_set(conformant, INTERNAL_LAYOUT);
287 evas_object_size_hint_weight_set(
288 conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
289 evas_object_size_hint_align_set(conformant, EVAS_HINT_FILL, EVAS_HINT_FILL);
290 elm_object_part_content_set(parent, ELM_SWALLOW_CONTENT, conformant);
291 evas_object_show(conformant);
295 Evas_Object* WindowData::createNavigationBar(Evas_Object* parent)
297 Assert(parent != NULL && "Parent for naviframe is null");
298 Evas_Object* navigation = elm_naviframe_add(parent);
299 elm_object_part_content_set(parent, ELM_SWALLOW_CONTENT, navigation);
303 Evas_Object* WindowData::createProgress(Evas_Object* parent)
305 Assert(parent != NULL && "Parent for progress is null");
306 Evas_Object* progress = elm_progressbar_add(parent);
307 progress = elm_progressbar_add(parent);
308 elm_object_style_set(progress, LIST_PROCESS);
309 evas_object_color_set(
315 Evas_Coord x, y, w, h;
316 int progressW, progressH;
317 evas_object_geometry_get(m_win, &x, &y, &w, &h);
318 progressW = w / static_cast<Evas_Coord>(PROGRESS_SIZE_RATIO);
319 progressH = progressW;
321 evas_object_resize(progress, progressW, progressH);
325 void WindowData::alignProgressPosition()
327 Evas_Coord layOutX, layOutY, layOutW, layOutH;
328 Evas_Coord progressX, progressY, progressW, progressH;
329 Evas_Coord alignedX, alignedY;
331 evas_object_geometry_get(
337 evas_object_geometry_get(
343 alignedX = (layOutW - progressW) * PROGRESS_POSITION_X + layOutX;
344 alignedY = (layOutH - progressH) * PROGRESS_POSITION_Y + layOutY;
345 evas_object_move(m_progress, alignedX, alignedY);
348 void WindowData::addNaviBackButtonCallback(
350 CallbackType callback,
353 Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
354 evas_object_smart_callback_add(m_naviBackButton, event, callback, data);
357 void* WindowData::delNaviBackButtonCallback(
359 CallbackType callBack)
361 Assert(m_naviBackButton != NULL && "m_naviBackButton is null");
362 return evas_object_smart_callback_del(m_naviBackButton, event, callBack);
365 void WindowData::addFloatBackButtonCallback(
367 CallbackType callback,
370 Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
371 evas_object_smart_callback_add(m_floatBackButton, event, callback, data);
374 void* WindowData::delFloatBackButtonCallback(
376 CallbackType callBack)
378 Assert(m_floatBackButton != NULL && "m_floatBackButton is null");
379 return evas_object_smart_callback_del(m_floatBackButton, event, callBack);
382 void WindowData::userlayoutCallbackAdd(
383 const Evas_Callback_Type event,
384 EvasCallbackType callback,
387 Assert(m_user_layout != NULL && "m_user_layout is null");
388 evas_object_event_callback_add(m_user_layout, event, callback, data);
391 void* WindowData::userlayoutCallbackDel(
392 const Evas_Callback_Type event,
393 EvasCallbackType callBack)
395 Assert(m_user_layout != NULL && "m_user_layout is null");
396 return evas_object_event_callback_del(m_user_layout, event, callBack);
399 void WindowData::emitSignalForUserLayout(
400 const char* emission, const char* source)
402 LogInfo("emitSignalForUserLayout called");
403 Assert(m_user_layout != NULL && "m_user_layout is null");
404 Assert(emission != NULL && "emission is null");
405 Assert(source != NULL && "source is null");
407 edje_object_signal_emit(
408 elm_layout_edje_get(m_user_layout), emission, source);