[Libreoffice-commits] core.git: 2 commits - sc/inc sc/source sc/uiconfig solenv/sanitizers vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Apr 29 12:32:44 UTC 2019


 sc/inc/orcusfilters.hxx                   |    4 
 sc/inc/orcusxml.hxx                       |   13 -
 sc/source/core/tool/orcusxml.cxx          |    6 
 sc/source/filter/inc/orcusfiltersimpl.hxx |    2 
 sc/source/filter/orcus/xmlcontext.cxx     |   63 ++---
 sc/source/ui/inc/xmlsourcedlg.hxx         |   75 +++---
 sc/source/ui/view/reffact.cxx             |    4 
 sc/source/ui/view/tabvwshc.cxx            |   11 
 sc/source/ui/xmlsource/xmlsourcedlg.cxx   |  361 ++++++++++++------------------
 sc/uiconfig/scalc/ui/xmlsourcedialog.ui   |  205 ++++++++++-------
 solenv/sanitizers/ui/modules/scalc.false  |    1 
 solenv/sanitizers/ui/modules/scalc.suppr  |    4 
 vcl/unx/gtk3/gtk3gtkinst.cxx              |    1 
 13 files changed, 376 insertions(+), 374 deletions(-)

New commits:
commit 260e5b61209b92e1583623d70b2ba3032b5ced14
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sun Apr 28 19:47:03 2019 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Apr 29 14:31:51 2019 +0200

    weld ScXMLSourceDlg
    
    Change-Id: If8894b7c432006f196e040571757943c940f13ea
    Reviewed-on: https://gerrit.libreoffice.org/71489
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sc/inc/orcusfilters.hxx b/sc/inc/orcusfilters.hxx
index 1f96d6ac1769..99f55306b226 100644
--- a/sc/inc/orcusfilters.hxx
+++ b/sc/inc/orcusfilters.hxx
@@ -13,11 +13,11 @@
 #include <rtl/ustring.hxx>
 
 class ScDocument;
-class SvTreeListBox;
 struct ScOrcusXMLTreeParam;
 struct ScOrcusImportXMLParam;
 class ScOrcusXMLContext;
 class SfxMedium;
+namespace weld { class TreeView; }
 
 /**
  * Collection of orcus filter wrappers.
@@ -60,7 +60,7 @@ class ScOrcusXMLContext
 public:
     virtual ~ScOrcusXMLContext() {}
 
-    virtual void loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) = 0;
+    virtual void loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam) = 0;
 
     virtual void importXML(const ScOrcusImportXMLParam& rParam) = 0;
 };
diff --git a/sc/inc/orcusxml.hxx b/sc/inc/orcusxml.hxx
index 2b8f94425f73..b635eca2d43d 100644
--- a/sc/inc/orcusxml.hxx
+++ b/sc/inc/orcusxml.hxx
@@ -17,7 +17,10 @@
 #include <vector>
 #include <memory>
 
-class SvTreeListEntry;
+namespace weld {
+    class TreeIter;
+    class TreeView;
+}
 
 /**
  * Parameter used during call to ScOrcusFilters::loadXMLStructure().
@@ -40,9 +43,9 @@ struct ScOrcusXMLTreeParam
 
     typedef std::vector<std::unique_ptr<EntryData>> UserDataStoreType;
 
-    Image maImgElementDefault;
-    Image maImgElementRepeat;
-    Image maImgAttribute;
+    OUString maImgElementDefault;
+    OUString maImgElementRepeat;
+    OUString maImgAttribute;
 
     /**
      * Store all custom data instances since the tree control doesn't manage
@@ -50,7 +53,7 @@ struct ScOrcusXMLTreeParam
      */
     UserDataStoreType m_UserDataStore;
 
-    static SC_DLLPUBLIC EntryData* getUserData(const SvTreeListEntry& rEntry);
+    static SC_DLLPUBLIC EntryData* getUserData(const weld::TreeView& rControl, const weld::TreeIter& rEntry);
 };
 
 struct ScOrcusImportXMLParam
diff --git a/sc/source/core/tool/orcusxml.cxx b/sc/source/core/tool/orcusxml.cxx
index 13101973d2c6..1323362b4124 100644
--- a/sc/source/core/tool/orcusxml.cxx
+++ b/sc/source/core/tool/orcusxml.cxx
@@ -9,7 +9,7 @@
 
 #include <orcusxml.hxx>
 
-#include <vcl/treelistentry.hxx>
+#include <vcl/weld.hxx>
 
 ScOrcusXMLTreeParam::EntryData::EntryData(EntryType eType)
     : mnNamespaceID(0)
@@ -19,9 +19,9 @@ ScOrcusXMLTreeParam::EntryData::EntryData(EntryType eType)
     , mbLeafNode(true)
 {}
 
-ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const SvTreeListEntry& rEntry)
+ScOrcusXMLTreeParam::EntryData* ScOrcusXMLTreeParam::getUserData(const weld::TreeView& rControl, const weld::TreeIter& rEntry)
 {
-    return static_cast<ScOrcusXMLTreeParam::EntryData*>(rEntry.GetUserData());
+    return reinterpret_cast<ScOrcusXMLTreeParam::EntryData*>(rControl.get_id(rEntry).toInt64());
 }
 
 ScOrcusImportXMLParam::CellLink::CellLink(const ScAddress& rPos, const OString& rPath) :
diff --git a/sc/source/filter/inc/orcusfiltersimpl.hxx b/sc/source/filter/inc/orcusfiltersimpl.hxx
index 1a27dc93ec1c..bef07a43e2dc 100644
--- a/sc/source/filter/inc/orcusfiltersimpl.hxx
+++ b/sc/source/filter/inc/orcusfiltersimpl.hxx
@@ -41,7 +41,7 @@ public:
     ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& rPath);
     virtual ~ScOrcusXMLContextImpl() override;
 
-    virtual void loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam) override;
+    virtual void loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam) override;
 
     virtual void importXML(const ScOrcusImportXMLParam& rParam) override;
 };
diff --git a/sc/source/filter/orcus/xmlcontext.cxx b/sc/source/filter/orcus/xmlcontext.cxx
index 636e66271a7d..9cac43207cf4 100644
--- a/sc/source/filter/orcus/xmlcontext.cxx
+++ b/sc/source/filter/orcus/xmlcontext.cxx
@@ -15,6 +15,7 @@
 
 #include <vcl/treelistbox.hxx>
 #include <vcl/treelistentry.hxx>
+#include <vcl/weld.hxx>
 #include <ucbhelper/content.hxx>
 #include <sal/log.hxx>
 
