[Tizen][ATSPI] Accessibility initial implementation
[platform/core/uifw/dali-adaptor.git] / dali / devel-api / adaptor-framework / accessibility.h
1 #ifndef ATSPI_BRIDGE_HPP
2 #define ATSPI_BRIDGE_HPP
3
4 #include <dali/public-api/actors/actor.h>
5 #include <dali/public-api/adaptor-framework/accessibility.h>
6
7 #include <atomic>
8 #include <bitset>
9 #include <exception>
10 #include <functional>
11 #include <memory>
12 #include <string>
13 #include <unordered_map>
14 #include <vector>
15
16 namespace Dali
17 {
18 namespace Accessibility
19 {
20 class Accessible;
21 class Text;
22 class Value;
23 class Component;
24 class Collection;
25 class Action;
26
27 using ObjectsMapType = std::unordered_map< unsigned int, Accessible* >;
28
29 struct DALI_IMPORT_API Bridge
30 {
31   enum class Visibility
32   {
33     hidden,
34     thisThreadOnly,
35     allThreads
36   };
37   enum class ForceUpResult
38   {
39     justStarted,
40     alreadyUp
41   };
42   virtual ~Bridge() = default;
43
44   virtual const std::string& GetBusName() const = 0;
45   virtual void SetApplicationChild( Accessible* ) = 0;
46   virtual void SetApplicationName( std::string ) = 0;
47   virtual Accessible* GetApplication() const = 0;
48   virtual Accessible* FindByPath( const std::string& ) const = 0;
49   virtual void ApplicationShown() = 0;
50   virtual void ApplicationHidden() = 0;
51   virtual void Initialize() = 0;
52   virtual ForceUpResult ForceUp()
53   {
54     if( data )
55       return ForceUpResult::alreadyUp;
56     data = std::make_shared< Data >();
57     data->bridge = this;
58     return ForceUpResult::justStarted;
59   }
60   virtual void ForceDown()
61   {
62     data = {};
63   }
64   bool IsUp() const { return bool(data); }
65
66   virtual void EmitStateChanged( Accessible* obj, State state, int val1, int val2 = 0 ) = 0;
67   virtual void Emit( Accessible* obj, WindowEvent we, unsigned int detail1 = 0 ) = 0;
68   virtual Consumed Emit( KeyEventType type, unsigned int keyCode, const std::string& keyName, unsigned int timeStamp, bool isText ) = 0;
69   void MakePublic( Visibility );
70
71   static Bridge* GetCurrentBridge();
72
73 protected:
74   struct Data
75   {
76     ObjectsMapType objects;
77     std::atomic< unsigned int > objectId;
78     std::string busName;
79     Accessible* root = nullptr;
80     Bridge* bridge = nullptr;
81   };
82   std::shared_ptr< Data > data;
83   friend class Accessible;
84
85   void RegisterOnBridge( Accessible* );
86   void SetIsOnRootLevel( Accessible* );
87 };
88
89 inline bool IsUp()
90 {
91   return Bridge::GetCurrentBridge()->IsUp();
92 }
93
94 class DALI_IMPORT_API Accessible
95 {
96 protected:
97   Accessible();
98
99   Accessible( const Accessible& ) = delete;
100   Accessible( Accessible&& ) = delete;
101
102   Accessible& operator=( const Accessible& ) = delete;
103   Accessible& operator=( Accessible&& ) = delete;
104
105 public:
106   virtual ~Accessible();
107
108   void EmitShowing( bool showing );
109   void EmitVisible( bool visible );
110   void EmitHighlighted( bool set );
111   void Emit( WindowEvent we, unsigned int detail1 = 0 );
112
113   virtual std::string GetName() = 0;
114   virtual std::string GetDescription() = 0;
115   virtual Accessible* GetParent() = 0;
116   virtual size_t GetChildCount() = 0;
117   virtual std::vector< Accessible* > GetChildren();
118   virtual Accessible* GetChildAtIndex( size_t index ) = 0;
119   virtual size_t GetIndexInParent() = 0;
120   virtual Role GetRole() = 0;
121   virtual std::string GetRoleName();
122   virtual std::string GetLocalizedRoleName();
123   virtual States GetStates() = 0;
124   virtual Attributes GetAttributes() = 0;
125   virtual bool IsProxy();
126   virtual Address GetAddress();
127
128   std::vector< std::string > GetInterfaces();
129   bool GetIsOnRootLevel() const { return isOnRootLevel; }
130
131   static void RegisterControlAccessibilityGetter( std::function< Accessible*( Dali::Actor ) > );
132   static Accessible* Get( Dali::Actor actor );
133
134 protected:
135   std::shared_ptr< Bridge::Data > GetBridgeData();
136
137 private:
138   friend class Bridge;
139
140   std::weak_ptr< Bridge::Data > bridgeData;
141   ObjectsMapType::iterator it;
142   bool isOnRootLevel = false;
143 };
144
145 class DALI_IMPORT_API Action : public virtual Accessible
146 {
147 public:
148   virtual std::string GetActionName( size_t index ) = 0;
149   virtual std::string GetLocalizedActionName( size_t index ) = 0;
150   virtual std::string GetActionDescription( size_t index ) = 0;
151   virtual std::string GetActionKeyBinding( size_t index ) = 0;
152   virtual size_t GetActionCount() = 0;
153   virtual bool DoAction( size_t index ) = 0;
154 };
155
156 class DALI_IMPORT_API Collection : public virtual Accessible
157 {
158 public:
159 };
160
161 class DALI_IMPORT_API Component : public virtual Accessible
162 {
163 public:
164   virtual Rectangle GetExtents( CoordType ctype ) = 0;
165   virtual ComponentLayer GetLayer() = 0;
166   virtual int GetMdiZOrder() = 0;
167   virtual bool GrabFocus() = 0;
168   virtual double GetAlpha() = 0;
169   virtual bool SetExtents( Rectangle rect, CoordType ctype ) = 0;
170   virtual bool GrabHighlight() = 0;
171   virtual bool ClearHighlight() = 0;
172   virtual int GetHighlightIndex() = 0;
173   virtual bool IsScrollable();
174   virtual Component* GetAccessibleAtPoint( Point p, CoordType ctype );
175   virtual bool Contains( Point p, CoordType ctype );
176 };
177
178 class DALI_IMPORT_API Value : public virtual Accessible
179 {
180 public:
181   virtual double GetMinimum() = 0;
182   virtual double GetCurrent() = 0;
183   virtual double GetMaximum() = 0;
184   virtual bool SetCurrent( double ) = 0;
185   virtual double GetMinimumIncrement() = 0;
186 };
187
188 class DALI_IMPORT_API Text : public virtual Accessible
189 {
190 public:
191   virtual std::string GetText( size_t startOffset, size_t endOffset ) = 0;
192   virtual size_t GetCharacterCount() = 0;
193   virtual Range GetTextAtOffset( size_t offset, TextBoundary boundary ) = 0;
194   virtual Range GetSelection( size_t selectionNum ) = 0;
195   virtual bool RemoveSelection( size_t selectionNum ) = 0;
196   virtual bool SetSelection( size_t selectionNum, size_t startOffset, size_t endOffset ) = 0;
197 };
198
199 class DALI_IMPORT_API EditableText : public virtual Accessible
200 {
201 public:
202   virtual bool CopyText( size_t startPosition, size_t endPosition ) = 0;
203   virtual bool CutText( size_t startPosition, size_t endPosition ) = 0;
204 };
205
206 /**
207          * @brief minimalistic, always empty Accessible object with settable address
208          *
209          * For those situations, where you want to return address in different bridge
210          * (embedding for example), but the object itself ain't planned to be used otherwise.
211          * This object has null parent, no children, empty name and so on
212          */
213 class DALI_IMPORT_API EmptyAccessibleWithAddress : public virtual Accessible
214 {
215 public:
216   EmptyAccessibleWithAddress() = default;
217   EmptyAccessibleWithAddress( Address address ) : address( std::move( address ) ) {}
218
219   void SetAddress( Address address ) { this->address = std::move( address ); }
220
221   std::string GetName() override { return ""; }
222   std::string GetDescription() override { return ""; }
223   Accessible* GetParent() override { return nullptr; }
224   size_t GetChildCount() override { return 0; }
225   std::vector< Accessible* > GetChildren() override { return {}; }
226   Accessible* GetChildAtIndex( size_t index ) override
227   {
228     throw AccessibleError{"out of bounds index (" + std::to_string( index ) + ") - no children"};
229   }
230   size_t GetIndexInParent() override { return static_cast< size_t >( -1 ); }
231   Role GetRole() override { return {}; }
232   std::string GetRoleName() override;
233   States GetStates() override { return {}; }
234   Attributes GetAttributes() override { return {}; }
235   Address GetAddress() override
236   {
237     return address;
238   }
239
240 private:
241   Address address;
242 };
243
244 std::shared_ptr< Bridge > CreateBridge();
245 }
246 }
247
248 #endif