/************************************************************** * * 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 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _NDHINTS_HXX #define _NDHINTS_HXX #include #include #include "swtypes.hxx" class SwTxtNode; class SwRegHistory; // steht im RolBck.hxx class SwTxtAttr; class SwTxtAttrNesting; class SfxPoolItem; class SfxItemSet; class SwDoc; typedef enum { COPY = true, NEW = false, } CopyOrNew_t; // if COPY then pTxtNode must be given! SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr( SwDoc & rDoc, SfxPoolItem & rNew, xub_StrLen const nStt, xub_StrLen const nEnd, CopyOrNew_t const bIsCopy = NEW, SwTxtNode *const pTxtNode = 0); SW_DLLPRIVATE SwTxtAttr * MakeTxtAttr( SwDoc & rDoc, const SfxItemSet & rSet, xub_StrLen nStt, xub_StrLen nEnd ); // create redline dummy text hint that must not be inserted into hints array SW_DLLPRIVATE SwTxtAttr* MakeRedlineTxtAttr( SwDoc & rDoc, SfxPoolItem& rAttr ); /* * Ableitung der Klasse SwpHints ueber den Umweg ueber SwpHts, da * lediglich die Klasse SwTxtNode Attribute einfuegen und * loeschen koennen soll. Anderen Klassen wie den Frames steht * lediglich ein lesender Zugriff ueber den Index-Operator zur * Verfuegung. * Groesse beim Anlegen gleich 1, weil nur dann ein Array erzeug wird, wenn * auch ein Hint eingefuegt wird. */ /************************************************************************* * class SwpHtStart/End *************************************************************************/ SV_DECL_PTRARR_SORT(SwpHtStart,SwTxtAttr*,1,1) SV_DECL_PTRARR_SORT(SwpHtEnd,SwTxtAttr*,1,1) /************************************************************************* * class SwpHintsArr *************************************************************************/ /// the Hints array class SwpHintsArray { protected: SwpHtStart m_HintStarts; SwpHtEnd m_HintEnds; //FIXME: why are the non-const methods public? public: void Insert( const SwTxtAttr *pHt ); void DeleteAtPos( const sal_uInt16 nPosInStart ); bool Resort(); SwTxtAttr * Cut( const sal_uInt16 nPosInStart ); inline const SwTxtAttr * GetStart( const sal_uInt16 nPos ) const { return m_HintStarts[nPos]; } inline const SwTxtAttr * GetEnd ( const sal_uInt16 nPos ) const { return m_HintEnds [nPos]; } inline SwTxtAttr * GetStart( const sal_uInt16 nPos ) { return m_HintStarts[nPos]; } inline SwTxtAttr * GetEnd ( const sal_uInt16 nPos ) { return m_HintEnds [nPos]; } inline sal_uInt16 GetEndCount() const { return m_HintEnds .Count(); } inline sal_uInt16 GetStartCount() const { return m_HintStarts.Count(); } inline sal_uInt16 GetStartOf( const SwTxtAttr *pHt ) const; inline sal_uInt16 GetPos( const SwTxtAttr *pHt ) const { return m_HintStarts.GetPos( pHt ); } inline SwTxtAttr * GetTextHint( const sal_uInt16 nIdx ) { return GetStart(nIdx); } inline const SwTxtAttr * operator[]( const sal_uInt16 nIdx ) const { return m_HintStarts[nIdx]; } inline sal_uInt16 Count() const { return m_HintStarts.Count(); } #ifdef DBG_UTIL bool Check() const; #endif }; /************************************************************************* * class SwpHints *************************************************************************/ // public interface class SwpHints : public SwpHintsArray { private: SwRegHistory* m_pHistory; // for Undo bool m_bFontChange : 1; // font change // true: the Node is in Split and Frames are moved bool m_bInSplitNode : 1; // m_bHasHiddenParaField is invalid, call CalcHiddenParaField() bool m_bCalcHiddenParaField : 1; bool m_bHasHiddenParaField : 1; // HiddenParaFld bool m_bFootnote : 1; // footnotes bool m_bDDEFields : 1; // the TextNode has DDE fields // records a new attibute in m_pHistory. void NoteInHistory( SwTxtAttr *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 SwTxtNode; void DeleteAtPos( const sal_uInt16 nPos ); // Delete the given Hint. The Hint must actually be in the array! void Delete( SwTxtAttr* pTxtHt ); inline void SetInSplitNode(bool bInSplit) { m_bInSplitNode = bInSplit; } inline void SetCalcHiddenParaField() { m_bCalcHiddenParaField = true; } inline void SetHiddenParaField( const bool bNew ) { m_bHasHiddenParaField = bNew; } inline bool HasHiddenParaField() const { if ( m_bCalcHiddenParaField ) { (const_cast(this))->CalcHiddenParaField(); } return m_bHasHiddenParaField; } void InsertNesting(SwTxtAttrNesting & rNewHint); bool TryInsertNesting(SwTxtNode & rNode, SwTxtAttrNesting & rNewHint); void BuildPortions( SwTxtNode& rNode, SwTxtAttr& rNewHint, const SetAttrMode nMode ); bool MergePortions( SwTxtNode& rNode ); public: SwpHints(); inline bool CanBeDeleted() const { return !Count(); } // 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(0); } SwRegHistory* GetHistory() const { return m_pHistory; } /// try to insert the hint /// @return true iff hint successfully inserted bool TryInsertHint( SwTxtAttr * const pHint, SwTxtNode & rNode, const SetAttrMode nMode = nsSetAttrMode::SETATTR_DEFAULT ); inline bool HasFtn() const { return m_bFootnote; } inline bool IsInSplitNode() const { return m_bInSplitNode; } // calc current value of m_bHasHiddenParaField, returns true iff changed bool CalcHiddenParaField(); DECL_FIXEDMEMPOOL_NEWDEL(SwpHints) }; // Ausgabeoperator fuer die Texthints SvStream &operator<<(SvStream &aS, const SwpHints &rHints); //$ ostream /************************************************************************* * Inline Implementations *************************************************************************/ inline sal_uInt16 SwpHintsArray::GetStartOf( const SwTxtAttr *pHt ) const { sal_uInt16 nPos; if ( !m_HintStarts.Seek_Entry( pHt, &nPos ) ) { nPos = USHRT_MAX; } return nPos; } inline SwTxtAttr *SwpHintsArray::Cut( const sal_uInt16 nPosInStart ) { SwTxtAttr *pHt = GetTextHint(nPosInStart); DeleteAtPos( nPosInStart ); return pHt; } #endif