@@ -38,11 +39,11 @@ using namespace com::sun::star;
 
 namespace {
 
-ScOrcusXMLTreeParam::EntryData& setUserDataToEntry(
-    SvTreeListEntry& rEntry, ScOrcusXMLTreeParam::UserDataStoreType& rStore, ScOrcusXMLTreeParam::EntryType eType)
+ScOrcusXMLTreeParam::EntryData& setUserDataToEntry(weld::TreeView& rControl,
+    weld::TreeIter& rEntry, ScOrcusXMLTreeParam::UserDataStoreType& rStore, ScOrcusXMLTreeParam::EntryType eType)
 {
     rStore.push_back(std::make_unique<ScOrcusXMLTreeParam::EntryData>(eType));
-    rEntry.SetUserData(rStore.back().get());
+    rControl.set_id(rEntry, OUString::number(reinterpret_cast<sal_Int64>(rStore.back().get())));
     return *rStore.back();
 }
 
@@ -68,17 +69,17 @@ OUString toString(const orcus::xml_structure_tree::entity_name& entity, const or
 }
 
 void populateTree(
-   SvTreeListBox& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker,
+   weld::TreeView& rTreeCtrl, orcus::xml_structure_tree::walker& rWalker,
    const orcus::xml_structure_tree::entity_name& rElemName, bool bRepeat,
-   SvTreeListEntry* pParent, ScOrcusXMLTreeParam& rParam)
+   weld::TreeIter* pParent, ScOrcusXMLTreeParam& rParam)
 {
-    SvTreeListEntry* pEntry = rTreeCtrl.InsertEntry(toString(rElemName, rWalker), pParent);
-    if (!pEntry)
-        // Can this ever happen!?
-        return;
+    OUString sEntry(toString(rElemName, rWalker));
+    std::unique_ptr<weld::TreeIter> xEntry(rTreeCtrl.make_iterator());
+    rTreeCtrl.insert(pParent, -1, &sEntry, nullptr, nullptr, nullptr, nullptr, false, xEntry.get());
+    rTreeCtrl.set_image(*xEntry, rParam.maImgElementDefault, -1);
 
-    ScOrcusXMLTreeParam::EntryData& rEntryData = setUserDataToEntry(
-        *pEntry, rParam.m_UserDataStore,
+    ScOrcusXMLTreeParam::EntryData& rEntryData = setUserDataToEntry(rTreeCtrl,
+        *xEntry, rParam.m_UserDataStore,
         bRepeat ? ScOrcusXMLTreeParam::ElementRepeat : ScOrcusXMLTreeParam::ElementDefault);
 
     setEntityNameToUserData(rEntryData, rElemName, rWalker);
@@ -86,32 +87,25 @@ void populateTree(
     if (bRepeat)
     {
         // Recurring elements use different icon.
-        rTreeCtrl.SetExpandedEntryBmp(pEntry, rParam.maImgElementRepeat);
-        rTreeCtrl.SetCollapsedEntryBmp(pEntry, rParam.maImgElementRepeat);
+       rTreeCtrl.set_image(*xEntry, rParam.maImgElementRepeat, -1);
     }
 
-    if (pParent)
-        rTreeCtrl.Expand(pParent);
-
     orcus::xml_structure_tree::entity_names_type aNames;
 
     // Insert attributes.
     rWalker.get_attributes(aNames);
     for (const orcus::xml_structure_tree::entity_name& rAttrName : aNames)
     {
-        SvTreeListEntry* pAttr = rTreeCtrl.InsertEntry(toString(rAttrName, rWalker), pEntry);
-
-        if (!pAttr)
-            continue;
+        OUString sAttr(toString(rAttrName, rWalker));
+        std::unique_ptr<weld::TreeIter> xAttr(rTreeCtrl.make_iterator());
+        rTreeCtrl.insert(xEntry.get(), -1, &sAttr, nullptr, nullptr, nullptr, nullptr, false, xAttr.get());
 
         ScOrcusXMLTreeParam::EntryData& rAttrData =
-            setUserDataToEntry(*pAttr, rParam.m_UserDataStore, ScOrcusXMLTreeParam::Attribute);
+            setUserDataToEntry(rTreeCtrl, *xAttr, rParam.m_UserDataStore, ScOrcusXMLTreeParam::Attribute);
         setEntityNameToUserData(rAttrData, rAttrName, rWalker);
 
-        rTreeCtrl.SetExpandedEntryBmp(pAttr, rParam.maImgAttribute);
-        rTreeCtrl.SetCollapsedEntryBmp(pAttr, rParam.maImgAttribute);
+        rTreeCtrl.set_image(*xAttr, rParam.maImgAttribute, -1);
     }
-    rTreeCtrl.Expand(pEntry);
 
     rWalker.get_children(aNames);
 
@@ -122,23 +116,23 @@ void populateTree(
     for (const auto& rName : aNames)
     {
         orcus::xml_structure_tree::element aElem = rWalker.descend(rName);
-        populateTree(rTreeCtrl, rWalker, rName, aElem.repeat, pEntry, rParam);
+        populateTree(rTreeCtrl, rWalker, rName, aElem.repeat, xEntry.get(), rParam);
         rWalker.ascend();
     }
 }
 
 class TreeUpdateSwitch
 {
-    SvTreeListBox& mrTreeCtrl;
+    weld::TreeView& mrTreeCtrl;
 public:
-    explicit TreeUpdateSwitch(SvTreeListBox& rTreeCtrl) : mrTreeCtrl(rTreeCtrl)
+    explicit TreeUpdateSwitch(weld::TreeView& rTreeCtrl) : mrTreeCtrl(rTreeCtrl)
     {
-        mrTreeCtrl.SetUpdateMode(false);
+        mrTreeCtrl.freeze();
     }
 
     ~TreeUpdateSwitch()
     {
-        mrTreeCtrl.SetUpdateMode(true);
+        mrTreeCtrl.thaw();
     }
 };
 
@@ -180,7 +174,7 @@ ScOrcusXMLContextImpl::ScOrcusXMLContextImpl(ScDocument& rDoc, const OUString& r
 
 ScOrcusXMLContextImpl::~ScOrcusXMLContextImpl() {}
 
-void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXMLTreeParam& rParam)
+void ScOrcusXMLContextImpl::loadXMLStructure(weld::TreeView& rTreeCtrl, ScOrcusXMLTreeParam& rParam)
 {
     rParam.m_UserDataStore.clear();
 
@@ -197,9 +191,7 @@ void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM
         aXmlTree.parse(&aStrm[0], aStrm.size());
 
         TreeUpdateSwitch aSwitch(rTreeCtrl);
-        rTreeCtrl.Clear();
-        rTreeCtrl.SetDefaultCollapsedEntryBmp(rParam.maImgElementDefault);
-        rTreeCtrl.SetDefaultExpandedEntryBmp(rParam.maImgElementDefault);
+        rTreeCtrl.clear();
 
         orcus::xml_structure_tree::walker aWalker = aXmlTree.get_walker();
 
@@ -215,6 +207,11 @@ void ScOrcusXMLContextImpl::loadXMLStructure(SvTreeListBox& rTreeCtrl, ScOrcusXM
     {
         SAL_WARN("sc.orcus", "parsing failed with an unknown error " << e.what());
     }
+
+    rTreeCtrl.all_foreach([&rTreeCtrl](weld::TreeIter& rEntry){
+        rTreeCtrl.expand_row(rEntry);
+        return false;
+    });
 }
 
 namespace {
diff --git a/sc/source/ui/inc/xmlsourcedlg.hxx b/sc/source/ui/inc/xmlsourcedlg.hxx
index 822ac54b72ea..8b4c6b1871cb 100644
--- a/sc/source/ui/inc/xmlsourcedlg.hxx
+++ b/sc/source/ui/inc/xmlsourcedlg.hxx
@@ -26,78 +26,89 @@ class ScDocument;
 class ScRange;
 class ScOrcusXMLContext;
 
-class ScXMLSourceDlg : public ScAnyRefDlg
+struct CustomCompare
 {
-    VclPtr<PushButton> mpBtnSelectSource;
-    VclPtr<FixedText> mpFtSourceFile;
-
-    VclPtr<VclContainer> mpMapGrid;
-
-    VclPtr<SvTreeListBox> mpLbTree;
-    VclPtr<formula::RefEdit> mpRefEdit;
-    VclPtr<formula::RefButton> mpRefBtn;
+    weld::TreeView& mrLbTree;
+    CustomCompare(weld::TreeView& rLbTree)
+        : mrLbTree(rLbTree)
+    {
+    }
+    bool operator()(const std::unique_ptr<weld::TreeIter>& lhs, const std::unique_ptr<weld::TreeIter>& rhs) const
+    {
+        return mrLbTree.iter_compare(*lhs, *rhs) == -1;
+    }
+};
 
-    VclPtr<PushButton> mpBtnOk;
-    VclPtr<CancelButton> mpBtnCancel;
 
+class ScXMLSourceDlg : public ScAnyRefDlgController
+{
     OUString maSrcPath;
 
     ScOrcusXMLTreeParam maXMLParam;
-    std::set<const SvTreeListEntry*> maCellLinks;
-    std::set<const SvTreeListEntry*> maRangeLinks;
-    std::vector<SvTreeListEntry*> maHighlightedEntries;
-    SvTreeListEntry* mpCurRefEntry;
+    std::unique_ptr<weld::TreeIter> mxCurRefEntry;
     std::unique_ptr<ScOrcusXMLContext> mpXMLContext;
 
     ScDocument* mpDoc;
-
-    VclPtr<formula::RefEdit> mpActiveEdit;
     bool mbDlgLostFocus;
 
+    formula::WeldRefEdit* mpActiveEdit;
+    std::unique_ptr<weld::Button> mxBtnSelectSource;
+    std::unique_ptr<weld::Label> mxFtSourceFile;
+
+    std::unique_ptr<weld::Container> mxMapGrid;
+
+    std::unique_ptr<weld::TreeView> mxLbTree;
+    std::unique_ptr<formula::WeldRefEdit> mxRefEdit;
+    std::unique_ptr<formula::WeldRefButton> mxRefBtn;
+
+    std::unique_ptr<weld::Button> mxBtnOk;
+    std::unique_ptr<weld::Button> mxBtnCancel;
+
+    CustomCompare maCustomCompare;
+
+    std::set<std::unique_ptr<weld::TreeIter>, CustomCompare> maCellLinks;
+    std::set<std::unique_ptr<weld::TreeIter>, CustomCompare> maRangeLinks;
+
 public:
-    ScXMLSourceDlg(
-        SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent, ScDocument* pDoc);
+    ScXMLSourceDlg(SfxBindings* pB, SfxChildWindow* pCW, weld::Window* pParent, ScDocument* pDoc);
     virtual ~ScXMLSourceDlg() override;
-    virtual void dispose() override;
 
     virtual bool IsRefInputMode() const override;
     virtual void SetReference(const ScRange& rRange, ScDocument* pDoc) override;
     virtual void Deactivate() override;
     virtual void SetActive() override;
-    virtual bool Close() override;
+    virtual void Close() override;
 
 private:
 
     void SelectSourceFile();
     void LoadSourceFileStructure(const OUString& rPath);
-    void HandleGetFocus(const Control* pCtrl);
     void TreeItemSelected();
-    void DefaultElementSelected(SvTreeListEntry& rEntry);
-    void RepeatElementSelected(SvTreeListEntry& rEntry);
-    void AttributeSelected(SvTreeListEntry& rEntry);
+    void DefaultElementSelected(weld::TreeIter& rEntry);
+    void RepeatElementSelected(weld::TreeIter& rEntry);
+    void AttributeSelected(weld::TreeIter& rEntry);
 
     void SetNonLinkable();
     void SetSingleLinkable();
     void SetRangeLinkable();
-    void SelectAllChildEntries(SvTreeListEntry& rEntry);
+    void SelectAllChildEntries(weld::TreeIter& rEntry);
 
     /**
      * Check if any of its parents is linked or repeated.  The passed entry is
      * not checked; its parent is the first one to be checked, then all its
      * parents get checked all the way to the root.
      */
-    bool IsParentDirty(SvTreeListEntry* pEntry) const;
+    bool IsParentDirty(weld::TreeIter* pEntry) const;
 
-    bool IsChildrenDirty(SvTreeListEntry* pEntry) const;
+    bool IsChildrenDirty(weld::TreeIter* pEntry) const;
 
     void OkPressed();
     void CancelPressed();
     void RefEditModified();
 
-    DECL_LINK(GetFocusHdl, Control&, void);
-    DECL_LINK(BtnPressedHdl, Button*, void);
-    DECL_LINK(TreeItemSelectHdl, SvTreeListBox*, void);
-    DECL_LINK(RefModifiedHdl, Edit&, void);
+    DECL_LINK(BtnPressedHdl, weld::Button&, void);
+    DECL_LINK(TreeItemSelectHdl, weld::TreeView&, void);
+    DECL_LINK(RefModifiedHdl, formula::WeldRefEdit&, void);
 };
 
 #endif
diff --git a/sc/source/ui/view/reffact.cxx b/sc/source/ui/view/reffact.cxx
index cb743915f43a..fd4e47966f6b 100644
--- a/sc/source/ui/view/reffact.cxx
+++ b/sc/source/ui/view/reffact.cxx
@@ -36,7 +36,7 @@ SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScNameDlgWrapper, FID_DEFINE_NAME)
 SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScNameDefDlgWrapper, FID_ADD_NAME )
 SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScSolverDlgWrapper, SID_OPENDLG_SOLVE )
 SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScOptSolverDlgWrapper, SID_OPENDLG_OPTSOLVER )
-SFX_IMPL_MODELESSDIALOG_WITHID(ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
+SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
 SFX_IMPL_MODELESSDIALOG_WITHID(ScPivotLayoutWrapper, SID_OPENDLG_PIVOTTABLE )
 SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScTabOpDlgWrapper, SID_OPENDLG_TABOP )
 SFX_IMPL_MODELESSDIALOGCONTOLLER_WITHID(ScFilterDlgWrapper, SID_FILTER )
@@ -129,7 +129,7 @@ IMPL_CONTROLLER_CHILD_CTOR( ScSolverDlgWrapper, SID_OPENDLG_SOLVE )
 
 IMPL_CONTROLLER_CHILD_CTOR( ScOptSolverDlgWrapper, SID_OPENDLG_OPTSOLVER )
 
-IMPL_CHILD_CTOR( ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
+IMPL_CONTROLLER_CHILD_CTOR( ScXMLSourceDlgWrapper, SID_MANAGE_XML_SOURCE)
 
 IMPL_CHILD_CTOR( ScPivotLayoutWrapper, SID_OPENDLG_PIVOTTABLE )
 
diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx
index 25d555c76aad..9c7691a1464a 100644
--- a/sc/source/ui/view/tabvwshc.cxx
+++ b/sc/source/ui/view/tabvwshc.cxx
@@ -167,12 +167,6 @@ VclPtr<SfxModelessDialog> ScTabViewShell::CreateRefDialog(
         }
         break;
 
-        case SID_MANAGE_XML_SOURCE:
-        {
-            pResult = VclPtr<ScXMLSourceDlg>::Create(pB, pCW, pParent, pDoc);
-        }
-        break;
-
         case WID_CONDFRMT_REF:
         {
             bool        bFound      = false;
@@ -478,6 +472,11 @@ std::unique_ptr<SfxModelessDialogController> ScTabViewShell::CreateRefDialogCont
             xResult.reset(new ScHighlightChgDlg(pB, pCW, pParent, &GetViewData()));
             break;
         }
+        case SID_MANAGE_XML_SOURCE:
+        {
+            xResult.reset(new ScXMLSourceDlg(pB, pCW, pParent, pDoc));
+            break;
+        }
     }
 
     if (xResult)
diff --git a/sc/source/ui/xmlsource/xmlsourcedlg.cxx b/sc/source/ui/xmlsource/xmlsourcedlg.cxx
index 7a2ef3b8311b..d9d8e0a593d5 100644
--- a/sc/source/ui/xmlsource/xmlsourcedlg.cxx
+++ b/sc/source/ui/xmlsource/xmlsourcedlg.cxx
@@ -34,9 +34,9 @@ using namespace com::sun::star;
 
 namespace {
 
-bool isAttribute(const SvTreeListEntry& rEntry)
+bool isAttribute(const weld::TreeView& rControl, const weld::TreeIter& rEntry)
 {
-    const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry);
+    const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rControl, rEntry);
     if (!pUserData)
         return false;
 
@@ -44,24 +44,21 @@ bool isAttribute(const SvTreeListEntry& rEntry)
 }
 
 OUString getXPath(
-    const SvTreeListBox& rTree, const SvTreeListEntry& rEntry, std::vector<size_t>& rNamespaces)
+    const weld::TreeView& rTree, const weld::TreeIter& rEntry, std::vector<size_t>& rNamespaces)
 {
     OUStringBuffer aBuf;
-    for (const SvTreeListEntry* p = &rEntry; p; p = rTree.GetParent(p))
+    std::unique_ptr<weld::TreeIter> xEntry(rTree.make_iterator(&rEntry));
+    do
     {
-        const SvLBoxItem* pItem = p->GetFirstItem(SvLBoxItemType::String);
-        if (!pItem)
-            continue;
-
         // Collect used namespace.
-        const ScOrcusXMLTreeParam::EntryData* pData = ScOrcusXMLTreeParam::getUserData(*p);
+        const ScOrcusXMLTreeParam::EntryData* pData = ScOrcusXMLTreeParam::getUserData(rTree, *xEntry);
         if (pData)
             rNamespaces.push_back(pData->mnNamespaceID);
 
-        const SvLBoxString* pStr = static_cast<const SvLBoxString*>(pItem);
-        aBuf.insert(0, pStr->GetText());
-        aBuf.insert(0, isAttribute(*p) ? '@' : '/');
+        aBuf.insert(0, rTree.get_text(*xEntry, 0));
+        aBuf.insert(0, isAttribute(rTree, *xEntry) ? '@' : '/');
     }
+    while (rTree.iter_parent(*xEntry));
 
     return aBuf.makeStringAndClear();
 }
@@ -69,75 +66,57 @@ OUString getXPath(
 }
 
 ScXMLSourceDlg::ScXMLSourceDlg(
-    SfxBindings* pB, SfxChildWindow* pCW, vcl::Window* pParent, ScDocument* pDoc)
-    : ScAnyRefDlg(pB, pCW, pParent, "XMLSourceDialog",
-        "modules/scalc/ui/xmlsourcedialog.ui")
-    , mpCurRefEntry(nullptr)
+    SfxBindings* pB, SfxChildWindow* pCW, weld::Window* pParent, ScDocument* pDoc)
+    : ScAnyRefDlgController(pB, pCW, pParent, "modules/scalc/ui/xmlsourcedialog.ui", "XMLSourceDialog")
     , mpDoc(pDoc)
     , mbDlgLostFocus(false)
-{
-    get(mpBtnSelectSource, "selectsource");
-    get(mpFtSourceFile, "sourcefile");
-    get(mpMapGrid, "mapgrid");
-    get(mpLbTree, "tree");
-    Size aTreeSize(mpLbTree->LogicToPixel(Size(130, 120), MapMode(MapUnit::MapAppFont)));
-    mpLbTree->set_width_request(aTreeSize.Width());
-    mpLbTree->set_height_request(aTreeSize.Height());
-    get(mpRefEdit, "edit");
-    mpRefEdit->SetReferences(this, nullptr);
-    get(mpRefBtn, "ref");
-    mpRefBtn->SetReferences(this, mpRefEdit);
-    get(mpBtnCancel, "cancel");
-    get(mpBtnOk, "ok");
-
-    mpActiveEdit = mpRefEdit;
-
-    maXMLParam.maImgElementDefault = Image(StockImage::Yes, RID_BMP_ELEMENT_DEFAULT);
-    maXMLParam.maImgElementRepeat = Image(StockImage::Yes, RID_BMP_ELEMENT_REPEAT);
-    maXMLParam.maImgAttribute = Image(StockImage::Yes, RID_BMP_ELEMENT_ATTRIBUTE);
-
-    Link<Button*,void> aBtnHdl = LINK(this, ScXMLSourceDlg, BtnPressedHdl);
-    mpBtnSelectSource->SetClickHdl(aBtnHdl);
-    mpBtnOk->SetClickHdl(aBtnHdl);
-    mpBtnCancel->SetClickHdl(aBtnHdl);
-
-    Link<Control&,void> aLink2 = LINK(this, ScXMLSourceDlg, GetFocusHdl);
-    mpRefEdit->SetGetFocusHdl(aLink2);
-    mpRefBtn->SetGetFocusHdl(aLink2);
-
-    mpLbTree->SetSelectHdl(LINK(this, ScXMLSourceDlg, TreeItemSelectHdl));
-
-    Link<Edit&,void> aLink = LINK(this, ScXMLSourceDlg, RefModifiedHdl);
-    mpRefEdit->SetModifyHdl(aLink);
-
-    mpBtnOk->Disable();
+    , mxBtnSelectSource(m_xBuilder->weld_button("selectsource"))
+    , mxFtSourceFile(m_xBuilder->weld_label("sourcefile"))
+    , mxMapGrid(m_xBuilder->weld_container("mapgrid"))
+    , mxLbTree(m_xBuilder->weld_tree_view("tree"))
+    , mxRefEdit(new formula::WeldRefEdit(m_xBuilder->weld_entry("edit")))
+    , mxRefBtn(new formula::WeldRefButton(m_xBuilder->weld_button("ref")))
+    , mxBtnOk(m_xBuilder->weld_button("ok"))
+    , mxBtnCancel(m_xBuilder->weld_button("cancel"))
+    , maCustomCompare(*mxLbTree)
+    , maCellLinks(maCustomCompare)
+    , maRangeLinks(maCustomCompare)
+{
+    mxLbTree->set_size_request(mxLbTree->get_approximate_digit_width() * 40,
+                               mxLbTree->get_height_rows(15));
+    mxLbTree->set_selection_mode(SelectionMode::Multiple);
+    mxRefEdit->SetReferences(this, nullptr);
+    mxRefBtn->SetReferences(this, mxRefEdit.get());
+
+    mpActiveEdit = mxRefEdit.get();
+
+    maXMLParam.maImgElementDefault = RID_BMP_ELEMENT_DEFAULT;
+    maXMLParam.maImgElementRepeat = RID_BMP_ELEMENT_REPEAT;
+    maXMLParam.maImgAttribute = RID_BMP_ELEMENT_ATTRIBUTE;
+
+    Link<weld::Button&,void> aBtnHdl = LINK(this, ScXMLSourceDlg, BtnPressedHdl);
+    mxBtnSelectSource->connect_clicked(aBtnHdl);
+    mxBtnOk->connect_clicked(aBtnHdl);
+    mxBtnCancel->connect_clicked(aBtnHdl);
+
+    mxLbTree->connect_changed(LINK(this, ScXMLSourceDlg, TreeItemSelectHdl));
+
+    Link<formula::WeldRefEdit&,void> aLink = LINK(this, ScXMLSourceDlg, RefModifiedHdl);
+    mxRefEdit->SetModifyHdl(aLink);
+
+    mxBtnOk->set_sensitive(false);
 
     SetNonLinkable();
-    mpBtnSelectSource->GrabFocus(); // Initial focus is on the select source button.
+    mxBtnSelectSource->grab_focus(); // Initial focus is on the select source button.
 }
 
 ScXMLSourceDlg::~ScXMLSourceDlg()
 {
-    disposeOnce();
-}
-
-void ScXMLSourceDlg::dispose()
-{
-    mpBtnSelectSource.clear();
-    mpFtSourceFile.clear();
-    mpMapGrid.clear();
-    mpLbTree.clear();
-    mpRefEdit.clear();
-    mpRefBtn.clear();
-    mpBtnOk.clear();
-    mpBtnCancel.clear();
-    mpActiveEdit.clear();
-    ScAnyRefDlg::dispose();
 }
 
 bool ScXMLSourceDlg::IsRefInputMode() const
 {
-    return mpActiveEdit != nullptr && mpActiveEdit->IsEnabled();
+    return mpActiveEdit != nullptr && mpActiveEdit->GetWidget()->get_sensitive();
 }
 
 void ScXMLSourceDlg::SetReference(const ScRange& rRange, ScDocument* pDoc)
@@ -171,21 +150,21 @@ void ScXMLSourceDlg::SetActive()
     }
     else
     {
-        GrabFocus();
+        m_xDialog->grab_focus();
     }
 
     RefInputDone();
 }
 
-bool ScXMLSourceDlg::Close()
+void ScXMLSourceDlg::Close()
 {
-    return DoClose(ScXMLSourceDlgWrapper::GetChildWindowId());
+    DoClose(ScXMLSourceDlgWrapper::GetChildWindowId());
 }
 
 void ScXMLSourceDlg::SelectSourceFile()
 {
     sfx2::FileDialogHelper aDlgHelper(ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
-                                      FileDialogFlags::NONE, GetFrameWeld());
+                                      FileDialogFlags::NONE, m_xDialog.get());
 
     uno::Reference<ui::dialogs::XFilePicker3> xFilePicker = aDlgHelper.GetFilePicker();
 
@@ -212,8 +191,7 @@ void ScXMLSourceDlg::SelectSourceFile()
 
     // There should only be one file returned from the file picker.
     maSrcPath = aFiles[0];
-    mpFtSourceFile->SetText(maSrcPath);
-    maHighlightedEntries.clear();
+    mxFtSourceFile->set_label(maSrcPath);
     LoadSourceFileStructure(maSrcPath);
 }
 
@@ -227,124 +205,100 @@ void ScXMLSourceDlg::LoadSourceFileStructure(const OUString& rPath)
     if (!mpXMLContext)
         return;
 
-    mpXMLContext->loadXMLStructure(*mpLbTree, maXMLParam);
-}
-
-void ScXMLSourceDlg::HandleGetFocus(const Control* pCtrl)
-{
-    mpActiveEdit = nullptr;
-    if (pCtrl == mpRefEdit || pCtrl == mpRefBtn)
-        mpActiveEdit = mpRefEdit;
-
-    if (mpActiveEdit)
-        mpActiveEdit->SetSelection(Selection(0, SELECTION_MAX));
+    mpXMLContext->loadXMLStructure(*mxLbTree, maXMLParam);
 }
 
 namespace {
 
-class UnhighlightEntry
-{
-    SvTreeListBox& mrTree;
-public:
-    explicit UnhighlightEntry(SvTreeListBox& rTree) : mrTree(rTree) {}
-
-    void operator() (const SvTreeListEntry* p)
-    {
-        SvViewDataEntry* pView = mrTree.GetViewDataEntry(p);
-        if (!pView)
-            return;
-
-        pView->SetHighlighted(false);
-        mrTree.Invalidate();
-    }
-};
-
 /**
  * When the current entry is a direct or indirect child of a mappable
  * repeat element entry, that entry becomes the reference entry.
  * Otherwise the reference entry equals the current entry.  A reference
  * entry is the entry that stores mapped cell position.
  */
-SvTreeListEntry* getReferenceEntry(const SvTreeListBox& rTree, SvTreeListEntry* pCurEntry)
+std::unique_ptr<weld::TreeIter> getReferenceEntry(const weld::TreeView& rTree, weld::TreeIter& rCurEntry)
 {
-    SvTreeListEntry* pParent = rTree.GetParent(pCurEntry);
-    SvTreeListEntry* pRefEntry = nullptr;
-    while (pParent)
+    std::unique_ptr<weld::TreeIter> xParent(rTree.make_iterator(&rCurEntry));
+    bool bParent = rTree.iter_parent(*xParent);
+    std::unique_ptr<weld::TreeIter> xRefEntry;
+    while (bParent)
     {
-        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pParent);
+        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rTree, *xParent);
         OSL_ASSERT(pUserData);
         if (pUserData->meType == ScOrcusXMLTreeParam::ElementRepeat)
         {
             // This is a repeat element.
-            if (pRefEntry)
+            if (xRefEntry)
             {
                 // Second repeat element encountered. Not good.
-                return pCurEntry;
+                std::unique_ptr<weld::TreeIter> xCurEntry(rTree.make_iterator(&rCurEntry));
+                return xCurEntry;
             }
 
-            pRefEntry = pParent;
+            xRefEntry = rTree.make_iterator(xParent.get());
         }
-        pParent = rTree.GetParent(pParent);
+        bParent = rTree.iter_parent(*xParent);
     }
 
-    return pRefEntry ? pRefEntry : pCurEntry;
-}
+    if (xRefEntry)
+        return xRefEntry;
 
+    std::unique_ptr<weld::TreeIter> xCurEntry(rTree.make_iterator(&rCurEntry));
+    return xCurEntry;
 }
 
+};
+
 void ScXMLSourceDlg::TreeItemSelected()
 {
-    SvTreeListEntry* pEntry = mpLbTree->GetCurEntry();
-    if (!pEntry)
+    std::unique_ptr<weld::TreeIter> xEntry(mxLbTree->make_iterator());
+    if (!mxLbTree->get_cursor(xEntry.get()))
         return;
 
-    if (!maHighlightedEntries.empty())
-    {
-        // Remove highlights from all previously highlighted entries (if any).
-        std::for_each(maHighlightedEntries.begin(), maHighlightedEntries.end(), UnhighlightEntry(*mpLbTree));
-        maHighlightedEntries.clear();
-    }
+    mxLbTree->unselect_all();
+    mxLbTree->select(*xEntry);
 
-    mpCurRefEntry = getReferenceEntry(*mpLbTree, pEntry);
+    mxCurRefEntry = getReferenceEntry(*mxLbTree, *xEntry);
 
-    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mpCurRefEntry);
+    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *mxCurRefEntry);
     OSL_ASSERT(pUserData);
 
     const ScAddress& rPos = pUserData->maLinkedPos;
     if (rPos.IsValid())
     {
         OUString aStr(rPos.Format(ScRefFlags::ADDR_ABS_3D, mpDoc, mpDoc->GetAddressConvention()));
-        mpRefEdit->SetRefString(aStr);
+        mxRefEdit->SetRefString(aStr);
     }
     else
-        mpRefEdit->SetRefString(OUString());
+        mxRefEdit->SetRefString(OUString());
 
     switch (pUserData->meType)
     {
         case ScOrcusXMLTreeParam::Attribute:
-            AttributeSelected(*mpCurRefEntry);
+            AttributeSelected(*mxCurRefEntry);
         break;
         case ScOrcusXMLTreeParam::ElementDefault:
-            DefaultElementSelected(*mpCurRefEntry);
+            DefaultElementSelected(*mxCurRefEntry);
         break;
         case ScOrcusXMLTreeParam::ElementRepeat:
-            RepeatElementSelected(*mpCurRefEntry);
+            RepeatElementSelected(*mxCurRefEntry);
         break;
         default:
             ;
     }
 }
 
-void ScXMLSourceDlg::DefaultElementSelected(SvTreeListEntry& rEntry)
+void ScXMLSourceDlg::DefaultElementSelected(weld::TreeIter& rEntry)
 {
-
-    if (mpLbTree->GetChildCount(&rEntry) > 0)
+    if (mxLbTree->iter_has_child(rEntry))
     {
         // Only an element with no child elements (leaf element) can be linked.
         bool bHasChild = false;
-        for (SvTreeListEntry* pChild = mpLbTree->FirstChild(&rEntry); pChild; pChild = pChild->NextSibling())
+        std::unique_ptr<weld::TreeIter> xChild(mxLbTree->make_iterator(&rEntry));
+        mxLbTree->iter_children(*xChild);
+        do
         {
-            ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pChild);
+            ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *xChild);
             OSL_ASSERT(pUserData);
             if (pUserData->meType != ScOrcusXMLTreeParam::Attribute)
             {
@@ -353,6 +307,7 @@ void ScXMLSourceDlg::DefaultElementSelected(SvTreeListEntry& rEntry)
                 break;
             }
         }
+        while (mxLbTree->iter_next_sibling(*xChild));
 
         if (bHasChild)
         {
@@ -372,7 +327,7 @@ void ScXMLSourceDlg::DefaultElementSelected(SvTreeListEntry& rEntry)
     SetSingleLinkable();
 }
 
-void ScXMLSourceDlg::RepeatElementSelected(SvTreeListEntry& rEntry)
+void ScXMLSourceDlg::RepeatElementSelected(weld::TreeIter& rEntry)
 {
     // Check all its parents first.
 
@@ -393,30 +348,26 @@ void ScXMLSourceDlg::RepeatElementSelected(SvTreeListEntry& rEntry)
         return;
     }
 
-    SvViewDataEntry* p = mpLbTree->GetViewDataEntry(&rEntry);
-    if (!p->IsHighlighted())
+    if (!mxLbTree->is_selected(rEntry))
     {
         // Highlight the entry if not highlighted already.  This can happen
         // when the current entry is a child entry of a repeat element entry.
-        p->SetHighlighted(true);
-        mpLbTree->Invalidate();
-        maHighlightedEntries.push_back(&rEntry);
+        mxLbTree->select(rEntry);
     }
 
     SelectAllChildEntries(rEntry);
     SetRangeLinkable();
 }
 
-void ScXMLSourceDlg::AttributeSelected(SvTreeListEntry& rEntry)
+void ScXMLSourceDlg::AttributeSelected(weld::TreeIter& rEntry)
 {
     // Check all its parent elements and make sure non of them are linked nor
     // repeat elements.  In attribute's case, it's okay to have the immediate
     // parent element linked (but not range-linked).
+    std::unique_ptr<weld::TreeIter> xParent(mxLbTree->make_iterator(&rEntry));
+    mxLbTree->iter_parent(*xParent);
 
-    SvTreeListEntry* pParent = mpLbTree->GetParent(&rEntry);
-    OSL_ASSERT(pParent); // attribute should have a parent element.
-
-    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pParent);
+    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *xParent);
     OSL_ASSERT(pUserData);
     if (pUserData->maLinkedPos.IsValid() && pUserData->mbRangeParent)
     {
@@ -436,39 +387,39 @@ void ScXMLSourceDlg::AttributeSelected(SvTreeListEntry& rEntry)
 
 void ScXMLSourceDlg::SetNonLinkable()
 {
-    mpMapGrid->Disable();
+    mxMapGrid->set_sensitive(false);
 }
 
 void ScXMLSourceDlg::SetSingleLinkable()
 {
-    mpMapGrid->Enable();
+    mxMapGrid->set_sensitive(true);
 }
 
 void ScXMLSourceDlg::SetRangeLinkable()
 {
-    mpMapGrid->Enable();
+    mxMapGrid->set_sensitive(true);
 }
 
-void ScXMLSourceDlg::SelectAllChildEntries(SvTreeListEntry& rEntry)
+void ScXMLSourceDlg::SelectAllChildEntries(weld::TreeIter& rEntry)
 {
-    SvTreeListEntries& rChildren = rEntry.GetChildEntries();
-    for (auto const& it : rChildren)
+    std::unique_ptr<weld::TreeIter> xChild(mxLbTree->make_iterator(&rEntry));
+    if (!mxLbTree->iter_children(*xChild))
+        return;
+    do
     {
-        SvTreeListEntry& r = *it;
-        SelectAllChildEntries(r); // select recursively.
-        SvViewDataEntry* p = mpLbTree->GetViewDataEntry(&r);
-        p->SetHighlighted(true);
-        mpLbTree->Invalidate();
-        maHighlightedEntries.push_back(&r);
-    }
+        SelectAllChildEntries(*xChild); // select recursively.
+        mxLbTree->select(*xChild);
+    } while (mxLbTree->iter_next_sibling(*xChild));
 }
 
-bool ScXMLSourceDlg::IsParentDirty(SvTreeListEntry* pEntry) const
+bool ScXMLSourceDlg::IsParentDirty(weld::TreeIter* pEntry) const
 {
-    SvTreeListEntry* pParent = mpLbTree->GetParent(pEntry);
-    while (pParent)
+    std::unique_ptr<weld::TreeIter> xParent(mxLbTree->make_iterator(pEntry));
+    if (!mxLbTree->iter_parent(*xParent))
+        return false;
+    do
     {
-        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pParent);
+        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *xParent);
         assert(pUserData);
         if (pUserData->maLinkedPos.IsValid())
         {
@@ -480,16 +431,20 @@ bool ScXMLSourceDlg::IsParentDirty(SvTreeListEntry* pEntry) const
             // This is a repeat element.
             return true;
         }
-        pParent = mpLbTree->GetParent(pParent);
     }
+    while (mxLbTree->iter_parent(*xParent));
     return false;
 }
 
-bool ScXMLSourceDlg::IsChildrenDirty(SvTreeListEntry* pEntry) const
+bool ScXMLSourceDlg::IsChildrenDirty(weld::TreeIter* pEntry) const
 {
-    for (SvTreeListEntry* pChild = mpLbTree->FirstChild(pEntry); pChild; pChild = pChild->NextSibling())
+    std::unique_ptr<weld::TreeIter> xChild(mxLbTree->make_iterator(pEntry));
+    if (!mxLbTree->iter_children(*xChild))
+        return false;
+
+    do
     {
-        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*pChild);
+        ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *xChild);
         OSL_ASSERT(pUserData);
         if (pUserData->maLinkedPos.IsValid())
             // Already linked.
@@ -502,10 +457,10 @@ bool ScXMLSourceDlg::IsChildrenDirty(SvTreeListEntry* pEntry) const
         if (pUserData->meType == ScOrcusXMLTreeParam::ElementDefault)
         {
             // Check recursively.
-            if (IsChildrenDirty(pChild))
+            if (IsChildrenDirty(xChild.get()))
                 return true;
         }
-    }
+    } while (mxLbTree->iter_next_sibling(*xChild));
 
     return false;
 }
@@ -517,18 +472,17 @@ namespace {
  */
 void getFieldLinks(
     ScOrcusImportXMLParam::RangeLink& rRangeLink, std::vector<size_t>& rNamespaces,
-    const SvTreeListBox& rTree, const SvTreeListEntry& rEntry)
+    const weld::TreeView& rTree, const weld::TreeIter& rEntry)
 {
-    const SvTreeListEntries& rChildren = rEntry.GetChildEntries();
-    if (rChildren.empty())
+    std::unique_ptr<weld::TreeIter> xChild(rTree.make_iterator(&rEntry));
+    if (!rTree.iter_children(*xChild))
         // No more children.  We're done.
         return;
 
-    for (auto const& it : rChildren)
+    do
     {
-        const SvTreeListEntry& rChild = *it;
-        OUString aPath = getXPath(rTree, rChild, rNamespaces);
-        const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rChild);
+        OUString aPath = getXPath(rTree, *xChild, rNamespaces);
+        const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rTree, *xChild);
 
         if (pUserData && pUserData->mbLeafNode)
         {
@@ -538,8 +492,8 @@ void getFieldLinks(
         }
 
         // Walk recursively.
-        getFieldLinks(rRangeLink, rNamespaces, rTree, rChild);
-    }
+        getFieldLinks(rRangeLink, rNamespaces, rTree, *xChild);
+    } while (rTree.iter_next_sibling(*xChild));
 }
 
 void removeDuplicates(std::vector<size_t>& rArray)
@@ -562,11 +516,10 @@ void ScXMLSourceDlg::OkPressed()
 
     // Convert single cell links.
     {
-        for (const SvTreeListEntry* pCellLink : maCellLinks)
+        for (const auto& rEntry : maCellLinks)
         {
-            const SvTreeListEntry& rEntry = *pCellLink;
-            OUString aPath = getXPath(*mpLbTree, rEntry, aParam.maNamespaces);
-            const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry);
+            OUString aPath = getXPath(*mxLbTree, *rEntry, aParam.maNamespaces);
+            const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *rEntry);
 
             aParam.maCellLinks.emplace_back(
                     pUserData->maLinkedPos, OUStringToOString(aPath, RTL_TEXTENCODING_UTF8));
@@ -576,16 +529,15 @@ void ScXMLSourceDlg::OkPressed()
     // Convert range links. For now, an element with range link takes all its
     // child elements as its fields.
     {
-        for (const SvTreeListEntry* pRangeLink : maRangeLinks)
+        for (const auto& rEntry: maRangeLinks)
         {
-            const SvTreeListEntry& rEntry = *pRangeLink;
-            const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(rEntry);
+            const ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *rEntry);
 
             ScOrcusImportXMLParam::RangeLink aRangeLink;
             aRangeLink.maPos = pUserData->maLinkedPos;
 
             // Go through all its child elements.
-            getFieldLinks(aRangeLink, aParam.maNamespaces, *mpLbTree, rEntry);
+            getFieldLinks(aRangeLink, aParam.maNamespaces, *mxLbTree, *rEntry);
 
             aParam.maRangeLinks.push_back(aRangeLink);
         }
@@ -606,17 +558,17 @@ void ScXMLSourceDlg::OkPressed()
     if (pViewShell)
         pViewShell->PaintGrid();
 
-    Close();
+    m_xDialog->response(RET_OK);
 }
 
 void ScXMLSourceDlg::CancelPressed()
 {
-    Close();
+    m_xDialog->response(RET_CANCEL);
 }
 
 void ScXMLSourceDlg::RefEditModified()
 {
-    OUString aRefStr = mpRefEdit->GetText();
+    OUString aRefStr = mxRefEdit->GetText();
 
     // Check if the address is valid.
     ScAddress aLinkedPos;
@@ -625,17 +577,17 @@ void ScXMLSourceDlg::RefEditModified()
 
     // TODO: For some unknown reason, setting the ref invalid will hide the text altogether.
     // Find out how to make this work.
-//  mpRefEdit->SetRefValid(bValid);
+//  mxRefEdit->SetRefValid(bValid);
 
     if (!bValid)
         aLinkedPos.SetInvalid();
 
     // Set this address to the current reference entry.
-    if (!mpCurRefEntry)
+    if (!mxCurRefEntry)
         // This should never happen.
         return;
 
-    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mpCurRefEntry);
+    ScOrcusXMLTreeParam::EntryData* pUserData = ScOrcusXMLTreeParam::getUserData(*mxLbTree, *mxCurRefEntry);
     if (!pUserData)
         // This should never happen either.
         return;
@@ -647,44 +599,39 @@ void ScXMLSourceDlg::RefEditModified()
     if (bRepeatElem)
     {
         if (bValid)
-            maRangeLinks.insert(mpCurRefEntry);
+            maRangeLinks.insert(mxLbTree->make_iterator(mxCurRefEntry.get()));
         else
-            maRangeLinks.erase(mpCurRefEntry);
+            maRangeLinks.erase(mxCurRefEntry);
     }
     else
     {
         if (bValid)
-            maCellLinks.insert(mpCurRefEntry);
+            maCellLinks.insert(mxLbTree->make_iterator(mxCurRefEntry.get()));
         else
-            maCellLinks.erase(mpCurRefEntry);
+            maCellLinks.erase(mxCurRefEntry);
     }
 
     // Enable the import button only when at least one link exists.
     bool bHasLink = !maCellLinks.empty() || !maRangeLinks.empty();
-    mpBtnOk->Enable(bHasLink);
-}
-
-IMPL_LINK(ScXMLSourceDlg, GetFocusHdl, Control&, rCtrl, void)
-{
-    HandleGetFocus(&rCtrl);
+    mxBtnOk->set_sensitive(bHasLink);
 }
 
-IMPL_LINK(ScXMLSourceDlg, BtnPressedHdl, Button*, pBtn, void)
+IMPL_LINK(ScXMLSourceDlg, BtnPressedHdl, weld::Button&, rBtn, void)
 {
-    if (pBtn == mpBtnSelectSource)
+    if (&rBtn == mxBtnSelectSource.get())
         SelectSourceFile();
-    else if (pBtn == mpBtnOk)
+    else if (&rBtn == mxBtnOk.get())
         OkPressed();
-    else if (pBtn == mpBtnCancel)
+    else if (&rBtn == mxBtnCancel.get())
         CancelPressed();
 }
 
-IMPL_LINK_NOARG(ScXMLSourceDlg, TreeItemSelectHdl, SvTreeListBox*, void)
+IMPL_LINK_NOARG(ScXMLSourceDlg, TreeItemSelectHdl, weld::TreeView&, void)
 {
     TreeItemSelected();
 }
 
-IMPL_LINK_NOARG(ScXMLSourceDlg, RefModifiedHdl, Edit&, void)
+IMPL_LINK_NOARG(ScXMLSourceDlg, RefModifiedHdl, formula::WeldRefEdit&, void)
 {
     RefEditModified();
 }
diff --git a/sc/uiconfig/scalc/ui/xmlsourcedialog.ui b/sc/uiconfig/scalc/ui/xmlsourcedialog.ui
index aa153f6a9cc9..b3fca75ef54f 100644
--- a/sc/uiconfig/scalc/ui/xmlsourcedialog.ui
+++ b/sc/uiconfig/scalc/ui/xmlsourcedialog.ui
@@ -1,24 +1,95 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.3 -->
+<!-- Generated with glade 3.22.1 -->
 <interface domain="sc">
   <requires lib="gtk+" version="3.18"/>
-  <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkImage" id="image1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
-    <property name="pixbuf">sc/res/file.png</property>
+    <property name="icon_name">sc/res/file.png</property>
+  </object>
+  <object class="GtkTreeStore" id="liststore1">
+    <columns>
+      <!-- column-name expander -->
+      <column type="GdkPixbuf"/>
+      <!-- column-name text -->
+      <column type="gchararray"/>
+      <!-- column-name id -->
+      <column type="gchararray"/>
+    </columns>
   </object>
   <object class="GtkDialog" id="XMLSourceDialog">
     <property name="can_focus">False</property>
     <property name="border_width">6</property>
     <property name="title" translatable="yes" context="xmlsourcedialog|XMLSourceDialog">XML Source</property>
     <property name="resizable">False</property>
+    <property name="default_width">0</property>
+    <property name="default_height">0</property>
     <property name="type_hint">dialog</property>
+    <child>
+      <placeholder/>
+    </child>
     <child internal-child="vbox">
       <object class="GtkBox" id="dialog-vbox1">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">12</property>
+        <child internal-child="action_area">
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="can_focus">False</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="ok">
+                <property name="label" translatable="yes" context="xmlsourcedialog|ok">_Import</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="can_default">True</property>
+                <property name="has_default">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_underline">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="help">
+                <property name="label">gtk-help</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+                <property name="secondary">True</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkFrame" id="itemframe">
             <property name="visible">True</property>
@@ -57,8 +128,8 @@
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
                         <property name="hexpand">True</property>
-                        <property name="xalign">0</property>
                         <property name="label" translatable="yes" context="xmlsourcedialog|sourcefile">- not set -</property>
+                        <property name="xalign">0</property>
                       </object>
                       <packing>
                         <property name="left_attach">1</property>
@@ -109,21 +180,6 @@
                     <property name="column_spacing">12</property>
                     <property name="row_homogeneous">True</property>
                     <child>
-                      <object class="vcllo-SvTreeListBox" id="tree:border">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="vexpand">True</property>
-                        <child internal-child="selection">
-                          <object class="GtkTreeSelection" id="Tree List-selection1"/>
-                        </child>
-                      </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">0</property>
-                      </packing>
-                    </child>
-                    <child>
                       <object class="GtkGrid" id="mapgrid">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
@@ -134,9 +190,9 @@
                           <object class="GtkLabel" id="label5">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
-                            <property name="xalign">0</property>
                             <property name="label" translatable="yes" context="xmlsourcedialog|label5">Mapped cell:</property>
                             <property name="use_underline">True</property>
+                            <property name="xalign">0</property>
                           </object>
                           <packing>
                             <property name="left_attach">0</property>
@@ -145,7 +201,7 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="foruilo-RefEdit" id="edit">
+                          <object class="GtkEntry" id="edit">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="width_chars">20</property>
@@ -156,7 +212,7 @@
                           </packing>
                         </child>
                         <child>
-                          <object class="foruilo-RefButton" id="ref">
+                          <object class="GtkButton" id="ref">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
                             <property name="receives_default">True</property>
@@ -172,6 +228,53 @@
                         <property name="top_attach">0</property>
                       </packing>
                     </child>
+                    <child>
+                      <object class="GtkScrolledWindow">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="hexpand">True</property>
+                        <property name="vexpand">True</property>
+                        <property name="shadow_type">in</property>
+                        <child>
+                          <object class="GtkTreeView" id="tree">
+                            <property name="width_request">-1</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="hexpand">True</property>
+                            <property name="vexpand">True</property>
+                            <property name="model">liststore1</property>
+                            <property name="headers_visible">False</property>
+                            <property name="search_column">1</property>
+                            <property name="show_expanders">True</property>
+                            <child internal-child="selection">
+                              <object class="GtkTreeSelection" id="Macro Library List-selection1"/>
+                            </child>
+                            <child>
+                              <object class="GtkTreeViewColumn" id="treeviewcolumn2">
+                                <property name="spacing">6</property>
+                                <child>
+                                  <object class="GtkCellRendererPixbuf" id="cellrenderertext4"/>
+                                  <attributes>
+                                    <attribute name="pixbuf">0</attribute>
+                                  </attributes>
+                                </child>
+                                <child>
+                                  <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                                  <attributes>
+                                    <attribute name="text">1</attribute>
+                                  </attributes>
+                                </child>
+                              </object>
+                            </child>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="left_attach">0</property>
+                        <property name="top_attach">0</property>
+                      </packing>
+                    </child>
                   </object>
                 </child>
               </object>
@@ -193,64 +296,6 @@
             <property name="position">1</property>
           </packing>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <object class="GtkButton" id="ok">
-                <property name="label" translatable="yes" context="xmlsourcedialog|ok">_Import</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="has_default">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="cancel">
-                <property name="label">gtk-cancel</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkButton" id="help">
-                <property name="label">gtk-help</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
-                <property name="yalign">0.55000001192092896</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-                <property name="secondary">True</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
       </object>
     </child>
     <action-widgets>
diff --git a/solenv/sanitizers/ui/modules/scalc.false b/solenv/sanitizers/ui/modules/scalc.false
index dcfc4752be91..1b76ef53568b 100644
--- a/solenv/sanitizers/ui/modules/scalc.false
+++ b/solenv/sanitizers/ui/modules/scalc.false
@@ -57,6 +57,7 @@ sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='variable2-range-button'] bu
 sc/uiconfig/scalc/ui/ttestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
 sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] no-labelled-by
 sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] button-no-label
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkButton[@id='ref'] button-no-label
 sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable1-range-button'] button-no-label
 sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='variable2-range-button'] button-no-label
 sc/uiconfig/scalc/ui/ztestdialog.ui://GtkButton[@id='output-range-button'] button-no-label
diff --git a/solenv/sanitizers/ui/modules/scalc.suppr b/solenv/sanitizers/ui/modules/scalc.suppr
index 312079c8a5bf..37dbd6754bf4 100644
--- a/solenv/sanitizers/ui/modules/scalc.suppr
+++ b/solenv/sanitizers/ui/modules/scalc.suppr
@@ -232,6 +232,6 @@ sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkButton[@id='validref'] no-la
 sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkTextView[@id='minlist'] no-labelled-by
 sc/uiconfig/scalc/ui/validationcriteriapage.ui://GtkLabel[@id='hintft'] orphan-label
 sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='sourcefile'] orphan-label
-sc/uiconfig/scalc/ui/xmlsourcedialog.ui://vcllo-SvTreeListBox[@id='tree:border'] no-labelled-by
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkTreeView[@id='tree'] no-labelled-by
 sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkLabel[@id='label5'] orphan-label
-sc/uiconfig/scalc/ui/xmlsourcedialog.ui://foruilo-RefEdit[@id='edit'] no-labelled-by
+sc/uiconfig/scalc/ui/xmlsourcedialog.ui://GtkEntry[@id='edit'] no-labelled-by
commit 7d53d5899bc798b49c99d36e4611204c05585915
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Apr 29 09:51:37 2019 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Apr 29 14:31:37 2019 +0200

    gtk_tree_model_iter_parent modifies the 1st arg, not 2nd
    
    Change-Id: I015022c4dd68f152ef5e56947031ccf4bfaf2b1c
    Reviewed-on: https://gerrit.libreoffice.org/71516
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index e2024dd6a2c6..1893335fa645 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7000,7 +7000,6 @@ public:
         }
         if (!gtk_tree_model_iter_parent(pModel, &tmp, &iter))
             return false;
-        tmp = iter;
         if (gtk_tree_model_iter_next(pModel, &tmp))
         {
             rGtkIter.iter = tmp;


More information about the Libreoffice-commits mailing list