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


Reply via email to