Related: fdo#61186 add a toggle to override the paper format

We now need a mechanism to instruct the print dialog that we want to force
printing to use the printer settings configured paper. Particularly
useful for nup printing and brochures

scenario 3: forcing printing to use the printer settings paper

a file->printer settings->properties->paper
  set a paper size, ideally something not used in the test doc, e.g. Executive
b file->print->page layout and set pages per sheet to 4
  the auto selection for paper will be the first paper size in use, i.e.
  legal
c flip to options and toggle "use only paper size from printer preferences"
  preview should reconfigure as "Executive"

Change-Id: Ie224c252c2cb6c9ee21be5c54e470bca1c7eb0bb
diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx
index f40801e..40997dd253 100644
--- a/include/vcl/print.hxx
+++ b/include/vcl/print.hxx
@@ -521,6 +521,8 @@ public:
    VCL_PLUGIN_PUBLIC void setLastPage( sal_Bool i_bLastPage );
    SAL_DLLPRIVATE void setReversePrint( sal_Bool i_bReverse );
    SAL_DLLPRIVATE bool getReversePrint() const;
    SAL_DLLPRIVATE void setPapersizeFromSetup( sal_Bool i_bPapersizeFromSetup );
    SAL_DLLPRIVATE bool getPapersizeFromSetup() const;
    SAL_DLLPRIVATE void pushPropertiesToPrinter();
    SAL_DLLPRIVATE void resetPaperToLastConfigured();
    VCL_PLUGIN_PUBLIC void setJobState( com::sun::star::view::PrintableState );
diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx
index 30e5fe8..f879a63 100644
--- a/vcl/inc/printdlg.hxx
+++ b/vcl/inc/printdlg.hxx
@@ -175,6 +175,7 @@ namespace vcl
        public:
            CheckBox*                           mpToFileBox;
            CheckBox*                           mpCollateSingleJobsBox;
            CheckBox*                           mpPapersizeFromSetup;

            OutputOptPage( VclBuilder* );

diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx
index cea6bc3..7ea71cc 100644
--- a/vcl/source/gdi/print3.cxx
+++ b/vcl/source/gdi/print3.cxx
@@ -151,6 +151,7 @@ public:
    sal_Bool                                                    mbFirstPage;
    sal_Bool                                                    mbLastPage;
    sal_Bool                                                    mbReversePageOrder;
    sal_Bool                                                    mbPapersizeFromSetup;
    view::PrintableState                                        meJobState;

    vcl::PrinterController::MultiPageSetup                      maMultiPage;
@@ -161,9 +162,6 @@ public:

    // set by user through printer properties subdialog of printer settings dialog
    Size                                                        maDefaultPageSize;
    // Set by user through printer properties subdialog of print dialog.
    // if set, pages are centered and trimmed onto the fixed page
    Size                                                        maFixedPageSize;
    // set by user through printer properties subdialog of printer settings dialog
    sal_Int32                                                   mnDefaultPaperBin;
    // Set by user through printer properties subdialog of print dialog.
@@ -187,6 +185,7 @@ public:
        mbFirstPage( sal_True ),
        mbLastPage( sal_False ),
        mbReversePageOrder( sal_False ),
        mbPapersizeFromSetup( sal_False ),
        meJobState( view::PrintableState_JOB_STARTED ),
        mpProgress( NULL ),
        mnDefaultPaperBin( -1 ),
@@ -196,14 +195,14 @@ public:

    Size getRealPaperSize( const Size& i_rPageSize, bool bNoNUP ) const
    {
        if( maFixedPageSize.Width() > 0 && maFixedPageSize.Height() > 0 )
            return maFixedPageSize;
        if( mbPapersizeFromSetup )
            return maDefaultPageSize;
        if( maMultiPage.nRows * maMultiPage.nColumns > 1 && ! bNoNUP )
            return maMultiPage.aPaperSize;
        return i_rPageSize;
    }
    bool isFixedPageSize() const
    { return maFixedPageSize.Width() != 0 && maFixedPageSize.Height() != 0; }
    { return mbPapersizeFromSetup; }
    PrinterController::PageSize modifyJobSetup( const Sequence< PropertyValue >& i_rProps, bool bNoNUP );
    void resetPaperToLastConfigured();
};
@@ -407,6 +406,14 @@ void Printer::ImplPrintJob( const boost::shared_ptr<PrinterController>& i_pContr
        pController->setReversePrint( bReverse );
    }

    beans::PropertyValue* pPapersizeFromSetupVal = i_pController->getValue( OUString( "PapersizeFromSetup" ) );
    if( pPapersizeFromSetupVal )
    {
        sal_Bool bPapersizeFromSetup = sal_False;
        pPapersizeFromSetupVal->Value >>= bPapersizeFromSetup;
        pController->setPapersizeFromSetup( bPapersizeFromSetup );
    }

    // setup NUp printing from properties
    sal_Int32 nRows = i_pController->getIntProperty( OUString( "NUpRows" ), 1 );
    sal_Int32 nCols = i_pController->getIntProperty( OUString( "NUpColumns" ), 1 );
@@ -766,7 +773,6 @@ void PrinterController::setPrinter( const boost::shared_ptr<Printer>& i_rPrinter
    mpImplData->maDefaultPageSize = mpImplData->mpPrinter->GetPaperSize();
    mpImplData->mpPrinter->Pop();
    mpImplData->mnFixedPaperBin = -1;
    mpImplData->maFixedPageSize = Size();
}

void PrinterController::resetPrinterOptions( bool i_bFileOutput )
@@ -797,19 +803,25 @@ bool PrinterController::setupPrinter( Window* i_pParent )
        Size aNewPaperSize(mpImplData->mpPrinter->GetPaperSize());
        if (bRet)
        {
            // was papersize or bin overridden ? if so we need to take action
            if( aNewPaperSize != aPaperSize )
            bool bInvalidateCache = false;

            // was papersize overridden ? if so we need to take action if we're
            // configured to use the driver papersize
            if (aNewPaperSize != mpImplData->maDefaultPageSize)
            {
                mpImplData->maFixedPageSize = aNewPaperSize;
                mpImplData->maDefaultPageSize = aNewPaperSize;
                bInvalidateCache = getPapersizeFromSetup();
            }

            // was bin overridden ? if so we need to take action
            sal_uInt16 nNewPaperBin = mpImplData->mpPrinter->GetPaperBin();
            if( nNewPaperBin != nPaperBin )
            if (nNewPaperBin != nPaperBin)
            {
                mpImplData->mnFixedPaperBin = nNewPaperBin;
                bInvalidateCache = true;
            }

            if( aNewPaperSize != aPaperSize || nNewPaperBin != nPaperBin )
            if (bInvalidateCache)
            {
                mpImplData->maPageCache.invalidate();
            }
@@ -897,14 +909,11 @@ PrinterController::PageSize vcl::ImplPrinterControllerData::modifyJobSetup( cons
//print dialog
void vcl::ImplPrinterControllerData::resetPaperToLastConfigured()
{
    Size aPaperSize(maDefaultPageSize);
    if (maFixedPageSize.Width() > 0 && maFixedPageSize.Height() > 0)
        aPaperSize = maFixedPageSize;
    mpPrinter->Push();
    mpPrinter->SetMapMode(MapMode(MAP_100TH_MM));
    Size aCurSize(mpPrinter->GetPaperSize());
    if (aPaperSize != aCurSize)
        mpPrinter->SetPaperSizeUser(aPaperSize, !isFixedPageSize());
    if (aCurSize != maDefaultPageSize)
        mpPrinter->SetPaperSizeUser(maDefaultPageSize, !isFixedPageSize());
    mpPrinter->Pop();
}

@@ -1331,6 +1340,16 @@ bool PrinterController::getReversePrint() const
    return mpImplData->mbReversePageOrder;
}

void PrinterController::setPapersizeFromSetup( sal_Bool i_bPapersizeFromSetup )
{
    mpImplData->mbPapersizeFromSetup = i_bPapersizeFromSetup;
}

bool PrinterController::getPapersizeFromSetup() const
{
    return mpImplData->mbPapersizeFromSetup;
}

Sequence< PropertyValue > PrinterController::getJobProperties( const Sequence< PropertyValue >& i_rMergeList ) const
{
    boost::unordered_set< OUString, OUStringHash > aMergeSet;
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
index 97804a9..f11044c 100644
--- a/vcl/source/window/printdlg.cxx
+++ b/vcl/source/window/printdlg.cxx
@@ -534,6 +534,7 @@ PrintDialog::OutputOptPage::OutputOptPage( VclBuilder *pUIBuilder )
{
    pUIBuilder->get(mpToFileBox, "printtofile");
    pUIBuilder->get(mpCollateSingleJobsBox, "singleprintjob");
    pUIBuilder->get(mpPapersizeFromSetup, "papersizefromsetup");
}

void PrintDialog::OutputOptPage::readFromSettings()
@@ -671,6 +672,7 @@ PrintDialog::PrintDialog( Window* i_pParent, const boost::shared_ptr<PrinterCont
    maJobPage.mpSetupButton->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
    maNUpPage.mpBorderCB->SetClickHdl( LINK( this, PrintDialog, ClickHdl ) );
    maOptionsPage.mpToFileBox->SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
    maOptionsPage.mpPapersizeFromSetup->SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
    maJobPage.mpReverseOrderBox->SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
    maOptionsPage.mpCollateSingleJobsBox->SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
    maNUpPage.mpPagesBtn->SetToggleHdl( LINK( this, PrintDialog, ClickHdl ) );
@@ -723,7 +725,7 @@ void PrintDialog::readFromSettings()
    maNUpPage.readFromSettings();
    maOptionsPage.readFromSettings();

    // read last selected tab page; if it exists, actiavte it
    // read last selected tab page; if it exists, activate it
    SettingsConfigItem* pItem = SettingsConfigItem::get();
    OUString aValue = pItem->getValue( OUString( "PrintDialog"  ),
                                            OUString( "LastPage"  ) );
@@ -1534,6 +1536,14 @@ IMPL_LINK( PrintDialog, ClickHdl, Button*, pButton )
        maPController->resetPrinterOptions( maOptionsPage.mpToFileBox->IsChecked() );
        preparePreview( true, true );
    }
    else if( pButton == maOptionsPage.mpPapersizeFromSetup )
    {
        sal_Bool bChecked = maOptionsPage.mpPapersizeFromSetup->IsChecked();
        maPController->setPapersizeFromSetup( bChecked );
        maPController->setValue( OUString( "PapersizeFromSetup"  ),
                                 makeAny( bChecked ) );
        preparePreview( true, true );
    }
    else if( pButton == maNUpPage.mpBrochureBtn )
    {
        PropertyValue* pVal = getValueForWindow( pButton );
diff --git a/vcl/uiconfig/ui/printdialog.ui b/vcl/uiconfig/ui/printdialog.ui
index a0d9453..2aa464b 100644
--- a/vcl/uiconfig/ui/printdialog.ui
+++ b/vcl/uiconfig/ui/printdialog.ui
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <!-- interface-requires gtk+ 3.0 -->
  <!-- interface-requires LibreOffice 1.0 -->
  <object class="GtkAdjustment" id="adjustment1">
    <property name="lower">1</property>
    <property name="upper">16384</property>
@@ -1128,8 +1129,6 @@
                                  <object class="vcllo-ShowNupOrderWindow" id="orderpreview">
                                    <property name="visible">True</property>
                                    <property name="can_focus">False</property>
                                    <property name="hexpand">False</property>
                                    <property name="vexpand">False</property>
                                    <property name="halign">center</property>
                                    <property name="valign">start</property>
                                  </object>
@@ -1464,6 +1463,23 @@
                                <property name="height">1</property>
                              </packing>
                            </child>
                            <child>
                              <object class="GtkCheckButton" id="papersizefromsetup">
                                <property name="label" translatable="yes">Use only paper size from printer preferences</property>
                                <property name="visible">True</property>
                                <property name="can_focus">True</property>
                                <property name="receives_default">False</property>
                                <property name="no_show_all">True</property>
                                <property name="xalign">0</property>
                                <property name="draw_indicator">True</property>
                              </object>
                              <packing>
                                <property name="left_attach">0</property>
                                <property name="top_attach">3</property>
                                <property name="width">1</property>
                                <property name="height">1</property>
                              </packing>
                            </child>
                          </object>
                        </child>
                      </object>