2008/03/19 10:38:40 af 1.1.2.7: #i18486# Handle correctly the case of the slide sorter in the cente pane. 2008/03/05 17:22:34 af 1.1.2.6: #i86733# Code cleanup. 2008/01/21 13:45:57 af 1.1.2.5: #i18486# Dropped the use of XDrawPage references by SlsCurrentSlideManager in order to properly work with slideshows that have multiple references to one slide. 2007/12/12 13:37:14 af 1.1.2.4: #i18486# Added PrepareModelChange(). 2007/08/01 11:32:58 af 1.1.2.3: #i18486# Added HandleModelChange() method. 2007/07/25 12:21:13 af 1.1.2.2: #i18486# Added support for highlight object. 2007/04/26 12:21:51 af 1.1.2.1: #i75317# Initial revision.
		
			
				
	
	
		
			282 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*************************************************************************
 | |
|  *
 | |
|  *  OpenOffice.org - a multi-platform office productivity suite
 | |
|  *
 | |
|  *  $RCSfile: SlsCurrentSlideManager.cxx,v $
 | |
|  *
 | |
|  *  $Revision: 1.2 $
 | |
|  *
 | |
|  *  last change: $Author: kz $ $Date: 2008-04-03 14:24:16 $
 | |
|  *
 | |
|  *  The Contents of this file are made available subject to
 | |
|  *  the terms of GNU Lesser General Public License Version 2.1.
 | |
|  *
 | |
|  *
 | |
|  *    GNU Lesser General Public License Version 2.1
 | |
|  *    =============================================
 | |
|  *    Copyright 2005 by Sun Microsystems, Inc.
 | |
|  *    901 San Antonio Road, Palo Alto, CA 94303, USA
 | |
|  *
 | |
|  *    This library is free software; you can redistribute it and/or
 | |
|  *    modify it under the terms of the GNU Lesser General Public
 | |
|  *    License version 2.1, as published by the Free Software Foundation.
 | |
|  *
 | |
|  *    This library 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 for more details.
 | |
|  *
 | |
|  *    You should have received a copy of the GNU Lesser General Public
 | |
|  *    License along with this library; if not, write to the Free Software
 | |
|  *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 | |
|  *    MA  02111-1307  USA
 | |
|  *
 | |
|  ************************************************************************/
 | |
| 
 | |
| #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 "view/SlsHighlightObject.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();
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 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);
 | |
|             view::HighlightObject* pObject = mrSlideSorter.GetController().GetHighlightObject();
 | |
|             if (pObject != NULL)
 | |
|                 pObject->SetSlide(mpCurrentSlide);
 | |
|             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 (mpCurrentSlide.get() != NULL)
 | |
|     {
 | |
|         mpCurrentSlide = mrSlideSorter.GetModel().GetPageDescriptor(
 | |
|             mpCurrentSlide->GetPageIndex());
 | |
|         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
 |