[Libreoffice-commits] core.git: Branch 'feature/print_revamp' - vcl/inc vcl/source vcl/uiconfig

Daniel danielfaleirosilva at gmail.com
Fri Jun 8 03:20:38 UTC 2018


 vcl/inc/printdlg.hxx           |  208 +---
 vcl/source/gdi/print3.cxx      |   11 
 vcl/source/window/printdlg.cxx | 1562 +++++++-----------------------
 vcl/uiconfig/ui/printdialog.ui | 2069 +++++++++++++++--------------------------
 4 files changed, 1225 insertions(+), 2625 deletions(-)

New commits:
commit 1d5edc87667625d8b97c7cc9f59cbd2c8c96fe36
Author: Daniel <danielfaleirosilva at gmail.com>
Date:   Sat Jun 2 19:40:52 2018 -0300

    New Print Dialog Design
    
    Change-Id: Ib92a16ccfab70b84ffea07970a694800ecc16d07
    Reviewed-on: https://gerrit.libreoffice.org/55237
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Daniel Silva <danielfaleirosilva at gmail.com>

diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx
index 0a5b09fd366a..03e01b840003 100644
--- a/vcl/inc/printdlg.hxx
+++ b/vcl/inc/printdlg.hxx
@@ -17,8 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#ifndef INCLUDED_VCL_INC_PRINTDLG_HXX
-#define INCLUDED_VCL_INC_PRINTDLG_HXX
+#ifndef VCL_INC_NEWPRINTDLG_HXX
+#define VCL_INC_NEWPRINTDLG_HXX
 
 #include <vcl/dllapi.h>
 
@@ -91,168 +91,106 @@ namespace vcl
             }
         };
 
-    private:
-
-        class NUpTabPage
-        {
-        public:
-            VclPtr<RadioButton>                     mpPagesBtn;
-            VclPtr<RadioButton>                     mpBrochureBtn;
-            VclPtr<FixedText>                       mpPagesBoxTitleTxt;
-            VclPtr<ListBox>                         mpNupPagesBox;
-
-            // controls for "Custom" page mode
-            VclPtr<FixedText>                       mpNupNumPagesTxt;
-            VclPtr<NumericField>                    mpNupColEdt;
-            VclPtr<FixedText>                       mpNupTimesTxt;
-            VclPtr<NumericField>                    mpNupRowsEdt;
-            VclPtr<FixedText>                       mpPageMarginTxt1;
-            VclPtr<MetricField>                     mpPageMarginEdt;
-            VclPtr<FixedText>                       mpPageMarginTxt2;
-            VclPtr<FixedText>                       mpSheetMarginTxt1;
-            VclPtr<MetricField>                     mpSheetMarginEdt;
-            VclPtr<FixedText>                       mpSheetMarginTxt2;
-            VclPtr<FixedText>                       mpNupOrientationTxt;
-            VclPtr<ListBox>                         mpNupOrientationBox;
-
-            // page order ("left to right, then down")
-            VclPtr<FixedText>                       mpNupOrderTxt;
-            VclPtr<ListBox>                         mpNupOrderBox;
-            VclPtr<ShowNupOrderWindow>              mpNupOrderWin;
-            /// border around each page
-            VclPtr<CheckBox>                        mpBorderCB;
-
-            NUpTabPage( VclBuilder* );
-
-            void initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& );
-            void enableNupControls( bool bEnable );
-
-            void showAdvancedControls( bool );
-        };
-
-        class JobTabPage
-        {
-        public:
-            VclPtr<ListBox>                         mpPrinters;
-            VclPtr<FixedText>                       mpStatusTxt;
-            VclPtr<FixedText>                       mpLocationTxt;
-            VclPtr<FixedText>                       mpCommentTxt;
-
-            VclPtr<PushButton>                      mpSetupButton;
-
-            VclPtr<NumericField>                    mpCopyCountField;
-            VclPtr<CheckBox>                        mpCollateBox;
-            VclPtr<FixedImage>                      mpCollateImage;
-            VclPtr<CheckBox>                        mpReverseOrderBox;
-
-            BitmapEx                                maCollateBmp;
-            BitmapEx                                maNoCollateBmp;
-
-            long                                    mnCollateUIMode;
-
-            JobTabPage( VclBuilder* );
-
-            void readFromSettings();
-            void storeToSettings();
-        };
-
-        class OutputOptPage
-        {
-        public:
-            VclPtr<CheckBox>                    mpCollateSingleJobsBox;
-            VclPtr<CheckBox>                    mpPapersizeFromSetup;
+        PrintDialog( vcl::Window*, const std::shared_ptr< PrinterController >& );
+        virtual ~PrintDialog() override;
+        virtual void dispose() override;
 
-            OutputOptPage( VclBuilder* );
+        bool isPrintToFile();
+        bool isCollate();
+        bool hasPreview();
 
-            void readFromSettings();
-            void storeToSettings();
-        };
+        void previewForward();
+        void previewBackward();
 
-        std::unique_ptr<VclBuilder>             mpCustomOptionsUIBuilder;
+    private:
 
         std::shared_ptr<PrinterController>      maPController;
-        VclPtr<TabControl>                      mpTabCtrl;
-        NUpTabPage                              maNUpPage;
-        JobTabPage                              maJobPage;
-        OutputOptPage                           maOptionsPage;
-        VclPtr<PrintPreviewWindow>              mpPreviewWindow;
-        VclPtr<NumericField>                    mpPageEdit;
 
-        VclPtr<FixedText>                       mpNumPagesText;
-        VclPtr<PushButton>                      mpBackwardBtn;
-        VclPtr<PushButton>                      mpForwardBtn;
-        VclPtr<CheckBox>                        mpPreviewBox;
+        VclPtr<TabControl>                      mpTabCtrl;
+        VclPtr<ListBox>                         mpPrinters;
+        VclPtr<FixedText>                       mpStatusTxt;
+        VclPtr<PushButton>                      mpSetupButton;
+        OUString                                maPrintToFileText;
+        OUString                                maPrintText;
+        OUString                                maDefPrtText;
+
+        VclPtr<NumericField>                    mpCopyCountField;
+        VclPtr<CheckBox>                        mpCollateBox;
+        VclPtr<FixedImage>                      mpCollateImage;
+        VclPtr<CheckBox>                        mpReverseOrderBox;
 
         VclPtr<OKButton>                        mpOKButton;
         VclPtr<CancelButton>                    mpCancelButton;
         VclPtr<HelpButton>                      mpHelpButton;
 
+        VclPtr<PushButton>                      mpBackwardBtn;
+        VclPtr<PushButton>                      mpForwardBtn;
+        VclPtr<CheckBox>                        mpPreviewBox;
+        VclPtr<FixedText>                       mpNumPagesText;
+        VclPtr<PrintPreviewWindow>              mpPreviewWindow;
+        VclPtr<NumericField>                    mpPageEdit;
+
         OUString                                maPageStr;
         OUString                                maNoPageStr;
         OUString                                maNoPreviewStr;
         sal_Int32                               mnCurPage;
         sal_Int32                               mnCachedPages;
 
+        BitmapEx                                maCollateBmp;
+        BitmapEx                                maNoCollateBmp;
+
+        long                                    mnCollateUIMode;
+
+        VclPtr<RadioButton>                     mpPagesBtn;
+        VclPtr<RadioButton>                     mpBrochureBtn;
+        VclPtr<FixedText>                       mpPagesBoxTitleTxt;
+        VclPtr<ListBox>                         mpNupPagesBox;
+
+        // controls for "Custom" page mode
+        VclPtr<FixedText>                       mpNupNumPagesTxt;
+        VclPtr<NumericField>                    mpNupColEdt;
+        VclPtr<FixedText>                       mpNupTimesTxt;
+        VclPtr<NumericField>                    mpNupRowsEdt;
+        VclPtr<FixedText>                       mpPageMarginTxt1;
+        VclPtr<MetricField>                     mpPageMarginEdt;
+        VclPtr<FixedText>                       mpPageMarginTxt2;
+        VclPtr<FixedText>                       mpSheetMarginTxt1;
+        VclPtr<MetricField>                     mpSheetMarginEdt;
+        VclPtr<FixedText>                       mpSheetMarginTxt2;
+        VclPtr<ListBox>                         mpNupOrientationBox;
+
+        // page order ("left to right, then down")
+        VclPtr<ListBox>                         mpNupOrderBox;
+        VclPtr<ShowNupOrderWindow>              mpNupOrderWin;
+        /// border around each page
+        VclPtr<CheckBox>                        mpBorderCB;
+
         std::map< VclPtr<vcl::Window>, OUString >      maControlToPropertyMap;
-        std::map< OUString, std::vector< VclPtr<vcl::Window> > >
-                                                maPropertyToWindowMap;
-        std::map< VclPtr<vcl::Window>, sal_Int32 >          maControlToNumValMap;
-        std::set< OUString >                    maReverseDependencySet;
 
         Size                                    maNupPortraitSize;
         Size                                    maNupLandscapeSize;
-
         /// internal, used for automatic Nup-Portrait/landscape
         Size                                    maFirstPageSize;
 
-        OUString                           maPrintToFileText;
-        OUString                           maPrintText;
-        OUString                           maDefPrtText;
+        DECL_LINK( ClickHdl, Button*, void );
+        DECL_LINK( SelectHdl, ListBox&, void );
+        DECL_LINK( ModifyHdl, Edit&, void );
+        DECL_LINK( ToggleHdl, CheckBox&, void );
+        DECL_LINK( ToggleRadioHdl, RadioButton&, void );
 
-        bool                                mbShowLayoutPage;
+        css::beans::PropertyValue* getValueForWindow( vcl::Window* ) const;
 
-        Size const & getJobPageSize();
-        void updateNup();
-        void updateNupFromPages();
         void preparePreview( bool i_bPrintChanged = true, bool i_bMayUseCache = false );
         void setPreviewText();
         void updatePrinterText();
         void checkControlDependencies();
-        void checkOptionalControlDependencies();
-        void makeEnabled( vcl::Window* );
-        void updateWindowFromProperty( const OUString& );
-        void setupOptionalUI();
-        void readFromSettings();
-        void storeToSettings();
-        css::beans::PropertyValue* getValueForWindow( vcl::Window* ) const;
-
-        virtual void Resize() override;
-        virtual void Command( const CommandEvent& ) override;
-        virtual void DataChanged( const DataChangedEvent& ) override;
-
-        DECL_LINK( SelectHdl, ListBox&, void );
-        DECL_LINK( ClickHdl, Button*, void );
-        DECL_LINK( ToggleHdl, CheckBox&, void );
-        DECL_LINK( ToggleRadioHdl, RadioButton&, void );
-        DECL_LINK( ModifyHdl, Edit&, void );
-
-        DECL_LINK( UIOption_CheckHdl, CheckBox&, void );
-        DECL_LINK( UIOption_RadioHdl, RadioButton&, void );
-        DECL_LINK( UIOption_SelectHdl, ListBox&, void );
-        DECL_LINK( UIOption_ModifyHdl, Edit&, void );
-
-    public:
-        PrintDialog( vcl::Window*, const std::shared_ptr< PrinterController >& );
-        virtual ~PrintDialog() override;
-        virtual void dispose() override;
-
-        bool isPrintToFile();
-        bool isCollate();
-        bool isSingleJobs();
-        bool hasPreview();
+        void initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& );
+        void showAdvancedControls( bool );
+        void updateNup();
+        void updateNupFromPages();
+        void enableNupControls( bool bEnable );
+        Size const & getJobPageSize();
 
-        void previewForward();
-        void previewBackward();
     };
 
     class PrintProgressDialog : public ModelessDialog
@@ -279,6 +217,4 @@ namespace vcl
     };
 }
 
-#endif // INCLUDED_VCL_INC_PRINTDLG_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
+#endif // VCL_INC_NEWPRINTDLG_HXX
diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx
index 544e07ce02d4..599965f479f5 100644
--- a/vcl/source/gdi/print3.cxx
+++ b/vcl/source/gdi/print3.cxx
@@ -491,11 +491,12 @@ bool Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController,
                 xController->setValue( "LocalFileName",
                                        css::uno::makeAny( aFile ) );
             }
-            else if( aDlg->isSingleJobs() )
-            {
-                xController->setValue( "PrintCollateAsSingleJobs",
-                                       css::uno::makeAny( true ) );
-            }
+            // FIXME: single jobs is not implemented yet.
+            // else if( aDlg->isSingleJobs() )
+            // {
+            //     xController->setValue( "PrintCollateAsSingleJobs",
+            //                            css::uno::makeAny( true ) );
+            // }
         }
         catch (const std::bad_alloc&)
         {
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
index e59694ca8c0f..06f3ed8470f0 100644
--- a/vcl/source/window/printdlg.cxx
+++ b/vcl/source/window/printdlg.cxx
@@ -54,6 +54,12 @@ using namespace com::sun::star::lang;
 using namespace com::sun::star::container;
 using namespace com::sun::star::beans;
 
+enum
+{
+    SV_PRINT_PRT_NUP_ORIENTATION_PORTRAIT,
+    SV_PRINT_PRT_NUP_ORIENTATION_LANDSCAPE
+};
+
 extern "C" SAL_DLLPUBLIC_EXPORT void makePrintPreviewWindow(VclPtr<vcl::Window> & rRet, VclPtr<vcl::Window> & pParent, VclBuilder::stringmap &)
 {
     rRet = VclPtr<PrintDialog::PrintPreviewWindow>::Create(pParent);
@@ -64,6 +70,13 @@ extern "C" SAL_DLLPUBLIC_EXPORT void makeShowNupOrderWindow(VclPtr<vcl::Window>
     rRet = VclPtr<PrintDialog::ShowNupOrderWindow>::Create(pParent);
 }
 
+namespace {
+   bool lcl_ListBoxCompare( const OUString& rStr1, const OUString& rStr2 )
+   {
+       return ListBox::NaturalSortCompare( rStr1, rStr2 ) < 0;
+   }
+}
+
 PrintDialog::PrintPreviewWindow::PrintPreviewWindow( vcl::Window* i_pParent )
     : Window( i_pParent, 0 )
     , maMtf()
@@ -453,210 +466,36 @@ void PrintDialog::ShowNupOrderWindow::Paint(vcl::RenderContext& rRenderContext,
     aDecorationView.DrawFrame(tools::Rectangle(Point(0, 0), aOutSize), DrawFrameStyle::Group);
 }
 
-PrintDialog::NUpTabPage::NUpTabPage( VclBuilder *pUIBuilder )
-{
-    pUIBuilder->get(mpPagesBtn, "pagespersheetbtn");
-    pUIBuilder->get(mpBrochureBtn, "brochure");
-    pUIBuilder->get(mpPagesBoxTitleTxt, "pagespersheettxt");
-    pUIBuilder->get(mpNupPagesBox, "paperspersheetlb");
-    pUIBuilder->get(mpNupNumPagesTxt, "pagestxt");
-    pUIBuilder->get(mpNupColEdt, "pagecols");
-    pUIBuilder->get(mpNupTimesTxt, "by");
-    pUIBuilder->get(mpNupRowsEdt, "pagerows");
-    pUIBuilder->get(mpPageMarginTxt1, "pagemargintxt1");
-    pUIBuilder->get(mpPageMarginEdt, "pagemarginsb");
-    pUIBuilder->get(mpPageMarginTxt2, "pagemargintxt2");
-    pUIBuilder->get(mpSheetMarginTxt1, "sheetmargintxt1");
-    pUIBuilder->get(mpSheetMarginEdt, "sheetmarginsb");
-    pUIBuilder->get(mpSheetMarginTxt2, "sheetmargintxt2");
-    pUIBuilder->get(mpNupOrientationTxt, "orientationtxt");
-    pUIBuilder->get(mpNupOrientationBox, "orientationlb");
-    pUIBuilder->get(mpNupOrderTxt, "ordertxt");
-    pUIBuilder->get(mpNupOrderBox, "orderlb");
-    pUIBuilder->get(mpNupOrderWin, "orderpreview");
-    pUIBuilder->get(mpBorderCB, "bordercb");
-}
-
-void PrintDialog::NUpTabPage::enableNupControls( bool bEnable )
-{
-    mpNupPagesBox->Enable( bEnable );
-    mpNupNumPagesTxt->Enable( bEnable );
-    mpNupColEdt->Enable( bEnable );
-    mpNupTimesTxt->Enable( bEnable );
-    mpNupRowsEdt->Enable( bEnable );
-    mpPageMarginTxt1->Enable( bEnable );
-    mpPageMarginEdt->Enable( bEnable );
-    mpPageMarginTxt2->Enable( bEnable );
-    mpSheetMarginTxt1->Enable( bEnable );
-    mpSheetMarginEdt->Enable( bEnable );
-    mpSheetMarginTxt2->Enable( bEnable );
-    mpNupOrientationTxt->Enable( bEnable );
-    mpNupOrientationBox->Enable( bEnable );
-    mpNupOrderTxt->Enable( bEnable );
-    mpNupOrderBox->Enable( bEnable );
-    mpNupOrderWin->Enable( bEnable );
-    mpBorderCB->Enable( bEnable );
-}
-
-void PrintDialog::NUpTabPage::showAdvancedControls( bool i_bShow )
-{
-    mpNupNumPagesTxt->Show( i_bShow );
-    mpNupColEdt->Show( i_bShow );
-    mpNupTimesTxt->Show( i_bShow );
-    mpNupRowsEdt->Show( i_bShow );
-    mpPageMarginTxt1->Show( i_bShow );
-    mpPageMarginEdt->Show( i_bShow );
-    mpPageMarginTxt2->Show( i_bShow );
-    mpSheetMarginTxt1->Show( i_bShow );
-    mpSheetMarginEdt->Show( i_bShow );
-    mpSheetMarginTxt2->Show( i_bShow );
-    mpNupOrientationTxt->Show( i_bShow );
-    mpNupOrientationBox->Show( i_bShow );
-}
-
-void PrintDialog::NUpTabPage::initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& i_rMPS )
-{
-    mpNupOrderWin->Show();
-    mpPagesBtn->Check();
-    mpBrochureBtn->Show( false );
-
-    // setup field units for metric fields
-    const LocaleDataWrapper& rLocWrap( mpPageMarginEdt->GetLocaleDataWrapper() );
-    FieldUnit eUnit = FUNIT_MM;
-    sal_uInt16 nDigits = 0;
-    if( rLocWrap.getMeasurementSystemEnum() == MeasurementSystem::US )
-    {
-        eUnit = FUNIT_INCH;
-        nDigits = 2;
-    }
-    // set units
-    mpPageMarginEdt->SetUnit( eUnit );
-    mpSheetMarginEdt->SetUnit( eUnit );
-
-    // set precision
-    mpPageMarginEdt->SetDecimalDigits( nDigits );
-    mpSheetMarginEdt->SetDecimalDigits( nDigits );
-
-    mpSheetMarginEdt->SetValue( mpSheetMarginEdt->Normalize( i_rMPS.nLeftMargin ), FUNIT_100TH_MM );
-    mpPageMarginEdt->SetValue( mpPageMarginEdt->Normalize( i_rMPS.nHorizontalSpacing ), FUNIT_100TH_MM );
-    mpBorderCB->Check( i_rMPS.bDrawBorder );
-    mpNupRowsEdt->SetValue( i_rMPS.nRows );
-    mpNupColEdt->SetValue( i_rMPS.nColumns );
-    mpNupOrderBox->SelectEntryPos( static_cast<sal_Int32>(i_rMPS.nOrder) );
-    if( i_rMPS.nRows != 1 || i_rMPS.nColumns != 1 )
-    {
-        mpNupPagesBox->SelectEntryPos( mpNupPagesBox->GetEntryCount()-1 );
-        showAdvancedControls( true );
-        mpNupOrderWin->setValues( i_rMPS.nOrder, i_rMPS.nColumns, i_rMPS.nRows );
-    }
-}
-
-PrintDialog::JobTabPage::JobTabPage( VclBuilder* pUIBuilder )
-    : maCollateBmp(SV_PRINT_COLLATE_BMP)
-    , maNoCollateBmp(SV_PRINT_NOCOLLATE_BMP)
-    , mnCollateUIMode(0)
-{
-    pUIBuilder->get(mpPrinters, "printers");
-    pUIBuilder->get(mpStatusTxt, "status");
-    pUIBuilder->get(mpLocationTxt, "location");
-    pUIBuilder->get(mpCommentTxt, "comment");
-    pUIBuilder->get(mpSetupButton, "setup");
-    pUIBuilder->get(mpCopyCountField, "copycount");
-    pUIBuilder->get(mpCollateBox, "collate");
-    pUIBuilder->get(mpCollateImage, "collateimage");
-    pUIBuilder->get(mpReverseOrderBox, "reverseorder");
-    // HACK: this is not a dropdown box, but the dropdown line count
-    // sets the results of GetOptimalSize in a normal ListBox
-    mpPrinters->SetDropDownLineCount( 4 );
-}
-
-void PrintDialog::JobTabPage::readFromSettings()
+Size const & PrintDialog::getJobPageSize()
 {
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    OUString aValue;
-
-    aValue = pItem->getValue( "PrintDialog",
-                              "CollateBox" );
-    if( aValue.equalsIgnoreAsciiCase("alwaysoff") )
-    {
-        mnCollateUIMode = 1;
-        mpCollateBox->Check( false );
-        mpCollateBox->Enable( false );
-    }
-    else
+    if( maFirstPageSize.Width() == 0 && maFirstPageSize.Height() == 0)
     {
-        mnCollateUIMode = 0;
-        aValue = pItem->getValue( "PrintDialog",
-                                  "Collate" );
-        mpCollateBox->Check( aValue.equalsIgnoreAsciiCase("true") );
+        maFirstPageSize = maNupPortraitSize;
+        GDIMetaFile aMtf;
+        if( maPController->getPageCountProtected() > 0 )
+        {
+            PrinterController::PageSize aPageSize = maPController->getPageFile( 0, aMtf, true );
+            maFirstPageSize = aPageSize.aSize;
+        }
     }
+    return maFirstPageSize;
 }
 
-void PrintDialog::JobTabPage::storeToSettings()
-{
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( "PrintDialog",
-                     "CopyCount",
-                     mpCopyCountField->GetText() );
-    pItem->setValue( "PrintDialog",
-                     "Collate",
-                     mpCollateBox->IsChecked() ? OUString("true") :
-                                                 OUString("false") );
-}
-
-PrintDialog::OutputOptPage::OutputOptPage( VclBuilder *pUIBuilder )
-{
-    pUIBuilder->get(mpCollateSingleJobsBox, "singleprintjob");
-    pUIBuilder->get(mpPapersizeFromSetup, "papersizefromsetup");
-}
-
-void PrintDialog::OutputOptPage::readFromSettings()
-{
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    OUString aValue;
-    aValue = pItem->getValue( "PrintDialog",
-                              "CollateSingleJobs" );
-    if ( aValue.equalsIgnoreAsciiCase("true") )
-    {
-        mpCollateSingleJobsBox->Check();
-    }
-    else
-    {
-        mpCollateSingleJobsBox->Check( false );
-    }
-}
+PrintDialog::PrintDialog(vcl::Window* i_pWindow, const std::shared_ptr<PrinterController>& i_rController)
 
-void PrintDialog::OutputOptPage::storeToSettings()
+: ModalDialog(i_pWindow, "PrintDialog", "vcl/ui/printdialog.ui")
+, maPController( i_rController )
+, maPrintToFileText( VclResId( SV_PRINT_TOFILE_TXT ) )
+, maDefPrtText( VclResId( SV_PRINT_DEFPRT_TXT ) )
+, maNoPageStr( VclResId( SV_PRINT_NOPAGES ) )
+, maNoPreviewStr( VclResId( SV_PRINT_NOPREVIEW ) )
+, mnCurPage( 0 )
+, mnCachedPages( 0 )
+, maCollateBmp(SV_PRINT_COLLATE_BMP)
+, maNoCollateBmp(SV_PRINT_NOCOLLATE_BMP)
+, mnCollateUIMode(0)
 {
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( "PrintDialog",
-                     "CollateSingleJobs",
-                     mpCollateSingleJobsBox->IsChecked() ? OUString("true") :
-                                                OUString("false") );
-}
 
-namespace {
-   bool lcl_ListBoxCompare( const OUString& rStr1, const OUString& rStr2 )
-   {
-       return ListBox::NaturalSortCompare( rStr1, rStr2 ) < 0;
-   }
-}
-
-PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterController>& i_rController )
-    : ModalDialog(i_pParent, "PrintDialog", "vcl/ui/printdialog.ui")
-    , mpCustomOptionsUIBuilder(nullptr)
-    , maPController( i_rController )
-    , maNUpPage(m_pUIBuilder.get())
-    , maJobPage(m_pUIBuilder.get())
-    , maOptionsPage(m_pUIBuilder.get())
-    , maNoPageStr( VclResId( SV_PRINT_NOPAGES ) )
-    , maNoPreviewStr( VclResId( SV_PRINT_NOPREVIEW ) )
-    , mnCurPage( 0 )
-    , mnCachedPages( 0 )
-    , maPrintToFileText( VclResId( SV_PRINT_TOFILE_TXT ) )
-    , maDefPrtText( VclResId( SV_PRINT_DEFPRT_TXT ) )
-    , mbShowLayoutPage( true )
-{
     get(mpOKButton, "ok");
     get(mpCancelButton, "cancel");
     get(mpHelpButton, "help");
@@ -664,9 +503,33 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC
     get(mpBackwardBtn, "backward");
     get(mpNumPagesText, "totalnumpages");
     get(mpPageEdit, "pageedit-nospin");
-    get(mpTabCtrl, "tabcontrol");
     get(mpPreviewWindow, "preview");
     get(mpPreviewBox, "previewbox");
+    get(mpPrinters, "printersbox");
+    get(mpSetupButton, "setup");
+    get(mpStatusTxt, "status");
+    get(mpCollateBox, "collate");
+    get(mpCollateImage, "collateimage");
+    get(mpReverseOrderBox, "reverseorder");
+    get(mpCopyCountField, "copycount");
+    get(mpNupOrderWin, "orderpreview");
+    get(mpNupPagesBox, "pagespersheetbox");
+    get(mpNupOrientationBox, "pageorientationbox");
+    get(mpNupOrderBox, "orderbox");
+    get(mpPagesBtn, "pagespersheetbtn");
+    get(mpBrochureBtn, "brochurebtn");
+    get(mpPagesBoxTitleTxt, "pagespersheettxt");
+    get(mpNupNumPagesTxt, "pagestxt");
+    get(mpNupColEdt, "pagecols");
+    get(mpNupTimesTxt, "by");
+    get(mpNupRowsEdt, "pagerows");
+    get(mpPageMarginTxt1, "pagemargintxt1");
+    get(mpPageMarginEdt, "pagemarginsb");
+    get(mpPageMarginTxt2, "pagemargintxt2");
+    get(mpSheetMarginTxt1, "sheetmargintxt1");
+    get(mpSheetMarginEdt, "sheetmarginsb");
+    get(mpSheetMarginTxt2, "sheetmargintxt2");
+    get(mpBorderCB, "bordercb");
 
     // save printbutton text, gets exchanged occasionally with print to file
     maPrintText = mpOKButton->GetText();
@@ -677,24 +540,21 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC
 
     maPageStr = mpNumPagesText->GetText();
 
-    // init reverse print
-    maJobPage.mpReverseOrderBox->Check( maPController->getReversePrint() );
-
     Printer::updatePrinters();
 
-    maJobPage.mpPrinters->InsertEntry( maPrintToFileText );
+    mpPrinters->InsertEntry( maPrintToFileText );
     // fill printer listbox
     std::vector< OUString > rQueues( Printer::GetPrinterQueues() );
     std::sort( rQueues.begin(), rQueues.end(), lcl_ListBoxCompare );
     for( std::vector< OUString >::const_iterator it = rQueues.begin();
          it != rQueues.end(); ++it )
     {
-        maJobPage.mpPrinters->InsertEntry( *it );
+        mpPrinters->InsertEntry( *it );
     }
     // select current printer
-    if( maJobPage.mpPrinters->GetEntryPos( maPController->getPrinter()->GetName() ) != LISTBOX_ENTRY_NOTFOUND )
+    if( mpPrinters->GetEntryPos( maPController->getPrinter()->GetName() ) != LISTBOX_ENTRY_NOTFOUND )
     {
-        maJobPage.mpPrinters->SelectEntry( maPController->getPrinter()->GetName() );
+        mpPrinters->SelectEntry( maPController->getPrinter()->GetName() );
     }
     else
     {
@@ -702,26 +562,31 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC
         SettingsConfigItem* pItem = SettingsConfigItem::get();
         OUString aValue( pItem->getValue( "PrintDialog",
                                         "LastPrinter" ) );
-        if( maJobPage.mpPrinters->GetEntryPos( aValue ) != LISTBOX_ENTRY_NOTFOUND )
+        if( mpPrinters->GetEntryPos( aValue ) != LISTBOX_ENTRY_NOTFOUND )
         {
-            maJobPage.mpPrinters->SelectEntry( aValue );
+            mpPrinters->SelectEntry( aValue );
             maPController->setPrinter( VclPtrInstance<Printer>( aValue ) );
         }
         else
         {
             // fall back to default printer
-            maJobPage.mpPrinters->SelectEntry( Printer::GetDefaultPrinterName() );
+            mpPrinters->SelectEntry( Printer::GetDefaultPrinterName() );
             maPController->setPrinter( VclPtrInstance<Printer>( Printer::GetDefaultPrinterName() ) );
         }
     }
+
     // not printing to file
     maPController->resetPrinterOptions( false );
 
     // update the text fields for the printer
     updatePrinterText();
 
-    // set a select handler
-    maJobPage.mpPrinters->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    // setup dependencies
+    checkControlDependencies();
+
+    // set initial focus to "Number of copies"
+    mpCopyCountField->GrabFocus();
+    mpCopyCountField->SetSelection( Selection(0, 0xFFFF) );
 
     // setup sizes for N-Up
     Size aNupSize( maPController->getPrinter()->PixelToLogic(
@@ -736,61 +601,41 @@ PrintDialog::PrintDialog( vcl::Window* i_pParent, const std::shared_ptr<PrinterC
         maNupPortraitSize = aNupSize;
         maNupLandscapeSize = Size( aNupSize.Height(), aNupSize.Width() );
     }
-    maNUpPage.initFromMultiPageSetup( maPController->getMultipage() );
-
-    // setup click handler on the various buttons
-    mpOKButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    #if OSL_DEBUG_LEVEL > 1
-    mpCancelButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    #endif
-    mpHelpButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    mpForwardBtn->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    mpBackwardBtn->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    mpPreviewBox->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-
-    maJobPage.mpCollateBox->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
-    maJobPage.mpSetupButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maNUpPage.mpBorderCB->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
-    maOptionsPage.mpPapersizeFromSetup->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
-    maOptionsPage.mpPapersizeFromSetup->Check( maPController->getPapersizeFromSetup() );
-    maJobPage.mpReverseOrderBox->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
-    maOptionsPage.mpCollateSingleJobsBox->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
-    maNUpPage.mpPagesBtn->SetToggleHdl( LINK( this, PrintDialog, ToggleRadioHdl ) );
-    // setup modify hdl
-    mpPageEdit->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maJobPage.mpCopyCountField->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.mpNupRowsEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.mpNupColEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.mpPageMarginEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-    maNUpPage.mpSheetMarginEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
-
-    // setup select hdl
-    maNUpPage.mpNupPagesBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-    maNUpPage.mpNupOrientationBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
-    maNUpPage.mpNupOrderBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
 
-    // setup optional UI options set by application
-    setupOptionalUI();
+    initFromMultiPageSetup( maPController->getMultipage() );
 
-    // remove layout page if unwanted
-    if (!mbShowLayoutPage)
-        mpTabCtrl->RemovePage(mpTabCtrl->GetPageId(2));
+    // setup click hdl
+    mpOKButton->SetClickHdl(LINK(this, PrintDialog, ClickHdl));
+    mpCancelButton->SetClickHdl(LINK(this, PrintDialog, ClickHdl));
+    mpHelpButton->SetClickHdl(LINK(this, PrintDialog, ClickHdl));
+    mpSetupButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    mpBackwardBtn->SetClickHdl(LINK(this, PrintDialog, ClickHdl));
+    mpForwardBtn->SetClickHdl(LINK(this, PrintDialog, ClickHdl));
+    mpPreviewBox->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
+    mpBorderCB->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
 
-    // restore settings from last run
-    readFromSettings();
+    // setup toggle hdl
+    mpReverseOrderBox->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
+    mpCollateBox->SetToggleHdl( LINK( this, PrintDialog, ToggleHdl ) );
+    mpPagesBtn->SetToggleHdl( LINK( this, PrintDialog, ToggleRadioHdl ) );
+    mpBrochureBtn->SetToggleHdl( LINK( this, PrintDialog, ToggleRadioHdl ) );
 
-    // setup dependencies
-    checkControlDependencies();
+    // setup select hdl
+    mpPrinters->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    mpNupPagesBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    mpNupOrientationBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
+    mpNupOrderBox->SetSelectHdl( LINK( this, PrintDialog, SelectHdl ) );
 
-    if ( maPController->getBoolProperty( "HideHelpButton", false ) )
-        mpHelpButton->Hide();
-    // set initial focus to "Number of copies"
-    maJobPage.mpCopyCountField->GrabFocus();
-    maJobPage.mpCopyCountField->SetSelection( Selection(0, 0xFFFF) );
+    // setup modify hdl
+    mpPageEdit->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    mpCopyCountField->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    mpNupColEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
+    mpNupRowsEdt->SetModifyHdl( LINK( this, PrintDialog, ModifyHdl ) );
 
-    updateNupFromPages();
+    preparePreview( true, true );
 }
 
+
 PrintDialog::~PrintDialog()
 {
     disposeOnce();
@@ -798,7 +643,7 @@ PrintDialog::~PrintDialog()
 
 void PrintDialog::dispose()
 {
-    mpCustomOptionsUIBuilder.reset();
+    // mpCustomOptionsUIBuilder.reset();
     mpTabCtrl.clear();
     mpPreviewWindow.clear();
     mpPageEdit.clear();
@@ -811,678 +656,234 @@ void PrintDialog::dispose()
     mpHelpButton.clear();
     maPController.reset();
     maControlToPropertyMap.clear();
-    maControlToNumValMap.clear();
+    // maControlToNumValMap.clear();
+    mpPrinters.clear();
+    mpStatusTxt.clear();
+    mpSetupButton.clear();
+    mpCopyCountField.clear();
+    mpCollateBox.clear();
+    mpCollateImage.clear();
+    mpReverseOrderBox.clear();
+    mpPagesBtn.clear();
+    mpBrochureBtn.clear();
+    mpPagesBoxTitleTxt.clear();
+    mpNupPagesBox.clear();
+    mpNupNumPagesTxt.clear();
+    mpNupColEdt.clear();
+    mpNupTimesTxt.clear();
+    mpNupRowsEdt.clear();
+    mpPageMarginTxt1.clear();
+    mpPageMarginEdt.clear();
+    mpPageMarginTxt2.clear();
+    mpSheetMarginTxt1.clear();
+    mpSheetMarginEdt.clear();
+    mpSheetMarginTxt2.clear();
+    mpNupOrientationBox.clear();
+    mpNupOrderBox.clear();
+    mpNupOrderWin.clear();
+    mpBorderCB.clear();
     ModalDialog::dispose();
 }
 
-void PrintDialog::readFromSettings()
+void PrintDialog::updatePrinterText()
 {
-    maJobPage.readFromSettings();
-    maOptionsPage.readFromSettings();
-
-    // read last selected tab page; if it exists, activate it
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    OUString aValue = pItem->getValue( "PrintDialog",
-                                            "LastPage" );
-    sal_uInt16 nCount = mpTabCtrl->GetPageCount();
-    for( sal_uInt16 i = 0; i < nCount; i++ )
-    {
-        sal_uInt16 nPageId = mpTabCtrl->GetPageId( i );
-        if( aValue == mpTabCtrl->GetPageText( nPageId ) )
-        {
-            mpTabCtrl->SelectTabPage( nPageId );
-            break;
-        }
-    }
-
-    aValue = pItem->getValue( "PrintDialog", "HasPreview" );
-    if ( aValue.equalsIgnoreAsciiCase("true") )
+    const OUString aDefPrt( Printer::GetDefaultPrinterName() );
+    const QueueInfo* pInfo = Printer::GetQueueInfo( mpPrinters->GetSelectedEntry(), true );
+    if( pInfo )
     {
-        mpPreviewBox->Check();
+        // FIXME: status text
+        OUString aStatus;
+        if( aDefPrt == pInfo->GetPrinterName() )
+            aStatus = maDefPrtText;
+        mpStatusTxt->SetText( aStatus );
     }
     else
     {
-        mpPreviewBox->Check( false );
+        mpStatusTxt->SetText( OUString() );
     }
-
-    // persistent window state
-    OUString aWinState( pItem->getValue( "PrintDialog",
-                                              "WindowState" ) );
-    if( !aWinState.isEmpty() )
-        SetWindowState( OUStringToOString( aWinState, RTL_TEXTENCODING_UTF8 ) );
-}
-
-void PrintDialog::storeToSettings()
-{
-    maJobPage.storeToSettings();
-    maOptionsPage.storeToSettings();
-
-    // store last selected printer
-    SettingsConfigItem* pItem = SettingsConfigItem::get();
-    pItem->setValue( "PrintDialog",
-                     "ToFile",
-                      isPrintToFile() ? OUString("true")
-                                             : OUString("false") );
-    pItem->setValue( "PrintDialog",
-                     "LastPrinter",
-                      isPrintToFile() ? Printer::GetDefaultPrinterName()
-                                      : maJobPage.mpPrinters->GetSelectedEntry() );
-
-    pItem->setValue( "PrintDialog",
-                     "LastPage",
-                     mpTabCtrl->GetPageText( mpTabCtrl->GetCurPageId() ) );
-    pItem->setValue( "PrintDialog",
-                     "WindowState",
-                     OStringToOUString( GetWindowState(), RTL_TEXTENCODING_UTF8 )
-                     );
-    pItem->setValue( "PrintDialog",
-                     "HasPreview",
-                     hasPreview() ? OUString("true") : OUString("false") );
-    pItem->Commit();
-}
-
-bool PrintDialog::isPrintToFile()
-{
-    return ( maJobPage.mpPrinters->GetSelectedEntryPos() == 0 );
 }
 
-bool PrintDialog::isCollate()
+void PrintDialog::setPreviewText()
 {
-    return maJobPage.mpCopyCountField->GetValue() > 1 && maJobPage.mpCollateBox->IsChecked();
+    OUString aNewText( maPageStr.replaceFirst( "%n", OUString::number( mnCachedPages ) ) );
+    mpNumPagesText->SetText( aNewText );
 }
 
-bool PrintDialog::isSingleJobs()
+void PrintDialog::preparePreview( bool i_bNewPage, bool i_bMayUseCache )
 {
-    return maOptionsPage.mpCollateSingleJobsBox->IsChecked();
-}
+    VclPtr<Printer> aPrt( maPController->getPrinter() );
+    Size aCurPageSize = aPrt->PixelToLogic( aPrt->GetPaperSizePixel(), MapMode( MapUnit::Map100thMM ) );
+    GDIMetaFile aMtf;
 
-bool PrintDialog::hasPreview()
-{
-    return mpPreviewBox->IsChecked();
-}
+    // page range may have changed depending on options
+    sal_Int32 nPages = maPController->getFilteredPageCount();
+    mnCachedPages = nPages;
 
-void setHelpId( vcl::Window* i_pWindow, const Sequence< OUString >& i_rHelpIds, sal_Int32 i_nIndex )
-{
-    if( i_nIndex >= 0 && i_nIndex < i_rHelpIds.getLength() )
-        i_pWindow->SetHelpId( OUStringToOString( i_rHelpIds.getConstArray()[i_nIndex], RTL_TEXTENCODING_UTF8 ) );
-}
+    mpPageEdit->SetMin( 1 );
+    mpPageEdit->SetMax( nPages );
 
-static void setHelpText( vcl::Window* i_pWindow, const Sequence< 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] );
-}
+    setPreviewText();
 
-void PrintDialog::setupOptionalUI()
-{
-    const Sequence< PropertyValue >& rOptions( maPController->getUIOptions() );
-    for( int i = 0; i < rOptions.getLength(); i++ )
+    if ( !hasPreview() )
     {
-        if (rOptions[i].Name == "OptionsUIFile")
-        {
-            OUString sOptionsUIFile;
-            rOptions[i].Value >>= sOptionsUIFile;
+        mpPreviewWindow->setPreview( aMtf, aCurPageSize,
+                            aPrt->GetPaperName(),
+                            maNoPreviewStr,
+                            aPrt->GetDPIX(), aPrt->GetDPIY(),
+                            aPrt->GetPrinterOptions().IsConvertToGreyscales()
+                            );
+
+        mpForwardBtn->Enable( false );
+        mpBackwardBtn->Enable( false );
+        mpPageEdit->Enable( false );
 
-            vcl::Window *pCustom = get<vcl::Window>("customcontents");
+        return;
+    }
 
-            mpCustomOptionsUIBuilder.reset(new VclBuilder(pCustom, getUIRootDir(), sOptionsUIFile));
-            vcl::Window *pWindow = mpCustomOptionsUIBuilder->get_widget_root();
-            pWindow->Show();
-            continue;
-        }
+    if( mnCurPage >= nPages )
+        mnCurPage = nPages-1;
+    if( mnCurPage < 0 )
+        mnCurPage = 0;
 
-        Sequence< beans::PropertyValue > aOptProp;
-        rOptions[i].Value >>= aOptProp;
-
-        // extract ui element
-        OUString aCtrlType;
-        OString aID;
-        OUString aText;
-        OUString aPropertyName;
-        Sequence< OUString > aChoices;
-        Sequence< sal_Bool > aChoicesDisabled;
-        Sequence< OUString > aHelpTexts;
-        Sequence< OUString > aIDs;
-        Sequence< OUString > aHelpIds;
-        sal_Int64 nMinValue = 0, nMaxValue = 0;
-        OUString aGroupingHint;
-        OUString aDependsOnName;
-        sal_Int32 nDependsOnValue = 0;
-        bool bUseDependencyRow = false;
-
-        for( int n = 0; n < aOptProp.getLength(); n++ )
+    if( i_bNewPage )
+    {
+        const MapMode aMapMode( MapUnit::Map100thMM );
+        if( nPages > 0 )
         {
-            const beans::PropertyValue& rEntry( aOptProp[ n ] );
-            if ( rEntry.Name == "ID" )
-            {
-                rEntry.Value >>= aIDs;
-                aID = OUStringToOString(aIDs[0], RTL_TEXTENCODING_UTF8);
-            }
-            if ( rEntry.Name == "Text" )
-            {
-                rEntry.Value >>= aText;
-            }
-            else if ( rEntry.Name == "ControlType" )
-            {
-                rEntry.Value >>= aCtrlType;
-            }
-            else if ( rEntry.Name == "Choices" )
-            {
-                rEntry.Value >>= aChoices;
-            }
-            else if ( rEntry.Name == "ChoicesDisabled" )
-            {
-                rEntry.Value >>= aChoicesDisabled;
-            }
-            else if ( rEntry.Name == "Property" )
-            {
-                PropertyValue aVal;
-                rEntry.Value >>= aVal;
-                aPropertyName = aVal.Name;
-            }
-            else if ( rEntry.Name == "Enabled" )
-            {
-                bool bValue = true;
-                rEntry.Value >>= bValue;
-            }
-            else if ( rEntry.Name == "GroupingHint" )
-            {
-                rEntry.Value >>= aGroupingHint;
-            }
-            else if ( rEntry.Name == "DependsOnName" )
-            {
-                rEntry.Value >>= aDependsOnName;
-            }
-            else if ( rEntry.Name == "DependsOnEntry" )
-            {
-                rEntry.Value >>= nDependsOnValue;
-            }
-            else if ( rEntry.Name == "AttachToDependency" )
-            {
-                rEntry.Value >>= bUseDependencyRow;
-            }
-            else if ( rEntry.Name == "MinValue" )
-            {
-                rEntry.Value >>= nMinValue;
-            }
-            else if ( rEntry.Name == "MaxValue" )
-            {
-                rEntry.Value >>= nMaxValue;
-            }
-            else if ( rEntry.Name == "HelpText" )
-            {
-                if( ! (rEntry.Value >>= aHelpTexts) )
-                {
-                    OUString aHelpText;
-                    if( rEntry.Value >>= aHelpText )
-                    {
-                        aHelpTexts.realloc( 1 );
-                        *aHelpTexts.getArray() = aHelpText;
-                    }
-                }
-            }
-            else if ( rEntry.Name == "HelpId" )
-            {
-                if( ! (rEntry.Value >>= aHelpIds ) )
-                {
-                    OUString aHelpId;
-                    if( rEntry.Value >>= aHelpId )
-                    {
-                        aHelpIds.realloc( 1 );
-                        *aHelpIds.getArray() = aHelpId;
-                    }
-                }
-            }
-            else if ( rEntry.Name == "HintNoLayoutPage" )
+            PrinterController::PageSize aPageSize =
+                maPController->getFilteredPageFile( mnCurPage, aMtf, i_bMayUseCache );
+            if( ! aPageSize.bFullPaper )
             {
-                bool bNoLayoutPage = false;
-                rEntry.Value >>= bNoLayoutPage;
-                mbShowLayoutPage = ! bNoLayoutPage;
+                Point aOff( aPrt->PixelToLogic( aPrt->GetPageOffsetPixel(), aMapMode ) );
+                aMtf.Move( aOff.X(), aOff.Y() );
             }
         }
 
-        if (aCtrlType == "Group" && !aID.isEmpty())
-        {
-            TabPage *pPage = get<TabPage>(aID);
-            if (!pPage && mpCustomOptionsUIBuilder)
-                pPage = mpCustomOptionsUIBuilder->get<TabPage>(aID);
-
-            if (!pPage)
-                continue;
+        mpPreviewWindow->setPreview( aMtf, aCurPageSize,
+                                    aPrt->GetPaperName(),
+                                    nPages > 0 ? OUString() : maNoPageStr,
+                                    aPrt->GetDPIX(), aPrt->GetDPIY(),
+                                    aPrt->GetPrinterOptions().IsConvertToGreyscales()
+                                   );
 
-            sal_uInt16 nPageId = mpTabCtrl->GetPageId(*pPage);
+        mpForwardBtn->Enable( mnCurPage < nPages-1 );
+        mpBackwardBtn->Enable( mnCurPage != 0 );
+        mpPageEdit->Enable( nPages > 1 );
+    }
+}
 
-            mpTabCtrl->SetPageText(nPageId, aText);
+void PrintDialog::checkControlDependencies()
+{
 
-            // set help id
-            if (aHelpIds.getLength() > 0)
-                mpTabCtrl->SetHelpId(nPageId, OUStringToOString(aHelpIds.getConstArray()[0], RTL_TEXTENCODING_UTF8));
+    if( mpCopyCountField->GetValue() > 1 )
+        mpCollateBox->Enable( mnCollateUIMode == 0 );
+    else
+        mpCollateBox->Enable( false );
 
-            // set help text
-            if (aHelpTexts.getLength() > 0)
-                mpTabCtrl->SetHelpText(nPageId, aHelpTexts.getConstArray()[0]);
+    Image aImg(mpCollateBox->IsChecked() ? maCollateBmp : maNoCollateBmp);
 
-            pPage->Show();
-        }
-        else if (aCtrlType == "Subgroup" && !aID.isEmpty())
-        {
-            vcl::Window *pFrame = get<vcl::Window>(aID);
-            if (!pFrame && mpCustomOptionsUIBuilder)
-                pFrame = mpCustomOptionsUIBuilder->get<vcl::Window>(aID);
+    Size aImgSize( aImg.GetSizePixel() );
 
-            if (!pFrame)
-                continue;
+    // adjust size of image
+    mpCollateImage->SetSizePixel( aImgSize );
+    mpCollateImage->SetImage( aImg );
 
-            pFrame->SetText(aText);
+    // enable setup button only for printers that can be setup
+    bool bHaveSetup = maPController->getPrinter()->HasSupport( PrinterSupport::SetupDialog );
+    mpSetupButton->Enable(bHaveSetup);
+}
 
-            // set help id
-            setHelpId(pFrame, aHelpIds, 0);
-            // set help text
-            setHelpText(pFrame, aHelpTexts, 0);
+void PrintDialog::initFromMultiPageSetup( const vcl::PrinterController::MultiPageSetup& i_rMPS )
+{
+    mpNupOrderWin->Show();
+    mpPagesBtn->Check();
+    mpBrochureBtn->Show( false );
 
-            pFrame->Show();
-        }
-        // EVIL
-        else if( aCtrlType == "Bool" && aGroupingHint == "LayoutPage" && aPropertyName == "PrintProspect" )
-        {
-            maNUpPage.mpBrochureBtn->SetText( aText );
-            maNUpPage.mpBrochureBtn->Show();
-
-            bool bVal = false;
-            PropertyValue* pVal = maPController->getValue( aPropertyName );
-            if( pVal )
-                pVal->Value >>= bVal;
-            maNUpPage.mpBrochureBtn->Check( bVal );
-            maNUpPage.mpBrochureBtn->Enable( maPController->isUIOptionEnabled( aPropertyName ) && pVal != nullptr );
-            maNUpPage.mpBrochureBtn->SetToggleHdl( LINK( this, PrintDialog, ToggleRadioHdl ) );
-
-            maPropertyToWindowMap[ aPropertyName ].emplace_back(maNUpPage.mpBrochureBtn );
-            maControlToPropertyMap[maNUpPage.mpBrochureBtn] = aPropertyName;
-
-            // set help id
-            setHelpId( maNUpPage.mpBrochureBtn, aHelpIds, 0 );
-            // set help text
-            setHelpText( maNUpPage.mpBrochureBtn, aHelpTexts, 0 );
-        }
-        else if (aCtrlType == "Bool")
-        {
-            // add a check box
-            CheckBox* pNewBox = get<CheckBox>(aID);
-            if (!pNewBox && mpCustomOptionsUIBuilder)
-                pNewBox = mpCustomOptionsUIBuilder->get<CheckBox>(aID);
-
-            if (!pNewBox)
-                continue;
-
-            pNewBox->SetText( aText );
-            pNewBox->Show();
-
-            bool bVal = false;
-            PropertyValue* pVal = maPController->getValue( aPropertyName );
-            if( pVal )
-                pVal->Value >>= bVal;
-            pNewBox->Check( bVal );
-            pNewBox->SetToggleHdl( LINK( this, PrintDialog, UIOption_CheckHdl ) );
-
-            maPropertyToWindowMap[ aPropertyName ].emplace_back(pNewBox );
-            maControlToPropertyMap[pNewBox] = aPropertyName;
-
-            // set help id
-            setHelpId( pNewBox, aHelpIds, 0 );
-            // set help text
-            setHelpText( pNewBox, aHelpTexts, 0 );
-        }
-        else if (aCtrlType == "Radio")
-        {
-            sal_Int32 nCurHelpText = 0;
-
-            // 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++ )
-            {
-                aID = OUStringToOString(aIDs[m], RTL_TEXTENCODING_UTF8);
-                RadioButton* pBtn = get<RadioButton>(aID);
-                if (!pBtn && mpCustomOptionsUIBuilder)
-                    pBtn = mpCustomOptionsUIBuilder->get<RadioButton>(aID);
-
-                if (!pBtn)
-                    continue;
-
-                pBtn->SetText( aChoices[m] );
-                pBtn->Check( m == nSelectVal );
-                pBtn->SetToggleHdl( LINK( this, PrintDialog, UIOption_RadioHdl ) );
-                if( aChoicesDisabled.getLength() > m && aChoicesDisabled[m] )
-                    pBtn->Enable( false );
-                pBtn->Show();
-                maPropertyToWindowMap[ aPropertyName ].emplace_back(pBtn );
-                maControlToPropertyMap[pBtn] = aPropertyName;
-                maControlToNumValMap[pBtn] = m;
-
-                // set help id
-                setHelpId( pBtn, aHelpIds, nCurHelpText );
-                // set help text
-                setHelpText( pBtn, aHelpTexts, nCurHelpText );
-                nCurHelpText++;
-            }
-        }
-        else if ( aCtrlType == "List" )
-        {
-            ListBox* pList = get<ListBox>(aID);
-            if (!pList && mpCustomOptionsUIBuilder)
-                pList = mpCustomOptionsUIBuilder->get<ListBox>(aID);
-
-            if (!pList)
-                continue;
-
-            // 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 ].emplace_back(pList );
-            maControlToPropertyMap[pList] = aPropertyName;
-        }
-        else if ( aCtrlType == "Range" )
-        {
-            NumericField* pField = get<NumericField>(aID);
-            if (!pField && mpCustomOptionsUIBuilder)
-                pField = mpCustomOptionsUIBuilder->get<NumericField>(aID);
-
-            if (!pField)
-                continue;
-
-            // 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 ].emplace_back(pField );
-            maControlToPropertyMap[pField] = aPropertyName;
-        }
-        else if (aCtrlType == "Edit")
-        {
-            Edit *pField = get<Edit>(aID);
-            if (!pField && mpCustomOptionsUIBuilder)
-                pField = mpCustomOptionsUIBuilder->get<Edit>(aID);
-
-            if (!pField)
-                continue;
-
-            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 ].emplace_back(pField );
-            maControlToPropertyMap[pField] = aPropertyName;
-        }
-        else
-        {
-            SAL_WARN( "vcl", "Unsupported UI option: \"" << aCtrlType << '"');
-        }
-    }
-
-    // #i106506# if no brochure button, then the singular Pages radio button
-    // makes no sense, so replace it by a FixedText label
-    if (!maNUpPage.mpBrochureBtn->IsVisible() && maNUpPage.mpPagesBtn->IsVisible())
-    {
-        maNUpPage.mpPagesBoxTitleTxt->SetText( maNUpPage.mpPagesBtn->GetText() );
-        maNUpPage.mpPagesBoxTitleTxt->Show();
-        maNUpPage.mpPagesBtn->Show( false );
-    }
-
-    // update enable states
-    checkOptionalControlDependencies();
-
-    vcl::Window *pPageRange = get<vcl::Window>("pagerange");
-
-    // print range not shown (currently math only) -> hide spacer line and reverse order
-    if (!pPageRange || !pPageRange->IsVisible())
-    {
-        maJobPage.mpReverseOrderBox->Show( false );
-    }
-
-    if (!mpCustomOptionsUIBuilder)
-        mpTabCtrl->RemovePage(mpTabCtrl->GetPageId(1));
-}
-
-void PrintDialog::DataChanged( const DataChangedEvent& i_rDCEvt )
-{
-    // react on settings changed
-    if( i_rDCEvt.GetType() == DataChangedEventType::SETTINGS )
-        checkControlDependencies();
-    ModalDialog::DataChanged( i_rDCEvt );
-}
-
-void PrintDialog::checkControlDependencies()
-{
-    if( maJobPage.mpCopyCountField->GetValue() > 1 )
-        maJobPage.mpCollateBox->Enable( maJobPage.mnCollateUIMode == 0 );
-    else
-        maJobPage.mpCollateBox->Enable( false );
-
-    Image aImg(maJobPage.mpCollateBox->IsChecked() ? maJobPage.maCollateBmp : maJobPage.maNoCollateBmp);
-
-    Size aImgSize( aImg.GetSizePixel() );
-
-    // adjust size of image
-    maJobPage.mpCollateImage->SetSizePixel( aImgSize );
-    maJobPage.mpCollateImage->SetImage( aImg );
-
-    // enable setup button only for printers that can be setup
-    bool bHaveSetup = maPController->getPrinter()->HasSupport( PrinterSupport::SetupDialog );
-    maJobPage.mpSetupButton->Enable(bHaveSetup);
-}
-
-void PrintDialog::checkOptionalControlDependencies()
-{
-    for( auto it = maControlToPropertyMap.begin();
-         it != maControlToPropertyMap.end(); ++it )
+    // setup field units for metric fields
+    const LocaleDataWrapper& rLocWrap( mpPageMarginEdt->GetLocaleDataWrapper() );
+    FieldUnit eUnit = FUNIT_MM;
+    sal_uInt16 nDigits = 0;
+    if( rLocWrap.getMeasurementSystemEnum() == MeasurementSystem::US )
     {
-        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() )
-            {
-                OUString aDep( maPController->getDependency( it->second ) );
-                // if the dependency is at least enabled, then enable this control anyway
-                if( !aDep.isEmpty() && maPController->isUIOptionEnabled( aDep ) )
-                    bShouldbeEnabled = true;
-            }
-        }
-
-        if( bShouldbeEnabled && dynamic_cast<RadioButton*>(it->first.get()) )
-        {
-            auto 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 );
+        eUnit = FUNIT_INCH;
+        nDigits = 2;
     }
