The JUCE cross-platform C++ framework, with DISTRHO/KXStudio specific changes
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 lines
5.2KB

  1. /*
  2. ==============================================================================
  3. This file is part of the JUCE library.
  4. Copyright (c) 2022 - Raw Material Software Limited
  5. JUCE is an open source library subject to commercial or open-source
  6. licensing.
  7. By using JUCE, you agree to the terms of both the JUCE 7 End-User License
  8. Agreement and JUCE Privacy Policy.
  9. End User License Agreement: www.juce.com/juce-7-licence
  10. Privacy Policy: www.juce.com/juce-privacy-policy
  11. Or: You may also use this code under the terms of the GPL v3 (see
  12. www.gnu.org/licenses).
  13. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
  14. EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
  15. DISCLAIMED.
  16. ==============================================================================
  17. */
  18. namespace juce
  19. {
  20. //==============================================================================
  21. class UIAGridProvider : public UIAProviderBase,
  22. public ComBaseClassHelper<ComTypes::IGridProvider, ComTypes::ITableProvider>
  23. {
  24. public:
  25. using UIAProviderBase::UIAProviderBase;
  26. //==============================================================================
  27. JUCE_COMRESULT GetItem (int row, int column, IRawElementProviderSimple** pRetVal) override
  28. {
  29. return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)
  30. {
  31. if (! isPositiveAndBelow (row, tableInterface.getNumRows())
  32. || ! isPositiveAndBelow (column, tableInterface.getNumColumns()))
  33. return E_INVALIDARG;
  34. JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")
  35. if (auto* cellHandler = tableInterface.getCellHandler (row, column))
  36. {
  37. cellHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));
  38. return S_OK;
  39. }
  40. if (auto* rowHandler = tableInterface.getRowHandler (row))
  41. {
  42. rowHandler->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (pRetVal));
  43. return S_OK;
  44. }
  45. JUCE_END_IGNORE_WARNINGS_GCC_LIKE
  46. return E_FAIL;
  47. });
  48. }
  49. JUCE_COMRESULT get_RowCount (int* pRetVal) override
  50. {
  51. return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)
  52. {
  53. *pRetVal = tableInterface.getNumRows();
  54. return S_OK;
  55. });
  56. }
  57. JUCE_COMRESULT get_ColumnCount (int* pRetVal) override
  58. {
  59. return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)
  60. {
  61. *pRetVal = tableInterface.getNumColumns();
  62. return S_OK;
  63. });
  64. }
  65. JUCE_COMRESULT GetRowHeaders (SAFEARRAY**) override
  66. {
  67. return (HRESULT) UIA_E_NOTSUPPORTED;
  68. }
  69. JUCE_COMRESULT GetColumnHeaders (SAFEARRAY** pRetVal) override
  70. {
  71. return withTableInterface (pRetVal, [&] (const AccessibilityTableInterface& tableInterface)
  72. {
  73. if (auto* header = tableInterface.getHeaderHandler())
  74. {
  75. const auto children = header->getChildren();
  76. *pRetVal = SafeArrayCreateVector (VT_UNKNOWN, 0, (ULONG) children.size());
  77. LONG index = 0;
  78. for (const auto& child : children)
  79. {
  80. IRawElementProviderSimple* provider = nullptr;
  81. JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wlanguage-extension-token")
  82. if (child != nullptr)
  83. child->getNativeImplementation()->QueryInterface (IID_PPV_ARGS (&provider));
  84. JUCE_END_IGNORE_WARNINGS_GCC_LIKE
  85. if (provider == nullptr)
  86. return E_FAIL;
  87. const auto hr = SafeArrayPutElement (*pRetVal, &index, provider);
  88. if (FAILED (hr))
  89. return E_FAIL;
  90. ++index;
  91. }
  92. return S_OK;
  93. }
  94. return (HRESULT) UIA_E_NOTSUPPORTED;
  95. });
  96. }
  97. JUCE_COMRESULT get_RowOrColumnMajor (ComTypes::RowOrColumnMajor* pRetVal) override
  98. {
  99. *pRetVal = ComTypes::RowOrColumnMajor_RowMajor;
  100. return S_OK;
  101. }
  102. private:
  103. template <typename Value, typename Callback>
  104. JUCE_COMRESULT withTableInterface (Value* pRetVal, Callback&& callback) const
  105. {
  106. return withCheckedComArgs (pRetVal, *this, [&]() -> HRESULT
  107. {
  108. if (auto* tableHandler = getEnclosingHandlerWithInterface (&getHandler(), &AccessibilityHandler::getTableInterface))
  109. if (auto* tableInterface = tableHandler->getTableInterface())
  110. return callback (*tableInterface);
  111. return (HRESULT) UIA_E_NOTSUPPORTED;
  112. });
  113. }
  114. //==============================================================================
  115. JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UIAGridProvider)
  116. };
  117. } // namespace juce