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));