2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
21 #include <dali/devel-api/atspi-interfaces/accessible.h>
22 #include <dali/devel-api/atspi-interfaces/action.h>
23 #include <dali/devel-api/atspi-interfaces/application.h>
24 #include <dali/devel-api/atspi-interfaces/collection.h>
25 #include <dali/devel-api/atspi-interfaces/component.h>
26 #include <dali/devel-api/atspi-interfaces/editable-text.h>
27 #include <dali/devel-api/atspi-interfaces/hyperlink.h>
28 #include <dali/devel-api/atspi-interfaces/hypertext.h>
29 #include <dali/devel-api/atspi-interfaces/selection.h>
30 #include <dali/devel-api/atspi-interfaces/text.h>
31 #include <dali/devel-api/atspi-interfaces/value.h>
32 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
33 #include <dali/internal/accessibility/bridge/accessibility-common.h>
34 #include <third-party/libunibreak/linebreak.h>
35 #include <third-party/libunibreak/wordbreak.h>
37 using namespace Dali::Accessibility;
39 std::vector<std::string> Accessible::GetInterfaces()
41 std::vector<std::string> tmp;
42 tmp.push_back(AtspiDbusInterfaceAccessible);
43 if(dynamic_cast<Collection*>(this))
45 tmp.push_back(AtspiDbusInterfaceCollection);
47 if(dynamic_cast<Text*>(this))
49 tmp.push_back(AtspiDbusInterfaceText);
51 if(dynamic_cast<EditableText*>(this))
53 tmp.push_back(AtspiDbusInterfaceEditableText);
55 if(dynamic_cast<Value*>(this))
57 tmp.push_back(AtspiDbusInterfaceValue);
59 if(dynamic_cast<Component*>(this))
61 tmp.push_back(AtspiDbusInterfaceComponent);
63 if(auto action = dynamic_cast<Action*>(this))
65 if(action->GetActionCount() > 0)
67 tmp.push_back(AtspiDbusInterfaceAction);
70 if(dynamic_cast<Selection*>(this))
72 tmp.push_back(AtspiDbusInterfaceSelection);
74 if(dynamic_cast<Hypertext*>(this))
76 tmp.push_back(AtspiDbusInterfaceHypertext);
78 if(dynamic_cast<Hyperlink*>(this))
80 tmp.push_back(AtspiDbusInterfaceHyperlink);
85 Accessible::Accessible()
89 Accessible::~Accessible()
91 auto handle = mBridgeData.lock();
94 handle->mKnownObjects.erase(this);
98 void Accessible::EmitActiveDescendantChanged(Accessible* obj, Accessible* child)
100 if(auto bridgeData = GetBridgeData())
102 bridgeData->mBridge->EmitActiveDescendantChanged(obj, child);
106 void Accessible::EmitStateChanged(State state, int newValue, int reserved)
108 if(auto bridgeData = GetBridgeData())
110 bridgeData->mBridge->EmitStateChanged(this, state, newValue, reserved);
114 void Accessible::EmitShowing(bool isShowing)
116 if(auto bridgeData = GetBridgeData())
118 bridgeData->mBridge->EmitStateChanged(this, State::SHOWING, isShowing ? 1 : 0, 0);
122 void Accessible::EmitVisible(bool isVisible)
124 if(auto bridgeData = GetBridgeData())
126 bridgeData->mBridge->EmitStateChanged(this, State::VISIBLE, isVisible ? 1 : 0, 0);
130 void Accessible::EmitHighlighted(bool isHighlighted)
132 if(auto bridgeData = GetBridgeData())
134 bridgeData->mBridge->EmitStateChanged(this, State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
138 void Accessible::EmitFocused(bool isFocused)
140 if(auto bridgeData = GetBridgeData())
142 bridgeData->mBridge->EmitStateChanged(this, State::FOCUSED, isFocused ? 1 : 0, 0);
145 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
147 if(auto bridgeData = GetBridgeData())
149 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
152 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
154 if(auto bridgeData = GetBridgeData())
156 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
159 void Accessible::EmitTextCursorMoved(unsigned int cursorPosition)
161 if(auto bridgeData = GetBridgeData())
163 bridgeData->mBridge->EmitCursorMoved(this, cursorPosition);
167 void Accessible::EmitMovedOutOfScreen(ScreenRelativeMoveType type)
169 if(auto bridgeData = GetBridgeData())
171 bridgeData->mBridge->EmitMovedOutOfScreen(this, type);
175 void Accessible::Emit(WindowEvent event, unsigned int detail)
177 if(auto bridgeData = GetBridgeData())
179 bridgeData->mBridge->Emit(this, event, detail);
182 void Accessible::Emit(ObjectPropertyChangeEvent event)
184 if(auto bridgeData = GetBridgeData())
186 bridgeData->mBridge->Emit(this, event);
190 void Accessible::EmitBoundsChanged(Rect<> rect)
192 if(auto bridgeData = GetBridgeData())
194 bridgeData->mBridge->EmitBoundsChanged(this, rect);
198 std::vector<Accessible*> Accessible::GetChildren()
200 std::vector<Accessible*> tmp(GetChildCount());
201 for(auto i = 0u; i < tmp.size(); ++i)
203 tmp[i] = GetChildAtIndex(i);
208 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData()
210 auto handle = mBridgeData.lock();
213 auto bridge = Bridge::GetCurrentBridge();
214 handle = bridge->mData;
219 Address Accessible::GetAddress()
221 auto handle = mBridgeData.lock();
224 handle = GetBridgeData();
227 handle->mBridge->RegisterOnBridge(this);
230 std::ostringstream tmp;
232 return {handle ? handle->mBusName : "", tmp.str()};
235 void Bridge::RegisterOnBridge(Accessible* object)
237 assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
238 if(!object->mBridgeData.lock())
241 mData->mKnownObjects.insert(object);
242 object->mBridgeData = mData;
246 bool Accessible::IsProxy()
251 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
253 if(auto data = GetBridgeData())
255 for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
257 auto index = static_cast<Dali::Accessibility::State>(i);
260 data->mBridge->EmitStateChanged(this, index, GetStates()[index], 0);
266 auto children = GetChildren();
267 for(auto iter : children)
269 iter->NotifyAccessibilityStateChange(states, isRecursive);
275 void Accessible::FindWordSeparationsUtf8(const utf8_t* string, size_t length, const char* language, char* breaks)
277 set_wordbreaks_utf8(string, length, language, breaks);
280 void Accessible::FindLineSeparationsUtf8(const utf8_t* string, size_t length, const char* language, char* breaks)
282 set_linebreaks_utf8(string, length, language, breaks);