[AT-SPI] Introduce AtspiEvents
[platform/core/uifw/dali-adaptor.git] / dali / devel-api / adaptor-framework / accessibility.h
index 1d4b8e6..f3576c6 100644 (file)
  */\r
 \r
 // EXTERNAL INCLUDES\r
-\r
-#include <string.h>\r
-#include <array>\r
-#include <atomic>\r
-#include <bitset>\r
-#include <cassert>\r
-#include <exception>\r
-#include <functional>\r
-#include <list>\r
-#include <map>\r
-#include <memory>\r
-#include <sstream>\r
 #include <string>\r
 #include <unordered_map>\r
 #include <vector>\r
 \r
 // INTERNAL INCLUDES\r
+#include <dali/devel-api/adaptor-framework/accessibility-bitset.h>\r
 #include <dali/public-api/dali-adaptor-common.h>\r
 \r
 namespace Dali\r
@@ -435,203 +424,112 @@ enum class ReadingInfoType
   NAME,\r
   ROLE,\r
   DESCRIPTION,\r
-  STATE\r
+  STATE,\r
+  MAX_COUNT\r
 };\r
 \r
 /**\r
- * @brief Helper class for storing values treated as bit sets\r
- * This class provides all bitset-like methods for bitset size larger, than long long int\r
- * @see Dali::Accessibility::Accessible::GetStates\r
- * @see Dali::Accessibility::Accessible::GetRoles\r
+ * @brief Enumeration of all AT-SPI interfaces.\r
+ *\r
+ * @see Dali::Accessibility::Accessible::GetInterfaceName()\r
+ * @see Dali::Accessibility::AtspiInterfaceType\r
  */\r
-template<size_t I, typename S>\r
-class BitSets\r
+enum class AtspiInterface\r
 {\r
-  std::array<uint32_t, I> mData;\r
-\r
-  void Set()\r
-  {\r
-  }\r
-\r
-  static constexpr bool Accepts()\r
-  {\r
-    return true;\r
-  }\r
-\r
-  template<typename T>\r
-  static constexpr bool Accepts()\r
-  {\r
-    return std::is_enum<T>::value;\r
-  }\r
-\r
-  template<typename T, typename T2, typename... ARGS>\r
-  static constexpr bool Accepts()\r
-  {\r
-    return std::is_enum<T>::value && Accepts<T2, ARGS...>();\r
-  }\r
-\r
-  template<typename T, typename... ARGS>\r
-  void Set(T t, ARGS... args)\r
-  {\r
-    (*this)[t] = true;\r
-    Set(args...);\r
-  }\r
-\r
-public:\r
-  BitSets()\r
-  {\r
-    for(auto& u : mData)\r
-    {\r
-      u = 0;\r
-    }\r
-  }\r
-  BitSets(const BitSets&) = default;\r
-  BitSets(BitSets&&)      = default;\r
-\r
-  template<typename T, typename... ARGS, typename std::enable_if<Accepts<T, ARGS...>()>::type* = nullptr>\r
-  BitSets(T t, ARGS... args)\r
-  {\r
-    for(auto& u : mData)\r
-    {\r
-      u = 0;\r
-    }\r
-    Set(t, args...);\r
-  }\r
-\r
-  explicit BitSets(std::array<uint32_t, I> d)\r
-  {\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      mData[i] = d[i];\r
-    }\r
-  }\r
-\r
-  explicit BitSets(std::array<int32_t, I> d)\r
-  {\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      mData[i] = static_cast<uint32_t>(d[i]);\r
-    }\r
-  }\r
-\r
-  BitSets& operator=(const BitSets&) = default;\r
-  BitSets& operator=(BitSets&&) = default;\r
-\r
-  struct Reference\r
-  {\r
-    std::array<uint32_t, I>& data;\r
-    size_t                   pos;\r
-\r
-    Reference& operator=(Reference r)\r
-    {\r
-      (*this) = static_cast<bool>(r);\r
-      return *this;\r
-    }\r
-\r
-    Reference& operator=(bool v)\r
-    {\r
-      if(v)\r
-      {\r
-        data[pos / 32] |= 1 << (pos & 31);\r
-      }\r
-      else\r
-      {\r
-        data[pos / 32] &= ~(1 << (pos & 31));\r
-      }\r
-      return *this;\r
-    }\r
-\r
-    operator bool() const\r
-    {\r
-      auto i = static_cast<size_t>(pos);\r
-      return (data[i / 32] & (1 << (i & 31))) != 0;\r
-    }\r
-  }; // Reference struct\r
-\r
-  Reference operator[](S index)\r
-  {\r
-    return {mData, static_cast<size_t>(index)};\r
-  }\r
-\r
-  bool operator[](S index) const\r
-  {\r
-    auto i = static_cast<size_t>(index);\r
-    return (mData[i / 32] & (1 << (i & 31))) != 0;\r
-  }\r
-\r
-  std::array<uint32_t, I> GetRawData() const\r
-  {\r
-    return mData;\r
-  }\r
-\r
-  BitSets operator|(BitSets b) const\r
-  {\r
-    BitSets r;\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      r.mData[i] = mData[i] | b.mData[i];\r
-    }\r
-    return r;\r
-  }\r
-\r
-  BitSets operator^(BitSets b) const\r
-  {\r
-    BitSets r;\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      r.mData[i] = mData[i] ^ b.mData[i];\r
-    }\r
-    return r;\r
-  }\r
-\r
-  BitSets operator&(BitSets b) const\r
-  {\r
-    BitSets r;\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      r.mData[i] = mData[i] & b.mData[i];\r
-    }\r
-    return r;\r
-  }\r
+  ACCESSIBLE,\r
+  ACTION,\r
+  APPLICATION,\r
+  CACHE,\r
+  COLLECTION,\r
+  COMPONENT,\r
+  DEVICE_EVENT_CONTROLLER,\r
+  DEVICE_EVENT_LISTENER,\r
+  DOCUMENT,\r
+  EDITABLE_TEXT,\r
+  EVENT_DOCUMENT,\r
+  EVENT_FOCUS,\r
+  EVENT_KEYBOARD,\r
+  EVENT_MOUSE,\r
+  EVENT_OBJECT,\r
+  EVENT_TERMINAL,\r
+  EVENT_WINDOW,\r
+  HYPERLINK,\r
+  HYPERTEXT,\r
+  IMAGE,\r
+  REGISTRY,\r
+  SELECTION,\r
+  SOCKET,\r
+  TABLE,\r
+  TABLE_CELL,\r
+  TEXT,\r
+  VALUE,\r
+  MAX_COUNT\r
+};\r
 \r
