openoffice-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a..@apache.org
Subject svn commit: r1488195 - /openoffice/trunk/main/sd/source/core/drawdoc3.cxx
Date Fri, 31 May 2013 12:50:30 GMT
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));



Mime
View raw message