/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "precompiled_sd.hxx" #include "controller/SlsPageSelector.hxx" #include "SlideSorter.hxx" #include "SlideSorterViewShell.hxx" #include "controller/SlideSorterController.hxx" #include "controller/SlsSelectionManager.hxx" #include "model/SlsPageDescriptor.hxx" #include "model/SlsPageEnumerationProvider.hxx" #include "model/SlideSorterModel.hxx" #include "view/SlideSorterView.hxx" #include "sdpage.hxx" #include "ViewShell.hxx" #include "DrawViewShell.hxx" #include "ViewShellBase.hxx" #include #include 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 { PageSelector::PageSelector (SlideSorter& rSlideSorter) : mrModel(rSlideSorter.GetModel()), mrSlideSorter(rSlideSorter), mrController(mrSlideSorter.GetController()), mnSelectedPageCount(0), mnBroadcastDisableLevel(0), mbSelectionChangeBroadcastPending(false), mpMostRecentlySelectedPage(), mpSelectionAnchor() { CountSelectedPages (); } void PageSelector::SelectAllPages (void) { int nPageCount = mrModel.GetPageCount(); for (int nPageIndex=0; nPageIndexUpdateSelection()) { mrSlideSorter.GetView().RequestRepaint(pDescriptor); bSelectionHasChanged = true; } if (pDescriptor->IsSelected()) mnSelectedPageCount++; } if (bSelectionHasChanged) { if (mnBroadcastDisableLevel > 0) mbSelectionChangeBroadcastPending = true; else mrController.GetSelectionManager()->SelectionHasChanged(); } } void PageSelector::SelectPage (int nPageIndex) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get() != NULL) SelectPage(pDescriptor); } void PageSelector::SelectPage (const SdPage* pPage) { int nPageIndex = (pPage->GetPageNum()-1) / 2; SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get()!=NULL && pDescriptor->GetPage()==pPage) SelectPage(pDescriptor); } void PageSelector::SelectPage (const SharedPageDescriptor& rpDescriptor) { if (rpDescriptor.get()!=NULL && rpDescriptor->Select()) { mnSelectedPageCount ++; mrSlideSorter.GetView().RequestRepaint(rpDescriptor); mpMostRecentlySelectedPage = rpDescriptor; if (mpSelectionAnchor == NULL) mpSelectionAnchor = rpDescriptor; if (mnBroadcastDisableLevel > 0) mbSelectionChangeBroadcastPending = true; else mrController.GetSelectionManager()->SelectionHasChanged(); } } void PageSelector::DeselectPage (int nPageIndex) { model::SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get() != NULL) DeselectPage(pDescriptor); } void PageSelector::DeselectPage (const SharedPageDescriptor& rpDescriptor) { if (rpDescriptor.get()!=NULL && rpDescriptor->Deselect()) { mnSelectedPageCount --; mrSlideSorter.GetView().RequestRepaint(rpDescriptor); if (mpMostRecentlySelectedPage == rpDescriptor) mpMostRecentlySelectedPage.reset(); if (mnBroadcastDisableLevel > 0) mbSelectionChangeBroadcastPending = true; else mrController.GetSelectionManager()->SelectionHasChanged(); } } bool PageSelector::IsPageSelected (int nPageIndex) { SharedPageDescriptor pDescriptor (mrModel.GetPageDescriptor(nPageIndex)); if (pDescriptor.get() != NULL) return pDescriptor->IsSelected(); else return false; } int PageSelector::GetPageCount (void) const { return mrModel.GetPageCount(); } int PageSelector::GetSelectedPageCount (void) const { return mnSelectedPageCount; } void PageSelector::PrepareModelChange (void) { DeselectAllPages (); } void PageSelector::HandleModelChange (void) { UpdateAllPages(); } SharedPageDescriptor PageSelector::GetMostRecentlySelectedPage (void) const { return mpMostRecentlySelectedPage; } SharedPageDescriptor PageSelector::GetSelectionAnchor (void) const { return mpSelectionAnchor; } void PageSelector::CountSelectedPages (void) { mnSelectedPageCount = 0; model::PageEnumeration aSelectedPages ( model::PageEnumerationProvider::CreateSelectedPagesEnumeration(mrModel)); while (aSelectedPages.HasMoreElements()) { mnSelectedPageCount++; aSelectedPages.GetNextElement(); } } void PageSelector::EnableBroadcasting (bool bMakeSelectionVisible) { if (mnBroadcastDisableLevel > 0) mnBroadcastDisableLevel --; if (mnBroadcastDisableLevel==0 && mbSelectionChangeBroadcastPending) { mrController.GetSelectionManager()->SelectionHasChanged(bMakeSelectionVisible); mbSelectionChangeBroadcastPending = false; } } void PageSelector::DisableBroadcasting (void) { mnBroadcastDisableLevel ++; } ::boost::shared_ptr PageSelector::GetPageSelection (void) const { ::boost::shared_ptr pSelection (new PageSelection()); pSelection->reserve(GetSelectedPageCount()); int nPageCount = GetPageCount(); for (int nIndex=0; nIndexIsSelected()) pSelection->push_back(pDescriptor->GetPage()); } return pSelection; } void PageSelector::SetPageSelection (const ::boost::shared_ptr& rpSelection) { PageSelection::const_iterator iPage; for (iPage=rpSelection->begin(); iPage!=rpSelection->end(); ++iPage) SelectPage(*iPage); } } } } // end of namespace ::sd::slidesorter::controller