1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir #include "precompiled_sd.hxx"
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include "SlideShowRestarter.hxx"
31*cdf0e10cSrcweir #include "framework/ConfigurationController.hxx"
32*cdf0e10cSrcweir #include "framework/FrameworkHelper.hxx"
33*cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
34*cdf0e10cSrcweir #include <sfx2/dispatch.hxx>
35*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
36*cdf0e10cSrcweir #include <svx/svxids.hrc>
37*cdf0e10cSrcweir #include <vcl/svapp.hxx>
38*cdf0e10cSrcweir #include <boost/bind.hpp>
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
41*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
42*cdf0e10cSrcweir using ::rtl::OUString;
43*cdf0e10cSrcweir using ::sd::framework::FrameworkHelper;
44*cdf0e10cSrcweir 
45*cdf0e10cSrcweir #define C2U(x) OUString( RTL_CONSTASCII_USTRINGPARAM(x) )
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir namespace sd {
48*cdf0e10cSrcweir 
49*cdf0e10cSrcweir SlideShowRestarter::SlideShowRestarter (
50*cdf0e10cSrcweir     const ::rtl::Reference<SlideShow>& rpSlideShow,
51*cdf0e10cSrcweir     ViewShellBase* pViewShellBase)
52*cdf0e10cSrcweir     : mnEventId(0),
53*cdf0e10cSrcweir       mpSlideShow(rpSlideShow),
54*cdf0e10cSrcweir       mpViewShellBase(pViewShellBase),
55*cdf0e10cSrcweir       mnDisplayCount(GetDisplayCount()),
56*cdf0e10cSrcweir       mpDispatcher(pViewShellBase->GetViewFrame()->GetDispatcher()),
57*cdf0e10cSrcweir       mnCurrentSlideNumber(0)
58*cdf0e10cSrcweir {
59*cdf0e10cSrcweir }
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir SlideShowRestarter::~SlideShowRestarter (void)
65*cdf0e10cSrcweir {
66*cdf0e10cSrcweir }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir 
69*cdf0e10cSrcweir 
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir void SlideShowRestarter::Restart (void)
72*cdf0e10cSrcweir {
73*cdf0e10cSrcweir     // Prevent multiple and concurrently restarts.
74*cdf0e10cSrcweir     if (mnEventId != 0)
75*cdf0e10cSrcweir         return;
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir     // Remember the current slide in order to restore it after the slide
78*cdf0e10cSrcweir     // show has been restarted.
79*cdf0e10cSrcweir     if (mpSlideShow.is())
80*cdf0e10cSrcweir         mnCurrentSlideNumber = mpSlideShow->getCurrentPageNumber();
81*cdf0e10cSrcweir 
82*cdf0e10cSrcweir     // Remember a shared pointer to this object to prevent its destruction
83*cdf0e10cSrcweir     // before the whole restarting process has finished.
84*cdf0e10cSrcweir     mpSelf = shared_from_this();
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir     // We do not know in what situation this method was called.  So, in
87*cdf0e10cSrcweir     // order to be able to cleanly stop the presentation, we do that
88*cdf0e10cSrcweir     // asynchronously.
89*cdf0e10cSrcweir     mnEventId = Application::PostUserEvent(
90*cdf0e10cSrcweir         LINK(this, SlideShowRestarter, EndPresentation));
91*cdf0e10cSrcweir }
92*cdf0e10cSrcweir 
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir sal_Int32 SlideShowRestarter::GetDisplayCount (void)
97*cdf0e10cSrcweir {
98*cdf0e10cSrcweir     const Reference<XComponentContext> xContext (
99*cdf0e10cSrcweir         ::comphelper::getProcessComponentContext() );
100*cdf0e10cSrcweir     Reference<XMultiComponentFactory> xFactory (
101*cdf0e10cSrcweir         xContext->getServiceManager(), UNO_QUERY);
102*cdf0e10cSrcweir     if ( ! xFactory.is())
103*cdf0e10cSrcweir         return 0;
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir     Reference<com::sun::star::container::XIndexAccess> xIndexAccess (
106*cdf0e10cSrcweir         xFactory->createInstanceWithContext(C2U("com.sun.star.awt.DisplayAccess"),xContext),
107*cdf0e10cSrcweir         UNO_QUERY);
108*cdf0e10cSrcweir     if ( ! xIndexAccess.is())
109*cdf0e10cSrcweir         return 0;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir     return xIndexAccess->getCount();
112*cdf0e10cSrcweir }
113*cdf0e10cSrcweir 
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 
117*cdf0e10cSrcweir IMPL_LINK(SlideShowRestarter, EndPresentation, void*, EMPTYARG)
118*cdf0e10cSrcweir {
119*cdf0e10cSrcweir     mnEventId = 0;
120*cdf0e10cSrcweir     if (mpSlideShow.is())
121*cdf0e10cSrcweir     {
122*cdf0e10cSrcweir         if (mnDisplayCount!=GetDisplayCount())
123*cdf0e10cSrcweir         {
124*cdf0e10cSrcweir             mpSlideShow->end();
125*cdf0e10cSrcweir 
126*cdf0e10cSrcweir             // The following piece of code should not be here because the
127*cdf0e10cSrcweir             // slide show should be aware of the existence of the presenter
128*cdf0e10cSrcweir             // console (which is displayed in the FullScreenPane).  But the
129*cdf0e10cSrcweir             // timing has to be right and I did not find a better place for
130*cdf0e10cSrcweir             // it.
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir             // Wait for the full screen pane, which displays the presenter
133*cdf0e10cSrcweir             // console, to disappear.  Only when it is gone, call
134*cdf0e10cSrcweir             // InitiatePresenterStart(), in order to begin the asynchronous
135*cdf0e10cSrcweir             // restart of the slide show.
136*cdf0e10cSrcweir             if (mpViewShellBase != NULL)
137*cdf0e10cSrcweir             {
138*cdf0e10cSrcweir                 ::boost::shared_ptr<FrameworkHelper> pHelper(
139*cdf0e10cSrcweir                     FrameworkHelper::Instance(*mpViewShellBase));
140*cdf0e10cSrcweir                 if (pHelper->GetConfigurationController()->getResource(
141*cdf0e10cSrcweir                     pHelper->CreateResourceId(FrameworkHelper::msFullScreenPaneURL)).is())
142*cdf0e10cSrcweir                 {
143*cdf0e10cSrcweir                     ::sd::framework::ConfigurationController::Lock aLock (
144*cdf0e10cSrcweir                         pHelper->GetConfigurationController());
145*cdf0e10cSrcweir 
146*cdf0e10cSrcweir                     pHelper->RunOnConfigurationEvent(
147*cdf0e10cSrcweir                         FrameworkHelper::msConfigurationUpdateEndEvent,
148*cdf0e10cSrcweir                         ::boost::bind(&SlideShowRestarter::StartPresentation, shared_from_this()));
149*cdf0e10cSrcweir                     pHelper->UpdateConfiguration();
150*cdf0e10cSrcweir                 }
151*cdf0e10cSrcweir                 else
152*cdf0e10cSrcweir                 {
153*cdf0e10cSrcweir                     StartPresentation();
154*cdf0e10cSrcweir                 }
155*cdf0e10cSrcweir             }
156*cdf0e10cSrcweir         }
157*cdf0e10cSrcweir     }
158*cdf0e10cSrcweir     return 0;
159*cdf0e10cSrcweir }
160*cdf0e10cSrcweir 
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir 
163*cdf0e10cSrcweir 
164*cdf0e10cSrcweir void SlideShowRestarter::StartPresentation (void)
165*cdf0e10cSrcweir {
166*cdf0e10cSrcweir     if (mpDispatcher == NULL && mpViewShellBase!=NULL)
167*cdf0e10cSrcweir         mpDispatcher = mpViewShellBase->GetViewFrame()->GetDispatcher();
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir     // Start the slide show on the saved current slide.
170*cdf0e10cSrcweir     if (mpDispatcher != NULL)
171*cdf0e10cSrcweir     {
172*cdf0e10cSrcweir         mpDispatcher->Execute(SID_PRESENTATION, SFX_CALLMODE_ASYNCHRON);
173*cdf0e10cSrcweir         if (mpSlideShow.is())
174*cdf0e10cSrcweir         {
175*cdf0e10cSrcweir             Sequence<css::beans::PropertyValue> aProperties (1);
176*cdf0e10cSrcweir             aProperties[0].Name = C2U("FirstPage");
177*cdf0e10cSrcweir             aProperties[0].Value <<= C2U("page") + OUString::valueOf(mnCurrentSlideNumber+1);
178*cdf0e10cSrcweir             mpSlideShow->startWithArguments(aProperties);
179*cdf0e10cSrcweir         }
180*cdf0e10cSrcweir         mpSelf.reset();
181*cdf0e10cSrcweir     }
182*cdf0e10cSrcweir }
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir } // end of namespace sd
185