// First try to guess the right index.
Reference<beans::XPropertySet> xSet (rxSlide, UNO_QUERY); if (xSet.is())
{ try
{ const Any aNumber (xSet->getPropertyValue(u"Number"_ustr));
sal_Int16 nNumber (-1);
aNumber >>= nNumber;
nNumber -= 1;
SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false)); if (pDescriptor
&& pDescriptor->GetXDrawPage() == rxSlide)
{ return nNumber;
}
} catch (uno::Exception&)
{
DBG_UNHANDLED_EXCEPTION("sd");
}
}
// Guess was wrong, iterate over all slides and search for the right // one. const sal_Int32 nCount (maPageDescriptors.size()); for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
{
SharedPageDescriptor pDescriptor (maPageDescriptors[nIndex]);
// Make sure that the descriptor exists. Without it the given slide // can not be found. if (!pDescriptor)
{ // Call GetPageDescriptor() to create the missing descriptor.
pDescriptor = GetPageDescriptor(nIndex);
}
if (pDescriptor->GetXDrawPage() == rxSlide) return nIndex;
}
// First try to guess the right index.
sal_Int16 nNumber ((pPage->GetPageNum()-1)/2);
SharedPageDescriptor pDescriptor (GetPageDescriptor(nNumber, false)); if (pDescriptor
&& pDescriptor->GetPage() == pPage)
{ return nNumber;
}
// Guess was wrong, iterate over all slides and search for the right // one. const sal_Int32 nCount (maPageDescriptors.size()); for (sal_Int32 nIndex=0; nIndex<nCount; ++nIndex)
{
pDescriptor = maPageDescriptors[nIndex];
// Make sure that the descriptor exists. Without it the given slide // can not be found. if (!pDescriptor)
{ // Call GetPageDescriptor() to create the missing descriptor.
pDescriptor = GetPageDescriptor(nIndex);
}
if (pDescriptor->GetPage() == pPage) return nIndex;
}
/** For now this method uses a trivial algorithm: throw away all descriptors andcreatethemanew(ondemand).Themainproblemthatwearefacing whendesigningabetteralgorithmisthatwecannotcomparepointersto pagesstoredinthePageDescriptorobjectsandthoseobtainedfromthe document:pagesmayhavebeendeletedandothersmayhavebeencreated attheexactsamememorylocations.
*/ void SlideSorterModel::Resync()
{
::osl::MutexGuard aGuard (maMutex);
// Check if document and this model really differ. bool bIsUpToDate (true);
SdDrawDocument* pDocument = GetDocument(); if (pDocument!=nullptr && maPageDescriptors.size()==pDocument->GetSdPageCount(PageKind::Standard))
{ for (sal_Int32 nIndex=0,nCount=maPageDescriptors.size(); nIndex<nCount; ++nIndex)
{ if (maPageDescriptors[nIndex]
&& maPageDescriptors[nIndex]->GetPage()
!= GetPage(nIndex))
{
SAL_INFO("sd.sls", "page " << nIndex << " differs");
bIsUpToDate = false; break;
}
}
} else
{
bIsUpToDate = false;
}
if ( ! bIsUpToDate)
{
SynchronizeDocumentSelection(); // Try to make the current selection persistent.
ClearDescriptorList ();
AdaptSize();
SynchronizeModelSelection();
mrSlideSorter.GetController().GetPageSelector().CountSelectedPages();
}
CheckModel(*this);
}
for (auto& rxDescriptor : aDescriptors)
{ if (rxDescriptor != nullptr)
{ if (rxDescriptor.use_count() > 1)
{
SAL_INFO( "sd.sls", "trying to delete page descriptor that is still used with" " count " << rxDescriptor.use_count()); // No assertion here because that can hang the office when // opening a dialog from here.
}
rxDescriptor.reset();
}
}
}
// Make the current selection persistent and then release the // current set of pages.
SynchronizeDocumentSelection();
mxSlides = nullptr;
ClearDescriptorList ();
// Reset the current page to cause everybody to release references to it.
mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(-1);
// Set the new set of pages.
mxSlides = rxSlides;
AdaptSize();
SynchronizeModelSelection();
mrSlideSorter.GetController().GetPageSelector().CountSelectedPages();
ViewShell& rViewShell = mrSlideSorter.GetViewShell();
SdPage* pPage = rViewShell.getCurrentPage(); if (pPage != nullptr)
mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
pPage); else
{ // No current page. This can only be when the slide sorter is // the main view shell. Get current slide form frame view. const FrameView* pFrameView = rViewShell.GetFrameView(); if (pFrameView != nullptr)
mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
pFrameView->GetSelectedPage()); else
{ // No frame view. As a last resort use the first slide as // current slide.
mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(
sal_Int32(0));
}
}
// Get the list of pages according to the edit mode.
Reference<frame::XController> xController (mrSlideSorter.GetXController()); if (xController.is())
{ switch (meEditMode)
{ case EditMode::MasterPage:
{
Reference<drawing::XMasterPagesSupplier> xSupplier (
xController->getModel(), UNO_QUERY); if (xSupplier.is())
{
xPages = xSupplier->getMasterPages();
}
} break;
case EditMode::Page:
{
Reference<drawing::XDrawPagesSupplier> xSupplier (
xController->getModel(), UNO_QUERY); if (xSupplier.is())
{
xPages = xSupplier->getDrawPages();
}
} break;
default: // We should never get here.
assert(false); break;
}
}
SdPage* pPage = const_cast<SdPage*>(dynamic_cast<const SdPage*>(pSdrPage)); if (pPage == nullptr) returnfalse;
// We are only interested in pages that are currently served by this // model. if (pPage->GetPageKind() != PageKind::Standard) returnfalse; if (pPage->IsMasterPage() != (meEditMode==EditMode::MasterPage)) returnfalse;
//NotifyPageEvent is called for add, remove, *and* change position so for //the change position case we must ensure we don't end up with the slide //duplicated in our list bool bSelected = DeleteSlide(pPage); if (pPage->IsInserted())
{
InsertSlide(pPage, bSelected);
}
CheckModel(*this);
returntrue;
}
void SlideSorterModel::InsertSlide(SdPage* pPage, bool bMarkSelected)
{ // Find the index at which to insert the given page.
sal_uInt16 nCoreIndex (pPage->GetPageNum());
sal_Int32 nIndex (FromCoreIndex(nCoreIndex)); if (pPage != GetPage(nIndex)) return;
// Check that the pages in the document before and after the given page // are present in this model. if (nIndex>0) if (GetPage(nIndex-1) != GetPageDescriptor(nIndex-1)->GetPage()) return; if (nIndex < static_cast<sal_Int32>(maPageDescriptors.size()) -1) if (GetPage(nIndex+1) != GetPageDescriptor(nIndex)->GetPage()) return;
auto iter = maPageDescriptors.begin() + nIndex;
// Insert the given page at index nIndex
iter = maPageDescriptors.insert(
iter,
std::make_shared<PageDescriptor>(
Reference<drawing::XDrawPage>(mxSlides->getByIndex(nIndex),UNO_QUERY),
pPage,
nIndex));
if (bMarkSelected)
(*iter)->SetState(PageDescriptor::ST_Selected, true);
// Caution, GetIndex() may be negative since it uses GetPageNumber()-1 // for calculation, so do this only when page is inserted, else the // GetPageNumber() will be zero and thus GetIndex() == -1 if(pPage->IsInserted())
{
nIndex = GetIndex(pPage);
} else
{ // if not inserted, search for page for(; nIndex < static_cast<sal_Int32>(maPageDescriptors.size()); nIndex++)
{ if(maPageDescriptors[nIndex]->GetPage() == pPage)
{ break;
}
}
}
bool bMarkedSelected(false);
if(nIndex >= 0 && o3tl::make_unsigned(nIndex) < maPageDescriptors.size())
{ if (maPageDescriptors[nIndex]) if (maPageDescriptors[nIndex]->GetPage() != pPage) returnfalse;
auto iter = maPageDescriptors.begin() + nIndex;
bMarkedSelected = (*iter)->HasState(PageDescriptor::ST_Selected);
maPageDescriptors.erase(iter);
UpdateIndices(nIndex);
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.