office-gobmx/sw/inc/ndhints.hxx
Mike Kaganski 9366fc1814 The argument of SwpHints::Insert should not be const
Change-Id: Ic71a53140ae43c5936b0a63213e5c7d068bed45f
Reviewed-on: https://gerrit.libreoffice.org/79850
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
2019-09-30 17:01:56 +02:00

218 lines
7.8 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_SW_INC_NDHINTS_HXX
#define INCLUDED_SW_INC_NDHINTS_HXX
#include "swtypes.hxx"
class SwTextNode;
class SwRegHistory; // Is in RolBck.hxx.
class SwTextAttr;
class SwTextAttrNesting;
class SfxPoolItem;
class SfxItemSet;
class SwDoc;
enum class CopyOrNewType { Copy, New };
/// if COPY then pTextNode must be given!
SwTextAttr * MakeTextAttr(
SwDoc & rDoc,
SfxPoolItem & rNew,
sal_Int32 const nStt,
sal_Int32 const nEnd,
CopyOrNewType const bIsCopy = CopyOrNewType::New,
SwTextNode *const pTextNode = nullptr );
SwTextAttr * MakeTextAttr(
SwDoc & rDoc,
const SfxItemSet & rSet,
sal_Int32 nStt,
sal_Int32 nEnd );
/// create redline dummy text hint that must not be inserted into hints array
SwTextAttr* MakeRedlineTextAttr(
SwDoc & rDoc,
SfxPoolItem const & rAttr );
struct CompareSwpHtEnd
{
bool operator()( sal_Int32 nEndPos, const SwTextAttr* rhs ) const;
bool operator()( const SwTextAttr* lhs, const SwTextAttr* rhs ) const;
};
struct CompareSwpHtWhichStart
{
bool operator()( const SwTextAttr* lhs, const sal_uInt16 nWhich ) const;
bool operator()( const SwTextAttr* lhs, const SwTextAttr* rhs ) const;
};
/// An SwTextAttr container, stores all directly formatted text portions for a text node.
class SwpHints
{
private:
const SwTextNode& m_rParent;
// SAL_MAX_SIZE is used by GetStartOf to return
// failure, so just allow SAL_MAX_SIZE-1 hints
static const size_t MAX_HINTS = SAL_MAX_SIZE-1;
std::vector<SwTextAttr*> m_HintsByStart;
std::vector<SwTextAttr*> m_HintsByEnd;
std::vector<SwTextAttr*> m_HintsByWhichAndStart;
SwRegHistory* m_pHistory; ///< for Undo
/// true: the Node is in Split and Frames are moved
bool m_bInSplitNode : 1;
// m_bHiddenByParaField is invalid, call CalcHiddenParaField()
mutable bool m_bCalcHiddenParaField : 1;
// if all fields controlling visibility of the paragraph require to hide it
// (if there's no such fields, or if any field requires to show, then this is false)
mutable bool m_bHiddenByParaField : 1;
bool m_bFootnote : 1; ///< footnotes
bool m_bDDEFields : 1; ///< the TextNode has DDE fields
// Sort on demand to avoid O(n^2) behaviour
mutable bool m_bStartMapNeedsSorting : 1;
mutable bool m_bEndMapNeedsSorting : 1;
mutable bool m_bWhichMapNeedsSorting : 1;
/// records a new attribute in m_pHistory.
void NoteInHistory( SwTextAttr *pAttr, const bool bNew = false );
void CalcFlags( );
/** Delete methods may only be called by the TextNode!
Because the TextNode also guarantees removal of the Character for
attributes without an end. */
friend class SwTextNode;
void DeleteAtPos( size_t nPos );
/// Delete the given Hint. The Hint must actually be in the array!
void Delete( SwTextAttr const * pTextHt );
void SetInSplitNode(bool bInSplit) { m_bInSplitNode = bInSplit; }
void SetCalcHiddenParaField() const { m_bCalcHiddenParaField = true; }
void SetHiddenByParaField( const bool bNew ) const { m_bHiddenByParaField = bNew; }
bool IsHiddenByParaField() const
{
if ( m_bCalcHiddenParaField )
{
CalcHiddenParaField();
}
return m_bHiddenByParaField;
}
void InsertNesting(SwTextAttrNesting & rNewHint);
bool TryInsertNesting(SwTextNode & rNode, SwTextAttrNesting & rNewHint);
void BuildPortions( SwTextNode& rNode, SwTextAttr& rNewHint,
const SetAttrMode nMode );
bool MergePortions( SwTextNode& rNode );
void Insert(SwTextAttr* pHt);
SW_DLLPUBLIC void Resort() const;
SW_DLLPUBLIC void ResortStartMap() const;
SW_DLLPUBLIC void ResortEndMap() const;
SW_DLLPUBLIC void ResortWhichMap() const;
size_t GetIndexOf( const SwTextAttr *pHt ) const;
#ifdef DBG_UTIL
bool Check(bool) const;
#endif
public:
SwpHints(const SwTextNode& rParent);
size_t Count() const { return m_HintsByStart.size(); }
bool Contains( const SwTextAttr *pHt ) const;
SwTextAttr * Get( size_t nPos ) const
{
assert( !(nPos != 0 && m_bStartMapNeedsSorting) && "going to trigger a resort in the middle of an iteration, that's bad" );
if (m_bStartMapNeedsSorting)
ResortStartMap();
return m_HintsByStart[nPos];
}
// Get without triggering resorting - useful if we are modifying start/end pos while iterating
SwTextAttr * GetWithoutResorting( size_t nPos ) const
{
return m_HintsByStart[nPos];
}
int GetLastPosSortedByEnd(sal_Int32 nEndPos) const;
SwTextAttr * GetSortedByEnd( size_t nPos ) const
{
assert( !(nPos != 0 && m_bEndMapNeedsSorting) && "going to trigger a resort in the middle of an iteration, that's bad" );
if (m_bEndMapNeedsSorting)
ResortEndMap();
return m_HintsByEnd[nPos];
}
size_t GetFirstPosSortedByWhichAndStart(sal_uInt16 nWhich) const;
SwTextAttr * GetSortedByWhichAndStart( size_t nPos ) const
{
assert( !(nPos != 0 && m_bWhichMapNeedsSorting) && "going to trigger a resort in the middle of an iteration, that's bad" );
if (m_bWhichMapNeedsSorting)
ResortWhichMap();
return m_HintsByWhichAndStart[nPos];
}
/// Trigger the sorting if necessary
void SortIfNeedBe() const
{
if (m_bStartMapNeedsSorting)
ResortStartMap();
if (m_bEndMapNeedsSorting)
ResortEndMap();
if (m_bWhichMapNeedsSorting)
ResortWhichMap();
}
SwTextAttr * Cut( const size_t nPosInStart )
{
SwTextAttr *pHt = m_HintsByStart[nPosInStart];
DeleteAtPos( nPosInStart );
return pHt;
}
bool CanBeDeleted() const { return m_HintsByStart.empty(); }
/// register a History, which receives all attribute changes (for Undo)
void Register( SwRegHistory* pHist ) { m_pHistory = pHist; }
/// deregister the currently registered History
void DeRegister() { Register(nullptr); }
SwRegHistory* GetHistory() const { return m_pHistory; }
/// try to insert the hint
/// @return true iff hint successfully inserted
bool TryInsertHint( SwTextAttr * const pHint, SwTextNode & rNode,
const SetAttrMode nMode = SetAttrMode::DEFAULT );
bool HasFootnote() const { return m_bFootnote; }
bool IsInSplitNode() const { return m_bInSplitNode; }
// calc current value of m_bHiddenByParaField, returns true iff changed
bool CalcHiddenParaField() const; // changes mutable state
// Marks the hint-maps as needing sorting because the position of something has changed
void StartPosChanged() const { m_bStartMapNeedsSorting = true; m_bEndMapNeedsSorting = true; m_bWhichMapNeedsSorting = true; }
void EndPosChanged() const { m_bStartMapNeedsSorting = true; m_bEndMapNeedsSorting = true; m_bWhichMapNeedsSorting = true; }
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */