    /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
    /*
     * This file is part of the LibreOffice project.
     *
     * This Source Code Form is subject to the terms of the Mozilla Public
     * License, v. 2.0. If a copy of the MPL was not distributed with this
     * file, You can obtain one at http://mozilla.org/MPL/2.0/.
     */

    #include <memory>
    #include <uitest/uiobject.hxx>

    #include <svtools/treelistbox.hxx>
    #include <svtools/simptabl.hxx>

    TreeListUIObject::TreeListUIObject(const VclPtr<SvTreeListBox>& xTreeList):
        WindowUIObject(xTreeList),
        mxTreeList(xTreeList)
    {
    }

    namespace {

    bool isCheckBoxList(const VclPtr<SvTreeListBox>& xTreeList)
    {
        return (xTreeList->GetTreeFlags() & SvTreeFlags::CHKBTN) == SvTreeFlags::CHKBTN;
    }

    }

    StringMap TreeListUIObject::get_state()
    {
        StringMap aMap = WindowUIObject::get_state();

        aMap["SelectionCount"] = OUString::number(mxTreeList->GetSelectionCount());
        aMap["VisibleCount"] = OUString::number(mxTreeList->GetVisibleCount());
        aMap["Children"] = OUString::number(mxTreeList->GetChildCount(nullptr));
        aMap["LevelChildren"] = OUString::number(mxTreeList->GetLevelChildCount(nullptr));
        aMap["CheckBoxList"] = OUString::boolean(isCheckBoxList(mxTreeList));
        return aMap;
    }

    void TreeListUIObject::execute(const OUString& rAction,
            const StringMap& rParameters)
    {
        if (rAction.isEmpty())
        {
        }
        else
            WindowUIObject::execute(rAction, rParameters);
    }

    std::unique_ptr<UIObject> TreeListUIObject::get_child(const OUString& rID)
    {
        sal_Int32 nID = rID.toInt32();
        if (nID >= 0)
        {
            SvTreeListEntry* pEntry = mxTreeList->GetEntry(nullptr, nID);
            if (!pEntry)
                return nullptr;

            return std::unique_ptr<UIObject>(new TreeListEntryUIObject(mxTreeList, pEntry));
        }

        return nullptr;
    }

    std::set<OUString> TreeListUIObject::get_children() const
    {
        std::set<OUString> aChildren;

        size_t nChildren = mxTreeList->GetLevelChildCount(nullptr);
        for (size_t i = 0; i < nChildren; ++i)
        {
            aChildren.insert(OUString::number(i));
        }

        return aChildren;
    }

    OUString TreeListUIObject::get_name() const
    {
        return OUString("TreeListUIObject");
    }

    std::unique_ptr<UIObject> TreeListUIObject::create(vcl::Window* pWindow)
    {
        SvTreeListBox* pTreeList = dynamic_cast<SvTreeListBox*>(pWindow);
        assert(pTreeList);
        return std::unique_ptr<UIObject>(new TreeListUIObject(pTreeList));
    }

    TreeListEntryUIObject::TreeListEntryUIObject(const VclPtr<SvTreeListBox>& xTreeList, SvTreeListEntry* pEntry):
        mxTreeList(xTreeList),
        mpEntry(pEntry)
    {
    }

    StringMap TreeListEntryUIObject::get_state()
    {
        StringMap aMap;

        aMap["Text"] = mxTreeList->GetEntryText(mpEntry);
        aMap["Children"] = OUString::number(mxTreeList->GetLevelChildCount(mpEntry));
        aMap["VisibleChildCount"] = OUString::number(mxTreeList->GetVisibleChildCount(mpEntry));

        return aMap;
    }

    void TreeListEntryUIObject::execute(const OUString& rAction, const StringMap& /*rParameters*/)
    {
        if (rAction == "COLLAPSE")
        {
            mxTreeList->Collapse(mpEntry);
        }
        else if (rAction == "EXPAND")
        {
            mxTreeList->Expand(mpEntry);
        }
        else if (rAction == "SELECT")
        {
            mxTreeList->Select(mpEntry);
        }
        else if (rAction == "DESELECT")
        {
            mxTreeList->Select(mpEntry, false);
        }
        else if (rAction == "CLICK")
        {
            if (!isCheckBoxList(mxTreeList))
                return;
            SvButtonState eState = mxTreeList->GetCheckButtonState(mpEntry);
            eState = eState == SvButtonState::Checked ? SvButtonState::Unchecked : SvButtonState::Checked;
            mxTreeList->SetCheckButtonState(mpEntry, eState);
            mxTreeList->CheckButtonHdl();
        }
    }

    std::unique_ptr<UIObject> TreeListEntryUIObject::get_child(const OUString& rID)
    {
        sal_Int32 nID = rID.toInt32();
        if (nID >= 0)
        {
            SvTreeListEntry* pEntry = mxTreeList->GetEntry(mpEntry, nID);
            if (!pEntry)
                return nullptr;

            return std::unique_ptr<UIObject>(new TreeListEntryUIObject(mxTreeList, pEntry));
        }

        return nullptr;
    }

    std::set<OUString> TreeListEntryUIObject::get_children() const
    {
        std::set<OUString> aChildren;

        size_t nChildren = mxTreeList->GetLevelChildCount(mpEntry);
        for (size_t i = 0; i < nChildren; ++i)
        {
            aChildren.insert(OUString::number(i));
        }

        return aChildren;
    }

    OUString TreeListEntryUIObject::get_type() const
    {
        return OUString("TreeListEntry");
    }

    SimpleTableUIObject::SimpleTableUIObject(const VclPtr<SvSimpleTable>& xTable):
        TreeListUIObject(xTable),
        mxTable(xTable)
    {
    }

    StringMap SimpleTableUIObject::get_state()
    {
        StringMap aMap = TreeListUIObject::get_state();

        aMap["ColumnCount"] = OUString::number(mxTable->GetColumnCount());
        aMap["RowCount"] = OUString::number(mxTable->GetRowCount());
        aMap["SelectedRowCount"] = OUString::number(mxTable->GetSelectedRowCount());
        aMap["SelectedColumnCount"] = OUString::number(mxTable->GetSelectedColumnCount());
        aMap["EntryCount"] = OUString::number(mxTable->GetEntryCount());

        return aMap;
    }

    OUString SimpleTableUIObject::get_type() const
    {
        return OUString("SimpleTable");
    }

    std::unique_ptr<UIObject> SimpleTableUIObject::createFromContainer(vcl::Window* pWindow)
    {
        SvSimpleTableContainer* pTableContainer = dynamic_cast<SvSimpleTableContainer*>(pWindow);
        assert(pTableContainer);
        return std::unique_ptr<UIObject>(new SimpleTableUIObject(pTableContainer->GetTable()));
    }

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

↑ V522 There might be dereferencing of a potential null pointer 'pTableContainer'.