summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorIvan Timofeev <timofeev.i.s@gmail.com>2011-10-19 21:52:17 +0400
committerIvan Timofeev <timofeev.i.s@gmail.com>2011-10-19 23:13:05 +0400
commit5ad4d151dac1eb887d92200330e31af269d8d1fd (patch)
tree2c961fca9047d72e916f10d95488ca2bd7b01d21 /sw
parentf9f4c631b100ace66999933dc06668ac107fb2bf (diff)
migrate to StringRangeEnumerator in pdfexport
Notes
Notes: win32 working build
Diffstat (limited to 'sw')
-rw-r--r--sw/inc/EnhancedPDFExportHelper.hxx6
-rw-r--r--sw/source/core/text/EnhancedPDFExportHelper.cxx220
2 files changed, 168 insertions, 58 deletions
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 )