summaryrefslogtreecommitdiff
path: root/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx')
-rw-r--r--sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx271
1 files changed, 271 insertions, 0 deletions
diff --git a/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
new file mode 100644
index 000000000000..5fdee6400959
--- /dev/null
+++ b/sd/source/ui/slidesorter/controller/SlsCurrentSlideManager.cxx
@@ -0,0 +1,271 @@
+/*************************************************************************
+ *
+ * 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);
+ }
+}
+
+
+
+
+SdPage* GetCurrentSdPage (SlideSorter& rSlideSorter)
+{
+ SharedPageDescriptor pDescriptor (
+ rSlideSorter.GetController().GetCurrentSlideManager()->GetCurrentSlide());
+ if (pDescriptor.get() == NULL)
+ return NULL;
+ else
+ return pDescriptor->GetPage();
+}
+
+
+
+} } } // end of namespace ::sd::slidesorter::controller