Kaydet (Commit) 54388678 authored tarafından Rafael Dominguez's avatar Rafael Dominguez Kaydeden (comit) Luboš Luňák

Refactor SdDrawDocument::IterateBookmarkPages.

- Make the function a local function instead of a method.
- Remove base functor class since we only use one type of functor.
- Make lcl_IterateBookmarkPages only dependant on FindDuplicateLayout
functor.
üst 8fffd99a
...@@ -214,8 +214,6 @@ protected: ...@@ -214,8 +214,6 @@ protected:
public: public:
class InsertBookmarkAsPage_PageFunctorBase;
TYPEINFO(); TYPEINFO();
SD_DLLPUBLIC SdDrawDocument(DocumentType eType, SfxObjectShell* pDocSh); SD_DLLPUBLIC SdDrawDocument(DocumentType eType, SfxObjectShell* pDocSh);
...@@ -331,9 +329,7 @@ public: ...@@ -331,9 +329,7 @@ public:
sal_Bool InsertBookmarkAsObject(List* pBookmarkList, List* pExchangeListL, sal_Bool InsertBookmarkAsObject(List* pBookmarkList, List* pExchangeListL,
sal_Bool bLink, ::sd::DrawDocShell* pBookmarkDocSh, sal_Bool bLink, ::sd::DrawDocShell* pBookmarkDocSh,
Point* pObjPos); Point* pObjPos);
void IterateBookmarkPages( SdDrawDocument* pBookmarkDoc, List* pBookmarkList,
sal_uInt16 nBMSdPageCount,
InsertBookmarkAsPage_PageFunctorBase& rPageIterator );
SD_DLLPUBLIC void CloseBookmarkDoc(); SD_DLLPUBLIC void CloseBookmarkDoc();
SdrObject* GetObj(const String& rObjName) const; SdrObject* GetObj(const String& rObjName) const;
......
...@@ -78,6 +78,128 @@ ...@@ -78,6 +78,128 @@
using namespace ::com::sun::star; using namespace ::com::sun::star;
/** Concrete incarnations get called by lcl_IterateBookmarkPages, for
every page in the bookmark document/list
*/
class InsertBookmarkAsPage_FindDuplicateLayouts
{
public:
InsertBookmarkAsPage_FindDuplicateLayouts( std::vector<rtl::OUString> &rLayoutsToTransfer )
: mrLayoutsToTransfer(rLayoutsToTransfer) {}
void operator()( SdDrawDocument&, SdPage* );
private:
std::vector<rtl::OUString> &mrLayoutsToTransfer;
};
void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc, SdPage* pBMMPage )
{
// now check for duplicate masterpage and layout names
// ===================================================
String aFullNameLayout( pBMMPage->GetLayoutName() );
aFullNameLayout.Erase( aFullNameLayout.SearchAscii( SD_LT_SEPARATOR ));
rtl::OUString aLayout(aFullNameLayout);
std::vector<rtl::OUString>::const_iterator pIter =
find(mrLayoutsToTransfer.begin(),mrLayoutsToTransfer.end(),aLayout);
bool bFound = pIter != mrLayoutsToTransfer.end();
const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount();
for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++)
{
/**************************************************************
* Gibt es die Layouts schon im Dokument?
**************************************************************/
SdPage* pTestPage = (SdPage*) rDoc.GetMasterPage(nMPage);
String aFullTest(pTestPage->GetLayoutName());
aFullTest.Erase( aFullTest.SearchAscii( SD_LT_SEPARATOR ));
rtl::OUString aTest(aFullTest);
if (aTest == aLayout)
bFound = true;
}
if (!bFound)
mrLayoutsToTransfer.push_back(aLayout);
}
/*************************************************************************
|*
|* Fuegt ein Bookmark als Seite ein
|*
\************************************************************************/
void lcl_IterateBookmarkPages( SdDrawDocument &rDoc, SdDrawDocument* pBookmarkDoc,
List* pBookmarkList, sal_uInt16 nBMSdPageCount,
InsertBookmarkAsPage_FindDuplicateLayouts& rPageIterator )
{
//
// Refactored copy'n'pasted layout name collection from InsertBookmarkAsPage
//
int nPos, nEndPos;
if( !pBookmarkList )
{
// no list? whole source document
nEndPos = nBMSdPageCount;
}
else
{
// bookmark list? number of entries
nEndPos = pBookmarkList->Count();
}
SdPage* pBMPage;
// iterate over number of pages to insert
for (nPos = 0; nPos < nEndPos; ++nPos)
{
// the master page associated to the nPos'th page to insert
SdPage* pBMMPage = NULL;
if( !pBookmarkList )
{
// simply take master page of nPos'th page in source document
pBMMPage = (SdPage*)(&(pBookmarkDoc->GetSdPage((sal_uInt16)nPos, PK_STANDARD)->TRG_GetMasterPage()));
}
else
{
// fetch nPos'th entry from bookmark list, and determine master page
String aBMPgName (*(String*) pBookmarkList->GetObject(nPos));
sal_Bool bIsMasterPage;
sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aBMPgName, bIsMasterPage );
if (nBMPage != SDRPAGE_NOTFOUND)
{
pBMPage = (SdPage*) pBookmarkDoc->GetPage(nBMPage);
}
else
{
pBMPage = NULL;
}
// enforce that bookmarked page is a standard page and not already a master page
if (pBMPage && pBMPage->GetPageKind()==PK_STANDARD && !pBMPage->IsMasterPage())
{
const sal_uInt16 nBMSdPage = (nBMPage - 1) / 2;
pBMMPage = (SdPage*) (&(pBookmarkDoc->GetSdPage(nBMSdPage, PK_STANDARD)->TRG_GetMasterPage()));
}
}
// successfully determined valid (bookmarked) page?
if( pBMMPage )
{
// yes, call functor
rPageIterator( rDoc, pBMMPage );
}
}
}
/************************************************************************* /*************************************************************************
|* |*
|* Oeffnet ein Bookmark-Dokument |* Oeffnet ein Bookmark-Dokument
...@@ -247,138 +369,6 @@ sal_Bool SdDrawDocument::InsertBookmark( ...@@ -247,138 +369,6 @@ sal_Bool SdDrawDocument::InsertBookmark(
return bOK; return bOK;
} }
/*************************************************************************
|*
|* Fuegt ein Bookmark als Seite ein
|*
\************************************************************************/
/** Concrete incarnations get called by IterateBookmarkPages, for
every page in the bookmark document/list
*/
class SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase
{
public:
virtual ~InsertBookmarkAsPage_PageFunctorBase() = 0;
virtual void operator()( SdDrawDocument&, SdPage* ) = 0;
};
SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase::~InsertBookmarkAsPage_PageFunctorBase()
{
}
void SdDrawDocument::IterateBookmarkPages( SdDrawDocument* pBookmarkDoc, List* pBookmarkList, sal_uInt16 nBMSdPageCount,
SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase& rPageIterator )
{
//
// Refactored copy'n'pasted layout name collection from InsertBookmarkAsPage
//
int nPos, nEndPos;
if( !pBookmarkList )
{
// no list? whole source document
nEndPos = nBMSdPageCount;
}
else
{
// bookmark list? number of entries
nEndPos = pBookmarkList->Count();
}
SdPage* pBMPage;
// iterate over number of pages to insert
for (nPos = 0; nPos < nEndPos; ++nPos)
{
// the master page associated to the nPos'th page to insert
SdPage* pBMMPage = NULL;
if( !pBookmarkList )
{
// simply take master page of nPos'th page in source document
pBMMPage = (SdPage*)(&(pBookmarkDoc->GetSdPage((sal_uInt16)nPos, PK_STANDARD)->TRG_GetMasterPage()));
}
else
{
// fetch nPos'th entry from bookmark list, and determine master page
String aBMPgName (*(String*) pBookmarkList->GetObject(nPos));
sal_Bool bIsMasterPage;
sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aBMPgName, bIsMasterPage );
if (nBMPage != SDRPAGE_NOTFOUND)
{
pBMPage = (SdPage*) pBookmarkDoc->GetPage(nBMPage);
}
else
{
pBMPage = NULL;
}
// enforce that bookmarked page is a standard page and not already a master page
if (pBMPage && pBMPage->GetPageKind()==PK_STANDARD && !pBMPage->IsMasterPage())
{
const sal_uInt16 nBMSdPage = (nBMPage - 1) / 2;
pBMMPage = (SdPage*) (&(pBookmarkDoc->GetSdPage(nBMSdPage, PK_STANDARD)->TRG_GetMasterPage()));
}
}
// successfully determined valid (bookmarked) page?
if( pBMMPage )
{
// yes, call functor
rPageIterator( *this, pBMMPage );
}
}
}
class InsertBookmarkAsPage_FindDuplicateLayouts : public SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase
{
public:
InsertBookmarkAsPage_FindDuplicateLayouts( std::vector<rtl::OUString> &rLayoutsToTransfer )
: mrLayoutsToTransfer(rLayoutsToTransfer) {}
virtual ~InsertBookmarkAsPage_FindDuplicateLayouts() {};
virtual void operator()( SdDrawDocument&, SdPage* );
private:
std::vector<rtl::OUString> &mrLayoutsToTransfer;
};
void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc, SdPage* pBMMPage )
{
// now check for duplicate masterpage and layout names
// ===================================================
String aFullNameLayout( pBMMPage->GetLayoutName() );
aFullNameLayout.Erase( aFullNameLayout.SearchAscii( SD_LT_SEPARATOR ));
rtl::OUString aLayout(aFullNameLayout);
std::vector<rtl::OUString>::const_iterator pIter =
find(mrLayoutsToTransfer.begin(), mrLayoutsToTransfer.end(),aLayout);
bool bFound = pIter != mrLayoutsToTransfer.end();
const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount();
for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++)
{
/**************************************************************
* Gibt es die Layouts schon im Dokument?
**************************************************************/
SdPage* pTestPage = (SdPage*) rDoc.GetMasterPage(nMPage);
String aFullTest(pTestPage->GetLayoutName());
aFullTest.Erase( aFullTest.SearchAscii( SD_LT_SEPARATOR ));
rtl::OUString aTest(aFullTest);
if (aTest == aLayout)
bFound = true;
}
if (!bFound)
mrLayoutsToTransfer.push_back(aLayout);
}
sal_Bool SdDrawDocument::InsertBookmarkAsPage( sal_Bool SdDrawDocument::InsertBookmarkAsPage(
List* pBookmarkList, List* pBookmarkList,
List* pExchangeList, // Liste der zu verwendenen Namen List* pExchangeList, // Liste der zu verwendenen Namen
...@@ -500,7 +490,7 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage( ...@@ -500,7 +490,7 @@ sal_Bool SdDrawDocument::InsertBookmarkAsPage(
// //
std::vector<rtl::OUString> aLayoutsToTransfer; std::vector<rtl::OUString> aLayoutsToTransfer;
InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( aLayoutsToTransfer ); InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( aLayoutsToTransfer );
IterateBookmarkPages( pBookmarkDoc, pBookmarkList, nBMSdPageCount, aSearchFunctor ); lcl_IterateBookmarkPages( *this, pBookmarkDoc, pBookmarkList, nBMSdPageCount, aSearchFunctor );
/************************************************************************** /**************************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment