[PATCH] Rename "printdlg.cxx" to "prndlg.cxx".

Skyler (none) skyler at skyler-desktop.
Fri Mar 25 00:02:02 PDT 2011


vcl/source/window/printdlg.cxx implements vcl/inc/vcl/prndlg.hxx, so I've renamed the .cxx file so it remains consistent, yet doesn't break the API.
---
 vcl/source/window/makefile.mk  |    2 +-
 vcl/source/window/printdlg.cxx | 2501 ----------------------------------------
 vcl/source/window/prndlg.cxx   | 2501 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 2502 insertions(+), 2502 deletions(-)
 delete mode 100644 vcl/source/window/printdlg.cxx
 create mode 100644 vcl/source/window/prndlg.cxx

diff --git a/vcl/source/window/makefile.mk b/vcl/source/window/makefile.mk
index 1c63376..91f9e9c 100644
--- a/vcl/source/window/makefile.mk
+++ b/vcl/source/window/makefile.mk
@@ -68,7 +68,7 @@ SLOFILES= \
             $(SLO)$/msgbox.obj		\
             $(SLO)$/popupmenuwindow.obj		\
             $(SLO)$/scrwnd.obj		\
-            $(SLO)$/printdlg.obj    \
+            $(SLO)$/prndlg.obj    \
             $(SLO)$/seleng.obj		\
             $(SLO)$/split.obj		\
             $(SLO)$/splitwin.obj	\
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
deleted file mode 100644
index 9dd335b..0000000
--- a/vcl/source/window/printdlg.cxx
+++ /dev/null
@@ -1,2501 +0,0 @@
-/* -*- 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
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-#include "precompiled_vcl.hxx"
-
-#include "vcl/print.hxx"
-#include "vcl/prndlg.hxx"
-#include "vcl/dialog.hxx"
-#include "vcl/button.hxx"
-#include "vcl/svdata.hxx"
-#include "vcl/svids.hrc"
-#include "vcl/wall.hxx"
-#include "vcl/jobset.h"
-#include "vcl/status.hxx"
-#include "vcl/decoview.hxx"
-#include "vcl/arrange.hxx"
-#include "vcl/configsettings.hxx"
-#include "vcl/help.hxx"
-#include "vcl/decoview.hxx"
-#include "vcl/svapp.hxx"
-#include "vcl/unohelp.hxx"
-
-#include "unotools/localedatawrapper.hxx"
-
-#include "rtl/strbuf.hxx"
-
-#include "com/sun/star/lang/XMultiServiceFactory.hpp"
-#include "com/sun/star/container/XNameAccess.hpp"
-#include "com/sun/star/beans/PropertyValue.hpp"
-#include "com/sun/star/awt/Size.hpp"
-
-using namespace vcl;
-using namespace com::sun::star;
-using namespace com::sun::star::uno;
-using namespace com::sun::star::lang;
-using namespace com::sun::star::container;
-using namespace com::sun::star::beans;
-
-PrintDialog::PrintPreviewWindow::PrintPreviewWindow( Window* i_pParent, const ResId& i_rId )
-    : Window( i_pParent, i_rId )
-    , maOrigSize( 10, 10 )
-    , maPageVDev( *this )
-    , maToolTipString( String( VclResId( SV_PRINT_PRINTPREVIEW_TXT ) ) )
-    , mbGreyscale( false )
-    , maHorzDim( this, WB_HORZ | WB_CENTER  )
-    , maVertDim( this, WB_VERT | WB_VCENTER )
-{
-    SetPaintTransparent( sal_True );
-    SetBackground();
-    maPageVDev.SetBackground( Color( COL_WHITE ) );
-    maHorzDim.Show();
-    maVertDim.Show();
-    
-    maHorzDim.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "2.0in" ) ) );
-    maVertDim.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "2.0in" ) ) );
-}
-
-PrintDialog::PrintPreviewWindow::~PrintPreviewWindow()
-{
-}
-
-void PrintDialog::PrintPreviewWindow::DataChanged( const DataChangedEvent& i_rDCEvt )
-{
-    // react on settings changed
-    if( i_rDCEvt.GetType() == DATACHANGED_SETTINGS )
-    {
-        maPageVDev.SetBackground( Color( COL_WHITE ) );
-    }
-    Window::DataChanged( i_rDCEvt );
-}
-
-void PrintDialog::PrintPreviewWindow::Resize()
-{
-    Size aNewSize( GetSizePixel() );
-    long nTextHeight = maHorzDim.GetTextHeight();
-    // leave small space for decoration
-    aNewSize.Width() -= nTextHeight + 2;
-    aNewSize.Height() -= nTextHeight + 2;
-    Size aScaledSize;
-    double fScale = 1.0;
-
-    // #i106435# catch corner case of Size(0,0)
-    Size aOrigSize( maOrigSize );
-    if( aOrigSize.Width() < 1 )
-        aOrigSize.Width() = aNewSize.Width();
-    if( aOrigSize.Height() < 1 )
-        aOrigSize.Height() = aNewSize.Height();
-    if( aOrigSize.Width() > aOrigSize.Height() )
-    {
-        aScaledSize = Size( aNewSize.Width(), aNewSize.Width() * aOrigSize.Height() / aOrigSize.Width() );
-        if( aScaledSize.Height() > aNewSize.Height() )
-            fScale = double(aNewSize.Height())/double(aScaledSize.Height());
-    }
-    else
-    {
-        aScaledSize = Size( aNewSize.Height() * aOrigSize.Width() / aOrigSize.Height(), aNewSize.Height() );
-        if( aScaledSize.Width() > aNewSize.Width() )
-            fScale = double(aNewSize.Width())/double(aScaledSize.Width());
-    }
-    aScaledSize.Width() = long(aScaledSize.Width()*fScale);
-    aScaledSize.Height() = long(aScaledSize.Height()*fScale);
-
-    maPreviewSize = aScaledSize;
-
-    // #i104784# if we render the page too small then rounding issues result in
-    // layout artifacts looking really bad. So scale the page unto a device that is not
-    // full page size but not too small either. This also results in much better visual
-    // quality of the preview, e.g. when its height approaches the number of text lines
-    // find a good scaling factor
-    Size aPreviewMMSize( maPageVDev.PixelToLogic( aScaledSize, MapMode( MAP_100TH_MM ) ) );
-    double fZoom = double(maOrigSize.Height())/double(aPreviewMMSize.Height());
-    while( fZoom > 10 )
-    {
-        aScaledSize.Width() *= 2;
-        aScaledSize.Height() *= 2;
-        fZoom /= 2.0;
-    }
-
-    maPageVDev.SetOutputSizePixel( aScaledSize, sal_False );
-
-    // position dimension lines
-    Point aRef( nTextHeight + (aNewSize.Width() - maPreviewSize.Width())/2,
-                nTextHeight + (aNewSize.Height() - maPreviewSize.Height())/2 );
-    maHorzDim.SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ),
-                               Size( maPreviewSize.Width(), nTextHeight ) );
-    maVertDim.SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ),
-                               Size( nTextHeight, maPreviewSize.Height() ) );
-    
-}
-
-void PrintDialog::PrintPreviewWindow::Paint( const Rectangle& )
-{
-    long nTextHeight = maHorzDim.GetTextHeight(); 
-    Size aSize( GetSizePixel() );
-    aSize.Width()  -= nTextHeight;
-    aSize.Height() -= nTextHeight;
-    if( maReplacementString.getLength() != 0 )
-    {
-        // replacement is active
-        Push();
-        Rectangle aTextRect( Point( nTextHeight, nTextHeight ), aSize );
-        DecorationView aVw( this );
-        aVw.DrawFrame( aTextRect, FRAME_DRAW_GROUP );
-        aTextRect.Left()   += 2;
-        aTextRect.Top()    += 2;
-        aTextRect.Right()  -= 2;
-        aTextRect.Bottom() -= 2;
-        Font aFont( GetSettings().GetStyleSettings().GetLabelFont() );
-        SetZoomedPointFont( aFont );
-        DrawText( aTextRect, maReplacementString,
-                  TEXT_DRAW_CENTER | TEXT_DRAW_VCENTER | TEXT_DRAW_WORDBREAK | TEXT_DRAW_MULTILINE
-                 );
-        Pop();
-    }
-    else
-    {
-        GDIMetaFile aMtf( maMtf );
-
-        Point aOffset( (aSize.Width() - maPreviewSize.Width()) / 2 + nTextHeight,
-                       (aSize.Height() - maPreviewSize.Height()) / 2 + nTextHeight );
-
-        Size aVDevSize( maPageVDev.GetOutputSizePixel() );
-        const Size aLogicSize( maPageVDev.PixelToLogic( aVDevSize, MapMode( MAP_100TH_MM ) ) );
-        Size aOrigSize( maOrigSize );
-        if( aOrigSize.Width() < 1 )
-            aOrigSize.Width() = aLogicSize.Width();
-        if( aOrigSize.Height() < 1 )
-            aOrigSize.Height() = aLogicSize.Height();
-        double fScale = double(aLogicSize.Width())/double(aOrigSize.Width());
-
-
-        maPageVDev.Erase();
-        maPageVDev.Push();
-        maPageVDev.SetMapMode( MAP_100TH_MM );
-        sal_uLong nOldDrawMode = maPageVDev.GetDrawMode();
-        if( mbGreyscale )
-            maPageVDev.SetDrawMode( maPageVDev.GetDrawMode() |
-                                    ( DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_GRAYTEXT | 
-                                      DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT ) );
-        aMtf.WindStart();
-        aMtf.Scale( fScale, fScale );
-        aMtf.WindStart();
-        aMtf.Play( &maPageVDev, Point( 0, 0 ), aLogicSize );
-        maPageVDev.Pop();
-
-        SetMapMode( MAP_PIXEL );
-        maPageVDev.SetMapMode( MAP_PIXEL );
-        DrawOutDev( aOffset, maPreviewSize, Point( 0, 0 ), aVDevSize, maPageVDev );
-        maPageVDev.SetDrawMode( nOldDrawMode );
-
-        DecorationView aVw( this );
-        Rectangle aFrame( aOffset + Point( -1, -1 ), Size( maPreviewSize.Width() + 2, maPreviewSize.Height() + 2 ) );
-        aVw.DrawFrame( aFrame, FRAME_DRAW_GROUP );
-    }
-}
-
-void PrintDialog::PrintPreviewWindow::Command( const CommandEvent& rEvt )
-{
-    if( rEvt.GetCommand() == COMMAND_WHEEL )
-    {
-        const CommandWheelData* pWheelData = rEvt.GetWheelData();
-        PrintDialog* pDlg = dynamic_cast<PrintDialog*>(GetParent());
-        if( pDlg )
-        {
-            if( pWheelData->GetDelta() > 0 )
-                pDlg->previewForward();
-            else if( pWheelData->GetDelta() < 0 )
-                pDlg->previewBackward();
-            /*
-            else
-                huh ?
-            */
-        }
-    }
-}
-
-void PrintDialog::PrintPreviewWindow::setPreview( const GDIMetaFile& i_rNewPreview,
-                                                  const Size& i_rOrigSize,
-                                                  const rtl::OUString& i_rPaperName,
-                                                  const rtl::OUString& i_rReplacement,
-                                                  sal_Int32 i_nDPIX,
-                                                  sal_Int32 i_nDPIY,
-                                                  bool i_bGreyscale
-                                                 )
-{
-    rtl::OUStringBuffer aBuf( 256 );
-    aBuf.append( maToolTipString );
-    SetQuickHelpText( aBuf.makeStringAndClear() );
-    maMtf = i_rNewPreview;
-
-    maOrigSize = i_rOrigSize;
-    maReplacementString = i_rReplacement;
-    mbGreyscale = i_bGreyscale;
-    maPageVDev.SetReferenceDevice( i_nDPIX, i_nDPIY );
-    maPageVDev.EnableOutput( sal_True );
-
-    // use correct measurements
-    const LocaleDataWrapper& rLocWrap( GetSettings().GetLocaleDataWrapper() );
-    MapUnit eUnit = MAP_MM;
-    int nDigits = 0;
-    if( rLocWrap.getMeasurementSystemEnum() == MEASURE_US )
-    {
-        eUnit = MAP_100TH_INCH;
-        nDigits = 2;
-    }
-    Size aLogicPaperSize( LogicToLogic( i_rOrigSize, MapMode( MAP_100TH_MM ), MapMode( eUnit ) ) );
-    String aNumText( rLocWrap.getNum( aLogicPaperSize.Width(), nDigits ) );
-    aBuf.append( aNumText );
-    aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" );
-    if( i_rPaperName.getLength() )
-    {
-        aBuf.appendAscii( " (" );
-        aBuf.append( i_rPaperName );
-        aBuf.append( sal_Unicode(')') );
-    }
-    maHorzDim.SetText( aBuf.makeStringAndClear() );
-    
-    aNumText = rLocWrap.getNum( aLogicPaperSize.Height(), nDigits );
-    aBuf.append( aNumText );
-    aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" );
-    maVertDim.SetText( aBuf.makeStringAndClear() );
-
-    Resize();
-    Invalidate();
-}
-
-PrintDialog::ShowNupOrderWindow::ShowNupOrderWindow( Window* i_pParent )
-    : Window( i_pParent, WB_NOBORDER )
-    , mnOrderMode( 0 )
-    , mnRows( 1 )
-    , mnColumns( 1 )
-{
-    ImplInitSettings();
-}
-
-PrintDialog::ShowNupOrderWindow::~ShowNupOrderWindow()
-{
-}
-
-void PrintDialog::ShowNupOrderWindow::ImplInitSettings()
-{
-    SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFieldColor() ) );
-}
-
-void PrintDialog::ShowNupOrderWindow::Paint( const Rectangle& i_rRect )
-{
-    Window::Paint( i_rRect );
-    SetMapMode( MAP_PIXEL );
-    SetTextColor( GetSettings().GetStyleSettings().GetFieldTextColor() );
-
-    int nPages = mnRows * mnColumns;
-    Font aFont( GetSettings().GetStyleSettings().GetFieldFont() );
-    aFont.SetSize( Size( 0, 24 ) );
-    SetFont( aFont );
-    Size aSampleTextSize( GetTextWidth( rtl::OUString::valueOf( sal_Int32(nPages+1) ) ), GetTextHeight() );
-
-    Size aOutSize( GetOutputSizePixel() );
-    Size aSubSize( aOutSize.Width() / mnColumns, aOutSize.Height() / mnRows );
-    // calculate font size: shrink the sample text so it fits
-    double fX = double(aSubSize.Width())/double(aSampleTextSize.Width());
-    double fY = double(aSubSize.Height())/double(aSampleTextSize.Height());
-    double fScale = (fX < fY) ? fX : fY;
-    long nFontHeight = long(24.0*fScale) - 3;
-    if( nFontHeight < 5 )
-        nFontHeight = 5;
-    aFont.SetSize( Size( 0, nFontHeight ) );
-    SetFont( aFont );
-    long nTextHeight = GetTextHeight();
-    for( int i = 0; i < nPages; i++ )
-    {
-        rtl::OUString aPageText( rtl::OUString::valueOf( sal_Int32(i+1) ) );
-        int nX = 0, nY = 0;
-        switch( mnOrderMode )
-        {
-        case SV_PRINT_PRT_NUP_ORDER_LRTB:
-            nX = (i % mnColumns); nY = (i / mnColumns);
-            break;
-        case SV_PRINT_PRT_NUP_ORDER_TBLR:
-            nX = (i / mnRows); nY = (i % mnRows);
-            break;
-        case SV_PRINT_PRT_NUP_ORDER_RLTB:
-            nX = mnColumns - 1 - (i % mnColumns); nY = (i / mnColumns);
-            break;
-        case SV_PRINT_PRT_NUP_ORDER_TBRL:
-            nX = mnColumns - 1 - (i / mnRows); nY = (i % mnRows);
-            break;
-        }
-        Size aTextSize( GetTextWidth( aPageText ), nTextHeight );
-        int nDeltaX = (aSubSize.Width() - aTextSize.Width()) / 2;
-        int nDeltaY = (aSubSize.Height() - aTextSize.Height()) / 2;
-        DrawText( Point( nX * aSubSize.Width() + nDeltaX,
-                         nY * aSubSize.Height() + nDeltaY ),
-                  aPageText );
-    }
-    DecorationView aVw( this );
-    aVw.DrawFrame( Rectangle( Point( 0, 0), aOutSize ), FRAME_DRAW_GROUP );
-}
-
-PrintDialog::NUpTabPage::NUpTabPage( Window* i_pParent, const ResId& rResId )
-    : TabPage( i_pParent, rResId )
-    , maNupLine( this, VclResId( SV_PRINT_PRT_NUP_LAYOUT_FL ) )
-    , maPagesBtn( this, VclResId( SV_PRINT_PRT_NUP_PAGES_BTN ) )
-    , maBrochureBtn( this, VclResId( SV_PRINT_PRT_NUP_BROCHURE_BTN ) )
-    , maPagesBoxTitleTxt( this, 0 )
-    , maNupPagesBox( this, VclResId( SV_PRINT_PRT_NUP_PAGES_BOX ) )
-    , maNupNumPagesTxt( this, VclResId( SV_PRINT_PRT_NUP_NUM_PAGES_TXT ) )
-    , maNupColEdt( this, VclResId( SV_PRINT_PRT_NUP_COLS_EDT ) )
-    , maNupTimesTxt( this, VclResId( SV_PRINT_PRT_NUP_TIMES_TXT ) )
-    , maNupRowsEdt( this, VclResId( SV_PRINT_PRT_NUP_ROWS_EDT ) )
-    , maPageMarginTxt1( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_1_TXT ) )
-    , maPageMarginEdt( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_EDT ) )
-    , maPageMarginTxt2( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_2_TXT ) )
-    , maSheetMarginTxt1( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_1_TXT ) )
-    , maSheetMarginEdt( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_EDT ) )
-    , maSheetMarginTxt2( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_2_TXT ) )
-    , maNupOrientationTxt( this, VclResId( SV_PRINT_PRT_NUP_ORIENTATION_TXT ) )
-    , maNupOrientationBox( this, VclResId( SV_PRINT_PRT_NUP_ORIENTATION_BOX ) )
-    , maNupOrderTxt( this, VclResId( SV_PRINT_PRT_NUP_ORDER_TXT ) )
-    , maNupOrderBox( this, VclResId( SV_PRINT_PRT_NUP_ORDER_BOX ) )
-    , maNupOrderWin( this )
-    , maBorderCB( this, VclResId( SV_PRINT_PRT_NUP_BORDER_CB ) )
-{
-    FreeResource();
-
-    maNupOrderWin.Show();
-    maPagesBtn.Check( sal_True );
-    maBrochureBtn.Show( sal_False );
-
-    // setup field units for metric fields
-    const LocaleDataWrapper& rLocWrap( maPageMarginEdt.GetLocaleDataWrapper() );
-    FieldUnit eUnit = FUNIT_MM;
-    sal_uInt16 nDigits = 0;
-    if( rLocWrap.getMeasurementSystemEnum() == MEASURE_US )
-    {
-        eUnit = FUNIT_INCH;
-        nDigits = 2;
-    }
-    // set units
-    maPageMarginEdt.SetUnit( eUnit );
-    maSheetMarginEdt.SetUnit( eUnit );
-
-    // set precision
-    maPageMarginEdt.SetDecimalDigits( nDigits );
-    maSheetMarginEdt.SetDecimalDigits( nDigits );
-
-    setupLayout();
-}
-
-PrintDialog::NUpTabPage::~NUpTabPage()
-{
-}
-
-void PrintDialog::NUpTabPage::enableNupControls( bool bEnable )
-{
-    maNupPagesBox.Enable( sal_True );
-    maNupNumPagesTxt.Enable( bEnable );
-    maNupColEdt.Enable( bEnable );
-    maNupTimesTxt.Enable( bEnable );
-    maNupRowsEdt.Enable( bEnable );
-    maPageMarginTxt1.Enable( bEnable );
-    maPageMarginEdt.Enable( bEnable );
-    maPageMarginTxt2.Enable( bEnable );
-    maSheetMarginTxt1.Enable( bEnable );
-    maSheetMarginEdt.Enable( bEnable );
-    maSheetMarginTxt2.Enable( bEnable );
-    maNupOrientationTxt.Enable( bEnable );
-    maNupOrientationBox.Enable( bEnable );
-    maNupOrderTxt.Enable( bEnable );
-    maNupOrderBox.Enable( bEnable );
-    maNupOrderWin.Enable( bEnable );
-    maBorderCB.Enable( bEnable );
-}
-
-void PrintDialog::NUpTabPage::showAdvancedControls( bool i_bShow )
-{
-    maNupNumPagesTxt.Show( i_bShow );
-    maNupColEdt.Show( i_bShow );
-    maNupTimesTxt.Show( i_bShow );
-    maNupRowsEdt.Show( i_bShow );
-    maPageMarginTxt1.Show( i_bShow );
-    maPageMarginEdt.Show( i_bShow );
-    maPageMarginTxt2.Show( i_bShow );
-    maSheetMarginTxt1.Show( i_bShow );
-    maSheetMarginEdt.Show( i_bShow );
-    maSheetMarginTxt2.Show( i_bShow );
-    maNupOrientationTxt.Show( i_bShow );
-    maNupOrientationBox.Show( i_bShow );
-    getLayout()->resize();
-}
-
-void PrintDialog::NUpTabPage::setupLayout()
-{
-    boost::shared_ptr<vcl::RowOrColumn> xLayout =
-        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
-    Size aBorder( LogicToPixel( Size( 6, 6 ), MapMode( MAP_APPFONT ) ) );
-    /*  According to OOo style guide, the horizontal indentation of child
-        elements to their parent element should always be 6 map units. */
-    long nIndent = aBorder.Width();
-    
-    xLayout->addWindow( &maNupLine );
-    boost::shared_ptr< vcl::RowOrColumn > xRow( new vcl::RowOrColumn( xLayout.get(), false ) );
-    xLayout->addChild( xRow );
-    boost::shared_ptr< vcl::Indenter > xIndent( new vcl::Indenter( xRow.get() ) );
-    xRow->addChild( xIndent );
-
-    boost::shared_ptr< vcl::RowOrColumn > xShowNupCol( new vcl::RowOrColumn( xRow.get() ) );
-    xRow->addChild( xShowNupCol, -1 );
-    xShowNupCol->setMinimumSize( xShowNupCol->addWindow( &maNupOrderWin ), Size( 70, 70 ) );
-    boost::shared_ptr< vcl::Spacer > xSpacer( new vcl::Spacer( xShowNupCol.get() ) );
-    xShowNupCol->addChild( xSpacer );
-
-    boost::shared_ptr< vcl::LabelColumn > xMainCol( new vcl::LabelColumn( xIndent.get() ) );
-    xIndent->setChild( xMainCol );
-
-    size_t nPagesIndex = xMainCol->addRow( &maPagesBtn, &maNupPagesBox );
-    mxPagesBtnLabel = boost::dynamic_pointer_cast<vcl::LabeledElement>( xMainCol->getChild( nPagesIndex ) );
-
-    xRow.reset( new vcl::RowOrColumn( xMainCol.get(), false ) );
-    xMainCol->addRow( &maNupNumPagesTxt, xRow, nIndent );
-    xRow->addWindow( &maNupColEdt );
-    xRow->addWindow( &maNupTimesTxt );
-    xRow->addWindow( &maNupRowsEdt );
-
-    boost::shared_ptr< vcl::LabeledElement > xLab( new vcl::LabeledElement( xMainCol.get(), 2 ) );
-    xLab->setLabel( &maPageMarginEdt );
-    xLab->setElement( &maPageMarginTxt2 );
-    xMainCol->addRow( &maPageMarginTxt1, xLab, nIndent );
-
-    xLab.reset( new vcl::LabeledElement( xMainCol.get(), 2 ) );
-    xLab->setLabel( &maSheetMarginEdt );
-    xLab->setElement( &maSheetMarginTxt2 );
-    xMainCol->addRow( &maSheetMarginTxt1, xLab, nIndent );
-
-    xMainCol->addRow( &maNupOrientationTxt, &maNupOrientationBox, nIndent );
-    xMainCol->addRow( &maNupOrderTxt, &maNupOrderBox, nIndent );
-    xMainCol->setBorders( xMainCol->addWindow( &maBorderCB ), nIndent, 0, 0, 0 );
-
-    xSpacer.reset( new vcl::Spacer( xMainCol.get(), 0, Size( 10, WindowArranger::getDefaultBorder() ) ) );
-    xMainCol->addChild( xSpacer );
-
-    xRow.reset( new vcl::RowOrColumn( xMainCol.get(), false ) );
-    xMainCol->addRow( &maBrochureBtn, xRow );
-    // remember brochure row for dependencies
-    mxBrochureDep = xRow;
-
-    // initially advanced controls are not shown, rows=columns=1
-    showAdvancedControls( false );
-}
-
-void PrintDialog::NUpTabPage::initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& i_rMPS )
-{
-    maSheetMarginEdt.SetValue( maSheetMarginEdt.Normalize( i_rMPS.nLeftMargin ), FUNIT_100TH_MM );
-    maPageMarginEdt.SetValue( maPageMarginEdt.Normalize( i_rMPS.nHorizontalSpacing ), FUNIT_100TH_MM );
-    maBorderCB.Check( i_rMPS.bDrawBorder );
-    maNupRowsEdt.SetValue( i_rMPS.nRows );
-    maNupColEdt.SetValue( i_rMPS.nColumns );
-}
-
-void PrintDialog::NUpTabPage::readFromSettings()
-{
-}
-
-void PrintDialog::NUpTabPage::storeToSettings()
-{
-}
-
-PrintDialog::JobTabPage::JobTabPage( Window* i_pParent, const ResId& rResId )
-    : TabPage( i_pParent, rResId )
-    , maPrinterFL( this, VclResId( SV_PRINT_PRINTERS_FL ) )
-    , maPrinters( this, VclResId( SV_PRINT_PRINTERS ) )
-    , maDetailsBtn( this, VclResId( SV_PRINT_DETAILS_BTN ) )
-    , maStatusLabel( this, VclResId( SV_PRINT_STATUS_TXT ) )
-    , maStatusTxt( this, 0 )
-    , maLocationLabel( this, VclResId( SV_PRINT_LOCATION_TXT ) )
-    , maLocationTxt( this, 0 )
-    , maCommentLabel( this, VclResId( SV_PRINT_COMMENT_TXT ) )
-    , maCommentTxt( this, 0 )
-    , maSetupButton( this, VclResId( SV_PRINT_PRT_SETUP ) )
-    , maCopies( this, VclResId( SV_PRINT_COPIES ) )
-    , maCopySpacer( this, WB_VERT )
-    , maCopyCount( this, VclResId( SV_PRINT_COPYCOUNT ) )
-    , maCopyCountField( this, VclResId( SV_PRINT_COPYCOUNT_FIELD ) )
-    , maCollateBox( this, VclResId( SV_PRINT_COLLATE ) )
-    , maCollateImage( this, VclResId( SV_PRINT_COLLATE_IMAGE ) )
-    , maReverseOrderBox( this, VclResId( SV_PRINT_OPT_REVERSE ) )
-    , maCollateImg( VclResId( SV_PRINT_COLLATE_IMG ) )
-    , maNoCollateImg( VclResId( SV_PRINT_NOCOLLATE_IMG ) )
-    , mnCollateUIMode( 0 )
-{
-    FreeResource();
-
-
-    maCopySpacer.Show();
-    maStatusTxt.Show();
-    maCommentTxt.Show();
-    maLocationTxt.Show();
-
-    setupLayout();
-}
-
-PrintDialog::JobTabPage::~JobTabPage()
-{
-}
-
-void PrintDialog::JobTabPage::setupLayout()
-{
-    // HACK: this is not a dropdown box, but the dropdown line count
-    // sets the results of GetOptimalSize in a normal ListBox
-    maPrinters.SetDropDownLineCount( 4 );
-
-    boost::shared_ptr<vcl::RowOrColumn> xLayout =
-        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
-
-    // add printer fixed line
-    xLayout->addWindow( &maPrinterFL );
-    // add print LB
-    xLayout->addWindow( &maPrinters, 3 );
-
-    // create a row for details button/text and properties button
-    boost::shared_ptr< vcl::RowOrColumn > xDetRow( new vcl::RowOrColumn( xLayout.get(), false ) );
-    xLayout->addChild( xDetRow );
-    xDetRow->addWindow( &maDetailsBtn );
-    xDetRow->addChild( new vcl::Spacer( xDetRow.get(), 2 ) );
-    xDetRow->addWindow( &maSetupButton );
-
-    // create an indent for details
-    boost::shared_ptr< vcl::Indenter > xIndent( new vcl::Indenter( xLayout.get() ) );
-    xLayout->addChild( xIndent );
-    // remember details controls
-    mxDetails = xIndent;
-    // create a column for the details
-    boost::shared_ptr< vcl::LabelColumn > xLabelCol( new vcl::LabelColumn( xIndent.get() ) );
-    xIndent->setChild( xLabelCol );
-    xLabelCol->addRow( &maStatusLabel, &maStatusTxt );
-    xLabelCol->addRow( &maLocationLabel, &maLocationTxt );
-    xLabelCol->addRow( &maCommentLabel, &maCommentTxt );
-
-    // add print range and copies columns
-    xLayout->addWindow( &maCopies );
-    boost::shared_ptr< vcl::RowOrColumn > xRangeRow( new vcl::RowOrColumn( xLayout.get(), false ) );
-    xLayout->addChild( xRangeRow );
-
-    // create print range and add to range row
-    mxPrintRange.reset( new vcl::RowOrColumn( xRangeRow.get() ) );
-    xRangeRow->addChild( mxPrintRange );
-    xRangeRow->addWindow( &maCopySpacer );
-
-    boost::shared_ptr< vcl::RowOrColumn > xCopyCollateCol( new vcl::RowOrColumn( xRangeRow.get() ) );
-    xRangeRow->addChild( xCopyCollateCol );
-
-    // add copies row to copy/collate column
-    boost::shared_ptr< vcl::LabeledElement > xCopiesRow( new vcl::LabeledElement( xCopyCollateCol.get(), 2 ) );
-    xCopyCollateCol->addChild( xCopiesRow );
-    xCopiesRow->setLabel( &maCopyCount );
-    xCopiesRow->setElement( &maCopyCountField );
-    boost::shared_ptr< vcl::LabeledElement > xCollateRow( new vcl::LabeledElement( xCopyCollateCol.get(), 2 ) );
-    xCopyCollateCol->addChild( xCollateRow );
-    xCollateRow->setLabel( &maCollateBox );
-    xCollateRow->setElement( &maCollateImage );
-    
-    // maDetailsBtn.SetStyle( maDetailsBtn.GetStyle() | (WB_SMALLSTYLE | WB_BEVELBUTTON) );
-    mxDetails->show( false, false );
-}
-
-void PrintDialog::JobTabPage::readFromSettings()
-{
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    rtl::OUString aValue;
-
-    aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                              rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CollateBox" ) ) );
-    if( aValue.equalsIgnoreAsciiCaseAscii( "alwaysoff" ) )
-    {
-        mnCollateUIMode = 1;
-        maCollateBox.Check( sal_False );
-        maCollateBox.Enable( sal_False );
-    }
-    else
-    {
-        mnCollateUIMode = 0;
-        aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                                  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ) );
-        maCollateBox.Check( aValue.equalsIgnoreAsciiCaseAscii( "true" ) );
-    }
-    Resize();
-}
-
-void PrintDialog::JobTabPage::storeToSettings()
-{
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CopyCount" ) ),
-                     maCopyCountField.GetText() );
-    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
-                     maCollateBox.IsChecked() ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true")) :
-                                                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")) );
-}
-
-PrintDialog::OutputOptPage::OutputOptPage( Window* i_pParent, const ResId& i_rResId )
-    : TabPage( i_pParent, i_rResId )
-    , maOptionsLine( this, VclResId( SV_PRINT_OPT_PRINT_FL ) )
-    , maToFileBox( this, VclResId( SV_PRINT_OPT_TOFILE ) )
-    , maCollateSingleJobsBox( this, VclResId( SV_PRINT_OPT_SINGLEJOBS ) )
-{
-    FreeResource();
-
-    setupLayout();
-}
-
-PrintDialog::OutputOptPage::~OutputOptPage()
-{
-}
-
-void PrintDialog::OutputOptPage::setupLayout()
-{
-    boost::shared_ptr<vcl::RowOrColumn> xLayout =
-        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
-
-    xLayout->addWindow( &maOptionsLine );
-    boost::shared_ptr<vcl::Indenter> xIndent( new vcl::Indenter( xLayout.get(), -1 ) );
-    xLayout->addChild( xIndent );
-    boost::shared_ptr<vcl::RowOrColumn> xCol( new vcl::RowOrColumn( xIndent.get() ) );
-    xIndent->setChild( xCol );
-    mxOptGroup = xCol;
-    xCol->addWindow( &maToFileBox );
-    xCol->addWindow( &maCollateSingleJobsBox );
-}
-
-void PrintDialog::OutputOptPage::readFromSettings()
-{
-}
-
-void PrintDialog::OutputOptPage::storeToSettings()
-{
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ToFile" ) ),
-                     maToFileBox.IsChecked() ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true"))
-                                             : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")) );
-}
-
-PrintDialog::PrintDialog( Window* i_pParent, const boost::shared_ptr<PrinterController>& i_rController )
-    : ModalDialog( i_pParent, VclResId( SV_DLG_PRINT ) )
-    , maOKButton( this, VclResId( SV_PRINT_OK ) )
-    , maCancelButton( this, VclResId( SV_PRINT_CANCEL ) )
-    , maHelpButton( this, VclResId( SV_PRINT_HELP ) )
-    , maPreviewWindow( this, VclResId( SV_PRINT_PAGE_PREVIEW ) )
-    , maPageEdit( this, VclResId( SV_PRINT_PAGE_EDIT ) )
-    , maNumPagesText( this, VclResId( SV_PRINT_PAGE_TXT ) )
-    , maBackwardBtn( this, VclResId( SV_PRINT_PAGE_BACKWARD ) )
-    , maForwardBtn( this, VclResId( SV_PRINT_PAGE_FORWARD ) )
-    , maTabCtrl( this, VclResId( SV_PRINT_TABCTRL ) )
-    , maNUpPage( &maTabCtrl, VclResId( SV_PRINT_TAB_NUP ) )
-    , maJobPage( &maTabCtrl, VclResId( SV_PRINT_TAB_JOB ) )
-    , maOptionsPage( &maTabCtrl, VclResId( SV_PRINT_TAB_OPT ) )
-    , maButtonLine( this, VclResId( SV_PRINT_BUTTONLINE ) )
-    , maPController( i_rController )
-    , maNoPageStr( String( VclResId( SV_PRINT_NOPAGES ) ) )
-    , mnCurPage( 0 )
-    , mnCachedPages( 0 )
-    , maPrintToFileText( String( VclResId( SV_PRINT_TOFILE_TXT ) ) )
-    , maDefPrtText( String( VclResId( SV_PRINT_DEFPRT_TXT ) ) )
-    , mbShowLayoutPage( sal_True )
-{
-    FreeResource();
-
-    // save printbutton text, gets exchanged occasionally with print to file
-    maPrintText = maOKButton.GetText();
-
-    // setup preview controls
-    maForwardBtn.SetStyle( maForwardBtn.GetStyle() | WB_BEVELBUTTON );
-    maBackwardBtn.SetStyle( maBackwardBtn.GetStyle() | WB_BEVELBUTTON );
-
-    // insert the job (general) tab page first
-    maTabCtrl.InsertPage( SV_PRINT_TAB_JOB, maJobPage.GetText() );
-    maTabCtrl.SetTabPage( SV_PRINT_TAB_JOB, &maJobPage );
-
-    // set symbols on forward and backward button
-    maBackwardBtn.SetSymbol( SYMBOL_PREV );
-    maForwardBtn.SetSymbol( SYMBOL_NEXT );
-    maBackwardBtn.ImplSetSmallSymbol( sal_True );
-    maForwardBtn.ImplSetSmallSymbol( sal_True );
-
-    maPageStr = maNumPagesText.GetText();
-
-    // init reverse print
-    maJobPage.maReverseOrderBox.Check( maPController->getReversePrint() );
-
-
-    // fill printer listbox
-    const std::vector< rtl::OUString >& rQueues( Printer::GetPrinterQueues() );
-    for( std::vector< rtl::OUString >::const_iterator it = rQueues.begin();
-         it != rQueues.end(); ++it )
-    {
-        maJobPage.maPrinters.InsertEntry( *it );
-    }
-    // select current printer
-    if( maJobPage.maPrinters.GetEntryPos( maPController->getPrinter()->GetName() ) != LISTBOX_ENTRY_NOTFOUND )
-    {
-        maJobPage.maPrinters.SelectEntry( maPController->getPrinter()->GetName() );
-    }
-    else
-    {
-        // fall back to last printer
-        SettingsConfigItem* pItem = SettingsConfigItem::get();
-        String aValue( pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                                        rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPrinter" ) ) ) );
-        if( maJobPage.maPrinters.GetEntryPos( aValue ) != LISTBOX_ENTRY_NOTFOUND )
-        {
-            maJobPage.maPrinters.SelectEntry( aValue );
-            maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( aValue ) ) );
-        }
-        else
-        {
-            // fall back to default printer
-            maJobPage.maPrinters.SelectEntry( Printer::GetDefaultPrinterName() );
-            maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( Printer::GetDefaultPrinterName() ) ) );
-        }
-    }
-    // not printing to file
-    maPController->resetPrinterOptions( false );
-    
-    // get the first page
-    preparePreview( true, true );
-    
-    // update the text fields for the printer
-    updatePrinterText();
-
-    // set a select handler
-    maJobPage.maPrinters.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-
-    // setup sizes for N-Up
-    Size aNupSize( maPController->getPrinter()->PixelToLogic(
-                         maPController->getPrinter()->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ) );
-    if( maPController->getPrinter()->GetOrientation() == ORIENTATION_LANDSCAPE )
-    {
-        maNupLandscapeSize = aNupSize;
-        maNupPortraitSize = Size( aNupSize.Height(), aNupSize.Width() );
-    }
-    else
-    {
-        maNupPortraitSize = aNupSize;
-        maNupLandscapeSize = Size( aNupSize.Height(), aNupSize.Width() );
-    }
-    maNUpPage.initFromMultiPageSetup( maPController->getMultipage() );
-
-
-    // setup click handler on the various buttons
-    maOKButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    #if OSL_DEBUG_LEVEL > 1
-    maCancelButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    #endif
-    maHelpButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maForwardBtn.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maBackwardBtn.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maJobPage.maCollateBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maJobPage.maSetupButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maJobPage.maDetailsBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maNUpPage.maBorderCB.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maOptionsPage.maToFileBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maJobPage.maReverseOrderBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maOptionsPage.maCollateSingleJobsBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maNUpPage.maPagesBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-
-    // setup modify hdl
-    maPageEdit.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maJobPage.maCopyCountField.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.maNupRowsEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.maNupColEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.maPageMarginEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.maSheetMarginEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-
-    // setup select hdl
-    maNUpPage.maNupPagesBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-    maNUpPage.maNupOrientationBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-    maNUpPage.maNupOrderBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-
-    // setup the layout
-    setupLayout();
-
-    // setup optional UI options set by application
-    setupOptionalUI();
-
-    // set change handler for UI options
-    maPController->setOptionChangeHdl( LINK( this, PrintDialog, UIOptionsChanged ) );
-
-    // set min size pixel to current size
-    Size aOutSize( GetOutputSizePixel() );
-    SetMinOutputSizePixel( aOutSize );
-
-    // if there is space enough, enlarge the preview so it gets roughly as
-    // high as the tab control
-    if( aOutSize.Width() < 768 )
-    {
-        Size aJobPageSize( getJobPageSize() );
-        Size aTabSize( maTabCtrl.GetSizePixel() );
-        if( aJobPageSize.Width() < 1 )
-            aJobPageSize.Width() = aTabSize.Width();
-        if( aJobPageSize.Height() < 1 )
-            aJobPageSize.Height() = aTabSize.Height();
-        long nOptPreviewWidth = aTabSize.Height() * aJobPageSize.Width() / aJobPageSize.Height();
-        // add space for borders
-        nOptPreviewWidth += 15;
-        if( aOutSize.Width() - aTabSize.Width() < nOptPreviewWidth )
-        {
-            aOutSize.Width() = aTabSize.Width() + nOptPreviewWidth;
-            if( aOutSize.Width() > 768 ) // don't enlarge the dialog too much
-                aOutSize.Width() = 768;
-            SetOutputSizePixel( aOutSize );
-        }
-    }
-
-    // append further tab pages
-    if( mbShowLayoutPage )
-    {
-        maTabCtrl.InsertPage( SV_PRINT_TAB_NUP, maNUpPage.GetText() );
-        maTabCtrl.SetTabPage( SV_PRINT_TAB_NUP, &maNUpPage );
-    }
-    maTabCtrl.InsertPage( SV_PRINT_TAB_OPT, maOptionsPage.GetText() );
-    maTabCtrl.SetTabPage( SV_PRINT_TAB_OPT, &maOptionsPage );
-
-    // restore settings from last run
-    readFromSettings();
-
-    // setup dependencies
-    checkControlDependencies();
-
-}
-
-PrintDialog::~PrintDialog()
-{
-    while( ! maControls.empty() )
-    {
-        delete maControls.front();
-        maControls.pop_front();
-    }
-}
-
-void PrintDialog::setupLayout()
-{
-    boost::shared_ptr<vcl::RowOrColumn> xLayout =
-        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
-    xLayout->setOuterBorder( 0 );
-    
-
-    boost::shared_ptr< vcl::RowOrColumn > xPreviewAndTab( new vcl::RowOrColumn( xLayout.get(), false ) );
-    size_t nIndex = xLayout->addChild( xPreviewAndTab, 5 );
-    xLayout->setBorders( nIndex, -1, -1, -1, 0 );
-
-    // setup column for preview and sub controls
-    boost::shared_ptr< vcl::RowOrColumn > xPreview( new vcl::RowOrColumn( xPreviewAndTab.get() ) );
-    xPreviewAndTab->addChild( xPreview, 5 );
-    xPreview->addWindow( &maPreviewWindow, 5 );
-    // get a row for the preview controls
-    mxPreviewCtrls.reset( new vcl::RowOrColumn( xPreview.get(), false ) );
-    nIndex = xPreview->addChild( mxPreviewCtrls );
-    boost::shared_ptr< vcl::Spacer > xSpacer( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
-    mxPreviewCtrls->addChild( xSpacer );
-    mxPreviewCtrls->addWindow( &maPageEdit );
-    mxPreviewCtrls->addWindow( &maNumPagesText );
-    xSpacer.reset( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
-    mxPreviewCtrls->addChild( xSpacer );
-    mxPreviewCtrls->addWindow( &maBackwardBtn );
-    mxPreviewCtrls->addWindow( &maForwardBtn );
-    xSpacer.reset( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
-    mxPreviewCtrls->addChild( xSpacer );
-
-    // continue with the tab ctrl
-    xPreviewAndTab->addWindow( &maTabCtrl );
-
-    // add the button line
-    xLayout->addWindow( &maButtonLine );
-
-    // add the row for the buttons
-    boost::shared_ptr< vcl::RowOrColumn > xButtons( new vcl::RowOrColumn( xLayout.get(), false ) );
-    nIndex = xLayout->addChild( xButtons );
-    xLayout->setBorders( nIndex, -1, 0, -1, -1 );
-
-    Size aMinSize( maCancelButton.GetSizePixel() );
-    // insert help button
-    xButtons->setMinimumSize( xButtons->addWindow( &maHelpButton ), aMinSize );
-    // insert a spacer, cancel and OK buttons are right aligned
-    xSpacer.reset( new vcl::Spacer( xButtons.get(), 2 ) );
-    xButtons->addChild( xSpacer );
-    xButtons->setMinimumSize( xButtons->addWindow( &maOKButton ), aMinSize );
-    xButtons->setMinimumSize( xButtons->addWindow( &maCancelButton ), aMinSize );
-}
-
-void PrintDialog::readFromSettings()
-{
-    maJobPage.readFromSettings();
-    maNUpPage.readFromSettings();
-    maOptionsPage.readFromSettings();
-
-    // read last selected tab page; if it exists, actiavte it
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    rtl::OUString aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                                            rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPage" ) ) );
-    sal_uInt16 nCount = maTabCtrl.GetPageCount();
-    for( sal_uInt16 i = 0; i < nCount; i++ )
-    {
-        sal_uInt16 nPageId = maTabCtrl.GetPageId( i );
-        if( aValue.equals( maTabCtrl.GetPageText( nPageId ) ) )
-        {
-            maTabCtrl.SelectTabPage( nPageId );
-            break;
-        }
-    }
-    maOKButton.SetText( maOptionsPage.maToFileBox.IsChecked() ? maPrintToFileText : maPrintText );
-    if( maOptionsPage.maToFileBox.IsChecked() )
-    {
-        maPController->resetPrinterOptions( true );
-        preparePreview( true, true );
-    }
-}
-
-void PrintDialog::storeToSettings()
-{
-    maJobPage.storeToSettings();
-    maNUpPage.storeToSettings();
-    maOptionsPage.storeToSettings();
-
-    // store last selected printer
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPrinter" ) ),
-                     maJobPage.maPrinters.GetSelectEntry() );
-
-    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
-                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPage" ) ),
-                     maTabCtrl.GetPageText( maTabCtrl.GetCurPageId() ) );
-    pItem->Commit();
-}
-
-bool PrintDialog::isPrintToFile()
-{
-    return maOptionsPage.maToFileBox.IsChecked();
-}
-
-int PrintDialog::getCopyCount()
-{
-    return static_cast<int>(maJobPage.maCopyCountField.GetValue());
-}
-
-bool PrintDialog::isCollate()
-{
-    return maJobPage.maCopyCountField.GetValue() > 1 ? maJobPage.maCollateBox.IsChecked() : sal_False;
-}
-
-bool PrintDialog::isSingleJobs()
-{
-    return maOptionsPage.maCollateSingleJobsBox.IsChecked();
-}
-
-void setHelpId( Window* i_pWindow, const Sequence< rtl::OUString >& i_rHelpIds, sal_Int32 i_nIndex )
-{
-    if( i_nIndex >= 0 && i_nIndex < i_rHelpIds.getLength() )
-        i_pWindow->SetHelpId( rtl::OUStringToOString( i_rHelpIds.getConstArray()[i_nIndex], RTL_TEXTENCODING_UTF8 ) );
-}
-
-static void setHelpText( Window* i_pWindow, const Sequence< rtl::OUString >& i_rHelpTexts, sal_Int32 i_nIndex )
-{
-    // without a help text set and the correct smartID,
-    // help texts will be retrieved from the online help system
-    if( i_nIndex >= 0 && i_nIndex < i_rHelpTexts.getLength() )
-        i_pWindow->SetHelpText( i_rHelpTexts.getConstArray()[i_nIndex] );
-}
-
-void updateMaxSize( const Size& i_rCheckSize, Size& o_rMaxSize )
-{
-    if( i_rCheckSize.Width() > o_rMaxSize.Width() )
-        o_rMaxSize.Width() = i_rCheckSize.Width();
-    if( i_rCheckSize.Height() > o_rMaxSize.Height() )
-        o_rMaxSize.Height() = i_rCheckSize.Height();
-}
-
-void PrintDialog::setupOptionalUI()
-{
-    std::vector< boost::shared_ptr<vcl::RowOrColumn> > aDynamicColumns;
-    boost::shared_ptr< vcl::RowOrColumn > pCurColumn;
-
-    Window* pCurParent = 0, *pDynamicPageParent = 0;
-    sal_uInt16 nOptPageId = 9;
-    bool bOnStaticPage = false;
-    bool bSubgroupOnStaticPage = false;
-
-    std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> > aPropertyToDependencyRowMap;
-
-    const Sequence< PropertyValue >& rOptions( maPController->getUIOptions() );
-    for( int i = 0; i < rOptions.getLength(); i++ )
-    {
-        Sequence< beans::PropertyValue > aOptProp;
-        rOptions[i].Value >>= aOptProp;
-
-        // extract ui element
-        rtl::OUString aCtrlType;
-        rtl::OUString aText;
-        rtl::OUString aPropertyName;
-        Sequence< rtl::OUString > aChoices;
-        Sequence< sal_Bool > aChoicesDisabled;
-        Sequence< rtl::OUString > aHelpTexts;
-        Sequence< rtl::OUString > aHelpIds;
-        sal_Int64 nMinValue = 0, nMaxValue = 0;
-        sal_Int32 nCurHelpText = 0;
-        rtl::OUString aGroupingHint;
-        rtl::OUString aDependsOnName;
-        sal_Int32 nDependsOnValue = 0;
-        sal_Bool bUseDependencyRow = sal_False;
-
-        for( int n = 0; n < aOptProp.getLength(); n++ )
-        {
-            const beans::PropertyValue& rEntry( aOptProp[ n ] );
-            if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Text" ) ) )
-            {
-                rEntry.Value >>= aText;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ControlType" ) ) )
-            {
-                rEntry.Value >>= aCtrlType;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Choices" ) ) )
-            {
-                rEntry.Value >>= aChoices;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ChoicesDisabled" ) ) )
-            {
-                rEntry.Value >>= aChoicesDisabled;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Property" ) ) )
-            {
-                PropertyValue aVal;
-                rEntry.Value >>= aVal;
-                aPropertyName = aVal.Name;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Enabled" ) ) )
-            {
-                sal_Bool bValue = sal_True;
-                rEntry.Value >>= bValue;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GroupingHint" ) ) )
-            {
-                rEntry.Value >>= aGroupingHint;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DependsOnName" ) ) )
-            {
-                rEntry.Value >>= aDependsOnName;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DependsOnEntry" ) ) )
-            {
-                rEntry.Value >>= nDependsOnValue;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "AttachToDependency" ) ) )
-            {
-                rEntry.Value >>= bUseDependencyRow;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MinValue" ) ) )
-            {
-                rEntry.Value >>= nMinValue;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MaxValue" ) ) )
-            {
-                rEntry.Value >>= nMaxValue;
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HelpText" ) ) )
-            {
-                if( ! (rEntry.Value >>= aHelpTexts) )
-                {
-                    rtl::OUString aHelpText;
-                    if( (rEntry.Value >>= aHelpText) )
-                    {
-                        aHelpTexts.realloc( 1 );
-                        *aHelpTexts.getArray() = aHelpText;
-                    }
-                }
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HelpId" ) ) )
-            {
-                if( ! (rEntry.Value >>= aHelpIds ) )
-                {
-                    rtl::OUString aHelpId;
-                    if( (rEntry.Value >>= aHelpId) )
-                    {
-                        aHelpIds.realloc( 1 );
-                        *aHelpIds.getArray() = aHelpId;
-                    }
-                }
-            }
-            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HintNoLayoutPage" ) ) )
-            {
-                sal_Bool bNoLayoutPage = sal_False;
-                rEntry.Value >>= bNoLayoutPage;
-                mbShowLayoutPage = ! bNoLayoutPage;
-            }
-        }
-
-        // bUseDependencyRow should only be true if a dependency exists
-        bUseDependencyRow = bUseDependencyRow && (aDependsOnName.getLength() != 0);
-
-        // is it necessary to switch between static and dynamic pages ?
-        bool bSwitchPage = false;
-        if( aGroupingHint.getLength() )
-            bSwitchPage = true;
-        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Subgroup" ) ) || (bOnStaticPage && ! bSubgroupOnStaticPage )  )
-            bSwitchPage = true;
-        if( bSwitchPage )
-        {
-            // restore to dynamic
-            pCurParent = pDynamicPageParent;
-            if( ! aDynamicColumns.empty() )
-                pCurColumn = aDynamicColumns.back();
-            else
-                pCurColumn.reset();
-            bOnStaticPage = false;
-            bSubgroupOnStaticPage = false;
-
-            if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) )
-            {
-                pCurColumn = maJobPage.mxPrintRange;
-                pCurParent = &maJobPage;            // set job page as current parent
-                bOnStaticPage = true;
-            }
-            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OptionsPage" ) ) )
-            {
-                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maOptionsPage.getLayout());
-                pCurParent = &maOptionsPage;        // set options page as current parent
-                bOnStaticPage = true;
-            }
-            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OptionsPageOptGroup" ) ) )
-            {
-                pCurColumn = maOptionsPage.mxOptGroup;
-                pCurParent = &maOptionsPage;        // set options page as current parent
-                bOnStaticPage = true;
-            }
-            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LayoutPage" ) ) )
-            {
-                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maNUpPage.getLayout());
-                pCurParent = &maNUpPage;            // set layout page as current parent
-                bOnStaticPage = true;
-            }
-            else if( aGroupingHint.getLength() )
-            {
-                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maJobPage.getLayout());
-                pCurParent = &maJobPage;            // set job page as current parent
-                bOnStaticPage = true;
-            }
-        }
-
-        if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Group" ) ) ||
-            ( ! pCurParent && ! (bOnStaticPage || aGroupingHint.getLength() ) ) )
-        {
-            // add new tab page
-            TabPage* pNewGroup = new TabPage( &maTabCtrl );
-            maControls.push_front( pNewGroup );
-            pDynamicPageParent = pCurParent = pNewGroup;
-            pNewGroup->SetText( aText );
-            maTabCtrl.InsertPage( ++nOptPageId, aText );
-            maTabCtrl.SetTabPage( nOptPageId, pNewGroup );
-
-            // set help id
-            setHelpId( pNewGroup, aHelpIds, 0 );
-            // set help text
-            setHelpText( pNewGroup, aHelpTexts, 0 );
-
-            aDynamicColumns.push_back( boost::dynamic_pointer_cast<vcl::RowOrColumn>(pNewGroup->getLayout()) );
-            pCurColumn = aDynamicColumns.back();
-            pCurColumn->setParentWindow( pNewGroup );
-            bSubgroupOnStaticPage = false;
-            bOnStaticPage = false;
-        }
-        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Subgroup" ) ) && (pCurParent || aGroupingHint.getLength() ) )
-        {
-            bSubgroupOnStaticPage = (aGroupingHint.getLength() != 0);
-            // create group FixedLine
-            if( ! aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) ||
-                ! pCurColumn->countElements() == 0
-               )
-            {
-                Window* pNewSub = NULL;
-                if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) )
-                    pNewSub = new FixedText( pCurParent, WB_VCENTER );
-                else
-                    pNewSub = new FixedLine( pCurParent );
-                maControls.push_front( pNewSub );
-                pNewSub->SetText( aText );
-                pNewSub->Show();
-
-                // set help id
-                setHelpId( pNewSub, aHelpIds, 0 );
-                // set help text
-                setHelpText( pNewSub, aHelpTexts, 0 );
-                // add group to current column
-                pCurColumn->addWindow( pNewSub );
-            }
-
-            // add an indent to the current column
-            vcl::Indenter* pIndent = new vcl::Indenter( pCurColumn.get(), -1 );
-            pCurColumn->addChild( pIndent );
-            // and create a column inside the indent
-            pCurColumn.reset( new vcl::RowOrColumn( pIndent ) );
-            pIndent->setChild( pCurColumn );
-        }
-        // EVIL
-        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bool" ) ) &&
-                 aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LayoutPage" ) ) &&
-                 aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintProspect" ) )
-                 )
-        {
-            maNUpPage.maBrochureBtn.SetText( aText );
-            maNUpPage.maBrochureBtn.Show();
-            setHelpText( &maNUpPage.maBrochureBtn, aHelpTexts, 0 );
-
-            sal_Bool bVal = sal_False;
-            PropertyValue* pVal = maPController->getValue( aPropertyName );
-            if( pVal )
-                pVal->Value >>= bVal;
-            maNUpPage.maBrochureBtn.Check( bVal );
-            maNUpPage.maBrochureBtn.Enable( maPController->isUIOptionEnabled( aPropertyName ) && pVal != NULL );
-            maNUpPage.maBrochureBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
-
-            maPropertyToWindowMap[ aPropertyName ].push_back( &maNUpPage.maBrochureBtn );
-            maControlToPropertyMap[&maNUpPage.maBrochureBtn] = aPropertyName;
-
-            aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, maNUpPage.mxBrochureDep ) );
-        }
-        else
-        {
-            boost::shared_ptr<vcl::RowOrColumn> pSaveCurColumn( pCurColumn );
-
-            if( bUseDependencyRow )
-            {
-                // find the correct dependency row (if any)
-                std::pair< std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >::iterator,
-                           std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >::iterator > aDepRange;
-                aDepRange = aPropertyToDependencyRowMap.equal_range( aDependsOnName );
-                if( aDepRange.first != aDepRange.second )
-                {
-                    while( nDependsOnValue && aDepRange.first != aDepRange.second )
-                    {
-                        nDependsOnValue--;
-                        ++aDepRange.first;
-                    }
-                    if( aDepRange.first != aPropertyToDependencyRowMap.end() )
-                    {
-                        pCurColumn = aDepRange.first->second;
-                        maReverseDependencySet.insert( aPropertyName );
-                    }
-                }
-            }
-            if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bool" ) ) && pCurParent )
-            {
-                // add a check box
-                CheckBox* pNewBox = new CheckBox( pCurParent );
-                maControls.push_front( pNewBox );
-                pNewBox->SetText( aText );
-                pNewBox->Show();
-
-                sal_Bool bVal = sal_False;
-                PropertyValue* pVal = maPController->getValue( aPropertyName );
-                if( pVal )
-                    pVal->Value >>= bVal;
-                pNewBox->Check( bVal );
-                pNewBox->SetToggleHdl( LINK( this, PrintDialog, UIOption_CheckHdl ) );
-
-                maPropertyToWindowMap[ aPropertyName ].push_back( pNewBox );
-                maControlToPropertyMap[pNewBox] = aPropertyName;
-
-                // set help id
-                setHelpId( pNewBox, aHelpIds, 0 );
-                // set help text
-                setHelpText( pNewBox, aHelpTexts, 0 );
-
-                boost::shared_ptr<vcl::RowOrColumn> pDependencyRow( new vcl::RowOrColumn( pCurColumn.get(), false ) );
-                pCurColumn->addChild( pDependencyRow );
-                aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pDependencyRow ) );
-
-                // add checkbox to current column
-                pDependencyRow->addWindow( pNewBox );
-            }
-            else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Radio" ) ) && pCurParent )
-            {
-                boost::shared_ptr<vcl::RowOrColumn> pRadioColumn( pCurColumn );
-                if( aText.getLength() )
-                {
-                    // add a FixedText:
-                    FixedText* pHeading = new FixedText( pCurParent );
-                    maControls.push_front( pHeading );
-                    pHeading->SetText( aText );
-                    pHeading->Show();
-
-                    // set help id
-                    setHelpId( pHeading, aHelpIds, nCurHelpText );
-                    // set help text
-                    setHelpText( pHeading, aHelpTexts, nCurHelpText );
-                    nCurHelpText++;
-                    // add fixed text to current column
-                    pCurColumn->addWindow( pHeading );
-                    // add an indent to the current column
-                    vcl::Indenter* pIndent = new vcl::Indenter( pCurColumn.get(), 15 );
-                    pCurColumn->addChild( pIndent );
-                    // and create a column inside the indent
-                    pRadioColumn.reset( new vcl::RowOrColumn( pIndent ) );
-                    pIndent->setChild( pRadioColumn );
-                }
-                // iterate options
-                sal_Int32 nSelectVal = 0;
-                PropertyValue* pVal = maPController->getValue( aPropertyName );
-                if( pVal && pVal->Value.hasValue() )
-                    pVal->Value >>= nSelectVal;
-                for( sal_Int32 m = 0; m < aChoices.getLength(); m++ )
-                {
-                    boost::shared_ptr<vcl::LabeledElement> pLabel( new vcl::LabeledElement( pRadioColumn.get(), 1 ) );
-                    pRadioColumn->addChild( pLabel );
-                    boost::shared_ptr<vcl::RowOrColumn> pDependencyRow( new vcl::RowOrColumn( pLabel.get(), false ) );
-                    pLabel->setElement( pDependencyRow );
-                    aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pDependencyRow ) );
-
-                    RadioButton* pBtn = new RadioButton( pCurParent, m == 0 ? WB_GROUP : 0 );
-                    maControls.push_front( pBtn );
-                    pBtn->SetText( aChoices[m] );
-                    pBtn->Check( m == nSelectVal );
-                    pBtn->SetToggleHdl( LINK( this, PrintDialog, UIOption_RadioHdl ) );
-                    if( aChoicesDisabled.getLength() > m && aChoicesDisabled[m] == sal_True )
-                        pBtn->Enable( sal_False );
-                    pBtn->Show();
-                    maPropertyToWindowMap[ aPropertyName ].push_back( pBtn );
-                    maControlToPropertyMap[pBtn] = aPropertyName;
-                    maControlToNumValMap[pBtn] = m;
-
-                    // set help id
-                    setHelpId( pBtn, aHelpIds, nCurHelpText );
-                    // set help text
-                    setHelpText( pBtn, aHelpTexts, nCurHelpText );
-                    nCurHelpText++;
-                    // add the radio button to the column
-                    pLabel->setLabel( pBtn );
-                }
-            }
-            else if( ( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "List" ) )   ||
-                       aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Range" ) )  ||
-                       aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Edit" ) )
-                     ) && pCurParent )
-            {
-                // create a row in the current column
-                boost::shared_ptr<vcl::RowOrColumn> pFieldColumn( new vcl::RowOrColumn( pCurColumn.get(), false ) );
-                pCurColumn->addChild( pFieldColumn );
-                aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pFieldColumn ) );
-
-                vcl::LabeledElement* pLabel = NULL;
-                if( aText.getLength() )
-                {
-                    // add a FixedText:
-                    FixedText* pHeading = new FixedText( pCurParent, WB_VCENTER );
-                    maControls.push_front( pHeading );
-                    pHeading->SetText( aText );
-                    pHeading->Show();
-
-
-                    // add to row
-                    pLabel = new vcl::LabeledElement( pFieldColumn.get(), 2 );
-                    pFieldColumn->addChild( pLabel );
-                    pLabel->setLabel( pHeading );
-                }
-
-                if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "List" ) ) )
-                {
-                    ListBox* pList = new ListBox( pCurParent, WB_DROPDOWN | WB_BORDER );
-                    maControls.push_front( pList );
-
-                    // iterate options
-                    for( sal_Int32 m = 0; m < aChoices.getLength(); m++ )
-                    {
-                        pList->InsertEntry( aChoices[m] );
-                    }
-                    sal_Int32 nSelectVal = 0;
-                    PropertyValue* pVal = maPController->getValue( aPropertyName );
-                    if( pVal && pVal->Value.hasValue() )
-                        pVal->Value >>= nSelectVal;
-                    pList->SelectEntryPos( static_cast<sal_uInt16>(nSelectVal) );
-                    pList->SetSelectHdl( LINK( this, PrintDialog, UIOption_SelectHdl ) );
-                    pList->SetDropDownLineCount( static_cast<sal_uInt16>(aChoices.getLength()) );
-                    pList->Show();
-
-                    // set help id
-                    setHelpId( pList, aHelpIds, 0 );
-                    // set help text
-                    setHelpText( pList, aHelpTexts, 0 );
-
-                    maPropertyToWindowMap[ aPropertyName ].push_back( pList );
-                    maControlToPropertyMap[pList] = aPropertyName;
-
-                    // finish the pair
-                    if( pLabel )
-                        pLabel->setElement( pList );
-                    else
-                        pFieldColumn->addWindow( pList );
-                }
-                else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Range" ) ) )
-                {
-                    NumericField* pField = new NumericField( pCurParent, WB_BORDER | WB_SPIN );
-                    maControls.push_front( pField );
-
-                    // set min/max and current value
-                    if( nMinValue != nMaxValue )
-                    {
-                        pField->SetMin( nMinValue );
-                        pField->SetMax( nMaxValue );
-                    }
-                    sal_Int64 nCurVal = 0;
-                    PropertyValue* pVal = maPController->getValue( aPropertyName );
-                    if( pVal && pVal->Value.hasValue() )
-                        pVal->Value >>= nCurVal;
-                    pField->SetValue( nCurVal );
-                    pField->SetModifyHdl( LINK( this, PrintDialog, UIOption_ModifyHdl ) );
-                    pField->Show();
-
-                    // set help id
-                    setHelpId( pField, aHelpIds, 0 );
-                    // set help text
-                    setHelpText( pField, aHelpTexts, 0 );
-
-                    maPropertyToWindowMap[ aPropertyName ].push_back( pField );
-                    maControlToPropertyMap[pField] = aPropertyName;
-
-                    // add to row
-                    if( pLabel )
-                        pLabel->setElement( pField );
-                    else
-                        pFieldColumn->addWindow( pField );
-                }
-                else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Edit" ) ) )
-                {
-                    Edit* pField = new Edit( pCurParent, WB_BORDER );
-                    maControls.push_front( pField );
-
-                    rtl::OUString aCurVal;
-                    PropertyValue* pVal = maPController->getValue( aPropertyName );
-                    if( pVal && pVal->Value.hasValue() )
-                        pVal->Value >>= aCurVal;
-                    pField->SetText( aCurVal );
-                    pField->SetModifyHdl( LINK( this, PrintDialog, UIOption_ModifyHdl ) );
-                    pField->Show();
-
-                    // set help id
-                    setHelpId( pField, aHelpIds, 0 );
-                    // set help text
-                    setHelpText( pField, aHelpTexts, 0 );
-
-                    maPropertyToWindowMap[ aPropertyName ].push_back( pField );
-                    maControlToPropertyMap[pField] = aPropertyName;
-
-                    // add to row
-                    if( pLabel )
-                        pLabel->setElement( pField );
-                    else
-                        pFieldColumn->addWindow( pField, 2 );
-                }
-            }
-            else
-            {
-                OSL_FAIL( "Unsupported UI option" );
-            }
-
-            pCurColumn = pSaveCurColumn;
-        }
-    }
-
-    // #i106506# if no brochure button, then the singular Pages radio button
-    // makes no sense, so replace it by a FixedText label
-    if( ! maNUpPage.maBrochureBtn.IsVisible() )
-    {
-        if( maNUpPage.mxPagesBtnLabel.get() )
-        {
-            maNUpPage.maPagesBoxTitleTxt.SetText( maNUpPage.maPagesBtn.GetText() );
-            maNUpPage.maPagesBoxTitleTxt.Show( sal_True );
-            maNUpPage.mxPagesBtnLabel->setLabel( &maNUpPage.maPagesBoxTitleTxt );
-            maNUpPage.maPagesBtn.Show( sal_False );
-        }
-    }
-
-    // update enable states
-    checkOptionalControlDependencies();
-
-    // print range empty (currently math only) -> hide print range and spacer line
-    if( maJobPage.mxPrintRange->countElements() == 0 )
-    {
-        maJobPage.mxPrintRange->show( false, false );
-        maJobPage.maCopySpacer.Show( sal_False );
-        maJobPage.maReverseOrderBox.Show( sal_False );
-    }
-    else
-    {
-        // add an indent to the current column
-        vcl::Indenter* pIndent = new vcl::Indenter( maJobPage.mxPrintRange.get(), -1 );
-        maJobPage.mxPrintRange->addChild( pIndent );
-        // and create a column inside the indent
-        pIndent->setWindow( &maJobPage.maReverseOrderBox );
-        maJobPage.maReverseOrderBox.Show( sal_True );
-    }
-
-#ifdef WNT
-    // FIXME: the GetNativeControlRegion call on Windows has some issues
-    // (which skew the results of GetOptimalSize())
-    // however fixing this thoroughly needs to take interaction with paint into
-    // account, making the right fix less simple. Fix this the right way
-    // at some point. For now simply add some space at the lowest element
-    size_t nIndex = maJobPage.getLayout()->countElements();
-    if( nIndex > 0 ) // sanity check
-        maJobPage.getLayout()->setBorders( nIndex-1, 0, 0, 0, -1 );
-#endif
-
-    // create auto mnemomnics now so they can be calculated in layout
-    ImplWindowAutoMnemonic( &maJobPage );
-    ImplWindowAutoMnemonic( &maNUpPage );
-    ImplWindowAutoMnemonic( &maOptionsPage );
-    ImplWindowAutoMnemonic( this );
-
-    // calculate job page
-    Size aMaxSize = maJobPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED );
-    // and layout page
-    updateMaxSize( maNUpPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ), aMaxSize );
-    // and options page
-    updateMaxSize( maOptionsPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ), aMaxSize );
-
-    for( std::vector< boost::shared_ptr<vcl::RowOrColumn> >::iterator it = aDynamicColumns.begin();
-         it != aDynamicColumns.end(); ++it )
-    {
-        Size aPageSize( (*it)->getOptimalSize( WINDOWSIZE_PREFERRED ) );
-        updateMaxSize( aPageSize, aMaxSize );
-    }
-
-    // resize dialog if necessary
-    Size aTabSize = maTabCtrl.GetTabPageSizePixel();
-    maTabCtrl.SetMinimumSizePixel( maTabCtrl.GetSizePixel() );
-    if( aMaxSize.Height() > aTabSize.Height() || aMaxSize.Width() > aTabSize.Width() )
-    {
-        Size aCurSize( GetOutputSizePixel() );
-        if( aMaxSize.Height() > aTabSize.Height() )
-        {
-            aCurSize.Height() += aMaxSize.Height() - aTabSize.Height();
-            aTabSize.Height() = aMaxSize.Height();
-        }
-        if( aMaxSize.Width() > aTabSize.Width() )
-        {
-            aCurSize.Width() += aMaxSize.Width() - aTabSize.Width();
-            // and the tab ctrl needs more space, too
-            aTabSize.Width() = aMaxSize.Width();
-        }
-        maTabCtrl.SetTabPageSizePixel( aTabSize );
-        maTabCtrl.SetMinimumSizePixel( maTabCtrl.GetSizePixel() );
-    }
-
-    Size aSz = getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED );
-
-    SetOutputSizePixel( aSz );
-}
-
-void PrintDialog::DataChanged( const DataChangedEvent& i_rDCEvt )
-{
-    // react on settings changed
-    if( i_rDCEvt.GetType() == DATACHANGED_SETTINGS )
-        checkControlDependencies();
-    ModalDialog::DataChanged( i_rDCEvt );
-}
-
-void PrintDialog::checkControlDependencies()
-{
-    if( maJobPage.maCopyCountField.GetValue() > 1 )
-        maJobPage.maCollateBox.Enable( maJobPage.mnCollateUIMode == 0 );
-    else
-        maJobPage.maCollateBox.Enable( sal_False );
-
-    Image aImg( maJobPage.maCollateBox.IsChecked() ? maJobPage.maCollateImg : maJobPage.maNoCollateImg );
-
-    Size aImgSize( aImg.GetSizePixel() );
-
-    // adjust size of image
-    maJobPage.maCollateImage.SetSizePixel( aImgSize );
-    maJobPage.maCollateImage.SetImage( aImg );
-    maJobPage.getLayout()->resize();
-
-    // enable setup button only for printers that can be setup
-    bool bHaveSetup = maPController->getPrinter()->HasSupport( SUPPORT_SETUPDIALOG );
-    maJobPage.maSetupButton.Enable( bHaveSetup );
-    if( bHaveSetup )
-    {
-        if( ! maJobPage.maSetupButton.IsVisible() )
-        {
-            Point aPrinterPos( maJobPage.maPrinters.GetPosPixel() );
-            Point aSetupPos( maJobPage.maSetupButton.GetPosPixel() );
-            Size aPrinterSize( maJobPage.maPrinters.GetSizePixel() );
-            aPrinterSize.Width() = aSetupPos.X() - aPrinterPos.X() - LogicToPixel( Size( 5, 5 ), MapMode( MAP_APPFONT ) ).Width();
-            maJobPage.maPrinters.SetSizePixel( aPrinterSize );
-            maJobPage.maSetupButton.Show();
-            getLayout()->resize();
-        }
-    }
-    else
-    {
-        if( maJobPage.maSetupButton.IsVisible() )
-        {
-            Point aPrinterPos( maJobPage.maPrinters.GetPosPixel() );
-            Point aSetupPos( maJobPage.maSetupButton.GetPosPixel() );
-            Size aPrinterSize( maJobPage.maPrinters.GetSizePixel() );
-            Size aSetupSize( maJobPage.maSetupButton.GetSizePixel() );
-            aPrinterSize.Width() = aSetupPos.X() + aSetupSize.Width() - aPrinterPos.X();
-            maJobPage.maPrinters.SetSizePixel( aPrinterSize );
-            maJobPage.maSetupButton.Hide();
-            getLayout()->resize();
-        }
-    }
-}
-
-void PrintDialog::checkOptionalControlDependencies()
-{
-    for( std::map< Window*, rtl::OUString >::iterator it = maControlToPropertyMap.begin();
-         it != maControlToPropertyMap.end(); ++it )
-    {
-        bool bShouldbeEnabled = maPController->isUIOptionEnabled( it->second );
-        if( ! bShouldbeEnabled )
-        {
-            // enable controls that are directly attached to a dependency anyway
-            // if the normally disabled controls get modified, change the dependency
-            // so the control would be enabled
-            // example: in print range "Print All" is selected, "Page Range" is then of course
-            // not selected and the Edit for the Page Range would be disabled
-            // as a convenience we should enable the Edit anyway and automatically select
-            // "Page Range" instead of "Print All" if the Edit gets modified
-            if( maReverseDependencySet.find( it->second ) != maReverseDependencySet.end() )
-            {
-                rtl::OUString aDep( maPController->getDependency( it->second ) );
-                // if the dependency is at least enabled, then enable this control anyway
-                if( aDep.getLength() && maPController->isUIOptionEnabled( aDep ) )
-                    bShouldbeEnabled = true;
-            }
-        }
-
-        if( bShouldbeEnabled && dynamic_cast<RadioButton*>(it->first) )
-        {
-            std::map< Window*, sal_Int32 >::const_iterator r_it = maControlToNumValMap.find( it->first );
-            if( r_it != maControlToNumValMap.end() )
-            {
-                bShouldbeEnabled = maPController->isUIChoiceEnabled( it->second, r_it->second );
-            }
-        }
-
-        
-        bool bIsEnabled = it->first->IsEnabled();
-        // Enable does not do a change check first, so can be less cheap than expected
-        if( bShouldbeEnabled != bIsEnabled )
-            it->first->Enable( bShouldbeEnabled );
-    }
-}
-
-static rtl::OUString searchAndReplace( const rtl::OUString& i_rOrig, const char* i_pRepl, sal_Int32 i_nReplLen, const rtl::OUString& i_rRepl )
-{
-    sal_Int32 nPos = i_rOrig.indexOfAsciiL( i_pRepl, i_nReplLen );
-    if( nPos != -1 )
-    {
-        rtl::OUStringBuffer aBuf( i_rOrig.getLength() );
-        aBuf.append( i_rOrig.getStr(), nPos );
-        aBuf.append( i_rRepl );
-        if( nPos + i_nReplLen < i_rOrig.getLength() )
-            aBuf.append( i_rOrig.getStr() + nPos + i_nReplLen );
-        return aBuf.makeStringAndClear();
-    }
-    return i_rOrig;
-}
-
-void PrintDialog::updatePrinterText()
-{
-    String aDefPrt( Printer::GetDefaultPrinterName() );
-    const QueueInfo* pInfo = Printer::GetQueueInfo( maJobPage.maPrinters.GetSelectEntry(), true );
-    if( pInfo )
-    {
-        maJobPage.maLocationTxt.SetText( pInfo->GetLocation() );
-        maJobPage.maCommentTxt.SetText( pInfo->GetComment() );
-        // FIXME: status text
-        rtl::OUString aStatus;
-        if( aDefPrt == pInfo->GetPrinterName() )
-            aStatus = maDefPrtText;
-        maJobPage.maStatusTxt.SetText( aStatus );
-    }
-    else
-    {
-        maJobPage.maLocationTxt.SetText( String() );
-        maJobPage.maCommentTxt.SetText( String() );
-        maJobPage.maStatusTxt.SetText( String() );
-    }
-}
-
-void PrintDialog::setPreviewText( sal_Int32 )
-{
-    rtl::OUString aNewText( searchAndReplace( maPageStr, "%n", 2, rtl::OUString::valueOf( mnCachedPages )  ) );
-    maNumPagesText.SetText( aNewText );
-
-    // if layout is already established the refresh layout of
-    // preview controls since text length may have changes
-    if( mxPreviewCtrls.get() )
-        mxPreviewCtrls->setManagedArea( mxPreviewCtrls->getManagedArea() );
-}
-
-void PrintDialog::preparePreview( bool i_bNewPage, bool i_bMayUseCache )
-{
-    // page range may have changed depending on options
-    sal_Int32 nPages = maPController->getFilteredPageCount();
-    mnCachedPages = nPages;
-
-    if( mnCurPage >= nPages )
-        mnCurPage = nPages-1;
-    if( mnCurPage < 0 )
-        mnCurPage = 0;
-
-    setPreviewText( mnCurPage );
-
-    maPageEdit.SetMin( 1 );
-    maPageEdit.SetMax( nPages );
-
-    if( i_bNewPage )
-    {
-        const MapMode aMapMode( MAP_100TH_MM );
-        GDIMetaFile aMtf;
-        boost::shared_ptr<Printer> aPrt( maPController->getPrinter() );
-        if( nPages > 0 )
-        {
-            PrinterController::PageSize aPageSize =
-                maPController->getFilteredPageFile( mnCurPage, aMtf, i_bMayUseCache );
-            if( ! aPageSize.bFullPaper )
-            {
-                Point aOff( aPrt->PixelToLogic( aPrt->GetPageOffsetPixel(), aMapMode ) );
-                aMtf.Move( aOff.X(), aOff.Y() );
-            }
-        }
-
-        Size aCurPageSize = aPrt->PixelToLogic( aPrt->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) );
-        maPreviewWindow.setPreview( aMtf, aCurPageSize,
-                                    aPrt->GetPaperName( false ),
-                                    nPages > 0 ? rtl::OUString() : maNoPageStr,
-                                    aPrt->ImplGetDPIX(), aPrt->ImplGetDPIY(),
-                                    aPrt->GetPrinterOptions().IsConvertToGreyscales()
-                                   );
-
-        maForwardBtn.Enable( mnCurPage < nPages-1 );
-        maBackwardBtn.Enable( mnCurPage != 0 );
-        maPageEdit.Enable( nPages > 1 );
-    }
-}
-
-Size PrintDialog::getJobPageSize()
-{
-    if( maFirstPageSize.Width() == 0 && maFirstPageSize.Height() == 0)
-    {
-        maFirstPageSize = maNupPortraitSize;
-        GDIMetaFile aMtf;
-        if( maPController->getPageCountProtected() > 0 )
-        {
-            PrinterController::PageSize aPageSize = maPController->getPageFile( 0, aMtf, true );
-            maFirstPageSize = aPageSize.aSize;
-        }
-    }
-    return maFirstPageSize;
-}
-
-void PrintDialog::updateNupFromPages()
-{
-    long nPages = long(maNUpPage.maNupPagesBox.GetEntryData(maNUpPage.maNupPagesBox.GetSelectEntryPos()));
-    int nRows   = int(maNUpPage.maNupRowsEdt.GetValue());
-    int nCols   = int(maNUpPage.maNupColEdt.GetValue());
-    long nPageMargin  = long(maNUpPage.maPageMarginEdt.Denormalize(maNUpPage.maPageMarginEdt.GetValue( FUNIT_100TH_MM )));
-    long nSheetMargin = long(maNUpPage.maSheetMarginEdt.Denormalize(maNUpPage.maSheetMarginEdt.GetValue( FUNIT_100TH_MM )));
-    bool bCustom = false;
-
-    if( nPages == 1 )
-    {
-        nRows = nCols = 1;
-        nSheetMargin = 0;
-        nPageMargin = 0;
-    }
-    else if( nPages == 2 || nPages == 4 || nPages == 6 || nPages == 9 || nPages == 16 )
-    {
-        Size aJobPageSize( getJobPageSize() );
-        bool bPortrait = aJobPageSize.Width() < aJobPageSize.Height();
-        if( nPages == 2 )
-        {
-            if( bPortrait )
-                nRows = 1, nCols = 2;
-            else
-                nRows = 2, nCols = 1;
-        }
-        else if( nPages == 4 )
-            nRows = nCols = 2;
-        else if( nPages == 6 )
-        {
-            if( bPortrait )
-                nRows = 2, nCols = 3;
-            else
-                nRows = 3, nCols = 2;
-        }
-        else if( nPages == 9 )
-            nRows = nCols = 3;
-        else if( nPages == 16 )
-            nRows = nCols = 4;
-        nPageMargin = 0;
-        nSheetMargin = 0;
-    }
-    else
-        bCustom = true;
-
-    if( nPages > 1 )
-    {
-        // set upper limits for margins based on job page size and rows/columns
-        Size aSize( getJobPageSize() );
-
-        // maximum sheet distance: 1/2 sheet
-        long nHorzMax = aSize.Width()/2;
-        long nVertMax = aSize.Height()/2;
-        if( nSheetMargin > nHorzMax )
-            nSheetMargin = nHorzMax;
-        if( nSheetMargin > nVertMax )
-            nSheetMargin = nVertMax;
-
-        maNUpPage.maSheetMarginEdt.SetMax(
-                  maNUpPage.maSheetMarginEdt.Normalize(
-                           nHorzMax > nVertMax ? nVertMax : nHorzMax ), FUNIT_100TH_MM );
-
-        // maximum page distance
-        nHorzMax = (aSize.Width() - 2*nSheetMargin);
-        if( nCols > 1 )
-            nHorzMax /= (nCols-1);
-        nVertMax = (aSize.Height() - 2*nSheetMargin);
-        if( nRows > 1 )
-            nHorzMax /= (nRows-1);
-
-        if( nPageMargin > nHorzMax )
-            nPageMargin = nHorzMax;
-        if( nPageMargin > nVertMax )
-            nPageMargin = nVertMax;
-
-        maNUpPage.maPageMarginEdt.SetMax(
-                 maNUpPage.maSheetMarginEdt.Normalize(
-                           nHorzMax > nVertMax ? nVertMax : nHorzMax ), FUNIT_100TH_MM );
-    }
-
-    maNUpPage.maNupRowsEdt.SetValue( nRows );
-    maNUpPage.maNupColEdt.SetValue( nCols );
-    maNUpPage.maPageMarginEdt.SetValue( maNUpPage.maPageMarginEdt.Normalize( nPageMargin ), FUNIT_100TH_MM );
-    maNUpPage.maSheetMarginEdt.SetValue( maNUpPage.maSheetMarginEdt.Normalize( nSheetMargin ), FUNIT_100TH_MM );
-
-    maNUpPage.showAdvancedControls( bCustom );
-    if( bCustom )
-    {
-        // see if we have to enlarge the dialog to make the tab page fit
-        Size aCurSize( maNUpPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ) );
-        Size aTabSize( maTabCtrl.GetTabPageSizePixel() );
-        if( aTabSize.Height() < aCurSize.Height() )
-        {
-            Size aDlgSize( GetSizePixel() );
-            aDlgSize.Height() += aCurSize.Height() - aTabSize.Height();
-            SetSizePixel( aDlgSize );
-        }
-    }
-
-    updateNup();
-}
-
-void PrintDialog::updateNup()
-{
-    int nRows         = int(maNUpPage.maNupRowsEdt.GetValue());
-    int nCols         = int(maNUpPage.maNupColEdt.GetValue());
-    long nPageMargin  = long(maNUpPage.maPageMarginEdt.Denormalize(maNUpPage.maPageMarginEdt.GetValue( FUNIT_100TH_MM )));
-    long nSheetMargin = long(maNUpPage.maSheetMarginEdt.Denormalize(maNUpPage.maSheetMarginEdt.GetValue( FUNIT_100TH_MM )));
-
-    PrinterController::MultiPageSetup aMPS;
-    aMPS.nRows         = nRows;
-    aMPS.nColumns      = nCols;
-    aMPS.nRepeat       = 1;
-    aMPS.nLeftMargin   =
-    aMPS.nTopMargin    =
-    aMPS.nRightMargin  =
-    aMPS.nBottomMargin = nSheetMargin;
-
-    aMPS.nHorizontalSpacing =
-    aMPS.nVerticalSpacing   = nPageMargin;
-
-    aMPS.bDrawBorder        = maNUpPage.maBorderCB.IsChecked();
-
-    int nOrderMode = int(sal_IntPtr(maNUpPage.maNupOrderBox.GetEntryData(
-                           maNUpPage.maNupOrderBox.GetSelectEntryPos() )));
-    if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_LRTB )
-        aMPS.nOrder = PrinterController::LRTB;
-    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_TBLR )
-        aMPS.nOrder = PrinterController::TBLR;
-    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_RLTB )
-        aMPS.nOrder = PrinterController::RLTB;
-    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_TBRL )
-        aMPS.nOrder = PrinterController::TBRL;
-
-    int nOrientationMode = int(sal_IntPtr(maNUpPage.maNupOrientationBox.GetEntryData(
-                                 maNUpPage.maNupOrientationBox.GetSelectEntryPos() )));
-    if( nOrientationMode == SV_PRINT_PRT_NUP_ORIENTATION_LANDSCAPE )
-        aMPS.aPaperSize = maNupLandscapeSize;
-    else if( nOrientationMode == SV_PRINT_PRT_NUP_ORIENTATION_PORTRAIT )
-        aMPS.aPaperSize = maNupPortraitSize;
-    else // automatic mode
-    {
-        // get size of first real page to see if it is portrait or landscape
-        // we assume same page sizes for all the pages for this
-        Size aPageSize = getJobPageSize();
-
-        Size aMultiSize( aPageSize.Width() * nCols, aPageSize.Height() * nRows );
-        if( aMultiSize.Width() > aMultiSize.Height() ) // fits better on landscape
-            aMPS.aPaperSize = maNupLandscapeSize;
-        else
-            aMPS.aPaperSize = maNupPortraitSize;
-    }
-
-    maPController->setMultipage( aMPS );
-
-    maNUpPage.maNupOrderWin.setValues( nOrderMode, nCols, nRows );
-
-    preparePreview( true, true );
-}
-
-IMPL_LINK( PrintDialog, SelectHdl, ListBox*, pBox )
-{
-    if(  pBox == &maJobPage.maPrinters )
-    {
-        String aNewPrinter( pBox->GetSelectEntry() );
-        // set new printer
-        maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( aNewPrinter ) ) );
-        maPController->resetPrinterOptions( maOptionsPage.maToFileBox.IsChecked() );
-        // update text fields
-        updatePrinterText();
-    }
-    else if( pBox == &maNUpPage.maNupOrientationBox || pBox == &maNUpPage.maNupOrderBox )
-    {
-        updateNup();
-    }
-    else if( pBox == &maNUpPage.maNupPagesBox )
-    {
-        if( !maNUpPage.maPagesBtn.IsChecked() )
-            maNUpPage.maPagesBtn.Check();
-        updateNupFromPages();
-    }
-
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton )
-{
-    if( pButton == &maOKButton || pButton == &maCancelButton )
-    {
-        storeToSettings();
-        EndDialog( pButton == &maOKButton );
-    }
-    else if( pButton == &maHelpButton )
-    {
-        // start help system
-        Help* pHelp = Application::GetHelp();
-        if( pHelp )
-        {
-            pHelp->Start( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:OK" ) ), &maOKButton );
-        }
-    }
-    else if( pButton == &maForwardBtn )
-    {
-        previewForward();
-    }
-    else if( pButton == &maBackwardBtn )
-    {
-        previewBackward();
-    }
-    else if( pButton == &maOptionsPage.maToFileBox )
-    {
-        maOKButton.SetText( maOptionsPage.maToFileBox.IsChecked() ? maPrintToFileText : maPrintText );
-        maPController->resetPrinterOptions( maOptionsPage.maToFileBox.IsChecked() );
-        getLayout()->resize();
-        preparePreview( true, true );
-    }
-    else if( pButton == &maNUpPage.maBrochureBtn )
-    {
-        PropertyValue* pVal = getValueForWindow( pButton );
-        if( pVal )
-        {
-            sal_Bool bVal = maNUpPage.maBrochureBtn.IsChecked();
-            pVal->Value <<= bVal;
-
-            checkOptionalControlDependencies();
-
-            // update preview and page settings
-            preparePreview();
-        }
-        if( maNUpPage.maBrochureBtn.IsChecked() )
-        {
-            maNUpPage.maNupPagesBox.SelectEntryPos( 0 );
-            updateNupFromPages();
-            maNUpPage.showAdvancedControls( false );
-            maNUpPage.enableNupControls( false );
-        }
-    }
-    else if( pButton == &maNUpPage.maPagesBtn )
-    {
-        maNUpPage.enableNupControls( true );
-        updateNupFromPages();
-    }
-    else if( pButton == &maJobPage.maDetailsBtn )
-    {
-        bool bShow = maJobPage.maDetailsBtn.IsChecked();
-        maJobPage.mxDetails->show( bShow );
-        if( bShow )
-        {
-            maDetailsCollapsedSize = GetOutputSizePixel();
-            // enlarge dialog if necessary
-            Size aMinSize( maJobPage.getLayout()->getOptimalSize( WINDOWSIZE_MINIMUM ) );
-            Size aCurSize( maJobPage.GetSizePixel() );
-            if( aCurSize.Height() < aMinSize.Height() )
-            {
-                Size aDlgSize( GetOutputSizePixel() );
-                aDlgSize.Height() += aMinSize.Height() - aCurSize.Height();
-                SetOutputSizePixel( aDlgSize );
-            }
-            maDetailsExpandedSize = GetOutputSizePixel();
-        }
-        else if( maDetailsCollapsedSize.Width() > 0   &&
-                 maDetailsCollapsedSize.Height() > 0 )
-        {
-            // if the user did not resize the dialog
-            // make it smaller again on collapsing the details
-            Size aDlgSize( GetOutputSizePixel() );
-            if( aDlgSize == maDetailsExpandedSize &&
-                aDlgSize.Height() > maDetailsCollapsedSize.Height() )
-            {
-                SetOutputSizePixel( maDetailsCollapsedSize );
-            }
-        }
-    }
-    else if( pButton == &maJobPage.maCollateBox )
-    {
-        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
-                                 makeAny( sal_Bool(isCollate()) ) );
-        checkControlDependencies();
-    }
-    else if( pButton == &maJobPage.maReverseOrderBox )
-    {
-        sal_Bool bChecked = maJobPage.maReverseOrderBox.IsChecked();
-        maPController->setReversePrint( bChecked );
-        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintReverse" ) ),
-                                 makeAny( bChecked ) );
-        preparePreview( true, true );
-    }
-    else if( pButton == &maNUpPage.maBorderCB )
-    {
-        updateNup();
-    }
-    else
-    {
-        if( pButton == &maJobPage.maSetupButton )
-        {
-            maPController->setupPrinter( this );
-            preparePreview( true, true );
-        }
-        checkControlDependencies();
-    }
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, ModifyHdl, Edit*, pEdit )
-{
-    checkControlDependencies();
-    if( pEdit == &maNUpPage.maNupRowsEdt || pEdit == &maNUpPage.maNupColEdt ||
-        pEdit == &maNUpPage.maSheetMarginEdt || pEdit == &maNUpPage.maPageMarginEdt
-       )
-    {
-        updateNupFromPages();
-    }
-    else if( pEdit == &maPageEdit )
-    {
-        mnCurPage = sal_Int32( maPageEdit.GetValue() - 1 );
-        preparePreview( true, true );
-    }
-    else if( pEdit == &maJobPage.maCopyCountField )
-    {
-        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CopyCount" ) ),
-                               makeAny( sal_Int32(maJobPage.maCopyCountField.GetValue()) ) );
-        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
-                               makeAny( sal_Bool(isCollate()) ) );
-    }
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, UIOptionsChanged, void*, EMPTYARG )
-{
-    checkOptionalControlDependencies();
-    return 0;
-}
-
-PropertyValue* PrintDialog::getValueForWindow( Window* i_pWindow ) const
-{
-    PropertyValue* pVal = NULL;
-    std::map< Window*, rtl::OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow );
-    if( it != maControlToPropertyMap.end() )
-    {
-        pVal = maPController->getValue( it->second );
-        DBG_ASSERT( pVal, "property value not found" );
-    }
-    else
-    {
-        OSL_FAIL( "changed control not in property map" );
-    }
-    return pVal;
-}
-
-void PrintDialog::updateWindowFromProperty( const rtl::OUString& i_rProperty )
-{
-    beans::PropertyValue* pValue = maPController->getValue( i_rProperty );
-    std::map< rtl::OUString, std::vector< Window* > >::const_iterator it = maPropertyToWindowMap.find( i_rProperty );
-    if( pValue && it != maPropertyToWindowMap.end() )
-    {
-        const std::vector< Window* >& rWindows( it->second );
-        if( ! rWindows.empty() )
-        {
-            sal_Bool bVal = sal_False;
-            sal_Int32 nVal = -1;
-            if( pValue->Value >>= bVal )
-            {
-                // we should have a CheckBox for this one
-                CheckBox* pBox = dynamic_cast< CheckBox* >( rWindows.front() );
-                if( pBox )
-                {
-                    pBox->Check( bVal );
-                }
-                else if( i_rProperty.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintProspect" ) ) )
-                {
-                    // EVIL special case
-                    if( bVal )
-                        maNUpPage.maBrochureBtn.Check();
-                    else
-                        maNUpPage.maPagesBtn.Check();
-                }
-                else
-                {
-                    DBG_ASSERT( 0, "missing a checkbox" );
-                }
-            }
-            else if( pValue->Value >>= nVal )
-            {
-                // this could be a ListBox or a RadioButtonGroup
-                ListBox* pList = dynamic_cast< ListBox* >( rWindows.front() );
-                if( pList )
-                {
-                    pList->SelectEntryPos( static_cast< sal_uInt16 >(nVal) );
-                }
-                else if( nVal >= 0 && nVal < sal_Int32(rWindows.size() ) )
-                {
-                    RadioButton* pBtn = dynamic_cast< RadioButton* >( rWindows[nVal] );
-                    DBG_ASSERT( pBtn, "unexpected control for property" );
-                    if( pBtn )
-                        pBtn->Check();
-                }
-            }
-        }
-    }
-}
-
-void PrintDialog::makeEnabled( Window* i_pWindow )
-{
-    std::map< Window*, rtl::OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow );
-    if( it != maControlToPropertyMap.end() )
-    {
-        rtl::OUString aDependency( maPController->makeEnabled( it->second ) );
-        if( aDependency.getLength() )
-            updateWindowFromProperty( aDependency );
-    }
-}
-
-IMPL_LINK( PrintDialog, UIOption_CheckHdl, CheckBox*, i_pBox )
-{
-    PropertyValue* pVal = getValueForWindow( i_pBox );
-    if( pVal )
-    {
-        makeEnabled( i_pBox );
-
-        sal_Bool bVal = i_pBox->IsChecked();
-        pVal->Value <<= bVal;
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
-    }
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, UIOption_RadioHdl, RadioButton*, i_pBtn )
-{
-    // this handler gets called for all radiobuttons that get unchecked, too
-    // however we only want one notificaction for the new value (that is for
-    // the button that gets checked)
-    if( i_pBtn->IsChecked() )
-    {
-        PropertyValue* pVal = getValueForWindow( i_pBtn );
-        std::map< Window*, sal_Int32 >::const_iterator it = maControlToNumValMap.find( i_pBtn );
-        if( pVal && it != maControlToNumValMap.end() )
-        {
-            makeEnabled( i_pBtn );
-
-            sal_Int32 nVal = it->second;
-            pVal->Value <<= nVal;
-
-            checkOptionalControlDependencies();
-
-            // update preview and page settings
-            preparePreview();
-        }
-    }
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, UIOption_SelectHdl, ListBox*, i_pBox )
-{
-    PropertyValue* pVal = getValueForWindow( i_pBox );
-    if( pVal )
-    {
-        makeEnabled( i_pBox );
-
-        sal_Int32 nVal( i_pBox->GetSelectEntryPos() );
-        pVal->Value <<= nVal;
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
-    }
-    return 0;
-}
-
-IMPL_LINK( PrintDialog, UIOption_ModifyHdl, Edit*, i_pBox )
-{
-    PropertyValue* pVal = getValueForWindow( i_pBox );
-    if( pVal )
-    {
-        makeEnabled( i_pBox );
-
-        NumericField* pNum = dynamic_cast<NumericField*>(i_pBox);
-        MetricField* pMetric = dynamic_cast<MetricField*>(i_pBox);
-        if( pNum )
-        {
-            sal_Int64 nVal = pNum->GetValue();
-            pVal->Value <<= nVal;
-        }
-        else if( pMetric )
-        {
-            sal_Int64 nVal = pMetric->GetValue();
-            pVal->Value <<= nVal;
-        }
-        else
-        {
-            rtl::OUString aVal( i_pBox->GetText() );
-            pVal->Value <<= aVal;
-        }
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
-    }
-    return 0;
-}
-
-void PrintDialog::Command( const CommandEvent& rEvt )
-{
-    if( rEvt.GetCommand() == COMMAND_WHEEL )
-    {
-        const CommandWheelData* pWheelData = rEvt.GetWheelData();
-        if( pWheelData->GetDelta() > 0 )
-            previewForward();
-        else if( pWheelData->GetDelta() < 0 )
-            previewBackward();
-        /*
-        else
-            huh ?
-        */
-    }
-}
-
-void PrintDialog::Resize()
-{
-    // maLayout.setManagedArea( Rectangle( Point( 0, 0 ), GetSizePixel() ) );
-    // and do the preview; however the metafile does not need to be gotten anew
-    preparePreview( false );
-
-    // do an invalidate for the benefit of the grouping elements
-    Invalidate();
-}
-
-void PrintDialog::previewForward()
-{
-    maPageEdit.Up();
-}
-
-void PrintDialog::previewBackward()
-{
-    maPageEdit.Down();
-}
-
-// -----------------------------------------------------------------------------
-//
-// PrintProgressDialog
-//
-// -----------------------------------------------------------------------------
-
-PrintProgressDialog::PrintProgressDialog( Window* i_pParent, int i_nMax ) :
-    ModelessDialog( i_pParent, VclResId( SV_DLG_PRINT_PROGRESS ) ),
-    maText( this, VclResId( SV_PRINT_PROGRESS_TEXT ) ),
-    maButton( this, VclResId( SV_PRINT_PROGRESS_CANCEL ) ),
-    mbCanceled( false ),
-    mnCur( 0 ),
-    mnMax( i_nMax ),
-    mnProgressHeight( 15 ),
-    mbNativeProgress( false )
-{
-    FreeResource();
-
-    if( mnMax < 1 )
-        mnMax = 1;
-
-    maStr = maText.GetText();
-
-    maButton.SetClickHdl( LINK( this, PrintProgressDialog, ClickHdl ) );
-
-}
-
-PrintProgressDialog::~PrintProgressDialog()
-{
-}
-
-IMPL_LINK( PrintProgressDialog, ClickHdl, Button*, pButton )
-{
-    if( pButton == &maButton )
-        mbCanceled = true;
-
-    return 0;
-}
-
-void PrintProgressDialog::implCalcProgressRect()
-{
-    if( IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
-    {
-        ImplControlValue aValue;
-        Rectangle aControlRegion( Point(), Size( 100, mnProgressHeight ) );
-        Rectangle aNativeControlRegion, aNativeContentRegion;
-        if( GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion,
-                                    CTRL_STATE_ENABLED, aValue, rtl::OUString(),
-                                    aNativeControlRegion, aNativeContentRegion ) )
-        {
-            mnProgressHeight = aNativeControlRegion.GetHeight();
-        }
-        mbNativeProgress = true;
-    }
-    maProgressRect = Rectangle( Point( 10, maText.GetPosPixel().Y() + maText.GetSizePixel().Height() + 8 ),
-                                Size( GetSizePixel().Width() - 20, mnProgressHeight ) );
-}
-
-void PrintProgressDialog::setProgress( int i_nCurrent, int i_nMax )
-{
-    if( maProgressRect.IsEmpty() )
-        implCalcProgressRect();
-
-    mnCur = i_nCurrent;
-    if( i_nMax != -1 )
-        mnMax = i_nMax;
-
-    if( mnMax < 1 )
-        mnMax = 1;
-
-    rtl::OUString aNewText( searchAndReplace( maStr, "%p", 2, rtl::OUString::valueOf( mnCur ) ) );
-    aNewText = searchAndReplace( aNewText, "%n", 2, rtl::OUString::valueOf( mnMax ) );
-    maText.SetText( aNewText );
-
-    // update progress
-    Invalidate( maProgressRect, INVALIDATE_UPDATE );
-}
-
-void PrintProgressDialog::tick()
-{
-    if( mnCur < mnMax )
-        setProgress( ++mnCur );
-}
-
-void PrintProgressDialog::reset()
-{
-    mbCanceled = false;
-    setProgress( 0 );
-}
-
-void PrintProgressDialog::Paint( const Rectangle& )
-{
-    if( maProgressRect.IsEmpty() )
-        implCalcProgressRect();
-
-    Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
-    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
-    Color aPrgsColor = rStyleSettings.GetHighlightColor();
-    if ( aPrgsColor == rStyleSettings.GetFaceColor() )
-        aPrgsColor = rStyleSettings.GetDarkShadowColor();
-    SetLineColor();
-    SetFillColor( aPrgsColor );
-
-    const long nOffset = 3;
-    const long nWidth = 3*mnProgressHeight/2;
-    const long nFullWidth = nWidth + nOffset;
-    const long nMaxCount = maProgressRect.GetWidth() / nFullWidth;
-    DrawProgress( this, maProgressRect.TopLeft(),
-                        nOffset,
-                        nWidth,
-                        mnProgressHeight,
-                        static_cast<sal_uInt16>(0),
-                        static_cast<sal_uInt16>(10000*mnCur/mnMax),
-                        static_cast<sal_uInt16>(10000/nMaxCount),
-                        maProgressRect
-                        );
-    Pop();
-
-    if( ! mbNativeProgress )
-    {
-        DecorationView aDecoView( this );
-        Rectangle aFrameRect( maProgressRect );
-        aFrameRect.Left() -= nOffset;
-        aFrameRect.Right() += nOffset;
-        aFrameRect.Top() -= nOffset;
-        aFrameRect.Bottom() += nOffset;
-        aDecoView.DrawFrame( aFrameRect );
-    }
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/prndlg.cxx b/vcl/source/window/prndlg.cxx
new file mode 100644
index 0000000..a150b7a
--- /dev/null
+++ b/vcl/source/window/prndlg.cxx
@@ -0,0 +1,2501 @@
+/* -*- 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
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#include "precompiled_vcl.hxx"
+
+#include "vcl/print.hxx"
+#include "vcl/prndlg.hxx"
+#include "vcl/dialog.hxx"
+#include "vcl/button.hxx"
+#include "vcl/svdata.hxx"
+#include "vcl/svids.hrc"
+#include "vcl/wall.hxx"
+#include "vcl/jobset.h"
+#include "vcl/status.hxx"
+#include "vcl/decoview.hxx"
+#include "vcl/arrange.hxx"
+#include "vcl/configsettings.hxx"
+#include "vcl/help.hxx"
+#include "vcl/decoview.hxx"
+#include "vcl/svapp.hxx"
+#include "vcl/unohelp.hxx"
+
+#include "unotools/localedatawrapper.hxx"
+
+#include "rtl/strbuf.hxx"
+
+#include "com/sun/star/lang/XMultiServiceFactory.hpp"
+#include "com/sun/star/container/XNameAccess.hpp"
+#include "com/sun/star/beans/PropertyValue.hpp"
+#include "com/sun/star/awt/Size.hpp"
+
+using namespace vcl;
+using namespace com::sun::star;
+using namespace com::sun::star::uno;
+using namespace com::sun::star::lang;
+using namespace com::sun::star::container;
+using namespace com::sun::star::beans;
+
+PrintDialog::PrintPreviewWindow::PrintPreviewWindow( Window* i_pParent, const ResId& i_rId )
+    : Window( i_pParent, i_rId )
+    , maOrigSize( 10, 10 )
+    , maPageVDev( *this )
+    , maToolTipString( String( VclResId( SV_PRINT_PRINTPREVIEW_TXT ) ) )
+    , mbGreyscale( false )
+    , maHorzDim( this, WB_HORZ | WB_CENTER  )
+    , maVertDim( this, WB_VERT | WB_VCENTER )
+{
+    SetPaintTransparent( sal_True );
+    SetBackground();
+    maPageVDev.SetBackground( Color( COL_WHITE ) );
+    maHorzDim.Show();
+    maVertDim.Show();
+
+    maHorzDim.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "2.0in" ) ) );
+    maVertDim.SetText( String( RTL_CONSTASCII_USTRINGPARAM( "2.0in" ) ) );
+}
+
+PrintDialog::PrintPreviewWindow::~PrintPreviewWindow()
+{
+}
+
+void PrintDialog::PrintPreviewWindow::DataChanged( const DataChangedEvent& i_rDCEvt )
+{
+    // react on settings changed
+    if( i_rDCEvt.GetType() == DATACHANGED_SETTINGS )
+    {
+        maPageVDev.SetBackground( Color( COL_WHITE ) );
+    }
+    Window::DataChanged( i_rDCEvt );
+}
+
+void PrintDialog::PrintPreviewWindow::Resize()
+{
+    Size aNewSize( GetSizePixel() );
+    long nTextHeight = maHorzDim.GetTextHeight();
+    // leave small space for decoration
+    aNewSize.Width() -= nTextHeight + 2;
+    aNewSize.Height() -= nTextHeight + 2;
+    Size aScaledSize;
+    double fScale = 1.0;
+
+    // #i106435# catch corner case of Size(0,0)
+    Size aOrigSize( maOrigSize );
+    if( aOrigSize.Width() < 1 )
+        aOrigSize.Width() = aNewSize.Width();
+    if( aOrigSize.Height() < 1 )
+        aOrigSize.Height() = aNewSize.Height();
+    if( aOrigSize.Width() > aOrigSize.Height() )
+    {
+        aScaledSize = Size( aNewSize.Width(), aNewSize.Width() * aOrigSize.Height() / aOrigSize.Width() );
+        if( aScaledSize.Height() > aNewSize.Height() )
+            fScale = double(aNewSize.Height())/double(aScaledSize.Height());
+    }
+    else
+    {
+        aScaledSize = Size( aNewSize.Height() * aOrigSize.Width() / aOrigSize.Height(), aNewSize.Height() );
+        if( aScaledSize.Width() > aNewSize.Width() )
+            fScale = double(aNewSize.Width())/double(aScaledSize.Width());
+    }
+    aScaledSize.Width() = long(aScaledSize.Width()*fScale);
+    aScaledSize.Height() = long(aScaledSize.Height()*fScale);
+
+    maPreviewSize = aScaledSize;
+
+    // #i104784# if we render the page too small then rounding issues result in
+    // layout artifacts looking really bad. So scale the page unto a device that is not
+    // full page size but not too small either. This also results in much better visual
+    // quality of the preview, e.g. when its height approaches the number of text lines
+    // find a good scaling factor
+    Size aPreviewMMSize( maPageVDev.PixelToLogic( aScaledSize, MapMode( MAP_100TH_MM ) ) );
+    double fZoom = double(maOrigSize.Height())/double(aPreviewMMSize.Height());
+    while( fZoom > 10 )
+    {
+        aScaledSize.Width() *= 2;
+        aScaledSize.Height() *= 2;
+        fZoom /= 2.0;
+    }
+
+    maPageVDev.SetOutputSizePixel( aScaledSize, sal_False );
+
+    // position dimension lines
+    Point aRef( nTextHeight + (aNewSize.Width() - maPreviewSize.Width())/2,
+                nTextHeight + (aNewSize.Height() - maPreviewSize.Height())/2 );
+    maHorzDim.SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ),
+                               Size( maPreviewSize.Width(), nTextHeight ) );
+    maVertDim.SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ),
+                               Size( nTextHeight, maPreviewSize.Height() ) );
+
+}
+
+void PrintDialog::PrintPreviewWindow::Paint( const Rectangle& )
+{
+    long nTextHeight = maHorzDim.GetTextHeight();
+    Size aSize( GetSizePixel() );
+    aSize.Width()  -= nTextHeight;
+    aSize.Height() -= nTextHeight;
+    if( maReplacementString.getLength() != 0 )
+    {
+        // replacement is active
+        Push();
+        Rectangle aTextRect( Point( nTextHeight, nTextHeight ), aSize );
+        DecorationView aVw( this );
+        aVw.DrawFrame( aTextRect, FRAME_DRAW_GROUP );
+        aTextRect.Left()   += 2;
+        aTextRect.Top()    += 2;
+        aTextRect.Right()  -= 2;
+        aTextRect.Bottom() -= 2;
+        Font aFont( GetSettings().GetStyleSettings().GetLabelFont() );
+        SetZoomedPointFont( aFont );
+        DrawText( aTextRect, maReplacementString,
+                  TEXT_DRAW_CENTER | TEXT_DRAW_VCENTER | TEXT_DRAW_WORDBREAK | TEXT_DRAW_MULTILINE
+                 );
+        Pop();
+    }
+    else
+    {
+        GDIMetaFile aMtf( maMtf );
+
+        Point aOffset( (aSize.Width() - maPreviewSize.Width()) / 2 + nTextHeight,
+                       (aSize.Height() - maPreviewSize.Height()) / 2 + nTextHeight );
+
+        Size aVDevSize( maPageVDev.GetOutputSizePixel() );
+        const Size aLogicSize( maPageVDev.PixelToLogic( aVDevSize, MapMode( MAP_100TH_MM ) ) );
+        Size aOrigSize( maOrigSize );
+        if( aOrigSize.Width() < 1 )
+            aOrigSize.Width() = aLogicSize.Width();
+        if( aOrigSize.Height() < 1 )
+            aOrigSize.Height() = aLogicSize.Height();
+        double fScale = double(aLogicSize.Width())/double(aOrigSize.Width());
+
+
+        maPageVDev.Erase();
+        maPageVDev.Push();
+        maPageVDev.SetMapMode( MAP_100TH_MM );
+        sal_uLong nOldDrawMode = maPageVDev.GetDrawMode();
+        if( mbGreyscale )
+            maPageVDev.SetDrawMode( maPageVDev.GetDrawMode() |
+                                    ( DRAWMODE_GRAYLINE | DRAWMODE_GRAYFILL | DRAWMODE_GRAYTEXT |
+                                      DRAWMODE_GRAYBITMAP | DRAWMODE_GRAYGRADIENT ) );
+        aMtf.WindStart();
+        aMtf.Scale( fScale, fScale );
+        aMtf.WindStart();
+        aMtf.Play( &maPageVDev, Point( 0, 0 ), aLogicSize );
+        maPageVDev.Pop();
+
+        SetMapMode( MAP_PIXEL );
+        maPageVDev.SetMapMode( MAP_PIXEL );
+        DrawOutDev( aOffset, maPreviewSize, Point( 0, 0 ), aVDevSize, maPageVDev );
+        maPageVDev.SetDrawMode( nOldDrawMode );
+
+        DecorationView aVw( this );
+        Rectangle aFrame( aOffset + Point( -1, -1 ), Size( maPreviewSize.Width() + 2, maPreviewSize.Height() + 2 ) );
+        aVw.DrawFrame( aFrame, FRAME_DRAW_GROUP );
+    }
+}
+
+void PrintDialog::PrintPreviewWindow::Command( const CommandEvent& rEvt )
+{
+    if( rEvt.GetCommand() == COMMAND_WHEEL )
+    {
+        const CommandWheelData* pWheelData = rEvt.GetWheelData();
+        PrintDialog* pDlg = dynamic_cast<PrintDialog*>(GetParent());
+        if( pDlg )
+        {
+            if( pWheelData->GetDelta() > 0 )
+                pDlg->previewForward();
+            else if( pWheelData->GetDelta() < 0 )
+                pDlg->previewBackward();
+            /*
+            else
+                huh ?
+            */
+        }
+    }
+}
+
+void PrintDialog::PrintPreviewWindow::setPreview( const GDIMetaFile& i_rNewPreview,
+                                                  const Size& i_rOrigSize,
+                                                  const rtl::OUString& i_rPaperName,
+                                                  const rtl::OUString& i_rReplacement,
+                                                  sal_Int32 i_nDPIX,
+                                                  sal_Int32 i_nDPIY,
+                                                  bool i_bGreyscale
+                                                 )
+{
+    rtl::OUStringBuffer aBuf( 256 );
+    aBuf.append( maToolTipString );
+    SetQuickHelpText( aBuf.makeStringAndClear() );
+    maMtf = i_rNewPreview;
+
+    maOrigSize = i_rOrigSize;
+    maReplacementString = i_rReplacement;
+    mbGreyscale = i_bGreyscale;
+    maPageVDev.SetReferenceDevice( i_nDPIX, i_nDPIY );
+    maPageVDev.EnableOutput( sal_True );
+
+    // use correct measurements
+    const LocaleDataWrapper& rLocWrap( GetSettings().GetLocaleDataWrapper() );
+    MapUnit eUnit = MAP_MM;
+    int nDigits = 0;
+    if( rLocWrap.getMeasurementSystemEnum() == MEASURE_US )
+    {
+        eUnit = MAP_100TH_INCH;
+        nDigits = 2;
+    }
+    Size aLogicPaperSize( LogicToLogic( i_rOrigSize, MapMode( MAP_100TH_MM ), MapMode( eUnit ) ) );
+    String aNumText( rLocWrap.getNum( aLogicPaperSize.Width(), nDigits ) );
+    aBuf.append( aNumText );
+    aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" );
+    if( i_rPaperName.getLength() )
+    {
+        aBuf.appendAscii( " (" );
+        aBuf.append( i_rPaperName );
+        aBuf.append( sal_Unicode(')') );
+    }
+    maHorzDim.SetText( aBuf.makeStringAndClear() );
+
+    aNumText = rLocWrap.getNum( aLogicPaperSize.Height(), nDigits );
+    aBuf.append( aNumText );
+    aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" );
+    maVertDim.SetText( aBuf.makeStringAndClear() );
+
+    Resize();
+    Invalidate();
+}
+
+PrintDialog::ShowNupOrderWindow::ShowNupOrderWindow( Window* i_pParent )
+    : Window( i_pParent, WB_NOBORDER )
+    , mnOrderMode( 0 )
+    , mnRows( 1 )
+    , mnColumns( 1 )
+{
+    ImplInitSettings();
+}
+
+PrintDialog::ShowNupOrderWindow::~ShowNupOrderWindow()
+{
+}
+
+void PrintDialog::ShowNupOrderWindow::ImplInitSettings()
+{
+    SetBackground( Wallpaper( GetSettings().GetStyleSettings().GetFieldColor() ) );
+}
+
+void PrintDialog::ShowNupOrderWindow::Paint( const Rectangle& i_rRect )
+{
+    Window::Paint( i_rRect );
+    SetMapMode( MAP_PIXEL );
+    SetTextColor( GetSettings().GetStyleSettings().GetFieldTextColor() );
+
+    int nPages = mnRows * mnColumns;
+    Font aFont( GetSettings().GetStyleSettings().GetFieldFont() );
+    aFont.SetSize( Size( 0, 24 ) );
+    SetFont( aFont );
+    Size aSampleTextSize( GetTextWidth( rtl::OUString::valueOf( sal_Int32(nPages+1) ) ), GetTextHeight() );
+
+    Size aOutSize( GetOutputSizePixel() );
+    Size aSubSize( aOutSize.Width() / mnColumns, aOutSize.Height() / mnRows );
+    // calculate font size: shrink the sample text so it fits
+    double fX = double(aSubSize.Width())/double(aSampleTextSize.Width());
+    double fY = double(aSubSize.Height())/double(aSampleTextSize.Height());
+    double fScale = (fX < fY) ? fX : fY;
+    long nFontHeight = long(24.0*fScale) - 3;
+    if( nFontHeight < 5 )
+        nFontHeight = 5;
+    aFont.SetSize( Size( 0, nFontHeight ) );
+    SetFont( aFont );
+    long nTextHeight = GetTextHeight();
+    for( int i = 0; i < nPages; i++ )
+    {
+        rtl::OUString aPageText( rtl::OUString::valueOf( sal_Int32(i+1) ) );
+        int nX = 0, nY = 0;
+        switch( mnOrderMode )
+        {
+        case SV_PRINT_PRT_NUP_ORDER_LRTB:
+            nX = (i % mnColumns); nY = (i / mnColumns);
+            break;
+        case SV_PRINT_PRT_NUP_ORDER_TBLR:
+            nX = (i / mnRows); nY = (i % mnRows);
+            break;
+        case SV_PRINT_PRT_NUP_ORDER_RLTB:
+            nX = mnColumns - 1 - (i % mnColumns); nY = (i / mnColumns);
+            break;
+        case SV_PRINT_PRT_NUP_ORDER_TBRL:
+            nX = mnColumns - 1 - (i / mnRows); nY = (i % mnRows);
+            break;
+        }
+        Size aTextSize( GetTextWidth( aPageText ), nTextHeight );
+        int nDeltaX = (aSubSize.Width() - aTextSize.Width()) / 2;
+        int nDeltaY = (aSubSize.Height() - aTextSize.Height()) / 2;
+        DrawText( Point( nX * aSubSize.Width() + nDeltaX,
+                         nY * aSubSize.Height() + nDeltaY ),
+                  aPageText );
+    }
+    DecorationView aVw( this );
+    aVw.DrawFrame( Rectangle( Point( 0, 0), aOutSize ), FRAME_DRAW_GROUP );
+}
+
+PrintDialog::NUpTabPage::NUpTabPage( Window* i_pParent, const ResId& rResId )
+    : TabPage( i_pParent, rResId )
+    , maNupLine( this, VclResId( SV_PRINT_PRT_NUP_LAYOUT_FL ) )
+    , maPagesBtn( this, VclResId( SV_PRINT_PRT_NUP_PAGES_BTN ) )
+    , maBrochureBtn( this, VclResId( SV_PRINT_PRT_NUP_BROCHURE_BTN ) )
+    , maPagesBoxTitleTxt( this, 0 )
+    , maNupPagesBox( this, VclResId( SV_PRINT_PRT_NUP_PAGES_BOX ) )
+    , maNupNumPagesTxt( this, VclResId( SV_PRINT_PRT_NUP_NUM_PAGES_TXT ) )
+    , maNupColEdt( this, VclResId( SV_PRINT_PRT_NUP_COLS_EDT ) )
+    , maNupTimesTxt( this, VclResId( SV_PRINT_PRT_NUP_TIMES_TXT ) )
+    , maNupRowsEdt( this, VclResId( SV_PRINT_PRT_NUP_ROWS_EDT ) )
+    , maPageMarginTxt1( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_1_TXT ) )
+    , maPageMarginEdt( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_EDT ) )
+    , maPageMarginTxt2( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_PAGES_2_TXT ) )
+    , maSheetMarginTxt1( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_1_TXT ) )
+    , maSheetMarginEdt( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_EDT ) )
+    , maSheetMarginTxt2( this, VclResId( SV_PRINT_PRT_NUP_MARGINS_SHEET_2_TXT ) )
+    , maNupOrientationTxt( this, VclResId( SV_PRINT_PRT_NUP_ORIENTATION_TXT ) )
+    , maNupOrientationBox( this, VclResId( SV_PRINT_PRT_NUP_ORIENTATION_BOX ) )
+    , maNupOrderTxt( this, VclResId( SV_PRINT_PRT_NUP_ORDER_TXT ) )
+    , maNupOrderBox( this, VclResId( SV_PRINT_PRT_NUP_ORDER_BOX ) )
+    , maNupOrderWin( this )
+    , maBorderCB( this, VclResId( SV_PRINT_PRT_NUP_BORDER_CB ) )
+{
+    FreeResource();
+
+    maNupOrderWin.Show();
+    maPagesBtn.Check( sal_True );
+    maBrochureBtn.Show( sal_False );
+
+    // setup field units for metric fields
+    const LocaleDataWrapper& rLocWrap( maPageMarginEdt.GetLocaleDataWrapper() );
+    FieldUnit eUnit = FUNIT_MM;
+    sal_uInt16 nDigits = 0;
+    if( rLocWrap.getMeasurementSystemEnum() == MEASURE_US )
+    {
+        eUnit = FUNIT_INCH;
+        nDigits = 2;
+    }
+    // set units
+    maPageMarginEdt.SetUnit( eUnit );
+    maSheetMarginEdt.SetUnit( eUnit );
+
+    // set precision
+    maPageMarginEdt.SetDecimalDigits( nDigits );
+    maSheetMarginEdt.SetDecimalDigits( nDigits );
+
+    setupLayout();
+}
+
+PrintDialog::NUpTabPage::~NUpTabPage()
+{
+}
+
+void PrintDialog::NUpTabPage::enableNupControls( bool bEnable )
+{
+    maNupPagesBox.Enable( sal_True );
+    maNupNumPagesTxt.Enable( bEnable );
+    maNupColEdt.Enable( bEnable );
+    maNupTimesTxt.Enable( bEnable );
+    maNupRowsEdt.Enable( bEnable );
+    maPageMarginTxt1.Enable( bEnable );
+    maPageMarginEdt.Enable( bEnable );
+    maPageMarginTxt2.Enable( bEnable );
+    maSheetMarginTxt1.Enable( bEnable );
+    maSheetMarginEdt.Enable( bEnable );
+    maSheetMarginTxt2.Enable( bEnable );
+    maNupOrientationTxt.Enable( bEnable );
+    maNupOrientationBox.Enable( bEnable );
+    maNupOrderTxt.Enable( bEnable );
+    maNupOrderBox.Enable( bEnable );
+    maNupOrderWin.Enable( bEnable );
+    maBorderCB.Enable( bEnable );
+}
+
+void PrintDialog::NUpTabPage::showAdvancedControls( bool i_bShow )
+{
+    maNupNumPagesTxt.Show( i_bShow );
+    maNupColEdt.Show( i_bShow );
+    maNupTimesTxt.Show( i_bShow );
+    maNupRowsEdt.Show( i_bShow );
+    maPageMarginTxt1.Show( i_bShow );
+    maPageMarginEdt.Show( i_bShow );
+    maPageMarginTxt2.Show( i_bShow );
+    maSheetMarginTxt1.Show( i_bShow );
+    maSheetMarginEdt.Show( i_bShow );
+    maSheetMarginTxt2.Show( i_bShow );
+    maNupOrientationTxt.Show( i_bShow );
+    maNupOrientationBox.Show( i_bShow );
+    getLayout()->resize();
+}
+
+void PrintDialog::NUpTabPage::setupLayout()
+{
+    boost::shared_ptr<vcl::RowOrColumn> xLayout =
+        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
+    Size aBorder( LogicToPixel( Size( 6, 6 ), MapMode( MAP_APPFONT ) ) );
+    /*  According to OOo style guide, the horizontal indentation of child
+        elements to their parent element should always be 6 map units. */
+    long nIndent = aBorder.Width();
+
+    xLayout->addWindow( &maNupLine );
+    boost::shared_ptr< vcl::RowOrColumn > xRow( new vcl::RowOrColumn( xLayout.get(), false ) );
+    xLayout->addChild( xRow );
+    boost::shared_ptr< vcl::Indenter > xIndent( new vcl::Indenter( xRow.get() ) );
+    xRow->addChild( xIndent );
+
+    boost::shared_ptr< vcl::RowOrColumn > xShowNupCol( new vcl::RowOrColumn( xRow.get() ) );
+    xRow->addChild( xShowNupCol, -1 );
+    xShowNupCol->setMinimumSize( xShowNupCol->addWindow( &maNupOrderWin ), Size( 70, 70 ) );
+    boost::shared_ptr< vcl::Spacer > xSpacer( new vcl::Spacer( xShowNupCol.get() ) );
+    xShowNupCol->addChild( xSpacer );
+
+    boost::shared_ptr< vcl::LabelColumn > xMainCol( new vcl::LabelColumn( xIndent.get() ) );
+    xIndent->setChild( xMainCol );
+
+    size_t nPagesIndex = xMainCol->addRow( &maPagesBtn, &maNupPagesBox );
+    mxPagesBtnLabel = boost::dynamic_pointer_cast<vcl::LabeledElement>( xMainCol->getChild( nPagesIndex ) );
+
+    xRow.reset( new vcl::RowOrColumn( xMainCol.get(), false ) );
+    xMainCol->addRow( &maNupNumPagesTxt, xRow, nIndent );
+    xRow->addWindow( &maNupColEdt );
+    xRow->addWindow( &maNupTimesTxt );
+    xRow->addWindow( &maNupRowsEdt );
+
+    boost::shared_ptr< vcl::LabeledElement > xLab( new vcl::LabeledElement( xMainCol.get(), 2 ) );
+    xLab->setLabel( &maPageMarginEdt );
+    xLab->setElement( &maPageMarginTxt2 );
+    xMainCol->addRow( &maPageMarginTxt1, xLab, nIndent );
+
+    xLab.reset( new vcl::LabeledElement( xMainCol.get(), 2 ) );
+    xLab->setLabel( &maSheetMarginEdt );
+    xLab->setElement( &maSheetMarginTxt2 );
+    xMainCol->addRow( &maSheetMarginTxt1, xLab, nIndent );
+
+    xMainCol->addRow( &maNupOrientationTxt, &maNupOrientationBox, nIndent );
+    xMainCol->addRow( &maNupOrderTxt, &maNupOrderBox, nIndent );
+    xMainCol->setBorders( xMainCol->addWindow( &maBorderCB ), nIndent, 0, 0, 0 );
+
+    xSpacer.reset( new vcl::Spacer( xMainCol.get(), 0, Size( 10, WindowArranger::getDefaultBorder() ) ) );
+    xMainCol->addChild( xSpacer );
+
+    xRow.reset( new vcl::RowOrColumn( xMainCol.get(), false ) );
+    xMainCol->addRow( &maBrochureBtn, xRow );
+    // remember brochure row for dependencies
+    mxBrochureDep = xRow;
+
+    // initially advanced controls are not shown, rows=columns=1
+    showAdvancedControls( false );
+}
+
+void PrintDialog::NUpTabPage::initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& i_rMPS )
+{
+    maSheetMarginEdt.SetValue( maSheetMarginEdt.Normalize( i_rMPS.nLeftMargin ), FUNIT_100TH_MM );
+    maPageMarginEdt.SetValue( maPageMarginEdt.Normalize( i_rMPS.nHorizontalSpacing ), FUNIT_100TH_MM );
+    maBorderCB.Check( i_rMPS.bDrawBorder );
+    maNupRowsEdt.SetValue( i_rMPS.nRows );
+    maNupColEdt.SetValue( i_rMPS.nColumns );
+}
+
+void PrintDialog::NUpTabPage::readFromSettings()
+{
+}
+
+void PrintDialog::NUpTabPage::storeToSettings()
+{
+}
+
+PrintDialog::JobTabPage::JobTabPage( Window* i_pParent, const ResId& rResId )
+    : TabPage( i_pParent, rResId )
+    , maPrinterFL( this, VclResId( SV_PRINT_PRINTERS_FL ) )
+    , maPrinters( this, VclResId( SV_PRINT_PRINTERS ) )
+    , maDetailsBtn( this, VclResId( SV_PRINT_DETAILS_BTN ) )
+    , maStatusLabel( this, VclResId( SV_PRINT_STATUS_TXT ) )
+    , maStatusTxt( this, 0 )
+    , maLocationLabel( this, VclResId( SV_PRINT_LOCATION_TXT ) )
+    , maLocationTxt( this, 0 )
+    , maCommentLabel( this, VclResId( SV_PRINT_COMMENT_TXT ) )
+    , maCommentTxt( this, 0 )
+    , maSetupButton( this, VclResId( SV_PRINT_PRT_SETUP ) )
+    , maCopies( this, VclResId( SV_PRINT_COPIES ) )
+    , maCopySpacer( this, WB_VERT )
+    , maCopyCount( this, VclResId( SV_PRINT_COPYCOUNT ) )
+    , maCopyCountField( this, VclResId( SV_PRINT_COPYCOUNT_FIELD ) )
+    , maCollateBox( this, VclResId( SV_PRINT_COLLATE ) )
+    , maCollateImage( this, VclResId( SV_PRINT_COLLATE_IMAGE ) )
+    , maReverseOrderBox( this, VclResId( SV_PRINT_OPT_REVERSE ) )
+    , maCollateImg( VclResId( SV_PRINT_COLLATE_IMG ) )
+    , maNoCollateImg( VclResId( SV_PRINT_NOCOLLATE_IMG ) )
+    , mnCollateUIMode( 0 )
+{
+    FreeResource();
+
+
+    maCopySpacer.Show();
+    maStatusTxt.Show();
+    maCommentTxt.Show();
+    maLocationTxt.Show();
+
+    setupLayout();
+}
+
+PrintDialog::JobTabPage::~JobTabPage()
+{
+}
+
+void PrintDialog::JobTabPage::setupLayout()
+{
+    // HACK: this is not a dropdown box, but the dropdown line count
+    // sets the results of GetOptimalSize in a normal ListBox
+    maPrinters.SetDropDownLineCount( 4 );
+
+    boost::shared_ptr<vcl::RowOrColumn> xLayout =
+        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
+
+    // add printer fixed line
+    xLayout->addWindow( &maPrinterFL );
+    // add print LB
+    xLayout->addWindow( &maPrinters, 3 );
+
+    // create a row for details button/text and properties button
+    boost::shared_ptr< vcl::RowOrColumn > xDetRow( new vcl::RowOrColumn( xLayout.get(), false ) );
+    xLayout->addChild( xDetRow );
+    xDetRow->addWindow( &maDetailsBtn );
+    xDetRow->addChild( new vcl::Spacer( xDetRow.get(), 2 ) );
+    xDetRow->addWindow( &maSetupButton );
+
+    // create an indent for details
+    boost::shared_ptr< vcl::Indenter > xIndent( new vcl::Indenter( xLayout.get() ) );
+    xLayout->addChild( xIndent );
+    // remember details controls
+    mxDetails = xIndent;
+    // create a column for the details
+    boost::shared_ptr< vcl::LabelColumn > xLabelCol( new vcl::LabelColumn( xIndent.get() ) );
+    xIndent->setChild( xLabelCol );
+    xLabelCol->addRow( &maStatusLabel, &maStatusTxt );
+    xLabelCol->addRow( &maLocationLabel, &maLocationTxt );
+    xLabelCol->addRow( &maCommentLabel, &maCommentTxt );
+
+    // add print range and copies columns
+    xLayout->addWindow( &maCopies );
+    boost::shared_ptr< vcl::RowOrColumn > xRangeRow( new vcl::RowOrColumn( xLayout.get(), false ) );
+    xLayout->addChild( xRangeRow );
+
+    // create print range and add to range row
+    mxPrintRange.reset( new vcl::RowOrColumn( xRangeRow.get() ) );
+    xRangeRow->addChild( mxPrintRange );
+    xRangeRow->addWindow( &maCopySpacer );
+
+    boost::shared_ptr< vcl::RowOrColumn > xCopyCollateCol( new vcl::RowOrColumn( xRangeRow.get() ) );
+    xRangeRow->addChild( xCopyCollateCol );
+
+    // add copies row to copy/collate column
+    boost::shared_ptr< vcl::LabeledElement > xCopiesRow( new vcl::LabeledElement( xCopyCollateCol.get(), 2 ) );
+    xCopyCollateCol->addChild( xCopiesRow );
+    xCopiesRow->setLabel( &maCopyCount );
+    xCopiesRow->setElement( &maCopyCountField );
+    boost::shared_ptr< vcl::LabeledElement > xCollateRow( new vcl::LabeledElement( xCopyCollateCol.get(), 2 ) );
+    xCopyCollateCol->addChild( xCollateRow );
+    xCollateRow->setLabel( &maCollateBox );
+    xCollateRow->setElement( &maCollateImage );
+
+    // maDetailsBtn.SetStyle( maDetailsBtn.GetStyle() | (WB_SMALLSTYLE | WB_BEVELBUTTON) );
+    mxDetails->show( false, false );
+}
+
+void PrintDialog::JobTabPage::readFromSettings()
+{
+    SettingsConfigItem* pItem = SettingsConfigItem::get();
+    rtl::OUString aValue;
+
+    aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                              rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CollateBox" ) ) );
+    if( aValue.equalsIgnoreAsciiCaseAscii( "alwaysoff" ) )
+    {
+        mnCollateUIMode = 1;
+        maCollateBox.Check( sal_False );
+        maCollateBox.Enable( sal_False );
+    }
+    else
+    {
+        mnCollateUIMode = 0;
+        aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                                  rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ) );
+        maCollateBox.Check( aValue.equalsIgnoreAsciiCaseAscii( "true" ) );
+    }
+    Resize();
+}
+
+void PrintDialog::JobTabPage::storeToSettings()
+{
+    SettingsConfigItem* pItem = SettingsConfigItem::get();
+    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CopyCount" ) ),
+                     maCopyCountField.GetText() );
+    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
+                     maCollateBox.IsChecked() ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true")) :
+                                                rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")) );
+}
+
+PrintDialog::OutputOptPage::OutputOptPage( Window* i_pParent, const ResId& i_rResId )
+    : TabPage( i_pParent, i_rResId )
+    , maOptionsLine( this, VclResId( SV_PRINT_OPT_PRINT_FL ) )
+    , maToFileBox( this, VclResId( SV_PRINT_OPT_TOFILE ) )
+    , maCollateSingleJobsBox( this, VclResId( SV_PRINT_OPT_SINGLEJOBS ) )
+{
+    FreeResource();
+
+    setupLayout();
+}
+
+PrintDialog::OutputOptPage::~OutputOptPage()
+{
+}
+
+void PrintDialog::OutputOptPage::setupLayout()
+{
+    boost::shared_ptr<vcl::RowOrColumn> xLayout =
+        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
+
+    xLayout->addWindow( &maOptionsLine );
+    boost::shared_ptr<vcl::Indenter> xIndent( new vcl::Indenter( xLayout.get(), -1 ) );
+    xLayout->addChild( xIndent );
+    boost::shared_ptr<vcl::RowOrColumn> xCol( new vcl::RowOrColumn( xIndent.get() ) );
+    xIndent->setChild( xCol );
+    mxOptGroup = xCol;
+    xCol->addWindow( &maToFileBox );
+    xCol->addWindow( &maCollateSingleJobsBox );
+}
+
+void PrintDialog::OutputOptPage::readFromSettings()
+{
+}
+
+void PrintDialog::OutputOptPage::storeToSettings()
+{
+    SettingsConfigItem* pItem = SettingsConfigItem::get();
+    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ToFile" ) ),
+                     maToFileBox.IsChecked() ? rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("true"))
+                                             : rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("false")) );
+}
+
+PrintDialog::PrintDialog( Window* i_pParent, const boost::shared_ptr<PrinterController>& i_rController )
+    : ModalDialog( i_pParent, VclResId( SV_DLG_PRINT ) )
+    , maOKButton( this, VclResId( SV_PRINT_OK ) )
+    , maCancelButton( this, VclResId( SV_PRINT_CANCEL ) )
+    , maHelpButton( this, VclResId( SV_PRINT_HELP ) )
+    , maPreviewWindow( this, VclResId( SV_PRINT_PAGE_PREVIEW ) )
+    , maPageEdit( this, VclResId( SV_PRINT_PAGE_EDIT ) )
+    , maNumPagesText( this, VclResId( SV_PRINT_PAGE_TXT ) )
+    , maBackwardBtn( this, VclResId( SV_PRINT_PAGE_BACKWARD ) )
+    , maForwardBtn( this, VclResId( SV_PRINT_PAGE_FORWARD ) )
+    , maTabCtrl( this, VclResId( SV_PRINT_TABCTRL ) )
+    , maNUpPage( &maTabCtrl, VclResId( SV_PRINT_TAB_NUP ) )
+    , maJobPage( &maTabCtrl, VclResId( SV_PRINT_TAB_JOB ) )
+    , maOptionsPage( &maTabCtrl, VclResId( SV_PRINT_TAB_OPT ) )
+    , maButtonLine( this, VclResId( SV_PRINT_BUTTONLINE ) )
+    , maPController( i_rController )
+    , maNoPageStr( String( VclResId( SV_PRINT_NOPAGES ) ) )
+    , mnCurPage( 0 )
+    , mnCachedPages( 0 )
+    , maPrintToFileText( String( VclResId( SV_PRINT_TOFILE_TXT ) ) )
+    , maDefPrtText( String( VclResId( SV_PRINT_DEFPRT_TXT ) ) )
+    , mbShowLayoutPage( sal_True )
+{
+    FreeResource();
+
+    // save printbutton text, gets exchanged occasionally with print to file
+    maPrintText = maOKButton.GetText();
+
+    // setup preview controls
+    maForwardBtn.SetStyle( maForwardBtn.GetStyle() | WB_BEVELBUTTON );
+    maBackwardBtn.SetStyle( maBackwardBtn.GetStyle() | WB_BEVELBUTTON );
+
+    // insert the job (general) tab page first
+    maTabCtrl.InsertPage( SV_PRINT_TAB_JOB, maJobPage.GetText() );
+    maTabCtrl.SetTabPage( SV_PRINT_TAB_JOB, &maJobPage );
+
+    // set symbols on forward and backward button
+    maBackwardBtn.SetSymbol( SYMBOL_PREV );
+    maForwardBtn.SetSymbol( SYMBOL_NEXT );
+    maBackwardBtn.ImplSetSmallSymbol( sal_True );
+    maForwardBtn.ImplSetSmallSymbol( sal_True );
+
+    maPageStr = maNumPagesText.GetText();
+
+    // init reverse print
+    maJobPage.maReverseOrderBox.Check( maPController->getReversePrint() );
+
+
+    // fill printer listbox
+    const std::vector< rtl::OUString >& rQueues( Printer::GetPrinterQueues() );
+    for( std::vector< rtl::OUString >::const_iterator it = rQueues.begin();
+         it != rQueues.end(); ++it )
+    {
+        maJobPage.maPrinters.InsertEntry( *it );
+    }
+    // select current printer
+    if( maJobPage.maPrinters.GetEntryPos( maPController->getPrinter()->GetName() ) != LISTBOX_ENTRY_NOTFOUND )
+    {
+        maJobPage.maPrinters.SelectEntry( maPController->getPrinter()->GetName() );
+    }
+    else
+    {
+        // fall back to last printer
+        SettingsConfigItem* pItem = SettingsConfigItem::get();
+        String aValue( pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                                        rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPrinter" ) ) ) );
+        if( maJobPage.maPrinters.GetEntryPos( aValue ) != LISTBOX_ENTRY_NOTFOUND )
+        {
+            maJobPage.maPrinters.SelectEntry( aValue );
+            maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( aValue ) ) );
+        }
+        else
+        {
+            // fall back to default printer
+            maJobPage.maPrinters.SelectEntry( Printer::GetDefaultPrinterName() );
+            maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( Printer::GetDefaultPrinterName() ) ) );
+        }
+    }
+    // not printing to file
+    maPController->resetPrinterOptions( false );
+
+    // get the first page
+    preparePreview( true, true );
+
+    // update the text fields for the printer
+    updatePrinterText();
+
+    // set a select handler
+    maJobPage.maPrinters.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+
+    // setup sizes for N-Up
+    Size aNupSize( maPController->getPrinter()->PixelToLogic(
+                         maPController->getPrinter()->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ) );
+    if( maPController->getPrinter()->GetOrientation() == ORIENTATION_LANDSCAPE )
+    {
+        maNupLandscapeSize = aNupSize;
+        maNupPortraitSize = Size( aNupSize.Height(), aNupSize.Width() );
+    }
+    else
+    {
+        maNupPortraitSize = aNupSize;
+        maNupLandscapeSize = Size( aNupSize.Height(), aNupSize.Width() );
+    }
+    maNUpPage.initFromMultiPageSetup( maPController->getMultipage() );
+
+
+    // setup click handler on the various buttons
+    maOKButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    #if OSL_DEBUG_LEVEL > 1
+    maCancelButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    #endif
+    maHelpButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maForwardBtn.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maBackwardBtn.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maJobPage.maCollateBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maJobPage.maSetupButton.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maJobPage.maDetailsBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maNUpPage.maBorderCB.SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maOptionsPage.maToFileBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maJobPage.maReverseOrderBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maOptionsPage.maCollateSingleJobsBox.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+    maNUpPage.maPagesBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+
+    // setup modify hdl
+    maPageEdit.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    maJobPage.maCopyCountField.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    maNUpPage.maNupRowsEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    maNUpPage.maNupColEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    maNUpPage.maPageMarginEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    maNUpPage.maSheetMarginEdt.SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+
+    // setup select hdl
+    maNUpPage.maNupPagesBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    maNUpPage.maNupOrientationBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    maNUpPage.maNupOrderBox.SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+
+    // setup the layout
+    setupLayout();
+
+    // setup optional UI options set by application
+    setupOptionalUI();
+
+    // set change handler for UI options
+    maPController->setOptionChangeHdl( LINK( this, PrintDialog, UIOptionsChanged ) );
+
+    // set min size pixel to current size
+    Size aOutSize( GetOutputSizePixel() );
+    SetMinOutputSizePixel( aOutSize );
+
+    // if there is space enough, enlarge the preview so it gets roughly as
+    // high as the tab control
+    if( aOutSize.Width() < 768 )
+    {
+        Size aJobPageSize( getJobPageSize() );
+        Size aTabSize( maTabCtrl.GetSizePixel() );
+        if( aJobPageSize.Width() < 1 )
+            aJobPageSize.Width() = aTabSize.Width();
+        if( aJobPageSize.Height() < 1 )
+            aJobPageSize.Height() = aTabSize.Height();
+        long nOptPreviewWidth = aTabSize.Height() * aJobPageSize.Width() / aJobPageSize.Height();
+        // add space for borders
+        nOptPreviewWidth += 15;
+        if( aOutSize.Width() - aTabSize.Width() < nOptPreviewWidth )
+        {
+            aOutSize.Width() = aTabSize.Width() + nOptPreviewWidth;
+            if( aOutSize.Width() > 768 ) // don't enlarge the dialog too much
+                aOutSize.Width() = 768;
+            SetOutputSizePixel( aOutSize );
+        }
+    }
+
+    // append further tab pages
+    if( mbShowLayoutPage )
+    {
+        maTabCtrl.InsertPage( SV_PRINT_TAB_NUP, maNUpPage.GetText() );
+        maTabCtrl.SetTabPage( SV_PRINT_TAB_NUP, &maNUpPage );
+    }
+    maTabCtrl.InsertPage( SV_PRINT_TAB_OPT, maOptionsPage.GetText() );
+    maTabCtrl.SetTabPage( SV_PRINT_TAB_OPT, &maOptionsPage );
+
+    // restore settings from last run
+    readFromSettings();
+
+    // setup dependencies
+    checkControlDependencies();
+
+}
+
+PrintDialog::~PrintDialog()
+{
+    while( ! maControls.empty() )
+    {
+        delete maControls.front();
+        maControls.pop_front();
+    }
+}
+
+void PrintDialog::setupLayout()
+{
+    boost::shared_ptr<vcl::RowOrColumn> xLayout =
+        boost::dynamic_pointer_cast<vcl::RowOrColumn>( getLayout() );
+    xLayout->setOuterBorder( 0 );
+
+
+    boost::shared_ptr< vcl::RowOrColumn > xPreviewAndTab( new vcl::RowOrColumn( xLayout.get(), false ) );
+    size_t nIndex = xLayout->addChild( xPreviewAndTab, 5 );
+    xLayout->setBorders( nIndex, -1, -1, -1, 0 );
+
+    // setup column for preview and sub controls
+    boost::shared_ptr< vcl::RowOrColumn > xPreview( new vcl::RowOrColumn( xPreviewAndTab.get() ) );
+    xPreviewAndTab->addChild( xPreview, 5 );
+    xPreview->addWindow( &maPreviewWindow, 5 );
+    // get a row for the preview controls
+    mxPreviewCtrls.reset( new vcl::RowOrColumn( xPreview.get(), false ) );
+    nIndex = xPreview->addChild( mxPreviewCtrls );
+    boost::shared_ptr< vcl::Spacer > xSpacer( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
+    mxPreviewCtrls->addChild( xSpacer );
+    mxPreviewCtrls->addWindow( &maPageEdit );
+    mxPreviewCtrls->addWindow( &maNumPagesText );
+    xSpacer.reset( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
+    mxPreviewCtrls->addChild( xSpacer );
+    mxPreviewCtrls->addWindow( &maBackwardBtn );
+    mxPreviewCtrls->addWindow( &maForwardBtn );
+    xSpacer.reset( new vcl::Spacer( mxPreviewCtrls.get(), 2 ) );
+    mxPreviewCtrls->addChild( xSpacer );
+
+    // continue with the tab ctrl
+    xPreviewAndTab->addWindow( &maTabCtrl );
+
+    // add the button line
+    xLayout->addWindow( &maButtonLine );
+
+    // add the row for the buttons
+    boost::shared_ptr< vcl::RowOrColumn > xButtons( new vcl::RowOrColumn( xLayout.get(), false ) );
+    nIndex = xLayout->addChild( xButtons );
+    xLayout->setBorders( nIndex, -1, 0, -1, -1 );
+
+    Size aMinSize( maCancelButton.GetSizePixel() );
+    // insert help button
+    xButtons->setMinimumSize( xButtons->addWindow( &maHelpButton ), aMinSize );
+    // insert a spacer, cancel and OK buttons are right aligned
+    xSpacer.reset( new vcl::Spacer( xButtons.get(), 2 ) );
+    xButtons->addChild( xSpacer );
+    xButtons->setMinimumSize( xButtons->addWindow( &maOKButton ), aMinSize );
+    xButtons->setMinimumSize( xButtons->addWindow( &maCancelButton ), aMinSize );
+}
+
+void PrintDialog::readFromSettings()
+{
+    maJobPage.readFromSettings();
+    maNUpPage.readFromSettings();
+    maOptionsPage.readFromSettings();
+
+    // read last selected tab page; if it exists, actiavte it
+    SettingsConfigItem* pItem = SettingsConfigItem::get();
+    rtl::OUString aValue = pItem->getValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                                            rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPage" ) ) );
+    sal_uInt16 nCount = maTabCtrl.GetPageCount();
+    for( sal_uInt16 i = 0; i < nCount; i++ )
+    {
+        sal_uInt16 nPageId = maTabCtrl.GetPageId( i );
+        if( aValue.equals( maTabCtrl.GetPageText( nPageId ) ) )
+        {
+            maTabCtrl.SelectTabPage( nPageId );
+            break;
+        }
+    }
+    maOKButton.SetText( maOptionsPage.maToFileBox.IsChecked() ? maPrintToFileText : maPrintText );
+    if( maOptionsPage.maToFileBox.IsChecked() )
+    {
+        maPController->resetPrinterOptions( true );
+        preparePreview( true, true );
+    }
+}
+
+void PrintDialog::storeToSettings()
+{
+    maJobPage.storeToSettings();
+    maNUpPage.storeToSettings();
+    maOptionsPage.storeToSettings();
+
+    // store last selected printer
+    SettingsConfigItem* pItem = SettingsConfigItem::get();
+    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPrinter" ) ),
+                     maJobPage.maPrinters.GetSelectEntry() );
+
+    pItem->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintDialog" ) ),
+                     rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LastPage" ) ),
+                     maTabCtrl.GetPageText( maTabCtrl.GetCurPageId() ) );
+    pItem->Commit();
+}
+
+bool PrintDialog::isPrintToFile()
+{
+    return maOptionsPage.maToFileBox.IsChecked();
+}
+
+int PrintDialog::getCopyCount()
+{
+    return static_cast<int>(maJobPage.maCopyCountField.GetValue());
+}
+
+bool PrintDialog::isCollate()
+{
+    return maJobPage.maCopyCountField.GetValue() > 1 ? maJobPage.maCollateBox.IsChecked() : sal_False;
+}
+
+bool PrintDialog::isSingleJobs()
+{
+    return maOptionsPage.maCollateSingleJobsBox.IsChecked();
+}
+
+void setHelpId( Window* i_pWindow, const Sequence< rtl::OUString >& i_rHelpIds, sal_Int32 i_nIndex )
+{
+    if( i_nIndex >= 0 && i_nIndex < i_rHelpIds.getLength() )
+        i_pWindow->SetHelpId( rtl::OUStringToOString( i_rHelpIds.getConstArray()[i_nIndex], RTL_TEXTENCODING_UTF8 ) );
+}
+
+static void setHelpText( Window* i_pWindow, const Sequence< rtl::OUString >& i_rHelpTexts, sal_Int32 i_nIndex )
+{
+    // without a help text set and the correct smartID,
+    // help texts will be retrieved from the online help system
+    if( i_nIndex >= 0 && i_nIndex < i_rHelpTexts.getLength() )
+        i_pWindow->SetHelpText( i_rHelpTexts.getConstArray()[i_nIndex] );
+}
+
+void updateMaxSize( const Size& i_rCheckSize, Size& o_rMaxSize )
+{
+    if( i_rCheckSize.Width() > o_rMaxSize.Width() )
+        o_rMaxSize.Width() = i_rCheckSize.Width();
+    if( i_rCheckSize.Height() > o_rMaxSize.Height() )
+        o_rMaxSize.Height() = i_rCheckSize.Height();
+}
+
+void PrintDialog::setupOptionalUI()
+{
+    std::vector< boost::shared_ptr<vcl::RowOrColumn> > aDynamicColumns;
+    boost::shared_ptr< vcl::RowOrColumn > pCurColumn;
+
+    Window* pCurParent = 0, *pDynamicPageParent = 0;
+    sal_uInt16 nOptPageId = 9;
+    bool bOnStaticPage = false;
+    bool bSubgroupOnStaticPage = false;
+
+    std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> > aPropertyToDependencyRowMap;
+
+    const Sequence< PropertyValue >& rOptions( maPController->getUIOptions() );
+    for( int i = 0; i < rOptions.getLength(); i++ )
+    {
+        Sequence< beans::PropertyValue > aOptProp;
+        rOptions[i].Value >>= aOptProp;
+
+        // extract ui element
+        rtl::OUString aCtrlType;
+        rtl::OUString aText;
+        rtl::OUString aPropertyName;
+        Sequence< rtl::OUString > aChoices;
+        Sequence< sal_Bool > aChoicesDisabled;
+        Sequence< rtl::OUString > aHelpTexts;
+        Sequence< rtl::OUString > aHelpIds;
+        sal_Int64 nMinValue = 0, nMaxValue = 0;
+        sal_Int32 nCurHelpText = 0;
+        rtl::OUString aGroupingHint;
+        rtl::OUString aDependsOnName;
+        sal_Int32 nDependsOnValue = 0;
+        sal_Bool bUseDependencyRow = sal_False;
+
+        for( int n = 0; n < aOptProp.getLength(); n++ )
+        {
+            const beans::PropertyValue& rEntry( aOptProp[ n ] );
+            if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Text" ) ) )
+            {
+                rEntry.Value >>= aText;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ControlType" ) ) )
+            {
+                rEntry.Value >>= aCtrlType;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Choices" ) ) )
+            {
+                rEntry.Value >>= aChoices;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "ChoicesDisabled" ) ) )
+            {
+                rEntry.Value >>= aChoicesDisabled;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Property" ) ) )
+            {
+                PropertyValue aVal;
+                rEntry.Value >>= aVal;
+                aPropertyName = aVal.Name;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Enabled" ) ) )
+            {
+                sal_Bool bValue = sal_True;
+                rEntry.Value >>= bValue;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "GroupingHint" ) ) )
+            {
+                rEntry.Value >>= aGroupingHint;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DependsOnName" ) ) )
+            {
+                rEntry.Value >>= aDependsOnName;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "DependsOnEntry" ) ) )
+            {
+                rEntry.Value >>= nDependsOnValue;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "AttachToDependency" ) ) )
+            {
+                rEntry.Value >>= bUseDependencyRow;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MinValue" ) ) )
+            {
+                rEntry.Value >>= nMinValue;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "MaxValue" ) ) )
+            {
+                rEntry.Value >>= nMaxValue;
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HelpText" ) ) )
+            {
+                if( ! (rEntry.Value >>= aHelpTexts) )
+                {
+                    rtl::OUString aHelpText;
+                    if( (rEntry.Value >>= aHelpText) )
+                    {
+                        aHelpTexts.realloc( 1 );
+                        *aHelpTexts.getArray() = aHelpText;
+                    }
+                }
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HelpId" ) ) )
+            {
+                if( ! (rEntry.Value >>= aHelpIds ) )
+                {
+                    rtl::OUString aHelpId;
+                    if( (rEntry.Value >>= aHelpId) )
+                    {
+                        aHelpIds.realloc( 1 );
+                        *aHelpIds.getArray() = aHelpId;
+                    }
+                }
+            }
+            else if( rEntry.Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "HintNoLayoutPage" ) ) )
+            {
+                sal_Bool bNoLayoutPage = sal_False;
+                rEntry.Value >>= bNoLayoutPage;
+                mbShowLayoutPage = ! bNoLayoutPage;
+            }
+        }
+
+        // bUseDependencyRow should only be true if a dependency exists
+        bUseDependencyRow = bUseDependencyRow && (aDependsOnName.getLength() != 0);
+
+        // is it necessary to switch between static and dynamic pages ?
+        bool bSwitchPage = false;
+        if( aGroupingHint.getLength() )
+            bSwitchPage = true;
+        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Subgroup" ) ) || (bOnStaticPage && ! bSubgroupOnStaticPage )  )
+            bSwitchPage = true;
+        if( bSwitchPage )
+        {
+            // restore to dynamic
+            pCurParent = pDynamicPageParent;
+            if( ! aDynamicColumns.empty() )
+                pCurColumn = aDynamicColumns.back();
+            else
+                pCurColumn.reset();
+            bOnStaticPage = false;
+            bSubgroupOnStaticPage = false;
+
+            if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) )
+            {
+                pCurColumn = maJobPage.mxPrintRange;
+                pCurParent = &maJobPage;            // set job page as current parent
+                bOnStaticPage = true;
+            }
+            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OptionsPage" ) ) )
+            {
+                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maOptionsPage.getLayout());
+                pCurParent = &maOptionsPage;        // set options page as current parent
+                bOnStaticPage = true;
+            }
+            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "OptionsPageOptGroup" ) ) )
+            {
+                pCurColumn = maOptionsPage.mxOptGroup;
+                pCurParent = &maOptionsPage;        // set options page as current parent
+                bOnStaticPage = true;
+            }
+            else if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LayoutPage" ) ) )
+            {
+                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maNUpPage.getLayout());
+                pCurParent = &maNUpPage;            // set layout page as current parent
+                bOnStaticPage = true;
+            }
+            else if( aGroupingHint.getLength() )
+            {
+                pCurColumn = boost::dynamic_pointer_cast<vcl::RowOrColumn>(maJobPage.getLayout());
+                pCurParent = &maJobPage;            // set job page as current parent
+                bOnStaticPage = true;
+            }
+        }
+
+        if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Group" ) ) ||
+            ( ! pCurParent && ! (bOnStaticPage || aGroupingHint.getLength() ) ) )
+        {
+            // add new tab page
+            TabPage* pNewGroup = new TabPage( &maTabCtrl );
+            maControls.push_front( pNewGroup );
+            pDynamicPageParent = pCurParent = pNewGroup;
+            pNewGroup->SetText( aText );
+            maTabCtrl.InsertPage( ++nOptPageId, aText );
+            maTabCtrl.SetTabPage( nOptPageId, pNewGroup );
+
+            // set help id
+            setHelpId( pNewGroup, aHelpIds, 0 );
+            // set help text
+            setHelpText( pNewGroup, aHelpTexts, 0 );
+
+            aDynamicColumns.push_back( boost::dynamic_pointer_cast<vcl::RowOrColumn>(pNewGroup->getLayout()) );
+            pCurColumn = aDynamicColumns.back();
+            pCurColumn->setParentWindow( pNewGroup );
+            bSubgroupOnStaticPage = false;
+            bOnStaticPage = false;
+        }
+        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Subgroup" ) ) && (pCurParent || aGroupingHint.getLength() ) )
+        {
+            bSubgroupOnStaticPage = (aGroupingHint.getLength() != 0);
+            // create group FixedLine
+            if( ! aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) ||
+                ! pCurColumn->countElements() == 0
+               )
+            {
+                Window* pNewSub = NULL;
+                if( aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintRange" ) ) )
+                    pNewSub = new FixedText( pCurParent, WB_VCENTER );
+                else
+                    pNewSub = new FixedLine( pCurParent );
+                maControls.push_front( pNewSub );
+                pNewSub->SetText( aText );
+                pNewSub->Show();
+
+                // set help id
+                setHelpId( pNewSub, aHelpIds, 0 );
+                // set help text
+                setHelpText( pNewSub, aHelpTexts, 0 );
+                // add group to current column
+                pCurColumn->addWindow( pNewSub );
+            }
+
+            // add an indent to the current column
+            vcl::Indenter* pIndent = new vcl::Indenter( pCurColumn.get(), -1 );
+            pCurColumn->addChild( pIndent );
+            // and create a column inside the indent
+            pCurColumn.reset( new vcl::RowOrColumn( pIndent ) );
+            pIndent->setChild( pCurColumn );
+        }
+        // EVIL
+        else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bool" ) ) &&
+                 aGroupingHint.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "LayoutPage" ) ) &&
+                 aPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintProspect" ) )
+                 )
+        {
+            maNUpPage.maBrochureBtn.SetText( aText );
+            maNUpPage.maBrochureBtn.Show();
+            setHelpText( &maNUpPage.maBrochureBtn, aHelpTexts, 0 );
+
+            sal_Bool bVal = sal_False;
+            PropertyValue* pVal = maPController->getValue( aPropertyName );
+            if( pVal )
+                pVal->Value >>= bVal;
+            maNUpPage.maBrochureBtn.Check( bVal );
+            maNUpPage.maBrochureBtn.Enable( maPController->isUIOptionEnabled( aPropertyName ) && pVal != NULL );
+            maNUpPage.maBrochureBtn.SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
+
+            maPropertyToWindowMap[ aPropertyName ].push_back( &maNUpPage.maBrochureBtn );
+            maControlToPropertyMap[&maNUpPage.maBrochureBtn] = aPropertyName;
+
+            aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, maNUpPage.mxBrochureDep ) );
+        }
+        else
+        {
+            boost::shared_ptr<vcl::RowOrColumn> pSaveCurColumn( pCurColumn );
+
+            if( bUseDependencyRow )
+            {
+                // find the correct dependency row (if any)
+                std::pair< std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >::iterator,
+                           std::multimap< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >::iterator > aDepRange;
+                aDepRange = aPropertyToDependencyRowMap.equal_range( aDependsOnName );
+                if( aDepRange.first != aDepRange.second )
+                {
+                    while( nDependsOnValue && aDepRange.first != aDepRange.second )
+                    {
+                        nDependsOnValue--;
+                        ++aDepRange.first;
+                    }
+                    if( aDepRange.first != aPropertyToDependencyRowMap.end() )
+                    {
+                        pCurColumn = aDepRange.first->second;
+                        maReverseDependencySet.insert( aPropertyName );
+                    }
+                }
+            }
+            if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bool" ) ) && pCurParent )
+            {
+                // add a check box
+                CheckBox* pNewBox = new CheckBox( pCurParent );
+                maControls.push_front( pNewBox );
+                pNewBox->SetText( aText );
+                pNewBox->Show();
+
+                sal_Bool bVal = sal_False;
+                PropertyValue* pVal = maPController->getValue( aPropertyName );
+                if( pVal )
+                    pVal->Value >>= bVal;
+                pNewBox->Check( bVal );
+                pNewBox->SetToggleHdl( LINK( this, PrintDialog, UIOption_CheckHdl ) );
+
+                maPropertyToWindowMap[ aPropertyName ].push_back( pNewBox );
+                maControlToPropertyMap[pNewBox] = aPropertyName;
+
+                // set help id
+                setHelpId( pNewBox, aHelpIds, 0 );
+                // set help text
+                setHelpText( pNewBox, aHelpTexts, 0 );
+
+                boost::shared_ptr<vcl::RowOrColumn> pDependencyRow( new vcl::RowOrColumn( pCurColumn.get(), false ) );
+                pCurColumn->addChild( pDependencyRow );
+                aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pDependencyRow ) );
+
+                // add checkbox to current column
+                pDependencyRow->addWindow( pNewBox );
+            }
+            else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Radio" ) ) && pCurParent )
+            {
+                boost::shared_ptr<vcl::RowOrColumn> pRadioColumn( pCurColumn );
+                if( aText.getLength() )
+                {
+                    // add a FixedText:
+                    FixedText* pHeading = new FixedText( pCurParent );
+                    maControls.push_front( pHeading );
+                    pHeading->SetText( aText );
+                    pHeading->Show();
+
+                    // set help id
+                    setHelpId( pHeading, aHelpIds, nCurHelpText );
+                    // set help text
+                    setHelpText( pHeading, aHelpTexts, nCurHelpText );
+                    nCurHelpText++;
+                    // add fixed text to current column
+                    pCurColumn->addWindow( pHeading );
+                    // add an indent to the current column
+                    vcl::Indenter* pIndent = new vcl::Indenter( pCurColumn.get(), 15 );
+                    pCurColumn->addChild( pIndent );
+                    // and create a column inside the indent
+                    pRadioColumn.reset( new vcl::RowOrColumn( pIndent ) );
+                    pIndent->setChild( pRadioColumn );
+                }
+                // iterate options
+                sal_Int32 nSelectVal = 0;
+                PropertyValue* pVal = maPController->getValue( aPropertyName );
+                if( pVal && pVal->Value.hasValue() )
+                    pVal->Value >>= nSelectVal;
+                for( sal_Int32 m = 0; m < aChoices.getLength(); m++ )
+                {
+                    boost::shared_ptr<vcl::LabeledElement> pLabel( new vcl::LabeledElement( pRadioColumn.get(), 1 ) );
+                    pRadioColumn->addChild( pLabel );
+                    boost::shared_ptr<vcl::RowOrColumn> pDependencyRow( new vcl::RowOrColumn( pLabel.get(), false ) );
+                    pLabel->setElement( pDependencyRow );
+                    aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pDependencyRow ) );
+
+                    RadioButton* pBtn = new RadioButton( pCurParent, m == 0 ? WB_GROUP : 0 );
+                    maControls.push_front( pBtn );
+                    pBtn->SetText( aChoices[m] );
+                    pBtn->Check( m == nSelectVal );
+                    pBtn->SetToggleHdl( LINK( this, PrintDialog, UIOption_RadioHdl ) );
+                    if( aChoicesDisabled.getLength() > m && aChoicesDisabled[m] == sal_True )
+                        pBtn->Enable( sal_False );
+                    pBtn->Show();
+                    maPropertyToWindowMap[ aPropertyName ].push_back( pBtn );
+                    maControlToPropertyMap[pBtn] = aPropertyName;
+                    maControlToNumValMap[pBtn] = m;
+
+                    // set help id
+                    setHelpId( pBtn, aHelpIds, nCurHelpText );
+                    // set help text
+                    setHelpText( pBtn, aHelpTexts, nCurHelpText );
+                    nCurHelpText++;
+                    // add the radio button to the column
+                    pLabel->setLabel( pBtn );
+                }
+            }
+            else if( ( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "List" ) )   ||
+                       aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Range" ) )  ||
+                       aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Edit" ) )
+                     ) && pCurParent )
+            {
+                // create a row in the current column
+                boost::shared_ptr<vcl::RowOrColumn> pFieldColumn( new vcl::RowOrColumn( pCurColumn.get(), false ) );
+                pCurColumn->addChild( pFieldColumn );
+                aPropertyToDependencyRowMap.insert( std::pair< rtl::OUString, boost::shared_ptr<vcl::RowOrColumn> >( aPropertyName, pFieldColumn ) );
+
+                vcl::LabeledElement* pLabel = NULL;
+                if( aText.getLength() )
+                {
+                    // add a FixedText:
+                    FixedText* pHeading = new FixedText( pCurParent, WB_VCENTER );
+                    maControls.push_front( pHeading );
+                    pHeading->SetText( aText );
+                    pHeading->Show();
+
+
+                    // add to row
+                    pLabel = new vcl::LabeledElement( pFieldColumn.get(), 2 );
+                    pFieldColumn->addChild( pLabel );
+                    pLabel->setLabel( pHeading );
+                }
+
+                if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "List" ) ) )
+                {
+                    ListBox* pList = new ListBox( pCurParent, WB_DROPDOWN | WB_BORDER );
+                    maControls.push_front( pList );
+
+                    // iterate options
+                    for( sal_Int32 m = 0; m < aChoices.getLength(); m++ )
+                    {
+                        pList->InsertEntry( aChoices[m] );
+                    }
+                    sal_Int32 nSelectVal = 0;
+                    PropertyValue* pVal = maPController->getValue( aPropertyName );
+                    if( pVal && pVal->Value.hasValue() )
+                        pVal->Value >>= nSelectVal;
+                    pList->SelectEntryPos( static_cast<sal_uInt16>(nSelectVal) );
+                    pList->SetSelectHdl( LINK( this, PrintDialog, UIOption_SelectHdl ) );
+                    pList->SetDropDownLineCount( static_cast<sal_uInt16>(aChoices.getLength()) );
+                    pList->Show();
+
+                    // set help id
+                    setHelpId( pList, aHelpIds, 0 );
+                    // set help text
+                    setHelpText( pList, aHelpTexts, 0 );
+
+                    maPropertyToWindowMap[ aPropertyName ].push_back( pList );
+                    maControlToPropertyMap[pList] = aPropertyName;
+
+                    // finish the pair
+                    if( pLabel )
+                        pLabel->setElement( pList );
+                    else
+                        pFieldColumn->addWindow( pList );
+                }
+                else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Range" ) ) )
+                {
+                    NumericField* pField = new NumericField( pCurParent, WB_BORDER | WB_SPIN );
+                    maControls.push_front( pField );
+
+                    // set min/max and current value
+                    if( nMinValue != nMaxValue )
+                    {
+                        pField->SetMin( nMinValue );
+                        pField->SetMax( nMaxValue );
+                    }
+                    sal_Int64 nCurVal = 0;
+                    PropertyValue* pVal = maPController->getValue( aPropertyName );
+                    if( pVal && pVal->Value.hasValue() )
+                        pVal->Value >>= nCurVal;
+                    pField->SetValue( nCurVal );
+                    pField->SetModifyHdl( LINK( this, PrintDialog, UIOption_ModifyHdl ) );
+                    pField->Show();
+
+                    // set help id
+                    setHelpId( pField, aHelpIds, 0 );
+                    // set help text
+                    setHelpText( pField, aHelpTexts, 0 );
+
+                    maPropertyToWindowMap[ aPropertyName ].push_back( pField );
+                    maControlToPropertyMap[pField] = aPropertyName;
+
+                    // add to row
+                    if( pLabel )
+                        pLabel->setElement( pField );
+                    else
+                        pFieldColumn->addWindow( pField );
+                }
+                else if( aCtrlType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Edit" ) ) )
+                {
+                    Edit* pField = new Edit( pCurParent, WB_BORDER );
+                    maControls.push_front( pField );
+
+                    rtl::OUString aCurVal;
+                    PropertyValue* pVal = maPController->getValue( aPropertyName );
+                    if( pVal && pVal->Value.hasValue() )
+                        pVal->Value >>= aCurVal;
+                    pField->SetText( aCurVal );
+                    pField->SetModifyHdl( LINK( this, PrintDialog, UIOption_ModifyHdl ) );
+                    pField->Show();
+
+                    // set help id
+                    setHelpId( pField, aHelpIds, 0 );
+                    // set help text
+                    setHelpText( pField, aHelpTexts, 0 );
+
+                    maPropertyToWindowMap[ aPropertyName ].push_back( pField );
+                    maControlToPropertyMap[pField] = aPropertyName;
+
+                    // add to row
+                    if( pLabel )
+                        pLabel->setElement( pField );
+                    else
+                        pFieldColumn->addWindow( pField, 2 );
+                }
+            }
+            else
+            {
+                OSL_FAIL( "Unsupported UI option" );
+            }
+
+            pCurColumn = pSaveCurColumn;
+        }
+    }
+
+    // #i106506# if no brochure button, then the singular Pages radio button
+    // makes no sense, so replace it by a FixedText label
+    if( ! maNUpPage.maBrochureBtn.IsVisible() )
+    {
+        if( maNUpPage.mxPagesBtnLabel.get() )
+        {
+            maNUpPage.maPagesBoxTitleTxt.SetText( maNUpPage.maPagesBtn.GetText() );
+            maNUpPage.maPagesBoxTitleTxt.Show( sal_True );
+            maNUpPage.mxPagesBtnLabel->setLabel( &maNUpPage.maPagesBoxTitleTxt );
+            maNUpPage.maPagesBtn.Show( sal_False );
+        }
+    }
+
+    // update enable states
+    checkOptionalControlDependencies();
+
+    // print range empty (currently math only) -> hide print range and spacer line
+    if( maJobPage.mxPrintRange->countElements() == 0 )
+    {
+        maJobPage.mxPrintRange->show( false, false );
+        maJobPage.maCopySpacer.Show( sal_False );
+        maJobPage.maReverseOrderBox.Show( sal_False );
+    }
+    else
+    {
+        // add an indent to the current column
+        vcl::Indenter* pIndent = new vcl::Indenter( maJobPage.mxPrintRange.get(), -1 );
+        maJobPage.mxPrintRange->addChild( pIndent );
+        // and create a column inside the indent
+        pIndent->setWindow( &maJobPage.maReverseOrderBox );
+        maJobPage.maReverseOrderBox.Show( sal_True );
+    }
+
+#ifdef WNT
+    // FIXME: the GetNativeControlRegion call on Windows has some issues
+    // (which skew the results of GetOptimalSize())
+    // however fixing this thoroughly needs to take interaction with paint into
+    // account, making the right fix less simple. Fix this the right way
+    // at some point. For now simply add some space at the lowest element
+    size_t nIndex = maJobPage.getLayout()->countElements();
+    if( nIndex > 0 ) // sanity check
+        maJobPage.getLayout()->setBorders( nIndex-1, 0, 0, 0, -1 );
+#endif
+
+    // create auto mnemomnics now so they can be calculated in layout
+    ImplWindowAutoMnemonic( &maJobPage );
+    ImplWindowAutoMnemonic( &maNUpPage );
+    ImplWindowAutoMnemonic( &maOptionsPage );
+    ImplWindowAutoMnemonic( this );
+
+    // calculate job page
+    Size aMaxSize = maJobPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED );
+    // and layout page
+    updateMaxSize( maNUpPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ), aMaxSize );
+    // and options page
+    updateMaxSize( maOptionsPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ), aMaxSize );
+
+    for( std::vector< boost::shared_ptr<vcl::RowOrColumn> >::iterator it = aDynamicColumns.begin();
+         it != aDynamicColumns.end(); ++it )
+    {
+        Size aPageSize( (*it)->getOptimalSize( WINDOWSIZE_PREFERRED ) );
+        updateMaxSize( aPageSize, aMaxSize );
+    }
+
+    // resize dialog if necessary
+    Size aTabSize = maTabCtrl.GetTabPageSizePixel();
+    maTabCtrl.SetMinimumSizePixel( maTabCtrl.GetSizePixel() );
+    if( aMaxSize.Height() > aTabSize.Height() || aMaxSize.Width() > aTabSize.Width() )
+    {
+        Size aCurSize( GetOutputSizePixel() );
+        if( aMaxSize.Height() > aTabSize.Height() )
+        {
+            aCurSize.Height() += aMaxSize.Height() - aTabSize.Height();
+            aTabSize.Height() = aMaxSize.Height();
+        }
+        if( aMaxSize.Width() > aTabSize.Width() )
+        {
+            aCurSize.Width() += aMaxSize.Width() - aTabSize.Width();
+            // and the tab ctrl needs more space, too
+            aTabSize.Width() = aMaxSize.Width();
+        }
+        maTabCtrl.SetTabPageSizePixel( aTabSize );
+        maTabCtrl.SetMinimumSizePixel( maTabCtrl.GetSizePixel() );
+    }
+
+    Size aSz = getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED );
+
+    SetOutputSizePixel( aSz );
+}
+
+void PrintDialog::DataChanged( const DataChangedEvent& i_rDCEvt )
+{
+    // react on settings changed
+    if( i_rDCEvt.GetType() == DATACHANGED_SETTINGS )
+        checkControlDependencies();
+    ModalDialog::DataChanged( i_rDCEvt );
+}
+
+void PrintDialog::checkControlDependencies()
+{
+    if( maJobPage.maCopyCountField.GetValue() > 1 )
+        maJobPage.maCollateBox.Enable( maJobPage.mnCollateUIMode == 0 );
+    else
+        maJobPage.maCollateBox.Enable( sal_False );
+
+    Image aImg( maJobPage.maCollateBox.IsChecked() ? maJobPage.maCollateImg : maJobPage.maNoCollateImg );
+
+    Size aImgSize( aImg.GetSizePixel() );
+
+    // adjust size of image
+    maJobPage.maCollateImage.SetSizePixel( aImgSize );
+    maJobPage.maCollateImage.SetImage( aImg );
+    maJobPage.getLayout()->resize();
+
+    // enable setup button only for printers that can be setup
+    bool bHaveSetup = maPController->getPrinter()->HasSupport( SUPPORT_SETUPDIALOG );
+    maJobPage.maSetupButton.Enable( bHaveSetup );
+    if( bHaveSetup )
+    {
+        if( ! maJobPage.maSetupButton.IsVisible() )
+        {
+            Point aPrinterPos( maJobPage.maPrinters.GetPosPixel() );
+            Point aSetupPos( maJobPage.maSetupButton.GetPosPixel() );
+            Size aPrinterSize( maJobPage.maPrinters.GetSizePixel() );
+            aPrinterSize.Width() = aSetupPos.X() - aPrinterPos.X() - LogicToPixel( Size( 5, 5 ), MapMode( MAP_APPFONT ) ).Width();
+            maJobPage.maPrinters.SetSizePixel( aPrinterSize );
+            maJobPage.maSetupButton.Show();
+            getLayout()->resize();
+        }
+    }
+    else
+    {
+        if( maJobPage.maSetupButton.IsVisible() )
+        {
+            Point aPrinterPos( maJobPage.maPrinters.GetPosPixel() );
+            Point aSetupPos( maJobPage.maSetupButton.GetPosPixel() );
+            Size aPrinterSize( maJobPage.maPrinters.GetSizePixel() );
+            Size aSetupSize( maJobPage.maSetupButton.GetSizePixel() );
+            aPrinterSize.Width() = aSetupPos.X() + aSetupSize.Width() - aPrinterPos.X();
+            maJobPage.maPrinters.SetSizePixel( aPrinterSize );
+            maJobPage.maSetupButton.Hide();
+            getLayout()->resize();
+        }
+    }
+}
+
+void PrintDialog::checkOptionalControlDependencies()
+{
+    for( std::map< Window*, rtl::OUString >::iterator it = maControlToPropertyMap.begin();
+         it != maControlToPropertyMap.end(); ++it )
+    {
+        bool bShouldbeEnabled = maPController->isUIOptionEnabled( it->second );
+        if( ! bShouldbeEnabled )
+        {
+            // enable controls that are directly attached to a dependency anyway
+            // if the normally disabled controls get modified, change the dependency
+            // so the control would be enabled
+            // example: in print range "Print All" is selected, "Page Range" is then of course
+            // not selected and the Edit for the Page Range would be disabled
+            // as a convenience we should enable the Edit anyway and automatically select
+            // "Page Range" instead of "Print All" if the Edit gets modified
+            if( maReverseDependencySet.find( it->second ) != maReverseDependencySet.end() )
+            {
+                rtl::OUString aDep( maPController->getDependency( it->second ) );
+                // if the dependency is at least enabled, then enable this control anyway
+                if( aDep.getLength() && maPController->isUIOptionEnabled( aDep ) )
+                    bShouldbeEnabled = true;
+            }
+        }
+
+        if( bShouldbeEnabled && dynamic_cast<RadioButton*>(it->first) )
+        {
+            std::map< Window*, sal_Int32 >::const_iterator r_it = maControlToNumValMap.find( it->first );
+            if( r_it != maControlToNumValMap.end() )
+            {
+                bShouldbeEnabled = maPController->isUIChoiceEnabled( it->second, r_it->second );
+            }
+        }
+
+
+        bool bIsEnabled = it->first->IsEnabled();
+        // Enable does not do a change check first, so can be less cheap than expected
+        if( bShouldbeEnabled != bIsEnabled )
+            it->first->Enable( bShouldbeEnabled );
+    }
+}
+
+static rtl::OUString searchAndReplace( const rtl::OUString& i_rOrig, const char* i_pRepl, sal_Int32 i_nReplLen, const rtl::OUString& i_rRepl )
+{
+    sal_Int32 nPos = i_rOrig.indexOfAsciiL( i_pRepl, i_nReplLen );
+    if( nPos != -1 )
+    {
+        rtl::OUStringBuffer aBuf( i_rOrig.getLength() );
+        aBuf.append( i_rOrig.getStr(), nPos );
+        aBuf.append( i_rRepl );
+        if( nPos + i_nReplLen < i_rOrig.getLength() )
+            aBuf.append( i_rOrig.getStr() + nPos + i_nReplLen );
+        return aBuf.makeStringAndClear();
+    }
+    return i_rOrig;
+}
+
+void PrintDialog::updatePrinterText()
+{
+    String aDefPrt( Printer::GetDefaultPrinterName() );
+    const QueueInfo* pInfo = Printer::GetQueueInfo( maJobPage.maPrinters.GetSelectEntry(), true );
+    if( pInfo )
+    {
+        maJobPage.maLocationTxt.SetText( pInfo->GetLocation() );
+        maJobPage.maCommentTxt.SetText( pInfo->GetComment() );
+        // FIXME: status text
+        rtl::OUString aStatus;
+        if( aDefPrt == pInfo->GetPrinterName() )
+            aStatus = maDefPrtText;
+        maJobPage.maStatusTxt.SetText( aStatus );
+    }
+    else
+    {
+        maJobPage.maLocationTxt.SetText( String() );
+        maJobPage.maCommentTxt.SetText( String() );
+        maJobPage.maStatusTxt.SetText( String() );
+    }
+}
+
+void PrintDialog::setPreviewText( sal_Int32 )
+{
+    rtl::OUString aNewText( searchAndReplace( maPageStr, "%n", 2, rtl::OUString::valueOf( mnCachedPages )  ) );
+    maNumPagesText.SetText( aNewText );
+
+    // if layout is already established the refresh layout of
+    // preview controls since text length may have changes
+    if( mxPreviewCtrls.get() )
+        mxPreviewCtrls->setManagedArea( mxPreviewCtrls->getManagedArea() );
+}
+
+void PrintDialog::preparePreview( bool i_bNewPage, bool i_bMayUseCache )
+{
+    // page range may have changed depending on options
+    sal_Int32 nPages = maPController->getFilteredPageCount();
+    mnCachedPages = nPages;
+
+    if( mnCurPage >= nPages )
+        mnCurPage = nPages-1;
+    if( mnCurPage < 0 )
+        mnCurPage = 0;
+
+    setPreviewText( mnCurPage );
+
+    maPageEdit.SetMin( 1 );
+    maPageEdit.SetMax( nPages );
+
+    if( i_bNewPage )
+    {
+        const MapMode aMapMode( MAP_100TH_MM );
+        GDIMetaFile aMtf;
+        boost::shared_ptr<Printer> aPrt( maPController->getPrinter() );
+        if( nPages > 0 )
+        {
+            PrinterController::PageSize aPageSize =
+                maPController->getFilteredPageFile( mnCurPage, aMtf, i_bMayUseCache );
+            if( ! aPageSize.bFullPaper )
+            {
+                Point aOff( aPrt->PixelToLogic( aPrt->GetPageOffsetPixel(), aMapMode ) );
+                aMtf.Move( aOff.X(), aOff.Y() );
+            }
+        }
+
+        Size aCurPageSize = aPrt->PixelToLogic( aPrt->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) );
+        maPreviewWindow.setPreview( aMtf, aCurPageSize,
+                                    aPrt->GetPaperName( false ),
+                                    nPages > 0 ? rtl::OUString() : maNoPageStr,
+                                    aPrt->ImplGetDPIX(), aPrt->ImplGetDPIY(),
+                                    aPrt->GetPrinterOptions().IsConvertToGreyscales()
+                                   );
+
+        maForwardBtn.Enable( mnCurPage < nPages-1 );
+        maBackwardBtn.Enable( mnCurPage != 0 );
+        maPageEdit.Enable( nPages > 1 );
+    }
+}
+
+Size PrintDialog::getJobPageSize()
+{
+    if( maFirstPageSize.Width() == 0 && maFirstPageSize.Height() == 0)
+    {
+        maFirstPageSize = maNupPortraitSize;
+        GDIMetaFile aMtf;
+        if( maPController->getPageCountProtected() > 0 )
+        {
+            PrinterController::PageSize aPageSize = maPController->getPageFile( 0, aMtf, true );
+            maFirstPageSize = aPageSize.aSize;
+        }
+    }
+    return maFirstPageSize;
+}
+
+void PrintDialog::updateNupFromPages()
+{
+    long nPages = long(maNUpPage.maNupPagesBox.GetEntryData(maNUpPage.maNupPagesBox.GetSelectEntryPos()));
+    int nRows   = int(maNUpPage.maNupRowsEdt.GetValue());
+    int nCols   = int(maNUpPage.maNupColEdt.GetValue());
+    long nPageMargin  = long(maNUpPage.maPageMarginEdt.Denormalize(maNUpPage.maPageMarginEdt.GetValue( FUNIT_100TH_MM )));
+    long nSheetMargin = long(maNUpPage.maSheetMarginEdt.Denormalize(maNUpPage.maSheetMarginEdt.GetValue( FUNIT_100TH_MM )));
+    bool bCustom = false;
+
+    if( nPages == 1 )
+    {
+        nRows = nCols = 1;
+        nSheetMargin = 0;
+        nPageMargin = 0;
+    }
+    else if( nPages == 2 || nPages == 4 || nPages == 6 || nPages == 9 || nPages == 16 )
+    {
+        Size aJobPageSize( getJobPageSize() );
+        bool bPortrait = aJobPageSize.Width() < aJobPageSize.Height();
+        if( nPages == 2 )
+        {
+            if( bPortrait )
+                nRows = 1, nCols = 2;
+            else
+                nRows = 2, nCols = 1;
+        }
+        else if( nPages == 4 )
+            nRows = nCols = 2;
+        else if( nPages == 6 )
+        {
+            if( bPortrait )
+                nRows = 2, nCols = 3;
+            else
+                nRows = 3, nCols = 2;
+        }
+        else if( nPages == 9 )
+            nRows = nCols = 3;
+        else if( nPages == 16 )
+            nRows = nCols = 4;
+        nPageMargin = 0;
+        nSheetMargin = 0;
+    }
+    else
+        bCustom = true;
+
+    if( nPages > 1 )
+    {
+        // set upper limits for margins based on job page size and rows/columns
+        Size aSize( getJobPageSize() );
+
+        // maximum sheet distance: 1/2 sheet
+        long nHorzMax = aSize.Width()/2;
+        long nVertMax = aSize.Height()/2;
+        if( nSheetMargin > nHorzMax )
+            nSheetMargin = nHorzMax;
+        if( nSheetMargin > nVertMax )
+            nSheetMargin = nVertMax;
+
+        maNUpPage.maSheetMarginEdt.SetMax(
+                  maNUpPage.maSheetMarginEdt.Normalize(
+                           nHorzMax > nVertMax ? nVertMax : nHorzMax ), FUNIT_100TH_MM );
+
+        // maximum page distance
+        nHorzMax = (aSize.Width() - 2*nSheetMargin);
+        if( nCols > 1 )
+            nHorzMax /= (nCols-1);
+        nVertMax = (aSize.Height() - 2*nSheetMargin);
+        if( nRows > 1 )
+            nHorzMax /= (nRows-1);
+
+        if( nPageMargin > nHorzMax )
+            nPageMargin = nHorzMax;
+        if( nPageMargin > nVertMax )
+            nPageMargin = nVertMax;
+
+        maNUpPage.maPageMarginEdt.SetMax(
+                 maNUpPage.maSheetMarginEdt.Normalize(
+                           nHorzMax > nVertMax ? nVertMax : nHorzMax ), FUNIT_100TH_MM );
+    }
+
+    maNUpPage.maNupRowsEdt.SetValue( nRows );
+    maNUpPage.maNupColEdt.SetValue( nCols );
+    maNUpPage.maPageMarginEdt.SetValue( maNUpPage.maPageMarginEdt.Normalize( nPageMargin ), FUNIT_100TH_MM );
+    maNUpPage.maSheetMarginEdt.SetValue( maNUpPage.maSheetMarginEdt.Normalize( nSheetMargin ), FUNIT_100TH_MM );
+
+    maNUpPage.showAdvancedControls( bCustom );
+    if( bCustom )
+    {
+        // see if we have to enlarge the dialog to make the tab page fit
+        Size aCurSize( maNUpPage.getLayout()->getOptimalSize( WINDOWSIZE_PREFERRED ) );
+        Size aTabSize( maTabCtrl.GetTabPageSizePixel() );
+        if( aTabSize.Height() < aCurSize.Height() )
+        {
+            Size aDlgSize( GetSizePixel() );
+            aDlgSize.Height() += aCurSize.Height() - aTabSize.Height();
+            SetSizePixel( aDlgSize );
+        }
+    }
+
+    updateNup();
+}
+
+void PrintDialog::updateNup()
+{
+    int nRows         = int(maNUpPage.maNupRowsEdt.GetValue());
+    int nCols         = int(maNUpPage.maNupColEdt.GetValue());
+    long nPageMargin  = long(maNUpPage.maPageMarginEdt.Denormalize(maNUpPage.maPageMarginEdt.GetValue( FUNIT_100TH_MM )));
+    long nSheetMargin = long(maNUpPage.maSheetMarginEdt.Denormalize(maNUpPage.maSheetMarginEdt.GetValue( FUNIT_100TH_MM )));
+
+    PrinterController::MultiPageSetup aMPS;
+    aMPS.nRows         = nRows;
+    aMPS.nColumns      = nCols;
+    aMPS.nRepeat       = 1;
+    aMPS.nLeftMargin   =
+    aMPS.nTopMargin    =
+    aMPS.nRightMargin  =
+    aMPS.nBottomMargin = nSheetMargin;
+
+    aMPS.nHorizontalSpacing =
+    aMPS.nVerticalSpacing   = nPageMargin;
+
+    aMPS.bDrawBorder        = maNUpPage.maBorderCB.IsChecked();
+
+    int nOrderMode = int(sal_IntPtr(maNUpPage.maNupOrderBox.GetEntryData(
+                           maNUpPage.maNupOrderBox.GetSelectEntryPos() )));
+    if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_LRTB )
+        aMPS.nOrder = PrinterController::LRTB;
+    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_TBLR )
+        aMPS.nOrder = PrinterController::TBLR;
+    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_RLTB )
+        aMPS.nOrder = PrinterController::RLTB;
+    else if( nOrderMode == SV_PRINT_PRT_NUP_ORDER_TBRL )
+        aMPS.nOrder = PrinterController::TBRL;
+
+    int nOrientationMode = int(sal_IntPtr(maNUpPage.maNupOrientationBox.GetEntryData(
+                                 maNUpPage.maNupOrientationBox.GetSelectEntryPos() )));
+    if( nOrientationMode == SV_PRINT_PRT_NUP_ORIENTATION_LANDSCAPE )
+        aMPS.aPaperSize = maNupLandscapeSize;
+    else if( nOrientationMode == SV_PRINT_PRT_NUP_ORIENTATION_PORTRAIT )
+        aMPS.aPaperSize = maNupPortraitSize;
+    else // automatic mode
+    {
+        // get size of first real page to see if it is portrait or landscape
+        // we assume same page sizes for all the pages for this
+        Size aPageSize = getJobPageSize();
+
+        Size aMultiSize( aPageSize.Width() * nCols, aPageSize.Height() * nRows );
+        if( aMultiSize.Width() > aMultiSize.Height() ) // fits better on landscape
+            aMPS.aPaperSize = maNupLandscapeSize;
+        else
+            aMPS.aPaperSize = maNupPortraitSize;
+    }
+
+    maPController->setMultipage( aMPS );
+
+    maNUpPage.maNupOrderWin.setValues( nOrderMode, nCols, nRows );
+
+    preparePreview( true, true );
+}
+
+IMPL_LINK( PrintDialog, SelectHdl, ListBox*, pBox )
+{
+    if(  pBox == &maJobPage.maPrinters )
+    {
+        String aNewPrinter( pBox->GetSelectEntry() );
+        // set new printer
+        maPController->setPrinter( boost::shared_ptr<Printer>( new Printer( aNewPrinter ) ) );
+        maPController->resetPrinterOptions( maOptionsPage.maToFileBox.IsChecked() );
+        // update text fields
+        updatePrinterText();
+    }
+    else if( pBox == &maNUpPage.maNupOrientationBox || pBox == &maNUpPage.maNupOrderBox )
+    {
+        updateNup();
+    }
+    else if( pBox == &maNUpPage.maNupPagesBox )
+    {
+        if( !maNUpPage.maPagesBtn.IsChecked() )
+            maNUpPage.maPagesBtn.Check();
+        updateNupFromPages();
+    }
+
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton )
+{
+    if( pButton == &maOKButton || pButton == &maCancelButton )
+    {
+        storeToSettings();
+        EndDialog( pButton == &maOKButton );
+    }
+    else if( pButton == &maHelpButton )
+    {
+        // start help system
+        Help* pHelp = Application::GetHelp();
+        if( pHelp )
+        {
+            pHelp->Start( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".HelpID:vcl:PrintDialog:OK" ) ), &maOKButton );
+        }
+    }
+    else if( pButton == &maForwardBtn )
+    {
+        previewForward();
+    }
+    else if( pButton == &maBackwardBtn )
+    {
+        previewBackward();
+    }
+    else if( pButton == &maOptionsPage.maToFileBox )
+    {
+        maOKButton.SetText( maOptionsPage.maToFileBox.IsChecked() ? maPrintToFileText : maPrintText );
+        maPController->resetPrinterOptions( maOptionsPage.maToFileBox.IsChecked() );
+        getLayout()->resize();
+        preparePreview( true, true );
+    }
+    else if( pButton == &maNUpPage.maBrochureBtn )
+    {
+        PropertyValue* pVal = getValueForWindow( pButton );
+        if( pVal )
+        {
+            sal_Bool bVal = maNUpPage.maBrochureBtn.IsChecked();
+            pVal->Value <<= bVal;
+
+            checkOptionalControlDependencies();
+
+            // update preview and page settings
+            preparePreview();
+        }
+        if( maNUpPage.maBrochureBtn.IsChecked() )
+        {
+            maNUpPage.maNupPagesBox.SelectEntryPos( 0 );
+            updateNupFromPages();
+            maNUpPage.showAdvancedControls( false );
+            maNUpPage.enableNupControls( false );
+        }
+    }
+    else if( pButton == &maNUpPage.maPagesBtn )
+    {
+        maNUpPage.enableNupControls( true );
+        updateNupFromPages();
+    }
+    else if( pButton == &maJobPage.maDetailsBtn )
+    {
+        bool bShow = maJobPage.maDetailsBtn.IsChecked();
+        maJobPage.mxDetails->show( bShow );
+        if( bShow )
+        {
+            maDetailsCollapsedSize = GetOutputSizePixel();
+            // enlarge dialog if necessary
+            Size aMinSize( maJobPage.getLayout()->getOptimalSize( WINDOWSIZE_MINIMUM ) );
+            Size aCurSize( maJobPage.GetSizePixel() );
+            if( aCurSize.Height() < aMinSize.Height() )
+            {
+                Size aDlgSize( GetOutputSizePixel() );
+                aDlgSize.Height() += aMinSize.Height() - aCurSize.Height();
+                SetOutputSizePixel( aDlgSize );
+            }
+            maDetailsExpandedSize = GetOutputSizePixel();
+        }
+        else if( maDetailsCollapsedSize.Width() > 0   &&
+                 maDetailsCollapsedSize.Height() > 0 )
+        {
+            // if the user did not resize the dialog
+            // make it smaller again on collapsing the details
+            Size aDlgSize( GetOutputSizePixel() );
+            if( aDlgSize == maDetailsExpandedSize &&
+                aDlgSize.Height() > maDetailsCollapsedSize.Height() )
+            {
+                SetOutputSizePixel( maDetailsCollapsedSize );
+            }
+        }
+    }
+    else if( pButton == &maJobPage.maCollateBox )
+    {
+        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
+                                 makeAny( sal_Bool(isCollate()) ) );
+        checkControlDependencies();
+    }
+    else if( pButton == &maJobPage.maReverseOrderBox )
+    {
+        sal_Bool bChecked = maJobPage.maReverseOrderBox.IsChecked();
+        maPController->setReversePrint( bChecked );
+        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PrintReverse" ) ),
+                                 makeAny( bChecked ) );
+        preparePreview( true, true );
+    }
+    else if( pButton == &maNUpPage.maBorderCB )
+    {
+        updateNup();
+    }
+    else
+    {
+        if( pButton == &maJobPage.maSetupButton )
+        {
+            maPController->setupPrinter( this );
+            preparePreview( true, true );
+        }
+        checkControlDependencies();
+    }
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, ModifyHdl, Edit*, pEdit )
+{
+    checkControlDependencies();
+    if( pEdit == &maNUpPage.maNupRowsEdt || pEdit == &maNUpPage.maNupColEdt ||
+        pEdit == &maNUpPage.maSheetMarginEdt || pEdit == &maNUpPage.maPageMarginEdt
+       )
+    {
+        updateNupFromPages();
+    }
+    else if( pEdit == &maPageEdit )
+    {
+        mnCurPage = sal_Int32( maPageEdit.GetValue() - 1 );
+        preparePreview( true, true );
+    }
+    else if( pEdit == &maJobPage.maCopyCountField )
+    {
+        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CopyCount" ) ),
+                               makeAny( sal_Int32(maJobPage.maCopyCountField.GetValue()) ) );
+        maPController->setValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Collate" ) ),
+                               makeAny( sal_Bool(isCollate()) ) );
+    }
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, UIOptionsChanged, void*, EMPTYARG )
+{
+    checkOptionalControlDependencies();
+    return 0;
+}
+
+PropertyValue* PrintDialog::getValueForWindow( Window* i_pWindow ) const
+{
+    PropertyValue* pVal = NULL;
+    std::map< Window*, rtl::OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow );
+    if( it != maControlToPropertyMap.end() )
+    {
+        pVal = maPController->getValue( it->second );
+        DBG_ASSERT( pVal, "property value not found" );
+    }
+    else
+    {
+        OSL_FAIL( "changed control not in property map" );
+    }
+    return pVal;
+}
+
+void PrintDialog::updateWindowFromProperty( const rtl::OUString& i_rProperty )
+{
+    beans::PropertyValue* pValue = maPController->getValue( i_rProperty );
+    std::map< rtl::OUString, std::vector< Window* > >::const_iterator it = maPropertyToWindowMap.find( i_rProperty );
+    if( pValue && it != maPropertyToWindowMap.end() )
+    {
+        const std::vector< Window* >& rWindows( it->second );
+        if( ! rWindows.empty() )
+        {
+            sal_Bool bVal = sal_False;
+            sal_Int32 nVal = -1;
+            if( pValue->Value >>= bVal )
+            {
+                // we should have a CheckBox for this one
+                CheckBox* pBox = dynamic_cast< CheckBox* >( rWindows.front() );
+                if( pBox )
+                {
+                    pBox->Check( bVal );
+                }
+                else if( i_rProperty.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "PrintProspect" ) ) )
+                {
+                    // EVIL special case
+                    if( bVal )
+                        maNUpPage.maBrochureBtn.Check();
+                    else
+                        maNUpPage.maPagesBtn.Check();
+                }
+                else
+                {
+                    DBG_ASSERT( 0, "missing a checkbox" );
+                }
+            }
+            else if( pValue->Value >>= nVal )
+            {
+                // this could be a ListBox or a RadioButtonGroup
+                ListBox* pList = dynamic_cast< ListBox* >( rWindows.front() );
+                if( pList )
+                {
+                    pList->SelectEntryPos( static_cast< sal_uInt16 >(nVal) );
+                }
+                else if( nVal >= 0 && nVal < sal_Int32(rWindows.size() ) )
+                {
+                    RadioButton* pBtn = dynamic_cast< RadioButton* >( rWindows[nVal] );
+                    DBG_ASSERT( pBtn, "unexpected control for property" );
+                    if( pBtn )
+                        pBtn->Check();
+                }
+            }
+        }
+    }
+}
+
+void PrintDialog::makeEnabled( Window* i_pWindow )
+{
+    std::map< Window*, rtl::OUString >::const_iterator it = maControlToPropertyMap.find( i_pWindow );
+    if( it != maControlToPropertyMap.end() )
+    {
+        rtl::OUString aDependency( maPController->makeEnabled( it->second ) );
+        if( aDependency.getLength() )
+            updateWindowFromProperty( aDependency );
+    }
+}
+
+IMPL_LINK( PrintDialog, UIOption_CheckHdl, CheckBox*, i_pBox )
+{
+    PropertyValue* pVal = getValueForWindow( i_pBox );
+    if( pVal )
+    {
+        makeEnabled( i_pBox );
+
+        sal_Bool bVal = i_pBox->IsChecked();
+        pVal->Value <<= bVal;
+
+        checkOptionalControlDependencies();
+
+        // update preview and page settings
+        preparePreview();
+    }
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, UIOption_RadioHdl, RadioButton*, i_pBtn )
+{
+    // this handler gets called for all radiobuttons that get unchecked, too
+    // however we only want one notificaction for the new value (that is for
+    // the button that gets checked)
+    if( i_pBtn->IsChecked() )
+    {
+        PropertyValue* pVal = getValueForWindow( i_pBtn );
+        std::map< Window*, sal_Int32 >::const_iterator it = maControlToNumValMap.find( i_pBtn );
+        if( pVal && it != maControlToNumValMap.end() )
+        {
+            makeEnabled( i_pBtn );
+
+            sal_Int32 nVal = it->second;
+            pVal->Value <<= nVal;
+
+            checkOptionalControlDependencies();
+
+            // update preview and page settings
+            preparePreview();
+        }
+    }
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, UIOption_SelectHdl, ListBox*, i_pBox )
+{
+    PropertyValue* pVal = getValueForWindow( i_pBox );
+    if( pVal )
+    {
+        makeEnabled( i_pBox );
+
+        sal_Int32 nVal( i_pBox->GetSelectEntryPos() );
+        pVal->Value <<= nVal;
+
+        checkOptionalControlDependencies();
+
+        // update preview and page settings
+        preparePreview();
+    }
+    return 0;
+}
+
+IMPL_LINK( PrintDialog, UIOption_ModifyHdl, Edit*, i_pBox )
+{
+    PropertyValue* pVal = getValueForWindow( i_pBox );
+    if( pVal )
+    {
+        makeEnabled( i_pBox );
+
+        NumericField* pNum = dynamic_cast<NumericField*>(i_pBox);
+        MetricField* pMetric = dynamic_cast<MetricField*>(i_pBox);
+        if( pNum )
+        {
+            sal_Int64 nVal = pNum->GetValue();
+            pVal->Value <<= nVal;
+        }
+        else if( pMetric )
+        {
+            sal_Int64 nVal = pMetric->GetValue();
+            pVal->Value <<= nVal;
+        }
+        else
+        {
+            rtl::OUString aVal( i_pBox->GetText() );
+            pVal->Value <<= aVal;
+        }
+
+        checkOptionalControlDependencies();
+
+        // update preview and page settings
+        preparePreview();
+    }
+    return 0;
+}
+
+void PrintDialog::Command( const CommandEvent& rEvt )
+{
+    if( rEvt.GetCommand() == COMMAND_WHEEL )
+    {
+        const CommandWheelData* pWheelData = rEvt.GetWheelData();
+        if( pWheelData->GetDelta() > 0 )
+            previewForward();
+        else if( pWheelData->GetDelta() < 0 )
+            previewBackward();
+        /*
+        else
+            huh ?
+        */
+    }
+}
+
+void PrintDialog::Resize()
+{
+    // maLayout.setManagedArea( Rectangle( Point( 0, 0 ), GetSizePixel() ) );
+    // and do the preview; however the metafile does not need to be gotten anew
+    preparePreview( false );
+
+    // do an invalidate for the benefit of the grouping elements
+    Invalidate();
+}
+
+void PrintDialog::previewForward()
+{
+    maPageEdit.Up();
+}
+
+void PrintDialog::previewBackward()
+{
+    maPageEdit.Down();
+}
+
+// -----------------------------------------------------------------------------
+//
+// PrintProgressDialog
+//
+// -----------------------------------------------------------------------------
+
+PrintProgressDialog::PrintProgressDialog( Window* i_pParent, int i_nMax ) :
+    ModelessDialog( i_pParent, VclResId( SV_DLG_PRINT_PROGRESS ) ),
+    maText( this, VclResId( SV_PRINT_PROGRESS_TEXT ) ),
+    maButton( this, VclResId( SV_PRINT_PROGRESS_CANCEL ) ),
+    mbCanceled( false ),
+    mnCur( 0 ),
+    mnMax( i_nMax ),
+    mnProgressHeight( 15 ),
+    mbNativeProgress( false )
+{
+    FreeResource();
+
+    if( mnMax < 1 )
+        mnMax = 1;
+
+    maStr = maText.GetText();
+
+    maButton.SetClickHdl( LINK( this, PrintProgressDialog, ClickHdl ) );
+
+}
+
+PrintProgressDialog::~PrintProgressDialog()
+{
+}
+
+IMPL_LINK( PrintProgressDialog, ClickHdl, Button*, pButton )
+{
+    if( pButton == &maButton )
+        mbCanceled = true;
+
+    return 0;
+}
+
+void PrintProgressDialog::implCalcProgressRect()
+{
+    if( IsNativeControlSupported( CTRL_PROGRESS, PART_ENTIRE_CONTROL ) )
+    {
+        ImplControlValue aValue;
+        Rectangle aControlRegion( Point(), Size( 100, mnProgressHeight ) );
+        Rectangle aNativeControlRegion, aNativeContentRegion;
+        if( GetNativeControlRegion( CTRL_PROGRESS, PART_ENTIRE_CONTROL, aControlRegion,
+                                    CTRL_STATE_ENABLED, aValue, rtl::OUString(),
+                                    aNativeControlRegion, aNativeContentRegion ) )
+        {
+            mnProgressHeight = aNativeControlRegion.GetHeight();
+        }
+        mbNativeProgress = true;
+    }
+    maProgressRect = Rectangle( Point( 10, maText.GetPosPixel().Y() + maText.GetSizePixel().Height() + 8 ),
+                                Size( GetSizePixel().Width() - 20, mnProgressHeight ) );
+}
+
+void PrintProgressDialog::setProgress( int i_nCurrent, int i_nMax )
+{
+    if( maProgressRect.IsEmpty() )
+        implCalcProgressRect();
+
+    mnCur = i_nCurrent;
+    if( i_nMax != -1 )
+        mnMax = i_nMax;
+
+    if( mnMax < 1 )
+        mnMax = 1;
+
+    rtl::OUString aNewText( searchAndReplace( maStr, "%p", 2, rtl::OUString::valueOf( mnCur ) ) );
+    aNewText = searchAndReplace( aNewText, "%n", 2, rtl::OUString::valueOf( mnMax ) );
+    maText.SetText( aNewText );
+
+    // update progress
+    Invalidate( maProgressRect, INVALIDATE_UPDATE );
+}
+
+void PrintProgressDialog::tick()
+{
+    if( mnCur < mnMax )
+        setProgress( ++mnCur );
+}
+
+void PrintProgressDialog::reset()
+{
+    mbCanceled = false;
+    setProgress( 0 );
+}
+
+void PrintProgressDialog::Paint( const Rectangle& )
+{
+    if( maProgressRect.IsEmpty() )
+        implCalcProgressRect();
+
+    Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
+    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
+    Color aPrgsColor = rStyleSettings.GetHighlightColor();
+    if ( aPrgsColor == rStyleSettings.GetFaceColor() )
+        aPrgsColor = rStyleSettings.GetDarkShadowColor();
+    SetLineColor();
+    SetFillColor( aPrgsColor );
+
+    const long nOffset = 3;
+    const long nWidth = 3*mnProgressHeight/2;
+    const long nFullWidth = nWidth + nOffset;
+    const long nMaxCount = maProgressRect.GetWidth() / nFullWidth;
+    DrawProgress( this, maProgressRect.TopLeft(),
+                        nOffset,
+                        nWidth,
+                        mnProgressHeight,
+                        static_cast<sal_uInt16>(0),
+                        static_cast<sal_uInt16>(10000*mnCur/mnMax),
+                        static_cast<sal_uInt16>(10000/nMaxCount),
+                        maProgressRect
+                        );
+    Pop();
+
+    if( ! mbNativeProgress )
+    {
+        DecorationView aDecoView( this );
+        Rectangle aFrameRect( maProgressRect );
+        aFrameRect.Left() -= nOffset;
+        aFrameRect.Right() += nOffset;
+        aFrameRect.Top() -= nOffset;
+        aFrameRect.Bottom() += nOffset;
+        aDecoView.DrawFrame( aFrameRect );
+    }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
-- 
1.7.1


--------------060704020805070309050601--



More information about the LibreOffice mailing list