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;
 

Reply via email to