X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Faccessibility%2Fbridge%2Fbridge-base.h;h=bf2a22c41f66479ee7576dc16acbba0d8ed3b551;hb=74834c6a17f4fa7e01610a33107e8591d1586836;hp=62a00943e9f2fc01ccf2817055bc24be5b84a29b;hpb=6fe31dbd1820f16a125b239715f0b7310df62fad;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/accessibility/bridge/bridge-base.h b/dali/internal/accessibility/bridge/bridge-base.h index 62a0094..bf2a22c 100644 --- a/dali/internal/accessibility/bridge/bridge-base.h +++ b/dali/internal/accessibility/bridge/bridge-base.h @@ -19,32 +19,35 @@ */ // EXTERNAL INCLUDES +#include #include #include -#include #include // INTERNAL INCLUDES +#include #include +#include +#include +#include #include /** - * @brief The AppAccessible class is to define Accessibility Application. + * @brief The ApplicationAccessible class is to define Accessibility Application. */ -class AppAccessible : public virtual Dali::Accessibility::Accessible, public virtual Dali::Accessibility::Collection, public virtual Dali::Accessibility::Application +class ApplicationAccessible : public virtual Dali::Accessibility::Accessible, public virtual Dali::Accessibility::Collection, public virtual Dali::Accessibility::Application { public: - Dali::Accessibility::EmptyAccessibleWithAddress mParent; - std::vector mChildren; - std::vector mWindows; - std::string mName; + Dali::Accessibility::ProxyAccessible mParent; + std::vector mChildren; + std::string mName; - std::string GetName() override + std::string GetName() const override { return mName; } - std::string GetDescription() override + std::string GetDescription() const override { return ""; } @@ -54,11 +57,16 @@ public: return &mParent; } - size_t GetChildCount() override + size_t GetChildCount() const override { return mChildren.size(); } + std::vector GetChildren() override + { + return mChildren; + } + Dali::Accessibility::Accessible* GetChildAtIndex(size_t index) override { auto size = mChildren.size(); @@ -74,7 +82,7 @@ public: throw std::domain_error{"can't call GetIndexInParent on application object"}; } - Dali::Accessibility::Role GetRole() override + Dali::Accessibility::Role GetRole() const override { return Dali::Accessibility::Role::APPLICATION; } @@ -84,7 +92,7 @@ public: return {}; } - Dali::Accessibility::Attributes GetAttributes() override + Dali::Accessibility::Attributes GetAttributes() const override { return {}; } @@ -133,17 +141,17 @@ public: return Dali::Actor{}; } - Dali::Accessibility::Address GetAddress() override + Dali::Accessibility::Address GetAddress() const override { return {"", "root"}; } - std::string GetToolkitName() override + std::string GetToolkitName() const override { return {"dali"}; } - std::string GetVersion() override + std::string GetVersion() const override { return std::to_string(Dali::ADAPTOR_MAJOR_VERSION) + "." + std::to_string(Dali::ADAPTOR_MINOR_VERSION); } @@ -227,14 +235,22 @@ public: void RemoveTopLevelWindow(Dali::Accessibility::Accessible* windowAccessible) override; /** - * @copydoc Dali::Accessibility::Bridge::AddPopup() + * @copydoc Dali::Accessibility::Bridge::RegisterDefaultLabel() + */ + void RegisterDefaultLabel(Dali::Accessibility::Accessible* object) override; + + /** + * @copydoc Dali::Accessibility::Bridge::UnregisterDefaultLabel() */ - void AddPopup(Dali::Accessibility::Accessible* object) override; + void UnregisterDefaultLabel(Dali::Accessibility::Accessible* object) override; /** - * @copydoc Dali::Accessibility::Bridge::RemovePopup() + * @copydoc Dali::Accessibility::Bridge::GetDefaultLabel() */ - void RemovePopup(Dali::Accessibility::Accessible* object) override; + Dali::Accessibility::Accessible* GetDefaultLabel() const override + { + return mDefaultLabels.empty() ? nullptr : mDefaultLabels.back(); + } /** * @copydoc Dali::Accessibility::Bridge::GetApplication() @@ -408,14 +424,52 @@ public: /** * @brief Returns the target object of the currently executed DBus method call. * - * And any subclasses redefine `FindSelf` with a different return type as a convenient wrapper around dynamic_cast. * @return The Accessible object * @note When a DBus method is called on some object, this target object (`currentObject`) is temporarily saved by the bridge, * because DBus handles the invocation target separately from the method arguments. * We then use the saved object inside the 'glue' method (e.g. BridgeValue::GetMinimum) * to call the equivalent method on the respective C++ object (this could be ScrollBar::AccessibleImpl::GetMinimum in the example given). */ - Dali::Accessibility::Accessible* FindSelf() const; + Dali::Accessibility::Accessible* FindCurrentObject() const; + + /** + * @brief Returns the target object of the currently executed DBus method call. + * + * This method tries to downcast the return value of FindCurrentObject() to the requested type, + * issuing an error reply to the DBus caller if the requested type is not implemented. Whether + * a given type is implemented is decided based on the return value of Accessible::GetInterfaces() + * for the current object. + * + * @tparam I The requested AT-SPI interface + * @return The Accessible object (cast to a more derived type) + * + * @see FindCurrentObject() + * @see Dali::Accessibility::AtspiInterface + * @see Dali::Accessibility::AtspiInterfaceType + * @see Dali::Accessibility::Accessible::GetInterfaces() + */ + template + auto* FindCurrentObjectWithInterface() const + { + using Type = Dali::Accessibility::AtspiInterfaceType; + + Type* result; + auto* currentObject = FindCurrentObject(); + DALI_ASSERT_DEBUG(currentObject); // FindCurrentObject() throws domain_error + + if(!(result = Dali::Accessibility::Accessible::DownCast(currentObject))) + { + std::stringstream s; + + s << "Object " << currentObject->GetAddress().ToString(); + s << " does not implement "; + s << Dali::Accessibility::Accessible::GetInterfaceName(I); + + throw std::domain_error{s.str()}; + } + + return result; + } /** * @copydoc Dali::Accessibility::Bridge::FindByPath() @@ -431,11 +485,11 @@ public: } protected: - mutable AppAccessible mApplication; - std::vector mPopups; + mutable ApplicationAccessible mApplication; + std::vector mDefaultLabels; + bool mIsScreenReaderSuppressed = false; private: - /** * @brief Sets an ID. * @param[in] id An ID (integer value)