diff options
Diffstat (limited to 'sw/inc/ndarr.hxx')
-rw-r--r-- | sw/inc/ndarr.hxx | 340 |
1 files changed, 340 insertions, 0 deletions
diff --git a/sw/inc/ndarr.hxx b/sw/inc/ndarr.hxx new file mode 100644 index 000000000000..71c447ab7c0b --- /dev/null +++ b/sw/inc/ndarr.hxx @@ -0,0 +1,340 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef SW_NDARR_HXX +#define SW_NDARR_HXX + +#include <vector> + +#include <boost/utility.hpp> + +#include <com/sun/star/embed/XEmbeddedObject.hpp> + +#include <svl/svarray.hxx> +#include <svtools/embedhlp.hxx> + +#include <bparr.hxx> +#include <ndtyp.hxx> + +class Graphic; +class GraphicObject; +class String; +class SwAttrSet; +class SfxItemSet; +class SwCntntNode; +class SwDoc; +class SwGrfFmtColl; +class SwGrfNode; +class SwHistory; +class SwNode; +class SwNodeIndex; +class SwNodeRange; +class SwOLENode; +class SwOutlineNodes; +class SwPaM; +class SwSectionData; +class SwSectionFmt; +class SwTOXBase; +class SwSectionNode; +class SwStartNode; +class SwTableBoxFmt; +class SwTableFmt; +class SwTableLine; +class SwTableLineFmt; +class SwTableNode; +class SwTblToTxtSaves; +class SwTxtFmtColl; +class SwTxtNode; +class SwUndoTblToTxt; +class SwUndoTxtToTbl; +struct SwPosition; + +// -------------------- +// class SwNodes +// -------------------- + +typedef SwNode * SwNodePtr; +typedef sal_Bool (*FnForEach_SwNodes)( const SwNodePtr&, void* pArgs ); + +SV_DECL_PTRARR_SORT( SwOutlineNodes, SwNodePtr, 0, 10 ) + +class SW_DLLPUBLIC SwNodes + : private BigPtrArray + , private ::boost::noncopyable +{ + friend class SwDoc; + friend class SwNode; + friend class SwNodeIndex; + + SwNodeIndex* pRoot; // List of all indices on nodes. + + void InsertNode( const SwNodePtr pNode, + const SwNodeIndex& rPos ); + void InsertNode( const SwNodePtr pNode, + sal_uLong nPos ); + + SwDoc* pMyDoc; // This Doc contains the nodes-array. + + SwNode *pEndOfPostIts, *pEndOfInserts, // These are the fixed ranges. + *pEndOfAutotext, *pEndOfRedlines, + *pEndOfContent; + + mutable SwOutlineNodes* pOutlineNds; // Array of all outline nodes. + + sal_Bool bInNodesDel : 1; // In Case of recursive calling. + // Do not update Num/Outline. + sal_Bool bInDelUpdOutl : 1; // Flag for updating of Outline. + sal_Bool bInDelUpdNum : 1; // Flag for updating of Outline. + + // For administering indices. + void RegisterIndex( SwNodeIndex& rIdx ); + void DeRegisterIndex( SwNodeIndex& rIdx ); + void RemoveNode( sal_uLong nDelPos, sal_uLong nLen, sal_Bool bDel ); + + // Actions on the nodes. + void SectionUpDown( const SwNodeIndex & aStart, const SwNodeIndex & aEnd ); + void DelNodes( const SwNodeIndex& rStart, sal_uLong nCnt = 1 ); + + void ChgNode( SwNodeIndex& rDelPos, sal_uLong nSize, + SwNodeIndex& rInsPos, sal_Bool bNewFrms ); + + void UpdtOutlineIdx( const SwNode& ); // Update all OutlineNodes starting from Node. + + void _CopyNodes( const SwNodeRange&, const SwNodeIndex&, + sal_Bool bNewFrms = sal_True, sal_Bool bTblInsDummyNode = sal_False ) const; + void _DelDummyNodes( const SwNodeRange& rRg ); + +protected: + SwNodes( SwDoc* pDoc ); + +public: + ~SwNodes(); + + typedef ::std::vector<SwNodeRange> NodeRanges_t; + typedef ::std::vector<NodeRanges_t> TableRanges_t; + + SwNodePtr operator[]( sal_uLong n ) const + { return (SwNodePtr)BigPtrArray::operator[] ( n ); } + + sal_uLong Count() const { return BigPtrArray::Count(); } + void ForEach( FnForEach_SwNodes fnForEach, void* pArgs = 0 ) + { + BigPtrArray::ForEach( 0, BigPtrArray::Count(), + (FnForEach) fnForEach, pArgs ); + } + void ForEach( sal_uLong nStt, sal_uLong nEnd, FnForEach_SwNodes fnForEach, void* pArgs = 0 ) + { + BigPtrArray::ForEach( nStt, nEnd, (FnForEach) fnForEach, pArgs ); + } + void ForEach( const SwNodeIndex& rStart, const SwNodeIndex& rEnd, + FnForEach_SwNodes fnForEach, void* pArgs = 0 ); + + // A still empty section. + SwNode& GetEndOfPostIts() const { return *pEndOfPostIts; } + // Section fpr all footnotes. + SwNode& GetEndOfInserts() const { return *pEndOfInserts; } + // Section for all Flys/Header/Footers. + SwNode& GetEndOfAutotext() const { return *pEndOfAutotext; } + // Section for all Redlines. + SwNode& GetEndOfRedlines() const { return *pEndOfRedlines; } + // This is the last EndNode of a special section. After it + // there is only the regular ContentSection (i.e. the BodyText). + SwNode& GetEndOfExtras() const { return *pEndOfRedlines; } + // Regular ContentSection (i.e. the BodyText). + SwNode& GetEndOfContent() const { return *pEndOfContent; } + + // Is the NodesArray the regular one of Doc? (and not the UndoNds, ...) + // Implementation in doc.hxx (because one needs to know Doc for it) ! + sal_Bool IsDocNodes() const; + + sal_uInt16 GetSectionLevel(const SwNodeIndex &rIndex) const; + void Delete(const SwNodeIndex &rPos, sal_uLong nNodes = 1); + + sal_Bool _MoveNodes( const SwNodeRange&, SwNodes& rNodes, const SwNodeIndex&, + sal_Bool bNewFrms = sal_True ); + void MoveRange( SwPaM&, SwPosition&, SwNodes& rNodes ); + + void _Copy( const SwNodeRange& rRg, const SwNodeIndex& rInsPos, + sal_Bool bNewFrms = sal_True ) const + { _CopyNodes( rRg, rInsPos, bNewFrms ); } + + void SectionUp( SwNodeRange *); + void SectionDown( SwNodeRange *pRange, SwStartNodeType = SwNormalStartNode ); + + sal_Bool CheckNodesRange( const SwNodeIndex& rStt, const SwNodeIndex& rEnd ) const; + + void GoStartOfSection(SwNodeIndex *) const; + void GoEndOfSection(SwNodeIndex *) const; + + SwCntntNode* GoNext(SwNodeIndex *) const; + SwCntntNode* GoPrevious(SwNodeIndex *) const; + + // Go to next/previous Cntnt/Table-node for which LayoutFrames exist. + // While doing this do not leave Header/Footer/Frame etc. + SwNode* GoNextWithFrm(SwNodeIndex *) const; + SwNode* GoPreviousWithFrm(SwNodeIndex *) const; + + // Go to next content-node that is not protected or hidden + // (Both set FALSE ==> GoNext/GoPrevious!!!). + SwCntntNode* GoNextSection( SwNodeIndex *, int bSkipHidden = sal_True, + int bSkipProtect = sal_True ) const; + SwCntntNode* GoPrevSection( SwNodeIndex *, int bSkipHidden = sal_True, + int bSkipProtect = sal_True ) const; + + // Create an empty section of Start- and EndNote. It may be called + // only if a new section with content is to be created, + // e.g. at filters/Undo/... + SwStartNode* MakeEmptySection( const SwNodeIndex& rIdx, + SwStartNodeType = SwNormalStartNode ); + + // Implementations of "Make...Node" are in the given .cxx-files. + SwTxtNode *MakeTxtNode( const SwNodeIndex & rWhere, + SwTxtFmtColl *pColl, + SwAttrSet* pAutoAttr = 0 ); // in ndtxt.cxx + SwStartNode* MakeTextSection( const SwNodeIndex & rWhere, + SwStartNodeType eSttNdTyp, + SwTxtFmtColl *pColl, + SwAttrSet* pAutoAttr = 0 ); + + SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere, + const String& rGrfName, + const String& rFltName, + const Graphic* pGraphic, + SwGrfFmtColl *pColl, + SwAttrSet* pAutoAttr = 0, + sal_Bool bDelayed = sal_False ); // in ndgrf.cxx + + SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere, + const GraphicObject& rGrfObj, + SwGrfFmtColl *pColl, + SwAttrSet* pAutoAttr = 0 ); // in ndgrf.cxx + + SwOLENode *MakeOLENode( const SwNodeIndex & rWhere, + const svt::EmbeddedObjectRef&, + SwGrfFmtColl *pColl, + SwAttrSet* pAutoAttr = 0 ); // in ndole.cxx + SwOLENode *MakeOLENode( const SwNodeIndex & rWhere, + const String &rName, + sal_Int64 nAspect, + SwGrfFmtColl *pColl, + SwAttrSet* pAutoAttr ); // in ndole.cxx + + // Array of all OutlineNodes. + const SwOutlineNodes& GetOutLineNds() const; + + //void UpdateOutlineNode( const SwNode&, sal_uInt8 nOldLevel, sal_uInt8 nNewLevel );//#outline level,removed by zhaojianwei + + // Update all Nodes - Rule/Format-Change. + void UpdateOutlineNode(SwNode & rNd); + + // Insert nodes for tables. If Lines is given, create the matrix + // from lines and boxes, else only the count of boxes. + + // New parameter pAttrSet: If pAttrSet is non-null and contains an + // adjust item it is propagated to the table cells. If there is an + // adjust in pCntntTxtColl or pHeadlineTxtColl this adjust item + // overrides the item in pAttrSet. + + SwTableNode* InsertTable( const SwNodeIndex& rNdIdx, + sal_uInt16 nBoxes, SwTxtFmtColl* pCntntTxtColl, + sal_uInt16 nLines = 0, sal_uInt16 nRepeat = 0, + SwTxtFmtColl* pHeadlineTxtColl = 0, + const SwAttrSet * pAttrSet = 0); + + // Create balanced table from selected range. + SwTableNode* TextToTable( const SwNodeRange& rRange, sal_Unicode cCh, + SwTableFmt* pTblFmt, + SwTableLineFmt* pLineFmt, + SwTableBoxFmt* pBoxFmt, + SwTxtFmtColl* pTxtColl, + SwUndoTxtToTbl* pUndo = 0 ); + + SwNodeRange * ExpandRangeForTableBox(const SwNodeRange & rRange); + + //create a table from a vector of NodeRanges - API support + SwTableNode* TextToTable( const TableRanges_t& rTableNodes, + SwTableFmt* pTblFmt, + SwTableLineFmt* pLineFmt, + SwTableBoxFmt* pBoxFmt, + SwTxtFmtColl* pTxtColl + /*, SwUndo... pUndo*/ ); + + + // Create regular text from what was table. + sal_Bool TableToText( const SwNodeRange& rRange, sal_Unicode cCh, + SwUndoTblToTxt* = 0 ); + // Is in untbl.cxx and may called only by Undo-object. + SwTableNode* UndoTableToText( sal_uLong nStt, sal_uLong nEnd, + const SwTblToTxtSaves& rSavedData ); + + // Insert a new box in the line before InsPos. Its format + // is taken from the following one (or from the previous one if we are + // at the end). In the line there must be a box already. + sal_Bool InsBoxen( SwTableNode*, SwTableLine*, SwTableBoxFmt*, + // Formats for TextNode of box. + SwTxtFmtColl*, const SfxItemSet* pAutoAttr, + sal_uInt16 nInsPos, sal_uInt16 nCnt = 1 ); + // Splits a table at the base-line which contains the index. + // All base lines behind it are moved to a new table/ -node. + // Is the flag bCalcNewSize set to TRUE, the new SSize for both + // tables is calculated from the Maximum of the boxes, provided + // SSize is set "absolute" (LONG_MAX). + // (Momentarily this is needed only for the RTF-parser.) + SwTableNode* SplitTable( const SwNodeIndex& rPos, sal_Bool bAfter = sal_True, + sal_Bool bCalcNewSize = sal_False ); + // Two Tables that are following one another are merged. + sal_Bool MergeTable( const SwNodeIndex& rPos, sal_Bool bWithPrev = sal_True, + sal_uInt16 nMode = 0, SwHistory* pHistory = 0 ); + + // Insert a new SwSection. + SwSectionNode* InsertTextSection(SwNodeIndex const& rNdIdx, + SwSectionFmt& rSectionFmt, + SwSectionData const&, + SwTOXBase const*const pTOXBase, + SwNodeIndex const*const pEnde, + bool const bInsAtStart = true, + bool const bCreateFrms = true); + + // Which Doc contains the nodes-array? + SwDoc* GetDoc() { return pMyDoc; } + const SwDoc* GetDoc() const { return pMyDoc; } + + // Search previous / next content node or table node with frames. + // If no end is given begin with the FrameIndex, else start search + // with that before rFrmIdx and pEnd at the back. + // If no valid node is found, return 0. rFrmIdx points to the node with frames. + SwNode* FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx, + const SwNode* pEnd = 0 ) const; + + SwNode * DocumentSectionStartNode(SwNode * pNode) const; + SwNode * DocumentSectionEndNode(SwNode * pNode) const; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |