office-gobmx/include/editeng/outlobj.hxx
Noel Grandin a5a6071264 loplugin:moveparam in editeng
Change-Id: Id8118e5f5b7acbff4f04935560c663b36093a5fd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123189
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
2021-10-07 16:22:48 +02:00

204 lines
6.9 KiB
C++

/* -*- 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 <editeng/paragraphdata.hxx>
#include <editeng/editengdllapi.h>
#include <rtl/ustring.hxx>
#include <svl/poolitem.hxx>
#include <svl/style.hxx>
#include <o3tl/cow_wrapper.hxx>
#include <stdexcept>
#include <memory>
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<EditTextObject> mpEditTextObject;
ParagraphDataVector maParagraphDataVector;
bool mbIsEditDoc;
// constructor
OutlinerParaObjData( std::unique_ptr<EditTextObject> 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<OutlinerParaObject>;
::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<EditTextObject>, ParagraphDataVector&&, bool bIsEditDoc);
OutlinerParaObject( std::unique_ptr<EditTextObject> );
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<OutlinerParaObject>
{
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>(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>(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>");
}
OutlinerParaObject maParaObject;
};
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */