LCOV - code coverage report
Current view: top level - libreoffice/sw/source/filter/ww1 - fltshell.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 185 964 19.2 %
Date: 2012-12-27 Functions: 29 142 20.4 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10