/* -*- 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/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ #pragma once #include #include #include #include #include #include #include #include class EditTextObject; enum class OutlinerMode; enum class TextRotation; /** * This is the guts of OutlinerParaObject, refcounted and shared among * multiple instances of OutlinerParaObject. */ struct EDITENG_DLLPUBLIC OutlinerParaObjData { // data members std::unique_ptr mpEditTextObject; ParagraphDataVector maParagraphDataVector; bool mbIsEditDoc; // constructor OutlinerParaObjData( std::unique_ptr pEditTextObject, ParagraphDataVector&& rParagraphDataVector, bool bIsEditDoc ); OutlinerParaObjData( const OutlinerParaObjData& r ); OutlinerParaObjData( OutlinerParaObjData&& r ) = default; // assignment operator OutlinerParaObjData& operator=(const OutlinerParaObjData& rCandidate) = delete; // destructor ~OutlinerParaObjData(); bool operator==(const OutlinerParaObjData& rCandidate) const; // #i102062# bool isWrongListEqual(const OutlinerParaObjData& rCompare) const; }; class EDITENG_DLLPUBLIC OutlinerParaObject { friend class std::optional; ::o3tl::cow_wrapper< OutlinerParaObjData > mpImpl; OutlinerParaObject(std::nullopt_t) noexcept : mpImpl(std::nullopt) {} OutlinerParaObject( const OutlinerParaObject& other, std::nullopt_t ) noexcept : mpImpl(other.mpImpl, std::nullopt) {} public: // constructors/destructor OutlinerParaObject(std::unique_ptr, ParagraphDataVector&&, bool bIsEditDoc); OutlinerParaObject( std::unique_ptr ); OutlinerParaObject( const OutlinerParaObject&); OutlinerParaObject(OutlinerParaObject&&) noexcept; ~OutlinerParaObject(); // assignment operator OutlinerParaObject& operator=(const OutlinerParaObject& rCandidate); OutlinerParaObject& operator=(OutlinerParaObject&&) noexcept; // compare operator bool operator==(const OutlinerParaObject& rCandidate) const; bool operator!=(const OutlinerParaObject& rCandidate) const { return !operator==(rCandidate); } // #i102062# bool isWrongListEqual(const OutlinerParaObject& rCompare) const; // outliner mode access OutlinerMode GetOutlinerMode() const; void SetOutlinerMode(OutlinerMode nNew); // vertical access bool IsEffectivelyVertical() const; bool GetVertical() const; bool IsTopToBottom() const; void SetVertical(bool bNew); void SetRotation(TextRotation nRotation); TextRotation GetRotation() const; // data read access sal_Int32 Count() const; sal_Int16 GetDepth(sal_Int32 nPara) const; const EditTextObject& GetTextObject() const; const ParagraphData& GetParagraphData(sal_Int32 nIndex) const; // portion info support void ClearPortionInfo(); // StyleSheet support bool ChangeStyleSheets(std::u16string_view rOldName, SfxStyleFamily eOldFamily, const OUString& rNewName, SfxStyleFamily eNewFamily); void ChangeStyleSheetName(SfxStyleFamily eFamily, std::u16string_view rOldName, const OUString& rNewName); void SetStyleSheets(sal_uInt16 nLevel, const OUString& rNewName, const SfxStyleFamily& rNewFamily); void dumpAsXml(xmlTextWriterPtr pWriter) const; }; namespace std { /** Specialise std::optional template for the case where we are wrapping a o3tl::cow_wrapper type, and we can make the pointer inside the cow_wrapper act as an empty value, and save ourselves some storage */ template<> class optional { public: optional() noexcept : maParaObject(std::nullopt) {} optional(std::nullopt_t) noexcept : maParaObject(std::nullopt) {} optional(const optional& other) : maParaObject(other.maParaObject, std::nullopt) {} optional(optional&& other) noexcept : maParaObject(std::move(other.maParaObject)) {} optional(OutlinerParaObject&& para) noexcept : maParaObject(std::move(para)) {} optional(const OutlinerParaObject& para) noexcept : maParaObject(para) {} template< class... Args > explicit optional( std::in_place_t, Args&&... args ) : maParaObject(std::forward(args)...) {} optional& operator=(optional const & other) { maParaObject = other.maParaObject; return *this; } optional& operator=(optional&& other) noexcept { maParaObject = std::move(other.maParaObject); return *this; } template< class... Args > void emplace(Args&&... args ) { maParaObject = OutlinerParaObject(std::forward(args)...); } bool has_value() const noexcept { return !maParaObject.mpImpl.empty(); } explicit operator bool() const noexcept { return !maParaObject.mpImpl.empty(); } void reset() { maParaObject.mpImpl.set_empty(); } OutlinerParaObject& value() { throwIfEmpty(); return maParaObject; } OutlinerParaObject& operator*() { throwIfEmpty(); return maParaObject; } const OutlinerParaObject& operator*() const { throwIfEmpty(); return maParaObject; } OutlinerParaObject* operator->() { throwIfEmpty(); return &maParaObject; } const OutlinerParaObject* operator->() const { throwIfEmpty(); return &maParaObject; } private: void throwIfEmpty() const { if (maParaObject.mpImpl.empty()) throw std::logic_error("empty std::optional"); } OutlinerParaObject maParaObject; }; }; /* vim:set shiftwidth=4 softtabstop=4 expandtab: */