diff options
Diffstat (limited to 'sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx')
-rwxr-xr-x | sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx | 256 |
1 files changed, 256 insertions, 0 deletions
diff --git a/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx new file mode 100755 index 000000000000..f5864c3307a1 --- /dev/null +++ b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx @@ -0,0 +1,256 @@ +/************************************************************************* + * + * 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 + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "precompiled_sd.hxx" + +#include "SlideSorter.hxx" +#include "model/SlideSorterModel.hxx" +#include "model/SlsPageDescriptor.hxx" +#include "controller/SlsPageSelector.hxx" +#include "controller/SlideSorterController.hxx" +#include "controller/SlsCurrentSlideManager.hxx" +#include "view/SlideSorterView.hxx" +#include "view/SlsPageObjectViewObjectContact.hxx" +#include "ViewShellBase.hxx" +#include "ViewShell.hxx" +#include "DrawViewShell.hxx" +#include "sdpage.hxx" +#include "FrameView.hxx" +#include <com/sun/star/beans/XPropertySet.hpp> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + +using namespace ::sd::slidesorter::model; + +namespace sd { namespace slidesorter { namespace controller { + +CurrentSlideManager::CurrentSlideManager (SlideSorter& rSlideSorter) + : mrSlideSorter(rSlideSorter), + mnCurrentSlideIndex(-1), + mpCurrentSlide() +{ +} + + + + +CurrentSlideManager::~CurrentSlideManager (void) +{ +} + + + + +void CurrentSlideManager::CurrentSlideHasChanged (const sal_Int32 nSlideIndex) +{ + if (mnCurrentSlideIndex != nSlideIndex) + { + ReleaseCurrentSlide(); + AcquireCurrentSlide(nSlideIndex); + + // Update the selection. + mrSlideSorter.GetController().GetPageSelector().DeselectAllPages(); + if (mpCurrentSlide.get() != NULL) + mrSlideSorter.GetController().GetPageSelector().SelectPage(mpCurrentSlide); + } +} + + + + +void CurrentSlideManager::ReleaseCurrentSlide (void) +{ + if (mpCurrentSlide.get() != NULL) + { + mpCurrentSlide->SetIsCurrentPage(false); + mrSlideSorter.GetView().RequestRepaint(mpCurrentSlide); + } + + mpCurrentSlide.reset(); + mnCurrentSlideIndex = -1; +} + + + + +bool CurrentSlideManager::IsCurrentSlideIsValid (void) +{ + return mnCurrentSlideIndex >= 0 && mnCurrentSlideIndex<mrSlideSorter.GetModel().GetPageCount(); +} + + + + +void CurrentSlideManager::AcquireCurrentSlide (const sal_Int32 nSlideIndex) +{ + mnCurrentSlideIndex = nSlideIndex; + + if (IsCurrentSlideIsValid()) + { + // Get a descriptor for the XDrawPage reference. Note that the + // given XDrawPage may or may not be member of the slide sorter + // document. + mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor(mnCurrentSlideIndex); + if (mpCurrentSlide.get() != NULL) + { + mpCurrentSlide->SetIsCurrentPage(true); + mrSlideSorter.GetView().RequestRepaint(mpCurrentSlide); + } + } +} + + + + +void CurrentSlideManager::SwitchCurrentSlide (const sal_Int32 nSlideIndex) +{ + SwitchCurrentSlide(mrSlideSorter.GetModel().GetPageDescriptor(nSlideIndex)); +} + + + + +void CurrentSlideManager::SwitchCurrentSlide (const SharedPageDescriptor& rpDescriptor) +{ + if (rpDescriptor.get() != NULL) + { + mpCurrentSlide = rpDescriptor; + mnCurrentSlideIndex = (rpDescriptor->GetPage()->GetPageNum()-1)/2; + + ViewShell* pViewShell = mrSlideSorter.GetViewShell(); + if (pViewShell != NULL && pViewShell->IsMainViewShell()) + { + FrameView* pFrameView = pViewShell->GetFrameView(); + if (pFrameView != NULL) + pFrameView->SetSelectedPage(sal::static_int_cast<USHORT>(mnCurrentSlideIndex)); + } + else + { + // Set current page. At the moment we have to do this in two + // different ways. The UNO way is the preferable one but, alas, + // it does not work always correctly (after some kinds of model + // changes). Therefore, we call DrawViewShell::SwitchPage(), + // too. + SetCurrentSlideAtViewShellBase(rpDescriptor); + SetCurrentSlideAtXController(rpDescriptor); + } + } +} + + + + +void CurrentSlideManager::SetCurrentSlideAtViewShellBase (const SharedPageDescriptor& rpDescriptor) +{ + OSL_ASSERT(rpDescriptor.get() != NULL); + + ViewShellBase* pBase = mrSlideSorter.GetViewShellBase(); + if (pBase != NULL) + { + DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>( + pBase->GetMainViewShell().get()); + if (pDrawViewShell != NULL) + { + USHORT nPageNumber = (rpDescriptor->GetPage()->GetPageNum()-1)/2; + pDrawViewShell->SwitchPage(nPageNumber); + pDrawViewShell->GetPageTabControl()->SetCurPageId(nPageNumber+1); + } + /* + else + { + presenter::PresenterViewShell* pPresenterViewShell + = dynamic_cast<presenter::PresenterViewShell*>(pBase->GetMainViewShell()); + if (pPresenterViewShell != NULL) + { + pPresenterViewShell->SetCurrentSlide( + Reference<drawing::XDrawPage>( + rpDescriptor->GetPage()->getUnoPage(), UNO_QUERY)); + } + } + */ + } +} + + + + +void CurrentSlideManager::SetCurrentSlideAtXController (const SharedPageDescriptor& rpDescriptor) +{ + OSL_ASSERT(rpDescriptor.get() != NULL); + + try + { + Reference<beans::XPropertySet> xSet (mrSlideSorter.GetXController(), UNO_QUERY); + if (xSet.is()) + { + Any aPage; + aPage <<= rpDescriptor->GetPage()->getUnoPage(); + xSet->setPropertyValue ( + String::CreateFromAscii("CurrentPage"), + aPage); + } + } + catch (beans::UnknownPropertyException aException) + { + // We have not been able to set the current page at the main view. + // This is sad but still leaves us in a valid state. Therefore, + // this exception is silently ignored. + } +} + + + + +SharedPageDescriptor CurrentSlideManager::GetCurrentSlide (void) +{ + return mpCurrentSlide; +} + + + + +void CurrentSlideManager::PrepareModelChange (void) +{ + mpCurrentSlide.reset(); +} + + + + +void CurrentSlideManager::HandleModelChange (void) +{ + if (mnCurrentSlideIndex >= 0) + { + mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor( + mnCurrentSlideIndex); + if (mpCurrentSlide.get() != NULL) + mpCurrentSlide->SetIsCurrentPage(true); + } +} + +} } } // end of namespace ::sd::slidesorter::controller |