Author: af Date: Fri Feb 21 11:55:33 2014 New Revision: 1570539 URL: http://svn.apache.org/r1570539 Log: 123197: Fixed selection problems when switching between normal and master mode.
Modified: openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlideSorterController.cxx openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx openoffice/trunk/main/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx openoffice/trunk/main/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx openoffice/trunk/main/sd/source/ui/slidesorter/model/SlideSorterModel.cxx openoffice/trunk/main/sd/source/ui/slidesorter/view/SlideSorterView.cxx openoffice/trunk/main/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx Modified: openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlideSorterController.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlideSorterController.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlideSorterController.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlideSorterController.cxx Fri Feb 21 11:55:33 2014 @@ -946,6 +946,8 @@ void SlideSorterController::FinishEditMo { if (mrModel.GetEditMode() == EM_MASTERPAGE) { + mpPageSelector->DeselectAllPages(); + // Search for the master page that was determined in // PrepareEditModeChange() and make it the current page. PageEnumeration aAllPages (PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); @@ -955,16 +957,20 @@ void SlideSorterController::FinishEditMo if (pDescriptor->GetPage() == mpEditModeChangeMasterPage) { GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor); + mpPageSelector->SelectPage(pDescriptor); break; } } } else { + PageSelector::BroadcastLock aBroadcastLock (*mpPageSelector); + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(mnCurrentPageBeforeSwitch)); GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor); // Restore the selection. + mpPageSelector->DeselectAllPages(); ::std::vector<SdPage*>::iterator iPage; for (iPage=maSelectionBeforeSwitch.begin(); iPage!=maSelectionBeforeSwitch.end(); @@ -1047,14 +1053,8 @@ void SlideSorterController::SetDocumentS { ModelChangeLock aLock (*this); PreModelChange(); - - mrModel.SetDocumentSlides(rxSlides); - mrView.Layout(); - // Select just the current slide. - PageSelector::BroadcastLock aBroadcastLock (*mpPageSelector); - mpPageSelector->DeselectAllPages(); - mpPageSelector->SelectPage(mpCurrentSlideManager->GetCurrentSlide()); + mrModel.SetDocumentSlides(rxSlides); } } Modified: openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx Fri Feb 21 11:55:33 2014 @@ -86,11 +86,14 @@ void CurrentSlideManager::NotifyCurrentS { if (mnCurrentSlideIndex != nSlideIndex) { + PageSelector::BroadcastLock aBroadcastLock (mrSlideSorter.GetController().GetPageSelector()); + + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + ReleaseCurrentSlide(); AcquireCurrentSlide(nSlideIndex); // Update the selection. - mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); if (mpCurrentSlide) { mrSlideSorter.GetController().GetPageSelector().SelectPage(mpCurrentSlide); Modified: openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx Fri Feb 21 11:55:33 2014 @@ -65,7 +65,7 @@ PageSelector::PageSelector (SlideSorter& mpSelectionAnchor(), mpCurrentPage(), mnUpdateLockCount(0), - mbIsUpdateCurrentPagePending(false) + mbIsUpdateCurrentPagePending(true) { CountSelectedPages (); } @@ -393,27 +393,39 @@ void PageSelector::UpdateCurrentPage (co mbIsUpdateCurrentPagePending = false; // Make the first selected page the current page. + SharedPageDescriptor pCurrentPageDescriptor; const sal_Int32 nPageCount (GetPageCount()); for (sal_Int32 nIndex=0; nIndex<nPageCount; ++nIndex) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); - if (pDescriptor && pDescriptor->HasState(PageDescriptor::ST_Selected)) + if ( ! pDescriptor) + continue; + if (pDescriptor->HasState(PageDescriptor::ST_Selected)) { - // Switching the current slide normally sets also the selection - // to just the new current slide. To prevent that, we store - // (and at the end of this scope restore) the current selection. - ::boost::shared_ptr<PageSelection> pSelection (GetPageSelection()); - - mrController.GetCurrentSlideManager()->SwitchCurrentSlide(pDescriptor); - - // Restore the selection and prevent a recursive call to - // UpdateCurrentPage(). - SetPageSelection(pSelection, false); - return; + pCurrentPageDescriptor = pDescriptor; + break; } } + if ( ! pCurrentPageDescriptor && nPageCount>0) + { + // No page is selected. Make the first slide the current page. + pCurrentPageDescriptor = mrModel.GetPageDescriptor(0); + } - // No page is selected. Do not change the current slide. + if (pCurrentPageDescriptor) + { + // Switching the current slide normally sets also the + // selection to just the new current slide. To prevent that, + // we store (and at the end of this scope restore) the current + // selection. + ::boost::shared_ptr<PageSelection> pSelection (GetPageSelection()); + + mrController.GetCurrentSlideManager()->SwitchCurrentSlide(pCurrentPageDescriptor); + + // Restore the selection and prevent a recursive call to + // UpdateCurrentPage(). + SetPageSelection(pSelection, false); + } } Modified: openoffice/trunk/main/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/inc/model/SlideSorterModel.hxx Fri Feb 21 11:55:33 2014 @@ -56,7 +56,7 @@ namespace sd { namespace slidesorter { n class DocumentPageContainer; inline sal_Int32 FromCoreIndex (const sal_uInt16 nCoreIndex) { return (nCoreIndex-1)/2; } -inline sal_uInt16 ToCoreIndex (const sal_Int32 nIndex) { return nIndex*2+1; } +inline sal_uInt16 ToCoreIndex (const sal_Int32 nIndex) { return static_cast<sal_uInt16>(nIndex*2+1); } /** The model of the slide sorter gives access to the slides that are to be displayed in the slide sorter view. Via the SetDocumentSlides() method Modified: openoffice/trunk/main/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/inc/view/SlideSorterView.hxx Fri Feb 21 11:55:33 2014 @@ -110,9 +110,9 @@ public: view::Layouter& GetLayouter (void); - virtual void ModelHasChanged (void); + virtual void ModelHasChanged (void); - void LocalModelHasChanged(void); + void LocalModelHasChanged(void); /** This method is typically called before a model change takes place. All references to model data are released. PostModelChange() has to Modified: openoffice/trunk/main/sd/source/ui/slidesorter/model/SlideSorterModel.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/model/SlideSorterModel.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/model/SlideSorterModel.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/model/SlideSorterModel.cxx Fri Feb 21 11:55:33 2014 @@ -173,7 +173,6 @@ bool SlideSorterModel::SetEditMode (Edit { meEditMode = eEditMode; UpdatePageList(); - ClearDescriptorList(); bEditModeChanged = true; } return bEditModeChanged; @@ -424,7 +423,8 @@ void SlideSorterModel::SynchronizeDocume while (aAllPages.HasMoreElements()) { SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); - pDescriptor->GetPage()->SetSelected(pDescriptor->HasState(PageDescriptor::ST_Selected)); + const bool bIsSelected (pDescriptor->HasState(PageDescriptor::ST_Selected)); + pDescriptor->GetPage()->SetSelected(bIsSelected); } } @@ -439,7 +439,8 @@ void SlideSorterModel::SynchronizeModelS while (aAllPages.HasMoreElements()) { SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); - pDescriptor->SetState(PageDescriptor::ST_Selected, pDescriptor->GetPage()->IsSelected()); + const bool bIsSelected (pDescriptor->GetPage()->IsSelected()); + pDescriptor->SetState(PageDescriptor::ST_Selected, bIsSelected); } } @@ -459,11 +460,29 @@ void SlideSorterModel::SetDocumentSlides { ::osl::MutexGuard aGuard (maMutex); - // Reset the current page so to cause everbody to release references to it. + // Make the current selection persistent and then release the + // current set of pages. + SynchronizeDocumentSelection(); + mxSlides = NULL; + ClearDescriptorList (); + + // Reset the current page to cause everbody to release references to it. mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange(-1); + // Set the new set of pages. mxSlides = rxSlides; - Resync(); + AdaptSize(); + SynchronizeModelSelection(); + mrSlideSorter.GetController().GetPageSelector().CountSelectedPages(); + + model::PageEnumeration aSelectedPages ( + model::PageEnumerationProvider::CreateSelectedPagesEnumeration(*this)); + if (aSelectedPages.HasMoreElements()) + { + SharedPageDescriptor pDescriptor (aSelectedPages.GetNextElement()); + mrSlideSorter.GetController().GetCurrentSlideManager()->NotifyCurrentSlideChange( + pDescriptor->GetPage()); + } ViewShell* pViewShell = mrSlideSorter.GetViewShell(); if (pViewShell != NULL) @@ -667,7 +686,6 @@ void SlideSorterModel::InsertSlide (SdPa // Update page indices. UpdateIndices(nIndex+1); - OSL_TRACE("page inserted"); } @@ -705,7 +723,6 @@ void SlideSorterModel::DeleteSlide (cons maPageDescriptors.erase(maPageDescriptors.begin()+nIndex); UpdateIndices(nIndex); } - OSL_TRACE("page removed"); } Modified: openoffice/trunk/main/sd/source/ui/slidesorter/view/SlideSorterView.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/view/SlideSorterView.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/view/SlideSorterView.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/view/SlideSorterView.cxx Fri Feb 21 11:55:33 2014 @@ -278,10 +278,10 @@ void SlideSorterView::ModelHasChanged (v void SlideSorterView::LocalModelHasChanged(void) { - mbModelChangedWhileModifyEnabled = false; - - // First call our base class. - View::ModelHasChanged (); + mbModelChangedWhileModifyEnabled = false; + + // First call our base class. + View::ModelHasChanged (); } Modified: openoffice/trunk/main/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx URL: http://svn.apache.org/viewvc/openoffice/trunk/main/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx?rev=1570539&r1=1570538&r2=1570539&view=diff ============================================================================== --- openoffice/trunk/main/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx (original) +++ openoffice/trunk/main/sd/source/ui/slidesorter/view/SlsViewCacheContext.cxx Fri Feb 21 11:55:33 2014 @@ -70,7 +70,9 @@ void ViewCacheContext::NotifyPreviewCrea } else { - OSL_ASSERT(pDescriptor); + // It is OK when a preview was created for a page that is not + // currently displayed because both normal and master pages are + // kept in the same cache. } }