Initialize Tizen 2.3
[framework/web/wrt-plugins-common.git] / src_wearable / wrt-popup / wrt / popup-bin / renderer / evas_object.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        evas_object.cpp
18  * @author      Lukasz Wrzosek (l.wrzosel@samsung.com)
19  * @version     1.0
20  * @brief       This file is the implementation for Evas_Object wrapper from
21  * Efl.
22  */
23
24 #include "evas_object.h"
25 #include <stddef.h>
26 #include <dpl/foreach.h>
27
28 namespace Wrt {
29 namespace Popup {
30 namespace Renderer {
31 Evas_Object* EvasObject::IConnection::GetEvasObject()
32 {
33     return m_object->GetObject();
34 }
35
36 void EvasObject::IConnection::Disconnect()
37 {
38     m_object->DisconnectCallback(this);
39 }
40
41 EvasObject::IConnection::IConnection(EvasObject::EvasObjectShared* object) :
42     m_object(object)
43 {}
44
45 void EvasObject::IConnection::SmartCallbackWrapper(void* data,
46                                                    Evas_Object* /*object*/,
47                                                    void* event_info)
48 {
49     Assert(data);
50     IConnection* Calle = static_cast<IConnection*>(data);
51     Calle->Call(event_info);
52 }
53
54 void EvasObject::IConnection::EvasCallbackWrapper(void* data,
55                                                   Evas* /*evas*/,
56                                                   Evas_Object* /*object*/,
57                                                   void* event_info)
58 {
59     Assert(data);
60     IConnection* Calle = static_cast<IConnection*>(data);
61     Calle->Call(event_info);
62 }
63
64 Evas_Object* EvasObject::EvasObjectShared::GetObject()
65 {
66     return m_object;
67 }
68
69 EvasObject::EvasObjectShared::SmartConnectionBase::SmartConnectionBase(
70     const std::string& name,
71     EvasObject::EvasObjectShared* object) :
72     IConnection(object),
73     m_callbackName(name)
74 {}
75
76 void EvasObject::EvasObjectShared::SmartConnectionBase::ConnectPrv()
77 {
78     evas_object_smart_callback_add(GetEvasObject(),
79                                    m_callbackName.c_str(),
80                                    &IConnection::SmartCallbackWrapper, this);
81 }
82
83 void EvasObject::EvasObjectShared::SmartConnectionBase::DisconnectPrv()
84 {
85     evas_object_smart_callback_del(GetEvasObject(),
86                                    m_callbackName.c_str(),
87                                    &IConnection::SmartCallbackWrapper);
88 }
89
90 EvasObject::EvasObjectShared::EvasConnectionBase::EvasConnectionBase(
91     Evas_Callback_Type type,
92     EvasObject::EvasObjectShared* object) :
93     IConnection(object),
94     m_callbackType(type)
95 {}
96
97 void EvasObject::EvasObjectShared::EvasConnectionBase::ConnectPrv()
98 {
99     evas_object_event_callback_add(
100         GetEvasObject(), m_callbackType, &IConnection::EvasCallbackWrapper,
101         this);
102 }
103
104 void EvasObject::EvasObjectShared::EvasConnectionBase::DisconnectPrv()
105 {
106     evas_object_event_callback_del_full(
107         GetEvasObject(), m_callbackType, &IConnection::EvasCallbackWrapper,
108         this);
109 }
110
111 EvasObject::EvasObjectShared::EvasObjectShared() :
112     m_object(NULL)
113 {}
114
115 EvasObject::EvasObjectShared::EvasObjectShared(Evas_Object* object) :
116     m_object(object)
117 {
118     Assert(m_object);
119     evas_object_event_callback_add(m_object,
120                                    EVAS_CALLBACK_DEL,
121                                    &StaticOnDelEvent,
122                                    this);
123 }
124
125 void EvasObject::EvasObjectShared::SetObject(Evas_Object* object)
126 {
127     Assert(m_object == NULL);
128     Assert(object != NULL);
129     m_object = object;
130     evas_object_event_callback_add(m_object,
131                                    EVAS_CALLBACK_DEL,
132                                    &StaticOnDelEvent,
133                                    this);
134 }
135
136 EvasObject::EvasObjectShared::~EvasObjectShared()
137 {
138     if (m_object) {
139         DisconnectAll();
140         evas_object_event_callback_del(m_object,
141                                        EVAS_CALLBACK_DEL,
142                                        &StaticOnDelEvent);
143         m_object = NULL;
144     }
145 }
146
147 bool EvasObject::EvasObjectShared::DisconnectCallback(IConnection* connection)
148 {
149     IConnectionsSet::iterator it = m_connections.find(connection);
150     if (it != m_connections.end()) {
151         (*it)->DisconnectPrv();
152         delete connection;
153         m_connections.erase(it);
154         return true;
155     }
156     return false;
157 }
158
159 void EvasObject::EvasObjectShared::DisconnectAll()
160 {
161     FOREACH(it, m_connections)
162     {
163         (*it)->DisconnectPrv();
164         delete *it;
165     }
166     m_connections.clear();
167 }
168
169 void EvasObject::EvasObjectShared::StaticOnDelEvent(void* data,
170                                                     Evas* /*e*/,
171                                                     Evas_Object* /*o*/,
172                                                     void* /*ev*/)
173 {
174     Assert(data);
175     EvasObjectShared* This = static_cast<EvasObjectShared*>(data);
176     if (This->m_object) {
177         evas_object_event_callback_del(This->m_object,
178                                        EVAS_CALLBACK_DEL,
179                                        &StaticOnDelEvent);
180         This->DisconnectAll();
181         This->m_object = NULL;
182     }
183 }
184
185 EvasObject::EvasObject() :
186     m_object(new EvasObjectShared())
187 {}
188
189 EvasObject::EvasObject(Evas_Object* object) :
190     m_object(new EvasObjectShared(object))
191 {}
192
193 EvasObject::EvasObject(const EvasObject& other) :
194     m_object(other.m_object)
195 {}
196
197 //this destructor must be here to let pimpl with shared_ptr work without warning
198 EvasObject::~EvasObject()
199 {}
200
201 EvasObject& EvasObject::operator=(const EvasObject& other)
202 {
203     Assert(m_object);
204     m_object = other.m_object;
205     return *this;
206 }
207
208 EvasObject* EvasObject::operator=(Evas_Object* object)
209 {
210     Assert(m_object);
211     m_object->SetObject(object);
212     return this;
213 }
214
215 bool EvasObject::DisconnectCallback(IConnection* connection)
216 {
217     Assert(m_object);
218     return m_object->DisconnectCallback(connection);
219 }
220
221 void EvasObject::DisconnectAll()
222 {
223     Assert(m_object);
224     m_object->DisconnectAll();
225 }
226
227 EvasObject::operator Evas_Object *()
228 {
229     Assert(m_object);
230     return m_object->GetObject();
231 }
232 }
233 } // namespace DPL
234 } // namespace Popup