include/vcl/builder.hxx | 7 +-- include/vcl/widgetbuilder.hxx | 81 ++++++++++++++++++++++++++++++++++++++- vcl/inc/qt5/QtBuilder.hxx | 2 vcl/qt5/QtBuilder.cxx | 6 ++ vcl/source/window/builder.cxx | 87 +++--------------------------------------- 5 files changed, 99 insertions(+), 84 deletions(-)
New commits: commit 73bb40c27449de7ef6029ed1744bb8c3a256711d Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Sun Nov 10 21:44:56 2024 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Mon Nov 11 01:51:39 2024 +0100 tdf#130857 Move VclBuilder::handleMenu{,Child} to WidgetBuilder Move VclBuilder::handleMenu and VclBuilder::handleMenuChild to the base class WidgetBuilder and add a new virtual WidgetBuilder::handleMenuObject method (used by WidgetBuilder::handleMenuChild) that the existing VclBuilder implementation now overrides. This prepares for allowing to use this by subclasses that create menus other than the VCL PopupMenu and continues the intended separation between XML parsing done in WidgetBuilder and actual widget creation (in subclasses implementing the vcl::Window or toolkit specific logic.) Change-Id: Idc896570e4b21f6997e548b7bdab8a9610042bff Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176361 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx index b354acc7728d..9006da0940e9 100644 --- a/include/vcl/builder.hxx +++ b/include/vcl/builder.hxx @@ -276,10 +276,7 @@ private: stringmap &rAtkProps, accelmap &rAccels); - void handleMenuChild(Menu *pParent, xmlreader::XmlReader &reader); - void handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader); - - void handleMenu(xmlreader::XmlReader& reader, const OUString& rID) override; + void handleMenuObject(PopupMenu* pParent, xmlreader::XmlReader& reader) override; // if bToolbarItem=true, pParent is the ToolBox that the item belongs to, since there's no widget for the item itself void applyAtkProperties(vcl::Window* pWindow, const stringmap& rProperties, diff --git a/include/vcl/widgetbuilder.hxx b/include/vcl/widgetbuilder.hxx index 731585bb6b33..a4a126d5c416 100644 --- a/include/vcl/widgetbuilder.hxx +++ b/include/vcl/widgetbuilder.hxx @@ -368,6 +368,83 @@ protected: applyTabChildProperties(pParent, sIDs, context, aProperties, aAtkProperties); } + void handleMenu(xmlreader::XmlReader& reader, const OUString& rID) + { + MenuPtr pCurrentMenu = createMenu(rID); + + int nLevel = 1; + + stringmap aProperties; + + while (true) + { + xmlreader::Span name; + int nsId; + + xmlreader::XmlReader::Result res + = reader.nextItem(xmlreader::XmlReader::Text::NONE, &name, &nsId); + + if (res == xmlreader::XmlReader::Result::Done) + break; + + if (res == xmlreader::XmlReader::Result::Begin) + { + if (name == "child") + { + handleMenuChild(pCurrentMenu, reader); + } + else + { + ++nLevel; + if (name == "property") + collectProperty(reader, aProperties); + } + } + + if (res == xmlreader::XmlReader::Result::End) + { + --nLevel; + } + + if (!nLevel) + break; + } + + m_aMenus.emplace_back(rID, pCurrentMenu); + } + + void handleMenuChild(MenuClass* pParent, xmlreader::XmlReader& reader) + { + xmlreader::Span name; + int nsId; + + int nLevel = 1; + while (true) + { + xmlreader::XmlReader::Result res + = reader.nextItem(xmlreader::XmlReader::Text::NONE, &name, &nsId); + + if (res == xmlreader::XmlReader::Result::Begin) + { + if (name == "object" || name == "placeholder") + { + handleMenuObject(pParent, reader); + } + else + ++nLevel; + } + + if (res == xmlreader::XmlReader::Result::End) + --nLevel; + + if (!nLevel) + break; + + if (res == xmlreader::XmlReader::Result::Done) + break; + } + } + virtual void applyAtkProperties(Widget* pWidget, const stringmap& rProperties, bool bToolbarItem) = 0; @@ -407,7 +484,7 @@ protected: // // Until that's done, other subclasses can be used to handle only those .ui files // not using the corresponding features (attributes/objects in the .ui file). - virtual void handleMenu(xmlreader::XmlReader& /*reader*/, const OUString& /*rID*/) + virtual void handleMenuObject(MenuClass* /*pParent*/, xmlreader::XmlReader& /*reader*/) { assert(false && "Functionality not implemented by this subclass yet."); } diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 55f7bd200b34..c4feb7097ff5 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -3018,84 +3018,7 @@ std::vector<ComboBoxTextItem> BuilderBase::handleItems(xmlreader::XmlReader& rea return aItems; } -void VclBuilder::handleMenu(xmlreader::XmlReader& reader, const OUString& rID) -{ - VclPtr<PopupMenu> pCurrentMenu = createMenu(rID); - - int nLevel = 1; - - stringmap aProperties; - - while(true) - { - xmlreader::Span name; - int nsId; - - xmlreader::XmlReader::Result res = reader.nextItem( - xmlreader::XmlReader::Text::NONE, &name, &nsId); - - if (res == xmlreader::XmlReader::Result::Done) - break; - - if (res == xmlreader::XmlReader::Result::Begin) - { - if (name == "child") - { - handleMenuChild(pCurrentMenu, reader); - } - else - { - ++nLevel; - if (name == "property") - collectProperty(reader, aProperties); - } - } - - if (res == xmlreader::XmlReader::Result::End) - { - --nLevel; - } - - if (!nLevel) - break; - } - - m_aMenus.emplace_back(rID, pCurrentMenu); -} - -void VclBuilder::handleMenuChild(Menu *pParent, xmlreader::XmlReader &reader) -{ - xmlreader::Span name; - int nsId; - - int nLevel = 1; - while(true) - { - xmlreader::XmlReader::Result res = reader.nextItem( - xmlreader::XmlReader::Text::NONE, &name, &nsId); - - if (res == xmlreader::XmlReader::Result::Begin) - { - if (name == "object" || name == "placeholder") - { - handleMenuObject(pParent, reader); - } - else - ++nLevel; - } - - if (res == xmlreader::XmlReader::Result::End) - --nLevel; - - if (!nLevel) - break; - - if (res == xmlreader::XmlReader::Result::Done) - break; - } -} - -void VclBuilder::handleMenuObject(Menu *pParent, xmlreader::XmlReader &reader) +void VclBuilder::handleMenuObject(PopupMenu* pParent, xmlreader::XmlReader& reader) { OUString sClass; OUString sID; commit 5323a78637bceaa0d911a281ad6e680b2af6e62b Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Sun Nov 10 21:32:10 2024 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Mon Nov 11 01:51:28 2024 +0100 tdf#130857 Add WidgetBuilder::createMenu, use to abstract from VCL-specifics Add a new purely virtual WidgetBuilder::createMenu and use that in VclBuilder::handleMenu instead of directly calling VclPtr<PopupMenu>::Create there. This is in preparation of moving VclBuilder::handleMenu to WidgetBuilder as well, to make it reusable for other child classes, in particular QtBuilder. Change-Id: Icf3f937ea8e876c8393185e41a95e0f66458ce11 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/176360 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/include/vcl/builder.hxx b/include/vcl/builder.hxx index 5b9f2eb7e90d..b354acc7728d 100644 --- a/include/vcl/builder.hxx +++ b/include/vcl/builder.hxx @@ -292,6 +292,8 @@ private: virtual bool isHorizontalTabControl(vcl::Window* pWindow) override; + virtual VclPtr<PopupMenu> createMenu(const OUString& rID) override; + PackingData get_window_packing_data(const vcl::Window *pWindow) const; void set_window_packing_position(const vcl::Window *pWindow, sal_Int32 nPosition); diff --git a/include/vcl/widgetbuilder.hxx b/include/vcl/widgetbuilder.hxx index 50fd9ea12db2..731585bb6b33 100644 --- a/include/vcl/widgetbuilder.hxx +++ b/include/vcl/widgetbuilder.hxx @@ -398,6 +398,8 @@ protected: // Whether the given widget is a horizontal, i.e. non-vertical tab control virtual bool isHorizontalTabControl(Widget* pWidget) = 0; + virtual MenuPtr createMenu(const OUString& rID) = 0; + // These methods are currently only implemented by VclBuilder and should be // refactored as described in the class documentation above (split into // parsing done in this class + overridable methods that don't need XmlReader diff --git a/vcl/inc/qt5/QtBuilder.hxx b/vcl/inc/qt5/QtBuilder.hxx index 98296abde026..64b61827e3fd 100644 --- a/vcl/inc/qt5/QtBuilder.hxx +++ b/vcl/inc/qt5/QtBuilder.hxx @@ -76,6 +76,8 @@ public: virtual bool isHorizontalTabControl(QObject* pObject) override; + virtual QMenu* createMenu(const OUString& rID) override; + virtual void set_response(std::u16string_view sID, short nResponse) override; private: diff --git a/vcl/qt5/QtBuilder.cxx b/vcl/qt5/QtBuilder.cxx index 002a88fbbf55..1981a8a4c322 100644 --- a/vcl/qt5/QtBuilder.cxx +++ b/vcl/qt5/QtBuilder.cxx @@ -427,6 +427,12 @@ bool QtBuilder::isHorizontalTabControl(QObject* pObject) || ePosition == QTabWidget::TabPosition::South; } +QMenu* QtBuilder::createMenu(const OUString&) +{ + assert(false && "Not implemented yet"); + return nullptr; +} + void QtBuilder::applyAtkProperties(QObject* pObject, const stringmap& rProperties, bool) { if (!pObject || !pObject->isWidgetType()) diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index e2b26ed6e960..55f7bd200b34 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -2946,6 +2946,13 @@ bool VclBuilder::isHorizontalTabControl(vcl::Window* pWindow) return pWindow && pWindow->GetType() == WindowType::TABCONTROL; } +VclPtr<PopupMenu> VclBuilder::createMenu(const OUString& rID) +{ + VclPtr<PopupMenu> pMenu = VclPtr<PopupMenu>::Create(); + pMenu->set_id(rID); + return pMenu; +} + std::vector<ComboBoxTextItem> BuilderBase::handleItems(xmlreader::XmlReader& reader) const { int nLevel = 1; @@ -3013,8 +3020,7 @@ std::vector<ComboBoxTextItem> BuilderBase::handleItems(xmlreader::XmlReader& rea void VclBuilder::handleMenu(xmlreader::XmlReader& reader, const OUString& rID) { - VclPtr<PopupMenu> pCurrentMenu = VclPtr<PopupMenu>::Create(); - pCurrentMenu->set_id(rID); + VclPtr<PopupMenu> pCurrentMenu = createMenu(rID); int nLevel = 1;