2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: pagectrl.cxx,v $
|
|
|
|
*
|
2002-02-27 12:43:08 +00:00
|
|
|
* $Revision: 1.6 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2002-02-27 12:43:08 +00:00
|
|
|
* last change: $Author: os $ $Date: 2002-02-27 13:43:08 $
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library 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 for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (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.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
// include ---------------------------------------------------------------
|
|
|
|
|
|
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
#define ITEMID_BOX 0
|
|
|
|
|
|
|
|
#ifndef _SV_BITMAP_HXX
|
|
|
|
#include <vcl/bitmap.hxx>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "pageitem.hxx"
|
|
|
|
#include "pagectrl.hxx"
|
|
|
|
#include "boxitem.hxx"
|
|
|
|
|
2000-11-06 18:19:26 +00:00
|
|
|
#include <algorithm>
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// struct PageWindow_Impl ------------------------------------------------
|
|
|
|
|
|
|
|
struct PageWindow_Impl
|
|
|
|
{
|
|
|
|
SvxBoxItem* pBorder;
|
|
|
|
Bitmap aBitmap;
|
|
|
|
FASTBOOL bBitmap;
|
|
|
|
|
|
|
|
PageWindow_Impl() : pBorder(0), bBitmap(FALSE) {}
|
|
|
|
};
|
|
|
|
|
|
|
|
// STATIC DATA -----------------------------------------------------------
|
|
|
|
|
|
|
|
#define CELL_WIDTH 1600L
|
|
|
|
#define CELL_HEIGHT 800L
|
|
|
|
|
|
|
|
// class SvxPageWindow ---------------------------------------------------
|
|
|
|
|
|
|
|
SvxPageWindow::SvxPageWindow( Window* pParent, const ResId& rId ) :
|
|
|
|
|
|
|
|
Window( pParent, rId ),
|
|
|
|
|
|
|
|
nTop ( 0 ),
|
|
|
|
nBottom ( 0 ),
|
|
|
|
nLeft ( 0 ),
|
|
|
|
nRight ( 0 ),
|
2002-02-27 12:43:08 +00:00
|
|
|
aColor ( COL_TRANSPARENT ),
|
2000-09-18 16:07:07 +00:00
|
|
|
nHdLeft ( 0 ),
|
|
|
|
nHdRight ( 0 ),
|
|
|
|
nHdDist ( 0 ),
|
|
|
|
nHdHeight ( 0 ),
|
2002-02-27 12:43:08 +00:00
|
|
|
aHdColor ( COL_TRANSPARENT ),
|
2000-09-18 16:07:07 +00:00
|
|
|
pHdBorder ( 0 ),
|
|
|
|
nFtLeft ( 0 ),
|
|
|
|
nFtRight ( 0 ),
|
|
|
|
nFtDist ( 0 ),
|
|
|
|
nFtHeight ( 0 ),
|
2002-02-27 12:43:08 +00:00
|
|
|
aFtColor ( COL_TRANSPARENT ),
|
2000-09-18 16:07:07 +00:00
|
|
|
pFtBorder ( 0 ),
|
|
|
|
bFooter ( FALSE ),
|
|
|
|
bHeader ( FALSE ),
|
|
|
|
bTable ( FALSE ),
|
|
|
|
bHorz ( FALSE ),
|
|
|
|
bVert ( FALSE ),
|
|
|
|
eUsage ( SVX_PAGE_ALL )
|
|
|
|
|
|
|
|
{
|
|
|
|
pImpl = new PageWindow_Impl;
|
|
|
|
|
|
|
|
// defaultmaessing in Twips rechnen
|
|
|
|
SetMapMode( MapMode( MAP_TWIP ) );
|
|
|
|
aWinSize = GetOutputSizePixel();
|
|
|
|
aWinSize.Height() -= 4;
|
|
|
|
aWinSize.Width() -= 4;
|
|
|
|
|
|
|
|
aWinSize = PixelToLogic( aWinSize );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SvxPageWindow::~SvxPageWindow()
|
|
|
|
{
|
|
|
|
delete pImpl;
|
|
|
|
delete pHdBorder;
|
|
|
|
delete pFtBorder;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void __EXPORT SvxPageWindow::Paint( const Rectangle& rRect )
|
|
|
|
{
|
2000-11-09 17:26:22 +00:00
|
|
|
Fraction aXScale( aWinSize.Width(), std::max( (long) (aSize.Width() * 2 + aSize.Width() / 8), 1L ) );
|
2000-11-06 18:19:26 +00:00
|
|
|
Fraction aYScale( aWinSize.Height(), std::max( aSize.Height(), 1L ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
MapMode aMapMode( GetMapMode() );
|
|
|
|
|
|
|
|
if ( aYScale < aXScale )
|
|
|
|
{
|
|
|
|
aMapMode.SetScaleX( aYScale );
|
|
|
|
aMapMode.SetScaleY( aYScale );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aMapMode.SetScaleX( aXScale );
|
|
|
|
aMapMode.SetScaleY( aXScale );
|
|
|
|
}
|
|
|
|
SetMapMode( aMapMode );
|
|
|
|
Size aSz( PixelToLogic( GetSizePixel() ) );
|
|
|
|
long nYPos = ( aSz.Height() - aSize.Height() ) / 2;
|
|
|
|
|
|
|
|
if ( eUsage == SVX_PAGE_ALL )
|
|
|
|
{
|
|
|
|
// alle Seiten gleich -> eine Seite malen
|
|
|
|
if ( aSize.Width() > aSize.Height() )
|
|
|
|
{
|
|
|
|
// Querformat in gleicher Gr"osse zeichnen
|
|
|
|
Fraction aX = aMapMode.GetScaleX();
|
|
|
|
Fraction aY = aMapMode.GetScaleY();
|
|
|
|
Fraction a2( 1.5 );
|
|
|
|
aX *= a2;
|
|
|
|
aY *= a2;
|
|
|
|
aMapMode.SetScaleX( aX );
|
|
|
|
aMapMode.SetScaleY( aY );
|
|
|
|
SetMapMode( aMapMode );
|
|
|
|
aSz = PixelToLogic( GetSizePixel() );
|
|
|
|
nYPos = ( aSz.Height() - aSize.Height() ) / 2;
|
|
|
|
long nXPos = ( aSz.Width() - aSize.Width() ) / 2;
|
|
|
|
DrawPage( Point( nXPos, nYPos ), TRUE, TRUE );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
// Hochformat
|
|
|
|
DrawPage( Point( ( aSz.Width() - aSize.Width() ) / 2, nYPos ), TRUE, TRUE );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Linke und rechte Seite unterschiedlich -> ggf. zwei Seiten malen
|
|
|
|
DrawPage( Point( 0, nYPos ), FALSE, (BOOL)( eUsage & SVX_PAGE_LEFT ) );
|
|
|
|
DrawPage( Point( aSize.Width() + aSize.Width() / 8, nYPos ), TRUE,
|
|
|
|
(BOOL)( eUsage & SVX_PAGE_RIGHT ) );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SvxPageWindow::DrawPage( const Point& rOrg, const BOOL bSecond, const BOOL bEnabled )
|
|
|
|
{
|
2002-02-27 12:43:08 +00:00
|
|
|
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
|
|
|
|
const Color& rFieldColor = rStyleSettings.GetFieldColor();
|
|
|
|
const Color& rFieldTextColor = rStyleSettings.GetFieldTextColor();
|
|
|
|
const Color& rDisableColor = rStyleSettings.GetDisableColor();
|
|
|
|
const Color& rDlgColor = rStyleSettings.GetDialogColor();
|
|
|
|
|
|
|
|
// background
|
|
|
|
if(!bSecond)
|
|
|
|
{
|
|
|
|
SetLineColor( Color(COL_TRANSPARENT) );
|
|
|
|
SetFillColor( rDlgColor );
|
|
|
|
Size aWinSize(GetOutputSize());
|
|
|
|
DrawRect( Rectangle( Point(0,0), aWinSize ) );
|
|
|
|
}
|
|
|
|
SetLineColor( rFieldTextColor );
|
2000-09-18 16:07:07 +00:00
|
|
|
// Schatten
|
|
|
|
Size aTempSize = aSize;
|
|
|
|
// Seite
|
|
|
|
if ( !bEnabled )
|
|
|
|
{
|
2002-02-27 12:43:08 +00:00
|
|
|
SetFillColor( rDisableColor );
|
2000-09-18 16:07:07 +00:00
|
|
|
DrawRect( Rectangle( rOrg, aTempSize ) );
|
|
|
|
return;
|
|
|
|
}
|
2002-02-27 12:43:08 +00:00
|
|
|
SetFillColor( rFieldColor );
|
2000-09-18 16:07:07 +00:00
|
|
|
DrawRect( Rectangle( rOrg, aTempSize ) );
|
|
|
|
|
|
|
|
// Border Top Bottom Left Right
|
|
|
|
Point aBegin( rOrg );
|
|
|
|
Point aEnd( rOrg );
|
|
|
|
|
|
|
|
long nL = nLeft;
|
|
|
|
long nR = nRight;
|
|
|
|
|
|
|
|
if ( eUsage == SVX_PAGE_MIRROR && !bSecond )
|
|
|
|
{
|
|
|
|
// f"ur gespiegelt drehen
|
|
|
|
nL = nRight;
|
|
|
|
nR = nLeft;
|
|
|
|
}
|
|
|
|
|
|
|
|
Rectangle aRect;
|
|
|
|
|
|
|
|
aRect.Left() = rOrg.X() + nL;
|
|
|
|
aRect.Right() = rOrg.X() + aTempSize.Width() - nR;
|
|
|
|
aRect.Top() = rOrg.Y() + nTop;
|
|
|
|
aRect.Bottom()= rOrg.Y() + aTempSize.Height() - nBottom;
|
|
|
|
|
|
|
|
Rectangle aHdRect( aRect );
|
|
|
|
Rectangle aFtRect( aRect );
|
|
|
|
|
|
|
|
if ( bHeader )
|
|
|
|
{
|
|
|
|
// ggf. Header anzeigen
|
|
|
|
aHdRect.Left() += nHdLeft;
|
|
|
|
aHdRect.Right() -= nHdRight;
|
|
|
|
aHdRect.Bottom() = aRect.Top() + nHdHeight;
|
|
|
|
aRect.Top() += nHdHeight + nHdDist;
|
|
|
|
SetFillColor( aHdColor );
|
|
|
|
DrawRect( aHdRect );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bFooter )
|
|
|
|
{
|
|
|
|
// ggf. Footer anzeigen
|
|
|
|
aFtRect.Left() += nFtLeft;
|
|
|
|
aFtRect.Right() -= nFtRight;
|
|
|
|
aFtRect.Top() = aRect.Bottom() - nFtHeight;
|
|
|
|
aRect.Bottom() -= nFtHeight + nFtDist;
|
|
|
|
SetFillColor( aFtColor );
|
|
|
|
DrawRect( aFtRect );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Body malen
|
|
|
|
SetFillColor( aColor );
|
|
|
|
if ( pImpl->bBitmap )
|
|
|
|
{
|
|
|
|
DrawRect( aRect );
|
|
|
|
Point aBmpPnt = aRect.TopLeft();
|
|
|
|
Size aBmpSiz = aRect.GetSize();
|
|
|
|
long nDeltaX = aBmpSiz.Width() / 15;
|
|
|
|
long nDeltaY = aBmpSiz.Height() / 15;
|
|
|
|
aBmpPnt.X() += nDeltaX;
|
|
|
|
aBmpPnt.Y() += nDeltaY;
|
|
|
|
aBmpSiz.Width() -= nDeltaX * 2;
|
|
|
|
aBmpSiz.Height() -= nDeltaY * 2;
|
|
|
|
DrawBitmap( aBmpPnt, aBmpSiz, pImpl->aBitmap );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
DrawRect( aRect );
|
|
|
|
|
|
|
|
if ( bTable )
|
|
|
|
{
|
|
|
|
// Tabelle malen, ggf. zentrieren
|
|
|
|
SetLineColor( Color(COL_LIGHTGRAY) );
|
|
|
|
|
|
|
|
long nW = aRect.GetWidth(), nH = aRect.GetHeight();
|
|
|
|
long nTW = CELL_WIDTH * 3, nTH = CELL_HEIGHT * 3;
|
|
|
|
long nLeft = bHorz ? aRect.Left() + ((nW - nTW) / 2) : aRect.Left();
|
|
|
|
long nTop = bVert ? aRect.Top() + ((nH - nTH) / 2) : aRect.Top();
|
|
|
|
Rectangle aCellRect( Point( nLeft, nTop ), Size( CELL_WIDTH, CELL_HEIGHT ) );
|
|
|
|
|
|
|
|
for ( USHORT i = 0; i < 3; ++i )
|
|
|
|
{
|
|
|
|
aCellRect.Left() = nLeft;
|
|
|
|
aCellRect.Right() = nLeft + CELL_WIDTH;
|
|
|
|
if ( i > 0 )
|
|
|
|
aCellRect.Move( 0, CELL_HEIGHT );
|
|
|
|
|
|
|
|
for ( USHORT j = 0; j < 3; ++j )
|
|
|
|
{
|
|
|
|
if ( j > 0 )
|
|
|
|
aCellRect.Move( CELL_WIDTH, 0 );
|
|
|
|
DrawRect( aCellRect );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SvxPageWindow::SetBorder( const SvxBoxItem& rNew )
|
|
|
|
{
|
|
|
|
delete pImpl->pBorder;
|
|
|
|
pImpl->pBorder = new SvxBoxItem( rNew );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SvxPageWindow::SetBitmap( Bitmap* pBmp )
|
|
|
|
{
|
|
|
|
if ( pBmp )
|
|
|
|
{
|
|
|
|
pImpl->aBitmap = *pBmp;
|
|
|
|
pImpl->bBitmap = TRUE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
pImpl->bBitmap = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SvxPageWindow::SetHdBorder( const SvxBoxItem& rNew )
|
|
|
|
{
|
|
|
|
delete pHdBorder;
|
|
|
|
pHdBorder = new SvxBoxItem( rNew );
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void SvxPageWindow::SetFtBorder( const SvxBoxItem& rNew )
|
|
|
|
{
|
|
|
|
delete pFtBorder;
|
|
|
|
pFtBorder = new SvxBoxItem( rNew );
|
|
|
|
}
|
|
|
|
|