[ATSPI] Implementation of Hypertext and Hyperlink in text controls
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / accessible-impl.h
1 #ifndef DALI_TOOLKIT_ACCESSIBLE_IMPL_H
2 #define DALI_TOOLKIT_ACCESSIBLE_IMPL_H
3 /*
4  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  */
19 // EXTERNAL INCLUDES
20 #include <dali/devel-api/adaptor-framework/accessibility-impl.h>
21 #include <dali/devel-api/adaptor-framework/accessibility.h>
22 #include <dali/public-api/object/weak-handle.h>
23
24 // INTERNAL INCLUDES
25 #include <dali-toolkit/public-api/dali-toolkit-common.h>
26
27 namespace Dali::Toolkit::DevelControl {
28
29 /**
30  * @brief Represents the Accessible object for Dali::Toolkit::Control and derived classes
31  *
32  * You can create a derived class (and register it using SetAccessibilityConstructor)
33  * in order to customize Accessibility for a given control.
34  *
35  * @see Dali::Toolkit::DevelControl::SetAccessibilityConstructor
36  * @see Dali::Accessibility::Accessible
37  * @see Dali::Accessibility::Component
38  * @see Dali::Accessibility::Collection
39  * @see Dali::Accessibility::Action
40  * @see Dali::Accessibility::Value
41  * @see Dali::Accessibility::Text
42  * @see Dali::Accessibility::EditableText
43  */
44 struct DALI_TOOLKIT_API AccessibleImpl : public virtual Dali::Accessibility::Accessible,
45                                          public virtual Dali::Accessibility::Component,
46                                          public virtual Dali::Accessibility::Collection,
47                                          public virtual Dali::Accessibility::Action
48 {
49 protected:
50   Vector2                       mLastPosition{0.0f, 0.0f};
51   Dali::WeakHandle<Dali::Actor> mSelf;
52   Dali::WeakHandle<Dali::Actor> mCurrentHighlightActor;
53   bool mIsModal = false;
54   bool mIsRoot = false;
55
56   Dali::Actor Self() const
57   {
58     auto handle = mSelf.GetHandle();
59
60     // Control::Impl holds a std::unique_ptr to the Accessible object,
61     // so that one does not outlive the other.
62     DALI_ASSERT_ALWAYS(handle);
63
64     return handle;
65   }
66
67   void ScrollToSelf();
68
69   /**
70    * @brief Register property notification to check highlighted object position
71    */
72   void RegisterPositionPropertyNotification();
73
74   /**
75    * @brief Remove property notification added by RegisterPropertyNotification
76    */
77   void UnregisterPositionPropertyNotification();
78
79   /**
80    * @brief Check if the actor is showing
81    * @return True if the actor is showing
82    */
83   bool IsShowing();
84
85 public:
86   AccessibleImpl(Dali::Actor self, Dali::Accessibility::Role role, bool modal = false);
87
88   /**
89    * @copydoc Dali::Accessibility::Accessible::GetName()
90    */
91   std::string GetName() override;
92
93   /**
94    * @brief Returns the actor's name in the absence of ACCESSIBILITY_NAME property
95    */
96   virtual std::string GetNameRaw();
97
98   /**
99    * @copydoc Dali::Accessibility::Accessible::GetDescription()
100    */
101   std::string GetDescription() override;
102
103   /**
104    * @brief Returns the actor's description in the absence of ACCESSIBILITY_DESCRIPTION property
105    */
106   virtual std::string GetDescriptionRaw();
107
108   /**
109    * @copydoc Dali::Accessibility::Accessible::GetParent()
110    */
111   Dali::Accessibility::Accessible* GetParent() override;
112
113   /**
114    * @copydoc Dali::Accessibility::Accessible::GetChildCount()
115    */
116   size_t GetChildCount() override;
117
118   /**
119    * @copydoc Dali::Accessibility::Accessible::GetChildAtIndex()
120    */
121   Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override;
122
123   /**
124    * @copydoc Dali::Accessibility::Accessible::GetIndexInParent()
125    */
126   size_t GetIndexInParent() override;
127
128   /**
129    * @copydoc Dali::Accessibility::Accessible::GetRole()
130    */
131   Dali::Accessibility::Role GetRole() override;
132
133   /**
134    * @copydoc Dali::Accessibility::Accessible::GetLocalizedRoleName()
135    */
136   std::string GetLocalizedRoleName() override;
137
138   /**
139    * @copydoc Dali::Accessibility::Accessible::GetStates()
140    */
141   Dali::Accessibility::States GetStates() override;
142
143   /**
144    * @copydoc Dali::Accessibility::Accessible::GetAttributes()
145    */
146   Dali::Accessibility::Attributes GetAttributes() override;
147
148   /**
149    * @copydoc Dali::Accessibility::Component::GetExtents()
150    */
151   Dali::Rect<> GetExtents(Accessibility::CoordinateType type) override;
152
153   /**
154    * @copydoc Dali::Accessibility::Component::GetLayer()
155    */
156   Dali::Accessibility::ComponentLayer GetLayer() override;
157
158   /**
159    * @copydoc Dali::Accessibility::Component::GetMdiZOrder()
160    */
161   int16_t GetMdiZOrder() override;
162
163   /**
164    * @copydoc Dali::Accessibility::Component::GrabFocus()
165    */
166   bool GrabFocus() override;
167
168   /**
169    * @copydoc Dali::Accessibility::Component::GetAlpha()
170    */
171   double GetAlpha() override;
172
173   /**
174    * @copydoc Dali::Accessibility::Component::GrabHighlight()
175    */
176   bool GrabHighlight() override;
177
178   /**
179    * @copydoc Dali::Accessibility::Component::ClearHighlight()
180    */
181   bool ClearHighlight() override;
182
183   /**
184    * @copydoc Dali::Accessibility::Action::GetActionName()
185    */
186   std::string GetActionName(size_t index) override;
187
188   /**
189    * @copydoc Dali::Accessibility::Action::GetLocalizedActionName()
190    */
191   std::string GetLocalizedActionName(size_t index) override;
192
193   /**
194    * @copydoc Dali::Accessibility::Action::GetActionDescription()
195    */
196   std::string GetActionDescription(size_t index) override;
197
198   /**
199    * @copydoc Dali::Accessibility::Action::GetActionCount()
200    */
201   size_t GetActionCount() override;
202
203   /**
204    * @copydoc Dali::Accessibility::Action::GetActionKeyBinding()
205    */
206   std::string GetActionKeyBinding(size_t index) override;
207
208   /**
209    * @copydoc Dali::Accessibility::Action::DoAction(size_t)
210    */
211   bool DoAction(size_t index) override;
212
213   /**
214    * @copydoc Dali::Accessibility::Action::DoAction(const std::string&)
215    */
216   bool DoAction(const std::string& name) override;
217
218   /**
219    * @copydoc Dali::Accessibility::Accessible::DoGesture()
220    */
221   bool DoGesture(const Dali::Accessibility::GestureInfo& gestureInfo) override;
222
223   /**
224    * @copydoc Dali::Accessibility::Accessible::GetRelationSet()
225    */
226   std::vector<Dali::Accessibility::Relation> GetRelationSet() override;
227
228   /**
229    * @copydoc Dali::Accessibility::Accessible::GetInternalActor()
230    */
231   Dali::Actor GetInternalActor() override;
232
233   /**
234    * @copydoc Dali::Accessibility::Accessible::GetStates()
235    */
236   virtual Dali::Accessibility::States CalculateStates();
237
238   /**
239    * @brief Makes sure that a given child (descendant) of this container (e.g. ItemView) is visible
240    * @return false if scrolling is not supported or child is already visible
241    */
242   virtual bool ScrollToChild(Actor child);
243
244   /**
245    * @brief Returns the index of the property that represents this actor's name
246    */
247   virtual Dali::Property::Index GetNamePropertyIndex();
248
249   /**
250    * @brief Returns the index of the property that represents this actor's description
251    */
252   virtual Dali::Property::Index GetDescriptionPropertyIndex();
253
254   /**
255    * @brief Sets last object position
256    * @param[in] position Last object position
257    */
258   void SetLastPosition(Vector2 position);
259
260   /**
261    * @brief Gets last object position
262    * @return The Last object position
263    */
264   Vector2 GetLastPosition() const;
265 };
266
267 } // namespace Dali::Toolkit::DevelControl
268
269 #endif // DALI_TOOLKIT_ACCESSIBLE_IMPL_H