-}
+    // set units
+    mpPageMarginEdt->SetUnit( eUnit );
+    mpSheetMarginEdt->SetUnit( eUnit );
 
-static OUString searchAndReplace( const OUString& i_rOrig, const char* i_pRepl, sal_Int32 i_nReplLen, const OUString& i_rRepl )
-{
-    sal_Int32 nPos = i_rOrig.indexOfAsciiL( i_pRepl, i_nReplLen );
-    if( nPos != -1 )
-    {
-        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;
-}
+    // set precision
+    mpPageMarginEdt->SetDecimalDigits( nDigits );
+    mpSheetMarginEdt->SetDecimalDigits( nDigits );
 
-void PrintDialog::updatePrinterText()
-{
-    const OUString aDefPrt( Printer::GetDefaultPrinterName() );
-    const QueueInfo* pInfo = Printer::GetQueueInfo( maJobPage.mpPrinters->GetSelectedEntry(), true );
-    if( pInfo )
-    {
-        maJobPage.mpLocationTxt->SetText( pInfo->GetLocation() );
-        maJobPage.mpCommentTxt->SetText( pInfo->GetComment() );
-        // FIXME: status text
-        OUString aStatus;
-        if( aDefPrt == pInfo->GetPrinterName() )
-            aStatus = maDefPrtText;
-        maJobPage.mpStatusTxt->SetText( aStatus );
-    }
-    else
+    mpSheetMarginEdt->SetValue( mpSheetMarginEdt->Normalize( i_rMPS.nLeftMargin ), FUNIT_100TH_MM );
+    mpPageMarginEdt->SetValue( mpPageMarginEdt->Normalize( i_rMPS.nHorizontalSpacing ), FUNIT_100TH_MM );
+    mpBorderCB->Check( i_rMPS.bDrawBorder );
+    mpNupRowsEdt->SetValue( i_rMPS.nRows );
+    mpNupColEdt->SetValue( i_rMPS.nColumns );
+    mpNupOrderBox->SelectEntryPos( static_cast<sal_Int32>(i_rMPS.nOrder) );
+    if( i_rMPS.nRows != 1 || i_rMPS.nColumns != 1 )
     {
-        maJobPage.mpLocationTxt->SetText( OUString() );
-        maJobPage.mpCommentTxt->SetText( OUString() );
-        maJobPage.mpStatusTxt->SetText( OUString() );
+        mpNupPagesBox->SelectEntryPos( mpNupPagesBox->GetEntryCount()-1 );
+        showAdvancedControls( true );
+        mpNupOrderWin->setValues( i_rMPS.nOrder, i_rMPS.nColumns, i_rMPS.nRows );
     }
 }
 
-void PrintDialog::setPreviewText()
+void PrintDialog::updateNup()
 {
-    OUString aNewText( searchAndReplace( maPageStr, "%n", 2, OUString::number( mnCachedPages )  ) );
-    mpNumPagesText->SetText( aNewText );
-}
+    int nRows         = int(mpNupRowsEdt->GetValue());
+    int nCols         = int(mpNupColEdt->GetValue());
+    long nPageMargin  = mpPageMarginEdt->Denormalize(mpPageMarginEdt->GetValue( FUNIT_100TH_MM ));
+    long nSheetMargin = mpSheetMarginEdt->Denormalize(mpSheetMarginEdt->GetValue( FUNIT_100TH_MM ));
 
-void PrintDialog::preparePreview( bool i_bNewPage, bool i_bMayUseCache )
-{
-    VclPtr<Printer> aPrt( maPController->getPrinter() );
-    Size aCurPageSize = aPrt->PixelToLogic( aPrt->GetPaperSizePixel(), MapMode( MapUnit::Map100thMM ) );
-    GDIMetaFile aMtf;
+    PrinterController::MultiPageSetup aMPS;
+    aMPS.nRows         = nRows;
+    aMPS.nColumns      = nCols;
+    aMPS.nLeftMargin   =
+    aMPS.nTopMargin    =
+    aMPS.nRightMargin  =
+    aMPS.nBottomMargin = nSheetMargin;
 
-    // page range may have changed depending on options
-    sal_Int32 nPages = maPController->getFilteredPageCount();
-    mnCachedPages = nPages;
+    aMPS.nHorizontalSpacing =
+    aMPS.nVerticalSpacing   = nPageMargin;
 
-    mpPageEdit->SetMin( 1 );
-    mpPageEdit->SetMax( nPages );
+    aMPS.bDrawBorder        = mpBorderCB->IsChecked();
 
-    setPreviewText();
+    aMPS.nOrder = static_cast<NupOrderType>(mpNupOrderBox->GetSelectedEntryPos());
 
-    if ( !hasPreview() )
+    int nOrientationMode = mpNupOrientationBox->GetSelectedEntryPos();
+    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
     {
-        mpPreviewWindow->setPreview( aMtf, aCurPageSize,
-                            aPrt->GetPaperName(),
-                            maNoPreviewStr,
-                            aPrt->GetDPIX(), aPrt->GetDPIY(),
-                            aPrt->GetPrinterOptions().IsConvertToGreyscales()
-                            );
-
-        mpForwardBtn->Enable( false );
-        mpBackwardBtn->Enable( false );
-        mpPageEdit->Enable( false );
+        // 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();
 
-        return;
+        Size aMultiSize( aPageSize.Width() * nCols, aPageSize.Height() * nRows );
+        if( aMultiSize.Width() > aMultiSize.Height() ) // fits better on landscape
+            aMPS.aPaperSize = maNupLandscapeSize;
+        else
+            aMPS.aPaperSize = maNupPortraitSize;
     }
 
-    if( mnCurPage >= nPages )
-        mnCurPage = nPages-1;
-    if( mnCurPage < 0 )
-        mnCurPage = 0;
-
-    if( i_bNewPage )
-    {
-        const MapMode aMapMode( MapUnit::Map100thMM );
-        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() );
-            }
-        }
+    maPController->setMultipage( aMPS );
 
-        mpPreviewWindow->setPreview( aMtf, aCurPageSize,
-                                    aPrt->GetPaperName(),
-                                    nPages > 0 ? OUString() : maNoPageStr,
-                                    aPrt->GetDPIX(), aPrt->GetDPIY(),
-                                    aPrt->GetPrinterOptions().IsConvertToGreyscales()
-                                   );
+    mpNupOrderWin->setValues( aMPS.nOrder, nCols, nRows );
 
-        mpForwardBtn->Enable( mnCurPage < nPages-1 );
-        mpBackwardBtn->Enable( mnCurPage != 0 );
-        mpPageEdit->Enable( nPages > 1 );
-    }
-}
-
-Size const & 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;
+    preparePreview( true, true );
 }
 
 void PrintDialog::updateNupFromPages()
 {
-    sal_IntPtr nPages = sal_IntPtr(maNUpPage.mpNupPagesBox->GetSelectedEntryData());
-    int nRows   = int(maNUpPage.mpNupRowsEdt->GetValue());
-    int nCols   = int(maNUpPage.mpNupColEdt->GetValue());
-    long nPageMargin  = maNUpPage.mpPageMarginEdt->Denormalize(maNUpPage.mpPageMarginEdt->GetValue( FUNIT_100TH_MM ));
-    long nSheetMargin = maNUpPage.mpSheetMarginEdt->Denormalize(maNUpPage.mpSheetMarginEdt->GetValue( FUNIT_100TH_MM ));
+    sal_IntPtr nPages = sal_IntPtr(mpNupPagesBox->GetSelectedEntryData());
+    int nRows   = int(mpNupRowsEdt->GetValue());
+    int nCols   = int(mpNupColEdt->GetValue());
+    long nPageMargin  = mpPageMarginEdt->Denormalize(mpPageMarginEdt->GetValue( FUNIT_100TH_MM ));
+    long nSheetMargin = mpSheetMarginEdt->Denormalize(mpSheetMarginEdt->GetValue( FUNIT_100TH_MM ));
     bool bCustom = false;
 
     if( nPages == 1 )
@@ -1546,8 +947,8 @@ void PrintDialog::updateNupFromPages()
         if( nSheetMargin > nVertMax )
             nSheetMargin = nVertMax;
 
-        maNUpPage.mpSheetMarginEdt->SetMax(
-                  maNUpPage.mpSheetMarginEdt->Normalize(
+        mpSheetMarginEdt->SetMax(
+                  mpSheetMarginEdt->Normalize(
                            std::min(nHorzMax, nVertMax) ), FUNIT_100TH_MM );
 
         // maximum page distance
@@ -1563,123 +964,81 @@ void PrintDialog::updateNupFromPages()
         if( nPageMargin > nVertMax )
             nPageMargin = nVertMax;
 
-        maNUpPage.mpPageMarginEdt->SetMax(
-                 maNUpPage.mpSheetMarginEdt->Normalize(
+        mpPageMarginEdt->SetMax(
+                 mpSheetMarginEdt->Normalize(
                            std::min(nHorzMax, nVertMax ) ), FUNIT_100TH_MM );
     }
 
-    maNUpPage.mpNupRowsEdt->SetValue( nRows );
-    maNUpPage.mpNupColEdt->SetValue( nCols );
-    maNUpPage.mpPageMarginEdt->SetValue( maNUpPage.mpPageMarginEdt->Normalize( nPageMargin ), FUNIT_100TH_MM );
-    maNUpPage.mpSheetMarginEdt->SetValue( maNUpPage.mpSheetMarginEdt->Normalize( nSheetMargin ), FUNIT_100TH_MM );
+    mpNupRowsEdt->SetValue( nRows );
+    mpNupColEdt->SetValue( nCols );
+    mpPageMarginEdt->SetValue( mpPageMarginEdt->Normalize( nPageMargin ), FUNIT_100TH_MM );
+    mpSheetMarginEdt->SetValue( mpSheetMarginEdt->Normalize( nSheetMargin ), FUNIT_100TH_MM );
 
-    maNUpPage.showAdvancedControls( bCustom );
+    showAdvancedControls( bCustom );
 
     updateNup();
 }
 
-#define SV_PRINT_PRT_NUP_ORIENTATION_PORTRAIT           1
-#define SV_PRINT_PRT_NUP_ORIENTATION_LANDSCAPE          2
-
-void PrintDialog::updateNup()
+void PrintDialog::showAdvancedControls( bool i_bShow )
 {
-    int nRows         = int(maNUpPage.mpNupRowsEdt->GetValue());
-    int nCols         = int(maNUpPage.mpNupColEdt->GetValue());
-    long nPageMargin  = maNUpPage.mpPageMarginEdt->Denormalize(maNUpPage.mpPageMarginEdt->GetValue( FUNIT_100TH_MM ));
-    long nSheetMargin = maNUpPage.mpSheetMarginEdt->Denormalize(maNUpPage.mpSheetMarginEdt->GetValue( FUNIT_100TH_MM ));
-
-    PrinterController::MultiPageSetup aMPS;
-    aMPS.nRows         = nRows;
-    aMPS.nColumns      = nCols;
-    aMPS.nLeftMargin   =
-    aMPS.nTopMargin    =
-    aMPS.nRightMargin  =
-    aMPS.nBottomMargin = nSheetMargin;
-
-    aMPS.nHorizontalSpacing =
-    aMPS.nVerticalSpacing   = nPageMargin;
-
-    aMPS.bDrawBorder        = maNUpPage.mpBorderCB->IsChecked();
-
-    aMPS.nOrder = static_cast<NupOrderType>(maNUpPage.mpNupOrderBox->GetSelectedEntryPos());
-
-    int nOrientationMode = maNUpPage.mpNupOrientationBox->GetSelectedEntryPos();
-    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 );
+    mpNupNumPagesTxt->Show( i_bShow );
+    mpNupColEdt->Show( i_bShow );
+    mpNupTimesTxt->Show( i_bShow );
+    mpNupRowsEdt->Show( i_bShow );
+    mpPageMarginTxt1->Show( i_bShow );
+    mpPageMarginEdt->Show( i_bShow );
+    mpPageMarginTxt2->Show( i_bShow );
+    mpSheetMarginTxt1->Show( i_bShow );
+    mpSheetMarginEdt->Show( i_bShow );
+    mpSheetMarginTxt2->Show( i_bShow );
+}
 
-    maNUpPage.mpNupOrderWin->setValues( aMPS.nOrder, nCols, nRows );
+bool PrintDialog::isPrintToFile()
+{
+    return ( mpPrinters->GetSelectedEntryPos() == 0 );
+}
 
-    preparePreview( true, true );
+bool PrintDialog::isCollate()
+{
+    return mpCopyCountField->GetValue() > 1 && mpCollateBox->IsChecked();
 }
 
-IMPL_LINK( PrintDialog, SelectHdl, ListBox&, rBox, void )
+bool PrintDialog::hasPreview()
 {
-    if(  &rBox == maJobPage.mpPrinters )
-    {
+    return mpPreviewBox->IsChecked();
+}
 
-        if ( rBox.GetSelectedEntryPos() != 0)
-        {
-            OUString aNewPrinter( rBox.GetSelectedEntry() );
-            // set new printer
-            maPController->setPrinter( VclPtrInstance<Printer>( aNewPrinter ) );
-            maPController->resetPrinterOptions( false  );
-            // update text fields
-            mpOKButton->SetText( maPrintText );
-            updatePrinterText();
-            preparePreview();
-        }
-        else // print to file
-        {
-            // use the default printer or FIXME: the last used one?
-            maPController->setPrinter( VclPtrInstance<Printer>( Printer::GetDefaultPrinterName() ) );
-            mpOKButton->SetText( maPrintToFileText );
-            maPController->resetPrinterOptions( true );
-            preparePreview( true, true );
-        }
-    }
-    else if( &rBox == maNUpPage.mpNupOrientationBox || &rBox == maNUpPage.mpNupOrderBox )
+PropertyValue* PrintDialog::getValueForWindow( vcl::Window* i_pWindow ) const
+{
+    PropertyValue* pVal = nullptr;
+    auto it = maControlToPropertyMap.find( i_pWindow );
+    if( it != maControlToPropertyMap.end() )
     {
-        updateNup();
+        pVal = maPController->getValue( it->second );
+        SAL_WARN_IF( !pVal, "vcl", "property value not found" );
     }
-    else if( &rBox == maNUpPage.mpNupPagesBox )
+    else
     {
-        if( !maNUpPage.mpPagesBtn->IsChecked() )
-            maNUpPage.mpPagesBtn->Check();
-        updateNupFromPages();
+        OSL_FAIL( "changed control not in property map" );
     }
+    return pVal;
 }
 
-IMPL_LINK( PrintDialog, ToggleRadioHdl, RadioButton&, rButton, void )
+IMPL_LINK( PrintDialog, ToggleHdl, CheckBox&, rButton, void )
 {
-    ClickHdl(static_cast<Button*>(&rButton));
+    ClickHdl(&rButton);
 }
 
-IMPL_LINK( PrintDialog, ToggleHdl, CheckBox&, rButton, void )
+IMPL_LINK( PrintDialog, ToggleRadioHdl, RadioButton&, rButton, void )
 {
-    ClickHdl(&rButton);
+    ClickHdl(static_cast<Button*>(&rButton));
 }
 
-IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton, void )
+IMPL_LINK ( PrintDialog, ClickHdl, Button*, pButton, void )
 {
     if( pButton == mpOKButton || pButton == mpCancelButton )
     {
-        storeToSettings();
+        //storeToSettings();
         EndDialog( pButton == mpOKButton ? RET_OK : RET_CANCEL );
     }
     else if( pButton == mpHelpButton )
@@ -1703,61 +1062,53 @@ IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton, void )
     {
         previewBackward();
     }
-    else if( pButton == maOptionsPage.mpPapersizeFromSetup )
-    {
-        bool bChecked = maOptionsPage.mpPapersizeFromSetup->IsChecked();
-        maPController->setPapersizeFromSetup( bChecked );
-        maPController->setValue( "PapersizeFromSetup",
-                                 makeAny( bChecked ) );
-        preparePreview( true, true );
-    }
-    else if( pButton == maNUpPage.mpBrochureBtn )
+    else if( pButton == mpBrochureBtn )
     {
         PropertyValue* pVal = getValueForWindow( pButton );
         if( pVal )
         {
-            bool bVal = maNUpPage.mpBrochureBtn->IsChecked();
+            bool bVal = mpBrochureBtn->IsChecked();
             pVal->Value <<= bVal;
 
-            checkOptionalControlDependencies();
+            //checkOptionalControlDependencies();
 
             // update preview and page settings
             preparePreview();
         }
-        if( maNUpPage.mpBrochureBtn->IsChecked() )
+        if( mpBrochureBtn->IsChecked() )
         {
-            maNUpPage.mpNupPagesBox->SelectEntryPos( 0 );
+            mpNupPagesBox->SelectEntryPos( 0 );
             updateNupFromPages();
-            maNUpPage.showAdvancedControls( false );
-            maNUpPage.enableNupControls( false );
+            showAdvancedControls( false );
+            //enableNupControls( false );
         }
     }
-    else if( pButton == maNUpPage.mpPagesBtn )
+    else if( pButton == mpPagesBtn )
     {
-        maNUpPage.enableNupControls( true );
+        //enableNupControls( true );
         updateNupFromPages();
     }
-    else if( pButton == maJobPage.mpCollateBox )
+    else if( pButton == mpCollateBox )
     {
         maPController->setValue( "Collate",
                                  makeAny( isCollate() ) );
         checkControlDependencies();
     }
-    else if( pButton == maJobPage.mpReverseOrderBox )
+    else if( pButton == mpReverseOrderBox )
     {
-        bool bChecked = maJobPage.mpReverseOrderBox->IsChecked();
+        bool bChecked = mpReverseOrderBox->IsChecked();
         maPController->setReversePrint( bChecked );
         maPController->setValue( "PrintReverse",
                                  makeAny( bChecked ) );
         preparePreview( true, true );
     }
-    else if( pButton == maNUpPage.mpBorderCB )
+    else if( pButton == mpBorderCB )
     {
         updateNup();
     }
     else
     {
-        if( pButton == maJobPage.mpSetupButton )
+        if( pButton == mpSetupButton )
         {
             maPController->setupPrinter(GetFrameWeld());
 
@@ -1766,233 +1117,69 @@ IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton, void )
         }
         checkControlDependencies();
     }
-}
 
-IMPL_LINK( PrintDialog, ModifyHdl, Edit&, rEdit, void )
-{
-    checkControlDependencies();
-    if( &rEdit == maNUpPage.mpNupRowsEdt || &rEdit == maNUpPage.mpNupColEdt ||
-        &rEdit == maNUpPage.mpSheetMarginEdt || &rEdit == maNUpPage.mpPageMarginEdt
-       )
-    {
-        updateNupFromPages();
-    }
-    else if( &rEdit == mpPageEdit )
-    {
-        mnCurPage = sal_Int32( mpPageEdit->GetValue() - 1 );
-        preparePreview( true, true );
-    }
-    else if( &rEdit == maJobPage.mpCopyCountField )
-    {
-        maPController->setValue( "CopyCount",
-                               makeAny( sal_Int32(maJobPage.mpCopyCountField->GetValue()) ) );
-        maPController->setValue( "Collate",
-                               makeAny( isCollate() ) );
-    }
 }
 
-PropertyValue* PrintDialog::getValueForWindow( vcl::Window* i_pWindow ) const
+IMPL_LINK( PrintDialog, SelectHdl, ListBox&, rBox, void )
 {
-    PropertyValue* pVal = nullptr;
-    auto it = maControlToPropertyMap.find( i_pWindow );
-    if( it != maControlToPropertyMap.end() )
-    {
-        pVal = maPController->getValue( it->second );
-        SAL_WARN_IF( !pVal, "vcl", "property value not found" );
-    }
-    else
+    if(  &rBox == mpPrinters )
     {
-        OSL_FAIL( "changed control not in property map" );
-    }
-    return pVal;
-}
 
