Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include <ctype.h>
22 : #include <hintids.hxx>
23 : #include <hints.hxx>
24 : #include <vcl/graphicfilter.hxx>
25 :
26 : #include <vcl/graph.hxx>
27 : #include <svl/urihelper.hxx>
28 : #include <editeng/boxitem.hxx>
29 : #include <editeng/wghtitem.hxx>
30 : #include <editeng/cmapitem.hxx>
31 : #include <editeng/contouritem.hxx>
32 : #include <editeng/postitem.hxx>
33 : #include <editeng/crossedoutitem.hxx>
34 : #include <svl/stritem.hxx>
35 : #include <unotools/charclass.hxx>
36 : #include <txtftn.hxx>
37 : #include <fmtpdsc.hxx>
38 : #include <fmtftn.hxx>
39 : #include <fmtanchr.hxx>
40 : #include <fmtrfmrk.hxx>
41 : #include <fmtclds.hxx>
42 : #include <fmtfld.hxx>
43 : #include <fmtfsize.hxx>
44 : #include <fmthdft.hxx>
45 : #include <fmtcntnt.hxx>
46 : #include <redline.hxx>
47 : #include <pam.hxx>
48 : #include <doc.hxx>
49 : #include <ndtxt.hxx>
50 : #include <frmatr.hxx>
51 : #include <fldbas.hxx> // RES_SETEXPFLD
52 : #include <charatr.hxx> // class SwFmtRefMark
53 : #include <swtable.hxx> // class SwTableLines, ...
54 : #include <tox.hxx>
55 : #include <expfld.hxx> // SwExpField
56 : #include <section.hxx> // class SwSection
57 : #include <tblsel.hxx> // class SwSelBoxes
58 : #include <pagedesc.hxx>
59 : #include <docsh.hxx> // class SwDocSh
60 : #include <fltshell.hxx>
61 : #include <viewsh.hxx>
62 : #include <shellres.hxx>
63 :
64 :
65 : using namespace com::sun::star;
66 :
67 14786 : static SwCntntNode* GetCntntNode(SwDoc* pDoc, SwNodeIndex& rIdx, bool bNext)
68 : {
69 14786 : SwCntntNode * pCNd = rIdx.GetNode().GetCntntNode();
70 14786 : if(!pCNd && 0 == (pCNd = bNext ? pDoc->GetNodes().GoNext(&rIdx)
71 0 : : pDoc->GetNodes().GoPrevious(&rIdx)))
72 : {
73 0 : pCNd = bNext ? pDoc->GetNodes().GoPrevious(&rIdx)
74 0 : : pDoc->GetNodes().GoNext(&rIdx);
75 : OSL_ENSURE(pCNd, "kein ContentNode gefunden");
76 : }
77 14786 : return pCNd;
78 : }
79 :
80 : // ------ Stack-Eintrag fuer die gesamten - Attribute vom Text -----------
81 16875 : SwFltStackEntry::SwFltStackEntry(const SwPosition& rStartPos, SfxPoolItem* pHt)
82 : : m_aMkPos(rStartPos)
83 : , m_aPtPos(rStartPos)
84 : , mnStartCP(-1)
85 : , mnEndCP(-1)
86 16875 : , bIsParaEnd(false)
87 : {
88 16875 : pAttr = pHt; // speicher eine Kopie vom Attribut
89 16875 : bOld = sal_False; // used for marking Attributes *before* skipping field results
90 16875 : bOpen = sal_True; // locke das Attribut --> darf erst
91 16875 : bConsumedByField = sal_False;
92 16875 : }
93 :
94 33750 : SwFltStackEntry::~SwFltStackEntry()
95 : {
96 : // Attribut kam zwar als Pointer, wird aber hier geloescht
97 16875 : delete pAttr;
98 16875 : }
99 :
100 17226 : void SwFltStackEntry::SetEndPos(const SwPosition& rEndPos)
101 : {
102 : // Attribut freigeben und das Ende merken.
103 : // Alles mit sal_uInt16's, weil sonst beim Einfuegen von neuem Text an der
104 : // Cursor-Position auch der Bereich vom Attribut weiter
105 : // verschoben wird.
106 : // Das ist aber nicht das gewollte!
107 17226 : bOpen = sal_False; // freigeben und das ENDE merken
108 17226 : m_aPtPos.SetPos(rEndPos);
109 17226 : }
110 :
111 :
112 16270 : bool SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck,
113 : const SwFltPosition &rMkPos, const SwFltPosition &rPtPos, bool bIsParaEnd,
114 : sal_uInt16 nWhich)
115 : {
116 : // does this range actually contain something?
117 : // empty range is allowed if at start of empty paragraph
118 : // fields are special: never have range, so leave them
119 : //
120 : // The only position of 0x0D will not be able to make region in the old logic
121 : // because it is beyond the length of para...need special consideration here.
122 : SwCntntNode *const pCntntNode(
123 16270 : SwNodeIndex(rMkPos.m_nNode, +1).GetNode().GetCntntNode());
124 38218 : if (rMkPos == rPtPos &&
125 10166 : ((0 != rPtPos.m_nCntnt) || (pCntntNode && (0 != pCntntNode->Len())))
126 3071 : && (RES_TXTATR_FIELD != nWhich)
127 19341 : && !(bIsParaEnd && pCntntNode && pCntntNode->IsTxtNode() && 0 != pCntntNode->Len() ))
128 : {
129 2896 : return false;
130 : }
131 : // !!! Die Content-Indizies beziehen sich immer auf den Node !!!
132 13374 : rRegion.GetPoint()->nNode = rMkPos.m_nNode.GetIndex() + 1;
133 13374 : SwCntntNode* pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, true);
134 13374 : rRegion.GetPoint()->nContent.Assign(pCNd, rMkPos.m_nCntnt);
135 13374 : rRegion.SetMark();
136 13374 : if (rMkPos.m_nNode != rPtPos.m_nNode)
137 : {
138 1338 : rRegion.GetPoint()->nNode = rPtPos.m_nNode.GetIndex() + 1;
139 1338 : pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, false);
140 : }
141 13374 : rRegion.GetPoint()->nContent.Assign(pCNd, rPtPos.m_nCntnt);
142 : OSL_ENSURE( CheckNodesRange( rRegion.Start()->nNode,
143 : rRegion.End()->nNode, true ),
144 : "atttribute or similar crosses section-boundaries" );
145 13374 : if( bCheck )
146 3 : return CheckNodesRange( rRegion.Start()->nNode,
147 6 : rRegion.End()->nNode, true );
148 : else
149 13371 : return true;
150 : }
151 :
152 16270 : bool SwFltStackEntry::MakeRegion(SwDoc* pDoc, SwPaM& rRegion, bool bCheck) const
153 : {
154 : return MakeRegion(pDoc, rRegion, bCheck, m_aMkPos, m_aPtPos, bIsParaEnd,
155 16270 : pAttr->Which());
156 : }
157 :
158 490 : SwFltControlStack::SwFltControlStack(SwDoc* pDo, sal_uLong nFieldFl)
159 490 : : nFieldFlags(nFieldFl),bHasSdOD(true), bSdODChecked(false), pDoc(pDo), bIsEndStack(false)
160 : {
161 490 : }
162 :
163 :
164 490 : SwFltControlStack::~SwFltControlStack()
165 : {
166 : OSL_ENSURE(maEntries.empty(), "There are still Attributes on the stack");
167 490 : }
168 :
169 : // MoveAttrs() ist fuer folgendes Problem:
170 : // Wenn ueber den Stack ein Feld wie z.B. "Variable setzen" gesetzt wird,
171 : // verschiebt sich der Text um ein \xff - Zeichen, und alle folgenden
172 : // Attribute stimmen in ihrer Position nicht mehr.
173 : // Dann muss MoveAttrs() nach dem Setzen des Attributes ins Doc gerufen werden,
174 : // so dass alle Attribut-Positionen,
175 : // die im selben Absatz weiter hinten stehen, um 1 Zeichen weiter
176 : // nach rechts verschoben werden.
177 0 : void SwFltControlStack::MoveAttrs( const SwPosition& rPos )
178 : {
179 0 : size_t nCnt = maEntries.size();
180 0 : sal_uLong nPosNd = rPos.nNode.GetIndex();
181 0 : sal_uInt16 nPosCt = rPos.nContent.GetIndex() - 1;
182 :
183 0 : for (size_t i=0; i < nCnt; ++i)
184 : {
185 0 : SwFltStackEntry& rEntry = maEntries[i];
186 0 : if (
187 0 : (rEntry.m_aMkPos.m_nNode.GetIndex()+1 == nPosNd) &&
188 0 : (rEntry.m_aMkPos.m_nCntnt >= nPosCt)
189 : )
190 : {
191 0 : rEntry.m_aMkPos.m_nCntnt++;
192 : OSL_ENSURE( rEntry.m_aMkPos.m_nCntnt
193 : <= pDoc->GetNodes()[nPosNd]->GetCntntNode()->Len(),
194 : "Attribut-Anfang hinter Zeilenende" );
195 : }
196 0 : if (
197 0 : (rEntry.m_aPtPos.m_nNode.GetIndex()+1 == nPosNd) &&
198 0 : (rEntry.m_aPtPos.m_nCntnt >= nPosCt)
199 : )
200 : {
201 0 : rEntry.m_aPtPos.m_nCntnt++;
202 : OSL_ENSURE( rEntry.m_aPtPos.m_nCntnt
203 : <= pDoc->GetNodes()[nPosNd]->GetCntntNode()->Len(),
204 : "Attribut-Ende hinter Zeilenende" );
205 : }
206 : }
207 0 : }
208 :
209 18 : void SwFltControlStack::MarkAllAttrsOld()
210 : {
211 18 : size_t nCnt = maEntries.size();
212 124 : for (sal_uInt16 i=0; i < nCnt; ++i)
213 106 : maEntries[i].bOld = sal_True;
214 18 : }
215 :
216 : namespace
217 : {
218 17284 : bool couldExtendEntry(const SwFltStackEntry *pExtendCandidate,
219 : const SfxPoolItem& rAttr)
220 : {
221 2181 : return (pExtendCandidate &&
222 4362 : !pExtendCandidate->bConsumedByField &&
223 : //potentially more, but lets keep it simple
224 22832 : (isPARATR_LIST(rAttr.Which()) || (isCHRATR(rAttr.Which()) && rAttr.Which() != RES_CHRATR_FONT && rAttr.Which() != RES_CHRATR_FONTSIZE)) &&
225 18470 : *(pExtendCandidate->pAttr) == rAttr);
226 : }
227 : }
228 :
229 17284 : void SwFltControlStack::NewAttr(const SwPosition& rPos, const SfxPoolItem& rAttr)
230 : {
231 17284 : sal_uInt16 nWhich = rAttr.Which();
232 : // Ende von evtl. gleichen Attributen auf dem Stack Setzen, damit sich die
233 : // Attribute nicht auf dem Stack haeufen
234 17284 : SwFltStackEntry *pExtendCandidate = SetAttr(rPos, nWhich);
235 17284 : if (couldExtendEntry(pExtendCandidate, rAttr))
236 : {
237 : //Here we optimize by seeing if there is an attribute uncommited
238 : //to the document which
239 : //
240 : //a) has the same value as this attribute
241 : //b) is already open, or ends at the same place as where we're starting
242 : //from. If so we merge it with this one and elide adding another
243 : //to the stack
244 409 : pExtendCandidate->SetEndPos(rPos);
245 409 : pExtendCandidate->bOpen=true;
246 : }
247 : else
248 : {
249 16875 : SwFltStackEntry *pTmp = new SwFltStackEntry(rPos, rAttr.Clone() );
250 16875 : pTmp->SetStartCP(GetCurrAttrCP());
251 16875 : maEntries.push_back(pTmp);
252 : }
253 17284 : }
254 :
255 605 : void SwFltControlStack::DeleteAndDestroy(Entries::size_type nCnt)
256 : {
257 : OSL_ENSURE(nCnt < maEntries.size(), "Out of range!");
258 605 : if (nCnt < maEntries.size())
259 : {
260 605 : myEIter aElement = maEntries.begin() + nCnt;
261 605 : maEntries.erase(aElement);
262 : }
263 : //Clear the para end position recorded in reader intermittently for the least impact on loading performance
264 : //Because the attributes handled based on the unit of para
265 605 : if ( empty() )
266 : {
267 110 : ClearParaEndPosition();
268 110 : bHasSdOD = true;
269 110 : bSdODChecked = false;
270 : }
271 605 : }
272 :
273 : // SwFltControlStack::StealAttr() loescht Attribute des angegebenen Typs vom Stack.
274 : // Als nAttrId sind erlaubt: 0 fuer alle, oder ein spezieller Typ.
275 : // Damit erscheinen sie nicht in der Doc-Struktur. Dabei werden nur die
276 : // Attribute entfernt, die im selben Absatz wie rPos stehen.
277 : // Wird fuer Grafik-Apos -> Grafiken benutzt.
278 0 : void SwFltControlStack::StealAttr(const SwNodeIndex& rNode, sal_uInt16 nAttrId)
279 : {
280 0 : size_t nCnt = maEntries.size();
281 :
282 0 : while (nCnt)
283 : {
284 0 : nCnt --;
285 0 : SwFltStackEntry& rEntry = maEntries[nCnt];
286 0 : if (rEntry.m_aPtPos.m_nNode.GetIndex()+1 == rNode.GetIndex() &&
287 0 : (!nAttrId || nAttrId == rEntry.pAttr->Which()))
288 : {
289 0 : DeleteAndDestroy(nCnt); // loesche aus dem Stack
290 : }
291 : }
292 0 : }
293 :
294 : // SwFltControlStack::KillUnlockedAttr() loescht alle Attribute vom Stack,
295 : // welche punktuell auf rPos aufgespannt sind.
296 : // Damit erscheinen sie nicht in der Doc-Struktur.
297 : // Wird im WW Import benoetigt zum ignorieren der auf dem 0x0c Section-
298 : // Break-Symbol gesetzten Attribute.
299 62 : void SwFltControlStack::KillUnlockedAttrs(const SwPosition& rPos)
300 : {
301 62 : SwFltPosition aFltPos(rPos);
302 :
303 62 : size_t nCnt = maEntries.size();
304 462 : while( nCnt )
305 : {
306 338 : nCnt --;
307 338 : SwFltStackEntry& rEntry = maEntries[nCnt];
308 676 : if( !rEntry.bOld
309 232 : && !rEntry.bOpen
310 127 : && (rEntry.m_aMkPos == aFltPos)
311 450 : && (rEntry.m_aPtPos == aFltPos))
312 : {
313 112 : DeleteAndDestroy( nCnt ); // loesche aus dem Stack
314 : }
315 62 : }
316 62 : }
317 :
318 : // Alle gelockten Attribute freigeben (unlocken) und das Ende setzen,
319 : // alle anderen im Document setzen und wieder aus dem Stack loeschen
320 : // Returned, ob das gesuchte Attribut / die gesuchten Attribute
321 : // ueberhaupt auf dem Stack standen
322 34169 : SwFltStackEntry* SwFltControlStack::SetAttr(const SwPosition& rPos,
323 : sal_uInt16 nAttrId, sal_Bool bTstEnde, long nHand,
324 : sal_Bool consumedByField)
325 : {
326 34169 : SwFltStackEntry *pRet = NULL;
327 :
328 34169 : SwFltPosition aFltPos(rPos);
329 :
330 : OSL_ENSURE(!nAttrId ||
331 : (POOLATTR_BEGIN <= nAttrId && POOLATTR_END > nAttrId) ||
332 : (RES_FLTRATTR_BEGIN <= nAttrId && RES_FLTRATTR_END > nAttrId),
333 : "Falsche Id fuers Attribut");
334 :
335 34169 : myEIter aI = maEntries.begin();
336 747647 : while (aI != maEntries.end())
337 : {
338 679309 : bool bLastEntry = aI == maEntries.end() - 1;
339 :
340 679309 : SwFltStackEntry& rEntry = *aI;
341 679309 : if (rEntry.bOpen)
342 : {
343 : // setze das Ende vom Attribut
344 121518 : bool bF = false;
345 121518 : if (!nAttrId )
346 : {
347 7 : bF = true;
348 : }
349 121511 : else if (nAttrId == rEntry.pAttr->Which())
350 : {
351 16812 : if( nAttrId != RES_FLTR_BOOKMARK )
352 : {
353 : // Handle abfragen
354 16804 : bF = true;
355 : }
356 8 : else if (nHand == ((SwFltBookmark*)(rEntry.pAttr))->GetHandle())
357 : {
358 6 : bF = true;
359 : }
360 : }
361 121518 : if (bF)
362 : {
363 16817 : rEntry.bConsumedByField = consumedByField;
364 16817 : rEntry.SetEndPos(rPos);
365 16817 : rEntry.SetEndCP(GetCurrAttrCP());
366 16817 : if (bLastEntry && nAttrId == rEntry.pAttr->Which())
367 : {
368 : //potential candidate for merging with an identical
369 : //property beginning at rPos
370 5671 : pRet = &rEntry;
371 : }
372 : }
373 121518 : ++aI;
374 121518 : continue;
375 : }
376 :
377 : // ist die Endposition die Cursor-Position, dann noch nicht
378 : // ins Dokument setzen, es muss noch Text folgen;
379 : // ausser am Dokumentende. (Attribut-Expandierung !!)
380 : // Beim Ende-Stack niemals ausser am DocEnde reinsetzen
381 557791 : if (bTstEnde)
382 : {
383 556966 : if (bIsEndStack)
384 : {
385 13 : ++aI;
386 13 : continue;
387 : }
388 :
389 : //defer inserting this attribute into the document until
390 : //we advance to the next node, or finish processing the document
391 556953 : if (rEntry.m_aPtPos.m_nNode.GetIndex() == aFltPos.m_nNode.GetIndex())
392 : {
393 543573 : if (bLastEntry && nAttrId == rEntry.pAttr->Which() &&
394 2065 : rEntry.m_aPtPos.m_nCntnt == aFltPos.m_nCntnt)
395 : {
396 : //potential candidate for merging with an identical
397 : //property beginning at rPos
398 2044 : pRet = &rEntry;
399 : }
400 :
401 541508 : ++aI;
402 541508 : continue;
403 : }
404 : }
405 16270 : SetAttrInDoc(rPos, rEntry);
406 16270 : aI = maEntries.erase(aI);
407 : }
408 :
409 34169 : return pRet;
410 : }
411 :
412 74 : static void MakePoint(const SwFltStackEntry& rEntry, SwDoc* pDoc,
413 : SwPaM& rRegion)
414 : {
415 : // der Anker ist der Point vom Pam. Dieser wird beim Einfugen von Text usw.
416 : // veraendert; darum wird er auf dem Stack gespeichert. Das Attribut muss
417 : // nur noch im Format gesetzt werden.
418 74 : rRegion.DeleteMark();
419 74 : rRegion.GetPoint()->nNode = rEntry.m_aMkPos.m_nNode.GetIndex() + 1;
420 74 : SwCntntNode* pCNd = GetCntntNode(pDoc, rRegion.GetPoint()->nNode, true);
421 74 : rRegion.GetPoint()->nContent.Assign(pCNd, rEntry.m_aMkPos.m_nCntnt);
422 74 : }
423 :
424 : // MakeBookRegionOrPoint() ist wie MakeRegionOrPoint, aber die besonderen
425 : // Beschraenkungen von Bookmarks in Tabellen werden beachtet.
426 : // ( Anfang und Ende muessen in selber Zelle sein )
427 6 : static void MakeBookRegionOrPoint(const SwFltStackEntry& rEntry, SwDoc* pDoc,
428 : SwPaM& rRegion, sal_Bool bCheck )
429 : {
430 6 : if (rEntry.MakeRegion(pDoc, rRegion, bCheck )){
431 : // sal_Bool b1 = rNds[rRegion.GetPoint()->nNode]->FindTableNode() != 0;
432 6 : if (rRegion.GetPoint()->nNode.GetNode().FindTableBoxStartNode()
433 3 : != rRegion.GetMark()->nNode.GetNode().FindTableBoxStartNode())
434 : {
435 0 : rRegion.Exchange(); // Ungueltiger Bereich
436 0 : rRegion.DeleteMark(); // -> beide auf Mark
437 : }
438 : }else{
439 3 : MakePoint(rEntry, pDoc, rRegion);
440 : }
441 6 : }
442 :
443 : // IterateNumrulePiece() sucht von rTmpStart bis rEnd den ersten
444 : // fuer Numrules gueltigen Bereich heraus.
445 : //
446 : // rNds sind die Doc-Nodes
447 : // rEnd ist Bereichs-Ende,
448 : // rTmpStart ist ReinRaus-Parameter: Anfang des zu untersuchenden Bereiches rein,
449 : // Anfang des gueltigen Bereichs raus
450 : // rTmpEnd ist raus-Parameter
451 : // Return-Bool ist true fuer gueltigen Bereich
452 0 : static bool IterateNumrulePiece( const SwNodeIndex& rEnd,
453 : SwNodeIndex& rTmpStart, SwNodeIndex& rTmpEnd )
454 : {
455 0 : while( ( rTmpStart <= rEnd )
456 0 : && !( rTmpStart.GetNode().IsTxtNode() ) ) // suche gueltigen Anfang
457 0 : ++rTmpStart;
458 :
459 0 : rTmpEnd = rTmpStart;
460 0 : while( ( rTmpEnd <= rEnd )
461 0 : && ( rTmpEnd.GetNode().IsTxtNode() ) ) // suche gueltiges Ende + 1
462 0 : ++rTmpEnd;
463 :
464 0 : rTmpEnd--; // gueltiges Ende
465 :
466 0 : return rTmpStart <= rTmpEnd; // gueltig ?
467 : }
468 :
469 : //***This function will check whether there is existing individual attribute positon for 0x0D***/
470 : //The check will happen only once for a paragraph during loading
471 88 : bool SwFltControlStack::HasSdOD()
472 : {
473 88 : bool bRet = false;
474 :
475 665 : for (Entries::iterator it = maEntries.begin(); it != maEntries.end(); ++it)
476 : {
477 589 : SwFltStackEntry& rEntry = *it;
478 589 : if ( rEntry.mnStartCP == rEntry.mnEndCP )
479 : {
480 111 : if ( CheckSdOD(rEntry.mnStartCP,rEntry.mnEndCP) )
481 : {
482 12 : bRet = true;
483 12 : break;
484 : }
485 : }
486 : }
487 :
488 88 : return bRet;
489 : }
490 :
491 14954 : void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos,
492 : SwFltStackEntry& rEntry)
493 : {
494 14954 : SwPaM aRegion( rTmpPos );
495 :
496 14954 : switch(rEntry.pAttr->Which())
497 : {
498 : case RES_FLTR_ANCHOR:
499 : {
500 71 : SwFrmFmt* pFmt = ((SwFltAnchor*)rEntry.pAttr)->GetFrmFmt();
501 71 : if (pFmt != NULL)
502 : {
503 71 : MakePoint(rEntry, pDoc, aRegion);
504 71 : SwFmtAnchor aAnchor(pFmt->GetAnchor());
505 71 : aAnchor.SetAnchor(aRegion.GetPoint());
506 71 : pFmt->SetFmtAttr(aAnchor);
507 : // Damit die Frames bei Einfuegen in existierendes Doc
508 : // erzeugt werden (erst nach Setzen des Ankers!):
509 142 : if(pDoc->GetCurrentViewShell() //swmod 071108//swmod 071225
510 71 : && (FLY_AT_PARA == pFmt->GetAnchor().GetAnchorId()))
511 : {
512 0 : pFmt->MakeFrms();
513 71 : }
514 : }
515 : }
516 71 : break;
517 : case RES_FLTR_STYLESHEET:
518 0 : break;
519 : case RES_TXTATR_FIELD:
520 0 : break;
521 : case RES_TXTATR_TOXMARK:
522 0 : break;
523 : case RES_FLTR_NUMRULE: // Numrule 'reinsetzen
524 : {
525 0 : const String& rNumNm = ((SfxStringItem*)rEntry.pAttr)->GetValue();
526 0 : SwNumRule* pRul = pDoc->FindNumRulePtr( rNumNm );
527 0 : if( pRul )
528 : {
529 0 : if( rEntry.MakeRegion(pDoc, aRegion, sal_True))
530 : {
531 0 : SwNodeIndex aTmpStart( aRegion.Start()->nNode );
532 0 : SwNodeIndex aTmpEnd( aTmpStart );
533 0 : SwNodeIndex& rRegEndNd = aRegion.End()->nNode;
534 0 : while( IterateNumrulePiece( rRegEndNd,
535 : aTmpStart, aTmpEnd ) )
536 : {
537 0 : SwPaM aTmpPam( aTmpStart, aTmpEnd );
538 : // no start of a new list
539 0 : pDoc->SetNumRule( aTmpPam, *pRul, false );
540 :
541 0 : aTmpStart = aTmpEnd; // Start fuer naechstes Teilstueck
542 0 : ++aTmpStart;
543 0 : }
544 : }
545 : else
546 0 : pDoc->DelNumRule( rNumNm );
547 0 : }
548 : }
549 0 : break;
550 : case RES_FLTR_NUMRULE_NUM:
551 0 : break;
552 : case RES_FLTR_BOOKMARK: // eigentlich nur fuer den Ende-Stack
553 : {
554 6 : SwFltBookmark* pB = (SwFltBookmark*)rEntry.pAttr;
555 6 : const String& rName = ((SwFltBookmark*)rEntry.pAttr)->GetName();
556 :
557 6 : if (IsFlagSet(BOOK_TO_VAR_REF))
558 : {
559 0 : if (pB->IsPgRef() && !pB->IsRef())
560 : {
561 : // XRefs und Bookmarks sind bereits geUpcased
562 0 : MakeBookRegionOrPoint(rEntry, pDoc, aRegion, sal_True);
563 0 : pDoc->InsertPoolItem(aRegion, SwFmtRefMark(rName), 0);
564 : }
565 0 : else if( !pB->IsOnlyRef() )
566 : {
567 0 : SwFieldType* pFT = pDoc->GetFldType(RES_SETEXPFLD, rName, false);
568 0 : if (!pFT)
569 : { // FieldType anlegen
570 0 : SwSetExpFieldType aS(pDoc, rName, nsSwGetSetExpType::GSE_STRING);
571 0 : pFT = pDoc->InsertFldType(aS);
572 : }
573 : SwSetExpField aFld((SwSetExpFieldType*)pFT,
574 0 : pB->GetValSys());
575 0 : aFld.SetSubType( nsSwExtendedSubType::SUB_INVISIBLE );
576 0 : MakePoint(rEntry, pDoc, aRegion);
577 0 : pDoc->InsertPoolItem(aRegion, SwFmtFld(aFld), 0);
578 0 : MoveAttrs( *(aRegion.GetPoint()) );
579 : }
580 : }
581 18 : if( !pB->IsOnlyRef() &&
582 6 : ( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && !rEntry.bConsumedByField)
583 : {
584 6 : MakeBookRegionOrPoint(rEntry, pDoc, aRegion, sal_True);
585 6 : pDoc->getIDocumentMarkAccess()->makeMark( aRegion, rName, IDocumentMarkAccess::BOOKMARK);
586 : }
587 : }
588 6 : break;
589 : case RES_FLTR_TOX:
590 : {
591 0 : MakePoint(rEntry, pDoc, aRegion);
592 :
593 0 : SwPosition* pPoint = aRegion.GetPoint();
594 :
595 0 : SwFltTOX* pTOXAttr = (SwFltTOX*)rEntry.pAttr;
596 :
597 : // test if on this node there had been a pagebreak BEFORE the
598 : // tox attribut was put on the stack
599 0 : SfxItemSet aBkSet( pDoc->GetAttrPool(), RES_PAGEDESC, RES_BREAK );
600 0 : SwCntntNode* pNd = 0;
601 0 : if( !pTOXAttr->HadBreakItem() || !pTOXAttr->HadPageDescItem() )
602 : {
603 0 : pNd = pPoint->nNode.GetNode().GetCntntNode();
604 0 : if( pNd )
605 : {
606 0 : const SfxItemSet* pSet = pNd->GetpSwAttrSet();
607 : const SfxPoolItem* pItem;
608 0 : if( pSet )
609 : {
610 0 : if( !pTOXAttr->HadBreakItem()
611 0 : && SFX_ITEM_SET == pSet->GetItemState( RES_BREAK, sal_False, &pItem ) )
612 : {
613 0 : aBkSet.Put( *pItem );
614 0 : pNd->ResetAttr( RES_BREAK );
615 : }
616 0 : if( !pTOXAttr->HadPageDescItem()
617 0 : && SFX_ITEM_SET == pSet->GetItemState( RES_PAGEDESC, sal_False, &pItem ) )
618 : {
619 0 : aBkSet.Put( *pItem );
620 0 : pNd->ResetAttr( RES_PAGEDESC );
621 : }
622 : }
623 : }
624 : }
625 :
626 0 : delete pTOXAttr->GetBase();
627 :
628 : // set (aboved saved and removed) the break item at the node following the TOX
629 0 : if( aBkSet.Count() )
630 0 : pNd->SetAttr( aBkSet );
631 : }
632 0 : break;
633 : case RES_FLTR_SECTION:
634 0 : MakePoint(rEntry, pDoc, aRegion); // bislang immer Point==Mark
635 : pDoc->InsertSwSection(aRegion,
636 0 : *(static_cast<SwFltSection*>(rEntry.pAttr))->GetSectionData(),
637 0 : 0, 0, false);
638 0 : delete (((SwFltSection*)rEntry.pAttr)->GetSectionData());
639 0 : break;
640 : case RES_FLTR_REDLINE:
641 : {
642 0 : if (rEntry.MakeRegion(pDoc, aRegion, sal_True))
643 : {
644 : pDoc->SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_ON
645 : | nsRedlineMode_t::REDLINE_SHOW_INSERT
646 0 : | nsRedlineMode_t::REDLINE_SHOW_DELETE ));
647 0 : SwFltRedline& rFltRedline = *((SwFltRedline*)rEntry.pAttr);
648 :
649 0 : if( USHRT_MAX != rFltRedline.nAutorNoPrev )
650 : {
651 : SwRedlineData aData(rFltRedline.eTypePrev,
652 : rFltRedline.nAutorNoPrev,
653 : rFltRedline.aStampPrev,
654 : aEmptyStr,
655 : 0
656 0 : );
657 0 : pDoc->AppendRedline(new SwRedline(aData, aRegion), true);
658 : }
659 : SwRedlineData aData(rFltRedline.eType,
660 : rFltRedline.nAutorNo,
661 : rFltRedline.aStamp,
662 : aEmptyStr,
663 : 0
664 0 : );
665 0 : pDoc->AppendRedline( new SwRedline(aData, aRegion), true );
666 : pDoc->SetRedlineMode((RedlineMode_t)( nsRedlineMode_t::REDLINE_NONE
667 : | nsRedlineMode_t::REDLINE_SHOW_INSERT
668 0 : | nsRedlineMode_t::REDLINE_SHOW_DELETE ));
669 : }
670 : }
671 0 : break;
672 : default:
673 : {
674 : //Revised for more complex situations should be considered
675 14877 : if ( !bSdODChecked )
676 : {
677 88 : bHasSdOD = HasSdOD();
678 88 : bSdODChecked = true;
679 : }
680 14877 : sal_Int32 nStart = rEntry.GetStartCP();
681 14877 : sal_Int32 nEnd = rEntry.GetEndCP();
682 14877 : if (nStart != -1 && nEnd != -1 && nEnd >= nStart )
683 : {
684 14877 : rEntry.SetIsParaEnd( IsParaEndInCPs(nStart,nEnd,bHasSdOD) );
685 : }
686 14877 : if (rEntry.MakeRegion(pDoc, aRegion, sal_False))
687 : {
688 12476 : nStart = rEntry.GetStartCP();
689 12476 : nEnd = rEntry.GetEndCP();
690 12476 : if (rEntry.IsParaEnd())
691 : {
692 2195 : pDoc->InsertPoolItem(aRegion, *rEntry.pAttr, 0, true);
693 : }
694 : else
695 : {
696 10281 : pDoc->InsertPoolItem(aRegion, *rEntry.pAttr, 0);
697 : }
698 : }
699 : }
700 14877 : break;
701 14954 : }
702 14954 : }
703 :
704 0 : bool SwFltControlStack::IsParaEndInCPs(sal_Int32 /*nStart*/, sal_Int32 /*nEnd*/,bool /*bSdOD*/) const
705 : {
706 0 : return false;
707 : }
708 :
709 0 : bool SwFltControlStack::CheckSdOD(sal_Int32 /*nStart*/, sal_Int32 /*nEnd*/)
710 : {
711 0 : return false;
712 : }
713 :
714 0 : SfxPoolItem* SwFltControlStack::GetFmtStackAttr(sal_uInt16 nWhich, sal_uInt16 * pPos)
715 : {
716 0 : size_t nSize = maEntries.size();
717 :
718 0 : while (nSize)
719 : {
720 : // ist es das gesuchte Attribut ? (gueltig sind nur gelockte,
721 : // also akt. gesetzte Attribute!!)
722 0 : SwFltStackEntry &rEntry = maEntries[--nSize];
723 0 : if (rEntry.bOpen && rEntry.pAttr->Which() == nWhich)
724 : {
725 0 : if (pPos)
726 0 : *pPos = nSize;
727 0 : return (SfxPoolItem*)rEntry.pAttr; // Ok, dann Ende
728 : }
729 : }
730 0 : return 0;
731 : }
732 :
733 0 : const SfxPoolItem* SwFltControlStack::GetFmtAttr(const SwPosition& rPos, sal_uInt16 nWhich)
734 : {
735 0 : SfxPoolItem* pHt = GetFmtStackAttr(nWhich);
736 0 : if (pHt)
737 0 : return (const SfxPoolItem*)pHt;
738 :
739 : // im Stack ist das Attribut nicht vorhanden, also befrage das Dokument
740 0 : SwCntntNode * pNd = rPos.nNode.GetNode().GetCntntNode();
741 :
742 0 : if (!pNd) // kein ContentNode, dann das dflt. Attribut
743 0 : return &pDoc->GetAttrPool().GetDefaultItem(nWhich);
744 0 : return &pNd->GetAttr(nWhich);
745 : }
746 :
747 1 : void SwFltControlStack::Delete(const SwPaM &rPam)
748 : {
749 1 : const SwPosition *pStt = rPam.Start(), *pEnd = rPam.End();
750 :
751 1 : if( !rPam.HasMark() || *pStt >= *pEnd )
752 0 : return;
753 :
754 1 : SwNodeIndex aStartNode(pStt->nNode, -1);
755 1 : sal_uInt16 nStartIdx = pStt->nContent.GetIndex();
756 2 : SwNodeIndex aEndNode(pEnd->nNode, -1);
757 1 : sal_uInt16 nEndIdx = pEnd->nContent.GetIndex();
758 :
759 : //We don't support deleting content that is over one node, or removing a node.
760 : OSL_ENSURE(aEndNode == aStartNode, "nodes must be the same, or this method extended");
761 1 : if (aEndNode != aStartNode)
762 0 : return;
763 :
764 2 : for (size_t nSize = maEntries.size(); nSize > 0;)
765 : {
766 0 : SwFltStackEntry& rEntry = maEntries[--nSize];
767 :
768 : bool bEntryStartAfterSelStart =
769 0 : (rEntry.m_aMkPos.m_nNode == aStartNode &&
770 0 : rEntry.m_aMkPos.m_nCntnt >= nStartIdx);
771 :
772 : bool bEntryStartBeforeSelEnd =
773 0 : (rEntry.m_aMkPos.m_nNode == aEndNode &&
774 0 : rEntry.m_aMkPos.m_nCntnt <= nEndIdx);
775 :
776 0 : bool bEntryEndAfterSelStart = false;
777 0 : bool bEntryEndBeforeSelEnd = false;
778 0 : if (!rEntry.bOpen)
779 : {
780 : bEntryEndAfterSelStart =
781 0 : (rEntry.m_aPtPos.m_nNode == aStartNode &&
782 0 : rEntry.m_aPtPos.m_nCntnt >= nStartIdx);
783 :
784 : bEntryEndBeforeSelEnd =
785 0 : (rEntry.m_aPtPos.m_nNode == aEndNode &&
786 0 : rEntry.m_aPtPos.m_nCntnt <= nEndIdx);
787 : }
788 :
789 0 : bool bTotallyContained = false;
790 0 : if (
791 0 : bEntryStartAfterSelStart && bEntryStartBeforeSelEnd &&
792 0 : bEntryEndAfterSelStart && bEntryEndBeforeSelEnd
793 : )
794 : {
795 0 : bTotallyContained = true;
796 : }
797 :
798 0 : if (bTotallyContained)
799 : {
800 : //after start, before end, delete
801 0 : DeleteAndDestroy(nSize);
802 0 : continue;
803 : }
804 :
805 0 : xub_StrLen nCntntDiff = nEndIdx - nStartIdx;
806 :
807 : //to be adjusted
808 0 : if (bEntryStartAfterSelStart)
809 : {
810 0 : if (bEntryStartBeforeSelEnd)
811 : {
812 : //move start to new start
813 0 : rEntry.m_aMkPos.SetPos(aStartNode, nStartIdx);
814 : }
815 : else
816 0 : rEntry.m_aMkPos.m_nCntnt -= nCntntDiff;
817 : }
818 :
819 0 : if (bEntryEndAfterSelStart)
820 : {
821 0 : if (bEntryEndBeforeSelEnd)
822 0 : rEntry.m_aPtPos.SetPos(aStartNode, nStartIdx);
823 : else
824 0 : rEntry.m_aPtPos.m_nCntnt -= nCntntDiff;
825 : }
826 :
827 : //That's what Open is, end equal to start, and nPtCntnt is invalid
828 0 : if (rEntry.bOpen)
829 0 : rEntry.m_aPtPos = rEntry.m_aMkPos;
830 1 : }
831 : }
832 :
833 : //------ hier stehen die Methoden von SwFltAnchor -----------
834 71 : SwFltAnchor::SwFltAnchor(SwFrmFmt* pFmt) :
835 71 : SfxPoolItem(RES_FLTR_ANCHOR), pFrmFmt(pFmt)
836 : {
837 71 : pClient = new SwFltAnchorClient(this);
838 71 : pFrmFmt->Add(pClient);
839 71 : }
840 :
841 71 : SwFltAnchor::SwFltAnchor(const SwFltAnchor& rCpy) :
842 71 : SfxPoolItem(RES_FLTR_ANCHOR), pFrmFmt(rCpy.pFrmFmt)
843 : {
844 71 : pClient = new SwFltAnchorClient(this);
845 71 : pFrmFmt->Add(pClient);
846 71 : }
847 :
848 355 : SwFltAnchor::~SwFltAnchor()
849 : {
850 142 : delete pClient;
851 213 : }
852 :
853 0 : void SwFltAnchor::SetFrmFmt(SwFrmFmt * _pFrmFmt)
854 : {
855 0 : pFrmFmt = _pFrmFmt;
856 0 : }
857 :
858 0 : const SwFrmFmt * SwFltAnchor::GetFrmFmt() const
859 : {
860 0 : return pFrmFmt;
861 : }
862 :
863 71 : SwFrmFmt * SwFltAnchor::GetFrmFmt()
864 : {
865 71 : return pFrmFmt;
866 : }
867 :
868 0 : int SwFltAnchor::operator==(const SfxPoolItem& rItem) const
869 : {
870 0 : return pFrmFmt == ((SwFltAnchor&)rItem).pFrmFmt;
871 : }
872 :
873 71 : SfxPoolItem* SwFltAnchor::Clone(SfxItemPool*) const
874 : {
875 71 : return new SwFltAnchor(*this);
876 : }
877 :
878 : // SwFltAnchorClient
879 :
880 142 : SwFltAnchorClient::SwFltAnchorClient(SwFltAnchor * pFltAnchor)
881 142 : : m_pFltAnchor(pFltAnchor)
882 : {
883 142 : }
884 :
885 44 : void SwFltAnchorClient::Modify(const SfxPoolItem *, const SfxPoolItem * pNew)
886 : {
887 44 : if (pNew->Which() == RES_FMT_CHG)
888 : {
889 0 : const SwFmtChg * pFmtChg = dynamic_cast<const SwFmtChg *> (pNew);
890 :
891 0 : if (pFmtChg != NULL)
892 : {
893 0 : SwFrmFmt * pFrmFmt = dynamic_cast<SwFrmFmt *> (pFmtChg->pChangedFmt);
894 :
895 0 : if (pFrmFmt != NULL)
896 0 : m_pFltAnchor->SetFrmFmt(pFrmFmt);
897 : }
898 : }
899 44 : }
900 :
901 : //------ hier stehen die Methoden von SwFltRedline -----------
902 0 : int SwFltRedline::operator==(const SfxPoolItem& rItem) const
903 : {
904 0 : return this == &rItem;
905 : }
906 :
907 0 : SfxPoolItem* SwFltRedline::Clone( SfxItemPool* ) const
908 : {
909 0 : return new SwFltRedline(*this);
910 : }
911 :
912 : //------ hier stehen die Methoden von SwFltBookmark -----------
913 6 : SwFltBookmark::SwFltBookmark( const String& rNa, const String& rVa,
914 : long nHand, sal_Bool bOnlyR )
915 : : SfxPoolItem(RES_FLTR_BOOKMARK), nHandle(nHand), aName(rNa), aVal(rVa),
916 6 : bOnlyRef(bOnlyR), bRef(sal_False), bPgRef(sal_False)
917 : {
918 : // eSrc: CHARSET_DONTKNOW fuer keine UEbersetzung bei operator <<
919 : // Upcase wird immer gemacht.
920 : // bei XXXStack.NewAttr(...) wird nie eine UEbersetzung vorgenommen.
921 : // ansonsten: uebergebener Src-Charset fuer aName
922 : // im Filter eingestellter Src-Charset fuer aVal ( Text )
923 6 : }
924 :
925 6 : SwFltBookmark::SwFltBookmark(const SwFltBookmark& rCpy)
926 : : SfxPoolItem(RES_FLTR_BOOKMARK),
927 : nHandle(rCpy.nHandle),
928 : aName(rCpy.aName),
929 : aVal(rCpy.aVal),
930 : bOnlyRef(rCpy.bOnlyRef),
931 : bRef(rCpy.bRef),
932 6 : bPgRef(rCpy.bPgRef)
933 : {
934 6 : }
935 :
936 0 : int SwFltBookmark::operator==(const SfxPoolItem& rItem) const
937 : {
938 0 : return (aName == ((SwFltBookmark&)rItem).aName)
939 0 : && (nHandle == ((SwFltBookmark&)rItem).nHandle);
940 : }
941 :
942 6 : SfxPoolItem* SwFltBookmark::Clone(SfxItemPool*) const
943 : {
944 6 : return new SwFltBookmark(*this);
945 : }
946 :
947 : //------ hier stehen die Methoden von SwFltTOX -----------
948 :
949 0 : SwFltTOX::SwFltTOX(SwTOXBase* pBase, sal_uInt16 _nCols)
950 : : SfxPoolItem(RES_FLTR_TOX), pTOXBase(pBase), nCols( _nCols ),
951 0 : bHadBreakItem( sal_False ), bHadPageDescItem( sal_False )
952 : {
953 0 : }
954 :
955 0 : SwFltTOX::SwFltTOX(const SwFltTOX& rCpy)
956 : : SfxPoolItem(RES_FLTR_TOX), pTOXBase(rCpy.pTOXBase), nCols( rCpy.nCols ),
957 0 : bHadBreakItem( rCpy.bHadBreakItem ), bHadPageDescItem( rCpy.bHadPageDescItem )
958 : {
959 0 : }
960 :
961 0 : int SwFltTOX::operator==(const SfxPoolItem& rItem) const
962 : {
963 0 : return pTOXBase == ((SwFltTOX&)rItem).pTOXBase;
964 : }
965 :
966 0 : SfxPoolItem* SwFltTOX::Clone(SfxItemPool*) const
967 : {
968 0 : return new SwFltTOX(*this);
969 : }
970 :
971 : //------ hier stehen die Methoden von SwFltSwSection -----------
972 :
973 0 : SwFltSection::SwFltSection(SwSectionData *const pSect)
974 : : SfxPoolItem(RES_FLTR_SECTION)
975 0 : , m_pSection(pSect)
976 : {
977 0 : }
978 :
979 0 : SwFltSection::SwFltSection(const SwFltSection& rCpy)
980 : : SfxPoolItem(RES_FLTR_SECTION)
981 0 : , m_pSection(rCpy.m_pSection)
982 : {
983 0 : }
984 :
985 0 : int SwFltSection::operator==(const SfxPoolItem& rItem) const
986 : {
987 0 : return m_pSection == ((SwFltSection&)rItem).m_pSection;
988 : }
989 :
990 0 : SfxPoolItem* SwFltSection::Clone(SfxItemPool*) const
991 : {
992 0 : return new SwFltSection(*this);
993 : }
994 :
995 : ///////////////////////////////////////////////////////////////////////
996 : //
997 : // hier beginnt der von mdt erzeugte code. dieser ist eine shell auf
998 : // der writer-seite nach moeglichkeit bald fuer alle filter. die ganze
999 : // schwierigkeit, texte & formatattribute einzufuegen, die positionen
1000 : // zu verwalten, styles & kopf/fuszzeilen etc.
1001 : //
1002 :
1003 : //////////////////////////////////////////////////////////// SwFltShell
1004 0 : SwFltShell::SwFltShell(SwDoc* pDoc, SwPaM& rPaM, const String& rBaseURL, sal_Bool bNew, sal_uLong nFieldFl) :
1005 : pCurrentPageDesc(0),
1006 : pSavedPos(0),
1007 : eSubMode(None),
1008 : nAktStyle(0),
1009 : aStack(pDoc, nFieldFl),
1010 : aEndStack(pDoc, nFieldFl),
1011 0 : pPaM(new SwPaM(*(rPaM.GetPoint()))),
1012 : sBaseURL(rBaseURL),
1013 0 : nPageDescOffset(GetDoc().GetPageDescCnt()),
1014 : eSrcCharSet(RTL_TEXTENCODING_MS_1252),
1015 : bNewDoc(bNew),
1016 : bStdPD(sal_False),
1017 0 : bProtect(sal_False)
1018 : {
1019 0 : memset( pColls, 0, sizeof( pColls ) );
1020 0 : pOutDoc = new SwFltOutDoc( *pDoc, pPaM, aStack, aEndStack );
1021 0 : pOut = pOutDoc;
1022 :
1023 0 : if( !bNewDoc ){ // in ein Dokument einfuegen ?
1024 : // Da immer ganze Zeile eingelesen werden, muessen
1025 : // evtl. Zeilen eingefuegt / aufgebrochen werden
1026 0 : const SwPosition* pPos = pPaM->GetPoint();
1027 0 : const SwTxtNode* pSttNd = pPos->nNode.GetNode().GetTxtNode();
1028 0 : sal_uInt16 nCntPos = pPos->nContent.GetIndex();
1029 0 : if (nCntPos && !pSttNd->GetTxt().isEmpty())
1030 : // EinfuegePos nicht in leerer Zeile
1031 0 : pDoc->SplitNode( *pPos, false ); // neue Zeile erzeugen
1032 0 : if (!pSttNd->GetTxt().isEmpty())
1033 : { // InsertPos not on empty line
1034 0 : pDoc->SplitNode( *pPos, false ); // neue Zeile
1035 0 : pPaM->Move( fnMoveBackward ); // gehe in leere Zeile
1036 : }
1037 :
1038 : // verhinder das Einlesen von Tabellen in Fussnoten / Tabellen
1039 0 : sal_uLong nNd = pPos->nNode.GetIndex();
1040 0 : bool bReadNoTbl = 0 != pSttNd->FindTableNode() ||
1041 0 : ( nNd < pDoc->GetNodes().GetEndOfInserts().GetIndex() &&
1042 0 : pDoc->GetNodes().GetEndOfInserts().StartOfSectionIndex() < nNd );
1043 0 : if( bReadNoTbl )
1044 0 : pOutDoc->SetReadNoTable();
1045 : }
1046 0 : pCurrentPageDesc = &pDoc->GetPageDesc( 0 ); // Standard
1047 :
1048 0 : }
1049 :
1050 0 : SwFltShell::~SwFltShell()
1051 : {
1052 : sal_uInt16 i;
1053 :
1054 0 : if (eSubMode == Style)
1055 0 : EndStyle();
1056 0 : if( pOutDoc->IsInTable() ) // falls nicht ordentlich abgeschlossen
1057 0 : EndTable();
1058 0 : if( pOutDoc->IsInFly() )
1059 0 : EndFly();
1060 :
1061 0 : GetDoc().SetUpdateExpFldStat(true);
1062 0 : GetDoc().SetInitDBFields(sal_True);
1063 0 : aStack.SetAttr(*pPaM->GetPoint(), 0, sal_False);
1064 0 : aStack.SetAttr(*pPaM->GetPoint(), 0, sal_False);
1065 0 : aEndStack.SetAttr(*pPaM->GetPoint(), 0, sal_False);
1066 0 : aEndStack.SetAttr(*pPaM->GetPoint(), 0, sal_False);
1067 0 : if( bProtect ){ // Das ganze Doc soll geschuetzt sein
1068 :
1069 0 : SwDoc& rDoc = GetDoc();
1070 : // 1. SectionFmt und Section anlegen
1071 0 : SwSectionFmt* pSFmt = rDoc.MakeSectionFmt( 0 );
1072 0 : SwSectionData aSectionData(CONTENT_SECTION, OUString("PMW-Protect"));
1073 0 : aSectionData.SetProtectFlag( true );
1074 : // 2. Start- und EndIdx suchen
1075 0 : const SwNode* pEndNd = &rDoc.GetNodes().GetEndOfContent();
1076 0 : SwNodeIndex aEndIdx( *pEndNd, -1L );
1077 0 : const SwStartNode* pSttNd = pEndNd->StartOfSectionNode();
1078 0 : SwNodeIndex aSttIdx( *pSttNd, 1L ); // +1 -> hinter StartNode
1079 : // Section einfuegen
1080 : // Section einfuegen
1081 0 : rDoc.GetNodes().InsertTextSection(
1082 0 : aSttIdx, *pSFmt, aSectionData, 0, &aEndIdx, false );
1083 :
1084 0 : if( !IsFlagSet(SwFltControlStack::DONT_HARD_PROTECT) ){
1085 0 : SwDocShell* pDocSh = rDoc.GetDocShell();
1086 0 : if( pDocSh )
1087 0 : pDocSh->SetReadOnlyUI( sal_True );
1088 0 : }
1089 : }
1090 : // Pagedescriptoren am Dokument updaten (nur so werden auch die
1091 : // linken Seiten usw. eingestellt).
1092 :
1093 0 : GetDoc().ChgPageDesc( 0, GetDoc().GetPageDesc( 0 )); // PageDesc "Standard"
1094 0 : for (i=nPageDescOffset;i<GetDoc().GetPageDescCnt();i++)
1095 : {
1096 0 : const SwPageDesc& rPD = GetDoc().GetPageDesc(i);
1097 0 : GetDoc().ChgPageDesc(i, rPD);
1098 : }
1099 :
1100 0 : delete pPaM;
1101 0 : for (i=0; i<sizeof(pColls)/sizeof(*pColls); i++)
1102 0 : delete pColls[i];
1103 0 : delete pOutDoc;
1104 0 : }
1105 :
1106 0 : SwFltShell& SwFltShell::operator << ( const String& rStr )
1107 : {
1108 : OSL_ENSURE(eSubMode != Style, "char insert while in style-mode");
1109 0 : GetDoc().InsertString( *pPaM, rStr );
1110 0 : return *this;
1111 : }
1112 :
1113 0 : void SwFltShell::ConvertUStr( String& rInOut )
1114 : {
1115 0 : rInOut = GetAppCharClass().uppercase( rInOut );
1116 0 : }
1117 :
1118 : // QuoteString() wandelt CRs abhaengig von nFieldIniFlags in '\n' oder "\0x0d"
1119 0 : OUString SwFltShell::QuoteStr( const OUString& rIn )
1120 : {
1121 0 : OUStringBuffer sOut( rIn );
1122 0 : sal_Bool bAllowCr = aStack.IsFlagSet( SwFltControlStack::ALLOW_FLD_CR );
1123 :
1124 0 : for( sal_Int32 n = 0; n < sOut.getLength(); ++n )
1125 : {
1126 0 : switch( sOut[ n ] )
1127 : {
1128 : case 0x0a:
1129 0 : sOut.remove( n, 1 ); // 0xd 0xa wird zu \n
1130 0 : break;
1131 :
1132 : case 0x0b:
1133 : case 0x0c:
1134 : case 0x0d:
1135 0 : if( bAllowCr )
1136 0 : sOut[n] = '\n';
1137 0 : break;
1138 : }
1139 : }
1140 0 : return sOut.makeStringAndClear();
1141 : }
1142 :
1143 0 : SwFltShell& SwFltShell::operator << ( const sal_Unicode c )
1144 : {
1145 : OSL_ENSURE( eSubMode != Style, "char insert while in style-mode");
1146 0 : GetDoc().InsertString( *pPaM, OUString(c) );
1147 0 : return *this;
1148 : }
1149 :
1150 0 : SwFltShell& SwFltShell::AddError( const sal_Char* pErr )
1151 : {
1152 0 : String aName(OUString("ErrorTag"));
1153 0 : SwFieldType* pFT = GetDoc().GetFldType( RES_SETEXPFLD, aName, false );
1154 0 : if( pFT == 0)
1155 : {
1156 0 : SwSetExpFieldType aS(&GetDoc(), aName, nsSwGetSetExpType::GSE_STRING);
1157 0 : pFT = GetDoc().InsertFldType(aS);
1158 : }
1159 : SwSetExpField aFld( (SwSetExpFieldType*)pFT,
1160 0 : OUString::createFromAscii( pErr ));
1161 : //, VVF_INVISIBLE
1162 0 : GetDoc().InsertPoolItem(*pPaM, SwFmtFld(aFld), 0);
1163 0 : return *this;
1164 : }
1165 :
1166 0 : SwFltShell& SwFltShell::operator << (Graphic& rGraphic)
1167 : {
1168 : // embedded Grafik !!
1169 0 : GetDoc().Insert(*pPaM, aEmptyStr, aEmptyStr, &rGraphic, NULL, NULL, NULL);
1170 0 : return *this;
1171 : }
1172 :
1173 0 : void SwFltShell::NextParagraph()
1174 : {
1175 0 : GetDoc().AppendTxtNode(*pPaM->GetPoint());
1176 0 : }
1177 :
1178 0 : void SwFltShell::NextPage()
1179 : {
1180 0 : NextParagraph();
1181 0 : GetDoc().InsertPoolItem(*pPaM,
1182 0 : SvxFmtBreakItem(SVX_BREAK_PAGE_BEFORE, RES_BREAK), 0);
1183 0 : }
1184 :
1185 0 : SwFltShell& SwFltShell::AddGraphic( const String& rPicName )
1186 : {
1187 : // embedded:
1188 0 : GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
1189 0 : Graphic aGraphic;
1190 : // one of: GFF_NOT GFF_BMP GFF_GIF GFF_JPG GFF_PCD GFF_PCX GFF_PNG
1191 : // GFF_TIF GFF_XBM GFF_DXF GFF_MET GFF_PCT GFF_SGF GFF_SVM GFF_WMF
1192 : // GFF_SGV GFF_XXX
1193 : INetURLObject aDir(
1194 : URIHelper::SmartRel2Abs(
1195 0 : INetURLObject(GetBaseURL()), rPicName,
1196 0 : URIHelper::GetMaybeFileHdl()) );
1197 0 : switch (rFilter.ImportGraphic(aGraphic, aDir))
1198 : {
1199 : case GRFILTER_OK:
1200 0 : *this << aGraphic;
1201 0 : break;
1202 : case GRFILTER_OPENERROR:
1203 : case GRFILTER_IOERROR:
1204 : case GRFILTER_FORMATERROR:
1205 : case GRFILTER_VERSIONERROR:
1206 : case GRFILTER_FILTERERROR:
1207 : case GRFILTER_ABORT:
1208 : case GRFILTER_TOOBIG:
1209 : default:
1210 0 : AddError( "picture import error" );
1211 0 : break;
1212 : }
1213 0 : return *this;
1214 : }
1215 :
1216 0 : SwFltShell& SwFltShell::SetStyle( sal_uInt16 nStyle )
1217 : {
1218 0 : SwFltFormatCollection* p = pColls[ nStyle ];
1219 :
1220 0 : if (p)
1221 : {
1222 0 : if( !pOutDoc->IsInTable() && nStyle != nAktStyle )
1223 : {
1224 0 : if( pColls[nAktStyle]->IsInFly() && pOutDoc->IsInFly() )
1225 0 : pOutDoc->EndFly();
1226 0 : if( p->IsInFly() )
1227 0 : p->BeginStyleFly( pOutDoc );
1228 : }
1229 0 : GetDoc().SetTxtFmtColl(*pPaM, p->GetColl());
1230 0 : nAktStyle = nStyle;
1231 : }
1232 : else
1233 : {
1234 : OSL_FAIL( "Ungueltiger SwFltStyleCode" );
1235 : }
1236 0 : return *this;
1237 : }
1238 :
1239 0 : SwFltShell& SwFltShell::operator << (SwFltBookmark& aBook)
1240 : {
1241 0 : ConvertUStr( aBook.aName );
1242 0 : aBook.aVal = QuoteStr(aBook.aVal);
1243 0 : aEndStack.NewAttr(*pPaM->GetPoint(), aBook);
1244 0 : return *this;
1245 : }
1246 :
1247 0 : void SwFltShell::SetBookEnd(long nHandle)
1248 : {
1249 0 : aEndStack.SetAttr( *pPaM->GetPoint(), RES_FLTR_BOOKMARK, sal_True, nHandle );
1250 0 : }
1251 :
1252 0 : SwFltShell& SwFltShell::EndItem( sal_uInt16 nAttrId )
1253 : {
1254 0 : switch( nAttrId )
1255 : {
1256 : case RES_FLTR_BOOKMARK:
1257 : OSL_FAIL( "Falscher Aufruf fuer Bookmark-Ende" );
1258 0 : break;
1259 :
1260 : case RES_FLTR_TOX:
1261 0 : aEndStack.SetAttr(*pPaM->GetPoint(), nAttrId);
1262 0 : break;
1263 :
1264 : default:
1265 0 : aStack.SetAttr(*pPaM->GetPoint(), nAttrId);
1266 0 : break;
1267 : }
1268 0 : return *this;
1269 : }
1270 :
1271 0 : SwFltShell& SwFltShell::operator << (const SwField& rField)
1272 : {
1273 0 : GetDoc().InsertPoolItem(*pPaM, SwFmtFld(rField), 0);
1274 0 : return *this;
1275 : }
1276 :
1277 0 : /*virtual*/ SwFltOutBase& SwFltOutDoc::operator << (const SfxPoolItem& rItem)
1278 : {
1279 0 : rStack.NewAttr(*pPaM->GetPoint(), rItem);
1280 0 : return *this;
1281 : }
1282 :
1283 0 : /*virtual*/ SwFltOutBase& SwFltFormatCollection::operator <<
1284 : (const SfxPoolItem& rItem)
1285 : {
1286 0 : pColl->SetFmtAttr(rItem);
1287 0 : return *this;
1288 : }
1289 :
1290 0 : const SfxPoolItem& SwFltOutDoc::GetAttr(sal_uInt16 nWhich)
1291 : {
1292 0 : return *rStack.GetFmtAttr(*pPaM->GetPoint(), nWhich);
1293 : }
1294 :
1295 0 : const SfxPoolItem& SwFltFormatCollection::GetAttr(sal_uInt16 nWhich)
1296 : {
1297 0 : return GetColl()->GetFmtAttr(nWhich); // mit Parents
1298 : }
1299 :
1300 : // GetNodeOrStyAttr holt Attribute fuer Toggle- und Modify-Attribute:
1301 : // Bei Formatdefinitionen aus dem altuellen Style mit Parents
1302 : // sonst aus dem Node mit Parents
1303 : // Im Stack wird nicht nachgesehen
1304 :
1305 0 : const SfxPoolItem& SwFltOutDoc::GetNodeOrStyAttr(sal_uInt16 nWhich)
1306 : {
1307 0 : SwCntntNode * pNd = pPaM->GetPoint()->nNode.GetNode().GetCntntNode();
1308 0 : if (pNd) // ContentNode: Attribut mit Parent
1309 0 : return pNd->GetAttr(nWhich);
1310 : else // kein ContentNode, dann das dflt. Attribut
1311 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1312 : }
1313 :
1314 0 : const SfxPoolItem& SwFltFormatCollection::GetNodeOrStyAttr(sal_uInt16 nWhich)
1315 : {
1316 0 : return GetColl()->GetFmtAttr(nWhich); // mit Parents
1317 : }
1318 :
1319 0 : const SfxPoolItem& SwFltShell::GetNodeOrStyAttr(sal_uInt16 nWhich)
1320 : {
1321 0 : return pOut->GetNodeOrStyAttr( nWhich );
1322 : }
1323 :
1324 0 : const SfxPoolItem& SwFltShell::GetAttr(sal_uInt16 nWhich)
1325 : {
1326 0 : return pOut->GetAttr( nWhich );
1327 : }
1328 :
1329 0 : const SfxPoolItem& SwFltShell::GetFlyFrmAttr(sal_uInt16 nWhich)
1330 : {
1331 0 : return pOut->GetFlyFrmAttr( nWhich );
1332 : }
1333 :
1334 0 : SwFieldType* SwFltShell::GetSysFldType(sal_uInt16 eWhich)
1335 : {
1336 0 : return GetDoc().GetSysFldType(eWhich);
1337 : }
1338 :
1339 0 : bool SwFltShell::GetWeightBold()
1340 : {
1341 0 : return ((SvxWeightItem&)GetNodeOrStyAttr(RES_CHRATR_WEIGHT)).GetWeight()
1342 0 : != WEIGHT_NORMAL;
1343 : }
1344 :
1345 0 : bool SwFltShell::GetPostureItalic()
1346 : {
1347 0 : return ((SvxPostureItem&)GetNodeOrStyAttr(RES_CHRATR_POSTURE)).GetPosture()
1348 0 : != ITALIC_NONE;
1349 : }
1350 :
1351 0 : bool SwFltShell::GetCrossedOut()
1352 : {
1353 0 : return ((SvxCrossedOutItem&)GetNodeOrStyAttr(RES_CHRATR_CROSSEDOUT))
1354 0 : .GetStrikeout() != STRIKEOUT_NONE;
1355 : }
1356 :
1357 0 : bool SwFltShell::GetContour()
1358 : {
1359 0 : return ((SvxContourItem&)GetNodeOrStyAttr(RES_CHRATR_CONTOUR)).GetValue();
1360 : }
1361 :
1362 0 : bool SwFltShell::GetCaseKapitaelchen()
1363 : {
1364 0 : return ((SvxCaseMapItem&)GetNodeOrStyAttr(RES_CHRATR_CASEMAP))
1365 0 : .GetCaseMap() == SVX_CASEMAP_KAPITAELCHEN;
1366 : }
1367 :
1368 0 : bool SwFltShell::GetCaseVersalien()
1369 : {
1370 0 : return ((SvxCaseMapItem&)GetNodeOrStyAttr(RES_CHRATR_CASEMAP))
1371 0 : .GetCaseMap() == SVX_CASEMAP_VERSALIEN;
1372 : }
1373 :
1374 : //-------------------------------------------------------------------------
1375 : // Tabellen
1376 : //-------------------------------------------------------------------------
1377 :
1378 0 : SwFltOutBase::~SwFltOutBase()
1379 : {
1380 0 : }
1381 :
1382 0 : SwFltOutBase::SwFltOutBase(SwDoc& rDocu)
1383 0 : : rDoc(rDocu), eFlyAnchor(FLY_AT_PARA), bFlyAbsPos(false)
1384 : {
1385 0 : }
1386 :
1387 0 : const SfxPoolItem& SwFltOutBase::GetCellAttr(sal_uInt16 nWhich)
1388 : {
1389 : OSL_FAIL("GetCellAttr ausserhalb von normalem Text");
1390 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1391 : }
1392 :
1393 0 : bool SwFltOutBase::BeginTable()
1394 : {
1395 : OSL_FAIL("BeginTable ausserhalb von normalem Text");
1396 0 : return false;
1397 : }
1398 :
1399 0 : void SwFltOutBase::NextTableCell()
1400 : {
1401 : OSL_FAIL("NextTableCell ausserhalb von normalem Text");
1402 0 : }
1403 :
1404 0 : void SwFltOutBase::NextTableRow()
1405 : {
1406 : OSL_FAIL("NextTableRow ausserhalb von normalem Text");
1407 0 : }
1408 :
1409 0 : void SwFltOutBase::SetTableWidth(SwTwips /*nW*/)
1410 : {
1411 : OSL_FAIL("SetTableWidth ausserhalb von normalem Text");
1412 0 : }
1413 :
1414 0 : void SwFltOutBase::SetTableOrient(sal_Int16 /*eOri*/)
1415 : {
1416 : OSL_FAIL("SetTableOrient ausserhalb von normalem Text");
1417 0 : }
1418 :
1419 0 : void SwFltOutBase::SetCellWidth(SwTwips /*nWidth*/, sal_uInt16 /*nCell*/)
1420 : {
1421 : OSL_FAIL("SetCellWidth ausserhalb von normalem Text");
1422 0 : }
1423 :
1424 0 : void SwFltOutBase::SetCellHeight(SwTwips /*nH*/)
1425 : {
1426 : OSL_FAIL("SetCellHeight ausserhalb von normalem Text");
1427 0 : }
1428 :
1429 0 : void SwFltOutBase::SetCellBorder(const SvxBoxItem& /*rFmtBox*/, sal_uInt16 /*nCell*/)
1430 : {
1431 : OSL_FAIL("SetCellBorder ausserhalb von normalem Text");
1432 0 : }
1433 :
1434 0 : void SwFltOutBase::SetCellSpace(sal_uInt16 /*nSp*/)
1435 : {
1436 : OSL_FAIL("SetCellSpace ausserhalb von normalem Text");
1437 0 : }
1438 :
1439 0 : void SwFltOutBase::DeleteCell(sal_uInt16 /*nCell*/)
1440 : {
1441 : OSL_FAIL("DeleteCell ausserhalb von normalem Text");
1442 0 : }
1443 :
1444 0 : void SwFltOutBase::EndTable()
1445 : {
1446 : OSL_FAIL("EndTable ausserhalb von normalem Text");
1447 0 : }
1448 :
1449 0 : /*virtual*/ sal_Bool SwFltOutDoc::IsInTable()
1450 : {
1451 0 : return pTable != 0;
1452 : };
1453 :
1454 0 : bool SwFltOutDoc::BeginTable()
1455 : {
1456 0 : if(bReadNoTbl)
1457 0 : return false;
1458 :
1459 0 : if (pTable){
1460 : OSL_FAIL("BeginTable in Table");
1461 0 : return false;
1462 : }
1463 : // Alle Attribute schliessen, da sonst Attribute
1464 : // entstehen koennen, die in Flys reinragen
1465 0 : rStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1466 0 : rEndStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1467 :
1468 : // create table:
1469 : OSL_ENSURE(pTabSavedPos == NULL, "SwFltOutDoc");
1470 0 : pTabSavedPos = new SwPosition(*pPaM->GetPoint());
1471 0 : pTable = GetDoc().InsertTable(
1472 : SwInsertTableOptions( tabopts::HEADLINE_NO_BORDER, 1 ),
1473 0 : *pTabSavedPos, 1, 1, text::HoriOrientation::LEFT, 0, 0, sal_False, sal_False ); // TODO MULTIHEADER
1474 0 : nTableWidth = 0;
1475 0 : ((SwTable*)pTable)->LockModify(); // Nichts automatisch anpassen!
1476 : // set pam in 1. table cell
1477 : usTableX =
1478 0 : usTableY = 0;
1479 0 : SeekCell(usTableY, usTableX, sal_True);
1480 0 : return true;
1481 : }
1482 :
1483 0 : SwTableBox* SwFltOutDoc::GetBox(sal_uInt16 ny, sal_uInt16 nx /*= USHRT_MAX */)
1484 : {
1485 0 : if(!pTable){
1486 : OSL_ENSURE(pTable, "GetBox ohne Tabelle");
1487 0 : return 0;
1488 : }
1489 0 : if( nx == USHRT_MAX ) // aktuelle Zelle
1490 0 : nx = usTableX;
1491 :
1492 : // get structs to table cells
1493 0 : const SwTableLines* pTableLines = &pTable->GetTabLines();
1494 0 : if(!pTableLines){
1495 : OSL_FAIL("SwFltOutDoc:GetBox:pTableLines");
1496 0 : return 0;
1497 : }
1498 0 : if( ny >= pTableLines->size() ){ // Notbremse
1499 : OSL_FAIL( "SwFltOutDoc:GetBox:ny >= Count()");
1500 0 : ny = pTableLines->size() - 1;
1501 : }
1502 0 : SwTableLine* pTableLine = (*pTableLines)[ny];
1503 0 : if(!pTableLine){
1504 : OSL_FAIL("SwFltOutDoc:GetBox:pTableLine");
1505 0 : return 0;
1506 : }
1507 0 : SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
1508 0 : if(!pTableBoxes){
1509 : OSL_FAIL("SwFltOutDoc:GetBox:pTableBoxes");
1510 0 : return 0;
1511 : }
1512 0 : if( nx >= pTableBoxes->size() ){ // Notbremse
1513 : OSL_FAIL("SwFltOutDoc:GetBox:nx >= Count()");
1514 0 : nx = pTableBoxes->size() - 1;
1515 : }
1516 0 : SwTableBox* pTableBox = (*pTableBoxes)[nx];
1517 :
1518 : OSL_ENSURE(pTableBox != 0, "SwFltOutDoc:GetBox:pTableBox");
1519 0 : return pTableBox;
1520 : }
1521 :
1522 0 : void SwFltOutDoc::NextTableCell()
1523 : {
1524 0 : if(!pTable){
1525 : OSL_ENSURE(pTable, "NextTableCell ohne Tabelle");
1526 0 : return;
1527 : }
1528 0 : const SwTableLines* pTableLines = &pTable->GetTabLines();
1529 0 : SwTableLine* pTableLine = (*pTableLines)[usTableY];
1530 0 : SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
1531 0 : SwTableBox* pTableBox = (*pTableBoxes)[usTableX];
1532 : OSL_ENSURE(pTableBox != 0, "SwFltOutDoc:NextTableCell:pTableBox");
1533 0 : if(!pTableBox)
1534 0 : return;
1535 : //#pragma message(__FILE__ "(?) : Sw's const problem")
1536 : // insert cells:
1537 0 : if (++usTableX >= pTableBoxes->size())
1538 0 : GetDoc().GetNodes().InsBoxen(
1539 0 : GetDoc().IsIdxInTbl(pPaM->GetPoint()->nNode),
1540 : pTableLine,
1541 0 : (SwTableBoxFmt*)pTableBox->GetFrmFmt(),
1542 0 : GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD, false ),
1543 : 0,
1544 0 : pTableBoxes->size());
1545 0 : SeekCell(usTableY, usTableX, sal_True);
1546 0 : pTableBox = (*pTableBoxes)[usTableX];
1547 : OSL_ENSURE(pTableBox != 0, "SwFltOutDoc:pTableBox");
1548 0 : if(pTableBox)
1549 0 : (*pTableBoxes)[usTableX]->ClaimFrmFmt();
1550 : }
1551 :
1552 0 : void SwFltOutDoc::NextTableRow()
1553 : {
1554 0 : SwTableBox* pTableBox = GetBox(usTableY, 0);
1555 0 : if (pTableBox)
1556 : {
1557 : // duplicate row:
1558 0 : SwSelBoxes aSelBoxes;
1559 0 : aSelBoxes.insert( pTableBox );
1560 0 : GetDoc().InsertRow(aSelBoxes);
1561 0 : usTableX = 0;
1562 0 : SeekCell(++usTableY, usTableX, sal_True);
1563 0 : GetDoc().SetTxtFmtColl(*pPaM,
1564 0 : GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD, false ));
1565 : }
1566 0 : }
1567 :
1568 0 : void SwFltOutDoc::SetTableWidth(SwTwips nSwWidth)
1569 : {
1570 0 : if(!pTable){
1571 : OSL_ENSURE(pTable, "SetTableWidth ohne Tabelle");
1572 0 : return;
1573 : }
1574 : OSL_ENSURE( nSwWidth > MINLAY, "Tabellenbreite <= MINLAY" );
1575 0 : if( nSwWidth != nTableWidth ){
1576 0 : if( nTableWidth ) // Nicht beim ersten Setzen
1577 0 : SplitTable();
1578 0 : pTable->GetFrmFmt()->SetFmtAttr( SwFmtFrmSize(ATT_VAR_SIZE, nSwWidth));
1579 0 : nTableWidth = nSwWidth;
1580 : }
1581 : }
1582 :
1583 0 : void SwFltOutDoc::SetTableOrient(sal_Int16 eOri)
1584 : {
1585 0 : if(!pTable){
1586 : OSL_ENSURE(pTable, "SetTableOrient ohne Tabelle");
1587 0 : return;
1588 : }
1589 0 : pTable->GetFrmFmt()->SetFmtAttr( SwFmtHoriOrient( 0, eOri ));
1590 : }
1591 :
1592 0 : void SwFltOutDoc::SetCellWidth(SwTwips nWidth, sal_uInt16 nCell /* = USHRT_MAX */ )
1593 : {
1594 0 : if(!pTable){
1595 : OSL_ENSURE(pTable, "SetCellWidth ohne Tabelle");
1596 0 : return;
1597 : }
1598 : OSL_ENSURE( nWidth > MINLAY, "Tabellenzellenbreite <= MINLAY" );
1599 0 : if (nWidth < MINLAY)
1600 0 : nWidth = MINLAY;
1601 :
1602 0 : SwTableBox* pTableBox = GetBox(usTableY, nCell);
1603 0 : if(pTableBox && pTableBox->GetFrmFmt() ){
1604 0 : SwFmtFrmSize aFmtFrmSize(ATT_FIX_SIZE);
1605 0 : aFmtFrmSize.SetWidth(nWidth);
1606 0 : pTableBox->GetFrmFmt()->SetFmtAttr(aFmtFrmSize);
1607 : }
1608 : }
1609 :
1610 0 : void SwFltOutDoc::SetCellHeight(SwTwips nHeight)
1611 : {
1612 0 : if(!pTable){
1613 : OSL_ENSURE(pTable, "SetCellHeight ohne Tabelle");
1614 0 : return;
1615 : }
1616 :
1617 0 : const SwTableLines* pTableLines = &pTable->GetTabLines();
1618 0 : SwTableLine* pTableLine = (*pTableLines)[usTableY];
1619 0 : SwFmtFrmSize aFmtFrmSize(ATT_MIN_SIZE, 0, 0);
1620 0 : if (nHeight < MINLAY)
1621 0 : nHeight = MINLAY;
1622 0 : aFmtFrmSize.SetHeight(nHeight);
1623 0 : pTableLine->GetFrmFmt()->SetFmtAttr(aFmtFrmSize);
1624 : }
1625 :
1626 0 : const SfxPoolItem& SwFltOutDoc::GetCellAttr(sal_uInt16 nWhich)
1627 : {
1628 0 : if (!pTable){
1629 : OSL_ENSURE(pTable, "GetCellAttr ohne Table");
1630 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1631 : }
1632 :
1633 0 : SwTableBox* pTableBox = GetBox(usTableY, usTableX);
1634 0 : if(!pTableBox)
1635 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1636 0 : return pTableBox->GetFrmFmt()->GetFmtAttr( nWhich );
1637 : }
1638 :
1639 0 : void SwFltOutDoc::SetCellBorder(const SvxBoxItem& rFmtBox,
1640 : sal_uInt16 nCell /* = USHRT_MAX */ )
1641 : {
1642 0 : SwTableBox* pTableBox = GetBox(usTableY, nCell);
1643 0 : if(pTableBox)
1644 0 : pTableBox->GetFrmFmt()->SetFmtAttr(rFmtBox);
1645 0 : }
1646 :
1647 : // nicht aktiviert !!!
1648 0 : void SwFltOutDoc::SetCellSpace(sal_uInt16 nDist)
1649 : {
1650 0 : if(!pTable){
1651 : OSL_ENSURE(pTable, "SetCellSpace ohne Tabelle");
1652 0 : return;
1653 : }
1654 0 : SwTableBox* pTableBox = GetBox(usTableY, usTableX);
1655 0 : if(!pTableBox)
1656 0 : return;
1657 :
1658 : SvxBoxItem aFmtBox( *((SvxBoxItem*)
1659 0 : &pTableBox->GetFrmFmt()->GetFmtAttr( RES_BOX )));
1660 :
1661 : // versteh ich nich, sven: if (!nDist) nDist = 18; // ca. 0.03 cm
1662 0 : if (nDist > 42) // max. 0.7 mm
1663 0 : nDist = 42;
1664 : else
1665 0 : if (nDist < MIN_BORDER_DIST)
1666 0 : nDist = MIN_BORDER_DIST;
1667 0 : aFmtBox.SetDistance(nDist);
1668 0 : pTableBox->GetFrmFmt()->SetFmtAttr(aFmtBox);
1669 : }
1670 :
1671 0 : void SwFltOutDoc::DeleteCell(sal_uInt16 nCell /* = USHRT_MAX */)
1672 : {
1673 0 : SwTableBox* pTableBox = GetBox(usTableY, nCell);
1674 0 : if( pTableBox )
1675 : {
1676 0 : SwSelBoxes aSelBoxes;
1677 0 : aSelBoxes.insert( pTableBox );
1678 0 : GetDoc().DeleteRowCol(aSelBoxes);
1679 0 : usTableX--;
1680 : }
1681 0 : }
1682 :
1683 0 : void SwFltOutDoc::SplitTable()
1684 : {
1685 0 : if(!pTable)
1686 : {
1687 : OSL_ENSURE(pTable, "SplitTable ohne Tabelle");
1688 0 : return;
1689 : }
1690 0 : SwTableBox* pAktBox = GetBox(usTableY, usTableX);
1691 0 : SwTableBox* pSplitBox = GetBox(usTableY - 1, 0);
1692 0 : GetDoc().GetNodes().SplitTable(SwNodeIndex(*pSplitBox->GetSttNd()), false);
1693 0 : pTable = &pAktBox->GetSttNd()->FindTableNode()->GetTable();
1694 0 : usTableY = 0;
1695 : }
1696 :
1697 0 : void SwFltOutDoc::EndTable()
1698 : {
1699 0 : if (!pTable){
1700 : OSL_ENSURE(pTable, "EndTable ohne Table");
1701 0 : return;
1702 : }
1703 : // Alle Attribute schliessen, da sonst Attribute
1704 : // entstehen koennen, die in Flys reinragen
1705 0 : rStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1706 0 : rEndStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1707 :
1708 0 : if (GetDoc().GetCurrentViewShell()){ //swmod 071108//swmod 071225
1709 0 : SwTableNode* pTableNode = GetDoc().IsIdxInTbl(
1710 0 : pPaM->GetPoint()->nNode);
1711 0 : pTableNode->DelFrms();
1712 0 : pTableNode->MakeFrms(&pPaM->GetPoint()->nNode);
1713 : }
1714 :
1715 0 : *pPaM->GetPoint() = *pTabSavedPos; // restore Cursor
1716 0 : delete pTabSavedPos;
1717 0 : pTabSavedPos = 0;
1718 0 : ((SwTable*)pTable)->UnlockModify(); // Test, nuetzt nichts gegen Assert
1719 0 : pTable = 0;
1720 0 : nTableWidth = 0;
1721 : }
1722 :
1723 0 : sal_Bool SwFltOutDoc::SeekCell(short nRow, short nCol, sal_Bool bPam)
1724 : {
1725 : // get structs to table cells
1726 0 : const SwTableLines* pTableLines = &pTable->GetTabLines();
1727 0 : SwTableLine* pTableLine = (*pTableLines)[usTableY];
1728 0 : SwTableBoxes* pTableBoxes = &pTableLine->GetTabBoxes();
1729 0 : SwTableBox* pTableBox = (*pTableBoxes)[usTableX];
1730 :
1731 0 : if ((sal_uInt16)nRow >= pTableLines->size())
1732 : {
1733 : OSL_ENSURE((sal_uInt16)nRow >= pTableLines->size(), "SwFltOutDoc");
1734 0 : return sal_False;
1735 : }
1736 0 : pTableLine = (*pTableLines)[nRow];
1737 0 : pTableBoxes = &pTableLine->GetTabBoxes();
1738 0 : if (nCol >= (short)pTableBoxes->size())
1739 0 : return sal_False;
1740 0 : pTableBox = (*pTableBoxes)[nCol];
1741 0 : if( !pTableBox->GetSttNd() )
1742 : {
1743 : OSL_ENSURE(pTableBox->GetSttNd(), "SwFltOutDoc");
1744 0 : return sal_False;
1745 : }
1746 0 : if(bPam)
1747 : {
1748 0 : pPaM->GetPoint()->nNode = pTableBox->GetSttIdx() + 1;
1749 0 : pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
1750 0 : GetDoc().SetTxtFmtColl(*pPaM,
1751 0 : GetDoc().GetTxtCollFromPool(RES_POOLCOLL_STANDARD, false ));
1752 : }
1753 0 : return sal_True;
1754 : }
1755 :
1756 :
1757 : //-----------------------------------------------------------------------------
1758 : // Flys in SwFltOutBase
1759 : //-----------------------------------------------------------------------------
1760 :
1761 0 : SfxItemSet* SwFltOutBase::NewFlyDefaults()
1762 : {
1763 : // Unbedingt noetige Standardwerte setzen ( falls diese Werte nicht
1764 : // spaeter explizit gesetzt werden )
1765 :
1766 0 : SfxItemSet* p = new SfxItemSet( GetDoc().GetAttrPool(),
1767 0 : RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
1768 0 : SwFmtFrmSize aSz( ATT_VAR_SIZE, MINFLY, MINFLY );
1769 : // Default: Breite 100% ( = PMW:Auto )
1770 0 : aSz.SetWidthPercent( 100 ); // Hoehe: Auto
1771 0 : p->Put( aSz );
1772 0 : p->Put( SwFmtHoriOrient( 0, text::HoriOrientation::NONE, text::RelOrientation::FRAME ));
1773 0 : return p;
1774 : }
1775 :
1776 0 : bool SwFltOutBase::BeginFly( RndStdIds eAnchor /*= FLY_AT_PARA*/,
1777 : sal_Bool bAbsolutePos /*= sal_False*/,
1778 : const SfxItemSet* pMoreAttrs /*= 0*/)
1779 : {
1780 : (void) pMoreAttrs; // unused in non-debug
1781 : OSL_ENSURE(!pMoreAttrs, "SwFltOutBase:BeginFly mit pMoreAttrs" );
1782 0 : eFlyAnchor = eAnchor;
1783 0 : bFlyAbsPos = bAbsolutePos; // Bloedsinn eigentlich
1784 0 : return true;
1785 : }
1786 :
1787 0 : /*virtual*/ void SwFltOutBase::SetFlyAnchor( RndStdIds eAnchor )
1788 : {
1789 0 : if( !IsInFly() ){
1790 : OSL_FAIL( "SetFlyAnchor() ohne Fly" );
1791 0 : return;
1792 : }
1793 0 : if ( eAnchor == FLY_AS_CHAR ){
1794 : OSL_FAIL( "SetFlyAnchor( FLY_AS_CHAR ) nicht implementiert" );
1795 0 : return;
1796 : }
1797 0 : SwFmtAnchor& rAnchor = (SwFmtAnchor&)GetFlyFrmAttr( RES_ANCHOR );
1798 0 : rAnchor.SetType( eAnchor );
1799 : }
1800 :
1801 0 : void SwFltOutBase::EndFly()
1802 : {
1803 0 : if( bFlyAbsPos ){
1804 : // hier muessen die absoluten Positionen am Fly noch in
1805 : // die Writer-Koordinaten umgerechnet werden.
1806 : }
1807 0 : }
1808 :
1809 : //-----------------------------------------------------------------------------
1810 : // Flys in SwFltDoc
1811 : //-----------------------------------------------------------------------------
1812 :
1813 0 : /* virtual */ bool SwFltOutDoc::IsInFly()
1814 : {
1815 0 : return pFly != 0;
1816 : };
1817 :
1818 0 : SwFrmFmt* SwFltOutDoc::MakeFly( RndStdIds eAnchor, SfxItemSet* pSet )
1819 : {
1820 0 : pFly = (SwFlyFrmFmt*)GetDoc().MakeFlySection( eAnchor, pPaM->GetPoint(),
1821 0 : pSet );
1822 0 : return pFly;
1823 : }
1824 :
1825 0 : bool SwFltOutDoc::BeginFly( RndStdIds eAnchor,
1826 : sal_Bool bAbsolutePos ,
1827 : const SfxItemSet* pMoreAttrs)
1828 :
1829 : {
1830 0 : SwFltOutBase::BeginFly( eAnchor, bAbsolutePos, 0 );
1831 0 : SfxItemSet* pSet = NewFlyDefaults();
1832 :
1833 : // Alle Attribute schliessen, da sonst Attribute entstehen koennen,
1834 : // die in Flys reinragen
1835 0 : rStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1836 0 : rEndStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1837 :
1838 : // create Fly:
1839 : OSL_ENSURE(pFlySavedPos == NULL, "BeginFly in Fly"); // rekursiv geht noch nicht
1840 0 : pFlySavedPos = new SwPosition(*pPaM->GetPoint());
1841 :
1842 :
1843 0 : SwFmtAnchor aAnchor( eAnchor, 1 );
1844 :
1845 : // Wenn Fly-Attribute im Style waren, dann jetzt als Defaults reinsetzen
1846 0 : if (pMoreAttrs)
1847 0 : pSet->Put(*pMoreAttrs);
1848 :
1849 : // dieses NICHT bei Seitengebundenem Fly mit Seiten-NUMMER !
1850 0 : aAnchor.SetAnchor(pPaM->GetPoint()); // braucht erstaunlicherweise
1851 : // den Stack nicht
1852 :
1853 0 : pSet->Put( aAnchor );
1854 0 : SwFrmFmt* pF = MakeFly( eAnchor, pSet );
1855 0 : delete pSet;
1856 :
1857 : // set pam in Fly
1858 0 : const SwFmtCntnt& rCntnt = pF->GetCntnt();
1859 : OSL_ENSURE( rCntnt.GetCntntIdx(), "Kein Inhalt vorbereitet." );
1860 0 : pPaM->GetPoint()->nNode = rCntnt.GetCntntIdx()->GetIndex() + 1;
1861 0 : SwCntntNode *pNode = pPaM->GetCntntNode();
1862 0 : pPaM->GetPoint()->nContent.Assign( pNode, 0 );
1863 :
1864 0 : return true;
1865 : }
1866 :
1867 0 : /*virtual*/ void SwFltOutDoc::SetFlyFrmAttr(const SfxPoolItem& rAttr)
1868 : {
1869 0 : if (pFly){
1870 0 : pFly->SetFmtAttr( rAttr );
1871 : }else{
1872 : OSL_ENSURE(pFly, "SetFlyAttr ohne Doc-Fly");
1873 0 : return;
1874 : }
1875 : }
1876 :
1877 0 : /*virtual*/ const SfxPoolItem& SwFltOutDoc::GetFlyFrmAttr(sal_uInt16 nWhich)
1878 : {
1879 0 : if (pFly){
1880 0 : return pFly->GetFmtAttr( nWhich );
1881 : }else{
1882 : OSL_ENSURE(pFly, "GetFlyAttr ohne Fly");
1883 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1884 : }
1885 : }
1886 :
1887 0 : void SwFltOutDoc::EndFly()
1888 : {
1889 0 : if( pTable ){
1890 : OSL_FAIL( "SwFltOutDoc::EndFly() in Table" );
1891 0 : return;
1892 : }
1893 : // Alle Attribute schliessen, da sonst Attribute
1894 : // entstehen koennen, die aus Flys rausragen
1895 0 : rStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1896 0 : rEndStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
1897 :
1898 0 : *pPaM->GetPoint() = *pFlySavedPos; // restore Cursor
1899 0 : delete pFlySavedPos;
1900 0 : pFlySavedPos = 0;
1901 0 : SwFltOutBase::EndFly();
1902 0 : pFly = 0;
1903 : }
1904 :
1905 : //-----------------------------------------------------------------------------
1906 : // Flys in SwFltFormatCollection
1907 : //-----------------------------------------------------------------------------
1908 0 : /*virtual*/ bool SwFltFormatCollection::IsInFly()
1909 : {
1910 0 : return bHasFly;
1911 : };
1912 :
1913 0 : /*virtual*/ void SwFltFormatCollection::SetFlyFrmAttr(const SfxPoolItem& rAttr)
1914 : {
1915 0 : if (!pFlyAttrs)
1916 0 : pFlyAttrs = new SfxItemSet( GetDoc().GetAttrPool(),
1917 0 : RES_FRMATR_BEGIN, RES_FRMATR_END-1 );
1918 0 : pFlyAttrs->Put( rAttr );
1919 0 : }
1920 :
1921 0 : /*virtual*/ const SfxPoolItem& SwFltFormatCollection::GetFlyFrmAttr(sal_uInt16 nWhich)
1922 : {
1923 0 : if( pFlyAttrs )
1924 0 : return pFlyAttrs->Get( nWhich, sal_False );
1925 : else
1926 0 : return GetDoc().GetAttrPool().GetDefaultItem(nWhich);
1927 : }
1928 :
1929 0 : bool SwFltFormatCollection::BeginFly( RndStdIds eAnchor,
1930 : sal_Bool bAbsolutePos,
1931 : const SfxItemSet* pMoreAttrs)
1932 :
1933 : {
1934 0 : SwFltOutBase::BeginFly( eAnchor, bAbsolutePos, pMoreAttrs );
1935 0 : bHasFly = true;
1936 0 : return true;
1937 : }
1938 :
1939 0 : void SwFltFormatCollection::EndFly() // Wird nie aufgerufen
1940 : {
1941 0 : }
1942 :
1943 0 : bool SwFltFormatCollection::BeginStyleFly( SwFltOutDoc* pOutDoc )
1944 : {
1945 : OSL_ENSURE( pOutDoc, "BeginStyleFly ohne pOutDoc" );
1946 : OSL_ENSURE( pOutDoc && !pOutDoc->IsInFly(), "BeginStyleFly in Fly" );
1947 0 : if( pOutDoc && !pOutDoc->IsInFly() )
1948 0 : return pOutDoc->BeginFly( eFlyAnchor, bFlyAbsPos, pFlyAttrs );
1949 : else
1950 0 : return false;
1951 : }
1952 :
1953 : //-----------------------------------------------------------------------------
1954 : // Flys in SwFltShell
1955 : //-----------------------------------------------------------------------------
1956 :
1957 0 : bool SwFltShell::BeginFly( RndStdIds eAnchor,
1958 : sal_Bool bAbsolutePos)
1959 : {
1960 0 : if (pOut->IsInFly()){
1961 : OSL_FAIL("BeginFly in Fly");
1962 0 : return false;
1963 : }
1964 0 : if (pOutDoc->IsInTable()){
1965 : OSL_FAIL("BeginFly in Table");
1966 0 : return false;
1967 : }
1968 0 : pOut->BeginFly( eAnchor, bAbsolutePos, pColls[nAktStyle]->GetpFlyAttrs() );
1969 0 : eSubMode = Fly;
1970 0 : return true;
1971 : }
1972 :
1973 0 : void SwFltShell::SetFlyXPos( short nXPos, sal_Int16 eHRel,
1974 : sal_Int16 eHAlign)
1975 : {
1976 0 : SetFlyFrmAttr( SwFmtHoriOrient( nXPos, eHAlign, eHRel ) );
1977 0 : }
1978 :
1979 0 : void SwFltShell::SetFlyYPos( short nYPos, sal_Int16 eVRel,
1980 : sal_Int16 eVAlign)
1981 : {
1982 0 : SetFlyFrmAttr( SwFmtVertOrient( nYPos, eVAlign, eVRel ) );
1983 0 : }
1984 :
1985 :
1986 0 : void SwFltShell::EndFly()
1987 : {
1988 0 : if (!pOut->IsInFly()){
1989 : OSL_FAIL("EndFly ohne Fly");
1990 0 : return;
1991 : }
1992 0 : if (pOutDoc->IsInTable()){ // Table verschraenkt mit Fly macht keinen Sinn
1993 : OSL_FAIL("EndFly in Table ( verschraenkt )");
1994 0 : EndTable(); // -> Table beenden
1995 : }
1996 0 : pOut->EndFly();
1997 0 : eSubMode = None;
1998 : }
1999 :
2000 : //-----------------------------------------------------------------------------
2001 : // Fussnoten
2002 : //-----------------------------------------------------------------------------
2003 :
2004 0 : void SwFltShell::BeginFootnote()
2005 : {
2006 0 : if( pOut->IsInFly() ){ // Passiert z.B. bei Fussnote in Fly
2007 : OSL_FAIL("Fussnote in Fly nicht erlaubt");
2008 0 : return;
2009 : }
2010 0 : if( pOutDoc->IsInTable() ){
2011 : OSL_FAIL("Fussnote in Table z.Zt. nicht erlaubt");
2012 0 : return;
2013 : }
2014 :
2015 : // Alle Attribute schliessen, da sonst Attribute entstehen koennen,
2016 : // die in Fussnoten reinragen
2017 0 : aStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
2018 : // EndStack erstmal nicht zwangs-Schliessen, damit Bookmarks ueber
2019 : // Fussnoten im PMW uebernommen werden
2020 :
2021 0 : SwFmtFtn aFtn;
2022 0 : GetDoc().InsertPoolItem(*pPaM, aFtn, 0);
2023 : OSL_ENSURE(pSavedPos == NULL, "SwFltShell");
2024 0 : pSavedPos = new SwPosition(*pPaM->GetPoint());
2025 0 : pPaM->Move(fnMoveBackward, fnGoCntnt);
2026 0 : SwTxtNode* pTxt = pPaM->GetNode()->GetTxtNode();
2027 : SwTxtAttr *const pFN = pTxt->GetTxtAttrForCharAt(
2028 0 : pPaM->GetPoint()->nContent.GetIndex(), RES_TXTATR_FTN);
2029 0 : if( !pFN ){ // Passiert z.B. bei Fussnote in Fly
2030 : OSL_ENSURE(pFN, "Probleme beim Anlegen des Fussnoten-Textes");
2031 0 : return;
2032 : }
2033 0 : const SwNodeIndex* pStartIndex = ((SwTxtFtn*)pFN)->GetStartNode();
2034 : OSL_ENSURE(pStartIndex, "Probleme beim Anlegen des Fussnoten-Textes");
2035 0 : pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
2036 0 : pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
2037 0 : eSubMode = Footnote;
2038 : }
2039 :
2040 0 : void SwFltShell::EndFootnote()
2041 : {
2042 0 : if(!pSavedPos)
2043 0 : return;
2044 : // Alle Attribute schliessen, da sonst Attribute
2045 : // entstehen koennen, die aus Fussnoten rausragen
2046 0 : aStack.SetAttr( *pPaM->GetPoint(), 0, sal_False );
2047 : // EndStack erstmal nicht zwangs-Schliessen, damit Bookmarks ueber
2048 : // Fussnoten im PMW uebernommen werden
2049 :
2050 0 : *pPaM->GetPoint() = *pSavedPos; // restore Cursor
2051 0 : delete pSavedPos;
2052 0 : pSavedPos = 0;
2053 : }
2054 :
2055 0 : void SwFltShell::BeginHeader(SwPageDesc* /*pPD*/)
2056 : {
2057 0 : SwFrmFmt* pFmt = &pCurrentPageDesc->GetMaster();
2058 : SwFrmFmt* pHdFtFmt;
2059 0 : pFmt->SetFmtAttr(SwFmtHeader(sal_True));
2060 0 : pHdFtFmt = (SwFrmFmt*)pFmt->GetHeader().GetHeaderFmt();
2061 0 : const SwNodeIndex* pStartIndex = pHdFtFmt->GetCntnt().GetCntntIdx();
2062 0 : if (!pStartIndex)
2063 0 : return;
2064 : OSL_ENSURE(pSavedPos == NULL, "SwFltShell");
2065 0 : pSavedPos = new SwPosition(*pPaM->GetPoint());
2066 0 : pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
2067 0 : pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
2068 0 : eSubMode = Header;
2069 : }
2070 :
2071 0 : void SwFltShell::BeginFooter(SwPageDesc* /*pPD*/)
2072 : {
2073 0 : SwFrmFmt* pFmt = &pCurrentPageDesc->GetMaster();
2074 : SwFrmFmt* pHdFtFmt;
2075 0 : pFmt->SetFmtAttr(SwFmtFooter(sal_True));
2076 0 : pHdFtFmt = (SwFrmFmt*)pFmt->GetFooter().GetFooterFmt();
2077 0 : const SwNodeIndex* pStartIndex = pHdFtFmt->GetCntnt().GetCntntIdx();
2078 0 : if (!pStartIndex)
2079 0 : return;
2080 : OSL_ENSURE(pSavedPos == NULL, "SwFltShell");
2081 0 : pSavedPos = new SwPosition(*pPaM->GetPoint());
2082 0 : pPaM->GetPoint()->nNode = pStartIndex->GetIndex() + 1;
2083 0 : pPaM->GetPoint()->nContent.Assign(pPaM->GetCntntNode(), 0);
2084 0 : eSubMode = Footer;
2085 : }
2086 :
2087 0 : void SwFltShell::EndHeaderFooter()
2088 : {
2089 0 : *pPaM->GetPoint() = *pSavedPos; // restore Cursor
2090 0 : delete pSavedPos;
2091 0 : pSavedPos = 0;
2092 0 : }
2093 :
2094 0 : SwPageDesc* SwFltShell::MakePageDesc(SwPageDesc* pFirstPageDesc)
2095 : {
2096 0 : if(bStdPD) // keine Neuen PageDescs
2097 0 : return pCurrentPageDesc;
2098 :
2099 0 : bool bFollow = (pFirstPageDesc != 0);
2100 : SwPageDesc* pNewPD;
2101 : sal_uInt16 nPos;
2102 0 : if (bFollow && pFirstPageDesc->GetFollow() != pFirstPageDesc)
2103 0 : return pFirstPageDesc; // Fehler: hat schon Follow
2104 : // Erkennung doppelter Namen fehlt noch (Wahrscheinlichkeit
2105 : // fuer dopp. Namen ist gering)
2106 :
2107 0 : nPos = GetDoc().MakePageDesc( ViewShell::GetShellRes()->GetPageDescName(
2108 0 : GetDoc().GetPageDescCnt(), bFollow ? ShellResource::FOLLOW_PAGE : ShellResource::NORMAL_PAGE),
2109 0 : pFirstPageDesc, false );
2110 :
2111 0 : pNewPD = &GetDoc().GetPageDesc(nPos);
2112 0 : if (bFollow)
2113 : { // Dieser ist der folgende von pPageDesc
2114 0 : pFirstPageDesc->SetFollow(pNewPD);
2115 0 : pNewPD->SetFollow(pNewPD);
2116 : }
2117 : else
2118 : {
2119 0 : GetDoc().InsertPoolItem( *pPaM, SwFmtPageDesc( pNewPD ), 0 );
2120 : }
2121 : pNewPD->WriteUseOn( // alle Seiten
2122 0 : (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE));
2123 0 : return pNewPD;
2124 : }
2125 :
2126 : ///////////////////////////////////////////////// SwFltFormatCollection
2127 0 : SwFltFormatCollection::SwFltFormatCollection(
2128 : SwDoc& _rDoc, RES_POOL_COLLFMT_TYPE nType ) :
2129 : SwFltOutBase(_rDoc),
2130 0 : pColl(_rDoc.GetTxtCollFromPool( static_cast< sal_uInt16 >(nType), false )),
2131 : pFlyAttrs( 0 ),
2132 0 : bHasFly( false )
2133 : {
2134 0 : Reset(); // Default-Attrs loeschen und Auto-Flag
2135 0 : }
2136 :
2137 0 : SwFltFormatCollection::SwFltFormatCollection(
2138 : SwDoc& _rDoc, const String& rName ) :
2139 : SwFltOutBase(_rDoc),
2140 : pFlyAttrs( 0 ),
2141 0 : bHasFly( false )
2142 : {
2143 0 : pColl = _rDoc.MakeTxtFmtColl(rName, (SwTxtFmtColl*)_rDoc.GetDfltTxtFmtColl());
2144 0 : Reset(); // Default-Attrs loeschen und Auto-Flag
2145 0 : }
2146 :
2147 0 : void SwFltShell::NextStyle(sal_uInt16 nWhich, sal_uInt16 nNext)
2148 : {
2149 : OSL_ENSURE(pColls[nWhich], "Next style for noexistent style" );
2150 : OSL_ENSURE(pColls[nNext], "Next style to noexistent style" );
2151 0 : if( pColls[nWhich] && pColls[nNext] )
2152 0 : pColls[nWhich]->GetColl()->SetNextTxtFmtColl(
2153 0 : *pColls[nNext]->GetColl() );
2154 0 : }
2155 :
2156 : // UpdatePageDescs muss am Ende des Einlesevorganges aufgerufen werden, damit
2157 : // der Writer den Inhalt der Pagedescs wirklich akzeptiert
2158 50 : void UpdatePageDescs(SwDoc &rDoc, sal_uInt16 nInPageDescOffset)
2159 : {
2160 : // Pagedescriptoren am Dokument updaten (nur so werden auch die
2161 : // linken Seiten usw. eingestellt).
2162 :
2163 : // PageDesc "Standard"
2164 50 : rDoc.ChgPageDesc(0, rDoc.GetPageDesc(0));
2165 :
2166 : // PageDescs "Konvert..."
2167 58 : for (sal_uInt16 i = nInPageDescOffset; i < rDoc.GetPageDescCnt(); ++i)
2168 8 : rDoc.ChgPageDesc(i, rDoc.GetPageDesc(i));
2169 149 : }
2170 :
2171 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|