1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sdext.hxx"
26 
27 #include "PresenterProtocolHandler.hxx"
28 #include "PresenterConfigurationAccess.hxx"
29 #include "PresenterController.hxx"
30 #include "PresenterHelper.hxx"
31 #include "PresenterNotesView.hxx"
32 #include "PresenterPaneContainer.hxx"
33 #include "PresenterPaneFactory.hxx"
34 #include "PresenterViewFactory.hxx"
35 #include "PresenterWindowManager.hxx"
36 #include <com/sun/star/frame/XController.hpp>
37 #include <com/sun/star/drawing/SlideSorter.hpp>
38 #include <com/sun/star/drawing/framework/Configuration.hpp>
39 #include <com/sun/star/drawing/framework/XControllerManager.hpp>
40 #include <com/sun/star/drawing/framework/ResourceId.hpp>
41 #include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
42 #include <com/sun/star/presentation/XSlideShow.hpp>
43 #include <com/sun/star/presentation/XSlideShowView.hpp>
44 #include <com/sun/star/presentation/XPresentationSupplier.hpp>
45 #include <cppuhelper/compbase2.hxx>
46 #include <boost/bind.hpp>
47 #include <tools/debug.hxx>
48 
49 using namespace ::com::sun::star;
50 using namespace ::com::sun::star::uno;
51 using namespace ::com::sun::star::drawing::framework;
52 using ::rtl::OUString;
53 
54 #define A2S(pString) (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(pString)))
55 
56 namespace sdext { namespace presenter {
57 
58 namespace {
59     const static OUString gsProtocol (A2S("vnd.com.sun.star.presentation.PresenterScreen:"));
60 
61     class Command
62     {
63     public:
64         virtual void Execute (void) = 0;
65         virtual bool IsEnabled (void) const = 0;
66         virtual Any GetState (void) const = 0;
67     };
68 
69     class GotoPreviousSlideCommand : public Command
70     {
71     public:
72         GotoPreviousSlideCommand (
73             const rtl::Reference<PresenterController>& rpPresenterController);
~GotoPreviousSlideCommand(void)74         virtual ~GotoPreviousSlideCommand (void) {}
75         virtual void Execute (void);
76         virtual bool IsEnabled (void) const;
77         virtual Any GetState (void) const;
78     private:
79         rtl::Reference<PresenterController> mpPresenterController;
80     };
81 
82     class GotoNextSlideCommand : public Command
83     {
84     public:
85         GotoNextSlideCommand (
86             const rtl::Reference<PresenterController>& rpPresenterController);
~GotoNextSlideCommand(void)87         virtual ~GotoNextSlideCommand (void) {}
88         virtual void Execute (void);
89         virtual bool IsEnabled (void) const;
90         virtual Any GetState (void) const;
91     private:
92         rtl::Reference<PresenterController> mpPresenterController;
93     };
94 
95     class GotoNextEffectCommand : public Command
96     {
97     public:
98         GotoNextEffectCommand (
99             const rtl::Reference<PresenterController>& rpPresenterController);
~GotoNextEffectCommand(void)100         virtual ~GotoNextEffectCommand (void) {}
101         virtual void Execute (void);
102         virtual bool IsEnabled (void) const;
103         virtual Any GetState (void) const;
104     private:
105         rtl::Reference<PresenterController> mpPresenterController;
106     };
107 
108     class SetNotesViewCommand : public Command
109     {
110     public:
111         SetNotesViewCommand (
112             const bool bOn,
113             const rtl::Reference<PresenterController>& rpPresenterController);
~SetNotesViewCommand(void)114         virtual ~SetNotesViewCommand (void) {}
115         virtual void Execute (void);
116         virtual bool IsEnabled (void) const;
117         virtual Any GetState (void) const;
118     private:
119         bool mbOn;
120         rtl::Reference<PresenterController> mpPresenterController;
121         bool IsActive (const ::rtl::Reference<PresenterWindowManager>& rpWindowManager) const;
122     };
123 
124     class SetSlideSorterCommand : public Command
125     {
126     public:
127         SetSlideSorterCommand (
128             const bool bOn,
129             const rtl::Reference<PresenterController>& rpPresenterController);
~SetSlideSorterCommand(void)130         virtual ~SetSlideSorterCommand (void) {}
131         virtual void Execute (void);
132         virtual bool IsEnabled (void) const;
133         virtual Any GetState (void) const;
134     private:
135         bool mbOn;
136         rtl::Reference<PresenterController> mpPresenterController;
137     };
138 
139     class SetHelpViewCommand : public Command
140     {
141     public:
142         SetHelpViewCommand (
143             const bool bOn,
144             const rtl::Reference<PresenterController>& rpPresenterController);
~SetHelpViewCommand(void)145         virtual ~SetHelpViewCommand (void) {}
146         virtual void Execute (void);
147         virtual bool IsEnabled (void) const;
148         virtual Any GetState (void) const;
149     private:
150         bool mbOn;
151         rtl::Reference<PresenterController> mpPresenterController;
152     };
153 
154     class NotesFontSizeCommand : public Command
155     {
156     public:
157         NotesFontSizeCommand(
158             const rtl::Reference<PresenterController>& rpPresenterController,
159             const sal_Int32 nSizeChange);
~NotesFontSizeCommand(void)160         virtual ~NotesFontSizeCommand (void) {}
161         virtual void Execute (void);
162         virtual bool IsEnabled (void) const;
163         virtual Any GetState (void) const;
164     protected:
165         ::rtl::Reference<PresenterNotesView> GetNotesView (void) const;
166     private:
167         rtl::Reference<PresenterController> mpPresenterController;
168         const sal_Int32 mnSizeChange;
169     };
170 
171 } // end of anonymous namespace
172 
173 
174 namespace {
175     typedef ::cppu::WeakComponentImplHelper2 <
176         css::frame::XDispatch,
177         css::document::XEventListener
178         > PresenterDispatchInterfaceBase;
179 }
180 
181 class PresenterProtocolHandler::Dispatch
182     : protected ::cppu::BaseMutex,
183       public PresenterDispatchInterfaceBase
184 {
185 public:
186     typedef void (PresenterProtocolHandler::Dispatch::* Action)(void);
187 
188     /** Create a new Dispatch object.  When the given command name
189         (rsURLPath) is not known then an empty reference is returned.
190     */
191     static Reference<frame::XDispatch> Create (
192         const OUString& rsURLPath,
193         const ::rtl::Reference<PresenterController>& rpPresenterController);
194 
195     void SAL_CALL disposing (void);
196     static Command* CreateCommand (
197         const OUString& rsURLPath,
198         const ::rtl::Reference<PresenterController>& rpPresenterController);
199 
200 
201     // XDispatch
202     virtual void SAL_CALL dispatch(
203         const css::util::URL& aURL,
204         const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
205         throw(css::uno::RuntimeException);
206 
207     virtual void SAL_CALL addStatusListener(
208         const css::uno::Reference<css::frame::XStatusListener>& rxListener,
209         const css::util::URL& rURL)
210         throw(css::uno::RuntimeException);
211 
212     virtual void SAL_CALL removeStatusListener (
213         const css::uno::Reference<css::frame::XStatusListener>& rxListener,
214         const css::util::URL& rURL)
215         throw(css::uno::RuntimeException);
216 
217 
218     // document::XEventListener
219 
220     virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent)
221         throw(css::uno::RuntimeException);
222 
223 
224     // lang::XEventListener
225 
226     virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
227         throw(css::uno::RuntimeException);
228 
229 private:
230     OUString msURLPath;
231     ::boost::scoped_ptr<Command> mpCommand;
232     ::rtl::Reference<PresenterController> mpPresenterController;
233     typedef ::std::vector<Reference<frame::XStatusListener> > StatusListenerContainer;
234     StatusListenerContainer maStatusListenerContainer;
235     bool mbIsListeningToWindowManager;
236 
237     Dispatch (
238         const OUString& rsURLPath,
239         const ::rtl::Reference<PresenterController>& rpPresenterController);
240     virtual ~Dispatch (void);
241 
242     void ThrowIfDisposed (void) const throw (css::lang::DisposedException);
243 };
244 
245 
246 
247 
248 //----- Service ---------------------------------------------------------------
249 
getImplementationName_static(void)250 OUString PresenterProtocolHandler::getImplementationName_static (void)
251 {
252     return A2S("com.sun.star.comp.presentation.PresenterProtocolHandler");
253 }
254 
255 
256 
257 
getSupportedServiceNames_static(void)258 Sequence<OUString> PresenterProtocolHandler::getSupportedServiceNames_static (void)
259 {
260 	static const ::rtl::OUString sServiceName(A2S("com.sun.star.frame.ProtocolHandler"));
261 	return Sequence<rtl::OUString>(&sServiceName, 1);
262 }
263 
264 
265 
266 
Create(const Reference<uno::XComponentContext> & rxContext)267 Reference<XInterface> PresenterProtocolHandler::Create (
268     const Reference<uno::XComponentContext>& rxContext)
269     SAL_THROW((Exception))
270 {
271     return Reference<XInterface>(static_cast<XWeak*>(new PresenterProtocolHandler(rxContext)));
272 }
273 
274 
275 
276 
277 //===== PresenterProtocolHandler =========================================================
278 
279 
PresenterProtocolHandler(const Reference<XComponentContext> & rxContext)280 PresenterProtocolHandler::PresenterProtocolHandler (const Reference<XComponentContext>& rxContext)
281     : PresenterProtocolHandlerInterfaceBase(m_aMutex)
282 {
283     (void)rxContext;
284 }
285 
286 
287 
288 
~PresenterProtocolHandler(void)289 PresenterProtocolHandler::~PresenterProtocolHandler (void)
290 {
291 }
292 
293 
294 
295 
disposing(void)296 void SAL_CALL PresenterProtocolHandler::disposing (void)
297 {
298 }
299 
300 
301 
302 
303 //----- XInitialize -----------------------------------------------------------
304 
initialize(const Sequence<Any> & aArguments)305 void SAL_CALL PresenterProtocolHandler::initialize (const Sequence<Any>& aArguments)
306     throw (Exception, RuntimeException)
307 {
308     ThrowIfDisposed();
309     if (aArguments.getLength() > 0)
310     {
311         try
312         {
313             Reference<frame::XFrame> xFrame;
314             if (aArguments[0] >>= xFrame)
315             {
316                 mpPresenterController = PresenterController::Instance(xFrame);
317             }
318         }
319         catch (RuntimeException&)
320         {
321             OSL_ASSERT(false);
322         }
323     }
324 }
325 
326 
327 
328 
329 //----- XDispatchProvider -----------------------------------------------------
330 
queryDispatch(const css::util::URL & rURL,const rtl::OUString & rsTargetFrameName,sal_Int32 nSearchFlags)331 Reference<frame::XDispatch> SAL_CALL PresenterProtocolHandler::queryDispatch (
332     const css::util::URL& rURL,
333     const rtl::OUString& rsTargetFrameName,
334     sal_Int32 nSearchFlags)
335     throw(RuntimeException)
336 {
337     (void)rsTargetFrameName;
338     (void)nSearchFlags;
339     ThrowIfDisposed();
340 
341     Reference<frame::XDispatch> xDispatch;
342 
343     if (rURL.Protocol == gsProtocol)
344     {
345         xDispatch.set(Dispatch::Create(rURL.Path, mpPresenterController));
346     }
347 
348     return xDispatch;
349 }
350 
351 
352 
353 
queryDispatches(const Sequence<frame::DispatchDescriptor> & rDescriptors)354 Sequence<Reference<frame::XDispatch> > SAL_CALL PresenterProtocolHandler::queryDispatches(
355     const Sequence<frame::DispatchDescriptor>& rDescriptors)
356     throw(RuntimeException)
357 {
358     (void)rDescriptors;
359     ThrowIfDisposed();
360     return Sequence<Reference<frame::XDispatch> >();
361 }
362 
363 
364 
365 
366 //-----------------------------------------------------------------------------
367 
ThrowIfDisposed(void) const368 void PresenterProtocolHandler::ThrowIfDisposed (void) const
369     throw (::com::sun::star::lang::DisposedException)
370 {
371 	if (rBHelper.bDisposed || rBHelper.bInDispose)
372 	{
373         throw lang::DisposedException (
374             OUString(RTL_CONSTASCII_USTRINGPARAM(
375                 "PresenterProtocolHandler object has already been disposed")),
376             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
377     }
378 }
379 
380 
381 
382 
383 //===== PresenterProtocolHandler::Dispatch ====================================
384 
Create(const OUString & rsURLPath,const::rtl::Reference<PresenterController> & rpPresenterController)385 Reference<frame::XDispatch> PresenterProtocolHandler::Dispatch::Create (
386     const OUString& rsURLPath,
387     const ::rtl::Reference<PresenterController>& rpPresenterController)
388 {
389     ::rtl::Reference<Dispatch> pDispatch (new Dispatch (rsURLPath, rpPresenterController));
390     if (pDispatch->mpCommand.get() != NULL)
391         return Reference<frame::XDispatch>(pDispatch.get());
392     else
393         return NULL;
394 }
395 
396 
397 
398 
Dispatch(const OUString & rsURLPath,const::rtl::Reference<PresenterController> & rpPresenterController)399 PresenterProtocolHandler::Dispatch::Dispatch (
400     const OUString& rsURLPath,
401     const ::rtl::Reference<PresenterController>& rpPresenterController)
402     : PresenterDispatchInterfaceBase(m_aMutex),
403       msURLPath(rsURLPath),
404       mpCommand(CreateCommand(rsURLPath, rpPresenterController)),
405       mpPresenterController(rpPresenterController),
406       maStatusListenerContainer(),
407       mbIsListeningToWindowManager(false)
408 {
409     if (mpCommand.get() != NULL)
410     {
411         mpPresenterController->GetWindowManager()->AddLayoutListener(this);
412         mbIsListeningToWindowManager = true;
413     }
414 }
415 
416 
417 
418 
CreateCommand(const OUString & rsURLPath,const::rtl::Reference<PresenterController> & rpPresenterController)419 Command* PresenterProtocolHandler::Dispatch::CreateCommand (
420     const OUString& rsURLPath,
421     const ::rtl::Reference<PresenterController>& rpPresenterController)
422 {
423     if (rsURLPath.getLength() <= 5)
424         return NULL;
425     switch (rsURLPath[0])
426     {
427         case  sal_Char('C') :
428             switch (rsURLPath[5])
429             {
430                 case sal_Char('N'):
431                     if (rsURLPath == A2S("CloseNotes"))
432                         return new SetNotesViewCommand(false, rpPresenterController);
433                     break;
434                 case sal_Char('S'):
435                     if (rsURLPath == A2S("CloseSlideSorter"))
436                         return new SetSlideSorterCommand(false, rpPresenterController);
437                     break;
438                 case sal_Char('H'):
439                     if (rsURLPath == A2S("CloseHelp"))
440                         return new SetHelpViewCommand(false, rpPresenterController);
441                     break;
442             }
443             break;
444         case  sal_Char('G') :
445             if (rsURLPath == A2S("GrowNotesFont"))
446                 return new NotesFontSizeCommand(rpPresenterController, +1);
447             break;
448 
449         case sal_Char('N') :
450             switch (rsURLPath[4])
451             {
452                 case sal_Char('E'):
453                     if (rsURLPath == A2S("NextEffect"))
454                         return new GotoNextEffectCommand(rpPresenterController);
455                 case sal_Char('S'):
456                     if (rsURLPath == A2S("NextSlide"))
457                         return new GotoNextSlideCommand(rpPresenterController);
458                     break;
459             }
460             break;
461 
462         case sal_Char('P') :
463             if (rsURLPath == A2S("PrevSlide"))
464                 return new GotoPreviousSlideCommand(rpPresenterController);
465             break;
466 
467         case  sal_Char('S') :
468             switch (rsURLPath[4])
469             {
470                 case sal_Char('N'):
471                     if (rsURLPath == A2S("ShowNotes"))
472                         return new SetNotesViewCommand(true, rpPresenterController);
473                     break;
474 
475                 case sal_Char('S'):
476                     if (rsURLPath == A2S("ShowSlideSorter"))
477                         return new SetSlideSorterCommand(true, rpPresenterController);
478                     break;
479 
480                 case sal_Char('H'):
481                     if (rsURLPath == A2S("ShowHelp"))
482                         return new SetHelpViewCommand(true, rpPresenterController);
483                     break;
484 
485                 case sal_Char('n'):
486                     if (rsURLPath == A2S("ShrinkNotesFont"))
487                         return new NotesFontSizeCommand(rpPresenterController, -1);
488                     break;
489             }
490             break;
491 
492         default:
493             break;
494     }
495 
496     return NULL;
497 }
498 
499 
500 
501 
~Dispatch(void)502 PresenterProtocolHandler::Dispatch::~Dispatch (void)
503 {
504 }
505 
506 
507 
508 
disposing(void)509 void PresenterProtocolHandler::Dispatch::disposing (void)
510 {
511     if (mbIsListeningToWindowManager)
512     {
513         if (mpPresenterController.get() != NULL)
514             mpPresenterController->GetWindowManager()->RemoveLayoutListener(this);
515         mbIsListeningToWindowManager = false;
516     }
517 
518     msURLPath = OUString();
519     mpCommand.reset();
520 }
521 
522 
523 
524 
525 //----- XDispatch -------------------------------------------------------------
526 
dispatch(const css::util::URL & rURL,const css::uno::Sequence<css::beans::PropertyValue> & rArguments)527 void SAL_CALL PresenterProtocolHandler::Dispatch::dispatch(
528     const css::util::URL& rURL,
529     const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
530     throw(css::uno::RuntimeException)
531 {
532     (void)rArguments;
533     ThrowIfDisposed();
534 
535     if (rURL.Protocol == gsProtocol
536         && rURL.Path == msURLPath)
537     {
538         if (mpCommand.get() != NULL)
539             mpCommand->Execute();
540     }
541     else
542     {
543         // We can not throw an IllegalArgumentException
544         throw RuntimeException();
545     }
546 }
547 
548 
549 
550 
addStatusListener(const css::uno::Reference<css::frame::XStatusListener> & rxListener,const css::util::URL & rURL)551 void SAL_CALL PresenterProtocolHandler::Dispatch::addStatusListener(
552     const css::uno::Reference<css::frame::XStatusListener>& rxListener,
553     const css::util::URL& rURL)
554     throw(css::uno::RuntimeException)
555 {
556     if (rURL.Path == msURLPath)
557     {
558         maStatusListenerContainer.push_back(rxListener);
559 
560         frame::FeatureStateEvent aEvent;
561         aEvent.FeatureURL = rURL;
562         aEvent.IsEnabled = mpCommand->IsEnabled();
563         aEvent.Requery = sal_False;
564         aEvent.State = mpCommand->GetState();
565         rxListener->statusChanged(aEvent);
566     }
567     else
568         throw RuntimeException();
569 }
570 
571 
572 
573 
removeStatusListener(const css::uno::Reference<css::frame::XStatusListener> & rxListener,const css::util::URL & rURL)574 void SAL_CALL PresenterProtocolHandler::Dispatch::removeStatusListener (
575     const css::uno::Reference<css::frame::XStatusListener>& rxListener,
576     const css::util::URL& rURL)
577     throw(css::uno::RuntimeException)
578 {
579     if (rURL.Path == msURLPath)
580     {
581         StatusListenerContainer::iterator iListener (
582             ::std::find(
583                 maStatusListenerContainer.begin(),
584                 maStatusListenerContainer.end(),
585                 rxListener));
586         if (iListener != maStatusListenerContainer.end())
587             maStatusListenerContainer.erase(iListener);
588     }
589     else
590         throw RuntimeException();
591 }
592 
593 
594 
595 
596 //-----------------------------------------------------------------------------
597 
ThrowIfDisposed(void) const598 void PresenterProtocolHandler::Dispatch::ThrowIfDisposed (void) const
599     throw (::com::sun::star::lang::DisposedException)
600 {
601 	if (rBHelper.bDisposed || rBHelper.bInDispose)
602 	{
603         throw lang::DisposedException (
604             OUString(RTL_CONSTASCII_USTRINGPARAM(
605                 "PresenterProtocolHandler::Dispatch object has already been disposed")),
606             const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
607     }
608 }
609 
610 
611 
612 
613 //----- document::XEventListener ----------------------------------------------
614 
notifyEvent(const css::document::EventObject & rEvent)615 void SAL_CALL PresenterProtocolHandler::Dispatch::notifyEvent (
616     const css::document::EventObject& rEvent)
617     throw(css::uno::RuntimeException)
618 {
619     (void)rEvent;
620 
621     mpCommand->GetState();
622 }
623 
624 
625 
626 
627 //----- lang::XEventListener --------------------------------------------------
628 
disposing(const css::lang::EventObject & rEvent)629 void SAL_CALL PresenterProtocolHandler::Dispatch::disposing (const css::lang::EventObject& rEvent)
630     throw(css::uno::RuntimeException)
631 {
632     (void)rEvent;
633     mbIsListeningToWindowManager = false;
634 }
635 
636 
637 
638 
639 
640 //===== GotoPreviousSlideCommand ==============================================
641 
GotoPreviousSlideCommand(const rtl::Reference<PresenterController> & rpPresenterController)642 GotoPreviousSlideCommand::GotoPreviousSlideCommand (
643     const rtl::Reference<PresenterController>& rpPresenterController)
644     : mpPresenterController(rpPresenterController)
645 {
646 }
647 
648 
649 
Execute(void)650 void GotoPreviousSlideCommand::Execute (void)
651 {
652     if ( ! mpPresenterController.is())
653         return;
654 
655     if ( ! mpPresenterController->GetSlideShowController().is())
656         return;
657 
658     mpPresenterController->GetSlideShowController()->gotoPreviousSlide();
659 }
660 
661 
662 
663 
IsEnabled(void) const664 bool GotoPreviousSlideCommand::IsEnabled (void) const
665 {
666     if ( ! mpPresenterController.is())
667         return false;
668 
669     if ( ! mpPresenterController->GetSlideShowController().is())
670         return false;
671 
672     return mpPresenterController->GetSlideShowController()->getCurrentSlideIndex()>0;
673 }
674 
675 
676 
677 
GetState(void) const678 Any GotoPreviousSlideCommand::GetState (void) const
679 {
680     return Any(sal_False);
681 }
682 
683 
684 
685 
686 //===== GotoNextEffect ========================================================
687 
GotoNextEffectCommand(const rtl::Reference<PresenterController> & rpPresenterController)688 GotoNextEffectCommand::GotoNextEffectCommand (
689     const rtl::Reference<PresenterController>& rpPresenterController)
690     : mpPresenterController(rpPresenterController)
691 {
692 }
693 
694 
695 
Execute(void)696 void GotoNextEffectCommand::Execute (void)
697 {
698     if ( ! mpPresenterController.is())
699         return;
700 
701     if ( ! mpPresenterController->GetSlideShowController().is())
702         return;
703 
704     mpPresenterController->GetSlideShowController()->gotoNextEffect();
705 }
706 
707 
708 
709 
IsEnabled(void) const710 bool GotoNextEffectCommand::IsEnabled (void) const
711 {
712     // The next slide command is always enabled, even when the current slide
713     // is the last slide:  from the last slide it goes to the pause slide,
714     // and from there it ends the slide show.
715     return true;
716 }
717 
718 
719 
720 
GetState(void) const721 Any GotoNextEffectCommand::GetState (void) const
722 {
723     return Any(sal_False);
724 }
725 
726 
727 
728 
729 //===== GotoNextSlide =========================================================
730 
GotoNextSlideCommand(const rtl::Reference<PresenterController> & rpPresenterController)731 GotoNextSlideCommand::GotoNextSlideCommand (
732     const rtl::Reference<PresenterController>& rpPresenterController)
733     : mpPresenterController(rpPresenterController)
734 {
735 }
736 
737 
738 
Execute(void)739 void GotoNextSlideCommand::Execute (void)
740 {
741     if ( ! mpPresenterController.is())
742         return;
743 
744     if ( ! mpPresenterController->GetSlideShowController().is())
745         return;
746 
747     mpPresenterController->GetSlideShowController()->gotoNextSlide();
748 }
749 
750 
751 
752 
IsEnabled(void) const753 bool GotoNextSlideCommand::IsEnabled (void) const
754 {
755     // The next slide command is always enabled, even when the current slide
756     // is the last slide:  from the last slide it goes to the pause slide,
757     // and from there it ends the slide show.
758     return true;
759 }
760 
761 
762 
763 
GetState(void) const764 Any GotoNextSlideCommand::GetState (void) const
765 {
766     return Any(sal_False);
767 }
768 
769 
770 
771 
772 //===== SetNotesViewCommand ===================================================
773 
SetNotesViewCommand(const bool bOn,const rtl::Reference<PresenterController> & rpPresenterController)774 SetNotesViewCommand::SetNotesViewCommand (
775     const bool bOn,
776     const rtl::Reference<PresenterController>& rpPresenterController)
777     : mbOn(bOn),
778       mpPresenterController(rpPresenterController)
779 {
780 }
781 
782 
783 
784 
Execute(void)785 void SetNotesViewCommand::Execute (void)
786 {
787     if ( ! mpPresenterController.is())
788         return;
789 
790     ::rtl::Reference<PresenterWindowManager> pWindowManager (
791         mpPresenterController->GetWindowManager());
792     if ( ! pWindowManager.is())
793         return;
794 
795     if (mbOn)
796         pWindowManager->SetViewMode(PresenterWindowManager::VM_Notes);
797     else
798         pWindowManager->SetViewMode(PresenterWindowManager::VM_Standard);
799 }
800 
801 
802 
803 
IsEnabled(void) const804 bool SetNotesViewCommand::IsEnabled (void) const
805 {
806     return true;
807 }
808 
809 
810 
811 
GetState(void) const812 Any SetNotesViewCommand::GetState (void) const
813 {
814     if ( ! mpPresenterController.is())
815         return Any(false);
816 
817     ::rtl::Reference<PresenterWindowManager> pWindowManager (
818         mpPresenterController->GetWindowManager());
819     if ( ! pWindowManager.is())
820         return Any(false);
821 
822     return Any(IsActive(pWindowManager));
823 }
824 
825 
826 
827 
IsActive(const::rtl::Reference<PresenterWindowManager> & rpWindowManager) const828 bool SetNotesViewCommand::IsActive (
829     const ::rtl::Reference<PresenterWindowManager>& rpWindowManager) const
830 {
831     return rpWindowManager->GetViewMode() == PresenterWindowManager::VM_Notes;
832 }
833 
834 
835 
836 
837 //===== SetSlideSorterCommand =================================================
838 
SetSlideSorterCommand(const bool bOn,const rtl::Reference<PresenterController> & rpPresenterController)839 SetSlideSorterCommand::SetSlideSorterCommand (
840     const bool bOn,
841     const rtl::Reference<PresenterController>& rpPresenterController)
842     : mbOn(bOn),
843       mpPresenterController(rpPresenterController)
844 {
845 }
846 
847 
848 
849 
Execute(void)850 void SetSlideSorterCommand::Execute (void)
851 {
852     if ( ! mpPresenterController.is())
853         return;
854 
855     ::rtl::Reference<PresenterWindowManager> pWindowManager (
856         mpPresenterController->GetWindowManager());
857     if ( ! pWindowManager.is())
858         return;
859 
860     pWindowManager->SetSlideSorterState(mbOn);
861 }
862 
863 
864 
865 
IsEnabled(void) const866 bool SetSlideSorterCommand::IsEnabled (void) const
867 {
868     return true;
869 }
870 
871 
872 
873 
GetState(void) const874 Any SetSlideSorterCommand::GetState (void) const
875 {
876     if ( ! mpPresenterController.is())
877         return Any(false);
878 
879     ::rtl::Reference<PresenterWindowManager> pWindowManager (
880         mpPresenterController->GetWindowManager());
881     if ( ! pWindowManager.is())
882         return Any(false);
883 
884     return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_SlideOverview);
885 }
886 
887 
888 
889 
890 //===== SetHelpViewCommand ===================================================
891 
SetHelpViewCommand(const bool bOn,const rtl::Reference<PresenterController> & rpPresenterController)892 SetHelpViewCommand::SetHelpViewCommand (
893     const bool bOn,
894     const rtl::Reference<PresenterController>& rpPresenterController)
895     : mbOn(bOn),
896       mpPresenterController(rpPresenterController)
897 {
898 }
899 
900 
901 
902 
Execute(void)903 void SetHelpViewCommand::Execute (void)
904 {
905     if ( ! mpPresenterController.is())
906         return;
907 
908     ::rtl::Reference<PresenterWindowManager> pWindowManager (
909         mpPresenterController->GetWindowManager());
910     if ( ! pWindowManager.is())
911         return;
912 
913     pWindowManager->SetHelpViewState(mbOn);
914 }
915 
916 
917 
918 
IsEnabled(void) const919 bool SetHelpViewCommand::IsEnabled (void) const
920 {
921     return true;
922 }
923 
924 
925 
926 
GetState(void) const927 Any SetHelpViewCommand::GetState (void) const
928 {
929     if ( ! mpPresenterController.is())
930         return Any(false);
931 
932     ::rtl::Reference<PresenterWindowManager> pWindowManager (
933         mpPresenterController->GetWindowManager());
934     if ( ! pWindowManager.is())
935         return Any(false);
936 
937     return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_Help);
938 }
939 
940 
941 
942 
943 //===== NotesFontSizeCommand ==================================================
944 
NotesFontSizeCommand(const rtl::Reference<PresenterController> & rpPresenterController,const sal_Int32 nSizeChange)945 NotesFontSizeCommand::NotesFontSizeCommand(
946     const rtl::Reference<PresenterController>& rpPresenterController,
947     const sal_Int32 nSizeChange)
948     : mpPresenterController(rpPresenterController),
949       mnSizeChange(nSizeChange)
950 {
951 }
952 
953 
954 
955 
GetNotesView(void) const956 ::rtl::Reference<PresenterNotesView> NotesFontSizeCommand::GetNotesView (void) const
957 {
958     if (mpPresenterController.get() == NULL)
959         return NULL;
960 
961     PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
962         mpPresenterController->GetPaneContainer()->FindViewURL(
963             PresenterViewFactory::msNotesViewURL));
964     if (pDescriptor.get() == NULL)
965         return NULL;
966 
967     return dynamic_cast<PresenterNotesView*>(pDescriptor->mxView.get());
968 }
969 
970 
971 
972 
Execute(void)973 void NotesFontSizeCommand::Execute (void)
974 {
975     ::rtl::Reference<PresenterNotesView> pView (GetNotesView());
976     if (pView.is())
977         pView->ChangeFontSize(mnSizeChange);
978 }
979 
980 
981 
982 
IsEnabled(void) const983 bool NotesFontSizeCommand::IsEnabled (void) const
984 {
985     return true;
986 }
987 
988 
989 
990 
GetState(void) const991 Any NotesFontSizeCommand::GetState (void) const
992 {
993     return Any();
994 }
995 
996 
997 } } // end of namespace ::sdext::presenter
998