-void PrintDialog::updateWindowFromProperty( const OUString& i_rProperty )
-{
-    beans::PropertyValue* pValue = maPController->getValue( i_rProperty );
-    auto it = maPropertyToWindowMap.find( i_rProperty );
-    if( pValue && it != maPropertyToWindowMap.end() )
-    {
-        const std::vector< VclPtr<vcl::Window> >& rWindows( it->second );
-        if( ! rWindows.empty() )
+        if ( rBox.GetSelectedEntryPos() != 0)
         {
-            bool bVal = false;
-            sal_Int32 nVal = -1;
-            if( pValue->Value >>= bVal )
-            {
-                // we should have a CheckBox for this one
-                CheckBox* pBox = dynamic_cast< CheckBox* >( rWindows.front().get() );
-                if( pBox )
-                {
-                    pBox->Check( bVal );
-                }
-                else if ( i_rProperty == "PrintProspect" )
-                {
-                    // EVIL special case
-                    if( bVal )
-                        maNUpPage.mpBrochureBtn->Check();
-                    else
-                        maNUpPage.mpPagesBtn->Check();
-                }
-                else
-                {
-                    SAL_WARN( "vcl", "missing a checkbox" );
-                }
-            }
-            else if( pValue->Value >>= nVal )
-            {
-                // this could be a ListBox or a RadioButtonGroup
-                ListBox* pList = dynamic_cast< ListBox* >( rWindows.front().get() );
-                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].get() );
-                    SAL_WARN_IF( !pBtn, "vcl", "unexpected control for property" );
-                    if( pBtn )
-                        pBtn->Check();
-                }
-            }
+            OUString aNewPrinter( rBox.GetSelectedEntry() );
+            // set new printer
+            maPController->setPrinter( VclPtrInstance<Printer>( aNewPrinter ) );
+            maPController->resetPrinterOptions( false  );
+            // update text fields
+            mpOKButton->SetText( maPrintText );
+            updatePrinterText();
+            preparePreview();
+        }
+        else // print to file
+        {
+            // use the default printer or FIXME: the last used one?
+            maPController->setPrinter( VclPtrInstance<Printer>( Printer::GetDefaultPrinterName() ) );
+            mpOKButton->SetText( maPrintToFileText );
+            maPController->resetPrinterOptions( true );
+            preparePreview( true, true );
         }
     }
