accessibility/source/standard/accessiblemenubasecomponent.cxx | 5 + accessibility/source/standard/accessiblemenuitemcomponent.cxx | 2 include/vcl/builder.hxx | 7 + include/vcl/menu.hxx | 4 include/vcl/vclevent.hxx | 1 vcl/source/window/builder.cxx | 42 +++++++--- vcl/source/window/menu.cxx | 30 +++++++ vcl/source/window/menuitemlist.hxx | 1 8 files changed, 78 insertions(+), 14 deletions(-)
New commits: commit 7d0279121f099aa36fcee3f0df207bdbcee75ad4 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Aug 27 10:34:36 2020 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Thu Aug 27 14:33:23 2020 +0200 tdf#136162 implement applying atk properties to gen menus Change-Id: I77dbc21910b01524d281869a83d9d12efd419bf6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101446 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/accessibility/source/standard/accessiblemenubasecomponent.cxx b/accessibility/source/standard/accessiblemenubasecomponent.cxx index 3c5cdd53c71f..4dbb71c554cf 100644 --- a/accessibility/source/standard/accessiblemenubasecomponent.cxx +++ b/accessibility/source/standard/accessiblemenubasecomponent.cxx @@ -579,6 +579,11 @@ void OAccessibleMenuBaseComponent::ProcessMenuEvent( const VclMenuEvent& rVclMen RemoveChild( nItemPos ); } break; + case VclEventId::MenuAccessibleNameChanged: + { + UpdateAccessibleName( nItemPos ); + } + break; case VclEventId::MenuItemTextChanged: { UpdateAccessibleName( nItemPos ); diff --git a/accessibility/source/standard/accessiblemenuitemcomponent.cxx b/accessibility/source/standard/accessiblemenuitemcomponent.cxx index c4e08609fe04..951d913e20c3 100644 --- a/accessibility/source/standard/accessiblemenuitemcomponent.cxx +++ b/accessibility/source/standard/accessiblemenuitemcomponent.cxx @@ -336,7 +336,7 @@ OUString OAccessibleMenuItemComponent::getAccessibleDescription( ) OUString sDescription; if ( m_pParent ) - sDescription = m_pParent->GetHelpText( m_pParent->GetItemId( m_nItemPos ) ); + sDescription = m_pParent->GetAccessibleDescription( m_pParent->GetItemId( m_nItemPos ) ); return sDescription; } diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx index c15b671cd8b2..6a642a1c7149 100644 --- a/include/vcl/builder.hxx +++ b/include/vcl/builder.hxx @@ -345,8 +345,10 @@ private: void extractStock(const OString &id, stringmap &rMap); void extractMnemonicWidget(const OString &id, stringmap &rMap); - void handleChild(vcl::Window *pParent, xmlreader::XmlReader &reader); - VclPtr<vcl::Window> handleObject(vcl::Window *pParent, xmlreader::XmlReader &reader); + // either pParent or pAtkProps must be set, pParent for a child of a widget, pAtkProps for + // collecting the atk info for a GtkMenuItem + void handleChild(vcl::Window *pParent, stringmap *pAtkProps, xmlreader::XmlReader &reader); + VclPtr<vcl::Window> handleObject(vcl::Window *pParent, stringmap *pAtkProps, xmlreader::XmlReader &reader); void handlePacking(vcl::Window *pCurrent, vcl::Window *pParent, xmlreader::XmlReader &reader); static std::vector<vcl::EnumContext::Context> handleStyle(xmlreader::XmlReader &reader, int &nPriority); static OString getStyleClass(xmlreader::XmlReader &reader); @@ -363,6 +365,7 @@ private: const OString &rClass, const OString &rID, stringmap &rProps, + stringmap &rAtkProps, accelmap &rAccels); void handleMenuChild(Menu *pParent, xmlreader::XmlReader &reader); diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx index bea9e2a39268..9522204de0b6 100644 --- a/include/vcl/menu.hxx +++ b/include/vcl/menu.hxx @@ -372,8 +372,12 @@ public: vcl::Window* GetWindow() const { return pWindow; } + void SetAccessibleName( sal_uInt16 nItemId, const OUString& rStr ); OUString GetAccessibleName( sal_uInt16 nItemId ) const; + void SetAccessibleDescription( sal_uInt16 nItemId, const OUString& rStr ); + OUString GetAccessibleDescription( sal_uInt16 nItemId ) const; + // returns whether the item a position nItemPos is highlighted or not. bool IsHighlighted( sal_uInt16 nItemPos ) const; diff --git a/include/vcl/vclevent.hxx b/include/vcl/vclevent.hxx index ad24a61740a2..a0a11c6a0870 100644 --- a/include/vcl/vclevent.hxx +++ b/include/vcl/vclevent.hxx @@ -67,6 +67,7 @@ enum class VclEventId ListboxSelect, ListboxTreeFocus, ListboxTreeSelect, + MenuAccessibleNameChanged, MenuActivate, MenuDeactivate, MenuDehighlight, diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 1b2f0aef2263..2fd07524b137 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -460,7 +460,7 @@ VclBuilder::VclBuilder(vcl::Window* pParent, const OUString& sUIDir, const OUStr { xmlreader::XmlReader reader(sUri); - handleChild(pParent, reader); + handleChild(pParent, nullptr, reader); } catch (const css::uno::Exception &rExcept) { @@ -2760,7 +2760,7 @@ bool VclBuilder::sortIntoBestTabTraversalOrder::operator()(const vcl::Window *pA return false; } -void VclBuilder::handleChild(vcl::Window *pParent, xmlreader::XmlReader &reader) +void VclBuilder::handleChild(vcl::Window *pParent, stringmap* pAtkProps, xmlreader::XmlReader &reader) { vcl::Window *pCurrentChild = nullptr; @@ -2798,7 +2798,7 @@ void VclBuilder::handleChild(vcl::Window *pParent, xmlreader::XmlReader &reader) { if (name == "object" || name == "placeholder") { - pCurrentChild = handleObject(pParent, reader).get(); + pCurrentChild = handleObject(pParent, pAtkProps, reader).get(); bool bObjectInserted = pCurrentChild && pParent != pCurrentChild; @@ -3330,6 +3330,7 @@ void VclBuilder::handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader) int nLevel = 1; stringmap aProperties; + stringmap aAtkProperties; accelmap aAccelerators; if (!sCustomProperty.isEmpty()) @@ -3348,9 +3349,10 @@ void VclBuilder::handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader) if (name == "child") { size_t nChildMenuIdx = m_aMenus.size(); - handleChild(nullptr, reader); - assert(m_aMenus.size() > nChildMenuIdx && "menu not inserted"); - pSubMenu = dynamic_cast<PopupMenu*>(m_aMenus[nChildMenuIdx].m_pMenu.get()); + handleChild(nullptr, &aAtkProperties, reader); + bool bSubMenuInserted = m_aMenus.size() > nChildMenuIdx; + if (bSubMenuInserted) + pSubMenu = dynamic_cast<PopupMenu*>(m_aMenus[nChildMenuIdx].m_pMenu.get()); } else { @@ -3371,7 +3373,7 @@ void VclBuilder::handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader) break; } - insertMenuObject(pParent, pSubMenu, sClass, sID, aProperties, aAccelerators); + insertMenuObject(pParent, pSubMenu, sClass, sID, aProperties, aAtkProperties, aAccelerators); } void VclBuilder::handleSizeGroup(xmlreader::XmlReader &reader) @@ -3468,7 +3470,7 @@ namespace } void VclBuilder::insertMenuObject(Menu *pParent, PopupMenu *pSubMenu, const OString &rClass, const OString &rID, - stringmap &rProps, accelmap &rAccels) + stringmap &rProps, stringmap &rAtkProps, accelmap &rAccels) { sal_uInt16 nOldCount = pParent->GetItemCount(); sal_uInt16 nNewId = ++m_pParserState->m_nLastMenuItemId; @@ -3527,6 +3529,19 @@ void VclBuilder::insertMenuObject(Menu *pParent, PopupMenu *pSubMenu, const OStr SAL_INFO("vcl.builder", "unhandled property: " << rKey); } + for (auto const& prop : rAtkProps) + { + const OString &rKey = prop.first; + const OUString &rValue = prop.second; + + if (rKey == "AtkObject::accessible-name") + pParent->SetAccessibleName(nNewId, rValue); + else if (rKey == "AtkObject::accessible-description") + pParent->SetAccessibleDescription(nNewId, rValue); + else + SAL_INFO("vcl.builder", "unhandled atk property: " << rKey); + } + for (auto const& accel : rAccels) { const OString &rSignal = accel.first; @@ -3568,7 +3583,7 @@ template<typename T> static bool insertItems(vcl::Window *pWindow, VclBuilder::s return true; } -VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, xmlreader::XmlReader &reader) +VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, stringmap *pAtkProps, xmlreader::XmlReader &reader) { OString sClass; OString sID; @@ -3624,8 +3639,13 @@ VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, xmlreader::Xm } else if (sClass == "AtkObject") { + assert((pParent || pAtkProps) && "must have one set"); + assert(!(pParent && pAtkProps) && "must not have both"); auto aAtkProperties = handleAtkObject(reader); - applyAtkProperties(pParent, aAtkProperties); + if (pParent) + applyAtkProperties(pParent, aAtkProperties); + if (pAtkProps) + *pAtkProps = aAtkProperties; return nullptr; } @@ -3656,7 +3676,7 @@ VclPtr<vcl::Window> VclBuilder::handleObject(vcl::Window *pParent, xmlreader::Xm pCurrentChild = insertObject(pParent, sClass, sID, aProperties, aPangoAttributes, aAtkAttributes); } - handleChild(pCurrentChild, reader); + handleChild(pCurrentChild, nullptr, reader); } else if (name == "items") aItems = handleItems(reader); diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx index 6ffbdd2fd0e5..f0c462dcc921 100644 --- a/vcl/source/window/menu.cxx +++ b/vcl/source/window/menu.cxx @@ -2289,6 +2289,18 @@ tools::Rectangle Menu::GetBoundingRectangle( sal_uInt16 nPos ) const return aRet; } +void Menu::SetAccessibleName( sal_uInt16 nItemId, const OUString& rStr ) +{ + size_t nPos; + MenuItemData* pData = pItemList->GetData( nItemId, nPos ); + + if (pData && !rStr.equals(pData->aAccessibleName)) + { + pData->aAccessibleName = rStr; + ImplCallEventListeners(VclEventId::MenuAccessibleNameChanged, nPos); + } +} + OUString Menu::GetAccessibleName( sal_uInt16 nItemId ) const { MenuItemData* pData = pItemList->GetData( nItemId ); @@ -2299,6 +2311,24 @@ OUString Menu::GetAccessibleName( sal_uInt16 nItemId ) const return OUString(); } +void Menu::SetAccessibleDescription( sal_uInt16 nItemId, const OUString& rStr ) +{ + MenuItemData* pData = pItemList->GetData( nItemId ); + + if ( pData ) + pData->aAccessibleDescription = rStr; +} + +OUString Menu::GetAccessibleDescription( sal_uInt16 nItemId ) const +{ + MenuItemData* pData = pItemList->GetData( nItemId ); + + if (pData && !pData->aAccessibleDescription.isEmpty()) + return pData->aAccessibleDescription; + + return GetHelpText(nItemId); +} + void Menu::GetSystemMenuData( SystemMenuData* pData ) const { Menu* pMenu = const_cast<Menu*>(this); diff --git a/vcl/source/window/menuitemlist.hxx b/vcl/source/window/menuitemlist.hxx index 8ca4b415980f..b2f4ca62a488 100644 --- a/vcl/source/window/menuitemlist.hxx +++ b/vcl/source/window/menuitemlist.hxx @@ -54,6 +54,7 @@ struct MenuItemData bool bHiddenOnGUI; Size aSz; // only temporarily valid OUString aAccessibleName; // accessible name + OUString aAccessibleDescription; // accessible description std::unique_ptr<SalMenuItem> pSalMenuItem; // access to native menu _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits