LCOV - code coverage report
Current view: top level - sw/source/core/view - vprint.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 33 278 11.9 %
Date: 2014-04-11 Functions: 3 17 17.6 %
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             : #include <com/sun/star/uno/Sequence.hxx>
      21             : #include <com/sun/star/uno/Any.hxx>
      22             : #include <com/sun/star/view/XRenderable.hpp>
      23             : 
      24             : #include <hintids.hxx>
      25             : #include <rtl/ustring.hxx>
      26             : #include <sfx2/app.hxx>
      27             : #include <sfx2/objsh.hxx>
      28             : #include <sfx2/prnmon.hxx>
      29             : #include <svl/languageoptions.hxx>
      30             : #include <editeng/paperinf.hxx>
      31             : #include <editeng/pbinitem.hxx>
      32             : #include <svx/svdview.hxx>
      33             : #include <toolkit/awt/vclxdevice.hxx>
      34             : #include <unotools/localedatawrapper.hxx>
      35             : #include <unotools/moduleoptions.hxx>
      36             : #include <unotools/syslocale.hxx>
      37             : #include <vcl/oldprintadaptor.hxx>
      38             : 
      39             : #include <unotxdoc.hxx>
      40             : #include <docsh.hxx>
      41             : #include <txtfld.hxx>
      42             : #include <fmtfld.hxx>
      43             : #include <fmtfsize.hxx>
      44             : #include <frmatr.hxx>
      45             : #include <rootfrm.hxx>
      46             : #include <pagefrm.hxx>
      47             : #include <cntfrm.hxx>
      48             : #include <doc.hxx>
      49             : #include <IDocumentUndoRedo.hxx>
      50             : #include <wdocsh.hxx>
      51             : #include <fesh.hxx>
      52             : #include <pam.hxx>
      53             : #include <viewimp.hxx>
      54             : #include <layact.hxx>
      55             : #include <ndtxt.hxx>
      56             : #include <fldbas.hxx>
      57             : #include <docfld.hxx>
      58             : #include <docufld.hxx>
      59             : #include <shellres.hxx>
      60             : #include <viewopt.hxx>
      61             : #include <printdata.hxx>
      62             : #include <pagedesc.hxx>
      63             : #include <poolfmt.hxx>
      64             : #include <mdiexp.hxx>
      65             : #include <statstr.hrc>
      66             : #include <ptqueue.hxx>
      67             : #include <tabfrm.hxx>
      68             : #include <txtfrm.hxx>
      69             : #include <viscrs.hxx>
      70             : #include <fmtpdsc.hxx>
      71             : #include <globals.hrc>
      72             : 
      73             : using namespace ::com::sun::star;
      74             : 
      75             : /// Painting buffer
      76             : class SwQueuedPaint
      77             : {
      78             : public:
      79             :     SwQueuedPaint *pNext;
      80             :     SwViewShell      *pSh;
      81             :     SwRect          aRect;
      82             : 
      83           0 :     SwQueuedPaint( SwViewShell *pNew, const SwRect &rRect ) :
      84             :         pNext( 0 ),
      85             :         pSh( pNew ),
      86           0 :         aRect( rRect )
      87           0 :     {}
      88             : };
      89             : 
      90             : SwQueuedPaint *SwPaintQueue::pQueue = 0;
      91             : 
      92             : // saves some settings from the draw view
      93             : class SwDrawViewSave
      94             : {
      95             :     OUString sLayerNm;
      96             :     SdrView* pDV;
      97             :     sal_Bool bPrintControls;
      98             : public:
      99             :     SwDrawViewSave( SdrView* pSdrView );
     100             :     ~SwDrawViewSave();
     101             : };
     102             : 
     103           0 : void SwPaintQueue::Add( SwViewShell *pNew, const SwRect &rNew )
     104             : {
     105             :     SwQueuedPaint *pPt;
     106           0 :     if ( 0 != (pPt = pQueue) )
     107             :     {
     108           0 :         while ( pPt->pSh != pNew && pPt->pNext )
     109           0 :             pPt = pPt->pNext;
     110           0 :         if ( pPt->pSh == pNew )
     111             :         {
     112           0 :             pPt->aRect.Union( rNew );
     113           0 :             return;
     114             :         }
     115             :     }
     116           0 :     SwQueuedPaint *pNQ = new SwQueuedPaint( pNew, rNew );
     117           0 :     if ( pPt )
     118           0 :         pPt->pNext = pNQ;
     119             :     else
     120           0 :         pQueue = pNQ;
     121             : }
     122             : 
     123           0 : void SwPaintQueue::Repaint()
     124             : {
     125           0 :     if ( !SwRootFrm::IsInPaint() && pQueue )
     126             :     {
     127           0 :         SwQueuedPaint *pPt = pQueue;
     128           0 :         do
     129           0 :         {   SwViewShell *pSh = pPt->pSh;
     130           0 :             SET_CURR_SHELL( pSh );
     131           0 :             if ( pSh->IsPreview() )
     132             :             {
     133           0 :                 if ( pSh->GetWin() )
     134             :                 {
     135             :                     // for previewing, since rows/columns are known in PaintHdl (UI)
     136           0 :                     pSh->GetWin()->Invalidate();
     137           0 :                     pSh->GetWin()->Update();
     138             :                 }
     139             :             }
     140             :             else
     141           0 :                 pSh->Paint( pPt->aRect.SVRect() );
     142           0 :             pPt = pPt->pNext;
     143             :         } while ( pPt );
     144             : 
     145           0 :         do
     146           0 :         {   pPt = pQueue;
     147           0 :             pQueue = pQueue->pNext;
     148           0 :             delete pPt;
     149             :         } while ( pQueue );
     150             :     }
     151           0 : }
     152             : 
     153        1751 : void SwPaintQueue::Remove( SwViewShell *pSh )
     154             : {
     155             :     SwQueuedPaint *pPt;
     156        1751 :     if ( 0 != (pPt = pQueue) )
     157             :     {
     158           0 :         SwQueuedPaint *pPrev = 0;
     159           0 :         while ( pPt && pPt->pSh != pSh )
     160             :         {
     161           0 :             pPrev = pPt;
     162           0 :             pPt = pPt->pNext;
     163             :         }
     164           0 :         if ( pPt )
     165             :         {
     166           0 :             if ( pPrev )
     167           0 :                 pPrev->pNext = pPt->pNext;
     168           0 :             else if ( pPt == pQueue )
     169           0 :                 pQueue = 0;
     170           0 :             delete pPt;
     171             :         }
     172             :     }
     173        1751 : }
     174             : 
     175           0 : void SetSwVisArea( SwViewShell *pSh, const SwRect &rRect )
     176             : {
     177             :     OSL_ENSURE( !pSh->GetWin(), "Drucken mit Window?" );
     178           0 :     pSh->maVisArea = rRect;
     179           0 :     pSh->Imp()->SetFirstVisPageInvalid();
     180           0 :     Point aPt( rRect.Pos() );
     181             : 
     182             :     // calculate an offset for the rectangle of the n-th page to
     183             :     // move the start point of the output operation to a position
     184             :     // such that in the output device all pages will be painted
     185             :     // at the same position
     186           0 :     aPt.X() = -aPt.X(); aPt.Y() = -aPt.Y();
     187             : 
     188           0 :     OutputDevice *pOut = pSh->GetOut();
     189             : 
     190           0 :     MapMode aMapMode( pOut->GetMapMode() );
     191           0 :     aMapMode.SetOrigin( aPt );
     192           0 :     pOut->SetMapMode( aMapMode );
     193           0 : }
     194             : 
     195           0 : void SwViewShell::InitPrt( OutputDevice *pOutDev )
     196             : {
     197             :     // For printing we use a negative offset (exactly the offset of OutputSize).
     198             :     // This is necessary because the origin is in the upper left corner of the
     199             :     // physical page while the output uses OutputOffset as origin.
     200           0 :     if ( pOutDev )
     201             :     {
     202           0 :         maPrtOffst = Point();
     203             : 
     204           0 :         maPrtOffst += pOutDev->GetMapMode().GetOrigin();
     205           0 :         MapMode aMapMode( pOutDev->GetMapMode() );
     206           0 :         aMapMode.SetMapUnit( MAP_TWIP );
     207           0 :         pOutDev->SetMapMode( aMapMode );
     208           0 :         pOutDev->SetLineColor();
     209           0 :         pOutDev->SetFillColor();
     210             :     }
     211             :     else
     212           0 :         maPrtOffst.X() = maPrtOffst.Y() = 0;
     213             : 
     214           0 :     if ( !mpWin )
     215           0 :         mpOut = pOutDev;
     216           0 : }
     217             : 
     218           0 : void SwViewShell::ChgAllPageOrientation( sal_uInt16 eOri )
     219             : {
     220             :     OSL_ENSURE( mnStartAction, "missing an Action" );
     221           0 :     SET_CURR_SHELL( this );
     222             : 
     223           0 :     sal_uInt16 nAll = GetDoc()->GetPageDescCnt();
     224           0 :     sal_Bool bNewOri = Orientation(eOri) == ORIENTATION_PORTRAIT ? sal_False : sal_True;
     225             : 
     226           0 :     for( sal_uInt16 i = 0; i < nAll; ++ i )
     227             :     {
     228           0 :         const SwPageDesc& rOld = GetDoc()->GetPageDesc( i );
     229             : 
     230           0 :         if( rOld.GetLandscape() != bNewOri )
     231             :         {
     232           0 :             SwPageDesc aNew( rOld );
     233             :             {
     234           0 :                 ::sw::UndoGuard const ug(GetDoc()->GetIDocumentUndoRedo());
     235           0 :                 GetDoc()->CopyPageDesc(rOld, aNew);
     236             :             }
     237           0 :             aNew.SetLandscape( bNewOri );
     238           0 :             SwFrmFmt& rFmt = aNew.GetMaster();
     239           0 :             SwFmtFrmSize aSz( rFmt.GetFrmSize() );
     240             :             // adjust size
     241             :             // PORTRAIT  -> higher than wide
     242             :             // LANDSCAPE -> wider than high
     243             :             // Height is the VarSize, width the FixSize (per Def.)
     244           0 :             if( bNewOri ? aSz.GetHeight() > aSz.GetWidth()
     245           0 :                         : aSz.GetHeight() < aSz.GetWidth() )
     246             :             {
     247           0 :                 SwTwips aTmp = aSz.GetHeight();
     248           0 :                 aSz.SetHeight( aSz.GetWidth() );
     249           0 :                 aSz.SetWidth( aTmp );
     250           0 :                 rFmt.SetFmtAttr( aSz );
     251             :             }
     252           0 :             GetDoc()->ChgPageDesc( i, aNew );
     253             :         }
     254           0 :     }
     255           0 : }
     256             : 
     257           0 : void SwViewShell::ChgAllPageSize( Size &rSz )
     258             : {
     259             :     OSL_ENSURE( mnStartAction, "missing an Action" );
     260           0 :     SET_CURR_SHELL( this );
     261             : 
     262           0 :     SwDoc* pMyDoc = GetDoc();
     263           0 :     sal_uInt16 nAll = pMyDoc->GetPageDescCnt();
     264             : 
     265           0 :     for( sal_uInt16 i = 0; i < nAll; ++i )
     266             :     {
     267           0 :         const SwPageDesc &rOld = pMyDoc->GetPageDesc( i );
     268           0 :         SwPageDesc aNew( rOld );
     269             :         {
     270           0 :             ::sw::UndoGuard const ug(GetDoc()->GetIDocumentUndoRedo());
     271           0 :             GetDoc()->CopyPageDesc( rOld, aNew );
     272             :         }
     273           0 :         SwFrmFmt& rPgFmt = aNew.GetMaster();
     274           0 :         Size aSz( rSz );
     275           0 :         const sal_Bool bOri = aNew.GetLandscape();
     276           0 :         if( bOri  ? aSz.Height() > aSz.Width()
     277           0 :                   : aSz.Height() < aSz.Width() )
     278             :         {
     279           0 :             SwTwips aTmp = aSz.Height();
     280           0 :             aSz.Height() = aSz.Width();
     281           0 :             aSz.Width()  = aTmp;
     282             :         }
     283             : 
     284           0 :         SwFmtFrmSize aFrmSz( rPgFmt.GetFrmSize() );
     285           0 :         aFrmSz.SetSize( aSz );
     286           0 :         rPgFmt.SetFmtAttr( aFrmSz );
     287           0 :         pMyDoc->ChgPageDesc( i, aNew );
     288           0 :     }
     289           0 : }
     290             : 
     291           0 : void SwViewShell::CalcPagesForPrint( sal_uInt16 nMax )
     292             : {
     293           0 :     SET_CURR_SHELL( this );
     294             : 
     295           0 :     SwRootFrm* pMyLayout = GetLayout();
     296             : 
     297           0 :     const SwFrm *pPage = pMyLayout->Lower();
     298           0 :     SwLayAction aAction( pMyLayout, Imp() );
     299             : 
     300           0 :     pMyLayout->StartAllAction();
     301           0 :     for ( sal_uInt16 i = 1; pPage && i <= nMax; pPage = pPage->GetNext(), ++i )
     302             :     {
     303           0 :         pPage->Calc();
     304           0 :         SwRect aOldVis( VisArea() );
     305           0 :         maVisArea = pPage->Frm();
     306           0 :         Imp()->SetFirstVisPageInvalid();
     307           0 :         aAction.Reset();
     308           0 :         aAction.SetPaint( sal_False );
     309           0 :         aAction.SetWaitAllowed( sal_False );
     310           0 :         aAction.SetReschedule( sal_True );
     311             : 
     312           0 :         aAction.Action();
     313             : 
     314           0 :         maVisArea = aOldVis; //reset due to the paints
     315           0 :         Imp()->SetFirstVisPageInvalid();
     316             :     }
     317             : 
     318           0 :     pMyLayout->EndAllAction();
     319           0 : }
     320             : 
     321           0 : SwDoc * SwViewShell::FillPrtDoc( SwDoc *pPrtDoc, const SfxPrinter* pPrt)
     322             : {
     323             :     OSL_ENSURE( this->IsA( TYPE(SwFEShell) ),"SwViewShell::Prt for FEShell only");
     324           0 :     SwFEShell* pFESh = (SwFEShell*)this;
     325           0 :     pPrtDoc->LockExpFlds();
     326             : 
     327             :     // use given printer
     328             :     //! Make a copy of it since it gets destroyed with the temporary document
     329             :     //! used for PDF export
     330           0 :     if (pPrt)
     331           0 :         pPrtDoc->setPrinter( new SfxPrinter(*pPrt), true, true );
     332             : 
     333             :     const SfxPoolItem* pCpyItem;
     334           0 :     const SfxItemPool& rPool = GetAttrPool();
     335           0 :     for( sal_uInt16 nWh = POOLATTR_BEGIN; nWh < POOLATTR_END; ++nWh )
     336           0 :         if( 0 != ( pCpyItem = rPool.GetPoolDefaultItem( nWh ) ) )
     337           0 :             pPrtDoc->GetAttrPool().SetPoolDefaultItem( *pCpyItem );
     338             : 
     339             :     // JP 29.07.99 - Bug 67951 - set all Styles from the SourceDoc into
     340             :     //                              the PrintDoc - will be replaced!
     341           0 :     pPrtDoc->ReplaceStyles( *GetDoc() );
     342             : 
     343           0 :     SwShellCrsr *pActCrsr = pFESh->_GetCrsr();
     344           0 :     SwShellCrsr *pFirstCrsr = dynamic_cast<SwShellCrsr*>(pActCrsr->GetNext());
     345           0 :     if( !pActCrsr->HasMark() ) // with a multi-selection the current cursor might be empty
     346             :     {
     347           0 :         pActCrsr = dynamic_cast<SwShellCrsr*>(pActCrsr->GetPrev());
     348             :     }
     349             : 
     350             :     // Y-position of the first selection
     351           0 :     Point aSelPoint;
     352           0 :     if( pFESh->IsTableMode() )
     353             :     {
     354           0 :         SwShellTableCrsr* pShellTblCrsr = pFESh->GetTableCrsr();
     355             : 
     356           0 :         const SwCntntNode* pCntntNode = pShellTblCrsr->GetNode()->GetCntntNode();
     357           0 :         const SwCntntFrm *pCntntFrm = pCntntNode ? pCntntNode->getLayoutFrm( GetLayout(), 0, pShellTblCrsr->Start() ) : 0;
     358           0 :         if( pCntntFrm )
     359             :         {
     360           0 :             SwRect aCharRect;
     361           0 :             SwCrsrMoveState aTmpState( MV_NONE );
     362           0 :             pCntntFrm->GetCharRect( aCharRect, *pShellTblCrsr->Start(), &aTmpState );
     363           0 :             aSelPoint = Point( aCharRect.Left(), aCharRect.Top() );
     364             :         }
     365             :     }
     366             :     else
     367             :     {
     368           0 :        aSelPoint = pFirstCrsr->GetSttPos();
     369             :     }
     370             : 
     371           0 :     const SwPageFrm* pPage = GetLayout()->GetPageAtPos( aSelPoint );
     372             :     OSL_ENSURE( pPage, "no page found!" );
     373             : 
     374             :     // get page descriptor - fall back to the first one if pPage could not be found
     375             :     const SwPageDesc* pPageDesc = pPage ? pPrtDoc->FindPageDescByName(
     376           0 :         pPage->GetPageDesc()->GetName() ) : &pPrtDoc->GetPageDesc( (sal_uInt16)0 );
     377             : 
     378           0 :     if( !pFESh->IsTableMode() && pActCrsr->HasMark() )
     379             :     {   // Tweak paragraph attributes of last paragraph
     380           0 :         SwNodeIndex aNodeIdx( *pPrtDoc->GetNodes().GetEndOfContent().StartOfSectionNode() );
     381           0 :         SwTxtNode* pTxtNd = pPrtDoc->GetNodes().GoNext( &aNodeIdx )->GetTxtNode();
     382             :         SwCntntNode *pLastNd =
     383           0 :             pActCrsr->GetCntntNode( (*pActCrsr->GetMark()) <= (*pActCrsr->GetPoint()) );
     384             :         // copy the paragraph attributes of the first paragraph
     385           0 :         if( pLastNd && pLastNd->IsTxtNode() )
     386           0 :             ((SwTxtNode*)pLastNd)->CopyCollFmt( *pTxtNd );
     387             :     }
     388             : 
     389             :     // fill it with the selected content
     390           0 :     pFESh->Copy( pPrtDoc );
     391             : 
     392             :     // set the page style at the first paragraph
     393             :     {
     394           0 :         SwNodeIndex aNodeIdx( *pPrtDoc->GetNodes().GetEndOfContent().StartOfSectionNode() );
     395           0 :         SwCntntNode* pCNd = pPrtDoc->GetNodes().GoNext( &aNodeIdx ); // go to 1st ContentNode
     396           0 :         if( pFESh->IsTableMode() )
     397             :         {
     398           0 :             SwTableNode* pTNd = pCNd->FindTableNode();
     399           0 :             if( pTNd )
     400           0 :                 pTNd->GetTable().GetFrmFmt()->SetFmtAttr( SwFmtPageDesc( pPageDesc ) );
     401             :         }
     402             :         else
     403             :         {
     404           0 :             pCNd->SetAttr( SwFmtPageDesc( pPageDesc ) );
     405           0 :             if( pFirstCrsr->HasMark() )
     406             :             {
     407           0 :                 SwTxtNode *pTxtNd = pCNd->GetTxtNode();
     408           0 :                 if( pTxtNd )
     409             :                 {
     410             :                     SwCntntNode *pFirstNd =
     411           0 :                         pFirstCrsr->GetCntntNode( (*pFirstCrsr->GetMark()) > (*pFirstCrsr->GetPoint()) );
     412             :                     // copy paragraph attributes of the first paragraph
     413           0 :                     if( pFirstNd && pFirstNd->IsTxtNode() )
     414           0 :                         ((SwTxtNode*)pFirstNd)->CopyCollFmt( *pTxtNd );
     415             :                 }
     416             :             }
     417           0 :         }
     418             :     }
     419           0 :     return pPrtDoc;
     420             : }
     421             : 
     422             : // TODO: there is already a GetPageByPageNum, but it checks some physical page
     423             : // number; unsure if we want that here, should find out what that is...
     424             : SwPageFrm const*
     425           0 : sw_getPage(SwRootFrm const& rLayout, sal_Int32 const nPage)
     426             : {
     427             :     // yes this is O(n^2) but at least it does not crash...
     428           0 :     SwPageFrm const* pPage = dynamic_cast<const SwPageFrm*>(rLayout.Lower());
     429           0 :     for (sal_Int32 i = nPage; pPage && (i > 0); --i)
     430             :     {
     431           0 :         if (1 == i) { // note: nPage is 1-based, i.e. 0 is invalid!
     432           0 :             return pPage;
     433             :         }
     434           0 :         pPage = dynamic_cast<SwPageFrm const*>(pPage->GetNext());
     435             :     }
     436             :     OSL_ENSURE(pPage, "ERROR: SwPageFrm expected");
     437             :     OSL_FAIL("non-existent page requested");
     438           0 :     return 0;
     439             : }
     440             : 
     441           0 : sal_Bool SwViewShell::PrintOrPDFExport(
     442             :     OutputDevice *pOutDev,
     443             :     SwPrintData const& rPrintData,
     444             :     sal_Int32 nRenderer     /* the index in the vector of pages to be printed */ )
     445             : {
     446             :     // CAUTION: Do also always update the printing routines in viewpg.cxx (PrintProspect)!
     447             : 
     448           0 :     const sal_Int32 nMaxRenderer = rPrintData.GetRenderData().GetPagesToPrint().size() - 1;
     449             :     OSL_ENSURE( 0 <= nRenderer && nRenderer <= nMaxRenderer, "nRenderer out of bounds");
     450           0 :     if (!pOutDev || nMaxRenderer < 0 || nRenderer < 0 || nRenderer > nMaxRenderer)
     451           0 :         return sal_False;
     452             : 
     453             :     // save settings of OutputDevice (should be done always since the
     454             :     // output device is now provided by a call from outside the Writer)
     455           0 :     pOutDev->Push();
     456             : 
     457             :     // Print/PDF export for (multi-)selection has already generated a
     458             :     // temporary document with the selected text.
     459             :     // (see XRenderable implementation in unotxdoc.cxx)
     460             :     // It is implemented this way because PDF export calls this Prt function
     461             :     // once per page and we do not like to always have the temporary document
     462             :     // to be created that often here.
     463           0 :     SwViewShell *pShell = new SwViewShell( *this, 0, pOutDev );
     464             : 
     465           0 :     SdrView *pDrawView = pShell->GetDrawView();
     466           0 :     if (pDrawView)
     467             :     {
     468           0 :         pDrawView->SetBufferedOutputAllowed( false );
     469           0 :         pDrawView->SetBufferedOverlayAllowed( false );
     470             :     }
     471             : 
     472             :     {   // additional scope so that the CurrShell is reset before destroying the shell
     473             : 
     474           0 :         SET_CURR_SHELL( pShell );
     475             : 
     476             :         //JP 01.02.99: Bug 61335 - the ReadOnly flag is never copied
     477           0 :         if( mpOpt->IsReadonly() )
     478           0 :             pShell->mpOpt->SetReadonly( sal_True );
     479             : 
     480             :         // save options at draw view:
     481           0 :         SwDrawViewSave aDrawViewSave( pShell->GetDrawView() );
     482             : 
     483           0 :         pShell->PrepareForPrint( rPrintData );
     484             : 
     485           0 :         const sal_Int32 nPage = rPrintData.GetRenderData().GetPagesToPrint()[ nRenderer ];
     486             :         OSL_ENSURE( nPage < 0 ||
     487             :             rPrintData.GetRenderData().GetValidPagesSet().count( nPage ) == 1,
     488             :             "SwViewShell::PrintOrPDFExport: nPage not valid" );
     489             :         SwViewShell *const pViewSh2 = (nPage < 0)
     490           0 :                 ? rPrintData.GetRenderData().m_pPostItShell.get()// post-it page
     491           0 :                 : pShell; // a 'regular' page, not one from the post-it doc
     492             : 
     493             :         SwPageFrm const*const pStPage =
     494           0 :             sw_getPage(*pViewSh2->GetLayout(), abs(nPage));
     495             :         OSL_ENSURE( pStPage, "failed to get start page" );
     496           0 :         if (!pStPage)
     497             :         {
     498           0 :             return sal_False;
     499             :         }
     500             : 
     501             :         //!! applying view options and formatting the document should now only be done in getRendererCount!
     502             : 
     503           0 :         ::SetSwVisArea( pViewSh2, pStPage->Frm() );
     504             : 
     505           0 :         pShell->InitPrt( pOutDev );
     506             : 
     507           0 :         ::SetSwVisArea( pViewSh2, pStPage->Frm() );
     508             : 
     509           0 :         pStPage->GetUpper()->Paint( pStPage->Frm(), &rPrintData );
     510             : 
     511           0 :         SwPaintQueue::Repaint();
     512             :     }
     513             : 
     514           0 :     delete pShell;
     515             : 
     516             :     // restore settings of OutputDevice (should be done always now since the
     517             :     // output device is now provided by a call from outside the Writer)
     518           0 :     pOutDev->Pop();
     519             : 
     520           0 :     return sal_True;
     521             : }
     522             : 
     523          20 : void SwViewShell::PrtOle2( SwDoc *pDoc, const SwViewOption *pOpt, const SwPrintData& rOptions,
     524             :                          OutputDevice* pOleOut, const Rectangle& rRect )
     525             : {
     526             :     // For printing a shell is needed. Either the Doc already has one, than we
     527             :     // create a new view, or it has none, than we create the first view.
     528             :     SwViewShell *pSh;
     529          20 :     if( pDoc->GetCurrentViewShell() )
     530          20 :         pSh = new SwViewShell( *pDoc->GetCurrentViewShell(), 0, pOleOut,VSHELLFLAG_SHARELAYOUT );
     531             :     else
     532           0 :         pSh = new SwViewShell( *pDoc, 0, pOpt, pOleOut);
     533             : 
     534             :     {
     535          20 :         SET_CURR_SHELL( pSh );
     536          20 :         pSh->PrepareForPrint( rOptions );
     537          20 :         pSh->SetPrtFormatOption( sal_True );
     538             : 
     539          20 :         SwRect aSwRect( rRect );
     540          20 :         pSh->maVisArea = aSwRect;
     541             : 
     542          20 :         if ( pSh->GetViewOptions()->getBrowseMode() &&
     543           0 :              pSh->GetNext() == pSh )
     544             :         {
     545           0 :             pSh->CheckBrowseView( sal_False );
     546           0 :             pSh->GetLayout()->Lower()->InvalidateSize();
     547             :         }
     548             : 
     549             :         // CalcPagesForPrint() should not be necessary here. The pages in the
     550             :         // visible area will be formatted in SwRootFrm::Paint().
     551             :         // Removing this gives us a performance gain during saving the
     552             :         // document because the thumbnail creation will not trigger a complete
     553             :         // formatting of the document.
     554             : 
     555          20 :         pOleOut->Push( PUSH_CLIPREGION );
     556          20 :         pOleOut->IntersectClipRegion( aSwRect.SVRect() );
     557          20 :         pSh->GetLayout()->Paint( aSwRect );
     558             : 
     559          20 :         pOleOut->Pop();
     560             :         // first the CurrShell object needs to be destroyed!
     561             :     }
     562          20 :     delete pSh;
     563          20 : }
     564             : 
     565             : /// Check if the DocNodesArray contains fields.
     566           0 : sal_Bool SwViewShell::IsAnyFieldInDoc() const
     567             : {
     568             :     const SfxPoolItem* pItem;
     569           0 :     sal_uInt32 nMaxItems = mpDoc->GetAttrPool().GetItemCount2( RES_TXTATR_FIELD );
     570           0 :     for( sal_uInt32 n = 0; n < nMaxItems; ++n )
     571             :     {
     572           0 :         if( 0 != (pItem = mpDoc->GetAttrPool().GetItem2( RES_TXTATR_FIELD, n )))
     573             :         {
     574           0 :             const SwFmtFld* pFmtFld = (SwFmtFld*)pItem;
     575           0 :             const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
     576           0 :             if( pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
     577             :             {
     578           0 :                 return sal_True;
     579             :             }
     580             :         }
     581             :     }
     582             : 
     583           0 :     nMaxItems = mpDoc->GetAttrPool().GetItemCount2( RES_TXTATR_INPUTFIELD );
     584           0 :     for( sal_uInt32 n = 0; n < nMaxItems; ++n )
     585             :     {
     586           0 :         if( 0 != (pItem = mpDoc->GetAttrPool().GetItem2( RES_TXTATR_INPUTFIELD, n )))
     587             :         {
     588           0 :             const SwFmtFld* pFmtFld = (SwFmtFld*)pItem;
     589           0 :             const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
     590           0 :             if( pTxtFld && pTxtFld->GetTxtNode().GetNodes().IsDocNodes() )
     591             :             {
     592           0 :                 return sal_True;
     593             :             }
     594             :         }
     595             :     }
     596             : 
     597           0 :     return sal_False;
     598             : }
     599             : 
     600             : ///  Saves some settings at the draw view
     601           0 : SwDrawViewSave::SwDrawViewSave( SdrView* pSdrView )
     602           0 :     : pDV( pSdrView )
     603             : {
     604           0 :     if ( pDV )
     605             :     {
     606           0 :         sLayerNm = "Controls";
     607           0 :         bPrintControls = pDV->IsLayerPrintable( sLayerNm );
     608             :     }
     609           0 : }
     610             : 
     611           0 : SwDrawViewSave::~SwDrawViewSave()
     612             : {
     613           0 :     if ( pDV )
     614             :     {
     615           0 :         pDV->SetLayerPrintable( sLayerNm, bPrintControls );
     616             :     }
     617           0 : }
     618             : 
     619             : // OD 09.01.2003 #i6467# - method also called for page preview
     620          20 : void SwViewShell::PrepareForPrint( const SwPrintData &rOptions )
     621             : {
     622          20 :     mpOpt->SetGraphic ( sal_True == rOptions.bPrintGraphic );
     623          20 :     mpOpt->SetTable   ( sal_True == rOptions.bPrintTable );
     624          20 :     mpOpt->SetDraw    ( sal_True == rOptions.bPrintDraw  );
     625          20 :     mpOpt->SetControl ( sal_True == rOptions.bPrintControl );
     626          20 :     mpOpt->SetPageBack( sal_True == rOptions.bPrintPageBackground );
     627          20 :     mpOpt->SetBlackFont( sal_True == rOptions.bPrintBlackFont );
     628             : 
     629          20 :     if ( HasDrawView() )
     630             :     {
     631          20 :         SdrView *pDrawView = GetDrawView();
     632          20 :         OUString sLayerNm;
     633          20 :         sLayerNm = "Controls";
     634             :         // OD 09.01.2003 #i6467# - consider, if view shell belongs to page preview
     635          20 :         if ( !IsPreview() )
     636             :         {
     637          20 :             pDrawView->SetLayerPrintable( sLayerNm, rOptions.bPrintControl );
     638             :         }
     639             :         else
     640             :         {
     641           0 :             pDrawView->SetLayerVisible( sLayerNm, rOptions.bPrintControl );
     642          20 :         }
     643             :     }
     644          20 : }
     645             : 
     646             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10