-}
-
-void PrintDialog::makeEnabled( vcl::Window* i_pWindow )
-{
-    auto it = maControlToPropertyMap.find( i_pWindow );
-    if( it != maControlToPropertyMap.end() )
+    else if( &rBox == mpNupOrientationBox || &rBox == mpNupOrderBox )
     {
-        OUString aDependency( maPController->makeEnabled( it->second ) );
-        if( !aDependency.isEmpty() )
-            updateWindowFromProperty( aDependency );
+       updateNup();
     }
-}
-
-IMPL_LINK( PrintDialog, UIOption_CheckHdl, CheckBox&, i_rBox, void )
-{
-    PropertyValue* pVal = getValueForWindow( &i_rBox );
-    if( pVal )
+    else if( &rBox == mpNupPagesBox )
     {
-        makeEnabled( &i_rBox );
-
-        bool bVal = i_rBox.IsChecked();
-        pVal->Value <<= bVal;
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
-    }
-}
-
-IMPL_LINK( PrintDialog, UIOption_RadioHdl, RadioButton&, i_rBtn, void )
-{
-    // this handler gets called for all radiobuttons that get unchecked, too
-    // however we only want one notification for the new value (that is for
-    // the button that gets checked)
-    if( i_rBtn.IsChecked() )
-    {
-        PropertyValue* pVal = getValueForWindow( &i_rBtn );
-        auto it = maControlToNumValMap.find( &i_rBtn );
-        if( pVal && it != maControlToNumValMap.end() )
-        {
-            makeEnabled( &i_rBtn );
-
-            sal_Int32 nVal = it->second;
-            pVal->Value <<= nVal;
-
-            // tdf#63905 use paper size set in printer properties
-            if (pVal->Name == "PageOptions")
-                maPController->resetPaperToLastConfigured();
-
-            checkOptionalControlDependencies();
-
-            // update preview and page settings
-            preparePreview();
-        }
+        if( !mpPagesBtn->IsChecked() )
+            mpPagesBtn->Check();
+        updateNupFromPages();
     }
 }
 
-IMPL_LINK( PrintDialog, UIOption_SelectHdl, ListBox&, i_rBox, void )
+IMPL_LINK( PrintDialog, ModifyHdl, Edit&, rEdit, void )
 {
-    PropertyValue* pVal = getValueForWindow( &i_rBox );
-    if( pVal )
+    checkControlDependencies();
+    if( &rEdit == mpNupRowsEdt || &rEdit == mpNupColEdt ||
+       &rEdit == mpSheetMarginEdt || &rEdit == mpPageMarginEdt
+      )
     {
-        makeEnabled( &i_rBox );
-
-        sal_Int32 nVal( i_rBox.GetSelectedEntryPos() );
-        pVal->Value <<= nVal;
-
-        //If we are in impress we start in print slides mode and get a
-        //maFirstPageSize for slides which are usually landscape mode, if we
-        //change to notes which are usually in portrait mode, and then visit
-        //n-up print, we will assume notes are in landscape unless we throw
-        //away maFirstPageSize when we change page content type
-        if (pVal->Name == "PageContentType")
-            maFirstPageSize = Size();
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
+       updateNupFromPages();
     }
-}
-
-IMPL_LINK( PrintDialog, UIOption_ModifyHdl, Edit&, i_rBox, void )
-{
-    PropertyValue* pVal = getValueForWindow( &i_rBox );
-    if( pVal )
+    else if( &rEdit == mpPageEdit )
     {
-        makeEnabled( &i_rBox );
-
-        NumericField* pNum = dynamic_cast<NumericField*>(&i_rBox);
-        MetricField* pMetric = dynamic_cast<MetricField*>(&i_rBox);
-        if( pNum )
-        {
-            sal_Int64 nVal = pNum->GetValue();
-            pVal->Value <<= nVal;
-        }
-        else if( pMetric )
-        {
-            sal_Int64 nVal = pMetric->GetValue();
-            pVal->Value <<= nVal;
-        }
-        else
-        {
-            OUString aVal( i_rBox.GetText() );
-            pVal->Value <<= aVal;
-        }
-
-        checkOptionalControlDependencies();
-
-        // update preview and page settings
-        preparePreview();
+        mnCurPage = sal_Int32( mpPageEdit->GetValue() - 1 );
+        preparePreview( true, true );
     }
-}
-
-void PrintDialog::Command( const CommandEvent& rEvt )
-{
-    if( rEvt.GetCommand() == CommandEventId::Wheel )
+    else if( &rEdit == mpCopyCountField )
     {
-        const CommandWheelData* pWheelData = rEvt.GetWheelData();
-        if( pWheelData->GetDelta() > 0 )
-            previewForward();
-        else if( pWheelData->GetDelta() < 0 )
-            previewBackward();
+        maPController->setValue( "CopyCount",
+                               makeAny( sal_Int32(mpCopyCountField->GetValue()) ) );
+        maPController->setValue( "Collate",
+                               makeAny( isCollate() ) );
     }
 }
 
-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 );
-
-    Dialog::Resize();
-}
-
 void PrintDialog::previewForward()
 {
     mpPageEdit->Up();
@@ -2003,6 +1190,7 @@ void PrintDialog::previewBackward()
     mpPageEdit->Down();
 }
 
+
 // PrintProgressDialog
 
 PrintProgressDialog::PrintProgressDialog(vcl::Window* i_pParent, int i_nMax)
@@ -2022,8 +1210,8 @@ PrintProgressDialog::PrintProgressDialog(vcl::Window* i_pParent, int i_nMax)
 
     //just multiply largest value by 10 and take the width of that string as
     //the max size we will want
-    OUString aNewText( searchAndReplace( maStr, "%p", 2, OUString::number( mnMax * 10 ) ) );
-    aNewText = searchAndReplace( aNewText, "%n", 2, OUString::number( mnMax * 10 ) );
+    OUString aNewText( maStr.replaceFirst( "%p", OUString::number( mnMax * 10 ) ) );
+    aNewText = aNewText.replaceFirst( "%n", OUString::number( mnMax * 10 ) );
     mpText->SetText( aNewText );
     mpText->set_width_request(mpText->get_preferred_size().Width());
 
@@ -2062,8 +1250,8 @@ void PrintProgressDialog::setProgress( int i_nCurrent )
 
     mpProgress->SetValue(mnCur*100/mnMax);
 
-    OUString aNewText( searchAndReplace( maStr, "%p", 2, OUString::number( mnCur ) ) );
-    aNewText = searchAndReplace( aNewText, "%n", 2, OUString::number( mnMax ) );
+    OUString aNewText( maStr.replaceFirst( "%p", OUString::number( mnCur ) ) );
+    aNewText = aNewText.replaceFirst( "%n", OUString::number( mnMax ) );
     mpText->SetText( aNewText );
 }
 
@@ -2078,5 +1266,3 @@ void PrintProgressDialog::reset()
     mbCanceled = false;
     setProgress( 0 );
 }
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/uiconfig/ui/printdialog.ui b/vcl/uiconfig/ui/printdialog.ui
index 47790fbcff83..7ffbf497a23c 100644
--- a/vcl/uiconfig/ui/printdialog.ui
+++ b/vcl/uiconfig/ui/printdialog.ui
@@ -4,24 +4,19 @@
   <requires lib="gtk+" version="3.18"/>
   <requires lib="LibreOffice" version="1.0"/>
   <object class="GtkAdjustment" id="adjustment1">
-    <property name="lower">1</property>
-    <property name="upper">16384</property>
-    <property name="value">1</property>
+    <property name="lower">10</property>
+    <property name="upper">200</property>
+    <property name="value">100</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
   <object class="GtkAdjustment" id="adjustment2">
     <property name="lower">1</property>
-    <property name="upper">32</property>
+    <property name="upper">16384</property>
     <property name="value">1</property>
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
-  <object class="GtkAdjustment" id="adjustment3">
-    <property name="upper">100</property>
-    <property name="step_increment">1</property>
-    <property name="page_increment">10</property>
-  </object>
   <object class="GtkImage" id="image1">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
@@ -34,259 +29,313 @@
     <property name="stock">gtk-media-next</property>
     <property name="icon_size">1</property>
   </object>
-  <object class="GtkListStore" id="liststore1">
-    <columns>
-      <!-- column-name gchararray1 -->
-      <column type="gchararray"/>
-      <!-- column-name gint1 -->
-      <column type="gint"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">1</col>
-        <col id="1">1</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">2</col>
-        <col id="1">2</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">4</col>
-        <col id="1">4</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">6</col>
-        <col id="1">6</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">9</col>
-        <col id="1">9</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">16</col>
-        <col id="1">16</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore1">Custom</col>
-        <col id="1">65535</col>
-      </row>
-    </data>
-  </object>
-  <object class="GtkListStore" id="liststore2">
-    <columns>
-      <!-- column-name gchararray1 -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore2">left to right, then down</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore2">top to bottom, then right</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore2">top to bottom, then left</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore2">right to left, then down</col>
-      </row>
-    </data>
-  </object>
-  <object class="GtkListStore" id="liststore3">
-    <columns>
-      <!-- column-name gchararray1 -->
-      <column type="gchararray"/>
-    </columns>
-    <data>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore3">Automatic</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore3">Portrait</col>
-      </row>
-      <row>
-        <col id="0" translatable="yes" context="printdialog|liststore3">Landscape</col>
-      </row>
-    </data>
-  </object>
   <object class="GtkDialog" id="PrintDialog">
     <property name="can_focus">False</property>
-    <property name="border_width">6</property>
-    <property name="title" translatable="yes" context="printdialog|PrintDialog">Print</property>
     <property name="type_hint">dialog</property>
     <child internal-child="vbox">
-      <object class="GtkBox" id="dialog-vbox1">
+      <object class="GtkBox" id="PrintDialogBox">
         <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
-        <property name="spacing">12</property>
+        <property name="spacing">2</property>
         <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
+          <object class="GtkButtonBox" id="internalarea">
             <property name="can_focus">False</property>
             <property name="layout_style">end</property>
             <child>
-              <object class="GtkButton" id="ok">
-                <property name="label">gtk-ok</property>
+              <object class="GtkButton" id="help">
+                <property name="label">gtk-help</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
-                <property name="has_default">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
-                <property name="expand">False</property>
+                <property name="expand">True</property>
                 <property name="fill">True</property>
                 <property name="position">0</property>
-                <property name="non_homogeneous">True</property>
+                <property name="secondary">True</property>
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="cancel">
-                <property name="label">gtk-cancel</property>
+              <object class="GtkButton" id="moreoptions">
+                <property name="label" translatable="yes" context="printdialog|moreoptions">More Options...</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
-                <property name="use_stock">True</property>
+                <property name="margin_left">50</property>
+                <property name="margin_right">50</property>
               </object>
               <packing>
-                <property name="expand">False</property>
+                <property name="expand">True</property>
                 <property name="fill">True</property>
                 <property name="position">1</property>
-                <property name="non_homogeneous">True</property>
               </packing>
             </child>
             <child>
-              <object class="GtkButton" id="help">
-                <property name="label">gtk-help</property>
+              <object class="GtkButton" id="ok">
+                <property name="label">gtk-ok</property>
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="receives_default">True</property>
                 <property name="use_stock">True</property>
               </object>
               <packing>
-                <property name="expand">False</property>
+                <property name="expand">True</property>
                 <property name="fill">True</property>
                 <property name="position">2</property>
-                <property name="secondary">True</property>
-                <property name="non_homogeneous">True</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="cancel">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+              </object>
+              <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
               </packing>
             </child>
           </object>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
+            <property name="fill">False</property>
+            <property name="position">1</property>
           </packing>
         </child>
         <child>
-          <object class="GtkBox" id="box1">
+          <object class="GtkBox" id="box0">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
-            <property name="spacing">6</property>
+            <property name="margin_left">5</property>
+            <property name="margin_right">5</property>
+            <property name="margin_top">5</property>
+            <property name="margin_bottom">5</property>
             <child>
-              <object class="GtkBox" id="box2">
+              <object class="GtkBox" id="box1">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
-                <property name="hexpand">True</property>
-                <property name="vexpand">True</property>
-                <property name="orientation">vertical</property>
-                <property name="spacing">6</property>
-                <child>
-                  <object class="vcllo-PrintPreviewWindow" id="preview">
-                    <property name="width_request">235</property>
-                    <property name="height_request">331</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
                 <child>
-                  <object class="GtkBox" id="box8">
+                  <object class="GtkBox" id="box2">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="margin_left">30</property>
-                    <property name="margin_right">30</property>
+                    <property name="can_focus">True</property>
+                    <property name="orientation">vertical</property>
                     <property name="spacing">6</property>
                     <child>
-                      <object class="GtkSpinButton" id="pageedit-nospin">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="xalign">1</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkLabel" id="totalnumpages">
+                      <object class="GtkBox">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="label" translatable="yes" context="printdialog|totalnumpages">/ %n</property>
+                        <property name="orientation">vertical</property>
+                        <child>
+                          <object class="vcllo-PrintPreviewWindow" id="preview">
+                            <property name="width_request">427</property>
+                            <property name="height_request">600</property>
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                            <property name="fill">True</property>
+                            <property name="position">0</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
-                        <property name="position">1</property>
+                        <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="forward">
+                      <object class="GtkCheckButton" id="previewbox">
+                        <property name="label" translatable="yes" context="printdialog|previewbox">Preview</property>
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="image">image2</property>
+                        <property name="receives_default">False</property>
+                        <property name="halign">center</property>
+                        <property name="active">True</property>
+                        <property name="draw_indicator">True</property>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
                         <property name="pack_type">end</property>
-                        <property name="position">2</property>
+                        <property name="position">1</property>
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkButton" id="backward">
+                      <object class="GtkBox" id="box3">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="image">image1</property>
+                        <property name="can_focus">False</property>
+                        <property name="spacing">25</property>
+                        <child>

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list