Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "PresenterProtocolHandler.hxx"
21 : #include "PresenterConfigurationAccess.hxx"
22 : #include "PresenterController.hxx"
23 : #include "PresenterHelper.hxx"
24 : #include "PresenterNotesView.hxx"
25 : #include "PresenterPaneContainer.hxx"
26 : #include "PresenterPaneFactory.hxx"
27 : #include "PresenterViewFactory.hxx"
28 : #include "PresenterWindowManager.hxx"
29 : #include <com/sun/star/frame/XController.hpp>
30 : #include <com/sun/star/drawing/SlideSorter.hpp>
31 : #include <com/sun/star/drawing/framework/Configuration.hpp>
32 : #include <com/sun/star/drawing/framework/XControllerManager.hpp>
33 : #include <com/sun/star/drawing/framework/ResourceId.hpp>
34 : #include <com/sun/star/drawing/framework/ResourceActivationMode.hpp>
35 : #include <com/sun/star/presentation/XSlideShow.hpp>
36 : #include <com/sun/star/presentation/XSlideShowView.hpp>
37 : #include <com/sun/star/presentation/XPresentationSupplier.hpp>
38 : #include <cppuhelper/compbase2.hxx>
39 : #include <cppuhelper/supportsservice.hxx>
40 :
41 : using namespace ::com::sun::star;
42 : using namespace ::com::sun::star::uno;
43 : using namespace ::com::sun::star::drawing::framework;
44 :
45 : namespace sdext { namespace presenter {
46 :
47 : namespace {
48 0 : class Command
49 : {
50 : public:
51 0 : virtual ~Command() {}
52 : virtual void Execute() = 0;
53 0 : virtual bool IsEnabled() const { return true; }
54 0 : virtual Any GetState() const { return Any(sal_False); }
55 : };
56 :
57 : class GotoPreviousSlideCommand : public Command
58 : {
59 : public:
60 : GotoPreviousSlideCommand (
61 : const rtl::Reference<PresenterController>& rpPresenterController);
62 0 : virtual ~GotoPreviousSlideCommand() {}
63 : virtual void Execute() SAL_OVERRIDE;
64 : virtual bool IsEnabled() const SAL_OVERRIDE;
65 : private:
66 : rtl::Reference<PresenterController> mpPresenterController;
67 : };
68 :
69 : class GotoNextSlideCommand : public Command
70 : {
71 : public:
72 : GotoNextSlideCommand (
73 : const rtl::Reference<PresenterController>& rpPresenterController);
74 0 : virtual ~GotoNextSlideCommand() {}
75 : virtual void Execute() SAL_OVERRIDE;
76 : // The next slide command is always enabled, even when the current slide
77 : // is the last slide: from the last slide it goes to the pause slide,
78 : // and from there it ends the slide show.
79 0 : virtual bool IsEnabled() const SAL_OVERRIDE { return true; }
80 : private:
81 : rtl::Reference<PresenterController> mpPresenterController;
82 : };
83 :
84 : class GotoNextEffectCommand : public Command
85 : {
86 : public:
87 : GotoNextEffectCommand (
88 : const rtl::Reference<PresenterController>& rpPresenterController);
89 0 : virtual ~GotoNextEffectCommand() {}
90 : virtual void Execute() SAL_OVERRIDE;
91 : private:
92 : rtl::Reference<PresenterController> mpPresenterController;
93 : };
94 :
95 : class SwitchMonitorCommand : public Command
96 : {
97 : public:
98 : SwitchMonitorCommand (
99 : const rtl::Reference<PresenterController>& rpPresenterController);
100 0 : virtual ~SwitchMonitorCommand() {}
101 : virtual void Execute() SAL_OVERRIDE;
102 : private:
103 : rtl::Reference<PresenterController> mpPresenterController;
104 : };
105 :
106 : class SetNotesViewCommand : public Command
107 : {
108 : public:
109 : SetNotesViewCommand (
110 : const bool bOn,
111 : const rtl::Reference<PresenterController>& rpPresenterController);
112 0 : virtual ~SetNotesViewCommand() {}
113 : virtual void Execute() SAL_OVERRIDE;
114 : virtual Any GetState() const SAL_OVERRIDE;
115 : private:
116 : bool mbOn;
117 : rtl::Reference<PresenterController> mpPresenterController;
118 : static bool IsActive (const ::rtl::Reference<PresenterWindowManager>& rpWindowManager);
119 : };
120 :
121 : class SetSlideSorterCommand : public Command
122 : {
123 : public:
124 : SetSlideSorterCommand (
125 : const bool bOn,
126 : const rtl::Reference<PresenterController>& rpPresenterController);
127 0 : virtual ~SetSlideSorterCommand() {}
128 : virtual void Execute() SAL_OVERRIDE;
129 : virtual Any GetState() const SAL_OVERRIDE;
130 : private:
131 : bool mbOn;
132 : rtl::Reference<PresenterController> mpPresenterController;
133 : };
134 :
135 : class SetHelpViewCommand : public Command
136 : {
137 : public:
138 : SetHelpViewCommand (
139 : const bool bOn,
140 : const rtl::Reference<PresenterController>& rpPresenterController);
141 0 : virtual ~SetHelpViewCommand() {}
142 : virtual void Execute() SAL_OVERRIDE;
143 : virtual Any GetState() const SAL_OVERRIDE;
144 : private:
145 : bool mbOn;
146 : rtl::Reference<PresenterController> mpPresenterController;
147 : };
148 :
149 : class NotesFontSizeCommand : public Command
150 : {
151 : public:
152 : NotesFontSizeCommand(
153 : const rtl::Reference<PresenterController>& rpPresenterController,
154 : const sal_Int32 nSizeChange);
155 0 : virtual ~NotesFontSizeCommand() {}
156 : virtual void Execute() SAL_OVERRIDE;
157 : virtual Any GetState() const SAL_OVERRIDE;
158 : protected:
159 : ::rtl::Reference<PresenterNotesView> GetNotesView() const;
160 : private:
161 : rtl::Reference<PresenterController> mpPresenterController;
162 : const sal_Int32 mnSizeChange;
163 : };
164 :
165 : } // end of anonymous namespace
166 :
167 : namespace {
168 : typedef ::cppu::WeakComponentImplHelper2 <
169 : css::frame::XDispatch,
170 : css::document::XEventListener
171 : > PresenterDispatchInterfaceBase;
172 : }
173 :
174 : class PresenterProtocolHandler::Dispatch
175 : : protected ::cppu::BaseMutex,
176 : public PresenterDispatchInterfaceBase
177 : {
178 : public:
179 : typedef void (PresenterProtocolHandler::Dispatch::* Action)(void);
180 :
181 : /** Create a new Dispatch object. When the given command name
182 : (rsURLPath) is not known then an empty reference is returned.
183 : */
184 : static Reference<frame::XDispatch> Create (
185 : const OUString& rsURLPath,
186 : const ::rtl::Reference<PresenterController>& rpPresenterController);
187 :
188 : void SAL_CALL disposing() SAL_OVERRIDE;
189 : static Command* CreateCommand (
190 : const OUString& rsURLPath,
191 : const ::rtl::Reference<PresenterController>& rpPresenterController);
192 :
193 : // XDispatch
194 : virtual void SAL_CALL dispatch(
195 : const css::util::URL& aURL,
196 : const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
197 : throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
198 :
199 : virtual void SAL_CALL addStatusListener(
200 : const css::uno::Reference<css::frame::XStatusListener>& rxListener,
201 : const css::util::URL& rURL)
202 : throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
203 :
204 : virtual void SAL_CALL removeStatusListener (
205 : const css::uno::Reference<css::frame::XStatusListener>& rxListener,
206 : const css::util::URL& rURL)
207 : throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
208 :
209 : // document::XEventListener
210 :
211 : virtual void SAL_CALL notifyEvent (const css::document::EventObject& rEvent)
212 : throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
213 :
214 : // lang::XEventListener
215 :
216 : virtual void SAL_CALL disposing (const css::lang::EventObject& rEvent)
217 : throw(css::uno::RuntimeException, std::exception) SAL_OVERRIDE;
218 :
219 : private:
220 : OUString msURLPath;
221 : ::boost::scoped_ptr<Command> mpCommand;
222 : ::rtl::Reference<PresenterController> mpPresenterController;
223 : typedef ::std::vector<Reference<frame::XStatusListener> > StatusListenerContainer;
224 : StatusListenerContainer maStatusListenerContainer;
225 : bool mbIsListeningToWindowManager;
226 :
227 : Dispatch (
228 : const OUString& rsURLPath,
229 : const ::rtl::Reference<PresenterController>& rpPresenterController);
230 : virtual ~Dispatch();
231 :
232 : void ThrowIfDisposed() const throw (css::lang::DisposedException);
233 : };
234 :
235 : //----- Service ---------------------------------------------------------------
236 :
237 7 : OUString PresenterProtocolHandler::getImplementationName_static()
238 : {
239 7 : return OUString("org.libreoffice.comp.PresenterScreenProtocolHandler");
240 : }
241 :
242 2 : Sequence<OUString> PresenterProtocolHandler::getSupportedServiceNames_static()
243 : {
244 2 : static const OUString sServiceName("com.sun.star.frame.ProtocolHandler");
245 2 : return Sequence<OUString>(&sServiceName, 1);
246 : }
247 :
248 1 : Reference<XInterface> PresenterProtocolHandler::Create (
249 : const Reference<uno::XComponentContext>& rxContext)
250 : {
251 1 : return Reference<XInterface>(static_cast<XWeak*>(new PresenterProtocolHandler(rxContext)));
252 : }
253 :
254 : //===== PresenterProtocolHandler =========================================================
255 :
256 1 : PresenterProtocolHandler::PresenterProtocolHandler (const Reference<XComponentContext>& rxContext)
257 1 : : PresenterProtocolHandlerInterfaceBase(m_aMutex)
258 : {
259 : (void)rxContext;
260 1 : }
261 :
262 2 : PresenterProtocolHandler::~PresenterProtocolHandler()
263 : {
264 2 : }
265 :
266 1 : void SAL_CALL PresenterProtocolHandler::disposing()
267 : {
268 1 : }
269 :
270 : //----- XInitialize -----------------------------------------------------------
271 :
272 0 : void SAL_CALL PresenterProtocolHandler::initialize (const Sequence<Any>& aArguments)
273 : throw (Exception, RuntimeException, std::exception)
274 : {
275 0 : ThrowIfDisposed();
276 0 : if (aArguments.getLength() > 0)
277 : {
278 : try
279 : {
280 0 : Reference<frame::XFrame> xFrame;
281 0 : if (aArguments[0] >>= xFrame)
282 : {
283 0 : mpPresenterController = PresenterController::Instance(xFrame);
284 0 : }
285 : }
286 0 : catch (RuntimeException&)
287 : {
288 : OSL_ASSERT(false);
289 : }
290 : }
291 0 : }
292 :
293 1 : OUString PresenterProtocolHandler::getImplementationName()
294 : throw (css::uno::RuntimeException, std::exception)
295 : {
296 1 : return getImplementationName_static();
297 : }
298 :
299 0 : sal_Bool PresenterProtocolHandler::supportsService(OUString const & ServiceName)
300 : throw (css::uno::RuntimeException, std::exception)
301 : {
302 0 : return cppu::supportsService(this, ServiceName);
303 : }
304 :
305 : css::uno::Sequence<OUString>
306 1 : PresenterProtocolHandler::getSupportedServiceNames()
307 : throw (css::uno::RuntimeException, std::exception)
308 : {
309 1 : return getSupportedServiceNames_static();
310 : }
311 :
312 : //----- XDispatchProvider -----------------------------------------------------
313 :
314 0 : Reference<frame::XDispatch> SAL_CALL PresenterProtocolHandler::queryDispatch (
315 : const css::util::URL& rURL,
316 : const OUString& rsTargetFrameName,
317 : sal_Int32 nSearchFlags)
318 : throw(RuntimeException, std::exception)
319 : {
320 : (void)rsTargetFrameName;
321 : (void)nSearchFlags;
322 0 : ThrowIfDisposed();
323 :
324 0 : Reference<frame::XDispatch> xDispatch;
325 :
326 0 : if (rURL.Protocol == "vnd.org.libreoffice.presenterscreen:")
327 : {
328 0 : xDispatch.set(Dispatch::Create(rURL.Path, mpPresenterController));
329 : }
330 :
331 0 : return xDispatch;
332 : }
333 :
334 0 : Sequence<Reference<frame::XDispatch> > SAL_CALL PresenterProtocolHandler::queryDispatches(
335 : const Sequence<frame::DispatchDescriptor>& rDescriptors)
336 : throw(RuntimeException, std::exception)
337 : {
338 : (void)rDescriptors;
339 0 : ThrowIfDisposed();
340 0 : return Sequence<Reference<frame::XDispatch> >();
341 : }
342 :
343 :
344 :
345 0 : void PresenterProtocolHandler::ThrowIfDisposed() const
346 : throw (::com::sun::star::lang::DisposedException)
347 : {
348 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
349 : {
350 : throw lang::DisposedException (
351 : OUString(
352 : "PresenterProtocolHandler object has already been disposed"),
353 0 : const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
354 : }
355 0 : }
356 :
357 : //===== PresenterProtocolHandler::Dispatch ====================================
358 :
359 0 : Reference<frame::XDispatch> PresenterProtocolHandler::Dispatch::Create (
360 : const OUString& rsURLPath,
361 : const ::rtl::Reference<PresenterController>& rpPresenterController)
362 : {
363 0 : ::rtl::Reference<Dispatch> pDispatch (new Dispatch (rsURLPath, rpPresenterController));
364 0 : if (pDispatch->mpCommand.get() != NULL)
365 0 : return Reference<frame::XDispatch>(pDispatch.get());
366 : else
367 0 : return NULL;
368 : }
369 :
370 0 : PresenterProtocolHandler::Dispatch::Dispatch (
371 : const OUString& rsURLPath,
372 : const ::rtl::Reference<PresenterController>& rpPresenterController)
373 : : PresenterDispatchInterfaceBase(m_aMutex),
374 : msURLPath(rsURLPath),
375 : mpCommand(CreateCommand(rsURLPath, rpPresenterController)),
376 : mpPresenterController(rpPresenterController),
377 : maStatusListenerContainer(),
378 0 : mbIsListeningToWindowManager(false)
379 : {
380 0 : if (mpCommand.get() != NULL)
381 : {
382 0 : mpPresenterController->GetWindowManager()->AddLayoutListener(this);
383 0 : mbIsListeningToWindowManager = true;
384 : }
385 0 : }
386 :
387 0 : Command* PresenterProtocolHandler::Dispatch::CreateCommand (
388 : const OUString& rsURLPath,
389 : const ::rtl::Reference<PresenterController>& rpPresenterController)
390 : {
391 0 : if (rsURLPath.getLength() <= 5)
392 0 : return NULL;
393 :
394 0 : if (rsURLPath == "CloseNotes")
395 0 : return new SetNotesViewCommand(false, rpPresenterController);
396 0 : if (rsURLPath == "CloseSlideSorter")
397 0 : return new SetSlideSorterCommand(false, rpPresenterController);
398 0 : if (rsURLPath == "CloseHelp")
399 0 : return new SetHelpViewCommand(false, rpPresenterController);
400 0 : if (rsURLPath == "GrowNotesFont")
401 0 : return new NotesFontSizeCommand(rpPresenterController, +1);
402 0 : if (rsURLPath == "NextEffect")
403 0 : return new GotoNextEffectCommand(rpPresenterController);
404 0 : if (rsURLPath == "NextSlide")
405 0 : return new GotoNextSlideCommand(rpPresenterController);
406 0 : if (rsURLPath == "PrevSlide")
407 0 : return new GotoPreviousSlideCommand(rpPresenterController);
408 0 : if (rsURLPath == "SwitchMonitor")
409 0 : return new SwitchMonitorCommand(rpPresenterController);
410 0 : if (rsURLPath == "ShowNotes")
411 0 : return new SetNotesViewCommand(true, rpPresenterController);
412 0 : if (rsURLPath == "ShowSlideSorter")
413 0 : return new SetSlideSorterCommand(true, rpPresenterController);
414 0 : if (rsURLPath == "ShowHelp")
415 0 : return new SetHelpViewCommand(true, rpPresenterController);
416 0 : if (rsURLPath == "ShrinkNotesFont")
417 0 : return new NotesFontSizeCommand(rpPresenterController, -1);
418 :
419 0 : return NULL;
420 : }
421 :
422 0 : PresenterProtocolHandler::Dispatch::~Dispatch()
423 : {
424 0 : }
425 :
426 0 : void PresenterProtocolHandler::Dispatch::disposing()
427 : {
428 0 : if (mbIsListeningToWindowManager)
429 : {
430 0 : if (mpPresenterController.get() != NULL)
431 0 : mpPresenterController->GetWindowManager()->RemoveLayoutListener(this);
432 0 : mbIsListeningToWindowManager = false;
433 : }
434 :
435 0 : msURLPath.clear();
436 0 : mpCommand.reset();
437 0 : }
438 :
439 : //----- XDispatch -------------------------------------------------------------
440 :
441 0 : void SAL_CALL PresenterProtocolHandler::Dispatch::dispatch(
442 : const css::util::URL& rURL,
443 : const css::uno::Sequence<css::beans::PropertyValue>& rArguments)
444 : throw(css::uno::RuntimeException, std::exception)
445 : {
446 : (void)rArguments;
447 0 : ThrowIfDisposed();
448 :
449 0 : if (rURL.Protocol == "vnd.org.libreoffice.presenterscreen:"
450 0 : && rURL.Path == msURLPath)
451 : {
452 0 : if (mpCommand.get() != NULL)
453 0 : mpCommand->Execute();
454 : }
455 : else
456 : {
457 : // We can not throw an IllegalArgumentException
458 0 : throw RuntimeException();
459 : }
460 0 : }
461 :
462 0 : void SAL_CALL PresenterProtocolHandler::Dispatch::addStatusListener(
463 : const css::uno::Reference<css::frame::XStatusListener>& rxListener,
464 : const css::util::URL& rURL)
465 : throw(css::uno::RuntimeException, std::exception)
466 : {
467 0 : if (rURL.Path == msURLPath)
468 : {
469 0 : maStatusListenerContainer.push_back(rxListener);
470 :
471 0 : frame::FeatureStateEvent aEvent;
472 0 : aEvent.FeatureURL = rURL;
473 0 : aEvent.IsEnabled = mpCommand->IsEnabled();
474 0 : aEvent.Requery = sal_False;
475 0 : aEvent.State = mpCommand->GetState();
476 0 : rxListener->statusChanged(aEvent);
477 : }
478 : else
479 0 : throw RuntimeException();
480 0 : }
481 :
482 0 : void SAL_CALL PresenterProtocolHandler::Dispatch::removeStatusListener (
483 : const css::uno::Reference<css::frame::XStatusListener>& rxListener,
484 : const css::util::URL& rURL)
485 : throw(css::uno::RuntimeException, std::exception)
486 : {
487 0 : if (rURL.Path == msURLPath)
488 : {
489 : StatusListenerContainer::iterator iListener (
490 : ::std::find(
491 : maStatusListenerContainer.begin(),
492 : maStatusListenerContainer.end(),
493 0 : rxListener));
494 0 : if (iListener != maStatusListenerContainer.end())
495 0 : maStatusListenerContainer.erase(iListener);
496 : }
497 : else
498 0 : throw RuntimeException();
499 0 : }
500 :
501 0 : void PresenterProtocolHandler::Dispatch::ThrowIfDisposed() const
502 : throw (::com::sun::star::lang::DisposedException)
503 : {
504 0 : if (rBHelper.bDisposed || rBHelper.bInDispose)
505 : {
506 : throw lang::DisposedException (
507 : OUString(
508 : "PresenterProtocolHandler::Dispatch object has already been disposed"),
509 0 : const_cast<uno::XWeak*>(static_cast<const uno::XWeak*>(this)));
510 : }
511 0 : }
512 :
513 : //----- document::XEventListener ----------------------------------------------
514 :
515 0 : void SAL_CALL PresenterProtocolHandler::Dispatch::notifyEvent (
516 : const css::document::EventObject& rEvent)
517 : throw(css::uno::RuntimeException, std::exception)
518 : {
519 : (void)rEvent;
520 :
521 0 : mpCommand->GetState();
522 0 : }
523 :
524 : //----- lang::XEventListener --------------------------------------------------
525 :
526 0 : void SAL_CALL PresenterProtocolHandler::Dispatch::disposing (const css::lang::EventObject& rEvent)
527 : throw(css::uno::RuntimeException, std::exception)
528 : {
529 : (void)rEvent;
530 0 : mbIsListeningToWindowManager = false;
531 0 : }
532 :
533 : //===== GotoPreviousSlideCommand ==============================================
534 :
535 0 : GotoPreviousSlideCommand::GotoPreviousSlideCommand (
536 : const rtl::Reference<PresenterController>& rpPresenterController)
537 0 : : mpPresenterController(rpPresenterController)
538 : {
539 0 : }
540 :
541 0 : void GotoPreviousSlideCommand::Execute()
542 : {
543 0 : if ( ! mpPresenterController.is())
544 0 : return;
545 :
546 0 : if ( ! mpPresenterController->GetSlideShowController().is())
547 0 : return;
548 :
549 0 : mpPresenterController->GetSlideShowController()->gotoPreviousSlide();
550 : }
551 :
552 0 : bool GotoPreviousSlideCommand::IsEnabled() const
553 : {
554 0 : if ( ! mpPresenterController.is())
555 0 : return false;
556 :
557 0 : if ( ! mpPresenterController->GetSlideShowController().is())
558 0 : return false;
559 :
560 0 : return mpPresenterController->GetSlideShowController()->getCurrentSlideIndex()>0;
561 : }
562 :
563 : //===== GotoNextEffect ========================================================
564 :
565 0 : GotoNextEffectCommand::GotoNextEffectCommand (
566 : const rtl::Reference<PresenterController>& rpPresenterController)
567 0 : : mpPresenterController(rpPresenterController)
568 : {
569 0 : }
570 :
571 0 : void GotoNextEffectCommand::Execute()
572 : {
573 0 : if ( ! mpPresenterController.is())
574 0 : return;
575 :
576 0 : if ( ! mpPresenterController->GetSlideShowController().is())
577 0 : return;
578 :
579 0 : mpPresenterController->GetSlideShowController()->gotoNextEffect();
580 : }
581 :
582 : //===== GotoNextSlide =========================================================
583 :
584 0 : GotoNextSlideCommand::GotoNextSlideCommand (
585 : const rtl::Reference<PresenterController>& rpPresenterController)
586 0 : : mpPresenterController(rpPresenterController)
587 : {
588 0 : }
589 :
590 0 : void GotoNextSlideCommand::Execute()
591 : {
592 0 : if ( ! mpPresenterController.is())
593 0 : return;
594 :
595 0 : if ( ! mpPresenterController->GetSlideShowController().is())
596 0 : return;
597 :
598 0 : mpPresenterController->GetSlideShowController()->gotoNextSlide();
599 : }
600 :
601 : //===== SwitchMonitorCommand ==============================================
602 :
603 0 : SwitchMonitorCommand::SwitchMonitorCommand (
604 : const rtl::Reference<PresenterController>& rpPresenterController)
605 0 : : mpPresenterController(rpPresenterController)
606 : {
607 0 : }
608 :
609 0 : void SwitchMonitorCommand::Execute()
610 : {
611 0 : mpPresenterController->SwitchMonitors();
612 0 : }
613 :
614 : //===== SetNotesViewCommand ===================================================
615 :
616 0 : SetNotesViewCommand::SetNotesViewCommand (
617 : const bool bOn,
618 : const rtl::Reference<PresenterController>& rpPresenterController)
619 : : mbOn(bOn),
620 0 : mpPresenterController(rpPresenterController)
621 : {
622 0 : }
623 :
624 0 : void SetNotesViewCommand::Execute()
625 : {
626 0 : if ( ! mpPresenterController.is())
627 0 : return;
628 :
629 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
630 0 : mpPresenterController->GetWindowManager());
631 0 : if ( ! pWindowManager.is())
632 0 : return;
633 :
634 0 : if (mbOn)
635 0 : pWindowManager->SetViewMode(PresenterWindowManager::VM_Notes);
636 : else
637 0 : pWindowManager->SetViewMode(PresenterWindowManager::VM_Standard);
638 : }
639 :
640 0 : Any SetNotesViewCommand::GetState() const
641 : {
642 0 : if ( ! mpPresenterController.is())
643 0 : return Any(false);
644 :
645 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
646 0 : mpPresenterController->GetWindowManager());
647 0 : if ( ! pWindowManager.is())
648 0 : return Any(false);
649 :
650 0 : return Any(IsActive(pWindowManager));
651 : }
652 :
653 0 : bool SetNotesViewCommand::IsActive (
654 : const ::rtl::Reference<PresenterWindowManager>& rpWindowManager)
655 : {
656 0 : return rpWindowManager->GetViewMode() == PresenterWindowManager::VM_Notes;
657 : }
658 :
659 : //===== SetSlideSorterCommand =================================================
660 :
661 0 : SetSlideSorterCommand::SetSlideSorterCommand (
662 : const bool bOn,
663 : const rtl::Reference<PresenterController>& rpPresenterController)
664 : : mbOn(bOn),
665 0 : mpPresenterController(rpPresenterController)
666 : {
667 0 : }
668 :
669 0 : void SetSlideSorterCommand::Execute()
670 : {
671 0 : if ( ! mpPresenterController.is())
672 0 : return;
673 :
674 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
675 0 : mpPresenterController->GetWindowManager());
676 0 : if ( ! pWindowManager.is())
677 0 : return;
678 :
679 0 : pWindowManager->SetSlideSorterState(mbOn);
680 : }
681 :
682 0 : Any SetSlideSorterCommand::GetState() const
683 : {
684 0 : if ( ! mpPresenterController.is())
685 0 : return Any(false);
686 :
687 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
688 0 : mpPresenterController->GetWindowManager());
689 0 : if ( ! pWindowManager.is())
690 0 : return Any(false);
691 :
692 0 : return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_SlideOverview);
693 : }
694 :
695 : //===== SetHelpViewCommand ===================================================
696 :
697 0 : SetHelpViewCommand::SetHelpViewCommand (
698 : const bool bOn,
699 : const rtl::Reference<PresenterController>& rpPresenterController)
700 : : mbOn(bOn),
701 0 : mpPresenterController(rpPresenterController)
702 : {
703 0 : }
704 :
705 0 : void SetHelpViewCommand::Execute()
706 : {
707 0 : if ( ! mpPresenterController.is())
708 0 : return;
709 :
710 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
711 0 : mpPresenterController->GetWindowManager());
712 0 : if ( ! pWindowManager.is())
713 0 : return;
714 :
715 0 : pWindowManager->SetHelpViewState(mbOn);
716 : }
717 :
718 0 : Any SetHelpViewCommand::GetState() const
719 : {
720 0 : if ( ! mpPresenterController.is())
721 0 : return Any(false);
722 :
723 : ::rtl::Reference<PresenterWindowManager> pWindowManager (
724 0 : mpPresenterController->GetWindowManager());
725 0 : if ( ! pWindowManager.is())
726 0 : return Any(false);
727 :
728 0 : return Any(pWindowManager->GetViewMode()==PresenterWindowManager::VM_Help);
729 : }
730 :
731 : //===== NotesFontSizeCommand ==================================================
732 :
733 0 : NotesFontSizeCommand::NotesFontSizeCommand(
734 : const rtl::Reference<PresenterController>& rpPresenterController,
735 : const sal_Int32 nSizeChange)
736 : : mpPresenterController(rpPresenterController),
737 0 : mnSizeChange(nSizeChange)
738 : {
739 0 : }
740 :
741 0 : ::rtl::Reference<PresenterNotesView> NotesFontSizeCommand::GetNotesView() const
742 : {
743 0 : if (mpPresenterController.get() == NULL)
744 0 : return NULL;
745 :
746 : PresenterPaneContainer::SharedPaneDescriptor pDescriptor (
747 : mpPresenterController->GetPaneContainer()->FindViewURL(
748 0 : PresenterViewFactory::msNotesViewURL));
749 0 : if (pDescriptor.get() == NULL)
750 0 : return NULL;
751 :
752 0 : return dynamic_cast<PresenterNotesView*>(pDescriptor->mxView.get());
753 : }
754 :
755 0 : void NotesFontSizeCommand::Execute()
756 : {
757 0 : ::rtl::Reference<PresenterNotesView> pView (GetNotesView());
758 0 : if (pView.is())
759 0 : pView->ChangeFontSize(mnSizeChange);
760 0 : }
761 :
762 0 : Any NotesFontSizeCommand::GetState() const
763 : {
764 0 : return Any();
765 : }
766 :
767 : } } // end of namespace ::sdext::presenter
768 :
769 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|