diff options
Diffstat (limited to 'sd/source/ui/slidesorter/controller/SlsPageSelector.cxx')
-rw-r--r--[-rwxr-xr-x] | sd/source/ui/slidesorter/controller/SlsPageSelector.cxx | 254 |
1 files changed, 209 insertions, 45 deletions
diff --git a/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx index 0e8f5e100d1c..51eb81fae214 100755..100644 --- a/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx +++ b/sd/source/ui/slidesorter/controller/SlsPageSelector.cxx @@ -33,6 +33,9 @@ #include "SlideSorterViewShell.hxx" #include "controller/SlideSorterController.hxx" #include "controller/SlsSelectionManager.hxx" +#include "controller/SlsAnimator.hxx" +#include "controller/SlsCurrentSlideManager.hxx" +#include "controller/SlsVisibleAreaManager.hxx" #include "model/SlsPageDescriptor.hxx" #include "model/SlsPageEnumerationProvider.hxx" #include "model/SlideSorterModel.hxx" @@ -44,14 +47,16 @@ #include "ViewShellBase.hxx" #include <com/sun/star/drawing/XDrawView.hpp> #include <com/sun/star/beans/XPropertySet.hpp> +#include <boost/bind.hpp> + using namespace ::com::sun::star; using namespace ::com::sun::star::uno; using namespace ::sd::slidesorter::model; using namespace ::sd::slidesorter::view; -namespace sd { namespace slidesorter { namespace controller { +namespace sd { namespace slidesorter { namespace controller { PageSelector::PageSelector (SlideSorter& rSlideSorter) : mrModel(rSlideSorter.GetModel()), @@ -61,7 +66,10 @@ PageSelector::PageSelector (SlideSorter& rSlideSorter) mnBroadcastDisableLevel(0), mbSelectionChangeBroadcastPending(false), mpMostRecentlySelectedPage(), - mpSelectionAnchor() + mpSelectionAnchor(), + mpCurrentPage(), + mnUpdateLockCount(0), + mbIsUpdateCurrentPagePending(false) { CountSelectedPages (); } @@ -71,9 +79,12 @@ PageSelector::PageSelector (SlideSorter& rSlideSorter) void PageSelector::SelectAllPages (void) { + VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter); + PageSelector::UpdateLock aLock (*this); + int nPageCount = mrModel.GetPageCount(); for (int nPageIndex=0; nPageIndex<nPageCount; nPageIndex++) - SelectPage (nPageIndex); + SelectPage(nPageIndex); } @@ -81,21 +92,26 @@ void PageSelector::SelectAllPages (void) void PageSelector::DeselectAllPages (void) { + VisibleAreaManager::TemporaryDisabler aDisabler (mrSlideSorter); + PageSelector::UpdateLock aLock (*this); + int nPageCount = mrModel.GetPageCount(); for (int nPageIndex=0; nPageIndex<nPageCount; nPageIndex++) - DeselectPage (nPageIndex); + DeselectPage(nPageIndex); + DBG_ASSERT (mnSelectedPageCount==0, "PageSelector::DeselectAllPages: the selected pages counter is not 0"); mnSelectedPageCount = 0; - mpMostRecentlySelectedPage.reset(); mpSelectionAnchor.reset(); } -void PageSelector::UpdateAllPages (void) +void PageSelector::GetCoreSelection (void) { + PageSelector::UpdateLock aLock (*this); + bool bSelectionHasChanged (true); mnSelectedPageCount = 0; model::PageEnumeration aAllPages ( @@ -103,13 +119,14 @@ void PageSelector::UpdateAllPages (void) while (aAllPages.HasMoreElements()) { model::SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); - if (pDescriptor->UpdateSelection()) + if (pDescriptor->GetCoreSelection()) { + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(pDescriptor); mrSlideSorter.GetView().RequestRepaint(pDescriptor); bSelectionHasChanged = true; } - if (pDescriptor->IsSelected()) + if (pDescriptor->HasState(PageDescriptor::ST_Selected)) mnSelectedPageCount++; } @@ -125,6 +142,20 @@ void PageSelector::UpdateAllPages (void) +void PageSelector::SetCoreSelection (void) +{ + model::PageEnumeration aAllPages ( + model::PageEnumerationProvider::CreateAllPagesEnumeration(mrModel)); + while (aAllPages.HasMoreElements()) + { + model::SharedPageDescriptor pDescriptor (aAllPages.GetNextElement()); + pDescriptor->SetCoreSelection(); + } +} + + + + void PageSelector::SelectPage (int nPageIndex) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); @@ -137,7 +168,7 @@ void PageSelector::SelectPage (int nPageIndex) void PageSelector::SelectPage (const SdPage* pPage) { - int nPageIndex = (pPage->GetPageNum()-1) / 2; + const sal_Int32 nPageIndex (mrModel.GetIndex(pPage)); SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get()!=NULL && pDescriptor->GetPage()==pPage) SelectPage(pDescriptor); @@ -148,9 +179,11 @@ void PageSelector::SelectPage (const SdPage* pPage) void PageSelector::SelectPage (const SharedPageDescriptor& rpDescriptor) { - if (rpDescriptor.get()!=NULL && rpDescriptor->Select()) + if (rpDescriptor.get()!=NULL + && mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, true)) { - mnSelectedPageCount ++; + ++mnSelectedPageCount; + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor,true); mrSlideSorter.GetView().RequestRepaint(rpDescriptor); mpMostRecentlySelectedPage = rpDescriptor; @@ -161,27 +194,49 @@ void PageSelector::SelectPage (const SharedPageDescriptor& rpDescriptor) mbSelectionChangeBroadcastPending = true; else mrController.GetSelectionManager()->SelectionHasChanged(); + UpdateCurrentPage(); + + CheckConsistency(); } } -void PageSelector::DeselectPage (int nPageIndex) +void PageSelector::DeselectPage ( + int nPageIndex, + const bool bUpdateCurrentPage) { model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get() != NULL) - DeselectPage(pDescriptor); + DeselectPage(pDescriptor, bUpdateCurrentPage); } -void PageSelector::DeselectPage (const SharedPageDescriptor& rpDescriptor) +void PageSelector::DeselectPage ( + const SdPage* pPage, + const bool bUpdateCurrentPage) { - if (rpDescriptor.get()!=NULL && rpDescriptor->Deselect()) + const sal_Int32 nPageIndex (mrModel.GetIndex(pPage)); + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + if (pDescriptor.get()!=NULL && pDescriptor->GetPage()==pPage) + DeselectPage(pDescriptor, bUpdateCurrentPage); +} + + + + +void PageSelector::DeselectPage ( + const SharedPageDescriptor& rpDescriptor, + const bool bUpdateCurrentPage) +{ + if (rpDescriptor.get()!=NULL + && mrSlideSorter.GetView().SetState(rpDescriptor, PageDescriptor::ST_Selected, false)) { - mnSelectedPageCount --; + --mnSelectedPageCount; + mrSlideSorter.GetController().GetVisibleAreaManager().RequestVisible(rpDescriptor); mrSlideSorter.GetView().RequestRepaint(rpDescriptor); if (mpMostRecentlySelectedPage == rpDescriptor) mpMostRecentlySelectedPage.reset(); @@ -189,6 +244,29 @@ void PageSelector::DeselectPage (const SharedPageDescriptor& rpDescriptor) mbSelectionChangeBroadcastPending = true; else mrController.GetSelectionManager()->SelectionHasChanged(); + if (bUpdateCurrentPage) + UpdateCurrentPage(); + + CheckConsistency(); + } +} + + + + +void PageSelector::CheckConsistency (void) const +{ + int nSelectionCount (0); + for (int nPageIndex=0,nPageCount=mrModel.GetPageCount(); nPageIndex<nPageCount; nPageIndex++) + { + SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); + assert(pDescriptor); + if (pDescriptor->HasState(PageDescriptor::ST_Selected)) + ++nSelectionCount; + } + if (nSelectionCount!=mnSelectedPageCount) + { + assert(nSelectionCount==mnSelectedPageCount); } } @@ -199,7 +277,7 @@ bool PageSelector::IsPageSelected (int nPageIndex) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get() != NULL) - return pDescriptor->IsSelected(); + return pDescriptor->HasState(PageDescriptor::ST_Selected); else return false; } @@ -223,30 +301,6 @@ int PageSelector::GetSelectedPageCount (void) const -void PageSelector::PrepareModelChange (void) -{ - DeselectAllPages (); -} - - - - -void PageSelector::HandleModelChange (void) -{ - UpdateAllPages(); -} - - - - -SharedPageDescriptor PageSelector::GetMostRecentlySelectedPage (void) const -{ - return mpMostRecentlySelectedPage; -} - - - - SharedPageDescriptor PageSelector::GetSelectionAnchor (void) const { return mpSelectionAnchor; @@ -270,13 +324,13 @@ void PageSelector::CountSelectedPages (void) -void PageSelector::EnableBroadcasting (bool bMakeSelectionVisible) +void PageSelector::EnableBroadcasting (void) { if (mnBroadcastDisableLevel > 0) mnBroadcastDisableLevel --; if (mnBroadcastDisableLevel==0 && mbSelectionChangeBroadcastPending) { - mrController.GetSelectionManager()->SelectionHasChanged(bMakeSelectionVisible); + mrController.GetSelectionManager()->SelectionHasChanged(); mbSelectionChangeBroadcastPending = false; } } @@ -301,7 +355,7 @@ void PageSelector::DisableBroadcasting (void) for (int nIndex=0; nIndex<nPageCount; nIndex++) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nIndex)); - if (pDescriptor.get()!=NULL && pDescriptor->IsSelected()) + if (pDescriptor.get()!=NULL && pDescriptor->HasState(PageDescriptor::ST_Selected)) pSelection->push_back(pDescriptor->GetPage()); } @@ -311,14 +365,124 @@ void PageSelector::DisableBroadcasting (void) -void PageSelector::SetPageSelection (const ::boost::shared_ptr<PageSelection>& rpSelection) +void PageSelector::SetPageSelection ( + const ::boost::shared_ptr<PageSelection>& rpSelection, + const bool bUpdateCurrentPage) { PageSelection::const_iterator iPage; for (iPage=rpSelection->begin(); iPage!=rpSelection->end(); ++iPage) SelectPage(*iPage); + if (bUpdateCurrentPage) + UpdateCurrentPage(); } +void PageSelector::UpdateCurrentPage (const bool bUpdateOnlyWhenPending) +{ + if (mnUpdateLockCount > 0) + { + mbIsUpdateCurrentPagePending = true; + return; + } + + if ( ! mbIsUpdateCurrentPagePending && bUpdateOnlyWhenPending) + return; + + mbIsUpdateCurrentPagePending = false; + + // Make the first selected page the current page. + 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)) + { + // 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; + } + } + + // No page is selected. Do not change the current slide. +} + + + + +//===== PageSelector::UpdateLock ============================================== + +PageSelector::UpdateLock::UpdateLock (SlideSorter& rSlideSorter) + : mpSelector(&rSlideSorter.GetController().GetPageSelector()) +{ + ++mpSelector->mnUpdateLockCount; +} + + + + +PageSelector::UpdateLock::UpdateLock (PageSelector& rSelector) + : mpSelector(&rSelector) +{ + ++mpSelector->mnUpdateLockCount; +} + + + + +PageSelector::UpdateLock::~UpdateLock (void) +{ + Release(); +} + +void PageSelector::UpdateLock::Release (void) +{ + if (mpSelector != NULL) + { + --mpSelector->mnUpdateLockCount; + OSL_ASSERT(mpSelector->mnUpdateLockCount >= 0); + if (mpSelector->mnUpdateLockCount == 0) + mpSelector->UpdateCurrentPage(true); + + mpSelector = NULL; + } +} + + + + +//===== PageSelector::BroadcastLock ============================================== + +PageSelector::BroadcastLock::BroadcastLock (SlideSorter& rSlideSorter) + : mrSelector(rSlideSorter.GetController().GetPageSelector()) +{ + mrSelector.DisableBroadcasting(); +} + + + + +PageSelector::BroadcastLock::BroadcastLock (PageSelector& rSelector) + : mrSelector(rSelector) +{ + mrSelector.DisableBroadcasting(); +} + + + + +PageSelector::BroadcastLock::~BroadcastLock (void) +{ + mrSelector.EnableBroadcasting(); +} + } } } // end of namespace ::sd::slidesorter::controller |