Author: alg Date: Fri May 31 12:50:30 2013 New Revision: 1488195 URL: http://svn.apache.org/r1488195 Log: i121863 Corrected D&D from MasterPage view, source SlideSorter, target 2nd DocumentView
Modified: openoffice/trunk/main/sd/source/core/drawdoc3.cxx Modified: openoffice/trunk/main/sd/source/core/drawdoc3.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/core/drawdoc3.cxx?rev=1488195&r1=1488194&r2=1488195&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/core/drawdoc3.cxx (original) +++ openoffice/trunk/main/sd/source/core/drawdoc3.cxx Fri May 31 12:50:30 2013 @@ -1512,6 +1512,58 @@ void SdDrawDocument::RemoveUnnecessaryMa |* Ist rLayoutName leer, so wird die erste MasterPage genommen \************************************************************************/ +// #121863# factored out functionality +bool isMasterPageLayoutNameUnique(const SdDrawDocument& rDoc, const String& rCandidate) +{ + if(!rCandidate.Len()) + { + return false; + } + + const sal_uInt16 nPageCount(rDoc.GetMasterPageCount()); + + for(sal_uInt16 a(0); a < nPageCount; a++) + { + const SdrPage* pCandidate = rDoc.GetMasterPage(a); + String aPageLayoutName(pCandidate->GetLayoutName()); + aPageLayoutName.Erase(aPageLayoutName.SearchAscii(SD_LT_SEPARATOR)); + + if(aPageLayoutName == rCandidate) + { + return false; + } + } + + return true; +} + +// #121863# factored out functinality +String createNewMasterPageLayoutName(const SdDrawDocument& rDoc) +{ + const String aBaseName(SdResId(STR_LAYOUT_DEFAULT_NAME)); + String aRetval; + sal_uInt16 nCount(0); + + while(!aRetval.Len()) + { + aRetval = aBaseName; + + if(nCount) + { + aRetval += String::CreateFromInt32(nCount); + } + + nCount++; + + if(!isMasterPageLayoutNameUnique(rDoc, aRetval)) + { + aRetval.Erase(); + } + } + + return aRetval; +} + void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, const String& rLayoutName, SdDrawDocument* pSourceDoc, @@ -1541,8 +1593,6 @@ void SdDrawDocument::SetMasterPage(sal_u String aOldLayoutName(aOldPageLayoutName); aOldLayoutName.Erase(aOldLayoutName.SearchAscii( SD_LT_SEPARATOR )); - String aNewLayoutName( rLayoutName ); - if (pSourceDoc) { List* pReplList = NULL; @@ -1556,7 +1606,6 @@ void SdDrawDocument::SetMasterPage(sal_u // No LayoutName: take first MasterPage pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD); pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES); - aNewLayoutName = pMaster->GetName(); } else { @@ -1587,7 +1636,6 @@ void SdDrawDocument::SetMasterPage(sal_u // so take the first MasterPage pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD); pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES); - aNewLayoutName = pMaster->GetName(); } } @@ -1604,13 +1652,53 @@ void SdDrawDocument::SetMasterPage(sal_u return; } - if (pSourceDoc != this) - { + const String aOriginalNewLayoutName( pMaster->GetName() ); + String aTargetNewLayoutName(aOriginalNewLayoutName); + + if (pSourceDoc != this) + { + // #121863# clone masterpages, they are from another model (!) + SdPage* pNewNotesMaster = dynamic_cast< SdPage* >(pNotesMaster->Clone(this)); + SdPage* pNewMaster = dynamic_cast< SdPage* >(pMaster->Clone(this)); + + if(!pNewNotesMaster || !pNewMaster) + { + delete pNewNotesMaster; + delete pNewMaster; + OSL_ASSERT("SdDrawDocument::SetMasterPage() cloning of MasterPage/NoteAmsterPage failed!" ); + return; + } + + pNotesMaster = pNewNotesMaster; + pMaster = pNewMaster; + + // layout name needs to be unique + aTargetNewLayoutName = pMaster->GetLayoutName(); + aTargetNewLayoutName.Erase(aTargetNewLayoutName.SearchAscii(SD_LT_SEPARATOR)); + + if(!isMasterPageLayoutNameUnique(*this, aTargetNewLayoutName)) + { + aTargetNewLayoutName = createNewMasterPageLayoutName(*this); + + String aTemp(aTargetNewLayoutName); + aTemp.AppendAscii(RTL_CONSTASCII_STRINGPARAM(SD_LT_SEPARATOR)); + aTemp.Append(String(SdResId(STR_LAYOUT_OUTLINE))); + + pMaster->SetName(aTargetNewLayoutName); + pMaster->SetLayoutName(aTemp); + + pNotesMaster->SetName(aTargetNewLayoutName); + pNotesMaster->SetLayoutName(aTemp); + } + } + + if (pSourceDoc != this) + { const sal_uInt16 nMasterPageCount = GetMasterPageCount(); for ( sal_uInt16 nMPage = 0; nMPage < nMasterPageCount; nMPage++ ) { SdPage* pCheckMaster = (SdPage*)GetMasterPage(nMPage); - if( pCheckMaster->GetName() == aNewLayoutName ) + if( pCheckMaster->GetName() == aTargetNewLayoutName ) { bLayoutReloaded = sal_True; break; @@ -1635,9 +1723,19 @@ void SdDrawDocument::SetMasterPage(sal_u { aName = pHisSheet->GetName(); - if( aName.Search( aNewLayoutName ) == 0 ) + // #121863# search in source styles with original style name from source of + // evtl. cloned master (not-cloned, renamed for uniqueness) + if( aName.Search( aOriginalNewLayoutName ) == 0 ) { - SfxStyleSheet* pMySheet = static_cast<SfxStyleSheet*>( mxStyleSheetPool->Find(aName, SD_STYLE_FAMILY_MASTERPAGE) ); + // #121863# build name of evtl. cloned master style to search for + if(aOriginalNewLayoutName != aTargetNewLayoutName) + { + const sal_uInt16 nPos(aName.SearchAscii(SD_LT_SEPARATOR)); + aName.Erase(0, nPos); + aName.Insert(aTargetNewLayoutName, 0); + } + + SfxStyleSheet* pMySheet = static_cast<SfxStyleSheet*>( mxStyleSheetPool->Find(aName, SD_STYLE_FAMILY_MASTERPAGE) ); if (pMySheet) { @@ -1672,11 +1770,14 @@ void SdDrawDocument::SetMasterPage(sal_u pReplData->nFamily = pMySheet->GetFamily(); pReplData->aNewName = pMySheet->GetName(); + // #121863# re-create original name of styte used at page where to replace with + // this new style String aTemp(pMySheet->GetName()); - sal_uInt16 nPos = aTemp.SearchAscii( SD_LT_SEPARATOR ); + const sal_uInt16 nPos(aTemp.SearchAscii(SD_LT_SEPARATOR)); aTemp.Erase(0, nPos); aTemp.Insert(aOldLayoutName, 0); - pReplData->aName = aTemp; + + pReplData->aName = aTemp; pReplList->Insert(pReplData, LIST_APPEND); } @@ -1738,13 +1839,16 @@ void SdDrawDocument::SetMasterPage(sal_u String aLayoutName = aPageLayoutName; aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR )); - if (pSourceDoc != this) - { - // Aus dem Source-Dokument austragen - SdrPage* pTest = NULL; - pTest = pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum()); - pTest = pSourceDoc->RemoveMasterPage(pMaster->GetPageNum()); - } + // #121863# Do *not* remove from original document any longer, it is potentially used there + // and would lead to crashes. Rely on the automatic process of removing unused masterpages + // (see RemoveUnnecessaryMasterPages) + //if (pSourceDoc != this) + //{ + // // Aus dem Source-Dokument austragen + // SdrPage* pTest = NULL; + // pTest = pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum()); + // pTest = pSourceDoc->RemoveMasterPage(pMaster->GetPageNum()); + //} /********************************************************************* |* Neue MasterPages ins Dokument eintragen und den Standard- und @@ -1884,32 +1988,7 @@ void SdDrawDocument::SetMasterPage(sal_u /********************************************************************* |* Einen neuen Layoutnamen ausdenken \********************************************************************/ - String aName = String(SdResId(STR_LAYOUT_DEFAULT_NAME)); - String aTest; - sal_Bool bNotANewName = sal_True; - sal_uInt16 nCount = 0; - sal_uInt16 nMPgCount = GetMasterPageCount(); - - for (nCount = 0; bNotANewName; nCount++) - { - // Testnamen bilden - aTest = aName; // Standard, Standard1, Standard2, ... - if (nCount > 0) - aTest += String::CreateFromInt32( nCount ); - - // gibt's schon eine, die so heisst? - bNotANewName = sal_False; - for (sal_uInt16 nMPg = 1; nMPg < nMPgCount; nMPg++) - { - const SdrPage* pTest = GetMasterPage(nMPg); - String aPageLayoutName(pTest->GetLayoutName()); - aPageLayoutName.Erase( aPageLayoutName.SearchAscii( SD_LT_SEPARATOR )); - - if (aPageLayoutName == aTest) - bNotANewName = sal_True; - } - } - aName = aTest; + String aName(createNewMasterPageLayoutName(*this)); String aPageLayoutName(aName); aPageLayoutName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR )); aPageLayoutName += String(SdResId(STR_LAYOUT_OUTLINE));