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/internal/accessibility/bridge/accessibility-common.h>
22 #include <third-party/libunibreak/linebreak.h>
23 #include <third-party/libunibreak/wordbreak.h>
25 using namespace Dali::Accessibility;
27 std::vector<std::string> Accessible::GetInterfaces()
29 std::vector<std::string> tmp;
30 tmp.push_back(AtspiDbusInterfaceAccessible);
31 if(dynamic_cast<Collection*>(this))
33 tmp.push_back(AtspiDbusInterfaceCollection);
35 if(dynamic_cast<Text*>(this))
37 tmp.push_back(AtspiDbusInterfaceText);
39 if(dynamic_cast<EditableText*>(this))
41 tmp.push_back(AtspiDbusInterfaceEditableText);
43 if(dynamic_cast<Value*>(this))
45 tmp.push_back(AtspiDbusInterfaceValue);
47 if(dynamic_cast<Component*>(this))
49 tmp.push_back(AtspiDbusInterfaceComponent);
51 if(auto action = dynamic_cast<Action*>(this))
53 if(action->GetActionCount() > 0)
55 tmp.push_back(AtspiDbusInterfaceAction);
58 if(dynamic_cast<Selection*>(this))
60 tmp.push_back(AtspiDbusInterfaceSelection);
62 if(dynamic_cast<Hypertext*>(this))
64 tmp.push_back(AtspiDbusInterfaceHypertext);
66 if(dynamic_cast<Hyperlink*>(this))
68 tmp.push_back(AtspiDbusInterfaceHyperlink);
73 Accessible::Accessible()
77 Accessible::~Accessible()
79 auto handle = mBridgeData.lock();
82 handle->mKnownObjects.erase(this);
86 void Accessible::EmitActiveDescendantChanged(Accessible* obj, Accessible* child)
88 if(auto bridgeData = GetBridgeData())
90 bridgeData->mBridge->EmitActiveDescendantChanged(obj, child);
94 void Accessible::EmitStateChanged(State state, int newValue, int reserved)
96 if(auto bridgeData = GetBridgeData())
98 bridgeData->mBridge->EmitStateChanged(this, state, newValue, reserved);
102 void Accessible::EmitShowing(bool isShowing)
104 if(auto bridgeData = GetBridgeData())
106 bridgeData->mBridge->EmitStateChanged(this, State::SHOWING, isShowing ? 1 : 0, 0);
110 void Accessible::EmitVisible(bool isVisible)
112 if(auto bridgeData = GetBridgeData())
114 bridgeData->mBridge->EmitStateChanged(this, State::VISIBLE, isVisible ? 1 : 0, 0);
118 void Accessible::EmitHighlighted(bool isHighlighted)
120 if(auto bridgeData = GetBridgeData())
122 bridgeData->mBridge->EmitStateChanged(this, State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
126 void Accessible::EmitFocused(bool isFocused)
128 if(auto bridgeData = GetBridgeData())
130 bridgeData->mBridge->EmitStateChanged(this, State::FOCUSED, isFocused ? 1 : 0, 0);
133 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
135 if(auto bridgeData = GetBridgeData())
137 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
140 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
142 if(auto bridgeData = GetBridgeData())
144 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
147 void Accessible::EmitTextCursorMoved(unsigned int cursorPosition)
149 if(auto bridgeData = GetBridgeData())
151 bridgeData->mBridge->EmitCursorMoved(this, cursorPosition);
155 void Accessible::EmitMovedOutOfScreen(ScreenRelativeMoveType type)
157 if(auto bridgeData = GetBridgeData())
159 bridgeData->mBridge->EmitMovedOutOfScreen(this, type);
163 void Accessible::Emit(WindowEvent event, unsigned int detail)
165 if(auto bridgeData = GetBridgeData())
167 bridgeData->mBridge->Emit(this, event, detail);
170 void Accessible::Emit(ObjectPropertyChangeEvent event)
172 if(auto bridgeData = GetBridgeData())
174 bridgeData->mBridge->Emit(this, event);
178 void Accessible::EmitBoundsChanged(Rect<> rect)
180 if(auto bridgeData = GetBridgeData())
182 bridgeData->mBridge->EmitBoundsChanged(this, rect);
186 std::vector<Accessible*> Accessible::GetChildren()
188 std::vector<Accessible*> tmp(GetChildCount());
189 for(auto i = 0u; i < tmp.size(); ++i)
191 tmp[i] = GetChildAtIndex(i);
196 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData()
198 auto handle = mBridgeData.lock();
201 auto bridge = Bridge::GetCurrentBridge();
202 handle = bridge->mData;
207 Address Accessible::GetAddress()
209 auto handle = mBridgeData.lock();
212 handle = GetBridgeData();
215 handle->mBridge->RegisterOnBridge(this);
218 std::ostringstream tmp;
220 return {handle ? handle->mBusName : "", tmp.str()};
223 void Bridge::RegisterOnBridge(Accessible* object)
225 assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
226 if(!object->mBridgeData.lock())
229 mData->mKnownObjects.insert(object);
230 object->mBridgeData = mData;
234 bool Accessible::IsProxy()
239 Accessible* Accessible::GetDefaultLabel()
244 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
246 if(auto data = GetBridgeData())
248 auto currentState = GetStates() & states;
249 for(auto i = 0u; i < currentState.size(); i++)
251 auto index = static_cast<Dali::Accessibility::State>(i);
252 if(currentState[index])
254 data->mBridge->EmitStateChanged(this, index, 1, 0);
260 auto children = GetChildren();
261 for(auto iter : children)
263 iter->NotifyAccessibilityStateChange(states, isRecursive);
269 void Accessible::FindWordSeparationsUtf8(const utf8_t* string, size_t length, const char* language, char* breaks)
271 set_wordbreaks_utf8(string, length, language, breaks);
274 void Accessible::FindLineSeparationsUtf8(const utf8_t* string, size_t length, const char* language, char* breaks)
276 set_linebreaks_utf8(string, length, language, breaks);