/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Text fuer SfxProgress #include #include #include using namespace ::com::sun::star; SwPagePreviewLayout* ViewShell::PagePreviewLayout() { return Imp()->PagePreviewLayout(); } void ViewShell::ShowPreViewSelection( sal_uInt16 nSelPage ) { Imp()->InvalidateAccessiblePreViewSelection( nSelPage ); } //#i6467# adjust view options for page preview void ViewShell::AdjustOptionsForPagePreview(SwPrintData const& rPrintOptions) { if ( !IsPreView() ) { OSL_FAIL( "view shell doesn't belongs to a page preview - no adjustment of its view options"); return; } PrepareForPrint( rPrintOptions ); return; } //#i14016# - consider empty pages on calculation of the scaling for a page to be printed. void ViewShell::PrintProspect( OutputDevice *pOutDev, const SwPrintData &rPrintData, sal_Int32 nRenderer // the index in the vector of prospect pages to be printed ) { const sal_Int32 nMaxRenderer = rPrintData.GetRenderData().GetPagePairsForProspectPrinting().size() - 1; #if OSL_DEBUG_LEVEL > 1 DBG_ASSERT( 0 <= nRenderer && nRenderer <= nMaxRenderer, "nRenderer out of bounds"); #endif Printer *pPrinter = dynamic_cast< Printer * >(pOutDev); if (!pPrinter || nMaxRenderer < 0 || nRenderer < 0 || nRenderer > nMaxRenderer) return; // save settings of OutputDevice (should be done always since the // output device is now provided by a call from outside the Writer) pPrinter->Push(); std::pair< sal_Int32, sal_Int32 > rPagesToPrint = rPrintData.GetRenderData().GetPagePairsForProspectPrinting()[ nRenderer ]; #if OSL_DEBUG_LEVEL > 1 DBG_ASSERT( rPagesToPrint.first == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.first ) == 1, "first Page not valid" ); DBG_ASSERT( rPagesToPrint.second == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.second ) == 1, "second Page not valid" ); #endif // create a new shell for the Printer ViewShell aShell( *this, 0, pPrinter ); SET_CURR_SHELL( &aShell ); aShell.PrepareForPrint( rPrintData ); //!! applying view options and formatting the dcoument should now only be done in getRendererCount! MapMode aMapMode( MAP_TWIP ); Size aPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) ); SwTwips nMaxRowSz, nMaxColSz; const SwPageFrm *pStPage = 0; const SwPageFrm *pNxtPage = 0; const SwRenderData::ValidStartFramesMap_t &rFrms = rPrintData.GetRenderData().GetValidStartFrames(); if (rPagesToPrint.first > 0) { SwRenderData::ValidStartFramesMap_t::const_iterator aIt( rFrms.find( rPagesToPrint.first ) ); DBG_ASSERT( aIt != rFrms.end(), "failed to find start frame" ); pStPage = aIt->second; } if (rPagesToPrint.second > 0) { SwRenderData::ValidStartFramesMap_t::const_iterator aIt( rFrms.find( rPagesToPrint.second ) ); DBG_ASSERT( aIt != rFrms.end(), "failed to find start frame" ); pNxtPage = aIt->second; } //#i14016# - consider empty pages on calculation of page size, used for calculation of scaling. Size aSttPageSize; if ( pStPage ) { if ( pStPage->IsEmptyPage() ) { if ( pStPage->GetPhyPageNum() % 2 == 0 ) aSttPageSize = pStPage->GetPrev()->Frm().SSize(); else aSttPageSize = pStPage->GetNext()->Frm().SSize(); } else { aSttPageSize = pStPage->Frm().SSize(); } } Size aNxtPageSize; if ( pNxtPage ) { if ( pNxtPage->IsEmptyPage() ) { if ( pNxtPage->GetPhyPageNum() % 2 == 0 ) aNxtPageSize = pNxtPage->GetPrev()->Frm().SSize(); else aNxtPageSize = pNxtPage->GetNext()->Frm().SSize(); } else { aNxtPageSize = pNxtPage->Frm().SSize(); } } if( !pStPage ) { nMaxColSz = 2 * aNxtPageSize.Width(); nMaxRowSz = aNxtPageSize.Height(); } else if( !pNxtPage ) { nMaxColSz = 2 * aSttPageSize.Width(); nMaxRowSz = aSttPageSize.Height(); } else { nMaxColSz = aNxtPageSize.Width() + aSttPageSize.Width(); nMaxRowSz = Max( aNxtPageSize.Height(), aSttPageSize.Height() ); } aMapMode.SetOrigin( Point() ); { Fraction aScX( aPrtSize.Width(), nMaxColSz ); Fraction aScY( aPrtSize.Height(), nMaxRowSz ); if( aScX < aScY ) aScY = aScX; { aScY *= Fraction( 1000, 1 ); long nTmp = (long)aScY; if( 1 < nTmp ) --nTmp; else nTmp = 1; aScY = Fraction( nTmp, 1000 ); } aMapMode.SetScaleY( aScY ); aMapMode.SetScaleX( aScY ); } Size aTmpPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) ); // calculate start point for equal border on all sides Point aSttPt( (aTmpPrtSize.Width() - nMaxColSz) / 2, (aTmpPrtSize.Height() - nMaxRowSz) / 2 ); for( int nC = 0; nC < 2; ++nC ) { if( pStPage ) { aShell.Imp()->SetFirstVisPageInvalid(); aShell.aVisArea = pStPage->Frm(); Point aPos( aSttPt ); aPos -= aShell.aVisArea.Pos(); // aPos -= aPrtOff; aMapMode.SetOrigin( aPos ); pPrinter->SetMapMode( aMapMode ); pStPage->GetUpper()->Paint( pStPage->Frm() ); } pStPage = pNxtPage; aSttPt.X() += aTmpPrtSize.Width() / 2; } SwPaintQueue::Repaint(); //!! applying/modifying view options and formatting the dcoument should now only be done in getRendererCount! pFntCache->Flush(); // restore settings of OutputDevice (should be done always now since the // output device is now provided by a call from outside the Writer) pPrinter->Pop(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */