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 popup_renderer.cpp
18 * @author Lukasz Wrzosek (l.wrzosek@samsung.com)
20 * @brief This is efl specific implementation for PopupRenderer
23 #include "popup_renderer.h"
25 #include <dpl/scoped_array.h>
26 #include <dpl/assert.h>
27 #include <dpl/log/log.h>
28 #include <dpl/foreach.h>
29 #include <dpl/framework_efl.h>
30 #include <dpl/lexical_cast.h>
32 #include "popup_manager.h"
33 #include "popup_manager.h"
34 #include "evas_object.h"
38 using namespace Popup;
39 const char* EDJ_NAME = "/usr/share/edje/ace/generic_popup.edj";
40 const char* POPUP_LAYOUT1 = "popup_layout1";
41 const char* POPUP_LAYOUT2 = "popup_layout2";
42 const char* POPUP_PART_TITLE = "title,text";
43 const char* POPUP_PART_BUTTON1 = "button1";
44 const char* POPUP_PART_BUTTON2 = "button2";
45 const char* POPUP_PART_BUTTON3 = "button3";
46 const char* BUTTON_CLICKED_CALLBACK_NAME = "clicked";
47 const char* CHANGED_CALLBACK_NAME = "changed";
48 const unsigned int MAX_NUMBER_OF_VERTICAL = 2;
50 Evas_Object* create_layout_main(Evas_Object* parent, int totalV)
52 Evas_Object *layout = elm_layout_add(parent);
55 elm_layout_file_set(layout, EDJ_NAME, POPUP_LAYOUT1);
56 } else if (totalV == 2) {
57 elm_layout_file_set(layout, EDJ_NAME, POPUP_LAYOUT2);
59 Assert(!"popup needs define new group in the edc");
62 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND,
70 class PopupRenderer::Impl
79 m_externalCanvas(NULL)
85 LogError("Destroyed without Deinitialize");
91 Assert(!m_initialized);
97 Assert(m_initialized);
99 while (!m_popupsToRender.empty()) {
100 m_popupsToRender.pop();
102 m_initialized = false;
105 void ButtonCallback(EvasObject::IConnection* /*connection*/,
106 void* /*event_info*/,
109 LogDebug("ButtonCallback");
110 Assert(m_initialized);
111 AnswerCallbackData answerData;
113 answerData.buttonAnswer = reinterpret_cast<int>(data);
114 answerData.chackState = m_checkState;
115 answerData.password = m_password;
116 m_current->ForwardAnswer(answerData);
119 FOREACH(it, m_createdObjects)
122 evas_object_del(*it);
125 m_createdObjects.clear();
126 m_checkState = false;
130 void CheckCallback(EvasObject::IConnection* connection,
131 void* /*event_info*/,
135 elm_check_state_get(connection->GetEvasObject());
138 void Render (PopupPtr popup)
140 Assert(m_initialized);
141 m_popupsToRender.push(popup);
145 void DoRender(const PopupObject::Label& object,
150 EvasObject label(elm_label_add(parent));
152 elm_object_style_set(label, "popup_description/default");
153 elm_label_line_wrap_set(label, ELM_WRAP_WORD);
154 elm_object_text_set(label, object.getLabel().c_str());
155 evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0);
156 evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
157 evas_object_show(label);
159 elm_object_part_content_set(
161 DPL::lexical_cast<std::string>(themeIndex).c_str(),
163 m_createdObjects.push_back(label);
166 void DoRender(const PopupObject::Check& object,
171 EvasObject check(elm_check_add(parent));
173 evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
174 evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, 0.0);
175 elm_object_text_set(check,
176 object.getCheckLabel().c_str());
177 elm_object_part_content_set(
179 DPL::lexical_cast<std::string>(themeIndex).c_str(),
182 check.ConnectMemberSmartCallback(CHANGED_CALLBACK_NAME,
183 &Impl::CheckCallback,
185 static_cast<void*>(NULL));
186 evas_object_show(check);
187 m_createdObjects.push_back(check);
190 void DoRender(const PopupObject::Button& object,
193 EvasObject btn(elm_button_add(parent));
195 elm_object_style_set(btn, "popup");
196 elm_object_text_set(btn, object.getLabel().c_str());
197 elm_object_part_content_set(parent, POPUP_PART_BUTTON1, btn);
198 btn.ConnectMemberSmartCallback(BUTTON_CLICKED_CALLBACK_NAME,
199 &Impl::ButtonCallback,
201 reinterpret_cast<void*>(object.
203 m_createdObjects.push_back(btn);
206 void DoRender(const PopupObject::Button& object1,
207 const PopupObject::Button& object2,
210 DoRender(object1, parent);
212 EvasObject btn2(elm_button_add(parent));
214 elm_object_style_set(btn2, "popup");
215 elm_object_text_set(btn2, object2.getLabel().c_str());
216 elm_object_part_content_set(parent, POPUP_PART_BUTTON2, btn2);
217 btn2.ConnectMemberSmartCallback(BUTTON_CLICKED_CALLBACK_NAME,
218 &Impl::ButtonCallback,
220 reinterpret_cast<void*>(object2.
222 m_createdObjects.push_back(btn2);
225 void DoRender(const PopupObject::Button& object1,
226 const PopupObject::Button& object2,
227 const PopupObject::Button& object3,
230 DoRender(object1, object2, parent);
232 EvasObject btn3(elm_button_add(parent));
234 elm_object_style_set(btn3, "popup");
235 elm_object_text_set(btn3, object3.getLabel().c_str());
236 elm_object_part_content_set(parent, POPUP_PART_BUTTON3, btn3);
237 btn3.ConnectMemberSmartCallback(BUTTON_CLICKED_CALLBACK_NAME,
238 &Impl::ButtonCallback,
240 reinterpret_cast<void*>(object3.
242 m_createdObjects.push_back(btn3);
245 EvasObject getBaseObject()
247 if (getExternalCanvas() == NULL) {
248 LogDebug("Create old style popup");
249 EvasObject win(elm_win_add(NULL, "Popup", ELM_WIN_DIALOG_BASIC));
250 elm_win_borderless_set(win, EINA_TRUE);
251 elm_win_alpha_set(win, EINA_TRUE);
255 ecore_x_window_geometry_get(ecore_x_window_root_first_get(),
260 evas_object_resize(win, w, h);
261 evas_object_move(win, x, y);
263 m_createdObjects.push_back(win);
264 evas_object_show(win);
267 LogDebug("Create new style popup");
268 EvasObject win(getExternalCanvas());
269 evas_object_show(win);
276 if (!m_current && !m_popupsToRender.empty()) {
277 m_current = m_popupsToRender.front();
278 m_popupsToRender.pop();
283 std::vector<int> countPopupObjects = { 0 /* PopupObject::BUTTON */,
284 0 /* PopupObject::LABEL */,
285 0 /* PopupObject::CHECK */ };
286 FOREACH(it, m_current->GetPopupObjects()) {
287 AssertMsg((*it)->getType() < countPopupObjects.size(),
288 "Wrong PopupObject assigned");
289 countPopupObjects[(*it)->getType()]++;
291 int needsIndexV = countPopupObjects[PopupObject::LABEL] +
292 countPopupObjects[PopupObject::CHECK];
294 EvasObject win = getBaseObject();
295 EvasObject main(elm_popup_add(win));
297 evas_object_size_hint_weight_set(main,
300 elm_object_part_text_set(main,
302 m_current->GetTitle().c_str());
304 m_createdObjects.push_back(main);
305 std::vector<PopupObject::Button> buttonObjectList;
306 EvasObject layout(create_layout_main(main, needsIndexV));
307 m_createdObjects.push_back(layout);
309 FOREACH(it, m_current->GetPopupObjects()) {
310 switch ((*it)->getType()) {
311 case PopupObject::BUTTON:
312 buttonObjectList.push_back(*(*it)->asButton());
314 case PopupObject::LABEL:
315 DoRender(*(*it)->asLabel(),
320 case PopupObject::CHECK:
321 DoRender(*(*it)->asCheck(),
327 Assert(!"incorrect type");
329 Assert(m_themeIndexV <= MAX_NUMBER_OF_VERTICAL);
331 elm_object_content_set(main,
335 switch (buttonObjectList.size()) {
337 LogDebug("no button");
340 DoRender(buttonObjectList.at(0),
344 DoRender(buttonObjectList.at(0),
345 buttonObjectList.at(1),
349 DoRender(buttonObjectList.at(0),
350 buttonObjectList.at(1),
351 buttonObjectList.at(2),
355 Assert(!"incorrect button number");
359 evas_object_show(main);
363 void setExternalCanvas(void* externalCanvas)
365 m_externalCanvas = static_cast<Evas_Object*>(externalCanvas);
368 Evas_Object* getExternalCanvas() const
370 return m_externalCanvas;
373 std::queue<PopupPtr> m_popupsToRender;
374 std::list<EvasObject> m_createdObjects;
378 DPL::OptionalStdString m_password;
379 unsigned int m_themeIndexV;
382 Evas_Object* m_externalCanvas;
385 PopupRenderer::PopupRenderer()
387 m_impl = new PopupRenderer::Impl();
390 PopupRenderer::~PopupRenderer()
395 void PopupRenderer::Initialize()
398 m_impl->Initialize();
401 void PopupRenderer::Deinitialize()
404 m_impl->Deinitialize();
407 IPopupPtr PopupRenderer::CreatePopup()
409 return std::static_pointer_cast<IPopup>(IPopupPtr
410 (new Popup(shared_from_this())));
413 void PopupRenderer::Render(PopupPtr popup)
415 m_impl->Render(popup);
418 void PopupRenderer::setExternalCanvas(void* externalCanvas)
420 m_impl->setExternalCanvas(externalCanvas);