Kaydet (Commit) 14d05c9b authored tarafından Justin Luth's avatar Justin Luth Kaydeden (comit) Thorsten Behrens

tdf#64588 - prevent loss of non-uniquely-named slide

Although the UI prevents someone from renaming slides
so that two have the same name, it is still possible to
have such non-uniquely named pages apparently.  Since drag/drop
uses the name to add a slide to the clipboard, it resulted
in duplicates of the first found instance of the slidename, and
loss of the similarly-named slides when they were dragged to
a new location.

Change-Id: I2986a7c6c3360162adf9430f645d0dfc73f1d4e2
Reviewed-on: https://gerrit.libreoffice.org/32481Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarJustin Luth <justin_luth@sil.org>
Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst ec6c0319
...@@ -355,6 +355,13 @@ public: ...@@ -355,6 +355,13 @@ public:
SDRPAGE_NOTFOUND (=0xffff) when such a page does not exist. SDRPAGE_NOTFOUND (=0xffff) when such a page does not exist.
*/ */
SAL_DLLPRIVATE sal_uInt16 GetPageByName(const OUString& rPgName, bool& rbIsMasterPage ) const; SAL_DLLPRIVATE sal_uInt16 GetPageByName(const OUString& rPgName, bool& rbIsMasterPage ) const;
/** checks, if the given name is a *unique* name for an *existing* slide
@param rPageName the name of an existing slide
@return true, if the name is unique and the slide exists
*/
bool IsPageNameUnique( const OUString& rPageName ) const;
SdPage*GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const; SdPage*GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const;
sal_uInt16 GetSdPageCount(PageKind ePgKind) const; sal_uInt16 GetSdPageCount(PageKind ePgKind) const;
......
...@@ -184,6 +184,43 @@ sal_uInt16 SdDrawDocument::GetPageByName(const OUString& rPgName, bool& rbIsMast ...@@ -184,6 +184,43 @@ sal_uInt16 SdDrawDocument::GetPageByName(const OUString& rPgName, bool& rbIsMast
return nPageNum; return nPageNum;
} }
bool SdDrawDocument::IsPageNameUnique( const OUString& rPgName ) const
{
sal_uInt16 nCount = 0;
SdPage* pPage = nullptr;
// Search all regular pages and all notes pages (handout pages are ignored)
sal_uInt16 nPage = 0;
sal_uInt16 nMaxPages = GetPageCount();
while (nPage < nMaxPages)
{
pPage = const_cast<SdPage*>(static_cast<const SdPage*>(GetPage(nPage)));
if (pPage && pPage->GetName() == rPgName && pPage->GetPageKind() != PageKind::Handout)
nCount++;
nPage++;
}
// Search all master pages
nPage = 0;
nMaxPages = GetMasterPageCount();
while (nPage < nMaxPages)
{
pPage = const_cast<SdPage*>(static_cast<const SdPage*>(GetMasterPage(nPage)));
if (pPage && pPage->GetName() == rPgName)
nCount++;;
nPage++;
}
if (nCount == 1)
return true;
else
return false;
}
SdPage* SdDrawDocument::GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const SdPage* SdDrawDocument::GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const
{ {
return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum)); return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
......
...@@ -406,6 +406,11 @@ bool DrawDocShell::IsNewPageNameValid( OUString & rInOutPageName, bool bResetStr ...@@ -406,6 +406,11 @@ bool DrawDocShell::IsNewPageNameValid( OUString & rInOutPageName, bool bResetStr
return bCanUseNewName; return bCanUseNewName;
} }
bool DrawDocShell::IsPageNameUnique( const OUString & rPageName ) const
{
return mpDoc->IsPageNameUnique(rPageName);
}
IMPL_LINK( DrawDocShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool ) IMPL_LINK( DrawDocShell, RenameSlideHdl, AbstractSvxNameDialog&, rDialog, bool )
{ {
OUString aNewName; OUString aNewName;
......
...@@ -183,6 +183,14 @@ public: ...@@ -183,6 +183,14 @@ public:
*/ */
bool IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName = false ); bool IsNewPageNameValid( OUString & rInOutPageName, bool bResetStringIfStandardName = false );
/** checks, if the given name is a *unique* name for an *existing* slide
@param rPageName the name of an existing slide
@return true, if the name is unique and the slide exists
*/
bool IsPageNameUnique(const OUString& rPagName) const;
/** Return the reference device for the current document. When the /** Return the reference device for the current document. When the
inherited implementation returns a device then this is passed to the inherited implementation returns a device then this is passed to the
caller. Otherwise the returned value depends on the printer caller. Otherwise the returned value depends on the printer
......
...@@ -389,9 +389,26 @@ void Clipboard::CreateSlideTransferable ( ...@@ -389,9 +389,26 @@ void Clipboard::CreateSlideTransferable (
SdDrawDocument* const pDocument = mrSlideSorter.GetModel().GetDocument(); SdDrawDocument* const pDocument = mrSlideSorter.GetModel().GetDocument();
DrawDocShell* const pDataDocSh = pDocument ? pDocument->GetDocSh() : nullptr; DrawDocShell* const pDataDocSh = pDocument ? pDocument->GetDocSh() : nullptr;
sal_Int32 nUniqueID = 0;
while (aSelectedPages.HasMoreElements()) while (aSelectedPages.HasMoreElements())
{ {
model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); model::SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement());
//ensure that the slides have unique names
const OUString sOrigName = pDescriptor->GetPage()->GetName();
if ( pDataDocSh && !pDataDocSh->IsPageNameUnique( sOrigName ) )
{
OUString sUniqueName;
bool bUnique = false;
while ( !bUnique )
{
sUniqueName = sOrigName + "_clipboard" + OUString::number(nUniqueID++);
bUnique = pDataDocSh->IsNewPageNameValid( sUniqueName );
if ( bUnique )
pDescriptor->GetPage()->SetName(sUniqueName);
}
}
aBookmarkList.push_back(pDescriptor->GetPage()->GetName()); aBookmarkList.push_back(pDescriptor->GetPage()->GetName());
maPagesToRemove.push_back (pDescriptor->GetPage()); maPagesToRemove.push_back (pDescriptor->GetPage());
} }
......
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