office-gobmx/include/svl/stylepool.hxx
Miklos Vajna eb128a7d6b sw: make ODT export of paragraph auto-styles deterministic
If a complex enough document is loaded into Writer and saved as ODT,
then the content.xml's automatic paragraph styles (P<num>) are
re-ordered on each save, which leads to unnecessary noise.

The actual random order is created during import by the time we convert
direct formatting (e.g. from HTML import) to autostyles, as
StylePoolImpl::maRoot stores autostyles in a map that orders autostyle
parents based on their pointer address.

This has benefits like automatic ordering of item sets and fast
comparison, so don't change that, but extend the svl API to also track
the name of those parents.

This way by the time StylePool::createIterator() would iterate over
those autostyles, it can order the parents by their name, so two
import->export runs will result in the same autostyle ordering.

(This appears to be the only indeterminism in content.xml for a test
HTML input, while meta.xml and settings.xml still changes all the time.)

Change-Id: I1cfcae2c664a5c5c3dee48be733046979c1593ed
Reviewed-on: https://gerrit.libreoffice.org/69469
Reviewed-by: Miklos Vajna <vmiklos@collabora.com>
Tested-by: Jenkins
2019-03-20 16:28:39 +01:00

88 lines
3.2 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 .
*/
#ifndef INCLUDED_SVL_STYLEPOOL_HXX
#define INCLUDED_SVL_STYLEPOOL_HXX
#include <memory>
#include <rtl/ustring.hxx>
#include <svl/itemset.hxx>
class StylePoolImpl;
class IStylePoolIteratorAccess;
class SVL_DLLPUBLIC StylePool final
{
private:
std::unique_ptr<StylePoolImpl> pImpl;
public:
explicit StylePool( SfxItemSet const * pIgnorableItems = nullptr );
/** Insert a SfxItemSet into the style pool.
The pool makes a copy of the provided SfxItemSet.
@param SfxItemSet
the SfxItemSet to insert
@param pParentName
Name of the parent of rSet. If set, createIterator() can be more deterministic by iterating
over item sets ordered by parent names.
@return a shared pointer to the SfxItemSet
*/
std::shared_ptr<SfxItemSet> insertItemSet( const SfxItemSet& rSet, const OUString* pParentName = nullptr );
/** Create an iterator
The iterator walks through the StylePool
OD 2008-03-07 #i86923#
introduce optional parameter to control, if unused SfxItemsSet are skipped or not
introduce optional parameter to control, if ignorable items are skipped or not
@attention every change, e.g. destruction, of the StylePool could cause undefined effects.
@param bSkipUnusedItemSets
input parameter - boolean, indicating if unused SfxItemSets are skipped or not
@param bSkipIgnorableItems
input parameter - boolean, indicating if ignorable items are skipped or not
@postcond the iterator "points before the first" SfxItemSet of the pool.
The first StylePoolIterator::getNext() call will deliver the first SfxItemSet.
*/
std::unique_ptr<IStylePoolIteratorAccess> createIterator( const bool bSkipUnusedItemSets = false,
const bool bSkipIgnorableItems = false );
~StylePool();
static OUString nameOf( const std::shared_ptr<SfxItemSet>& pSet );
};
class SVL_DLLPUBLIC IStylePoolIteratorAccess
{
public:
/** Delivers a shared pointer to the next SfxItemSet of the pool
If there is no more SfxItemSet, the delivered share_pointer is empty.
*/
virtual std::shared_ptr<SfxItemSet> getNext() = 0;
virtual ~IStylePoolIteratorAccess() {};
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */