diff options
-rw-r--r-- | include/sfx2/viewsh.hxx | 5 | ||||
-rw-r--r-- | include/vcl/print.hxx | 9 | ||||
-rw-r--r-- | sfx2/source/view/viewprn.cxx | 15 | ||||
-rw-r--r-- | sw/source/uibase/dbui/dbmgr.cxx | 40 | ||||
-rw-r--r-- | sw/source/uibase/uno/unomailmerge.cxx | 2 | ||||
-rw-r--r-- | vcl/source/gdi/print3.cxx | 73 |
6 files changed, 108 insertions, 36 deletions
diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index 31e2d6884a13..42cea7201da8 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -35,6 +35,7 @@ #include <tools/gen.hxx> #include <tools/errcode.hxx> #include <vcl/jobset.hxx> +#include <boost/shared_ptr.hpp> class SfxBaseController; class Size; @@ -59,6 +60,7 @@ class Dialog; class Menu; class NotifyEvent; class SfxInPlaceClient; +namespace vcl { class PrinterController; } #define SFX_PRINTER_PRINTER 1 // without JOB SETUP => Temporary #define SFX_PRINTER_JOBSETUP 2 @@ -266,6 +268,9 @@ public: bool TryContextMenuInterception( Menu& rIn, const OUString& rMenuIdentifier, Menu*& rpOut, ::com::sun::star::ui::ContextMenuExecuteEvent aEvent ); void ExecPrint( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >&, bool, bool ); + // Like ExecPrint(), but only sets up for printing. Use Printer::ExecutePrintJob() and Printer::FinishPrintJob() afterwards. + void StartPrint( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >&, bool, bool ); + std::shared_ptr< vcl::PrinterController > GetPrinterController() const; void AddRemoveClipboardListener( const com::sun::star::uno::Reference < com::sun::star::datatransfer::clipboard::XClipboardListener>&, bool ); ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::clipboard::XClipboardNotifier > GetClipboardNotifier(); diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx index b0dd3f07afd3..d74976981bd8 100644 --- a/include/vcl/print.hxx +++ b/include/vcl/print.hxx @@ -405,9 +405,16 @@ public: const Image&, sal_uInt16 ) SAL_OVERRIDE; + // These 3 together are more modular PrintJob(), allowing printing more documents as one print job + // by repeated calls to ExecutePrintJob(). Used by mailmerge. + static void PreparePrintJob( std::shared_ptr<vcl::PrinterController> i_pController, + const JobSetup& i_rInitSetup ); + static bool ExecutePrintJob( std::shared_ptr<vcl::PrinterController> i_pController ); + static void FinishPrintJob( std::shared_ptr<vcl::PrinterController> i_pController ); + // implementation detail of PrintJob being asynchronous // not exported, not usable outside vcl - static void SAL_DLLPRIVATE ImplPrintJob( const std::shared_ptr<vcl::PrinterController>& i_pController, + static void SAL_DLLPRIVATE ImplPrintJob( std::shared_ptr<vcl::PrinterController> i_pController, const JobSetup& i_rInitSetup ); }; diff --git a/sfx2/source/view/viewprn.cxx b/sfx2/source/view/viewprn.cxx index 0ed526d48670..21045325bc5f 100644 --- a/sfx2/source/view/viewprn.cxx +++ b/sfx2/source/view/viewprn.cxx @@ -567,8 +567,10 @@ SfxPrinter* SfxViewShell::SetPrinter_Impl( SfxPrinter *pNewPrinter ) return pDocPrinter; } -void SfxViewShell::ExecPrint( const uno::Sequence < beans::PropertyValue >& rProps, bool bIsAPI, bool bIsDirect ) +void SfxViewShell::StartPrint( const uno::Sequence < beans::PropertyValue >& rProps, bool bIsAPI, bool bIsDirect ) { + assert( pImp->m_xPrinterController.get() == NULL ); + // get the current selection; our controller should know it Reference< frame::XController > xController( GetController() ); Reference< view::XSelectionSupplier > xSupplier( xController, UNO_QUERY ); @@ -610,11 +612,20 @@ void SfxViewShell::ExecPrint( const uno::Sequence < beans::PropertyValue >& rPro SfxObjectShell *pObjShell = GetObjectShell(); xNewController->setValue( OUString( "JobName" ), makeAny( OUString( pObjShell->GetTitle(0) ) ) ); +} +void SfxViewShell::ExecPrint( const uno::Sequence < beans::PropertyValue >& rProps, bool bIsAPI, bool bIsDirect ) +{ + StartPrint( rProps, bIsAPI, bIsDirect ); // FIXME: job setup SfxPrinter* pDocPrt = GetPrinter(false); JobSetup aJobSetup = pDocPrt ? pDocPrt->GetJobSetup() : GetJobSetup(); - Printer::PrintJob( xNewController, aJobSetup ); + Printer::PrintJob( GetPrinterController(), aJobSetup ); +} + +std::shared_ptr< vcl::PrinterController > SfxViewShell::GetPrinterController() const +{ + return pImp->m_xPrinterController; } Printer* SfxViewShell::GetActivePrinter() const diff --git a/sw/source/uibase/dbui/dbmgr.cxx b/sw/source/uibase/dbui/dbmgr.cxx index d93e85cdde2e..af65b335fa8e 100644 --- a/sw/source/uibase/dbui/dbmgr.cxx +++ b/sw/source/uibase/dbui/dbmgr.cxx @@ -23,6 +23,7 @@ #include <unotxdoc.hxx> #include <com/sun/star/text/NotePrintMode.hpp> #include <sfx2/app.hxx> +#include <sfx2/printer.hxx> #include <com/sun/star/sdb/CommandType.hpp> #include <com/sun/star/sdb/XDocumentDataSource.hpp> #include <com/sun/star/frame/XComponentLoader.hpp> @@ -1159,6 +1160,41 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, lcl_CopyFollowPageDesc( *pTargetShell, *pWorkPageDesc, *pTargetPageDesc, nDocNo ); } } + else if( rMergeDescriptor.nMergeType == DBMGR_MERGE_PRINTER ) + { + if( 1 == nDocNo ) // set up printing only once at the beginning + { + // printing should be done synchronously otherwise the document + // might already become invalid during the process + uno::Sequence< beans::PropertyValue > aOptions( rMergeDescriptor.aPrintOptions ); + + aOptions.realloc( 2 ); + aOptions[ 0 ].Name = "Wait"; + aOptions[ 0 ].Value <<= sal_True; + aOptions[ 1 ].Name = "MonitorVisible"; + aOptions[ 1 ].Value <<= sal_False; + // move print options + const beans::PropertyValue* pPrintOptions = rMergeDescriptor.aPrintOptions.getConstArray(); + for( sal_Int32 nOption = 0, nIndex = 1 ; nOption < rMergeDescriptor.aPrintOptions.getLength(); ++nOption) + { + if( pPrintOptions[nOption].Name == "CopyCount" || pPrintOptions[nOption].Name == "FileName" + || pPrintOptions[nOption].Name == "Collate" || pPrintOptions[nOption].Name == "Pages" + || pPrintOptions[nOption].Name == "Wait" || pPrintOptions[nOption].Name == "PrinterName" ) + { + // add an option + aOptions.realloc( nIndex + 1 ); + aOptions[ nIndex ].Name = pPrintOptions[nOption].Name; + aOptions[ nIndex++ ].Value = pPrintOptions[nOption].Value ; + } + } + pWorkView->StartPrint( aOptions, IsMergeSilent(), rMergeDescriptor.bPrintAsync ); + SfxPrinter* pDocPrt = pWorkView->GetPrinter(false); + JobSetup aJobSetup = pDocPrt ? pDocPrt->GetJobSetup() : pWorkView->GetJobSetup(); + Printer::PreparePrintJob( pWorkView->GetPrinterController(), aJobSetup ); + } + if( !Printer::ExecutePrintJob( pWorkView->GetPrinterController())) + bCancel = true; + } else pTargetPageDesc = pTargetShell->FindPageDescByName( sModifiedStartingPageDesc ); @@ -1313,6 +1349,8 @@ bool SwDBManager::MergeMailFiles(SwWrtShell* pSourceShell, if( !rMergeDescriptor.bCreateSingleFile ) { + if( rMergeDescriptor.nMergeType == DBMGR_MERGE_PRINTER ) + Printer::FinishPrintJob( pWorkView->GetPrinterController()); pWorkDoc->SetDBManager( pOldDBManager ); xWorkDocSh->DoClose(); } @@ -2665,7 +2703,7 @@ void SwDBManager::ExecuteFormLetter( SwWrtShell& rSh, SwMergeDescriptor aMergeDesc( pImpl->pMergeDialog->GetMergeType(), pView->GetWrtShell(), aDescriptor ); aMergeDesc.sSaveToFilter = pImpl->pMergeDialog->GetSaveFilter(); - aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc(); + aMergeDesc.bCreateSingleFile = pImpl->pMergeDialog->IsSaveSingleDoc() && pImpl->pMergeDialog->GetMergeType() != DBMGR_MERGE_PRINTER; aMergeDesc.bSubjectIsFilename = aMergeDesc.bCreateSingleFile; if( !aMergeDesc.bCreateSingleFile && pImpl->pMergeDialog->IsGenerateFromDataBase() ) { diff --git a/sw/source/uibase/uno/unomailmerge.cxx b/sw/source/uibase/uno/unomailmerge.cxx index 30adba6fc0f5..216a6c6f7c12 100644 --- a/sw/source/uibase/uno/unomailmerge.cxx +++ b/sw/source/uibase/uno/unomailmerge.cxx @@ -691,7 +691,7 @@ uno::Any SAL_CALL SwXMailMerge::execute( // when mail merge is called as command line macro aMergeDesc.bPrintAsync = false; aMergeDesc.aPrintOptions = aPrintSettings; - aMergeDesc.bCreateSingleFile = true; + aMergeDesc.bCreateSingleFile = false; } break; case MailMergeType::SHELL: diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx index bfabad1374d5..3bd9f05a359b 100644 --- a/vcl/source/gdi/print3.cxx +++ b/vcl/source/gdi/print3.cxx @@ -297,11 +297,9 @@ void Printer::PrintJob(const std::shared_ptr<PrinterController>& i_xController, } } -void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xController, +void Printer::PreparePrintJob(std::shared_ptr<PrinterController> xController, const JobSetup& i_rInitSetup) { - std::shared_ptr<PrinterController> xController(i_xController); - // check if there is a default printer; if not, show an error box (if appropriate) if( GetDefaultPrinterName().isEmpty() ) { @@ -328,7 +326,7 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll } // reset last page property - i_xController->setLastPage(false); + xController->setLastPage(false); // update "PageRange" property inferring from other properties: // case 1: "Pages" set from UNO API -> @@ -340,12 +338,12 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll // "Pages" attribute from API is now equivalent to "PageRange" // AND "PrintContent" = 1 except calc where it is "PrintRange" = 1 // Argh ! That sure needs cleaning up - PropertyValue* pContentVal = i_xController->getValue(OUString("PrintRange")); + PropertyValue* pContentVal = xController->getValue(OUString("PrintRange")); if( ! pContentVal ) - pContentVal = i_xController->getValue(OUString("PrintContent")); + pContentVal = xController->getValue(OUString("PrintContent")); // case 1: UNO API has set "Pages" - PropertyValue* pPagesVal = i_xController->getValue(OUString("Pages")); + PropertyValue* pPagesVal = xController->getValue(OUString("Pages")); if( pPagesVal ) { OUString aPagesVal; @@ -358,7 +356,7 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll if( pContentVal ) { pContentVal->Value = makeAny( sal_Int32( 1 ) ); - i_xController->setValue(OUString("PageRange"), pPagesVal->Value); + xController->setValue(OUString("PageRange"), pPagesVal->Value); } } } @@ -371,13 +369,13 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll if( nContent == 0 ) { // do not overwrite PageRange if it is already set - PropertyValue* pRangeVal = i_xController->getValue(OUString("PageRange")); + PropertyValue* pRangeVal = xController->getValue(OUString("PageRange")); OUString aRange; if( pRangeVal ) pRangeVal->Value >>= aRange; if( aRange.isEmpty() ) { - sal_Int32 nPages = i_xController->getPageCount(); + sal_Int32 nPages = xController->getPageCount(); if( nPages > 0 ) { OUStringBuffer aBuf( 32 ); @@ -387,14 +385,14 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll aBuf.appendAscii( "-" ); aBuf.append( nPages ); } - i_xController->setValue(OUString("PageRange"), makeAny(aBuf.makeStringAndClear())); + xController->setValue(OUString("PageRange"), makeAny(aBuf.makeStringAndClear())); } } } } } - PropertyValue* pReverseVal = i_xController->getValue(OUString("PrintReverse")); + PropertyValue* pReverseVal = xController->getValue(OUString("PrintReverse")); if( pReverseVal ) { bool bReverse = false; @@ -402,7 +400,7 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll xController->setReversePrint( bReverse ); } - PropertyValue* pPapersizeFromSetupVal = i_xController->getValue(OUString("PapersizeFromSetup")); + PropertyValue* pPapersizeFromSetupVal = xController->getValue(OUString("PapersizeFromSetup")); if( pPapersizeFromSetupVal ) { bool bPapersizeFromSetup = false; @@ -411,35 +409,35 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll } // setup NUp printing from properties - sal_Int32 nRows = i_xController->getIntProperty(OUString("NUpRows"), 1); - sal_Int32 nCols = i_xController->getIntProperty(OUString("NUpColumns"), 1); + sal_Int32 nRows = xController->getIntProperty(OUString("NUpRows"), 1); + sal_Int32 nCols = xController->getIntProperty(OUString("NUpColumns"), 1); if( nRows > 1 || nCols > 1 ) { PrinterController::MultiPageSetup aMPS; aMPS.nRows = nRows > 1 ? nRows : 1; aMPS.nColumns = nCols > 1 ? nCols : 1; - sal_Int32 nValue = i_xController->getIntProperty(OUString("NUpPageMarginLeft"), aMPS.nLeftMargin); + sal_Int32 nValue = xController->getIntProperty(OUString("NUpPageMarginLeft"), aMPS.nLeftMargin); if( nValue >= 0 ) aMPS.nLeftMargin = nValue; - nValue = i_xController->getIntProperty(OUString("NUpPageMarginRight"), aMPS.nRightMargin); + nValue = xController->getIntProperty(OUString("NUpPageMarginRight"), aMPS.nRightMargin); if( nValue >= 0 ) aMPS.nRightMargin = nValue; - nValue = i_xController->getIntProperty( OUString( "NUpPageMarginTop" ), aMPS.nTopMargin ); + nValue = xController->getIntProperty( OUString( "NUpPageMarginTop" ), aMPS.nTopMargin ); if( nValue >= 0 ) aMPS.nTopMargin = nValue; - nValue = i_xController->getIntProperty( OUString( "NUpPageMarginBottom" ), aMPS.nBottomMargin ); + nValue = xController->getIntProperty( OUString( "NUpPageMarginBottom" ), aMPS.nBottomMargin ); if( nValue >= 0 ) aMPS.nBottomMargin = nValue; - nValue = i_xController->getIntProperty( OUString( "NUpHorizontalSpacing" ), aMPS.nHorizontalSpacing ); + nValue = xController->getIntProperty( OUString( "NUpHorizontalSpacing" ), aMPS.nHorizontalSpacing ); if( nValue >= 0 ) aMPS.nHorizontalSpacing = nValue; - nValue = i_xController->getIntProperty( OUString( "NUpVerticalSpacing" ), aMPS.nVerticalSpacing ); + nValue = xController->getIntProperty( OUString( "NUpVerticalSpacing" ), aMPS.nVerticalSpacing ); if( nValue >= 0 ) aMPS.nVerticalSpacing = nValue; - aMPS.bDrawBorder = i_xController->getBoolProperty( OUString( "NUpDrawBorder" ), aMPS.bDrawBorder ); - aMPS.nOrder = static_cast<PrinterController::NupOrderType>(i_xController->getIntProperty( OUString( "NUpSubPageOrder" ), aMPS.nOrder )); - aMPS.aPaperSize = i_xController->getPrinter()->PixelToLogic( i_xController->getPrinter()->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ); - PropertyValue* pPgSizeVal = i_xController->getValue( OUString( "NUpPaperSize" ) ); + aMPS.bDrawBorder = xController->getBoolProperty( OUString( "NUpDrawBorder" ), aMPS.bDrawBorder ); + aMPS.nOrder = static_cast<PrinterController::NupOrderType>(xController->getIntProperty( OUString( "NUpSubPageOrder" ), aMPS.nOrder )); + aMPS.aPaperSize = xController->getPrinter()->PixelToLogic( xController->getPrinter()->GetPaperSizePixel(), MapMode( MAP_100TH_MM ) ); + PropertyValue* pPgSizeVal = xController->getValue( OUString( "NUpPaperSize" ) ); awt::Size aSizeVal; if( pPgSizeVal && (pPgSizeVal->Value >>= aSizeVal) ) { @@ -447,7 +445,7 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll aMPS.aPaperSize.Height() = aSizeVal.Height; } - i_xController->setMultipage( aMPS ); + xController->setMultipage( aMPS ); } // in direct print case check whether there is anything to print. @@ -472,10 +470,10 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll { try { - PrintDialog aDlg( NULL, i_xController ); + PrintDialog aDlg( NULL, xController ); if( ! aDlg.Execute() ) { - i_xController->abortJob(); + xController->abortJob(); return; } if( aDlg.isPrintToFile() ) @@ -483,7 +481,7 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll OUString aFile = queryFile( xController->getPrinter().get() ); if( aFile.isEmpty() ) { - i_xController->abortJob(); + xController->abortJob(); return; } xController->setValue( OUString( "LocalFileName" ), @@ -501,19 +499,32 @@ void Printer::ImplPrintJob(const std::shared_ptr<PrinterController>& i_xControll } xController->pushPropertiesToPrinter(); +} +bool Printer::ExecutePrintJob(std::shared_ptr<PrinterController> xController) +{ OUString aJobName; PropertyValue* pJobNameVal = xController->getValue( OUString( "JobName" ) ); if( pJobNameVal ) pJobNameVal->Value >>= aJobName; - xController->getPrinter()->StartJob( aJobName, xController ); + return xController->getPrinter()->StartJob( aJobName, xController ); +} +void Printer::FinishPrintJob(std::shared_ptr<PrinterController> xController) +{ xController->resetPaperToLastConfigured(); - xController->jobFinished( xController->getJobState() ); } +void Printer::ImplPrintJob(std::shared_ptr<PrinterController> xController, + const JobSetup& i_rInitSetup) +{ + PreparePrintJob( xController, i_rInitSetup ); + ExecutePrintJob( xController ); + FinishPrintJob( xController ); +} + bool Printer::StartJob( const OUString& i_rJobName, std::shared_ptr<vcl::PrinterController>& i_xController) { mnError = PRINTER_OK; |