|  | /************************************************************** | 
|  | * | 
|  | * 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 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;					// Liste aller Indizies auf Nodes | 
|  |  | 
|  | // --> OD 2008-05-14 #refactorlists# - removed <bSyncNumberAndNumRule> | 
|  | void InsertNode( const SwNodePtr pNode, | 
|  | const SwNodeIndex& rPos ); | 
|  | void InsertNode( const SwNodePtr pNode, | 
|  | sal_uLong nPos ); | 
|  | // <-- | 
|  |  | 
|  |  | 
|  | SwDoc* pMyDoc;						// in diesem Doc ist das Nodes-Array | 
|  |  | 
|  | SwNode *pEndOfPostIts, *pEndOfInserts, 	// das sind die festen Bereiche | 
|  | *pEndOfAutotext, *pEndOfRedlines, | 
|  | *pEndOfContent; | 
|  |  | 
|  | mutable SwOutlineNodes* pOutlineNds;		// Array aller GliederiungsNodes | 
|  |  | 
|  | sal_Bool bInNodesDel : 1;				// falls rekursiv aufgerufen wird | 
|  | // Num/Outline nicht aktualisierem | 
|  | sal_Bool bInDelUpdOutl : 1;				// Flags fuers aktualisieren von Outl. | 
|  | sal_Bool bInDelUpdNum : 1;				// Flags fuers aktualisieren von Outl. | 
|  |  | 
|  | // fuer dier Verwaltung der Indizies | 
|  | void RegisterIndex( SwNodeIndex& rIdx ); | 
|  | void DeRegisterIndex( SwNodeIndex& rIdx ); | 
|  | void RemoveNode( sal_uLong nDelPos, sal_uLong nLen, sal_Bool bDel ); | 
|  |  | 
|  | // Aktionen auf die 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 ab Node alle OutlineNodes | 
|  |  | 
|  | 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 ); | 
|  |  | 
|  | // eine noch leere Section | 
|  | SwNode& GetEndOfPostIts() const 	{ return *pEndOfPostIts; } | 
|  | // Section fuer alle Fussnoten | 
|  | SwNode& GetEndOfInserts() const 	{ return *pEndOfInserts; } | 
|  | // Section fuer alle Flys/Header/Footers | 
|  | SwNode& GetEndOfAutotext() const 	{ return *pEndOfAutotext; } | 
|  | // Section fuer alle Redlines | 
|  | SwNode& GetEndOfRedlines() const 	{ return *pEndOfRedlines; } | 
|  | // das ist der letzte EndNode einer SonderSection. Hier nach kommt nur | 
|  | // noch die normale ContentSection (also der BodyText) | 
|  | SwNode& GetEndOfExtras() const 		{ return *pEndOfRedlines; } | 
|  | // die normale ContentSection (also der BodyText) | 
|  | SwNode& GetEndOfContent() const		{ return *pEndOfContent; } | 
|  |  | 
|  | // ist das NodesArray das normale vom Doc? (nicht das UndoNds, .. ) | 
|  | // Implementierung steht im doc.hxx (weil man dazu Doc kennen muss) ! | 
|  | 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; | 
|  |  | 
|  | //Gehe zum naechsten/vorherigen Cntnt/Tabellennode, fuer den | 
|  | //es LayoutFrames gibt, dabei Kopf-/Fusszeilen/Rahmen etc. nicht verlassen | 
|  | SwNode* GoNextWithFrm(SwNodeIndex *) const; | 
|  | SwNode* GoPreviousWithFrm(SwNodeIndex *) const; | 
|  |  | 
|  | // zum naechsten Content-Node, der nicht geschuetzt oder versteckt ist | 
|  | // (beides auf sal_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; | 
|  |  | 
|  | // erzeuge ein leere Section von Start und EndNode. Darf nur gerufen | 
|  | // werden, wenn eine neue Section mit Inhalt erzeugt werden soll. | 
|  | // Zum Beispiel bei den Filtern/Undo/... | 
|  | SwStartNode* MakeEmptySection( const SwNodeIndex& rIdx, | 
|  | SwStartNodeType = SwNormalStartNode ); | 
|  |  | 
|  | // die Impl. von "Make...Node" stehen in den angegebenen .ccx-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 aller GliederiungsNodes; | 
|  | const SwOutlineNodes& GetOutLineNds() const; | 
|  |  | 
|  | //void UpdateOutlineNode( const SwNode&, sal_uInt8 nOldLevel, sal_uInt8 nNewLevel );//#outline level,removed by zhaojianwei | 
|  | // alle Nodes Updaten - Rule/Format-Aenderung | 
|  | void UpdateOutlineNode(SwNode & rNd); | 
|  |  | 
|  | // fuege die Nodes fuer die Tabelle ein | 
|  | // wenn Lines angegeben, erzeuge die Matrix aus Lines & Boxen | 
|  | // ansonsten nur die Anzahl von Boxen. | 
|  | /* #109161# | 
|  |  | 
|  | 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); | 
|  |  | 
|  | // erzeuge aus dem makierten Bereich eine ausgeglichene Tabelle | 
|  | 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*/ ); | 
|  |  | 
|  | // erzeuge aus der Tabelle wieder normalen Text | 
|  | sal_Bool TableToText( const SwNodeRange& rRange, sal_Unicode cCh, | 
|  | SwUndoTblToTxt* = 0 ); | 
|  | // steht im untbl.cxx und darf nur vom Undoobject gerufen werden | 
|  | SwTableNode* UndoTableToText( sal_uLong nStt, sal_uLong nEnd, | 
|  | const SwTblToTxtSaves& rSavedData ); | 
|  |  | 
|  | // fuege in der Line, vor der InsPos eine neue Box ein. Das Format | 
|  | // wird von der nachfolgenden (vorhergenden;wenn an Ende) genommen | 
|  | // in der Line muss schon eine Box vorhanden sein ! | 
|  | sal_Bool InsBoxen( SwTableNode*, SwTableLine*, SwTableBoxFmt*, | 
|  | // Formate fuer den TextNode der Box | 
|  | SwTxtFmtColl*, const SfxItemSet* pAutoAttr, | 
|  | sal_uInt16 nInsPos, sal_uInt16 nCnt = 1 ); | 
|  | // Splittet eine Tabelle in der Grund-Zeile, in der der Index steht. | 
|  | // Alle GrundZeilen dahinter wandern in eine neue Tabelle/-Node. | 
|  | // Ist das Flag bCalcNewSize auf sal_True, wird fuer beide neuen Tabellen | 
|  | // die neue SSize aus dem Max der Boxen errechnet; vorrausgesetzt, | 
|  | // die SSize ist "absolut" gesetzt (LONG_MAX) | 
|  | // (Wird zur Zeit nur fuer den RTF-Parser benoetigt) | 
|  | SwTableNode* SplitTable( const SwNodeIndex& rPos, sal_Bool bAfter = sal_True, | 
|  | sal_Bool bCalcNewSize = sal_False ); | 
|  | // fuegt 2 Tabellen, die hintereinander stehen, wieder zusammen | 
|  | sal_Bool MergeTable( const SwNodeIndex& rPos, sal_Bool bWithPrev = sal_True, | 
|  | sal_uInt16 nMode = 0, SwHistory* pHistory = 0 ); | 
|  |  | 
|  | // fuege eine neue SwSection ein | 
|  | 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); | 
|  |  | 
|  | // in welchem Doc steht das Nodes-Array ? | 
|  | SwDoc* GetDoc()			{ return pMyDoc; } | 
|  | const	SwDoc* GetDoc() const	{ return pMyDoc; } | 
|  |  | 
|  | // suche den vorhergehenden [/nachfolgenden ] ContentNode oder | 
|  | // TabellenNode mit Frames. Wird kein Ende angeben, dann wird mit | 
|  | // dem FrameIndex begonnen; ansonsten, wird mit dem vor rFrmIdx und | 
|  | // dem hintern pEnd die Suche gestartet. Sollte kein gueltiger Node | 
|  | // gefunden werden, wird 0 returnt. rFrmIdx zeigt auf dem Node mit | 
|  | // Frames | 
|  | SwNode* FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx, | 
|  | const SwNode* pEnd = 0 ) const; | 
|  |  | 
|  | //-> #112139# | 
|  | SwNode * DocumentSectionStartNode(SwNode * pNode) const; | 
|  | SwNode * DocumentSectionEndNode(SwNode * pNode) const; | 
|  | //<- #112139# | 
|  | }; | 
|  |  | 
|  | #endif |