blob: 65f8b2bf732befed65a9c5ce03b6fb24447d0dd2 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <com/sun/star/uno/Sequence.hxx>
#include <hintids.hxx>
#include <vcl/window.hxx>
#include <vcl/oldprintadaptor.hxx>
#include <sfx2/printer.hxx>
#include <sfx2/progress.hxx>
#include <pvprtdat.hxx>
#include <viewsh.hxx>
#include <pagefrm.hxx>
#include <rootfrm.hxx>
#include <viewimp.hxx>
#include <viewopt.hxx>
#include <printdata.hxx>
#include <fldbas.hxx>
#include <ptqueue.hxx>
#include <swregion.hxx>
#include <hints.hxx>
#include <fntcache.hxx>
#include <statstr.hrc> // Text fuer SfxProgress
#include <comcore.hrc>
#include <IDocumentFieldsAccess.hxx>
#include <IDocumentDeviceAccess.hxx>
using namespace ::com::sun::star;
// OD 12.12.2002 #103492#
SwPagePreviewLayout* ViewShell::PagePreviewLayout()
{
return Imp()->PagePreviewLayout();
}
void ViewShell::ShowPreViewSelection( sal_uInt16 nSelPage )
{
Imp()->InvalidateAccessiblePreViewSelection( nSelPage );
}
/** adjust view options for page preview
OD 09.01.2003 #i6467#
*/
void ViewShell::AdjustOptionsForPagePreview(SwPrintData const& rPrintOptions)
{
if ( !IsPreView() )
{
ASSERT( false, "view shell doesn't belongs to a page preview - no adjustment of its view options");
return;
}
PrepareForPrint( rPrintOptions );
return;
}
// print brochure
// OD 05.05.2003 #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 ];
// const sal_uInt16 nPageMax = static_cast< sal_uInt16 >(rPagesToPrint.first > rPagesToPrint.second ?
// rPagesToPrint.first : rPagesToPrint.second);
#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
// eine neue Shell fuer den Printer erzeugen
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;
}
// OD 05.05.2003 #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() );
}
// den MapMode einstellen
aMapMode.SetOrigin( Point() );
{
Fraction aScX( aPrtSize.Width(), nMaxColSz );
Fraction aScY( aPrtSize.Height(), nMaxRowSz );
if( aScX < aScY )
aScY = aScX;
{
// fuer Drawing, damit diese ihre Objecte vernuenftig Painten
// koennen, auf "glatte" Prozentwerte setzen
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();
}