1
0
Fork 0
libreoffice/sw/source/core/txtnode/chrfmt.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

142 lines
4 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 .
*/
#include <libxml/xmlwriter.h>
#include <charfmt.hxx>
#include <charformats.hxx>
#include <doc.hxx>
void SwCharFormat::dumpAsXml(xmlTextWriterPtr pWriter) const
{
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwCharFormat"));
SwFormat::dumpAsXml(pWriter);
if (mpLinkedParaFormat)
{
(void)xmlTextWriterWriteAttribute(
pWriter, BAD_CAST("linked"), BAD_CAST(mpLinkedParaFormat->GetName().toUtf8().getStr()));
}
(void)xmlTextWriterEndElement(pWriter);
}
void SwCharFormat::SetLinkedParaFormat(SwTextFormatColl* pLink) { mpLinkedParaFormat = pLink; }
const SwTextFormatColl* SwCharFormat::GetLinkedParaFormat() const { return mpLinkedParaFormat; }
SwCharFormat::~SwCharFormat()
{
if (GetDoc()->IsInDtor())
{
return;
}
for (const auto& pTextFormat : *GetDoc()->GetTextFormatColls())
{
if (pTextFormat->GetLinkedCharFormat() == this)
{
pTextFormat->SetLinkedCharFormat(nullptr);
}
}
}
void SwCharFormats::dumpAsXml(xmlTextWriterPtr pWriter) const
{
(void)xmlTextWriterStartElement(pWriter, BAD_CAST("SwCharFormats"));
for (size_t i = 0; i < size(); ++i)
GetFormat(i)->dumpAsXml(pWriter);
(void)xmlTextWriterEndElement(pWriter);
}
SwCharFormats::SwCharFormats()
: m_PosIndex(m_Array.get<0>())
, m_NameIndex(m_Array.get<1>())
{
}
SwCharFormats::~SwCharFormats()
{
// default char format is owned by SwDoc
DeleteAndDestroyAll(true);
}
SwCharFormats::const_iterator SwCharFormats::find(const SwCharFormat* x) const
{
ByName::iterator it
= m_NameIndex.find(std::make_tuple(x->GetName(), const_cast<SwCharFormat*>(x)));
return m_Array.project<0>(it);
}
SwCharFormats::ByName::const_iterator SwCharFormats::findByName(const OUString& name) const
{
return m_NameIndex.find(std::make_tuple(name));
}
SwCharFormat* SwCharFormats::FindFormatByName(const OUString& rName) const
{
auto it = findByName(rName);
if (it != m_NameIndex.end())
return *it;
return nullptr;
}
void SwCharFormats::DeleteAndDestroyAll(bool keepDefault)
{
if (empty())
return;
const int _offset = keepDefault ? 1 : 0;
for (const_iterator it = begin() + _offset; it != end(); ++it)
{
assert(!(*it)->HasName(u"Character style"));
delete *it;
}
if (_offset)
m_PosIndex.erase(begin() + _offset, end());
else
m_Array.clear();
}
void SwCharFormats::insert(SwCharFormat* x)
{
assert(!ContainsFormat(x));
m_PosIndex.push_back(x);
}
void SwCharFormats::erase(const_iterator const& position) { m_PosIndex.erase(position); }
bool SwCharFormats::ContainsFormat(const SwCharFormat* x) const { return find(x) != end(); }
/** Need to call this when the format name changes */
void SwCharFormats::SetFormatNameAndReindex(SwCharFormat* v, const OUString& sNewName)
{
auto it = find(v);
erase(it);
v->SetFormatName(sNewName);
insert(v);
}
size_t SwCharFormats::GetPos(const SwCharFormat* p) const
{
auto it = find(p);
return it == end() ? SIZE_MAX : it - begin();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */