/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
void ViewClipboard::HandlePageDrop (const SdTransferable& rTransferable)
{ // Determine whether to insert the given set of slides or to assign a // given master page. // tdf#113405 only assign master pages to normal pages, don't attempt to assign a master // page to a master page
sd::DrawViewShell* pDrawViewShell = dynamic_cast<::sd::DrawViewShell*>(mrView.GetViewShell());
SdPage* pMasterPage = (pDrawViewShell && pDrawViewShell->GetEditMode() == EditMode::Page) ? GetFirstMasterPage(rTransferable) : nullptr; if (pMasterPage)
AssignMasterPage (rTransferable, pMasterPage); else
InsertSlides (rTransferable, DetermineInsertPosition ());
}
sal_uInt16 nBMPage = pDocument->GetPageByName (
sName, bIsMasterPage); if ( ! bIsMasterPage)
{ // At least one regular slide: return NULL to indicate // that not all bookmarks point to master pages.
pFirstMasterPage = nullptr; break;
} elseif (pFirstMasterPage == nullptr)
{ // Remember the first master page for later. if (nBMPage != SDRPAGE_NOTFOUND)
pFirstMasterPage = static_cast<SdPage*>(
pDocument->GetMasterPage(nBMPage));
}
}
} while (false);
}
// Get the target page to which the master page is assigned.
SdrPageView* pPageView = mrView.GetSdrPageView(); if (pPageView == nullptr) return;
SdPage* pPage = static_cast<SdPage*>(pPageView->GetPage()); if (pPage == nullptr) return;
SdDrawDocument& rDocument = mrView.GetDoc();
if ( ! rTransferable.HasPageBookmarks()) return;
DrawDocShell* pDataDocShell = rTransferable.GetPageDocShell(); if (pDataDocShell == nullptr) return;
SdDrawDocument* pSourceDocument = pDataDocShell->GetDoc(); if (pSourceDocument == nullptr) return;
// We have to remove the layout suffix from the layout name which is // appended again by SetMasterPage() to the given name. Don't ask.
OUString sLayoutSuffix = SD_LT_SEPARATOR + STR_LAYOUT_OUTLINE;
sal_Int32 nLength = sLayoutSuffix.getLength();
OUString sLayoutName = pMasterPage->GetLayoutName(); if (sLayoutName.endsWith(sLayoutSuffix))
sLayoutName = sLayoutName.copy(0, sLayoutName.getLength() - nLength);
rDocument.SetMasterPage (
pPage->GetPageNum() / 2,
sLayoutName,
pSourceDocument, false, // Exchange the master page of only the target page. false// Keep unused master pages.
);
}
// Insert position is the behind the last selected page or behind the // last page when the selection is empty.
sal_uInt16 nInsertPos = rDoc.GetSdPageCount( PageKind::Standard ) * 2 + 1; for( sal_uInt16 nPage = 0; nPage < nPgCnt; nPage++ )
{
SdPage* pPage = rDoc.GetSdPage( nPage, PageKind::Standard );
// Prepare the insertion. const std::vector<OUString> *pBookmarkList = nullptr;
DrawDocShell* pDataDocSh; if (rTransferable.HasPageBookmarks())
{ // When the transferable contains page bookmarks then the referenced // pages are inserted.
pBookmarkList = &rTransferable.GetPageBookmarks();
pDataDocSh = rTransferable.GetPageDocShell();
nInsertPgCnt = static_cast<sal_uInt16>(pBookmarkList->size());
} else
{ // Otherwise all pages of the document of the transferable are // inserted.
SfxObjectShell* pShell = rTransferable.GetDocShell().get();
pDataDocSh = static_cast<DrawDocShell*>(pShell);
SdDrawDocument* pDataDoc = pDataDocSh->GetDoc();
if (&rTransferable == SdModule::get()->pTransferDrag)
{ // This is a drag and drop operation
rDoc.DropBookmarkAsPage(
pBookmarkList ? *pBookmarkList : std::vector<OUString>(),
nInsertPosition,
pDataDocSh,
bMergeMasterPages);
} else
{ // This is a regular paste operation
rDoc.PasteBookmarkAsPage(
pBookmarkList ? *pBookmarkList : std::vector<OUString>(),
nullptr,
nInsertPosition,
pDataDocSh,
bMergeMasterPages);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.