b16d2549ec6163926e78da1402aac26722b1bd93
[platform/core/uifw/dali-core.git] / dali / internal / event / object / custom-object-internal.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
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
18 // CLASS HEADER
19 #include <dali/internal/event/object/custom-object-internal.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/internal/event/common/stage-impl.h>
23 #include <dali/internal/update/common/animatable-property.h>
24 #include <dali/internal/update/common/property-owner.h>
25 #include <dali/internal/update/common/property-owner-messages.h>
26 #include <dali/internal/update/manager/update-manager.h>
27 #include <dali/internal/update/animation/scene-graph-constraint-base.h>
28
29 using Dali::Internal::SceneGraph::PropertyOwner;
30 using Dali::Internal::SceneGraph::PropertyBase;
31 using Dali::Internal::SceneGraph::UpdateManager;
32 using Dali::Internal::SceneGraph::AnimatableProperty;
33
34 namespace Dali
35 {
36
37 namespace Internal
38 {
39
40 CustomObject* CustomObject::New()
41 {
42   return new CustomObject();
43 }
44
45 bool CustomObject::IsSceneObjectRemovable() const
46 {
47   return false;
48 }
49
50 const SceneGraph::PropertyOwner* CustomObject::GetSceneObject() const
51 {
52   return mUpdateObject;
53 }
54
55 const PropertyBase* CustomObject::GetSceneObjectAnimatableProperty( Property::Index index ) const
56 {
57   const PropertyBase* property( NULL );
58
59   CustomPropertyLookup::const_iterator entry = GetCustomPropertyLookup().find( index );
60
61   DALI_ASSERT_ALWAYS( GetCustomPropertyLookup().end() != entry && "index is invalid" );
62
63   property = dynamic_cast<const PropertyBase*>( entry->second.GetSceneGraphProperty() );
64
65   return property;
66 }
67
68 const PropertyInputImpl* CustomObject::GetSceneObjectInputProperty( Property::Index index ) const
69 {
70   return GetSceneObjectAnimatableProperty( index );
71 }
72
73 unsigned int CustomObject::GetDefaultPropertyCount() const
74 {
75   return 0u;
76 }
77
78 void CustomObject::GetDefaultPropertyIndices( Property::IndexContainer& indices ) const
79 {
80 }
81
82 const char* CustomObject::GetDefaultPropertyName( Property::Index index ) const
83 {
84   return NULL;
85 }
86
87 Property::Index CustomObject::GetDefaultPropertyIndex(const std::string& name) const
88 {
89   return Property::INVALID_INDEX;
90 }
91
92 bool CustomObject::IsDefaultPropertyWritable(Property::Index index) const
93 {
94   return false;
95 }
96
97 bool CustomObject::IsDefaultPropertyAnimatable(Property::Index index) const
98 {
99   return false;
100 }
101
102 bool CustomObject::IsDefaultPropertyAConstraintInput( Property::Index index ) const
103 {
104   return false;
105 }
106
107 Property::Type CustomObject::GetDefaultPropertyType(Property::Index index) const
108 {
109   return Property::NONE;
110 }
111
112 void CustomObject::SetDefaultProperty( Property::Index index, const Property::Value& property )
113 {
114   // do nothing
115 }
116
117 Property::Value CustomObject::GetDefaultProperty(Property::Index index) const
118 {
119   return Property::Value();
120 }
121
122 void CustomObject::InstallSceneObjectProperty( PropertyBase& newProperty, const std::string& name, unsigned int index )
123 {
124   if( NULL != mUpdateObject )
125   {
126     // mUpdateObject is being used in a separate thread; queue a message to add the property
127     InstallCustomPropertyMessage( Stage::GetCurrent()->GetUpdateInterface(), *mUpdateObject, newProperty ); // Message takes ownership
128   }
129 }
130
131 CustomObject::~CustomObject()
132 {
133   // Guard to allow handle destruction after Core has been destroyed
134   if( Stage::IsInstalled() )
135   {
136     if( NULL != mUpdateObject )
137     {
138       RemoveObjectMessage( Stage::GetCurrent()->GetUpdateManager(), mUpdateObject );
139       mUpdateObject = NULL; // object is about to be destroyed
140     }
141   }
142 }
143
144 CustomObject::CustomObject()
145 {
146   PropertyOwner* updateObject = PropertyOwner::New();
147
148   // Pass ownership to the update-thread
149   AddObjectMessage( Stage::GetCurrent()->GetUpdateManager(), updateObject );
150
151   // Keep as const since this should only be modified from update-thread
152   mUpdateObject = updateObject;
153 }
154
155 } // namespace Internal
156
157 } // namespace Dali