eb128a7d6b
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
88 lines
3.2 KiB
C++
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: */
|