Files
libreoffice/sw/source/core/layout/virtoutp.cxx

225 lines
7.0 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
#include <vcl/window.hxx>
#include "hintids.hxx"
#include "viewsh.hxx"
#include "virtoutp.hxx"
#include "viewopt.hxx"
#include "rootfrm.hxx"
#include "setmapvirtdev.hxx"
2000-09-18 23:08:29 +00:00
#if OSL_DEBUG_LEVEL > 1
2000-09-18 23:08:29 +00:00
class DbgRect
{
OutputDevice *pOut;
public:
DbgRect( OutputDevice *pOut, const Rectangle &rRect,
const ColorData eColor = COL_LIGHTBLUE );
};
inline DbgRect::DbgRect( OutputDevice *pOutDev, const Rectangle &rRect,
const ColorData eColor )
:pOut( pOutDev )
{
if( pOut )
{
pOut->Push( PushFlags::FILLCOLOR|PushFlags::LINECOLOR );
2000-09-18 23:08:29 +00:00
pOut->SetLineColor( eColor );
pOut->SetFillColor();
pOut->DrawRect( rRect );
pOut->Pop();
}
}
#endif
2012-02-13 11:38:02 +01:00
/* The SWLayVout class manages the virtual output devices.
* RootFrm has a static member of this class which is created in _FrmInit
* and destroyed in _FrmFinit.
2000-09-18 23:08:29 +00:00
* */
bool SwRootFrm::FlushVout()
2000-09-18 23:08:29 +00:00
{
if( SwRootFrm::pVout->IsFlushable() )
{
SwRootFrm::pVout->_Flush();
return true;
2000-09-18 23:08:29 +00:00
}
return false;
2000-09-18 23:08:29 +00:00
}
bool SwRootFrm::HasSameRect( const SwRect& rRect )
2000-09-18 23:08:29 +00:00
{
if( SwRootFrm::pVout->IsFlushable() )
return ( rRect == SwRootFrm::pVout->GetOrgRect() );
return false;
2000-09-18 23:08:29 +00:00
}
/** method to set mapping/pixel offset for virtual output device
OD 12.11.2002 #96272# - method implements two solutions for the mapping of
the virtual output device:
The old solution set the origin of the mapping mode, which will be used in
the virtual output device. This causes several paint errors, because of the
different roundings in the virtual output device and the original output device.
The new solution avoids the rounding differences between virtual and original
output device by setting a pixel offset at the virtual output device.
A define controls, which solution is used, in order to switch in escalation
back to old solution.
@param _pOrgOutDev
input parameter - constant instance of the original output device, for which
the virtual output device is created.
@param _pVirDev
input/output parameter - instance of the virtual output device.
@param _pMapMode
input/output parameter - instance of the mapping mode, which will be set
at the virtual output device.
@param _rNewOrigin
input parameter - constant instance of the origin, which will be used in
the virtual output device
*/
// define to control, if old or new solution for setting the mapping for
// an virtual output device is used.
void SetMappingForVirtDev( const Point& _rNewOrigin,
MapMode* ,
const OutputDevice* _pOrgOutDev,
VirtualDevice* _pVirDev )
{
// new solution: set pixel offset at virtual output device
Point aPixelOffset = _pOrgOutDev->LogicToPixel( _rNewOrigin );
_pVirDev->SetPixelOffset( Size( -aPixelOffset.X(), -aPixelOffset.Y() ) );
}
2012-02-13 11:38:02 +01:00
// rSize must be pixel coordinates!
bool SwLayVout::DoesFit( const Size &rNew )
2000-09-18 23:08:29 +00:00
{
2001-04-03 11:52:45 +00:00
if( rNew.Height() > VIRTUALHEIGHT )
return false;
2000-09-18 23:08:29 +00:00
if( rNew.Width() <= 0 || rNew.Height() <= 0 )
return false;
2000-09-18 23:08:29 +00:00
if( rNew.Width() <= aSize.Width() )
return true;
2000-09-18 23:08:29 +00:00
if( !pVirDev )
{
pVirDev = new VirtualDevice();
pVirDev->SetLineColor();
if( pOut )
{
if( pVirDev->GetFillColor() != pOut->GetFillColor() )
pVirDev->SetFillColor( pOut->GetFillColor() );
}
}
if( rNew.Width() > aSize.Width() )
{
aSize.Width() = rNew.Width();
if( !pVirDev->SetOutputSizePixel( aSize ) )
{
delete pVirDev;
pVirDev = NULL;
aSize.Width() = 0;
return false;
2000-09-18 23:08:29 +00:00
}
}
return true;
2000-09-18 23:08:29 +00:00
}
/// OD 27.09.2002 #103636# - change 2nd parameter <rRect> - no longer <const>
/// in order to return value of class member variable <aRect>, if virtual
/// output is used.
/// <aRect> contains the rectangle that represents the area the virtual
/// output device is used for and that is flushed at the end.
void SwLayVout::Enter( SwViewShell *pShell, SwRect &rRect, bool bOn )
2000-09-18 23:08:29 +00:00
{
Flush();
#ifdef DBG_UTIL
2000-09-18 23:08:29 +00:00
if( pShell->GetViewOptions()->IsTest3() )
2001-04-03 11:52:45 +00:00
{
++nCount;
2000-09-18 23:08:29 +00:00
return;
2001-04-03 11:52:45 +00:00
}
2000-09-18 23:08:29 +00:00
#endif
bOn = bOn && !nCount && rRect.HasArea() && pShell->GetWin();
++nCount;
if( bOn )
{
pSh = pShell;
pOut = NULL;
OutputDevice *pO = pSh->GetOut();
2012-02-13 11:38:02 +01:00
// We don't cheat on printers or virtual output devices...
2000-09-18 23:08:29 +00:00
if( OUTDEV_WINDOW != pO->GetOutDevType() )
return;
pOut = pO;
Size aPixSz( pOut->PixelToLogic( Size( 1,1 )) );
SwRect aTmp( rRect );
aTmp.SSize().Width() += aPixSz.Width()/2 + 1;
aTmp.SSize().Height()+= aPixSz.Height()/2 + 1;
Rectangle aTmpRect( pO->LogicToPixel( aTmp.SVRect() ) );
OSL_ENSURE( !pSh->GetWin()->IsReallyVisible() ||
aTmpRect.GetWidth() <= pSh->GetWin()->GetOutputSizePixel().Width() + 2,
2000-09-18 23:08:29 +00:00
"Paintwidth bigger than visarea?" );
2012-02-13 11:38:02 +01:00
// Does the rectangle fit in our buffer?
2000-09-18 23:08:29 +00:00
if( !DoesFit( aTmpRect.GetSize() ) )
{
pOut = NULL;
return;
}
aRect = SwRect( pO->PixelToLogic( aTmpRect ) );
SetOutDev( pSh, pVirDev );
if( pVirDev->GetFillColor() != pOut->GetFillColor() )
pVirDev->SetFillColor( pOut->GetFillColor() );
MapMode aMapMode( pOut->GetMapMode() );
// OD 12.11.2002 #96272# - use method to set mapping
//aMapMode.SetOrigin( Point(0,0) - aRect.Pos() );
::SetMappingForVirtDev( aRect.Pos(), &aMapMode, pOut, pVirDev );
2000-09-18 23:08:29 +00:00
if( aMapMode != pVirDev->GetMapMode() )
pVirDev->SetMapMode( aMapMode );
/// OD 27.09.2002 #103636# - set value of parameter <rRect>
rRect = aRect;
2000-09-18 23:08:29 +00:00
}
}
void SwLayVout::_Flush()
{
OSL_ENSURE( pVirDev, "SwLayVout::DrawOut: nothing left Toulouse" );
2000-09-18 23:08:29 +00:00
pOut->DrawOutDev( aRect.Pos(), aRect.SSize(),
aRect.Pos(), aRect.SSize(), *pVirDev );
SetOutDev( pSh, pOut );
pOut = NULL;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */