Files
libreoffice/sw/source/core/view/viewpg.cxx

241 lines
7.4 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
re-base on ALv2 code. Includes: Patches contributed by Oliver-Rainer Wittmann sw34bf06: #i117783# - Writer's implementation of XPagePrintable - apply print settings to new printing routines http://svn.apache.org/viewvc?view=revision&revision=1172115 sw34bf06: #o12311627# use <rtl_random> methods to create unique ids for list styles and list ids http://svn.apache.org/viewvc?view=revision&revision=1172112 sw34bf06 #i114725#,#i115828# - method <SwDoc::ClearDoc()> - clear list structures completely http://svn.apache.org/viewvc?view=revision&revision=1172122 i#118572 - remove ui string and help content regarding usage of Java Mail in Writer's Mail Merge as Java Mail is not used. http://svn.apache.org/viewvc?view=revision&revision=1197035 Patches contributed by Mathias Bauer cws mba34issues01: #i117718#: provide filter name in case storage of medium does not allow to detect one http://svn.apache.org/viewvc?view=revision&revision=1172350 cws mba34issues01: #i117721#: directly provide parameters retrieved from SfxMedium http://svn.apache.org/viewvc?view=revision&revision=1172353 gnumake4 work variously http://svn.apache.org/viewvc?view=revision&revision=1394707 http://svn.apache.org/viewvc?view=revision&revision=1394326 http://svn.apache.org/viewvc?view=revision&revision=1396797 http://svn.apache.org/viewvc?view=revision&revision=1397315 cws mba34issues01: #i117723#: convert assertion into trace http://svn.apache.org/viewvc?view=revision&revision=1172355 cws mba34issues01: #i117699#: keep layout alive until swdoc dies http://svn.apache.org/viewvc?view=revision&revision=1172362 cws mba34issues01: #i117943#: missing color attributes in RTF clipboard http://svn.apache.org/viewvc?view=revision&revision=1172363 Patch contributed by Henning Brinkmann imported patch i#103878 http://svn.apache.org/viewvc?view=revision&revision=1172109 Patches contributed by Michael Stahl sw34bf06: #i117955#: WW8 export: disable storing of section breaks in endnotes http://svn.apache.org/viewvc?view=revision&revision=1172119 Patch contributed by imacat Fixed the Asian language work count. http://svn.apache.org/viewvc?view=revision&revision=1241345 Patch contributed by Pedro Giffuni i#20878 - Add comment with BZ issue for reference. http://svn.apache.org/viewvc?view=revision&revision=1244517 Patch contributed by Andre Fischer Do not add targets for junit tests when junit is disabled. http://svn.apache.org/viewvc?view=revision&revision=1241508 add writerperfect dependency.
2011-03-31 10:05:04 +02:00
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
2000-09-18 23:08:29 +00:00
2009-08-19 07:32:06 +00:00
#include <com/sun/star/uno/Sequence.hxx>
2000-09-18 23:08:29 +00:00
#include <hintids.hxx>
2000-09-18 23:08:29 +00:00
#include <vcl/window.hxx>
2009-08-19 07:32:06 +00:00
#include <vcl/oldprintadaptor.hxx>
2000-09-18 23:08:29 +00:00
#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>
2000-09-18 23:08:29 +00:00
#include <statstr.hrc> // Text fuer SfxProgress
#include <comcore.hrc>
2000-09-18 23:08:29 +00:00
#include <IDocumentFieldsAccess.hxx>
#include <IDocumentDeviceAccess.hxx>
2009-08-19 07:32:06 +00:00
using namespace ::com::sun::star;
SwPageFrm const*
sw_getPage(SwRootFrm const& rLayout, sal_Int32 const nPage); // vprint.cxx
// OD 12.12.2002 #103492#
SwPagePreviewLayout* ViewShell::PagePreviewLayout()
2000-09-18 23:08:29 +00:00
{
return Imp()->PagePreviewLayout();
2000-09-18 23:08:29 +00:00
}
2002-05-29 14:06:25 +00:00
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() )
{
OSL_FAIL( "view shell doesn't belongs to a page preview - no adjustment of its view options");
return;
}
PrepareForPrint( rPrintOptions );
return;
2000-09-18 23:08:29 +00:00
}
/// 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,
2009-08-31 08:59:41 +00:00
const SwPrintData &rPrintData,
2009-08-14 13:56:56 +00:00
sal_Int32 nRenderer // the index in the vector of prospect pages to be printed
)
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
const sal_Int32 nMaxRenderer = rPrintData.GetRenderData().GetPagePairsForProspectPrinting().size() - 1;
OSL_ENSURE( 0 <= nRenderer && nRenderer <= nMaxRenderer, "nRenderer out of bounds");
2009-08-07 14:42:45 +00:00
Printer *pPrinter = dynamic_cast< Printer * >(pOutDev);
if (!pPrinter || nMaxRenderer < 0 || nRenderer < 0 || nRenderer > nMaxRenderer)
2000-09-18 23:08:29 +00:00
return;
2009-08-31 08:59:41 +00:00
// save settings of OutputDevice (should be done always since the
2009-08-07 14:42:45 +00:00
// 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 USHORT nPageMax = static_cast< USHORT >(rPagesToPrint.first > rPagesToPrint.second ?
// rPagesToPrint.first : rPagesToPrint.second);
OSL_ENSURE( rPagesToPrint.first == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.first ) == 1, "first Page not valid" );
OSL_ENSURE( rPagesToPrint.second == -1 || rPrintData.GetRenderData().GetValidPagesSet().count( rPagesToPrint.second ) == 1, "second Page not valid" );
2000-09-18 23:08:29 +00:00
// create a new shell for the printer
2009-08-07 14:42:45 +00:00
ViewShell aShell( *this, 0, pPrinter );
2000-09-18 23:08:29 +00:00
SET_CURR_SHELL( &aShell );
2009-08-14 13:56:56 +00:00
aShell.PrepareForPrint( rPrintData );
2000-09-18 23:08:29 +00:00
2011-11-28 10:21:57 +07:00
//!! applying view options and formatting the document should now only be done in getRendererCount!
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
MapMode aMapMode( MAP_TWIP );
2009-09-04 14:41:56 +00:00
Size aPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) );
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
SwTwips nMaxRowSz, nMaxColSz;
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
const SwPageFrm *pStPage = 0;
const SwPageFrm *pNxtPage = 0;
if (rPagesToPrint.first > 0)
2000-09-18 23:08:29 +00:00
{
pStPage = sw_getPage(*aShell.GetLayout(), rPagesToPrint.first);
2000-09-18 23:08:29 +00:00
}
2009-08-31 08:59:41 +00:00
if (rPagesToPrint.second > 0)
2000-09-18 23:08:29 +00:00
{
pNxtPage = sw_getPage(*aShell.GetLayout(), rPagesToPrint.second);
2000-09-18 23:08:29 +00:00
}
// OD 05.05.2003 #i14016# - consider empty pages on calculation
// of page size, used for calculation of scaling.
2009-08-31 08:59:41 +00:00
Size aSttPageSize;
if ( pStPage )
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
if ( pStPage->IsEmptyPage() )
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
if ( pStPage->GetPhyPageNum() % 2 == 0 )
aSttPageSize = pStPage->GetPrev()->Frm().SSize();
else
aSttPageSize = pStPage->GetNext()->Frm().SSize();
}
else
{
aSttPageSize = pStPage->Frm().SSize();
2000-09-18 23:08:29 +00:00
}
}
2009-08-31 08:59:41 +00:00
Size aNxtPageSize;
if ( pNxtPage )
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
if ( pNxtPage->IsEmptyPage() )
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
if ( pNxtPage->GetPhyPageNum() % 2 == 0 )
aNxtPageSize = pNxtPage->GetPrev()->Frm().SSize();
else
aNxtPageSize = pNxtPage->GetNext()->Frm().SSize();
2000-09-18 23:08:29 +00:00
}
2009-08-31 08:59:41 +00:00
else
2000-09-18 23:08:29 +00:00
{
2009-08-31 08:59:41 +00:00
aNxtPageSize = pNxtPage->Frm().SSize();
2000-09-18 23:08:29 +00:00
}
2009-08-31 08:59:41 +00:00
}
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
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 = std::max( aNxtPageSize.Height(), aSttPageSize.Height() );
2009-08-31 08:59:41 +00:00
}
2000-09-18 23:08:29 +00:00
// set the MapMode
2009-08-31 08:59:41 +00:00
aMapMode.SetOrigin( Point() );
{
Fraction aScX( aPrtSize.Width(), nMaxColSz );
Fraction aScY( aPrtSize.Height(), nMaxRowSz );
if( aScX < aScY )
aScY = aScX;
2000-09-18 23:08:29 +00:00
{
// Round percentages for Drawings so that these can paint their objects properly
2009-08-31 08:59:41 +00:00
aScY *= Fraction( 1000, 1 );
long nTmp = (long)aScY;
if( 1 < nTmp )
--nTmp;
2000-09-18 23:08:29 +00:00
else
2009-08-31 08:59:41 +00:00
nTmp = 1;
aScY = Fraction( nTmp, 1000 );
}
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
aMapMode.SetScaleY( aScY );
aMapMode.SetScaleX( aScY );
}
2000-09-18 23:08:29 +00:00
2009-09-04 14:41:56 +00:00
Size aTmpPrtSize( pPrinter->PixelToLogic( pPrinter->GetPaperSizePixel(), aMapMode ) );
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
// 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.maVisArea = pStPage->Frm();
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
Point aPos( aSttPt );
aPos -= aShell.maVisArea.Pos();
2009-09-04 14:41:56 +00:00
// aPos -= aPrtOff;
2009-08-31 08:59:41 +00:00
aMapMode.SetOrigin( aPos );
pPrinter->SetMapMode( aMapMode );
pStPage->GetUpper()->Paint( pStPage->Frm() );
2000-09-18 23:08:29 +00:00
}
2009-08-31 08:59:41 +00:00
pStPage = pNxtPage;
aSttPt.X() += aTmpPrtSize.Width() / 2;
}
2000-09-18 23:08:29 +00:00
2009-08-31 08:59:41 +00:00
SwPaintQueue::Repaint();
2011-11-28 10:21:57 +07:00
//!! applying/modifying view options and formatting the document should now only be done in getRendererCount!
2000-09-18 23:08:29 +00:00
pFntCache->Flush();
2009-08-07 14:42:45 +00:00
// 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();
2000-09-18 23:08:29 +00:00
}
2009-08-07 14:42:45 +00:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */