From 267c6f2ac71f92999e969232431ba04678e7437e Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 07:54:39 +0200 Subject: Adding upstream version 4:24.2.0. Signed-off-by: Daniel Baumann --- sw/source/ui/vba/vbacontentcontrollistentries.cxx | 166 ++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 sw/source/ui/vba/vbacontentcontrollistentries.cxx (limited to 'sw/source/ui/vba/vbacontentcontrollistentries.cxx') diff --git a/sw/source/ui/vba/vbacontentcontrollistentries.cxx b/sw/source/ui/vba/vbacontentcontrollistentries.cxx new file mode 100644 index 0000000000..552397e156 --- /dev/null +++ b/sw/source/ui/vba/vbacontentcontrollistentries.cxx @@ -0,0 +1,166 @@ +/* -*- 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 "vbacontentcontrollistentries.hxx" + +using namespace ::ooo::vba; +using namespace ::com::sun::star; + +namespace +{ +class ContentControlListEntriesEnumWrapper : public EnumerationHelper_BASE +{ + uno::Reference mxIndexAccess; + sal_Int32 mnIndex; + +public: + explicit ContentControlListEntriesEnumWrapper( + uno::Reference xIndexAccess) + : mxIndexAccess(xIndexAccess) + , mnIndex(0) + { + } + + virtual sal_Bool SAL_CALL hasMoreElements() override + { + return (mnIndex < mxIndexAccess->getCount()); + } + + virtual uno::Any SAL_CALL nextElement() override + { + if (mnIndex < mxIndexAccess->getCount()) + { + return mxIndexAccess->getByIndex(mnIndex++); + } + throw container::NoSuchElementException(); + } +}; + +class ContentControlListEntryCollectionHelper + : public ::cppu::WeakImplHelper +{ +private: + uno::Reference mxParent; + uno::Reference mxContext; + std::shared_ptr m_pCC; + +public: + /// @throws css::uno::RuntimeException + ContentControlListEntryCollectionHelper(uno::Reference xParent, + uno::Reference xContext, + std::shared_ptr pCC) + : mxParent(xParent) + , mxContext(xContext) + , m_pCC(pCC) + { + } + + sal_Int32 SAL_CALL getCount() override { return m_pCC->GetListItems().size(); } + + uno::Any SAL_CALL getByIndex(sal_Int32 Index) override + { + if (Index < 0 || Index >= getCount()) + throw lang::IndexOutOfBoundsException(); + + return uno::Any(uno::Reference( + new SwVbaContentControlListEntry(mxParent, mxContext, m_pCC, Index))); + } + + uno::Type SAL_CALL getElementType() override + { + return cppu::UnoType::get(); + } + + sal_Bool SAL_CALL hasElements() override { return getCount() != 0; } + + // XEnumerationAccess + uno::Reference SAL_CALL createEnumeration() override + { + return new ContentControlListEntriesEnumWrapper(this); + } +}; +} + +/** + * DropDownLists and ComboBoxes contain a list of name/value pairs to choose from. + * Use of DropDownListEntries from any other control is invalid. + */ +SwVbaContentControlListEntries::SwVbaContentControlListEntries( + const uno::Reference& xParent, + const uno::Reference& xContext, std::shared_ptr pCC) + : SwVbaContentControlListEntries_BASE( + xParent, xContext, + uno::Reference( + new ContentControlListEntryCollectionHelper(xParent, xContext, pCC))) + , m_pCC(pCC) +{ +} + +uno::Reference +SwVbaContentControlListEntries::Add(const OUString& rName, const uno::Any& rValue, + const uno::Any& rIndex) +{ + // No duplicate Names allowed in VBA + for (auto& rListItem : m_pCC->GetListItems()) + { + if (rListItem.ToString() == rName) + return uno::Reference(); + } + + sal_Int32 nZIndex = SAL_MAX_INT32; + rIndex >>= nZIndex; + // rIndex is 1-based, nZIndex is 0-based. If rIndex is not given, then add as the last choice. + assert(nZIndex > 0); + --nZIndex; + nZIndex = std::min(static_cast(nZIndex), m_pCC->GetListItems().size()); + + OUString sValue; + rValue >>= sValue; + if (m_pCC->AddListItem(nZIndex, rName, sValue)) + { + return uno::Reference( + new SwVbaContentControlListEntry(mxParent, mxContext, m_pCC, nZIndex)); + } + + return uno::Reference(); +} + +void SwVbaContentControlListEntries::Clear() { m_pCC->ClearListItems(); } + +sal_Int32 SwVbaContentControlListEntries::getCount() { return m_pCC->GetListItems().size(); } + +// XEnumerationAccess +uno::Type SwVbaContentControlListEntries::getElementType() +{ + return cppu::UnoType::get(); +} + +uno::Reference SwVbaContentControlListEntries::createEnumeration() +{ + return new ContentControlListEntriesEnumWrapper(m_xIndexAccess); +} + +// SwVbaContentControlListEntries_BASE +uno::Any SwVbaContentControlListEntries::createCollectionObject(const uno::Any& aSource) +{ + return aSource; +} + +OUString SwVbaContentControlListEntries::getServiceImplName() +{ + return "SwVbaContentControlListEntries"; +} + +uno::Sequence SwVbaContentControlListEntries::getServiceNames() +{ + static uno::Sequence const sNames{ "ooo.vba.word.ContentControlListEntries" }; + return sNames; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3