Follow the include-order coding conventions
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / scrollable / scroll-view / scroll-base-impl.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-toolkit/internal/controls/scrollable/scroll-view/scroll-base-impl.h>
20
21 using namespace Dali;
22
23 namespace Dali
24 {
25
26 namespace Toolkit
27 {
28
29 namespace Internal
30 {
31
32 ///////////////////////////////////////////////////////////////////////////////////////////////////
33 // ScrollBase
34 ///////////////////////////////////////////////////////////////////////////////////////////////////
35
36 const std::string ScrollBase::SCROLL_DOMAIN_OFFSET_PROPERTY_NAME( "domain-offset" );
37
38 ScrollBase::ScrollBase()
39 : Scrollable(),
40   mParent(NULL),
41   mPropertyTime(Property::INVALID_INDEX),
42   mPropertyPrePosition(Property::INVALID_INDEX),
43   mPropertyPosition(Property::INVALID_INDEX),
44   mPropertyScale(Property::INVALID_INDEX),
45   mPropertyOvershootX(Property::INVALID_INDEX),
46   mPropertyOvershootY(Property::INVALID_INDEX),
47   mPropertyWrap(Property::INVALID_INDEX),
48   mPropertyPanning(Property::INVALID_INDEX),
49   mPropertyScrolling(Property::INVALID_INDEX),
50   mPropertyFinal(Property::INVALID_INDEX),
51   mPropertyDomainOffset(Property::INVALID_INDEX),
52   mPropertyPositionDelta(Property::INVALID_INDEX),
53   mPropertyScrollStartPagePosition(Property::INVALID_INDEX),
54   mDelay(0.0f)
55 {
56 }
57
58 void ScrollBase::SetParent(ScrollBase *parent)
59 {
60   mParent = parent;
61 }
62
63 void ScrollBase::RegisterProperties()
64 {
65   Actor self = Self();
66
67   // Register common properties
68   RegisterCommonProperties();
69
70   // Register Scroll Properties.
71   mPropertyTime = self.RegisterProperty(Toolkit::ScrollView::SCROLL_TIME_PROPERTY_NAME, 0.0f);
72   mPropertyPrePosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_PRE_POSITION_PROPERTY_NAME, Vector3::ZERO);
73   mPropertyPosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_POSITION_PROPERTY_NAME, Vector3::ZERO);
74   mPropertyOvershootX = self.RegisterProperty(Toolkit::ScrollView::SCROLL_OVERSHOOT_X_PROPERTY_NAME, 0.0f);
75   mPropertyOvershootY = self.RegisterProperty(Toolkit::ScrollView::SCROLL_OVERSHOOT_Y_PROPERTY_NAME, 0.0f);
76   mPropertyFinal = self.RegisterProperty(Toolkit::ScrollView::SCROLL_FINAL_PROPERTY_NAME, Vector3::ZERO);
77   mPropertyScale = self.RegisterProperty(Toolkit::ScrollView::SCROLL_SCALE_PROPERTY_NAME, Vector3::ONE);
78   mPropertyWrap = self.RegisterProperty(Toolkit::ScrollView::SCROLL_WRAP_PROPERTY_NAME, false);
79   mPropertyPanning = self.RegisterProperty(Toolkit::ScrollView::SCROLL_PANNING_PROPERTY_NAME, false);
80   mPropertyScrolling = self.RegisterProperty(Toolkit::ScrollView::SCROLL_SCROLLING_PROPERTY_NAME, false);
81   mPropertyDomainOffset = self.RegisterProperty(SCROLL_DOMAIN_OFFSET_PROPERTY_NAME, Vector3::ZERO);
82   mPropertyPositionDelta = self.RegisterProperty(Toolkit::ScrollView::SCROLL_POSITION_DELTA_PROPERTY_NAME, Vector3::ZERO);
83   mPropertyScrollStartPagePosition = self.RegisterProperty(Toolkit::ScrollView::SCROLL_START_PAGE_POSITION_PROPERTY_NAME, Vector3::ZERO);
84 }
85
86 void ScrollBase::BindActor(Actor child)
87 {
88   FindAndUnbindActor(child);
89
90   ActorInfoPtr actorInfo(new ActorInfo(child));
91   mBoundActors.push_back(actorInfo);
92
93   // Apply all our constraints to this new child.
94   ConstraintStack::iterator i;
95
96   for(i = mConstraintStack.begin();i!=mConstraintStack.end();i++)
97   {
98     actorInfo->ApplyConstraint(*i);
99   }
100 }
101
102 void ScrollBase::UnbindActor(Actor child)
103 {
104   // Find the child in mBoundActors, and unparent it
105   for (ActorInfoIter iter = mBoundActors.begin(); iter != mBoundActors.end(); ++iter)
106   {
107     ActorInfoPtr actorInfo = *iter;
108
109     if( actorInfo->mActor == child )
110     {
111       mBoundActors.erase(iter);
112       break;
113     }
114   }
115 }
116
117 void ScrollBase::FindAndUnbindActor(Actor child)
118 {
119   // Since we don't know if and where child may have been bound
120   // (as we cannot store such information inside the Actor), we
121   // perform a search on all associated ScrollBases
122   // This is done by recursively calling the parent of this ScrollBase
123   // until reaching the top (at which point implementation may be
124   // different as this is virtual)
125
126   if(mParent) // continuously ascend until reaches root ScrollBase.
127   {
128     mParent->FindAndUnbindActor(child);
129   }
130 }
131
132 void ScrollBase::ApplyConstraintToBoundActors(Constraint constraint)
133 {
134   mConstraintStack.push_back(constraint);
135
136   for(ActorInfoIter i = mBoundActors.begin();i != mBoundActors.end(); ++i)
137   {
138     (*i)->ApplyConstraint(constraint);
139   }
140 }
141
142 void ScrollBase::RemoveConstraintsFromBoundActors()
143 {
144   mConstraintStack.clear();
145
146   for(ActorInfoIter i = mBoundActors.begin();i != mBoundActors.end(); ++i)
147   {
148     (*i)->RemoveConstraints();
149   }
150 }
151
152 } // namespace Internal
153
154 } // namespace Toolkit
155
156 } // namespace Dali