Kaydet (Commit) f0545c44 authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i121863# Corrected D&D from MasterPage view

source SlideSorter, target 2nd DocumentView

(cherry picked from commit 2136f459)

Conflicts:
	sd/source/core/drawdoc3.cxx

Change-Id: I2ba9f2c062b464d3ab3fb28ab115c908b0a7e450
üst b425c296
...@@ -1299,6 +1299,58 @@ void SdDrawDocument::RemoveUnnecessaryMasterPages(SdPage* pMasterPage, sal_Bool ...@@ -1299,6 +1299,58 @@ void SdDrawDocument::RemoveUnnecessaryMasterPages(SdPage* pMasterPage, sal_Bool
* If pSourceDoc == NULL, an empty master page is applied. * If pSourceDoc == NULL, an empty master page is applied.
* If rLayoutName is empty, the first master page is used. * If rLayoutName is empty, the first master page is used.
*/ */
// #i121863# 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;
}
// #i121863# 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 += OUString::number(nCount);
}
nCount++;
if(!isMasterPageLayoutNameUnique(rDoc, aRetval))
{
aRetval.Erase();
}
}
return aRetval;
}
void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
const String& rLayoutName, const String& rLayoutName,
SdDrawDocument* pSourceDoc, SdDrawDocument* pSourceDoc,
...@@ -1328,8 +1380,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1328,8 +1380,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
String aOldLayoutName(aOldPageLayoutName); String aOldLayoutName(aOldPageLayoutName);
aOldLayoutName.Erase(aOldLayoutName.SearchAscii( SD_LT_SEPARATOR )); aOldLayoutName.Erase(aOldLayoutName.SearchAscii( SD_LT_SEPARATOR ));
String aNewLayoutName( rLayoutName );
if (pSourceDoc) if (pSourceDoc)
{ {
std::vector<StyleReplaceData> aReplList; // List of replaced stylesheets std::vector<StyleReplaceData> aReplList; // List of replaced stylesheets
...@@ -1341,7 +1391,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1341,7 +1391,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
// No LayoutName: take first MasterPage // No LayoutName: take first MasterPage
pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD); pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD);
pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES); pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES);
aNewLayoutName = pMaster->GetName();
} }
else else
{ {
...@@ -1372,7 +1421,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1372,7 +1421,6 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
// so take the first MasterPage // so take the first MasterPage
pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD); pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD);
pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES); pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES);
aNewLayoutName = pMaster->GetName();
} }
} }
...@@ -1389,13 +1437,53 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1389,13 +1437,53 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
return; return;
} }
const String aOriginalNewLayoutName( pMaster->GetName() );
String aTargetNewLayoutName(aOriginalNewLayoutName);
if (pSourceDoc != this)
{
// #i121863# 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) if (pSourceDoc != this)
{ {
const sal_uInt16 nMasterPageCount = GetMasterPageCount(); const sal_uInt16 nMasterPageCount = GetMasterPageCount();
for ( sal_uInt16 nMPage = 0; nMPage < nMasterPageCount; nMPage++ ) for ( sal_uInt16 nMPage = 0; nMPage < nMasterPageCount; nMPage++ )
{ {
SdPage* pCheckMaster = (SdPage*)GetMasterPage(nMPage); SdPage* pCheckMaster = (SdPage*)GetMasterPage(nMPage);
if( pCheckMaster->GetName() == aNewLayoutName ) if( pCheckMaster->GetName() == aTargetNewLayoutName )
{ {
bLayoutReloaded = sal_True; bLayoutReloaded = sal_True;
break; break;
...@@ -1416,8 +1504,18 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1416,8 +1504,18 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
{ {
aName = pHisSheet->GetName(); aName = pHisSheet->GetName();
if( aName.Search( aNewLayoutName ) == 0 ) // #i121863# search in source styles with original style name from source of
// evtl. cloned master (not-cloned, renamed for uniqueness)
if( aName.Search( aOriginalNewLayoutName ) == 0 )
{ {
// #i121863# 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) ); SfxStyleSheet* pMySheet = static_cast<SfxStyleSheet*>( mxStyleSheetPool->Find(aName, SD_STYLE_FAMILY_MASTERPAGE) );
if (pMySheet) if (pMySheet)
...@@ -1453,8 +1551,10 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1453,8 +1551,10 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
aReplData.nFamily = pMySheet->GetFamily(); aReplData.nFamily = pMySheet->GetFamily();
aReplData.aNewName = pMySheet->GetName(); aReplData.aNewName = pMySheet->GetName();
// #i121863# re-create original name of styte used at page where to replace with
// this new style
String aTemp(pMySheet->GetName()); 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.Erase(0, nPos);
aTemp.Insert(aOldLayoutName, 0); aTemp.Insert(aOldLayoutName, 0);
aReplData.aName = aTemp; aReplData.aName = aTemp;
...@@ -1515,12 +1615,15 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1515,12 +1615,15 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
String aLayoutName = aPageLayoutName; String aLayoutName = aPageLayoutName;
aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR )); aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR ));
if (pSourceDoc != this) // #i121863# 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
// Remove from the source document // (see RemoveUnnecessaryMasterPages)
pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum()); //if (pSourceDoc != this)
pSourceDoc->RemoveMasterPage(pMaster->GetPageNum()); //{
} // // Remove from the source document
// pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum());
// pSourceDoc->RemoveMasterPage(pMaster->GetPageNum());
//}
// Register the new master pages with the document and then use the // Register the new master pages with the document and then use the
// the new presentation layout for the default and notes pages // the new presentation layout for the default and notes pages
...@@ -1640,32 +1743,7 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum, ...@@ -1640,32 +1743,7 @@ void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
else else
{ {
// Find a new name for the layout // Find a new name for the layout
String aName = String(SdResId(STR_LAYOUT_DEFAULT_NAME)); OUString aName(createNewMasterPageLayoutName(*this));
String aTest;
sal_Bool bNotANewName = sal_True;
sal_uInt16 nCount = 0;
sal_uInt16 nMPgCount = GetMasterPageCount();
for (nCount = 0; bNotANewName; nCount++)
{
// Create a test name
aTest = aName; // Default, Default1, Default2, ...
if (nCount > 0)
aTest += OUString::number( nCount );
// Is there any page that's already named the same?
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 aPageLayoutName(aName); String aPageLayoutName(aName);
aPageLayoutName.AppendAscii( SD_LT_SEPARATOR ); aPageLayoutName.AppendAscii( SD_LT_SEPARATOR );
aPageLayoutName += String(SdResId(STR_LAYOUT_OUTLINE)); aPageLayoutName += String(SdResId(STR_LAYOUT_OUTLINE));
......
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