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