1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 #ifndef SW_NDARR_HXX 25 #define SW_NDARR_HXX 26 27 #include <vector> 28 29 #include <boost/utility.hpp> 30 31 #include <com/sun/star/embed/XEmbeddedObject.hpp> 32 33 #include <svl/svarray.hxx> 34 #include <svtools/embedhlp.hxx> 35 36 #include <bparr.hxx> 37 #include <ndtyp.hxx> 38 39 40 class Graphic; 41 class GraphicObject; 42 class String; 43 class SwAttrSet; 44 class SfxItemSet; 45 class SwCntntNode; 46 class SwDoc; 47 class SwGrfFmtColl; 48 class SwGrfNode; 49 class SwHistory; 50 class SwNode; 51 class SwNodeIndex; 52 class SwNodeRange; 53 class SwOLENode; 54 class SwOutlineNodes; 55 class SwPaM; 56 class SwSectionData; 57 class SwSectionFmt; 58 class SwTOXBase; 59 class SwSectionNode; 60 class SwStartNode; 61 class SwTableBoxFmt; 62 class SwTableFmt; 63 class SwTableLine; 64 class SwTableLineFmt; 65 class SwTableNode; 66 class SwTblToTxtSaves; 67 class SwTxtFmtColl; 68 class SwTxtNode; 69 class SwUndoTblToTxt; 70 class SwUndoTxtToTbl; 71 struct SwPosition; 72 73 74 // -------------------- 75 // class SwNodes 76 // -------------------- 77 78 typedef SwNode * SwNodePtr; 79 typedef sal_Bool (*FnForEach_SwNodes)( const SwNodePtr&, void* pArgs ); 80 81 SV_DECL_PTRARR_SORT( SwOutlineNodes, SwNodePtr, 0, 10 ) 82 83 class SW_DLLPUBLIC SwNodes 84 : private BigPtrArray 85 , private ::boost::noncopyable 86 { 87 friend class SwDoc; 88 friend class SwNode; 89 friend class SwNodeIndex; 90 91 SwNodeIndex* pRoot; // Liste aller Indizies auf Nodes 92 93 // --> OD 2008-05-14 #refactorlists# - removed <bSyncNumberAndNumRule> 94 void InsertNode( const SwNodePtr pNode, 95 const SwNodeIndex& rPos ); 96 void InsertNode( const SwNodePtr pNode, 97 sal_uLong nPos ); 98 // <-- 99 100 101 SwDoc* pMyDoc; // in diesem Doc ist das Nodes-Array 102 103 SwNode *pEndOfPostIts, *pEndOfInserts, // das sind die festen Bereiche 104 *pEndOfAutotext, *pEndOfRedlines, 105 *pEndOfContent; 106 107 mutable SwOutlineNodes* pOutlineNds; // Array aller GliederiungsNodes 108 109 sal_Bool bInNodesDel : 1; // falls rekursiv aufgerufen wird 110 // Num/Outline nicht aktualisierem 111 sal_Bool bInDelUpdOutl : 1; // Flags fuers aktualisieren von Outl. 112 sal_Bool bInDelUpdNum : 1; // Flags fuers aktualisieren von Outl. 113 114 // fuer dier Verwaltung der Indizies 115 void RegisterIndex( SwNodeIndex& rIdx ); 116 void DeRegisterIndex( SwNodeIndex& rIdx ); 117 void RemoveNode( sal_uLong nDelPos, sal_uLong nLen, sal_Bool bDel ); 118 119 // Aktionen auf die Nodes 120 void SectionUpDown( const SwNodeIndex & aStart, const SwNodeIndex & aEnd ); 121 void DelNodes( const SwNodeIndex& rStart, sal_uLong nCnt = 1 ); 122 123 void ChgNode( SwNodeIndex& rDelPos, sal_uLong nSize, 124 SwNodeIndex& rInsPos, sal_Bool bNewFrms ); 125 126 void UpdtOutlineIdx( const SwNode& ); // Update ab Node alle OutlineNodes 127 128 void _CopyNodes( const SwNodeRange&, const SwNodeIndex&, 129 sal_Bool bNewFrms = sal_True, sal_Bool bTblInsDummyNode = sal_False ) const; 130 void _DelDummyNodes( const SwNodeRange& rRg ); 131 132 protected: 133 SwNodes( SwDoc* pDoc ); 134 135 public: 136 ~SwNodes(); 137 138 typedef ::std::vector<SwNodeRange> NodeRanges_t; 139 typedef ::std::vector<NodeRanges_t> TableRanges_t; 140 operator [](sal_uLong n) const141 SwNodePtr operator[]( sal_uLong n ) const 142 { return (SwNodePtr)BigPtrArray::operator[] ( n ); } 143 Count() const144 sal_uLong Count() const { return BigPtrArray::Count(); } ForEach(FnForEach_SwNodes fnForEach,void * pArgs=0)145 void ForEach( FnForEach_SwNodes fnForEach, void* pArgs = 0 ) 146 { 147 BigPtrArray::ForEach( 0, BigPtrArray::Count(), 148 (FnForEach) fnForEach, pArgs ); 149 } ForEach(sal_uLong nStt,sal_uLong nEnd,FnForEach_SwNodes fnForEach,void * pArgs=0)150 void ForEach( sal_uLong nStt, sal_uLong nEnd, FnForEach_SwNodes fnForEach, void* pArgs = 0 ) 151 { 152 BigPtrArray::ForEach( nStt, nEnd, (FnForEach) fnForEach, pArgs ); 153 } 154 void ForEach( const SwNodeIndex& rStart, const SwNodeIndex& rEnd, 155 FnForEach_SwNodes fnForEach, void* pArgs = 0 ); 156 157 // eine noch leere Section GetEndOfPostIts() const158 SwNode& GetEndOfPostIts() const { return *pEndOfPostIts; } 159 // Section fuer alle Fussnoten GetEndOfInserts() const160 SwNode& GetEndOfInserts() const { return *pEndOfInserts; } 161 // Section fuer alle Flys/Header/Footers GetEndOfAutotext() const162 SwNode& GetEndOfAutotext() const { return *pEndOfAutotext; } 163 // Section fuer alle Redlines GetEndOfRedlines() const164 SwNode& GetEndOfRedlines() const { return *pEndOfRedlines; } 165 // das ist der letzte EndNode einer SonderSection. Hier nach kommt nur 166 // noch die normale ContentSection (also der BodyText) GetEndOfExtras() const167 SwNode& GetEndOfExtras() const { return *pEndOfRedlines; } 168 // die normale ContentSection (also der BodyText) GetEndOfContent() const169 SwNode& GetEndOfContent() const { return *pEndOfContent; } 170 171 // ist das NodesArray das normale vom Doc? (nicht das UndoNds, .. ) 172 // Implementierung steht im doc.hxx (weil man dazu Doc kennen muss) ! 173 sal_Bool IsDocNodes() const; 174 175 sal_uInt16 GetSectionLevel(const SwNodeIndex &rIndex) const; 176 void Delete(const SwNodeIndex &rPos, sal_uLong nNodes = 1); 177 178 sal_Bool _MoveNodes( const SwNodeRange&, SwNodes& rNodes, const SwNodeIndex&, 179 sal_Bool bNewFrms = sal_True ); 180 void MoveRange( SwPaM&, SwPosition&, SwNodes& rNodes ); 181 _Copy(const SwNodeRange & rRg,const SwNodeIndex & rInsPos,sal_Bool bNewFrms=sal_True) const182 void _Copy( const SwNodeRange& rRg, const SwNodeIndex& rInsPos, 183 sal_Bool bNewFrms = sal_True ) const 184 { _CopyNodes( rRg, rInsPos, bNewFrms ); } 185 186 void SectionUp( SwNodeRange *); 187 void SectionDown( SwNodeRange *pRange, SwStartNodeType = SwNormalStartNode ); 188 189 sal_Bool CheckNodesRange( const SwNodeIndex& rStt, const SwNodeIndex& rEnd ) const; 190 191 void GoStartOfSection(SwNodeIndex *) const; 192 void GoEndOfSection(SwNodeIndex *) const; 193 194 SwCntntNode* GoNext(SwNodeIndex *) const; 195 SwCntntNode* GoPrevious(SwNodeIndex *) const; 196 197 //Gehe zum naechsten/vorherigen Cntnt/Tabellennode, fuer den 198 //es LayoutFrames gibt, dabei Kopf-/Fusszeilen/Rahmen etc. nicht verlassen 199 SwNode* GoNextWithFrm(SwNodeIndex *) const; 200 SwNode* GoPreviousWithFrm(SwNodeIndex *) const; 201 202 // zum naechsten Content-Node, der nicht geschuetzt oder versteckt ist 203 // (beides auf sal_False ==> GoNext/GoPrevious!!!) 204 SwCntntNode* GoNextSection( SwNodeIndex *, int bSkipHidden = sal_True, 205 int bSkipProtect = sal_True ) const; 206 SwCntntNode* GoPrevSection( SwNodeIndex *, int bSkipHidden = sal_True, 207 int bSkipProtect = sal_True ) const; 208 209 // erzeuge ein leere Section von Start und EndNode. Darf nur gerufen 210 // werden, wenn eine neue Section mit Inhalt erzeugt werden soll. 211 // Zum Beispiel bei den Filtern/Undo/... 212 SwStartNode* MakeEmptySection( const SwNodeIndex& rIdx, 213 SwStartNodeType = SwNormalStartNode ); 214 215 // die Impl. von "Make...Node" stehen in den angegebenen .ccx-Files 216 SwTxtNode *MakeTxtNode( const SwNodeIndex & rWhere, 217 SwTxtFmtColl *pColl, 218 SwAttrSet* pAutoAttr = 0 ); // in ndtxt.cxx 219 SwStartNode* MakeTextSection( const SwNodeIndex & rWhere, 220 SwStartNodeType eSttNdTyp, 221 SwTxtFmtColl *pColl, 222 SwAttrSet* pAutoAttr = 0 ); 223 224 SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere, 225 const String& rGrfName, 226 const String& rFltName, 227 const Graphic* pGraphic, 228 SwGrfFmtColl *pColl, 229 SwAttrSet* pAutoAttr = 0, 230 sal_Bool bDelayed = sal_False ); // in ndgrf.cxx 231 232 SwGrfNode *MakeGrfNode( const SwNodeIndex & rWhere, 233 const GraphicObject& rGrfObj, 234 SwGrfFmtColl *pColl, 235 SwAttrSet* pAutoAttr = 0 ); // in ndgrf.cxx 236 237 SwOLENode *MakeOLENode( const SwNodeIndex & rWhere, 238 const svt::EmbeddedObjectRef&, 239 SwGrfFmtColl *pColl, 240 SwAttrSet* pAutoAttr = 0 ); // in ndole.cxx 241 SwOLENode *MakeOLENode( const SwNodeIndex & rWhere, 242 const String &rName, 243 sal_Int64 nAspect, 244 SwGrfFmtColl *pColl, 245 SwAttrSet* pAutoAttr ); // in ndole.cxx 246 247 // Array aller GliederiungsNodes; 248 const SwOutlineNodes& GetOutLineNds() const; 249 250 //void UpdateOutlineNode( const SwNode&, sal_uInt8 nOldLevel, sal_uInt8 nNewLevel );//#outline level,removed by zhaojianwei 251 // alle Nodes Updaten - Rule/Format-Aenderung 252 void UpdateOutlineNode(SwNode & rNd); 253 254 // fuege die Nodes fuer die Tabelle ein 255 // wenn Lines angegeben, erzeuge die Matrix aus Lines & Boxen 256 // ansonsten nur die Anzahl von Boxen. 257 /* #109161# 258 259 New parameter pAttrSet: If pAttrSet is non-null and contains an 260 adjust item it is propagated to the table cells. If there is an 261 adjust in pCntntTxtColl or pHeadlineTxtColl this adjust item 262 overrides the item in pAttrSet. 263 264 */ 265 SwTableNode* InsertTable( const SwNodeIndex& rNdIdx, 266 sal_uInt16 nBoxes, SwTxtFmtColl* pCntntTxtColl, 267 sal_uInt16 nLines = 0, sal_uInt16 nRepeat = 0, 268 SwTxtFmtColl* pHeadlineTxtColl = 0, 269 const SwAttrSet * pAttrSet = 0); 270 271 // erzeuge aus dem makierten Bereich eine ausgeglichene Tabelle 272 SwTableNode* TextToTable( const SwNodeRange& rRange, sal_Unicode cCh, 273 SwTableFmt* pTblFmt, 274 SwTableLineFmt* pLineFmt, 275 SwTableBoxFmt* pBoxFmt, 276 SwTxtFmtColl* pTxtColl, 277 SwUndoTxtToTbl* pUndo = 0 ); 278 279 SwNodeRange * ExpandRangeForTableBox(const SwNodeRange & rRange); 280 281 //create a table from a vector of NodeRanges - API support 282 SwTableNode* TextToTable( const TableRanges_t& rTableNodes, 283 SwTableFmt* pTblFmt, 284 SwTableLineFmt* pLineFmt, 285 SwTableBoxFmt* pBoxFmt, 286 SwTxtFmtColl* pTxtColl 287 /*, SwUndo... pUndo*/ ); 288 289 // erzeuge aus der Tabelle wieder normalen Text 290 sal_Bool TableToText( const SwNodeRange& rRange, sal_Unicode cCh, 291 SwUndoTblToTxt* = 0 ); 292 // steht im untbl.cxx und darf nur vom Undoobject gerufen werden 293 SwTableNode* UndoTableToText( sal_uLong nStt, sal_uLong nEnd, 294 const SwTblToTxtSaves& rSavedData ); 295 296 // fuege in der Line, vor der InsPos eine neue Box ein. Das Format 297 // wird von der nachfolgenden (vorhergenden;wenn an Ende) genommen 298 // in der Line muss schon eine Box vorhanden sein ! 299 sal_Bool InsBoxen( SwTableNode*, SwTableLine*, SwTableBoxFmt*, 300 // Formate fuer den TextNode der Box 301 SwTxtFmtColl*, const SfxItemSet* pAutoAttr, 302 sal_uInt16 nInsPos, sal_uInt16 nCnt = 1 ); 303 // Splittet eine Tabelle in der Grund-Zeile, in der der Index steht. 304 // Alle GrundZeilen dahinter wandern in eine neue Tabelle/-Node. 305 // Ist das Flag bCalcNewSize auf sal_True, wird fuer beide neuen Tabellen 306 // die neue SSize aus dem Max der Boxen errechnet; vorrausgesetzt, 307 // die SSize ist "absolut" gesetzt (LONG_MAX) 308 // (Wird zur Zeit nur fuer den RTF-Parser benoetigt) 309 SwTableNode* SplitTable( const SwNodeIndex& rPos, sal_Bool bAfter = sal_True, 310 sal_Bool bCalcNewSize = sal_False ); 311 // fuegt 2 Tabellen, die hintereinander stehen, wieder zusammen 312 sal_Bool MergeTable( const SwNodeIndex& rPos, sal_Bool bWithPrev = sal_True, 313 sal_uInt16 nMode = 0, SwHistory* pHistory = 0 ); 314 315 // fuege eine neue SwSection ein 316 SwSectionNode* InsertTextSection(SwNodeIndex const& rNdIdx, 317 SwSectionFmt& rSectionFmt, 318 SwSectionData const&, 319 SwTOXBase const*const pTOXBase, 320 SwNodeIndex const*const pEnde, 321 bool const bInsAtStart = true, 322 bool const bCreateFrms = true); 323 324 // in welchem Doc steht das Nodes-Array ? GetDoc()325 SwDoc* GetDoc() { return pMyDoc; } GetDoc() const326 const SwDoc* GetDoc() const { return pMyDoc; } 327 328 // suche den vorhergehenden [/nachfolgenden ] ContentNode oder 329 // TabellenNode mit Frames. Wird kein Ende angeben, dann wird mit 330 // dem FrameIndex begonnen; ansonsten, wird mit dem vor rFrmIdx und 331 // dem hintern pEnd die Suche gestartet. Sollte kein gueltiger Node 332 // gefunden werden, wird 0 returnt. rFrmIdx zeigt auf dem Node mit 333 // Frames 334 SwNode* FindPrvNxtFrmNode( SwNodeIndex& rFrmIdx, 335 const SwNode* pEnd = 0 ) const; 336 337 //-> #112139# 338 SwNode * DocumentSectionStartNode(SwNode * pNode) const; 339 SwNode * DocumentSectionEndNode(SwNode * pNode) const; 340 //<- #112139# 341 }; 342 343 #endif 344