diff options
author | Ivan Timofeev <timofeev.i.s@gmail.com> | 2011-10-19 21:52:17 +0400 |
---|---|---|
committer | Ivan Timofeev <timofeev.i.s@gmail.com> | 2011-10-19 23:13:05 +0400 |
commit | 5ad4d151dac1eb887d92200330e31af269d8d1fd (patch) | |
tree | 2c961fca9047d72e916f10d95488ca2bd7b01d21 | |
parent | f9f4c631b100ace66999933dc06668ac107fb2bf (diff) |
migrate to StringRangeEnumerator in pdfexport
Notes
win32 working build
-rw-r--r-- | filter/source/pdf/pdfexport.cxx | 42 | ||||
-rw-r--r-- | filter/source/pdf/pdfexport.hxx | 8 | ||||
-rw-r--r-- | sw/inc/EnhancedPDFExportHelper.hxx | 6 | ||||
-rw-r--r-- | sw/source/core/text/EnhancedPDFExportHelper.cxx | 220 |
4 files changed, 196 insertions, 80 deletions
diff --git a/filter/source/pdf/pdfexport.cxx b/filter/source/pdf/pdfexport.cxx index 43d665dfd1f7..9e1d4efa3487 100644 --- a/filter/source/pdf/pdfexport.cxx +++ b/filter/source/pdf/pdfexport.cxx @@ -168,8 +168,12 @@ PDFExport::~PDFExport() // ----------------------------------------------------------------------------- -sal_Bool PDFExport::ExportSelection( vcl::PDFWriter& rPDFWriter, Reference< com::sun::star::view::XRenderable >& rRenderable, Any& rSelection, - MultiSelection aMultiSelection, Sequence< PropertyValue >& rRenderOptions, sal_Int32 nPageCount ) +sal_Bool PDFExport::ExportSelection( vcl::PDFWriter& rPDFWriter, + Reference< com::sun::star::view::XRenderable >& rRenderable, + const Any& rSelection, + const StringRangeEnumerator& rRangeEnum, + Sequence< PropertyValue >& rRenderOptions, + sal_Int32 nPageCount ) { sal_Bool bRet = sal_False; try @@ -192,11 +196,12 @@ sal_Bool PDFExport::ExportSelection( vcl::PDFWriter& rPDFWriter, Reference< com: vcl::PDFExtOutDevData* pPDFExtOutDevData = PTR_CAST( vcl::PDFExtOutDevData, pOut->GetExtOutDevData() ); if ( nPageCount ) { - sal_Int32 nSel = aMultiSelection.FirstSelected(); sal_Int32 nCurrentPage(0); - while ( nSel != sal_Int32(SFX_ENDOFSELECTION) ) + StringRangeEnumerator::Iterator aIter = rRangeEnum.begin(); + StringRangeEnumerator::Iterator aEnd = rRangeEnum.end(); + while ( aIter != aEnd ) { - Sequence< PropertyValue > aRenderer( rRenderable->getRenderer( nSel - 1, rSelection, rRenderOptions ) ); + Sequence< PropertyValue > aRenderer( rRenderable->getRenderer( *aIter, rSelection, rRenderOptions ) ); awt::Size aPageSize; for( sal_Int32 nProperty = 0, nPropertyCount = aRenderer.getLength(); nProperty < nPropertyCount; ++nProperty ) @@ -221,9 +226,9 @@ sal_Bool PDFExport::ExportSelection( vcl::PDFWriter& rPDFWriter, Reference< com: // #i35176# // IsLastPage property. - const sal_Int32 nCurrentRenderer = nSel - 1; - nSel = aMultiSelection.NextSelected(); - if ( pLastPage && sal_Int32(SFX_ENDOFSELECTION) == nSel ) + const sal_Int32 nCurrentRenderer = *aIter; + ++aIter; + if ( pLastPage && aIter == aEnd ) *pLastPage <<= sal_True; rRenderable->render( nCurrentRenderer, rSelection, rRenderOptions ); @@ -862,8 +867,6 @@ sal_Bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue } const sal_Int32 nPageCount = xRenderable->getRendererCount( aSelection, aRenderOptions ); - const Range aRange( 1, nPageCount ); - MultiSelection aMultiSelection; if ( mbExportNotesPages && aCreator.EqualsAscii( "Impress" ) ) { @@ -874,21 +877,20 @@ sal_Bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue if( !aPageRange.getLength() ) { - aMultiSelection.SetTotalRange( aRange ); - aMultiSelection.Select( aRange ); - } - else - { - aMultiSelection = MultiSelection( aPageRange ); - aMultiSelection.SetTotalRange( aRange ); + aPageRange = OUStringBuffer() + .append( static_cast< sal_Int32 >( 1 ) ) + .append( static_cast< sal_Unicode >( '-' ) ) + .append( nPageCount ).makeStringAndClear(); } + StringRangeEnumerator aRangeEnum( aPageRange, 0, nPageCount-1 ); + if ( mxStatusIndicator.is() ) { ByteString aResMgrName( "pdffilter" ); ResMgr* pResMgr = ResMgr::CreateResMgr( aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() ); if ( pResMgr ) { - sal_Int32 nTotalPageCount = aMultiSelection.GetSelectCount(); + sal_Int32 nTotalPageCount = aRangeEnum.size(); if ( bSecondPassForImpressNotes ) nTotalPageCount *= 2; mxStatusIndicator->start( String( ResId( PDF_PROGRESS_BAR, *pResMgr ) ), nTotalPageCount ); @@ -897,14 +899,14 @@ sal_Bool PDFExport::Export( const OUString& rFile, const Sequence< PropertyValue } if( nPageCount > 0 ) - bRet = ExportSelection( *pPDFWriter, xRenderable, aSelection, aMultiSelection, aRenderOptions, nPageCount ); + bRet = ExportSelection( *pPDFWriter, xRenderable, aSelection, aRangeEnum, aRenderOptions, nPageCount ); else bRet = sal_False; if ( bRet && bSecondPassForImpressNotes ) { rExportNotesValue <<= sal_True; - bRet = ExportSelection( *pPDFWriter, xRenderable, aSelection, aMultiSelection, aRenderOptions, nPageCount ); + bRet = ExportSelection( *pPDFWriter, xRenderable, aSelection, aRangeEnum, aRenderOptions, nPageCount ); } if ( mxStatusIndicator.is() ) mxStatusIndicator->end(); diff --git a/filter/source/pdf/pdfexport.hxx b/filter/source/pdf/pdfexport.hxx index f9159f2591c5..12355d18efa7 100644 --- a/filter/source/pdf/pdfexport.hxx +++ b/filter/source/pdf/pdfexport.hxx @@ -125,8 +125,12 @@ public: const Reference< lang::XMultiServiceFactory >& xFact ); ~PDFExport(); - sal_Bool ExportSelection( vcl::PDFWriter& rPDFWriter, Reference< com::sun::star::view::XRenderable >& rRenderable, Any& rSelection, - MultiSelection aMultiSelection, Sequence< PropertyValue >& rRenderOptions, sal_Int32 nPageCount ); + sal_Bool ExportSelection( vcl::PDFWriter& rPDFWriter, + Reference< com::sun::star::view::XRenderable >& rRenderable, + const Any& rSelection, + const StringRangeEnumerator& rRangeEnum, + Sequence< PropertyValue >& rRenderOptions, + sal_Int32 nPageCount ); sal_Bool Export( const OUString& rFile, const Sequence< PropertyValue >& rFilterData ); diff --git a/sw/inc/EnhancedPDFExportHelper.hxx b/sw/inc/EnhancedPDFExportHelper.hxx index e8befb722fc0..2020d139ce88 100644 --- a/sw/inc/EnhancedPDFExportHelper.hxx +++ b/sw/inc/EnhancedPDFExportHelper.hxx @@ -51,7 +51,7 @@ namespace rtl { class OUString; } -class MultiSelection; +class StringRangeEnumerator; class SwTxtNode; class SwNumRule; class SwTable; @@ -215,7 +215,8 @@ class SwEnhancedPDFExportHelper SwEditShell& mrSh; OutputDevice& mrOut; - MultiSelection* pPageRange; + StringRangeEnumerator* mpRangeEnum; + std::vector<bool> maIsPageEmpty; bool mbSkipEmptyPages; bool mbEditEngineOnly; @@ -230,6 +231,7 @@ class SwEnhancedPDFExportHelper void EnhancedPDFExport(); sal_Int32 CalcOutputPageNum( const SwRect& rRect ) const; + void CalcOutputPageNums( const SwRect& rRect, std::vector<sal_Int32>& rPageNums ) const; void MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rPDFExtOutDevData, const SwTxtNode& rTNd, const SwRect& rLinkRect, diff --git a/sw/source/core/text/EnhancedPDFExportHelper.cxx b/sw/source/core/text/EnhancedPDFExportHelper.cxx index 751f6fa39bae..a8b1a772880a 100644 --- a/sw/source/core/text/EnhancedPDFExportHelper.cxx +++ b/sw/source/core/text/EnhancedPDFExportHelper.cxx @@ -1514,12 +1514,24 @@ SwEnhancedPDFExportHelper::SwEnhancedPDFExportHelper( SwEditShell& rSh, bool bEditEngineOnly ) : mrSh( rSh ), mrOut( rOut ), - pPageRange( 0 ), + mpRangeEnum( 0 ), mbSkipEmptyPages( bSkipEmptyPages ), mbEditEngineOnly( bEditEngineOnly ) { if ( rPageRange.getLength() ) - pPageRange = new MultiSelection( rPageRange ); + mpRangeEnum = new StringRangeEnumerator( rPageRange, 0, mrSh.GetPageCount()-1 ); + + if ( mbSkipEmptyPages ) + { + maIsPageEmpty.resize( mrSh.GetPageCount() ); + const SwPageFrm* pCurrPage = + static_cast<const SwPageFrm*>( mrSh.GetLayout()->Lower() ); + for ( size_t i = 0, n = maIsPageEmpty.size(); i < n && pCurrPage; ++i ) + { + maIsPageEmpty[i] = pCurrPage->IsEmptyPage(); + pCurrPage = static_cast<const SwPageFrm*>( pCurrPage->GetNext() ); + } + } aTableColumnsMap.clear(); aLinkIdMap.clear(); @@ -1546,7 +1558,7 @@ SwEnhancedPDFExportHelper::SwEnhancedPDFExportHelper( SwEditShell& rSh, SwEnhancedPDFExportHelper::~SwEnhancedPDFExportHelper() { - delete pPageRange; + delete mpRangeEnum; } /* @@ -1609,10 +1621,11 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // Link Rectangle const SwRect& rNoteRect = mrSh.GetCharRect(); - // Link PageNum - const sal_Int32 nNotePageNum = CalcOutputPageNum( rNoteRect ); - if ( -1 != nNotePageNum ) - { + // Link PageNums + std::vector<sal_Int32> aNotePageNums; + CalcOutputPageNums( rNoteRect, aNotePageNums ); + for ( size_t nNumIdx = 0; nNumIdx < aNotePageNums.size(); ++nNumIdx ) + { // Link Note vcl::PDFNote aNote; @@ -1636,7 +1649,7 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() aNote.Contents = pField->GetTxt(); // Link Export - pPDFExtOutDevData->CreateNote( rNoteRect.SVRect(), aNote, nNotePageNum ); + pPDFExtOutDevData->CreateNote( rNoteRect.SVRect(), aNote, aNotePageNums[nNumIdx] ); } } } @@ -1721,14 +1734,15 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // Link Rectangle const SwRect& rLinkRect( aTmp[ i ] ); - // Link PageNum - const sal_Int32 nLinkPageNum = CalcOutputPageNum( rLinkRect ); + // Link PageNums + std::vector<sal_Int32> aLinkPageNums; + CalcOutputPageNums( rLinkRect, aLinkPageNums ); - if ( -1 != nLinkPageNum ) + for ( size_t nNumIdx = 0; nNumIdx < aLinkPageNums.size(); ++nNumIdx ) { // Link Export const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink( rLinkRect.SVRect(), nLinkPageNum ); + pPDFExtOutDevData->CreateLink( rLinkRect.SVRect(), aLinkPageNums[nNumIdx] ); // Store link info for tagged pdf output: const IdMapEntry aLinkEntry( rLinkRect, nLinkId ); @@ -1790,14 +1804,15 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() Point aNullPt; const SwRect aLinkRect = pFrmFmt->FindLayoutRect( sal_False, &aNullPt ); - // Link PageNum - const sal_Int32 nLinkPageNum = CalcOutputPageNum( aLinkRect ); + // Link PageNums + std::vector<sal_Int32> aLinkPageNums; + CalcOutputPageNums( aLinkRect, aLinkPageNums ); // Link Export - if ( -1 != nLinkPageNum ) + for ( size_t nNumIdx = 0; nNumIdx < aLinkPageNums.size(); ++nNumIdx ) { const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink( aLinkRect.SVRect(), nLinkPageNum ); + pPDFExtOutDevData->CreateLink( aLinkRect.SVRect(), aLinkPageNums[nNumIdx] ); // Connect Link and Destination: if ( bIntern ) @@ -1879,14 +1894,15 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // Link rectangle const SwRect& rLinkRect( aTmp[ i ] ); - // Link PageNum - const sal_Int32 nLinkPageNum = CalcOutputPageNum( rLinkRect ); + // Link PageNums + std::vector<sal_Int32> aLinkPageNums; + CalcOutputPageNums( rLinkRect, aLinkPageNums ); - if ( -1 != nLinkPageNum ) + for ( size_t nNumIdx = 0; nNumIdx < aLinkPageNums.size(); ++nNumIdx ) { // Link Export const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink( rLinkRect.SVRect(), nLinkPageNum ); + pPDFExtOutDevData->CreateLink( rLinkRect.SVRect(), aLinkPageNums[nNumIdx] ); // Store link info for tagged pdf output: const IdMapEntry aLinkEntry( rLinkRect, nLinkId ); @@ -1947,25 +1963,26 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() // Goto footnote text: if ( mrSh.GotoFtnTxt() ) { - // Link PageNum - const sal_Int32 nLinkPageNum = CalcOutputPageNum( aLinkRect ); + // Link PageNums + std::vector<sal_Int32> aLinkPageNums; + CalcOutputPageNums( aLinkRect, aLinkPageNums ); + + // Destination Rectangle + const SwRect& rDestRect = mrSh.GetCharRect(); - if ( -1 != nLinkPageNum ) + // Destination PageNum + const sal_Int32 nDestPageNum = CalcOutputPageNum( rDestRect ); + + for ( size_t nNumIdx = 0; nNumIdx < aLinkPageNums.size(); ++nNumIdx ) { // Link Export const sal_Int32 nLinkId = - pPDFExtOutDevData->CreateLink( aLinkRect.SVRect(), nLinkPageNum ); + pPDFExtOutDevData->CreateLink( aLinkRect.SVRect(), aLinkPageNums[nNumIdx] ); // Store link info for tagged pdf output: const IdMapEntry aLinkEntry( aLinkRect, nLinkId ); aLinkIdMap.push_back( aLinkEntry ); - // Destination Rectangle - const SwRect& rDestRect = mrSh.GetCharRect(); - - // Destination PageNum - const sal_Int32 nDestPageNum = CalcOutputPageNum( rDestRect ); - if ( -1 != nDestPageNum ) { // Destination Export @@ -2126,38 +2143,128 @@ void SwEnhancedPDFExportHelper::EnhancedPDFExport() /* * SwEnhancedPDFExportHelper::CalcOutputPageNum() + * + * Returns the page number in the output pdf on which the given rect is located. + * If this page is duplicated, method will return first occurrence of it. */ sal_Int32 SwEnhancedPDFExportHelper::CalcOutputPageNum( const SwRect& rRect ) const { - // Document page numbers are 0, 1, 2, ... + // Document page number. const sal_Int32 nPageNumOfRect = mrSh.GetPageNumAndSetOffsetForPDF( mrOut, rRect ); + if ( nPageNumOfRect < 0 ) + return -1; + + // What will be the page number of page nPageNumOfRect in the output pdf? + sal_Int32 nRet = -1; + if ( mpRangeEnum ) + { + if ( mpRangeEnum->hasValue( nPageNumOfRect ) ) + { + sal_Int32 nOutputPageNum = 0; + StringRangeEnumerator::Iterator aIter = mpRangeEnum->begin(); + StringRangeEnumerator::Iterator aEnd = mpRangeEnum->end(); + for ( ; aIter != aEnd; ++aIter ) + { + bool bSkipThisPage = mbSkipEmptyPages && + static_cast<size_t>( *aIter ) < maIsPageEmpty.size() && + maIsPageEmpty[*aIter]; + if ( !bSkipThisPage ) + { + if ( *aIter == nPageNumOfRect ) + { + nRet = nOutputPageNum; + break; + } + ++nOutputPageNum; + } + } + } + } + else + { + if ( mbSkipEmptyPages ) + { + sal_Int32 nOutputPageNum = 0; + for ( size_t i = 0; i < maIsPageEmpty.size(); ++i ) + { + if ( !maIsPageEmpty[i] ) + { + if ( i == static_cast<size_t>( nPageNumOfRect ) ) + { + nRet = nOutputPageNum; + break; + } + ++nOutputPageNum; + } + } + } + else + nRet = nPageNumOfRect; + } - // Shortcut: - if ( -1 == nPageNumOfRect || ( !pPageRange && !mbSkipEmptyPages ) ) - return nPageNumOfRect; + return nRet; +} - // pPageRange page numbers are 1, 2, 3, ... - if ( pPageRange && !pPageRange->IsSelected( nPageNumOfRect + 1 ) ) - return -1; +/* + * SwEnhancedPDFExportHelper::CalcOutputPageNums() + * + * Fills rPageNums with the page numbers in the output pdf on which the given + * rect is located. There can be many such pages since StringRangeEnumerator + * allows duplication of its entries. + */ +void SwEnhancedPDFExportHelper::CalcOutputPageNums( const SwRect& rRect, + std::vector<sal_Int32>& rPageNums ) const +{ + rPageNums.clear(); - // What will be the page number of page nPageNumOfRect in the output doc? - sal_Int32 nOutputPageNum = -1; - const SwRootFrm* pRootFrm = mrSh.GetLayout(); - const SwPageFrm* pCurrPage = static_cast<const SwPageFrm*>(pRootFrm->Lower()); + // Document page number. + const sal_Int32 nPageNumOfRect = mrSh.GetPageNumAndSetOffsetForPDF( mrOut, rRect ); + if ( nPageNumOfRect < 0 ) + return; - for ( sal_Int32 nPageIndex = 0; - nPageIndex <= nPageNumOfRect && pCurrPage; - ++nPageIndex ) + // What will be the page numbers of page nPageNumOfRect in the output pdf? + if ( mpRangeEnum ) { - if ( ( !pPageRange || pPageRange->IsSelected( nPageIndex + 1 ) ) && - ( !mbSkipEmptyPages || !pCurrPage->IsEmptyPage() ) ) - ++nOutputPageNum; - - pCurrPage = static_cast<const SwPageFrm*>(pCurrPage->GetNext()); + if ( mpRangeEnum->hasValue( nPageNumOfRect ) ) + { + sal_Int32 nOutputPageNum = 0; + StringRangeEnumerator::Iterator aIter = mpRangeEnum->begin(); + StringRangeEnumerator::Iterator aEnd = mpRangeEnum->end(); + for ( ; aIter != aEnd; ++aIter ) + { + bool bSkipThisPage = mbSkipEmptyPages && + static_cast<size_t>( *aIter ) < maIsPageEmpty.size() && + maIsPageEmpty[*aIter]; + if ( !bSkipThisPage ) + { + if ( *aIter == nPageNumOfRect ) + rPageNums.push_back( nOutputPageNum ); + ++nOutputPageNum; + } + } + } + } + else + { + if ( mbSkipEmptyPages ) + { + sal_Int32 nOutputPageNum = 0; + for ( size_t i = 0; i < maIsPageEmpty.size(); ++i ) + { + if ( !maIsPageEmpty[i] ) + { + if ( i == static_cast<size_t>( nPageNumOfRect ) ) + { + rPageNums.push_back( nOutputPageNum ); + break; + } + ++nOutputPageNum; + } + } + } + else + rPageNums.push_back( nPageNumOfRect ); } - - // pdf export page numbers are 0, 1, 2, ... - return nOutputPageNum; } void SwEnhancedPDFExportHelper::MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rPDFExtOutDevData, @@ -2184,14 +2291,15 @@ void SwEnhancedPDFExportHelper::MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rP // same anyway) if ( aHFLinkRect.Pos() != rLinkRect.Pos() ) { - // Link PageNum - const sal_Int32 nHFLinkPageNum = CalcOutputPageNum( aHFLinkRect ); + // Link PageNums + std::vector<sal_Int32> aHFLinkPageNums; + CalcOutputPageNums( aHFLinkRect, aHFLinkPageNums ); - if ( -1 != nHFLinkPageNum ) + for ( size_t nNumIdx = 0; nNumIdx < aHFLinkPageNums.size(); ++nNumIdx ) { // Link Export const sal_Int32 nHFLinkId = - rPDFExtOutDevData.CreateLink( aHFLinkRect.SVRect(), nHFLinkPageNum ); + rPDFExtOutDevData.CreateLink( aHFLinkRect.SVRect(), aHFLinkPageNums[nNumIdx] ); // Connect Link and Destination: if ( bIntern ) |