-  bool operator==(BitSets b) const\r
-  {\r
-    for(auto i = 0u; i < I; ++i)\r
-    {\r
-      if(mData[i] != b.mData[i])\r
-      {\r
-        return false;\r
-      }\r
-    }\r
-    return true;\r
-  }\r
+/**\r
+ * @brief Enumeration of all AT-SPI events.\r
+ */\r
+enum class AtspiEvent\r
+{\r
+  PROPERTY_CHANGED,\r
+  BOUNDS_CHANGED,\r
+  LINK_SELECTED,\r
+  STATE_CHANGED,\r
+  CHILDREN_CHANGED,\r
+  VISIBLE_DATA_CHANGED,\r
+  SELECTION_CHANGED,\r
+  MODEL_CHANGED,\r
+  ACTIVE_DESCENDANT_CHANGED,\r
+  ROW_INSERTED,\r
+  ROW_REORDERED,\r
+  ROW_DELETED,\r
+  COLUMN_INSERTED,\r
+  COLUMN_REORDERED,\r
+  COLUMN_DELETED,\r
+  TEXT_BOUNDS_CHANGED,\r
+  TEXT_SELECTION_CHANGED,\r
+  TEXT_CHANGED,\r
+  TEXT_ATTRIBUTES_CHANGED,\r
+  TEXT_CARET_MOVED,\r
+  ATTRIBUTES_CHANGED,\r
+  MOVED_OUT,\r
+  WINDOW_CHANGED,\r
+  MAX_COUNT\r
+};\r
 \r
-  bool operator!=(BitSets b) const\r
-  {\r
-    return !((*this) == b);\r
-  }\r
+using AtspiInterfaces   = EnumBitSet<AtspiInterface, AtspiInterface::MAX_COUNT>;\r
+using AtspiEvents       = EnumBitSet<AtspiEvent, AtspiEvent::MAX_COUNT>;\r
+using ReadingInfoTypes  = EnumBitSet<ReadingInfoType, ReadingInfoType::MAX_COUNT>;\r
+using States            = EnumBitSet<State, State::MAX_COUNT>;\r
+using Attributes        = std::unordered_map<std::string, std::string>;\r
 \r
-  explicit operator bool() const\r
-  {\r
-    for(auto& u : mData)\r
-    {\r
-      if(u)\r
-      {\r
-        return true;\r
-      }\r
-    }\r
-    return false;\r
-  }\r
+namespace Internal\r
+{\r
+/*\r
+ * AT-SPI interfaces exposed as native C++ types should specialize this like so:\r
+ *\r
+ * template<>\r
+ * struct AtspiInterfaceTypeHelper<AtspiInterface::ACCESSIBLE>\r
+ * {\r
+ *   using Type = Dali::Accessibility::Accessible;\r
+ * };\r
+ */\r
+template<AtspiInterface I>\r
+struct AtspiInterfaceTypeHelper; // no default definition\r
 \r
-  size_t size() const\r
-  {\r
-    return I;\r
-  }\r
-}; // BitSets class\r
+} // namespace Internal\r
 \r
-using ReadingInfoTypes = BitSets<1, ReadingInfoType>;\r
-using States           = BitSets<2, State>;\r
-using Attributes       = std::unordered_map<std::string, std::string>;\r
+/**\r
+ * @brief Resolves to the native C++ type that represents the given AT-SPI interface.\r
+ *\r
+ * For example, @code AtspiInterfaceType<AtspiInterface::ACCESSIBLE> @endcode is the same as\r
+ * @code Dali::Accessibility::Accessible @endcode. Not all AT-SPI interfaces have native C++\r
+ * representations (in which case, such an expression will not compile).\r
+ *\r
+ * @tparam I Enumeration value indicating the requested AT-SPI interface.\r
+ */\r
+template<AtspiInterface I>\r
+using AtspiInterfaceType = typename Internal::AtspiInterfaceTypeHelper<I>::Type;\r
 \r
 /**\r
  * @brief Class representing unique object address on accessibility bus\r